(svn r11219) [NewGRF_ports] -Sync: with trunk r11035:11218. NewGRF_ports
authorrubidium
Sat, 06 Oct 2007 21:16:00 +0000
branchNewGRF_ports
changeset 6870 ca3fd1fbe311
parent 6869 76282d3b748d
child 6871 5a9dc001e1ad
(svn r11219) [NewGRF_ports] -Sync: with trunk r11035:11218.
Doxyfile
Makefile.src.in
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
projects/determineversion.vbs
projects/openttd.vcproj
projects/openttd.vcproj.in
projects/openttd_vs80.vcproj
projects/openttd_vs80.vcproj.in
readme.txt
source.list
src/ai/ai.cpp
src/ai/default/default.cpp
src/ai/trolly/trolly.cpp
src/aircraft.h
src/aircraft_cmd.cpp
src/aircraft_gui.cpp
src/airport_gui.cpp
src/articulated_vehicles.cpp
src/articulated_vehicles.h
src/autoreplace_cmd.cpp
src/autoslope.h
src/blitter/32bpp_anim.cpp
src/blitter/32bpp_anim.hpp
src/blitter/32bpp_base.cpp
src/blitter/32bpp_base.hpp
src/blitter/32bpp_optimized.cpp
src/blitter/32bpp_optimized.hpp
src/blitter/32bpp_simple.cpp
src/blitter/8bpp_base.cpp
src/blitter/factory.hpp
src/bridge_gui.cpp
src/build_vehicle_gui.cpp
src/clear_cmd.cpp
src/command.cpp
src/command.h
src/depot_gui.cpp
src/direction.h
src/dock_gui.cpp
src/economy.cpp
src/elrail.cpp
src/fileio.cpp
src/fileio.h
src/functions.h
src/gfx.cpp
src/gfx.h
src/gfxinit.cpp
src/graph_gui.cpp
src/group_cmd.cpp
src/group_gui.cpp
src/industry.h
src/industry_cmd.cpp
src/industry_gui.cpp
src/industry_map.h
src/landscape.cpp
src/lang/american.txt
src/lang/brazilian_portuguese.txt
src/lang/bulgarian.txt
src/lang/catalan.txt
src/lang/croatian.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/piglatin.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/greek.txt
src/macros.h
src/main_gui.cpp
src/map.cpp
src/map.h
src/misc.cpp
src/misc_cmd.cpp
src/misc_gui.cpp
src/music/win32_m.cpp
src/network/network.cpp
src/network/network.h
src/network/network_gui.cpp
src/newgrf.cpp
src/newgrf_callbacks.h
src/newgrf_canal.cpp
src/newgrf_commons.cpp
src/newgrf_commons.h
src/newgrf_config.cpp
src/newgrf_engine.cpp
src/newgrf_gui.cpp
src/newgrf_house.cpp
src/newgrf_industries.cpp
src/newgrf_industries.h
src/newgrf_industrytiles.cpp
src/newgrf_industrytiles.h
src/newgrf_sound.cpp
src/newgrf_spritegroup.cpp
src/newgrf_spritegroup.h
src/newgrf_station.cpp
src/newgrf_storage.cpp
src/newgrf_storage.h
src/newgrf_text.cpp
src/newgrf_text.h
src/news.h
src/news_gui.cpp
src/oldloader.cpp
src/openttd.cpp
src/order.h
src/order_cmd.cpp
src/order_gui.cpp
src/ottdres.rc
src/ottdres.rc.in
src/player_gui.cpp
src/rail.h
src/rail_cmd.cpp
src/rail_gui.cpp
src/rev.cpp.in
src/road.cpp
src/road.h
src/road_cmd.cpp
src/road_gui.cpp
src/roadveh.h
src/roadveh_cmd.cpp
src/roadveh_gui.cpp
src/saveload.h
src/settings.cpp
src/settings_gui.cpp
src/ship_cmd.cpp
src/ship_gui.cpp
src/signs.cpp
src/slope.h
src/sound.cpp
src/sound.h
src/sprite.h
src/spritecache.cpp
src/spriteloader/grf.cpp
src/spriteloader/grf.hpp
src/spriteloader/png.cpp
src/spriteloader/png.hpp
src/spriteloader/spriteloader.hpp
src/station.h
src/station_cmd.cpp
src/strings.cpp
src/table/control_codes.h
src/table/elrail_data.h
src/table/industry_land.h
src/table/sprites.h
src/table/town_land.h
src/terraform_gui.cpp
src/texteff.cpp
src/town_cmd.cpp
src/town_gui.cpp
src/train.h
src/train_cmd.cpp
src/train_gui.cpp
src/tree_cmd.cpp
src/tree_map.h
src/tunnelbridge_cmd.cpp
src/unmovable_cmd.cpp
src/variables.h
src/vehicle.cpp
src/vehicle.h
src/vehicle_gui.cpp
src/video/win32_v.cpp
src/viewport.cpp
src/viewport.h
src/water_cmd.cpp
src/win32.cpp
src/window.h
--- a/Doxyfile	Thu Sep 06 19:42:48 2007 +0000
+++ b/Doxyfile	Sat Oct 06 21:16:00 2007 +0000
@@ -5,7 +5,6 @@
 OUTPUT_DIRECTORY       = docs/source/
 CREATE_SUBDIRS         = NO
 OUTPUT_LANGUAGE        = English
-USE_WINDOWS_ENCODING   = NO
 BRIEF_MEMBER_DESC      = YES
 REPEAT_BRIEF           = YES
 ABBREVIATE_BRIEF       = "The $name class" \
@@ -186,13 +185,13 @@
 # Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 ENABLE_PREPROCESSING   = YES
-MACRO_EXPANSION        = NO
-EXPAND_ONLY_PREDEF     = NO
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
 SEARCH_INCLUDES        = YES
 INCLUDE_PATH           =
 INCLUDE_FILE_PATTERNS  =
 PREDEFINED             =
-EXPAND_AS_DEFINED      =
+EXPAND_AS_DEFINED      = DEF_COMMAND
 SKIP_FUNCTION_MACROS   = YES
 #---------------------------------------------------------------------------
 # Configuration::additions related to external references
@@ -221,8 +220,6 @@
 DOT_IMAGE_FORMAT       = png
 DOT_PATH               =
 DOTFILE_DIRS           =
-MAX_DOT_GRAPH_WIDTH    = 1024
-MAX_DOT_GRAPH_HEIGHT   = 1024
 MAX_DOT_GRAPH_DEPTH    = 1000
 DOT_TRANSPARENT        = NO
 DOT_MULTI_TARGETS      = NO
--- a/Makefile.src.in	Thu Sep 06 19:42:48 2007 +0000
+++ b/Makefile.src.in	Sat Oct 06 21:16:00 2007 +0000
@@ -102,8 +102,14 @@
 else
 # Are we a git dir?
 ifeq ($(shell if test -d $(SRC_DIR)/../.git; then echo 1; fi), 1)
-# Find the revision like: rXXXXM
-REV := g$(shell if head=`git rev-parse --verify HEAD 2>/dev/null`; then echo "$$head" | cut -c1-8; fi)$(shell if git diff-index HEAD | read dummy; then echo M; fi)$(shell git branch|grep '[*]'|sed 's/\* /-/;s/^-master$$//')
+# Find the revision like: gXXXXM-branch
+REV := g$(shell if head=`LC_ALL=C git rev-parse --verify HEAD 2>/dev/null`; then echo "$$head" | cut -c1-8; fi)$(shell if git diff-index HEAD | read dummy; then echo M; fi)$(shell git branch|grep '[*]' | sed 's/\* /-/;s/^-master$$//')
+else
+# Are we a hg (Mercurial) dir?
+ifeq ($(shell if test -d $(SRC_DIR)/../.hg; then echo 1; fi), 1)
+# Find the revision like: hXXXXM-branch
+REV := h$(shell if head=`LC_ALL=C hg tip 2>/dev/null`; then echo "$$head" | head -n 1 | cut -c19-26; fi)$(shell if hg status | grep -v '^?' | read dummy; then echo M; fi)$(shell hg branch | sed 's/^/-/;s/^-default$$//')
+endif
 endif
 endif
 endif
@@ -249,15 +255,15 @@
 $(BIN_DIR)/$(TTD): $(TTD)
 	$(Q)cp $< $@
 
-$(TTD): rev.o $(OBJS) $(CONFIG_CACHE_LINKER)
+$(TTD): $(OBJS) $(CONFIG_CACHE_LINKER)
 	$(E) '$(STAGE) Linking $@'
 ifeq ($(OS), PSP)
 	# Because of a bug in the PSP GCC tools, linking via CXX results
 	#  in total chaos and more problems then you can handle. So we need
 	#  CC to link OpenTTD for PSP
-	$(Q)$(CC_HOST) $(LDFLAGS) rev.o $(OBJS) $(LIBS) -o $@
+	$(Q)$(CC_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
 else
-	$(Q)$(CXX_HOST) $(LDFLAGS) rev.o $(OBJS) $(LIBS) -o $@
+	$(Q)$(CXX_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
 endif
 ifdef STRIP
 	$(Q)$(STRIP) $@
@@ -275,19 +281,11 @@
 
 # Revision files
 
-rev.cpp: $(CONFIG_CACHE_VERSION)
-# setting the revision number in a place, there the binary can read it
-	@echo 'extern const char _openttd_revision[] = "$(REV)";' > rev.cpp
-# Some additions for MorphOS versions tag
-ifeq ($(OS),MORPHOS)
-	@echo '#ifdef __MORPHOS__' >> rev.cpp
-	@echo 'extern const char morphos_versions_tag[] = "\\0$$VER: OpenTTD $(REV) ('`date +%d.%m.%y`') (C) OpenTTD Team [MorphOS, PowerPC]";' >> rev.cpp
-	@echo '#endif' >> rev.cpp
-endif
+$(SRC_DIR)/rev.cpp: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/rev.cpp.in
+	$(Q)cat $(SRC_DIR)/rev.cpp.in      | sed "s#@@VERSION@@#$(REV)#g;s#@@DATE@@#`date +%d.%m.%y`#g" > $(SRC_DIR)/rev.cpp
 
-rev.o: rev.cpp $(FILE_DEP)
-	$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
-	$(Q)$(CXX_HOST) $(CFLAGS) -c -o $@ $<
+$(SRC_DIR)/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/ottdres.rc.in
+	$(Q)cat $(SRC_DIR)/ottdres.rc.in | sed "s#@@VERSION@@#$(REV)#g;s#@@DATE@@#`date +%d.%m.%y`#g" > $(SRC_DIR)/ottdres.rc
 
 FORCE:
 
@@ -295,10 +293,10 @@
 
 clean:
 	$(E) '$(STAGE) Cleaning up object files'
-	$(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(TTD:%=$(BIN_DIR)/%) $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_ENDIAN) $(CONFIG_CACHE_SOURCE) $(ENDIAN_TARGETS) rev.o rev.cpp
+	$(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(TTD:%=$(BIN_DIR)/%) $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_ENDIAN) $(CONFIG_CACHE_SOURCE) $(ENDIAN_TARGETS)
 
 mrproper: clean
-	$(Q)rm -f rev.cpp
+	$(Q)rm -f $(SRC_DIR)/rev.cpp $(SRC_DIR)/ottdres.rc
 
 %.o:
 	@echo '$(STAGE) No such source-file: $(@:%.o=%).[c|cpp|mm|rc]'
--- a/changelog.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/changelog.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1,3 +1,42 @@
+0.5.3 (2007-09-15)
+------------------------------------------------------------------------
+- Fix: Possible NULL pointer dereference that could be triggered remotely (r11074)
+- Fix: Removing CMD_AUTO from some commands could remotely trigger an assertion [FS#1179] (r11040)
+- Fix: Underflow that caused overflows in the performance rating [FS#1179] (r11039)
+- Fix: [Windows] MIDI does not stop when closing openttd [FS#1164] (r11029)
+- Fix: Do not unconditionally assume that a tile has a depot (r11027)
+- Fix: Give a more correct error when building some things on tile 0 [FS#1173] (r11024)
+- Fix: Do not display income/expenses when they do not belong to a "valid" tile, like the money cheat and giving money [FS#1175] (r11021)
+- Fix: One could not give money when (s)he had too much money [FS#1174] (r11020)
+- Fix: Disallow buying/selling shares in your own company or a bankrupt company [FS#1169] (r11018)
+- Fix: Crash when quiting the game in one of the end score windows [FS#1218] (r11071)
+
+
+0.5.3-RC3 (2007-08-30)
+------------------------------------------------------------------------
+- Fix: Spectators are not allowed to issue commands (r11006)
+- Fix: Make the AI not crash when it has ships as the AI does not support them [FS#1133] (r10942)
+- Fix: Trains would not get flooded when they are at the lower part of a tile that would become a coast tile after flooding [FS#1127] (r10892)
+- Fix: Removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was [FS#1125] (r10890)
+- Fix: Some isocodes were wrong, resulting in some NewGRF not working properly for the affected languages (r10877)
+- Fix: [Windows] Do not try to minimise or restore the window when closing OpenTTD [FS#998] (r10835)
+- Fix: Trains going over bridges would get the "going down hill" accelerate bonus, which causes trains to go faster on bridges than they would be going on level land [FS#1096] (r10739)
+- Fix: Trains being split into two pieces when loading an old savegame [FS#1062] (r10735)
+- Fix: [OS/2] Fix chdir problem with open/save dialog (r10650)
+- Fix: One could not remove locks that were build in a (very) old version of OpenTTD [FS#1038] (r10593)
+- Fix: One cannot navigate using arrow keys in the game name text box [FS#1038] (r10500)
+- Fix: Ship's maximum speed wrongly shown [FS#1013] (r10497)
+- Fix: [OSX] Of the resolution is changed to something that is too high for the monitor, then it is reduced to fit the monitor size, solving several crashes and graphical glitches [FS#458] (r10410)
+- Fix: NPF was leaking memory each time it got initialized, except for the first time (r10357)
+- Fix: [YAPF] 'target_seen' flag that is set prematurely in some cases (1 tile long cached segment followed by target station) which caused asserts to trigger [FS#884] (r10199)
+
+
+0.5.3-RC2 (2007-07-07)
+------------------------------------------------------------------------
+- Fix: Visual glitches when a window is resized in the WE_CREATE callback (r10465)
+- Fix: [Windows] _wnd.has_focus was not properly set after using ALT-TAB [FS#962] (r10399)
+
+
 0.5.3-RC1 (2007-06-28)
 ------------------------------------------------------------------------
 - Feature: Make the client list window (for network games) stickyable (r10293)
--- a/config.lib	Thu Sep 06 19:42:48 2007 +0000
+++ b/config.lib	Sat Oct 06 21:16:00 2007 +0000
@@ -702,6 +702,9 @@
 		elif [ -d "$ROOT_DIR/.git" ] && [ -n "`git help`" ]; then
 			revision=""
 			log 1 "checking revision... git detection"
+		elif [ -d "$ROOT_DIR/.hg" ] && [ -n "`hg help`" ]; then
+			revision=""
+			log 1 "checking revision... hg detection"
 		else
 			revision=""
 			log 1 "checking revision... no detection"
@@ -745,7 +748,7 @@
 	# General CFlags for BUILD
 	CFLAGS_BUILD=""
 	# General CFlags for HOST
-	CFLAGS="$CFLAGS -D$os -DWITH_REV"
+	CFLAGS="$CFLAGS -D$os"
 	# CFlags for HOST and C-Compiler
 	CC_FLAGS=""
 	# Libs to compile. In fact this is just LDFLAGS
--- a/docs/landscape.html	Thu Sep 06 19:42:48 2007 +0000
+++ b/docs/landscape.html	Sat Oct 06 21:16:00 2007 +0000
@@ -974,7 +974,7 @@
       </ul>
      </li>
      <li>m2: index into the array of industries</li>
-     <li>m5: type:<br>
+     <li>m5: type (plus m6 bit 2):<br>
       <small>(note: this is not the same as the industry type, which is stored in the array of industries)</small>
 
       <table>
@@ -1273,9 +1273,17 @@
          </table>
         </td>
        </tr>
+       <tr>
+        <td nowrap valign=top><tt>AF</tt>..<tt>1FF</tt>&nbsp; </td>
+        <td align=left>NewGRF industries industry</td>
+       </tr>
       </table>
      </li>
      <li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
+     <li>m3: animation state</li>
+     <li>m4: animation loop</li>
+     <li>m6 bits 3..5: random triggers (NewGRF)</li>
+     <li>m7: random bits (NewGRF)</li>
     </ul>
    </td>
   </tr>
--- a/docs/landscape_grid.html	Thu Sep 06 19:42:48 2007 +0000
+++ b/docs/landscape_grid.html	Sat Oct 06 21:16:00 2007 +0000
@@ -200,41 +200,17 @@
       <td class="bits"><span class="free">OOOO OOOO</span></td>
     </tr>
     <tr>
-      <td rowspan=3>8</td>
+      <td>8</td>
       <td class="caption">industry</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits"><span class="abuse">X</span><span class="free">OO</span><span class="abuse">X
         XXXX</span></td>
       <td class="bits">XXXX XXXX XXXX XXXX</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
-      <td class="bits">XXXX XXXX</td>
-      <td class="bits"><span class="free">OOOO OO</span>XX</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
-    </tr>
-    <tr>
-      <td>bubble/sugar/toffee,<BR>
-        gold/copper/coal,<BR>
-        oil wells, power station</td>
-      <td class="bits">-inherit-</td>
-      <td class="bits"><span class="abuse">X</span><span class="free">OOO OOOO</span></td>
-      <td class="bits">-inherit-</td>
-      <td class="bits">XXXX XXXX</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
-      <td class="bits">-inherit-</td>
-      <td class="bits">-inherit-</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
-    </tr>
-    <tr>
-      <td>toy factory</td>
-      <td class="bits">-inherit-</td>
-      <td class="bits"><span class="abuse">X</span><span class="free">OOO OOOO</span></td>
-      <td class="bits">-inherit-</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
-      <td class="bits">-inherit-</td>
-      <td class="bits">-inherit-</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
+      <td class="bits">XXXX XXXX</td>
+      <td class="bits"><span class="free">OO</span>XX XXXX</td>
+      <td class="bits">XXXX XXXX</td>
     </tr>
     <tr>
       <td rowspan=2>9</td>
--- a/docs/openttd.6	Thu Sep 06 19:42:48 2007 +0000
+++ b/docs/openttd.6	Sat Oct 06 21:16:00 2007 +0000
@@ -1,6 +1,6 @@
 .\"                                      Hey, EMACS: -*- nroff -*-
 .\" Please adjust this date whenever revising the manpage.
-.Dd Jun 28, 2007
+.Dd Sep 15, 2007
 .Dt OPENTTD 6
 .Sh NAME
 .Nm openttd
--- a/known-bugs.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/known-bugs.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -14,6 +14,7 @@
 ------------------------------------------------------------------------
 URL: http://bugs.openttd.org
 
+-944	Incorrect el-rail catenary pole/wire offsets
 -917	Load scenario with no towns failed without proper warning
 -873	Assertion window fails to open on OSX
 -820	Pillar drawing order glich, with newbridges
@@ -30,7 +31,6 @@
 -501	Mouse pointer gets hidden, when draging out of window and back again. Only affects Wacom etc.
 -494	Get free money abusing a stock bug
 -474	Overtaking car doesn't hit the against-riding car.
--458	Crash when changing Resolution on Mac OS X (x86)
 -435	Assertion window doesn't show when in fullscreen on Mac OS X
 -423	Improved loading causes high CPU use with long trains
 -410	Openttd in dedicated mode don't run without data files
--- a/os/debian/changelog	Thu Sep 06 19:42:48 2007 +0000
+++ b/os/debian/changelog	Sat Oct 06 21:16:00 2007 +0000
@@ -4,6 +4,24 @@
 
  -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Mon, 26 Feb 2007 21:07:05 +0100
 
+openttd (0.5.3-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Sat, 15 Sep 2007 13:30:00 +0100
+
+openttd (0.5.3~rc3-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Thu, 30 Aug 2007 23:30:00 +0100
+
+openttd (0.5.3~rc2-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Sat,  7 Jul 2007 20:05:00 +0100
+
 openttd (0.5.3~rc1-1) unstable; urgency=low
 
   * New upstream release.
--- a/os/win32/installer/install.nsi	Thu Sep 06 19:42:48 2007 +0000
+++ b/os/win32/installer/install.nsi	Sat Oct 06 21:16:00 2007 +0000
@@ -1,6 +1,6 @@
 !define APPNAME "OpenTTD"   ; Define application name
 !define APPVERSION "0.5.3"  ; Define application version
-!define INSTALLERVERSION 35 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
+!define INSTALLERVERSION 38 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
 
 !define APPURLLINK "http://www.openttd.org"
 !define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/determineversion.vbs	Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,129 @@
+Option Explicit
+
+Dim FSO
+Set FSO = CreateObject("Scripting.FileSystemObject")
+
+Sub FindReplaceInFile(filename, to_find, replacement)
+	Dim file, data
+	Set file = FSO.OpenTextFile(filename, 1, 0, 0)
+	data = file.ReadAll
+	file.Close
+	data = Replace(data, to_find, replacement)
+	Set file = FSO.CreateTextFile(FileName, -1, 0)
+	file.Write data
+	file.Close
+End Sub
+
+Sub UpdateFile(version, cur_date, filename)
+	FSO.CopyFile filename & ".in", filename
+	FindReplaceInFile filename, "@@VERSION@@", version
+	FindReplaceInFile filename, "@@DATE@@", cur_date
+End Sub
+
+Sub UpdateFiles(version)
+	Dim cur_date
+	cur_date = DatePart("D", Date) & "." & DatePart("M", Date) & "." & DatePart("YYYY", Date)
+	UpdateFile version, cur_date, "../src/rev.cpp"
+	UpdateFile version, cur_date, "../src/ottdres.rc"
+End Sub
+
+Function DetermineSVNVersion()
+	Dim WshShell, version, url, oExec
+	Set WshShell = CreateObject("WScript.Shell")
+	On Error Resume Next
+
+	' Try TortoiseSVN
+	' Get the directory where TortoiseSVN (should) reside(s)
+	Dim sTortoise
+	sTortoise = WshShell.RegRead("HKLM\SOFTWARE\TortoiseSVN\Directory")
+
+	Dim file
+	' Write some "magic" to a temporary file so we can acquire the svn revision/state
+	Set file = FSO.CreateTextFile("tsvn_tmp", -1, 0)
+	file.WriteLine "r$WCREV$$WCMODS?M:$"
+	file.WriteLine "$WCURL$"
+	file.Close
+	Set oExec = WshShell.Exec(sTortoise & "\bin\SubWCRev.exe ../src tsvn_tmp tsvn_tmp")
+	' Wait till the application is finished ...
+	Do
+		OExec.StdOut.ReadLine()
+	Loop While Not OExec.StdOut.atEndOfStream
+
+	Set file = FSO.OpenTextFile("tsvn_tmp", 1, 0, 0)
+	version = file.ReadLine
+	url = file.ReadLine
+	file.Close
+
+	Set file = FSO.GetFile("tsvn_tmp")
+	file.Delete
+
+	' Looks like there is no TortoiseSVN installed either. Then we don't know it.
+	If InStr(version, "$") Then
+		' Reset error and version
+		Err.Clear
+		version = "norev000"
+		' Do we have subversion installed? Check immediatelly whether we've got a modified WC.
+		Set oExec = WshShell.Exec("svnversion ../src")
+		If Err.Number = 0 Then
+			Dim modified
+			If InStr(OExec.StdOut.ReadLine(), "M") Then
+				modified = "M"
+			Else
+				modified = ""
+			End If
+
+			' Set the environment to english
+			WshShell.Environment("PROCESS")("LANG") = "en"
+
+			' And use svn info to get the correct revision and branch information.
+			Set oExec = WshShell.Exec("svn info ../src")
+			If Err.Number = 0 Then
+				Dim line
+				Do
+					line = OExec.StdOut.ReadLine()
+					If InStr(line, "URL") Then
+						url = line
+					End If
+					If InStr(line, "Last Changed Rev") Then
+						version = "r" & Mid(line, 19) & modified
+					End If
+				Loop While Not OExec.StdOut.atEndOfStream
+			End If
+		End If
+	End If
+
+	If version <> "norev000" Then
+		If InStr(url, "branches") Then
+			url = Mid(url, InStr(url, "branches") + 8)
+			url = Mid(url, 1, InStr(2, url, "/") - 1)
+			version = version & Replace(url, "/", "-")
+		End If
+	End If
+
+	DetermineSVNVersion = version
+End Function
+
+Function IsCachedVersion(version)
+	Dim cache_file, cached_version
+	cached_version = ""
+	Set cache_file = FSO.OpenTextFile("../config.cache.version", 1, True, 0)
+	If Not cache_file.atEndOfStream Then
+		cached_version = cache_file.ReadLine()
+	End If
+	cache_file.Close
+
+	If version <> cached_version Then
+		Set cache_file = fso.CreateTextFile("../config.cache.version", True)
+		cache_file.WriteLine(version)
+		cache_file.Close
+		IsCachedVersion = False
+	Else
+		IsCachedVersion = True
+	End If
+End Function
+
+Dim version
+version = DetermineSVNVersion
+If Not (IsCachedVersion(version) And FSO.FileExists("../src/rev.cpp") And FSO.FileExists("../src/ottdres.rc")) Then
+	UpdateFiles version
+End If
--- a/projects/openttd.vcproj	Thu Sep 06 19:42:48 2007 +0000
+++ b/projects/openttd.vcproj	Sat Oct 06 21:16:00 2007 +0000
@@ -73,7 +73,9 @@
 			<Tool
 				Name="VCPostBuildEventTool"/>
 			<Tool
-				Name="VCPreBuildEventTool"/>
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"/>
 			<Tool
 				Name="VCPreLinkEventTool"/>
 			<Tool
@@ -135,7 +137,9 @@
 			<Tool
 				Name="VCPostBuildEventTool"/>
 			<Tool
-				Name="VCPreBuildEventTool"/>
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"/>
 			<Tool
 				Name="VCPreLinkEventTool"/>
 			<Tool
@@ -326,6 +330,12 @@
 				RelativePath=".\..\src\rail.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\rev.cpp">
+			</File>
+			<File
+				RelativePath=".\..\src\road.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\saveload.cpp">
 			</File>
 			<File
@@ -399,6 +409,9 @@
 				RelativePath=".\..\src\articulated_vehicles.h">
 			</File>
 			<File
+				RelativePath=".\..\src\autoslope.h">
+			</File>
+			<File
 				RelativePath=".\..\src\aystar.h">
 			</File>
 			<File
@@ -573,6 +586,9 @@
 				RelativePath=".\..\src\newgrf_station.h">
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_storage.h">
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_text.h">
 			</File>
 			<File
@@ -1004,6 +1020,12 @@
 				RelativePath=".\..\src\blitter\32bpp_base.hpp">
 			</File>
 			<File
+				RelativePath=".\..\src\blitter\32bpp_optimized.cpp">
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\32bpp_optimized.hpp">
+			</File>
+			<File
 				RelativePath=".\..\src\blitter\32bpp_simple.cpp">
 			</File>
 			<File
@@ -1121,6 +1143,9 @@
 				RelativePath=".\..\src\newgrf_station.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_storage.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_text.cpp">
 			</File>
 			<File
--- a/projects/openttd.vcproj.in	Thu Sep 06 19:42:48 2007 +0000
+++ b/projects/openttd.vcproj.in	Sat Oct 06 21:16:00 2007 +0000
@@ -73,7 +73,9 @@
 			<Tool
 				Name="VCPostBuildEventTool"/>
 			<Tool
-				Name="VCPreBuildEventTool"/>
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"/>
 			<Tool
 				Name="VCPreLinkEventTool"/>
 			<Tool
@@ -135,7 +137,9 @@
 			<Tool
 				Name="VCPostBuildEventTool"/>
 			<Tool
-				Name="VCPreBuildEventTool"/>
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"/>
 			<Tool
 				Name="VCPreLinkEventTool"/>
 			<Tool
--- a/projects/openttd_vs80.vcproj	Thu Sep 06 19:42:48 2007 +0000
+++ b/projects/openttd_vs80.vcproj	Sat Oct 06 21:16:00 2007 +0000
@@ -33,6 +33,8 @@
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
 			/>
 			<Tool
 				Name="VCCustomBuildTool"
@@ -144,6 +146,8 @@
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
 			/>
 			<Tool
 				Name="VCCustomBuildTool"
@@ -255,6 +259,8 @@
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
 			/>
 			<Tool
 				Name="VCCustomBuildTool"
@@ -350,6 +356,8 @@
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
 			/>
 			<Tool
 				Name="VCCustomBuildTool"
@@ -664,6 +672,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\rev.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\saveload.cpp"
 				>
 			</File>
@@ -760,6 +776,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\autoslope.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\aystar.h"
 				>
 			</File>
@@ -992,6 +1012,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_storage.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_text.h"
 				>
 			</File>
@@ -1560,6 +1584,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\blitter\32bpp_optimized.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\32bpp_optimized.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\blitter\32bpp_simple.cpp"
 				>
 			</File>
@@ -1712,6 +1744,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_storage.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_text.cpp"
 				>
 			</File>
--- a/projects/openttd_vs80.vcproj.in	Thu Sep 06 19:42:48 2007 +0000
+++ b/projects/openttd_vs80.vcproj.in	Sat Oct 06 21:16:00 2007 +0000
@@ -33,6 +33,8 @@
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
 			/>
 			<Tool
 				Name="VCCustomBuildTool"
@@ -144,6 +146,8 @@
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
 			/>
 			<Tool
 				Name="VCCustomBuildTool"
@@ -255,6 +259,8 @@
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
 			/>
 			<Tool
 				Name="VCCustomBuildTool"
@@ -350,6 +356,8 @@
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
 			/>
 			<Tool
 				Name="VCCustomBuildTool"
--- a/readme.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/readme.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1,6 +1,6 @@
 OpenTTD README
-Last updated:    2007-06-28
-Release version: 0.5.3-RC1
+Last updated:    2007-09-15
+Release version: 0.5.3
 ------------------------------------------------------------------------
 
 
--- a/source.list	Thu Sep 06 19:42:48 2007 +0000
+++ b/source.list	Sat Oct 06 21:16:00 2007 +0000
@@ -59,6 +59,8 @@
 players.cpp
 queue.cpp
 rail.cpp
+rev.cpp
+road.cpp
 saveload.cpp
 screenshot.cpp
 #if SDL
@@ -100,6 +102,7 @@
 aircraft.h
 airport.h
 articulated_vehicles.h
+autoslope.h
 aystar.h
 bmp.h
 cargopacket.h
@@ -158,6 +161,7 @@
 newgrf_sound.h
 newgrf_spritegroup.h
 newgrf_station.h
+newgrf_storage.h
 newgrf_text.h
 newgrf_town.h
 newgrf_townname.h
@@ -305,6 +309,8 @@
 blitter/32bpp_anim.hpp
 blitter/32bpp_base.cpp
 blitter/32bpp_base.hpp
+blitter/32bpp_optimized.cpp
+blitter/32bpp_optimized.hpp
 blitter/32bpp_simple.cpp
 blitter/32bpp_simple.hpp
 blitter/8bpp_base.cpp
@@ -348,6 +354,7 @@
 newgrf_sound.cpp
 newgrf_spritegroup.cpp
 newgrf_station.cpp
+newgrf_storage.cpp
 newgrf_text.cpp
 newgrf_town.cpp
 newgrf_townname.cpp
--- a/src/ai/ai.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ai/ai.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -106,7 +106,6 @@
 
 	/* If we did a DC_EXEC, and the command did not return an error, execute it
 	 * over the network */
-	if (flags & DC_AUTO)     procc |= CMD_AUTO;
 	if (flags & DC_NO_WATER) procc |= CMD_NO_WATER;
 
 	/* NetworkSend_Command needs _local_player to be set correctly, so
--- a/src/ai/default/default.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ai/default/default.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -305,7 +305,7 @@
 static void AiHandleReplaceTrain(Player *p)
 {
 	const Vehicle* v = p->ai.cur_veh;
-	BackuppedOrders orderbak[1];
+	BackuppedOrders orderbak;
 	EngineID veh;
 
 	// wait until the vehicle reaches the depot.
@@ -318,13 +318,13 @@
 	if (veh != INVALID_ENGINE) {
 		TileIndex tile;
 
-		BackupVehicleOrders(v, orderbak);
+		BackupVehicleOrders(v, &orderbak);
 		tile = v->tile;
 
 		if (CmdSucceeded(DoCommand(0, v->index, 2, DC_EXEC, CMD_SELL_RAIL_WAGON)) &&
 				CmdSucceeded(DoCommand(tile, veh, 0, DC_EXEC, CMD_BUILD_RAIL_VEHICLE))) {
 			VehicleID veh = _new_vehicle_id;
-			AiRestoreVehicleOrders(GetVehicle(veh), orderbak);
+			AiRestoreVehicleOrders(GetVehicle(veh), &orderbak);
 			DoCommand(0, veh, 0, DC_EXEC, CMD_START_STOP_TRAIN);
 
 			DoCommand(0, veh, _ai_service_interval, DC_EXEC, CMD_CHANGE_SERVICE_INT);
@@ -533,7 +533,6 @@
 static void AiFindRandomIndustryRoute(FoundRoute *fr)
 {
 	Industry* i;
-	const IndustrySpec *indsp;
 	uint32 r;
 	CargoID cargo;
 
@@ -547,9 +546,8 @@
 	if (i == NULL) return;
 
 	// pick a random produced cargo
-	indsp = GetIndustrySpec(i->type);
-	cargo = indsp->produced_cargo[0];
-	if (r & 1 && indsp->produced_cargo[1] != CT_INVALID) cargo = indsp->produced_cargo[1];
+	cargo = i->produced_cargo[0];
+	if (r & 1 && i->produced_cargo[1] != CT_INVALID) cargo = i->produced_cargo[1];
 
 	fr->cargo = cargo;
 
@@ -559,16 +557,10 @@
 	if (cargo != CT_GOODS && cargo != CT_FOOD) {
 		// pick a dest, and see if it can receive
 		Industry* i2 = AiFindRandomIndustry();
-		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)) {
+		if (i2 == NULL || i == i2 ||
+				(i2->accepts_cargo[0] != cargo &&
+				i2->accepts_cargo[1] != cargo &&
+				i2->accepts_cargo[2] != cargo)) {
 			return;
 		}
 
@@ -671,10 +663,9 @@
 		}
 	} else {
 		const Industry* i = (const Industry*)fr->from;
-		const IndustrySpec *indsp = GetIndustrySpec(i->type);
-
-		if (i->last_month_pct_transported[fr->cargo != indsp->produced_cargo[0]] > 0x99 ||
-				i->last_month_production[fr->cargo != indsp->produced_cargo[0]] == 0) {
+
+		if (i->last_month_pct_transported[fr->cargo != i->produced_cargo[0]] > 0x99 ||
+				i->last_month_production[fr->cargo != i->produced_cargo[0]] == 0) {
 			return false;
 		}
 	}
--- a/src/ai/trolly/trolly.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ai/trolly/trolly.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -270,7 +270,6 @@
 	}
 	if (type == AI_INDUSTRY) {
 		const Industry* i = GetIndustry(ic);
-		const IndustrySpec *indsp = GetIndustrySpec(i->type);
 		const Station* st;
 		int count = 0;
 		int j = 0;
@@ -279,7 +278,7 @@
 
 		// No limits on delevering stations!
 		//  Or for industry that does not give anything yet
-		if (indsp->produced_cargo[0] == CT_INVALID || i->last_month_production[0] == 0) return true;
+		if (i->produced_cargo[0] == CT_INVALID || i->last_month_production[0] == 0) return true;
 
 		if (i->last_month_production[0] - i->last_month_transported[0] < AI_CHECKCITY_NEEDED_CARGO) return false;
 
@@ -302,13 +301,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 (indsp->produced_cargo[0] == CT_INVALID) continue;
+				if (i->produced_cargo[0] == CT_INVALID) continue;
 				// It does not take this cargo
-				if (!st->goods[indsp->produced_cargo[0]].last_speed) continue;
+				if (!st->goods[i->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[indsp->produced_cargo[0]].rating < AI_CHECKCITY_CARGO_RATING) continue;
+				if (st->goods[i->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,19 +457,17 @@
 			}
 		} 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 (indsp_from->produced_cargo[0] != CT_INVALID && ind_from->last_month_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]) {
+			if (ind_from->produced_cargo[0] != CT_INVALID && ind_from->last_month_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]) {
 						// Found a compatible industry
 						max_cargo = ind_from->last_month_production[0] - ind_from->last_month_transported[0];
 						found = true;
@@ -480,11 +477,11 @@
 					}
 				}
 			}
-			if (!found && indsp_temp->produced_cargo[0] != CT_INVALID && ind_temp->last_month_production[0] != 0) {
+			if (!found && ind_temp->produced_cargo[0] != CT_INVALID && ind_temp->last_month_production[0] != 0) {
 				// If not check if the current ic produces cargo that the from_ic accepts
-				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]) {
+				for (i = 0; i < lengthof(ind_from->accepts_cargo); i++) {
+					if (ind_from->accepts_cargo[i] == CT_INVALID) break;
+					if (ind_from->produced_cargo[0] == ind_from->accepts_cargo[i]) {
 						// Found a compatbiel industry
 						found = true;
 						max_cargo = ind_temp->last_month_production[0] - ind_temp->last_month_transported[0];
@@ -503,9 +500,9 @@
 						distance <= max_cargo * AI_LOCATEROUTE_TRUCK_CARGO_DISTANCE) {
 					p->ainew.to_ic = p->ainew.temp;
 					if (p->ainew.from_deliver) {
-						p->ainew.cargo = indsp_from->produced_cargo[0];
+						p->ainew.cargo = ind_from->produced_cargo[0];
 					} else {
-						p->ainew.cargo = indsp_temp->produced_cargo[0];
+						p->ainew.cargo = ind_temp->produced_cargo[0];
 					}
 					p->ainew.state = AI_STATE_FIND_STATION;
 
--- a/src/aircraft.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/aircraft.h	Sat Oct 06 21:16:00 2007 +0000
@@ -34,14 +34,13 @@
 	return (v->subtype & 0x07) <= AIR_AIRCRAFT;
 }
 
-/** Checks if an aircraft is buildable at the tile in question
+/** Checks if an aircraft can use the station in question
  * @param engine The engine to test
- * @param tile The tile where the hangar is
- * @return true if the aircraft can be build
+ * @param st The station
+ * @return true if the aircraft can use the station
  */
-static inline bool IsAircraftBuildableAtStation(EngineID engine, TileIndex tile)
+static inline bool CanAircraftUseStation(EngineID engine, const Station *st)
 {
-	const Station *st = GetStationByTile(tile);
 	const AirportFTAClass *apc = st->Airport();
 	const AircraftVehicleInfo *avi = AircraftVehInfo(engine);
 
@@ -49,6 +48,16 @@
 	return (apc->flags & (avi->subtype & AIR_CTOL ? AirportFTAClass::AIRPLANES : AirportFTAClass::HELICOPTERS)) != 0;
 }
 
+/** Checks if an aircraft can use the station at the tile in question
+ * @param engine The engine to test
+ * @param tile The tile where the station is
+ * @return true if the aircraft can use the station
+ */
+static inline bool CanAircraftUseStation(EngineID engine, TileIndex tile)
+{
+	return CanAircraftUseStation(engine, GetStationByTile(tile));
+}
+
 /**
  * Calculates cargo capacity based on an aircraft's passenger
  * and mail capacities.
--- a/src/aircraft_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/aircraft_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -312,7 +312,7 @@
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
 	/* Prevent building aircraft types at places which can't handle them */
-	if (!IsAircraftBuildableAtStation(p1, tile)) return CMD_ERROR;
+	if (!CanAircraftUseStation(p1, tile)) return CMD_ERROR;
 
 	/* Allocate 2 or 3 vehicle structs, depending on type
 	 * vl[0] = aircraft, vl[1] = shadow, [vl[2] = rotor] */
@@ -385,7 +385,7 @@
 
 			v->cargo_type = cargo;
 
-			if (HASBIT(EngInfo(p1)->callbackmask, CBM_REFIT_CAPACITY)) {
+			if (HASBIT(EngInfo(p1)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
 				callback = GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, v->engine_type, v);
 			}
 
@@ -609,6 +609,7 @@
 			 * Now we change the setting to apply the new one and let the vehicle head for the same hangar.
 			 * Note: the if is (true for requesting service == true for ordered to stop in hangar) */
 			if (flags & DC_EXEC) {
+				CLRBIT(v->current_order.flags, OFB_PART_OF_ORDERS);
 				TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 			}
@@ -685,7 +686,7 @@
 
 	/* Check the refit capacity callback */
 	uint16 callback = CALLBACK_FAILED;
-	if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
+	if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
 		/* Back up the existing cargo type */
 		CargoID temp_cid = v->cargo_type;
 		byte temp_subtype = v->cargo_subtype;
@@ -2282,7 +2283,7 @@
 			gp = GetNewVehiclePos(v_oldstyle);
 
 			/* set new position x,y,z */
-			SetAircraftPosition(v_oldstyle, gp.x, gp.y, apc->MovingData(v_oldstyle->u.air.pos)->z + z_offset);
+			SetAircraftPosition(v_oldstyle, gp.x, gp.y, apc->MovingData(min(v_oldstyle->u.air.pos, apc->num_positions - 1))->z + z_offset);
 			v_oldstyle->u.air.owned_blocks.ResetAll();
 		}
 	}
--- a/src/aircraft_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/aircraft_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -23,6 +23,50 @@
 #include "vehicle_gui.h"
 #include "newgrf_engine.h"
 
+/**
+* Draw the details for the given vehicle at the position (x,y)
+*
+* @param v current vehicle
+* @param x The x coordinate
+* @param y The y coordinate
+*/
+void DrawAircraftDetails(const Vehicle *v, int x, int y)
+{
+	int y_offset = (v->Next()->cargo_cap != 0) ? -11 : 0;
+
+	for (const Vehicle *u = v ; u != NULL ; u = u->Next()) {
+		if (IsNormalAircraft(u)) {
+			SetDParam(0, u->engine_type);
+			SetDParam(1, u->build_year);
+			SetDParam(2, u->value);
+			DrawString(x, y, STR_A011_BUILT_VALUE, 0);
+
+			SetDParam(0, u->cargo_type);
+			SetDParam(1, u->cargo_cap);
+			SetDParam(2, u->Next()->cargo_type);
+			SetDParam(3, u->Next()->cargo_cap);
+			DrawString(x, y + 10, (u->Next()->cargo_cap != 0) ? STR_A019_CAPACITY : STR_A01A_CAPACITY, 0);
+		}
+
+		if (u->cargo_cap != 0) {
+			uint cargo_count = u->cargo.Count();
+
+			y_offset += 11;
+			if (cargo_count != 0) {
+				/* Cargo names (fix pluralness) */
+				SetDParam(0, u->cargo_type);
+				SetDParam(1, cargo_count);
+				SetDParam(2, u->cargo.Source());
+				DrawString(x, y + 21 + y_offset, STR_8813_FROM, 0);
+			}
+		}
+	}
+
+	SetDParam(0, v->cargo.FeederShare());
+	DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, 0);
+}
+
+
 void DrawAircraftImage(const Vehicle *v, int x, int y, VehicleID selection)
 {
 	SpriteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
@@ -51,177 +95,8 @@
 
 		if (v->tile == _backup_orders_tile) {
 			_backup_orders_tile = 0;
-			RestoreVehicleOrders(v, _backup_orders_data);
+			RestoreVehicleOrders(v);
 		}
 		ShowVehicleViewWindow(v);
 	}
 }
-
-static void AircraftDetailsWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_PAINT: {
-		const Vehicle *v = GetVehicle(w->window_number);
-
-		SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
-
-		/* Disable service-scroller when interval is set to disabled */
-		SetWindowWidgetDisabledState(w, 5, !_patches.servint_aircraft);
-		SetWindowWidgetDisabledState(w, 6, !_patches.servint_aircraft);
-
-		SetDParam(0, v->index);
-		DrawWindowWidgets(w);
-
-		/* Draw running cost */
-		{
-			int year = v->age / 366;
-
-			SetDParam(1, year);
-
-			SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
-			SetDParam(2, v->max_age / 366);
-			SetDParam(3, v->GetDisplayRunningCost());
-			DrawString(2, 15, STR_A00D_AGE_RUNNING_COST_YR, 0);
-		}
-
-		/* Draw max speed */
-		{
-			SetDParam(0, v->GetDisplayMaxSpeed());
-			DrawString(2, 25, STR_A00E_MAX_SPEED, 0);
-		}
-
-		/* Draw profit */
-		{
-			SetDParam(0, v->profit_this_year);
-			SetDParam(1, v->profit_last_year);
-			DrawString(2, 35, STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR, 0);
-		}
-
-		/* Draw breakdown & reliability */
-		{
-			SetDParam(0, v->reliability * 100 >> 16);
-			SetDParam(1, v->breakdowns_since_last_service);
-			DrawString(2, 45, STR_A010_RELIABILITY_BREAKDOWNS, 0);
-		}
-
-		/* Draw service interval text */
-		{
-			SetDParam(0, v->service_interval);
-			SetDParam(1, v->date_of_last_service);
-			DrawString(13, 115, _patches.servint_ispercent?STR_SERVICING_INTERVAL_PERCENT:STR_883C_SERVICING_INTERVAL_DAYS, 0);
-		}
-
-		/* Draw Transfer credits text */
-		{
-			SetDParam(0, v->cargo.FeederShare());
-			DrawString(60, 101, STR_FEEDER_CARGO_VALUE, 0);
-		}
-
-		DrawAircraftImage(v, 3, 57, INVALID_VEHICLE);
-
-		{
-			const Vehicle *u;
-			int y = 57;
-
-			do {
-				if (IsNormalAircraft(v)) {
-					SetDParam(0, v->engine_type);
-					SetDParam(1, v->build_year);
-					SetDParam(2, v->value);
-					DrawString(60, y, STR_A011_BUILT_VALUE, 0);
-					y += 10;
-
-					SetDParam(0, v->cargo_type);
-					SetDParam(1, v->cargo_cap);
-					u = v->Next();
-					SetDParam(2, u->cargo_type);
-					SetDParam(3, u->cargo_cap);
-					DrawString(60, y, (u->cargo_cap != 0) ? STR_A019_CAPACITY : STR_A01A_CAPACITY, 0);
-					y += 14;
-				}
-
-				uint cargo_count = v->cargo.Count();
-				if (cargo_count != 0) {
-
-					/* Cargo names (fix pluralness) */
-					SetDParam(0, v->cargo_type);
-					SetDParam(1, cargo_count);
-					SetDParam(2, v->cargo.Source());
-					DrawString(60, y, STR_8813_FROM, 0);
-
-					y += 10;
-				}
-			} while ((v = v->Next()) != NULL);
-		}
-	} break;
-
-	case WE_CLICK: {
-		int mod;
-		const Vehicle *v;
-		switch (e->we.click.widget) {
-		case 2: /* rename */
-			v = GetVehicle(w->window_number);
-			SetDParam(0, v->index);
-			ShowQueryString(STR_VEHICLE_NAME, STR_A030_NAME_AIRCRAFT, 31, 150, w, CS_ALPHANUMERAL);
-			break;
-		case 5: /* increase int */
-			mod = _ctrl_pressed? 5 : 10;
-			goto do_change_service_int;
-		case 6: /* decrease int */
-			mod = _ctrl_pressed?- 5 : -10;
-do_change_service_int:
-			v = GetVehicle(w->window_number);
-
-			mod = GetServiceIntervalClamped(mod + v->service_interval);
-			if (mod == v->service_interval) return;
-
-			DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
-			break;
-		}
-	} break;
-
-	case WE_ON_EDIT_TEXT:
-		if (e->we.edittext.str[0] != '\0') {
-			_cmd_text = e->we.edittext.str;
-			DoCommandP(0, w->window_number, 0, NULL,
-				CMD_NAME_VEHICLE | CMD_MSG(STR_A031_CAN_T_NAME_AIRCRAFT));
-		}
-		break;
-	}
-}
-
-
-static const Widget _aircraft_details_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,         STR_018B_CLOSE_WINDOW },
-{    WWT_CAPTION,   RESIZE_NONE,    14,    11,   349,     0,    13, STR_A00C_DETAILS, STR_018C_WINDOW_TITLE_DRAG_THIS },
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   350,   389,     0,    13, STR_01AA_NAME,    STR_A032_NAME_AIRCRAFT },
-{      WWT_PANEL,   RESIZE_NONE,    14,     0,   389,    14,    55, 0x0,              STR_NULL },
-{      WWT_PANEL,   RESIZE_NONE,    14,     0,   389,    56,   113, 0x0,              STR_NULL },
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,    10,   114,   119, STR_0188,         STR_884D_INCREASE_SERVICING_INTERVAL },
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,    10,   120,   125, STR_0189,         STR_884E_DECREASE_SERVICING_INTERVAL },
-{      WWT_PANEL,   RESIZE_NONE,    14,    11,   389,   114,   125, 0x0,              STR_NULL },
-{   WIDGETS_END},
-};
-
-static const WindowDesc _aircraft_details_desc = {
-	WDP_AUTO, WDP_AUTO, 390, 126, 390, 126,
-	WC_VEHICLE_DETAILS, WC_VEHICLE_VIEW,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
-	_aircraft_details_widgets,
-	AircraftDetailsWndProc
-};
-
-
-void ShowAircraftDetailsWindow(const Vehicle *v)
-{
-	Window *w;
-	VehicleID veh = v->index;
-
-	DeleteWindowById(WC_VEHICLE_ORDERS, veh);
-	DeleteWindowById(WC_VEHICLE_DETAILS, veh);
-
-	w = AllocateWindowDescFront(&_aircraft_details_desc, veh);
-	w->caption_color = v->owner;
-//	w->vscroll.cap = 6;
-//	w->traindetails_d.tab = 0;
-}
--- a/src/airport_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/airport_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -53,7 +53,7 @@
 		DoCommandP(tile,
 				_airport.layout_set | (_airport.numtracks << 8) | (_airport.platlength << 16) | (_ctrl_pressed << 24),
 				0x80 | (_airport.fsmports_class << 8) | (_airport.station_type << 16), CcBuildAirport,
-				CMD_BUILD_AIRPORT | CMD_AUTO | CMD_MSG(STR_A001_CAN_T_BUILD_AIRPORT_HERE));
+				CMD_BUILD_AIRPORT | CMD_MSG(STR_A001_CAN_T_BUILD_AIRPORT_HERE));
 }
 
 static void PlaceAir_DemolishArea(TileIndex tile)
--- a/src/articulated_vehicles.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/articulated_vehicles.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -15,16 +15,24 @@
 #include "newgrf_engine.h"
 
 
-uint CountArticulatedParts(EngineID engine_type)
+uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
 {
-	if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0;
+	if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return 0;
+
+	Vehicle *v = NULL;;
+	if (!purchase_window) {
+		v = new InvalidVehicle();
+		v->engine_type = engine_type;
+	}
 
 	uint i;
-	for (i = 1; i < 10; i++) {
-		uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine_type, NULL);
+	for (i = 1; i < MAX_UVALUE(EngineID); i++) {
+		uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine_type, v);
 		if (callback == CALLBACK_FAILED || callback == 0xFF) break;
 	}
 
+	delete v;
+
 	return i - 1;
 }
 
@@ -33,16 +41,15 @@
 	const Vehicle *v = vl[0];
 	Vehicle *u = vl[0];
 
-	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return;
+	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return;
 
-	for (uint i = 1; i < 10; i++) {
+	for (uint i = 1; i < MAX_UVALUE(EngineID); i++) {
 		uint16 callback = GetVehicleCallback(CBID_VEHICLE_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->SetNext(vl[i]);
-		if (u->Next() == NULL) u->SetNext(new InvalidVehicle());
 		if (u->Next() == NULL) return;
 
 		Vehicle *previous = u;
@@ -77,6 +84,7 @@
 				const RailVehicleInfo *rvi_artic = RailVehInfo(engine_type);
 
 				u = new (u) Train();
+				previous->SetNext(u);
 				u->u.rail.track = v->u.rail.track;
 				u->u.rail.railtype = v->u.rail.railtype;
 				u->u.rail.first_engine = v->engine_type;
@@ -92,6 +100,7 @@
 				const RoadVehicleInfo *rvi_artic = RoadVehInfo(engine_type);
 
 				u = new (u) RoadVehicle();
+				previous->SetNext(u);
 				u->u.road.first_engine = v->engine_type;
 				u->u.road.cached_veh_length = GetRoadVehLength(u);
 				u->u.road.state = RVSB_IN_DEPOT;
@@ -107,8 +116,6 @@
 			} break;
 		}
 
-		previous->SetNext(u);
-
 		if (flip_image) u->spritenum++;
 
 		VehiclePositionChanged(u);
--- a/src/articulated_vehicles.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/articulated_vehicles.h	Sat Oct 06 21:16:00 2007 +0000
@@ -5,7 +5,7 @@
 #ifndef ARTICULATED_VEHICLES_H
 #define ARTICULATED_VEHICLES_H
 
-uint CountArticulatedParts(EngineID engine_type);
+uint CountArticulatedParts(EngineID engine_type, bool purchase_window);
 void AddArticulatedParts(Vehicle **vl, VehicleType type);
 
 #endif /* ARTICULATED_VEHICLES_H */
--- a/src/autoreplace_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/autoreplace_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -202,7 +202,7 @@
 			/* Get the vehicle in front of the one we move out */
 			Vehicle *front = old_v->Previous();
 			/* 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 = front->Previous();
+			if (IsRearDualheaded(front)) front = front->Previous();
 			/* 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 */
@@ -247,13 +247,17 @@
 		}
 	} else { // flags & DC_EXEC not set
 		CommandCost tmp_move;
-		if (old_v->type == VEH_TRAIN && IsFrontEngine(old_v) && old_v->Next() != NULL) {
-			/* Verify that the wagons can be placed on the engine in question.
-			 * This is done by building an engine, test if the wagons can be added and then sell the test engine. */
-			DoCommand(old_v->tile, new_engine_type, 3, DC_EXEC, GetCmdBuildVeh(old_v));
-			Vehicle *temp = GetVehicle(_new_vehicle_id);
-			tmp_move = DoCommand(0, (temp->index << 16) | old_v->Next()->index, 1, 0, CMD_MOVE_RAIL_VEHICLE);
-			DoCommand(0, temp->index, 0, DC_EXEC, GetCmdSellVeh(old_v));
+
+		if (old_v->type == VEH_TRAIN && IsFrontEngine(old_v)) {
+			Vehicle *next_veh = GetNextUnit(old_v); // don't try to move the rear multiheaded engine or articulated parts
+			if (next_veh != NULL) {
+				/* Verify that the wagons can be placed on the engine in question.
+				 * This is done by building an engine, test if the wagons can be added and then sell the test engine. */
+				DoCommand(old_v->tile, new_engine_type, 3, DC_EXEC, GetCmdBuildVeh(old_v));
+				Vehicle *temp = GetVehicle(_new_vehicle_id);
+				tmp_move = DoCommand(0, (temp->index << 16) | next_veh->index, 1, 0, CMD_MOVE_RAIL_VEHICLE);
+				DoCommand(0, temp->index, 0, DC_EXEC, GetCmdSellVeh(old_v));
+			}
 		}
 
 		/* Ensure that the player will not end up having negative money while autoreplacing
@@ -332,7 +336,7 @@
 		cost = CommandCost();
 		w = v;
 		do {
-			if (w->type == VEH_TRAIN && IsMultiheaded(w) && !IsTrainEngine(w)) {
+			if (w->type == VEH_TRAIN && IsRearDualheaded(w)) {
 				/* we build the rear ends of multiheaded trains with the front ones */
 				continue;
 			}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/autoslope.h	Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,44 @@
+/* $Id$ */
+
+/** @file autoslope.h */
+
+#ifndef AUTOSLOPE_H
+#define AUTOSLOPE_H
+
+#include "depot.h"
+
+/**
+ * Autoslope check for tiles with an entrance on an edge.
+ * E.g. depots and non-drive-through-road-stops.
+ *
+ * The test succeeds if the slope is not steep and at least one corner of the entrance edge is on the TileMaxZ() level.
+ *
+ * @note The test does not check if autoslope is enabled at all.
+ *
+ * @param tile The tile.
+ * @param z_new New TileZ.
+ * @param tileh_new New TileSlope.
+ * @param entrance Entrance edge.
+ * @return true iff terraforming is allowed.
+ */
+static inline bool AutoslopeCheckForEntranceEdge(TileIndex tile, uint z_new, Slope tileh_new, DiagDirection entrance)
+{
+	if (IsSteepSlope(tileh_new) || (GetTileMaxZ(tile) != z_new + GetSlopeMaxZ(tileh_new))) return false;
+	return ((tileh_new == SLOPE_FLAT) || CanBuildDepotByTileh(entrance, tileh_new));
+}
+
+/**
+ * Tests if autoslope is enabled for _current_player.
+ *
+ * Autoslope is disabled for town/industry construction and old ai players.
+ *
+ * @return true iff autoslope is enabled.
+ */
+static inline bool AutoslopeEnabled()
+{
+	return (_patches.autoslope &&
+	        ((IsValidPlayer(_current_player) && !_is_old_ai_player) ||
+	         (_current_player == OWNER_NONE && _game_mode == GM_EDITOR)));
+}
+
+#endif /* AUTOSLOPE_H */
--- a/src/blitter/32bpp_anim.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_anim.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -10,6 +10,12 @@
 
 void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
 {
+	if (bp->dst < _screen.dst_ptr || bp->dst > (uint32 *)_screen.dst_ptr + _screen.width * _screen.height) {
+		/* This means our output is not to the screen, so we can't be doing any animation stuff, so use our parent Draw() */
+		Blitter_32bppOptimized::Draw(bp, mode, zoom);
+		return;
+	}
+
 	const SpriteLoader::CommonPixel *src, *src_line;
 	uint32 *dst, *dst_line;
 	uint8 *anim, *anim_line;
@@ -38,11 +44,22 @@
 		anim_line += this->anim_buf_width;
 
 		for (int x = 0; x < bp->width; x++) {
+			if (src->a == 0) {
+				/* src->r is 'misused' here to indicate how much more pixels are following with an alpha of 0 */
+				int skip = UnScaleByZoom(src->r, zoom);
+
+				dst  += skip;
+				anim += skip;
+				x    += skip - 1;
+				src  += ScaleByZoom(1, zoom) * skip;
+				continue;
+			}
+
 			switch (mode) {
 				case BM_COLOUR_REMAP:
 					/* In case the m-channel is zero, do not remap this pixel in any way */
 					if (src->m == 0) {
-						if (src->a != 0) *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
+						*dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
 						*anim = 0;
 					} else {
 						if (bp->remap[src->m] != 0) {
@@ -58,19 +75,15 @@
 					 *  we produce a result the newgrf maker didn't expect ;) */
 
 					/* Make the current color a bit more black, so it looks like this image is transparent */
-					if (src->a != 0) {
-						*dst = MakeTransparent(*dst, 75);
-						*anim = bp->remap[*anim];
-					}
+					*dst = MakeTransparent(*dst, 192);
+					*anim = bp->remap[*anim];
 					break;
 
 				default:
-					if (src->a != 0) {
-						/* Above 217 is palette animation */
-						if (src->m >= 217) *dst = ComposeColourPA(this->LookupColourInPalette(src->m), src->a, *dst);
-						else               *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
-						*anim = src->m;
-					}
+					/* Above 217 is palette animation */
+					if (src->m >= 217) *dst = ComposeColourPA(this->LookupColourInPalette(src->m), src->a, *dst);
+					else               *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
+					*anim = src->m;
 					break;
 			}
 			dst++;
@@ -90,7 +103,7 @@
 	if (pal == PALETTE_TO_TRANSPARENT) {
 		do {
 			for (int i = 0; i != width; i++) {
-				*udst = MakeTransparent(*udst, 60);
+				*udst = MakeTransparent(*udst, 154);
 				*anim = 0;
 				udst++;
 				anim++;
--- a/src/blitter/32bpp_anim.hpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_anim.hpp	Sat Oct 06 21:16:00 2007 +0000
@@ -5,10 +5,10 @@
 #ifndef BLITTER_32BPP_ANIM_HPP
 #define BLITTER_32BPP_ANIM_HPP
 
-#include "32bpp_simple.hpp"
+#include "32bpp_optimized.hpp"
 #include "factory.hpp"
 
-class Blitter_32bppAnim : public Blitter_32bppSimple {
+class Blitter_32bppAnim : public Blitter_32bppOptimized {
 private:
 	uint8 *anim_buf; ///< In this buffer we keep track of the 8bpp indexes so we can do palette animation
 	int anim_buf_width;
--- a/src/blitter/32bpp_base.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_base.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -56,7 +56,7 @@
 		stepx = 1;
 	}
 
-	if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+	if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
 	if (dx > dy) {
 		frac = dy - (dx / 2);
 		while (x != x2) {
@@ -66,7 +66,7 @@
 			}
 			x += stepx;
 			frac += dy;
-			if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
 		}
 	} else {
 		frac = dx - (dy / 2);
@@ -77,7 +77,7 @@
 			}
 			y += stepy;
 			frac += dx;
-			if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
 		}
 	}
 }
--- a/src/blitter/32bpp_base.hpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_base.hpp	Sat Oct 06 21:16:00 2007 +0000
@@ -48,15 +48,19 @@
 	 */
 	static inline uint ComposeColourRGBA(uint r, uint g, uint b, uint a, uint current)
 	{
+		if (a == 0) return current;
+		if (a >= 255) return ComposeColour(0xFF, r, g, b);
+
 		uint cr, cg, cb;
 		cr = GB(current, 16, 8);
 		cg = GB(current, 8,  8);
 		cb = GB(current, 0,  8);
 
+		/* The 256 is wrong, it should be 255, but 256 is much faster... */
 		return ComposeColour(0xFF,
-												(r * a + cr * (255 - a)) / 255,
-												(g * a + cg * (255 - a)) / 255,
-												(b * a + cb * (255 - a)) / 255);
+												(r * a + cr * (256 - a)) / 256,
+												(g * a + cg * (256 - a)) / 256,
+												(b * a + cb * (256 - a)) / 256);
 	}
 
 	/**
@@ -64,24 +68,28 @@
 	*/
 	static inline uint ComposeColourPA(uint colour, uint a, uint current)
 	{
+		if (a == 0) return current;
+		if (a >= 255) return (colour | 0xFF000000);
+
 		uint r, g, b, cr, cg, cb;
-		r  = GB(colour,   16, 8);
-		g  = GB(colour,   8,  8);
-		b  = GB(colour,   0,  8);
+		r  = GB(colour,  16, 8);
+		g  = GB(colour,  8,  8);
+		b  = GB(colour,  0,  8);
 		cr = GB(current, 16, 8);
 		cg = GB(current, 8,  8);
 		cb = GB(current, 0,  8);
 
+		/* The 256 is wrong, it should be 255, but 256 is much faster... */
 		return ComposeColour(0xFF,
-												(r * a + cr * (255 - a)) / 255,
-												(g * a + cg * (255 - a)) / 255,
-												(b * a + cb * (255 - a)) / 255);
+												(r * a + cr * (256 - a)) / 256,
+												(g * a + cg * (256 - a)) / 256,
+												(b * a + cb * (256 - a)) / 256);
 	}
 
 	/**
 	* Make a pixel looks like it is transparent.
 	* @param colour the colour already on the screen.
-	* @param amount the amount of transparency, times 100.
+	* @param amount the amount of transparency, times 256.
 	* @return the new colour for the screen.
 	*/
 	static inline uint MakeTransparent(uint colour, uint amount)
@@ -91,7 +99,7 @@
 		g = GB(colour, 8,  8);
 		b = GB(colour, 0,  8);
 
-		return ComposeColour(0xFF, r * amount / 100, g * amount / 100, b * amount / 100);
+		return ComposeColour(0xFF, r * amount / 256, g * amount / 256, b * amount / 256);
 	}
 
 	/**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/blitter/32bpp_optimized.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,108 @@
+#include "../stdafx.h"
+#include "../zoom.hpp"
+#include "../gfx.h"
+#include "../debug.h"
+#include "../table/sprites.h"
+#include "32bpp_optimized.hpp"
+
+static FBlitter_32bppOptimized iFBlitter_32bppOptimized;
+
+void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
+{
+	const SpriteLoader::CommonPixel *src, *src_line;
+	uint32 *dst, *dst_line;
+
+	/* Find where to start reading in the source sprite */
+	src_line = (const SpriteLoader::CommonPixel *)bp->sprite + (bp->skip_top * bp->sprite_width + bp->skip_left) * ScaleByZoom(1, zoom);
+	dst_line = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
+
+	for (int y = 0; y < bp->height; y++) {
+		dst = dst_line;
+		dst_line += bp->pitch;
+
+		src = src_line;
+		src_line += bp->sprite_width * ScaleByZoom(1, zoom);
+
+		for (int x = 0; x < bp->width; x++) {
+			if (src->a == 0) {
+				/* src->r is 'misused' here to indicate how much more pixels are following with an alpha of 0 */
+				int skip = UnScaleByZoom(src->r, zoom);
+
+				dst += skip;
+				x   += skip - 1;
+				src += ScaleByZoom(1, zoom) * skip;
+				continue;
+			}
+
+			switch (mode) {
+				case BM_COLOUR_REMAP:
+					/* In case the m-channel is zero, do not remap this pixel in any way */
+					if (src->m == 0) {
+						*dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
+					} else {
+						if (bp->remap[src->m] != 0) *dst = ComposeColourPA(this->LookupColourInPalette(bp->remap[src->m]), src->a, *dst);
+					}
+					break;
+
+				case BM_TRANSPARENT:
+					/* TODO -- We make an assumption here that the remap in fact is transparency, not some color.
+					 *  This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
+					 *  we produce a result the newgrf maker didn't expect ;) */
+
+					/* Make the current color a bit more black, so it looks like this image is transparent */
+					*dst = MakeTransparent(*dst, 192);
+					break;
+
+				default:
+					*dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
+					break;
+			}
+			dst++;
+			src += ScaleByZoom(1, zoom);
+		}
+	}
+}
+
+Sprite *Blitter_32bppOptimized::Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator)
+{
+	Sprite *dest_sprite;
+	SpriteLoader::CommonPixel *dst;
+	dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sprite->height * sprite->width * sizeof(SpriteLoader::CommonPixel));
+
+	dest_sprite->height = sprite->height;
+	dest_sprite->width  = sprite->width;
+	dest_sprite->x_offs = sprite->x_offs;
+	dest_sprite->y_offs = sprite->y_offs;
+
+	dst = (SpriteLoader::CommonPixel *)dest_sprite->data;
+
+	memcpy(dst, sprite->data, sprite->height * sprite->width * sizeof(SpriteLoader::CommonPixel));
+	/* Skip to the end of the array, and work backwards to find transparent blocks */
+	dst = dst + sprite->height * sprite->width - 1;
+
+	for (uint y = sprite->height; y > 0; y--) {
+		int trans = 0;
+		/* Process sprite line backwards, to compute lengths of transparent blocks */
+		for (uint x = sprite->width; x > 0; x--) {
+			if (dst->a == 0) {
+				/* Save transparent block length in red channel; max value is 255 the red channel can contain */
+				if (trans < 255) trans++;
+				dst->r = trans;
+				dst->g = 0;
+				dst->b = 0;
+				dst->m = 0;
+			} else {
+				trans = 0;
+				if (dst->m != 0) {
+					/* Pre-convert the mapping channel to a RGB value */
+					uint color = this->LookupColourInPalette(dst->m);
+					dst->r = GB(color, 16, 8);
+					dst->g = GB(color, 8,  8);
+					dst->b = GB(color, 0,  8);
+				}
+			}
+			dst--;
+		}
+	}
+	return dest_sprite;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/blitter/32bpp_optimized.hpp	Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,26 @@
+/* $Id$ */
+
+/** @file 32bpp_optimized.hpp */
+
+#ifndef BLITTER_32BPP_OPTIMIZED_HPP
+#define BLITTER_32BPP_OPTIMIZED_HPP
+
+#include "32bpp_simple.hpp"
+#include "factory.hpp"
+
+class Blitter_32bppOptimized : public Blitter_32bppSimple {
+public:
+	/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
+	/* virtual */ Sprite *Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator);
+
+	/* virtual */ const char *GetName() { return "32bpp-optimized"; }
+};
+
+class FBlitter_32bppOptimized: public BlitterFactory<FBlitter_32bppOptimized> {
+public:
+	/* virtual */ const char *GetName() { return "32bpp-optimized"; }
+	/* virtual */ const char *GetDescription() { return "32bpp Optimized Blitter (no palette animation)"; }
+	/* virtual */ Blitter *CreateInstance() { return new Blitter_32bppOptimized(); }
+};
+
+#endif /* BLITTER_32BPP_OPTIMIZED_HPP */
--- a/src/blitter/32bpp_simple.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_simple.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -40,7 +40,7 @@
 					 *  we produce a result the newgrf maker didn't expect ;) */
 
 					/* Make the current color a bit more black, so it looks like this image is transparent */
-					if (src->a != 0) *dst = MakeTransparent(*dst, 75);
+					if (src->a != 0) *dst = MakeTransparent(*dst, 192);
 					break;
 
 				default:
@@ -60,7 +60,7 @@
 	if (pal == PALETTE_TO_TRANSPARENT) {
 		do {
 			for (int i = 0; i != width; i++) {
-				*udst = MakeTransparent(*udst, 60);
+				*udst = MakeTransparent(*udst, 154);
 				udst++;
 			}
 			udst = udst - width + _screen.pitch;
--- a/src/blitter/8bpp_base.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/8bpp_base.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -60,7 +60,7 @@
 		stepx = 1;
 	}
 
-	if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+	if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
 	if (dx > dy) {
 		frac = dy - (dx / 2);
 		while (x != x2) {
@@ -70,7 +70,7 @@
 			}
 			x += stepx;
 			frac += dy;
-			if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
 		}
 	} else {
 		frac = dx - (dy / 2);
@@ -81,7 +81,7 @@
 			}
 			y += stepy;
 			frac += dx;
-			if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
 		}
 	}
 }
--- a/src/blitter/factory.hpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/factory.hpp	Sat Oct 06 21:16:00 2007 +0000
@@ -4,6 +4,8 @@
 #define BLITTER_FACTORY_HPP
 
 #include "base.hpp"
+#include "../string.h"
+#include "../debug.h"
 #include <string>
 #include <map>
 
@@ -61,15 +63,20 @@
 	 */
 	static Blitter *SelectBlitter(const char *name)
 	{
+		const char *default_blitter = "8bpp-optimized";
+
 		if (GetBlitters().size() == 0) return NULL;
+		const char *bname = (StrEmpty(name)) ? default_blitter : name;
 
 		Blitters::iterator it = GetBlitters().begin();
 		for (; it != GetBlitters().end(); it++) {
 			BlitterFactoryBase *b = (*it).second;
-			if (strcasecmp(name, b->name) == 0) {
+			if (strcasecmp(bname, b->name) == 0) {
 				Blitter *newb = b->CreateInstance();
 				delete *GetActiveBlitter();
 				*GetActiveBlitter() = newb;
+
+				DEBUG(driver, 1, "Successfully %s blitter '%s'",StrEmpty(name) ? "probed" : "loaded", bname);
 				return newb;
 			}
 		}
--- a/src/bridge_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/bridge_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -36,7 +36,7 @@
 	DeleteWindow(w);
 	DoCommandP(_bridgedata.end_tile, _bridgedata.start_tile,
 		_bridgedata.indexes[i] | (_bridgedata.type << 8), CcBuildBridge,
-		CMD_BUILD_BRIDGE | CMD_AUTO | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
+		CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
 }
 
 static void BuildBridgeWndProc(Window *w, WindowEvent *e)
--- a/src/build_vehicle_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/build_vehicle_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -621,7 +621,7 @@
 				int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
 
 				SetDParam(0, rvi->cargo_type);
-				SetDParam(1, (capacity * (CountArticulatedParts(engine_number) + 1)) << multihead);
+				SetDParam(1, (capacity * (CountArticulatedParts(engine_number, true) + 1)) << multihead);
 				SetDParam(2, refitable ? STR_9842_REFITTABLE : STR_EMPTY);
 			}
 			DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
@@ -765,7 +765,7 @@
 	for (eid = AIRCRAFT_ENGINES_INDEX; eid < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; eid++) {
 		if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_player)) continue;
 		/* First VEH_END window_numbers are fake to allow a window open for all different types at once */
-		if (w->window_number > VEH_END && !IsAircraftBuildableAtStation(eid, w->window_number)) continue;
+		if (w->window_number > VEH_END && !CanAircraftUseStation(eid, w->window_number)) continue;
 
 		EngList_Add(&bv->eng_list, eid);
 		if (eid == bv->sel_engine) sel_id = eid;
--- a/src/clear_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/clear_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -47,7 +47,14 @@
 	int modheight_count;                                         ///< amount of entries in "modheight".
 	int tile_table_count;                                        ///< amount of entries in "tile_table".
 
-	TileIndex tile_table[TERRAFORMER_TILE_TABLE_SIZE];           ///< Dirty tiles, i.e. at least one corner changed.
+	/**
+	 * Dirty tiles, i.e.\ at least one corner changed.
+	 *
+	 * This array contains the tiles which are or will be marked as dirty.
+	 *
+	 * @ingroup dirty
+	 */
+	TileIndex tile_table[TERRAFORMER_TILE_TABLE_SIZE];
 	TerraformerHeightMod modheight[TERRAFORMER_MODHEIGHT_SIZE];  ///< Height modifications.
 };
 
@@ -106,6 +113,7 @@
  *
  * @param ts TerraformerState.
  * @param tile Tile.
+ * @ingroup dirty
  */
 static void TerraformAddDirtyTile(TerraformerState *ts, TileIndex tile)
 {
@@ -128,6 +136,7 @@
  *
  * @param ts TerraformerState.
  * @param tile Tile.
+ * @ingroup dirty
  */
 static void TerraformAddDirtyTileAround(TerraformerState *ts, TileIndex tile)
 {
@@ -305,7 +314,7 @@
 				return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE);
 			}
 			/* Check tiletype-specific things, and add extra-cost */
-			CommandCost cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, flags, z_min * TILE_HEIGHT, (Slope) tileh);
+			CommandCost cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, flags | DC_AUTO, z_min * TILE_HEIGHT, (Slope) tileh);
 			if (CmdFailed(cost)) {
 				_terraform_err_tile = tile;
 				return cost;
--- a/src/command.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/command.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -15,9 +15,19 @@
 #include "network/network.h"
 #include "variables.h"
 #include "genworld.h"
+#include "newgrf_storage.h"
 
-const char* _cmd_text = NULL;
+const char *_cmd_text = NULL;
 
+/**
+ * Helper macro to define the header of all command handler macros.
+ *
+ * This macro create the function header for a given command handler function, as
+ * all command handler functions got the parameters from the #CommandProc callback
+ * type.
+ *
+ * @param yyyy The desired function name of the new command handler function.
+ */
 #define DEF_COMMAND(yyyy) CommandCost yyyy(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 
 DEF_COMMAND(CmdBuildRailroadTrack);
@@ -181,166 +191,178 @@
 DEF_COMMAND(CmdChangeTimetable);
 DEF_COMMAND(CmdSetVehicleOnTime);
 DEF_COMMAND(CmdAutofillTimetable);
-
-/* The master command table */
-static const Command _command_proc_table[] = {
-	{CmdBuildRailroadTrack,                  0}, /*   0 */
-	{CmdRemoveRailroadTrack,                 0}, /*   1 */
-	{CmdBuildSingleRail,                     0}, /*   2 */
-	{CmdRemoveSingleRail,                    0}, /*   3 */
-	{CmdLandscapeClear,                      0}, /*   4 */
-	{CmdBuildBridge,                         0}, /*   5 */
-	{CmdBuildRailroadStation,                0}, /*   6 */
-	{CmdBuildTrainDepot,                     0}, /*   7 */
-	{CmdBuildSingleSignal,                   0}, /*   8 */
-	{CmdRemoveSingleSignal,                  0}, /*   9 */
-	{CmdTerraformLand,                       0}, /*  10 */
-	{CmdPurchaseLandArea,                    0}, /*  11 */
-	{CmdSellLandArea,                        0}, /*  12 */
-	{CmdBuildTunnel,                         0}, /*  13 */
-	{CmdRemoveFromRailroadStation,           0}, /*  14 */
-	{CmdConvertRail,                         0}, /*  15 */
-	{CmdBuildTrainWaypoint,                  0}, /*  16 */
-	{CmdRenameWaypoint,                      0}, /*  17 */
-	{CmdRemoveTrainWaypoint,                 0}, /*  18 */
-	{NULL,                                   0}, /*  19 */
-	{NULL,                                   0}, /*  20 */
-	{CmdBuildRoadStop,                       0}, /*  21 */
-	{CmdRemoveRoadStop,                      0}, /*  22 */
-	{CmdBuildLongRoad,                       0}, /*  23 */
-	{CmdRemoveLongRoad,                      0}, /*  24 */
-	{CmdBuildRoad,                           0}, /*  25 */
-	{CmdRemoveRoad,                          0}, /*  26 */
-	{CmdBuildRoadDepot,                      0}, /*  27 */
-	{NULL,                                   0}, /*  28 */
-	{CmdBuildAirport,                        0}, /*  29 */
-	{CmdBuildDock,                           0}, /*  30 */
-	{CmdBuildShipDepot,                      0}, /*  31 */
-	{CmdBuildBuoy,                           0}, /*  32 */
-	{CmdPlantTree,                           0}, /*  33 */
-	{CmdBuildRailVehicle,                    0}, /*  34 */
-	{CmdMoveRailVehicle,                     0}, /*  35 */
-	{CmdStartStopTrain,                      0}, /*  36 */
-	{NULL,                                   0}, /*  37 */
-	{CmdSellRailWagon,                       0}, /*  38 */
-	{CmdSendTrainToDepot,                    0}, /*  39 */
-	{CmdForceTrainProceed,                   0}, /*  40 */
-	{CmdReverseTrainDirection,               0}, /*  41 */
-
-	{CmdModifyOrder,                         0}, /*  42 */
-	{CmdSkipToOrder,                         0}, /*  43 */
-	{CmdDeleteOrder,                         0}, /*  44 */
-	{CmdInsertOrder,                         0}, /*  45 */
-
-	{CmdChangeServiceInt,                    0}, /*  46 */
-
-	{CmdBuildIndustry,                       0}, /*  47 */
-	{CmdBuildCompanyHQ,                      0}, /*  48 */
-	{CmdSetPlayerFace,                       0}, /*  49 */
-	{CmdSetPlayerColor,                      0}, /*  50 */
-
-	{CmdIncreaseLoan,                        0}, /*  51 */
-	{CmdDecreaseLoan,                        0}, /*  52 */
-
-	{CmdWantEnginePreview,                   0}, /*  53 */
-
-	{CmdNameVehicle,                         0}, /*  54 */
-	{CmdRenameEngine,                        0}, /*  55 */
-
-	{CmdChangeCompanyName,                   0}, /*  56 */
-	{CmdChangePresidentName,                 0}, /*  57 */
-
-	{CmdRenameStation,                       0}, /*  58 */
-
-	{CmdSellAircraft,                        0}, /*  59 */
-	{CmdStartStopAircraft,                   0}, /*  60 */
+#undef DEF_COMMAND
 
-	{CmdBuildAircraft,                       0}, /*  61 */
-	{CmdSendAircraftToHangar,                0}, /*  62 */
-	{NULL,                                   0}, /*  63 */
-	{CmdRefitAircraft,                       0}, /*  64 */
-
-	{CmdPlaceSign,                           0}, /*  65 */
-	{CmdRenameSign,                          0}, /*  66 */
-
-	{CmdBuildRoadVeh,                        0}, /*  67 */
-	{CmdStartStopRoadVeh,                    0}, /*  68 */
-	{CmdSellRoadVeh,                         0}, /*  69 */
-	{CmdSendRoadVehToDepot,                  0}, /*  70 */
-	{CmdTurnRoadVeh,                         0}, /*  71 */
-	{CmdRefitRoadVeh,                        0}, /*  72 */
-
-	{CmdPause,                      CMD_SERVER}, /*  73 */
-
-	{CmdBuyShareInCompany,                   0}, /*  74 */
-	{CmdSellShareInCompany,                  0}, /*  75 */
-	{CmdBuyCompany,                          0}, /*  76 */
-
-	{CmdBuildTown,                 CMD_OFFLINE}, /*  77 */
-	{NULL,                                   0}, /*  78 */
-	{NULL,                                   0}, /*  79 */
-	{CmdRenameTown,                 CMD_SERVER}, /*  80 */
-	{CmdDoTownAction,                        0}, /*  81 */
-
-	{CmdSetRoadDriveSide,           CMD_SERVER}, /*  82 */
-	{NULL,                                   0}, /*  83 */
-	{NULL,                                   0}, /*  84 */
-	{CmdChangeDifficultyLevel,      CMD_SERVER}, /*  85 */
-
-	{CmdStartStopShip,                       0}, /*  86 */
-	{CmdSellShip,                            0}, /*  87 */
-	{CmdBuildShip,                           0}, /*  88 */
-	{CmdSendShipToDepot,                     0}, /*  89 */
-	{NULL,                                   0}, /*  90 */
-	{CmdRefitShip,                           0}, /*  91 */
+/**
+ * The master command table
+ *
+ * This table contains all possible CommandProc functions with
+ * the flags which belongs to it. The indizes are the same
+ * as the value from the CMD_* enums.
+ */
+static const Command _command_proc_table[] = {
+	{CmdBuildRailroadTrack,           CMD_AUTO}, /*   0, CMD_BUILD_RAILROAD_TRACK */
+	{CmdRemoveRailroadTrack,          CMD_AUTO}, /*   1, CMD_REMOVE_RAILROAD_TRACK */
+	{CmdBuildSingleRail,              CMD_AUTO}, /*   2, CMD_BUILD_SINGLE_RAIL */
+	{CmdRemoveSingleRail,             CMD_AUTO}, /*   3, CMD_REMOVE_SINGLE_RAIL */
+	{CmdLandscapeClear,                      0}, /*   4, CMD_LANDSCAPE_CLEAR */
+	{CmdBuildBridge,                  CMD_AUTO}, /*   5, CMD_BUILD_BRIDGE */
+	{CmdBuildRailroadStation,         CMD_AUTO}, /*   6, CMD_BUILD_RAILROAD_STATION */
+	{CmdBuildTrainDepot,              CMD_AUTO}, /*   7, CMD_BUILD_TRAIN_DEPOT */
+	{CmdBuildSingleSignal,            CMD_AUTO}, /*   8, CMD_BUILD_SIGNALS */
+	{CmdRemoveSingleSignal,           CMD_AUTO}, /*   9, CMD_REMOVE_SIGNALS */
+	{CmdTerraformLand,                CMD_AUTO}, /*  10, CMD_TERRAFORM_LAND */
+	{CmdPurchaseLandArea,             CMD_AUTO}, /*  11, CMD_PURCHASE_LAND_AREA */
+	{CmdSellLandArea,                        0}, /*  12, CMD_SELL_LAND_AREA */
+	{CmdBuildTunnel,                  CMD_AUTO}, /*  13, CMD_BUILD_TUNNEL */
+	{CmdRemoveFromRailroadStation,           0}, /*  14, CMD_REMOVE_FROM_RAILROAD_STATION */
+	{CmdConvertRail,                         0}, /*  15, CMD_CONVERT_RAILD */
+	{CmdBuildTrainWaypoint,                  0}, /*  16, CMD_BUILD_TRAIN_WAYPOINT */
+	{CmdRenameWaypoint,                      0}, /*  17, CMD_RENAME_WAYPOINT */
+	{CmdRemoveTrainWaypoint,                 0}, /*  18, CMD_REMOVE_TRAIN_WAYPOINT */
+	{NULL,                                   0}, /*  19, unused */
+	{NULL,                                   0}, /*  20, unused */
+	{CmdBuildRoadStop,                CMD_AUTO}, /*  21, CMD_BUILD_ROAD_STOP */
+	{CmdRemoveRoadStop,                      0}, /*  22, CMD_REMOVE_ROAD_STOP */
+	{CmdBuildLongRoad,                CMD_AUTO}, /*  23, CMD_BUILD_LONG_ROAD */
+	{CmdRemoveLongRoad,               CMD_AUTO}, /*  24, CMD_REMOVE_LONG_ROAD */
+	{CmdBuildRoad,                           0}, /*  25, CMD_BUILD_ROAD */
+	{CmdRemoveRoad,                          0}, /*  26, CMD_REMOVE_ROAD */
+	{CmdBuildRoadDepot,               CMD_AUTO}, /*  27, CMD_BUILD_ROAD_DEPOT */
+	{NULL,                                   0}, /*  28, unused */
+	{CmdBuildAirport,                 CMD_AUTO}, /*  29, CMD_BUILD_AIRPORT */
+	{CmdBuildDock,                    CMD_AUTO}, /*  30, CMD_BUILD_DOCK */
+	{CmdBuildShipDepot,               CMD_AUTO}, /*  31, CMD_BUILD_SHIP_DEPOT */
+	{CmdBuildBuoy,                    CMD_AUTO}, /*  32, CMD_BUILD_BUOY */
+	{CmdPlantTree,                    CMD_AUTO}, /*  33, CMD_PLANT_TREE */
+	{CmdBuildRailVehicle,                    0}, /*  34, CMD_BUILD_RAIL_VEHICLE */
+	{CmdMoveRailVehicle,                     0}, /*  35, CMD_MOVE_RAIL_VEHICLE */
+	{CmdStartStopTrain,                      0}, /*  36, CMD_START_STOP_TRAIN */
+	{NULL,                                   0}, /*  37, unused */
+	{CmdSellRailWagon,                       0}, /*  38, CMD_SELL_RAIL_WAGON */
+	{CmdSendTrainToDepot,                    0}, /*  39, CMD_SEND_TRAIN_TO_DEPOT */
+	{CmdForceTrainProceed,                   0}, /*  40, CMD_FORCE_TRAIN_PROCEED */
+	{CmdReverseTrainDirection,               0}, /*  41, CMD_REVERSE_TRAIN_DIRECTION */
 
-	{NULL,                                   0}, /*  92 */
-	{NULL,                                   0}, /*  93 */
-	{NULL,                                   0}, /*  94 */
-	{NULL,                                   0}, /*  95 */
-	{NULL,                                   0}, /*  96 */
-	{NULL,                                   0}, /*  97 */
-
-	{CmdOrderRefit,                          0}, /*  98 */
-	{CmdCloneOrder,                          0}, /*  99 */
-
-	{CmdClearArea,                           0}, /* 100 */
-	{NULL,                                   0}, /* 101 */
-
-	{CmdMoneyCheat,                CMD_OFFLINE}, /* 102 */
-	{CmdBuildCanal,                          0}, /* 103 */
-	{CmdPlayerCtrl,                          0}, /* 104 */
-
-	{CmdLevelLand,                           0}, /* 105 */
+	{CmdModifyOrder,                         0}, /*  42, CMD_MODIFY_ORDER */
+	{CmdSkipToOrder,                         0}, /*  43, CMD_SKIP_TO_ORDER */
+	{CmdDeleteOrder,                         0}, /*  44, CMD_DELETE_ORDER */
+	{CmdInsertOrder,                         0}, /*  45, CMD_INSERT_ORDER */
 
-	{CmdRefitRailVehicle,                    0}, /* 106 */
-	{CmdRestoreOrderIndex,                   0}, /* 107 */
-	{CmdBuildLock,                           0}, /* 108 */
-	{NULL,                                   0}, /* 109 */
-	{CmdBuildSignalTrack,                    0}, /* 110 */
-	{CmdRemoveSignalTrack,                   0}, /* 111 */
-	{NULL,                                   0}, /* 112 */
-	{CmdGiveMoney,                           0}, /* 113 */
-	{CmdChangePatchSetting,         CMD_SERVER}, /* 114 */
-	{CmdSetAutoReplace,                      0}, /* 115 */
-	{CmdCloneVehicle,                        0}, /* 116 */
-	{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 */
-	{CmdMoveOrder,                           0}, /* 127 */
-	{CmdChangeTimetable,                     0}, /* 128 */
-	{CmdSetVehicleOnTime,                    0}, /* 129 */
-	{CmdAutofillTimetable,                   0}, /* 130 */
+	{CmdChangeServiceInt,                    0}, /*  46, CMD_CHANGE_SERVICE_INT */
+
+	{CmdBuildIndustry,                       0}, /*  47, CMD_BUILD_INDUSTRY */
+	{CmdBuildCompanyHQ,               CMD_AUTO}, /*  48, CMD_BUILD_COMPANY_HQ */
+	{CmdSetPlayerFace,                       0}, /*  49, CMD_SET_PLAYER_FACE */
+	{CmdSetPlayerColor,                      0}, /*  50, CMD_SET_PLAYER_COLOR */
+
+	{CmdIncreaseLoan,                        0}, /*  51, CMD_INCREASE_LOAN */
+	{CmdDecreaseLoan,                        0}, /*  52, CMD_DECREASE_LOAN */
+
+	{CmdWantEnginePreview,                   0}, /*  53, CMD_WANT_ENGINE_PREVIEW */
+
+	{CmdNameVehicle,                         0}, /*  54, CMD_NAME_VEHICLE */
+	{CmdRenameEngine,                        0}, /*  55, CMD_RENAME_ENGINE */
+
+	{CmdChangeCompanyName,                   0}, /*  56, CMD_CHANGE_COMPANY_NAME */
+	{CmdChangePresidentName,                 0}, /*  57, CMD_CHANGE_PRESIDENT_NAME */
+
+	{CmdRenameStation,                       0}, /*  58, CMD_RENAME_STATION */
+
+	{CmdSellAircraft,                        0}, /*  59, CMD_SELL_AIRCRAFT */
+	{CmdStartStopAircraft,                   0}, /*  60, CMD_START_STOP_AIRCRAFT */
+
+	{CmdBuildAircraft,                       0}, /*  61, CMD_BUILD_AIRCRAFT */
+	{CmdSendAircraftToHangar,                0}, /*  62, CMD_SEND_AIRCRAFT_TO_HANGAR */
+	{NULL,                                   0}, /*  63, unused */
+	{CmdRefitAircraft,                       0}, /*  64, CMD_REFIT_AIRCRAFT */
+
+	{CmdPlaceSign,                           0}, /*  65, CMD_PLACE_SIGN */
+	{CmdRenameSign,                          0}, /*  66, CMD_RENAME_SIGN */
+
+	{CmdBuildRoadVeh,                        0}, /*  67, CMD_BUILD_ROAD_VEH */
+	{CmdStartStopRoadVeh,                    0}, /*  68, CMD_START_STOP_ROADVEH */
+	{CmdSellRoadVeh,                         0}, /*  69, CMD_SELL_ROAD_VEH */
+	{CmdSendRoadVehToDepot,                  0}, /*  70, CMD_SEND_ROADVEH_TO_DEPOT */
+	{CmdTurnRoadVeh,                         0}, /*  71, CMD_TURN_ROADVEH */
+	{CmdRefitRoadVeh,                        0}, /*  72, CMD_REFIT_ROAD_VEH */
+
+	{CmdPause,                      CMD_SERVER}, /*  73, CMD_PAUSE */
+
+	{CmdBuyShareInCompany,                   0}, /*  74, CMD_BUY_SHARE_IN_COMPANY */
+	{CmdSellShareInCompany,                  0}, /*  75, CMD_SELL_SHARE_IN_COMPANY */
+	{CmdBuyCompany,                          0}, /*  76, CMD_BUY_COMANY */
+
+	{CmdBuildTown,                 CMD_OFFLINE}, /*  77, CMD_BUILD_TOWN */
+	{NULL,                                   0}, /*  78, unused */
+	{NULL,                                   0}, /*  79, unused */
+	{CmdRenameTown,                 CMD_SERVER}, /*  80, CMD_RENAME_TOWN */
+	{CmdDoTownAction,                        0}, /*  81, CMD_DO_TOWN_ACTION */
+
+	{CmdSetRoadDriveSide,           CMD_SERVER}, /*  82, CMD_SET_ROAD_DRIVE_SIDE */
+	{NULL,                                   0}, /*  83, unused */
+	{NULL,                                   0}, /*  84, unused */
+	{CmdChangeDifficultyLevel,      CMD_SERVER}, /*  85, CMD_CHANGE_DIFFICULTY_LEVEL */
+
+	{CmdStartStopShip,                       0}, /*  86, CMD_START_STOP_SHIP */
+	{CmdSellShip,                            0}, /*  87, CMD_SELL_SHIP */
+	{CmdBuildShip,                           0}, /*  88, CMD_BUILD_SHIP */
+	{CmdSendShipToDepot,                     0}, /*  89, CMD_SEND_SHIP_TO_DEPOT */
+	{NULL,                                   0}, /*  90, unused */
+	{CmdRefitShip,                           0}, /*  91, CMD_REFIT_SHIP */
+
+	{NULL,                                   0}, /*  92, unused */
+	{NULL,                                   0}, /*  93, unused */
+	{NULL,                                   0}, /*  94, unused */
+	{NULL,                                   0}, /*  95, unused */
+	{NULL,                                   0}, /*  96, unused */
+	{NULL,                                   0}, /*  97, unused */
+
+	{CmdOrderRefit,                          0}, /*  98, CMD_ORDER_REFIT */
+	{CmdCloneOrder,                          0}, /*  99, CMD_CLONE_ORDER */
+
+	{CmdClearArea,                           0}, /* 100, CMD_CLEAR_AREA */
+	{NULL,                                   0}, /* 101, unused */
+
+	{CmdMoneyCheat,                CMD_OFFLINE}, /* 102, CMD_MONEY_CHEAT */
+	{CmdBuildCanal,                   CMD_AUTO}, /* 103, CMD_BUILD_CANAL */
+	{CmdPlayerCtrl,                          0}, /* 104, CMD_PLAYER_CTRL */
+
+	{CmdLevelLand,                    CMD_AUTO}, /* 105, CMD_LEVEL_LAND */
+
+	{CmdRefitRailVehicle,                    0}, /* 106, CMD_REFIT_RAIL_VEHICLE */
+	{CmdRestoreOrderIndex,                   0}, /* 107, CMD_RESTORE_ORDER_INDEX */
+	{CmdBuildLock,                    CMD_AUTO}, /* 108, CMD_BUILD_LOCK */
+	{NULL,                                   0}, /* 109, unused */
+	{CmdBuildSignalTrack,             CMD_AUTO}, /* 110, CMD_BUILD_SIGNAL_TRACK */
+	{CmdRemoveSignalTrack,            CMD_AUTO}, /* 111, CMD_REMOVE_SIGNAL_TRACK */
+	{NULL,                                   0}, /* 112, unused */
+	{CmdGiveMoney,                           0}, /* 113, CMD_GIVE_MONEY */
+	{CmdChangePatchSetting,         CMD_SERVER}, /* 114, CMD_CHANGE_PATCH_SETTING */
+	{CmdSetAutoReplace,                      0}, /* 115, CMD_SET_AUTOREPLACE */
+	{CmdCloneVehicle,                        0}, /* 116, CMD_CLONE_VEHICLE */
+	{CmdMassStartStopVehicle,                0}, /* 117, CMD_MASS_START_STOP */
+	{CmdDepotSellAllVehicles,                0}, /* 118, CMD_DEPOT_SELL_ALL_VEHICLES */
+	{CmdDepotMassAutoReplace,                0}, /* 119, CMD_DEPOT_MASS_AUTOREPLACE */
+	{CmdCreateGroup,                         0}, /* 120, CMD_CREATE_GROUP */
+	{CmdDeleteGroup,                         0}, /* 121, CMD_DELETE_GROUP */
+	{CmdRenameGroup,                         0}, /* 122, CMD_RENAME_GROUP */
+	{CmdAddVehicleGroup,                     0}, /* 123, CMD_ADD_VEHICLE_GROUP */
+	{CmdAddSharedVehicleGroup,               0}, /* 124, CMD_ADD_SHARE_VEHICLE_GROUP */
+	{CmdRemoveAllVehiclesGroup,              0}, /* 125, CMD_REMOVE_ALL_VEHICLES_GROUP */
+	{CmdSetGroupReplaceProtection,           0}, /* 126, CMD_SET_GROUP_REPLACE_PROTECTION */
+	{CmdMoveOrder,                           0}, /* 127, CMD_MOVE_ORDER */
+	{CmdChangeTimetable,                     0}, /* 128, CMD_CHANGE_TIMETABLE */
+	{CmdSetVehicleOnTime,                    0}, /* 129, CMD_SET_VEHICLE_ON_TIME */
+	{CmdAutofillTimetable,                   0}, /* 130, CMD_AUTOFILL_TIMETABLE */
 };
 
-/* This function range-checks a cmd, and checks if the cmd is not NULL */
+/*!
+ * This function range-checks a cmd, and checks if the cmd is not NULL
+ *
+ * @param cmd The integervalue of a command
+ * @return true if the command is valid (and got a CommandProc function)
+ */
 bool IsValidCommand(uint cmd)
 {
 	cmd &= 0xFF;
@@ -350,14 +372,34 @@
 		_command_proc_table[cmd].proc != NULL;
 }
 
+/*!
+ * This function mask the parameter with 0xFF and returns
+ * the flags which belongs to the given command.
+ *
+ * @param cmd The integer value of the command
+ * @return The flags for this command
+ * @bug integervalues which are less equals 0xFF and greater than the
+ *      size of _command_proc_table can result in an index out of bounce
+ *      error (which doesn't happend anyway). Check function #IsValidCommand(). (Progman)
+ */
 byte GetCommandFlags(uint cmd)
 {
 	return _command_proc_table[cmd & 0xFF].flags;
 }
 
-
 static int _docommand_recursive;
 
+/*!
+ * This function executes a given command with the parameters from the #CommandProc parameter list.
+ * Depending on the flags parameter it execute or test a command.
+ *
+ * @param tile The tile to apply the command on (for the #CommandProc)
+ * @param p1 Additional data for the command (for the #CommandProc)
+ * @param p2 Additional data for the command (for the #CommandProc)
+ * @param flags Flags for the command and how to execute the command
+ * @param procc The command-id to execute (a value of the CMD_* enums)
+ * @see CommandProc
+ */
 CommandCost DoCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint procc)
 {
 	CommandCost res;
@@ -421,6 +463,13 @@
 	return res;
 }
 
+/*!
+ * This functions returns the money which can be used to execute a command.
+ * This is either the money of the current player or INT64_MAX if there
+ * is no such a player "at the moment" like the server itself.
+ *
+ * @return The available money of a player or INT64_MAX
+ */
 Money GetAvailableMoneyForCommand()
 {
 	PlayerID pid = _current_player;
@@ -428,8 +477,20 @@
 	return GetPlayer(pid)->player_money;
 }
 
-/* toplevel network safe docommand function for the current player. must not be called recursively.
- * the callback is called when the command succeeded or failed. */
+/*!
+ * Toplevel network safe docommand function for the current player. Must not be called recursively.
+ * The callback is called when the command succeeded or failed. The parameters
+ * tile, p1 and p2 are from the #CommandProc function. The paramater cmd is the command to execute.
+ * The parameter my_cmd is used to indicate if the command is from a player or the server.
+ *
+ * @param tile The tile to perform a command on (see #CommandProc)
+ * @param p1 Additional data for the command (see #CommandProc)
+ * @param p2 Additional data for the command (see #CommandProc)
+ * @param callback A callback function to call after the command is finished
+ * @param cmd The command to execute (a CMD_* value)
+ * @param my_cmd indicator if the command is from a player or server (to display error messages for a user)
+ * @return true if the command succeeded, else false
+ */
 bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback, uint32 cmd, bool my_cmd)
 {
 	CommandCost res, res2;
@@ -462,7 +523,6 @@
 	}
 
 	flags = 0;
-	if (cmd & CMD_AUTO) flags |= DC_AUTO;
 	if (cmd & CMD_NO_WATER) flags |= DC_NO_WATER;
 
 	/* get pointer to command handler */
@@ -473,6 +533,8 @@
 		return false;
 	}
 
+	if (GetCommandFlags(cmd) & CMD_AUTO) flags |= DC_AUTO;
+
 	/* Some commands have a different output in dryrun than the realrun
 	 *  e.g.: if you demolish a whole town, the dryrun would say okay.
 	 *  but by really destroying, your rating drops and at a certain point
@@ -512,6 +574,7 @@
 
 		_docommand_recursive = 0;
 		_cmd_text = NULL;
+		ClearStorageChanges(false);
 		return false;
 	}
 
@@ -542,6 +605,7 @@
 		if (_network_dedicated || (_network_server && pbck == PLAYER_SPECTATOR)) _local_player = pbck;
 		_docommand_recursive = 0;
 		_cmd_text = NULL;
+		ClearStorageChanges(false);
 		return true;
 	}
 #endif /* ENABLE_NETWORK */
@@ -582,6 +646,7 @@
 
 	if (callback) callback(true, tile, p1, p2);
 	_cmd_text = NULL;
+	ClearStorageChanges(true);
 	return true;
 
 show_error:
@@ -595,6 +660,7 @@
 
 	if (callback) callback(false, tile, p1, p2);
 	_cmd_text = NULL;
+	ClearStorageChanges(false);
 	return false;
 }
 
--- a/src/command.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/command.h	Sat Oct 06 21:16:00 2007 +0000
@@ -5,161 +5,176 @@
 #ifndef COMMAND_H
 #define COMMAND_H
 
+/**
+ * List of commands.
+ *
+ * This enum defines all possible commands which can be executed to the game
+ * engine. Observing the game like the query-tool or checking the profit of a
+ * vehicle don't result in a command which should be executed in the engine
+ * nor send to the server in a network game.
+ *
+ * @see _command_proc_table
+ */
 enum {
-	CMD_BUILD_RAILROAD_TRACK         =   0,
-	CMD_REMOVE_RAILROAD_TRACK        =   1,
-	CMD_BUILD_SINGLE_RAIL            =   2,
-	CMD_REMOVE_SINGLE_RAIL           =   3,
-	CMD_LANDSCAPE_CLEAR              =   4,
-	CMD_BUILD_BRIDGE                 =   5,
-	CMD_BUILD_RAILROAD_STATION       =   6,
-	CMD_BUILD_TRAIN_DEPOT            =   7,
-	CMD_BUILD_SIGNALS                =   8,
-	CMD_REMOVE_SIGNALS               =   9,
-	CMD_TERRAFORM_LAND               =  10,
-	CMD_PURCHASE_LAND_AREA           =  11,
-	CMD_SELL_LAND_AREA               =  12,
-	CMD_BUILD_TUNNEL                 =  13,
-
-	CMD_REMOVE_FROM_RAILROAD_STATION =  14,
-	CMD_CONVERT_RAIL                 =  15,
-
-	CMD_BUILD_TRAIN_WAYPOINT         =  16,
-	CMD_RENAME_WAYPOINT              =  17,
-	CMD_REMOVE_TRAIN_WAYPOINT        =  18,
-
-	CMD_BUILD_ROAD_STOP              =  21,
-	CMD_REMOVE_ROAD_STOP             =  22,
-	CMD_BUILD_LONG_ROAD              =  23,
-	CMD_REMOVE_LONG_ROAD             =  24,
-	CMD_BUILD_ROAD                   =  25,
-	CMD_REMOVE_ROAD                  =  26,
-	CMD_BUILD_ROAD_DEPOT             =  27,
-
-	CMD_BUILD_AIRPORT                =  29,
-
-	CMD_BUILD_DOCK                   =  30,
-
-	CMD_BUILD_SHIP_DEPOT             =  31,
-	CMD_BUILD_BUOY                   =  32,
-
-	CMD_PLANT_TREE                   =  33,
-
-	CMD_BUILD_RAIL_VEHICLE           =  34,
-	CMD_MOVE_RAIL_VEHICLE            =  35,
-
-	CMD_START_STOP_TRAIN             =  36,
-
-	CMD_SELL_RAIL_WAGON              =  38,
-
-	CMD_SEND_TRAIN_TO_DEPOT          =  39,
-	CMD_FORCE_TRAIN_PROCEED          =  40,
-	CMD_REVERSE_TRAIN_DIRECTION      =  41,
-
-	CMD_MODIFY_ORDER                 =  42,
-	CMD_SKIP_TO_ORDER                =  43,
-	CMD_DELETE_ORDER                 =  44,
-	CMD_INSERT_ORDER                 =  45,
-
-	CMD_CHANGE_SERVICE_INT           =  46,
+	CMD_BUILD_RAILROAD_TRACK         =   0, ///< build a rail track
+	CMD_REMOVE_RAILROAD_TRACK        =   1, ///< remove a rail track
+	CMD_BUILD_SINGLE_RAIL            =   2, ///< build a single rail track
+	CMD_REMOVE_SINGLE_RAIL           =   3, ///< remove a single rail track
+	CMD_LANDSCAPE_CLEAR              =   4, ///< demolish a tile
+	CMD_BUILD_BRIDGE                 =   5, ///< build a bridge
+	CMD_BUILD_RAILROAD_STATION       =   6, ///< build a railroad station
+	CMD_BUILD_TRAIN_DEPOT            =   7, ///< build a train depot
+	CMD_BUILD_SIGNALS                =   8, ///< build a signal
+	CMD_REMOVE_SIGNALS               =   9, ///< remove a signal
+	CMD_TERRAFORM_LAND               =  10, ///< terraform a tile
+	CMD_PURCHASE_LAND_AREA           =  11, ///< purchase a tile
+	CMD_SELL_LAND_AREA               =  12, ///< sell a bought tile before
+	CMD_BUILD_TUNNEL                 =  13, ///< build a tunnel
 
-	CMD_BUILD_INDUSTRY               =  47,
-
-	CMD_BUILD_COMPANY_HQ             =  48,
-	CMD_SET_PLAYER_FACE              =  49,
-	CMD_SET_PLAYER_COLOR             =  50,
-
-	CMD_INCREASE_LOAN                =  51,
-	CMD_DECREASE_LOAN                =  52,
-
-	CMD_WANT_ENGINE_PREVIEW          =  53,
-
-	CMD_NAME_VEHICLE                 =  54,
-	CMD_RENAME_ENGINE                =  55,
-	CMD_CHANGE_COMPANY_NAME          =  56,
-	CMD_CHANGE_PRESIDENT_NAME        =  57,
-	CMD_RENAME_STATION               =  58,
-
-	CMD_SELL_AIRCRAFT                =  59,
-	CMD_START_STOP_AIRCRAFT          =  60,
-	CMD_BUILD_AIRCRAFT               =  61,
-	CMD_SEND_AIRCRAFT_TO_HANGAR      =  62,
-	CMD_REFIT_AIRCRAFT               =  64,
-
-	CMD_PLACE_SIGN                   =  65,
-	CMD_RENAME_SIGN                  =  66,
+	CMD_REMOVE_FROM_RAILROAD_STATION =  14, ///< remove a tile station
+	CMD_CONVERT_RAIL                 =  15, ///< convert a rail type
 
-	CMD_BUILD_ROAD_VEH               =  67,
-	CMD_START_STOP_ROADVEH           =  68,
-	CMD_SELL_ROAD_VEH                =  69,
-	CMD_SEND_ROADVEH_TO_DEPOT        =  70,
-	CMD_TURN_ROADVEH                 =  71,
-	CMD_REFIT_ROAD_VEH               =  72,
-
-	CMD_PAUSE                        =  73,
-
-	CMD_BUY_SHARE_IN_COMPANY         =  74,
-	CMD_SELL_SHARE_IN_COMPANY        =  75,
-	CMD_BUY_COMPANY                  =  76,
-
-	CMD_BUILD_TOWN                   =  77,
+	CMD_BUILD_TRAIN_WAYPOINT         =  16, ///< build a waypoint
+	CMD_RENAME_WAYPOINT              =  17, ///< rename a waypoint
+	CMD_REMOVE_TRAIN_WAYPOINT        =  18, ///< remove a waypoint
 
-	CMD_RENAME_TOWN                  =  80,
-	CMD_DO_TOWN_ACTION               =  81,
-
-	CMD_SET_ROAD_DRIVE_SIDE          =  82,
-
-	CMD_CHANGE_DIFFICULTY_LEVEL      =  85,
+	CMD_BUILD_ROAD_STOP              =  21, ///< build a road stop
+	CMD_REMOVE_ROAD_STOP             =  22, ///< remove a road stop
+	CMD_BUILD_LONG_ROAD              =  23, ///< build a complete road (not a "half" one)
+	CMD_REMOVE_LONG_ROAD             =  24, ///< remove a complete road (not a "half" one)
+	CMD_BUILD_ROAD                   =  25, ///< build a "half" road
+	CMD_REMOVE_ROAD                  =  26, ///< remove a "half" road
+	CMD_BUILD_ROAD_DEPOT             =  27, ///< build a road depot
 
-	CMD_START_STOP_SHIP              =  86,
-	CMD_SELL_SHIP                    =  87,
-	CMD_BUILD_SHIP                   =  88,
-	CMD_SEND_SHIP_TO_DEPOT           =  89,
-	CMD_REFIT_SHIP                   =  91,
+	CMD_BUILD_AIRPORT                =  29, ///< build an airport
 
-	CMD_ORDER_REFIT                  =  98,
-	CMD_CLONE_ORDER                  =  99,
-	CMD_CLEAR_AREA                   = 100,
+	CMD_BUILD_DOCK                   =  30, ///< build a dock
 
-	CMD_MONEY_CHEAT                  = 102,
-	CMD_BUILD_CANAL                  = 103,
+	CMD_BUILD_SHIP_DEPOT             =  31, ///< build a ship depot
+	CMD_BUILD_BUOY                   =  32, ///< build a buoy
+
+	CMD_PLANT_TREE                   =  33, ///< plant a tree
+
+	CMD_BUILD_RAIL_VEHICLE           =  34, ///< build a rail vehicle
+	CMD_MOVE_RAIL_VEHICLE            =  35, ///< move a rail vehicle (in the depot)
+
+	CMD_START_STOP_TRAIN             =  36, ///< start or stop a train
+
+	CMD_SELL_RAIL_WAGON              =  38, ///< sell a rail wagon
+
+	CMD_SEND_TRAIN_TO_DEPOT          =  39, ///< send a train to a depot
+	CMD_FORCE_TRAIN_PROCEED          =  40, ///< proceed a train to pass a red signal
+	CMD_REVERSE_TRAIN_DIRECTION      =  41, ///< turn a train around
+
+	CMD_MODIFY_ORDER                 =  42, ///< modify an order (like set full-load)
+	CMD_SKIP_TO_ORDER                =  43, ///< skip an order to the next of specific one
+	CMD_DELETE_ORDER                 =  44, ///< delete an order
+	CMD_INSERT_ORDER                 =  45, ///< insert a new order
+
+	CMD_CHANGE_SERVICE_INT           =  46, ///< change the server interval of a vehicle
+
+	CMD_BUILD_INDUSTRY               =  47, ///< build a new industry
+
+	CMD_BUILD_COMPANY_HQ             =  48, ///< build the company headquarter
+	CMD_SET_PLAYER_FACE              =  49, ///< set the face of the player/company
+	CMD_SET_PLAYER_COLOR             =  50, ///< set the color of the player/company
+
+	CMD_INCREASE_LOAN                =  51, ///< increase the loan from the bank
+	CMD_DECREASE_LOAN                =  52, ///< decrease the loan from the bank
+
+	CMD_WANT_ENGINE_PREVIEW          =  53, ///< confirm the preview of an engine
+
+	CMD_NAME_VEHICLE                 =  54, ///< rename a whole vehicle
+	CMD_RENAME_ENGINE                =  55, ///< rename a engine (in the engine list)
+	CMD_CHANGE_COMPANY_NAME          =  56, ///< change the company name
+	CMD_CHANGE_PRESIDENT_NAME        =  57, ///< change the president name
+	CMD_RENAME_STATION               =  58, ///< rename a station
+
+	CMD_SELL_AIRCRAFT                =  59, ///< sell an aircraft
+	CMD_START_STOP_AIRCRAFT          =  60, ///< start/stop an aircraft
+	CMD_BUILD_AIRCRAFT               =  61, ///< build an aircraft
+	CMD_SEND_AIRCRAFT_TO_HANGAR      =  62, ///< send an aircraft to a hanger
+	CMD_REFIT_AIRCRAFT               =  64, ///< refit the cargo space of an aircraft
+
+	CMD_PLACE_SIGN                   =  65, ///< place a sign
+	CMD_RENAME_SIGN                  =  66, ///< rename a sign
+
+	CMD_BUILD_ROAD_VEH               =  67, ///< build a road vehicle
+	CMD_START_STOP_ROADVEH           =  68, ///< start/stop a road vehicle
+	CMD_SELL_ROAD_VEH                =  69, ///< sell a road vehicle
+	CMD_SEND_ROADVEH_TO_DEPOT        =  70, ///< send a road vehicle to the depot
+	CMD_TURN_ROADVEH                 =  71, ///< turn a road vehicle around
+	CMD_REFIT_ROAD_VEH               =  72, ///< refit the cargo space of a road vehicle
+
+	CMD_PAUSE                        =  73, ///< pause the game
+
+	CMD_BUY_SHARE_IN_COMPANY         =  74, ///< buy a share from a company
+	CMD_SELL_SHARE_IN_COMPANY        =  75, ///< sell a share from a company
+	CMD_BUY_COMPANY                  =  76, ///< buy a company which is bankrupt
+
+	CMD_BUILD_TOWN                   =  77, ///< build a town
+
+	CMD_RENAME_TOWN                  =  80, ///< rename a town
+	CMD_DO_TOWN_ACTION               =  81, ///< do a action from the town detail window (like advertises or bribe)
+
+	CMD_SET_ROAD_DRIVE_SIDE          =  82, ///< set the side where the road vehicles drive
+
+	CMD_CHANGE_DIFFICULTY_LEVEL      =  85, ///< change the difficult of a game (each setting for it own)
+
+	CMD_START_STOP_SHIP              =  86, ///< start/stop a ship
+	CMD_SELL_SHIP                    =  87, ///< sell a ship
+	CMD_BUILD_SHIP                   =  88, ///< build a new ship
+	CMD_SEND_SHIP_TO_DEPOT           =  89, ///< send a ship to a depot
+	CMD_REFIT_SHIP                   =  91, ///< refit the cargo space of a ship
+
+	CMD_ORDER_REFIT                  =  98, ///< change the refit informaction of an order (for "goto depot" )
+	CMD_CLONE_ORDER                  =  99, ///< clone (and share) an order
+	CMD_CLEAR_AREA                   = 100, ///< clear an area
+
+	CMD_MONEY_CHEAT                  = 102, ///< do the money cheat
+	CMD_BUILD_CANAL                  = 103, ///< build a canal
 
 	CMD_PLAYER_CTRL                  = 104, ///< used in multiplayer to create a new player etc.
 	CMD_LEVEL_LAND                   = 105, ///< level land
 
-	CMD_REFIT_RAIL_VEHICLE           = 106,
-	CMD_RESTORE_ORDER_INDEX          = 107,
-	CMD_BUILD_LOCK                   = 108,
-
-	CMD_BUILD_SIGNAL_TRACK           = 110,
-	CMD_REMOVE_SIGNAL_TRACK          = 111,
-
-	CMD_GIVE_MONEY                   = 113,
-	CMD_CHANGE_PATCH_SETTING         = 114,
-
-	CMD_SET_AUTOREPLACE              = 115,
+	CMD_REFIT_RAIL_VEHICLE           = 106, ///< refit the cargo space of a train
+	CMD_RESTORE_ORDER_INDEX          = 107, ///< restore vehicle order-index and service interval
+	CMD_BUILD_LOCK                   = 108, ///< build a lock
 
-	CMD_CLONE_VEHICLE                = 116,
-	CMD_MASS_START_STOP              = 117,
-	CMD_DEPOT_SELL_ALL_VEHICLES      = 118,
-	CMD_DEPOT_MASS_AUTOREPLACE       = 119,
+	CMD_BUILD_SIGNAL_TRACK           = 110, ///< add signals along a track (by dragging)
+	CMD_REMOVE_SIGNAL_TRACK          = 111, ///< remove signals along a track (by dragging)
 
-	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,
+	CMD_GIVE_MONEY                   = 113, ///< give money to an other player
+	CMD_CHANGE_PATCH_SETTING         = 114, ///< change a patch setting
 
-	CMD_MOVE_ORDER                   = 127,
-	CMD_CHANGE_TIMETABLE             = 128,
-	CMD_SET_VEHICLE_ON_TIME          = 129,
-	CMD_AUTOFILL_TIMETABLE           = 130,
+	CMD_SET_AUTOREPLACE              = 115, ///< set an autoreplace entry
+
+	CMD_CLONE_VEHICLE                = 116, ///< clone a vehicle
+	CMD_MASS_START_STOP              = 117, ///< start/stop all vehicles (in a depot)
+	CMD_DEPOT_SELL_ALL_VEHICLES      = 118, ///< sell all vehicles which are in a given depot
+	CMD_DEPOT_MASS_AUTOREPLACE       = 119, ///< force the autoreplace to take action in a given depot
+
+	CMD_CREATE_GROUP                 = 120, ///< create a new group
+	CMD_DELETE_GROUP                 = 121, ///< delete a group
+	CMD_RENAME_GROUP                 = 122, ///< rename a group
+	CMD_ADD_VEHICLE_GROUP            = 123, ///< add a vehicle to a group
+	CMD_ADD_SHARED_VEHICLE_GROUP     = 124, ///< add all other shared vehicles to a group which are missing
+	CMD_REMOVE_ALL_VEHICLES_GROUP    = 125, ///< remove all vehicles from a group
+	CMD_SET_GROUP_REPLACE_PROTECTION = 126, ///< set the autoreplace-protection for a group
+
+	CMD_MOVE_ORDER                   = 127, ///< move an order
+	CMD_CHANGE_TIMETABLE             = 128, ///< change the timetable for a vehicle
+	CMD_SET_VEHICLE_ON_TIME          = 129, ///< set the vehicle on time feature (timetable)
+	CMD_AUTOFILL_TIMETABLE           = 130, ///< autofill the timetable
 };
 
+/**
+ * List of flags for a command.
+ *
+ * This enums defines some flags which can be used for the commands.
+ */
 enum {
-	DC_EXEC            = 0x01,
+	DC_EXEC            = 0x01, ///< execute the given command
 	DC_AUTO            = 0x02, ///< don't allow building on structures
 	DC_QUERY_COST      = 0x04, ///< query cost only,  don't build.
 	DC_NO_WATER        = 0x08, ///< don't allow building on water
@@ -169,50 +184,167 @@
 	DC_FORCETEST       = 0x80, ///< force test too.
 };
 
+/**
+ * Used to combine a StringID with the command.
+ *
+ * This macro can be used to add a StringID (the error message to show) on a command-id
+ * (CMD_xxx). Use the binary or-operator "|" to combine the command with the result from
+ * this macro.
+ *
+ * @param x The StringID to combine with a command-id
+ */
 #define CMD_MSG(x) ((x) << 16)
 
+/**
+ * Defines some flags.
+ *
+ * This enumeration defines some flags which are binary-or'ed on a command.
+ */
 enum {
-	CMD_AUTO                  = 0x0200,
-	CMD_NO_WATER              = 0x0400,
+	CMD_NO_WATER              = 0x0400, ///< dont build on water
 	CMD_NETWORK_COMMAND       = 0x0800, ///< execute the command without sending it on the network
 	CMD_NO_TEST_IF_IN_NETWORK = 0x1000, ///< When enabled, the command will bypass the no-DC_EXEC round if in network
-	CMD_SHOW_NO_ERROR         = 0x2000,
+	CMD_SHOW_NO_ERROR         = 0x2000, ///< do not show the error message
 };
 
-/** Command flags for the command table _command_proc_table */
+/**
+ * Command flags for the command table _command_proc_table.
+ *
+ * This enumeration defines flags for the _command_proc_table.
+ */
 enum {
 	CMD_SERVER  = 0x1, ///< the command can only be initiated by the server
 	CMD_OFFLINE = 0x2, ///< the command cannot be executed in a multiplayer game; single-player only
+	CMD_AUTO    = 0x4, ///< set the DC_AUTO flag on this command
 };
 
+/**
+ * Defines the callback type for all command handler functions.
+ *
+ * This type defines the function header for all functions which handles a CMD_* command.
+ * A command handler use the parameters to act according to the meaning of the command.
+ * The tile parameter defines the tile to perform an action on.
+ * The flag parameter is filled with flags from the DC_* enumeration. The parameters
+ * p1 and p2 are filled with parameters for the command like "which road type", "which
+ * order" or "direction". Each function should mentioned in there doxygen comments
+ * the usage of these parameters.
+ *
+ * @param tile The tile to apply a command on
+ * @param flags Flags for the command, from the DC_* enumeration
+ * @param p1 Additional data for the command
+ * @param p2 Additional data for the command
+ * @return The CommandCost of the command, which can be succeeded or failed.
+ */
 typedef CommandCost CommandProc(TileIndex tile, uint32 flags, uint32 p1, uint32 p2);
 
+/**
+ * Define a command with the flags which belongs to it.
+ *
+ * This struct connect a command handler function with the flags created with
+ * the #CMD_AUTO, #CMD_OFFLINE and #CMD_SERVER values.
+ */
 struct Command {
 	CommandProc *proc;
 	byte flags;
 };
 
+/**
+ * Checks if a command failes.
+ *
+ * As you see the parameter is not a command but the return value of a command,
+ * the CommandCost class. This function checks if the command executed by
+ * the CommandProc function failed and returns true if it does.
+ *
+ * @param cost The return value of a CommandProc call
+ * @return true if the command failes
+ * @see CmdSucceded
+ */
 static inline bool CmdFailed(CommandCost cost) { return cost.Failed(); }
+
+/**
+ * Checks if a command succeeded.
+ *
+ * As #CmdFailed this function checks if a command succeeded
+ *
+ * @param cost The return value of a CommandProc call
+ * @return true if the command succeeded
+ * @see CmdSucceeded
+ */
 static inline bool CmdSucceeded(CommandCost cost) { return cost.Succeeded(); }
 
+/**
+ * Define a default return value for a failed command.
+ *
+ * This variable contains a CommandCost object with is declared as "failed".
+ * Other functions just need to return this error if there is an error,
+ * which doesn't need to specific by a StringID.
+ */
 static const CommandCost CMD_ERROR = CommandCost(INVALID_STRING_ID);
 
-#define return_cmd_error(errcode) do { return CommandCost(errcode); } while (0)
+/**
+ * Returns from a function with a specific StringID as error.
+ *
+ * This macro is used to return from a function. The parameter contains the
+ * StringID which will be returned.
+ *
+ * @param errcode The StringID to return
+ */
+#define return_cmd_error(errcode) return CommandCost(errcode);
 
 /* command.cpp */
+/**
+ * Define a callback function for the client, after the command is finished.
+ *
+ * Functions of this type are called after the command is finished. The parameters
+ * are from the #CommandProc callback type. The boolean parameter indicates if the
+ * command succeeded or failed.
+ *
+ * @param success If the command succeeded or not.
+ * @param tile The tile of the command action
+ * @param p1 Additional data of the command
+ * @param p1 Additional data of the command
+ * @see CommandProc
+ */
 typedef void CommandCallback(bool success, TileIndex tile, uint32 p1, uint32 p2);
+
+/**
+ * Execute a command
+ */
 CommandCost DoCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint procc);
+
+/**
+ * Execute a network safe DoCommand function
+ */
 bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback, uint32 cmd, bool my_cmd = true);
 
 #ifdef ENABLE_NETWORK
 
+/**
+ * Send a command over the network
+ */
 void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback);
 #endif /* ENABLE_NETWORK */
 
-extern const char* _cmd_text; ///< Text, which gets sent with a command
+/**
+ * Text, which gets sent with a command
+ *
+ * This variable contains a string (be specific a pointer of the first
+ * char of this string) which will be send with a command. This is
+ * used for user input data like names or chat messages.
+ */
+extern const char *_cmd_text;
 
+/**
+ * Checks if a integer value belongs to a command.
+ */
 bool IsValidCommand(uint cmd);
+/**
+ * Returns the flags from a given command.
+ */
 byte GetCommandFlags(uint cmd);
+/**
+ * Returns the current money available which can be used for a command.
+ */
 Money GetAvailableMoneyForCommand();
 
 #endif /* COMMAND_H */
--- a/src/depot_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/depot_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -474,7 +474,7 @@
 
 	if (v == NULL) return;
 
-	if (v->HasFront() && !v->IsPrimaryVehicle()) {
+	if (!v->IsPrimaryVehicle()) {
 		v = v->First();
 		/* Do nothing when clicking on a train in depot with no loc attached */
 		if (v->type == VEH_TRAIN && !IsFrontEngine(v)) return;
@@ -928,7 +928,7 @@
 
 						if (is_engine) {
 							_backup_orders_tile = v->tile;
-							BackupVehicleOrders(v, _backup_orders_data);
+							BackupVehicleOrders(v);
 						}
 
 						switch (v->type) {
--- a/src/direction.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/direction.h	Sat Oct 06 21:16:00 2007 +0000
@@ -165,6 +165,9 @@
 	DIAGDIRDIFF_90LEFT  = 3         ///< 90 degrees left
 };
 
+/** Allow incrementing of DiagDirDiff variables */
+DECLARE_POSTFIX_INCREMENT(DiagDirDiff);
+
 /**
  * Applies a difference on a DiagDirection
  *
--- a/src/dock_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/dock_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -38,17 +38,17 @@
 
 static void PlaceDocks_Dock(TileIndex tile)
 {
-	DoCommandP(tile, _ctrl_pressed, 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_MSG(STR_9802_CAN_T_BUILD_DOCK_HERE));
 }
 
 static void PlaceDocks_Depot(TileIndex tile)
 {
-	DoCommandP(tile, _ship_depot_direction, 0, CcBuildDocks, CMD_BUILD_SHIP_DEPOT | CMD_AUTO | CMD_MSG(STR_3802_CAN_T_BUILD_SHIP_DEPOT));
+	DoCommandP(tile, _ship_depot_direction, 0, CcBuildDocks, CMD_BUILD_SHIP_DEPOT | CMD_MSG(STR_3802_CAN_T_BUILD_SHIP_DEPOT));
 }
 
 static void PlaceDocks_Buoy(TileIndex tile)
 {
-	DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_BUOY | CMD_AUTO | CMD_MSG(STR_9835_CAN_T_POSITION_BUOY_HERE));
+	DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_BUOY | CMD_MSG(STR_9835_CAN_T_POSITION_BUOY_HERE));
 }
 
 static void PlaceDocks_DemolishArea(TileIndex tile)
@@ -63,7 +63,7 @@
 
 static void PlaceDocks_BuildLock(TileIndex tile)
 {
-	DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_LOCK | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_LOCKS));
+	DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_LOCK | CMD_MSG(STR_CANT_BUILD_LOCKS));
 }
 
 
@@ -162,7 +162,7 @@
 					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));
+					DoCommandP(e->we.place.tile, e->we.place.starttile, 0, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
 					break;
 				default: break;
 			}
--- a/src/economy.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/economy.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -217,10 +217,7 @@
 			/* Skip the total */
 			if (i == SCORE_TOTAL) continue;
 			/*  Check the score */
-			s = (_score_part[owner][i] >= _score_info[i].needed) ?
-				_score_info[i].score :
-				_score_part[owner][i] * _score_info[i].score / _score_info[i].needed;
-			if (s < 0) s = 0;
+			s = clamp(_score_part[owner][i], 0, _score_info[i].needed) * _score_info[i].score / _score_info[i].needed;
 			score += s;
 			total_score += _score_info[i].score;
 		}
@@ -976,7 +973,6 @@
 static void FindSubsidyCargoRoute(FoundRoute *fr)
 {
 	Industry *i;
-	const IndustrySpec *ind;
 	int trans, total;
 	CargoID cargo;
 
@@ -984,15 +980,14 @@
 
 	fr->from = i = GetRandomIndustry();
 	if (i == NULL) return;
-	ind = GetIndustrySpec(i->type);
 
 	/* Randomize cargo type */
-	if (HASBIT(Random(), 0) && ind->produced_cargo[1] != CT_INVALID) {
-		cargo = ind->produced_cargo[1];
+	if (HASBIT(Random(), 0) && i->produced_cargo[1] != CT_INVALID) {
+		cargo = i->produced_cargo[1];
 		trans = i->last_month_pct_transported[1];
 		total = i->last_month_production[1];
 	} else {
-		cargo = ind->produced_cargo[0];
+		cargo = i->produced_cargo[0];
 		trans = i->last_month_pct_transported[0];
 		total = i->last_month_production[0];
 	}
@@ -1019,17 +1014,12 @@
 	} 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 ||
-				(cargo != ind->accepts_cargo[0] &&
-				cargo != ind->accepts_cargo[1] &&
-				cargo != ind->accepts_cargo[2])) {
+		if (i2 == NULL || i == i2 ||
+				(cargo != i2->accepts_cargo[0] &&
+				cargo != i2->accepts_cargo[1] &&
+				cargo != i2->accepts_cargo[2])) {
 			return;
 		}
 		fr->distance = DistanceManhattan(i->xy, i2->xy);
@@ -1230,12 +1220,12 @@
 		indspec = GetIndustrySpec(ind->type);
 		uint i;
 
-		for (i = 0; i < lengthof(indspec->accepts_cargo); i++) {
-			if (cargo_type == indspec->accepts_cargo[i]) break;
+		for (i = 0; i < lengthof(ind->accepts_cargo); i++) {
+			if (cargo_type == ind->accepts_cargo[i]) break;
 		}
 
 		/* Check if matching cargo has been found */
-		if (i == lengthof(indspec->accepts_cargo)) continue;
+		if (i == lengthof(ind->accepts_cargo)) continue;
 
 		if (HASBIT(indspec->callback_flags, CBM_IND_REFUSE_CARGO)) {
 			uint16 res = GetIndustryCallback(CBID_INDUSTRY_REFUSE_CARGO, 0, GetReverseCargoTranslation(cargo_type, indspec->grf_prop.grffile), ind, ind->type, ind->xy);
@@ -1533,7 +1523,7 @@
 		if (v->cargo_cap == 0) continue;
 
 		byte load_amount = EngInfo(v->engine_type)->load_amount;
-		if (_patches.gradual_loading && HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_LOAD_AMOUNT)) {
+		if (_patches.gradual_loading && HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_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;
 		}
@@ -1693,8 +1683,13 @@
 		}
 	}
 
-	/* Calculate the loading indicator fill percent and display */
-	if (_patches.loading_indicators && _game_mode != GM_MENU && v->owner == _local_player) {
+	/* Calculate the loading indicator fill percent and display
+	 * In the Game Menu do not display indicators
+	 * If _patches.loading_indicators == 2, show indicators (bool can be promoted to int as 0 or 1 - results in 2 > 0,1 )
+	 * if _patches.loading_indicators == 1, _local_player must be the owner or must be a spectator to show ind., so 1 > 0
+	 * if _patches.loading_indicators == 0, do not display indicators ... 0 is never greater than anything
+	 */
+	if (_game_mode != GM_MENU && (_patches.loading_indicators > (uint)(v->owner != _local_player && _local_player != PLAYER_SPECTATOR))) {
 		StringID percent_up_down = STR_NULL;
 		int percent = CalcPercentVehicleFilled(v, &percent_up_down);
 		if (v->fill_percent_te_id == INVALID_TE_ID) {
--- a/src/elrail.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/elrail.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -141,6 +141,65 @@
 	}
 }
 
+/**
+ * Returns the Z position of a Pylon Control Point.
+ *
+ * @param tile The tile the pylon should stand on.
+ * @param PCPpos The PCP of the tile.
+ * @return The Z position of the PCP.
+ */
+static byte GetPCPElevation(TileIndex tile, DiagDirection PCPpos)
+{
+	/* The elevation of the "pylon"-sprite should be the elevation at the PCP.
+	 * PCPs are always on a tile edge.
+	 *
+	 * This position can be outside of the tile, i.e. ?_pcp_offset == TILE_SIZE > TILE_SIZE - 1.
+	 * So we have to move it inside the tile, because if the neighboured tile has a foundation,
+	 * that does not smoothly connect to the current tile, we will get a wrong elevation from GetSlopeZ().
+	 *
+	 * When we move the position inside the tile, we will get a wrong elevation if we have a slope.
+	 * To catch all cases we round the Z position to the next (TILE_HEIGHT / 2).
+	 * This will return the correct elevation for slopes and will also detect non-continuous elevation on edges.
+	 *
+	 * Also note that the result of GetSlopeZ() is very special on bridge-ramps.
+	 */
+
+	byte z = GetSlopeZ(TileX(tile) * TILE_SIZE + min(x_pcp_offsets[PCPpos], TILE_SIZE - 1), TileY(tile) * TILE_SIZE + min(y_pcp_offsets[PCPpos], TILE_SIZE - 1));
+	return (z + 2) & ~3; // this means z = (z + TILE_HEIGHT / 4) / (TILE_HEIGHT / 2) * (TILE_HEIGHT / 2);
+}
+
+/**
+ * Draws wires on a tunnel tile
+ *
+ * DrawTile_TunnelBridge() calls this function to draw the wires as SpriteCombine with the tunnel roof.
+ *
+ * @param ti The Tileinfo to draw the tile for
+ */
+void DrawCatenaryOnTunnel(const TileInfo *ti)
+{
+	/* xmin, ymin, xmax + 1, ymax + 1 of BB */
+	static const int _tunnel_wire_BB[4][4] = {
+		{ 0, 1, 16, 15 }, // NE
+		{ 1, 0, 15, 16 }, // SE
+		{ 0, 1, 16, 15 }, // SW
+		{ 1, 0, 15, 16 }, // NW
+	};
+
+	if ((GetRailType(ti->tile) != RAILTYPE_ELECTRIC) || _patches.disable_elrails) return;
+
+	DiagDirection dir = GetTunnelDirection(ti->tile);
+
+	const SortableSpriteStruct *sss = &CatenarySpriteData_Tunnel[dir];
+	const int *BB_data = _tunnel_wire_BB[dir];
+	AddSortableSpriteToDraw(
+		sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
+		BB_data[2] - sss->x_offset, BB_data[3] - sss->y_offset, BB_Z_SEPARATOR - sss->z_offset + 1,
+		GetTileZ(ti->tile) + sss->z_offset,
+		HASBIT(_transparent_opt, TO_BUILDINGS),
+		BB_data[0] - sss->x_offset, BB_data[1] - sss->y_offset, BB_Z_SEPARATOR - sss->z_offset
+	);
+}
+
 /** Draws wires and, if required, pylons on a given tile
  * @param ti The Tileinfo to draw the tile for
  */
@@ -184,6 +243,11 @@
 		tileh[TS_NEIGHBOUR] = GetTileSlope(neighbour, NULL);
 		trackconfig[TS_NEIGHBOUR] = GetRailTrackBitsUniversal(neighbour, NULL);
 		if (IsTunnelTile(neighbour) && i != GetTunnelDirection(neighbour)) trackconfig[TS_NEIGHBOUR] = TRACK_BIT_NONE;
+
+		/* If the neighboured tile does not smoothly connect to the current tile (because of a foundation),
+		 * we have to draw all pillars on the current tile. */
+		if (GetPCPElevation(ti->tile, i) != GetPCPElevation(neighbour, ReverseDiagDir(i))) trackconfig[TS_NEIGHBOUR] = TRACK_BIT_NONE;
+
 		isflat[TS_NEIGHBOUR] = ((trackconfig[TS_NEIGHBOUR] & (TRACK_BIT_HORZ | TRACK_BIT_VERT)) != 0);
 
 		PPPpreferred[i] = 0xFF; // We start with preferring everything (end-of-line in any direction)
@@ -220,7 +284,7 @@
 		if (IsTileType(neighbour, MP_STATION)) tileh[TS_NEIGHBOUR] = SLOPE_FLAT;
 
 		/* Read the foundataions if they are present, and adjust the tileh */
-		if (IsTileType(neighbour, MP_RAILWAY) && GetRailType(neighbour) == RAILTYPE_ELECTRIC) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
+		if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && GetRailType(neighbour) == RAILTYPE_ELECTRIC) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
 		if (IsBridgeTile(neighbour)) {
 			foundation = GetBridgeFoundation(tileh[TS_NEIGHBOUR], DiagDirToAxis(GetBridgeRampDirection(neighbour)));
 		}
@@ -268,9 +332,9 @@
 						continue; /* No neighbour, go looking for a better position */
 					}
 
-					AddSortableSpriteToDraw(pylons_normal[temp], PAL_NONE, x, y, 1, 1, 10,
-							GetSlopeZ(ti->x + x_pcp_offsets[i], ti->y + y_pcp_offsets[i]),
-							HASBIT(_transparent_opt, TO_BUILDINGS));
+					AddSortableSpriteToDraw(pylon_sprites[temp], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE,
+							GetPCPElevation(ti->tile, i),
+							HASBIT(_transparent_opt, TO_BUILDINGS), -1, -1);
 					break; /* We already have drawn a pylon, bail out */
 				}
 			}
@@ -287,17 +351,7 @@
 	/* Drawing of pylons is finished, now draw the wires */
 	for (t = TRACK_BEGIN; t < TRACK_END; t++) {
 		if (HASBIT(trackconfig[TS_HOME], t)) {
-			if (IsTunnelTile(ti->tile)) {
-				const SortableSpriteStruct *sss = &CatenarySpriteData_Tunnel[GetTunnelDirection(ti->tile)];
-
-				AddSortableSpriteToDraw(
-					sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
-					sss->x_size, sss->y_size, sss->z_size,
-					GetTileZ(ti->tile) + sss->z_offset,
-					HASBIT(_transparent_opt, TO_BUILDINGS)
-				);
-				break;
-			}
+			if (IsTunnelTile(ti->tile)) break; // drawn together with tunnel-roof (see DrawCatenaryOnTunnel())
 			byte PCPconfig = HASBIT(PCPstatus, PCPpositions[t][0]) +
 				(HASBIT(PCPstatus, PCPpositions[t][1]) << 1);
 
@@ -308,8 +362,13 @@
 			assert(!IsSteepSlope(tileh[TS_HOME]));
 			sss = &CatenarySpriteData[Wires[tileh_selector][t][PCPconfig]];
 
+			/*
+			 * The "wire"-sprite position is inside the tile, i.e. 0 <= sss->?_offset < TILE_SIZE.
+			 * Therefore it is save to use GetSlopeZ() for the elevation.
+			 * Also note, that the result of GetSlopeZ() is very special for bridge-ramps.
+			 */
 			AddSortableSpriteToDraw(sss->image, PAL_NONE, 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,
+				sss->x_size, sss->y_size, sss->z_size, GetSlopeZ(ti->x + sss->x_offset, ti->y + sss->y_offset) + sss->z_offset,
 				HASBIT(_transparent_opt, TO_BUILDINGS));
 		}
 	}
@@ -349,20 +408,22 @@
 	/* Finished with wires, draw pylons */
 	/* 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, HASBIT(_transparent_opt, TO_BUILDINGS));
-		} else {
-			AddSortableSpriteToDraw(pylons_bridge[2 + HASBIT(tlg, 1)], PAL_NONE, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y, 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS));
-		}
+		DiagDirection PCPpos = (axis == AXIS_X ? DIAGDIR_NE : DIAGDIR_NW);
+		Direction PPPpos = (axis == AXIS_X ? DIR_NW : DIR_NE);
+		if (HASBIT(tlg, (axis == AXIS_X ? 0 : 1))) PPPpos = ReverseDir(PPPpos);
+		uint x = ti->x + x_pcp_offsets[PCPpos] + x_ppp_offsets[PPPpos];
+		uint y = ti->y + y_pcp_offsets[PCPpos] + y_ppp_offsets[PPPpos];
+		AddSortableSpriteToDraw(pylon_sprites[PPPpos], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, height, HASBIT(_transparent_opt, TO_BUILDINGS), -1, -1);
 	}
 
 	/* 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, HASBIT(_transparent_opt, TO_BUILDINGS));
-		} else {
-			AddSortableSpriteToDraw(pylons_bridge[2 + HASBIT(tlg, 1)], PAL_NONE, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y + 16, 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS));
-		}
+		DiagDirection PCPpos = (axis == AXIS_X ? DIAGDIR_SW : DIAGDIR_SE);
+		Direction PPPpos = (axis == AXIS_X ? DIR_NW : DIR_NE);
+		if (HASBIT(tlg, (axis == AXIS_X ? 0 : 1))) PPPpos = ReverseDir(PPPpos);
+		uint x = ti->x + x_pcp_offsets[PCPpos] + x_ppp_offsets[PPPpos];
+		uint y = ti->y + y_pcp_offsets[PCPpos] + y_ppp_offsets[PPPpos];
+		AddSortableSpriteToDraw(pylon_sprites[PPPpos], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, height, HASBIT(_transparent_opt, TO_BUILDINGS), -1, -1);
 	}
 }
 
@@ -383,6 +444,7 @@
 			if (IsRailDepot(ti->tile)) {
 				const SortableSpriteStruct *sss = &CatenarySpriteData_Depot[GetRailDepotDirection(ti->tile)];
 
+				/* This wire is not visible with the default depot sprites */
 				AddSortableSpriteToDraw(
 					sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
 					sss->x_size, sss->y_size, sss->z_size,
--- a/src/fileio.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/fileio.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -16,8 +16,8 @@
 #else
 #include <pwd.h>
 #include <unistd.h>
+#endif
 #include <sys/stat.h>
-#endif
 
 /*************************************************/
 /* FILE IO ROUTINES ******************************/
@@ -74,18 +74,18 @@
 #endif /* LIMITED_FDS */
 
 /* Seek to a file and a position */
-void FioSeekToFile(uint32 pos)
+void FioSeekToFile(uint8 slot, uint32 pos)
 {
 	FILE *f;
 #if defined(LIMITED_FDS)
 	/* Make sure we have this file open */
-	FioRestoreFile(pos >> 24);
+	FioRestoreFile(slot);
 #endif /* LIMITED_FDS */
-	f = _fio.handles[pos >> 24];
+	f = _fio.handles[slot];
 	assert(f != NULL);
 	_fio.cur_fh = f;
-	_fio.filename = _fio.filenames[pos >> 24];
-	FioSeekTo(GB(pos, 0, 24), SEEK_SET);
+	_fio.filename = _fio.filenames[slot];
+	FioSeekTo(pos, SEEK_SET);
 }
 
 byte FioReadByte()
@@ -180,6 +180,7 @@
 #endif /* LIMITED_FDS */
 	f = FioFOpenFile(filename);
 	if (f == NULL) error("Cannot open file '%s'", filename);
+	uint32 pos = ftell(f);
 
 	FioCloseFile(slot); // if file was opened before, close it
 	_fio.handles[slot] = f;
@@ -188,7 +189,7 @@
 	_fio.usage_count[slot] = 0;
 	_fio.open_handles++;
 #endif /* LIMITED_FDS */
-	FioSeekToFile(slot << 24);
+	FioSeekToFile(slot, pos);
 }
 
 const char *_subdirs[NUM_SUBDIRS] = {
@@ -203,6 +204,8 @@
 };
 
 const char *_searchpaths[NUM_SEARCHPATHS];
+TarList _tar_list;
+TarFileList _tar_filelist;
 
 /**
  * Check whether the given file exists
@@ -215,8 +218,16 @@
 	FILE *f = FioFOpenFile(filename, "rb", subdir);
 	if (f == NULL) return false;
 
+	FioFCloseFile(f);
+	return true;
+}
+
+/**
+ * Close a file in a safe way.
+ */
+void FioFCloseFile(FILE *f)
+{
 	fclose(f);
-	return true;
 }
 
 char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename)
@@ -266,7 +277,7 @@
 	return buf;
 }
 
-FILE *FioFOpenFileSp(const char *filename, const char *mode, Searchpath sp, Subdirectory subdir)
+FILE *FioFOpenFileSp(const char *filename, const char *mode, Searchpath sp, Subdirectory subdir, size_t *filesize)
 {
 #if defined(WIN32) && defined(UNICODE)
 	/* fopen is implemented as a define with ellipses for
@@ -285,6 +296,10 @@
 		snprintf(buf, lengthof(buf), "%s%s%s", _searchpaths[sp], _subdirs[subdir], filename);
 	}
 
+#if defined(WIN32)
+	if (mode[0] == 'r' && GetFileAttributes(OTTD2FS(buf)) == INVALID_FILE_ATTRIBUTES) return NULL;
+#endif
+
 	f = fopen(buf, mode);
 #if !defined(WIN32)
 	if (f == NULL) {
@@ -292,11 +307,27 @@
 		f = fopen(buf, mode);
 	}
 #endif
+	if (f != NULL && filesize != NULL) {
+		/* Find the size of the file */
+		fseek(f, 0, SEEK_END);
+		*filesize = ftell(f);
+		fseek(f, 0, SEEK_SET);
+	}
+	return f;
+}
+
+FILE *FioFOpenFileTar(TarFileListEntry *entry, size_t *filesize)
+{
+	FILE *f = fopen(entry->tar->filename, "rb");
+	assert(f != NULL);
+
+	fseek(f, entry->position, SEEK_SET);
+	if (filesize != NULL) *filesize = entry->size;
 	return f;
 }
 
 /** Opens OpenTTD files somewhere in a personal or global directory */
-FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir)
+FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, size_t *filesize)
 {
 	FILE *f = NULL;
 	Searchpath sp;
@@ -304,10 +335,22 @@
 	assert(subdir < NUM_SUBDIRS || subdir == NO_DIRECTORY);
 
 	FOR_ALL_SEARCHPATHS(sp) {
-		f = FioFOpenFileSp(filename, mode, sp, subdir);
+		f = FioFOpenFileSp(filename, mode, sp, subdir, filesize);
 		if (f != NULL || subdir == NO_DIRECTORY) break;
 	}
 
+	/* We can only use .tar in case of data-dir, and read-mode */
+	if (f == NULL && subdir == DATA_DIR && mode[0] == 'r') {
+		/* Filenames in tars are always forced to be lowercase */
+		char *lcfilename = strdup(filename);
+		strtolower(lcfilename);
+		TarFileList::iterator it = _tar_filelist.find(lcfilename);
+		free(lcfilename);
+		if (it != _tar_filelist.end()) {
+			f = FioFOpenFileTar(&((*it).second), filesize);
+		}
+	}
+
 	return f;
 }
 
@@ -368,6 +411,169 @@
 	return dest;
 }
 
+static bool TarListAddFile(const char *filename)
+{
+	/* The TAR-header, repeated for every file */
+	typedef struct TarHeader {
+		char name[100];      ///< Name of the file
+		char mode[8];
+		char uid[8];
+		char gid[8];
+		char size[12];       ///< Size of the file, in ASCII
+		char mtime[12];
+		char chksum[8];
+		char typeflag;
+		char linkname[100];
+		char magic[6];
+		char version[2];
+		char uname[32];
+		char gname[32];
+		char devmajor[8];
+		char devminor[8];
+		char prefix[155];    ///< Path of the file
+
+		char unused[12];
+	} TarHeader;
+
+	/* Check if we already seen this file */
+	TarList::iterator it = _tar_list.find(filename);
+	if (it != _tar_list.end()) return false;
+
+	FILE *f = fopen(filename, "rb");
+	assert(f != NULL);
+
+	TarListEntry *tar_entry = MallocT<TarListEntry>(1);
+	tar_entry->filename = strdup(filename);
+	_tar_list.insert(TarList::value_type(filename, tar_entry));
+
+	TarHeader th;
+	char buf[sizeof(th.name) + 1], *end;
+	char name[sizeof(th.prefix) + 1 + sizeof(th.name) + 1];
+	int num = 0, pos = 0;
+
+	/* Make a char of 512 empty bytes */
+	char empty[512];
+	memset(&empty[0], 0, sizeof(empty));
+
+	while (!feof(f)) {
+		fread(&th, 1, 512, f);
+		pos += 512;
+
+		/* Check if we have the new tar-format (ustar) or the old one (a lot of zeros after 'link' field) */
+		if (strncmp(th.magic, "ustar", 5) != 0 && memcmp(&th.magic, &empty[0], 512 - offsetof(TarHeader, magic)) != 0) {
+			/* If we have only zeros in the block, it can be an end-of-file indicator */
+			if (memcmp(&th, &empty[0], 512) == 0) continue;
+
+			DEBUG(misc, 0, "The file '%s' isn't a valid tar-file", filename);
+			return false;
+		}
+
+		name[0] = '\0';
+		int len = 0;
+
+		/* The prefix contains the directory-name */
+		if (th.prefix[0] != '\0') {
+			memcpy(name, th.prefix, sizeof(th.prefix));
+			name[sizeof(th.prefix)] = '\0';
+			len = strlen(name);
+			name[len] = PATHSEPCHAR;
+			len++;
+		}
+
+		/* Copy the name of the file in a safe way at the end of 'name' */
+		memcpy(&name[len], th.name, sizeof(th.name));
+		name[len + sizeof(th.name)] = '\0';
+
+		/* Calculate the size of the file.. for some strange reason this is stored as a string */
+		memcpy(buf, th.size, sizeof(th.size));
+		buf[sizeof(th.size)] = '\0';
+		int skip = strtol(buf, &end, 8);
+
+		/* 0 byte sized files can be skipped (dirs, symlinks, ..) */
+		if (skip == 0) continue;
+
+		/* Store this entry in the list */
+		TarFileListEntry entry;
+		entry.tar      = tar_entry;
+		entry.size     = skip;
+		entry.position = pos;
+		/* Force lowercase */
+		strtolower(name);
+
+		/* Tar-files always have '/' path-seperator, but we want our PATHSEPCHAR */
+#if (PATHSEPCHAR != '/')
+		for (char *n = name; *n != '\0'; n++) if (*n == '/') *n = PATHSEPCHAR;
+#endif
+
+		DEBUG(misc, 6, "Found file in tar: %s (%d bytes, %d offset)", name, skip, pos);
+		if (_tar_filelist.insert(TarFileList::value_type(name, entry)).second) num++;
+
+		/* Skip to the next block.. */
+		skip = ALIGN(skip, 512);
+		fseek(f, skip, SEEK_CUR);
+		pos += skip;
+	}
+
+	DEBUG(misc, 1, "Found tar '%s' with %d new files", filename, num);
+	fclose(f);
+
+	return true;
+}
+
+static int ScanPathForTarFiles(const char *path, int basepath_length)
+{
+	extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
+
+	uint num = 0;
+	struct stat sb;
+	struct dirent *dirent;
+	DIR *dir;
+
+	if (path == NULL || (dir = ttd_opendir(path)) == NULL) return 0;
+
+	while ((dirent = readdir(dir)) != NULL) {
+		const char *d_name = FS2OTTD(dirent->d_name);
+		char filename[MAX_PATH];
+
+		if (!FiosIsValidFile(path, dirent, &sb)) continue;
+
+		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 += ScanPathForTarFiles(filename, basepath_length);
+		} else if (sb.st_mode & S_IFREG) {
+			/* File */
+			char *ext = strrchr(filename, '.');
+
+			/* If no extension or extension isn't .tar, skip the file */
+			if (ext == NULL) continue;
+			if (strcasecmp(ext, ".tar") != 0) continue;
+
+			if (TarListAddFile(filename)) num++;
+		}
+	}
+
+	closedir(dir);
+	return num;
+}
+
+void ScanForTarFiles()
+{
+	Searchpath sp;
+	char path[MAX_PATH];
+	uint num = 0;
+
+	DEBUG(misc, 1, "Scanning for tars");
+	FOR_ALL_SEARCHPATHS(sp) {
+		FioAppendDirectory(path, MAX_PATH, sp, DATA_DIR);
+		num += ScanPathForTarFiles(path, strlen(path));
+	}
+	DEBUG(misc, 1, "Scan complete, found %d files", num);
+}
+
 #if defined(WIN32) || defined(WINCE)
 /**
  * Determine the base (personal dir and game data dir) paths
@@ -454,6 +660,8 @@
 #else
 	_searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL;
 #endif
+
+	ScanForTarFiles();
 }
 #endif /* defined(WIN32) || defined(WINCE) */
 
--- a/src/fileio.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/fileio.h	Sat Oct 06 21:16:00 2007 +0000
@@ -6,9 +6,11 @@
 #define FILEIO_H
 
 #include "helpers.hpp"
+#include <map>
+#include <string>
 
 void FioSeekTo(uint32 pos, int mode);
-void FioSeekToFile(uint32 pos);
+void FioSeekToFile(uint8 slot, uint32 pos);
 uint32 FioGetPos();
 const char *FioGetFilename();
 byte FioReadByte();
@@ -61,6 +63,22 @@
 extern const char *_searchpaths[NUM_SEARCHPATHS];
 
 /**
+ * The define of a TarList.
+ */
+struct TarListEntry {
+	const char *filename;
+};
+struct TarFileListEntry {
+	TarListEntry *tar;
+	int size;
+	int position;
+};
+typedef std::map<std::string, TarListEntry *> TarList;
+typedef std::map<std::string, TarFileListEntry> TarFileList;
+extern TarList _tar_list;
+extern TarFileList _tar_filelist;
+
+/**
  * Checks whether the given search path is a valid search path
  * @param sp the search path to check
  * @return true if the search path is valid
@@ -72,8 +90,13 @@
 
 /** Iterator for all the search paths */
 #define FOR_ALL_SEARCHPATHS(sp) for (sp = SP_FIRST_DIR; sp < NUM_SEARCHPATHS; sp++) if (IsValidSearchPath(sp))
+#define FOR_ALL_TARS(tar) for (tar = _tar_filelist.begin(); tar != _tar_filelist.end(); tar++)
 
-FILE *FioFOpenFile(const char *filename, const char *mode = "rb", Subdirectory subdir = DATA_DIR);
+typedef bool FioTarFileListCallback(const char *filename, int size, void *userdata);
+FILE *FioTarFileList(const char *tar, const char *mode, size_t *filesize, FioTarFileListCallback *callback, void *userdata);
+
+void FioFCloseFile(FILE *f);
+FILE *FioFOpenFile(const char *filename, const char *mode = "rb", Subdirectory subdir = DATA_DIR, size_t *filesize = NULL);
 bool FioCheckFileExists(const char *filename, Subdirectory subdir = DATA_DIR);
 char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename);
 char *FioFindFullPath(char *buf, size_t buflen, Subdirectory subdir, const char *filename);
--- a/src/functions.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/functions.h	Sat Oct 06 21:16:00 2007 +0000
@@ -103,7 +103,18 @@
 void ConvertNameArray();
 
 /* misc functions */
+/**
+ * Mark a tile given by its coordinate dirty for repaint.
+ *
+ * @ingroup dirty
+ */
 void MarkTileDirty(int x, int y);
+
+/**
+ * Mark a tile given by its index dirty for repaint.
+ *
+ * @ingroup dirty
+ */
 void MarkTileDirtyByTile(TileIndex tile);
 void InvalidateWindow(WindowClass cls, WindowNumber number);
 void InvalidateWindowWidget(WindowClass cls, WindowNumber number, byte widget_index);
@@ -121,9 +132,14 @@
 
 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);
+
+/**
+ * Mark all viewports dirty for repaint.
+ *
+ * @ingroup dirty
+ */
 void MarkAllViewportsDirty(int left, int top, int right, int bottom);
 void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost);
 void ShowFeederIncomeAnimation(int x, int y, int z, Money cost);
--- a/src/gfx.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/gfx.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -43,11 +43,19 @@
 Colour _cur_palette[256];
 byte _stringwidth_table[FS_END][224];
 
-static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode);
+static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = NULL);
 
 FontSize _cur_fontsize;
 static FontSize _last_fontsize;
 static uint8 _cursor_backup[64 * 64 * 4];
+
+/**
+ * The rect for repaint.
+ *
+ * This rectangle defines the area which should be repaint by the video driver.
+ *
+ * @ingroup dirty
+ */
 static Rect _invalid_rect;
 static const byte *_color_remap_ptr;
 static byte _string_colorremap[3];
@@ -131,6 +139,71 @@
 	blitter->DrawLine(dpi->dst_ptr, x, y, x2, y2, dpi->width, dpi->height, color);
 }
 
+void GfxDrawLineUnscaled(int x, int y, int x2, int y2, int color)
+{
+	Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
+	DrawPixelInfo *dpi = _cur_dpi;
+
+	x -= dpi->left;
+	x2 -= dpi->left;
+	y -= dpi->top;
+	y2 -= dpi->top;
+
+	/* Check clipping */
+	if (x < 0 && x2 < 0) return;
+	if (y < 0 && y2 < 0) return;
+	if (x > dpi->width  && x2 > dpi->width)  return;
+	if (y > dpi->height && y2 > dpi->height) return;
+
+	blitter->DrawLine(dpi->dst_ptr, UnScaleByZoom(x, dpi->zoom), UnScaleByZoom(y, dpi->zoom),
+			UnScaleByZoom(x2, dpi->zoom), UnScaleByZoom(y2, dpi->zoom),
+			UnScaleByZoom(dpi->width, dpi->zoom), UnScaleByZoom(dpi->height, dpi->zoom), color);
+}
+
+/**
+ * Draws the projection of a parallelepiped.
+ * This can be used to draw boxes in world coordinates.
+ *
+ * @param x   Screen X-coordinate of top front corner.
+ * @param y   Screen Y-coordinate of top front corner.
+ * @param dx1 Screen X-length of first edge.
+ * @param dy1 Screen Y-length of first edge.
+ * @param dx2 Screen X-length of second edge.
+ * @param dy2 Screen Y-length of second edge.
+ * @param dx3 Screen X-length of third edge.
+ * @param dy3 Screen Y-length of third edge.
+ */
+void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3)
+{
+	/*           ....
+	 *         ..    ....
+	 *       ..          ....
+	 *     ..                ^
+	 *   <--__(dx1,dy1)    /(dx2,dy2)
+	 *   :    --__       /   :
+	 *   :        --__ /     :
+	 *   :            *(x,y) :
+	 *   :            |      :
+	 *   :            |     ..
+	 *    ....        |(dx3,dy3)
+	 *        ....    | ..
+	 *            ....V.
+	 */
+
+	static const byte color = 255;
+
+	GfxDrawLineUnscaled(x, y, x + dx1, y + dy1, color);
+	GfxDrawLineUnscaled(x, y, x + dx2, y + dy2, color);
+	GfxDrawLineUnscaled(x, y, x + dx3, y + dy3, color);
+
+	GfxDrawLineUnscaled(x + dx1, y + dy1, x + dx1 + dx2, y + dy1 + dy2, color);
+	GfxDrawLineUnscaled(x + dx1, y + dy1, x + dx1 + dx3, y + dy1 + dy3, color);
+	GfxDrawLineUnscaled(x + dx2, y + dy2, x + dx2 + dx1, y + dy2 + dy1, color);
+	GfxDrawLineUnscaled(x + dx2, y + dy2, x + dx2 + dx3, y + dy2 + dy3, color);
+	GfxDrawLineUnscaled(x + dx3, y + dy3, x + dx3 + dx1, y + dy3 + dy1, color);
+	GfxDrawLineUnscaled(x + dx3, y + dy3, x + dx3 + dx2, y + dy3 + dy2, color);
+}
+
 
 /** Truncate a given string to a maximum width if neccessary.
  * If the string is truncated, add three dots ('...') to show this.
@@ -269,7 +342,8 @@
 	GfxFillRect((xl + xr - w) / 2, y + 10, (xl + xr + w) / 2, y + 10, _string_colorremap[1]);
 }
 
-/** 'Correct' a string to a maximum length. Longer strings will be cut into
+/**
+ * '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.
@@ -284,7 +358,8 @@
  * @param maxw the maximum width the string can have on one line
  * @return return a 32bit wide number consisting of 2 packed values:
  *  0 - 15 the number of lines ADDED to the string
- * 16 - 31 the fontsize in which the length calculation was done at */
+ * 16 - 31 the fontsize in which the length calculation was done at
+ */
 uint32 FormatStringLinebreaks(char *str, int maxw)
 {
 	FontSize size = _cur_fontsize;
@@ -577,24 +652,33 @@
 	return DoDrawString(buffer, x, y, color);
 }
 
-void DrawSprite(SpriteID img, SpriteID pal, int x, int y)
+void DrawSprite(SpriteID img, SpriteID pal, int x, int y, const SubSprite *sub)
 {
 	if (HASBIT(img, PALETTE_MODIFIER_TRANSPARENT)) {
 		_color_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH)) + 1;
-		GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_TRANSPARENT);
+		GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_TRANSPARENT, sub);
 	} else if (pal != PAL_NONE) {
 		_color_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH)) + 1;
-		GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_COLOUR_REMAP);
+		GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_COLOUR_REMAP, sub);
 	} else {
-		GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_NORMAL);
+		GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_NORMAL, sub);
 	}
 }
 
-static inline void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode)
+static inline void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub)
 {
 	const DrawPixelInfo *dpi = _cur_dpi;
 	Blitter::BlitterParams bp;
 
+	/* Amount of pixels to clip from the source sprite */
+	int clip_left   = (sub != NULL ? max(0,                   -sprite->x_offs + sub->left       ) : 0);
+	int clip_top    = (sub != NULL ? max(0,                   -sprite->y_offs + sub->top        ) : 0);
+	int clip_right  = (sub != NULL ? max(0, sprite->width  - (-sprite->x_offs + sub->right  + 1)) : 0);
+	int clip_bottom = (sub != NULL ? max(0, sprite->height - (-sprite->y_offs + sub->bottom + 1)) : 0);
+
+	if (clip_left + clip_right >= sprite->width) return;
+	if (clip_top + clip_bottom >= sprite->height) return;
+
 	/* Move to the correct offset */
 	x += sprite->x_offs;
 	y += sprite->y_offs;
@@ -603,12 +687,16 @@
 	bp.sprite = sprite->data;
 	bp.sprite_width = sprite->width;
 	bp.sprite_height = sprite->height;
-	bp.width = UnScaleByZoom(sprite->width, dpi->zoom);
-	bp.height = UnScaleByZoom(sprite->height, dpi->zoom);
+	bp.width = UnScaleByZoom(sprite->width - clip_left - clip_right, dpi->zoom);
+	bp.height = UnScaleByZoom(sprite->height - clip_top - clip_bottom, dpi->zoom);
 	bp.top = 0;
 	bp.left = 0;
-	bp.skip_left = 0;
-	bp.skip_top = 0;
+	bp.skip_left = UnScaleByZoom(clip_left, dpi->zoom);
+	bp.skip_top = UnScaleByZoom(clip_top, dpi->zoom);
+
+	x += ScaleByZoom(bp.skip_left, dpi->zoom);
+	y += ScaleByZoom(bp.skip_top, dpi->zoom);
+
 	bp.dst = dpi->dst_ptr;
 	bp.pitch = dpi->pitch;
 	bp.remap = _color_remap_ptr;
@@ -919,6 +1007,11 @@
 	_video_driver->MakeDirty(left, top, right - left, bottom - top);
 }
 
+/*!
+ * Repaints the rectangle blocks which are marked as 'dirty'.
+ *
+ * @see SetDirtyBlocks
+ */
 void DrawDirtyBlocks()
 {
 	byte *b = _dirty_blocks;
@@ -1003,7 +1096,21 @@
 	}
 }
 
-
+/*!
+ * This function extends the internal _invalid_rect rectangle as it
+ * now contains the rectangle defined by the given parameters. Note
+ * the point (0,0) is top left.
+ *
+ * @param left The left edge of the rectangle
+ * @param top The top edge of the rectangle
+ * @param right The right edge of the rectangle
+ * @param bottom The bottm edge of the rectangle
+ * @see DrawDirtyBlocks
+ *
+ * @todo The name of the function should be called like @c AddDirtyBlock as
+ *       it neither set a dirty rect nor add several dirty rects although
+ *       the function name is in plural. (Progman)
+ */
 void SetDirtyBlocks(int left, int top, int right, int bottom)
 {
 	byte *b;
@@ -1041,6 +1148,11 @@
 	} while (--height != 0);
 }
 
+/*!
+ * This function mark the whole screen as dirty. This results in repainting
+ * the whole screen. Use this with care as this function will break the
+ * idea about marking only parts of the screen as 'dirty'.
+ */
 void MarkWholeScreenDirty()
 {
 	SetDirtyBlocks(0, 0, _screen.width, _screen.height);
--- a/src/gfx.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/gfx.h	Sat Oct 06 21:16:00 2007 +0000
@@ -2,6 +2,36 @@
 
 /** @file gfx.h */
 
+/**
+ * @defgroup dirty Dirty
+ *
+ * Handles the repaint of some part of the screen.
+ *
+ * Some places in the code are called functions which makes something "dirty".
+ * This has nothing to do with making a Tile or Window darker or less visible.
+ * This term comes from memory caching and is used to define an object must
+ * be repaint. If some data of an object (like a Tile, Window, Vehicle, whatever)
+ * are changed which are so extensive the object must be repaint its marked
+ * as "dirty". The video driver repaint this object instead of the whole screen
+ * (this is btw. also possible if needed). This is used to avoid a
+ * flickering of the screen by the video driver constantly repainting it.
+ *
+ * This whole mechanism is controlled by an rectangle defined in #_invalid_rect. This
+ * rectangle defines the area on the screen which must be repaint. If a new object
+ * needs to be repainted this rectangle is extended to 'catch' the object on the
+ * screen. At some point (which is normaly uninteressted for patch writers) this
+ * rectangle is send to the video drivers method
+ * VideoDriver::MakeDirty and it is truncated back to an empty rectangle. At some
+ * later point (which is uninteressted, too) the video driver
+ * repaints all these saved rectangle instead of the whole screen and drop the
+ * rectangle informations. Then a new round begins by marking objects "dirty".
+ *
+ * @see VideoDriver::MakeDirty
+ * @see _invalid_rect
+ * @see _screen
+ */
+
+
 #ifndef GFX_H
 #define GFX_H
 
@@ -36,24 +66,6 @@
 	WKC_RETURN      = 13,
 	WKC_TAB         = 14,
 
-	/* Numerical keyboard */
-	WKC_NUM_0       = 16,
-	WKC_NUM_1       = 17,
-	WKC_NUM_2       = 18,
-	WKC_NUM_3       = 19,
-	WKC_NUM_4       = 20,
-	WKC_NUM_5       = 21,
-	WKC_NUM_6       = 22,
-	WKC_NUM_7       = 23,
-	WKC_NUM_8       = 24,
-	WKC_NUM_9       = 25,
-	WKC_NUM_DIV     = 26,
-	WKC_NUM_MUL     = 27,
-	WKC_NUM_MINUS   = 28,
-	WKC_NUM_PLUS    = 29,
-	WKC_NUM_ENTER   = 30,
-	WKC_NUM_DECIMAL = 31,
-
 	/* Space */
 	WKC_SPACE       = 32,
 
@@ -81,20 +93,35 @@
 	 * A-Z are mapped to 65-90
 	 * a-z are mapped to 97-122 */
 
-	/* Other keys, corresponding to their ascii values */
-	WKC_SLASH       = 47, ///< / Forward slash
-	WKC_SEMICOLON   = 59, ///< ; Semicolon
-	WKC_EQUALS      = 61, ///< = Equals
-	WKC_L_BRACKET   = 91, ///< [ Left square bracket
-	WKC_BACKSLASH   = 92, ///< \ Backslash
-	WKC_R_BRACKET   = 93, ///< ] Right square bracket
+	/* Numerical keyboard */
+	WKC_NUM_0       = 128,
+	WKC_NUM_1       = 129,
+	WKC_NUM_2       = 130,
+	WKC_NUM_3       = 131,
+	WKC_NUM_4       = 132,
+	WKC_NUM_5       = 133,
+	WKC_NUM_6       = 134,
+	WKC_NUM_7       = 135,
+	WKC_NUM_8       = 136,
+	WKC_NUM_9       = 137,
+	WKC_NUM_DIV     = 138,
+	WKC_NUM_MUL     = 139,
+	WKC_NUM_MINUS   = 140,
+	WKC_NUM_PLUS    = 141,
+	WKC_NUM_ENTER   = 142,
+	WKC_NUM_DECIMAL = 143,
 
-	/* Other keys of which their ascii value is already taken
-	 * - use unused ascii value not present on keyboard directly */
-	WKC_SINGLEQUOTE = 58, ///< ' Single quote
-	WKC_COMMA       = 60, ///< , Comma
-	WKC_PERIOD      = 62, ///< . Period
-	WKC_MINUS       = 95, ///< - Minus
+	/* Other keys */
+	WKC_SLASH       = 144, ///< / Forward slash
+	WKC_SEMICOLON   = 145, ///< ; Semicolon
+	WKC_EQUALS      = 146, ///< = Equals
+	WKC_L_BRACKET   = 147, ///< [ Left square bracket
+	WKC_BACKSLASH   = 148, ///< \ Backslash
+	WKC_R_BRACKET   = 149, ///< ] Right square bracket
+	WKC_SINGLEQUOTE = 150, ///< ' Single quote
+	WKC_COMMA       = 151, ///< , Comma
+	WKC_PERIOD      = 152, ///< . Period
+	WKC_MINUS       = 153, ///< - Minus
 };
 
 enum GameModes {
@@ -215,6 +242,16 @@
 void RedrawScreenRect(int left, int top, int right, int bottom);
 void GfxScroll(int left, int top, int width, int height, int xo, int yo);
 
+/**
+ * Used to only draw a part of the sprite.
+ * Draw the subsprite in the rect (sprite_x_offset + left, sprite_y_offset + top) to (sprite_x_offset + right, sprite_y_offset + bottom).
+ * Both corners are included in the drawing area.
+ */
+struct SubSprite {
+	int left, top, right, bottom;
+};
+
+void DrawSprite(SpriteID img, SpriteID pal, int x, int y, const SubSprite *sub = NULL);
 
 /* XXX doesn't really belong here, but the only
  * consumers always use it in conjunction with DoDrawString() */
@@ -241,14 +278,33 @@
 
 void GfxFillRect(int left, int top, int right, int bottom, int color);
 void GfxDrawLine(int left, int top, int right, int bottom, int color);
+void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);
 
 BoundingRect GetStringBoundingBox(const char *str);
 uint32 FormatStringLinebreaks(char *str, int maxw);
 void LoadStringWidthTable();
 void DrawStringMultiCenter(int x, int y, StringID str, int maxw);
 uint DrawStringMultiLine(int x, int y, StringID str, int maxw, int maxh = -1);
+
+/**
+ * Let the dirty blocks repainting by the video driver.
+ *
+ * @ingroup dirty
+ */
 void DrawDirtyBlocks();
+
+/**
+ * Set a new dirty block.
+ *
+ * @ingroup dirty
+ */
 void SetDirtyBlocks(int left, int top, int right, int bottom);
+
+/**
+ * Marks the whole screen as dirty.
+ *
+ * @ingroup dirty
+ */
 void MarkWholeScreenDirty();
 
 void GfxInitPalettes();
--- a/src/gfxinit.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/gfxinit.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -114,7 +114,8 @@
  * returns true if the checksum is correct */
 static bool FileMD5(const MD5File file, bool warn)
 {
-	FILE *f = FioFOpenFile(file.filename);
+	size_t size;
+	FILE *f = FioFOpenFile(file.filename, "rb", DATA_DIR, &size);
 
 	if (f != NULL) {
 		md5_state_t filemd5state;
@@ -123,11 +124,13 @@
 		size_t len;
 
 		md5_init(&filemd5state);
-		while ((len = fread(buffer, 1, sizeof(buffer), f)) != 0)
+		while ((len = fread(buffer, 1, (size > sizeof(buffer)) ? sizeof(buffer) : size, f)) != 0 && size != 0) {
+			size -= len;
 			md5_append(&filemd5state, buffer, len);
+		}
 
 		if (ferror(f) && warn) ShowInfoF("Error Reading from %s \n", file.filename);
-		fclose(f);
+		FioFCloseFile(f);
 
 		md5_finish(&filemd5state, digest);
 		return CheckMD5Digest(file, digest, warn);
@@ -381,6 +384,8 @@
 	assert(load_index == SPR_ONEWAY_BASE);
 	load_index += LoadGrfFile("oneway.grf", load_index, i++);
 
+	load_index++; // SPR_EMPTY_BOUNDING_BOX
+
 	assert(load_index == SPR_FLAGS_BASE);
 	load_index += LoadGrfFile("flags.grf", load_index, i++);
 
--- a/src/graph_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/graph_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -1006,13 +1006,7 @@
 				DrawStringRightAligned(107, y, SET_PERFORMANCE_DETAIL_INT, 0);
 
 				/* Calculate the %-bar */
-				if (val > needed) {
-					x = 50;
-				} else if (val == 0) {
-					x = 0;
-				} else {
-					x = val * 50 / needed;
-				}
+				x = clamp(val, 0, needed) * 50 / needed;
 
 				/* SCORE_LOAN is inversed */
 				if (val < 0 && i == SCORE_LOAN) x = 0;
@@ -1022,7 +1016,7 @@
 				if (x != 50) GfxFillRect(112 + x, y - 2, 112 + 50, y + 10, color_notdone);
 
 				/* Calculate the % */
-				x = (val <= needed) ? val * 100 / needed : 100;
+				x = clamp(val, 0, needed) * 100 / needed;
 
 				/* SCORE_LOAN is inversed */
 				if (val < 0 && i == SCORE_LOAN) x = 0;
--- a/src/group_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/group_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -354,7 +354,7 @@
  */
 void RemoveVehicleFromGroup(const Vehicle *v)
 {
-	if (!v->IsValid() || !(v->HasFront() && v->IsPrimaryVehicle())) return;
+	if (!v->IsValid() || !v->IsPrimaryVehicle()) return;
 
 	if (!IsDefaultGroupID(v->group_id)) DecreaseGroupNumVehicle(v->group_id);
 }
--- a/src/group_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/group_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -329,7 +329,7 @@
 			SetVScroll2Count(w, gv->l.list_length);
 
 			/* Disable all lists management button when the list is empty */
-			SetWindowWidgetsDisabledState(w, gv->l.list_length == 0,
+			SetWindowWidgetsDisabledState(w, gv->l.list_length == 0 || _local_player != owner,
 					GRP_WIDGET_STOP_ALL,
 					GRP_WIDGET_START_ALL,
 					GRP_WIDGET_MANAGE_VEHICLES,
@@ -337,12 +337,24 @@
 					WIDGET_LIST_END);
 
 			/* Disable the group specific function when we select the default group or all vehicles */
-			SetWindowWidgetsDisabledState(w, IsDefaultGroupID(gv->group_sel) || IsAllGroupID(gv->group_sel),
+			SetWindowWidgetsDisabledState(w, IsDefaultGroupID(gv->group_sel) || IsAllGroupID(gv->group_sel) || _local_player != owner,
 					GRP_WIDGET_DELETE_GROUP,
 					GRP_WIDGET_RENAME_GROUP,
 					GRP_WIDGET_REPLACE_PROTECTION,
 					WIDGET_LIST_END);
 
+			/* Disable remaining buttons for non-local player
+			 * Needed while changing _local_player, eg. by cheats
+			 * All procedures (eg. move vehicle to another group)
+			 *  verify, whether you are the owner of the vehicle,
+			 *  so it doesn't have to be disabled
+			 */
+			SetWindowWidgetsDisabledState(w, _local_player != owner,
+					GRP_WIDGET_CREATE_GROUP,
+					GRP_WIDGET_AVAILABLE_VEHICLES,
+					WIDGET_LIST_END);
+
+
 			/* If selected_group == DEFAULT_GROUP || ALL_GROUP, draw the standard caption
 			   We list all vehicles or ungrouped vehicles */
 			if (IsDefaultGroupID(gv->group_sel) || IsAllGroupID(gv->group_sel)) {
--- a/src/industry.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/industry.h	Sat Oct 06 21:16:00 2007 +0000
@@ -7,18 +7,19 @@
 
 #include "oldpool.h"
 #include "helpers.hpp"
+#include "newgrf_storage.h"
 
-typedef byte IndustryGfx;
+typedef uint16 IndustryGfx;
 typedef uint8 IndustryType;
 
 enum {
 	INVALID_INDUSTRY       = 0xFFFF,
 	NEW_INDUSTRYOFFSET     = 37,                         ///< original number of industries
-	NUM_INDUSTRYTYPES      = 37,                         ///< total number of industries, new and old
+	NUM_INDUSTRYTYPES      = 64,                         ///< 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
+	NUM_INDUSTRYTILES      = 512,                        ///< total number of industry tiles, new and old
 	INVALID_INDUSTRYTILE   = NUM_INDUSTRYTILES,          ///< one above amount is considered invalid
 	INDUSTRY_COMPLETED     = 3,                          ///< final stage of industry construction.
 };
@@ -81,6 +82,11 @@
 	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)
+	/* The following flags are only used for newindustries and do no represent any normal behaviour */
+	INDUSTRYBEH_PROD_MULTI_HNDLING    = 1 << 14, ///< Automatic production multiplier handling
+	INDUSTRYBEH_PRODCALLBACK_RANDOM   = 1 << 15, ///< Production callback needs random bits in var 10
+	INDUSTRYBEH_NOBUILT_MAPCREATION   = 1 << 16, ///< Do not force one instance of this type to appear on map generation
+	INDUSTRYBEH_CANCLOSE_LASTINSTANCE = 1 << 17, ///< Allow closing down the last instance of this type
 };
 
 
@@ -93,14 +99,18 @@
  * Defines the internal data of a functionnal industry
  */
 struct Industry : PoolItem<Industry, IndustryID, &_Industry_pool> {
+	typedef PersistentStorageArray<uint32, 16> PersistentStorage;
+
 	TileIndex xy;                       ///< coordinates of the primary tile the industry is built one
 	byte width;
 	byte height;
 	const Town *town;                   ///< Nearest town
+	CargoID produced_cargo[2];          ///< 2 production cargo slots
 	uint16 produced_cargo_waiting[2];   ///< amount of cargo produced per cargo
 	uint16 incoming_cargo_waiting[3];   ///< incoming cargo waiting to be processed
 	byte production_rate[2];            ///< production rate for each cargo
 	byte prod_level;                    ///< general production level
+	CargoID accepts_cargo[3];           ///< 3 input cargo slots
 	uint16 this_month_production[2];    ///< stats of this month's production per cargo
 	uint16 this_month_transported[2];   ///< stats of this month's transport per cargo
 	byte last_month_pct_transported[2]; ///< percentage transported per cargo in the last full month
@@ -120,6 +130,8 @@
 	Date last_cargo_accepted_at;        ///< Last day cargo was accepted by this industry
 	byte selected_layout;               ///< Which tile layout was used when creating the industry
 
+	PersistentStorage psa;              ///< Persistent storage for NewGRF industries.
+
 	Industry(TileIndex tile = 0) : xy(tile) {}
 	~Industry();
 
--- a/src/industry_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/industry_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -31,11 +31,13 @@
 #include "water_map.h"
 #include "tree_map.h"
 #include "cargotype.h"
+#include "newgrf.h"
 #include "newgrf_commons.h"
 #include "newgrf_industries.h"
 #include "newgrf_industrytiles.h"
 #include "newgrf_callbacks.h"
 #include "misc/autoptr.hpp"
+#include "autoslope.h"
 
 void ShowIndustryViewWindow(int industry);
 void BuildOilRig(TileIndex tile);
@@ -63,11 +65,16 @@
 
 	/* 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);
+		_industry_specs[i].enabled = i < NEW_INDUSTRYOFFSET &&
+				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));
+
+	/* Reset any overrides that have been set. */
+	_industile_mngr.ResetOverride();
+	_industry_mngr.ResetOverride();
 }
 
 void ResetIndustryCreationProbility(IndustryType type)
@@ -299,8 +306,8 @@
 			(HASBIT(image, PALETTE_MODIFIER_COLOR) && dits->building.pal == PAL_NONE) ? GENERAL_SPRITE_COLOR(ind->random_color) : dits->building.pal,
 			ti->x + dits->subtile_x,
 			ti->y + dits->subtile_y,
-			dits->width  + 1,
-			dits->height + 1,
+			dits->width,
+			dits->height,
 			dits->dz,
 			ti->z,
 			HASBIT(_transparent_opt, TO_INDUSTRIES));
@@ -355,7 +362,8 @@
 
 	for (byte i = 0; i < lengthof(itspec->accepts_cargo); i++) {
 		CargoID a = accepts_cargo[i];
-		if (a != CT_INVALID) ac[a] = acceptance[i];
+		/* Only set the value once. */
+		if (a != CT_INVALID && ac[a] == 0) ac[a] = acceptance[i];
 	}
 }
 
@@ -383,6 +391,7 @@
 	 */
 	if ((_current_player != OWNER_WATER && _game_mode != GM_EDITOR &&
 			!_cheats.magic_bulldozer.value) ||
+			((flags & DC_AUTO) != 0) ||
 			(_current_player == OWNER_WATER && (indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER))) {
 		SetDParam(0, indspec->name);
 		return_cmd_error(STR_4800_IN_THE_WAY);
@@ -407,7 +416,7 @@
 
 		i->this_month_production[0] += cw;
 
-		am = MoveGoodsToStation(i->xy, i->width, i->height, indspec->produced_cargo[0], cw);
+		am = MoveGoodsToStation(i->xy, i->width, i->height, i->produced_cargo[0], cw);
 		i->this_month_transported[0] += am;
 		if (am != 0 && !StartStopIndustryTileAnimation(i, IAT_INDUSTRY_DISTRIBUTES_CARGO)) {
 			uint newgfx = GetIndustryTileSpec(GetIndustryGfx(tile))->anim_production;
@@ -429,7 +438,7 @@
 
 		i->this_month_production[1] += cw;
 
-		am = MoveGoodsToStation(i->xy, i->width, i->height, indspec->produced_cargo[1], cw);
+		am = MoveGoodsToStation(i->xy, i->width, i->height, i->produced_cargo[1], cw);
 		i->this_month_transported[1] += am;
 	}
 }
@@ -817,7 +826,7 @@
 
 static void GetProducedCargo_Industry(TileIndex tile, CargoID *b)
 {
-	const IndustrySpec *i = GetIndustrySpec(GetIndustryByTile(tile)->type);
+	const Industry *i = GetIndustryByTile(tile);
 
 	b[0] = i->produced_cargo[0];
 	b[1] = i->produced_cargo[1];
@@ -1174,9 +1183,27 @@
 	return t;
 }
 
-static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable *it, int type, bool *custom_shape_check = NULL)
+bool IsSlopeRefused(Slope current, Slope refused)
+{
+	if (current != SLOPE_FLAT) {
+		if (refused & SLOPE_STEEP) return true;
+
+		Slope t = ComplementSlope(current);
+
+		if (refused & 1 && (t & SLOPE_NW)) return false;
+		if (refused & 2 && (t & SLOPE_NE)) return false;
+		if (refused & 4 && (t & SLOPE_SW)) return false;
+		if (refused & 8 && (t & SLOPE_SE)) return false;
+	}
+
+	return false;
+}
+
+static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable *it, uint itspec_index, int type, bool *custom_shape_check = NULL)
 {
 	_error_message = STR_0239_SITE_UNSUITABLE;
+	bool refused_slope = false;
+	bool custom_shape = false;
 
 	do {
 		IndustryGfx gfx = GetTranslatedIndustryTileID(it->gfx);
@@ -1196,12 +1223,13 @@
 			if (!EnsureNoVehicle(cur_tile)) return false;
 			if (MayHaveBridgeAbove(cur_tile) && IsBridgeAbove(cur_tile)) return false;
 
-			const IndustryTileSpec *its = GetIndustryTileSpec(it->gfx);
+			const IndustryTileSpec *its = GetIndustryTileSpec(gfx);
+
 			IndustyBehaviour ind_behav = GetIndustrySpec(type)->behaviour;
 
 			if (HASBIT(its->callback_flags, CBM_INDT_SHAPE_CHECK)) {
-				if (custom_shape_check != NULL) *custom_shape_check = true;
-				if (!PerformIndustryTileSlopeCheck(cur_tile, its, type, gfx)) return false;
+				custom_shape = true;
+				if (!PerformIndustryTileSlopeCheck(tile, cur_tile, its, type, gfx, itspec_index)) return false;
 			} else {
 				if (ind_behav & INDUSTRYBEH_BUILT_ONWATER) {
 					/* As soon as the tile is not water, bail out.
@@ -1216,24 +1244,7 @@
 					tileh = GetTileSlope(cur_tile, NULL);
 					if (IsSteepSlope(tileh)) return false;
 
-					if (_patches.land_generator != LG_TERRAGENESIS || !_generating_world) {
-						/* It is almost impossible to have a fully flat land in TG, so what we
-						*  do is that we check if we can make the land flat later on. See
-						*  CheckIfCanLevelIndustryPlatform(). */
-						if (tileh != SLOPE_FLAT) {
-							Slope t;
-							byte bits = its->slopes_refused;
-
-							if (bits & 0x10) return false;
-
-							t = ComplementSlope(tileh);
-
-							if (bits & 1 && (t & SLOPE_NW)) return false;
-							if (bits & 2 && (t & SLOPE_NE)) return false;
-							if (bits & 4 && (t & SLOPE_SW)) return false;
-							if (bits & 8 && (t & SLOPE_SE)) return false;
-						}
-					}
+					refused_slope |= IsSlopeRefused(tileh, its->slopes_refused);
 				}
 			}
 
@@ -1249,7 +1260,12 @@
 		}
 	} while ((++it)->ti.x != -0x80);
 
-	return true;
+	if (custom_shape_check != NULL) *custom_shape_check = custom_shape;
+
+	/* It is almost impossible to have a fully flat land in TG, so what we
+	 *  do is that we check if we can make the land flat later on. See
+	 *  CheckIfCanLevelIndustryPlatform(). */
+	return !refused_slope || (_patches.land_generator == LG_TERRAGENESIS && _generating_world && !custom_shape);
 }
 
 static bool CheckIfIndustryIsAllowed(TileIndex tile, int type, const Town *t)
@@ -1315,6 +1331,7 @@
 
 	/* Finds dimensions of largest variant of this industry */
 	do {
+		if (it->gfx == 0xFF) continue;  //  FF been a marquer for a check on clear water, skip it
 		if (it->ti.x > max_x) max_x = it->ti.x;
 		if (it->ti.y > max_y) max_y = it->ti.y;
 	} while ((++it)->ti.x != MKEND);
@@ -1331,15 +1348,26 @@
 	/* Check if we don't leave the map */
 	if (TileX(cur_tile) == 0 || TileY(cur_tile) == 0 || TileX(cur_tile) + size_x >= MapMaxX() || TileY(cur_tile) + size_y >= MapMaxY()) return false;
 
+	/* _current_player is OWNER_NONE for randomly generated industries and in editor, or the player who funded or prospected the industry.
+	 * Perform terraforming as OWNER_TOWN to disable autoslope. */
+	PlayerID old_player = _current_player;
+	_current_player = OWNER_TOWN;
+
 	BEGIN_TILE_LOOP(tile_walk, size_x, size_y, cur_tile) {
 		curh = TileHeight(tile_walk);
 		if (curh != h) {
 			/* This tile needs terraforming. Check if we can do that without
 			 *  damaging the surroundings too much. */
-			if (!CheckCanTerraformSurroundingTiles(tile_walk, h, 0)) return false;
+			if (!CheckCanTerraformSurroundingTiles(tile_walk, h, 0)) {
+				_current_player = old_player;
+				return false;
+			}
 			/* This is not 100% correct check, but the best we can do without modifying the map.
 			 *  What is missing, is if the difference in height is more than 1.. */
-			if (CmdFailed(DoCommand(tile_walk, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND))) return false;
+			if (CmdFailed(DoCommand(tile_walk, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND))) {
+				_current_player = old_player;
+				return false;
+			}
 		}
 	} END_TILE_LOOP(tile_walk, size_x, size_y, cur_tile)
 
@@ -1357,6 +1385,7 @@
 		} END_TILE_LOOP(tile_walk, size_x, size_y, cur_tile)
 	}
 
+	_current_player = old_player;
 	return true;
 }
 
@@ -1374,7 +1403,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] == GetIndustrySpec(i->type)->accepts_cargo[0] && (
+				indspec->accepts_cargo[0] == i->accepts_cargo[0] && (
 					_game_mode != GM_EDITOR ||
 					!_patches.same_industry_close ||
 					!_patches.multiple_industry_per_town
@@ -1397,17 +1426,23 @@
 {
 	const IndustrySpec *indspec = GetIndustrySpec(type);
 	uint32 r;
-	int j;
+	uint j;
 
 	i->xy = tile;
 	i->width = i->height = 0;
 	i->type = type;
 	IncIndustryTypeCount(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];
 
-	if (_patches.smooth_economy) {
+	/* don't use smooth economy for industries using production callbacks */
+	if (_patches.smooth_economy  && !(HASBIT(indspec->callback_flags, CBM_IND_PRODUCTION_256_TICKS) || HASBIT(indspec->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL))) {
 		i->production_rate[0] = min((RandomRange(256) + 128) * i->production_rate[0] >> 8 , 255);
 		i->production_rate[1] = min((RandomRange(256) + 128) * i->production_rate[1] >> 8 , 255);
 	}
@@ -1436,6 +1471,30 @@
 	i->last_month_production[0] = i->production_rate[0] * 8;
 	i->last_month_production[1] = i->production_rate[1] * 8;
 	i->founder = _current_player;
+
+	if (HASBIT(indspec->callback_flags, CBM_IND_DECIDE_COLOUR)) {
+		uint16 res = GetIndustryCallback(CBID_INDUSTRY_DECIDE_COLOUR, 0, 0, i, type, INVALID_TILE);
+		if (res != CALLBACK_FAILED) i->random_color = GB(res, 0, 4);
+	}
+
+	if (HASBIT(indspec->callback_flags, CBM_IND_INPUT_CARGO_TYPES)) {
+		for (j = 0; j < lengthof(i->accepts_cargo); j++) i->accepts_cargo[j] = CT_INVALID;
+		for (j = 0; j < lengthof(i->accepts_cargo); j++) {
+			uint16 res = GetIndustryCallback(CBID_INDUSTRY_INPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE);
+			if (res == CALLBACK_FAILED || GB(res, 0, 8) == CT_INVALID) break;
+			i->accepts_cargo[j] = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile);
+		}
+	}
+
+	if (HASBIT(indspec->callback_flags, CBM_IND_OUTPUT_CARGO_TYPES)) {
+		for (j = 0; j < lengthof(i->produced_cargo); j++) i->produced_cargo[j] = CT_INVALID;
+		for (j = 0; j < lengthof(i->produced_cargo); j++) {
+			uint16 res = GetIndustryCallback(CBID_INDUSTRY_OUTPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE);
+			if (res == CALLBACK_FAILED || GB(res, 0, 8) == CT_INVALID) break;
+			i->produced_cargo[j] = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile);
+		}
+	}
+
 	i->construction_date = _date;
 	i->construction_type = (_game_mode == GM_EDITOR) ? ICT_SCENARIO_EDITOR :
 			(_generating_world ? ICT_MAP_GENERATION : ICT_NORMAL_GAMEPLAY);
@@ -1493,7 +1552,7 @@
 	const IndustryTileTable *it = indspec->table[itspec_index];
 	bool custom_shape_check = false;
 
-	if (!CheckIfIndustryTilesAreFree(tile, it, type, &custom_shape_check)) return NULL;
+	if (!CheckIfIndustryTilesAreFree(tile, it, itspec_index, type, &custom_shape_check)) return NULL;
 
 	if (HASBIT(GetIndustrySpec(type)->callback_flags, CBM_IND_LOCATION)) {
 		if (!CheckIfCallBackAllowsCreation(tile, type, itspec_index)) return NULL;
@@ -1534,7 +1593,6 @@
 {
 	int num;
 	const IndustryTileTable * const *itt;
-	const IndustryTileTable *it;
 	const IndustrySpec *indspec;
 
 	SET_EXPENSES_TYPE(EXPENSES_OTHER);
@@ -1578,7 +1636,7 @@
 
 		do {
 			if (--num < 0) return_cmd_error(STR_0239_SITE_UNSUITABLE);
-		} while (!CheckIfIndustryTilesAreFree(tile, it = itt[num], p1));
+		} while (!CheckIfIndustryTilesAreFree(tile, itt[num], num, p1));
 
 		if (CreateNewIndustryHelper(tile, p1, flags, indspec, num) == NULL) return CMD_ERROR;
 	}
@@ -1692,84 +1750,13 @@
 	}
 }
 
-/** Change industry production or do closure
- * @param i Industry for which changes are performed
- */
-static void ExtChangeIndustryProduction(Industry *i)
-{
-	bool closeit = true;
-	int j;
-	const IndustrySpec *indspec = GetIndustrySpec(i->type);
-
-	if (indspec->life_type == INDUSTRYLIFE_BLACK_HOLE) return;
-
-	if ((indspec->life_type & (INDUSTRYLIFE_ORGANIC | INDUSTRYLIFE_EXTRACTIVE)) != 0) {
-		for (j = 0; j < 2 && indspec->produced_cargo[j] != CT_INVALID; j++){
-			uint32 r = Random();
-			int old_prod, new_prod, percent;
-			int mag;
-
-			new_prod = old_prod = i->production_rate[j];
-
-			if (CHANCE16I(20, 1024, r)) new_prod -= max(((RandomRange(50) + 10) * old_prod) >> 8, 1U);
-			/* Chance of increasing becomes better when more is transported */
-			if (CHANCE16I(20 + (i->last_month_pct_transported[j] * 20 >> 8), 1024, r >> 16) &&
-					((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) == 0 || _opt.landscape != LT_TEMPERATE)) {
-				new_prod += max(((RandomRange(50) + 10) * old_prod) >> 8, 1U);
-			}
-
-			new_prod = clamp(new_prod, 1, 255);
-			/* Do not stop closing the industry when it has the lowest possible production rate */
-			if (new_prod == old_prod && old_prod > 1) {
-				closeit = false;
-				continue;
-			}
-
-			percent = (old_prod == 0) ? 100 : (new_prod * 100 / old_prod - 100);
-			i->production_rate[j] = new_prod;
-
-			/* Close the industry when it has the lowest possible production rate */
-			if (new_prod > 1) closeit = false;
-
-			mag = abs(percent);
-			if (mag >= 10) {
-				SetDParam(2, mag);
-				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),
-					i->xy + TileDiffXY(1, 1), 0
-				);
-			}
-		}
-	}
-
-	if ((indspec->life_type & INDUSTRYLIFE_PROCESSING) != 0) {
-		if ((byte)(_cur_year - i->last_prod_year) < 5 || !CHANCE16(1, 180)) closeit = false;
-	}
-
-	/* If industry will be closed down, show this */
-	if (closeit) {
-		i->prod_level = 0;
-		SetDParam(0, i->index);
-		AddNewsItem(
-			indspec->closure_text,
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0),
-			i->xy + TileDiffXY(1, 1), 0
-		);
-	}
-}
-
-
 static void UpdateIndustryStatistics(Industry *i)
 {
 	byte pct;
 	bool refresh = false;
-	const IndustrySpec *indsp = GetIndustrySpec(i->type);
 
-	for (byte j = 0; j < lengthof(indsp->produced_cargo); j++) {
-		if (indsp->produced_cargo[j] != CT_INVALID) {
+	for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
+		if (i->produced_cargo[j] != CT_INVALID) {
 			pct = 0;
 			if (i->this_month_production[j] != 0) {
 				i->last_prod_year = _cur_year;
@@ -1786,14 +1773,7 @@
 		}
 	}
 
-	if (refresh)
-		InvalidateWindow(WC_INDUSTRY_VIEW, i->index);
-
-	if (i->prod_level == 0) {
-		delete i;
-	} else if (_patches.smooth_economy) {
-		ExtChangeIndustryProduction(i);
-	}
+	if (refresh) InvalidateWindow(WC_INDUSTRY_VIEW, i->index);
 }
 
 /** Simple helper that will collect data for the generation of industries */
@@ -1854,68 +1834,160 @@
 		NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0), ind->xy, 0);
 }
 
-static void ChangeIndustryProduction(Industry *i)
+/**
+ * Protects an industry from closure if the appropriate flags and conditions are met
+ * INDUSTRYBEH_CANCLOSE_LASTINSTANCE must be set (which, by default, it is not) and the
+ * count of industries of this type must one (or lower) in order to be protected
+ * against closure.
+ * @param type IndustryType been queried
+ * @result true if protection is on, false otherwise (except for oil wells)
+ */
+static bool CheckIndustryCloseDownProtection(IndustryType type)
 {
-	StringID str = STR_NULL;
-	int type = i->type;
 	const IndustrySpec *indspec = GetIndustrySpec(type);
 
-	if (indspec->life_type == INDUSTRYLIFE_BLACK_HOLE) return;
-
-	if ((indspec->life_type & (INDUSTRYLIFE_ORGANIC | INDUSTRYLIFE_EXTRACTIVE)) != 0) {
-		bool only_decrease = false;
-
-		/* decrease or increase */
-		if ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _opt.landscape == LT_TEMPERATE)
-			only_decrease = true;
-
-		if (only_decrease || CHANCE16(1, 3)) {
-			/* If you transport > 60%, 66% chance we increase, else 33% chance we increase */
-			if (!only_decrease && (i->last_month_pct_transported[0] > 153) != CHANCE16(1, 3)) {
-				/* Increase production */
-				if (i->prod_level != 0x80) {
-					byte b;
-
-					i->prod_level <<= 1;
+	/* oil wells (or the industries with that flag set) are always allowed to closedown */
+	if (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD && _opt.landscape == LT_TEMPERATE) return false;
+	return (indspec->behaviour & INDUSTRYBEH_CANCLOSE_LASTINSTANCE && GetIndustryTypeCount(type) <= 1);
+}
 
-					b = i->production_rate[0] * 2;
-					if (i->production_rate[0] >= 128)
-						b = 0xFF;
-					i->production_rate[0] = b;
-
-					b = i->production_rate[1] * 2;
-					if (i->production_rate[1] >= 128)
-						b = 0xFF;
-					i->production_rate[1] = b;
+/** Change industry production or do closure
+ * @param i Industry for which changes are performed
+ * @param monthly true if it's the monthly call, false if it's the random call
+ */
+static void ChangeIndustryProduction(Industry *i, bool monthly)
+{
+	extern StringID MapGRFStringID(uint32 grfid, StringID str);
+	StringID str = STR_NULL;
+	bool closeit = false;
+	const IndustrySpec *indspec = GetIndustrySpec(i->type);
+	bool standard = true;
+	bool suppress_message = false;
+	/* don't use smooth economy for industries using production callbacks */
+	bool smooth_economy = _patches.smooth_economy && !(HASBIT(indspec->callback_flags, CBM_IND_PRODUCTION_256_TICKS) || HASBIT(indspec->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL));
+	byte div = 0;
+	byte mul = 0;
 
-					str = indspec->production_up_text;
+	if (HASBIT(indspec->callback_flags, monthly ? CBM_IND_MONTHLYPROD_CHANGE : CBM_IND_PRODUCTION_CHANGE)) {
+		uint16 res = GetIndustryCallback(monthly ? CBID_INDUSTRY_MONTHLYPROD_CHANGE : CBID_INDUSTRY_PRODUCTION_CHANGE, 0, Random(), i, i->type, i->xy);
+		if (res != CALLBACK_FAILED) {
+			standard = false;
+			suppress_message = HASBIT(res, 7);
+			/* Get the custom message if any */
+			if (HASBIT(res, 8)) str = MapGRFStringID(indspec->grf_prop.grffile->grfid, GB(GetRegister(0x100), 0, 16));
+			res = GB(res, 0, 4);
+			switch(res) {
+				default: NOT_REACHED();
+				case 0x0: break;                  // Do nothing, but show the custom message if any
+				case 0x1: div = 1; break;         // Halve industry production. If production reaches the quarter of the default, the industry is closed instead.
+				case 0x2: mul = 1; break;         // Double industry production if it hasn't reached eight times of the original yet.
+				case 0x3: closeit = true; break;  // The industry announces imminent closure, and is physically removed from the map next month.
+				case 0x4: standard = true; break; // Do the standard random production change as if this industry was a primary one.
+				case 0x5: case 0x6: case 0x7:     // Divide production by 4, 8, 16
+				case 0x8: div = res - 0x5; break; // Divide production by 32
+				case 0x9: case 0xA: case 0xB:     // Multiply production by 4, 8, 16
+				case 0xC: mul = res - 0x9; break; // Multiply production by 32
+			}
+		}
+	}
+
+	if (standard && monthly != smooth_economy) return;
+
+	if (standard && indspec->life_type == INDUSTRYLIFE_BLACK_HOLE) return;
+
+	if (standard && (indspec->life_type & (INDUSTRYLIFE_ORGANIC | INDUSTRYLIFE_EXTRACTIVE)) != 0) {
+		/* decrease or increase */
+		bool only_decrease = (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _opt.landscape == LT_TEMPERATE;
+
+		if (smooth_economy) {
+			closeit = true;
+			for (byte j = 0; j < 2 && i->produced_cargo[j] != CT_INVALID; j++){
+				uint32 r = Random();
+				int old_prod, new_prod, percent;
+				int mag;
+
+				new_prod = old_prod = i->production_rate[j];
+
+				if (CHANCE16I(20, 1024, r)) new_prod -= max(((RandomRange(50) + 10) * old_prod) >> 8, 1U);
+				/* Chance of increasing becomes better when more is transported */
+				if (CHANCE16I(20 + (i->last_month_pct_transported[j] * 20 >> 8), 1024, r >> 16) && !only_decrease) {
+					new_prod += max(((RandomRange(50) + 10) * old_prod) >> 8, 1U);
 				}
-			} else {
-				/* Decrease production */
-				if (i->prod_level == 4) {
-					i->prod_level = 0;
-					str = indspec->closure_text;
+
+				new_prod = clamp(new_prod, 1, 255);
+				/* Do not stop closing the industry when it has the lowest possible production rate */
+				if (new_prod == old_prod && old_prod > 1) {
+					closeit = false;
+					continue;
+				}
+
+				percent = (old_prod == 0) ? 100 : (new_prod * 100 / old_prod - 100);
+				i->production_rate[j] = new_prod;
+
+				/* Close the industry when it has the lowest possible production rate */
+				if (new_prod > 1) closeit = false;
+
+				mag = abs(percent);
+				if (mag >= 10) {
+					SetDParam(2, mag);
+					SetDParam(0, GetCargo(i->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),
+						i->xy + TileDiffXY(1, 1), 0
+					);
+				}
+			}
+		} else {
+			if (only_decrease || CHANCE16(1, 3)) {
+				/* If you transport > 60%, 66% chance we increase, else 33% chance we increase */
+				if (!only_decrease && (i->last_month_pct_transported[0] > 153) != CHANCE16(1, 3)) {
+					mul = 1; // Increase production
 				} else {
-					i->prod_level >>= 1;
-					i->production_rate[0] = (i->production_rate[0] + 1) >> 1;
-					i->production_rate[1] = (i->production_rate[1] + 1) >> 1;
-
-					str = indspec->production_down_text;
+					div = 1; // Decrease production
 				}
 			}
 		}
 	}
-	if (indspec->life_type & INDUSTRYLIFE_PROCESSING) {
-		/* maybe close */
-		if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, 2)) {
-			i->prod_level = 0;
-			str = indspec->closure_text;
+
+	if (standard && indspec->life_type & INDUSTRYLIFE_PROCESSING) {
+		if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, smooth_economy ? 180 : 2)) {
+			closeit = true;
 		}
 	}
 
-	if (str != STR_NULL) {
+	/* Increase if needed */
+	while (mul-- != 0 && i->prod_level < 0x80) {
+		i->prod_level <<= 1;
+		i->production_rate[0] = min(i->production_rate[0] * 2, 0xFF);
+		i->production_rate[1] = min(i->production_rate[1] * 2, 0xFF);
+		if (str == STR_NULL) str = indspec->production_up_text;
+	}
+
+	/* Decrease if needed */
+	while (div-- != 0 && !closeit) {
+		if (i->prod_level == 4) {
+			closeit = true;
+		} else {
+			i->prod_level >>= 1;
+			i->production_rate[0] = (i->production_rate[0] + 1) >> 1;
+			i->production_rate[1] = (i->production_rate[1] + 1) >> 1;
+			if (str == STR_NULL) str = indspec->production_down_text;
+		}
+	}
+
+	/* Close if needed and allowed */
+	if (closeit && !CheckIndustryCloseDownProtection(i->type)) {
+		i->prod_level = 0;
+		str = indspec->closure_text;
+	}
+
+	if (!suppress_message && 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, closeit ? NT_OPENCLOSE : NT_ECONOMY, 0),
+			i->xy + TileDiffXY(1, 1), 0);
 	}
 }
 
@@ -1927,14 +1999,19 @@
 
 	FOR_ALL_INDUSTRIES(i) {
 		UpdateIndustryStatistics(i);
+		if (i->prod_level == 0) {
+			delete i;
+		} else {
+			ChangeIndustryProduction(i, true);
+		}
 	}
 
 	/* 3% chance that we start a new industry */
 	if (CHANCE16(3, 100)) {
 		MaybeNewIndustry();
-	} else if (!_patches.smooth_economy) {
+	} else {
 		i = GetRandomIndustry();
-		if (i != NULL) ChangeIndustryProduction(i);
+		if (i != NULL) ChangeIndustryProduction(i, false);
 	}
 
 	_current_player = old_player;
@@ -1973,7 +2050,31 @@
 
 static CommandCost TerraformTile_Industry(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
 {
-	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); // funny magic bulldozer
+	if (AutoslopeEnabled()) {
+		/* We imitate here TTDP's behaviour:
+		 *  - Both new and old slope must not be steep.
+		 *  - TileMaxZ must not be changed.
+		 *  - Allow autoslope by default.
+		 *  - Disallow autoslope if callback succeeds and returns non-zero.
+		 */
+		Slope tileh_old = GetTileSlope(tile, NULL);
+		/* TileMaxZ must not be changed. Slopes must not be steep. */
+		if (!IsSteepSlope(tileh_old) && !IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) {
+			const IndustryGfx gfx = GetIndustryGfx(tile);
+			const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
+
+			/* Call callback 3C 'disable autosloping for industry tiles'. */
+			if (HASBIT(itspec->callback_flags, CBM_INDT_AUTOSLOPE)) {
+				/* If the callback fails, allow autoslope. */
+				uint16 res = GetIndustryTileCallback(CBID_INDUSTRY_AUTOSLOPE, 0, 0, gfx, GetIndustryByTile(tile), tile);
+				if ((res == 0) || (res == CALLBACK_FAILED)) return _price.terraform;
+			} else {
+				// allow autoslope
+				return _price.terraform;
+			}
+		}
+	}
+	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 }
 
 extern const TileTypeProcs _tile_type_industry_procs = {
@@ -2000,10 +2101,12 @@
 	    SLE_VAR(Industry, height,                     SLE_UINT8),
 	    SLE_REF(Industry, town,                       REF_TOWN),
 	SLE_CONDNULL( 2, 2, 60),       ///< used to be industry's produced_cargo
+	SLE_CONDARR(Industry, produced_cargo,             SLE_UINT8,  2,              78, SL_MAX_VERSION),
 	SLE_CONDARR(Industry, incoming_cargo_waiting,     SLE_UINT16, 3,              70, SL_MAX_VERSION),
 	    SLE_ARR(Industry, produced_cargo_waiting,     SLE_UINT16, 2),
 	    SLE_ARR(Industry, production_rate,            SLE_UINT8,  2),
 	SLE_CONDNULL( 3, 2, 60),       ///< used to be industry's accepts_cargo
+	SLE_CONDARR(Industry, accepts_cargo,              SLE_UINT8,  3,              78, SL_MAX_VERSION),
 	    SLE_VAR(Industry, prod_level,                 SLE_UINT8),
 	    SLE_ARR(Industry, this_month_production,      SLE_UINT16, 2),
 	    SLE_ARR(Industry, this_month_transported,     SLE_UINT16, 2),
@@ -2020,12 +2123,14 @@
 	SLE_CONDVAR(Industry, last_prod_year,             SLE_INT32,                 31, SL_MAX_VERSION),
 	    SLE_VAR(Industry, was_cargo_delivered,        SLE_UINT8),
 
-	SLE_CONDVAR(Industry, owner,                      SLE_UINT8,                 70, SL_MAX_VERSION),
+	SLE_CONDVAR(Industry, founder,                    SLE_UINT8,                 70, SL_MAX_VERSION),
 	SLE_CONDVAR(Industry, construction_date,          SLE_INT32,                 70, SL_MAX_VERSION),
 	SLE_CONDVAR(Industry, construction_type,          SLE_UINT8,                 70, SL_MAX_VERSION),
 	SLE_CONDVAR(Industry, last_cargo_accepted_at,     SLE_INT32,                 70, SL_MAX_VERSION),
 	SLE_CONDVAR(Industry, selected_layout,            SLE_UINT8,                 73, SL_MAX_VERSION),
 
+	SLE_CONDARRX(cpp_offsetof(Industry, psa) + cpp_offsetof(Industry::PersistentStorage, storage), SLE_UINT32, 16, 76, SL_MAX_VERSION),
+
 	/* reserve extra space in savegame here. (currently 32 bytes) */
 	SLE_CONDNULL(32, 2, SL_MAX_VERSION),
 
--- a/src/industry_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/industry_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -118,7 +118,7 @@
 				indsp = GetIndustrySpec(ind);
 				if (indsp->enabled && (!indsp->IsRawIndustry() || _game_mode == GM_EDITOR)) {
 					_fund_gui.index[_fund_gui.count] = ind;
-					_fund_gui.enabled[_fund_gui.count] = CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
+					_fund_gui.enabled[_fund_gui.count] = (_game_mode == GM_EDITOR) || CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
 					_fund_gui.count++;
 				}
 			}
@@ -128,7 +128,7 @@
 					indsp = GetIndustrySpec(ind);
 					if (indsp->enabled && indsp->IsRawIndustry()) {
 						_fund_gui.index[_fund_gui.count] = ind;
-						_fund_gui.enabled[_fund_gui.count] = CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
+						_fund_gui.enabled[_fund_gui.count] = (_game_mode == GM_EDITOR) || CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
 						_fund_gui.count++;
 					}
 				}
@@ -390,9 +390,8 @@
 
 static inline bool IsProductionAlterable(const Industry *i)
 {
-	const IndustrySpec *ind = GetIndustrySpec(i->type);
 	return ((_game_mode == GM_EDITOR || _cheats.setup_prod.value) &&
-			(ind->accepts_cargo[0] == CT_INVALID || ind->accepts_cargo[0] == CT_VALUABLES));
+			(i->accepts_cargo[0] == CT_INVALID || i->accepts_cargo[0] == CT_VALUABLES));
 }
 
 /** Information to store about the industry window */
@@ -410,21 +409,22 @@
 	switch (e->event) {
 	case WE_CREATE: {
 		/* Count the number of lines that we need to resize the GUI with */
-		const IndustrySpec *ind = GetIndustrySpec(GetIndustry(w->window_number)->type);
+		const Industry *i = GetIndustry(w->window_number);
+		const IndustrySpec *ind = GetIndustrySpec(i->type);
 		int lines = -3;
 
 		if (HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) {
-			for (uint j = 0; j < 3 && ind->accepts_cargo[j] != CT_INVALID; j++) {
+			for (uint j = 0; j < lengthof(i->accepts_cargo) && i->accepts_cargo[j] != CT_INVALID; j++) {
 				if (j == 0) lines++;
 				lines++;
 			}
-		} else if (ind->accepts_cargo[0] != CT_INVALID) {
+		} else if (i->accepts_cargo[0] != CT_INVALID) {
 			lines++;
 		}
 
-		for (uint j = 0; j < 2 && ind->produced_cargo[j] != CT_INVALID; j++) {
+		for (uint j = 0; j < lengthof(i->produced_cargo) && i->produced_cargo[j] != CT_INVALID; j++) {
 			if (j == 0) {
-				if (ind->accepts_cargo[0] != CT_INVALID) lines++;
+				if (i->accepts_cargo[0] != CT_INVALID) lines++;
 				lines++;
 			}
 			lines++;
@@ -448,26 +448,26 @@
 		DrawWindowWidgets(w);
 
 		if (HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) {
-			for (uint j = 0; j < 3 && ind->accepts_cargo[j] != CT_INVALID; j++) {
+			for (uint j = 0; j < lengthof(i->accepts_cargo) && i->accepts_cargo[j] != CT_INVALID; j++) {
 				if (j == 0) {
 					DrawString(2, y, STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING, 0);
 					y += 10;
 				}
-				SetDParam(0, ind->accepts_cargo[j]);
+				SetDParam(0, i->accepts_cargo[j]);
 				SetDParam(1, i->incoming_cargo_waiting[j]);
 				DrawString(4, y, STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO, 0);
 				y += 10;
 			}
-		} else if (ind->accepts_cargo[0] != CT_INVALID) {
+		} else if (i->accepts_cargo[0] != CT_INVALID) {
 			StringID str;
 
-			SetDParam(0, GetCargo(ind->accepts_cargo[0])->name);
+			SetDParam(0, GetCargo(i->accepts_cargo[0])->name);
 			str = STR_4827_REQUIRES;
-			if (ind->accepts_cargo[1] != CT_INVALID) {
-				SetDParam(1, GetCargo(ind->accepts_cargo[1])->name);
+			if (i->accepts_cargo[1] != CT_INVALID) {
+				SetDParam(1, GetCargo(i->accepts_cargo[1])->name);
 				str = STR_4828_REQUIRES;
-				if (ind->accepts_cargo[2] != CT_INVALID) {
-					SetDParam(2, GetCargo(ind->accepts_cargo[2])->name);
+				if (i->accepts_cargo[2] != CT_INVALID) {
+					SetDParam(2, GetCargo(i->accepts_cargo[2])->name);
 					str = STR_4829_REQUIRES;
 				}
 			}
@@ -475,15 +475,15 @@
 			y += 10;
 		}
 
-		for (uint j = 0; j < 2 && ind->produced_cargo[j] != CT_INVALID; j++) {
+		for (uint j = 0; j < lengthof(i->produced_cargo) && i->produced_cargo[j] != CT_INVALID; j++) {
 			if (j == 0) {
-				if (ind->accepts_cargo[0] != CT_INVALID) y += 10;
+				if (i->accepts_cargo[0] != CT_INVALID) y += 10;
 				DrawString(2, y, STR_482A_PRODUCTION_LAST_MONTH, 0);
 				y += 10;
 				WP(w, indview_d).production_offset_y = y;
 			}
 
-			SetDParam(0, ind->produced_cargo[j]);
+			SetDParam(0, i->produced_cargo[j]);
 			SetDParam(1, i->last_month_production[j]);
 
 			SetDParam(2, i->last_month_pct_transported[j] * 100 >> 8);
@@ -503,7 +503,10 @@
 				StringID message = GetGRFStringID(ind->grf_prop.grffile->grfid, 0xD000 + callback_res);
 				if (message != STR_NULL && message != STR_UNDEFINED) {
 					y += 10;
+
+					PrepareTextRefStackUsage();
 					DrawString(2, y, message, 0);
+					StopTextRefStackUsage();
 				}
 			}
 		}
@@ -524,8 +527,7 @@
 			if (!IsProductionAlterable(i)) return;
 			x = e->we.click.pt.x;
 			line = (e->we.click.pt.y - WP(w, indview_d).production_offset_y) / 10;
-			if (e->we.click.pt.y >= WP(w, indview_d).production_offset_y && IS_INT_INSIDE(line, 0, 2) &&
-					GetIndustrySpec(i->type)->produced_cargo[line] != CT_INVALID) {
+			if (e->we.click.pt.y >= WP(w, indview_d).production_offset_y && IS_INT_INSIDE(line, 0, 2) && i->produced_cargo[line] != CT_INVALID) {
 				if (IS_INT_INSIDE(x, 5, 25) ) {
 					/* Clicked buttons, decrease or increase production */
 					if (x < 15) {
@@ -576,10 +578,8 @@
 
 static void UpdateIndustryProduction(Industry *i)
 {
-	const IndustrySpec *ind = GetIndustrySpec(i->type);
-
-	for (byte j = 0; j < lengthof(ind->produced_cargo); j++) {
-		if (ind->produced_cargo[j] != CT_INVALID) {
+	for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
+		if (i->produced_cargo[j] != CT_INVALID) {
 			i->last_month_production[j] = 8 * i->production_rate[j];
 		}
 	}
@@ -652,8 +652,6 @@
 {
 	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) {
@@ -667,10 +665,10 @@
 			break;
 
 		case 2: /* Sort by Production */
-			if (ind_i->produced_cargo[0] == CT_INVALID) {
-				r = (ind_j->produced_cargo[0] == CT_INVALID ? 0 : -1);
+			if (i->produced_cargo[0] == CT_INVALID) {
+				r = (j->produced_cargo[0] == CT_INVALID ? 0 : -1);
 			} else {
-				if (ind_j->produced_cargo[0] == CT_INVALID) {
+				if (j->produced_cargo[0] == CT_INVALID) {
 					r = 1;
 				} else {
 					r =
@@ -681,23 +679,23 @@
 			break;
 
 		case 3: /* Sort by transported fraction */
-			if (ind_i->produced_cargo[0] == CT_INVALID) {
-				r = (ind_j->produced_cargo[0] == CT_INVALID ? 0 : -1);
+			if (i->produced_cargo[0] == CT_INVALID) {
+				r = (j->produced_cargo[0] == CT_INVALID ? 0 : -1);
 			} else {
-				if (ind_j->produced_cargo[0] == CT_INVALID) {
+				if (j->produced_cargo[0] == CT_INVALID) {
 					r = 1;
 				} else {
 					int pi;
 					int pj;
 
 					pi = i->last_month_pct_transported[0] * 100 >> 8;
-					if (ind_i->produced_cargo[1] != CT_INVALID) {
+					if (i->produced_cargo[1] != CT_INVALID) {
 						int p = i->last_month_pct_transported[1] * 100 >> 8;
 						if (p < pi) pi = p;
 					}
 
 					pj = j->last_month_pct_transported[0] * 100 >> 8;
-					if (ind_j->produced_cargo[1] != CT_INVALID) {
+					if (j->produced_cargo[1] != CT_INVALID) {
 						int p = j->last_month_pct_transported[1] * 100 >> 8;
 						if (p < pj) pj = p;
 					}
@@ -778,15 +776,14 @@
 
 		while (p < _num_industry_sort) {
 			const Industry* i = _industry_sort[p];
-			const IndustrySpec *ind = GetIndustrySpec(i->type);
 
 			SetDParam(0, i->index);
-			if (ind->produced_cargo[0] != CT_INVALID) {
-				SetDParam(1, ind->produced_cargo[0]);
+			if (i->produced_cargo[0] != CT_INVALID) {
+				SetDParam(1, i->produced_cargo[0]);
 				SetDParam(2, i->last_month_production[0]);
 
-				if (ind->produced_cargo[1] != CT_INVALID) {
-					SetDParam(3, ind->produced_cargo[1]);
+				if (i->produced_cargo[1] != CT_INVALID) {
+					SetDParam(3, i->produced_cargo[1]);
 					SetDParam(4, i->last_month_production[1]);
 					SetDParam(5, i->last_month_pct_transported[0] * 100 >> 8);
 					SetDParam(6, i->last_month_pct_transported[1] * 100 >> 8);
--- a/src/industry_map.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/industry_map.h	Sat Oct 06 21:16:00 2007 +0000
@@ -109,7 +109,7 @@
 static inline byte GetIndustryConstructionStage(TileIndex tile)
 {
 	assert(IsTileType(tile, MP_INDUSTRY));
-	return GB(_m[tile].m1, 0, 2);
+	return IsIndustryCompleted(tile) ? (byte)INDUSTRY_COMPLETED : GB(_m[tile].m1, 0, 2);
 }
 
 /**
@@ -124,6 +124,12 @@
 	SB(_m[tile].m1, 0, 2, value);
 }
 
+static inline IndustryGfx GetCleanIndustryGfx(TileIndex t)
+{
+	assert(IsTileType(t, MP_INDUSTRY));
+	return _m[t].m5 | (GB(_m[t].m6, 2, 1) << 8);
+}
+
 /**
  * Get the industry graphics ID for the given industry tile
  * @param t the tile to get the gfx for
@@ -133,7 +139,7 @@
 static inline IndustryGfx GetIndustryGfx(TileIndex t)
 {
 	assert(IsTileType(t, MP_INDUSTRY));
-	return GetTranslatedIndustryTileID(_m[t].m5 | (GB(_m[t].m6, 2, 1) << 8));
+	return GetTranslatedIndustryTileID(GetCleanIndustryGfx(t));
 }
 
 /**
@@ -145,7 +151,8 @@
 static inline void SetIndustryGfx(TileIndex t, IndustryGfx gfx)
 {
 	assert(IsTileType(t, MP_INDUSTRY));
-	_m[t].m5 = gfx;
+	_m[t].m5 = GB(gfx, 0, 8);
+	SB(_m[t].m6, 2, 1, GB(gfx, 8, 1));
 }
 
 /**
@@ -253,12 +260,24 @@
  * @param tile TileIndex of the tile to query
  * @pre IsTileType(tile, MP_INDUSTRY)
  * @return requested bits
- * @todo implement the storage in map array
  */
 static inline byte GetIndustryRandomBits(TileIndex tile)
 {
 	assert(IsTileType(tile, MP_INDUSTRY));
-	return 0;
+	return _me[tile].m7;
+}
+
+/**
+ * Set the random bits for this tile.
+ * Used for grf callbacks
+ * @param tile TileIndex of the tile to query
+ * @param bits the random bits
+ * @pre IsTileType(tile, MP_INDUSTRY)
+ */
+static inline byte GetIndustryRandomBits(TileIndex tile, byte bits)
+{
+	assert(IsTileType(tile, MP_INDUSTRY));
+	_me[tile].m7 = bits;
 }
 
 /**
@@ -267,12 +286,11 @@
  * @param tile TileIndex of the tile to query
  * @pre IsTileType(tile, MP_INDUSTRY)
  * @return requested triggers
- * @todo implement the storage in map array
  */
 static inline byte GetIndustryTriggers(TileIndex tile)
 {
 	assert(IsTileType(tile, MP_INDUSTRY));
-	return 0;
+	return GB(_m[tile].m6, 3, 3);
 }
 
 
@@ -280,12 +298,13 @@
  * Set the activated triggers bits for this industry tile
  * Used for grf callbacks
  * @param tile TileIndex of the tile to query
+ * @param triggers the triggers to set
  * @pre IsTileType(tile, MP_INDUSTRY)
- * @todo implement the storage in map array
  */
 static inline void SetIndustryTriggers(TileIndex tile, byte triggers)
 {
 	assert(IsTileType(tile, MP_INDUSTRY));
+	SB(_m[tile].m6, 3, 3, triggers);
 }
 
 #endif /* INDUSTRY_MAP_H */
--- a/src/landscape.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/landscape.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -77,23 +77,23 @@
 	}
 
 	uint dz = IsSteepSlope(*s) ? TILE_HEIGHT : 0;
-	byte highest_corner = GetHighestSlopeCorner(*s);
+	Corner highest_corner = GetHighestSlopeCorner(*s);
 
 	switch (f) {
 		case FOUNDATION_INCLINED_X:
-			*s = (highest_corner <= 1 ? SLOPE_SW : SLOPE_NE);
+			*s = (((highest_corner == CORNER_W) || (highest_corner == CORNER_S)) ? SLOPE_SW : SLOPE_NE);
 			break;
 
 		case FOUNDATION_INCLINED_Y:
-			*s = (((highest_corner == 1) || (highest_corner == 2)) ? SLOPE_SE : SLOPE_NW);
+			*s = (((highest_corner == CORNER_S) || (highest_corner == CORNER_E)) ? SLOPE_SE : SLOPE_NW);
 			break;
 
 		case FOUNDATION_STEEP_LOWER:
-			*s = (Slope) (1 << highest_corner);
+			*s = SlopeWithOneCornerRaised(highest_corner);
 			break;
 
 		case FOUNDATION_STEEP_HIGHER:
-			*s = (Slope) (*s & ~SLOPE_STEEP);
+			*s = SlopeWithThreeCornersRaised(OppositeCorner(highest_corner));
 			break;
 
 		default: NOT_REACHED();
@@ -271,7 +271,7 @@
 			lower_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z
 		);
 
-		byte highest_corner = GetHighestSlopeCorner(ti->tileh);
+		Corner highest_corner = GetHighestSlopeCorner(ti->tileh);
 		ti->z += ApplyFoundationToSlope(f, &ti->tileh);
 
 		if (IsInclinedFoundation(f)) {
--- a/src/lang/american.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/american.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
 STR_CONFIG_PATCHES_ON                                           :On
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Show vehicle speed in status bar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Allow building on slopes and coasts: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Allow terraforming under buildings, tracks, etc. (autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Allow more realistically sized catchment areas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Allow removal of more town-owned roads, bridges, etc: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Enable building very long trains: {ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Right-click emulation: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command-click
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control-click
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Off
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Off
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Own company
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :All companies
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Use loading indicators: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Off
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Own company
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :All companies
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Enable timetabling for vehicles: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Show timetable in ticks rather than days: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Default rail type (after new game/game load): {ORANGE}{STRING}
@@ -1262,6 +1275,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}... buoy is in use!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Co-ordinates: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Can't remove part of station...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Can't convert railtype here...
@@ -1372,18 +1386,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Protect your game with a password if you don't want other people to join it
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Select a map:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Which map do you want to play?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maximum allowed clients:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Choose a maximum number of clients. Not all slots need to be filled.
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Internet
 STR_NETWORK_LAN_INTERNET                                        :LAN / Internet
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (advertize)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} client{P "" s}
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maximum allowed clients:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Choose a maximum number of clients. Not all slots need to be filled.
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} compan{P y ies}
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Max companies:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Limit the server to a certain number of companies
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} spectator{P "" s}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Max spectators:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Limit the server to a certain number of spectators
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Language spoken:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Other players will know which language is spoken on the server.
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}Start Game
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Start a new network game from a random map, or scenario
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Load Game
@@ -1611,9 +1630,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Railroad track with normal signals
 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                            :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
 
 
@@ -1994,7 +2017,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Must demolish tunnel first
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Must demolish bridge first
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Cannot start and end on same position
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Level land or water required under bridge
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Start and end must be in line
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Site unsuitable for tunnel entrance
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3339,7 +3361,6 @@
 STR_GROUP_RENAME_TIP                                            :{BLACK}Rename the selected group
 STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Click to protect this group from global autoreplace
 
-
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
--- a/src/lang/brazilian_portuguese.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/brazilian_portuguese.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -14,7 +14,7 @@
 STR_0003_NOT_ENOUGH_CASH_REQUIRES                               :{WHITE}Não há dinheiro - requer {CURRENCY}
 STR_0004                                                        :{WHITE}{CURRENCY}
 STR_EMPTY                                                       :
-STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Precisa de terreno plano
+STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Necessita de terreno plano
 STR_0008_WAITING                                                :{BLACK}Aguardando: {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
 STR_000A_EN_ROUTE_FROM                                          :{WHITE}{CARGO}{YELLOW} (em rota de
@@ -487,7 +487,7 @@
 STR_019F_TRAIN                                                  :{G=m}Trem
 STR_01A0_IS_GETTING_OLD                                         :{WHITE}{STRING} {COMMA} está ficando velho
 STR_01A1_IS_GETTING_VERY_OLD                                    :{WHITE}{STRING} {COMMA} está ficando muito velho
-STR_01A2_IS_GETTING_VERY_OLD_AND                                :{WHITE}{STRING} {COMMA} está ficando muito velho e precisa ser substituído urgentemente
+STR_01A2_IS_GETTING_VERY_OLD_AND                                :{WHITE}{STRING} {COMMA} está ficando muito velho e necessita substituição urgente
 STR_01A3_LAND_AREA_INFORMATION                                  :{WHITE}Informações do Terreno
 STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}Custo para limpar: {LTBLUE}N/D
 STR_01A5_COST_TO_CLEAR                                          :{BLACK}Custo para limpar: {LTBLUE}{CURRENCY}
@@ -720,7 +720,7 @@
 STR_0283_CONSTRUCT_TOFFEE_QUARRY                                :{BLACK}Construir Extração de Caramelo
 STR_0284_CONSTRUCT_SUGAR_MINE                                   :{BLACK}Construir Mina de Açúcar
 STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}Impossível construir {STRING} aqui...
-STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...precisa construir uma cidade primeiro
+STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...necessário construir uma cidade primeiro
 STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...só é permitido uma por cidade
 STR_0288_PLANT_TREES                                            :{BLACK}Plantar árvores
 STR_0289_PLACE_SIGN                                             :{BLACK}Colocar placas
@@ -750,7 +750,7 @@
 STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...só pode ser construído em cidades com pelo menos 1200 habitantes
 STR_029E_MOVE_THE_STARTING_DATE                                 :{BLACK}Retroceder data de inicio em 1 ano
 STR_029F_MOVE_THE_STARTING_DATE                                 :{BLACK}Avançar data de inicio em 1 ano
-STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH                               :{WHITE}...os extremos da ponte precisam estar sobre a terra
+STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH                               :{WHITE}...os extremos da ponte necessitam estar sobre a terra
 STR_02A1_SMALL                                                  :{BLACK}Pequena
 STR_02A2_MEDIUM                                                 :{BLACK}Média
 STR_02A3_LARGE                                                  :{BLACK}Grande
@@ -1022,6 +1022,7 @@
 STR_CONFIG_PATCHES_ON                                           :On
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Exibir velocidade do veículo na barra de estado: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Permitir a construção em declives e encostas: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Permitir terraformação sob edifícios, ruas, etc. (auto nivelação): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Permitir dimensionamento mais realista das áreas de abrangência: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Permitir a remoção de mais rodovias, pontes, etc. das cidades: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Permitir a construção de trens muito longos: {ORANGE}{STRING}
@@ -1105,9 +1106,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Compatibilizar o botão direito do mouse: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Clique de comando
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Clique de controle
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Desligado
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Desligado
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Própria Compania
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Todas as companias
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Usar indicadores de carga: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Desligado
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Própria Compania
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Todas as Companias
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Ativar plano de horário para veículos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Exibir plano de horário em tiques ao invés de dias: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Tipo padrão de ferrovia (ao criar ou carregar um jogo): {ORANGE}{STRING}
@@ -1382,7 +1395,7 @@
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (divulgar)
 STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} cliente{P "" s}
 STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Máximo de clientes:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Escolha o número máximo de clientes. Não precisam estar todos preenchidos
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Escolha o número máximo de clientes. Não necessita estarem todos preenchidos
 STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} compan{P ia ias}
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Máximo de empresas:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Limita o servidor para uma certa quantia de empresas
@@ -1587,7 +1600,7 @@
 STR_1004_TOO_HIGH                                               :{WHITE}Muito alto
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Tipo de linha não apropriado
 STR_1007_ALREADY_BUILT                                          :{WHITE}...já construído
-STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Precisa remover a ferrovia primeiro
+STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Necessário remover a ferrovia primeiro
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Construir ferrovias
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Construir ferrovias (elétricas)
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Construir ferrovias (monotrilho)
@@ -1631,7 +1644,7 @@
 
 
 ##id 0x1800
-STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Precisa remover a rodovia primeiro
+STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Necessário 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
@@ -1684,7 +1697,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
-STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}O edifício precisa ser demolido primeiro
+STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}O edifício necessita ser demolido primeiro
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}População: {ORANGE}{COMMA}{BLACK}  Casas: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Renomear Cidade
@@ -1814,9 +1827,9 @@
 STR_3008B_TOO_MANY_TRUCK_STOPS                                  :{WHITE}Muitos locais de carga
 STR_3009_TOO_CLOSE_TO_ANOTHER_STATION                           :{WHITE}Muito perto de outra estação/local de carga
 STR_300A_0                                                      :{WHITE}{STATION} {STATIONFEATURES}
-STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Precisa demolir a estação primeiro
+STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Necessário demolir a estação primeiro
 STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT                           :{WHITE}Muito perto de outro aeroporto
-STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}Precisa demolir o aeroporto primeiro
+STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}Necessário demolir o aeroporto primeiro
 
 STR_3030_RENAME_STATION_LOADING                                 :Renomear estação/área de carga
 STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}Impossível renomear a estação...
@@ -1844,16 +1857,16 @@
 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_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Necessário demolir a estação de ônibus primeiro
+STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Necessário demolir a estação de caminhão
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Necessário demolir estação de bonde primeiro
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Necessário 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 -
 STR_304B_SITE_UNSUITABLE                                        :{WHITE}...local inadequado
 STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK                              :{WHITE}Muito perto de outra doca
-STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Precisa demolir a doca primeiro
+STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Necessário demolir a doca primeiro
 STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Selecionar a orientação da estação ferroviária
 STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Selecionar o número de linhas da estação ferroviária
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Selecionar o tamanho da estação ferroviária
@@ -1891,7 +1904,7 @@
 
 ##id 0x3800
 STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Orientação do Depósito Naval
-STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...precisa ser construído na água
+STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...necessita ser construído na água
 STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Impossível construir depósito naval aqui...
 STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Selecionar orientação do depósito naval
 STR_3804_WATER                                                  :Ãgua
@@ -2005,11 +2018,10 @@
 STR_5001_ROAD_VEHICLE_IN_TUNNEL                                 :{WHITE}Automóvel no túnel
 STR_5003_ANOTHER_TUNNEL_IN_THE_WAY                              :{WHITE}Há outro túnel no caminho
 STR_5005_UNABLE_TO_EXCAVATE_LAND                                :{WHITE}Incapaz de escavar o terreno para o outro lado do túnel
-STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Precisa demolir o túnel primeiro
-STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Precisa demolir a ponte primeiro
+STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Necessário demolir o túnel primeiro
+STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Necessário demolir a ponte primeiro
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Impossível iniciar e terminar no mesmo ponto
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Debaixo da ponte é necessário um terreno plano ou água
-STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Inicio e fim precisam estar alinhados
+STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Inicio e fim necessitam estar alinhados
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}O local não é adequado para a entrada do túnel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
 STR_500E_SUSPENSION_STEEL                                       :Suspensa, Aço
@@ -2684,7 +2696,7 @@
 STR_882D_VALUE                                                  :{LTBLUE}{ENGINE}{BLACK}   Valor: {LTBLUE}{CURRENCY}
 STR_882E                                                        :{WHITE}{VEHICLE}
 STR_882F_LOADING_UNLOADING                                      :{LTBLUE}Carregando / descarregando
-STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}O trem precisa estar parado dentro do depósito
+STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}O trem necessita estar parado dentro do depósito
 STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT                              :{WHITE}Impossível enviar o trem para o depósito...
 STR_8831_NO_MORE_SPACE_FOR_ORDERS                               :{WHITE}Não há espaço para mais ordens
 STR_8832_TOO_MANY_ORDERS                                        :{WHITE}Muitas ordens
@@ -2797,7 +2809,7 @@
 STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Confiabilidade: {LTBLUE}{COMMA}%  {BLACK}Quebras desde a última manutenção: {LTBLUE}{COMMA}
 STR_9011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
 STR_9012_CAPACITY                                               :{BLACK}Capacidade: {LTBLUE}{CARGO}
-STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...precisa estar parado dentro de uma garagem
+STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...necessita estar parado dentro de uma garagem
 STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}Impossível vender automóvel...
 STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}Impossível iniciar/parar automóvel...
 STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}Automóvel {COMMA} está aguardando na garagem
@@ -2861,7 +2873,7 @@
 STR_CLONE_SHIP                                                  :{BLACK}Clonar Embarcação
 STR_CLONE_SHIP_INFO                                             :{BLACK}Isso vai construir uma cópia da embarcação. Control-clique vai compartilhar as ordens
 STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Isso irá construir uma cópia da embarcação. Clique neste botão e depois em uma embarcação dentro ou fora do depósito naval. Control-clique vai compartilhar as ordens
-STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}A embarcação precisa estar parado no depósito naval
+STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}A embarcação necessita estar parado no depósito naval
 STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Impossível vender embarcação...
 STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Impossível construir embarcação...
 STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Embarcação no caminho
@@ -2951,7 +2963,7 @@
 STR_A017_AIRCRAFT_IS_IN_FLIGHT                                  :{WHITE}Aeronave está em voo
 STR_A019_CAPACITY                                               :{BLACK}Capacidade: {LTBLUE}{CARGO}, {CARGO}
 STR_A01A_CAPACITY                                               :{BLACK}Capacidade: {LTBLUE}{CARGO}
-STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}A aeronave precisa estar parada no hangar
+STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}A aeronave necessita estar parada no hangar
 STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Impossível vender aeronave...
 STR_A01D_AIRPORT_CONSTRUCTION                                   :Construir aeroporto
 STR_A01E_BUILD_AIRPORT                                          :{BLACK}Construir aeroporto
--- a/src/lang/bulgarian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/bulgarian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1104,9 +1104,18 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Разгледай картата
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Изклучен
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Scrollwheel ÑкороÑÑ‚ на картата: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Изключен
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Ðвтоматична пауза Ñтартирайки нова игра: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Използваи напредналиат ÑпиÑък на превозни ÑредÑтва: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Изключен
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :СобÑтвена компаниÑ
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Ð’Ñички компаний
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Използвай товарни индикатори: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Изключен
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :СобÑтвена компаниÑ
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Ð’Ñички компаний
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Включи времеÑлуженето на ПС-та: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Покажи времеÑлуженето в Ñлучаи, а не в дни: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Стандартни релÑи (Ñлед нова игра/отварÑне на запазена игра): {ORANGE}{STRING}
@@ -1262,6 +1271,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...шамандурата Ñе използва!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Координати: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Ðе може да Ñе премахва чаÑÑ‚ от гарата...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Тук не може да Ñе Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ñ‚Ð¸Ð¿Ð° на жп линиÑта...
@@ -1377,14 +1387,17 @@
 STR_NETWORK_INTERNET                                            :Интернет
 STR_NETWORK_LAN_INTERNET                                        :LAN / Интернет
 STR_NETWORK_INTERNET_ADVERTISE                                  :Интернет (реклама)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} клиент{P "" s}
 STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}МакÑ. клиенти:
 STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Избор на макÑÐ¸Ð¼Ð°Ð»Ð½Ð¸Ñ Ð±Ñ€Ð¾Ð¹ клиенти. Ðе вÑички Ñлотове Ñ‚Ñ€Ñбва да Ñе попълнÑÑ‚
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}МакÑ. компании:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Ограничаване на играта до определен брой компании
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM}  зрител{P "" s}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}МакÑ. наблюдатели:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Ограничаване на Ñървъра до определен брой наблюдатели
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Говорим език:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Другите играчи ще знаÑÑ‚ езика на който Ñе говори на Ñървъра
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}Ðачало на игра
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Започване на нова мрежова игра от Ñлучайна карта или Ñценарий
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Зареждане на игра
@@ -1612,7 +1625,10 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :ЖП Ð»Ð¸Ð½Ð¸Ñ Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð½Ð¸ Ñигнали
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :ЖП Ð»Ð¸Ð½Ð¸Ñ Ñ Ð¿Ñ€Ðµ-Ñигнали
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :ЖП Ð»Ð¸Ð½Ð¸Ñ Ñ Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸ Ñигнали
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Железопътна линиа Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ€Ð°Ð½Ð¸ знаци
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Железопътна линиа Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð½Ð¸ и изходни Ñигнали
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Железопътна линиа Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð½Ð¸ и комбинирани знаци
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Железопътна линиа Ñ Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸ и комбинирани знаци
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Железопътната гара Ñ‚Ñ€Ñбва да бъде премахната първо
 
 
@@ -1992,7 +2008,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Първо разрушете тунела
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Първо Ñ‚Ñ€Ñбва да разрушите моÑта
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Ðе може да започва и да Ñвърша на едно и Ñъщо мÑÑто
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Равна Ð·ÐµÐ¼Ñ Ð¸Ð»Ð¸ вода е необходима под моÑта
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Ðачалото и краÑÑ‚ Ñ‚Ñ€Ñбва да Ñа на една линиÑ
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}ÐœÑÑтото е неподходÑщо за вход на тунел
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2759,6 +2774,7 @@
 STR_TIMETABLE_STATUS_LATE                                       :Това превознот ÑредÑтво е в момента Ñ {STRING} закъÑнение
 STR_TIMETABLE_STATUS_EARLY                                      :Това превознот ÑредÑтво е в момента Ñ {STRING} по-рано
 STR_TIMETABLE_TOTAL_TIME                                        :Ще Ñ‚Ñ€Ñбва {STRING} за това разпиÑание да бъде приклучено
+STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :Това разпиÑание ще вземе най-малко {STRING} за да приклучи (не вÑичко е планирано)
 STR_TIMETABLE_AUTOFILL                                          :{BLACK}Ðфтонапълване
 
 ##id 0x9000
--- a/src/lang/catalan.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/catalan.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
 STR_CONFIG_PATCHES_ON                                           :Actiu
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Mostra la velocitat del vehicle a la barra d'estat: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Permet construir en desnivells i costes: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Permet terraformar sota edificis, rails, etc. (autopendent): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Permet un tamany més real de l'àrea d'influència: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Permet l'esborrat de propietats de les poblacions: carreteres, ponts, túnels, etc: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Activa la construcció de trens molt llargs: {ORANGE}{STRING}
@@ -1101,11 +1102,23 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Funció de la rodeta del ratolí: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Zoom mapa
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Mou el mapa
-STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Off
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Inactiu
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Velocitat del mapa amb la rodeta del ratolí: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Emulació del botó dret: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command-clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control-clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Desactivat
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Inactiu
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Pròpia companyia
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Totes les companyies
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Utilitza indicadors de carregament: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Inactiu
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Pròpia companyia
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Totes les companyies
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Habilita horaris dels vehicles: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Mostra horaris en marques enlloc de dies: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Tipus de via predeterminada (en un joc nou/joc desat): {ORANGE}{STRING}
@@ -2004,7 +2017,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Primer has d'enderrocar el túnel
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Primer has d'enderrocar el pont
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}No es pot començar i acabar a la mateixa posició
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Es necessita una certa elevació sobre el terreny o aigua sota el pont
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Inici i final han d'estar en línia recta
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Lloc inadequat per l'entrada del túnel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/croatian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/croatian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -158,7 +158,7 @@
 STR_00B2_MESSAGE                                                :{YELLOW}Poruka
 STR_00B3_MESSAGE_FROM                                           :{YELLOW}Poruka od {STRING}
 STR_POPUP_CAUTION_CAPTION                                       :{WHITE}Oprez!
-STR_00B4_CAN_T_DO_THIS                                          :{WHITE}To nije moguće napraviti....
+STR_00B4_CAN_T_DO_THIS                                          :{WHITE}To nije moguće uÄiniti....
 STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Nije moguće oÄistiti ovo podruÄje....
 STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}Izvorno autorsko pravo {COPYRIGHT} 1995 Chris Sawyer, sva prava pridržana
 STR_00B7_VERSION                                                :{BLACK}OpenTTD verzija {REV}
@@ -254,7 +254,7 @@
 STR_011B_RAILROAD_STATION                                       :{BLACK}{TINYFONT}ŽeljezniÄka stanica
 STR_011C_TRUCK_LOADING_BAY                                      :{BLACK}{TINYFONT}Kamionski terminal
 STR_011D_BUS_STATION                                            :{BLACK}{TINYFONT}Autobusn stanica
-STR_011E_AIRPORT_HELIPORT                                       :{BLACK}{TINYFONT}Aerodrom/Heliodrom
+STR_011E_AIRPORT_HELIPORT                                       :{BLACK}{TINYFONT}ZraÄna luka/Heliodrom
 STR_011F_DOCK                                                   :{BLACK}{TINYFONT}Pristanište
 STR_0120_ROUGH_LAND                                             :{BLACK}{TINYFONT}Surova zemlja
 STR_0121_GRASS_LAND                                             :{BLACK}{TINYFONT}Travnjak
@@ -292,7 +292,7 @@
 STR_013E_TOTAL_CARGO                                            :{BLACK}Ukupni teret
 STR_013F_CAPACITY                                               :{BLACK}Nosivost: {LTBLUE}{CARGO}
 STR_CAPACITY_MULT                                               :{BLACK}Nosivost: {LTBLUE}{CARGO} (x{NUM})
-STR_013F_TOTAL_CAPACITY_TEXT                                    :{BLACK}Ukupna nosivost ovoga vlaka:
+STR_013F_TOTAL_CAPACITY_TEXT                                    :{BLACK}Ukupna nosivost tereta ovog vlaka:
 STR_013F_TOTAL_CAPACITY                                         :{LTBLUE}- {CARGO} ({SHORTCARGO})
 STR_TOTAL_CAPACITY_MULT                                         :{LTBLUE}- {CARGO} ({SHORTCARGO}) (x{NUM})
 STR_0140_NEW_GAME                                               :{BLACK}Nova igra
@@ -350,10 +350,10 @@
 
 ############ range for menu starts
 STR_0154_OPERATING_PROFIT_GRAPH                                 :Grafikon operativne dobiti
-STR_0155_INCOME_GRAPH                                           :Graf prihoda
-STR_0156_DELIVERED_CARGO_GRAPH                                  :Graf isporuÄenog tereta
-STR_0157_PERFORMANCE_HISTORY_GRAPH                              :Graf povijesti uÄinka
-STR_0158_COMPANY_VALUE_GRAPH                                    :Graf vrijednosti tvrtke
+STR_0155_INCOME_GRAPH                                           :Grafikon prihoda
+STR_0156_DELIVERED_CARGO_GRAPH                                  :Grafikon isporuÄenog tereta
+STR_0157_PERFORMANCE_HISTORY_GRAPH                              :Grafikon uÄinkovitosti
+STR_0158_COMPANY_VALUE_GRAPH                                    :Grafikon vrijednosti tvrtke
 STR_0159_CARGO_PAYMENT_RATES                                    :Iznosi plaćanja tereta
 STR_015A_COMPANY_LEAGUE_TABLE                                   :Tablica lige tvrtki
 STR_PERFORMANCE_DETAIL_MENU                                     :Detaljna ocjena uÄinka
@@ -382,7 +382,7 @@
 STR_SORT_BY_PROFIT_THIS_YEAR                                    :Dobit ove godine
 STR_SORT_BY_AGE                                                 :Godine
 STR_SORT_BY_RELIABILITY                                         :Pouzdanost
-STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE                        :Totalna nosivost po vrsti tereta
+STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE                        :Ukupna nosivost po vrsti tereta
 STR_SORT_BY_MAX_SPEED                                           :Maksimalna brzina
 STR_SORT_BY_MODEL                                               :Model
 STR_SORT_BY_VALUE                                               :Vrijednost
@@ -397,19 +397,19 @@
 STR_ENGINE_SORT_POWER_VS_RUNNING_COST                           :Trošak snage/uporabe
 STR_ENGINE_SORT_CARGO_CAPACITY                                  :Nosivost tereta
 STR_NO_WAITING_CARGO                                            :{BLACK}Nijedna vrsta tereta ne Äeka
-STR_SELECT_ALL_FACILITIES                                       :{BLACK}Izaberi sva sredstva
-STR_SELECT_ALL_TYPES                                            :{BLACK}Izaberi sve vrste tereta (ukljuÄujući i teret koji ne Äeka)
+STR_SELECT_ALL_FACILITIES                                       :{BLACK}Odaberi sva sredstva
+STR_SELECT_ALL_TYPES                                            :{BLACK}Odaberi sve vrste tereta (ukljuÄujući i teret koji ne Äeka)
 STR_AVAILABLE_TRAINS                                            :{BLACK}Dostupni vlakovi
 STR_AVAILABLE_ROAD_VEHICLES                                     :{BLACK}Dostupna vozila
 STR_AVAILABLE_SHIPS                                             :{BLACK}Dostupni brodovi
 STR_AVAILABLE_AIRCRAFT                                          :{BLACK}Dostupni zrakoplovi
 STR_AVAILABLE_ENGINES_TIP                                       :{BLACK}Pogledaj popis dostupnih dizajna motora za ovu vrstu vozila.
 STR_MANAGE_LIST                                                 :{BLACK}Uredi popis
-STR_MANAGE_LIST_TIP                                             :{BLACK}Pošalji upute svim vozilima na ovoj listi
+STR_MANAGE_LIST_TIP                                             :{BLACK}Pošalji upute svim vozilima na ovom popisu
 STR_REPLACE_VEHICLES                                            :Zamjeni vozila
 STR_SEND_TRAIN_TO_DEPOT                                         :Pošalji u spremište
-STR_SEND_ROAD_VEHICLE_TO_DEPOT                                  :
-STR_SEND_SHIP_TO_DEPOT                                          :
+STR_SEND_ROAD_VEHICLE_TO_DEPOT                                  :Pošalji u spremište
+STR_SEND_SHIP_TO_DEPOT                                          :Pošalji u spremište
 STR_SEND_AIRCRAFT_TO_HANGAR                                     :Pošalji u hangar
 STR_SEND_FOR_SERVICING                                          :Pošalji na servis
 
@@ -433,18 +433,18 @@
 STR_0170                                                        :{TINYFONT}{STRING}-
 STR_0171_PAUSE_GAME                                             :{BLACK}Zaustavi igru
 STR_0172_SAVE_GAME_ABANDON_GAME                                 :{BLACK}Spremi igru, napusti igru, prekini igru
-STR_0173_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaži popis stanica u vlasništvu tvrke
+STR_0173_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaži popis stanica u vlasništvu tvrtke
 STR_0174_DISPLAY_MAP                                            :{BLACK}Prikaži kartu
 STR_0175_DISPLAY_MAP_TOWN_DIRECTORY                             :{BLACK}Prikaži kartu, popis gradova
 STR_0176_DISPLAY_TOWN_DIRECTORY                                 :{BLACK}Prikaži popis gradova
-STR_0177_DISPLAY_COMPANY_FINANCES                               :{BLACK}Prikaži financijske podatke tvrke
+STR_0177_DISPLAY_COMPANY_FINANCES                               :{BLACK}Prikaži financijske podatke tvrtke
 STR_0178_DISPLAY_COMPANY_GENERAL                                :{BLACK}Prikaži opće podatke tvrtke
-STR_0179_DISPLAY_GRAPHS                                         :{BLACK}Prikaži grafove
+STR_0179_DISPLAY_GRAPHS                                         :{BLACK}Prikaži grafikone
 STR_017A_DISPLAY_COMPANY_LEAGUE                                 :{BLACK}Prikaži tablicu lige tvrtki
-STR_017B_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaži popis vlakova u posjedu tvrtke
-STR_017C_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaži popis cestovnih vozila u posjedu tvrke
-STR_017D_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaž popis brodova u posjedu tvrke
-STR_017E_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaži popis zrakoplova u posjedu tvrtke
+STR_017B_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaži popis vlakova u vlasništvu tvrtke
+STR_017C_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaži popis cestovnih vozila u vlasništvu tvrtke
+STR_017D_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaž popis brodova u vlasništvu tvrtke
+STR_017E_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Prikaži popis zrakoplova u vlasništvu tvrtke
 STR_017F_ZOOM_THE_VIEW_IN                                       :{BLACK}Približi pogled
 STR_0180_ZOOM_THE_VIEW_OUT                                      :{BLACK}Udalji pogled
 STR_0181_BUILD_RAILROAD_TRACK                                   :{BLACK}Izgradi željezniÄku prugu
@@ -462,18 +462,18 @@
 STR_STICKY_BUTTON                                               :{BLACK}OznaÄi ovaj prozor kao nezatvoriv kad se rabi tipka 'Zatvori sve prozore'
 STR_RESIZE_BUTTON                                               :{BLACK}Pritisni i povuci za promjenu veliÄine prozora
 STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}Pritisni ovdje za prelazak u trenutnu pretpostavljenu mapu za snimanje/uÄitavanje
-STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Uništi građevine itd. na kvadratu zemlje
+STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Sruši građevine itd. na kvadratu zemlje
 STR_018E_LOWER_A_CORNER_OF_LAND                                 :{BLACK}Snizi vrh kvadrata zemlje
 STR_018F_RAISE_A_CORNER_OF_LAND                                 :{BLACK}Povisi vrh kvadrata zemlje
-STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}PomiÄna traka - lista gore/dolje
-STR_HSCROLL_BAR_SCROLLS_LIST                                    :{BLACK}KlizaÄ - pomiÄi listu lijevo/desno
-STR_0191_SHOW_LAND_CONTOURS_ON_MAP                              :{BLACK}Prikaži obrise zemlje na karti
-STR_0192_SHOW_VEHICLES_ON_MAP                                   :{BLACK}Prikaži vozila na karti
-STR_0193_SHOW_INDUSTRIES_ON_MAP                                 :{BLACK}Prikaži industrije na karti
-STR_0194_SHOW_TRANSPORT_ROUTES_ON                               :{BLACK}Prikaži prijevozne trase na karti
-STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Prikaži vegetaciju na karti
-STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}Prikaži vlasnike zemlje na karti
-STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Prikaži/sakrij imena grada na karti
+STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}Klizna traka - lista gore/dolje
+STR_HSCROLL_BAR_SCROLLS_LIST                                    :{BLACK}Klizna traka - pomiÄi listu lijevo/desno
+STR_0191_SHOW_LAND_CONTOURS_ON_MAP                              :{BLACK}Pokaži obrise zemlje na karti
+STR_0192_SHOW_VEHICLES_ON_MAP                                   :{BLACK}Pokaži vozila na karti
+STR_0193_SHOW_INDUSTRIES_ON_MAP                                 :{BLACK}Pokaži industrije na karti
+STR_0194_SHOW_TRANSPORT_ROUTES_ON                               :{BLACK}Pokaži prijevozne trase na karti
+STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Pokaži vegetaciju na karti
+STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}Pokaži vlasnike zemlje na karti
+STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Prikaži/sakrij imena gradova na karti
 STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}Ovogodišnja dobit: {CURRENCY} (prošlogodišnja: {CURRENCY})
 
 ############ range for service numbers starts
@@ -539,7 +539,7 @@
 STR_01D1_8                                                      :({COMMA}/8 {STRING})
 STR_01D2_JAZZ_JUKEBOX                                           :{WHITE}Jazz Jukebox
 STR_01D3_SOUND_MUSIC                                            :Zvuk/glazba
-STR_01D4_SHOW_SOUND_MUSIC_WINDOW                                :{BLACK}Prikaži prozor zvuk/glazba
+STR_01D4_SHOW_SOUND_MUSIC_WINDOW                                :{BLACK}Pokaži prozor zvuk/glazba
 STR_01D5_ALL                                                    :{TINYFONT}Sve
 STR_01D6_OLD_STYLE                                              :{TINYFONT}Staromodno
 STR_01D7_NEW_STYLE                                              :{TINYFONT}Moderno
@@ -550,7 +550,7 @@
 STR_01DC_EFFECTS_VOLUME                                         :{BLACK}{TINYFONT}Glasnoća zvukova
 STR_01DD_MIN_MAX                                                :{BLACK}{TINYFONT}MIN  '  '  ' '  '  '  MAX
 STR_01DE_SKIP_TO_PREVIOUS_TRACK                                 :{BLACK}Prethodna traka
-STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION                        :{BLACK}Sljedeća traka
+STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION                        :{BLACK}Sljedeća traka u izboru
 STR_01E0_STOP_PLAYING_MUSIC                                     :{BLACK}Zaustavi glazbu
 STR_01E1_START_PLAYING_MUSIC                                    :{BLACK}Pokreni glazbu
 STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC                              :{BLACK}Povuci klizaÄe za namjeÅ¡tanje glasnoće glazbe i zvukova
@@ -577,23 +577,23 @@
 STR_01F7_SELECT_CUSTOM_2_USER_DEFINED                           :{BLACK}Odaberi program 'Proizvoljna glazba 2'
 STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1                          :{BLACK}Obriši aktivni program (samo Proizvoljno 1 ili Proizvoljno 2)
 STR_01F9_SAVE_MUSIC_SETTINGS                                    :{BLACK}Spremi glazbene postavke
-STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Klikni na glazbenu traku za dodavanje u aktivni program (samo Proizvoljno 1 ili Proizvoljno 2)
-STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Klikni na glazbenu traku da ju makneš iz trenutnog programa (samo Proizvoljno1 ili Proizvoljno2)
-STR_01FB_TOGGLE_PROGRAM_SHUFFLE                                 :{BLACK}UkluÄi/iskljuÄi mijeÅ¡anje programa
-STR_01FC_SHOW_MUSIC_TRACK_SELECTION                             :{BLACK}Prikaži prozor za izbor glazbenih traka
-STR_01FD_CLICK_ON_SERVICE_TO_CENTER                             :{BLACK}Pritisni na uslugu za centriranje pogleda na industriju/grad
+STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Klikni na glazbenu traku za dodavanje u aktivni program (samo Proizvoljno1 ili Proizvoljno2)
+STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Klikni na glazbenu traku kako bi ju uklonio iz trenutnog programa (samo Proizvoljno1 ili Proizvoljno2)
+STR_01FB_TOGGLE_PROGRAM_SHUFFLE                                 :{BLACK}UkljuÄi/iskljuÄi mijeÅ¡anje programa
+STR_01FC_SHOW_MUSIC_TRACK_SELECTION                             :{BLACK}Pokaži prozor za izbor glazbenih traka
+STR_01FD_CLICK_ON_SERVICE_TO_CENTER                             :{BLACK}Klikni na uslugu za centriranje pogleda na industriju/grad
 STR_01FE_DIFFICULTY                                             :{BLACK}Težina ({STRING})
 STR_01FF                                                        :{TINYFONT}{BLACK}{DATE_LONG}
 STR_0200_LAST_MESSAGE_NEWS_REPORT                               :Poslijednja poruka/vijest
 STR_0201_MESSAGE_SETTINGS                                       :Postavke poruka
 STR_MESSAGE_HISTORY_MENU                                        :Povijest poruka
-STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}Prikaži zadnju poruku/vijest, prikaži postavke poruka
-STR_0204_MESSAGE_OPTIONS                                        :{WHITE}Mogućnosti poruka
+STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}Pokaži zadnju poruku/vijest, prikaži postavke poruka
+STR_0204_MESSAGE_OPTIONS                                        :{WHITE}Postavke poruka
 STR_0205_MESSAGE_TYPES                                          :{BLACK}Vrste poruka:
 STR_0206_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Dolazak prvog vozila u stanicu igraÄa
 STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Dolazak prvog vozila u stanicu suparnika
 STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Nesreće / katastrofe
-STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Podaci vezani za tvrtku
+STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Podatci vezani za tvrtku
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Otvaranje / zatvaranje industrija
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Promjene u gospodarstvu
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Savjet / informacija o vozilima igraÄa
@@ -605,7 +605,7 @@
 STR_MESSAGE_SOUND                                               :{YELLOW} Pusti zvuk za sve skraćene novinske poruke
 STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO                       :{WHITE}...predaleko od prethodnog odredišta
 STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}Najbolje tvrtke koje su dosigle razinu {NUM}{}({STRING})
-STR_TOP_COMPANIES_NETWORK_GAME                                  :{BIGFONT}{BLACK}Tablica kompanija u {NUM}
+STR_TOP_COMPANIES_NETWORK_GAME                                  :{BIGFONT}{BLACK}Tablica tvrtki u {NUM}
 STR_0212                                                        :{BIGFONT}{COMMA}.
 STR_0213_BUSINESSMAN                                            :Privrednik
 STR_0214_ENTREPRENEUR                                           :Poduzetnik
@@ -616,8 +616,8 @@
 STR_0219_TYCOON_OF_THE_CENTURY                                  :Tajkun stoljeća
 STR_HIGHSCORE_NAME                                              :{BIGFONT}{PLAYERNAME}, {COMPANY}
 STR_HIGHSCORE_STATS                                             :{BIGFONT}'{STRING}'   ({COMMA})
-STR_021B_ACHIEVES_STATUS                                        :{BLACK}{BIGFONT}{COMPANY} postigao je status '{STRING}' !
-STR_021C_OF_ACHIEVES_STATUS                                     :{WHITE}{BIGFONT}{PLAYERNAME} iz {COMPANY} postigao je status '{STRING}' !
+STR_021B_ACHIEVES_STATUS                                        :{BLACK}{BIGFONT}Tvrtka {COMPANY} postigla je status '{STRING}' !
+STR_021C_OF_ACHIEVES_STATUS                                     :{WHITE}{BIGFONT}{PLAYERNAME} iz tvrtke {COMPANY} postigao je status '{STRING}' !
 STR_021F                                                        :{BLUE}{COMMA}
 STR_0221_OPENTTD                                                :{YELLOW}OpenTTD
 STR_0222_SCENARIO_EDITOR                                        :{YELLOW}Uređivanje scenarija
@@ -638,7 +638,7 @@
 STR_0233_TOWN_GENERATION                                        :{WHITE}Stvaranje gradova
 STR_0234_NEW_TOWN                                               :{BLACK}Novi grad
 STR_0235_CONSTRUCT_NEW_TOWN                                     :{BLACK}Izgradi novi grad
-STR_0236_CAN_T_BUILD_TOWN_HERE                                  :{WHITE}Ovdje nije moguće graditi...
+STR_0236_CAN_T_BUILD_TOWN_HERE                                  :{WHITE}Ovdje nije moguće izgraditi grad...
 STR_0237_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}...preblizu rubu karte
 STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN                              :{WHITE}...preblizu drugog grada
 STR_0239_SITE_UNSUITABLE                                        :{WHITE}...neprikladno mjesto
@@ -719,11 +719,11 @@
 STR_0282_CONSTRUCT_BUBBLE_GENERATOR                             :{BLACK}Izgradi generator balona
 STR_0283_CONSTRUCT_TOFFEE_QUARRY                                :{BLACK}Izgradi iskop miljeÄne karamele
 STR_0284_CONSTRUCT_SUGAR_MINE                                   :{BLACK}Izgradi rudnik šećera
-STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}Ne možeš graditi {STRING} ovdje...
-STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...moraš prvo izgraditi grad
+STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}Ovdje nije moguće izgraditi {STRING}...
+STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...najprije moraš izgraditi grad
 STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...dozvoljen samo jedan po gradu
 STR_0288_PLANT_TREES                                            :{BLACK}Posadi drveće
-STR_0289_PLACE_SIGN                                             :{BLACK}Stavi znak
+STR_0289_PLACE_SIGN                                             :{BLACK}Postavi znak
 STR_028A_RANDOM_TREES                                           :{BLACK}NasumiÄno odabrano drveće
 STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}Nasumce posadi drveće po krajoliku
 STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE                         :{BLACK}Stavi stijenje na krajolik
@@ -755,11 +755,11 @@
 STR_02A2_MEDIUM                                                 :{BLACK}Srednje
 STR_02A3_LARGE                                                  :{BLACK}Veliko
 STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Grad
-STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Izaberi veliÄinu grada
+STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Odaberi veliÄinu grada
 STR_02A5_TOWN_SIZE                                              :{YELLOW}VeliÄina grada:
 
 STR_02B6                                                        :{STRING}  -  {STRING}
-STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS                              :{BLACK}Prikaži posljednu poruku ili vijest
+STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS                              :{BLACK}Pokaži zadnju poruku ili vijest
 STR_OFF                                                         :IskljuÄeno
 STR_SUMMARY                                                     :Sažetak
 STR_FULL                                                        :Puno
@@ -770,7 +770,7 @@
 STR_02BE_DEFAULT                                                :Zadano
 STR_02BF_CUSTOM                                                 :Proizvoljno
 STR_02C0_SAVE_CUSTOM_NAMES                                      :{BLACK}Spremi proizvoljna imena
-STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION                         :{BLACK}Odabir imena dizajna vozila
+STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION                         :{BLACK}Izbor imena dizajna vozila
 STR_02C2_SAVE_CUSTOMIZED_VEHICLE                                :{BLACK}Spremi proizvoljna imena dizajna vozila
 
 STR_CHECKMARK                                                   :{CHECKMARK}
@@ -779,7 +779,7 @@
 STR_02C5_DIFFICULTY_SETTINGS                                    :Postavke težine
 STR_02C7_CONFIG_PATCHES                                         :Konfiguriraj zakrpe
 STR_NEWGRF_SETTINGS                                             :Postavke NewGRF-a
-STR_TRANSPARENCY_OPTIONS                                        :Opcije prozirnosti
+STR_TRANSPARENCY_OPTIONS                                        :Postavke prozirnosti
 STR_GAMEOPTMENU_0A                                              :
 STR_02CA_TOWN_NAMES_DISPLAYED                                   :{SETX 12}Prikaži imena gradova
 STR_02CC_STATION_NAMES_DISPLAYED                                :{SETX 12}Prikaži imena stanica
@@ -817,18 +817,18 @@
 
 STR_02E0_CURRENCY_UNITS                                         :{BLACK}NovÄane jedinice
 STR_02E1                                                        :{BLACK}{SKIP}{STRING}
-STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Odabir novÄanih jedinica
+STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Izbor novÄanih jedinica
 STR_MEASURING_UNITS                                             :{BLACK}Mjerni sustav
 STR_02E4                                                        :{BLACK}{SKIP}{SKIP}{STRING}
-STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Odabir mjernog sustava
+STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Izbor mjernog sustava
 STR_02E6_ROAD_VEHICLES                                          :{BLACK}Cestovna vozila
 STR_02E7                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Izaberi na kojoj će strani ceste vozila prometovati
+STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Odaberi na kojoj će strani ceste vozila prometovati
 STR_02E9_DRIVE_ON_LEFT                                          :Vozi na lijevoj strani
 STR_02EA_DRIVE_ON_RIGHT                                         :Vozi na desnoj strani
 STR_02EB_TOWN_NAMES                                             :{BLACK}Imena gradova
 STR_02EC                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02ED_SELECT_STYLE_OF_TOWN_NAMES                             :{BLACK}Izaberi stil za imena gradova
+STR_02ED_SELECT_STYLE_OF_TOWN_NAMES                             :{BLACK}Odaberi stil za imena gradova
 
 STR_02F4_AUTOSAVE                                               :{BLACK}Automatsko spremanje
 STR_02F5                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
@@ -843,13 +843,13 @@
 STR_02FF_SELECT_SINGLE_PLAYER_GAME                              :{BLACK}Odaberi igru za jednog igraÄa
 STR_0300_SELECT_MULTIPLAYER_GAME                                :{BLACK}Odaberi igru za 2-8 igraÄa
 STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Prikaži postavke igre
-STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Prikaži opcije težine
+STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Prikaži postavke težine
 STR_0303_START_A_NEW_GAME_USING                                 :{BLACK}ZapoÄni novu igru koristeći proizvoljni scenarij
 STR_0304_QUIT                                                   :{BLACK}Završi
 STR_0305_QUIT_OPENTTD                                           :{BLACK}Završi 'OpenTTD'
 STR_0307_OPENTTD                                                :{WHITE}OpenTTD {REV}
 STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...može biti izgrađen samo u gradovima
-STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Odaberi 'umjeren' stil krajolika
+STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Odaberi 'blag' stil krajolika
 STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE                            :{BLACK}Odaberi 'subarktiÄki' stil krajolika
 STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE                          :{BLACK}Odaberi 'subtropski' stil krajolika
 STR_0311_SELECT_TOYLAND_LANDSCAPE                               :{BLACK}Odaberi 'zemlju igraÄka' za stil krajolika
@@ -874,7 +874,7 @@
 STR_032F_AUTOSAVE                                               :{RED}AUTOMATSKO SPREMANJE
 STR_SAVING_GAME                                                 :{RED}*  *  SPREMAM IGRU  *  *
 STR_SAVE_STILL_IN_PROGRESS                                      :{WHITE}Spremanje joÅ¡ u tijeku,{}molimo priÄekajte dok se ne zavrÅ¡i!
-STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Izaberi glazbeni program 'Ezy Street style'
+STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Odaberi glazbeni program 'Ezy Street style'
 
 STR_0335_6                                                      :{BLACK}6
 STR_0336_7                                                      :{BLACK}7
@@ -942,7 +942,7 @@
 
 STR_OPTIONS_RES                                                 :{BLACK}RazluÄivost ekrana
 STR_OPTIONS_RES_CBO                                             :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_RES_TIP                                             :{BLACK}Izaberi rezoluciju ekrana
+STR_OPTIONS_RES_TIP                                             :{BLACK}Izaberi razluÄivost ekrana
 
 STR_OPTIONS_SCREENSHOT_FORMAT                                   :{BLACK}Format za sliku ekrana
 STR_OPTIONS_SCREENSHOT_FORMAT_CBO                               :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
@@ -966,8 +966,8 @@
 
 STR_HEADING_FOR_STATION                                         :{LTBLUE}Kreće se prema {STATION}
 STR_HEADING_FOR_STATION_VEL                                     :{LTBLUE}Kreće se prema {STATION}, {VELOCITY}
-STR_NO_ORDERS                                                   :{LTBLUE}Nema narudžbi
-STR_NO_ORDERS_VEL                                               :{LTBLUE}Nema narudžbi, {VELOCITY}
+STR_NO_ORDERS                                                   :{LTBLUE}Nema naredbi
+STR_NO_ORDERS_VEL                                               :{LTBLUE}Nema naredbi, {VELOCITY}
 
 STR_PASSENGERS                                                  :putnici
 STR_BAGS                                                        :vreće
@@ -980,8 +980,8 @@
 
 STR_SMALL_RIGHT_ARROW                                           :{TINYFONT}{RIGHTARROW}
 
-STR_CANT_SHARE_ORDER_LIST                                       :{WHITE}Nije moguće dijeliti rednu listu...
-STR_CANT_COPY_ORDER_LIST                                        :{WHITE}Nije moguće kopirati rednu listu...
+STR_CANT_SHARE_ORDER_LIST                                       :{WHITE}Nije moguće dijeliti popis naredbi...
+STR_CANT_COPY_ORDER_LIST                                        :{WHITE}Nije moguće kopirati popis naredbi...
 STR_END_OF_SHARED_ORDERS                                        :{SETX 10}- - Kraj dijeljenih naredbi - -
 
 STR_TRAIN_IS_LOST                                               :{WHITE}Vlak {COMMA} se izgubio.
@@ -990,9 +990,9 @@
 
 # Start of order review system.
 # DON'T ADD OR REMOVE LINES HERE
-STR_TRAIN_HAS_TOO_FEW_ORDERS                                    :{WHITE} Vlak {COMMA} ima premalo naredbi u rasporedu
+STR_TRAIN_HAS_TOO_FEW_ORDERS                                    :{WHITE}Vlak {COMMA} ima premalo naredbi u rasporedu
 STR_TRAIN_HAS_VOID_ORDER                                        :{WHITE}Vlak {COMMA} ima praznu naredbu
-STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}Vlak {COMMA} ima udvostuÄenu naredbu
+STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}Vlak {COMMA} ima dvostruku naredbu
 STR_TRAIN_HAS_INVALID_ENTRY                                     :{WHITE}Vlak {COMMA} ima nevažeću stanicu u voznom redu
 STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS                              :{WHITE}Cestovno vozilo {COMMA} ima premalo naredbi u rasporedu
 STR_ROADVEHICLE_HAS_VOID_ORDER                                  :{WHITE}Cestovno vozilo {COMMA} ima praznu naredbu
@@ -1015,148 +1015,161 @@
 STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT                            :{WHITE}Nakon zamjene, vlak {COMMA} je postao predug
 
 STR_CONFIG_PATCHES                                              :{BLACK}Konfiguriraj zakrpe
-STR_CONFIG_PATCHES_TIP                                          :{BLACK}Podesi zakrpe
-STR_CONFIG_PATCHES_CAPTION                                      :{WHITE}Podesi zakrpe
+STR_CONFIG_PATCHES_TIP                                          :{BLACK}Konfiguriraj zakrpe
+STR_CONFIG_PATCHES_CAPTION                                      :{WHITE}Konfiguriraj zakrpe
 
 STR_CONFIG_PATCHES_OFF                                          :IskljuÄeno
 STR_CONFIG_PATCHES_ON                                           :UkljuÄeno
-STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Prikaži brzinu vozila u statusnoj traci: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Dozvoli gradnju na nagibima i obalama: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Dozvoli realistiÄnije veliÄine podruÄja zahvaćanja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Pokaži brzinu vozila u statusnoj traci: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Dopusti izgradnju na kosinama i obalama: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Dopusti modeliranje zemlje ispod graÄ‘evina, traÄnica, itd (autonagib): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Dopusti realistiÄnije veliÄine podruÄja zahvaćanja: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Dopusti rušenje više gradskih cesta, mostova itd.: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Omogući sastavljanje vrlo dugaÄkih vlakova: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REALISTICACCEL                               :{LTBLUE}Omogući realno ubrzanje za vlakove: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_REALISTICACCEL                               :{LTBLUE}Omogući realistiÄno ubrzanje za vlakove: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Zabrani vlakovima i brodovima skretanja pod 90 stupnjeva: {ORANGE}{STRING} {LTBLUE} (requires NPF)
-STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}Spoji željezniÄke stanice koje se izgrade jedna kraj druge: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}Spoji željezniÄke stanice koje se izgrade jedna pokraj druge: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}Napusti stanicu ako je bilo koji teret u potpunosti natovaren pri 'punom utovaru': {ORANGE}{STRING}
-STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Koristi unaprijeđen algoritam ukrcavanja: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_GRADUAL_LOADING                              :{LTBLUE}Postupno utovaruj vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Koristi unaprijeđen utovarni algoritam: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_GRADUAL_LOADING                              :{LTBLUE}Postupno utovaruj u vozila: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_INFLATION                                    :{LTBLUE}Inflacija: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Dostavi teret u stanicu samo ako u njoj postoji potražnja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Dostavi teret u stanicu samo ako na njoj postoji potražnja: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Dopusti izgradnju vrlo dugaÄkih mostova: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Dopusti naredbe za slanje u spremište: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD             :{LTBLUE}RuÄna metoda izgradnje primarne industrije: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE        :ništa
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE        :nijedna
 STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL      :kao i druge industrije
-STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :prosperirajuće
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :prosperirajuća
 STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Dopusti viÅ¡e sliÄnih industrija po gradu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Moguće je graditi spojene industrije iste vrste: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Uvijek prikaži dugi datum u statusnoj traci: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Prikaži znakove na strani po kojoj se vozi: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Prikaži financijski prozor na kraju godine: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}TTDPatch kompatibilno nonstop rukovanje: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Nizanje cestovnih vozila(sa kvantum efektima): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}PomiÄi prozor kada je miÅ¡ na rubu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Dozvoli potkupljivanje gradskih vlasti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Industrije iste vrste mogu biti izgrađene u blizini jedna druge: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Uvijek pokaži dugi datum u statusnoj traci: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Pokaži signale na vozaÄkoj strani: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Pokaži financijski prozor na kraju godine: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}TTDPatch kompatibilno neprekidno upravljanje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Nizanje cestovnih vozila (s kvantnim uÄincima): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Pomakni prozor kada je miš na rubu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Dopusti potkupljivanje lokalne samouprave: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}NeujednaÄene stanice: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novo globalno pronalaženje puteva (NPF, iskljuÄuje NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Težinski množitelj za teret za simulaciju teških vlakova: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Dozvoli drive-through cestovne prepreke na cestama pod vlašću grada: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Dozvoli izradu spojenih stanica: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Dopusti prolazne stanice na cestama u vlasti grada: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Dopusti izgradnju pridruženih stanica: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Uvjek omogući male zraÄne luke: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Uvijek dopusti male zraÄne luke: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Upozori kad se vlak izgubi: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}Pogledaj naređenja vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Upozori ako se vlak izgubio: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}Pregledaj naredbe vozila: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ORDER_REVIEW_OFF                             :ne
-STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :da, no iskljuÄi zaustavljena vozila
+STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :da, ali iskljuÄi zaustavljena vozila
 STR_CONFIG_PATCHES_ORDER_REVIEW_ON                              :od svih vozila
 STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Upozori ako je prihod vlaka negativan: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}Vozila ne zastaruju: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}Vozila ne zastarjevaju: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}Automatski zamijeni vozilo kada postane staro
-STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Automatski obnovi vozilo kada je {ORANGE}{STRING}{LTBLUE} mjeseci prije/poslije maksimalnog godišta
+STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Automatski obnovi vozilo {ORANGE}{STRING}{LTBLUE} mjeseci prije/poslije maksimalnog godišta
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Minimum novca potrebnih za automatsko obnavljanje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Trajanje poruke s greškom: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Prikaži broj stanovnika u traci sa imenom grada: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Nevidljivo drveće (sa prozirnim građevinama): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Pokaži broj stanovnika u oznaci imena grada: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Nevidljivo drveće (s prozirnim građevinama): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generator zemlje: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Izvorno
+STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Izvorni
 STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS                 :TerraGenesis
-STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Maksimalna udaljenost Rafinerija nafte od ruba {ORANGE}{STRING}
+STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Maksimalna udaljenost naftnih rafinerija od ruba {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SNOWLINE_HEIGHT                              :{LTBLUE}Visina linije snijega: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}Grubost terena (samo TerraGenesis) : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Vrlo glatko
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_SMOOTH                  :Glatko
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_ROUGH                   :Grubo
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_ROUGH              :Vrlo grubo
-STR_CONFIG_PATCHES_TREE_PLACER                                  :{LTBLUE}Algoritam postavljanja drveća: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TREE_PLACER                                  :{LTBLUE}Algoritam za sađenje drveća: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TREE_PLACER_NONE                             :Nijedan
-STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL                         :Izvorno
-STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED                         :Unaprijeđeno
+STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL                         :Izvorni
+STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED                         :Unaprijeđen
 STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION                           :{LTBLUE}Rotacija visinske mape: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE         :Obrnuto smjeru kazaljke na satu
+STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE         :Obrnuto od smjera kazaljke na satu
 STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE                 :U smjeru kazaljke na satu
 STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT                         :{LTBLUE}Visinski nivo koji ravna mapa u scenariju dobiva: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}Maksimalna raširenost stanice: {ORANGE}{STRING} {RED}Pozor: Visoka vrijednost usporuje igru
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Automatski servisiraj helikoptere na heliodromima: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Poveži alatnu traku za krajolik sa alatnim trakama za željeznicu/ceste/vodu/zraÄne luke: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Okreni smjer pomicanja: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Glatko skrolanje kroz mini pogled: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Pokaži mjerni opis kod korištenja raznih alata za izgradnju: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Pokaži tvrtkine livreje: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES_NONE                                :Ništa
+STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Poveži alatnu traku za krajolik s alatnim trakama za željeznicu/ceste/vodu/zraÄne luke: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Promijeni smjer klizanja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Glatko klizanje kroz mini pogled: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Pokaži mjerni opis prilikom korištenja raznih alata za izgradnju: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Pokaži tvrtkine boje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES_NONE                                :Nijedna
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Vlastita tvrtka
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Sve tvrtke
-STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Preferiraj timski chat sa <ENTER>:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Funkcija kotaÄića: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Preferiraj ekipni razgovor s <ENTER>:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Funkcija kotaÄića za klizanje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Zumiraj kartu
-STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Skrolaj kartom
-STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :IskljuÄeno
-STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Brzina kotaÄića za skrolanje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Kliži kartom
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :IskljuÄen
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Brzina kotaÄića za klizanje: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Emulacija desnog klika mišem: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command+klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control+klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :IskljuÄeno
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatski pauziraj prilikom pokretanja nove igre: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Koristi naprednu listu vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Koristi napredni popis vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :IskljuÄeno
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Vlastita tvrtka
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Sve tvrtke
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Koristi indikatore utovara: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}UkljuÄi raspored za vozila: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Pokaži raspored u otkucajima radije nego u danima: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Zadana vrsta traÄnica (poslije nove igre/podizanja igre): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Normalne traÄnice
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Elektrificirane traÄnice
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Monopruga
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :IskljuÄeno
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Vlastita tvrtka
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Sve tvrtke
+STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Omogući red vožnje za vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Pokaži raspored u otkucajima rađe nego u danima: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Inicijalna vrsta pruge (poslije nove igre/podizanja igre): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Normalna pruga
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Elektrificirana pruga
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :JednotraÄna pruga
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV                     :Maglev
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :Prvi dostupan
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Zadnji dostupan
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :NajÄešće koriÅ¡ten
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :Prva dostupna
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Zadnja dostupna
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :NajÄešće koriÅ¡tena
 
-STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Prikaži alate za građanje kada su prikladna vozila nedostupna: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Pokaži alate za izgradnju kada su odgovarajuća vozila nedostupna: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maksimalan broj vlakova po igraÄu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maximalan broj cestovnih vozila po igraÄu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maksimalan broj cestovnih vozila po igraÄu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Maksimalan broj zrakoplova po igraÄu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}Maximalan broj brodova po igraÄu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}Maksimalan broj brodova po igraÄu: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_AI_BUILDS_TRAINS                             :{LTBLUE}IskljuÄi vlakove za raÄunalo: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH                            :{LTBLUE}IskljuÄi cestovna vozila za raÄunalo: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}IskljuÄi zrakoplov za raÄunalo: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}IskljuÄi cestovna vozila za raÄunalo: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}IskljuÄi zrakoplove za raÄunalo: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}IskljuÄi brodove za raÄunalo: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Omogući novi AI (alfa): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Omogući AI u modu s viÅ¡e igraÄa (eksperimentalno): {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Pretpostavljeni period servisiranja vlakova: {ORANGE}{STRING} dana/%
-STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Pretpostavljeni period servisiranja vlakova: {ORANGE}onemogućeno
-STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Pretpostavljeni period servisiranja cestovnih vozila: {ORANGE}{STRING} dana/%
-STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Pretpostavljeni period servisiranja cestovnih vozila: {ORANGE}onemogućeno
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Pretpostavljeni period servisiranja zrakoplova: {ORANGE}{STRING} dana/%
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Pretpostavljeni period servisiranja aviona: {ORANGE}onemogućeno
-STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Pretpostavljeni period servisiranja brodova: {ORANGE}{STRING} dana/%
-STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Pretpostavljeni period servisiranja brodova: {ORANGE}onemogućeno
+STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Inicijalni servisni period za vlakove: {ORANGE}{STRING} dana/%
+STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Inicijalni servisni period za vlakove: {ORANGE}onemogućeno
+STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Inicijalni servisni interval za cestovna vozila: {ORANGE}{STRING} dana/%
+STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Inicijalni servisni interval za cestovna vozila: {ORANGE}onemogućeno
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Inicijalni servisni interval za zrakoplove: {ORANGE}{STRING} dana/%
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Inicijalni servisni interval za zrakoplove: {ORANGE}onemogućeno
+STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Inicijalni servisni interval za brodove: {ORANGE}{STRING} dana/%
+STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Inicijalni servisni interval za brodove: {ORANGE}onemogućeno
 STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}IskljuÄi servisiranje kada su kvarovi postavljeni na nula: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}UkljuÄi ograniÄenje brzine za vagone: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DISABLE_ELRAILS                              :{LTBLUE}Onemogući elektriÄne traÄnice: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}Omogući ograniÄenje brzine za vagone: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DISABLE_ELRAILS                              :{LTBLUE}Onemogući elektriÄnu prugu: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_COLORED_NEWS_YEAR                            :{LTBLUE}Vijesti u boji pojavljuju se: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}PoÄetna godina: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ENDING_YEAR                                  :{LTBLUE}Završna godina: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}UkljuÄi teÄnu ekonomiju (viÅ¡e manjih izazova)
-STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Dopusti kupovanje udjela drugih tvrtki
-STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Kod povlaÄenja, postavi signale svakih/svaku; {ORANGE}{STRING}ploÄica/u
+STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Dopusti kupovanje udjela u drugim tvrtkama
+STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Kod povlaÄenja, postavi signale svakih; {ORANGE}{STRING} ploÄica
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatski izgradi semafore prije: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Izgled grada "bezviše cesta" nije valjan u editoru scenarija
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Raspored grada "nema više cesta" nije valjan u editoru scenarija
 STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Odaberi grad-cesta raspored: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :nema više cesta
-STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :zadano
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :inicijalno
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :bolje ceste
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 mreža
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 mreža
@@ -1165,16 +1178,16 @@
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Lijevo
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Sredina
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Desno
-STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Radijus hvatanja  prozora: {ORANGE}{STRING} px
+STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Radijus hvatanja prozora: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Radijus hvatanja prozora: {ORANGE}iskljuÄen
 STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Brzina rasta gradova: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ništa
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Nema
 STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Sporo
 STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normalno
 STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Brzo
 STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Vrlo brzo
-STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporcije mjesta koja će postati gradovi: {ORANGE}1 u {STRING}
-STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporcije mjesta koja će postati gradovi: {ORANGE} Ništa
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Omjer gradova koji će postati metropole: {ORANGE}1 u {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Omjer gradova koji će postati metropole: {ORANGE}Nijedan
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}PoÄetni množitelj veliÄine grada: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}SuÄelje
@@ -1182,19 +1195,19 @@
 STR_CONFIG_PATCHES_VEHICLES                                     :{BLACK}Vozila
 STR_CONFIG_PATCHES_STATIONS                                     :{BLACK}Stanice
 STR_CONFIG_PATCHES_ECONOMY                                      :{BLACK}Ekonomija
-STR_CONFIG_PATCHES_AI                                           :{BLACK}Konkurenti
+STR_CONFIG_PATCHES_AI                                           :{BLACK}Suparnici
 
 STR_CONFIG_PATCHES_DISABLED                                     :onemogućeno
 STR_CONFIG_PATCHES_INT32                                        :{NUM}
 STR_CONFIG_PATCHES_CURRENCY                                     :{CURRENCY}
 
-STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Promjeni vrijednost postavke
-STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Neki ili svi od zadanih servisnih intervala ispod nisu kompatibilni sa odabranim postavkama! 5-90% ili 30-800 dana su valjane vrijednosti
+STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Promijeni vrijednost postavke
+STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Neki ili svi od zadanih servisnih intervala ispod nisu kompatibilni s odabranim postavkama! Valjane vrijednosti su 5-90% ili 30-800 dana.
 STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Koristi YAPF za brodove: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Koristi YAPF za cestovna vozila: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Koristi YAPF za vlakove: {ORANGE}{STRING}
 
-STR_TEMPERATE_LANDSCAPE                                         :Umjereni krajolik
+STR_TEMPERATE_LANDSCAPE                                         :Blagi krajolik
 STR_SUB_ARCTIC_LANDSCAPE                                        :Pod-arktiÄki krajolik
 STR_SUB_TROPICAL_LANDSCAPE                                      :Sub-tropski krajolik
 STR_TOYLAND_LANDSCAPE                                           :Toyland krajolik
@@ -1216,9 +1229,9 @@
 STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Ide prema {WAYPOINT}, {VELOCITY}
 
 STR_GO_TO_WAYPOINT                                              :Idi preko {WAYPOINT}
-STR_GO_NON_STOP_TO_WAYPOINT                                     :Idi non-stop preko {WAYPOINT}
+STR_GO_NON_STOP_TO_WAYPOINT                                     :Idi neprekidno preko {WAYPOINT}
 
-STR_WAYPOINTNAME_CITY                                           : Čvorište{TOWN}
+STR_WAYPOINTNAME_CITY                                           :Čvorište {TOWN}
 STR_WAYPOINTNAME_CITY_SERIAL                                    :Čvorište {TOWN} #{COMMA}
 STR_LANDINFO_WAYPOINT                                           :Čvorište
 
@@ -1230,12 +1243,12 @@
 STR_WAYPOINT_RAW                                                :{WAYPOINT}
 STR_EDIT_WAYPOINT_NAME                                          :{WHITE}Promijeni ime ÄvoriÅ¡ta
 
-STR_CANT_CHANGE_WAYPOINT_NAME                                   :{WHITE}Ne možeÅ¡ promijeniti ime ÄvoriÅ¡ta...
-STR_CONVERT_RAIL_TO_WAYPOINT_TIP                                :{BLACK}Promijeni traÄnicu u ÄvoriÅ¡te
-STR_CANT_BUILD_TRAIN_WAYPOINT                                   :{WHITE}Ne možeÅ¡ izgraditi željezniÄko ÄvoriÅ¡te ovdje...
-STR_CANT_REMOVE_TRAIN_WAYPOINT                                  :{WHITE}Ne možeÅ¡ ukloniti željezniÄko ÄvoriÅ¡te odavdje...
+STR_CANT_CHANGE_WAYPOINT_NAME                                   :{WHITE}Nije moguće promijeniti ime ÄvoriÅ¡ta...
+STR_CONVERT_RAIL_TO_WAYPOINT_TIP                                :{BLACK}Pretvori prugu u ÄvoriÅ¡te
+STR_CANT_BUILD_TRAIN_WAYPOINT                                   :{WHITE}Ovdje nije moguće izgraditi željezniÄko ÄvoriÅ¡te...
+STR_CANT_REMOVE_TRAIN_WAYPOINT                                  :{WHITE}Nije moguće ukloniti željezniÄko ÄvoriÅ¡te odavdje...
 
-STR_BUILD_AUTORAIL_TIP                                          :{BLACK}Izgradi željezniÄku traÄnicu koristeći Autorail modus
+STR_BUILD_AUTORAIL_TIP                                          :{BLACK}Izgradi željezniÄku prugu koristeći Autorail naÄin
 
 STR_NO_TOWN_IN_SCENARIO                                         :{WHITE}...u ovom scenariju nema gradova
 
@@ -1244,7 +1257,7 @@
 STR_RANDOM_TOWNS_TIP                                            :{BLACK}Popuni kartu nasumce smještenim gradovima
 STR_MANY_RANDOM_INDUSTRIES                                      :Mnoge nasumiÄne industrije
 STR_RANDOM_INDUSTRIES_TIP                                       :{BLACK}Popuni kartu nasumce smještenim industrijama
-STR_CAN_T_GENERATE_INDUSTRIES                                   :{WHITE}Ne možeš generirati gospodarstva...
+STR_CAN_T_GENERATE_INDUSTRIES                                   :{WHITE}Nije moguće generirati industrije...
 
 STR_LANDSCAPING_TOOLBAR_TIP                                     :{BLACK}Otvori alatnu traku za snižavanje/povećavanje, sadnju drveća, itd.
 STR_LANDSCAPING_TOOLBAR                                         :{WHITE}Uređivanje krajolika
@@ -1252,13 +1265,13 @@
 
 
 STR_TREES_RANDOM_TYPE                                           :{BLACK}Raznovrsno drveće
-STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Stavi drveće nasumiÄnog tipa
+STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Posadi raznovrsno drveće
 
-STR_CANT_BUILD_CANALS                                           :{WHITE}Ovdje ne možeš graditi kanale...
+STR_CANT_BUILD_CANALS                                           :{WHITE}Ovdje nije moguće izgraditi kanale...
 STR_BUILD_CANALS_TIP                                            :{BLACK}Izgradi kanale.
 STR_LANDINFO_CANAL                                              :Kanal
 
-STR_CANT_BUILD_LOCKS                                            :{WHITE}Ne mogu graditi brane ovdje...
+STR_CANT_BUILD_LOCKS                                            :{WHITE}Ovdje nije moguće izgraditi brane...
 STR_BUILD_LOCKS_TIP                                             :{BLACK}Izgradi brane
 STR_LANDINFO_LOCK                                               :Brana
 
@@ -1266,16 +1279,16 @@
 
 STR_LANDINFO_COORDS                                             :{BLACK}Koordinate: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
-STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Ne možeš ukloniti dio stanice...
-STR_CANT_CONVERT_RAIL                                           :{WHITE}Ne možeÅ¡ pretvoriti vrstu traÄnica ovdje...
-STR_CONVERT_RAIL_TIP                                            :{BLACK}Konvertiraj/Nadogradi vrstu traÄnica
+STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Nije moguće ukloniti dio stanice...
+STR_CANT_CONVERT_RAIL                                           :{WHITE}Ovdje nije moguće pretvoriti vrstu pruge...
+STR_CONVERT_RAIL_TIP                                            :{BLACK}Pretvori/nadogradi vrstu pruge
 
-STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP                                :{BLACK}Povucite lokomotivu na ovo mjesto da bi prodaoli cijeli vlak
+STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP                                :{BLACK}Ovdje povuci lokomotivu kako bi prodao cijeli vlak
 
 STR_DRAG_DROP                                                   :{BLACK}Povuci i spusti
 STR_STATION_DRAG_DROP                                           :{BLACK}Napravi stanicu koristeći drag & drop
-STR_SELECT_STATION_CLASS_TIP                                    :{BLACK}Odaberite vrstu stanice koju želite vidjeti
-STR_SELECT_STATION_TYPE_TIP                                     :{BLACK}Izaberite vrstu stanice za izgradnju
+STR_SELECT_STATION_CLASS_TIP                                    :{BLACK}Odaberi vrstu stanice za prikazivanje
+STR_SELECT_STATION_TYPE_TIP                                     :{BLACK}Odaberi vrstu stanice za izgradnju
 
 STR_FAST_FORWARD                                                :{BLACK}Premotaj igru naprijed
 STR_MESSAGE_HISTORY                                             :{WHITE}Povijest poruka
@@ -1310,24 +1323,24 @@
 
 STR_INDUSTRY_TOO_CLOSE                                          :{WHITE}...preblizu drugoj industriji
 
-STR_RAIL_REFIT_VEHICLE_TO_CARRY                                 :{BLACK}Prepravi vlak kako bi nosio drugu vrstu tereta
-STR_RAIL_REFIT_VEHICLE                                          :{BLACK}Prepravi vlak
-STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Izaberi vrstu tereta koju će vlak nositi
-STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED                             :{BLACK}Prepravi vlak kako bi nosio oznaÄenu vrstu tereta
-STR_RAIL_CAN_T_REFIT_VEHICLE                                    :{WHITE}Ne možeš prepraviti vlak...
-STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Servisni intervali u postotcima: {ORANGE}{STRING}
+STR_RAIL_REFIT_VEHICLE_TO_CARRY                                 :{BLACK}Prenamijeni vlak  za prijevoz neke druge vrste tereta
+STR_RAIL_REFIT_VEHICLE                                          :{BLACK}Prenamijeni vlak
+STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Odaberi vrstu tereta koju će vlak prevoziti
+STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED                             :{BLACK}Prenamijeni vlak za prijevoz oznaÄene vrste tereta
+STR_RAIL_CAN_T_REFIT_VEHICLE                                    :{WHITE}Nije moguće prenamijeniti vlak...
+STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Servisni su intervali u postotcima: {ORANGE}{STRING}
 STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Promijeni proizvodnju
 
 TEMP_AI_IN_PROGRESS                                             :{WHITE}Dobrodošli u novi AI pod razvojem. Ukoliko naiđete na probleme, napravite sliku ekrana i stavite ju na forum.
-TEMP_AI_ACTIVATED                                               :{WHITE}Upozorenje: ovaj novi AI je još uvijek alfa! Trenutno, samo kamioni i autobusi rade!
-TEMP_AI_MULTIPLAYER                                             :{WHITE}Upozorenje: implementacije je još uvijek pokusna (koristeći novi AI). Molimo prijavite bilo kakav problem na truelight@openttd.org
+TEMP_AI_ACTIVATED                                               :{WHITE}Upozorenje: ovaj novi AI još uvijek je alfa! Trenutno, samo kamioni i autobusi rade!
+TEMP_AI_MULTIPLAYER                                             :{WHITE}Upozorenje: implementacija je još uvijek pokusna (koristi novi AI). Molimo prijavite bilo kakav problem na truelight@openttd.org
 
 ############ network gui strings
 
 STR_NETWORK_MULTIPLAYER                                         :{WHITE}ViÅ¡e igraÄa
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Ime igraÄa:
-STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Ovo je ime po kojem će te drugi igraÄi identificirati
+STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Ovo je ime po kojem će te drugi igraÄi raspoznavati
 STR_NETWORK_CONNECTION                                          :{BLACK}Veza:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Izaberi između internetske igre ili igre preko lokalne mreže (LAN)
 
@@ -1337,7 +1350,7 @@
 STR_NETWORK_GAME_NAME                                           :{BLACK}Ime
 STR_NETWORK_GAME_NAME_TIP                                       :{BLACK}Ime igre
 STR_NETWORK_INFO_ICONS_TIP                                      :{BLACK}Jezik, verzija poslužitelja, itd.
-STR_NETWORK_CLICK_GAME_TO_SELECT                                :{BLACK}Klikni na igru s liste kako bi ju izabrao
+STR_NETWORK_CLICK_GAME_TO_SELECT                                :{BLACK}Klikni na igru s popisa kako bi ju odabrao
 
 STR_NETWORK_FIND_SERVER                                         :{BLACK}Pronađi poslužitelj
 STR_NETWORK_FIND_SERVER_TIP                                     :{BLACK}Pronađi poslužitelje u mreži
@@ -1347,7 +1360,7 @@
 
 STR_NETWORK_GENERAL_ONLINE                                      :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA}
 STR_NETWORK_CLIENTS_CAPTION                                     :{BLACK}Klijenti
-STR_NETWORK_CLIENTS_CAPTION_TIP                                 :{BLACK}Klijenata online / klijenata maks{}Tvrki online / tvrki maks
+STR_NETWORK_CLIENTS_CAPTION_TIP                                 :{BLACK}Klijenata online / klijenata maks{}Tvrtki online / tvrki maks.
 STR_NETWORK_GAME_INFO                                           :{SILVER}INFO O IGRI
 STR_ORANGE                                                      :{ORANGE}{STRING}
 STR_NETWORK_CLIENTS                                             :{SILVER}Klijenti:  {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
@@ -1362,7 +1375,7 @@
 STR_NETWORK_SERVER_OFFLINE                                      :{SILVER}POSLUŽITELJ NEDOSTUPAN
 STR_NETWORK_SERVER_FULL                                         :{SILVER}POSLUŽITELJ PUN
 STR_NETWORK_VERSION_MISMATCH                                    :{SILVER}RAZLIKA U VERZIJAMA
-STR_NETWORK_GRF_MISMATCH                                        :{SILVER}NEWGRF GREÅ KA
+STR_NETWORK_GRF_MISMATCH                                        :{SILVER}NEWGRF RAZLIKA
 
 STR_NETWORK_JOIN_GAME                                           :{BLACK}Pridruži se igri
 
@@ -1373,7 +1386,7 @@
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Ime igre bit će prikazno drugim igraÄima u izborniku za odabir igre s viÅ¡e igraÄa
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Postavi zaporku
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Zaštiti svoju igru pomoću zaporke ukoliko ne želiš da bude javno dostupna
-STR_NETWORK_SELECT_MAP                                          :{BLACK}Izaberi kartu:
+STR_NETWORK_SELECT_MAP                                          :{BLACK}Odaberi kartu:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Koju kartu želiš igrati?
 STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LAN
@@ -1384,7 +1397,7 @@
 STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maks klijenata:
 STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Izaberi maksimalan broj klijenata. Ne moraju sva mjesta biti popunjena.
 STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} tvrtk{P a e i}
-STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Maks tvrki:
+STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Maks tvrtki:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}OgraniÄi poslužitelj na odreÄ‘eni broj tvrtki
 STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} gledatelj{P "" a a}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Maks promatraÄa:
@@ -1393,9 +1406,9 @@
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Drugi igraÄi znat će kojim se jezikom govori na poslužitelju
 STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}ZapoÄni igru
-STR_NETWORK_START_GAME_TIP                                      :{BLACK}ZapoÄni novu igru u mreži na nasumiÄnoj mapi ili iz nasumiÄnog scenarija
+STR_NETWORK_START_GAME_TIP                                      :{BLACK}ZapoÄni novu igru u mreži na nasumiÄnoj mapi ili iz scenarija
 STR_NETWORK_LOAD_GAME                                           :{BLACK}UÄitaj igru
-STR_NETWORK_LOAD_GAME_TIP                                       :{BLACK}Nastavi snimljenu igru za viÅ¡e igraÄa (pazite da se spojite pod svojim imenom)
+STR_NETWORK_LOAD_GAME_TIP                                       :{BLACK}Nastavi ranije snimljenu igru za viÅ¡e igraÄa (pazite da se spojite pod svojim imenom)
 
 ############ Leave those lines in this order!!
 STR_NETWORK_LANG_ANY                                            :Bilo koji
@@ -1432,24 +1445,24 @@
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Predvorje igre za viÅ¡e igraÄa
 
 STR_NETWORK_PREPARE_TO_JOIN                                     :{BLACK}Pripremanje za pridruživanje:   {ORANGE}{STRING}
-STR_NETWORK_COMPANY_LIST_TIP                                    :{BLACK}Popis svih kompanija trenutno u igri. Možete se pridružiti jednoj ili osnovati novu ako postoji slobodno mjesto
+STR_NETWORK_COMPANY_LIST_TIP                                    :{BLACK}Popis svih tvrtki trenutno u igri. Možete se pridružiti jednoj ili osnovati novu ako postoji slobodno mjesto
 STR_NETWORK_NEW_COMPANY                                         :{BLACK}Nova tvrtka
 STR_NETWORK_NEW_COMPANY_TIP                                     :{BLACK}Otvori novu tvrtku
 STR_NETWORK_SPECTATE_GAME                                       :{BLACK}Gledaj igru
 STR_NETWORK_SPECTATE_GAME_TIP                                   :{BLACK}Promatraj igru kao gledatelj
 STR_NETWORK_JOIN_COMPANY                                        :{BLACK}Pridruži se tvrtki
-STR_NETWORK_JOIN_COMPANY_TIP                                    :{BLACK}Pomogni upravljati ovom tvrtkom
-STR_NETWORK_REFRESH                                             :{BLACK}Osvježi poslužitelja
+STR_NETWORK_JOIN_COMPANY_TIP                                    :{BLACK}Pomozi upravljati ovom tvrtkom
+STR_NETWORK_REFRESH                                             :{BLACK}Osvježi poslužitelj
 STR_NETWORK_REFRESH_TIP                                         :{BLACK}Osvježi podatke o poslužitelju
 
-STR_NETWORK_COMPANY_INFO                                        :{SILVER}PODACI O TVRTKI
+STR_NETWORK_COMPANY_INFO                                        :{SILVER}PODATCI O TVRTKI
 
 STR_NETWORK_COMPANY_NAME                                        :{SILVER}Ime tvrtke:  {WHITE}{STRING}
-STR_NETWORK_INAUGURATION_YEAR                                   :{SILVER}Preuzimanje dužnosti:  {WHITE}{NUM}
+STR_NETWORK_INAUGURATION_YEAR                                   :{SILVER}UstoliÄenje:  {WHITE}{NUM}
 STR_NETWORK_VALUE                                               :{SILVER}Vrijednost tvrtke:  {WHITE}{CURRENCY}
 STR_NETWORK_CURRENT_BALANCE                                     :{SILVER}Trenutno stanje:  {WHITE}{CURRENCY}
 STR_NETWORK_LAST_YEARS_INCOME                                   :{SILVER}Prošlogodišnji prihod:  {WHITE}{CURRENCY}
-STR_NETWORK_PERFORMANCE                                         :{SILVER}Izvršavanje: {WHITE}{NUM}
+STR_NETWORK_PERFORMANCE                                         :{SILVER}UÄinkovitost: {WHITE}{NUM}
 
 STR_NETWORK_VEHICLES                                            :{SILVER}Vozila:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
 STR_NETWORK_STATIONS                                            :{SILVER}Stanice:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
@@ -1458,7 +1471,7 @@
 STR_NETWORK_CONNECTING                                          :{WHITE}Spajanje...
 
 ############ Leave those lines in this order!!
-STR_NETWORK_CONNECTING_1                                        :{BLACK}(1/6) Spajanje u toku..
+STR_NETWORK_CONNECTING_1                                        :{BLACK}(1/6) Spajanje u tijeku..
 STR_NETWORK_CONNECTING_2                                        :{BLACK}(2/6) Provjera ovlaštenja..
 STR_NETWORK_CONNECTING_3                                        :{BLACK}(3/6) ÄŒekanje..
 STR_NETWORK_CONNECTING_4                                        :{BLACK}(4/6) Preuzimanje karte..
@@ -1469,34 +1482,34 @@
 STR_NETWORK_CONNECTING_SPECIAL_2                                :{BLACK}Dohvaćanje podataka o tvrtki..
 ############ End of leave-in-this-order
 STR_NETWORK_CONNECTING_WAITING                                  :{BLACK}{NUM} klijen{P t ta ata} {P je su je} prije Vas
-STR_NETWORK_CONNECTING_DOWNLOADING                              :{BLACK} Do sad je preuzeto {NUM} / {NUM} kbajta
+STR_NETWORK_CONNECTING_DOWNLOADING                              :{BLACK} Do sad je preuzeto {NUM} / {NUM} kilobajta
 
 STR_NETWORK_DISCONNECT                                          :{BLACK}Odspoji
 
-STR_NETWORK_GIVE_MONEY_CAPTION                                  :{WHITE}Unesite koliÄinu novca koju želite dati
-STR_NETWORK_NEED_GAME_PASSWORD_CAPTION                          :{WHITE}Poslužitelj je zaštićen. Upišite zaporku
+STR_NETWORK_GIVE_MONEY_CAPTION                                  :{WHITE}Unesi koliÄinu novca koju želiÅ¡ dati
+STR_NETWORK_NEED_GAME_PASSWORD_CAPTION                          :{WHITE}Poslužitelj je zaštićen. Unesite zaporku
 STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION                       :{WHITE}Tvrtka je zaštićena. Unesite zaporku
 STR_NETWORK_CLIENT_LIST                                         :{WHITE}Popis klijenata
 
-STR_NETWORK_ERR_NOTAVAILABLE                                    :{WHITE}Nisu pronađeni mrežni uređaji ili je kompajlirano bez ENABLE_NETWORK
+STR_NETWORK_ERR_NOTAVAILABLE                                    :{WHITE} Nisu pronađeni mrežni uređaji ili je kompajlirano bez ENABLE_NETWORK
 STR_NETWORK_ERR_NOSERVER                                        :{WHITE} Niti jedna mrežna igra nije pronađena
 STR_NETWORK_ERR_NOCONNECTION                                    :{WHITE} Poslužitelj nije odgovorio na zahtjev
-STR_NETWORK_ERR_NEWGRF_MISMATCH                                 :{WHITE} Ne mogu se spojiti zbog neslaganja u NewGRF
+STR_NETWORK_ERR_NEWGRF_MISMATCH                                 :{WHITE} Ne mogu se spojiti zbog razlike u NewGRF
 STR_NETWORK_ERR_DESYNC                                          :{WHITE} Neuspješno usklađivanje mrežne igre
 STR_NETWORK_ERR_LOSTCONNECTION                                  :{WHITE} Izgubljena veza sa mrežnom igrom
 STR_NETWORK_ERR_SAVEGAMEERROR                                   :{WHITE} Nije moguće uÄitati snimljenu igru
-STR_NETWORK_ERR_SERVER_START                                    :{WHITE} Nemoguće je pokrenuti poslužitelja
+STR_NETWORK_ERR_SERVER_START                                    :{WHITE} Nemoguće je pokrenuti poslužitelj
 STR_NETWORK_ERR_CLIENT_START                                    :{WHITE} Nije se moguće spojiti
 STR_NETWORK_ERR_TIMEOUT                                         :{WHITE} Istekla je veza #{NUM}
 STR_NETWORK_ERR_SERVER_ERROR                                    :{WHITE} Napravljena je greška u protokolu te se veza prekinula
-STR_NETWORK_ERR_WRONG_REVISION                                  :{WHITE}Revizija ovog klijenta ne slaže se sa revizijom servera
+STR_NETWORK_ERR_WRONG_REVISION                                  :{WHITE} Revizija ovog klijenta ne slaže se s revizijom poslužitelja
 STR_NETWORK_ERR_WRONG_PASSWORD                                  :{WHITE} Pogrešna zaporka
 STR_NETWORK_ERR_SERVER_FULL                                     :{WHITE} Poslužitelj je pun
-STR_NETWORK_ERR_SERVER_BANNED                                   :{WHITE} Zabranjen vam je pristup ovom poslužitelju
-STR_NETWORK_ERR_KICKED                                          :{WHITE} IzbaÄeni ste iz igre
-STR_NETWORK_ERR_CHEATER                                         :{WHITE} Na ovom poslužitelju nije dopušteno varanje
+STR_NETWORK_ERR_SERVER_BANNED                                   :{WHITE} Zabranjen ti je pristup ovom poslužitelju
+STR_NETWORK_ERR_KICKED                                          :{WHITE} IzbaÄen si iz igre
+STR_NETWORK_ERR_CHEATER                                         :{WHITE} Na ovome poslužitelju varanje nije dopušteno
 
-STR_NETWORK_ERR_LEFT                                            :je napustio igru
+STR_NETWORK_ERR_LEFT                                            :je napusti{G o la lo} igru
 ############ Leave those lines in this order!!
 STR_NETWORK_ERR_CLIENT_GENERAL                                  :opća greška
 STR_NETWORK_ERR_CLIENT_DESYNC                                   :greška u sinkronizaciji
@@ -1509,23 +1522,23 @@
 STR_NETWORK_ERR_CLIENT_WRONG_REVISION                           :pogrešna revizija
 STR_NETWORK_ERR_CLIENT_NAME_IN_USE                              :ime se već koristi
 STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD                           :pogrešna zaporka
-STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH                          :pogreÅ¡an igraÄ-id u DoCommand
+STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH                          :pogreÅ¡an id igraÄa u DoCommand
 STR_NETWORK_ERR_CLIENT_KICKED                                   :izbaÄen{G "" a o} od strane poslužitelja
 STR_NETWORK_ERR_CLIENT_CHEATER                                  :je pokuša{G o la lo} varati
 STR_NETWORK_ERR_CLIENT_SERVER_FULL                              :poslužitelj je pun
 ############ End of leave-in-this-order
 STR_NETWORK_CLIENT_JOINED                                       :se pridruži{G o la lo} igri
 STR_NETWORK_GIVE_MONEY                                          :je da{G o la lo} novac Vašoj tvrtki ({CURRENCY})
-STR_NETWORK_GAVE_MONEY_AWAY                                     :dali ste {STRING} novac ({CURRENCY})
-STR_NETWORK_CHAT_COMPANY_CAPTION                                :[Tim]:
-STR_NETWORK_CHAT_COMPANY                                        :[Tim] {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_TO_COMPANY                                     :[Tim] Za {STRING}: {GRAY}{STRING}
+STR_NETWORK_GAVE_MONEY_AWAY                                     :da{G o la lo} si {STRING} novac ({CURRENCY})
+STR_NETWORK_CHAT_COMPANY_CAPTION                                :[Ekipa]:
+STR_NETWORK_CHAT_COMPANY                                        :[Ekipa] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_TO_COMPANY                                     :[Ekipa] Za {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_CLIENT_CAPTION                                 :[Privatno] :
 STR_NETWORK_CHAT_CLIENT                                         :[Privatno] {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privatno] Za {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Svima] :
 STR_NETWORK_CHAT_ALL                                            :[Svima] {STRING}: {GRAY}{STRING}
-STR_NETWORK_NAME_CHANGE                                         :je promjeni {G o la lo} ime u
+STR_NETWORK_NAME_CHANGE                                         :je promjeni {G o la lo} svoje ime u
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Poslužitelj je zatvorio sesiju
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Poslužitelj se ponovno pokreće...{}Molimo priÄekajte...
 
@@ -1546,19 +1559,19 @@
 ############ end network gui strings
 
 
-STR_CONFIG_PATCHES_MAP_X                                        :{LTBLUE}VeliÄina karte X: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAP_Y                                        :{LTBLUE}VeliÄina karte Y: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAP_X                                        :{LTBLUE}X veliÄina karte: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAP_Y                                        :{LTBLUE}Y veliÄina karte: {ORANGE}{STRING}
 
 
 ##### PNG-MAP-Loader
 
 STR_PNGMAP_ERROR                                                :{WHITE}Nemoguće je uÄitati krajolik iz PNG-a...
 STR_PNGMAP_ERR_FILE_NOT_FOUND                                   :{WHITE}...datoteka nije pronađena.
-STR_PNGMAP_ERR_IMAGE_TYPE                                       :{WHITE}...ne mogu konvertirati tip slike. 8 ili 24-bitni PNG je potreban.
+STR_PNGMAP_ERR_IMAGE_TYPE                                       :{WHITE}...ne mogu pretvoriti vrstu slike. Potrebna je 8 ili 24-bitna PNG slika.
 STR_PNGMAP_ERR_MISC                                             :{WHITE}...nešto je otišlo u krivom smjeru. Oprostite. (vjerojatno je pokvarena datoteka)
 
 STR_BMPMAP_ERROR                                                :{WHITE}Ne mogu uÄitati krajolik iz BMP...
-STR_BMPMAP_ERR_IMAGE_TYPE                                       :{WHITE}...ne mogu pretvoriti tip slike.
+STR_BMPMAP_ERR_IMAGE_TYPE                                       :{WHITE}...ne mogu pretvoriti vrstu slike.
 
 ##id 0x0800
 STR_0800_COST                                                   :{TINYFONT}{RED}Trošak: {CURRENCY}
@@ -1569,8 +1582,8 @@
 STR_FEEDER                                                      :{YELLOW}Prebaci: {CURRENCY}
 STR_0805_ESTIMATED_COST                                         :{WHITE}Predviđeni trošak: {CURRENCY}
 STR_0807_ESTIMATED_INCOME                                       :{WHITE}Predviđeni prihod: {CURRENCY}
-STR_0808_CAN_T_RAISE_LAND_HERE                                  :{WHITE}Ne možeš povisiti zemlju ovdje...
-STR_0809_CAN_T_LOWER_LAND_HERE                                  :{WHITE}Ne možeš sniziti zemlju ovdje...
+STR_0808_CAN_T_RAISE_LAND_HERE                                  :{WHITE}Ovdje nije moguće povisiti zemlju...
+STR_0809_CAN_T_LOWER_LAND_HERE                                  :{WHITE}Ovdje nije moguće sniziti zemlju...
 STR_080A_ROCKS                                                  :Stijenje
 STR_080B_ROUGH_LAND                                             :Surova zemlja
 STR_080C_BARE_LAND                                              :Ogoljena zemlja
@@ -1585,76 +1598,76 @@
 STR_1002_EXCAVATION_WOULD_DAMAGE                                :{WHITE}Iskopavanje bi oštetilo tunel
 STR_1003_ALREADY_AT_SEA_LEVEL                                   :{WHITE}Već je na razini mora
 STR_1004_TOO_HIGH                                               :{WHITE}Previsoko
-STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Nije prikladno za želježnicke traÄnice
+STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Nije prikladno za želježnicku prugu
 STR_1007_ALREADY_BUILT                                          :{WHITE}...već izgrađeno
-STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}MoraÅ¡ najprije ukloniti traÄnice
+STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Najprije moraÅ¡ ukloniti željezniÄku prugu
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Izgradnja željeznice
-STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Izgradnja elektrificiranih traÄnica
+STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Izgradnja elektrificirane željeznice
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Izgradnja jednotraÄne željeznice
 STR_100C_MAGLEV_CONSTRUCTION                                    :{WHITE}Izgradnja MagLeva
 STR_100D_SELECT_RAIL_BRIDGE                                     :{WHITE}Odaberi željezniÄki most
-STR_100E_CAN_T_BUILD_TRAIN_DEPOT                                :{WHITE}Ovdje nije moguće graditi željezniÄko spremiÅ¡te...
+STR_100E_CAN_T_BUILD_TRAIN_DEPOT                                :{WHITE}Ovdje nije moguće izgraditi željezniÄko spremiÅ¡te...
 STR_100F_CAN_T_BUILD_RAILROAD_STATION                           :{WHITE}Ovdje nije moguće izgraditi željezniÄku stanicu...
-STR_1010_CAN_T_BUILD_SIGNALS_HERE                               :{WHITE}Ovdje ne možeš postaviti znakove...
-STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Ovdje ne možeÅ¡ graditi traÄnice...
-STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Odavde ne možeÅ¡ ukloniti traÄnice...
-STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Ovdje ne možeš maknuti znakove...
+STR_1010_CAN_T_BUILD_SIGNALS_HERE                               :{WHITE}Ovdje nije moguće postaviti signale...
+STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Ovdje nije moguće izgraditi željezniÄke traÄnice...
+STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Nije moguće ukloniti željezniÄku prugu odavdje...
+STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Nije moguće ukloniti signale odavdje...
 STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Smjer spremišta vlakova
-STR_1015_RAILROAD_CONSTRUCTION                                  :Izgradnja traÄnica
-STR_TOOLB_ELRAIL_CONSTRUCTION                                   :Izgradnja elektriÄne željezniÄke pruge
+STR_1015_RAILROAD_CONSTRUCTION                                  :Izgradnja željeznice
+STR_TOOLB_ELRAIL_CONSTRUCTION                                   :Izgradnja elektrificirane željeznice
 STR_1016_MONORAIL_CONSTRUCTION                                  :Izgradnja jednotraÄne željeznice
 STR_1017_MAGLEV_CONSTRUCTION                                    :Izgradnja MagLeva
-STR_1018_BUILD_RAILROAD_TRACK                                   :{BLACK}Izgradi traÄnicu
-STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING                         :{BLACK}Izgradi spremište vlakova (za gradnju i servisiranje vlakova)
+STR_1018_BUILD_RAILROAD_TRACK                                   :{BLACK}Izgradi željezniÄku prugu
+STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING                         :{BLACK}Izgradi spremište vlakova (za izgradnju i servisiranje vlakova)
 STR_101A_BUILD_RAILROAD_STATION                                 :{BLACK}Izgradi željezniÄku stanicu
-STR_101B_BUILD_RAILROAD_SIGNALS                                 :{BLACK}Izgradi željezniÄke znakove
+STR_101B_BUILD_RAILROAD_SIGNALS                                 :{BLACK}Izgradi željezniÄke signale
 STR_101C_BUILD_RAILROAD_BRIDGE                                  :{BLACK}Izgradi željezniÄki most
 STR_101D_BUILD_RAILROAD_TUNNEL                                  :{BLACK}Izgradi željezniÄki tunel
-STR_101E_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Prebacuj izgradnju/uklanjanje za traÄnice i željezniÄke signale
-STR_101F_BRIDGE_SELECTION_CLICK                                 :{BLACK}Odabir mosta - pritisni na most koji želiš izgraditi
+STR_101E_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Aktiviraj izgradnju/uklanjanje željezniÄke pruge i znakova
+STR_101F_BRIDGE_SELECTION_CLICK                                 :{BLACK}Izbor mosta - klikni na most koji želiš izgraditi
 STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO                       :{BLACK}Odaberi smjer željezniÄkog spremiÅ¡ta
-STR_1021_RAILROAD_TRACK                                         :TraÄnica
-STR_1023_RAILROAD_TRAIN_DEPOT                                   :Spremište vlakova
+STR_1021_RAILROAD_TRACK                                         :ŽeljezniÄka pruga
+STR_1023_RAILROAD_TRAIN_DEPOT                                   :ŽeljezniÄko spremiÅ¡te vlakova
 STR_1024_AREA_IS_OWNED_BY_ANOTHER                               :{WHITE}...podruÄje je u vlasniÅ¡tvu druge tvrke
-STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :TraÄnice s normalnim znakovima
-STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :TraÄnice s prethodno postavljenim znakovima
-STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :TraÄnice s izlaznim znakovima
-STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :TraÄnice s kombo znakovima
-STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :TraÄnice sa normalnim i prethodno postavljenim znakovima
-STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :TraÄnice sa normalnim i izlaznim znakovima
-STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :TraÄnice s normalnim i kombo znakovima
-STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :TraÄnice sa prethodno postavljenim i izlaznim znakovima
-STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :TraÄnice s prethodno postavljenim i kombo znakovima
-STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :TraÄnice s izlaznim i kombo znakovima
-STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Morati prvo maknuti željezniÄku stanicu
+STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :ŽeljezniÄke traÄnice s normalnim signalima
+STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :ŽeljezniÄke traÄnice s prethodno postavljenim signalima
+STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :ŽeljezniÄke traÄnice s izlaznim signalima
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :ŽeljezniÄke traÄnice s kombo signalima
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :ŽeljezniÄke traÄnice s normalnim i prethodno postavljenim signalima
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :ŽeljezniÄke traÄnice sa normalnim i izlaznim signalima
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :ŽeljezniÄke traÄnice s normalnim i kombo signalima
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :ŽeljezniÄke traÄnice s prethodno postavljenim i izlaznim signalima
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :ŽeljezniÄke traÄnice s prethodno postavljenim i kombo signalima
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :ŽeljezniÄke traÄnice s izlaznim i kombo signalima
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Najprije moraÅ¡ ukloniti željezniÄku stanicu
 
 
 
 ##id 0x1800
-STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Moraš prvo ukloniti cestu
+STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Najprije moraš ukloniti cestu
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Cestovni radovi u tijeku
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Izgradnja ceste
-STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Konstruiranje Tramvaja
-STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Izaberi cestovni most
-STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}...jednosmjerne ceste ne mogu imati raskršća
-STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Ovdje ne možeš graditi cestu...
-STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Ne mogu izgraditi tramvaj ovdje...
-STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Odavde ne možeš maknuti cestu...
-STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Ne mogu maknuti tramvaj odavde...
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Izgradnja tramvaja
+STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Odaberi cestovni most
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}...jednosmjerne ceste ne mogu imati raskrižja
+STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Ovdje nije moguće izgraditi cestu...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Ovdje nije moguće izgraditi tramvaj...
+STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Nije moguće ukloniti cestu odavdje...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Nije moguće ukloniti tramvaj odavdje...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Smjer cestovnog spremišta
-STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Smjer Tramvajskog Skladišta
-STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Ovdje ne možeš izgraditi spremište cestovnih vozila...
-STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Ne mogu izgraditi skladište tramvaja ovdje
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Smjer tramvajskog spremišta
+STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Ovdje nije moguće izgraditi spremište cestovnih vozila...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Ovdje nije moguće izgraditi tramvajsko spremište...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Nije moguće izgraditi autobusnu stanicu...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Nije moguće izgraditi kamionski terminal...
-STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Ne mogu izgraditi tramvajsku stanicu za putnike...
-STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Nemogu izgraditi teretnu tramvajsku stanicu...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Nije moguće izgraditi tramvajsku stanicu za putnike...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Nije moguće izgraditi teretnu tramvajsku stanicu...
 STR_180A_ROAD_CONSTRUCTION                                      :Izgradnja ceste
-STR_180A_TRAMWAY_CONSTRUCTION                                   :Konstruiranje tramvaja
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Izgradnja tramvaja
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Izgradi dio ceste
-STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Izgradi dio tramvaja
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Izgradi tramvajski dio
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Izgradi spremište cestovnih vozila (za izgradnju i servisiranje vozila)
-STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Izgradi skladište za tramvajska vozila(za izgradnju i servisiranje vozila)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Izgradi spremište tramvajskih vozila (za izgradnju i servisiranje vozila)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Izgradi autobusnu stanicu
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Izgradi pretovarni kamionski terminal
 STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Izgradi putniÄku tramvajsku stanicu
@@ -1663,19 +1676,19 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Izgradi tramvajski most
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Izgradi cestovni tunel
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Izgradi tramvajski tunel
-STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Prebacuj izgradnju/uklanjanje ceste
-STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}UkljuÄi izgradnju/brisanje za konstruiranje tramvaja
-STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Izaberi smjer spremišta cestovnih vozila
-STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Odaberi smjer skladišta za tramvaj
+STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Aktiviraj izgradnju/uklanjanje ceste
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Aktiviraj izgradnju/brisanje za izgradnju tramvaja
+STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Odaberi smjer spremišta cestovnih vozila
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Odaberi smjer tramvajskog spremišta
 STR_1814_ROAD                                                   :Cesta
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Cesta sa semaforima
 STR_1816_TREE_LINED_ROAD                                        :Cesta s tri trake
 STR_1817_ROAD_VEHICLE_DEPOT                                     :Spremište cestovnih vozila
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Prijelaz ceste preko željezniÄke pruge
-STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Ne mogu maknuti autobusnu stanicu...
-STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Ne mogu maknuti kamionsku stanicu...
-STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Ne mogu maknuti putniÄku tramvajsku stanicu...
-STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Ne mogu maknuti teretnu tramvajsku stanicu...
+STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Nije moguće ukloniti autobusnu stanicu...
+STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Nije moguće ukloniti kamionsku stanicu...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Nije moguće ukloniti putniÄku tramvajsku stanicu...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Nije moguće ukloniti teretnu tramvajsku stanicu...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Gradovi
@@ -1684,13 +1697,13 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
-STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Građevina mora prvo biti srušena
+STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Najprije moraš srušiti građevinu
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Stanovništvo: {ORANGE}{COMMA}{BLACK}  Kuće: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Preimenuj grad
-STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Grad se ne može preimenovati...
+STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Nije moguće preimenovati grad...
 STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN} lokalna samouprava odbija to dozvoliti
-STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}Imena gradova - pritisni na ime kako bi centrirao pogled na zaslon
+STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}Imena gradova - klikni na ime kako bi centrirao pogled na grad
 STR_200B_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centriraj glavni pogled na lokaciju grada
 STR_200C_CHANGE_TOWN_NAME                                       :{BLACK}Promijeni ime grada
 STR_200D_PASSENGERS_LAST_MONTH_MAX                              :{BLACK}Putnika prošli mjesec: {ORANGE}{COMMA}{BLACK}  maks: {ORANGE}{COMMA}
@@ -1713,7 +1726,7 @@
 STR_201E_STADIUM                                                :Stadion
 STR_201F_OLD_HOUSES                                             :Stare kuće
 STR_2020_LOCAL_AUTHORITY                                        :{BLACK}Lokalna samouprava
-STR_2021_SHOW_INFORMATION_ON_LOCAL                              :{BLACK}Prikaži informacije o lokalnoj samoupravi
+STR_2021_SHOW_INFORMATION_ON_LOCAL                              :{BLACK}Pokaži informacije o lokalnoj samoupravi
 STR_2022_LOCAL_AUTHORITY                                        :{WHITE}Lokalna samouprava {TOWN}
 STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}Ocjene prijevoznih tvrtki:
 STR_2024                                                        :{YELLOW}{COMPANY} {COMPANYNUM}: {ORANGE}{STRING}
@@ -1725,13 +1738,13 @@
 STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}Usluge subvencionirane:
 STR_202C_FROM_TO                                                :{ORANGE}{STRING} iz {STATION} prema {STATION}{YELLOW} ({COMPANY}
 STR_202D_UNTIL                                                  :{YELLOW}, do {DATE_SHORT})
-STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Istekla je ponuda subvencije:{}{}Prijevoz tereta ( {STRING} ) od {STRING} do {STRING} neće više biti subvencioniran.
-STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}PovuÄena subvencija:{}{}Prijevoz tereta ( {STRING} ) od {STATION} do {STATION} nije viÅ¡e subvencioniran.
-STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Ponuđena je subvencija:{}{}Prvi koji preveze teret ({STRING}) od {STRING} do {STRING} dobivat će subvenciju od lokalne samouprave!
-STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se 50% više sljedećih godinu dana!
-STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se dvostruko sljedećih godinu dana!
-STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se trostruko sljedećih godinu dana!
-STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se Äetverostruko sljedećih godinu dana!
+STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Istekla je ponuda subvencije:{}{}Prijevoz {STRING.gen} od {STRING} do {STRING} više ne će biti subvencioniran.
+STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}PovuÄena subvencija:{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} viÅ¡e nije subvencioniran.
+STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Ponuđena je subvencija:{}{}Prvi koji preveze {STRING.aku} od {STRING} do {STRING} primat će jednogodišnju subvenciju od lokalne samouprave!
+STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvencija je dodijeljena tvrtki {COMPANY}!{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} plaćat će se 50% više sljedećih godinu dana!
+STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvencija je dodijeljena tvrtki {COMPANY}!{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} plaćat će se dvostruko sljedećih godinu dana!
+STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvencija je dodijeljena tvrtki {COMPANY}!{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} plaćat će se trostruko sljedećih godinu dana!
+STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvencija je dodijeljena tvrtki {COMPANY}!{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} plaćat će se Äetverostruko sljedećih godinu dana!
 STR_2035_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN} lokalne vlasti odbijaju dozvoliti izgradnju joÅ¡ jedne zraÄne luke u ovom gradu
 STR_2036_COTTAGES                                               :Kolibe
 STR_2037_HOUSES                                                 :Kuće
@@ -1746,14 +1759,14 @@
 STR_2040_CINEMA                                                 :Kino
 STR_2041_SHOPPING_MALL                                          :TrgovaÄki centar
 STR_2042_DO_IT                                                  :{BLACK}UÄini to
-STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}Popis stvari koje treba uÄiniti u ovom gradu - pritisni za dodatne informacije
+STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}Popis stvari koje treba uÄiniti u ovom gradu - klikni za dodatne informacije
 STR_2044_CARRY_OUT_THE_HIGHLIGHTED                              :{BLACK}IzvrÅ¡i akcije oznaÄene na gornjem popisu
-STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}Dostupne akcije:
+STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}Dostupne radnje:
 STR_2046_SMALL_ADVERTISING_CAMPAIGN                             :Mala oglasna kampanja
 STR_2047_MEDIUM_ADVERTISING_CAMPAIGN                            :Srednja oglasna kampanja
 STR_2048_LARGE_ADVERTISING_CAMPAIGN                             :Velika oglasna kampanja
 STR_2049_FUND_LOCAL_ROAD_RECONSTRUCTION                         :Financiraj popravljanje lokalne prometnice
-STR_204A_BUILD_STATUE_OF_COMPANY                                :Izgradi kip vlasnika tvrke
+STR_204A_BUILD_STATUE_OF_COMPANY                                :Izgradi kip vlasnika tvrtke
 STR_204B_FUND_NEW_BUILDINGS                                     :Financiraj nove građevine
 STR_204C_BUY_EXCLUSIVE_TRANSPORT                                :Kupi ekskluzivna prava prijevozna
 STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY                              :Podmiti lokalnu samoupravu
@@ -1765,7 +1778,7 @@
 STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} Financiraj izgradnju novih poslovnih prostora u gradu.{}  Trošak: {CURRENCY}
 STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} Kupi jednogodišnje ekskluzivno pravo prijevoza u gradu. Gradska vlast će dopustiti putnicima i teretu da koriste stanice samo tvoje tvrtke.{} Trošak: {CURRENCY}
 STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC                         :{WHITE}{STRING}{}{YELLOW} Podmiti lokalnu vlast zbog povećanja rejtinga, riskirajući ozbiljne kazne ako vas uhvate{} Trošak: {CURRENCY}
-STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}{TOWN} zahvatile prometne gužve!{}{}Program popravka cesta koji financira tvrtka  {COMPANY} slijedećih će 6 mjeseci zadavati glavobolje motociskistima!
+STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}{TOWN} zahvatile prometne gužve!{}{}Program rekonstrukcije cesta koji financira tvrtka {COMPANY} sljedećih će 6 mjeseci zadavati glavobolje motoriziranima!
 STR_2056                                                        :{TINYFONT}{WHITE}{TOWN}
 STR_2057                                                        :{ORANGE}{TOWN}{BLACK} ({COMMA})
 STR_2058_UNDER_CONSTRUCTION                                     :{STRING} (u izgradnji)
@@ -1786,21 +1799,21 @@
 STR_2802_TREES                                                  :{WHITE}Drveće
 STR_2803_TREE_ALREADY_HERE                                      :{WHITE}...ovdje već postoji drvo
 STR_2804_SITE_UNSUITABLE                                        :{WHITE}...neprikladno mjesto
-STR_2805_CAN_T_PLANT_TREE_HERE                                  :{WHITE}Ovdje ne možeš posaditi drvo...
+STR_2805_CAN_T_PLANT_TREE_HERE                                  :{WHITE}Ovdje nije moguće posaditi drvo...
 STR_2806                                                        :{WHITE}{SIGN}
 STR_2808_TOO_MANY_SIGNS                                         :{WHITE}...previše znakova
-STR_2809_CAN_T_PLACE_SIGN_HERE                                  :{WHITE}Ovdje ne možeš postaviti znak...
+STR_2809_CAN_T_PLACE_SIGN_HERE                                  :{WHITE}Ovdje nije moguće postaviti znak...
 STR_280A_SIGN                                                   :Znak
 STR_280B_EDIT_SIGN_TEXT                                         :{WHITE}Izmijeni tekst znaka
-STR_280C_CAN_T_CHANGE_SIGN_NAME                                 :{WHITE}Ne možeš promijeniti ime znaka...
-STR_280D_SELECT_TREE_TYPE_TO_PLANT                              :{BLACK}Izaberi vrstu drveta za sadnju
+STR_280C_CAN_T_CHANGE_SIGN_NAME                                 :{WHITE}Nije moguće promijeniti ime znaka...
+STR_280D_SELECT_TREE_TYPE_TO_PLANT                              :{BLACK}Odaberi vrstu drveta za sadnju
 STR_280E_TREES                                                  :Drveće
 STR_280F_RAINFOREST                                             :Kišna šuma
 STR_2810_CACTUS_PLANTS                                          :Kaktusi
 
 ##id 0x3000
-STR_3000_RAIL_STATION_SELECTION                                 :{WHITE}Odabir željezniÄke stanice
-STR_3001_AIRPORT_SELECTION                                      :{WHITE}Odabir zraÄne luke
+STR_3000_RAIL_STATION_SELECTION                                 :{WHITE}Izbor željezniÄke stanice
+STR_3001_AIRPORT_SELECTION                                      :{WHITE}Izbor zraÄne luke
 STR_3002_ORIENTATION                                            :{BLACK}Smjer
 STR_3003_NUMBER_OF_TRACKS                                       :{BLACK}Broj traÄnica
 STR_3004_PLATFORM_LENGTH                                        :{BLACK}Dužina platforme
@@ -1812,12 +1825,12 @@
 STR_3008B_TOO_MANY_TRUCK_STOPS                                  :{WHITE}Previše kamionskih stanica
 STR_3009_TOO_CLOSE_TO_ANOTHER_STATION                           :{WHITE}Preblizu drugoj stanici/terminalu
 STR_300A_0                                                      :{WHITE}{STATION} {STATIONFEATURES}
-STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Prvo moraÅ¡ uniÅ¡titi željezniÄku stanicu
+STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Najprije moraÅ¡ sruÅ¡iti željezniÄku stanicu
 STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT                           :{WHITE}Preblizu drugoj zraÄnoj luci
-STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}MoraÅ¡ uniÅ¡titi zraÄnu luku prvo
+STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}Najprije moraÅ¡ sruÅ¡iti zraÄnu luku
 
 STR_3030_RENAME_STATION_LOADING                                 :Preimenuj stanicu/terminal
-STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}Ne možeš preimenovati stanicu...
+STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}Nije moguće preimenovati stanicu...
 STR_3032_RATINGS                                                :{BLACK}Ocjene
 STR_3033_ACCEPTS                                                :{BLACK}Prihvaća
 STR_3034_LOCAL_RATING_OF_TRANSPORT                              :{BLACK}Lokalna ocjena usluge prijevoza:
@@ -1841,30 +1854,30 @@
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Smjer autobusne stanice
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Smjer kamionskog terminala
 STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Orijentacija putniÄkog tramvaja
-STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Orijentacija tovarnog tramvaja
-STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Prvo moraš uništiti autobusnu stanicu
-STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Prvo moraš uništiti kamionski terminal
-STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Morate prvo maknuti putniÄku tramvajsku stanicu
-STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Morate prvo maknuti teretnu tramvajsku stanicu
-STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Stanic{P a e a}
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Orijentacija teretnog tramvaja
+STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Najprije moraš srušiti autobusnu stanicu
+STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Najprije moraš srušiti kamionski terminal
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Najprije moraÅ¡ sruÅ¡iti putniÄku tramvajsku stanicu
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Najprije moraš srušiti teretnu tramvajsku stanicu
+STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} stanic{P a e a}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Ništa -
 STR_304B_SITE_UNSUITABLE                                        :{WHITE}...neprikladno mjesto
 STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK                              :{WHITE}Preblizu drugom pristaništu
-STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Prvo moraš srušiti pristanište
-STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Izaberi smjer željezniÄke stanice
-STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Izaberi broj perona na željezniÄkoj stanici
-STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Izaberi dužinu željezniÄke stanice
-STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Izaberi smjer autobusne stanice
-STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Izaberi smjer kamionskog terminala
-STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Odaberite smjer putniÄke tramvajske stanice
-STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Odaberite smjer teretne tramvajske stanice
+STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Najprije moraš srušiti pristanište
+STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Odaberi smjer željezniÄke stanice
+STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Odaberi broj perona na željezniÄkoj stanici
+STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Odaberi dužinu željezniÄke stanice
+STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Odaberi smjer autobusne stanice
+STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Odaberi smjer kamionskog terminala
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Odaberi smjer putniÄke tramvajske stanice
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Odaberi smjer teretne tramvajske stanice
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centriraj glavni pogled na lokaciju stanice
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Pokaži ocjene stanice
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Promijeni ime stanice
-STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO                            :{BLACK}Prikaži popis prihvaćenog tereta
-STR_3057_STATION_NAMES_CLICK_ON                                 :{BLACK}Imena stanica - pritisni ime da bi centrirao glavni pogled na stanicu
-STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT                            :{BLACK}Izaberi veliÄinu/tip zraÄne luke
+STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO                            :{BLACK}Prikaži popis tereta koji se prihvaća
+STR_3057_STATION_NAMES_CLICK_ON                                 :{BLACK}Imena stanica - klikni na ime kako bi centrirao glavni pogled na stanicu
+STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT                            :{BLACK}Odaberi veliÄinu/vrstu zraÄne luke
 STR_305C_0                                                      :{STATION} {STATIONFEATURES}
 STR_STATION_SIGN_TINY                                           :{TINYFONT}{STATION}
 STR_305E_RAILROAD_STATION                                       :ŽeljezniÄka stanica
@@ -1881,22 +1894,22 @@
 STR_306A_BUOY_IN_THE_WAY                                        :{WHITE}...plutaÄa na putu
 STR_306C_STATION_TOO_SPREAD_OUT                                 :{WHITE}...stanica previše proširena
 STR_306D_NONUNIFORM_STATIONS_DISALLOWED                         :{WHITE}...neujednaÄene stanice onemogućene
-STR_USE_CTRL_TO_SELECT_MORE                                     :{BLACK}Drži CTRL kako bi izabrao više od jednog itema
+STR_USE_CTRL_TO_SELECT_MORE                                     :{BLACK}Drži CTRL kako bi odabrao više od jedne stavke
 
 STR_UNDEFINED                                                   :(neodređen znakovni niz)
 STR_STAT_CLASS_DFLT                                             :Pretpostavljena stanica
 STR_STAT_CLASS_WAYP                                             :Čvorišta
 
 ##id 0x3800
-STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Smjer brodskog spremišta
+STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Smjer spremišta brodova
 STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...mora biti izgrađen na vodi
-STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Ovdje ne možeš graditi brodsko spremište...
-STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Izaberi smjer brodskog spremišta
+STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Ovdje nije moguće izgraditi spremište brodova...
+STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Odaberi smjer spremišta brodova
 STR_3804_WATER                                                  :Voda
 STR_3805_COAST_OR_RIVERBANK                                     :Obala ili rijeÄni nasip
-STR_3806_SHIP_DEPOT                                             :Brodsko spremište
-STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...Ne možeš graditi na vodi
-STR_MUST_DEMOLISH_CANAL_FIRST                                   :{WHITE}Morate prvo maknuti kanal
+STR_3806_SHIP_DEPOT                                             :Spremište brodova
+STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...Nije moguće graditi na vodi
+STR_MUST_DEMOLISH_CANAL_FIRST                                   :{WHITE}Najprije moraš srušiti kanal
 
 ##id 0x4000
 STR_4000_SAVE_GAME                                              :{WHITE}Spremi igru
@@ -2003,11 +2016,10 @@
 STR_5001_ROAD_VEHICLE_IN_TUNNEL                                 :{WHITE}Cestovno vozilo u tunelu
 STR_5003_ANOTHER_TUNNEL_IN_THE_WAY                              :{WHITE}Smeta drugi tunel
 STR_5005_UNABLE_TO_EXCAVATE_LAND                                :{WHITE}Ne moguće iskopoati zemlju na drugoj strani tunela
-STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Moraš prvo srušiti tunel
-STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Moraš prvo srušiti most
+STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Najprije moraš srušiti tunel
+STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Najprije moraš srušiti most
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}PoÄetak i kraj ne mogu biti na istom mjestu
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Ispod mosta mora biti ravna zemlja ili voda
-STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}PoÄetak i kraj moraju biti u istoj liniji
+STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}PoÄetak i kraj moraju biti u ravnini
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Neprikladan teren za ulaz u tunel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
 STR_500E_SUSPENSION_STEEL                                       :Viseći, ÄeliÄni
@@ -2018,8 +2030,8 @@
 STR_5013_CONCRETE                                               :Betonski
 STR_5014_TUBULAR_STEEL                                          :Cijevni, ÄeliÄni
 STR_BRIDGE_TUBULAR_SILICON                                      :Cjevni, silikonski
-STR_5015_CAN_T_BUILD_BRIDGE_HERE                                :{WHITE}Ovdje se ne može graditi most...
-STR_5016_CAN_T_BUILD_TUNNEL_HERE                                :{WHITE}Ovdje se ne može graditi tunel...
+STR_5015_CAN_T_BUILD_BRIDGE_HERE                                :{WHITE}Ovdje nije moguće izgraditi most...
+STR_5016_CAN_T_BUILD_TUNNEL_HERE                                :{WHITE}Ovdje nije moguće izgraditi tunel...
 STR_5017_RAILROAD_TUNNEL                                        :ŽeljezniÄki tunel
 STR_5018_ROAD_TUNNEL                                            :Cestovni tunel
 STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE                           :ÄŒeliÄni viseći željezniÄki most
@@ -2041,10 +2053,10 @@
 STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}Smeta objekt
 STR_5801_TRANSMITTER                                            :OdaÅ¡iljaÄ
 STR_5802_LIGHTHOUSE                                             :Svjetionik
-STR_5803_COMPANY_HEADQUARTERS                                   :Sjedište tvrke
-STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...smeta sjedište tvrke
-STR_5805_COMPANY_OWNED_LAND                                     :Zemlja u posjedu tvrke
-STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Ova zemlja ne može se kupiti...
+STR_5803_COMPANY_HEADQUARTERS                                   :Sjedište tvrtke
+STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...smeta sjedište tvrtke
+STR_5805_COMPANY_OWNED_LAND                                     :Zemlja u posjedu tvrtke
+STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Ovu zemlju nije moguće kupiti...
 STR_5807_YOU_ALREADY_OWN_IT                                     :{WHITE}...već je u tvom vlasništvu!
 
 
@@ -2118,11 +2130,11 @@
 STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}Inteligencija natjecatelja: {ORANGE}{STRING}
 STR_680E_VEHICLE_BREAKDOWNS                                     :{LTBLUE}Kvarovi na vozilima: {ORANGE}{STRING}
 STR_680F_SUBSIDY_MULTIPLIER                                     :{LTBLUE}Subvencijski množitelj: {ORANGE}{STRING}
-STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}Troškovi građenja: {ORANGE}{STRING}
+STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}Troškovi izgradnje: {ORANGE}{STRING}
 STR_6811_TERRAIN_TYPE                                           :{LTBLUE}Vrsta terena: {ORANGE}{STRING}
 STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}KoliÄina mora/jezera: {ORANGE}{STRING}
 STR_6813_ECONOMY                                                :{LTBLUE}Ekonomija: {ORANGE}{STRING}
-STR_6814_TRAIN_REVERSING                                        :{LTBLUE}Promjena smjera vlakova: {ORANGE}{STRING}
+STR_6814_TRAIN_REVERSING                                        :{LTBLUE}Promjena smjera vlaka: {ORANGE}{STRING}
 STR_6815_DISASTERS                                              :{LTBLUE}Prirodne katastrofe: {ORANGE}{STRING}
 STR_16816_CITY_APPROVAL                                         :{LTBLUE}Stav gradsko vijeća prema restrukturiranju podruÄja: {ORANGE}{STRING}
 ############ range for difficulty settings ends
@@ -2164,7 +2176,7 @@
 STR_6835_AT_END_OF_LINE_ONLY                                    :IskljuÄivo na kraju pruge
 STR_6836_OFF                                                    :IskljuÄeno
 STR_6837_ON                                                     :UkljuÄeno
-STR_6838_SHOW_HI_SCORE_CHART                                    :{BLACK}Prikaz tablice najboljih rezultata
+STR_6838_SHOW_HI_SCORE_CHART                                    :{BLACK}Pokaži tablice najboljih rezultata
 STR_6839_PERMISSIVE                                             :Dopustiv
 STR_683A_TOLERANT                                               :Tolerantan
 STR_683B_HOSTILE                                                :Agresivan
@@ -2181,12 +2193,12 @@
 STR_7009_PRESIDENT_NAME                                         :{BLACK}Ime direktora
 STR_700A_COMPANY_NAME                                           :Ime tvrtke
 STR_700B_PRESIDENT_S_NAME                                       :Ime direktora
-STR_700C_CAN_T_CHANGE_COMPANY_NAME                              :{WHITE}Ime tvrtke ne može se promijeniti...
-STR_700D_CAN_T_CHANGE_PRESIDENT                                 :{WHITE}Ne možeš promijeniti ime direktora...
+STR_700C_CAN_T_CHANGE_COMPANY_NAME                              :{WHITE}Ime tvrtke nije moguće promijeniti...
+STR_700D_CAN_T_CHANGE_PRESIDENT                                 :{WHITE}Nije moguće promijeniti ime direktora...
 STR_700E_FINANCES                                               :{WHITE}{COMPANY} Financije {BLACK}{COMPANYNUM}
 STR_700F_EXPENDITURE_INCOME                                     :{WHITE}Izdatci/Prihodi
 STR_7010                                                        :{WHITE}{NUM}
-STR_7011_CONSTRUCTION                                           :{GOLD}Građenje
+STR_7011_CONSTRUCTION                                           :{GOLD}Izgradnja
 STR_7012_NEW_VEHICLES                                           :{GOLD}Nova vozila
 STR_7013_TRAIN_RUNNING_COSTS                                    :{GOLD}Troškovi uporabe vlakova
 STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Troškovi uporabe cestovnih vozila
@@ -2203,7 +2215,7 @@
 STR_701F                                                        :{BLACK}+{CURRENCY}
 STR_7020_TOTAL                                                  :{WHITE}Ukupno:
 STR_7021                                                        :{COMPANY} {COMPANYNUM}
-STR_7022_INCOME_GRAPH                                           :{WHITE}Graf prihoda
+STR_7022_INCOME_GRAPH                                           :{WHITE}Grafikon prihoda
 STR_CURRCOMPACT                                                 :{CURRCOMPACT}
 STR_7024                                                        :{COMMA}
 STR_7025_OPERATING_PROFIT_GRAPH                                 :{WHITE}Grafikon operativne dobiti
@@ -2214,16 +2226,16 @@
 STR_7029_BORROW                                                 :{BLACK}Pozajmi {SKIP}{SKIP}{CURRENCY}
 STR_702A_REPAY                                                  :{BLACK}Otplati {SKIP}{SKIP}{CURRENCY}
 STR_702B_MAXIMUM_PERMITTED_LOAN                                 :{WHITE}...najveći dopušteni zajam iznosi {CURRENCY}
-STR_702C_CAN_T_BORROW_ANY_MORE_MONEY                            :{WHITE}Ne možeš dobiti još kredita...
+STR_702C_CAN_T_BORROW_ANY_MORE_MONEY                            :{WHITE}Nije moguće posuditi još više novaca...
 STR_702D_LOAN_ALREADY_REPAYED                                   :{WHITE}...nema zajma za otplatu
 STR_702E_REQUIRED                                               :{WHITE}...{CURRENCY} potrebno
-STR_702F_CAN_T_REPAY_LOAN                                       :{WHITE}Ne možeš otplatiti zajam...
+STR_702F_CAN_T_REPAY_LOAN                                       :{WHITE}Nije moguće otplatiti zajam...
 STR_INSUFFICIENT_FUNDS                                          :{WHITE}Ne možeš dati novac koji je pozajmljen od banke...
-STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Odaberi novo lice za direktora
-STR_7031_CHANGE_THE_COMPANY_VEHICLE                             :{BLACK}Promijeni izgled vozila tvrtke
+STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Odaberi novo lice direktora
+STR_7031_CHANGE_THE_COMPANY_VEHICLE                             :{BLACK}Promijeni shemu boja za vozila tvrtke
 STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Promjeni ime direktora
 STR_7033_CHANGE_THE_COMPANY_NAME                                :{BLACK}Promijeni ime tvrtke
-STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Klikni na odabranu boju
+STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Klikni na željenu boju
 STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Povećaj iznos zajma
 STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Otplati dio zajma
 STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Direktor)
@@ -2234,19 +2246,19 @@
 STR_AIRCRAFT                                                    :{WHITE}{COMMA} zrakoplov
 STR_SHIPS                                                       :{WHITE}{COMMA} brod{P "" a ova}
 STR_7042_NONE                                                   :{WHITE}Ništa
-STR_7043_FACE_SELECTION                                         :{WHITE}Odabir lica
+STR_7043_FACE_SELECTION                                         :{WHITE}Izbor lica
 STR_7044_MALE                                                   :{BLACK}Muško
 STR_7045_FEMALE                                                 :{BLACK}Žensko
 STR_7046_NEW_FACE                                               :{BLACK}Novo lice
-STR_7047_CANCEL_NEW_FACE_SELECTION                              :{BLACK}Odustani od odabira novog lica
-STR_7048_ACCEPT_NEW_FACE_SELECTION                              :{BLACK}Prihvati odabir novog lica
+STR_7047_CANCEL_NEW_FACE_SELECTION                              :{BLACK}Odustani od izbora novog lica
+STR_7048_ACCEPT_NEW_FACE_SELECTION                              :{BLACK}Prihvati izbor novog lica
 STR_7049_SELECT_MALE_FACES                                      :{BLACK}Odaberi muška lica
 STR_704A_SELECT_FEMALE_FACES                                    :{BLACK}Odaberi ženska lica
 STR_704B_GENERATE_RANDOM_NEW_FACE                               :{BLACK}Generiraj nasumiÄno novo lice
 STR_704C_KEY                                                    :{BLACK}KljuÄ
-STR_704D_SHOW_KEY_TO_GRAPHS                                     :{BLACK}Prikaži kljuÄeve po grafovima
-STR_704E_KEY_TO_COMPANY_GRAPHS                                  :{WHITE}KljuÄ za grafove tvrtke
-STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY                           :{BLACK}Klikni ovdje za ukljuÄivanje/iskljuÄivanje tvrke s grafa
+STR_704D_SHOW_KEY_TO_GRAPHS                                     :{BLACK}Pokaži kljuÄeve na grafikonima
+STR_704E_KEY_TO_COMPANY_GRAPHS                                  :{WHITE}KljuÄ za grafikone tvrtke
+STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY                           :{BLACK}Klikni ovdje za ukljuÄivanje/iskljuÄivanje tvrtke s grafikona
 STR_7050_UNITS_OF_CARGO_DELIVERED                               :{WHITE}Dostavljenih jedinica tereta
 STR_7051_COMPANY_PERFORMANCE_RATINGS                            :{WHITE}Ocjena uÄinka tvrtke (najveća ocjena = 1000)
 STR_7052_COMPANY_VALUES                                         :{WHITE}Vrijednost tvrtki
@@ -2256,18 +2268,18 @@
 STR_7056_TRANSPORT_COMPANY_IN_TROUBLE                           :{BLACK}{BIGFONT}Prijevozna tvrtka u nevoljama!
 STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT}{COMPANY} će biti rasprodana ili objaviti bankrot ukoliko se uÄinak uskoro ne poboljÅ¡a!
 STR_7058_PRESIDENT                                              :{BLACK}{PLAYERNAME}{}(Direktor)
-STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Spajanje prijevoznih tvrki!
+STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Spajanje prijevoznih tvrtki!
 STR_705A_HAS_BEEN_SOLD_TO_FOR                                   :{BLACK}{BIGFONT}{COMPANY} je prodana tvrtki {COMPANY} za {CURRENCY}!
-STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT                         :{WHITE}Tražimo prijevoznu tvrku koja bi preuzela našu tvrtku.{}{}Želiš li kupiti tvrtku{COMPANY} za {CURRENCY}?
+STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT                         :{WHITE}Tražimo prijevoznu tvrtku koja bi preuzela našu tvrtku.{}{}Želiš li kupiti tvrtku {COMPANY} za {CURRENCY}?
 STR_705C_BANKRUPT                                               :{BLACK}{BIGFONT}Bankrot!
 STR_705D_HAS_BEEN_CLOSED_DOWN_BY                                :{BLACK}{BIGFONT}{COMPANY} je zatvorena od strane kreditora i sva je imovina rasprodana!
 STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED                         :{BLACK}{BIGFONT}Osnovana je nova prijevozna tvrtka!
 STR_705F_STARTS_CONSTRUCTION_NEAR                               :{BLACK}{BIGFONT}{COMPANY} zapoÄinje gradnju blizu grada {TOWN}!
-STR_7060_CAN_T_BUY_COMPANY                                      :{WHITE}Ne možeš kupiti tvrtku...
+STR_7060_CAN_T_BUY_COMPANY                                      :{WHITE}Nije moguće kupiti tvrtku...
 STR_7061_CARGO_PAYMENT_RATES                                    :{WHITE}Isplatne rate tereta
 STR_7062_DAYS_IN_TRANSIT                                        :{BLACK}{TINYFONT}Dana u tranzitu
 STR_7063_PAYMENT_FOR_DELIVERING                                 :{BLACK}{TINYFONT}Plaćanje za dostavu 10 jedinica (ili 10,000 litara) tereta za udaljenost od 20 kvadrata
-STR_7064_TOGGLE_GRAPH_FOR_CARGO                                 :{BLACK}Aktiviraj/deaktiviraj graf za vrstu tereta
+STR_7064_TOGGLE_GRAPH_FOR_CARGO                                 :{BLACK}UkljuÄi/iskljuÄi grafikon za vrstu tereta
 STR_7065                                                        :{BLACK}{TINYFONT}{STRING}
 STR_7066_ENGINEER                                               :Inženjer
 STR_7067_TRAFFIC_MANAGER                                        :Prijevozni upravitelj
@@ -2280,39 +2292,39 @@
 STR_706E_TYCOON                                                 :Tajkun
 STR_706F_BUILD_HQ                                               :{BLACK}Izgradi sjedište tvrtke
 STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}Izgradi središte tvrtke / pogledaj sjedište tvrtke
-STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}Izgradi sjedište kompanije negdje dalje za 1% troška od vrijednosti kompanije
-STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Ne mogu izgraditi sjedište tvrke...
+STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}Izgradi sjedište tvrtke negdje drugdje za 1% troška od cjelokupne vrijednosti tvrtke
+STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Nije moguće izgraditi sjedište tvrtke...
 STR_7072_VIEW_HQ                                                :{BLACK}Pogledaj sjedište tvrtke
 STR_RELOCATE_HQ                                                 :{BLACK}Premjesti sjedište kompanije
 STR_COMPANY_PASSWORD                                            :{BLACK}Zaporka
-STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Zaštiti svoju tvrku od neovlaštenog korištenje pomoću zaporke.
+STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Zaštiti svoju tvrtku od neovlaštenog korištenja pomoću zaporke.
 STR_SET_COMPANY_PASSWORD                                        :Postavi zaporku tvrtke
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Svjetska recesija!{}{}Financijski struÄnjaci oÄekuju najgore zbog ekonomske krize!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recesija zavrÅ¡ena!{}{}Obrat  u trgovanu daje samopouzdanje gospodarstvu jer ekonomija jaÄa!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Namjesti veliku/malu veliÄinu prozora
 STR_7076_COMPANY_VALUE                                          :{GOLD}Vrijednost tvrtke: {WHITE}{CURRENCY}
 STR_7077_BUY_25_SHARE_IN_COMPANY                                :{BLACK}Kupi 25% udjela u tvrtci
-STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}Prodaj 25% udio u tvrtci
+STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}Prodaj 25% udjela u tvrtci
 STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}Kupi 25% udjela u ovoj tvrtci
 STR_707A_SELL_25_SHARE_IN_THIS_COMPANY                          :{BLACK}Prodaj 25% udjela u ovoj tvrtci
-STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Ne možeš kupiti 25% udjela u ovoj tvrtci...
-STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Ne možeš prodati 25% udjela u ovoj tvrtci...
+STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Nije moguće kupiti 25% udjela u ovoj tvrtci...
+STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Nije moguće prodati 25% udjela u ovoj tvrtci...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% u vlasništvu {COMPANY})
 STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% u vlasništvu {COMPANY}{}   {COMMA}% u vlasništvu {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} je preuzeta od strane tvrtke {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Ova tvrka još nije dovoljno stara da bi trgovala udjelima...
 
 STR_LIVERY_DEFAULT                                              :Standardna boja
-STR_LIVERY_STEAM                                                :Parna lokomotva
-STR_LIVERY_DIESEL                                               :Dieselska lokomotiva
+STR_LIVERY_STEAM                                                :Parna lokomotiva
+STR_LIVERY_DIESEL                                               :Dizelska lokomotiva
 STR_LIVERY_ELECTRIC                                             :ElektriÄna lokomotiva
 STR_LIVERY_MONORAIL                                             :JednotraÄna lokomotiva
-STR_LIVERY_MAGLEV                                               :Maglevska lokomotiva
+STR_LIVERY_MAGLEV                                               :Maglev lokomotiva
 STR_LIVERY_DMU                                                  :DMU
 STR_LIVERY_EMU                                                  :EMU
-STR_LIVERY_PASSENGER_WAGON_STEAM                                :Lokomotiva s putnicima (Parna)
-STR_LIVERY_PASSENGER_WAGON_DIESEL                               :PutniÄka lokomotiva (dizelska)
-STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :Lokomotiva s putnicima (ElektriÄna)
+STR_LIVERY_PASSENGER_WAGON_STEAM                                :PutniÄka kola (parna)
+STR_LIVERY_PASSENGER_WAGON_DIESEL                               :PutniÄka kola (dizelska)
+STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :PutniÄka kola (elektriÄna)
 STR_LIVERY_FREIGHT_WAGON                                        :Teretni vagon
 STR_LIVERY_BUS                                                  :Autobus
 STR_LIVERY_TRUCK                                                :Kamion
@@ -2322,7 +2334,7 @@
 STR_LIVERY_SMALL_PLANE                                          :Mali zrakoplov
 STR_LIVERY_LARGE_PLANE                                          :Veliki zrakoplov
 STR_LIVERY_PASSENGER_TRAM                                       :PutniÄki tramvaj
-STR_LIVERY_FREIGHT_TRAM                                         :Tovarni tramvaj
+STR_LIVERY_FREIGHT_TRAM                                         :Teretni tramvaj
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Prikaži generalne sheme boja
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Prikaži sheme boja za vlak
@@ -2334,17 +2346,17 @@
 STR_LIVERY_PANEL_TIP                                            :{BLACK}Izaberi shemu boja za promjenu, ili višestruke sheme pomoću CTRL+klik. Klikni na kućicu kako bi odredio uporabu sheme
 
 ##id 0x8000
-STR_8000_KIRBY_PAUL_TANK_STEAM                                  :Kirby Paul Tank (Para)
+STR_8000_KIRBY_PAUL_TANK_STEAM                                  :Kirby Paul Tank (parni)
 STR_8001_MJS_250_DIESEL                                         :MJS 250 (Diesel)
 STR_8002_PLODDYPHUT_CHOO_CHOO                                   :Ploddyphut Choo-Choo
 STR_8003_POWERNAUT_CHOO_CHOO                                    :Powernaut Choo-Choo
 STR_8004_MIGHTYMOVER_CHOO_CHOO                                  :Mightymover Choo-Choo
 STR_8005_PLODDYPHUT_DIESEL                                      :Ploddyphut Diesel
 STR_8006_POWERNAUT_DIESEL                                       :Powernaut Diesel
-STR_8007_WILLS_2_8_0_STEAM                                      :Wills 2-8-0 (Para)
-STR_8008_CHANEY_JUBILEE_STEAM                                   :Chaney 'Jubilee' (Para)
-STR_8009_GINZU_A4_STEAM                                         :Ginzu 'A4' (Para)
-STR_800A_SH_8P_STEAM                                            :SH '8P' (Para)
+STR_8007_WILLS_2_8_0_STEAM                                      :Wills 2-8-0 (parni)
+STR_8008_CHANEY_JUBILEE_STEAM                                   :Chaney 'Jubilee' (parni)
+STR_8009_GINZU_A4_STEAM                                         :Ginzu 'A4' (parni)
+STR_800A_SH_8P_STEAM                                            :SH '8P' (parni)
 STR_800B_MANLEY_MOREL_DMU_DIESEL                                :Manley-Morel DMU (Diesel)
 STR_800C_DASH_DIESEL                                            :'Dash' (Diesel)
 STR_800D_SH_HENDRY_25_DIESEL                                    :SH/Hendry '25' (Diesel)
@@ -2526,18 +2538,18 @@
 STR_80BD_MIGHTYMOVER_CANDY_TRUCK                                :MightyMover Kamona za slatkiše
 STR_80BE_POWERNAUGHT_CANDY_TRUCK                                :Powernaught Kamion za slatkiše
 STR_80BF_WIZZOWOW_CANDY_TRUCK                                   :Wizzwow Kamion za slatkiše
-STR_80C0_MIGHTYMOVER_BATTERY_TRUCK                              :MightyMover Kamiona za baterije
-STR_80C1_POWERNAUGHT_BATTERY_TRUCK                              :Powernaught Kamion za baterije
-STR_80C2_WIZZOWOW_BATTERY_TRUCK                                 :Wizzwwow Kamion za baterije
-STR_80C3_MIGHTYMOVER_FIZZY_DRINK                                :MightyMover Kamion za gazirana pića
-STR_80C4_POWERNAUGHT_FIZZY_DRINK                                :Powernaught Kamion za gazirana pića
-STR_80C5_WIZZOWOW_FIZZY_DRINK_TRUCK                             :Wizzwow Kamion za gazirana pića
-STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK                              :MightyMover kamion s plastikom
-STR_80C7_POWERNAUGHT_PLASTIC_TRUCK                              :Powernaught kamion s plastikom
-STR_80C8_WIZZOWOW_PLASTIC_TRUCK                                 :Wizzowow kamion s plastikom
-STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK                               :MightyMover kamion s žvakaÄim gumama
-STR_80CA_POWERNAUGHT_BUBBLE_TRUCK                               :Powernaught kamion s žvakaÄim gumama
-STR_80CB_WIZZOWOW_BUBBLE_TRUCK                                  :Wizzowow kamion s žvakaÄim gumama
+STR_80C0_MIGHTYMOVER_BATTERY_TRUCK                              :MightyMover kamion za baterije
+STR_80C1_POWERNAUGHT_BATTERY_TRUCK                              :Powernaught kamion za baterije
+STR_80C2_WIZZOWOW_BATTERY_TRUCK                                 :Wizzwwow kamion za baterije
+STR_80C3_MIGHTYMOVER_FIZZY_DRINK                                :MightyMover kamion za gazirana pića
+STR_80C4_POWERNAUGHT_FIZZY_DRINK                                :Powernaught kamion za gazirana pića
+STR_80C5_WIZZOWOW_FIZZY_DRINK_TRUCK                             :Wizzwow kamion za gazirana pića
+STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK                              :MightyMover PlastiÄni Kamion
+STR_80C7_POWERNAUGHT_PLASTIC_TRUCK                              :Powernaught PlastiÄni Kamion
+STR_80C8_WIZZOWOW_PLASTIC_TRUCK                                 :Wizzwow PlastiÄni kamion
+STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK                               :MightyMover kamion sa žvakaÄim gumama
+STR_80CA_POWERNAUGHT_BUBBLE_TRUCK                               :Powernaught kamion sa žvakaÄim gumama
+STR_80CB_WIZZOWOW_BUBBLE_TRUCK                                  :Wizzowow kamion sa žvakaÄim gumama
 STR_80CC_MPS_OIL_TANKER                                         :MPS naftna cisterna
 STR_80CD_CS_INC_OIL_TANKER                                      :CS-Inc. naftna cisterna
 STR_80CE_MPS_PASSENGER_FERRY                                    :MPS putniÄki trajekt
@@ -2591,16 +2603,16 @@
 STR_80FE_GURU_X2_HELICOPTER                                     :Guru X2 Helicopter
 STR_80FF_POWERNAUT_HELICOPTER                                   :Powernaut Helicopter
 STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE                       :{WHITE}Poruka od proizvoÄ‘aÄa vozila
-STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Upravo smo dizajnirani novi {STRING} - jeste li zainteresirani za jednogodiÅ¡nje iskljuÄivo pravo uporabe ovog vozila, tako da vidimo kako se vozilo ponaÅ¡a prije nego Å¡to postane univerzalno dostupno?
+STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Upravo smo dizajnirani novi {STRING} - jeste li zainteresirani za jednogodišnje ekskluzivno pravo uporabe ovog vozila, kako bi vidjeli kako se vozilo ponaša prije nego što postane univerzalno dostupno?
 STR_8102_RAILROAD_LOCOMOTIVE                                    :željezniÄka lokomotiva
 STR_8103_ROAD_VEHICLE                                           :cestovno vozilo
 STR_8104_AIRCRAFT                                               :zrakoplov
 STR_8105_SHIP                                                   :brod
-STR_8106_MONORAIL_LOCOMOTIVE                                    :monorail lokomotiva
+STR_8106_MONORAIL_LOCOMOTIVE                                    :jednotraÄna željezniÄka lokomotiva
 STR_8107_MAGLEV_LOCOMOTIVE                                      :maglev lokomotiva
 
 ##id 0x8800
-STR_8800_TRAIN_DEPOT                                            :{WHITE}{TOWN} Spremište vlakova
+STR_8800_TRAIN_DEPOT                                            :{WHITE}Spremište vlakova grada {TOWN}
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Građani slave . . .{}Prvi vlak je stigao na {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detalji)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Vlak na putu
@@ -2612,16 +2624,16 @@
 STR_8809_GO_TO_TRANSFER_UNLOAD                                  :Go to {STATION} (Transferiraj i otiđi prazan)
 STR_880A_GO_TO_LOAD                                             :Idi do{STATION} (Utovar)
 STR_880B_GO_TO_TRANSFER_LOAD                                    :Idi do {STATION} (Transferiraj i priÄekaj puni utovar)
-STR_880C_GO_NON_STOP_TO                                         :Idi non-stop do {STATION}
-STR_880D_GO_TO_NON_STOP_TRANSFER                                :Idi non-stop do {STATION} (Transferiraj i preuzmi teret)
-STR_880E_GO_NON_STOP_TO_UNLOAD                                  :Idi non-stop do {STATION} (Istovar)
-STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Idi non-stop do {STATION} (Transferiraj i otiđi prazan)
-STR_8810_GO_NON_STOP_TO_LOAD                                    :Idi non-stop do{STATION} (Utovar)
-STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Idi non-stop do {STATION} (Transferiraj i priÄekaj puni utovar)
-STR_GO_TO_TRAIN_DEPOT                                           :Idi do {TOWN} spremište vlakova
-STR_SERVICE_AT_TRAIN_DEPOT                                      :Servisiraj u {TOWN} spremištu vlakova
-STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Idi non-stop do {TOWN} spremišta vlakova
-STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Servisiraj non-stop u {TOWN} ŽeljezniÄkom SkladiÅ¡tu
+STR_880C_GO_NON_STOP_TO                                         :Idi neprekidno do {STATION}
+STR_880D_GO_TO_NON_STOP_TRANSFER                                :Idi neprekidno do {STATION} (Transferiraj i preuzmi teret)
+STR_880E_GO_NON_STOP_TO_UNLOAD                                  :Idi neprekidno do {STATION} (Istovar)
+STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Idi neprekidno do {STATION} (Transferiraj i otiđi prazan)
+STR_8810_GO_NON_STOP_TO_LOAD                                    :Idi neprekidno do {STATION} (Utovar)
+STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Idi neprekidno do {STATION} (Transferiraj i priÄekaj puni utovar)
+STR_GO_TO_TRAIN_DEPOT                                           :Idi u spremište vlakova grada {TOWN}
+STR_SERVICE_AT_TRAIN_DEPOT                                      :Servisiranje u spremištu vlakova grada {TOWN}
+STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Idi neprekidno do spremišta vlakova grada {TOWN}
+STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Servisiraj neprekidno u spremištu vlakova grada {TOWN}
 
 STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Putovanje (bez rasporeda)
@@ -2630,10 +2642,10 @@
 STR_TIMETABLE_DAYS                                              :{COMMA} dan{P "" a a}
 STR_TIMETABLE_TICKS                                             :{COMMA} tik{P "" a ova}
 
-STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE} Krećem za {TOWN} ŽeljezniÄko SkladiÅ¡te
-STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE} Krećem za {TOWN} ŽeljezniÄko SkladiÅ¡te, {VELOCITY}
-STR_HEADING_FOR_TRAIN_DEPOT_SERVICE                             :{LTBLUE}Servis u {TOWN} ŽeljezniÄkom SkladiÅ¡tu
-STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL                         :{LTBLUE}Servis kod {TOWN} spremište vlakova, {VELOCITY}
+STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Kreće se prema spremištu vlakova grada {TOWN}
+STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Kreće se prema spremištu vlakova grada {TOWN}, {VELOCITY}
+STR_HEADING_FOR_TRAIN_DEPOT_SERVICE                             :{LTBLUE}Servisiranje u spremištu vlakova grada {TOWN}
+STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL                         :{LTBLUE}Servisiranje u spremištu vlakova grada {TOWN}, {VELOCITY}
 
 STR_INVALID_ORDER                                               :{RED} (Neispravna naredba)
 
@@ -2644,32 +2656,32 @@
 STR_8814_TRAIN_IS_WAITING_IN_DEPOT                              :{WHITE}Vlak {COMMA} Äeka u spremiÅ¡tu
 STR_8815_NEW_VEHICLES                                           :{BLACK}Nova vozila
 STR_8816                                                        :{BLACK}-
-STR_8819_TRAIN_TOO_LONG                                         :{WHITE}Vlak predugaÄak
+STR_8819_TRAIN_TOO_LONG                                         :{WHITE}PredugaÄak vlak
 STR_881A_TRAINS_CAN_ONLY_BE_ALTERED                             :{WHITE}Vlakovi mogu biti izmjenjeni jedino kad su zaustavljeni u spremištu
-STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} Vlak{P "" a ova}
+STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} vlak{P "" a ova}
 
 STR_881C_NEW_RAIL_VEHICLES                                      :{WHITE}Nova željezniÄka vozila
-STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Nova vozila elektriÄne pruge
-STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Nova monorail vozila
+STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Nova elektriÄna pružna vozila
+STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Nova jednotraÄna željezniÄka vozila
 STR_881E_NEW_MAGLEV_VEHICLES                                    :{WHITE}Nova maglev vozila
-STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}ŽeljezniÄka vozila
+STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}Pružna vozila
 
 STR_881F_BUILD_VEHICLE                                          :{BLACK}Izgradi vozilo
 STR_CLONE_ROAD_VEHICLE                                          :{BLACK}Kloniraj vozilo
 STR_CLONE_ROAD_VEHICLE_INFO                                     :{BLACK}Ovo će izgraditi kopiju cestovnog vozila. Control-clik će dijeliti naredbe
-STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Ovo će napraviti kopiju cestovnog vozila. Kliknite na ovu tipku i onda na cestovno vozilo unutar ili izvan skladišta. CTRL-klik će podijeliti naredbe
+STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Ovo će napraviti kopiju cestovnog vozila. Klikni na ovaj gumb i onda na cestovno vozilo unutar ili izvan spremišta. CTRL+klik će dijeliti naredbe
 STR_CLONE_TRAIN                                                 :{BLACK}Kloniraj vlak
 STR_CLONE_TRAIN_INFO                                            :{BLACK}Ovo će izgraditi kopiju vlaka ukljuÄujući sve vagone. Control-klik će dijeliti naredbe
-STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Ovo će napraviti kopiju vlaka ukljuÄujući vagone. Kliknite na ovu tipku i onda na vlak unutar ili izvan skladiÅ¡ta. CTRL-klik će podijeliti naredbe
+STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Ovo će napraviti kopiju vlaka ukljuÄujući sve vagone. Kliknite na ovaj gumb i onda na vlak unutar ili izvan spremiÅ¡ta. CTRL-klik će dijeliti naredbe
 STR_8820_RENAME                                                 :{BLACK}Preimenuj
 STR_8823_SKIP                                                   :{BLACK}PreskoÄi
 STR_8824_DELETE                                                 :{BLACK}Obriši
-STR_8825_NON_STOP                                               :{BLACK}Non-stop
+STR_8825_NON_STOP                                               :{BLACK}Neprekidno
 STR_8826_GO_TO                                                  :{BLACK}Idi do
 STR_8827_FULL_LOAD                                              :{BLACK}Puni utovar
 STR_8828_UNLOAD                                                 :{BLACK}Istovar
 STR_REFIT                                                       :{BLACK}Prenamijeni
-STR_REFIT_TIP                                                   :{BLACK}Odaberi tip tereta za prenamijeniti u ovoj narudžbi. CTRL-klik za brisanje uputa za prenamijenu
+STR_REFIT_TIP                                                   :{BLACK}Odaberi vrstu tereta za prenamijenu u ovoj naredbi. CTRL+klik kako bi uklonio naputak za prenamjenu
 STR_REFIT_ORDER                                                 :(Prenamijeni u {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK} Raspored
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Prebacivanje na pogled rasporeda
@@ -2677,53 +2689,53 @@
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Kraj naredbi - -
 STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Servis
-STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Ne mogu izgraditi željezniÄko vozilo...
+STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Nije moguće izgraditi željezniÄko vozilo...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Izgrađen: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
 STR_882D_VALUE                                                  :{LTBLUE}{ENGINE}{BLACK}   Vrijednost: {LTBLUE}{CURRENCY}
 STR_882E                                                        :{WHITE}{VEHICLE}
 STR_882F_LOADING_UNLOADING                                      :{LTBLUE}Utovar / Istovar
-STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}Vlak mora biti zaustavljan unutar skladišta
-STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT                              :{WHITE}Ne mogu poslati vlak u spremište...
+STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}Vlak mora biti zaustavljen unutar spremišta
+STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT                              :{WHITE}Nije moguće poslati vlak u spremište...
 STR_8831_NO_MORE_SPACE_FOR_ORDERS                               :{WHITE}Nema mjesta za nove naredbe
 STR_8832_TOO_MANY_ORDERS                                        :{WHITE}Previše naredbi
-STR_8833_CAN_T_INSERT_NEW_ORDER                                 :{WHITE}Ne možeš ubaciti novu naredbu...
-STR_8834_CAN_T_DELETE_THIS_ORDER                                :{WHITE}Ne možeš obrisati ovu naredbu...
-STR_8835_CAN_T_MODIFY_THIS_ORDER                                :{WHITE}Ne možeš izmjeniti ovu naredbu...
-STR_CAN_T_MOVE_THIS_ORDER                                       :{WHITE}Ne mogu pomaknuti ovu naredbu...
-STR_CAN_T_SKIP_ORDER                                            :{WHITE}Ne mohu preskoÄiti trenutaÄnu naredbu...
-STR_CAN_T_SKIP_TO_ORDER                                         :{WHITE}Nwe mogu skoÄiti na odabranu naredbu...
-STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Ne možeš pomaknuti vozilo...
+STR_8833_CAN_T_INSERT_NEW_ORDER                                 :{WHITE}Nije moguće ubaciti novu naredbu...
+STR_8834_CAN_T_DELETE_THIS_ORDER                                :{WHITE}Nije moguće obrisati ovu naredbu...
+STR_8835_CAN_T_MODIFY_THIS_ORDER                                :{WHITE}Nije moguće izmijeniti ovu naredbu...
+STR_CAN_T_MOVE_THIS_ORDER                                       :{WHITE}Nije moguće pomaknuti ovu naredbu...
+STR_CAN_T_SKIP_ORDER                                            :{WHITE}Neije moguće preskoÄiti trenutnu naredbu...
+STR_CAN_T_SKIP_TO_ORDER                                         :{WHITE}Nije moguće skoÄiti na odabranu naredbu...
+STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Nije moguće ukloniti vozilo...
 STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}Stražnja lokomotiva će uvijek pratiti svog prednjeg dvojnika
 STR_8838_N_A                                                    :N/A{SKIP}
-STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Ne možeÅ¡ prodati željezniÄko vozilo
+STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Nije moguće prodati željezniÄko vozilo
 STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Ne može pronaći put do lokalnog spremišta
-STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Ne možeš zaustaviti/pokrenuti vlak...
+STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Nije moguće zaustaviti/pokrenuti vlak...
 STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Servisni interval: {LTBLUE}{COMMA}dana{BLACK}   Zadnji servis: {LTBLUE}{DATE_LONG}
 STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Servisni interval: {LTBLUE}{COMMA}%{BLACK} Zadnji servis: {LTBLUE}{DATE_LONG}
 STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Vlakovi - klikni na vlak za informacije
 STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Izgradi/kupi nove vlakove (zahtijeva spremište vlakova)
 STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Vlakovi - klikni na vlak za informacije., vuci vozilo kako bi dodao/oduzeo od vlaka
 STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}Izgradi novi vlak
-STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Povuci vlak ovdje za prodaju
-STR_8842_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Centriraj glavni pogled na lokaciju željezniÄkog skladiÅ¡ta
-STR_8843_TRAIN_VEHICLE_SELECTION                                :{BLACK}Lista za odabiranje vlakova - klikni na vlak za informacije
+STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Ovdje povuci vlak kako bi ga prodao
+STR_8842_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Centriraj glavni pogled na lokaciju željezniÄkog spremiÅ¡ta
+STR_8843_TRAIN_VEHICLE_SELECTION                                :{BLACK}Popis izabranih vlakova - klikni na vlak za informacije
 STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN                            :{BLACK}Izgradi oznaÄeni vlak
-STR_8845_RENAME_TRAIN_VEHICLE_TYPE                              :{BLACK}Preimenuj tip vlaka
-STR_8846_CURRENT_TRAIN_ACTION_CLICK                             :{BLACK}Akcije trenutnog vlaka - klikni za zaustavljanje/pokretanje vlaka
+STR_8845_RENAME_TRAIN_VEHICLE_TYPE                              :{BLACK}Preimenuj vrstu vagona
+STR_8846_CURRENT_TRAIN_ACTION_CLICK                             :{BLACK}Trenutna radnja vlaka - klikni ovdje kako bi zaustavio/pokrenuo vlak
 STR_8847_SHOW_TRAIN_S_ORDERS                                    :{BLACK}Pokaži naredbe vlaka
 STR_8848_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Centriraj glavni pogled na lokaciju vlaka
-STR_8849_SEND_TRAIN_TO_DEPOT                                    :{BLACK}Pošalji vlak u skladište. CTRL+klik će ga samo servisirati
-STR_884A_FORCE_TRAIN_TO_PROCEED                                 :{BLACK}Natjeraj vlak da nastavi bez Äekanja za odobrenjem signala
+STR_8849_SEND_TRAIN_TO_DEPOT                                    :{BLACK}Pošalji vlak u spremište. CTRL+klik će samo servisirati
+STR_884A_FORCE_TRAIN_TO_PROCEED                                 :{BLACK}Natjeraj vlak da nastavi bez Äekanja signala odobrenja
 STR_884B_REVERSE_DIRECTION_OF_TRAIN                             :{BLACK}Okreni smjer vlaka
-STR_884C_SHOW_TRAIN_DETAILS                                     :{BLACK}Prikaži detalje vlaka
+STR_884C_SHOW_TRAIN_DETAILS                                     :{BLACK}Pokaži detalje vlaka
 STR_884D_INCREASE_SERVICING_INTERVAL                            :{BLACK}Povećaj servisni interval
 STR_884E_DECREASE_SERVICING_INTERVAL                            :{BLACK}Smanji servisni interval
-STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED                          :{BLACK}Pokaži detalje prevoženog tereta
+STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED                          :{BLACK}Pokaži detalje tereta koji se prevozi
 STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES                         :{BLACK}Pokaži detalje vagona
-STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Pokaži kapacitet svakog vagona
-STR_8852_SHOW_TOTAL_CARGO                                       :{BLACK}Pokaži potpuni kapacitet vlaka, podijeljen prema tipu tereta
-STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Lista naredbi - klikni na naredbu da ju oznaÄiÅ¡. CTRL + klik klizi na stanicu
-STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}PreskoÄi trenutnu naredbu, i pokreni slijedeću. CTRL + klik preskaÄe na odabranu naredbu
+STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Pokaži nosivosti svakog vagona
+STR_8852_SHOW_TOTAL_CARGO                                       :{BLACK}Pokaži ukupnu nosivost vlaka podijeljenu prema vrsti tereta
+STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Popis naredbi - klikni na naredbu kako bi ju oznaÄio. CTRL + klik klizi na stanicu
+STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}PreskoÄi trenutnu naredbu i pokreni slijedeću. CTRL + klik preskaÄe na odabranu naredbu
 STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}ObriÅ¡i oznaÄenu naredbu
 STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Napravi oznaÄenu naredbu da bude non-stop
 STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Umetni novu naredbu prije odabrane naredbe, ili dodaj na kraj liste
@@ -2742,126 +2754,126 @@
 STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY}  (prošle godine: {CURRENCY})
 STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pouzdanost: {LTBLUE}{COMMA}%  {BLACK}Kvarova od zadnjeg servisa: {LTBLUE}{COMMA}
 STR_8861_STOPPED                                                :{RED}Zaustavljen
-STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}Ne mogu natjerati vlak da ignorira znakove dok je opasnost...
+STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}Nije moguće natjerati vlak da ignorira signale dok traje opasnost...
 STR_8863_CRASHED                                                :{RED}Slupan!
 
 STR_8865_NAME_TRAIN                                             :{WHITE}Imenuj vlak
-STR_8866_CAN_T_NAME_TRAIN                                       :{WHITE}Ne mogu imenovati vlak...
+STR_8866_CAN_T_NAME_TRAIN                                       :{WHITE}Nije moguće imenovati vlak...
 STR_8867_NAME_TRAIN                                             :{BLACK}Imenuj vlak
-STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Vlak se sudario!{}{COMMA} poginulih u eksploziji nakon sudara
-STR_8869_CAN_T_REVERSE_DIRECTION                                :{WHITE}Ne mogu promijeniti smjer vlaka...
-STR_886A_RENAME_TRAIN_VEHICLE_TYPE                              :{WHITE}Preimenuj vrstu vlaka
-STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Ne mogu preimenovati tip vagona...
-STR_886D_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Naprvi da oznaÄeni red prisili vozilo da izbaci teret
+STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Vlak se sudario!{}{COMMA} poginu{P o la lih} u eksploziji nakon sudara
+STR_8869_CAN_T_REVERSE_DIRECTION                                :{WHITE}Nije moguće promijeniti smjer vlaka...
+STR_886A_RENAME_TRAIN_VEHICLE_TYPE                              :{WHITE}Preimenuj vrstu vagona
+STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Nije moguće preimenovati vrstu vagona...
+STR_886D_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Napravi da oznaÄena naredba prisili vozilo da izbaci teret
 STR_886F_TRANSFER                                               :{BLACK}Transfer
 STR_CLEAR_TIME                                                  :{BLACK}Obriši vrijeme
 STR_RESET_LATENESS                                              :{BLACK}PoniÅ¡ti BrojaÄ KaÅ¡njenja
 
 STR_TRAIN_STOPPING                                              :{RED}Zaustavljam
 STR_TRAIN_STOPPING_VEL                                          :{RED}Zaustavljam, {VELOCITY}
-STR_INCOMPATIBLE_RAIL_TYPES                                     :Nekompatibilan tip traÄnica
+STR_INCOMPATIBLE_RAIL_TYPES                                     :Nekompatibilna vrsta traÄnica
 STR_TRAIN_NO_POWER                                              :{RED}Nema struje
-STR_TRAIN_START_NO_CATENARY                                     :Ovim traÄnicama nedostaje vuÄna užad, tako da vlak ne može krenuti
+STR_TRAIN_START_NO_CATENARY                                     :Ovoj pruzi nedostaje vuÄna užad, stoga vlak ne može krenuti
 
 STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Novi {STRING} je sada dostupan!
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Novi {STRING} je sada dostupan! - {ENGINE}
 
-STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Ne mogu rasporediti vozilo...
+STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Nije moguće rasporediti vozilo...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Vozila mogu Äekati samo na stanicama.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Ovo vozilo se ne zaustavlja na ovoj stanici.
 STR_TIMETABLE_CHANGE_TIME                                       :{BLACK}Promijeni Vrijeme
 STR_TIMETABLE_STATUS_ON_TIME                                    :Ovo vozilo vozi na vrijeme
 STR_TIMETABLE_STATUS_LATE                                       :Ovo vozilo trenutaÄno {STRING} kasni
 STR_TIMETABLE_STATUS_EARLY                                      :Ovo vozilo je stiglo {STRING} ranije
-STR_TIMETABLE_TOTAL_TIME                                        :Ovaj raspored će trebati {STRING} za završetak
-STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :OVaj raspored će trebati najmanje {STRING} za završetak (nije sve raspoređeno)
+STR_TIMETABLE_TOTAL_TIME                                        :Ovaj raspored trebat će {STRING} za završetak
+STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :Ovaj raspored trebat će najmanje {STRING} za završetak (nije sve raspoređeno)
 STR_TIMETABLE_AUTOFILL                                          :{BLACK}Automatsko punjenje
 STR_TIMETABLE_AUTOFILL_TOOLTIP                                  :{BLACK}Napuni raspored automatski sa vrijednostima iz prvog puta
 
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Cestovno vozilo na putu
-STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Cestovno vozilo{P "" a a}
+STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} cestovn{P o a ih} vozil{P o a a}
 STR_9002                                                        :{WHITE}{VEHICLE}
-STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}{TOWN} Spremište cestovnih vozila
+STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}Spremište cestovnih vozila grada {TOWN}
 STR_9004_NEW_VEHICLES                                           :{BLACK}Nova vozila
 STR_9006_NEW_ROAD_VEHICLES                                      :{WHITE}Nova cestovna vozila
 STR_9007_BUILD_VEHICLE                                          :{BLACK}Izgradi vozilo
-STR_9009_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Ne mogu izgraditi cestovno vozilo...
+STR_9009_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Nije moguće izgraditi cestovno vozilo...
 STR_900C_DETAILS                                                :{WHITE}{VEHICLE} (Detalji)
 STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}Starost: {LTBLUE}{STRING}{BLACK}   Trošak uporabe {LTBLUE}{CURRENCY}/god
 STR_900E_MAX_SPEED                                              :{BLACK}Maks brzina: {LTBLUE}{VELOCITY}
 STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY}  (prošle godine: {CURRENCY})
 STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pouzdanost: {LTBLUE}{COMMA}%  {BLACK}Kvarovi od posljednjeg servisa: {LTBLUE}{COMMA}
 STR_9011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Izgrađen: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
-STR_9012_CAPACITY                                               :{BLACK}Kapacitet: {LTBLUE}{CARGO}
+STR_9012_CAPACITY                                               :{BLACK}Nosivost: {LTBLUE}{CARGO}
 STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...mora biti zaustavljen unutar spremišta cestovnih vozila
-STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}Ne mogu prodati cestovno vozilo...
-STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}Ne mogu zaustaviti/pokrenuti cestovno vozilo...
+STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}Nije moguće prodati cestovno vozilo...
+STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}Nije moguće zaustaviti/pokrenuti cestovno vozilo...
 STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}Cestovno vozilo {COMMA} Äeka u spremiÅ¡tu
-STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Kreće se prema {TOWN} cestovnom spremištu
-STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Kreće se prema {TOWN} cestovnom spremištu, {VELOCITY}
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Servisiranje u {TOWN} cestovnom spremištu
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}Seervisiranje u {TOWN} cestovnom spremištu, {VELOCITY}
-STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT                            :{WHITE}Ne mogu poslati vozilo u spremište...
+STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Kreće se prema cestovnom spremištu grada {TOWN}
+STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Kreće se prema cestovnom spremištu grada {TOWN}, {VELOCITY}
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Servisiranje u cestovnom spremištu grada {TOWN}
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}Servisiranje u cestovnom spremištu grada {TOWN}, {VELOCITY}
+STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT                            :{WHITE}Nije moguće poslati vozilo u spremište...
 STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Ne mogu pronaći lokalno spremište
 STR_901A_ROAD_VEHICLES_CLICK_ON                                 :{BLACK}Cestovna vozila - klikni na vozilo za informacije
 STR_901B_BUILD_NEW_ROAD_VEHICLES                                :{BLACK}Izgradi nova cestovna vozila (zahtijeva spremište cestovnih vozila)
 STR_901C_CURRENT_VEHICLE_ACTION                                 :{BLACK}Trenutna radnja vozila - klikni ovdje kako bi zaustavio/pokrenuo vozilo
-STR_901D_SHOW_VEHICLE_S_ORDERS                                  :{BLACK}Prikaži naredbe vozila
+STR_901D_SHOW_VEHICLE_S_ORDERS                                  :{BLACK}Pokaži naredbe vozila
 STR_901E_CENTER_MAIN_VIEW_ON_VEHICLE                            :{BLACK}Centriraj glavni pogled na lokaciju vozila
 STR_901F_SEND_VEHICLE_TO_DEPOT                                  :{BLACK}Pošalji vozilo u spremište. CTRL+klik će samo servisirati
 STR_9020_FORCE_VEHICLE_TO_TURN_AROUND                           :{BLACK}Natjeraj vozila da se okrene natrag
-STR_9021_SHOW_ROAD_VEHICLE_DETAILS                              :{BLACK}Prikaži detalje cestovnog vozila
+STR_9021_SHOW_ROAD_VEHICLE_DETAILS                              :{BLACK}Pokaži detalje cestovnog vozila
 STR_9022_VEHICLES_CLICK_ON_VEHICLE                              :{BLACK}Vozila - klikni na vozilo za informaciju
 STR_9023_BUILD_NEW_ROAD_VEHICLE                                 :{BLACK}Izgradi novo cestovno vozilo
 STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Povuci cestovno vozilo ovdje kako bi ga prodao
 STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}Centriraj glavni pogled na lokaciju spremišta cestovnih vozila
-STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Popis cestovnih vozila - pritisni na vozilo za informacije
+STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Popis izabranih cestovnih vozila - klikni na vozilo za informacije
 STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}Izgradi oznaÄeno cestovno vozilo
 STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Trošak: {CURRENCY}{}Brzina: {VELOCITY}{}Trošak uporabe: {CURRENCY}/god{}Kapacitet: {CARGO}
-STR_ARTICULATED_RV_CAPACITY                                     :{BLACK}Kapacitet: {LTBLUE}
+STR_ARTICULATED_RV_CAPACITY                                     :{BLACK}Nosivost: {LTBLUE}
 STR_BARE_CARGO                                                  :{CARGO}
 
 STR_902C_NAME_ROAD_VEHICLE                                      :{WHITE}Imenuj cestovno vozilo
-STR_902D_CAN_T_NAME_ROAD_VEHICLE                                :{WHITE}Ne mogu imenovati cestovno vozilo...
+STR_902D_CAN_T_NAME_ROAD_VEHICLE                                :{WHITE}Nije moguće imenovati cestovno vozilo...
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Imenuj cestovno vozilo
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Građani slave . . .{}Prvi bus je stigao na {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Građani slave . . .{}Prvi kamion je stigao na {STATION}!
 STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}GraÄ‘ani slave . . .{}Prvi putniÄki tramvaj je stigao na {STATION}!
-STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Građani slave . . .{}Prvi teretni tramvaj je stigao u {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Građani slave . . .{}Prvi teretni tramvaj je stigao na {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Sudar cestovnog vozila!{}VozaÄ poginuo u eksploziji nakon sudara s vlakom
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Sudar cestovnog vozila!{}{COMMA} poginulih u eksploziji nakon sudara s vlakom
-STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Ne mogu natjerati vozilo da se okrene...
+STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Nije moguće natjerati vozilo da se okrene...
 STR_ONLY_TURN_SINGLE_UNIT                                       :{WHITE}Ne mogu okreniti vozila koja se sastoje od više jedinica
 STR_9034_RENAME                                                 :{BLACK}Preimenuj
 STR_9035_RENAME_ROAD_VEHICLE_TYPE                               :{BLACK}Preimenuj vrstu cestovnog vozila
 STR_9036_RENAME_ROAD_VEHICLE_TYPE                               :{WHITE}Preimenuj vrstu cestovnog vozila
-STR_9037_CAN_T_RENAME_ROAD_VEHICLE                              :{WHITE}Ne mogu preimenovati vrstu cestovnog vozila...
-STR_9038_GO_TO_ROADVEH_DEPOT                                    :Idi prema spremištu cestovnih vozila {TOWN}
-STR_SERVICE_AT_ROADVEH_DEPOT                                    :Servisiranje pri {TOWN} spremištu cestovnih vozila
+STR_9037_CAN_T_RENAME_ROAD_VEHICLE                              :{WHITE}Nije moguće preimenovati vrstu cestovnog vozila...
+STR_9038_GO_TO_ROADVEH_DEPOT                                    :Idi prema spremištu cestovnih vozila grada {TOWN}
+STR_SERVICE_AT_ROADVEH_DEPOT                                    :Servisiranje u spremištu cestovnih vozila grada {TOWN}
 
-STR_REFIT_ROAD_VEHICLE_TO_CARRY                                 :{BLACK}Prenamijeni cestovno vozilo za prijevoz druge vrste tereta
+STR_REFIT_ROAD_VEHICLE_TO_CARRY                                 :{BLACK}Prenamijeni cestovno vozilo  za prijevoz neke druge vrste tereta
 STR_REFIT_ROAD_VEHICLE                                          :{BLACK}Prenamijeni cestovno vozilo
-STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Prenamijeni cestovno vozilo za prijevoz druge vrste tereta
-STR_REFIT_ROAD_VEHICLE_CAN_T                                    :{WHITE}Ne mogu prenamijeniti cestovno vozilo...
-STR_ROAD_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Izaberi vrstu tereta koje će cestovno vozilo prevoziti
+STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Prenamijeni cestovno vozilo  za prijevoz oznaÄene vrste tereta
+STR_REFIT_ROAD_VEHICLE_CAN_T                                    :{WHITE}Nije moguće prenamijeniti cestovno vozilo...
+STR_ROAD_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Odaberi vrstu tereta koje će cestovno vozilo prevoziti
 
 ##id 0x9800
 STR_9800_DOCK_CONSTRUCTION                                      :Izgradnja pristaništa
 STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}Izgradnja pristaništa
-STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Ovdje ne mogu izgraditi pristanište...
-STR_9803_SHIP_DEPOT                                             :{WHITE}{TOWN} Spremište brodova
+STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Ovdje nije moguće izgraditi pristanište...
+STR_9803_SHIP_DEPOT                                             :{WHITE} Spremište brodova grada {TOWN}
 STR_9804_NEW_SHIPS                                              :{BLACK}Novi brodovi
-STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} Brod{P "" a ova}
+STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} brod{P "" a ova}
 STR_9808_NEW_SHIPS                                              :{WHITE}Novi brodovi
 STR_9809_BUILD_SHIP                                             :{BLACK}Izgradi brod
 STR_CLONE_SHIP                                                  :{BLACK}Kloniraj brod
 STR_CLONE_SHIP_INFO                                             :{BLACK}Ovo će izgradi kopiju broda. Control-klik će dijeliti naredbe
-STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Ovo će napraviti kopiju broda. Kliknite na ovu tipku i onda na brod unutar ili izvan skladišta. CTRL-klik će podijeliti naredbe
+STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Ovo će napraviti kopiju broda. Klikni na ovaj gumb i onda na brod unutar ili izvan spremišta. CTRL+klik će dijeliti naredbe
 STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Brod mora biti zaustavljen u spremištu
-STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Ne mogu prodati brod...
-STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Ne mogu izgraditi brod...
+STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Nije moguće prodati brod...
+STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Nije moguće izgraditi brod...
 STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Smeta brod
 STR_980F                                                        :{WHITE}{VEHICLE}
 STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (Detalji)
@@ -2870,66 +2882,66 @@
 STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY}  (prošle godine: {CURRENCY})
 STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pouzdanost: {LTBLUE}{COMMA}%  {BLACK}Kvarova od posljednjeg servisa: {LTBLUE}{COMMA}
 STR_9816_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Izgrađeno: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
-STR_9817_CAPACITY                                               :{BLACK}Zapremnina: {LTBLUE}{CARGO}
-STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}Ne mogu pokrenuti/zaustaviti brod...
-STR_9819_CAN_T_SEND_SHIP_TO_DEPOT                               :{WHITE}Ne mogu poslati brod u skladište...
-STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Ne mogu naći lokalno spremište
-STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Kreće se prema {TOWN} spremištu brodova
-STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Kreće se prema {TOWN} spremištu brodova, {VELOCITY}
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE                              :{LTBLUE}Servisiranje u {TOWN} spremištu brodova
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL                          :{LTBLUE}Servisiranje u {TOWN} spremištu brodova, {VELOCITY}
+STR_9817_CAPACITY                                               :{BLACK}Nosivost: {LTBLUE}{CARGO}
+STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}Nije moguće pokrenuti/zaustaviti brod...
+STR_9819_CAN_T_SEND_SHIP_TO_DEPOT                               :{WHITE}Nije moguće poslati brod u spremište...
+STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Ne mogu pronaći lokalno spremište
+STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Kreće se prema spremištu brodova grada {TOWN}
+STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Kreće se prema spremištu brodova grada {TOWN}, {VELOCITY}
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE                              :{LTBLUE}Servisiranje u spremištu brodova grada {TOWN}
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL                          :{LTBLUE}Servisiranje u spremištu brodova grada {TOWN}, {VELOCITY}
 STR_981C_SHIP_IS_WAITING_IN_DEPOT                               :{WHITE}Brod {COMMA} Äeka u spremiÅ¡tu
 STR_981D_BUILD_SHIP_DOCK                                        :{BLACK}Izgradi brodsko pristanište
-STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING                          :{BLACK}Izgradi spremište brodova (za gradnu i servisiranje brodova)
+STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING                          :{BLACK}Izgradi spremište brodova (za izgradnju i servisiranje brodova)
 STR_981F_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Brodovi - klikni na brod za informacije
 STR_9820_BUILD_NEW_SHIP                                         :{BLACK}Izgradi novi brod
 STR_9821_DRAG_SHIP_TO_HERE_TO_SELL                              :{BLACK}Povuci brod ovdje kako bi ga prodao
 STR_9822_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Centriraj glavni pogled na lokaciju spremišta brodova
 STR_9823_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Brodovi - klikni na brod za informacije
 STR_9824_BUILD_NEW_SHIPS_REQUIRES                               :{BLACK}Izgradi nove brodove (zahtijeva spremište brodova)
-STR_9825_SHIP_SELECTION_LIST_CLICK                              :{BLACK}Popis brodova - pritisni na brod za informacije
+STR_9825_SHIP_SELECTION_LIST_CLICK                              :{BLACK}Popis izabranih brodova - klikni na brod za informacije
 STR_9826_BUILD_THE_HIGHLIGHTED_SHIP                             :{BLACK}Izgradi oznaÄeni brod
-STR_9827_CURRENT_SHIP_ACTION_CLICK                              :{BLACK}Trenutna radnja broda - pritisni ovdje za zaustavljanje/pokretanje broda
-STR_9828_SHOW_SHIP_S_ORDERS                                     :{BLACK}Prikaži naredbe broda
+STR_9827_CURRENT_SHIP_ACTION_CLICK                              :{BLACK}Trenutna radnja broda - klikni ovdje kako bi zaustavio/pokrenuo brod
+STR_9828_SHOW_SHIP_S_ORDERS                                     :{BLACK}Pokaži naredbe broda
 STR_9829_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Centriraj glavni pogled na lokaciju broda
 STR_982A_SEND_SHIP_TO_DEPOT                                     :{BLACK}Pošalji brod u spremište. CTRL+klik će samo servisirati
-STR_982B_SHOW_SHIP_DETAILS                                      :{BLACK}Prikaži detalje broda
-STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Trošak {CURRENCY} Maks. brzina: {VELOCITY}{}Kapacitet: {CARGO}{}Trošak uporabe: {CURRENCY}/god
+STR_982B_SHOW_SHIP_DETAILS                                      :{BLACK}Pokaži detalje broda
+STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Trošak {CURRENCY} Maks. brzina: {VELOCITY}{}Nosivost: {CARGO}{}Trošak uporabe: {CURRENCY}/god
 STR_982F_NAME_SHIP                                              :{BLACK}Imenuj brod
 
 STR_9831_NAME_SHIP                                              :{WHITE}Imenuj brod
-STR_9832_CAN_T_NAME_SHIP                                        :{WHITE}Ne mogu imenovati brod...
+STR_9832_CAN_T_NAME_SHIP                                        :{WHITE}Nije moguće imenovati brod...
 STR_9833_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Građani slave . . .{}Prvi brod  je stigao u {STATION}!
 STR_9834_POSITION_BUOY_WHICH_CAN                                :{BLACK}Smjesti plutaÄu koja može biti koriÅ¡tena kao pokazatelj puta
-STR_9835_CAN_T_POSITION_BUOY_HERE                               :{WHITE}Ne mogu staviti plutaÄu ovdje...
+STR_9835_CAN_T_POSITION_BUOY_HERE                               :{WHITE}Nije moguće staviti plutaÄu ovdje...
 STR_9836_RENAME                                                 :{BLACK}Preimenuj
 STR_9837_RENAME_SHIP_TYPE                                       :{BLACK}Preimenuj vrstu broda
 STR_9838_RENAME_SHIP_TYPE                                       :{WHITE}Preimenuj vrstu broda
-STR_9839_CAN_T_RENAME_SHIP_TYPE                                 :{WHITE}Ne mogu preimenovati vrstu broda...
-STR_983A_REFIT_CARGO_SHIP_TO_CARRY                              :{BLACK}Prenamijeni teretni brod da nosi neku drugu vrstu tereta
+STR_9839_CAN_T_RENAME_SHIP_TYPE                                 :{WHITE}Nije moguće preimenovati vrstu broda...
+STR_983A_REFIT_CARGO_SHIP_TO_CARRY                              :{BLACK}Prenamijeni teretni brod za prijevoz neke druge vrste tereta
 STR_983B_REFIT                                                  :{WHITE}{VEHICLE} (Prenamijeni)
 STR_983C_REFIT_SHIP                                             :{BLACK}Prenamijeni brod
-STR_983D_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Odabri vrstu tereta za prijevoz brodom:
-STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED                        :{BLACK}Prenamjeni brod za prijevoz oznaÄene vrste tereta
-STR_983F_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Odabri vrstu tereta za prijevoz:
-STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nova zapremnina: {GOLD}{CARGO}{}{BLACK}Cijena prenamjene: {GOLD}{CURRENCY}
-STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Ne mogu prenamijeniti brod...
+STR_983D_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Odaberi vrstu tereta za prijevoz brodom
+STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED                        :{BLACK}Prenamijeni brod za prijevoz oznaÄene vrste tereta
+STR_983F_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Odaberi vrstu tereta za prijevoz:
+STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nova nosivost: {GOLD}{CARGO}{}{BLACK}Cijena prenamjene: {GOLD}{CURRENCY}
+STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Nije moguće prenamijeniti brod...
 STR_9842_REFITTABLE                                             :(prenamjenjiv)
-STR_GO_TO_SHIP_DEPOT                                            :Idi u {TOWN} spremište brodova
-SERVICE_AT_SHIP_DEPOT                                           :Servis u brodskom spremištu grada {TOWN}
+STR_GO_TO_SHIP_DEPOT                                            :Idi u spremište brodova grada {TOWN}
+SERVICE_AT_SHIP_DEPOT                                           :Servis u spremištu brodova grada {TOWN}
 
 ##id 0xA000
 STR_A000_AIRPORTS                                               :{WHITE}ZraÄne luke
-STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}Ne možeÅ¡ graditi zraÄnu luku ovdje...
-STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}{STATION} Spremište zrakoplova
+STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}Ovdje nije moguće izgraditi zraÄnu luku...
+STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}{STATION} Zrakoplovni hangar
 STR_A003_NEW_AIRCRAFT                                           :{BLACK}Novi zrakoplov
 STR_CLONE_AIRCRAFT                                              :{BLACK}Kloniraj zrakoplov
 STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Ovo će izgraditi kopiju zrakoplova. Control-klik će dijeliti naredbe
-STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}Ovo će napraviti kopiju zrakoplova. Klikni ovaj gumb i onda na zrakoplov unutar ili izvan hangara. Control+klik će dijeliti naredbe.
+STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}Ovo će napraviti kopiju zrakoplova. Klikni ovaj gumb i onda na zrakoplov unutar ili izvan hangara. Control+klik će dijeliti naredbe
 STR_A005_NEW_AIRCRAFT                                           :{WHITE}Novi zrakoplov
 STR_A006_BUILD_AIRCRAFT                                         :{BLACK}Izgradi zrakoplov
-STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}Ne mogu izgraditi zrakoplov...
-STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA} zrakoplov
+STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}Nije moguće izgraditi zrakoplov...
+STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA} zrakoplova
 STR_A00A                                                        :{WHITE}{VEHICLE}
 STR_A00B_ORDERS                                                 :{WHITE}{VEHICLE} (Naredbe)
 STR_A00C_DETAILS                                                :{WHITE}{VEHICLE} (Detalji)
@@ -2938,38 +2950,38 @@
 STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY}  (prošle godine: {CURRENCY})
 STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pouzdanost: {LTBLUE}{COMMA}%  {BLACK}Kvarova od poslijednjeg servisa: {LTBLUE}{COMMA}
 STR_A011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Izgrađen: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
-STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Ne mogu poslati zrakoplov u hangar
-STR_HEADING_FOR_HANGAR                                          :{ORANGE}Putuje prema {STATION} hangaru
-STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}Putuje prema {STATION} hangaru, {VELOCITY}
-STR_HEADING_FOR_HANGAR_SERVICE                                  :{LTBLUE}Servis u {STATION} hangaru
-STR_HEADING_FOR_HANGAR_SERVICE_VEL                              :{LTBLUE}Servis u {STATION} hangaru, {VELOCITY}
+STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Nije moguće poslati zrakoplov u hangar
+STR_HEADING_FOR_HANGAR                                          :{ORANGE}Putuje prema hangaru stanice {STATION}
+STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}Putuje prema hangaru stanice {STATION}, {VELOCITY}
+STR_HEADING_FOR_HANGAR_SERVICE                                  :{LTBLUE}Servisiranje u hangaru stanice {STATION}
+STR_HEADING_FOR_HANGAR_SERVICE_VEL                              :{LTBLUE}Servisiranje u hangaru stanice {STATION}, {VELOCITY}
 STR_A014_AIRCRAFT_IS_WAITING_IN                                 :{WHITE}Zrakoplov {COMMA} Äeka u hangaru
 STR_A015_AIRCRAFT_IN_THE_WAY                                    :{WHITE}Smeta zrakoplov
-STR_A016_CAN_T_STOP_START_AIRCRAFT                              :{WHITE}Ne mogu zaustaviti/pokrenuti zrakoplov...
+STR_A016_CAN_T_STOP_START_AIRCRAFT                              :{WHITE}Nije moguće zaustaviti/pokrenuti zrakoplov...
 STR_A017_AIRCRAFT_IS_IN_FLIGHT                                  :{WHITE}Zrakoplov je u letu
 STR_A019_CAPACITY                                               :{BLACK}Nosivost: {LTBLUE}{CARGO}, {CARGO}
 STR_A01A_CAPACITY                                               :{BLACK}Nosivost: {LTBLUE}{CARGO}
 STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}Zrakoplov mora biti zaustavljen u hangaru
-STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Ne možeš prodati zrakoplov...
+STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Nije moguće prodati zrakoplov...
 STR_A01D_AIRPORT_CONSTRUCTION                                   :Izgradnja zraÄne luke
 STR_A01E_BUILD_AIRPORT                                          :{BLACK}Izgradi zraÄnu luku
 STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Zrakoplov - klikni na zrakoplov za informacije
-STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES                            :{BLACK}Izgradi novi zrakoplov(potreban je aerodrom sa hangarom)
-STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Zrakoplov - kliknite na zrakoplov za informacije
+STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES                            :{BLACK}Izgradi novi zrakoplov (potrebna je zraÄna luka s hangarom)
+STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Zrakoplov - klikni na zrakoplov za informacije
 STR_A022_BUILD_NEW_AIRCRAFT                                     :{BLACK}Izgradi novi zrakoplov
 STR_A023_DRAG_AIRCRAFT_TO_HERE_TO                               :{BLACK}Povuci zrakoplov ovdje kako bi ga prodao
 STR_A024_CENTER_MAIN_VIEW_ON_HANGAR                             :{BLACK}Centriraj glavni pogled na lokaciju hangara
-STR_A025_AIRCRAFT_SELECTION_LIST                                :{BLACK}Popis zrakoplova - klini na zrakoplov za informacije
+STR_A025_AIRCRAFT_SELECTION_LIST                                :{BLACK}Popis izabranih zrakoplova - klikni na zrakoplov za informacije
 STR_A026_BUILD_THE_HIGHLIGHTED_AIRCRAFT                         :{BLACK}Izgradi oznaÄeni zrakoplov
-STR_A027_CURRENT_AIRCRAFT_ACTION                                :{BLACK}Trenutka radnja zrakoplova - kliknite ovdje za zaustavljanje/pokretanje zrakoplova
-STR_A028_SHOW_AIRCRAFT_S_ORDERS                                 :{BLACK}Prikaži naredbe zrakoplova
+STR_A027_CURRENT_AIRCRAFT_ACTION                                :{BLACK}Trenutna radnja zrakoplova - klikni ovdje kako bi zaustavio/pokrenuo zrakoplov
+STR_A028_SHOW_AIRCRAFT_S_ORDERS                                 :{BLACK}Pokaži naredbe zrakoplova
 STR_A029_CENTER_MAIN_VIEW_ON_AIRCRAFT                           :{BLACK} Centrirajte glavni prozor na lokaciju zrakoplova
-STR_A02A_SEND_AIRCRAFT_TO_HANGAR                                :{BLACK}Pošaljite avion u hangar. CTRL + klik će ga samo servisirati
-STR_A02B_SHOW_AIRCRAFT_DETAILS                                  :{BLACK}Prikaži detalje zrakoplova
-STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Trošak: {CURRENCY} Maks. brzina: {VELOCITY}{}Kapacitet: {COMMA} putnika, {COMMA} poštanskih vreća{}Trošak uporabe {CURRENCY}/god
+STR_A02A_SEND_AIRCRAFT_TO_HANGAR                                :{BLACK}Pošalji avion u hangar. CTRL+klik će samo servisirati
+STR_A02B_SHOW_AIRCRAFT_DETAILS                                  :{BLACK}Pokaži detalje zrakoplova
+STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Trošak: {CURRENCY} Maks. brzina: {VELOCITY}{}Nosivost: {COMMA} putnika, {COMMA} poštanskih vreća{}Trošak uporabe {CURRENCY}/god
 
 STR_A030_NAME_AIRCRAFT                                          :{WHITE}Imenuj zrakoplov
-STR_A031_CAN_T_NAME_AIRCRAFT                                    :{WHITE}Ne mogu imenovati zrakoplov...
+STR_A031_CAN_T_NAME_AIRCRAFT                                    :{WHITE}Nije moguće imenovati zrakoplov...
 STR_A032_NAME_AIRCRAFT                                          :{BLACK}Imenuj zrakoplov
 STR_A033_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Građani slave . . .{}Prvi zrakoplov je stigao na {STATION}!
 STR_A034_PLANE_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Pad zrakoplova!{}{COMMA} poginulih u eksploziji na {STATION}
@@ -2978,17 +2990,17 @@
 STR_A037_RENAME                                                 :{BLACK}Preimenuj
 STR_A038_RENAME_AIRCRAFT_TYPE                                   :{BLACK}Preimenuj vrstu zrakoplova
 STR_A039_RENAME_AIRCRAFT_TYPE                                   :{WHITE}Preimenuj vrstu zrakoplova
-STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE                             :{WHITE}Ne mogu preimenovati vrstu zrakoplova...
-STR_A03B_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Prenamijeni zrakoplov da nosi drugu vrstu tereta
+STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE                             :{WHITE}Nije moguće preimenovati vrstu zrakoplova...
+STR_A03B_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Prenamijeni zrakoplov za prijevoz neke druge vrste tereta
 STR_A03C_REFIT                                                  :{WHITE}{VEHICLE} (Prenamijeni)
 STR_A03D_REFIT_AIRCRAFT                                         :{BLACK}Prenamijeni zrakoplov
-STR_A03E_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Izaberi vrstu tereta koju će zrakoplov nositi
-STR_A03F_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Prenamijeni zrakoplov da nosi oznaÄenu vrstu tereta
-STR_A040_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}OznaÄi vrstu tereta za prijenos:
-STR_A041_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Novi kapacitet: {GOLD}{STRING}{}{BLACK}Trošak prenamjene: {GOLD}{CURRENCY}
-STR_A042_CAN_T_REFIT_AIRCRAFT                                   :{WHITE}Ne mogu prenamijeniti zrakoplov...
-STR_GO_TO_AIRPORT_HANGAR                                        :Idi u {STATION} Hangar
-SERVICE_AT_AIRPORT_HANGAR                                       :Servis u hangaru {STATION}
+STR_A03E_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Odaberi vrstu tereta koju će zrakoplov prevoziti
+STR_A03F_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Prenamijeni zrakoplov za prijevoz oznaÄene vrste tereta
+STR_A040_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Odaberi vrstu tereta za prijevoz:
+STR_A041_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nova nosivost: {GOLD}{STRING}{}{BLACK}Trošak prenamjene: {GOLD}{CURRENCY}
+STR_A042_CAN_T_REFIT_AIRCRAFT                                   :{WHITE}Nije moguće prenamijeniti zrakoplov...
+STR_GO_TO_AIRPORT_HANGAR                                        :Idi u hangar stanice {STATION}
+SERVICE_AT_AIRPORT_HANGAR                                       :Servisiranje u hangaru stanice {STATION}
 
 STR_TIMETABLE_TITLE                                             :{WHITE}{VEHICLE} (Raspored)
 
@@ -3021,7 +3033,7 @@
 STR_PERFORMANCE_DETAIL_CARGO                                    :{BLACK}Cargo:
 STR_PERFORMANCE_DETAIL_MONEY                                    :{BLACK}Novac:
 STR_PERFORMANCE_DETAIL_LOAN                                     :{BLACK}Zajam:
-STR_PERFORMANCE_DETAIL_TOTAL                                    :{BLACK}Totalno:
+STR_PERFORMANCE_DETAIL_TOTAL                                    :{BLACK}Ukupno:
 ############ End of order list
 STR_PERFORMANCE_DETAIL_VEHICLES_TIP                             :{BLACK}Broj vozila; ovo ukljuÄuje cestovna vozila, vlakove, brodove i avione
 STR_PERFORMANCE_DETAIL_STATIONS_TIP                             :{BLACK}Broj dijelova stanice. Svaki dio stanice (npr. željezniÄki kolodvor, autobusna postaja, aerodrom) se raÄuna, Äak i ako su spojene kao jedna stanica
@@ -3032,7 +3044,7 @@
 STR_PERFORMANCE_DETAIL_CARGO_TIP                                :{BLACK}Broj vrsta tereta dostavljenog u zadnjoj Äetvrtini
 STR_PERFORMANCE_DETAIL_MONEY_TIP                                :{BLACK}KoliÄina novca koji ova kompanija ima u banci
 STR_PERFORMANCE_DETAIL_LOAN_TIP                                 :{BLACK}Iznos novca koji je ova tvrtka pozajmila
-STR_PERFORMANCE_DETAIL_TOTAL_TIP                                :{BLACK}Totalni broj bodova od mogućih bodova
+STR_PERFORMANCE_DETAIL_TOTAL_TIP                                :{BLACK}Ukupni broj bodova od mogućih bodova
 
 STR_NEWGRF_SETTINGS_BUTTON                                      :{BLACK}NewGRF Postavke
 STR_NEWGRF_SETTINGS_CAPTION                                     :{WHITE}NewGRF postavke
@@ -3059,8 +3071,8 @@
 
 STR_NEWGRF_ADD                                                  :{BLACK}Dodaj
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Dodaj NewGRF datoteku u listu
-STR_NEWGRF_REMOVE                                               :{BLACK}Obriši
-STR_NEWGRF_REMOVE_TIP                                           :{BLACK}Obriši odabranu NewGRF datoteku sa liste
+STR_NEWGRF_REMOVE                                               :{BLACK}Ukloni
+STR_NEWGRF_REMOVE_TIP                                           :{BLACK}Ukloni odabranu NewGRF datoteku s popisa
 STR_NEWGRF_MOVEUP                                               :{BLACK}Pomakni gore
 STR_NEWGRF_MOVEUP_TIP                                           :{BLACK}Pomakni odabranu NewGRF datoteku gore na listi
 STR_NEWGRF_MOVEDOWN                                             :{BLACK} Pomakni dolje
@@ -3101,42 +3113,42 @@
 STR_PLANE                                                       :{BLACK}{PLANE}
 STR_SHIP                                                        :{BLACK}{SHIP}
 
-STR_SCHEDULED_TRAINS                                            :{WHITE}{STATION} - {COMMA} Vlak{P "" a ova}
+STR_SCHEDULED_TRAINS                                            :{WHITE}{STATION} - {COMMA} vlak{P "" a ova}
 STR_SCHEDULED_ROAD_VEHICLES                                     :{WHITE}{STATION} - {COMMA} Cestovn{P o a ih} vozil{P o a a}
 STR_SCHEDULED_AIRCRAFT                                          :{WHITE}{STATION} - {COMMA} Zrakoplov
 STR_SCHEDULED_SHIPS                                             :{WHITE}{STATION} - {COMMA} Brod{P "" a ova}
 
-STR_SCHEDULED_TRAINS_TIP                                        :{BLACK}Prikaži sve vlakove koji imaju ovu stanicu u svom rasporedu
+STR_SCHEDULED_TRAINS_TIP                                        :{BLACK}Pokaži sve vlakove koji imaju ovu stanicu u svom rasporedu
 STR_SCHEDULED_ROAD_VEHICLES_TIP                                 :{BLACK}Prikaži sva cestovna vozila koja imaju ovu stanicu u svom rasporedu
 STR_SCHEDULED_AIRCRAFT_TIP                                      :{BLACK}Prikaži sve zrakoplove koji imaju ovu stanicu u svom rasporedu
 STR_SCHEDULED_SHIPS_TIP                                         :{BLACK}Prikaži sve brodove koji imaju ovu stanicu u svom rasporedu
 
-STR_VEH_WITH_SHARED_ORDERS_LIST                                 :{WHITE}Djeljene naredbe za {COMMA} vozil{P o a a}
-STR_VEH_WITH_SHARED_ORDERS_LIST_TIP                             :{BLACK}Prikaži sva vozila koja dijele ovaj raspored.
+STR_VEH_WITH_SHARED_ORDERS_LIST                                 :{WHITE}Dijeljene naredbe za {COMMA} vozil{P o a a}
+STR_VEH_WITH_SHARED_ORDERS_LIST_TIP                             :{BLACK}Pokaži sva vozila koja dijele ovaj raspored.
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Upravo se spremaš prodati sva vozila u spremištu. Jesi li siguran?
-STR_DEPOT_WRONG_DEPOT_TYPE                                      :Pogrešna vrsta skladišta
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Pogrešna vrsta spremišta
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Prodaj sve vlakove u spremištu
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Prodaj sva cestovna vozila u spremištu
 STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP                              :{BLACK}Prodaj sve brodove u spremištu
 STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP                          :{BLACK}Prodaj sve zrakoplove u hangaru
 
-STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Daje popis svih vlakova u trenutnom spremištu, zajedno s njihovim naredbama
-STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Daje popis svih cestovnih vozila u trenutnom spremištu, zajedno s njihovim naredbama
-STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Daje popis svih brodova u trenutnom spremištu, zajedno s njihovim naredbama
-STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Daje popis svih zrakoplova u trenutnom spremištu, zajedno s njihovim naredbama
+STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Daje popis svih vlakova koji imaju trenutno spremište među svojim naredbama
+STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Daje popis svih cestovnih vozila koje imaju trenutno spremište među svojim naredbama
+STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Daje popis svih brodova koji imaju trenutno spremište među svojim naredbama
+STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Daje popis svih zrakoplova koji imaju bilo koji hangar ove zraÄne luke meÄ‘u svojim naredbama
 
 STR_DEPOT_AUTOREPLACE_TRAIN_TIP                                 :{BLACK}Automatski zamijeni sve vlakove u spremištu
 STR_DEPOT_AUTOREPLACE_ROADVEH_TIP                               :{BLACK}Automatski zamijeni sva cestovna vozikla u spremištu
 STR_DEPOT_AUTOREPLACE_SHIP_TIP                                  :{BLACK}Automatski zamijeni sve brodove u spremištu
 STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP                              :{BLACK}Automatski zamijeni sve zrakoplove u spremištu
 
-STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - {COMMA} Vlak{P "" a ova}
-STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - {COMMA} Cestovn{P o a ih} vozil{P o a a}
-STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA} Brod{P "" a ova}
-STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} Zrakoplov
+STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - {COMMA} vlak{P "" a ova}
+STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - {COMMA} cestovn{P o a ih} vozil{P o a a}
+STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA} brod{P "" a ova}
+STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} zrakoplova
 
 STR_REPLACE_VEHICLES_WHITE                                      :{WHITE}Zamijeni {STRING}
 STR_REPLACE_VEHICLES_START                                      :{BLACK}PoÄni zamijenjivati vozila
@@ -3147,13 +3159,13 @@
 STR_REPLACE_HELP_RIGHT_ARRAY                                    :{BLACK}Odaberite novi tip lokomotive koji želite koristiti umjesto lijevo odabranog tipa lokomotive
 STR_REPLACE_HELP_STOP_BUTTON                                    :{BLACK}Klikni za zaustavljanje zamjene lijevo odabranog tipa lokomotive
 STR_REPLACE_HELP_START_BUTTON                                   :{BLACK}Klikni za poÄetak zamjene lijevo odabrane lokomotive sa desno odabranim tipom
-STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}Odaberite tip traÄnica za koji želite zamijeniti lokomotive
+STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}Odaberite vrstu željeznice za koju želite zamijeniti lokomotive
 STR_REPLACE_HELP_REPLACE_INFO_TAB                               :{BLACK}Prikazuje sa kojom se lokomotivom zamjenjuje lijevo odabrana lokomotiva, ako postoji koji
 STR_REPLACE_HELP                                                :{BLACK}Ovo dozvoljava zamjenu jednog tipa lokomotive sa drugim, kada vlakovi prvotnog tipa uđu u stovarište
-STR_REPLACE_REMOVE_WAGON                                        :{BLACK}Brisanje vagona: {ORANGE}{SKIP}{STRING}
-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_REMOVE_WAGON                                        :{BLACK}Uklanjanje vagona: {ORANGE}{SKIP}{STRING}
+STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Ukoliko bi zamjena lokomotive uÄinla vlak dužim, neka automatska zamjena zadrži istu dužinu vlaka tako da ukloni suviÅ¡ne vagone (poÄevÅ¡i od naprijed).
 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_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} POKUSNA FUNKCIJA {} Prebaci između prozora za izmjenu lokomotiva i vagona.{}Izmjena vagona izvršit će se 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_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vozilo nije dostupno
 STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vozilo nije dostupno
 STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Brod nije dostupan
@@ -3162,28 +3174,28 @@
 STR_ENGINES                                                     :Lokomotive
 STR_WAGONS                                                      :Vagoni
 
-STR_MASS_STOP_DEPOT_TRAIN_TIP                                   :{BLACK}Pritisni za zaustavljanje svih vlakova u spremištu
-STR_MASS_STOP_DEPOT_ROADVEH_TIP                                 :{BLACK}Pritisni za zaustavljanje svih cestovnih vozila u spremištu
-STR_MASS_STOP_DEPOT_SHIP_TIP                                    :{BLACK}Pritisni za zaustavljanje svih brodova u spremištu
-STR_MASS_STOP_HANGAR_TIP                                        :{BLACK}Pritisni za zaustavljanje svih zrakoplova u hangaru
+STR_MASS_STOP_DEPOT_TRAIN_TIP                                   :{BLACK}Klikni za zaustavljanje svih vlakova u spremištu
+STR_MASS_STOP_DEPOT_ROADVEH_TIP                                 :{BLACK}Klikni za zaustavljanje svih cestovnih vozila u spremištu
+STR_MASS_STOP_DEPOT_SHIP_TIP                                    :{BLACK}Klikni za zaustavljanje svih brodova u spremištu
+STR_MASS_STOP_HANGAR_TIP                                        :{BLACK}Klikni za zaustavljanje svih zrakoplova u hangaru
 
-STR_MASS_START_DEPOT_TRAIN_TIP                                  :{BLACK}Pritisni za pokretanje svih vlakova u spremištu
-STR_MASS_START_DEPOT_ROADVEH_TIP                                :{BLACK}Pritisni za pokretanje svih cestovnih vozila u spremištu
-STR_MASS_START_DEPOT_SHIP_TIP                                   :{BLACK}Pritisni za pokretanje svih brodova u spremištu
-STR_MASS_START_HANGAR_TIP                                       :{BLACK}Klikni za pokretanje svih aviona u hangaru
+STR_MASS_START_DEPOT_TRAIN_TIP                                  :{BLACK}Klikni za pokretanje svih vlakova u spremištu
+STR_MASS_START_DEPOT_ROADVEH_TIP                                :{BLACK}Klikni za pokretanje svih cestovnih vozila u spremištu
+STR_MASS_START_DEPOT_SHIP_TIP                                   :{BLACK}Klikni za pokretanje svih brodova u spremištu
+STR_MASS_START_HANGAR_TIP                                       :{BLACK}Klikni za pokretanje svih zrakoplova u hangaru
 
-STR_MASS_STOP_LIST_TIP                                          :{BLACK}Klikni za zaustavljanje svih vozila na listi
-STR_MASS_START_LIST_TIP                                         :{BLACK}Klikni za pokretanje svih vozila na listi
+STR_MASS_STOP_LIST_TIP                                          :{BLACK}Klikni za zaustavljanje svih vozila na popisu
+STR_MASS_START_LIST_TIP                                         :{BLACK}Klikni za pokretanje svih vozila na popisu
 
 STR_SHORT_DATE                                                  :{WHITE}{DATE_TINY}
-STR_SIGN_LIST_CAPTION                                           :{WHITE}Popis znakova - {COMMA} Znak{P "" a ova}
+STR_SIGN_LIST_CAPTION                                           :{WHITE}Popis znakova - {COMMA} znak{P "" a ova}
 
-STR_ORDER_REFIT_FAILED                                          :{WHITE}Prepravke narudžbi nisu uspjele {STRING} {COMMA}
+STR_ORDER_REFIT_FAILED                                          :{WHITE}Naredba prenamijeni neuspjela zaustavljena {STRING} {COMMA}
 
 ############ Lists rail types
 
-STR_RAIL_VEHICLES                                               :TraÄna Vozila
-STR_ELRAIL_VEHICLES                                             :ElektriÄna željezniÄka vozila
+STR_RAIL_VEHICLES                                               :Pružna vozila
+STR_ELRAIL_VEHICLES                                             :ElektriÄna pružna vozila
 STR_MONORAIL_VEHICLES                                           :JednotraÄna vozila
 STR_MAGLEV_VEHICLES                                             :Maglev željezniÄka vozila
 
@@ -3195,16 +3207,16 @@
 STR_PURCHASE_INFO_SPEED_POWER                                   :{BLACK}Brzina: {GOLD}{VELOCITY}{BLACK} Snaga: {GOLD}{POWER}
 STR_PURCHASE_INFO_SPEED                                         :{BLACK}Brzina: {GOLD}{VELOCITY}
 STR_PURCHASE_INFO_RUNNINGCOST                                   :{BLACK}Trošak uporabe: {GOLD}{CURRENCY}/god
-STR_PURCHASE_INFO_CAPACITY                                      :{BLACK}Kapacitet: {GOLD}{CARGO}{STRING}
+STR_PURCHASE_INFO_CAPACITY                                      :{BLACK}Nosivost: {GOLD}{CARGO}{STRING}
 STR_PURCHASE_INFO_DESIGNED_LIFE                                 :{BLACK}Dizajnirana: {GOLD}{NUM}{BLACK} Životni vijek: {GOLD}{COMMA} godina
 STR_PURCHASE_INFO_RELIABILITY                                   :{BLACK}Maks. pouzdanost: {GOLD}{COMMA}%
 STR_PURCHASE_INFO_COST                                          :{BLACK}Trošak: {GOLD}{CURRENCY}
 STR_PURCHASE_INFO_WEIGHT_CWEIGHT                                :{BLACK}Težina: {GOLD}{WEIGHT_S} ({WEIGHT_S})
 STR_PURCHASE_INFO_COST_SPEED                                    :{BLACK}Trošak: {GOLD}{CURRENCY}{BLACK} Brzina: {GOLD}{VELOCITY}
-STR_PURCHASE_INFO_AIRCRAFT_CAPACITY                             :{BLACK}Zapremnina: {GOLD}{COMMA} putnika, {COMMA} vreća s poštom
+STR_PURCHASE_INFO_AIRCRAFT_CAPACITY                             :{BLACK}Nosivost: {GOLD}{COMMA} putnika, {COMMA} vreća s poštom
 STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT                          :{BLACK} Pokretni vagoni:.{GOLD}+{POWER}{BLACK} Težina: {GOLD}+{WEIGHT_S}
-STR_PURCHASE_INFO_REFITTABLE_TO                                 :{BLACK}Promjenjivo u: {GOLD}
-STR_PURCHASE_INFO_ALL_TYPES                                     :Svi tipovi tereta
+STR_PURCHASE_INFO_REFITTABLE_TO                                 :{BLACK}Prenamjenjivo u: {GOLD}
+STR_PURCHASE_INFO_ALL_TYPES                                     :Sve vrste tereta
 STR_PURCHASE_INFO_ALL_BUT                                       :Sve osim {GOLD}
 STR_PURCHASE_INFO_MAX_TE                                        :{BLACK} Maks. vuÄni napor: {GOLD}{FORCE}
 
@@ -3268,16 +3280,16 @@
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Mala
 STR_CITY_AIRPORT                                                :{BLACK}Grad
-STR_METRO_AIRPORT                                               :{BLACK}Metropolitanski airport
-STR_INTERNATIONAL_AIRPORT                                       :{BLACK}Međunarodni aerodrom
+STR_METRO_AIRPORT                                               :{BLACK}Metropolitanska zraÄna luka
+STR_INTERNATIONAL_AIRPORT                                       :{BLACK}MeÄ‘unarodna zraÄna luka
 STR_COMMUTER_AIRPORT                                            :{BLACK}Redoviti putnik
 STR_INTERCONTINENTAL_AIRPORT                                    :{BLACK}Međukontinentalni
 STR_HELIPORT                                                    :{BLACK}Heliodrom
-STR_HELIDEPOT                                                   :{BLACK}Spremište za helikoptere
+STR_HELIDEPOT                                                   :{BLACK}Spremište helikoptera
 STR_HELISTATION                                                 :{BLACK}Stanica za helikoptere
 
-STR_SMALL_AIRPORTS                                              :{BLACK}Mali aerodromi
-STR_LARGE_AIRPORTS                                              :{BLACK}Veliki aerodromi
+STR_SMALL_AIRPORTS                                              :{BLACK}Male zraÄne luke
+STR_LARGE_AIRPORTS                                              :{BLACK}Velike zraÄne luke
 STR_HUB_AIRPORTS                                                :{BLACK}SrediÅ¡nje zraÄne luke
 STR_HELIPORTS                                                   :{BLACK}Helicopterske zraÄne luke
 
@@ -3304,7 +3316,7 @@
 STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Namjesti prozirnost za drveće
 STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Namjesti prozirnost za kuće
 STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Namjesti prozirnost za industrije
-STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Namjesti prozirnost za građevine poput postaja, spremišta, smjerokaza i užadi
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Namjesti prozirnost za graÄ‘evine poput postaja, spremiÅ¡ta, ÄvoriÅ¡ta i vuÄne užadi
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Namjesti prozirnost za mostove
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Namjesti prozirnost za strukture poput svjetionika i antena, možda u budućnosti i vizualne efekte
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Namjesti prozirnost za indikatore uÄitavanja
@@ -3319,11 +3331,11 @@
 ##### Mass Order
 STR_GROUP_NAME_FORMAT                                           :Groupa {COMMA}
 STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
-STR_GROUP_ALL_TRAINS                                            :Sva vozila
+STR_GROUP_ALL_TRAINS                                            :Svi vlakovi
 STR_GROUP_ALL_ROADS                                             :Sva cestovna vozila
 STR_GROUP_ALL_SHIPS                                             :Svi brodovi
 STR_GROUP_ALL_AIRCRAFTS                                         :Svi zrakoplovi
-STR_GROUP_DEFAULT_TRAINS                                        :Negrupirani valkovi
+STR_GROUP_DEFAULT_TRAINS                                        :Negrupirani vlakovi
 STR_GROUP_DEFAULT_ROADS                                         :Negrupirana cestovna vozila
 STR_GROUP_DEFAULT_SHIPS                                         :Negrupirani brodovi
 STR_GROUP_DEFAULT_AIRCRAFTS                                     :Negrupirani zrakoplovi
@@ -3331,21 +3343,21 @@
 STR_GROUP_ADD_SHARED_VEHICLE                                    :Dodaj dijeljena vozila
 STR_GROUP_REMOVE_ALL_VEHICLES                                   :Ukloni sva vozila
 
-STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Vlak{P "" a ova}
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} vlak{P "" a ova}
 STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA}  Cestovno vozil{P o a a}
 STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Brod{P "" a ova}
 STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Zrakoplov
 STR_GROUP_RENAME_CAPTION                                        :{BLACK}Preimenuj grupu
 STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Zamjeni vozila "{GROUP}"
 
-STR_GROUP_CAN_T_CREATE                                          :{WHITE}Ne mogu kreirati grupu...
-STR_GROUP_CAN_T_DELETE                                          :{WHITE}Ne mogu obrisati ovu grupu...
-STR_GROUP_CAN_T_RENAME                                          :{WHITE}Ne mogu preimenovati ovu grupu...
-STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Nije moguće maknuti sva vozila iz ove grupe...
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Nije moguće kreirati grupu...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Nije moguće obrisati ovu grupu...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Nije moguće preimenovati ovu grupu...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Nije moguće ukloniti sva vozila iz ove grupe...
 STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Nije moguće dodati vozila u ovu grupu
-STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Ne možeš dodati dijeljena vozila u grupu...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Nije moguće dodati dijeljena vozila u grupu...
 
-STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Groupe - Klikni na grupu kako bi izlista sva vozila ove grupe
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Groupe - klikni na grupu kako bi izlistao sva vozila ove grupe
 STR_GROUP_CREATE_TIP                                            :{BLACK}Klikni za kreiranje grupe
 STR_GROUP_DELETE_TIP                                            :{BLACK}Obriši odabranu grupu
 STR_GROUP_RENAME_TIP                                            :{BLACK}Preimenuj odabranu grupu
@@ -3369,4 +3381,4 @@
 STR_FUND_NEW_INDUSTRY                                           :{BLACK}Financiraj
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospekt
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Izgradi
-STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Izaberi prikladnu industriju s ove liste
+STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Izaberi prikladnu industriju s ovog popisa
--- a/src/lang/czech.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/czech.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1078,6 +1078,7 @@
 STR_CONFIG_PATCHES_ON                                           :zapnuto
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Ukazovat rychlost vozidla ve stavové liště: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Povolit výstavbu na svazích kopců a na pobřežích: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Úpravy terénu pod budovami, kolejemi atd. (tzv. autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Povolit u oblasti pokrytí realistiÄtÄ›jší velikost: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Povolit bourání více městských silnic, mostů, tunelů, atp.: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Povolit stavbu dlouhých vlaků: {ORANGE}{STRING}
@@ -1161,9 +1162,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Emulace pravého tlaÄítka: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command + kliknutí
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control + kliknutí
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :vypnutá
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :ne
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :u vlastní spoleÄnosti
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :u vÅ¡ech spoleÄností
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Používat ukazatele naložení: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :ne
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :u vlastní spoleÄnosti
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :u vÅ¡ech spoleÄností
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Povolit jízdní řády vozidel: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Zobrazit jízdní řády v cyklech místo ve dnech: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Výchozí druh kolejí (v nové hÅ™e/po naÄtení hry): {ORANGE}{STRING}
@@ -2062,7 +2075,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Nutno nejprve zniÄit tunel
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Nutno nejprve zniÄit most
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Nelze zaÄít a skonÄit na stejném místÄ›
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Pod mostem je nutná rovná země nebo voda
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}ZaÄátek a konec musí být ve stejné výšce
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Místo nevhodné pro vjezd do tunelu
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3240,7 +3252,7 @@
 STR_SHORT_DATE                                                  :{WHITE}{DATE_TINY}
 STR_SIGN_LIST_CAPTION                                           :{WHITE}Seznam popisků - {COMMA} popis{P ek ky ků}
 
-STR_ORDER_REFIT_FAILED                                          :{WHITE}Přestavba se nezdařila. Konec.{STRING} {COMMA}
+STR_ORDER_REFIT_FAILED                                          :{WHITE}Selhání refitu příkazu zastavilo {STRING} {COMMA}
 
 ############ Lists rail types
 
--- a/src/lang/danish.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/danish.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
 STR_CONFIG_PATCHES_ON                                           :Til
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Vis køretøjets fart i statusbaren: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Tillad bygning på skråninger og kyster: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Tillad landskabsformning under bygninger, spor, etc. (autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Tillad mere realistisk størrelse på stationernes opland: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Tillad nedriving af industribygninger, flere veje, osv: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Aktiver bygning af meget lange tog: {ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Højreklik-emulering: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Kommandoklik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Kontrolklik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Fra
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Fra
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Eget firma
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Alle firmaer
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Benyt laste-indikatorer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Fra
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Eget firma
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Alle firmaer
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Slå køreplaner for transportmidler til: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Vis køreplan i tik i stedet for dage: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Standard skinnetype (efter nyt spil/hentet spil): {ORANGE}{STRING}
@@ -1262,6 +1275,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}... bøjen er i brug!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Koordinater: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Kan ikke fjerne en del af en station...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Kan ikke konvertere jernbanetype her...
@@ -1372,18 +1386,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Beskyt dit spil med et kodeord hvis du ikke vil have fremmede med
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Vælg et kort:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Hvilket kort vil du spille?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maksimalt antal tilladte klienter:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Vælg det maksimale antal klienter. Det er ikke nødvendigt at fylde dem alle
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Internet
 STR_NETWORK_LAN_INTERNET                                        :LAN / Internet
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (bekendtgør spillet)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} klient{P "" er}
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maksimalt antal tilladte klienter:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Vælg det maksimale antal klienter. Det er ikke nødvendigt at fylde dem alle
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} firma{P "" er}
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Maks. selskaber:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Begræns serveren til et bestemt antal selskaber
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} tilskuer{P "" e}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Maks. tilskuere:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Begræns serveren til et bestemt antal tilskurere
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Talt sprog:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Andre spillere vil vide hvilket sprog, der bliver talt på serveren
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}Start spillet
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Start et nyt netværksspil med et tilfældigt kort eller et scenarie
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Hent et spil
@@ -1611,9 +1630,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Jernbane med almindelige signaler
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Jernbane med præ-signaler
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Jernbane med exit-signaler
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Jernbaneskinne 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                     :Jernbaneskinne med normale og kombi-signaler
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Jernbanespor med præ- og exit-signaler
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Jernbaneskinne med præ- og kombi-signaler
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Jernbaneskinne med exit- og kombi-signaler
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Jernbanestation skal fjernes først
 
 
@@ -1994,7 +2017,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Det er nødvendigt at rive tunnelen ned først
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Det er nødvendigt at rive broen ned først
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Kan ikke starte og slutte på samme position
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Der skal være fladt land eller vand under broen
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Start- og slutposition skal være på linje
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Dette sted er ikke brugbart til starten af en tunnel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3339,7 +3361,6 @@
 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_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
--- a/src/lang/dutch.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/dutch.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
 STR_CONFIG_PATCHES_ON                                           :Aan
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Geef snelheid in statusbalk weer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Bouwen op hellingen toestaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Omgeving aanpassen onder gebouwen, spoorweg, enz. toestaan (autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Gebruik realistisch handelsgebied: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Sta verwijderen van meer stedelijke wegen, bruggen, tunnels, enz. toe: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Zeer lange treinen toestaan: {ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Rechts-klik emulatie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Opdracht-klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control-klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Uit
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Uit
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Eigen bedrijf
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Alle bedrijven
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Gebruik laad indicatoren: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Uit
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Eigen bedrijf
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Alle bedrijven
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Activeer dienstregeling voor voertuigen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Toon dienstregeling in tikken ipv in dagen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Standaard spoorsoort (bij nieuw of opgeslagen spel): {ORANGE}{STRING}
@@ -2004,7 +2017,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Tunnel moet eerst afgebroken worden
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Brug moet eerst afgebroken worden
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Kan niet beginnen en eindigen op dezelfde plaats
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Vlak land of water vereist onder brug
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Begin en einde moeten op een lijn staan
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Locatie ongeschikt voor ingang tunnel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/english.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/english.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
 STR_CONFIG_PATCHES_ON                                           :On
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Show vehicle speed in status bar: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Allow building on slopes and coasts: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Allow terraforming under buildings, tracks, etc. (autoslope): {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Allow more realistically sized catchment areas: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Allow removal of more town-owned roads, bridges, etc: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Enable building very long trains: {ORANGE}{STRING1}
@@ -1046,6 +1047,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Road vehicle queueing (with quantum effects): {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Pan window when mouse is at the edge: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Allow bribing of the local authority: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Allow buying exclusive transport rights: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Allow sending money to other companies: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Nonuniform stations: {ORANGE}{STRING1}
 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}
@@ -1111,7 +1114,13 @@
 
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Off
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Own company
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :All companies
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Use loading indicators: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Off
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Own company
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :All companies
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Enable timetabling for vehicles: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Show timetable in ticks rather than days: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Default rail type (after new game/game load): {ORANGE}{STRING1}
@@ -1180,6 +1189,7 @@
 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_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Remove absurd road-elements during the road construction
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construction
@@ -2010,7 +2020,8 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Must demolish tunnel first
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Must demolish bridge first
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Cannot start and end in the same spot
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Level land or water required under bridge
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Bridge heads not at the same level
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Bridge is too low for the terrain
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Start and end must be in line
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Site unsuitable for tunnel entrance
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/esperanto.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/esperanto.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1910,7 +1910,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}AntaÅ­e forigu tunelon
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}AntaÅ­e forigu ponton
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Ne povas komenci kaj fini en la sama loko
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Ebena lando aÅ­ akvo necesas sub la ponto
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Komenco kaj fino devas esti samliniaj
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Nekonvena loko por tunelkomenco
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/estonian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/estonian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -258,7 +258,7 @@
 STR_POPUP_CAUTION_CAPTION                                       :{WHITE}Ettevaatust!
 STR_00B4_CAN_T_DO_THIS                                          :{WHITE}Seda ei saa teha....
 STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Seda ala ei saa puhastada....
-STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}Originaali autorikaitse {COPYRIGHT} 1995 Chris Sawyer, kõik õigused kaitstud
+STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}Algupärane autorikaitse {COPYRIGHT} 1995 Chris Sawyer, kõik õigused kaitstud
 STR_00B7_VERSION                                                :{BLACK}OpenTTD versioon {REV}
 STR_00BA_COPYRIGHT_OPENTTD                                      :{BLACK}OpenTTD {COPYRIGHT}2002-2007 OpenTTD meeskond
 STR_TRANSLATED_BY                                               :{BLACK}  Tõlgi(d) -
@@ -724,7 +724,7 @@
 STR_0225                                                        :{BLACK}{DOWNARROW}
 STR_0228_INCREASE_SIZE_OF_LAND_AREA                             :{BLACK}Suurenda kõrgendatava/madaldatava maa-ala pindala
 STR_0229_DECREASE_SIZE_OF_LAND_AREA                             :{BLACK}Vähenda kõrgendatava/madaldatava maa-ala pindala
-STR_022A_GENERATE_RANDOM_LAND                                   :{BLACK}Juhusliku kaardi loomine
+STR_022A_GENERATE_RANDOM_LAND                                   :{BLACK}Suvalise kaardi tekitamine
 STR_022B_RESET_LANDSCAPE                                        :{BLACK}Nulli maastik
 STR_022C_RESET_LANDSCAPE                                        :{WHITE}Nulli maastik
 STR_RESET_LANDSCAPE_TOOLTIP                                     :{BLACK}Eemalda kõik mängija omandid
@@ -732,7 +732,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}Teeehitus
+STR_0231_ROAD_CONSTRUCTION                                      :{BLACK}Tee-ehitus
 STR_0233_TOWN_GENERATION                                        :{WHITE}Linnade loomine
 STR_0234_NEW_TOWN                                               :{BLACK}Uus linn
 STR_0235_CONSTRUCT_NEW_TOWN                                     :{BLACK}Ehita uus linn
@@ -741,11 +741,11 @@
 STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN                              :{WHITE}...liiga lähedal teisele linnale
 STR_0239_SITE_UNSUITABLE                                        :{WHITE}...ebasobiv koht
 STR_023A_TOO_MANY_TOWNS                                         :{WHITE}...liiga palju linnu
-STR_CANNOT_GENERATE_TOWN                                        :{WHITE}Ei saa ühtegi linna ehitada
+STR_CANNOT_GENERATE_TOWN                                        :{WHITE}Ãœhtegi linna ei saa ehitada...
 STR_NO_SPACE_FOR_TOWN                                           :{WHITE}...pole enam ruumi kaardil
 STR_023B_INCREASE_SIZE_OF_TOWN                                  :{BLACK}Linna suuruse suurendamine
 STR_023C_EXPAND                                                 :{BLACK}Laienda
-STR_023D_RANDOM_TOWN                                            :{BLACK}Juhuslik linn
+STR_023D_RANDOM_TOWN                                            :{BLACK}Suvaline linn
 STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION                          :{BLACK}Ehita linn suvalisse kohta
 STR_023F_INDUSTRY_GENERATION                                    :{WHITE}Tööstuste loomine
 STR_0240_COAL_MINE                                              :{BLACK}Kivisöekaevandus
@@ -822,8 +822,8 @@
 STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...iga linna kohta lubatud ainult üks
 STR_0288_PLANT_TREES                                            :{BLACK}Istuta puid
 STR_0289_PLACE_SIGN                                             :{BLACK}Paigalda silt
-STR_028A_RANDOM_TREES                                           :{BLACK}Juhuslikud puud
-STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}Istutab puid juhuslikult üle kogu maa
+STR_028A_RANDOM_TREES                                           :{BLACK}Suvalised puud
+STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}Istutab puid suvaliselt üle kogu maa
 STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE                         :{BLACK}Loo maastikule kivised alad
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Ehita tuletorn
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Paigalda saatjamast
@@ -1120,6 +1120,7 @@
 STR_CONFIG_PATCHES_ON                                           :Sees
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Näita olekuribal veovahendi kiirust: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Luba ehitised nõlvadele ja kallastele: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Võimalda maastikujunduse teostust majade, rööbaste jms. all (autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Võimalda reaalsemaid veekogu alasid: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Luba linnateede, -sildade, -tunnelite jne lammutamine: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Luba väga pikkade rongide ehitamine: {ORANGE}{STRING}
@@ -1147,7 +1148,7 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Keri vaadet, kui hiir on viidud ekraani serva: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Luba kohalikule omavalitsusele altkäemaksu maksmine: {ORANGE}{STRING}
 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_NEW_PATHFINDING_ALL                          :{LTBLUE}Uus trassi otsimise 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_ADJACENT_STATIONS                            :{LTBLUE}Luba jaamu lähestikku ehitada: {ORANGE}{STRING}
@@ -1203,9 +1204,21 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Keri kaarti
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Väljas
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Kaardi kerimisrulliku kiirus: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Paremklõpsu matkimine: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command+klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Ctrl+klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Väljas
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Mängu isepeatamine uue mängu alustamisel: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Kasuta laiendatud sõidukinimekirja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Väljas
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Oma ettevõte
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Kõik ettevõtted
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Kasuta laadimisnäidikuid: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Väljas
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Oma ettevõte
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Kõik ettevõtted
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Luba sõiduplaanide määramine: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Kasuta sõiduplaanis päevade asemel tikse: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Algne rööbastee liik (mängu alustamisel/laadimisel): {ORANGE}{STRING}
@@ -1450,12 +1463,12 @@
 STR_ORANGE                                                      :{ORANGE}{STRING}
 STR_NETWORK_CLIENTS                                             :{SILVER}Kliendid:  {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
 STR_NETWORK_LANGUAGE                                            :{SILVER}Keel:  {WHITE}{STRING}
-STR_NETWORK_TILESET                                             :{SILVER}Maastikuühikud:  {WHITE}{STRING}
+STR_NETWORK_TILESET                                             :{SILVER}Ruudustik:  {WHITE}{STRING}
 STR_NETWORK_MAP_SIZE                                            :{SILVER}Kaardi suurus:  {WHITE}{COMMA}x{COMMA}
 STR_NETWORK_SERVER_VERSION                                      :{SILVER}Serveri versioon:  {WHITE}{STRING}
 STR_NETWORK_SERVER_ADDRESS                                      :{SILVER}Serveri aadress:  {WHITE}{STRING} : {NUM}
-STR_NETWORK_START_DATE                                          :{SILVER}Algus aeg:  {WHITE}{DATE_SHORT}
-STR_NETWORK_CURRENT_DATE                                        :{SILVER}Hetke aeg:  {WHITE}{DATE_SHORT}
+STR_NETWORK_START_DATE                                          :{SILVER}Aeg alguses:  {WHITE}{DATE_SHORT}
+STR_NETWORK_CURRENT_DATE                                        :{SILVER}Aeg hetkel:  {WHITE}{DATE_SHORT}
 STR_NETWORK_PASSWORD                                            :{SILVER}Parooliga kaitstud!
 STR_NETWORK_SERVER_OFFLINE                                      :{SILVER}SERVER ON MAAS
 STR_NETWORK_SERVER_FULL                                         :{SILVER}SERVER ON TÄIS
@@ -1767,7 +1780,7 @@
 STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Vali trammidepoo suund
 STR_1814_ROAD                                                   :Sõidutee
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Valgustatud sõidutee
-STR_1816_TREE_LINED_ROAD                                        :Kolmerajaline tee
+STR_1816_TREE_LINED_ROAD                                        :Puiestee
 STR_1817_ROAD_VEHICLE_DEPOT                                     :Depoo
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Raudteeületuskoht
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Siinset bussijaama ei saa lammutada...
@@ -2018,7 +2031,7 @@
 STR_400D_SAVE_THE_CURRENT_GAME_USING                            :{BLACK}Salvesta mäng valitud nimega
 STR_400E_SELECT_NEW_GAME_TYPE                                   :{WHITE}Vali uue mängu tüüp
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Vali valmis kaart (roheline), eelseadistatud mäng (sinine), või juhusliku kaardiga uus mäng
-STR_4010_GENERATE_RANDOM_NEW_GAME                               :Tekita juhuslik kaart
+STR_4010_GENERATE_RANDOM_NEW_GAME                               :Tekita suvaline kaart
 STR_4011_LOAD_HEIGHTMAP                                         :{WHITE}Laadi kõrguskaart
 
 ##id 0x4800
@@ -2104,7 +2117,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Enne tuleb tunnel hävitada
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Enne tuleb sild hävitada
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Ei saa alata ja lõppeda samas kohas
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Silla otsade kõrgus peab sama olema
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Algus ja lõpp peavad samal joonel olema
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Koht ei sobi tunneli sissekäiguks
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2162,7 +2174,7 @@
 STR_SV_STNAME_EAST                                              : Ida {STRING}
 STR_SV_STNAME_WEST                                              : Lääne {STRING}
 STR_SV_STNAME_CENTRAL                                           :{STRING} keskus
-STR_SV_STNAME_TRANSFER                                          :{STRING} ülekanne
+STR_SV_STNAME_TRANSFER                                          :{STRING} ümberlaadimispaik
 STR_SV_STNAME_HALT                                              :{STRING} peatus
 STR_SV_STNAME_VALLEY                                            :{STRING} org
 STR_SV_STNAME_HEIGHTS                                           :{STRING} kõrgendikud
@@ -2340,7 +2352,7 @@
 STR_7048_ACCEPT_NEW_FACE_SELECTION                              :{BLACK}Uue näo valimine
 STR_7049_SELECT_MALE_FACES                                      :{BLACK}Vali mehe nägu
 STR_704A_SELECT_FEMALE_FACES                                    :{BLACK}Vali naise nägu
-STR_704B_GENERATE_RANDOM_NEW_FACE                               :{BLACK}Loo uus juhuslik nägu
+STR_704B_GENERATE_RANDOM_NEW_FACE                               :{BLACK}Tekita uus suvaline nägu
 STR_704C_KEY                                                    :{BLACK}Selgitus
 STR_704D_SHOW_KEY_TO_GRAPHS                                     :{BLACK}Näita selgitust graafikute juures
 STR_704E_KEY_TO_COMPANY_GRAPHS                                  :{WHITE}Ettevõttegraafiku selgitus
@@ -2688,8 +2700,8 @@
 STR_80FD_TRICARIO_HELICOPTER                                    :Tricario helikopter
 STR_80FE_GURU_X2_HELICOPTER                                     :Guru X2 helikopter
 STR_80FF_POWERNAUT_HELICOPTER                                   :Powernaut helikopter
-STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE                       :{WHITE}Teade veovahendi tootjalt
-STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Me oleme just kujundanud uue {STRING}{P "" i} - kas te tahaksite testida seda aasta aega enne, kui see on saadaval kõigile?
+STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE                       :{WHITE}Teade veovahendite tootjalt
+STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Me töötasime välja uue {STRING}{P "" i}. Kas te oleksite huvitatud selle ainuõiguslikust katsetamisest järgneva aasta jooksul, et me saaksime jälgida kuidas see toimib?
 STR_8102_RAILROAD_LOCOMOTIVE                                    :raudteevedur
 STR_8103_ROAD_VEHICLE                                           :mootorsõiduk
 STR_8104_AIRCRAFT                                               :lennuk
@@ -2705,17 +2717,17 @@
 STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
 STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
 STR_8806_GO_TO                                                  :Mine {STATION}
-STR_8807_GO_TO_TRANSFER                                         :Mine {STATION} (vea ja võta laadung peale)
+STR_8807_GO_TO_TRANSFER                                         :Mine {STATION} (laadi ümber ja võta laadung peale)
 STR_8808_GO_TO_UNLOAD                                           :Mine {STATION} (laadi maha)
-STR_8809_GO_TO_TRANSFER_UNLOAD                                  :Mine {STATION} (vea ja jäta tühjaks)
+STR_8809_GO_TO_TRANSFER_UNLOAD                                  :Mine {STATION} (laadi ümber ja jäta tühjaks)
 STR_880A_GO_TO_LOAD                                             :Mine {STATION} (laadi)
-STR_880B_GO_TO_TRANSFER_LOAD                                    :Mine {STATION} (vea ja oota täislaadungit)
+STR_880B_GO_TO_TRANSFER_LOAD                                    :Mine {STATION} (laadi ümber ja oota täislaadungit)
 STR_880C_GO_NON_STOP_TO                                         :Sõida läbi {STATION}
-STR_880D_GO_TO_NON_STOP_TRANSFER                                :Sõida läbi {STATION} (vea ja oota täislaadungit)
+STR_880D_GO_TO_NON_STOP_TRANSFER                                :Sõida läbi {STATION} (laadi ümber ja oota täislaadungit)
 STR_880E_GO_NON_STOP_TO_UNLOAD                                  :Sõida läbi {STATION} (laadi maha)
-STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Sõida läbi {STATION} (vea ja jäta tühjaks)
+STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Sõida läbi {STATION} (laadi ümber ja jäta tühjaks)
 STR_8810_GO_NON_STOP_TO_LOAD                                    :Sõida läbi {STATION} (laadi)
-STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Sõida läbi {STATION} (vea ja oota täislaadungit)
+STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Sõida läbi {STATION} (laadi ümber ja oota täislaadungit)
 STR_GO_TO_TRAIN_DEPOT                                           :Mine linna {TOWN} rongidepoosse
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Hoolda linna {TOWN} rongidepoos
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Sõida läbi linna {TOWN} rongidepoo
@@ -2808,7 +2820,7 @@
 STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN                            :{BLACK}Ehita valitud raudteesõiduk
 STR_8845_RENAME_TRAIN_VEHICLE_TYPE                              :{BLACK}Muuda raudteesõiduki tüübinime
 STR_8846_CURRENT_TRAIN_ACTION_CLICK                             :{BLACK}Praegune rongi tegevus - vajuta siia et peatada/käivitada rong
-STR_8847_SHOW_TRAIN_S_ORDERS                                    :{BLACK}Näita rongi käske
+STR_8847_SHOW_TRAIN_S_ORDERS                                    :{BLACK}Näita rongi sihtpunkte
 STR_8848_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Vaate viimine rongi asukohale
 STR_8849_SEND_TRAIN_TO_DEPOT                                    :{BLACK}Saada rong depoosse
 STR_884A_FORCE_TRAIN_TO_PROCEED                                 :{BLACK}Sunni rongi signaale eirama
@@ -2823,10 +2835,10 @@
 STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Sihtpunktide nimekiri - vajuta käsul et see valida. CTRL + klik kerib jaama juurde
 STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}Jäta praegune järjestus vahele ja alusta järgmisega. CTRL + klõps jätab vahele kuni valitud järjestuseni
 STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}Kustuta valitud käsk
-STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Märgi valitud käsk ilma peatusetta peatuseks
-STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Lisa uus käsk enne valitud käsku või nimekirja lõppu
-STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Sunni valitud käsu juures oodata täis laadingut
-STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Sunni valitud käsu juures maha laadida.
+STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Muuda valitud käsk peatuseta sihtpunktiks
+STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Lisa uus käsk nimekirja lõppu, või enne valitud käsku
+STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Käsi valitud sihtpunktis sõiduk täis laadida
+STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Käsi valitud sihtpunktis sõiduk tühjaks laadida
 STR_TIMETABLE_TOOLTIP                                           :{BLACK}Sõiduplaan - esiletõstmiseks klõpsa sihtpunktil
 STR_TIMETABLE_WAIT_TIME_TOOLTIP                                 :{BLACK}Muuda, kaua esile tõstetud sihtpunkti peale aega peaks kuluma
 STR_TIMETABLE_CLEAR_TIME_TOOLTIP                                :{BLACK}Tühista esile tõstetud sihtpunkti ajaperiood
@@ -2850,8 +2862,8 @@
 STR_8869_CAN_T_REVERSE_DIRECTION                                :{WHITE}Ei saa rongi ümber pöörata.
 STR_886A_RENAME_TRAIN_VEHICLE_TYPE                              :{WHITE}Muuda rongivaguni tüübinime
 STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Raudteesõiduki tüübinime ei saa muuta...
-STR_886D_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Sunni valitud käsul visata maha laadung
-STR_886F_TRANSFER                                               :{BLACK}Transpordi
+STR_886D_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Käsi valitud sihtpunktis sõiduki laadung kõrvaldada
+STR_886F_TRANSFER                                               :{BLACK}Laadi ümber
 STR_CLEAR_TIME                                                  :{BLACK}Tühista aeg
 STR_RESET_LATENESS                                              :{BLACK}Tühista hilinemisloendur
 
@@ -3222,7 +3234,7 @@
 STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP                          :{BLACK}Müü kõik lennukid angaarist
 
 STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Võta nimekiri kõikidest rongidest selles jaamas nende käskude järgi
-STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Võta nimekiri kõikidest autodest selles garaažis nende käskude järgi
+STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Hangi kõikidest autodest nimekiri, kus käskude all on nende praegune depoo
 STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Võta nimekiri kõikidest laevadest selles sadamas nende käskude järgi
 STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Võta nimekiri kõikidest lennukitest suvalistest angaaridest selles lennujaamas nende käskude järgi
 
@@ -3308,12 +3320,12 @@
 
 ########### String for New Landscape Generator
 
-STR_GENERATE                                                    :{WHITE}Genereeri
-STR_RANDOM                                                      :{BLACK}Muuda juhuslikuks
-STR_RANDOM_HELP                                                 :{BLACK}Muuda maastikuloomisel kasutatavat suvalist seemet
+STR_GENERATE                                                    :{WHITE}Tekita
+STR_RANDOM                                                      :{BLACK}Muuda suvaliseks
+STR_RANDOM_HELP                                                 :{BLACK}Muuda maastiku loomisel kasutatavat suvalist seemet
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Maailma genereerimine
-STR_RANDOM_SEED                                                 :{BLACK}Suvaline seeme:
-STR_RANDOM_SEED_HELP                                            :{BLACK}Klõpsa, et sisestada juhuslik seeme
+STR_RANDOM_SEED                                                 :{BLACK}Juhuarv:
+STR_RANDOM_SEED_HELP                                            :{BLACK}Klõpsa juhuarvu sisestamiseks
 STR_LAND_GENERATOR                                              :{BLACK}Maa generaator:
 STR_TREE_PLACER                                                 :{BLACK}Puu algoritm:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Kõrgustekaardi pööre:
--- a/src/lang/finnish.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/finnish.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1103,9 +1103,24 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Oikean painikkeen emulointi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Pois
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Uusi peli alkaa pysäytettynä: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Edistynyt ajoneuvolista: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Pois
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Oma yhtiö
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Kaikki yhtiöt
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Lastausindikaattorit: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Pois
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Oma yhtiö
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Kaikki yhtiöt
+STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Aikataulut ajoneuvoille: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Näytä aikataulu tickseissä päivien sijaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Raidetyyppi oletuksena: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Tavallinen raide
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Sähköraide
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Yksiraiteinen
@@ -1375,10 +1390,13 @@
 STR_NETWORK_INTERNET                                            :Internet
 STR_NETWORK_LAN_INTERNET                                        :Lähiverkko/Internet
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (mainosta)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} asiakas{P "" ta}
 STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Pelaajien enimmäismäärä:
 STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Pelaajien enimmäismäärä. Pelissä voi olla myös vähemmän pelaajia.
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} yritys{P "" tä}
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Yhtiöiden enimmäismäärä:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Rajoita yhtiöiden määrää palvelimella
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} katsoja{P "" a}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Katsojien enimmäismäärä:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Rajoita katsojien määrää palvelimella
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Puhuttu kieli:
@@ -1611,9 +1629,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Rautatie tavallisin opastimin
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Rautatie esiopastimin
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Rautatie poistumisopastimin
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Rautatie yhdistelmäopastein
 STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Rautatie esisignaaleilla
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Rautatie poistumis-signaaleilla
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Rautatie normaali- ja yhdistelmäopastein
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Rautatie esi- ja poistumissignaaleilla
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Rautatie esi- ja yhdistelmäopastein
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Rautatie poistumis- ja yhdistelmäopastein
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Poista asema ensin
 
 
@@ -1994,7 +2016,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Tunneli pitää tuhota ensin.
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Silta pitää tuhota ensin.
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Ei voi aloittaa ja lopettaa samasta paikkasta.
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Sillan alla pitää olla tasaista maata tai vettä.
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Alku- ja päätepisteen pitää olla linjassa.
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Tontti on sopimaton tunnelinsuulle.
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/french.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/french.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -377,7 +377,7 @@
 STR_SORT_BY_DROPDOWN_NAME                                       :Nom
 STR_SORT_BY_DATE                                                :{BLACK}Date
 STR_SORT_BY_NUMBER                                              :Numéro
-STR_SORT_BY_PROFIT_LAST_YEAR                                    :Profit l'an dernier
+STR_SORT_BY_PROFIT_LAST_YEAR                                    :Profit année précédente
 STR_SORT_BY_PROFIT_THIS_YEAR                                    :Profit cette année
 STR_SORT_BY_AGE                                                 :Âge
 STR_SORT_BY_RELIABILITY                                         :Fiabilité
@@ -473,7 +473,7 @@
 STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Afficher la végétation sur la carte
 STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}Afficher les propriétaires sur la carte
 STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Afficher le nom des villes sur la carte
-STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}Profit cette année: {CURRENCY} (l'an dernier: {CURRENCY})
+STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}Profit cette année: {CURRENCY} (année précédente: {CURRENCY})
 
 ############ range for service numbers starts
 STR_AGE                                                         :{COMMA} an{P "" nées} ({COMMA})
@@ -1021,6 +1021,7 @@
 STR_CONFIG_PATCHES_ON                                           :Activé
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Afficher vitesse du véhicule dans la barre d'état: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Construction côtière et sur pentes: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Repaysagement sous les bâtiments, voies, ... (autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Autoriser des zones de désserte plus réalistes : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Permettre le retrait de plus d'éléments possédés par une ville: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Permettre les trains plus longs: {ORANGE}{STRING}
@@ -1104,9 +1105,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Emulation du clic droit: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Commande-clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Ctrl-clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Désactivé
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Désactivé
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Propre compagnie
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Toutes les compagnies
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Utiliser les indicateurs de chargement: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Désactivé
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Propre compagnie
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Toutes les compagnies
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Activer les horaires pour les véhicules: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Afficher l'horaire en ticks plutôt qu'en jours: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Type de rail par défaut (après nouvelle partie/chargement): {ORANGE}{STRING}
@@ -2005,7 +2018,6 @@
 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
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Le début et la fin doivent être alignés
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Le site pour l'entrée du tunnel ne convient pas
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2790,7 +2802,7 @@
 STR_900C_DETAILS                                                :{WHITE}{VEHICLE} (Détails)
 STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}Âge: {LTBLUE}{STRING}{BLACK}   Coût d'entretien: {LTBLUE}{CURRENCY}/an
 STR_900E_MAX_SPEED                                              :{BLACK}Vitesse max.: {LTBLUE}{VELOCITY}
-STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profit de cette année: {LTBLUE}{CURRENCY}  (année dernière: {CURRENCY})
+STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profit cette année: {LTBLUE}{CURRENCY}  (année précédente: {CURRENCY})
 STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Fiabilité: {LTBLUE}{COMMA}%  {BLACK}Pannes depuis le dernier entretien: {LTBLUE}{COMMA}
 STR_9011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construit en: {LTBLUE}{NUM}{BLACK} Valeur: {LTBLUE}{CURRENCY}
 STR_9012_CAPACITY                                               :{BLACK}Capacité: {LTBLUE}{CARGO}
@@ -2866,7 +2878,7 @@
 STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (Détails)
 STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}Âge: {LTBLUE}{STRING}{BLACK}   Coût d'entretien: {LTBLUE}{CURRENCY}/an
 STR_9813_MAX_SPEED                                              :{BLACK}Vitesse max.: {LTBLUE}{VELOCITY}
-STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profit cette année: {LTBLUE}{CURRENCY}  (l'an dernier: {CURRENCY})
+STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profit cette année: {LTBLUE}{CURRENCY}  (année précédente: {CURRENCY})
 STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}Fiabilité: {LTBLUE}{COMMA}%  {BLACK}Pannes depuis le dernier entretien: {LTBLUE}{COMMA}
 STR_9816_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construit: {LTBLUE}{NUM}{BLACK} Valeur: {LTBLUE}{CURRENCY}
 STR_9817_CAPACITY                                               :{BLACK}Capacité: {LTBLUE}{CARGO}
@@ -2934,7 +2946,7 @@
 STR_A00C_DETAILS                                                :{WHITE}{VEHICLE} (Détails)
 STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}Âge: {LTBLUE}{STRING}{BLACK}   Coût d'entretien: {LTBLUE}{CURRENCY}/an
 STR_A00E_MAX_SPEED                                              :{BLACK}Vitesse max.: {LTBLUE}{VELOCITY}
-STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profits cette année: {LTBLUE}{CURRENCY} (l'an dernier: {CURRENCY})
+STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profit cette année: {LTBLUE}{CURRENCY} (année précédente: {CURRENCY})
 STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Fiabilité: {LTBLUE}{COMMA}%   {BLACK}Pannes depuis le dernier service: {LTBLUE}{COMMA}
 STR_A011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construit: {LTBLUE}{NUM}{BLACK} Valeur: {LTBLUE}{CURRENCY}
 STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Impossible d'envoyer l'aéronef au hangar...
--- a/src/lang/galician.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/galician.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1856,7 +1856,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Debes demole-lo túnel primeiro
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Debes demole-la ponte primeiro
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Non pode empezar e rematar na mesma posición
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Necesítase terreo nivelado ou auga baixo a ponte
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}O inicio e o final deben estar aliñados
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Emprazamento inadecuado para a entrada do túnel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/german.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/german.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1104,9 +1104,21 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Hauptansicht verschieben
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Aus
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Mausradgeschwindigkeit auf dem Spielfeld: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Rechtsklick-Emulation: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Kommando-Klick
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Strg-Klick
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Aus
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatische Pause bei Spielstart: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Erweiterte Fahrzeugliste benutzen: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Aus
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Eigene Firma
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Alle Firmen
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Ladestandanzeiger verwenden: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Aus
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Eigene Firma
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Alle Firmen
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Fahrpläne für Fahrzeuge aktivieren: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Zeitpläne in Ticks anstatt in Tagen anzeigen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Standard-Gleistyp (bei Spielbeginn/geladenem Spiel): {ORANGE}{STRING}
@@ -2005,7 +2017,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Der Tunnel muss zuerst abgerissen werden
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Die Brücke muss erst abgerissen werden
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Anfang und Ende können nicht im selben Feld liegen
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Unter der Brücke ist ebenes Land oder Wasser erforderlich
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Anfang und Ende müssen auf einer Ebene liegen
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Platz ist nicht für einen Tunnel geeignet
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/hungarian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/hungarian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1086,6 +1086,7 @@
 STR_CONFIG_PATCHES_ON                                           :Be
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Járművek sebességének kijelzése: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Lejtőre es partokra építés: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Épületek, sinek alatti tereprendezés engedélyezése (autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Élethűbben méretezett befogadókörzetek bekapcsolása: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Engedélyezi az ipari létesítmények és utak rombolását, stb: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Óriásvonatok engedélyezése: {ORANGE}{STRING}
@@ -1169,9 +1170,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Jobb-klikk emuláció: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command+klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control+klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Kikapcsolva
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Kikapcsolva
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Saját vállalat
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Minden vállalat
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Betöltésjelző használata: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Kikapcsolva
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Saját vállalat
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Minden vállalat
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Időalapú menetrend engedélyezése: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Menetrendi idő-alapegység tick a nap helyett: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Alapértelmezett síntipus (játéktöltés/új játék után): {ORANGE}{STRING}
@@ -2107,7 +2120,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Előbb le kell rombolnod az alagutat
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Előbb le kell rombolnod a hidat
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Nem kezdődhet és végződhet ugyanott
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Sima talaj vagy víz kell, hogy legyen a híd alatt
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}A kezdetének és a végének egy vonalban kell lennie
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Nem alkalmas a hely alagút bejáratának
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/icelandic.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/icelandic.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1877,7 +1877,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Verður að eyða göngum fyrst
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Verður að eyða brú fyrst
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Getur ekki byrjað og endað á sama stað
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Sléttlendi eða vatn nauðsynlegt undir brú
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Verður að byrja og enda í sömu línu
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Óhentug staðsetning fyrir enda gangnanna
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/italian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/italian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -795,8 +795,8 @@
 STR_02D5_LAND_BLOCK_INFO                                        :Informazioni sull'area di terreno
 STR_02D6                                                        :
 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_02D7_SCREENSHOT_CTRL_S                                      :Screenshot (CTRL+S)
+STR_02D8_GIANT_SCREENSHOT_CTRL_G                                :Screenshot Gigante (CTRL+G)
 STR_02D9_ABOUT_OPENTTD                                          :Informazioni su 'OpenTTD'
 ############ range ends here
 
@@ -1022,6 +1022,7 @@
 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_AUTOSLOPE                                    :{LTBLUE}Consenti rimodellazione terreno sotto a edifici, rotaie, etc.: {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}
@@ -1105,9 +1106,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Emulazione clic destro: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :COMANDO+clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :CTRL+clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Off
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Off
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Propria compagnia
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Tutte le compagnie
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Utilizza gli indicatori di caricamento: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Off
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Propria compagnia
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Tutte le compagnie
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Abilita la definizione di tabelle orarie per i veicoli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Mostra le tabelle orarie in tick piuttosto che in giorni: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Ferrovia predefinita (a inizio/ripresa partita): {ORANGE}{STRING}
@@ -2006,7 +2019,6 @@
 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}
--- a/src/lang/japanese.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/japanese.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1103,9 +1103,21 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :地図をスクロール
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :切
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}地図ã®ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«é€Ÿåº¦ï¼š{ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}å³ãƒœã‚¿ãƒ³ã®ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :コマンド+クリック
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :コントロール+クリック
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :切
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}æ–°è¦ã‚²ãƒ¼ãƒ ã‚’開始ã—ãŸã¨ãã«è‡ªå‹•çš„ã«ãƒãƒ¼ã‚ºï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}詳細ã®è»Šä¸¡ãƒªã‚¹ãƒˆã‚’使用:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :切
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :自分
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :ã™ã¹ã¦
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}ç©ã¿é™ã‚ã—を表示:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :切
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :自分
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :ã™ã¹ã¦
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}車両ã®æ™‚刻表を使用:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}æ—¥ã®ä»£ã‚ã‚Šã«æ™‚刻表をティックã§è¡¨ç¤ºï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}デフォルトã®é‰„é“ã®ç¨®é¡žï¼ˆæ–°è¦ã‚²ãƒ¼ãƒ å¾Œï¼ã‚²ãƒ¼ãƒ ã®èª­ã¿è¾¼ã¿å¾Œï¼‰ï¼š{ORANGE}{STRING}
@@ -2004,7 +2016,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}å…ˆã«ãƒˆãƒ³ãƒãƒ«ã‚’破壊ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}å…ˆã«æ©‹ã‚’破壊ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}開始点ã¨çµ‚了点ãŒåŒã˜ä½ç½®ã«å»ºè¨­ã§ãã¾ã›ã‚“
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}橋下ã«å¹³åœ°ã‚‚ã—ãã¯æ°´ãŒãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}一直線ã®æ©‹ã—ã‹å»ºè¨­ã§ãã¾ã›ã‚“
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}ã“ã®åœŸåœ°ã¯ãƒˆãƒ³ãƒãƒ«ã®å…¥ã‚Šå£ã«ä¸é©å½“ã§ã™
 STR_500D                                                        :{GOLD}{STRING}ã€{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/korean.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/korean.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -413,18 +413,18 @@
 STR_SEND_FOR_SERVICING                                          :ì ê²€í•˜ëŸ¬ 보냄
 
 ############ range for months starts
-STR_0162_JAN                                                    :1ì›”
-STR_0163_FEB                                                    :2ì›”
-STR_0164_MAR                                                    :3ì›”
-STR_0165_APR                                                    :4ì›”
-STR_0166_MAY                                                    :5ì›”
-STR_0167_JUN                                                    :6ì›”
-STR_0168_JUL                                                    :7ì›”
-STR_0169_AUG                                                    :8ì›”
-STR_016A_SEP                                                    :9ì›”
-STR_016B_OCT                                                    :10ì›”
-STR_016C_NOV                                                    :11ì›”
-STR_016D_DEC                                                    :12ì›”
+STR_0162_JAN                                                    :1
+STR_0163_FEB                                                    :2
+STR_0164_MAR                                                    :3
+STR_0165_APR                                                    :4
+STR_0166_MAY                                                    :5
+STR_0167_JUN                                                    :6
+STR_0168_JUL                                                    :7
+STR_0169_AUG                                                    :8
+STR_016A_SEP                                                    :9
+STR_016B_OCT                                                    :10
+STR_016C_NOV                                                    :11
+STR_016D_DEC                                                    :12
 ############ range for months ends
 
 STR_016E                                                        :{TINYFONT}{STRING}{} {STRING}
@@ -488,9 +488,9 @@
 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}N/A
+STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}초기화 가격: {LTBLUE}ì—†ìŒ
 STR_01A5_COST_TO_CLEAR                                          :{BLACK}초기화 가격: {LTBLUE}{CURRENCY}
-STR_01A6_N_A                                                    :N/A
+STR_01A6_N_A                                                    :ì—†ìŒ
 STR_01A7_OWNER                                                  :{BLACK}소유ìž: {LTBLUE}{STRING}
 STR_01A8_LOCAL_AUTHORITY                                        :{BLACK}지역 당국: {LTBLUE}{STRING}
 STR_01A9_NONE                                                   :ì—†ìŒ
@@ -1104,11 +1104,17 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :맵 스í¬ë¡¤
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :ë„기
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}맵 스í¬ë¡¤ ì†ë„: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}오른쪽 í´ë¦­ 매í¬ë¡œ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :커맨드 + í´ë¦­
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :컨트롤 + í´ë¦­
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :ë„기
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}새로운 게임 시작할 ë•Œ ìžë™ìœ¼ë¡œ ì¼ì‹œì •ì§€: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}ì§„ë³´ëœ ì°¨ëŸ‰ ëª©ë¡ ì‚¬ìš©: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}ì ìž¬ ì •ë„ í‘œì‹œ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}ì°¨ëŸ‰ì— ì‹œê°„í‘œ 사용: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}시간표를 날보다 틱로 표시: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}시간표를 ì¼(æ—¥)ì´ ì•„ë‹Œ 틱으로 표시: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}기본 ì² ë„ ì¢…ë¥˜ (새 게임/불러오기 후): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :보통 ì² ë„
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :ì „ê°œ ì² ë„
@@ -1263,6 +1269,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...ì‚¬ìš©ì¤‘ì¸ ë¶€ì´ìž…니다!
 
+STR_LANDINFO_COORDS                                             :{BLACK}좌표: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}ì—­ì˜ ì¼ë¶€ë¥¼ 제거할 수 없습니다...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}ì´ê³³ì˜ ì² ë„ íƒ€ìž…ì„ ë°”ê¿€ 수 없습니다...
@@ -1373,18 +1380,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}ìžìœ ë¡œìš´ ì ‘ê·¼ì„ ë§‰ê³  ì‹¶ì„ ë•Œ 게임 접근시 암호를 설정할 수 있습니다
 STR_NETWORK_SELECT_MAP                                          :{BLACK}맵 ì„ íƒ:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}플레ì´í•  ë§µì„ ì„ íƒí•©ë‹ˆë‹¤.
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}최대 ì ‘ì†ìž 수:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}최대 ì ‘ì†ìžìˆ˜ë¥¼ ì„ íƒí•©ë‹ˆë‹¤. 모든 ìŠ¬ë¡¯ì´ ì°¨ìžˆì„ í•„ìš”ëŠ” 없습니다.
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :ì¸í„°ë„·
 STR_NETWORK_LAN_INTERNET                                        :LAN / ì¸í„°ë„·
 STR_NETWORK_INTERNET_ADVERTISE                                  :ì¸í„°ë„· (ê´‘ê³  허용)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM}명 ì ‘ì†ì¤‘
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}최대 ì ‘ì†ìž 수:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}최대 ì ‘ì†ìžìˆ˜ë¥¼ ì„ íƒí•©ë‹ˆë‹¤. 모든 ìŠ¬ë¡¯ì´ ì°¨ìžˆì„ í•„ìš”ëŠ” 없습니다.
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM}ê°œì˜ íšŒì‚¬
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}최대 회사수:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}ì„œë²„ì˜ íšŒì‚¬ì˜ ìˆ˜ë¥¼ 제한합니다
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM}명 참관중
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}최대 관전ìžìˆ˜:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}ê²Œìž„ì„ ê´€ì „í•˜ëŠ” ì ‘ì†ìžì˜ 수를 제한합니다
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}대화 언어:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}서버ì—ì„œ 주로 사용하는 언어를 고르십시오.
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}서버 열기
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}무작위 맵ì´ë‚˜ 시나리오로 새로운 ë„¤íŠ¸ì›Œí¬ ê²Œìž„ì„ ì‹œìž‘í•©ë‹ˆë‹¤.
 STR_NETWORK_LOAD_GAME                                           :{BLACK}맵 불러오기
@@ -1612,9 +1624,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :ì¼ë°˜ ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
 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                        :프리, 콤보-ì‹ í˜¸ë“±ì„ ê°€ì§„ ì² ë¡œ
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :출구, 콤보-ì‹ í˜¸ë“±ì„ ê°€ì§„ ì² ë¡œ
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}먼저 기차 ì •ê±°ìž¥ì„ ì œê±°í•´ì•¼ 합니다
 
 
@@ -1714,8 +1730,8 @@
 STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}ì´ë¯¸ ì§€ê¸‰ëœ ë³´ì¡°ê¸ˆ:
 STR_202C_FROM_TO                                                :{ORANGE}{1:STATION}ì—ì„œ {2:STATION}까지 {0:STRING} 수송{YELLOW} ({3:COMPANY}
 STR_202D_UNTIL                                                  :{YELLOW}, {DATE_SHORT}까지)
-STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}보조금 제공 계약 파기:{}{}{0:STRING}ì—ì„œ {1:STRING}ê¹Œì§€ì˜ {2:STRING} ìˆ˜ì†¡ì€ ë”ì´ìƒ ë³´ì¡°ê¸ˆì„ ì§€ê¸‰í•˜ì§€ 않습니다.
-STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}보조금 제공 철회:{}{}{1:STATION}ì—ì„œ {2:STATION}ê¹Œì§€ì˜ {0:STRING} ìˆ˜ì†¡ì€ ë”ì´ìƒ ë³´ì¡°ê¸ˆì„ ì§€ê¸‰í•˜ì§€ 않습니다.
+STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}보조금 제공 계약 파기:{}{}{1:STRING}ì—ì„œ {2:STRING}ê¹Œì§€ì˜ {0:STRING} ìˆ˜ì†¡ì€ ë”ì´ìƒ ë³´ì¡°ê¸ˆì„ ì§€ê¸‰í•˜ì§€ 않습니다.
+STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}보조금 제공 철회:{}{}지역 ë‹¹êµ­ì€ {1:STATION}ì—ì„œ {2:STATION}ê¹Œì§€ì˜ {0:STRING} ìˆ˜ì†¡ì— ëŒ€í•œ ë³´ì¡°ê¸ˆì„ ì² íšŒí•˜ì˜€ìŠµë‹ˆë‹¤.
 STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}보조금 제공 안내:{}{}처ìŒìœ¼ë¡œ {1:STRING}ì—ì„œ {2:STRING}ê¹Œì§€ì˜ {0:STRING}ì„/를 수송하는 회사는 지역 당국으로부터 ë³´ì¡°ê¸ˆì„ ë°›ê²Œ ë  ê²ƒìž…ë‹ˆë‹¤!
 STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}{0:COMPANY}ì—게 보조금 지급!{}{}{2:STATION}ì—ì„œ {3:STATION}ê¹Œì§€ì˜ {1:STRING} ìˆ˜ì†¡ì— ëŒ€í•´ 50%ì˜ ì¶”ê°€ ë³´ì¡°ê¸ˆì„ ë‚´ë…„ê¹Œì§€ 받게 ë©ë‹ˆë‹¤!
 STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}{0:COMPANY}ì—게 보조금 지급!{}{}{2:STATION}ì—ì„œ {3:STATION}ê¹Œì§€ì˜ {1:STRING} ìˆ˜ì†¡ì— ëŒ€í•´ 2ë°°ì˜ ì¶”ê°€ ë³´ì¡°ê¸ˆì„ ë‚´ë…„ê¹Œì§€ 받게 ë©ë‹ˆë‹¤!
@@ -1995,7 +2011,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}í„°ë„ì„ ë¨¼ì € 제거하십시오
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}다리를 먼저 제거하십시오
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}ê°™ì€ ìœ„ì¹˜ì—ì„œ 시작하고 ë낼 수 없습니다
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}다리 아래ì—는 í‰í‰í•œ ë•…ì´ë‚˜ ë¬¼ì´ ìžˆì–´ì•¼ 합니다!
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}시작과 ëì€ í•œ 줄 ìœ„ì— ìžˆì–´ì•¼ 합니다
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}í„°ë„ ìž…êµ¬ì— ì•Œë§žì§€ ì•Šì€ ìž¥ì†Œìž…ë‹ˆë‹¤
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2060,7 +2075,7 @@
 STR_SV_STNAME_WOODS                                             :{STRING} 숲
 STR_SV_STNAME_LAKESIDE                                          :{STRING} 호숫가
 STR_SV_STNAME_EXCHANGE                                          :{STRING} êµí™˜
-STR_SV_STNAME_AIRPORT                                           :{STRING}공항
+STR_SV_STNAME_AIRPORT                                           :{STRING}
 STR_SV_STNAME_OILFIELD                                          :{STRING} 유전
 STR_SV_STNAME_MINES                                             :{STRING} ê´‘ì‚°
 STR_SV_STNAME_DOCKS                                             :{STRING}í•­
@@ -2794,7 +2809,7 @@
 STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}{TOWN} 차고로 ì ê²€í•˜ëŸ¬ 가는중 ({VELOCITY})
 STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT                            :{WHITE}ì°¨ëŸ‰ì„ ì°¨ê³ ë¡œ 보낼 수 없습니다...
 STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}ì¸ì ‘í•œ 차고를 ì°¾ì„ ìˆ˜ 없습니다
-STR_901A_ROAD_VEHICLES_CLICK_ON                                 :{BLACK}ìžë™ì°¨ - click on vehicle for information
+STR_901A_ROAD_VEHICLES_CLICK_ON                                 :{BLACK}ìžë™ì°¨ - ìžì„¸ížˆ 보려면 í´ë¦­
 STR_901B_BUILD_NEW_ROAD_VEHICLES                                :{BLACK}새 ìžë™ì°¨ 만들기 (차고 í•„ìš”)
 STR_901C_CURRENT_VEHICLE_ACTION                                 :{BLACK}현재 차량 í–‰ë™ - ìš´í–‰/정지시키려면 í´ë¦­í•˜ì„¸ìš”
 STR_901D_SHOW_VEHICLE_S_ORDERS                                  :{BLACK}차량 경로 ë³´ì´ê¸°
@@ -3278,9 +3293,9 @@
 STR_MEASURE_AREA_HEIGHTDIFF                                     :{BLACK}ë„“ì´: {NUM} x {NUM}{}ê³ ë„ì°¨: {NUM} m
 
 ############ Date formatting
-STR_DATE_TINY                                                   :{STRING}-{STRING}-{NUM}
-STR_DATE_SHORT                                                  :{STRING} {NUM}
-STR_DATE_LONG                                                   :{STRING} {STRING} {NUM}
+STR_DATE_TINY                                                   :{2:NUM}.{1:STRING}.{0:STRING}
+STR_DATE_SHORT                                                  :{1:NUM}ë…„ {0:STRING}ì›”
+STR_DATE_LONG                                                   :{2:NUM}ë…„ {1:STRING}ì›” {0:STRING}ì¼
 
 ########
 
@@ -3340,7 +3355,6 @@
 STR_GROUP_RENAME_TIP                                            :{BLACK}ì„ íƒí•œ 그룹 ì´ë¦„ 바꾸기
 STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}ì „ì²´ ìžë™ êµì²´ë¡œë¶€í„° ì´ ê·¸ë£¹ 보호
 
-
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
--- a/src/lang/lithuanian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/lithuanian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1907,7 +1907,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Pirmiau reikia pasalinti tuneli
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Pirmiau reikia pasalinti tilta
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Negalima pradeti ir baigti tuo paciu metu
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Po tiltu turi buti lygi zeme arba vanduo
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Pradzia ir pabaiga turi buti vienoje linijoje
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Vieta netinkama įvaziavimui į tunelį
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/norwegian_bokmal.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/norwegian_bokmal.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1931,7 +1931,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Må rive tunnel først
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Må rive bro først
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Kan ikke starte og slutte på samme felt
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Flatt land eller vann trengs under broen
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Start og slutt må være på linje
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Feltet er upassende for tunnelinngang
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/norwegian_nynorsk.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/norwegian_nynorsk.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1104,9 +1104,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Høgreklikk emulering: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Kommando klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Kontroll klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Av
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatisk pause når ein startar nytt spel: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Bruk avansert køyretøyliste: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Av
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Eige firma
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Alle firma
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Bruk lasteindikatorar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Av
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Eige firma
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Alle firma
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Bruk rutetabellar for køyretøy: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Vis rutetabell i klikk i staden for dagar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Standard Jernbane / etter nytt spel / lasta spel: {ORANGE}{STRING}
@@ -1263,6 +1275,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...bøye er i bruk!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Koordinatar: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Kan ikkje fjerne del av stasjonen...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Kan ikkje konvertere jernbanetype her...
@@ -1373,18 +1386,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Beskytt spelet ditt med passord så ikkje kven som helst kan verte med på det
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Vel eit kart:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Kva kart vil du spele?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maksimalt antal tillatne klientar
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Vel maksimalt antal klientar. Alle plassane treng ikkje å verte tekne
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Internett
 STR_NETWORK_LAN_INTERNET                                        :LAN / Internett
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internett (annonser)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} klient{P "" s}
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maksimalt antal tillatne klientar
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Vel maksimalt antal klientar. Alle plassane treng ikkje å verte tekne
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} firma
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Maks. antal firma:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Begrens tenaren til eit visst antal firma
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} tilskodar{P "" ar}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Maks antal tilskodarar
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Begrens tenaren til eit visst antal tilskodarar
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Språk som vert tala på tenaren:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Andre spelarar skal vete kva språk ein talar på denne tenaren
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}Start spel
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Start eit nytt nettverksspel frå ein tilfeldig bane, eller eit scenario
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Last spel
@@ -1612,9 +1630,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Jernbanespor med normale signal
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Jernbanespor med for-signal
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Jernbanespor med ut-signal
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Jernbane med kombinasjonssignal
 STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Jernbanespor med normale- og pre-signal
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Jernbanespor med normale- og exit-spor
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Jernbane med vanlege og kombinasjonssignal
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Jernbanespor med pre- og exit-signal
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Jernbane med pre- og kombinasjonssignal
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Jernbane med utgangs- og kombinasjonssignal
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Må fjerne togstasjon først
 
 
@@ -1995,7 +2017,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Må rive tunnel først
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Må rive bru først
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Kan ikkje starte og slutte på same felt
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Flatt land eller vatn trengst under brua
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Start og slutt må vere på linje
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Feltet er uhøveleg for tunnelinngang
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3340,7 +3361,6 @@
 STR_GROUP_RENAME_TIP                                            :{BLACK}Gje den valde gruppa nytt namn
 STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Klikk for å beskytte denne gruppa frå å global automatisk erstatning
 
-
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
--- a/src/lang/piglatin.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/piglatin.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1103,9 +1103,21 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Ollscray apmay
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Offway
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Apmay ollwheelscray eedspay: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Ightray-ickclay emulationway: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Ommandcay-ickclay
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Ontrolcay-ickclay
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Offway
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automaticallyway ausepay enwhay artingstay away ewnay amegay: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Useway ethay advancedway ehiclevay istlay: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Offway
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Ownway ompanycay
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Allway ompaniescay
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Useway oadinglay indicatorsway:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Offway
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Ownway ompanycay
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Allway ompaniescay
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Enableway imetablingtay orfay ehiclesvay: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Owshay imetabletay inway ickstay atherray anthay aysday: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Efaultday ailray ypetay (afterway ewnay amegay/amegay oadlay): {ORANGE}{STRING}
@@ -1262,6 +1274,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...uoybay isway inway useway!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Oordinatescay: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}An'tcay emoveray artpay ofway ationstay...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}An'tcay onvertcay ailtyperay erehay...
@@ -1372,18 +1385,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Otectpray ouryay amegay ithway away asswordpay ifway ouyay on'tday antway itway otay ebay ubliclypay accessibleway
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Electsay away apmay:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Ichwhay apmay oday ouyay antway otay ayplay?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Axmay ientsclay:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Oosechay ethay aximummay umbernay ofway ientsclay. Otnay allway otsslay eednay otay ebay illedfay
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LANay
 STR_NETWORK_INTERNET                                            :Internetway
 STR_NETWORK_LAN_INTERNET                                        :LANay / Internetway
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internetway (advertiseway)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} ient{P "" s}clay
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Axmay ientsclay:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Oosechay ethay aximummay umbernay ofway ientsclay. Otnay allway otsslay eednay otay ebay illedfay
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} ompan{P y ies}cay
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Axmay ompaniescay:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Imitlay ethay erversay otay away ertaincay amountway ofway ompaniescay
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} ectator{P "" s}spay
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Axmay ectatorsspay:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Imitlay ethay erversay otay away ertaincay amountway ofway ectatorsspay
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Anguagelay okenspay:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Otherway ayersplay illway owknay ichwhay anguagelay isway okenspay onway ethay erversay
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}Artstay Amegay
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Artstay away ewnay etworknay amegay omfray away andomray apmay, orway enarioscay
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Oadlay Amegay
@@ -1611,9 +1629,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Ailwayray acktray ithway ormalnay ignalssay
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Ailwayray acktray ithway epray-ignalssay
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Ailwayray acktray ithway exitway-ignalssay
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Ailwayray acktray ithway ombocay-ignalssay
 STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Ailwayray acktray ithway ormalnay andway epray-ignalssay
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Ailwayray acktray ithway ormalnay andway exitway-ignalssay
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Ailwayray acktray ithway ormalnay andway ombocay-ignalssay
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Ailwayray acktray ithway epray- andway exitway-ignalssay
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Ailwayray acktray ithway epray- andway ombocay-ignalssay
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Ailwayray acktray ithway exitway- andway ombocay-ignalssay
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Ustmay emoveray ailwayray ationstay irstfay
 
 
@@ -1994,7 +2016,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Ustmay emolishday unneltay irstfay
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Ustmay emolishday idgebray irstfay
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Annotcay artstay andway endway inway ethay amesay otspay
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Evellay andlay orway aterway equiredray underway idgebray
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Artstay andway endway ustmay ebay inway inelay
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Itesay unsuitableway orfay unneltay entranceway
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3339,7 +3360,6 @@
 STR_GROUP_RENAME_TIP                                            :{BLACK}Enameray ethay electedsay oupgray
 STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Ickclay otay otectpray isthay oupgray omfray obalglay autoreplaceway
 
-
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
--- a/src/lang/polish.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/polish.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -2127,7 +2127,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Należy najpierw usunąć tunel
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Należy najpierw usunąć most
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Nie można zaczynać i kończyć w tym samym miejscu
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Wymagany równy ląd lub woda pod mostem
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Początek i koniec muszą być w jednej linii
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Nieodpowiednie miejsce na wejście tunelu
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/portuguese.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/portuguese.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1999,7 +1999,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Deverá demolir o túnel primeiro
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Deverá demolir a ponte primeiro
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Não é posível iniciar e finalizar no mesmo ponto
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Debaixo da ponte é necessário terreno plano ou água
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Inicio e fim devem estar alinhados
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}O sítio não é adequado para a entrada do túnel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/romanian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/romanian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
 STR_CONFIG_PATCHES_ON                                           :activ
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Afiseazã viteza vehiculelor in bara de jos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Permite construirea pe coastã si in pantã: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Permite terra-formarea sub cladiri, sine, etc. (auto-pante): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Permite arii de cuprindere mai realistice: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Permite demolarea unui nr. mai mare constructii: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Permite constructia de trenuri foarte lungi: {ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Emulatie click-dreapta: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Comanda-click
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control-click
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Oprit
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}La pornirea unui joc nou, pune-l pe pauza: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Foloseste lista avanata de vehicule: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Oprit
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Propria companie
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Toate companiile
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Foloseste indicatorii de incarcare: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Oprit
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Propria companie
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Toate companiile
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Foloseste orarul pentru vehicule: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Arata orarul per programari, nu per zile: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Tipul implicit de sina (dupa joc nou/incarcare joc): {ORANGE}{STRING}
@@ -1262,6 +1275,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}... baliza in uz!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Coordonate: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Nu pot demola o parte din statie...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Nu pot converti linia aici...
@@ -1372,18 +1386,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Protejeazã-ti jocul cu o parolã dacã nu vrei sã intre jucãtori neautorizati
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Alege o hartã:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Ce hartã doresti sa joci?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Numar maxim de clienti
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Alege un numar maxim de clienti. Nu trebuie ocupate toate locurile.
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Internet
 STR_NETWORK_LAN_INTERNET                                        :LAN / Internet
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (fă reclamă)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} client{P "" i}
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Numar maxim de clienti
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Alege un numar maxim de clienti. Nu trebuie ocupate toate locurile.
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} compan{P ie ii}
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Maximum companii:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Limiteazã serverle la un anumit numãr companii
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} spectator{P "" i}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Maxim spectatori:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Limiteazã serverul la un anumit numãr de spectatori
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Limba vorbită:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Ceilalţi jucători vor şti în ce limbă se discută pe server.
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}ÃŽncepe jocul
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Incepe un joc nou in retea cu o harta aleatoare sau intr-un scenariu
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Incarca joc
@@ -1611,9 +1630,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Cale ferată cu semafoare normale
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Cale ferată cu pre-semafoare
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Cale ferată cu semafoare de ieşire
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Cale ferata cu semnale combinate
 STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Cale ferată cu semafoare normale şi pre-semafoare
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Cale ferată cu semafoare normale şi semafoare de ieşire
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Cale ferata cu semnale normale si combinate
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Cale ferată cu pre-semafoare şi semafoare de ieşire
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Cale ferata cu pre-semnalizate si cu semnale combinate
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Cale ferata cu post-semnalizate si cu semnale combinate
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Trebuie mai intai sa demolati gara
 
 
@@ -1994,7 +2017,6 @@
 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}
@@ -3339,7 +3361,6 @@
 STR_GROUP_RENAME_TIP                                            :{BLACK}Redenumeste grupul selectat
 STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Click aici pentru a proteja acest grup de la inlocuirile automate globale
 
-
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
--- a/src/lang/russian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/russian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1105,9 +1105,21 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Ð´Ð»Ñ ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð°
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :не иÑпользовать
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}СкороÑÑ‚ÑŒ ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð° прокруткой колеÑа мыши: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}ЭмулÑÑ†Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð³Ð¾ клика мыши: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Команд.
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Контрол.
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Выкл.
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Ðвтопауза в начале игры: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}ИÑпользовать раÑширенный ÑпиÑок транÑпорта: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Выкл.
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :СобÑтв.
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Ð’Ñе комп.
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}ИÑпользовать индикатор загрузки: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Выкл.
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :СобÑтв.
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Ð’Ñе комп.
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}ИÑпользовать раÑпиÑание Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпорта: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Показывать раÑпиÑание в 'тиках', а не днÑÑ…: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Тип Ñ€ÐµÐ»ÑŒÑ Ð¿Ð¾ умолчанию (поÑле Ñтарта/загрузки игры): {ORANGE}{STRING}
@@ -1264,6 +1276,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...Ñтот буй иÑпользуетÑÑ!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Координаты: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Ðевозможно удалить чаÑÑ‚ÑŒ Ñтанции...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Ðевозможно преобразовать тип рельÑа здеÑÑŒ...
@@ -1374,18 +1387,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Защитите вашу игру паролем, еÑли вы не хотите, чтобы к ней могли подключитьÑÑ Ð²Ñе желающие
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Выбор карты:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Какую карту вы хотите играть?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}МакÑ. клиентов:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Выбор макÑимального чиÑла клиентов. Ðе вÑе меÑта должны быть занÑÑ‚Ñ‹
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть
 STR_NETWORK_INTERNET                                            :Интернет
 STR_NETWORK_LAN_INTERNET                                        :Лок. Ñеть/Интернет
 STR_NETWORK_INTERNET_ADVERTISE                                  :Интернет (объÑвл.)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} клиент{P "" а ов}
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}МакÑ. клиентов:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Выбор макÑимального чиÑла клиентов. Ðе вÑе меÑта должны быть занÑÑ‚Ñ‹
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} компан{P Ð¸Ñ Ð¸Ð¸ ий}
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}МакÑ. компаний:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Ограничить макÑимальное чиÑло компаний на Ñервере
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} наблюдател{P ÑŒ Ñ ÐµÐ¹}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}МакÑ. наблюдателей:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Ограничить макÑимальное количеÑтво наблюдателей на Ñервере
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Язык общениÑ:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Другие игроки будут знать, на каком Ñзыке говорÑÑ‚ на Ñервере
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}ЗапуÑк игры
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}ЗапуÑк новой Ñетевой игры Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÑŒÐ½Ð¾Ð¹ карты или ÑценариÑ
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Загрузка игры
@@ -1613,9 +1631,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Ж/Д путь Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼ Ñигналом
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Ж/Д путь Ñ Ð¿Ñ€ÐµÑигналами
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Ж/Д путь Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ Ñигналами
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Ж/д путь Ñ ÐºÐ¾Ð¼Ð±Ð¾-Ñигналами
 STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :РельÑÑ‹ и нормальными и пре-Ñигналами
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :РельÑÑ‹ и нормальными и выходными Ñигналами
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Ж/д путь Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ и комбо-Ñигналами
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :РельÑÑ‹ Ñ Ð¿Ñ€Ðµ- и выходными Ñигналами
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Ж/д путь Ñ Ð¿Ñ€Ðµ- и комбо-Ñигналами
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Ж/д путь Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ и комбо-Ñигналами
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Сначала удалите ЖД Ñтанцию
 
 
@@ -1996,7 +2018,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Сначала удалите туннель
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Сначала удалите моÑÑ‚
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Ðе может начинатьÑÑ Ð¸ заканчиватьÑÑ Ð² той же точке
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Более низкий уровень земли или воды должен быть под моÑтом
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Ðачало и конец должны быть на одной линии
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}ÐеподходÑщее меÑто Ð´Ð»Ñ ÑтроительÑтва туннелÑ
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/simplified_chinese.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/simplified_chinese.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1900,7 +1900,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}必须先拆除隧é“
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}必须先拆除桥æ¢
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}起止点ä¸èƒ½ç›¸åŒ
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}桥下必须有ä¸å¹³æ•´çš„地é¢æˆ–æ°´é¢
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}起止两端必须在一æ¡çº¿ä¸Š
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}此处ä¸é€‚åˆä½œä¸ºéš§é“å…¥å£
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/slovak.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/slovak.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1084,6 +1084,7 @@
 STR_CONFIG_PATCHES_ON                                           :Zap.
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Zobrazit rychlost vozidla v stavovej liste: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Umoznit vystavbu na svahoch a na pobrezi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Povolit úpravy terénu pod budovami, kolajami, ... : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Povolit realistickejsiu velkost oblasti pokrytia: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Umoznit odstranenie viacerych mestskych ciest, mostov, ... : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Umoznit stavbu dlhych vlakov: {ORANGE}{STRING}
@@ -1167,9 +1168,21 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Posúvat mapu
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Vypnuté
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Rychlost posúvania pohladu: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Funkcia pravého tlacidla myši: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Príkaz - klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control - klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Ziadna
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Vypnutý
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Vlastná spolocnost
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :VÅ¡etky spolocnosti
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Zobrazovat ukazovatele nakladania a vykladania: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Vypnuté
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Vlastná spolocnost
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :VÅ¡etky spolocnosti
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Povolit cestovné poriadky pre vozidlá: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Zobrazovat cestovné poriadky v tikoch namiesto dní: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Predvolený typ kolají (v novej/nahranej hre): {ORANGE}{STRING}
@@ -2068,7 +2081,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Tunel musi byt najskor zburany
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Most musi byt najskor zburany
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Nemozno zacat a skoncit na tom istom mieste
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Pod mostom je potrebná voda alebo údolie
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Zaciatok a koniec musi byt v rovine
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}To miesto je nepouzitelne ako vstup do tunela
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/slovenian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/slovenian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1062,6 +1062,7 @@
 STR_CONFIG_PATCHES_ON                                           :Vklopi
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Prikaz hitrosti vozil v vrstici stanja: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Dovoli gradnjo hiš na nagibih ali obali: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Dovoli oblikovanje terena pod objekti (tiri, hiše) (samonaklon): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Dovoli bolj resniÄni obmoÄni zajem postaj: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Dovoli odstanitev mestnih cest, mostov, itd.: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}OmogoÄi gradnjo zelo dolgih vlakov: {ORANGE}{STRING}
@@ -1145,9 +1146,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Emulacija desnega gumba miške: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Ukaz-klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Kontrola-klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Izklop
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Avtomatsko pavziraj ob zagonu nove igre: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Uporabi napreden seznam vozil: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Izklop
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Lastno podjetje
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Vsa podjetja
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Uporabi pregledno polnenje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Izklop
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Lastno podjetje
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Vsa podjetja
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}OmogoÄi Äasovne tabele vozil: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Prikaz Äasovnih tabel v pikah namesto dneh: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Privzeta vrsta železnice (ob zagonu nove igre): {ORANGE}{STRING}
@@ -2084,7 +2097,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Najprej moraš porušiti predor
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Najprej moraš porušiti most
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Ni mogoÄe zaÄeti in konÄati v isti toÄki
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Raven teren ali vodovje zahtevano pod mostom
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}ZaÄetek in konec morata biti na isti viÅ¡ini
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Lokacija neprimerna za vhod v predor
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/spanish.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/spanish.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1021,6 +1021,7 @@
 STR_CONFIG_PATCHES_ON                                           :Sí
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Mostrar velocidad del vehículo en la barra de estado: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Permitir la construcción en cuestas y orillas: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Permitir pendientes bajo construcciones, carreteras, etc. (autopendiente): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Permitir tamaño del área de captación más realista: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Permitir demoler más propiedades de poblaciones: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Permitir la construcción de trenes muy largos: {ORANGE}{STRING}
@@ -1104,9 +1105,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Emulación del botón derecho: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Tecla Command
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Tecla Control
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Desactivado
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Apagado
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Propia empresa
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Todas las empresas
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Usar indicadores de carga: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Apagado
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Propia empresa
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Todas las empresas
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Activar horarios para vehículos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Mostrar horario en ticks en vez de en dias: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Rail por defecto (juego nuevo/cargar juego): {ORANGE}{STRING}
@@ -1325,7 +1338,7 @@
 
 STR_NETWORK_MULTIPLAYER                                         :{WHITE}Multijugador
 
-STR_NETWORK_PLAYER_NAME                                         :{BLACK}Nombre Jugad.:
+STR_NETWORK_PLAYER_NAME                                         :{BLACK}Nombre del Jugador:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Este es el nombre con el que otros jugadores le identificarán
 STR_NETWORK_CONNECTION                                          :{BLACK}Conexión:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Seleccione entre un juego en Internet o en una Red de Ãrea Local
@@ -2005,7 +2018,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Primero debe demolerse el túnel
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Primero debe demolerse el puente
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}No se puede comenzar y acabar en la misma posición
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Se requiere tierra a nivel o agua bajo el puente
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Comienzo y final deben estar en línea
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Lugar inapropiado para entrada de túnel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/swedish.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/swedish.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1103,9 +1103,21 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Högerklicksemulering: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command-klick
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control-klick
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Av
+
 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_ADVANCED_VEHICLE_LISTS_OFF                   :Av
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Eget företag
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Alla företag
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Använd lastningsindikatörer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Av
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Eget företag
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Alla företag
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Aktivera Tidtabeller för fordon: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Visa tidtabeller räknat i ticks istället för dagar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Standard järnvägsräls (efter nytt/laddat spel): {ORANGE}{STRING}
@@ -1262,6 +1274,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}... bojen används!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Koordinater: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Kan ej ta bort del av station...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Kan inte konvertera spårtyp här...
@@ -1372,18 +1385,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Skydda spelet med ett lösenord så att inte andra än dom som har lösenordet kan gå med i spelet
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Välj karta:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Vilken karta vill du spela?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Max antal tillåtna klienter:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Välj max antal tillåtna klienter. Alla platser måste inte fyllas.
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Internet
 STR_NETWORK_LAN_INTERNET                                        :LAN / Internet
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (publik)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} klient{P "" s}
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Max antal tillåtna klienter:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Välj max antal tillåtna klienter. Alla platser måste inte fyllas.
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} företag{P y ies}
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Max företag:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Begränsa antalet företag på servern
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} åskådare{P "" s}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Max observatörer:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Begränsa antalet observatörer på servern
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Språk som talas:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Andra spelare kommer vara medvetna vilket språk som talas på servern.
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}Starta spelet
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Starta ett nytt spel med en slumpmässig karta eller från ett scenario
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Ladda spel
@@ -1611,9 +1629,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Järnväg med vanliga signaler
 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                            :Tågspår med kombinationsignaler
 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                     :Tågspår med normal- och kombinationsignaler
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Järnväg med för- och utfarts-signaler
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Tågspår med för- och kombinationsignaler
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Tågspår med utgångs- och kombinationsignaler
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Måste ta bort tågstationen först
 
 
@@ -1994,7 +2016,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Måste riva tunnel först
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Måste riva bro först
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Kan inte börja och sluta på samma plats
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Platt land eller vatten krävs under bro
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Start- och slutpunkt måste ligga i linje
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Platsen passar inte för tunnelentré
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3311,6 +3332,10 @@
 STR_GROUP_ALL_ROADS                                             :Alla vägfordon
 STR_GROUP_ALL_SHIPS                                             :Alla skepp
 STR_GROUP_ALL_AIRCRAFTS                                         :Alla flygplan
+STR_GROUP_DEFAULT_TRAINS                                        :Ogrupperade tåg
+STR_GROUP_DEFAULT_ROADS                                         :Ogrupperade vägfordon
+STR_GROUP_DEFAULT_SHIPS                                         :Ogrupperade skepp
+STR_GROUP_DEFAULT_AIRCRAFTS                                     :Ogrupperade flygmaskiner
 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
@@ -3335,7 +3360,6 @@
 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_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
--- a/src/lang/traditional_chinese.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/traditional_chinese.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
 STR_CONFIG_PATCHES_ON                                           :é–‹
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}於狀態列顯示速度:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}於斜å¡å’Œå²¸é‚Šèˆˆå»ºï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}å…許在建物或是軌é“底下改變地形斜度 (autoslope):{ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}真實大å°çš„收集範åœï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}å¯ç§»é™¤æ›´åŸŽéŽ®æ“有的é“路,橋樑等:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}æ高列車長度é™åˆ¶ï¼š{ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :æ²å‹•åœ°åœ–
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :關閉
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}滾輪地圖æ²å‹•é€Ÿåº¦ï¼š {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}å³éµæ¨¡æ“¬ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :命令éµ
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :控制éµ
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :ç„¡
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}自動在開始新éŠæˆ²æ™‚æš«åœï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}使用進階載具å單: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :ç„¡
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :自家公å¸
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :所有公å¸
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}使用載入指示:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :ç„¡
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :自家公å¸
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :所有公å¸
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}啟用é‹å…·æ™‚刻表功能:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}顯示時刻表時以 Tick 為單ä½è€Œä¸æ˜¯æ—¥ï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}é è¨­çš„路軌類型 (將在新éŠæˆ²æˆ–載入éŠæˆ²æ™‚生效):{ORANGE}{STRING}
@@ -1262,6 +1275,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...浮標正被使用!
 
+STR_LANDINFO_COORDS                                             :{BLACK}座標:{LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}ä¸èƒ½ç§»é™¤è»Šç«™éƒ¨ä»½...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}無法轉æ›è»Œé“種類...
@@ -1372,18 +1386,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}如果您ä¸æƒ³è®“大眾連線的話,å¯ä»¥ç”¨å¯†ç¢¼ä¿è­·éŠæˆ²
 STR_NETWORK_SELECT_MAP                                          :{BLACK}é¸æ“‡åœ°åœ–:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}您想玩哪個地圖?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}客戶端上é™ï¼š
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}é¸æ“‡é€£ç·šäººæ•¸ä¸Šé™ã€‚未必æ¯å€‹åé¡éƒ½éœ€é€£ç·š
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :局域網絡(LAN)
 STR_NETWORK_INTERNET                                            :互è¯ç¶²
 STR_NETWORK_LAN_INTERNET                                        :局域網/互è¯ç¶²
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (廣告)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} 玩家
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}客戶端上é™ï¼š
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}é¸æ“‡é€£ç·šäººæ•¸ä¸Šé™ã€‚未必æ¯å€‹åé¡éƒ½éœ€é€£ç·š
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} å…¬å¸
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}å…¬å¸ä¸Šé™ï¼š
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}é™åˆ¶ä¼ºæœå™¨å¯ä»¥å»ºç«‹çš„å…¬å¸æ•¸
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} 觀戰
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}觀看者上é™ï¼š
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}é™åˆ¶å¯åŠ å…¥çš„觀察者數é‡
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}所用的語言:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}讓其他人知é“這個伺æœå™¨ä½¿ç”¨çš„交談語言
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}開始éŠæˆ²
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}以隨機地圖或劇本開始新的網路éŠæˆ²
 STR_NETWORK_LOAD_GAME                                           :{BLACK}載入éŠæˆ²
@@ -1611,9 +1630,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :有一般號誌的éµè»Œ
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :有入å£è™ŸèªŒçš„éµè»Œ
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :有出å£è™ŸèªŒçš„éµè»Œ
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :有組åˆè™ŸèªŒçš„éµè»Œ
 STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :有一般號誌åŠå…¥å£è™ŸèªŒçš„éµè»Œ
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :有一般號誌åŠå‡ºå£è™ŸèªŒçš„éµè»Œ
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :有一般號誌åŠçµ„åˆè™ŸèªŒçš„éµè»Œ
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :有入å£è™ŸèªŒåŠå‡ºå£è™ŸèªŒçš„éµè»Œ
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :有入å£è™ŸèªŒåŠçµ„åˆè™ŸèªŒçš„éµè»Œ
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :有出å£è™ŸèªŒåŠçµ„åˆè™ŸèªŒçš„éµè»Œ
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}必須先移除ç«è»Šç«™
 
 
@@ -1994,7 +2017,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}必須先摧毀隧é“
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}必須先摧毀橋樑
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}ä¸èƒ½çµæŸåœ¨é–‹å§‹åœ°é»ž
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}橋樑下需è¦å¹³åœ°æˆ–æ°´é¢
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}開始與çµæŸåœ°é»žå¿…é ˆä½åœ¨åŒä¸€ç›´ç·š
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}隧é“å…¥å£åœ°é»žä¸é©åˆ
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3339,7 +3361,6 @@
 STR_GROUP_RENAME_TIP                                            :{BLACK}為群組é‡æ–°å‘½å
 STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}點此å¯é¿å…此群組內的設備被來自全域的設定替æ›
 
-
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
--- a/src/lang/turkish.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/turkish.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
 STR_CONFIG_PATCHES_ON                                           :Açık
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Durum çubuğunda arabanın hızını göster: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Sahile ve eÄŸimli araziye inÅŸaat: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Binaların, yolların, vb. altında kazıya izin ver (otomatik betonlama): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Daha gerçekçi kapsama alanı: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Şehrin yollarını, köprülerini yıkma izinli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Çok uzun trenlere izin ver: {ORANGE}{STRING}
@@ -1033,6 +1034,9 @@
 STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Sadece istek varsa kargo kabul edilsin: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Çok uzun köprülere izin ver: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Garaja git talimati etkin: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD             :{LTBLUE}Üretim fabrikalarının yapım yöntemi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE        :hiçbiri
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL      :diÄŸer fabrikalar gibi
 STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Bir şehirde birden fazla aynı fabrika olması izinli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Aynı tür fabrikalar yan yana yapılabilir: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Durum çubuğunda uzun tarih göster: {ORANGE}{STRING}
@@ -1099,9 +1103,20 @@
 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_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Sağ tıklama öykünümü: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Komut-tıklama
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Kontrol-tıklama
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Kapalı
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Yeni bir oyun başlatırken zamanı duraklat: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Gelişmiş araç listesini kullan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Kendi ÅŸirketim
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Tüm şirketler
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Araç yükleme bilgisini göster: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Kapalı
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Kendi ÅŸirketim
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Tüm şirketler
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Araç zaman çizelgesi açık: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Normal Ray
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Elektrikli Ray
@@ -1111,6 +1126,7 @@
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :En yenisi
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :En çok kullanılan
 
+STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Hiç uygun araç olmasa da inşa araçlarını göster: {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}
 STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Her oyuncu için en fazla uçak: {ORANGE}{STRING}
@@ -1145,6 +1161,7 @@
 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                                  :{LTBLUE}Şehir yol yerleşimini seç: {ORANGE}{STRING}
 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
@@ -1164,6 +1181,7 @@
 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_LARGER_TOWNS_DISABLED                        :{LTBLUE}Şehir olacak kasabaların oranı: {ORANGE}Hiçbiri
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Birincil şehir büyüklüğü çarpanı: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Arayüz
@@ -1253,6 +1271,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...samandıra kullanımda!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Koordinatlar: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}İstasyonun parçasi kaldırılamaz...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Ray türü değiştirilemiyor...
@@ -1363,18 +1382,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Erişimi kısıtlamak için oyuna parola koy
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Harita seç:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Hangi haritada oynamak istiyorsun?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Ä°zin verilen en fazla oyuncu:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}İzin verilen en fazla oyuncu sayısını seç. Her yerin dolması gerekmez
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Ä°nternet
 STR_NETWORK_LAN_INTERNET                                        :LAN / internet
 STR_NETWORK_INTERNET_ADVERTISE                                  :Ä°nternet (reklam vererek)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} istemci
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Ä°zin verilen en fazla oyuncu:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}İzin verilen en fazla oyuncu sayısını seç. Her yerin dolması gerekmez
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} ÅŸirket
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}En fazla ÅŸirket:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Sunucudaki şirket sayısını sınırla
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} seyirci
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}En fazla izleyici:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Sunucudaki izleyici sayısını sınırla
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}KonuÅŸulan dil:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Diğer oyuncular sunucuda hangi dilin konuşulacağını bilecek
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}Oyunu BaÅŸlat
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Rastgele harita ya da senaryoda network oyunu aç
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Oyun Yükle
@@ -1385,22 +1409,28 @@
 STR_NETWORK_LANG_ENGLISH                                        :Ä°ngilizce
 STR_NETWORK_LANG_GERMAN                                         :Almanca
 STR_NETWORK_LANG_FRENCH                                         :Fransızca
+STR_NETWORK_LANG_BRAZILIAN                                      :Brezilyaca
 STR_NETWORK_LANG_BULGARIAN                                      :Bulgarca
 STR_NETWORK_LANG_CHINESE                                        :Çince
 STR_NETWORK_LANG_CZECH                                          :Çekce
+STR_NETWORK_LANG_DANISH                                         :Danimarkaca
+STR_NETWORK_LANG_DUTCH                                          :Hollandaca
 STR_NETWORK_LANG_FINNISH                                        :Fince
 STR_NETWORK_LANG_HUNGARIAN                                      :Bulgarca
+STR_NETWORK_LANG_ICELANDIC                                      :Ä°zlandaca
 STR_NETWORK_LANG_ITALIAN                                        :Ä°talyanca
 STR_NETWORK_LANG_JAPANESE                                       :Japonca
 STR_NETWORK_LANG_KOREAN                                         :Korece
 STR_NETWORK_LANG_LITHUANIAN                                     :Litvanyaca
 STR_NETWORK_LANG_NORWEGIAN                                      :Norveççe
+STR_NETWORK_LANG_POLISH                                         :Lehçe
 STR_NETWORK_LANG_PORTUGUESE                                     :Portekizce
 STR_NETWORK_LANG_ROMANIAN                                       :Romanca
 STR_NETWORK_LANG_RUSSIAN                                        :Rusça
 STR_NETWORK_LANG_SLOVAK                                         :Slovakça
 STR_NETWORK_LANG_SLOVENIAN                                      :Slovence
 STR_NETWORK_LANG_SPANISH                                        :Ä°spanyolca
+STR_NETWORK_LANG_SWEDISH                                        :İsveççe
 STR_NETWORK_LANG_TURKISH                                        :Türkçe
 STR_NETWORK_LANG_UKRAINIAN                                      :Ukraynaca
 ############ End of leave-in-this-order
@@ -1595,9 +1625,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Normal sinyalli ray
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Ön-sinayalli ray
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Çıkış-sinyalli ray
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :BirleÅŸik sinyalli ray
 STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Normal ve ön sinyalli ray
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Normal ve çıkış sinyalli ray
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Normal ve birleÅŸik sinyalli ray
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Ön ve Çıkış sinyalli ray
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Ön ve birleşik sinyalli ray
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Çıkış ve birleşik sinyalli ray
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Önce tren istasyonu kaldırılmalı
 
 
@@ -1942,6 +1976,12 @@
 STR_4829_REQUIRES                                               :{BLACK}Ä°stenenler: {YELLOW}{STRING}, {STRING}, {STRING}
 ############ range for requires ends
 
+############ range for produces starts
+STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Ä°ÅŸlenmeyi bekleyen kargo:
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Ãœretir: {YELLOW}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Ãœretir: {YELLOW}{STRING}, {STRING}
+############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Geçen ayki üretim:
 STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} (%{COMMA} tasindi)
@@ -1972,7 +2012,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Önce tünel yıkılmalı
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Önce köprü yıkılmalı
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Aynı noktada başlayıp bitemez
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Köprü altınin düz olması gerekiyor
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Başlangıç ve bitiş aynı çizgi üzerinde olmalı
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Yer tünel girişi için uygun değil
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2704,7 +2743,7 @@
 STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}Ağırlık: {LTBLUE}{WEIGHT_S}  {BLACK}Güç: {LTBLUE}{POWER}{BLACK} Mak. hız: {LTBLUE}{VELOCITY}
 STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}Ağırlık: {LTBLUE}{WEIGHT_S} {BLACK}Güç: {LTBLUE}{POWER}{BLACK} Mak. hız: {LTBLUE}{VELOCITY} {BLACK}Max. Ç.G.: {LTBLUE}{FORCE}
 STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Bu seneki kâr: {LTBLUE}{CURRENCY}  (geçen sene: {CURRENCY})
-STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}güvenilirlik: {LTBLUE}%{COMMA}  {BLACK}Son servisteki bozulmalar: {LTBLUE}{COMMA}
+STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}Güvenilirlik: {LTBLUE}%{COMMA}  {BLACK}Son servisteki bozulmalar: {LTBLUE}{COMMA}
 STR_8861_STOPPED                                                :{RED}Durdu
 STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}Tehlikedeki tren sinyali geçemez...
 STR_8863_CRASHED                                                :{RED}Çarptı!
@@ -2756,7 +2795,7 @@
 STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}Yaş: {LTBLUE}{STRING}{BLACK}   Bakım: {LTBLUE}{CURRENCY}/sene
 STR_900E_MAX_SPEED                                              :{BLACK}Mak. hız: {LTBLUE}{VELOCITY}
 STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Bu seneki kâr: {LTBLUE}{CURRENCY}  (geçen sene: {CURRENCY})
-STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}güvenilirlik: {LTBLUE}%{COMMA}  {BLACK}Breakdowns since last service: {LTBLUE}{COMMA}
+STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Güvenilirlik: {LTBLUE}%{COMMA}  {BLACK}Breakdowns since last service: {LTBLUE}{COMMA}
 STR_9011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Yapım yılı: {LTBLUE}{NUM}{BLACK} Değeri: {LTBLUE}{CURRENCY}
 STR_9012_CAPACITY                                               :{BLACK}Kapasite: {LTBLUE}{CARGO}
 STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...bir araba garajında duruyor olmalı
@@ -3284,6 +3323,10 @@
 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_DEFAULT_TRAINS                                        :Gruplanmamış trenler
+STR_GROUP_DEFAULT_ROADS                                         :Gruplanmamış arabalar
+STR_GROUP_DEFAULT_SHIPS                                         :Gruplanmamış gemiler
+STR_GROUP_DEFAULT_AIRCRAFTS                                     :Gruplanmamış 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
@@ -3308,7 +3351,6 @@
 STR_GROUP_RENAME_TIP                                            :{BLACK}Seçili grubun ismini değiştir
 STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Bu grubu otomatik yenilemeden ayrı tutmak için tıklayın
 
-
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
@@ -3323,3 +3365,7 @@
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Önceki tabelaya git
 
 ########
+
+STR_FUND_NEW_INDUSTRY                                           :{BLACK}Parayla Yap
+STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Ä°nÅŸa et
+STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Bu listeden uygun fabrikayı seçin
--- a/src/lang/ukrainian.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/ukrainian.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1146,6 +1146,7 @@
 STR_CONFIG_PATCHES_ON                                           :Так
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Показувати швидкіÑÑ‚ÑŒ у Ñ€Ñдку Ñтану: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Будувати на Ñхилах та узбережжÑÑ…: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}МінÑти Ñхили під будівлÑми, дорогами тощо (автоÑхил): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Великий район обÑлуговуваннÑ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Переміщувати дороги, моÑти та іншу влаÑніÑÑ‚ÑŒ міÑта: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Будувати дуже довгі поїзди: {ORANGE}{STRING}
@@ -1229,9 +1230,19 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Прокрутка карти
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Відкл.
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}ШвидкіÑÑ‚ÑŒ прокрутки колеÑом миші: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}ЕмулÑÑ†Ñ–Ñ Ð·Ð° правим клацом миші: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Відкл.
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Ðвтоматично Ñтавити паузу при Ñтарті нової гри: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}ВикориÑтовувати покращений ÑпиÑок транÑпорту: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :відкл.
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :ВлаÑна компаніÑ
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :УÑÑ– компанії
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}ВикориÑтовувати індикатори завантаженнÑ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :відкл.
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :ВлаÑна компаніÑ
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :УÑÑ– компанії
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Дозволити розклад руху Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпорту: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Показувати розклад в одиницÑÑ…, а не в днÑÑ…: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Тип колії за замовчаннÑм (при новій грі/завантаженні): {ORANGE}{STRING}
@@ -2167,7 +2178,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Спочатку зруйнуйте тунель
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Спочатку зруйнуйте міÑÑ‚
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Початок та кінець не можуть бути в одному міÑці
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Рівна Ð·ÐµÐ¼Ð»Ñ Ñ‡Ð¸ вода має бути під моÑтом
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Початок та кінець мають бути на одній лінії
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Ðевідповідне міÑце Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ тунелÑ
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/unfinished/afrikaans.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/unfinished/afrikaans.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode af_ZA
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Oor kant van kaart
@@ -10,10 +12,10 @@
 STR_0003_NOT_ENOUGH_CASH_REQUIRES                               :{WHITE}Nie genoeg kontant nie - vereis {CURRENCY}
 STR_0004                                                        :{WHITE}{CURRENCY}
 STR_EMPTY                                                       :
-STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Platte land vereis
+STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Vereis platte land
 STR_0008_WAITING                                                :{BLACK}Wagtend: {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
-STR_000A_EN_ROUTE_FROM                                          :{WHITE}{CARGO}{YELLOW}  (onderweg van
+STR_000A_EN_ROUTE_FROM                                          :{WHITE}{CARGO}{YELLOW}  (op pad van
 STR_000B                                                        :{YELLOW}{STATION})
 STR_000C_ACCEPTS                                                :{BLACK}Aanvaar: {WHITE}
 STR_000D_ACCEPTS                                                :{BLACK}Aanvaar: {GOLD}
@@ -219,7 +221,7 @@
 STR_00FC_FOREST                                                 :{BLACK}{TINYFONT}Woud
 STR_00FD_SAWMILL                                                :{BLACK}{TINYFONT}Saagmeul
 STR_00FE_OIL_REFINERY                                           :{BLACK}{TINYFONT}Olie Raffineerdery
-STR_00FF_FARM                                                   :{BLACK}{TINYFONT}Plaas
+STR_00FF_FARM                                                   :{BLACK}{TINYFONT}Boerdery
 STR_0100_FACTORY                                                :{BLACK}{TINYFONT}Fabriek
 STR_0101_PRINTING_WORKS                                         :{BLACK}{TINYFONT}Drukwerke
 STR_0102_OIL_WELLS                                              :{BLACK}{TINYFONT}Olie Bron
@@ -268,7 +270,7 @@
 STR_012D                                                        :{WHITE}{STRING}
 STR_012E_CANCEL                                                 :{BLACK}Kanselleer
 STR_012F_OK                                                     :{BLACK}OK
-STR_0130_RENAME                                                 :{BLACK}Hernaam
+STR_0130_RENAME                                                 :{BLACK}Hernoem
 STR_0131_TOO_MANY_NAMES_DEFINED                                 :{WHITE}Te veel naame bepaal
 STR_0132_CHOSEN_NAME_IN_USE_ALREADY                             :{WHITE}Verkieste naam reeds in gebruik
 
@@ -307,7 +309,7 @@
 STR_0148_GAME_OPTIONS                                           :{BLACK}Spel Opsies
 
 STR_0150_SOMEONE                                                :iemand{SKIP}{SKIP}
-STR_0151_MAP_OF_WORLD                                           :Kaart van die wereld
+STR_0151_MAP_OF_WORLD                                           :Kaart van die wêreld
 STR_0152_TOWN_DIRECTORY                                         :Stad index
 STR_0153_SUBSIDIES                                              :Subsidiëe
 
@@ -391,6 +393,10 @@
 STR_ENGINE_SORT_RUNNING_COST                                    :Loopkoste
 STR_ENGINE_SORT_CARGO_CAPACITY                                  :Vrag Kapasiteit
 STR_NO_WAITING_CARGO                                            :{BLACK}Geen vrag van enige tipe is op wag
+STR_AVAILABLE_TRAINS                                            :{BLACK}Beskikbaar Treine
+STR_AVAILABLE_ROAD_VEHICLES                                     :{BLACK}Beskikbaar Voertuie
+STR_AVAILABLE_SHIPS                                             :{BLACK}Beskikbaar Skepe
+STR_AVAILABLE_AIRCRAFT                                          :{BLACK}Beskikbaar Vliegtuie
 STR_AVAILABLE_ENGINES_TIP                                       :{BLACK}Wys 'n lys van beskikbaare enjin tipes vir die voertiug tipe.
 STR_MANAGE_LIST                                                 :{BLACK}Bestuur lys
 STR_MANAGE_LIST_TIP                                             :{BLACK}Stuur instruksies na alle voertuie in die lys
@@ -420,7 +426,7 @@
 STR_016F                                                        :{TINYFONT}{STRING}{} {STRING}{}{NUM}
 STR_0170                                                        :{TINYFONT}{STRING}-
 STR_0171_PAUSE_GAME                                             :{BLACK}Pouseer spel
-STR_0172_SAVE_GAME_ABANDON_GAME                                 :{BLACK}Bewaar spel. verlaat spel, verlaat
+STR_0172_SAVE_GAME_ABANDON_GAME                                 :{BLACK}Bewaar spel. verlaat spel, uitgang
 STR_0173_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se stasies
 STR_0174_DISPLAY_MAP                                            :{BLACK}Vertoon kaart
 STR_0175_DISPLAY_MAP_TOWN_DIRECTORY                             :{BLACK}Vertoon kaart, stad index
@@ -473,7 +479,7 @@
 STR_019D_AIRCRAFT                                               :Vliegtuig
 STR_019E_SHIP                                                   :Skip
 STR_019F_TRAIN                                                  :Trein
-STR_01A0_IS_GETTING_OLD                                         :{WHITE}{STRING} {COMMA} is besig om out te word
+STR_01A0_IS_GETTING_OLD                                         :{WHITE}{STRING} {COMMA} raak nou oud
 STR_01A1_IS_GETTING_VERY_OLD                                    :{WHITE}{STRING} {COMMA} is besig om baie oud te word
 STR_01A2_IS_GETTING_VERY_OLD_AND                                :{WHITE}{STRING} {COMMA} is besig om baie oud te word en moet dringend vervang word
 STR_01A3_LAND_AREA_INFORMATION                                  :{WHITE}Land Area Inligting
@@ -561,11 +567,11 @@
 STR_01F3_SELECT_ALL_TRACKS_PROGRAM                              :{BLACK}Kies 'alle liedjies' musiek lys
 STR_01F4_SELECT_OLD_STYLE_MUSIC                                 :{BLACK}Kies 'ou styl musiek' musiek lys
 STR_01F5_SELECT_NEW_STYLE_MUSIC                                 :{BLACK}Kies 'nuwe styl musiek' musiek lys
-STR_01F6_SELECT_CUSTOM_1_USER_DEFINED                           :{BLACK}Kies 'Gewoonte 1' musiek lys
-STR_01F7_SELECT_CUSTOM_2_USER_DEFINED                           :{BLACK}Kies 'Gewoonte 2' musiek lys
-STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1                          :{BLACK}Reinig huidige musiek keuse (slegs Gewoonte 1 of Gewoonte 2)
+STR_01F6_SELECT_CUSTOM_1_USER_DEFINED                           :{BLACK}Kies 'Gewoonte 1' (gebruiker-gestel) musiek lys
+STR_01F7_SELECT_CUSTOM_2_USER_DEFINED                           :{BLACK}Kies 'Gewoonte 2' (gebruiker-gestel) musiek lys
+STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1                          :{BLACK}Reinig huidige musiek keuse (slegs Gewoonte1 of Gewoonte2)
 STR_01F9_SAVE_MUSIC_SETTINGS                                    :{BLACK}Bewaar musiek stellings
-STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Kliek op musiek liedjie om by huidige musiek lys in te sit (slegs Gewoonte 1 of Gewoonte 2)
+STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Kliek op musiek liedjie om by huidige musiek lys in te sit (slegs Gewoonte1 of Gewoonte2)
 STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Kliek op musiek lied om te verwyder van huidige program (Slegs Gewoonte1 of Gewoonte2)
 STR_01FB_TOGGLE_PROGRAM_SHUFFLE                                 :{BLACK}Skakel musiek lys skuifel aan/af
 STR_01FC_SHOW_MUSIC_TRACK_SELECTION                             :{BLACK}Vertoon musiek liedjie keuse venster
@@ -661,7 +667,7 @@
 STR_0256_COPPER_ORE_MINE                                        :{BLACK}Koper Erts Myn
 STR_0257_COTTON_CANDY_FOREST                                    :{BLACK}Spookasem Woud
 STR_0258_CANDY_FACTORY                                          :{BLACK}Lekker Fabriek
-STR_0259_BATTERY_FARM                                           :{BLACK}Battery Plaas
+STR_0259_BATTERY_FARM                                           :{BLACK}Battery Boerdery
 STR_025A_COLA_WELLS                                             :{BLACK}Cola Bron
 STR_025B_TOY_SHOP                                               :{BLACK}Speelgoed Winkel
 STR_025C_TOY_FACTORY                                            :{BLACK}Speelgoed Fabriek
@@ -678,7 +684,7 @@
 STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY                             :{BLACK}Bou Olieboor (Kan slegs naby aan kante van kaart gebou word)
 STR_0268_CONSTRUCT_FACTORY                                      :{BLACK}Bou Fabriek
 STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}Bou Staalmeul
-STR_026A_CONSTRUCT_FARM                                         :{BLACK}Bou Plaas
+STR_026A_CONSTRUCT_FARM                                         :{BLACK}Bou Boerdery
 STR_026B_CONSTRUCT_IRON_ORE_MINE                                :{BLACK}Bou Yster Erts Myn
 STR_026C_CONSTRUCT_OIL_WELLS                                    :{BLACK}Bou Olie Bron
 STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Bou Bank (kan slegs in stede met 'n populasie grooter as 1200 gebou word)
@@ -696,7 +702,7 @@
 STR_0279_CONSTRUCT_COPPER_ORE_MINE                              :{BLACK}Bou Koper Erts Myn
 STR_027A_PLANT_COTTON_CANDY_FOREST                              :{BLACK}Beplant Spookasem Woud
 STR_027B_CONSTRUCT_CANDY_FACTORY                                :{BLACK}Bou Lekker Fabriek
-STR_027C_CONSTRUCT_BATTERY_FARM                                 :{BLACK}Bou Battery Plaas
+STR_027C_CONSTRUCT_BATTERY_FARM                                 :{BLACK}Bou Battery Boerdery
 STR_027D_CONSTRUCT_COLA_WELLS                                   :{BLACK}Bou Cola Bron
 STR_027E_CONSTRUCT_TOY_SHOP                                     :{BLACK}Bou Speelgoed Winkel
 STR_027F_CONSTRUCT_TOY_FACTORY                                  :{BLACK}Bou Speelgoed Fabriek
@@ -988,6 +994,7 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Was skerm as muis by die kant is: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Toelaat die omkooping van plaaslike gesag: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ongelyk stasies: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Toelaat gebou van teenstandige stasies: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Klein lughawe is altyd toegelaat: {ORANGE}{STRING}
 
@@ -1032,6 +1039,12 @@
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Alle maatskappye
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Verkies span gesels met <ENTER>: {ORANGE}{STRING}
 
+
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Gebruik die voorloopende voertuiglys: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Af
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Eie maatskappy
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Alle maatskappye
+
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Max treine per speler: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Max pad voertuie per speler: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Max vliegtuie per speler: {ORANGE}{STRING}
@@ -1064,6 +1077,8 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Toelaat deele aankoop van ander maatskappye
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Wanneer sleeping, plaas seine elke: {ORANGE}{STRING} teel(e)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Outomaties bou semaphores voor: {ORANGE}{STRING}
+
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Posisie van hoof werktuigbaan: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Links
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Senter
@@ -1089,7 +1104,7 @@
 
 
 STR_CHEATS                                                      :{WHITE}Bedriege
-STR_CHEATS_TIP                                                  :{BLACK}tikblokkies aanwys as jy die bedreig vroe� gebruik het
+STR_CHEATS_TIP                                                  :{BLACK}Tikblokkies aanwys as jy die bedreig vroe� gebruik het
 STR_CHEATS_WARNING                                              :{BLACK}Waarskuwing! Jy gaan omtrent jou genoote mededingers verrai. Hou in gemoed dat so 'n skande sal vir ewig onhout word.
 STR_CHEAT_MONEY                                                 :{LTBLUE}Vermeerder geld by {CURRENCY}
 STR_CHEAT_CHANGE_PLAYER                                         :{LTBLUE}Speel as speler: {ORANGE}{COMMA}
@@ -1133,6 +1148,7 @@
 
 
 STR_CANT_BUILD_CANALS                                           :{WHITE}Kan nie kanaale hier bou nie...
+STR_BUILD_CANALS_TIP                                            :{BLACK}Bou kanaale.
 STR_LANDINFO_CANAL                                              :Kanaal
 
 STR_CANT_BUILD_LOCKS                                            :{WHITE}Kan nie sluite hier bou nie...
@@ -1239,12 +1255,12 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Beskerm jou spel met 'n wagwoord as jy wil dit nie publieke toepassing laat wees nie
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Kies 'n kaart
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Watter kaart wil jy speel?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Max kliente:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Kies die maksimum nommer van kielnte. Alle gleufe hoef nie om vol te wees nie
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Internet
 STR_NETWORK_LAN_INTERNET                                        :LAN / Internet
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (adverteer)
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Max kliente:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Kies die maksimum nommer van kielnte. Alle gleufe hoef nie om vol te wees nie
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Max maatskappye:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Beperk die bedinder na 'n sekere bedrag van maatskappye
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Max aanskouers:
@@ -1452,22 +1468,37 @@
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Kan nie pad van hier verwyder nie...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Pad Depot Ori�tering
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Kan nie pad voertuig depot hier bou nie...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Kan nie trem voertuig depot hier bou nie...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Kan nie bus stasie hier bou nie...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Kan nie vraagmotor stasie bou nie...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Kan nie vrag trem stasie hier bou nie...
 STR_180A_ROAD_CONSTRUCTION                                      :Pad konstruksie
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Tremweg konstruksie
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Bou pad afdeling
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Bou tremweg gedeelte
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Bou pad voertuig depot (vir bou en versiening van voertuie)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Bou trem voertuig depot (vir bou en diens van voertuie)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Bou bus stasie
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Bou vraagmotor laai area
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Bou passasier trem stasie
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Bou vrag trem stasie
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Bou pad brug
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Bou tremweg brug
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Bou pad tonnel
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Bou tremweg tonnel
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Skakel bou/verwyder vir pad bou
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Skakel bou/verwyder vir tremweg konstruksie
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Kies pad voertuig depot ori�tering
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Kies trem voertuig depot ori�tering
 STR_1814_ROAD                                                   :Pad
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Pad met straatligte
 STR_1816_TREE_LINED_ROAD                                        :Boom-belynde pad
 STR_1817_ROAD_VEHICLE_DEPOT                                     :Pad voertuig depot
-STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Pad/spoor oorgang
+STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Pad/spoor gelyk oorgang
+STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Kan nie bus stasie verwyder nie...
+STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Kan nie vraagmotor stasie verwyder stasie...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Kan nie passasier stasie verwyder nie...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Kan nie vrag stasie verwyder nie...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Stede
@@ -1475,8 +1506,8 @@
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Gebou moet eers afgebreek word
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Populasie: {ORANGE}{COMMA}{BLACK}  Huise: {ORANGE}{COMMA}
-STR_2007_RENAME_TOWN                                            :Hernaam Stad
-STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Kan nie stad hernaam nie...
+STR_2007_RENAME_TOWN                                            :Hernoem Stad
+STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Kan nie stad hernoem nie...
 STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN} plaaslike raad weier om dit te toelaat
 STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}Stad naame - kliek naam om skerm op stad te senter
 STR_200B_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Senter skerm op stad
@@ -1600,8 +1631,8 @@
 STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT                           :{WHITE}Te naby aan 'n ander lughawe
 STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}Moet eers lughawe afbreek
 
-STR_3030_RENAME_STATION_LOADING                                 :Hernaam stasie/laai area
-STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}Stasie kan nie hernaam word nie...
+STR_3030_RENAME_STATION_LOADING                                 :Hernoem stasie/laai area
+STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}Stasie kan nie hernoem word nie...
 STR_3032_RATINGS                                                :{BLACK}Graderings
 STR_3033_ACCEPTS                                                :{BLACK}Aanvaar
 STR_3034_LOCAL_RATING_OF_TRANSPORT                              :{BLACK}Plaaslike gradering van vervoer diens
@@ -1623,9 +1654,13 @@
 STR_3040_NOW_ACCEPTS                                            :{WHITE}{STATION} aanvaar nou {STRING}
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} aanvaar nou {STRING} en {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Bus Stasie Ori�tering
-STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Vraagmotor Stasie Ori�t.
+STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Vraagmotor Stasie Ori�tering
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Passasier Trem Ori�tering
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Vrag Trem Ori�tering
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Moet eers bus stasie afbreek
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Moet eers vraagmotor stasie afbreek
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Moet eers passasier trem stasie afbreek
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Moet eers vrag trem stasie afbreek
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Stasie{P "" s}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Geen -
@@ -1637,6 +1672,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Kies lengte van spoorweg stasie
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Kies bus stasie ori�tering
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Kies vraagmotor laai area ori�tering
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Kies passasier trem stasie ori�tering
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Kies vrag trem stasie ori�tering
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Senter skerm op stasie
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Wys stasie graderings
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Verander naam van stasie
@@ -1702,7 +1739,7 @@
 STR_4808_FACTORY                                                :Fabriek
 STR_4809_PRINTING_WORKS                                         :Drukwerke
 STR_480A_STEEL_MILL                                             :Staalmeul
-STR_480B_FARM                                                   :Plaas
+STR_480B_FARM                                                   :Boerdery
 STR_480C_COPPER_ORE_MINE                                        :Koper Erts Myn
 STR_480D_OIL_WELLS                                              :Olie Bron
 STR_480E_BANK                                                   :Bank
@@ -1717,11 +1754,11 @@
 STR_4817_WATER_SUPPLY                                           :Water Lewering
 STR_4818_WATER_TOWER                                            :Water Toring
 STR_4819_FACTORY                                                :Fabriek
-STR_481A_FARM                                                   :Plaas
+STR_481A_FARM                                                   :Boerdery
 STR_481B_LUMBER_MILL                                            :Timmerhoutmeul
 STR_481C_COTTON_CANDY_FOREST                                    :Spookasem Woud
 STR_481D_CANDY_FACTORY                                          :Lekker Fabriek
-STR_481E_BATTERY_FARM                                           :Battery Plaas
+STR_481E_BATTERY_FARM                                           :Battery Boerdery
 STR_481F_COLA_WELLS                                             :Cola Bron
 STR_4820_TOY_SHOP                                               :Speelgoed Winkel
 STR_4821_TOY_FACTORY                                            :Speelgoed Fabriek
@@ -1737,6 +1774,11 @@
 STR_4829_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}, {STRING}, {STRING}
 ############ range for requires ends
 
+############ range for produces starts
+STR_4827_PRODUCES                                               :{BLACK}Produseer: {YELLOW}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produseer: {YELLOW}{STRING}, {STRING}
+############ range for produces ends
+
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produksie verlede maand:
 STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% uitgevoer)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Senter skerm op nywerheid
@@ -1762,11 +1804,10 @@
 STR_5000_TRAIN_IN_TUNNEL                                        :{WHITE}Trein in tonnel
 STR_5001_ROAD_VEHICLE_IN_TUNNEL                                 :{WHITE}Pad voetuig in tonnel
 STR_5003_ANOTHER_TUNNEL_IN_THE_WAY                              :{WHITE}Ander tonnel in die pad
-STR_5005_UNABLE_TO_EXCAVATE_LAND                                :{WHITE}Onbekwaam om land vir ander einde van tonnel te uitgrawe
+STR_5005_UNABLE_TO_EXCAVATE_LAND                                :{WHITE}Kan nie land vir ander einde van tonnel te uitgrawe nie
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Moet eers tonnel afbreek
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Moet eers brug afbreek
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Kan nie in die selfde plek begin en eindig nie
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Platte land of water nooding onder brug
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Begin en einde moet in lyn wees
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Plek ongeskik vir tonnel ingang
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -1804,7 +1845,7 @@
 STR_5803_COMPANY_HEADQUARTERS                                   :Maatskappy Hoofkwartiers
 STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...maatskappy hoofkwartiers in die pad
 STR_5805_COMPANY_OWNED_LAND                                     :Maatskappy-besitte land
-STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Land area kan nie aangekoop word nie...
+STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Die land area kan nie aangekoop word nie...
 STR_5807_YOU_ALREADY_OWN_IT                                     :{WHITE}...jy besit dit alreeds!
 
 
@@ -1844,7 +1885,7 @@
 ############ end of savegame specific region!
 
 ##id 0x6800
-STR_6800_DIFFICULTY_LEVEL                                       :{WHITE}Moeilikheids Vlakte
+STR_6800_DIFFICULTY_LEVEL                                       :{WHITE}Moeilikheid Vlak
 STR_OPTIONS_SAVE_CHANGES                                        :{BLACK}Bewaar
 
 ############ range for difficulty levels starts
@@ -1960,9 +2001,9 @@
 STR_7028                                                        :{BLACK}{CURRENCY}
 STR_7029_BORROW                                                 :{BLACK}Leen {SKIP}{SKIP}{CURRENCY}
 STR_702A_REPAY                                                  :{BLACK}Terugbetaal {SKIP}{SKIP}{CURRENCY}
-STR_702B_MAXIMUM_PERMITTED_LOAN                                 :{WHITE}...maksimum vergun lening groote is {CURRENCY}
+STR_702B_MAXIMUM_PERMITTED_LOAN                                 :{WHITE}...maksimum toegelaat lening groote is {CURRENCY}
 STR_702C_CAN_T_BORROW_ANY_MORE_MONEY                            :{WHITE}Kan nie meer geld leen nie...
-STR_702D_LOAN_ALREADY_REPAYED                                   :{WHITE}...geen lening om terugbetaal te word
+STR_702D_LOAN_ALREADY_REPAYED                                   :{WHITE}...geen lening om terug te betaal
 STR_702E_REQUIRED                                               :{WHITE}...{CURRENCY} vereis
 STR_702F_CAN_T_REPAY_LOAN                                       :{WHITE}Kan nie lening terugbetaal nie...
 STR_INSUFFICIENT_FUNDS                                          :{WHITE}Kan nie geld wat van die bank geleen is weggee nie...
@@ -2024,6 +2065,7 @@
 STR_706B_CHIEF_EXECUTIVE                                        :Hoofbestuursleier
 STR_706C_CHAIRMAN                                               :Voorsitter
 STR_706D_PRESIDENT                                              :President
+STR_706E_TYCOON                                                 :Tycoon
 STR_706F_BUILD_HQ                                               :{BLACK}Bou HK
 STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}Bou maatskappy hoofkwartiers / wys maatskappy hoofkwartiers
 STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}Herbou maatskappy hoofkwartiers elders vir 1% koste van maatskappy waarde
@@ -2033,7 +2075,7 @@
 STR_COMPANY_PASSWORD                                            :{BLACK}Wagwoord
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Wagwoord-beskerm jou maatskappy om onmagtig gebruikers te belet van verbinding
 STR_SET_COMPANY_PASSWORD                                        :Stel maatskappy wagwoord
-STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}W�eld Insinking!{}{}Finansieel eksperte vrees ergste as ekconomie inmekaar sak!
+STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}W�eld Insinking!{}{}Finansieel eksperte vrees ergste as ekonomie inmekaar sak!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Insinking Oor!{}{}Oplewing in sake gee vertroue na nywerheide as ekonomie versterk!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Skakel groot/klein venster groote
 STR_7076_COMPANY_VALUE                                          :{GOLD}Maatskappy waarde: {WHITE}{CURRENCY}
@@ -2045,7 +2087,7 @@
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Kan nie 25% aandeel in die maatskappy verkoop nie...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% besit by {COMPANY})
 STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% besit by {COMPANY}{}   {COMMA}% besit by {COMPANY})
-STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} is deur {COMPANY}! oorgevat!
+STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} is deur {COMPANY} oorgevat!
 STR_7080_PROTECTED                                              :{WHITE}Die maatskappy is nie oud genoeg om aandeele te handel nie...
 
 STR_LIVERY_DEFAULT                                              :Standaard Lewery
@@ -2274,7 +2316,7 @@
 STR_80C1_POWERNAUGHT_BATTERY_TRUCK                              :Powernaught Battery Trok
 STR_80C2_WIZZOWOW_BATTERY_TRUCK                                 :Wizzowow Battery Trok
 STR_80C3_MIGHTYMOVER_FIZZY_DRINK                                :MightyMover Koeldrank Trok
-STR_80C4_POWERNAUGHT_FIZZY_DRINK                                :Powernaught KoeldrankTrok
+STR_80C4_POWERNAUGHT_FIZZY_DRINK                                :Powernaught Koeldrank Trok
 STR_80C5_WIZZOWOW_FIZZY_DRINK_TRUCK                             :Wizzowow Fizzy Koeldrank Trok
 STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK                              :MightyMover Plastiek Trok
 STR_80C7_POWERNAUGHT_PLASTIC_TRUCK                              :Powernaught Plastiek Trok
@@ -2367,6 +2409,7 @@
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Gaan deurgaande na {TOWN} Trein Depot
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Diens deurgaande by {TOWN} Trein Depot
 
+
 STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Op pad na {TOWN} Trein Depot
 STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Op pad na {TOWN} Trein Depot, {VELOCITY}
 STR_HEADING_FOR_TRAIN_DEPOT_SERVICE                             :{LTBLUE}Diens by {TOWN} Trein Depot
@@ -2398,7 +2441,7 @@
 STR_CLONE_TRAIN                                                 :{BLACK}Kloon Trein
 STR_CLONE_TRAIN_INFO                                            :{BLACK}Dit sa 'n afskrywing van die trein bou insluitend alle trokke. Control-kliek sal die opdrae deel
 STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Dit sal 'n afskrywing van 'n trein bou insluitend alle trokke. Kliek die knoppie en dan op 'n trein binne of buite die depot. Control-kliek sal die opdrae deel
-STR_8820_RENAME                                                 :{BLACK}Hername
+STR_8820_RENAME                                                 :{BLACK}Hernoem
 STR_8823_SKIP                                                   :{BLACK}Sprong
 STR_8824_DELETE                                                 :{BLACK}Uitwis
 STR_8825_NON_STOP                                               :{BLACK}Deurgaande
@@ -2422,8 +2465,11 @@
 STR_8831_NO_MORE_SPACE_FOR_ORDERS                               :{WHITE}Geen spasie vir nog opdrae
 STR_8832_TOO_MANY_ORDERS                                        :{WHITE}Te veel opdrae
 STR_8833_CAN_T_INSERT_NEW_ORDER                                 :{WHITE}Kan nie nuwe opdrag invoeg nie...
-STR_8834_CAN_T_DELETE_THIS_ORDER                                :{WHITE}Die opdrag kan nie uitwis word nie...
+STR_8834_CAN_T_DELETE_THIS_ORDER                                :{WHITE}Kan nie die opdrag verwyder nie...
 STR_8835_CAN_T_MODIFY_THIS_ORDER                                :{WHITE}Die opdrag kan nie verander word nie...
+STR_CAN_T_MOVE_THIS_ORDER                                       :{WHITE}Kan nie opdrag beweeg nie...
+STR_CAN_T_SKIP_ORDER                                            :{WHITE}Kan nie huidige opdrag sprong nie...
+STR_CAN_T_SKIP_TO_ORDER                                         :{WHITE}Kan nie verkieste opdrag sprong nie...
 STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Voertuig kan nie beweeg nie...
 STR_8838_N_A                                                    :N/A{SKIP}
 STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Kan nie spoorweg voertuig verkoop nie...
@@ -2439,7 +2485,7 @@
 STR_8842_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Senter skerm op trein depot
 STR_8843_TRAIN_VEHICLE_SELECTION                                :{BLACK}Trein voertuig keuse lys - kliek op voertuig vir inligting
 STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN                            :{BLACK}Bou die beklemtoonde trein voertuig
-STR_8845_RENAME_TRAIN_VEHICLE_TYPE                              :{BLACK}Hernaam trein voertuig tipe
+STR_8845_RENAME_TRAIN_VEHICLE_TYPE                              :{BLACK}Hernoem trein voertuig tipe
 STR_8846_CURRENT_TRAIN_ACTION_CLICK                             :{BLACK}Huidige trein aksie - kliek hier om trein te stop/aanvang trein
 STR_8847_SHOW_TRAIN_S_ORDERS                                    :{BLACK}Wys trein se opdrae
 STR_8848_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Senter skerm op trein
@@ -2454,6 +2500,7 @@
 STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Wys kapasiteite van elke voertuig
 STR_8852_SHOW_TOTAL_CARGO                                       :{BLACK}Wys totaale kapasitiet van trein, verdeel by vrag tipe
 STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Opdraglys - kliek op 'n opdrag om dit te beklemtoon. CTRL + kliek senter op stasie
+STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}Sprong die huidige opdraag, en begin die volgende. CTRL + kliek sprong na verkieste opdrag
 STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}Uitwis die beklemtoonde opdrag
 STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Maak die beklemtoonde opdrag deurgaande
 STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Invoeg 'n nuwe opdrag voor die beklemtoonde opdrag, of byvoeg na einde van lys
@@ -2476,16 +2523,20 @@
 STR_8867_NAME_TRAIN                                             :{BLACK}Benaam trein
 STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Trein Botsing!{}{COMMA} sterf in vuurbol na botsing
 STR_8869_CAN_T_REVERSE_DIRECTION                                :{WHITE}Kan nie rigting van trein omkeer nie...
-STR_886A_RENAME_TRAIN_VEHICLE_TYPE                              :{WHITE}Hernaam trein voertuig tipe
-STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Trein voertuig tipe kan nie hernaam word nie...
+STR_886A_RENAME_TRAIN_VEHICLE_TYPE                              :{WHITE}Hernoem trein voertuig tipe
+STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Trein voertuig tipe kan nie hernoem word nie...
 STR_886D_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Maak die beklemtoonde opdrag dwing die voertuig om sy vrag te stort
 STR_886F_TRANSFER                                               :{BLACK}Oordrag
+STR_CLEAR_TIME                                                  :{BLACK}Reinig Tyd
 
 STR_TRAIN_STOPPING                                              :{RED}Ophou
 STR_TRAIN_STOPPING_VEL                                          :{RED}Ophou, {VELOCITY}
 STR_INCOMPATIBLE_RAIL_TYPES                                     :Onbestaaanbaar spoor tipes
 STR_TRAIN_NO_POWER                                              :{RED}Geen Krag
 
+
+STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Kan nie voertuig tydtafel nie...
+
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Pad voertuig in die pad
 STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Pad voertuig{P "" s}
@@ -2518,7 +2569,7 @@
 STR_901D_SHOW_VEHICLE_S_ORDERS                                  :{BLACK}Wys voertuig se opdrae
 STR_901E_CENTER_MAIN_VIEW_ON_VEHICLE                            :{BLACK}Senter skerm op voertuig
 STR_901F_SEND_VEHICLE_TO_DEPOT                                  :{BLACK}Stuur voertuig na depot. CTRL+kliek sal net diens
-STR_9020_FORCE_VEHICLE_TO_TURN_AROUND                           :{BLACK}Dwing voertuig om om te draai
+STR_9020_FORCE_VEHICLE_TO_TURN_AROUND                           :{BLACK}Dwing voertuig om te draai om
 STR_9021_SHOW_ROAD_VEHICLE_DETAILS                              :{BLACK}Wys pad voertuig aanwyse
 STR_9022_VEHICLES_CLICK_ON_VEHICLE                              :{BLACK}Voertuie - kliek op voertuig vir inligting
 STR_9023_BUILD_NEW_ROAD_VEHICLE                                 :{BLACK}Bou nuwe pad voertuig
@@ -2526,21 +2577,25 @@
 STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}Senter skerm op pad voertuig depot
 STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Pad voertuig keuse lys - kliek op voertuig vir inligting
 STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}Bou die beklemtoonde pad voertuig
-STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Koste: {CURRENCY}{}Spoed: {VELOCITY}{}Loopkoste: {CURRENCY}/yr{}Kapasitiet: {CARGO}
+STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Koste: {CURRENCY}{}Spoed: {VELOCITY}{}Loopkoste: {CURRENCY}/jr{}Kapasitiet: {CARGO}
+STR_ARTICULATED_RV_CAPACITY                                     :{BLACK}Kapasiteit: {LTBLUE}
+STR_BARE_CARGO                                                  :{CARGO}
 
 STR_902C_NAME_ROAD_VEHICLE                                      :{WHITE}Benaam pad voertuig
 STR_902D_CAN_T_NAME_ROAD_VEHICLE                                :{WHITE}Pad voertuig kan nie benaam word nie...
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Benaam pad voertuig
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste bus arriveer by {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste trok arriveer by {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste passasier trein arriveer by {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste vrag trein arriveer by {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Pad Voertuig Botsing!{}Bestuurder sterf in vuurbol na botsing met trein
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Pad voertuig Botsing!{}{COMMA} sterf in vuurbol na botsing met trein
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Kan nie voertuig dwing om te omdraai nie
 STR_ONLY_TURN_SINGLE_UNIT                                       :{WHITE}Kan nie voertuie van veel deele draai nie
-STR_9034_RENAME                                                 :{BLACK}Hernaam
-STR_9035_RENAME_ROAD_VEHICLE_TYPE                               :{BLACK}Hernaam pad voertuig tipe
-STR_9036_RENAME_ROAD_VEHICLE_TYPE                               :{WHITE}Hernaam pad voertuig tipe
-STR_9037_CAN_T_RENAME_ROAD_VEHICLE                              :{WHITE}Pad voertuig tipe kan nie hernaam word nie...
+STR_9034_RENAME                                                 :{BLACK}Hernoem
+STR_9035_RENAME_ROAD_VEHICLE_TYPE                               :{BLACK}Hernoem pad voertuig tipe
+STR_9036_RENAME_ROAD_VEHICLE_TYPE                               :{WHITE}Hernoem pad voertuig tipe
+STR_9037_CAN_T_RENAME_ROAD_VEHICLE                              :{WHITE}Pad voertuig tipe kan nie hernoem word nie...
 STR_9038_GO_TO_ROADVEH_DEPOT                                    :Gaan na {TOWN} Pad Voertuig Depot
 STR_SERVICE_AT_ROADVEH_DEPOT                                    :Versien by {TOWN} Pad Voertuig Depot
 
@@ -2603,10 +2658,10 @@
 STR_9833_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste skip arriveer by {STATION}!
 STR_9834_POSITION_BUOY_WHICH_CAN                                :{BLACK}Plaas baken wat kan as 'n wegpunt gebruik word
 STR_9835_CAN_T_POSITION_BUOY_HERE                               :{WHITE}Kan nie baken hier plaas nie...
-STR_9836_RENAME                                                 :{BLACK}Hernaam
-STR_9837_RENAME_SHIP_TYPE                                       :{BLACK}Hernaam skip tipe
-STR_9838_RENAME_SHIP_TYPE                                       :{WHITE}Hernaam skip tipe
-STR_9839_CAN_T_RENAME_SHIP_TYPE                                 :{WHITE}Kan nie skip tipe hernaam nie...
+STR_9836_RENAME                                                 :{BLACK}Hernoem
+STR_9837_RENAME_SHIP_TYPE                                       :{BLACK}Hernoem skip tipe
+STR_9838_RENAME_SHIP_TYPE                                       :{WHITE}Hernoem skip tipe
+STR_9839_CAN_T_RENAME_SHIP_TYPE                                 :{WHITE}Kan nie skip tipe hernoem nie...
 STR_983A_REFIT_CARGO_SHIP_TO_CARRY                              :{BLACK}Herstel vrag skip om 'n ander vrag tipe te ontvoer
 STR_983B_REFIT                                                  :{WHITE}{VEHICLE} (Herstel)
 STR_983C_REFIT_SHIP                                             :{BLACK}Herstel skip
@@ -2675,10 +2730,10 @@
 STR_A033_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste vliegtuig arriveer by {STATION}!
 STR_A034_PLANE_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Vliegtuig Botsing!{}{COMMA} stef in die vuurbol by {STATION}
 STR_A036                                                        :{TINYFONT}{BLACK}{STATION}
-STR_A037_RENAME                                                 :{BLACK}Hernaam
-STR_A038_RENAME_AIRCRAFT_TYPE                                   :{BLACK}Hernaam vliegtuig tipe
-STR_A039_RENAME_AIRCRAFT_TYPE                                   :{WHITE}Hernaam vliegtuig tipe
-STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE                             :{WHITE}Kan nie vliegtuig tipe hernaam nie...
+STR_A037_RENAME                                                 :{BLACK}Hernoem
+STR_A038_RENAME_AIRCRAFT_TYPE                                   :{BLACK}Hernoem vliegtuig tipe
+STR_A039_RENAME_AIRCRAFT_TYPE                                   :{WHITE}Hernoem vliegtuig tipe
+STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE                             :{WHITE}Kan nie vliegtuig tipe hernoem nie...
 STR_A03B_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Hestel vliegtuig om 'n ander vrag tipe te ontvoer
 STR_A03C_REFIT                                                  :{WHITE}{VEHICLE} (Herstel)
 STR_A03D_REFIT_AIRCRAFT                                         :{BLACK}Herstel vliegtuig
@@ -2690,6 +2745,7 @@
 STR_GO_TO_AIRPORT_HANGAR                                        :Gaan na {STATION} Hangar
 SERVICE_AT_AIRPORT_HANGAR                                       :Versiening by {STATION} Hangar
 
+
 ##id 0xB000
 STR_B000_ZEPPELIN_DISASTER_AT                                   :{BLACK}{BIGFONT}Zeppelin ramp by {STATION}!
 STR_B001_ROAD_VEHICLE_DESTROYED                                 :{BLACK}{BIGFONT}Pad voertuig vernietig in 'VVV' botsing!
@@ -2776,6 +2832,7 @@
 
 STR_NOT_REPLACING                                               :{BLACK}Word nie vervang nie
 STR_NOT_REPLACING_VEHICLE_SELECTED                              :{BLACK}Geen voertuig gekies
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Vliegtuig is nie beskikbaar nie
 
 STR_ENGINES                                                     :Enjine
 
@@ -2853,3 +2910,20 @@
 ############ Date formatting
 
 ########
+
+
+
+
+##### Mass Order
+
+
+
+
+STR_COMPANY_NAME                                                :{COMPANY}
+
+
+#### Improved sign GUI
+
+########
+
+STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Bou
--- a/src/lang/unfinished/greek.txt	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/unfinished/greek.txt	Sat Oct 06 21:16:00 2007 +0000
@@ -1640,7 +1640,6 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}ΠÏέπει Ï€Ïώτα να καταστÏαφεί το τοÏνελ
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}ΠÏέπει Ï€Ïώτα να καταστÏαφεί η γέφυÏα
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Δεν γίνεται να ξεκινάει και να τελειώνει στο ίδιο σημείο
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Απαιτείται επίπεδο έδαφος ή νεÏÏŒ κάτω από τη γέφυÏα
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Η αÏχή και το τέλος Ï€Ïέπει να είναι σε ευθεία
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Ακατάλληλη τοποθεσία για είσοδο τοÏνελ
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/macros.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/macros.h	Sat Oct 06 21:16:00 2007 +0000
@@ -341,6 +341,15 @@
 #define GENERAL_SPRITE_COLOR(color) ((color) + PALETTE_RECOLOR_START)
 #define PLAYER_SPRITE_COLOR(owner) (GENERAL_SPRITE_COLOR(_player_colors[owner]))
 
+/**
+ * Whether a sprite comes from the original graphics files or a new grf file
+ * (either supplied by OpenTTD or supplied by the user).
+ *
+ * @param sprite The sprite to check
+ * @return True if it is a new sprite, or false if it is original.
+ */
+#define IS_CUSTOM_SPRITE(sprite) ((sprite) >= SPR_SIGNALS_BASE)
+
 extern const byte _ffb_64[128];
 
 /**
--- a/src/main_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/main_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -59,11 +59,13 @@
 extern void GenerateIndustries();
 extern bool GenerateTowns();
 
+bool _draw_bounding_boxes = false;
+
 
 void CcGiveMoney(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
 #ifdef ENABLE_NETWORK
-	if (!success) return;
+	if (!success || !_patches.give_money) return;
 
 	char msg[20];
 	/* Inform the player of this action */
@@ -1086,7 +1088,7 @@
 		StringID msg =
 			mode ? STR_0808_CAN_T_RAISE_LAND_HERE : STR_0809_CAN_T_LOWER_LAND_HERE;
 
-		DoCommandP(tile, SLOPE_N, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(msg));
+		DoCommandP(tile, SLOPE_N, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_MSG(msg));
 	} else {
 		SndPlayTileFx(SND_1F_SPLAT, tile);
 
@@ -1113,7 +1115,7 @@
 
 		BEGIN_TILE_LOOP(tile2, sizex, sizey, tile) {
 			if (TileHeight(tile2) == h) {
-				DoCommandP(tile2, SLOPE_N, (uint32)mode, NULL, CMD_TERRAFORM_LAND | CMD_AUTO);
+				DoCommandP(tile2, SLOPE_N, (uint32)mode, NULL, CMD_TERRAFORM_LAND);
 			}
 		} END_TILE_LOOP(tile2, sizex, sizey, tile)
 	}
@@ -2208,6 +2210,13 @@
 			break;
 		}
 
+		if (e->we.keypress.keycode == ('B' | WKC_CTRL)) {
+			e->we.keypress.cont = false;
+			_draw_bounding_boxes = !_draw_bounding_boxes;
+			MarkWholeScreenDirty();
+			break;
+		}
+
 		if (_game_mode == GM_MENU) break;
 
 		switch (e->we.keypress.keycode) {
--- a/src/map.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/map.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -26,7 +26,7 @@
 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
@@ -97,9 +97,9 @@
 }
 #endif
 
-/**
+/*!
  * Scales the given value by the map size, where the given value is
- * for a 256 by 256 map
+ * for a 256 by 256 map.
  * @param n the value to scale
  * @return the scaled size
  */
@@ -112,7 +112,7 @@
 }
 
 
-/**
+/*!
  * 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
@@ -128,13 +128,14 @@
 }
 
 
-/**
+/*!
  * 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)
+ * 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)
+ *
  * @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
@@ -172,7 +173,7 @@
 	{ 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.
@@ -189,7 +190,7 @@
 }
 
 
-/**
+/*!
  * 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.
@@ -206,7 +207,7 @@
 }
 
 
-/**
+/*!
  * Gets the biggest distance component (x or y) between the two given tiles.
  * Also known as L-Infinity-Norm.
  * @param t0 the start tile
@@ -221,7 +222,7 @@
 }
 
 
-/**
+/*!
  * 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.
@@ -236,7 +237,7 @@
 	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
@@ -252,7 +253,7 @@
 	return minl < minh ? minl : minh;
 }
 
-/**
+/*!
  * Function performing a search around a center tile and going outward, thus in circle.
  * Although it really is a square search...
  * Every tile will be tested by means of the callback function proc,
--- a/src/map.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/map.h	Sat Oct 06 21:16:00 2007 +0000
@@ -45,9 +45,25 @@
 	byte m7; ///< Primarily used for newgrf support
 };
 
+/**
+ * Pointer to the tile-array.
+ *
+ * This variable points to the tile-array which contains the tiles of
+ * the map.
+ */
 extern Tile *_m;
+
+/**
+ * Pointer to the extended tile-array.
+ *
+ * This variable points to the extended tile-array which contains the tiles
+ * of the map.
+ */
 extern TileExtended *_me;
 
+/**
+ * Allocate a new map with the given size.
+ */
 void AllocateMap(uint size_x, uint size_y);
 
 /**
@@ -109,18 +125,56 @@
 	return MapSizeY() - 1;
 }
 
-/* Scale a number relative to the map size */
-uint ScaleByMapSize(uint); // Scale relative to the number of tiles
-uint ScaleByMapSize1D(uint); // Scale relative to the circumference of the map
+/**
+ * Scales relative to the number of tiles.
+ */
+uint ScaleByMapSize(uint);
 
+/**
+ * Scale relative to the circumference of the map.
+ */
+uint ScaleByMapSize1D(uint);
+
+/**
+ * The index/ID of a Tile.
+ */
 typedef uint32 TileIndex;
+
+/**
+ * An offset value between to tiles.
+ *
+ * This value is used fro the difference between
+ * to tiles. It can be added to a tileindex to get
+ * the resulting tileindex of the start tile applied
+ * with this saved difference.
+ *
+ * @see TileDiffXY(int, int)
+ */
 typedef int32 TileIndexDiff;
 
+/**
+ * Returns the TileIndex of a coordinate.
+ *
+ * @param x The x coordinate of the tile
+ * @param y The y coordinate of the tile
+ * @return The TileIndex calculated by the coordinate
+ */
 static inline TileIndex TileXY(uint x, uint y)
 {
 	return (y * MapSizeX()) + x;
 }
 
+/**
+ * Calculates an offset for the given coordinate(-offset).
+ *
+ * This function calculate an offset value which can be added to an
+ * #TileIndex. The coordinates can be negative.
+ *
+ * @param x The offset in x direction
+ * @param y The offset in y direction
+ * @return The resulting offset value of the given coordinate
+ * @see ToTileIndexDiff(TileIndexDiffC)
+ */
 static inline TileIndexDiff TileDiffXY(int x, int y)
 {
 	/* Multiplication gives much better optimization on MSVC than shifting.
@@ -167,12 +221,27 @@
 	return tile >> MapLogX();
 }
 
-
+/**
+ * A pair-construct of a TileIndexDiff.
+ *
+ * This can be used to save the difference between to
+ * tiles as a pair of x and y value.
+ */
 struct TileIndexDiffC {
-	int16 x;
-	int16 y;
+	int16 x;        ///< The x value of the coordinate
+	int16 y;        ///< The y value of the coordinate
 };
 
+/**
+ * Return the offset between to tiles from a TileIndexDiffC struct.
+ *
+ * This function works like #TileDiffXY(int, int) and returns the
+ * difference between two tiles.
+ *
+ * @param tidc The coordinate of the offset as TileIndexDiffC
+ * @return The difference between two tiles.
+ * @see TileDiffXY(int, int)
+ */
 static inline TileIndexDiff ToTileIndexDiff(TileIndexDiffC tidc)
 {
 	return (tidc.y << MapLogX()) + tidc.x;
@@ -180,6 +249,13 @@
 
 
 #ifndef _DEBUG
+        /**
+         * Adds to tiles together.
+         *
+         * @param x One tile
+         * @param y An other tile to add
+         * @return The resulting tile(index)
+         */
 	#define TILE_ADD(x,y) ((x) + (y))
 #else
 	extern TileIndex TileAdd(TileIndex tile, TileIndexDiff add,
@@ -187,10 +263,26 @@
 	#define TILE_ADD(x, y) (TileAdd((x), (y), #x " + " #y, __FILE__, __LINE__))
 #endif
 
+/**
+ * Adds a given offset to a tile.
+ *
+ * @param tile The tile to add an offset on it
+ * @param x The x offset to add to the tile
+ * @param y The y offset to add to the tile
+ */
 #define TILE_ADDXY(tile, x, y) TILE_ADD(tile, TileDiffXY(x, y))
 
+/**
+ * Adds an offset to a tile and check if we are still on the map.
+ */
 uint TileAddWrap(TileIndex tile, int addx, int addy);
 
+/**
+ * Returns the TileIndexDiffC offset from a DiagDirection.
+ *
+ * @param dir The given direction
+ * @return The offset as TileIndexDiffC value
+ */
 static inline TileIndexDiffC TileIndexDiffCByDiagDir(DiagDirection dir)
 {
 	extern const TileIndexDiffC _tileoffs_by_diagdir[DIAGDIR_END];
@@ -198,9 +290,15 @@
 	assert(IsValidDiagDirection(dir));
 	return _tileoffs_by_diagdir[dir];
 }
-
-/* Returns tile + the diff given in diff. If the result tile would end up
+/**
+ * Add a TileIndexDiffC to a TileIndex and returns the new one.
+ *
+ * Returns tile + the diff given in diff. If the result tile would end up
  * outside of the map, INVALID_TILE is returned instead.
+ *
+ * @param tile The base tile to add the offset on
+ * @param diff The offset to add on the tile
+ * @return The resulting TileIndex
  */
 static inline TileIndex AddTileIndexDiffCWrap(TileIndex tile, TileIndexDiffC diff)
 {
@@ -236,7 +334,16 @@
 uint DistanceMaxPlusManhattan(TileIndex, TileIndex); ///< Max + Manhattan
 uint DistanceFromEdge(TileIndex); ///< shortest distance from any edge of the map
 
-
+/**
+ * Starts a loop which iterates to a square of tiles
+ *
+ * This macro starts 2 nested loops which iterates over a square of tiles.
+ *
+ * @param var The name of the variable which contains the current tile
+ * @param w The width (x-width) of the square
+ * @param h The heigth (y-width) of the square
+ * @param tile The start tile of the square
+ */
 #define BEGIN_TILE_LOOP(var, w, h, tile)                      \
 	{                                                        \
 		int h_cur = h;                                         \
@@ -244,12 +351,22 @@
 		do {                                                   \
 			int w_cur = w;                                       \
 			do {
-
+/**
+ * Ends the square-loop used before
+ *
+ * @see BEGIN_TILE_LOOP
+ */
 #define END_TILE_LOOP(var, w, h, tile)                        \
 			} while (++var, --w_cur != 0);                       \
 		} while (var += TileDiffXY(0, 1) - (w), --h_cur != 0); \
 	}
-
+/**
+ * Convert a DiagDirection to a TileIndexDiff
+ *
+ * @param dir The DiagDirection
+ * @return The resulting TileIndexDiff
+ * @see TileIndexDiffCByDiagDir
+ */
 static inline TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
 {
 	extern const TileIndexDiffC _tileoffs_by_diagdir[DIAGDIR_END];
@@ -258,6 +375,12 @@
 	return ToTileIndexDiff(_tileoffs_by_diagdir[dir]);
 }
 
+/**
+ * Convert a Direction to a TileIndexDiff.
+ *
+ * @param dir The direction to convert from
+ * @return The resulting TileIndexDiff
+ */
 static inline TileIndexDiff TileOffsByDir(Direction dir)
 {
 	extern const TileIndexDiffC _tileoffs_by_dir[DIR_END];
@@ -266,11 +389,36 @@
 	return ToTileIndexDiff(_tileoffs_by_dir[dir]);
 }
 
+/**
+ * Adds a DiagDir to a tile.
+ *
+ * @param tile The current tile
+ * @param dir The direction in which we want to step
+ * @return the moved tile
+ */
+static inline TileIndex TileAddByDiagDir(TileIndex tile, DiagDirection dir)
+{
+	return TILE_ADD(tile, TileOffsByDiagDir(dir));
+}
+
+/**
+ * A callback function type for searching tiles.
+ *
+ * @param tile The tile to test
+ * @param data additional data for the callback function to use
+ * @return A boolean value, depend on the definition of the function.
+ */
 typedef bool TestTileOnSearchProc(TileIndex tile, uint32 data);
+
+/**
+ * Searches for some cirumstances of a tile around a given tile with a helper function.
+ */
 bool CircularTileSearch(TileIndex tile, uint size, TestTileOnSearchProc proc, uint32 data);
 
-/* Approximation of the length of a straight track, relative to a diagonal
- * track (ie the size of a tile side). #defined instead of const so it can
+/** Approximation of the length of a straight track, relative to a diagonal
+ * track (ie the size of a tile side).
+ *
+ * #defined instead of const so it can
  * stay integer. (no runtime float operations) Is this needed?
  * Watch out! There are _no_ brackets around here, to prevent intermediate
  * rounding! Be careful when using this!
--- a/src/misc.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/misc.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -41,7 +41,7 @@
 
 #ifdef RANDOM_DEBUG
 	if (_networking && (DEREF_CLIENT(0)->status != STATUS_INACTIVE || !_network_server))
-		printf("Random [%d/%d] %s:%d\n",_frame_counter, _current_player, file, line);
+		printf("Random [%d/%d] %s:%d\n",_frame_counter, (byte)_current_player, file, line);
 #endif
 
 	s = _random_seeds[0][0];
--- a/src/misc_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/misc_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -341,6 +341,8 @@
  */
 CommandCost CmdGiveMoney(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
+	if (!_patches.give_money) return CMD_ERROR;
+
 	const Player *p = GetPlayer(_current_player);
 	CommandCost amount(min((Money)p1, (Money)20000000LL));
 
--- a/src/misc_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/misc_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -396,7 +396,7 @@
 	case WE_PLACE_MOUSEUP:
 		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));
+				CMD_PLANT_TREE | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
 		}
 		break;
 
--- a/src/music/win32_m.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/music/win32_m.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -142,7 +142,11 @@
 	}
 
 	if (NULL == (_midi.wait_obj = CreateEvent(NULL, FALSE, FALSE, NULL))) return "Failed to create event";
-	if (NULL == (_midi.thread = CreateThread(NULL, 8192, MidiThread, 0, 0, NULL))) return "Failed to create thread";
+
+	/* The lpThreadId parameter of CreateThread (the last parameter)
+	 * may NOT be NULL on Windows 95, 98 and ME. */
+	DWORD threadId;
+	if (NULL == (_midi.thread = CreateThread(NULL, 8192, MidiThread, 0, 0, &threadId))) return "Failed to create thread";
 
 	return NULL;
 }
--- a/src/network/network.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/network/network.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -3,15 +3,7 @@
 #include "../stdafx.h"
 #include "network_data.h"
 
-#if defined(WITH_REV)
-	extern const char _openttd_revision[];
-#elif defined(WITH_REV_HACK)
-	#define WITH_REV
-	extern const char _openttd_revision[] = WITH_REV_HACK;
-#else
-	extern const char _openttd_revision[] = NOREV_STRING;
-#endif
-
+extern const char _openttd_revision[];
 
 #ifdef ENABLE_NETWORK
 
@@ -1463,8 +1455,6 @@
 
 /**
  * Checks whether the given version string is compatible with our version.
- * It'll check the first NETWORK_REVISION_LENGTH - 1 characters (-1 for '\0')
- * against the current version and the NOREV_STRING.
  * @param other the version string to compare to
  */
 bool IsNetworkCompatibleVersion(const char *other)
--- a/src/network/network.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/network/network.h	Sat Oct 06 21:16:00 2007 +0000
@@ -3,8 +3,6 @@
 #ifndef NETWORK_H
 #define NETWORK_H
 
-#define NOREV_STRING "norev000"
-
 #ifdef ENABLE_NETWORK
 
 #include "../player.h"
--- a/src/network/network_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/network/network_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -1264,8 +1264,8 @@
 	_clientlist_proc[i++] = &ClientList_SpeakToAll;
 
 	if (_network_own_client_index != ci->client_index) {
-		/* We are no spectator and the player we want to give money to is no spectator */
-		if (IsValidPlayer(_network_playas) && IsValidPlayer(ci->client_playas)) {
+		/* We are no spectator and the player we want to give money to is no spectator and money gifts are allowed */
+		if (IsValidPlayer(_network_playas) && IsValidPlayer(ci->client_playas) && _patches.give_money) {
 			GetString(_clientlist_action[i], STR_NETWORK_CLIENTLIST_GIVE_MONEY, lastof(_clientlist_action[i]));
 			_clientlist_proc[i++] = &ClientList_GiveMoney;
 		}
--- a/src/newgrf.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -247,7 +247,7 @@
  * @param str StringID that we want to have the equivalent in OoenTTD
  * @return the properly adjusted StringID
  */
-static StringID MapGRFStringID(uint32 grfid, StringID str)
+StringID MapGRFStringID(uint32 grfid, StringID str)
 {
 	/* 0xD0 and 0xDC stand for all the TextIDs in the range
 	 * of 0xD000 (misc graphics texts) and 0xDC00 (misc persistent texts).
@@ -256,17 +256,26 @@
 	if (GB(str, 8, 8) == 0xD0 || GB(str, 8, 8) == 0xDC) {
 		return GetGRFStringID(grfid, str);
 	}
-
+#define TEXID_TO_STRINGID(begin, end, stringid) if (str >= begin && str <= end) return str + (stringid - begin)
 	/* We have some changes in our cargo strings, resulting in some missing. */
-	if (str >= 0x006E && str <= 0x008D) return str - 0x20;
-	if (str >= 0x008E && str <= 0x00AD) return str - 0x20;
+	TEXID_TO_STRINGID(0x000E, 0x002D, STR_000E);
+	TEXID_TO_STRINGID(0x002E, 0x004D, STR_002E);
+	TEXID_TO_STRINGID(0x004E, 0x006D, STR_QUANTITY_NOTHING);
+	TEXID_TO_STRINGID(0x006E, 0x008D, STR_QUANTITY_NOTHING);
+	TEXID_TO_STRINGID(0x008E, 0x00AD, STR_ABBREV_NOTHING);
 
 	/* Map building names according to our lang file changes
 	 * 0x200F = Tall Office Block, first house name in the original data, the one that TTDPatch stil uses
 	 * 0x201F = Old houses is the last house name.
 	 * OpenTTD does not have exactly the same order aymore, so, the code below allows
 	 * to compensate for the difference */
-	if (str >= 0x200F && str <= 0x201F) return str + (STR_200F_TALL_OFFICE_BLOCK - 0x200F);
+	TEXID_TO_STRINGID(0x200F, 0x201F, STR_200F_TALL_OFFICE_BLOCK);
+
+	/* Same thing for industries, since the introduction of 4 new strings above STR_482A_PRODUCTION_LAST_MONTH */
+	TEXID_TO_STRINGID(0x482A, 0x483B, STR_482A_PRODUCTION_LAST_MONTH);
+#undef TEXTID_TO_STRINGID
+
+	if (str == STR_NULL) return STR_EMPTY;
 
 	return str;
 }
@@ -1205,9 +1214,6 @@
 	/* Allocate house specs if they haven't been allocated already. */
 	if (_cur_grffile->housespec == NULL) {
 		_cur_grffile->housespec = CallocT<HouseSpec*>(HOUSE_MAX);
-
-		/* Reset any overrides that have been set. */
-		_house_mngr.ResetOverride();
 	}
 
 	for (int i = 0; i < numinfo; i++) {
@@ -1701,8 +1707,6 @@
 
 static bool IndustrytilesChangeInfo(uint indtid, int numinfo, int prop, byte **bufp, int len)
 {
-	if (!HASBIT(_ttdpatch_flags[3], 0x07)) return true;
-
 	byte *buf = *bufp;
 	bool ret = false;
 
@@ -1714,9 +1718,6 @@
 	/* Allocate industry tile specs if they haven't been allocated already. */
 	if (_cur_grffile->indtspec == NULL) {
 		_cur_grffile->indtspec = CallocT<IndustryTileSpec*>(NUM_INDUSTRYTILES);
-
-		/* Reset any overrides that have been set. */
-		_industile_mngr.ResetOverride();
 	}
 
 	for (int i = 0; i < numinfo; i++) {
@@ -1771,7 +1772,7 @@
 			case 0x0C: {
 				uint16 acctp = grf_load_word(&buf);
 				tsp->accepts_cargo[prop - 0x0A] = GetCargoTranslation(GB(acctp, 0, 8), _cur_grffile);
-				tsp->acceptance[prop - 0x0A] = GetCargoTranslation(GB(acctp, 8, 8), _cur_grffile);
+				tsp->acceptance[prop - 0x0A] = GB(acctp, 8, 8);
 			} break;
 
 			case 0x0D: // Land shape flags
@@ -1810,8 +1811,6 @@
 
 static bool IndustriesChangeInfo(uint indid, int numinfo, int prop, byte **bufp, int len)
 {
-	if (!HASBIT(_ttdpatch_flags[3], 0x07)) return true;
-
 	byte *buf = *bufp;
 	bool ret = false;
 
@@ -1825,9 +1824,6 @@
 	/* Allocate industry specs if they haven't been allocated already. */
 	if (_cur_grffile->industryspec == NULL) {
 		_cur_grffile->industryspec = CallocT<IndustrySpec*>(NUM_INDUSTRYTYPES);
-
-		/* Reset any overrides that have been set. */
-		_industry_mngr.ResetOverride();
 	}
 
 	for (int i = 0; i < numinfo; i++) {
@@ -1937,6 +1933,9 @@
 								size = k + 1;
 								copy_from = itt;
 							}
+						} else if (itt[k].gfx == 0xFF) {
+							itt[k].ti.x = (int8)GB(itt[k].ti.x, 0, 8);
+							itt[k].ti.y = (int8)GB(itt[k].ti.y, 0, 8);
 						}
 					}
 					tile_table[j] = CallocT<IndustryTileTable>(size);
@@ -2004,11 +2003,11 @@
 				break;
 
 			case 0x17: // Probability in random game
-				indsp->appear_ingame[_opt.landscape] = grf_load_byte(&buf);
+				indsp->appear_creation[_opt.landscape] = grf_load_byte(&buf);
 				break;
 
 			case 0x18: // Probability during gameplay
-				indsp->appear_creation[_opt.landscape] = grf_load_byte(&buf);
+				indsp->appear_ingame[_opt.landscape] = grf_load_byte(&buf);
 				break;
 
 			case 0x19: // Map color
@@ -3279,8 +3278,6 @@
 
 static void IndustryMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
 {
-	if (!HASBIT(_ttdpatch_flags[3], 0x07)) return;
-
 	byte *bp = &buf[4 + idcount + cidcount * 3];
 	uint16 groupid = grf_load_word(&bp);
 
@@ -3305,8 +3302,6 @@
 
 static void IndustrytileMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
 {
-	if (!HASBIT(_ttdpatch_flags[3], 0x07)) return;
-
 	byte *bp = &buf[4 + idcount + cidcount * 3];
 	uint16 groupid = grf_load_word(&bp);
 
@@ -3439,8 +3434,8 @@
 	grfmsg(6, "FeatureMapSpriteGroup: Feature %d, %d ids, %d cids, wagon override %d",
 			feature, idcount, cidcount, wagover);
 
-	if (_cur_grffile->spriteset_start == 0 || _cur_grffile->spritegroups == 0) {
-		grfmsg(1, "FeatureMapSpriteGroup: No sprite set to work on! Skipping");
+	if (_cur_grffile->spritegroups == 0) {
+		grfmsg(1, "FeatureMapSpriteGroup: No sprite groups to work on! Skipping");
 		return;
 	}
 
@@ -3806,8 +3801,8 @@
 		case 0x8B: { // TTDPatch version
 			uint major    = 2;
 			uint minor    = 6;
-			uint revision = 0; // special case: 2.0.1 is 2.0.10
-			uint build    = 1210;
+			uint revision = 1; // special case: 2.0.1 is 2.0.10
+			uint build    = 1382;
 			return (major << 24) | (minor << 20) | (revision << 16) | build;
 		}
 
@@ -4928,9 +4923,9 @@
 				break;
 
 			case 'atad': // 'data'
-				se->file_size    = size;
-				se->file_offset  = FioGetPos() - (len - (buf - buf_start)) + 1;
-				se->file_offset |= _file_index << 24;
+				se->file_size   = size;
+				se->file_offset = FioGetPos() - (len - (buf - buf_start)) + 1;
+				se->file_slot   = _file_index;
 
 				/* Set default volume and priority */
 				se->volume = 0x80;
@@ -5143,7 +5138,7 @@
 	                   |                                        (0 << 0x04)  // aichoosechance
 	                   |                                        (1 << 0x05)  // resolutionwidth
 	                   |                                        (1 << 0x06)  // resolutionheight
-	                   |                                        (0 << 0x07)  // newindustries
+	                   |                                        (1 << 0x07)  // newindustries
 	                   |         ((_patches.improved_load ? 1 : 0) << 0x08)  // fifoloading
 	                   |                                        (0 << 0x09)  // townroadbranchprob
 	                   |                                        (0 << 0x0A)  // tempsnowline
@@ -5387,7 +5382,7 @@
 
 	_loaded_newgrf_features.has_2CC           = false;
 	_loaded_newgrf_features.has_newhouses     = false;
-	_loaded_newgrf_features.has_newindustries = false,
+	_loaded_newgrf_features.has_newindustries = false;
 
 	_signal_base = 0;
 	_coast_base = 0;
@@ -5912,7 +5907,7 @@
 	/* Load newgrf sprites
 	 * in each loading stage, (try to) open each file specified in the config
 	 * and load information from it. */
-	for (GrfLoadingStage stage = GLS_LABELSCAN; stage <= GLS_ACTIVATION; stage++) {
+	for (GrfLoadingStage stage = GLS_LABELSCAN; stage < GLS_ACTIVATION; stage++) {
 		uint slot = file_index;
 
 		_cur_stage = stage;
@@ -5925,13 +5920,17 @@
 			if (!FioCheckFileExists(c->filename)) error("NewGRF file is missing '%s'", c->filename);
 
 			if (stage == GLS_LABELSCAN) InitNewGRFFile(c, _cur_spriteid);
-			LoadNewGRFFile(c, slot++, stage);
+			LoadNewGRFFile(c, slot, stage);
 			if (stage == GLS_RESERVE) {
 				if (c->status == GCS_ACTIVATED) c->status = GCS_INITIALISED;
-			} else if (stage == GLS_ACTIVATION) {
+				_cur_stage = GLS_ACTIVATION;
+				LoadNewGRFFile(c, slot++, GLS_ACTIVATION);
+				_cur_stage = stage;
 				ClearTemporaryNewGRFData();
 				BuildCargoTranslationMap();
 				DEBUG(sprite, 2, "LoadNewGRF: Currently %i sprites are loaded", _cur_spriteid);
+			} else {
+				slot++;
 			}
 		}
 	}
--- a/src/newgrf_callbacks.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_callbacks.h	Sat Oct 06 21:16:00 2007 +0000
@@ -13,6 +13,9 @@
  * bit is set in the callback flags/trigger for a vehicle, house,
  * industry, etc.
  * Names are formatted as CBID_<CLASS>_<CALLBACK>
+ *
+ * @note Do not forget to add 15 bits callbacks to the switch in
+ *       newgrf_spritegroup.cpp (search for "15 bits callback").
  */
 enum CallbackID {
 	/** Set when using the callback resolve system, but not to resolve a callback. */
@@ -21,6 +24,8 @@
 	/** Set when calling a randomizing trigger (almost undocumented). */
 	CBID_RANDOM_TRIGGER                  = 0x01,
 
+	/* There are no callbacks 0x02 - 0x0F. */
+
 	/** Powered wagons, if the result is lower as 0x40 then the wagon is powered
 	 * @todo : interpret the rest of the result, aka "visual effects". */
 	CBID_TRAIN_WAGON_POWER               = 0x10,
@@ -66,7 +71,7 @@
 	CBID_TRAIN_ALLOW_WAGON_ATTACH        = 0x1D,
 
 	/** Called to determine the colour of a town building. */
-	CBID_BUILDING_COLOUR                 = 0x1E,
+	CBID_HOUSE_COLOUR                    = 0x1E,
 
 	/** Called to decide how much cargo a town building can accept. */
 	CBID_HOUSE_CARGO_ACCEPTANCE          = 0x1F,
@@ -100,7 +105,7 @@
 	CBID_INDUSTRY_LOCATION               = 0x28,
 
 	/** Called on production changes, so it can be adjusted. */
-	CBID_INDUSTRY_PRODUCTION_CHANGE      = 0x29, // not implemented
+	CBID_INDUSTRY_PRODUCTION_CHANGE      = 0x29,
 
 	/** Called to determine which cargoes a town building should accept. */
 	CBID_HOUSE_ACCEPT_CARGO              = 0x2A,
@@ -138,7 +143,7 @@
 	CBID_VEHICLE_AUTOREPLACE_SELECTION   = 0x34,
 
 	/** Called monthly on production changes, so it can be adjusted more frequently */
-	CBID_INDUSTRY_MONTHLYPROD_CHANGE     = 0x35, // not implemented
+	CBID_INDUSTRY_MONTHLYPROD_CHANGE     = 0x35,
 
 	/** Called to modify various vehicle properties. Callback parameter 1
 	 * specifies the property index, as used in Action 0, to change. */
@@ -160,11 +165,13 @@
 	CBID_INDUSTRY_SPECIAL_EFFECT         = 0x3B,
 
 	/** Called to determine if industry can alter the ground below industry tile */
-	CBID_INDUSTRY_AUTOSLOPE              = 0x3C, // not implemented
+	CBID_INDUSTRY_AUTOSLOPE              = 0x3C,
 
 	/** Called to determine if the industry can still accept or refuse more cargo arrival */
 	CBID_INDUSTRY_REFUSE_CARGO           = 0x3D,
 
+	/* There are no callbacks 0x3E - 0x142. */
+
 	/** Called to determine whether a town building can be destroyed. */
 	CBID_HOUSE_DENY_DESTRUCTION          = 0x143,
 
@@ -179,6 +186,20 @@
 
 	/** Add an offset to the default sprite numbers to show another sprite. */
 	CBID_CANALS_SPRITE_OFFSET            = 0x147, // not implemented
+
+	/* There is no callback 0x148.*/
+
+	/** Callback done for each tile of a station to check the slope. */
+	CBID_STATION_LAND_SLOPE_CHECK        = 0x149, // not implemented
+
+	/** Called to determine the color of an industry. */
+	CBID_INDUSTRY_DECIDE_COLOUR          = 0x14A,
+
+	/** Customize the input cargo types of a newly build industry. */
+	CBID_INDUSTRY_INPUT_CARGO_TYPES      = 0x14B,
+
+	/** Customize the output cargo types of a newly build industry. */
+	CBID_INDUSTRY_OUTPUT_CARGO_TYPES     = 0x14C,
 };
 
 /**
@@ -186,64 +207,70 @@
  * Some callbacks are always used and don't have a mask.
  */
 enum VehicleCallbackMask {
-	CBM_WAGON_POWER    = 0, ///< Powered wagons (trains only)
-	CBM_VEHICLE_LENGTH = 1, ///< Vehicle length (trains only)
-	CBM_LOAD_AMOUNT    = 2, ///< Load amount
-	CBM_REFIT_CAPACITY = 3, ///< Cargo capacity after refit
-	CBM_ARTIC_ENGINE   = 4, ///< Add articulated engines (trains only)
-	CBM_CARGO_SUFFIX   = 5, ///< Show suffix after cargo name
-	CBM_COLOUR_REMAP   = 6, ///< Change colour mapping of vehicle
-	CBM_SOUND_EFFECT   = 7, ///< Vehicle uses custom sound effects
+	CBM_TRAIN_WAGON_POWER      = 0, ///< Powered wagons (trains only)
+	CBM_VEHICLE_LENGTH         = 1, ///< Vehicle length (trains and road vehicles)
+	CBM_VEHICLE_LOAD_AMOUNT    = 2, ///< Load amount
+	CBM_VEHICLE_REFIT_CAPACITY = 3, ///< Cargo capacity after refit
+	CBM_VEHICLE_ARTIC_ENGINE   = 4, ///< Add articulated engines (trains only)
+	CBM_VEHICLE_CARGO_SUFFIX   = 5, ///< Show suffix after cargo name
+	CBM_VEHICLE_COLOUR_REMAP   = 6, ///< Change colour mapping of vehicle
+	CBM_VEHICLE_SOUND_EFFECT   = 7, ///< Vehicle uses custom sound effects
 };
 
 /**
  * Callback masks for stations.
  */
 enum StationCallbackMask {
-	CBM_STATION_AVAIL = 0, ///< Availability of station in construction window
-	CBM_CUSTOM_LAYOUT = 1, ///< Use callback to select a tile layout to use
+	CBM_STATION_AVAIL                = 0, ///< Availability of station in construction window
+	CBM_STATION_SPRITE_LAYOUT        = 1, ///< Use callback to select a sprite layout to use
+	CBM_STATION_ANIMATION_NEXT_FRAME = 2, ///< Use a custom next frame callback
+	CBM_STATION_ANIMATION_SPEED      = 3, ///< Customize the animation speed of the station
+	CBM_STATION_SLOPE_CHECK          = 4, ///< Check slope of new station tiles
 };
 
 /**
  * Callback masks for houses.
  */
 enum HouseCallbackMask {
-	CBM_HOUSE_ALLOW_CONSTRUCTION  = 0,
-	CBM_ANIMATION_NEXT_FRAME      = 1,
-	CBM_ANIMATION_START_STOP      = 2,
-	CBM_CONSTRUCTION_STATE_CHANGE = 3,
-	CBM_BUILDING_COLOUR           = 4,
-	CBM_CARGO_ACCEPTANCE          = 5,
-	CBM_ANIMATION_SPEED           = 6,
-	CBM_HOUSE_DESTRUCTION         = 7,
-	CBM_HOUSE_ACCEPT_CARGO        = 8,
-	CBM_HOUSE_PRODUCE_CARGO       = 9,
-	CBM_HOUSE_DENY_DESTRUCTION    = 10,
+	CBM_HOUSE_ALLOW_CONSTRUCTION        =  0,
+	CBM_HOUSE_ANIMATION_NEXT_FRAME      =  1,
+	CBM_HOUSE_ANIMATION_START_STOP      =  2,
+	CBM_HOUSE_CONSTRUCTION_STATE_CHANGE =  3,
+	CBM_HOUSE_COLOUR                    =  4,
+	CBM_HOUSE_CARGO_ACCEPTANCE          =  5,
+	CBM_HOUSE_ANIMATION_SPEED           =  6,
+	CBM_HOUSE_DESTRUCTION               =  7,
+	CBM_HOUSE_ACCEPT_CARGO              =  8,
+	CBM_HOUSE_PRODUCE_CARGO             =  9,
+	CBM_HOUSE_DENY_DESTRUCTION          = 10,
 };
 
 /**
  * Callback masks for cargos.
  */
 enum CargoCallbackMask {
-	CBM_CARGO_PROFIT_CALC         = 0,
-	CBM_CARGO_STATION_RATING_CALC = 1,
+	CBM_CARGO_PROFIT_CALC         = 0, ///< custom profit calculation
+	CBM_CARGO_STATION_RATING_CALC = 1, ///< custom station rating for this cargo type
 };
 
 /**
  * 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_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
+	CBM_IND_DECIDE_COLOUR             = 11, ///< give a custom colour to newly build industries
+	CBM_IND_INPUT_CARGO_TYPES         = 12, ///< customize the cargos the industry requires
+	CBM_IND_OUTPUT_CARGO_TYPES        = 13, ///< customize the cargos the industry produces
 };
 
 /**
--- a/src/newgrf_canal.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_canal.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -42,7 +42,7 @@
 
 	switch (variable) {
 		case 0x80:
-			return TileHeight(tile);
+			return GetTileZ(tile) / TILE_HEIGHT;
 
 		case 0x81:
 			return GetTerrainType(tile);
--- a/src/newgrf_commons.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_commons.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -105,7 +105,7 @@
 	for (id = max_offset; id < max_new_entities; id++) {
 		map = &mapping_ID[id];
 
-		if (map->entity_id == 0 && map->grfid == 0) {
+		if (CheckValidNewID(id) && map->entity_id == 0 && map->grfid == 0) {
 			map->entity_id     = grf_local_id;
 			map->grfid         = grfid;
 			map->substitute_id = substitute_id;
@@ -188,7 +188,7 @@
  * checking what is available
  * @param inds Industryspec that comes from the grf decoding process
  */
-void IndustryOverrideManager::SetEntitySpec(const IndustrySpec *inds)
+void IndustryOverrideManager::SetEntitySpec(IndustrySpec *inds)
 {
 	/* First step : We need to find if this industry is already specified in the savegame data */
 	IndustryType ind_id = this->GetID(inds->grf_prop.local_id, inds->grf_prop.grffile->grfid);
@@ -206,6 +206,7 @@
 			 * Or it is a simple substitute.
 			 * In both case, we need to find a free available slot */
 			ind_id = this->AddEntityID(inds->grf_prop.local_id, inds->grf_prop.grffile->grfid, inds->grf_prop.subst_id);
+			inds->grf_prop.override = invalid_ID;  // make sure it will not be detected as overriden
 		}
 	}
 
@@ -252,7 +253,7 @@
 {
 	switch (_opt.landscape) {
 		case LT_TROPIC: return GetTropicZone(tile) == TROPICZONE_DESERT ? 1 : 2;
-		case LT_ARCTIC: return GetTileZ(tile) >= GetSnowLine() ? 4 : 0;
+		case LT_ARCTIC: return GetTileZ(tile) > GetSnowLine() ? 4 : 0;
 		default:        return 0;
 	}
 }
--- a/src/newgrf_commons.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_commons.h	Sat Oct 06 21:16:00 2007 +0000
@@ -33,6 +33,7 @@
 	uint16 max_new_entities; ///< what is the amount of entities, old and new summed
 
 	uint16 invalid_ID;       ///< ID used to dected invalid entities;
+	virtual bool CheckValidNewID(uint16 testid) { return true; }
 
 public:
 	EntityIDMapping *mapping_ID; ///< mapping of ids from grf files.  Public out of convenience
@@ -70,12 +71,14 @@
 			OverrideManagerBase(offset, maximum, invalid) {}
 
 	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
-	void SetEntitySpec(const IndustrySpec *inds);
+	void SetEntitySpec(IndustrySpec *inds);
 };
 
 
 struct IndustryTileSpec;
 class IndustryTileOverrideManager : public OverrideManagerBase {
+protected:
+	virtual bool CheckValidNewID(uint16 testid) { return testid != 0xFF; }
 public:
 	IndustryTileOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) :
 			OverrideManagerBase(offset, maximum, invalid) {}
--- a/src/newgrf_config.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_config.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -37,20 +37,21 @@
 	FILE *f;
 	md5_state_t md5state;
 	md5_byte_t buffer[1024];
-	size_t len;
+	size_t len, size;
 
 	/* open the file */
-	f = FioFOpenFile(config->filename);
+	f = FioFOpenFile(config->filename, "rb", DATA_DIR, &size);
 	if (f == NULL) return false;
 
 	/* calculate md5sum */
 	md5_init(&md5state);
-	while ((len = fread(buffer, 1, sizeof(buffer), f)) != 0) {
+	while ((len = fread(buffer, 1, (size > sizeof(buffer)) ? sizeof(buffer) : size, f)) != 0 && size != 0) {
+		size -= len;
 		md5_append(&md5state, buffer, len);
 	}
 	md5_finish(&md5state, config->md5sum);
 
-	fclose(f);
+	FioFCloseFile(f);
 
 	return true;
 }
@@ -232,8 +233,8 @@
 void ResetGRFConfig(bool defaults)
 {
 	CopyGRFConfigList(&_grfconfig, _grfconfig_newgame, !defaults);
-	AddGRFTToGameListByGRFid(0x4450414F);  // OAPD - airportsbasic.grf
-	AddGRFTToGameListByGRFid(0x5850414F);  // OAPX - airportsextended.grf
+	AddGRFTToGameListByGRFid(0x4450414F); // OAPD - airportsbasic.grf
+	AddGRFTToGameListByGRFid(0x5850414F); // OAPX - airportsextended.grf
 	AppendStaticGRFConfigs(&_grfconfig);
 }
 
@@ -296,12 +297,54 @@
 	return res;
 }
 
+static bool ScanPathAddGrf(const char *filename)
+{
+	GRFConfig *c = CallocT<GRFConfig>(1);
+	c->filename = strdup(filename);
 
-extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
+	bool added = true;
+	if (FillGRFDetails(c, false)) {
+		if (_all_grfs == NULL) {
+			_all_grfs = c;
+		} else {
+			/* Insert file into list at a position determined by its
+				* name, so the list is sorted as we go along */
+			GRFConfig **pd, *d;
+			bool stop = false;
+			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;
+				/* Because there can be multiple grfs with the same name, make sure we checked all grfs with the same name,
+				 *  before inserting the entry. So insert a new grf at the end of all grfs with the same name, instead of
+				 *  just after the first with the same name. Avoids doubles in the list. */
+				if (strcasecmp(c->name, d->name) <= 0) stop = true;
+				else if (stop) break;
+			}
+			if (added) {
+				c->next = d;
+				*pd = c;
+			}
+		}
+	} else {
+		added = false;
+	}
+
+	if (!added) {
+		/* File couldn't be opened, or is either not a NewGRF or is a
+			* 'system' NewGRF or it's already known, so forget about it. */
+		free(c->filename);
+		free(c->name);
+		free(c->info);
+		free(c);
+	}
+
+	return added;
+}
 
 /* Scan a path for NewGRFs */
 static uint ScanPath(const char *path, int basepath_length)
 {
+	extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
+
 	uint num = 0;
 	struct stat sb;
 	struct dirent *dirent;
@@ -330,40 +373,7 @@
 			if (ext == NULL) continue;
 			if (strcasecmp(ext, ".grf") != 0) continue;
 
-			GRFConfig *c = CallocT<GRFConfig>(1);
-			c->filename = strdup(filename + basepath_length);
-
-			bool added = true;
-			if (FillGRFDetails(c, false)) {
-				if (_all_grfs == NULL) {
-					_all_grfs = c;
-				} else {
-					/* Insert file into list at a position determined by its
-					 * 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;
-					}
-					if (added) {
-						c->next = d;
-						*pd = c;
-					}
-				}
-			} else {
-				added = false;
-			}
-
-			if (!added) {
-				/* File couldn't be opened, or is either not a NewGRF or is a
-				 * 'system' NewGRF or it's already known, so forget about it. */
-				free(c->filename);
-				free(c->name);
-				free(c->info);
-				free(c);
-			} else {
-				num++;
-			}
+			if (ScanPathAddGrf(filename + basepath_length)) num++;
 		}
 	}
 
@@ -372,12 +382,42 @@
 	return num;
 }
 
+static uint ScanTar(TarFileList::iterator tar)
+{
+	uint num = 0;
+	const char *filename = (*tar).first.c_str();
+	const char *ext = strrchr(filename, '.');
+
+	/* If no extension or extension isn't .grf, skip the file */
+	if (ext == NULL) return false;
+	if (strcasecmp(ext, ".grf") != 0) return false;
+
+	if (ScanPathAddGrf(filename)) num++;
+
+	return num;
+}
+
+/**
+ * Simple sorter for GRFS
+ * @param p1 the first GRFConfig *
+ * @param p2 the second GRFConfig *
+ * @return the same strcmp would return for the name of the NewGRF.
+ */
+static int CDECL GRFSorter(const void *p1, const void *p2)
+{
+	const GRFConfig *c1 = *(const GRFConfig **)p1;
+	const GRFConfig *c2 = *(const GRFConfig **)p2;
+
+	return strcmp(c1->name != NULL ? c1->name : c1->filename,
+		c2->name != NULL ? c2->name : c2->filename);
+}
 
 /* Scan for all NewGRFs */
 void ScanNewGRFFiles()
 {
 	Searchpath sp;
 	char path[MAX_PATH];
+	TarFileList::iterator tar;
 	uint num = 0;
 
 	ClearGRFConfigList(&_all_grfs);
@@ -387,7 +427,33 @@
 		FioAppendDirectory(path, MAX_PATH, sp, DATA_DIR);
 		num += ScanPath(path, strlen(path));
 	}
+	FOR_ALL_TARS(tar) {
+		num += ScanTar(tar);
+	}
+
 	DEBUG(grf, 1, "Scan complete, found %d files", num);
+	if (num == 0 || _all_grfs == NULL) return;
+
+	/* Sort the linked list using quicksort.
+	 * For that we first have to make an array, the qsort and
+	 * then remake the linked list. */
+	GRFConfig **to_sort = MallocT<GRFConfig*>(num);
+	if (to_sort == NULL) return; // No memory, then don't sort
+
+	uint i = 0;
+	for (GRFConfig *p = _all_grfs; p != NULL; p = p->next, i++) {
+		to_sort[i] = p;
+	}
+	/* Number of files is not necessarily right */
+	num = i;
+
+	qsort(to_sort, num, sizeof(GRFConfig*), GRFSorter);
+
+	for (i = 1; i < num; i++) {
+		to_sort[i - 1]->next = to_sort[i];
+	}
+	to_sort[num - 1]->next = NULL;
+	_all_grfs = to_sort[0];
 }
 
 
@@ -515,7 +581,7 @@
 		AppendToGRFConfigList(&_grfconfig, c);
 	}
 
-	if (CheckSavegameVersion(74)) {
+	if (CheckSavegameVersion(NEWGRF_AIRPORTS_SAVEGAME)) {
 		/* before doing tile tests, ensure mandatory newgrfs loaded */
 		AddGRFTToGameListByGRFid(0x4450414F);  // OAPD - airportsbasic.grf
 		AddGRFTToGameListByGRFid(0x5850414F);  // OAPX - airportsextended.grf
--- a/src/newgrf_engine.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_engine.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -499,8 +499,6 @@
 	switch (variable) {
 		case 0x40: // Get length of consist
 		case 0x41: // Get length of same consecutive wagons
-			if (!v->HasFront()) return 1;
-
 			{
 				const Vehicle* u;
 				byte chain_before = 0;
@@ -540,7 +538,7 @@
 
 				cargo_classes |= GetCargo(u->cargo_type)->classes;
 				common_cargos[u->cargo_type]++;
-				user_def_data |= RailVehInfo(u->engine_type)->user_def_data;
+				if (v->type == VEH_TRAIN) user_def_data |= RailVehInfo(u->engine_type)->user_def_data;
 				common_subtypes[u->cargo_subtype]++;
 			}
 
@@ -783,15 +781,10 @@
 	const Vehicle *v = object->u.vehicle.self;
 	uint totalsets;
 	uint set;
-	bool in_motion;
 
 	if (v == NULL) return group->g.real.loading[0];
 
-	if (v->type == VEH_TRAIN) {
-		in_motion = v->First()->current_order.type != OT_LOADING;
-	} else {
-		in_motion = v->current_order.type != OT_LOADING;
-	}
+	bool in_motion = v->First()->current_order.type != OT_LOADING;
 
 	totalsets = in_motion ? group->g.real.num_loaded : group->g.real.num_loading;
 
@@ -816,7 +809,7 @@
 	res->ResolveReal   = &VehicleResolveReal;
 
 	res->u.vehicle.self   = v;
-	res->u.vehicle.parent = (v != NULL && v->HasFront()) ? v->First() : v;
+	res->u.vehicle.parent = (v != NULL) ? v->First() : v;
 
 	res->u.vehicle.self_type = engine_type;
 
@@ -1017,7 +1010,7 @@
 			 * i.e.), so we give them all the NEW_CARGO triggered
 			 * vehicle's portion of random bits. */
 			assert(first);
-			DoTriggerVehicle((v->type == VEH_TRAIN) ? v->First() : v, VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false);
+			DoTriggerVehicle(v->First(), VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false);
 			break;
 
 		case VEHICLE_TRIGGER_DEPOT:
--- a/src/newgrf_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -515,6 +515,7 @@
 		case WE_RESIZE:
 			w->vscroll.cap += e->we.sizing.diff.y / 14;
 			w->widget[SNGRFS_FILE_LIST].data = (w->vscroll.cap << 8) + 1;
+			SetupNewGRFWindow(w);
 			break;
 	}
 }
--- a/src/newgrf_house.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_house.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -185,7 +185,9 @@
 	tile = GetNearbyTile(parameter, tile);
 	tile_type = GetTerrainType(tile) << 2 | (IsTileType(tile, MP_WATER) ? 1 : 0) << 1;
 
-	return GetTileType(tile) << 24 | (TileHeight(tile) * 8) << 16 | tile_type << 8 | GetTileSlope(tile, NULL);
+	uint z;
+	Slope tileh = GetTileSlope(tile, &z);
+	return GetTileType(tile) << 24 | z << 16 | tile_type << 8 | tileh;
 }
 
 /**
@@ -306,19 +308,23 @@
 	SpriteID image = dts->ground_sprite;
 	SpriteID pal   = dts->ground_pal;
 
+	if (IS_CUSTOM_SPRITE(image)) image += stage;
+
 	if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
 
 	foreach_draw_tile_seq(dtss, dts->seq) {
 		if (GB(dtss->image, 0, SPRITE_WIDTH) == 0) continue;
 
-		image = dtss->image + stage;
+		image = dtss->image;
 		pal   = dtss->pal;
 
+		if (IS_CUSTOM_SPRITE(image)) image += stage;
+
 		if ((HASBIT(image, SPRITE_MODIFIER_OPAQUE) || !HASBIT(_transparent_opt, TO_HOUSES)) && 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, 0, house_id, GetTownByTile(ti->tile), ti->tile);
+				if (HASBIT(hs->callback_mask, CBM_HOUSE_COLOUR)) {
+					uint16 callback = GetHouseCallback(CBID_HOUSE_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;
@@ -340,7 +346,7 @@
 				HASBIT(_transparent_opt, TO_HOUSES)
 			);
 		} else {
-			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y);
+			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, HASBIT(_transparent_opt, TO_HOUSES));
 		}
 	}
 }
@@ -373,7 +379,7 @@
 	byte animation_speed = hs->animation_speed;
 	bool frame_set_by_callback = false;
 
-	if (HASBIT(hs->callback_mask, CBM_ANIMATION_SPEED)) {
+	if (HASBIT(hs->callback_mask, CBM_HOUSE_ANIMATION_SPEED)) {
 		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);
 	}
@@ -387,7 +393,7 @@
 	byte frame      = GetHouseAnimationFrame(tile);
 	byte num_frames = GB(hs->animation_frames, 0, 7);
 
-	if (HASBIT(hs->callback_mask, CBM_ANIMATION_NEXT_FRAME)) {
+	if (HASBIT(hs->callback_mask, CBM_HOUSE_ANIMATION_NEXT_FRAME)) {
 		uint32 param = (hs->extra_flags & CALLBACK_1A_RANDOM_BITS) ? Random() : 0;
 		uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_NEXT_FRAME, param, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 
@@ -466,7 +472,7 @@
 {
 	const HouseSpec *hs = GetHouseSpecs(GetHouseType(tile));
 
-	if (HASBIT(hs->callback_mask, CBM_ANIMATION_START_STOP)) {
+	if (HASBIT(hs->callback_mask, CBM_HOUSE_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, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 
@@ -489,7 +495,7 @@
 	 * MarkTileDirtyByTile(tile);
 	 */
 
-	if (HASBIT(hs->callback_mask, CBM_ANIMATION_START_STOP)) {
+	if (HASBIT(hs->callback_mask, CBM_HOUSE_ANIMATION_START_STOP)) {
 		/* If this house is marked as having a synchronised callback, all the
 		 * tiles will have the callback called at once, rather than when the
 		 * tile loop reaches them. This should only be enabled for the northern
--- a/src/newgrf_industries.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_industries.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -48,6 +48,7 @@
 	for (t = 0; t < MapSize(); t++) {
 		if (IsTileType(t, MP_WATER) == water) break;
 	}
+	if (t == MapSize() && !water) return 0x200;
 	best_dist = DistanceManhattan(tile, t);
 
 	for (; t < MapSize(); t++) {
@@ -58,12 +59,12 @@
 			/* When the Y distance between the current row and the 'source' tile
 			 * is larger than the best distance, we've found the best distance */
 			if ((int)TileY(t) - (int)TileY(tile) > best_dist) break;
-			if (TileX(tile) > TileX(t)) {
+			if ((int)TileX(t) - (int)TileX(tile) > best_dist) {
 				/* We can safely skip this many tiles; from here all tiles have a
 				 * higher or equal distance than the best distance */
 				t |= MapMaxX();
 				continue;
-			} else {
+			} else if (TileX(tile) < TileX(t)) {
 				/* We can safely skip this many tiles; up to here all tiles have a
 				 * higher or equal distance than the best distance */
 				t += max(best_dist - dist, 0);
@@ -72,52 +73,49 @@
 		}
 	}
 
-	return best_dist;
+	return min(best_dist, water ? 0x7F : 0x1FF);
 }
 
 /** Make an analysis of a tile and check for its belonging to the same
  * industry, and/or the same grf file
- * @param new_tile TileIndex of the tile to query
- * @param old_tile TileIndex of the reference tile
- * @param i Industry to which old_tile belongs to
+ * @param tile TileIndex of the tile to query
+ * @param i Industry to which to compare the tile to
  * @return value encoded as per NFO specs */
-uint32 GetIndustryIDAtOffset(TileIndex new_tile, TileIndex old_tile, const Industry *i)
+uint32 GetIndustryIDAtOffset(TileIndex tile, const Industry *i)
 {
-	if (IsTileType(new_tile, MP_INDUSTRY)) {  // Is this an industry tile?
-
-		if (GetIndustryIndex(new_tile) == i->index) {  // Does it belong to the same industry?
-			IndustryGfx gfx = GetIndustryGfx(new_tile);
-			const IndustryTileSpec *indtsp = GetIndustryTileSpec(gfx);
-			const IndustryTileSpec *indold = GetIndustryTileSpec(GetIndustryGfx(old_tile));
+	if (!IsTileType(tile, MP_INDUSTRY) || GetIndustryIndex(tile) == i->index) {
+		/* No industry and/or the tile does not have the same industry as the one we match it with */
+		return 0xFFFF;
+	}
 
-			if (gfx < NEW_INDUSTRYOFFSET) {  // Does it belongs to an old type?
-				/* It is an old tile.  We have to see if it's been overriden */
-				if (indtsp->grf_prop.override == INVALID_INDUSTRYTILE) {  // has it been overridden?
-					return 0xFF << 8 | gfx; // no. Tag FF + the gfx id of that tile
-				} else { // yes.  FInd out if it is from the same grf file or not
-					const IndustryTileSpec *old_tile_ovr = GetIndustryTileSpec(indtsp->grf_prop.override);
+	IndustryGfx gfx = GetCleanIndustryGfx(tile);
+	const IndustryTileSpec *indtsp = GetIndustryTileSpec(gfx);
+	const IndustrySpec *indold = GetIndustrySpec(i->type);
 
-					if (old_tile_ovr->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) {
-						return old_tile_ovr->grf_prop.local_id; // same grf file
-					} else {
-						return 0xFFFE; // not the same grf file
-					}
-				}
-			} else {
-				if (indtsp->grf_prop.spritegroup != NULL) {  // tile has a spritegroup ?
-					if (indtsp->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) {  // same industry, same grf ?
-						return indtsp->grf_prop.local_id;
-					} else {
-						return 0xFFFE;  // Defined in another grf file
-					}
-				} else {  // tile has no spritegroup
-					return 0xFF << 8 | indtsp->grf_prop.subst_id;  // so just give him the substitute
-				}
-			}
+	if (gfx < NEW_INDUSTRYOFFSET) { // Does it belongs to an old type?
+		/* It is an old tile.  We have to see if it's been overriden */
+		if (indtsp->grf_prop.override == INVALID_INDUSTRYTILE) { // has it been overridden?
+			return 0xFF << 8 | gfx; // no. Tag FF + the gfx id of that tile
+		}
+		/* Not overriden */
+		const IndustryTileSpec *tile_ovr = GetIndustryTileSpec(indtsp->grf_prop.override);
+
+		if (tile_ovr->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) {
+			return tile_ovr->grf_prop.local_id; // same grf file
+		} else {
+			return 0xFFFE; // not the same grf file
 		}
 	}
-
-	return 0xFFFF; // tile is not an industry one or  does not belong to the current industry
+	/* Not an 'old type' tile */
+	if (indtsp->grf_prop.spritegroup != NULL) { // tile has a spritegroup ?
+		if (indtsp->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) { // same industry, same grf ?
+			return indtsp->grf_prop.local_id;
+		} else {
+			return 0xFFFE; // Defined in another grf file
+		}
+	}
+	/* The tile has no spritegroup */
+	return 0xFF << 8 | indtsp->grf_prop.subst_id; // so just give him the substitute
 }
 
 static uint32 GetClosestIndustry(TileIndex tile, IndustryType type, const Industry *current)
@@ -155,8 +153,8 @@
 			break;
 
 		case 0xFFFFFFFF: // current grf
-			ind_index = GetIndustrySpec(current->type)->grf_prop.grffile->grfid;
-			/*Fall through*/
+			GrfID = GetIndustrySpec(current->type)->grf_prop.grffile->grfid;
+			/* Fall through */
 
 		default: //use the grfid specified in register 100h
 			ind_index = MapNewGRFIndustryType(param_setID, GrfID);
@@ -208,27 +206,47 @@
 		}
 
 		/* Manhattan distance of closes dry/water tile */
-		case 0x43: return GetClosestWaterDistance(tile, (object->u.industry_location.spec->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
+		case 0x43: return GetClosestWaterDistance(tile, (indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
 
 		/* Layout number */
 		case 0x44: return industry->selected_layout;
 
+		/* player info */
+		case 0x45: {
+			byte colours;
+			bool is_ai = false;
+
+			if (IsValidPlayer(industry->founder)) {
+				const Player *p = GetPlayer(industry->founder);
+				const Livery *l = &p->livery[LS_DEFAULT];
+
+				is_ai = p->is_ai;
+				colours = l->colour1 + l->colour2 * 16;
+			} else {
+				colours = GB(Random(), 0, 8);
+			}
+
+			return industry->founder | (is_ai ? 0x10000 : 0) | (colours << 24);
+		}
+
 		/* Get industry ID at offset param */
-		case 0x60: return GetIndustryIDAtOffset(GetNearbyTile(parameter, industry->xy), tile, industry);
+		case 0x60: return GetIndustryIDAtOffset(GetNearbyTile(parameter, industry->xy), industry);
 
-		case 0x61: return 0; // Get random tile bits at offset param
+		/* Get random tile bits at offset param */
+		case 0x61:
+			tile = GetNearbyTile(parameter, tile);
+			return (IsTileType(tile, MP_INDUSTRY) && GetIndustryByTile(tile) == industry) ? GetIndustryRandomBits(tile) : 0;
 
 		/* Land info of nearby tiles */
 		case 0x62: return GetNearbyIndustryTileInformation(parameter, tile, INVALID_INDUSTRY);
 
 		/* Animation stage of nearby tiles */
-		case 0x63: {
+		case 0x63:
 			tile = GetNearbyTile(parameter, tile);
 			if (IsTileType(tile, MP_INDUSTRY) && GetIndustryByTile(tile) == industry) {
 				return GetIndustryAnimationState(tile);
 			}
 			return 0xFFFFFFFF;
-		}
 
 		/* Distance of nearest industry of given type */
 		case 0x64: return GetClosestIndustry(tile, MapNewGRFIndustryType(parameter, indspec->grf_prop.grffile->grfid), industry);
@@ -242,6 +260,9 @@
 		case 0x67:
 		case 0x68: return GetCountAndDistanceOfClosestInstance(parameter, variable == 0x68 ? GB(GetRegister(0x101), 0, 8) : 0, industry);
 
+		/* Get a variable from the persistent storage */
+		case 0x7C: return industry->psa.Get(parameter);
+
 		/* Industry structure access*/
 		case 0x80: return industry->xy;
 		case 0x81: return GB(industry->xy, 8, 8);
@@ -254,7 +275,7 @@
 		case 0x87: return industry->height;// xy dimensions
 		/*  */
 		case 0x88:
-		case 0x89: return indspec->produced_cargo[variable - 0x88];
+		case 0x89: return industry->produced_cargo[variable - 0x88];
 		case 0x8A: return industry->produced_cargo_waiting[0];
 		case 0x8B: return GB(industry->produced_cargo_waiting[0], 8, 8);
 		case 0x8C: return industry->produced_cargo_waiting[1];
@@ -263,7 +284,7 @@
 		case 0x8F: return industry->production_rate[variable - 0x8E];
 		case 0x90:
 		case 0x91:
-		case 0x92: return indspec->accepts_cargo[variable - 0x90];
+		case 0x92: return industry->accepts_cargo[variable - 0x90];
 		case 0x93: return industry->prod_level;
 		/* amount of cargo produced so far THIS month. */
 		case 0x94: return industry->this_month_production[0];
@@ -314,14 +335,31 @@
 	return NULL;
 }
 
+static uint32 IndustryGetRandomBits(const ResolverObject *object)
+{
+	return object->u.industry.ind == NULL ? 0 : 0; //object->u.industry.ind->random_bits;
+}
+
+static uint32 IndustryGetTriggers(const ResolverObject *object)
+{
+	return object->u.industry.ind == NULL ? 0 : 0; //object->u.industry.ind->triggers;
+}
+
+static void IndustrySetTriggers(const ResolverObject *object, int triggers)
+{
+	if (object->u.industry.ind == NULL) return;
+	//object->u.industry.ind->triggers = triggers;
+}
+
 static void NewIndustryResolver(ResolverObject *res, TileIndex tile, Industry *indus)
 {
-	res->GetRandomBits = IndustryTileGetRandomBits;
-	res->GetTriggers   = IndustryTileGetTriggers;
-	res->SetTriggers   = IndustryTileSetTriggers;
+	res->GetRandomBits = IndustryGetRandomBits;
+	res->GetTriggers   = IndustryGetTriggers;
+	res->SetTriggers   = IndustrySetTriggers;
 	res->GetVariable   = IndustryGetVariable;
 	res->ResolveReal   = IndustryResolveReal;
 
+	res->psa             = &indus->psa;
 	res->u.industry.tile = tile;
 	res->u.industry.ind  = indus;
 	res->u.industry.gfx  = INVALID_INDUSTRYTILE;
@@ -352,55 +390,47 @@
 
 uint32 IndustryLocationGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
 {
-	TileIndex tile = object->u.industry_location.tile;
+	const Industry *industry = object->u.industry.ind;
+	TileIndex tile = object->u.industry.tile;
 
 	if (object->scope == VSG_SCOPE_PARENT) {
-		return TownGetVariable(variable, parameter, available, ClosestTownFromTile(tile, (uint)-1));
+		return TownGetVariable(variable, parameter, available, industry->town);
 	}
 
 	switch (variable) {
-		/* Land info of nearby tiles */
-		case 0x62: return GetNearbyIndustryTileInformation(parameter, tile, INVALID_INDUSTRY);
-
-		/* Distance of nearest industry of given type */
-		case 0x64: return GetClosestIndustry(tile, MapNewGRFIndustryType(parameter, object->u.industry_location.spec->grf_prop.grffile->grfid), NULL);
-
-		/* Location where to build the industry */
 		case 0x80: return tile;
 		case 0x81: return GB(tile, 8, 8);
 
 		/* Pointer to the town the industry is associated with */
-		case 0x82: return ClosestTownFromTile(tile, (uint)-1)->index;
+		case 0x82: return industry->town->index;
 		case 0x83:
 		case 0x84:
 		case 0x85: DEBUG(grf, 0, "NewGRFs shouldn't be doing pointer magic"); break; // not supported
 
 		/* Number of the layout */
-		case 0x86: return object->u.industry_location.itspec_index;
+		case 0x86: return industry->selected_layout;
 
 		/* Ground type */
 		case 0x87: return GetTerrainType(tile);
 
 		/* Town zone */
-		case 0x88: return GetTownRadiusGroup(ClosestTownFromTile(tile, (uint)-1), tile);
+		case 0x88: return GetTownRadiusGroup(industry->town, tile);
 
 		/* Manhattan distance of the closest town */
-		case 0x89: return min(DistanceManhattan(ClosestTownFromTile(tile, (uint)-1)->xy, tile), 255);
+		case 0x89: return min(DistanceManhattan(industry->town->xy, tile), 255);
 
 		/* Lowest height of the tile */
 		case 0x8A: return GetTileZ(tile);
 
 		/* Distance to the nearest water/land tile */
-		case 0x8B: return GetClosestWaterDistance(tile, (object->u.industry_location.spec->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
+		case 0x8B: return GetClosestWaterDistance(tile, (GetIndustrySpec(industry->type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
 
 		/* Square of Euclidian distance from town */
-		case 0x8D: return min(DistanceSquare(ClosestTownFromTile(tile, (uint)-1)->xy, tile), 65535);
+		case 0x8D: return min(DistanceSquare(industry->town->xy, tile), 65535);
 	}
 
-	DEBUG(grf, 1, "Unhandled location industry property 0x%X", variable);
-
-	*available = false;
-	return (uint32)-1;
+	/* None of the special ones, so try the general ones */
+	return IndustryGetVariable(object, variable, parameter, available);
 }
 
 bool CheckIfCallBackAllowsCreation(TileIndex tile, IndustryType type, uint itspec_index)
@@ -410,16 +440,23 @@
 	ResolverObject object;
 	const SpriteGroup *group;
 
-	NewIndustryResolver(&object, tile, NULL);
+	Industry ind;
+	ind.index = INVALID_INDUSTRY;
+	ind.xy = tile;
+	ind.width = 0;
+	ind.type = type;
+	ind.selected_layout = itspec_index;
+	ind.town = ClosestTownFromTile(tile, (uint)-1);
+
+	NewIndustryResolver(&object, tile, &ind);
 	object.GetVariable = IndustryLocationGetVariable;
 	object.callback = CBID_INDUSTRY_LOCATION;
-	object.u.industry_location.tile = tile;
-	object.u.industry_location.spec = indspec;
-	object.u.industry_location.itspec_index = itspec_index;
 
 	group = Resolve(GetIndustrySpec(type)->grf_prop.spritegroup, &object);
 
-	if (group == NULL || group->type != SGT_CALLBACK) return false;
+	/* Unlike the "normal" cases, not having a valid result means we allow
+	 * the building of the industry, as that's how it's done in TTDP. */
+	if (group == NULL || group->type != SGT_CALLBACK) return true;
 
 	switch (group->g.callback.result) {
 		case 0x400: return true;
@@ -457,13 +494,15 @@
  */
 void IndustryProductionCallback(Industry *ind, int reason)
 {
+	const IndustrySpec *spec = GetIndustrySpec(ind->type);
 	ResolverObject object;
 	NewIndustryResolver(&object, ind->xy, ind);
+	if ((spec->behaviour & INDUSTRYBEH_PRODCALLBACK_RANDOM) != 0) object.callback_param1 = Random();
 	object.callback_param2 = reason;
 
 	for (uint loop = 0;; loop++) {
 		SB(object.callback_param2, 8, 16, loop);
-		const SpriteGroup *group = Resolve(GetIndustrySpec(ind->type)->grf_prop.spritegroup, &object);
+		const SpriteGroup *group = Resolve(spec->grf_prop.spritegroup, &object);
 		if (group == NULL || group->type != SGT_INDUSTRY_PRODUCTION) break;
 
 		bool deref = (group->g.indprod.version == 1);
--- a/src/newgrf_industries.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_industries.h	Sat Oct 06 21:16:00 2007 +0000
@@ -8,10 +8,20 @@
 #include "industry.h"
 #include "newgrf_spritegroup.h"
 
+/** When should the industry(tile) be triggered for random bits? */
+enum IndustryTrigger {
+	/** Triggered each tile loop */
+	INDUSTRY_TRIGGER_TILELOOP_PROCESS = 1,
+	/** Triggered (whole industry) each 256 ticks */
+	INDUSTRY_TRIGGER_256_TICKS        = 2,
+	/** Triggered on cargo delivery */
+	INDUSTRY_TRIGGER_CARGO_DELIVERY   = 4,
+};
+
 /* in newgrf_industry.cpp */
 uint32 IndustryGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available);
 uint16 GetIndustryCallback(CallbackID callback, uint32 param1, uint32 param2, Industry *industry, IndustryType type, TileIndex tile);
-uint32 GetIndustryIDAtOffset(TileIndex new_tile, TileIndex old_tile, const Industry *i);
+uint32 GetIndustryIDAtOffset(TileIndex new_tile, const Industry *i);
 void IndustryProductionCallback(Industry *ind, int reason);
 bool CheckIfCallBackAllowsCreation(TileIndex tile, IndustryType type, uint itspec_index);
 bool CheckIfCallBackAllowsAvailability(IndustryType type, IndustryAvailabilityCallType creation_type);
@@ -19,10 +29,6 @@
 IndustryType MapNewGRFIndustryType(IndustryType grf_type, uint32 grf_id);
 
 /* in newgrf_industrytiles.cpp*/
-uint32 IndustryTileGetRandomBits(const ResolverObject *object);
-uint32 IndustryTileGetTriggers(const ResolverObject *object);
-void IndustryTileSetTriggers(const ResolverObject *object, int triggers);
-
 uint32 GetNearbyIndustryTileInformation(byte parameter, TileIndex tile, IndustryID index);
 
 #endif /* NEWGRF_INDUSTRIES_H */
--- a/src/newgrf_industrytiles.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_industrytiles.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -39,7 +39,9 @@
 	is_same_industry = (IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == index);
 	tile_type = GetTerrainType(tile) << 2 | (IsTileType(tile, MP_WATER) ? 1 : 0) << 1 | (is_same_industry ? 1 : 0);
 
-	return GetTileType(tile) << 24 | (TileHeight(tile) * 8) << 16 | tile_type << 8 | GetTileSlope(tile, NULL);
+	uint z;
+	Slope tileh = GetTileSlope(tile, &z);
+	return GetTileType(tile) << 24 | z << 16 | tile_type << 8 | tileh;
 }
 
 /** This is the position of the tile relative to the northernmost tile of the industry.
@@ -97,7 +99,7 @@
 		}
 
 		/* Get industry tile ID at offset */
-		case 0x62 : return GetIndustryIDAtOffset(GetNearbyTile(parameter, tile), tile, inds);
+		case 0x62 : return GetIndustryIDAtOffset(GetNearbyTile(parameter, tile), inds);
 	}
 
 	DEBUG(grf, 1, "Unhandled industry tile property 0x%X", variable);
@@ -112,22 +114,30 @@
 	return NULL;
 }
 
-uint32 IndustryTileGetRandomBits(const ResolverObject *object)
+static uint32 IndustryTileGetRandomBits(const ResolverObject *object)
 {
 	const TileIndex tile = object->u.industry.tile;
-	return (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) ? 0 : GetIndustryRandomBits(tile);
+	if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
+	return (object->scope == VSG_SCOPE_SELF) ? GetIndustryRandomBits(tile) : 0; //GetIndustryByTile(tile)->random_bits;
 }
 
-uint32 IndustryTileGetTriggers(const ResolverObject *object)
+static uint32 IndustryTileGetTriggers(const ResolverObject *object)
 {
 	const TileIndex tile = object->u.industry.tile;
-	return (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) ? 0 : GetIndustryTriggers(tile);
+	if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
+	return (object->scope == VSG_SCOPE_SELF) ? GetIndustryTriggers(tile) : 0; //GetIndustryByTile(tile)->triggers;
 }
 
-void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
+static void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
 {
 	const TileIndex tile = object->u.industry.tile;
-	if (IsTileType(tile, MP_INDUSTRY)) SetIndustryTriggers(tile, triggers);
+	if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return;
+
+	if (object->scope != VSG_SCOPE_SELF) {
+		SetIndustryTriggers(tile, triggers);
+	} else {
+		//GetIndustryByTile(tile)->triggers = triggers;
+	}
 }
 
 static void NewIndustryTileResolver(ResolverObject *res, IndustryGfx gfx, TileIndex tile, Industry *indus)
@@ -138,6 +148,7 @@
 	res->GetVariable   = IndustryTileGetVariable;
 	res->ResolveReal   = IndustryTileResolveReal;
 
+	res->psa             = &indus->psa;
 	res->u.industry.tile = tile;
 	res->u.industry.ind  = indus;
 	res->u.industry.gfx  = gfx;
@@ -158,14 +169,18 @@
 	SpriteID image = dts->ground_sprite;
 	SpriteID pal   = dts->ground_pal;
 
+	if (IS_CUSTOM_SPRITE(image)) image += stage;
+
 	if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
 
 	foreach_draw_tile_seq(dtss, dts->seq) {
 		if (GB(dtss->image, 0, SPRITE_WIDTH) == 0) continue;
 
-		image = dtss->image + stage;
+		image = dtss->image;
 		pal   = dtss->pal;
 
+		if (IS_CUSTOM_SPRITE(image)) image += stage;
+
 		if (HASBIT(image, PALETTE_MODIFIER_COLOR)) {
 			pal = GENERAL_SPRITE_COLOR(rnd_color);
 		} else {
@@ -181,7 +196,7 @@
 				!HASBIT(image, SPRITE_MODIFIER_OPAQUE) && HASBIT(_transparent_opt, TO_INDUSTRIES)
 			);
 		} else {
-			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y);
+			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, HASBIT(_transparent_opt, TO_INDUSTRIES));
 		}
 	}
 }
@@ -232,18 +247,23 @@
 	}
 }
 
-bool PerformIndustryTileSlopeCheck(TileIndex tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx)
+extern bool IsSlopeRefused(Slope current, Slope refused);
+
+bool PerformIndustryTileSlopeCheck(TileIndex ind_base_tile, TileIndex ind_tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx, uint itspec_index)
 {
 	Industry ind;
-	ind.xy = 0;
+	ind.index = INVALID_INDUSTRY;
+	ind.xy = ind_base_tile;
 	ind.width = 0;
 	ind.type = type;
 
-	uint16 callback_res = GetIndustryTileCallback(CBID_INDTILE_SHAPE_CHECK, 0, 0, gfx, &ind, tile);
+	uint16 callback_res = GetIndustryTileCallback(CBID_INDTILE_SHAPE_CHECK, 0, itspec_index, gfx, &ind, ind_tile);
+	if (callback_res == CALLBACK_FAILED) {
+		return !IsSlopeRefused(GetTileSlope(ind_tile, NULL), its->slopes_refused);
+	}
 	if (its->grf_prop.grffile->grf_version < 7) {
 		return callback_res != 0;
 	}
-	if (callback_res == CALLBACK_FAILED) return false;
 
 	switch (callback_res) {
 		case 0x400: return true;
@@ -347,8 +367,11 @@
 	uint32 random = Random();
 	BEGIN_TILE_LOOP(tile, ind->width, ind->height, ind->xy)
 		if (IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == ind->index) {
-			ret &= StartStopIndustryTileAnimation(tile, iat, random);
-			SB(random, 0, 16, Random());
+			if (StartStopIndustryTileAnimation(tile, iat, random)) {
+				SB(random, 0, 16, Random());
+			} else {
+				ret = false;
+			}
 		}
 	END_TILE_LOOP(tile, ind->width, ind->height, ind->xy)
 
--- a/src/newgrf_industrytiles.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_industrytiles.h	Sat Oct 06 21:16:00 2007 +0000
@@ -15,7 +15,7 @@
 
 bool DrawNewIndustryTile(TileInfo *ti, Industry *i, IndustryGfx gfx, const IndustryTileSpec *inds);
 uint16 GetIndustryTileCallback(CallbackID callback, uint32 param1, uint32 param2, IndustryGfx gfx_id, Industry *industry, TileIndex tile);
-bool PerformIndustryTileSlopeCheck(TileIndex tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx);
+bool PerformIndustryTileSlopeCheck(TileIndex ind_base_tile, TileIndex ind_tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx, uint itspec_index);
 
 void AnimateNewIndustryTile(TileIndex tile);
 bool StartStopIndustryTileAnimation(TileIndex tile, IndustryAnimationTrigger iat, uint32 random = Random());
--- a/src/newgrf_sound.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_sound.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -59,7 +59,7 @@
 	if (file == NULL) return false;
 
 	/* Check that the vehicle type uses the sound effect callback */
-	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_SOUND_EFFECT)) return false;
+	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_SOUND_EFFECT)) return false;
 
 	callback = GetVehicleCallback(CBID_VEHICLE_SOUND_EFFECT, event, 0, v->engine_type, v);
 	if (callback == CALLBACK_FAILED) return false;
--- a/src/newgrf_spritegroup.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_spritegroup.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -76,7 +76,7 @@
 	_spritegroup_count = 0;
 }
 
-uint32 _temp_store[0x110];
+TemporaryStorageArray<uint32, 0x110> _temp_store;
 
 
 static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
@@ -98,7 +98,7 @@
 		case 0x1C: return object->last_value;
 		case 0x20: return _opt.landscape == LT_ARCTIC ? GetSnowLine() : 0xFF;
 
-		case 0x7D: return _temp_store[parameter];
+		case 0x7D: return _temp_store.Get(parameter);
 
 		/* Not a common variable, so evalute the feature specific variables */
 		default: return object->GetVariable(object, variable, parameter, available);
@@ -106,10 +106,25 @@
 }
 
 
+/**
+ * Rotate val rot times to the right
+ * @param val the value to rotate
+ * @param rot the amount of times to rotate
+ * @return the rotated value
+ */
+static uint32 RotateRight(uint32 val, uint32 rot)
+{
+	/* Do not rotate more than necessary */
+	rot %= 32;
+
+	return (val >> rot) | (val << (32 - rot));
+}
+
+
 /* Evaluate an adjustment for a variable of the given size.
 * U is the unsigned type and S is the signed type to use. */
 template <typename U, typename S>
-static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, U last_value, uint32 value)
+static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ResolverObject *object, U last_value, uint32 value)
 {
 	value >>= adjust->shift_num;
 	value  &= adjust->and_mask;
@@ -137,10 +152,12 @@
 		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_STO:  _temp_store.Store(value, last_value); return last_value;
 		case DSGA_OP_RST:  return value;
+		case DSGA_OP_STOP: if (object->psa != NULL) object->psa->Store(value, last_value); return last_value;
+		case DSGA_OP_ROR:  return RotateRight(last_value, value);
+		case DSGA_OP_SCMP: return ((S)last_value == (S)value) ? 1 : ((S)last_value < (S)value ? 0 : 2);
+		case DSGA_OP_UCMP: return ((U)last_value == (U)value) ? 1 : ((U)last_value < (U)value ? 0 : 2);
 		default:           return value;
 	}
 }
@@ -179,9 +196,9 @@
 		}
 
 		switch (group->g.determ.size) {
-			case DSG_SIZE_BYTE:  value = EvalAdjustT<uint8, int8>(adjust, last_value, value); break;
-			case DSG_SIZE_WORD:  value = EvalAdjustT<uint16, int16>(adjust, last_value, value); break;
-			case DSG_SIZE_DWORD: value = EvalAdjustT<uint32, int32>(adjust, last_value, value); break;
+			case DSG_SIZE_BYTE:  value = EvalAdjustT<uint8,  int8> (adjust, object, last_value, value); break;
+			case DSG_SIZE_WORD:  value = EvalAdjustT<uint16, int16>(adjust, object, last_value, value); break;
+			case DSG_SIZE_DWORD: value = EvalAdjustT<uint32, int32>(adjust, object, last_value, value); break;
 			default: NOT_REACHED(); break;
 		}
 		last_value = value;
@@ -192,7 +209,25 @@
 	if (group->g.determ.num_ranges == 0) {
 		/* nvar == 0 is a special case -- we turn our value into a callback result */
 		nvarzero.type = SGT_CALLBACK;
-		nvarzero.g.callback.result = GB(value, 0, 15);
+		switch (object->callback) {
+			/* All these functions are 15 bit callbacks */
+			case CBID_VEHICLE_REFIT_CAPACITY:
+			case CBID_HOUSE_COLOUR:
+			case CBID_HOUSE_CARGO_ACCEPTANCE:
+			case CBID_INDUSTRY_LOCATION:
+			case CBID_INDTILE_CARGO_ACCEPTANCE:
+			case CBID_VEHICLE_COLOUR_MAPPING:
+			case CBID_HOUSE_PRODUCE_CARGO:
+			case CBID_VEHICLE_SOUND_EFFECT:
+			case CBID_SOUNDS_AMBIENT_EFFECT:
+				nvarzero.g.callback.result = GB(value, 0, 15);
+				break;
+
+			/* The rest is a 8 bit callback, which should be truncated properly */
+			default:
+				nvarzero.g.callback.result = GB(value, 0, 8);
+				break;
+		}
 		return &nvarzero;
 	}
 
--- a/src/newgrf_spritegroup.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_spritegroup.h	Sat Oct 06 21:16:00 2007 +0000
@@ -7,6 +7,7 @@
 
 #include "town.h"
 #include "industry.h"
+#include "newgrf_storage.h"
 
 /**
  * Gets the value of a so-called newgrf "register".
@@ -16,9 +17,8 @@
  */
 static inline uint32 GetRegister(uint i)
 {
-	assert(i < 0x110);
-	extern uint32 _temp_store[0x110];
-	return _temp_store[i];
+	extern TemporaryStorageArray<uint32, 0x110> _temp_store;
+	return _temp_store.Get(i);
 }
 
 struct SpriteGroup;
@@ -76,6 +76,10 @@
 	DSGA_OP_XOR,  ///< a ^ b
 	DSGA_OP_STO,  ///< store a into temporary storage, indexed by b. return a
 	DSGA_OP_RST,  ///< return b
+	DSGA_OP_STOP, ///< store a into persistent storage, indexed by b, return a
+	DSGA_OP_ROR,  ///< rotate a b positions to the right
+	DSGA_OP_SCMP, ///< (signed) comparision (a < b -> 0, a == b = 1, a > b = 2)
+	DSGA_OP_UCMP, ///< (unsigned) comparision (a < b -> 0, a == b = 1, a > b = 2)
 };
 
 
@@ -199,6 +203,8 @@
 
 	bool info_view; ///< Indicates if the item is being drawn in an info window
 
+	BaseStorageArray *psa; ///< The persistent storage array of this resolved object.
+
 	union {
 		struct {
 			const struct Vehicle *self;
@@ -226,11 +232,6 @@
 			IndustryGfx gfx;
 		} industry;
 		struct {
-			TileIndex tile;
-			const IndustrySpec *spec;
-			uint itspec_index;
-		} industry_location;
-		struct {
 			const struct CargoSpec *cs;
 		} cargo;
 	} u;
--- a/src/newgrf_station.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_station.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -752,7 +752,7 @@
 
 	relocation = GetCustomStationRelocation(statspec, NULL, INVALID_TILE);
 
-	if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
+	if (HASBIT(statspec->callbackmask, CBM_STATION_SPRITE_LAYOUT)) {
 		uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0x2110000, 0, statspec, NULL, INVALID_TILE);
 		if (callback != CALLBACK_FAILED) tile = callback;
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_storage.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,27 @@
+/* $Id$ */
+
+/** @file newgrf_storage.cpp Functionality related to the temporary and persistent storage arrays for NewGRFs. */
+
+#include "stdafx.h"
+#include "helpers.hpp"
+#include "newgrf_storage.h"
+#include <set>
+
+/** The changed storage arrays */
+static std::set<BaseStorageArray*> _changed_storage_arrays;
+
+void AddChangedStorage(BaseStorageArray *storage)
+{
+	_changed_storage_arrays.insert(storage);
+}
+
+void ClearStorageChanges(bool keep_changes)
+{
+	/* Loop over all changes arrays */
+	for (std::set<BaseStorageArray*>::iterator it = _changed_storage_arrays.begin(); it != _changed_storage_arrays.end(); it++) {
+		(*it)->ClearChanges(keep_changes);
+	}
+
+	/* And then clear that array */
+	_changed_storage_arrays.clear();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_storage.h	Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,183 @@
+/* $Id$ */
+
+/** @file newgrf_storage.h Functionality related to the temporary and persistent storage arrays for NewGRFs. */
+
+#ifndef NEWGRF_STORAGE_H
+#define NEWGRF_STORAGE_H
+
+/**
+ * Base class for all NewGRF storage arrays. Nothing fancy, only here
+ * so we have a generalised class to use.
+ */
+struct BaseStorageArray
+{
+	/** The needed destructor */
+	virtual ~BaseStorageArray() {}
+
+	/**
+	 * Clear the changes made since the last ClearChanges.
+	 * This can be done in two ways:
+	 *  - saving the changes permanently
+	 *  - reverting to the previous version
+	 * @param keep_changes do we save or revert the changes since the last ClearChanges?
+	 */
+	virtual void ClearChanges(bool keep_changes) = 0;
+
+	/**
+	 * Stores some value at a given position.
+	 * @param pos   the position to write at
+	 * @param value the value to write
+	 */
+	virtual void Store(uint pos, uint32 value) = 0;
+};
+
+/**
+ * Class for persistent storage of data.
+ * On ClearChanges that data is either reverted or saved.
+ * @param TYPE the type of variable to store.
+ * @param SIZE the size of the array.
+ */
+template <typename TYPE, uint SIZE>
+struct PersistentStorageArray : BaseStorageArray {
+	TYPE storage[SIZE]; ///< Memory to for the storage array
+	TYPE *prev_storage; ///< Memory to store "old" states so we can revert them on the performance of test cases for commands etc.
+
+	/** Simply construct the array */
+	PersistentStorageArray() : prev_storage(NULL)
+	{
+		memset(this->storage, 0, sizeof(this->storage));
+	}
+
+	/** And free all data related to it */
+	~PersistentStorageArray()
+	{
+		free(this->prev_storage);
+	}
+
+	/**
+	 * Stores some value at a given position.
+	 * If there is no backup of the data that backup is made and then
+	 * we write the data.
+	 * @param pos   the position to write at
+	 * @param value the value to write
+	 */
+	void Store(uint pos, uint32 value)
+	{
+		/* Out of the scope of the array */
+		if (pos >= SIZE) return;
+
+		/* The value hasn't changed, so we pretend nothing happened.
+		 * Saves a few cycles and such and it's pretty easy to check. */
+		if (this->storage[pos] == value) return;
+
+		/* We do not have made a backup; lets do so */
+		if (this->prev_storage != NULL) {
+			this->prev_storage = MallocT<TYPE>(SIZE);
+			if (this->prev_storage == NULL) return;
+
+			memcpy(this->prev_storage, this->storage, sizeof(this->storage));
+
+			/* We only need to register ourselves when we made the backup
+			 * as that is the only time something will have changed */
+			AddChangedStorage(this);
+		}
+
+		this->storage[pos] = value;
+	}
+
+	/**
+	 * Gets the value from a given position.
+	 * @param pos the position to get the data from
+	 * @return the data from that position
+	 */
+	TYPE Get(uint pos) const
+	{
+		/* Out of the scope of the array */
+		if (pos >= SIZE) return 0;
+
+		return this->storage[pos];
+	}
+
+	void ClearChanges(bool keep_changes)
+	{
+		assert(this->prev_storage != NULL);
+
+		if (!keep_changes) {
+			memcpy(this->storage, this->prev_storage, sizeof(this->storage));
+		}
+		free(this->prev_storage);
+	}
+};
+
+
+/**
+ * Class for temporary storage of data.
+ * On ClearChanges that data is always zero-ed.
+ * @param TYPE the type of variable to store.
+ * @param SIZE the size of the array.
+ */
+template <typename TYPE, uint SIZE>
+struct TemporaryStorageArray : BaseStorageArray {
+	TYPE storage[SIZE]; ///< Memory to for the storage array
+
+	/** Simply construct the array */
+	TemporaryStorageArray()
+	{
+		memset(this->storage, 0, sizeof(this->storage));
+	}
+
+	/**
+	 * Stores some value at a given position.
+	 * @param pos   the position to write at
+	 * @param value the value to write
+	 */
+	void Store(uint pos, uint32 value)
+	{
+		/* Out of the scope of the array */
+		if (pos >= SIZE) return;
+
+		this->storage[pos] = value;
+		AddChangedStorage(this);
+	}
+
+	/**
+	 * Gets the value from a given position.
+	 * @param pos the position to get the data from
+	 * @return the data from that position
+	 */
+	TYPE Get(uint pos) const
+	{
+		/* Out of the scope of the array */
+		if (pos >= SIZE) return 0;
+
+		return this->storage[pos];
+	}
+
+	void ClearChanges(bool keep_changes)
+	{
+		memset(this->storage, 0, sizeof(this->storage));
+	}
+};
+
+/**
+ * Add the changed storage array to the list of changed arrays.
+ * This is done so we only have to revert/save the changed
+ * arrays, which saves quite a few clears, etc. after callbacks.
+ * @param storage the array that has changed
+ */
+void AddChangedStorage(BaseStorageArray *storage);
+
+
+/**
+ * Clear the changes made since the last ClearStorageChanges.
+ * This is done for *all* storages that have been registered to with
+ * AddChangedStorage since the previous ClearStorageChanges.
+ *
+ * This can be done in two ways:
+ *  - saving the changes permanently
+ *  - reverting to the previous version
+ * @param keep_changes do we save or revert the changes since the last ClearChanges?
+ */
+void ClearStorageChanges(bool keep_changes);
+
+#endif /* NEWGRF_STORAGE_H */
--- a/src/newgrf_text.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_text.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -21,6 +21,7 @@
 #include "newgrf_text.h"
 #include "table/control_codes.h"
 #include "helpers.hpp"
+#include "date.h"
 
 #define GRFTAB  28
 #define TABSIZE 11
@@ -228,9 +229,9 @@
 			case 0x7B:
 			case 0x7C:
 			case 0x7D:
-			case 0x7E: d += Utf8Encode(d, SCC_NUM); break;
-			case 0x7F: d += Utf8Encode(d, SCC_CURRENCY); break;
-			case 0x80: d += Utf8Encode(d, SCC_STRING); break;
+			case 0x7E:
+			case 0x7F:
+			case 0x80: d += Utf8Encode(d, SCC_NEWGRF_PRINT_DWORD + c - 0x7B); break;
 			case 0x81: {
 				StringID string;
 				string  = *str++;
@@ -239,12 +240,12 @@
 				d += Utf8Encode(d, string);
 				break;
 			}
-			case 0x82: d += Utf8Encode(d, SCC_DATE_TINY); break;
-			case 0x83: d += Utf8Encode(d, SCC_DATE_SHORT); break;
-			case 0x84: d += Utf8Encode(d, SCC_VELOCITY); break;
-			case 0x85: d += Utf8Encode(d, SCC_SKIP);    break;
-			case 0x86: /* "Rotate down top 4 words on stack" */ break;
-			case 0x87: d += Utf8Encode(d, SCC_VOLUME);  break;
+			case 0x82:
+			case 0x83:
+			case 0x84: d += Utf8Encode(d, SCC_NEWGRF_PRINT_WORD_SPEED + c - 0x82); break;
+			case 0x85: d += Utf8Encode(d, SCC_NEWGRF_DISCARD_WORD);       break;
+			case 0x86: d += Utf8Encode(d, SCC_NEWGRF_ROTATE_TOP_4_WORDS); break;
+			case 0x87: d += Utf8Encode(d, SCC_NEWGRF_PRINT_WORD_LITRES);  break;
 			case 0x88: d += Utf8Encode(d, SCC_BLUE);    break;
 			case 0x89: d += Utf8Encode(d, SCC_SILVER);  break;
 			case 0x8A: d += Utf8Encode(d, SCC_GOLD);    break;
@@ -262,6 +263,20 @@
 			case 0x96: d += Utf8Encode(d, SCC_GRAY);    break;
 			case 0x97: d += Utf8Encode(d, SCC_DKBLUE);  break;
 			case 0x98: d += Utf8Encode(d, SCC_BLACK);   break;
+			case 0x9A:
+				switch (*str++) {
+					case 0: /* FALL THROUGH */
+					case 1: d += Utf8Encode(d, SCC_NEWGRF_PRINT_QWORD_CURRENCY); break;
+					case 3: {
+						uint16 tmp = *str++;
+						tmp |= (*str++) << 8;
+						d += Utf8Encode(d, SCC_NEWGRF_PUSH_WORD); d += Utf8Encode(d, tmp);
+					} break;
+					case 4: d += Utf8Encode(d, SCC_NEWGRF_UNPRINT); d += Utf8Encode(d, *str++); break;
+					default: grfmsg(1, "missing handler for extended format code"); break;
+				}
+				break;
+
 			case 0x9E: d += Utf8Encode(d, 0x20AC); break; // Euro
 			case 0x9F: d += Utf8Encode(d, 0x0178); break; // Y with diaeresis
 			case 0xA0: d += Utf8Encode(d, SCC_UPARROW); break;
@@ -481,3 +496,142 @@
 
 	_num_grf_texts = 0;
 }
+
+struct TextRefStack {
+	byte stack[0x30];
+	byte position;
+	bool used;
+
+	TextRefStack() : used(false) {}
+
+	uint8  PopUnsignedByte()  { assert(this->position < lengthof(this->stack)); return this->stack[this->position++]; }
+	int8   PopSignedByte()    { return (int8)this->PopUnsignedByte(); }
+
+	uint16 PopUnsignedWord()  { return this->PopUnsignedByte()  | (((uint16)this->PopUnsignedByte())  <<  8); }
+	int16  PopSignedWord()    { return (int32)this->PopUnsignedWord(); }
+
+	uint32 PopUnsignedDWord() { return this->PopUnsignedWord()  | (((uint32)this->PopUnsignedWord())  << 16); }
+	int32  PopSignedDWord()   { return (int32)this->PopUnsignedDWord(); }
+
+	uint64 PopUnsignedQWord() { return this->PopUnsignedDWord() | (((uint64)this->PopUnsignedDWord()) << 32); }
+	int64  PopSignedQWord()   { return (int64)this->PopUnsignedQWord(); }
+
+	/** Rotate the top four words down: W1, W2, W3, W4 -> W4, W1, W2, W3 */
+	void RotateTop4Words()
+	{
+		byte tmp[2];
+		for (int i = 0; i  < 2; i++) tmp[i] = this->stack[this->position + i + 6];
+		for (int i = 5; i >= 0; i--) this->stack[this->position + i + 2] = this->stack[this->position + i];
+		for (int i = 0; i  < 2; i++) this->stack[this->position + i] = tmp[i];
+	}
+
+	void PushWord(uint16 word)
+	{
+		if (this->position >= 2) {
+			this->position -= 2;
+		} else {
+			for (uint i = lengthof(stack) - 3; i >= this->position; i--) {
+				this->stack[this->position + 2] = this->stack[this->position];
+			}
+		}
+		this->stack[this->position]     = GB(word, 0, 8);
+		this->stack[this->position + 1] = GB(word, 8, 8);
+	}
+
+	void ResetStack() { this->used = true; this->position = 0; }
+};
+
+/** The stack that is used for TTDP compatible string code parsing */
+static TextRefStack _newgrf_textrefstack;
+
+/** Prepare the TTDP compatible string code parsing */
+void PrepareTextRefStackUsage()
+{
+	extern TemporaryStorageArray<uint32, 0x110> _temp_store;
+
+	_newgrf_textrefstack.ResetStack();
+
+	byte *p = _newgrf_textrefstack.stack;
+	for (uint i = 0; i < 6; i++) {
+		for (uint j = 0; j < 32; j += 8) {
+			*p = GB(_temp_store.Get(0x100 + i), 32 - j, 8);
+			p++;
+		}
+	}
+}
+
+/** Stop using the TTDP compatible string code parsing */
+void StopTextRefStackUsage() { _newgrf_textrefstack.used = false; }
+
+/**
+ * FormatString for NewGRF specific "magic" string control codes
+ * @param scc   the string control code that has been read
+ * @param stack the current "stack"
+ * @return the string control code to "execute" now
+ */
+uint RemapNewGRFStringControlCode(uint scc, char **buff, const char **str, int64 *argv)
+{
+	if (_newgrf_textrefstack.used) {
+		switch (scc) {
+			default: NOT_REACHED();
+			case SCC_NEWGRF_PRINT_SIGNED_BYTE:    *argv = _newgrf_textrefstack.PopSignedByte();    break;
+			case SCC_NEWGRF_PRINT_SIGNED_WORD:    *argv = _newgrf_textrefstack.PopSignedWord();    break;
+			case SCC_NEWGRF_PRINT_QWORD_CURRENCY: *argv = _newgrf_textrefstack.PopUnsignedQWord(); break;
+
+			case SCC_NEWGRF_PRINT_DWORD_CURRENCY:
+			case SCC_NEWGRF_PRINT_DWORD:          *argv = _newgrf_textrefstack.PopSignedDWord();   break;
+
+			case SCC_NEWGRF_PRINT_WORD_SPEED:
+			case SCC_NEWGRF_PRINT_WORD_LITRES:
+			case SCC_NEWGRF_PRINT_UNSIGNED_WORD:  *argv = _newgrf_textrefstack.PopUnsignedWord(); break;
+
+			case SCC_NEWGRF_PRINT_DATE:
+			case SCC_NEWGRF_PRINT_MONTH_YEAR:     *argv = _newgrf_textrefstack.PopSignedWord() + DAYS_TILL_ORIGINAL_BASE_YEAR; break;
+
+			case SCC_NEWGRF_DISCARD_WORD:         _newgrf_textrefstack.PopUnsignedWord(); break;
+
+			case SCC_NEWGRF_ROTATE_TOP_4_WORDS:   _newgrf_textrefstack.RotateTop4Words(); break;
+			case SCC_NEWGRF_PUSH_WORD:            _newgrf_textrefstack.PushWord(Utf8Consume(str)); break;
+			case SCC_NEWGRF_UNPRINT:              *buff -= Utf8Consume(str); break;
+
+			case SCC_NEWGRF_PRINT_STRING_ID:
+				*argv = _newgrf_textrefstack.PopUnsignedWord();
+				if (*argv == STR_NULL) *argv = STR_EMPTY;
+				break;
+		}
+	}
+
+	switch (scc) {
+		default: NOT_REACHED();
+		case SCC_NEWGRF_PRINT_DWORD:
+		case SCC_NEWGRF_PRINT_SIGNED_WORD:
+		case SCC_NEWGRF_PRINT_SIGNED_BYTE:
+		case SCC_NEWGRF_PRINT_UNSIGNED_WORD:
+			return SCC_NUM;
+
+		case SCC_NEWGRF_PRINT_DWORD_CURRENCY:
+		case SCC_NEWGRF_PRINT_QWORD_CURRENCY:
+			return SCC_CURRENCY;
+
+		case SCC_NEWGRF_PRINT_STRING_ID:
+			return SCC_STRING;
+
+		case SCC_NEWGRF_PRINT_DATE:
+			return SCC_DATE_LONG;
+
+		case SCC_NEWGRF_PRINT_MONTH_YEAR:
+			return SCC_DATE_TINY;
+
+		case SCC_NEWGRF_PRINT_WORD_SPEED:
+			return SCC_VELOCITY;
+
+		case SCC_NEWGRF_PRINT_WORD_LITRES:
+			return SCC_VOLUME;
+
+		case SCC_NEWGRF_DISCARD_WORD:
+		case SCC_NEWGRF_ROTATE_TOP_4_WORDS:
+		case SCC_NEWGRF_PUSH_WORD:
+		case SCC_NEWGRF_UNPRINT:
+			return 0;
+	}
+}
--- a/src/newgrf_text.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_text.h	Sat Oct 06 21:16:00 2007 +0000
@@ -15,4 +15,8 @@
 
 bool CheckGrfLangID(byte lang_id, byte grf_version);
 
+void PrepareTextRefStackUsage();
+void StopTextRefStackUsage();
+uint RemapNewGRFStringControlCode(uint scc, char **buff, const char **str, int64 *argv);
+
 #endif /* NEWGRF_TEXT_H */
--- a/src/news.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/news.h	Sat Oct 06 21:16:00 2007 +0000
@@ -6,16 +6,16 @@
 #define NEWS_H
 
 struct NewsItem {
-	StringID string_id;
-	uint16 duration;
-	Date date;
-	byte flags;
-	byte display_mode;
-	byte type;
-	byte callback;
+	StringID string_id; ///< Message text (sometimes also used for storing other info)
+	uint16 duration;    ///< Remaining time for showing this news message
+	Date date;          ///< Date of the news
+	byte flags;         ///< NewsFlags bits @see NewsFlags
+	byte display_mode;  ///< Display mode value @see NewsMode
+	byte type;          ///< News category @see NewsType
+	byte callback;      ///< Call-back function
 
-	TileIndex data_a;
-	TileIndex data_b;
+	TileIndex data_a;   ///< Reference to tile or vehicle
+	TileIndex data_b;   ///< Reference to second tile or vehicle
 
 	uint64 params[10];
 };
@@ -24,7 +24,20 @@
 typedef void DrawNewsCallbackProc(Window *w);
 typedef StringID GetNewsStringCallbackProc(const NewsItem *ni);
 
+/**
+ * Macro for creating news flags.
+ * @param mode (bits 0 - 7) Display_mode, one of the NewsMode enums (NM_)
+ * @param flag (bits 8 - 15) OR-able news flags, any of the NewsFlags enums (NF_)
+ * @param type (bits 16-23) News category, one of the NewsType enums (NT_)
+ * @param cb (bits 24-31) Call-back function, one of the NewsCallback enums (DNC_) or 0 if no callback
+ * @see NewsMode
+ * @see NewsFlags
+ * @see NewsType
+ * @see NewsCallback
+ * @see AddNewsItem
+ */
 #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);
@@ -32,23 +45,28 @@
 
 VARDEF NewsItem _statusbar_news_item;
 
+/** Type of news. */
 enum NewsType {
-	NT_ARRIVAL_PLAYER,
-	NT_ARRIVAL_OTHER,
-	NT_ACCIDENT,
-	NT_COMPANY_INFO,
-	NT_OPENCLOSE,
-	NT_ECONOMY,
-	NT_ADVICE,
-	NT_NEW_VEHICLES,
-	NT_ACCEPTANCE,
-	NT_SUBSIDIES,
-	NT_GENERAL,
-	NT_END,
+	NT_ARRIVAL_PLAYER,  ///< Cargo arrived for player
+	NT_ARRIVAL_OTHER,   ///< Cargo arrived for competitor
+	NT_ACCIDENT,        ///< An accident or disaster has occurred
+	NT_COMPANY_INFO,    ///< Company info (new companies, bankrupcy messages)
+	NT_OPENCLOSE,       ///< Opening and closing of industries
+	NT_ECONOMY,         ///< Economic changes (recession, industry up/dowm)
+	NT_ADVICE,          ///< Bits of news about vehicles of the player
+	NT_NEW_VEHICLES,    ///< New vehicle has become available
+	NT_ACCEPTANCE,      ///< A type of cargo is (no longer) accepted
+	NT_SUBSIDIES,       ///< News about subsidies (announcements, expirations, acceptance)
+	NT_GENERAL,         ///< General news (from towns)
+	NT_END,             ///< end-of-array marker
 };
 
 extern const char *_news_display_name[NT_END];
 
+/**
+ * News mode.
+ * @see NEWS_FLAGS
+ */
 enum NewsMode {
 	NM_SMALL    = 0, ///< Show only a small popup informing us about vehicle age for example
 	NM_NORMAL   = 1, ///< Show a simple news message (height 170 pixels)
@@ -56,6 +74,11 @@
 	NM_CALLBACK = 3, ///< Do some special processing before displaying news message. Which callback to call is in NewsCallback
 };
 
+/**
+ * Various OR-able news-item flags.
+ * note: NF_INCOLOR is set automatically if needed
+ * @see NEWS_FLAGS
+ */
 enum NewsFlags {
 	NF_VIEWPORT  = (1 << 1), ///< Does the news message have a viewport? (ingame picture of happening)
 	NF_TILE      = (1 << 2), ///< When clicked on the news message scroll to a given tile? Tile is in data_a/data_b
@@ -64,11 +87,13 @@
 	NF_INCOLOR   = (1 << 5), ///< Show the newsmessage in colour, otherwise it defaults to black & white
 };
 
+/** Special news items */
 enum NewsCallback {
 	DNC_VEHICLEAVAIL  = 0, ///< Show new vehicle available message. StringID is EngineID
 	DNC_BANKRUPCY     = 1, ///< Show bankrupcy message. StringID is PlayerID (0-3) and NewsBankrupcy (4-7)
 };
 
+/** Kinds of bankrupcy */
 enum NewsBankrupcy {
 	NB_BTROUBLE    = (1 << 4), ///< Company is in trouble (warning)
 	NB_BMERGER     = (2 << 4), ///< Company has been bought by another company
--- a/src/news_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/news_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -1,6 +1,5 @@
 /* $Id$ */
 
-/** @file news_gui.cpp */
 
 #include "stdafx.h"
 #include "openttd.h"
@@ -19,42 +18,50 @@
 #include "date.h"
 #include "string.h"
 
-/* News system
+/** @file news_gui.cpp
+ *
  * News system is realized as a FIFO queue (in an array)
  * The positions in the queue can't be rearranged, we only access
  * the array elements through pointers to the elements. Once the
- * array is full, the oldest entry (_oldest_news) is being overwritten
- * by the newest (_latest news).
+ * array is full, the oldest entry (\a _oldest_news) is being overwritten
+ * by the newest (\a _latest_news).
  *
+ * \verbatim
  * oldest                   current   lastest
  *  |                          |         |
  * [O------------F-------------C---------L           ]
  *               |
  *            forced
+ * \endverbatim
  *
  * Of course by using an array we can have situations like
  *
+ * \verbatim
  * [----L          O-----F---------C-----------------]
  * This is where we have wrapped around the array and have
  * (MAX_NEWS - O) + L news items
+ * \endverbatim
  */
 
+/** Number of news items in the FIFO queue */
 #define MAX_NEWS 30
 #define NB_WIDG_PER_SETTING 4
 
 typedef byte NewsID;
 #define INVALID_NEWS 255
 
-static NewsItem _news_items[MAX_NEWS];
-static NewsID _current_news = INVALID_NEWS; // points to news item that should be shown next
-static NewsID _oldest_news = 0;    // points to first item in fifo queue
-static NewsID _latest_news = INVALID_NEWS;  // points to last item in fifo queue
-/* if the message being shown was forced by the user, its index is stored in
- * _forced_news. forced_news is INVALID_NEWS otherwise.
- * (Users can force messages through history or "last message") */
+static NewsItem _news_items[MAX_NEWS];      ///< The news FIFO queue
+static NewsID _current_news = INVALID_NEWS; ///< points to news item that should be shown next
+static NewsID _oldest_news = 0;             ///< points to first item in fifo queue
+static NewsID _latest_news = INVALID_NEWS;  ///< points to last item in fifo queue
+
+/** Forced news item.
+ * Users can force an item by accessing the history or "last message".
+ * If the message being shown was forced by the user, its index is stored in
+ * _forced_news. Otherwise, \a _forced_news variable is INVALID_NEWS. */
 static NewsID _forced_news = INVALID_NEWS;
 
-static byte _total_news = 0; // total news count
+static byte _total_news = 0; ///< Number of news items in FIFO queue @see _news_items
 
 void DrawNewsNewVehicleAvail(Window *w);
 void DrawNewsBankrupcy(Window *w);
@@ -64,8 +71,8 @@
 StringID GetNewsStringBankrupcy(const NewsItem *ni);
 
 static DrawNewsCallbackProc * const _draw_news_callback[] = {
-	DrawNewsNewVehicleAvail,  //< DNC_VEHICLEAVAIL
-	DrawNewsBankrupcy,        //< DNC_BANKRUPCY
+	DrawNewsNewVehicleAvail,  ///< DNC_VEHICLEAVAIL
+	DrawNewsBankrupcy,        ///< DNC_BANKRUPCY
 };
 
 extern GetNewsStringCallbackProc * const _get_news_string_callback[];
@@ -74,6 +81,7 @@
 	GetNewsStringBankrupcy,        ///< DNC_BANKRUPCY
 };
 
+/** Initialize the news-items data structures */
 void InitNewsItemStructs()
 {
 	memset(_news_items, 0, sizeof(_news_items));
@@ -219,42 +227,52 @@
 	}
 }
 
-/** Return the correct index in the pseudo-fifo
- * queue and deals with overflows when increasing the index */
+/**
+ * Return the correct index in the pseudo-fifo
+ * queue and deals with overflows when increasing the index
+ */
 static inline NewsID increaseIndex(NewsID i)
 {
 	assert(i != INVALID_NEWS);
 	return (i + 1) % MAX_NEWS;
 }
 
-/** Return the correct index in the pseudo-fifo
- * queue and deals with overflows when decreasing the index */
+/**
+ * Return the correct index in the pseudo-fifo
+ * queue and deals with overflows when decreasing the index
+ */
 static inline NewsID decreaseIndex(NewsID i)
 {
 	assert(i != INVALID_NEWS);
 	return (i + MAX_NEWS - 1) % MAX_NEWS;
 }
 
-/** Add a new newsitem to be shown.
- * @param string String to display, can have special values based on parameter 'flags'
+/**
+ * Add a new newsitem to be shown.
+ * @param string String to display, can have special values based on parameter \a flags
  * @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.
- * 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.
- * DNC_TRAINAVAIL, DNC_ROADAVAIL, DNC_SHIPAVAIL, DNC_AIRCRAFTAVAIL: StringID is
- * 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_)
+ *  -# Bits  0 -  7 display_mode, any of the NewsMode enums (NM_)
+ *  -# Bits  8 - 15 news flags, any of the NewsFlags enums (NF_)
+ *  -# Bits 16 - 23 news category, any of the NewsType enums (NT_)
+ *  -# Bits 24 - 31 news callback function, any of the NewsCallback enums (DNC_)
+ *
+ * If the display mode is NM_CALLBACK, special news is shown and parameter
+ * \a string has a special meaning.
+ *  - For DNC_TRAINAVAIL, DNC_ROADAVAIL, DNC_SHIPAVAIL, DNC_AIRCRAFTAVAIL messages: StringID is
+ *    the index of the engine that is shown
+ *
+ *  - For 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.
+ *    @see NewsBankrupcy
+ *
  * @see NewsMode
  * @see NewsFlags
  * @see NewsType
- * @see NewsCallback */
+ * @see NewsCallback
+ */
 void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b)
 {
 	NewsID l_news;
@@ -310,8 +328,25 @@
 }
 
 
-/* Don't show item if it's older than x days, corresponds with NewsType in news.h */
-static const byte _news_items_age[] = {60, 60, 90, 60, 90, 30, 150, 30, 90, 180};
+/**
+ * Maximum age of news items.
+ * Don't show item if it's older than x days, corresponds with NewsType in news.h
+ * @see NewsType
+ */
+static const byte _news_items_age[NT_END] = {
+	60,  ///< NT_ARRIVAL_PLAYER
+	60,  ///< NT_ARRIVAL_OTHER
+	90,  ///< NT_ACCIDENT
+	60,  ///< NT_COMPANY_INFO
+	90,  ///< NT_OPENCLOSE
+	30,  ///< NT_ECONOMY
+	150, ///< NT_ADVICE
+	30,  ///< NT_NEW_VEHICLES
+	90,  ///< NT_ACCEPTANCE
+	180, ///< NT_SUBSIDIES
+	60   ///< NT_GENERAL
+};
+
 
 static const Widget _news_type13_widgets[] = {
 {      WWT_PANEL,   RESIZE_NONE,    15,     0,   429,     0,   169, 0x0, STR_NULL},
@@ -385,7 +420,8 @@
 	"general",
 };
 
-/** Get the value of an item of the news-display settings. This is
+/**
+ * Get the value of an item of the news-display settings. This is
  * a little tricky since on/off/summary must use 2 bits to store the value
  * @param item the item whose value is requested
  * @return return the found value which is between 0-2
@@ -396,7 +432,8 @@
 	return GB(_news_display_opt, item * 2, 2);
 }
 
-/** Set the value of an item in the news-display settings. This is
+/**
+ * Set the value of an item in the news-display settings. This is
  * a little tricky since on/off/summary must use 2 bits to store the value
  * @param item the item whose value is being set
  * @param val new value
@@ -407,7 +444,7 @@
 	SB(_news_display_opt, item * 2, 2, val);
 }
 
-/* open up an own newspaper window for the news item */
+/** Open up an own newspaper window for the news item */
 static void ShowNewspaper(NewsItem *ni)
 {
 	Window *w;
@@ -457,7 +494,7 @@
 	w->flags4 |= WF_DISABLE_VP_SCROLL;
 }
 
-/* show news item in the ticker */
+/** Show news item in the ticker */
 static void ShowTicker(const NewsItem *ni)
 {
 	Window *w;
@@ -470,8 +507,10 @@
 }
 
 
-/** Are we ready to show another news item?
- * Only if nothing is in the newsticker and no newspaper is displayed */
+/**
+ * Are we ready to show another news item?
+ * Only if nothing is in the newsticker and no newspaper is displayed
+ */
 static bool ReadyForNextItem()
 {
 	const Window *w;
@@ -493,6 +532,7 @@
 	return (ni->duration == 0 || FindWindowById(WC_NEWS_WINDOW, 0) == NULL);
 }
 
+/** Move to the next news item */
 static void MoveToNextItem()
 {
 	DeleteWindowById(WC_NEWS_WINDOW, 0);
@@ -509,26 +549,27 @@
 		if (_date - _news_items_age[ni->type] > ni->date) return;
 
 		switch (GetNewsDisplayValue(ni->type)) {
-		case 0: { // Off - show nothing only a small reminder in the status bar
-			Window *w = FindWindowById(WC_STATUS_BAR, 0);
+			default: NOT_REACHED();
+			case 0: { // Off - show nothing only a small reminder in the status bar
+				Window *w = FindWindowById(WC_STATUS_BAR, 0);
 
-			if (w != NULL) {
-				WP(w, def_d).data_2 = 91;
-				SetWindowDirty(w);
-			}
-			break;
-		}
-
-		case 1: // Summary - show ticker, but if forced big, cascade to full
-			if (!(ni->flags & NF_FORCE_BIG)) {
-				ShowTicker(ni);
+				if (w != NULL) {
+					WP(w, def_d).data_2 = 91;
+					SetWindowDirty(w);
+				}
 				break;
 			}
-			/* Fallthrough */
 
-		case 2: // Full - show newspaper
-			ShowNewspaper(ni);
-			break;
+			case 1: // Summary - show ticker, but if forced big, cascade to full
+				if (!(ni->flags & NF_FORCE_BIG)) {
+					ShowTicker(ni);
+					break;
+				}
+				/* Fallthrough */
+
+			case 2: // Full - show newspaper
+				ShowNewspaper(ni);
+				break;
 		}
 	}
 }
@@ -541,7 +582,7 @@
 	if (ReadyForNextItem()) MoveToNextItem();
 }
 
-/* Do a forced show of a specific message */
+/** Do a forced show of a specific message */
 static void ShowNewsMessage(NewsID i)
 {
 	if (_total_news == 0) return;
@@ -561,6 +602,7 @@
 	}
 }
 
+/** Show previous news item */
 void ShowLastNewsMessage()
 {
 	if (_forced_news == INVALID_NEWS) {
@@ -594,7 +636,8 @@
 	return i;
 }
 
-/** Draw an unformatted news message truncated to a maximum length. If
+/**
+ * Draw an unformatted news message truncated to a maximum length. If
  * length exceeds maximum length it will be postfixed by '...'
  * @param x,y position of the string
  * @param color the color the string will be shown in
@@ -707,6 +750,7 @@
 	MessageHistoryWndProc
 };
 
+/** Display window with news messages history */
 void ShowMessageHistory()
 {
 	Window *w;
@@ -733,7 +777,8 @@
 	WIDGET_NEWSOPT_START_OPTION = 9,  ///< First widget that is part of a group [<] .. [.]
 };
 
-/** Setup the disabled/enabled buttons in the message window
+/**
+ * Setup the disabled/enabled buttons in the message window
  * If the value is 'off' disable the [<] widget, and enable the [>] one
  * Same-wise for all the others. Starting value of 4 is the first widget
  * group. These are grouped as [<][>] .. [<][>], etc.
--- a/src/oldloader.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/oldloader.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -1175,7 +1175,7 @@
 	OCL_END()
 };
 
-static bool LoadOldVehicle(LoadgameState *ls, int num)
+bool LoadOldVehicle(LoadgameState *ls, int num)
 {
 	uint i;
 
@@ -1206,7 +1206,7 @@
 			default:   v->spritenum >>= 1; break;
 		}
 
-		if (_old_next_ptr != 0xFFFF) v->SetNext(GetVehicle(_old_next_ptr));
+		if (_old_next_ptr != 0xFFFF) v->next = GetVehicle(_old_next_ptr);
 
 		v->string_id = RemapOldStringID(_old_string_id);
 
--- a/src/openttd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/openttd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -61,6 +61,7 @@
 #include "newgrf_config.h"
 #include "newgrf_house.h"
 #include "newgrf_commons.h"
+#include "newgrf_storage.h"
 #include "player_face.h"
 #include "group.h"
 #include "blitter/factory.hpp"
@@ -90,8 +91,6 @@
 extern void ShowOSErrorBox(const char *buf);
 extern void SetDefaultRailGui();
 
-const char *_default_blitter = "8bpp-optimized";
-
 /* TODO: usrerror() for errors which are not of an internal nature but
  * caused by the user, i.e. missing files or fatal configuration errors.
  * Post-0.4.0 since Celestar doesn't want this in SVN before. --pasky */
@@ -472,7 +471,7 @@
 	if (!StrEmpty(musicdriver)) ttd_strlcpy(_ini_musicdriver, musicdriver, sizeof(_ini_musicdriver));
 	if (!StrEmpty(sounddriver)) ttd_strlcpy(_ini_sounddriver, sounddriver, sizeof(_ini_sounddriver));
 	if (!StrEmpty(videodriver)) ttd_strlcpy(_ini_videodriver, videodriver, sizeof(_ini_videodriver));
-	if (StrEmpty(blitter)) ttd_strlcpy(blitter, _default_blitter, sizeof(blitter));
+	if (!StrEmpty(blitter))     ttd_strlcpy(_ini_blitter, blitter, sizeof(_ini_blitter));
 	if (resolution[0] != 0) { _cur_resolution[0] = resolution[0]; _cur_resolution[1] = resolution[1]; }
 	if (startyear != INVALID_YEAR) _patches_newgame.starting_year = startyear;
 	if (generation_seed != GENERATE_NEW_SEED) _patches_newgame.generation_seed = generation_seed;
@@ -514,9 +513,11 @@
 	/* Initialize game palette */
 	GfxInitPalettes();
 
-	DEBUG(misc, 1, "Loading blitter '%s'...", blitter);
-	if (BlitterFactoryBase::SelectBlitter(blitter) == NULL)
-		error("Failed to select requested blitter '%s'; does it exist?", blitter);
+	DEBUG(misc, 1, "Loading blitter...");
+	if (BlitterFactoryBase::SelectBlitter(_ini_blitter) == NULL)
+		StrEmpty(_ini_blitter) ?
+			error("Failed to autoprobe blitter") :
+			error("Failed to select requested blitter '%s'; does it exist?", _ini_blitter);
 
 	DEBUG(driver, 1, "Loading drivers...");
 
@@ -972,6 +973,8 @@
  * That check is enforced in DoCommand. */
 void StateGameLoop()
 {
+	ClearStorageChanges(false);
+
 	/* dont execute the state loop during pause */
 	if (_pause_game) return;
 	if (IsGeneratingWorld()) return;
@@ -1242,25 +1245,25 @@
 	const FSMportsSpec *fsmportspec = GetCustomFSMportsSpecByGrf(grfid, localidx);
 	int fsmportspecindex = AllocateFSMportsSpecToStation(fsmportspec, st, true);
 
-	if (grfid != 0x4450414F || localidx != 3) {   //skip oilrigs, but otherwise makeairport
+	if (grfid != 0x4450414F || localidx != 3) { // Skip oilrigs, but otherwise makeairport
 		/* find layout tiletype corresponding to location on airport */
 		TileIndexDiffC tile_offset = TileIndexToTileIndexDiffC(tile, st->airport_tile);
-		int w = fsmportspec->size_x[0];  //old airports are always 0th graphics set orientation... ie NE
+		int w = fsmportspec->size_x[0];  // Old airports are always 0th graphics set orientation... ie NE
 		const byte *layout_ptr = fsmportspec->layouts[0];
-		st->FSMport_orientation = *layout_ptr++; //orientation
-		layout_ptr++; //skip minipic ID
+		st->FSMport_orientation = *layout_ptr++; // Orientation
+		layout_ptr++; // Skip minipic ID
 		for (byte skip = 0; skip < (tile_offset.y * w + tile_offset.x); skip++) {
-			layout_ptr++;  //skip to the correct layout tiletype
+			layout_ptr++;  // Skip to the correct layout tiletype
 		}
 
-		/* replace the savegame layout tiletype with the newgrf one */
+		/* Replace the savegame layout tiletype with the newgrf one */
 		MakeAirport(tile, st->owner, st->index, *layout_ptr);
 
-		/*set top bit of m6 to indicate an fsmportsspec */
+		/* Set top bit of m6 to indicate an fsmportsspec */
 		SetCustomFSMportsSpecIndex(tile, fsmportspecindex);
 	} else {
-		/* Oilrigs must be set against their root tile, not the tile of the landing pad */
-		/*set top bit of m6 to indicate an fsmportsspec */
+		/* Oilrigs must be set against their root tile, not the tile of the landing pad
+		 * set top bit of m6 to indicate an fsmportsspec */
 		SetCustomFSMportsSpecIndex(st->xy, fsmportspecindex);
 	}
 }
@@ -2220,6 +2223,20 @@
 		}
 	}
 
+	if (CheckSavegameVersion(78)) {
+		Industry *i;
+		uint j;
+		FOR_ALL_INDUSTRIES(i) {
+			const IndustrySpec *indsp = GetIndustrySpec(i->type);
+			for (j = 0; j < lengthof(i->produced_cargo); j++) {
+				i->produced_cargo[j] = indsp->produced_cargo[j];
+			}
+			for (j = 0; j < lengthof(i->accepts_cargo); j++) {
+				i->accepts_cargo[j] = indsp->accepts_cargo[j];
+			}
+		}
+	}
+
 	UpdateAllWaypointSigns();
 	UpdateAllStationVirtCoord();
 
--- a/src/order.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/order.h	Sat Oct 06 21:16:00 2007 +0000
@@ -116,18 +116,18 @@
 	void FreeChain();
 };
 
-#define MAX_BACKUP_ORDER_COUNT 40
+struct BackuppedOrders {
+	BackuppedOrders() : order(NULL) { }
 
-struct BackuppedOrders {
 	VehicleID clone;
 	VehicleOrderID orderindex;
-	Order order[MAX_BACKUP_ORDER_COUNT + 1];
+	Order *order;
 	uint16 service_interval;
 	char name[32];
 };
 
 VARDEF TileIndex _backup_orders_tile;
-VARDEF BackuppedOrders _backup_orders_data[1];
+VARDEF BackuppedOrders _backup_orders_data;
 
 static inline VehicleOrderID GetMaxOrderIndex()
 {
@@ -200,8 +200,8 @@
 }
 
 /* Functions */
-void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *order);
-void RestoreVehicleOrders(const Vehicle* v, const BackuppedOrders* order);
+void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *order = &_backup_orders_data);
+void RestoreVehicleOrders(const Vehicle *v, const BackuppedOrders *order = &_backup_orders_data);
 void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination);
 void InvalidateVehicleOrder(const Vehicle *v);
 bool VehicleHasDepotOrders(const Vehicle *v);
--- a/src/order_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/order_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -19,6 +19,7 @@
 #include "vehicle_gui.h"
 #include "cargotype.h"
 #include "strings.h"
+#include "aircraft.h"
 
 DEFINE_OLD_POOL_GENERIC(Order, Order)
 
@@ -198,7 +199,9 @@
 					break;
 
 				case VEH_AIRCRAFT:
-					if (!(st->facilities & FACIL_AIRPORT)) return CMD_ERROR;
+					if (!(st->facilities & FACIL_AIRPORT) || !CanAircraftUseStation(v->engine_type, st)) {
+						return CMD_ERROR;
+					}
 					break;
 
 				default: return CMD_ERROR;
@@ -239,7 +242,8 @@
 
 				if (!CheckOwnership(st->owner) ||
 						!(st->facilities & FACIL_AIRPORT) ||
-						st->Airport()->num_depots == 0) {
+						st->Airport()->num_depots == 0 ||
+						!CanAircraftUseStation(v->engine_type, st)) {
 					return CMD_ERROR;
 				}
 			} else {
@@ -317,10 +321,6 @@
 
 	if (!HasOrderPoolFree(1)) return_cmd_error(STR_8831_NO_MORE_SPACE_FOR_ORDERS);
 
-	/* XXX - This limit is only here because the backuppedorders can't
-	 * handle any more then this.. */
-	if (v->num_orders >= MAX_BACKUP_ORDER_COUNT) return_cmd_error(STR_8832_TOO_MANY_ORDERS);
-
 	if (v->type == VEH_SHIP &&
 			IsHumanPlayer(v->owner) &&
 			!_patches.new_pathfinding_all) {
@@ -920,6 +920,10 @@
  */
 void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *bak)
 {
+	/* Make sure we always have freed the stuff */
+	free(bak->order);
+	bak->order = NULL;
+
 	/* Save general info */
 	bak->orderindex       = v->cur_order_index;
 	bak->service_interval = v->service_interval;
@@ -939,13 +943,21 @@
 		bak->clone = u->index;
 	} else {
 		/* Else copy the orders */
-		Order *order, *dest;
-
-		dest = bak->order;
 
 		/* We do not have shared orders */
 		bak->clone = INVALID_VEHICLE;
 
+
+		/* Count the number of orders */
+		uint cnt = 0;
+		const Order *order;
+		FOR_VEHICLE_ORDERS(v, order) cnt++;
+
+		/* Allocate memory for the orders plus an end-of-orders marker */
+		bak->order = MallocT<Order>(cnt + 1);
+
+		Order *dest = bak->order;
+
 		/* Copy the orders */
 		FOR_VEHICLE_ORDERS(v, order) {
 			*dest = *order;
@@ -961,12 +973,10 @@
  * Restore vehicle orders that are backupped via BackupVehicleOrders
  *
  */
-void RestoreVehicleOrders(const Vehicle* v, const BackuppedOrders* bak)
+void RestoreVehicleOrders(const Vehicle *v, const BackuppedOrders *bak)
 {
-	uint i;
-
 	/* If we have a custom name, process that */
-	if (bak->name[0] != 0) {
+	if (!StrEmpty(bak->name)) {
 		_cmd_text = bak->name;
 		DoCommandP(0, v->index, 0, NULL, CMD_NAME_VEHICLE);
 	}
@@ -981,7 +991,7 @@
 	 *  order number is one more than the current amount of orders, and because
 	 *  in network the commands are queued before send, the second insert always
 	 *  fails in test mode. By bypassing the test-mode, that no longer is a problem. */
-	for (i = 0; bak->order[i].IsValid(); i++) {
+	for (uint i = 0; bak->order[i].IsValid(); i++) {
 		if (!DoCommandP(0, v->index + (i << 16), PackOrder(&bak->order[i]), NULL, CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK))
 			break;
 	}
@@ -1032,7 +1042,7 @@
 	switch (v->type) {
 		default: NOT_REACHED();
 		case VEH_TRAIN:     return st->train_tile;
-		case VEH_AIRCRAFT:  return st->airport_tile;
+		case VEH_AIRCRAFT:  return CanAircraftUseStation(v->engine_type, st) ? st->airport_tile : 0;
 		case VEH_SHIP:      return st->dock_tile;
 		case VEH_ROAD:
 			if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) {
--- a/src/order_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/order_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -355,7 +355,7 @@
 {
 	if (u->type != v->type) return false;
 
-	if (u->HasFront() && !u->IsPrimaryVehicle()) {
+	if (!u->IsPrimaryVehicle()) {
 		u = u->First();
 		if (!u->IsPrimaryVehicle()) return false;
 	}
--- a/src/ottdres.rc	Thu Sep 06 19:42:48 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-//Microsoft Developer Studio generated resource script.
-//
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "resource.h"
-#define APSTUDIO_HIDDEN_SYMBOLS
-#include "windows.h"
-#undef APSTUDIO_HIDDEN_SYMBOLS
-#ifdef MSVC
-#include "winres.h"
-#else
-#include "afxres.h"
-#endif
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// Neutral (Default) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUD)
-#ifdef _WIN32
-LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT
-#pragma code_page(1252)
-#endif //_WIN32
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-100                     ICON    DISCARDABLE     "../media/openttd.ico"
-101                     ICON    DISCARDABLE     "../media/mainicon.ico"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-100 DIALOG DISCARDABLE  0, 0, 305, 77
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Fatal Application Failure"
-FONT 8, "MS Sans Serif"
-BEGIN
-    PUSHBUTTON      "&Close",12,7,58,50,14
-    PUSHBUTTON      "&Submit report",14,81,58,68,14,WS_DISABLED
-    PUSHBUTTON      "&Emergency save",13,155,58,68,14
-    PUSHBUTTON      "",15,243,58,55,14
-    EDITTEXT        11,7,79,291,118,ES_MULTILINE | ES_READONLY | WS_VSCROLL |
-                    WS_HSCROLL | NOT WS_TABSTOP
-    LTEXT           "",10,36,7,262,43
-    ICON            100,IDC_STATIC,9,9,20,20
-END
-
-
-#ifndef _MAC
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,5,99,0
- PRODUCTVERSION 0,5,99,0
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "000004b0"
-        BEGIN
-            VALUE "Comments", "This program is licensed under the GNU General Public License.\0"
-            VALUE "CompanyName", "OpenTTD Development Team\0"
-            VALUE "FileDescription", "OpenTTD\0"
-            VALUE "FileVersion", "Development Version\0"
-            VALUE "InternalName", "openttd\0"
-            VALUE "LegalCopyright", "Copyright © OpenTTD Developers 2002-2007. All Rights Reserved.\0"
-            VALUE "LegalTrademarks", "\0"
-            VALUE "OriginalFilename", "openttd.exe\0"
-            VALUE "PrivateBuild", "\0"
-            VALUE "ProductName", "OpenTTD\0"
-            VALUE "ProductVersion", "Development Version\0"
-            VALUE "SpecialBuild", "-\0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x0, 1200
-    END
-END
-
-#endif    // !_MAC
-
-#endif    // Neutral (Default) resources
-/////////////////////////////////////////////////////////////////////////////
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ottdres.rc.in	Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,107 @@
+//Microsoft Developer Studio generated resource script.
+//
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "resource.h"
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+#ifdef MSVC
+#include "winres.h"
+#else
+#include "afxres.h"
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Neutral (Default) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUD)
+#ifdef _WIN32
+LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+100                     ICON    DISCARDABLE     "../media/openttd.ico"
+101                     ICON    DISCARDABLE     "../media/mainicon.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+100 DIALOG DISCARDABLE  0, 0, 305, 77
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Fatal Application Failure"
+FONT 8, "MS Sans Serif"
+BEGIN
+    PUSHBUTTON      "&Close",12,7,58,50,14
+    PUSHBUTTON      "&Submit report",14,81,58,68,14,WS_DISABLED
+    PUSHBUTTON      "&Emergency save",13,155,58,68,14
+    PUSHBUTTON      "",15,243,58,55,14
+    EDITTEXT        11,7,79,291,118,ES_MULTILINE | ES_READONLY | WS_VSCROLL |
+                    WS_HSCROLL | NOT WS_TABSTOP
+    LTEXT           "",10,36,7,262,43
+    ICON            100,IDC_STATIC,9,9,20,20
+END
+
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 0,5,99,0
+ PRODUCTVERSION 0,5,99,0
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "000004b0"
+        BEGIN
+            VALUE "Comments", "This program is licensed under the GNU General Public License.\0"
+            VALUE "CompanyName", "OpenTTD Development Team\0"
+            VALUE "FileDescription", "OpenTTD\0"
+            VALUE "FileVersion", "Development @@VERSION@@\0"
+            VALUE "InternalName", "openttd\0"
+            VALUE "LegalCopyright", "Copyright © OpenTTD Developers 2002-2007. All Rights Reserved.\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "openttd.exe\0"
+            VALUE "PrivateBuild", "\0"
+            VALUE "ProductName", "OpenTTD\0"
+            VALUE "ProductVersion", "Development @@VERSION@@\0"
+            VALUE "SpecialBuild", "-\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x0, 1200
+    END
+END
+
+#endif    // !_MAC
+
+#endif    // Neutral (Default) resources
+/////////////////////////////////////////////////////////////////////////////
--- a/src/player_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/player_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -834,7 +834,7 @@
 			break;
 
 		case WE_PLACE_OBJ:
-			if (DoCommandP(e->we.place.tile, 0, 0, NULL, CMD_BUILD_COMPANY_HQ | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS)))
+			if (DoCommandP(e->we.place.tile, 0, 0, NULL, CMD_BUILD_COMPANY_HQ | CMD_NO_WATER | CMD_MSG(STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS)))
 				ResetObjectToPlace();
 				w->widget[PCW_WIDGET_BUILD_VIEW_HQ].type = WWT_PUSHTXTBTN; // this button can now behave as a normal push button
 				RaiseWindowButtons(w);
--- a/src/rail.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/rail.h	Sat Oct 06 21:16:00 2007 +0000
@@ -778,6 +778,7 @@
 	return bits != TRACK_BIT_HORZ && bits != TRACK_BIT_VERT;
 }
 
+void *UpdateTrainPowerProc(Vehicle *v, void *data);
 void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
 void DrawDefaultWaypointSprite(int x, int y, RailType railtype);
 
@@ -787,6 +788,7 @@
  * @see DrawCatenaryRailway
  */
 void DrawCatenary(const TileInfo *ti);
+void DrawCatenaryOnTunnel(const TileInfo *ti);
 
 Foundation GetRailFoundation(Slope tileh, TrackBits bits);
 
--- a/src/rail_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/rail_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -34,10 +34,12 @@
 #include "railtypes.h" // include table for railtypes
 #include "newgrf.h"
 #include "yapf/yapf.h"
+#include "newgrf_engine.h"
 #include "newgrf_callbacks.h"
 #include "newgrf_station.h"
 #include "train.h"
 #include "misc/autoptr.hpp"
+#include "autoslope.h"
 
 const byte _track_sloped_sprites[14] = {
 	14, 15, 22, 13,
@@ -218,8 +220,11 @@
 {
 	if (IsSteepSlope(tileh)) {
 		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;
+			/* There may only be one track on steep slopes. (Autoslope calls with multiple bits in rail_bits) */
+			if (KILL_FIRST_BIT(rail_bits & TRACK_BIT_MASK) == 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;
@@ -1024,6 +1029,18 @@
 
 typedef CommandCost DoConvertRailProc(TileIndex tile, RailType totype, bool exec);
 
+void *UpdateTrainPowerProc(Vehicle *v, void *data)
+{
+	/* Similiar checks as in TrainPowerChanged() */
+
+	if (v->type == VEH_TRAIN && v->tile == *(TileIndex*)data && !IsArticulatedPart(v)) {
+		const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
+		if (GetVehicleProperty(v, 0x0B, rvi->power) != 0) TrainPowerChanged(v->First());
+	}
+
+	return NULL;
+}
+
 /**
  * Switches the rail type.
  * Railtypes are stored on a per-tile basis, not on a per-track basis, so
@@ -1036,15 +1053,6 @@
  */
 static CommandCost DoConvertRail(TileIndex tile, RailType totype, bool exec)
 {
-	if (!CheckTileOwnership(tile)) return CMD_ERROR;
-
-	if (GetRailType(tile) == totype) 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 */
-	if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
-
 	/* change type. */
 	if (exec) {
 		SetRailType(tile, totype);
@@ -1057,18 +1065,13 @@
 		}
 
 		if (IsTileDepotType(tile, TRANSPORT_RAIL)) {
-			Vehicle *v;
-
 			/* Update build vehicle window related to this depot */
+			InvalidateWindowData(WC_VEHICLE_DEPOT, tile);
 			InvalidateWindowData(WC_BUILD_VEHICLE, tile);
+		}
 
-			/* update power of trains in this depot */
-			FOR_ALL_VEHICLES(v) {
-				if (v->type == VEH_TRAIN && IsFrontEngine(v) && v->tile == tile && v->u.rail.track == 0x80) {
-					TrainPowerChanged(v);
-				}
-			}
-		}
+		/* update power of train engines on this tile */
+		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 	}
 
 	return CommandCost(_price.build_rail / 2);
@@ -1111,7 +1114,8 @@
 	for (x = sx; x <= ex; ++x) {
 		for (y = sy; y <= ey; ++y) {
 			TileIndex tile = TileXY(x, y);
-			DoConvertRailProc* proc;
+			DoConvertRailProc *proc;
+			RailType totype = (RailType)p2;
 
 			switch (GetTileType(tile)) {
 				case MP_RAILWAY:      proc = DoConvertRail;             break;
@@ -1121,7 +1125,22 @@
 				default: continue;
 			}
 
-			ret = proc(tile, (RailType)p2, false);
+			/* It is possible that 'type' is invalid when there is no rail on the tile,
+			 * but this situation will be detected in proc()
+			 */
+			RailType type = GetRailType(tile);
+
+			/* Not own tile or track is already converted */
+			if ((!CheckTileOwnership(tile) || type == totype) ||
+				/* 'hidden' elrails can't be downgraded to normal rail when elrails are disabled */
+				(_patches.disable_elrails && totype == RAILTYPE_RAIL && type == RAILTYPE_ELECTRIC) ||
+				/* Vehicle on a tile while not converting Rail <-> ElRail */
+				(!IsCompatibleRail(type, totype) && !EnsureNoVehicleOnGround(tile))) {
+					ret = CMD_ERROR;
+					continue;
+			}
+
+			ret = proc(tile, totype, false);
 			if (CmdFailed(ret)) continue;
 
 			if (flags & DC_EXEC) {
@@ -1130,7 +1149,7 @@
 					_additional_cash_required = ret.GetCost();
 					return cost;
 				}
-				proc(tile, (RailType)p2, true);
+				proc(tile, totype, true);
 			}
 			cost.AddCost(ret);
 		}
@@ -1244,7 +1263,7 @@
 		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));
+	AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, GetSlopeZ(x,y));
 }
 
 static uint32 _drawtile_track_palette;
@@ -1499,7 +1518,7 @@
 				const Station* st = ComposeWaypointStation(ti->tile);
 				uint gfx = 2;
 
-				if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
+				if (HASBIT(statspec->callbackmask, CBM_STATION_SPRITE_LAYOUT)) {
 					uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0, 0, statspec, st, ti->tile);
 					if (callback != CALLBACK_FAILED) gfx = callback;
 				}
@@ -2175,15 +2194,62 @@
 	return VETSB_CONTINUE;
 }
 
+/**
+ * Tests if autoslope is allowed.
+ *
+ * @param tile The tile.
+ * @param flags Terraform command flags.
+ * @param z_old Old TileZ.
+ * @param tileh_old Old TileSlope.
+ * @param z_new New TileZ.
+ * @param tileh_new New TileSlope.
+ * @param rail_bits Trackbits.
+ */
+static CommandCost TestAutoslopeOnRailTile(TileIndex tile, uint flags, uint z_old, Slope tileh_old, uint z_new, Slope tileh_new, TrackBits rail_bits)
+{
+	if (!_patches.build_on_slopes || !AutoslopeEnabled()) return CMD_ERROR;
+
+	/* Is the slope-rail_bits combination valid in general? I.e. is it save to call GetRailFoundation() ? */
+	if (CmdFailed(CheckRailSlope(tileh_new, rail_bits, TRACK_BIT_NONE, tile))) return CMD_ERROR;
+
+	/* Get the slopes on top of the foundations */
+	z_old += ApplyFoundationToSlope(GetRailFoundation(tileh_old, rail_bits), &tileh_old);
+	z_new += ApplyFoundationToSlope(GetRailFoundation(tileh_new, rail_bits), &tileh_new);
+
+	Slope track_corner;
+	switch (rail_bits) {
+		case TRACK_BIT_LEFT:  track_corner = SLOPE_W; break;
+		case TRACK_BIT_LOWER: track_corner = SLOPE_S; break;
+		case TRACK_BIT_RIGHT: track_corner = SLOPE_E; break;
+		case TRACK_BIT_UPPER: track_corner = SLOPE_N; break;
+
+		/* Surface slope must not be changed */
+		default: return (((z_old != z_new) || (tileh_old != tileh_new)) ? CMD_ERROR : _price.terraform);
+	}
+
+	/* The height of the track_corner must not be changed. The rest ensures GetRailFoundation() already. */
+	if ((tileh_old & track_corner) != 0) z_old += TILE_HEIGHT;
+	if ((tileh_new & track_corner) != 0) z_new += TILE_HEIGHT;
+	if (z_old != z_new) return CMD_ERROR;
+
+	/* Make the ground dirty, if surface slope has changed */
+	if ((tileh_old != tileh_new) && ((flags & DC_EXEC) != 0)) SetRailGroundType(tile, RAIL_GROUND_BARREN);
+
+	return _price.terraform;
+}
+
 static CommandCost TerraformTile_Track(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
 {
+	uint z_old;
+	Slope tileh_old = GetTileSlope(tile, &z_old);
 	if (IsPlainRailTile(tile)) {
-		uint z_old;
-		Slope tileh_old = GetTileSlope(tile, &z_old);
 		TrackBits rail_bits = GetTrackBits(tile);
 
 		_error_message = STR_1008_MUST_REMOVE_RAILROAD_TRACK;
 
+		/* First test autoslope. However if it succeeds we still have to test the rest, because non-autoslope terraforming is cheaper. */
+		CommandCost autoslope_result = TestAutoslopeOnRailTile(tile, flags, z_old, tileh_old, z_new, tileh_new, rail_bits);
+
 		/* When there is only a single horizontal/vertical track, one corner can be terraformed. */
 		Slope allowed_corner;
 		switch (rail_bits) {
@@ -2191,7 +2257,7 @@
 			case TRACK_BIT_UPPER: allowed_corner = SLOPE_S; break;
 			case TRACK_BIT_LEFT:  allowed_corner = SLOPE_E; break;
 			case TRACK_BIT_LOWER: allowed_corner = SLOPE_N; break;
-			default: return CMD_ERROR;
+			default: return autoslope_result;
 		}
 
 		Slope track_corners = ComplementSlope(allowed_corner);
@@ -2207,28 +2273,28 @@
 					z_new += TILE_HEIGHT;
 				} else {
 					/* do not build a foundation */
-					if ((tileh_new != SLOPE_FLAT) && (tileh_new != allowed_corner)) return CMD_ERROR;
+					if ((tileh_new != SLOPE_FLAT) && (tileh_new != allowed_corner)) return autoslope_result;
 				}
 
 				/* Track height must remain unchanged */
-				if (z_old != z_new) return CMD_ERROR;
+				if (z_old != z_new) return autoslope_result;
 				break;
 
 			case FOUNDATION_LEVELED:
 				/* Is allowed_corner covered by the foundation? */
-				if ((tileh_old & allowed_corner) == 0) return CMD_ERROR;
+				if ((tileh_old & allowed_corner) == 0) return autoslope_result;
 
 				/* allowed_corner may only be raised -> steep slope */
-				if ((z_old != z_new) || (tileh_new != (tileh_old | SLOPE_STEEP))) return CMD_ERROR;
+				if ((z_old != z_new) || (tileh_new != (tileh_old | SLOPE_STEEP))) return autoslope_result;
 				break;
 
 			case FOUNDATION_STEEP_LOWER:
 				/* Only allow to lower highest corner */
-				if ((z_old != z_new) || (tileh_new != (tileh_old & ~SLOPE_STEEP))) return CMD_ERROR;
+				if ((z_old != z_new) || (tileh_new != (tileh_old & ~SLOPE_STEEP))) return autoslope_result;
 				break;
 
 			case FOUNDATION_STEEP_HIGHER:
-				return CMD_ERROR;
+				return autoslope_result;
 
 			default: NOT_REACHED();
 		}
@@ -2238,6 +2304,22 @@
 
 		/* allow terraforming, no extra costs */
 		return CommandCost();
+	} else {
+		if (_patches.build_on_slopes && AutoslopeEnabled()) {
+			switch (GetRailTileType(tile)) {
+				case RAIL_TILE_WAYPOINT: {
+					CommandCost cost = TestAutoslopeOnRailTile(tile, flags, z_old, tileh_old, z_new, tileh_new, GetRailWaypointBits(tile));
+					if (!CmdFailed(cost)) return cost; // allow autoslope
+					break;
+				}
+
+				case RAIL_TILE_DEPOT:
+					if (AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, GetRailDepotDirection(tile))) return _price.terraform;
+					break;
+
+				default: NOT_REACHED();
+			}
+		}
 	}
 	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 }
--- a/src/rail_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/rail_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -66,8 +66,8 @@
 {
 	DoCommandP(tile, _cur_railtype, cmd, CcPlaySound1E,
 		_remove_button_clicked ?
-		CMD_REMOVE_SINGLE_RAIL | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) | CMD_AUTO | CMD_NO_WATER :
-		CMD_BUILD_SINGLE_RAIL | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK) | CMD_AUTO | CMD_NO_WATER
+		CMD_REMOVE_SINGLE_RAIL | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) | CMD_NO_WATER :
+		CMD_BUILD_SINGLE_RAIL | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK) | CMD_NO_WATER
 	);
 }
 
@@ -103,7 +103,7 @@
 	if (GetRailTileType(tile) != RAIL_TILE_NORMAL) return;
 	if ((GetTrackBits(tile) & GB(extra, 8, 8)) == 0) return;
 
-	DoCommandP(tile, _cur_railtype, extra & 0xFF, NULL, CMD_BUILD_SINGLE_RAIL | CMD_AUTO | CMD_NO_WATER);
+	DoCommandP(tile, _cur_railtype, extra & 0xFF, NULL, CMD_BUILD_SINGLE_RAIL | CMD_NO_WATER);
 }
 
 static const uint16 _place_depot_extra[12] = {
@@ -134,7 +134,7 @@
 static void PlaceRail_Depot(TileIndex tile)
 {
 	DoCommandP(tile, _cur_railtype, _build_depot_direction, CcRailDepot,
-		CMD_BUILD_TRAIN_DEPOT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_100E_CAN_T_BUILD_TRAIN_DEPOT));
+		CMD_BUILD_TRAIN_DEPOT | CMD_NO_WATER | CMD_MSG(STR_100E_CAN_T_BUILD_TRAIN_DEPOT));
 }
 
 static void PlaceRail_Waypoint(TileIndex tile)
@@ -166,7 +166,7 @@
 		DoCommandP(tile,
 				_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));
+				CMD_BUILD_RAILROAD_STATION | CMD_NO_WATER | CMD_MSG(STR_100F_CAN_T_BUILD_RAILROAD_STATION));
 	}
 }
 
@@ -190,10 +190,10 @@
 		SB(p1, 4, 1, _cur_year < _patches.semaphore_build_before);
 
 		DoCommandP(tile, p1, 0, CcPlaySound1E,
-			CMD_BUILD_SIGNALS | CMD_AUTO | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE));
+			CMD_BUILD_SIGNALS | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE));
 	} else {
 		DoCommandP(tile, track, 0, CcPlaySound1E,
-			CMD_REMOVE_SIGNALS | CMD_AUTO | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM));
+			CMD_REMOVE_SIGNALS | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM));
 	}
 }
 
@@ -215,12 +215,12 @@
 static void PlaceRail_Tunnel(TileIndex tile)
 {
 	DoCommandP(tile, _cur_railtype, 0, CcBuildRailTunnel,
-		CMD_BUILD_TUNNEL | CMD_AUTO | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE));
+		CMD_BUILD_TUNNEL | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE));
 }
 
 void PlaceProc_BuyLand(TileIndex tile)
 {
-	DoCommandP(tile, 0, 0, CcPlaySound1E, CMD_PURCHASE_LAND_AREA | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_5806_CAN_T_PURCHASE_THIS_LAND));
+	DoCommandP(tile, 0, 0, CcPlaySound1E, CMD_PURCHASE_LAND_AREA | CMD_NO_WATER | CMD_MSG(STR_5806_CAN_T_PURCHASE_THIS_LAND));
 }
 
 static void PlaceRail_ConvertRail(TileIndex tile)
@@ -346,8 +346,8 @@
 {
 	DoCommandP(TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), _cur_railtype | (mode << 4), NULL,
 		_remove_button_clicked ?
-		CMD_REMOVE_RAILROAD_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) :
-		CMD_BUILD_RAILROAD_TRACK  | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK)
+		CMD_REMOVE_RAILROAD_TRACK | CMD_NO_WATER | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) :
+		CMD_BUILD_RAILROAD_TRACK  | CMD_NO_WATER | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK)
 	);
 }
 
@@ -388,8 +388,8 @@
 		p2,
 		CcPlaySound1E,
 		_remove_button_clicked ?
-			CMD_REMOVE_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM) :
-			CMD_BUILD_SIGNAL_TRACK  | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE)
+			CMD_REMOVE_SIGNAL_TRACK | CMD_NO_WATER | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM) :
+			CMD_BUILD_SIGNAL_TRACK  | CMD_NO_WATER | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE)
 	);
 }
 
@@ -671,7 +671,7 @@
 	DoCommandP(TileXY(sx, sy),
 			_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));
+			CMD_BUILD_RAILROAD_STATION | CMD_NO_WATER | CMD_MSG(STR_100F_CAN_T_BUILD_RAILROAD_STATION));
 }
 
 /* Check if the currently selected station size is allowed */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/rev.cpp.in	Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,4 @@
+extern const char _openttd_revision[] = "@@VERSION@@";
+#ifdef __MORPHOS__
+extern const char morphos_versions_tag[] = "\\0$VER: OpenTTD @@VERSION@@ (@@DATE@@)  OpenTTD Team [MorphOS, PowerPC]";
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/road.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,69 @@
+#include "stdafx.h"
+#include "openttd.h"
+#include "functions.h"
+#include "rail_map.h"
+#include "road.h"
+#include "road_map.h"
+#include "water_map.h"
+#include "macros.h"
+
+bool IsPossibleCrossing(const TileIndex tile, Axis ax)
+{
+	return (IsTileType(tile, MP_RAILWAY) &&
+		!HasSignals(tile) &&
+		GetTrackBits(tile) == (ax == AXIS_X ?  TRACK_BIT_Y : TRACK_BIT_X) &&
+		GetTileSlope(tile, NULL) == SLOPE_FLAT);
+}
+
+RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb)
+{
+	for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
+		const TileIndex neighbor_tile = TileAddByDiagDir(tile, dir);
+
+		/* Get the Roadbit pointing to the neighbor_tile */
+		const RoadBits target_rb = DiagDirToRoadBits(dir);
+
+		/* If the roadbit is in the current plan */
+		if (org_rb & target_rb) {
+			bool connective = false;
+			const RoadBits mirrored_rb = MirrorRoadBits(target_rb);
+
+			switch (GetTileType(neighbor_tile)) {
+				/* Allways connective ones */
+				case MP_CLEAR: case MP_TREES:
+					connective = true;
+					break;
+
+				/* The conditionaly connective ones */
+				case MP_TUNNELBRIDGE:
+				case MP_STATION:
+				case MP_ROAD: {
+					const RoadBits neighbor_rb = GetAnyRoadBits(neighbor_tile, ROADTYPE_ROAD) | GetAnyRoadBits(neighbor_tile, ROADTYPE_TRAM);
+
+					/* Accept only connective tiles */
+					connective = (neighbor_rb & mirrored_rb) || // Neighbor has got the fitting RoadBit
+							COUNTBITS(neighbor_rb) == 1; // Neighbor has got only one Roadbit
+
+				} break;
+
+				case MP_RAILWAY:
+					connective = IsPossibleCrossing(neighbor_tile, DiagDirToAxis(dir));
+					break;
+
+				case MP_WATER:
+					/* Check for real water tile */
+					connective = !IsWater(neighbor_tile);
+					break;
+
+				/* The defentetly not connective ones */
+				default: break;
+			}
+
+			/* If the neighbor tile is inconnective remove the planed road connection to it */
+			if (!connective) org_rb ^= target_rb;
+
+		}
+	}
+
+	return org_rb;
+}
--- a/src/road.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/road.h	Sat Oct 06 21:16:00 2007 +0000
@@ -116,6 +116,36 @@
 }
 
 /**
+ * Calculate the mirrored RoadBits
+ *
+ * Simply move the bits to their new position.
+ *
+ * @param r The given RoadBits value
+ * @return the mirrored
+ */
+static inline RoadBits MirrorRoadBits(RoadBits r)
+{
+	return (RoadBits)(GB(r, 0, 2) << 2 | GB(r, 2, 2));
+}
+
+/**
+ * Calculate rotated RoadBits
+ *
+ * Move the Roadbits clockwise til they are in their final position.
+ *
+ * @param r The given RoadBits value
+ * @param rot The given Rotation angle
+ * @return the rotated
+ */
+static inline RoadBits RotateRoadBits(RoadBits r, DiagDirDiff rot)
+{
+	for (; rot > (DiagDirDiff)0; rot--){
+		r = (RoadBits)(GB(r, 0, 1) << 3 | GB(r, 1, 3));
+	}
+	return r;
+}
+
+/**
  * Create the road-part which belongs to the given DiagDirection
  *
  * This function returns a RoadBits value which belongs to
@@ -126,10 +156,20 @@
  */
 static inline RoadBits DiagDirToRoadBits(DiagDirection d)
 {
-	return (RoadBits)(1U << (3 ^ d));
+	return (RoadBits)(ROAD_NW << (3 ^ d));
 }
 
 /**
+ * Return if the tile is a valid tile for a crossing.
+ *
+ * @note function is overloaded
+ * @param tile the curent tile
+ * @param ax the axis of the road over the rail
+ * @return true if it is a valid tile
+ */
+bool IsPossibleCrossing(const TileIndex tile, Axis ax);
+
+/**
  * Checks whether the trackdir means that we are reversing.
  * @param dir the trackdir to check
  * @return true if it is a reversing road trackdir
@@ -150,6 +190,14 @@
 }
 
 /**
+ * Clean up unneccesary RoadBits of a planed tile.
+ * @param tile current tile
+ * @param org_rb planed RoadBits
+ * @return optimised RoadBits
+ */
+RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb);
+
+/**
  * Is it allowed to remove the given road bits from the given tile?
  * @param tile      the tile to remove the road from
  * @param remove    the roadbits that are going to be removed
--- a/src/road_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/road_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -32,6 +32,12 @@
 #include "station_map.h"
 #include "tunnel_map.h"
 #include "misc/autoptr.hpp"
+#include "autoslope.h"
+
+#define M(x) (1 << (x))
+/* Level crossings may only be built on these slopes */
+static const uint32 VALID_LEVEL_CROSSING_SLOPES = (M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT));
+#undef M
 
 bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt)
 {
@@ -198,10 +204,12 @@
 				if (present == ROAD_NONE) {
 					RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
 					if (rts == ROADTYPES_NONE) {
+						/* Includes MarkTileDirtyByTile() */
 						DoClearSquare(tile);
 					} else {
 						SetRoadBits(tile, ROAD_NONE, rt);
 						SetRoadTypes(tile, rts);
+						MarkTileDirtyByTile(tile);
 					}
 				} else {
 					/* When bits are removed, you *always* end up with something that
@@ -251,70 +259,121 @@
 static const RoadBits _valid_tileh_slopes_road[][15] = {
 	/* set of normal ones */
 	{
-		ROAD_ALL, ROAD_NONE, ROAD_NONE,
-		ROAD_X,   ROAD_NONE, ROAD_NONE,  // 3, 4, 5
-		ROAD_Y,   ROAD_NONE, ROAD_NONE,
-		ROAD_Y,   ROAD_NONE, ROAD_NONE,  // 9, 10, 11
-		ROAD_X,   ROAD_NONE, ROAD_NONE
+		ROAD_ALL,  // SLOPE_FLAT
+		ROAD_NONE, // SLOPE_W
+		ROAD_NONE, // SLOPE_S
+
+		ROAD_X,    // SLOPE_SW
+		ROAD_NONE, // SLOPE_E
+		ROAD_NONE, // SLOPE_EW
+
+		ROAD_Y,    // SLOPE_SE
+		ROAD_NONE, // SLOPE_WSE
+		ROAD_NONE, // SLOPE_N
+
+		ROAD_Y,    // SLOPE_NW
+		ROAD_NONE, // SLOPE_NS
+		ROAD_NONE, // SLOPE_NE
+
+		ROAD_X,    // SLOPE_ENW
+		ROAD_NONE, // SLOPE_SEN
+		ROAD_NONE  // SLOPE_ELEVATED
 	},
 	/* allowed road for an evenly raised platform */
 	{
-		ROAD_NONE,
-		ROAD_SW | ROAD_NW,
-		ROAD_SW | ROAD_SE,
-		ROAD_Y  | ROAD_SW,
+		ROAD_NONE,         // SLOPE_FLAT
+		ROAD_SW | ROAD_NW, // SLOPE_W
+		ROAD_SW | ROAD_SE, // SLOPE_S
 
-		ROAD_SE | ROAD_NE, // 4
-		ROAD_ALL,
-		ROAD_X  | ROAD_SE,
-		ROAD_ALL,
+		ROAD_Y  | ROAD_SW, // SLOPE_SW
+		ROAD_SE | ROAD_NE, // SLOPE_E
+		ROAD_ALL,          // SLOPE_EW
 
-		ROAD_NW | ROAD_NE, // 8
-		ROAD_X  | ROAD_NW,
-		ROAD_ALL,
-		ROAD_ALL,
+		ROAD_X  | ROAD_SE, // SLOPE_SE
+		ROAD_ALL,          // SLOPE_WSE
+		ROAD_NW | ROAD_NE, // SLOPE_N
 
-		ROAD_Y  | ROAD_NE, // 12
-		ROAD_ALL,
-		ROAD_ALL
+		ROAD_X  | ROAD_NW, // SLOPE_NW
+		ROAD_ALL,          // SLOPE_NS
+		ROAD_ALL,          // SLOPE_NE
+
+		ROAD_Y  | ROAD_NE, // SLOPE_ENW
+		ROAD_ALL,          // SLOPE_SEN
+		ROAD_ALL           // SLOPE_ELEVATED
+	},
+	/* Singe bits on slopes */
+	{
+		ROAD_ALL,          // SLOPE_FLAT
+		ROAD_NE | ROAD_SE, // SLOPE_W
+		ROAD_NE | ROAD_NW, // SLOPE_S
+
+		ROAD_NE,           // SLOPE_SW
+		ROAD_NW | ROAD_SW, // SLOPE_E
+		ROAD_ALL,          // SLOPE_EW
+
+		ROAD_NW,           // SLOPE_SE
+		ROAD_ALL,          // SLOPE_WSE
+		ROAD_SE | ROAD_SW, // SLOPE_N
+
+		ROAD_SE,           // SLOPE_NW
+		ROAD_ALL,          // SLOPE_NS
+		ROAD_ALL,          // SLOPE_NE
+
+		ROAD_SW,           // SLOPE_ENW
+		ROAD_ALL,          // SLOPE_SEN
+		ROAD_ALL,          // SLOPE_ELEVATED
 	},
 };
 
-
+/**
+ * Calculate the costs for roads on slopes
+ *  Aside modify the RoadBits to fit on the slopes
+ *
+ * @note The RoadBits are modified too!
+ * @param tileh The current slope
+ * @param pieces The RoadBits we want to add
+ * @param existing The existent RoadBits
+ * @return The costs for these RoadBits on this slope
+ */
 static CommandCost CheckRoadSlope(Slope tileh, RoadBits* pieces, RoadBits existing)
 {
-	RoadBits road_bits;
-
 	if (IsSteepSlope(tileh)) {
-		/* force full pieces. */
-		*pieces |= (RoadBits)((*pieces & 0xC) >> 2);
-		*pieces |= (RoadBits)((*pieces & 0x3) << 2);
+		/* Force straight roads. */
+		*pieces |= MirrorRoadBits(*pieces);
 
-		if (existing == 0 || existing == *pieces) {
+		if (existing == ROAD_NONE || existing == *pieces) {
 			if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform;
 		}
 		return CMD_ERROR;
 	}
-	road_bits = *pieces | existing;
+
+	RoadBits road_bits = *pieces | existing;
+
+	/* Single bits on slopes.
+	 * We check for the roads that need at least 2 bits */
+	if (_patches.build_on_slopes && !_is_old_ai_player &&
+			existing == ROAD_NONE && COUNTBITS(*pieces) == 1 &&
+			(_valid_tileh_slopes_road[2][tileh] & *pieces) == ROAD_NONE) {
+		return CommandCost(_price.terraform);
+	}
 
 	/* no special foundation */
-	if ((~_valid_tileh_slopes_road[0][tileh] & road_bits) == 0) {
+	if ((~_valid_tileh_slopes_road[0][tileh] & road_bits) == ROAD_NONE) {
 		/* force that all bits are set when we have slopes */
 		if (tileh != SLOPE_FLAT) *pieces |= _valid_tileh_slopes_road[0][tileh];
 		return CommandCost(); // no extra cost
 	}
 
 	/* foundation is used. Whole tile is leveled up */
-	if ((~_valid_tileh_slopes_road[1][tileh] & road_bits) == 0) {
-		return CommandCost(existing != 0 ? 0 : _price.terraform);
+	if ((~_valid_tileh_slopes_road[1][tileh] & road_bits) == ROAD_NONE) {
+		return CommandCost(existing != ROAD_NONE ? 0 : _price.terraform);
 	}
 
-	*pieces |= (RoadBits)((*pieces & 0xC) >> 2);
-	*pieces |= (RoadBits)((*pieces & 0x3) << 2);
+	/* Force straight roads. */
+	*pieces |= MirrorRoadBits(*pieces);
 
 	/* partly leveled up tile, only if there's no road on that tile */
-	if ((existing == 0 || existing == *pieces) && (tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)) {
-		/* force full pieces. */
+	if ((existing == ROAD_NONE || existing == *pieces) && (tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)) {
 		if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform;
 	}
 	return CMD_ERROR;
@@ -403,12 +462,10 @@
 				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 			}
 
-#define M(x) (1 << (x))
 			/* Level crossings may only be built on these slopes */
-			if (!HASBIT(M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT), tileh)) {
+			if (!HASBIT(VALID_LEVEL_CROSSING_SLOPES, tileh)) {
 				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 			}
-#undef M
 
 			if (GetRailTileType(tile) != RAIL_TILE_NORMAL) goto do_clear;
 			switch (GetTrackBits(tile)) {
@@ -541,18 +598,11 @@
 	/* not a railroad crossing? */
 	if (!IsLevelCrossing(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 */
-	if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
-
 	if (exec) {
 		SetRailType(tile, totype);
 		MarkTileDirtyByTile(tile);
 		YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetCrossingRailBits(tile)));
+		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 	}
 
 	return CommandCost(_price.build_rail / 2);
@@ -603,7 +653,7 @@
 	/* 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;
+	if (HASBIT(p2, 2) == (start_tile == end_tile && HASBIT(p2, 0) == HASBIT(p2, 1))) drd ^= DRD_BOTH;
 	/* No disallowed direction bits have to be toggled */
 	if (!HASBIT(p2, 5)) drd = DRD_NONE;
 
@@ -786,10 +836,9 @@
 		case ROAD_TILE_NORMAL: {
 			RoadBits b = GetAllRoadBits(tile);
 
-#define M(x) (1 << (x))
 			/* Clear the road if only one piece is on the tile OR the AI tries
 			 * to clear town road OR we are not using the DC_AUTO flag */
-			if ((M(b) & (M(ROAD_NW) | M(ROAD_SW) | M(ROAD_SE) | M(ROAD_NE))) ||
+			if ((COUNTBITS(b) == 1 && GetRoadBits(tile, ROADTYPE_TRAM) == ROAD_NONE) ||
 			    ((flags & DC_AI_BUILDING) && IsTileOwner(tile, OWNER_TOWN)) ||
 			    !(flags & DC_AUTO)
 				) {
@@ -806,7 +855,6 @@
 			}
 			return_cmd_error(STR_1801_MUST_REMOVE_ROAD_FIRST);
 		}
-#undef M
 
 		case ROAD_TILE_CROSSING: {
 			RoadTypes rts = GetRoadTypes(tile);
@@ -915,8 +963,8 @@
 		front = SPR_TRAMWAY_BASE + _road_frontwire_sprites_1[tram];
 	}
 
-	AddSortableSpriteToDraw(back,  PAL_NONE, ti->x, ti->y, 16, 16, 0x1F, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS));
-	AddSortableSpriteToDraw(front, PAL_NONE, ti->x, ti->y, 16, 16, 0x1F, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS));
+	AddSortableSpriteToDraw(back,  PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS));
+	AddSortableSpriteToDraw(front, PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS));
 }
 
 /**
@@ -1183,8 +1231,8 @@
 
 	if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) return;
 
+	const Town* t = ClosestTownFromTile(tile, (uint)-1);
 	if (!HasRoadWorks(tile)) {
-		const Town* t = ClosestTownFromTile(tile, (uint)-1);
 		int grp = 0;
 
 		if (t != NULL) {
@@ -1193,8 +1241,8 @@
 			/* 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 && (GetAllRoadBits(tile) == ROAD_X || GetAllRoadBits(tile) == ROAD_Y)) {
-				if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicleOnGround(tile) && CHANCE16(1, 20)) {
+					GetRoadTileType(tile) == ROAD_TILE_NORMAL && COUNTBITS(GetAllRoadBits(tile)) > 1 ) {
+				if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicleOnGround(tile) && CHANCE16(1, 40)) {
 					StartRoadWorks(tile);
 
 					SndPlayTileFx(SND_21_JACKHAMMER, tile);
@@ -1232,6 +1280,17 @@
 		}
 	} else if (IncreaseRoadWorksCounter(tile)) {
 		TerminateRoadWorks(tile);
+
+		if (_patches.mod_road_rebuild) {
+			/* Generate a nicer town surface */
+			const RoadBits old_rb = GetAnyRoadBits(tile, ROADTYPE_ROAD);
+			const RoadBits new_rb = CleanUpRoadBits(tile, old_rb);
+
+			if (old_rb != new_rb) {
+				DoCommand(tile, (old_rb ^ new_rb), t->index, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_REMOVE_ROAD);
+			}
+		}
+
 		MarkTileDirtyByTile(tile);
 	}
 }
@@ -1377,6 +1436,41 @@
 
 static CommandCost TerraformTile_Road(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
 {
+	if (_patches.build_on_slopes && AutoslopeEnabled()) {
+		switch (GetRoadTileType(tile)) {
+			case ROAD_TILE_CROSSING:
+				if (!IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new)) && HASBIT(VALID_LEVEL_CROSSING_SLOPES, tileh_new)) return _price.terraform;
+				break;
+
+			case ROAD_TILE_DEPOT:
+				if (AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, GetRoadDepotDirection(tile))) return _price.terraform;
+				break;
+
+			case ROAD_TILE_NORMAL: {
+				RoadBits bits = GetAllRoadBits(tile);
+				RoadBits bits_copy = bits;
+				/* Check if the slope-road_bits combination is valid at all, i.e. it is save to call GetRoadFoundation(). */
+				if (!CmdFailed(CheckRoadSlope(tileh_new, &bits_copy, ROAD_NONE))) {
+					/* CheckRoadSlope() sometimes changes the road_bits, if it does not agree with them. */
+					if (bits == bits_copy) {
+						uint z_old;
+						Slope tileh_old = GetTileSlope(tile, &z_old);
+
+						/* Get the slope on top of the foundation */
+						z_old += ApplyFoundationToSlope(GetRoadFoundation(tileh_old, bits), &tileh_old);
+						z_new += ApplyFoundationToSlope(GetRoadFoundation(tileh_new, bits), &tileh_new);
+
+						/* The surface slope must not be changed */
+						if ((z_old == z_new) && (tileh_old == tileh_new)) return _price.terraform;
+					}
+				}
+				break;
+			}
+
+			default: NOT_REACHED();
+		}
+	}
+
 	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 }
 
--- a/src/road_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/road_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -115,7 +115,7 @@
 
 static void PlaceRoad_Tunnel(TileIndex tile)
 {
-	DoCommandP(tile, 0x200 | RoadTypeToRoadTypes(_cur_roadtype), 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_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE));
 }
 
 static void BuildRoadOutsideStation(TileIndex tile, DiagDirection direction)
@@ -143,7 +143,7 @@
 
 static void PlaceRoad_Depot(TileIndex tile)
 {
-	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));
+	DoCommandP(tile, _cur_roadtype << 2 | _road_depot_orientation, 0, CcRoadDepot, CMD_BUILD_ROAD_DEPOT | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_depot));
 }
 
 static void PlaceRoadStop(TileIndex tile, uint32 p2, uint32 cmd)
@@ -162,7 +162,7 @@
 	if (_remove_button_clicked) {
 		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, (_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]));
+		PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::BUS, CMD_BUILD_ROAD_STOP | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::BUS]));
 	}
 }
 
@@ -171,7 +171,7 @@
 	if (_remove_button_clicked) {
 		DoCommandP(tile, 0, RoadStop::TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[RoadStop::TRUCK]));
 	} else {
-		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]));
+		PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::TRUCK]));
 	}
 }
 
@@ -347,8 +347,8 @@
 				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));
+						CMD_REMOVE_LONG_ROAD | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_road) :
+						CMD_BUILD_LONG_ROAD | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_road));
 					break;
 			}
 		}
--- a/src/roadveh.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/roadveh.h	Sat Oct 06 21:16:00 2007 +0000
@@ -69,7 +69,6 @@
 	ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_ROADVEH_INC : EXPENSES_ROADVEH_RUN; }
 	WindowClass GetVehicleListWindowClass() const { return WC_ROADVEH_LIST; }
 	bool IsPrimaryVehicle() const { return IsRoadVehFront(this); }
-	bool HasFront() const { return true; }
 	int GetImage(Direction direction) const;
 	int GetDisplaySpeed() const { return this->cur_speed * 10 / 32; }
 	int GetDisplayMaxSpeed() const { return this->max_speed * 10 / 32; }
--- a/src/roadveh_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/roadveh_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -179,11 +179,11 @@
 
 	if (HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM) != HASBIT(EngInfo(p1)->misc_flags, EF_ROAD_TRAM)) return_cmd_error(STR_DEPOT_WRONG_DEPOT_TYPE);
 
-	uint num_vehicles = 1 + CountArticulatedParts(p1);
+	uint num_vehicles = 1 + CountArticulatedParts(p1, false);
 
-	/* Allow for the front and up to 10 articulated parts. */
-	Vehicle *vl[11];
-	memset(&vl, 0, sizeof(vl));
+	/* Allow for the front and the articulated parts, plus one to "terminate" the list. */
+	Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
+	memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
 
 	if (!Vehicle::AllocateList(vl, num_vehicles)) {
 		return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
@@ -477,6 +477,7 @@
 			 * Now we change the setting to apply the new one and let the vehicle head for the same depot.
 			 * Note: the if is (true for requesting service == true for ordered to stop in depot) */
 			if (flags & DC_EXEC) {
+				CLRBIT(v->current_order.flags, OFB_PART_OF_ORDERS);
 				TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 			}
@@ -997,7 +998,7 @@
 	const Vehicle* u;
 	const Vehicle* v;
 	TileIndex tile;
-	byte tilebits;
+	uint16 tilebits;
 };
 
 static void* EnumFindVehToOvertake(Vehicle* v, void* data)
@@ -1013,9 +1014,10 @@
 {
 	uint32 bits;
 
-	bits = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes) & 0x3F;
+	bits = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes);
+	bits |= bits >> 8;
 
-	if (!(od->tilebits & bits) || (bits & 0x3C) || (bits & 0x3F3F0000))
+	if (!(od->tilebits & bits) || (bits & 0x3C3C) || (bits & 0x3F3F0000))
 		return true;
 	return VehicleFromPos(od->tile, od, EnumFindVehToOvertake) != NULL;
 }
@@ -1023,7 +1025,7 @@
 static void RoadVehCheckOvertake(Vehicle *v, Vehicle *u)
 {
 	OvertakeData od;
-	byte tt;
+	uint16 tt;
 
 	od.v = v;
 	od.u = u;
@@ -1037,6 +1039,9 @@
 	/* Trams can't overtake other trams */
 	if (v->u.road.roadtype == ROADTYPE_TRAM) return;
 
+	/* Don't overtake in stations */
+	if (IsTileType(v->tile, MP_STATION)) return;
+
 	/* For now, articulated road vehicles can't overtake anything. */
 	if (RoadVehHasArticPart(v)) return;
 
@@ -1045,7 +1050,10 @@
 	/* 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, v->u.road.compatible_roadtypes) & 0x3F;
+	tt = GetTileTrackStatus(v->tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
+	tt |= tt >> 8;
+	tt &= 0x3F;
+
 	if ((tt & 3) == 0) return;
 	if ((tt & 0x3C) != 0) return;
 
@@ -1646,9 +1654,9 @@
 		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);
+			if (v->u.road.overtaking == 0) v->cur_speed = u->cur_speed;
 			return false;
 		}
 	}
@@ -2022,7 +2030,7 @@
 
 		if (v->cargo_cap == 0) continue;
 
-		if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
+		if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
 			/* Back up the cargo type */
 			CargoID temp_cid = v->cargo_type;
 			byte temp_subtype = v->cargo_subtype;
--- a/src/roadveh_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/roadveh_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -19,6 +19,82 @@
 #include "vehicle_gui.h"
 #include "newgrf_engine.h"
 
+
+void DrawRoadVehDetails(const Vehicle *v, int x, int y)
+{
+	uint y_offset = RoadVehHasArticPart(v) ? 15 :0;
+	StringID str;
+
+	SetDParam(0, v->engine_type);
+	SetDParam(1, v->build_year);
+	SetDParam(2, v->value);
+	DrawString(x, y + y_offset, STR_9011_BUILT_VALUE, 0);
+
+	if (RoadVehHasArticPart(v)) {
+		AcceptedCargo max_cargo;
+		char capacity[512];
+
+		memset(max_cargo, 0, sizeof(max_cargo));
+
+		for (const Vehicle *u = v; u != NULL; u = u->Next()) {
+			max_cargo[u->cargo_type] += u->cargo_cap;
+		}
+
+		GetString(capacity, STR_ARTICULATED_RV_CAPACITY, lastof(capacity));
+
+		bool first = true;
+		for (CargoID i = 0; i < NUM_CARGO; i++) {
+			if (max_cargo[i] > 0) {
+				char buffer[128];
+
+				SetDParam(0, i);
+				SetDParam(1, max_cargo[i]);
+				GetString(buffer, STR_BARE_CARGO, lastof(buffer));
+
+				if (!first) strecat(capacity, ", ", lastof(capacity));
+				strecat(capacity, buffer, lastof(capacity));
+				first = false;
+			}
+		}
+
+		SetDParamStr(0, capacity);
+		DrawStringTruncated(x, y + 10 + y_offset, STR_JUST_STRING, 0, 380 - x);
+
+		for (const Vehicle *u = v; u != NULL; u = u->Next()) {
+			str = STR_8812_EMPTY;
+			if (!u->cargo.Empty()) {
+				SetDParam(0, u->cargo_type);
+				SetDParam(1, u->cargo.Count());
+				SetDParam(2, u->cargo.Source());
+				str = STR_8813_FROM;
+			}
+			DrawString(x, y + 21 + y_offset, str, 0);
+
+			y_offset += 11;
+		}
+
+		y_offset -= 11;
+	} else {
+		SetDParam(0, v->cargo_type);
+		SetDParam(1, v->cargo_cap);
+		DrawString(x, y + 10 + y_offset, STR_9012_CAPACITY, 0);
+
+		str = STR_8812_EMPTY;
+		if (!v->cargo.Empty()) {
+			SetDParam(0, v->cargo_type);
+			SetDParam(1, v->cargo.Count());
+			SetDParam(2, v->cargo.Source());
+			str = STR_8813_FROM;
+		}
+		DrawString(x, y + 21 + y_offset, str, 0);
+	}
+
+	/* Draw Transfer credits text */
+	SetDParam(0, v->cargo.FeederShare());
+	DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, 0);
+}
+
+
 static inline int RoadVehLengthToPixels(int length)
 {
 	return (length * 28) / 8;
@@ -26,17 +102,13 @@
 
 void DrawRoadVehImage(const Vehicle *v, int x, int y, int count, VehicleID selection)
 {
-	int dx = 0;
-
 	/* Road vehicle lengths are measured in eighths of the standard length, so
 	 * count is the number of standard vehicles that should be drawn. If it is
 	 * 0, we draw enough vehicles for 10 standard vehicle lengths. */
 	int max_length = (count == 0) ? 80 : count * 8;
 
-	do {
-		int length = v->u.road.cached_veh_length;
-
-		if (dx + length > 0 && dx <= max_length) {
+	for (int dx = 0 ; v != NULL && dx < max_length ; dx += v->u.road.cached_veh_length, v = v->Next()) {
+		if (dx + v->u.road.cached_veh_length > 0 && dx <= max_length) {
 			SpriteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
 			DrawSprite(v->GetImage(DIR_W), pal, x + 14 + RoadVehLengthToPixels(dx), y + 6);
 
@@ -44,226 +116,9 @@
 				DrawFrameRect(x - 1, y - 1, x + 28, y + 12, 15, FR_BORDERONLY);
 			}
 		}
-
-		dx += length;
-		v = v->Next();
-	} while (v != NULL && dx < max_length);
-}
-
-static void RoadVehDetailsWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_CREATE: {
-		const Vehicle *v = GetVehicle(w->window_number);
-
-		if (!RoadVehHasArticPart(v)) break;
-
-		/* Draw the text under the vehicle instead of next to it, minus the
-		 * height already allocated for the cargo of the first vehicle. */
-		uint height_extension = 15 - 11;
-
-		/* Add space for the cargo amount for each part. */
-		do {
-			height_extension += 11;
-		} while ((v = v->Next()) != NULL);
-
-		ResizeWindow(w, 0, height_extension);
-	} break;
-
-	case WE_PAINT: {
-		const Vehicle *v = GetVehicle(w->window_number);
-		StringID str;
-		uint y_offset = RoadVehHasArticPart(v) ? 15 :0;
-
-		SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
-		/* disable service-scroller when interval is set to disabled */
-		SetWindowWidgetDisabledState(w, 5, !_patches.servint_roadveh);
-		SetWindowWidgetDisabledState(w, 6, !_patches.servint_roadveh);
-
-		SetDParam(0, v->index);
-		DrawWindowWidgets(w);
-
-		/* Draw running cost */
-		{
-			int year = v->age / 366;
-
-			SetDParam(1, year);
-
-			SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
-			SetDParam(2, v->max_age / 366);
-			SetDParam(3, v->GetDisplayRunningCost());
-			DrawString(2, 15, STR_900D_AGE_RUNNING_COST_YR, 0);
-		}
-
-		/* Draw max speed */
-		{
-			SetDParam(0, v->GetDisplayMaxSpeed());
-			DrawString(2, 25, STR_900E_MAX_SPEED, 0);
-		}
-
-		/* Draw profit */
-		{
-			SetDParam(0, v->profit_this_year);
-			SetDParam(1, v->profit_last_year);
-			DrawString(2, 35, STR_900F_PROFIT_THIS_YEAR_LAST_YEAR, 0);
-		}
-
-		/* Draw breakdown & reliability */
-		{
-			SetDParam(0, v->reliability * 100 >> 16);
-			SetDParam(1, v->breakdowns_since_last_service);
-			DrawString(2, 45, STR_9010_RELIABILITY_BREAKDOWNS, 0);
-		}
-
-		DrawRoadVehImage(v, 3, 57, 0, INVALID_VEHICLE);
-
-		SetDParam(0, v->engine_type);
-		SetDParam(1, v->build_year);
-		SetDParam(2, v->value);
-		DrawString(34, 57 + y_offset, STR_9011_BUILT_VALUE, 0);
-
-		if (RoadVehHasArticPart(v)) {
-			AcceptedCargo max_cargo;
-			char capacity[512];
-
-			memset(max_cargo, 0, sizeof(max_cargo));
-
-			for (const Vehicle *u = v; u != NULL; u = u->Next()) {
-				max_cargo[u->cargo_type] += u->cargo_cap;
-			}
-
-			GetString(capacity, STR_ARTICULATED_RV_CAPACITY, lastof(capacity));
-
-			bool first = true;
-			for (CargoID i = 0; i < NUM_CARGO; i++) {
-				if (max_cargo[i] > 0) {
-					char buffer[128];
-
-					SetDParam(0, i);
-					SetDParam(1, max_cargo[i]);
-					GetString(buffer, STR_BARE_CARGO, lastof(buffer));
-
-					if (!first) strecat(capacity, ", ", lastof(capacity));
-					strecat(capacity, buffer, lastof(capacity));
-
-					first = false;
-				}
-			}
-
-			SetDParamStr(0, capacity);
-			DrawStringTruncated(34, 67 + y_offset, STR_JUST_STRING, 0, w->width - 34);
-
-			for (const Vehicle *u = v; u != NULL; u = u->Next()) {
-				str = STR_8812_EMPTY;
-				if (!u->cargo.Empty()) {
-					SetDParam(0, u->cargo_type);
-					SetDParam(1, u->cargo.Count());
-					SetDParam(2, u->cargo.Source());
-					str = STR_8813_FROM;
-				}
-				DrawString(34, 78 + y_offset, str, 0);
-
-				y_offset += 11;
-			}
-
-			y_offset -= 11;
-		} else {
-			SetDParam(0, v->cargo_type);
-			SetDParam(1, v->cargo_cap);
-			DrawString(34, 67 + y_offset, STR_9012_CAPACITY, 0);
-
-			str = STR_8812_EMPTY;
-			if (!v->cargo.Empty()) {
-				SetDParam(0, v->cargo_type);
-				SetDParam(1, v->cargo.Count());
-				SetDParam(2, v->cargo.Source());
-				str = STR_8813_FROM;
-			}
-			DrawString(34, 78 + y_offset, str, 0);
-		}
-
-		/* Draw Transfer credits text */
-		SetDParam(0, v->cargo.FeederShare());
-		DrawString(34, 90 + y_offset, STR_FEEDER_CARGO_VALUE, 0);
-
-		/* Draw service interval text */
-		{
-			SetDParam(0, v->service_interval);
-			SetDParam(1, v->date_of_last_service);
-			DrawString(13, 102 + y_offset, _patches.servint_ispercent ? STR_SERVICING_INTERVAL_PERCENT : STR_883C_SERVICING_INTERVAL_DAYS, 0);
-		}
-	} break;
-
-	case WE_CLICK: {
-		int mod;
-		const Vehicle *v;
-		switch (e->we.click.widget) {
-		case 2: /* rename */
-			v = GetVehicle(w->window_number);
-			SetDParam(0, v->index);
-			ShowQueryString(STR_VEHICLE_NAME, STR_902C_NAME_ROAD_VEHICLE, 31, 150, w, CS_ALPHANUMERAL);
-			break;
-
-		case 5: /* increase int */
-			mod = _ctrl_pressed? 5 : 10;
-			goto do_change_service_int;
-		case 6: /* decrease int */
-			mod = _ctrl_pressed? -5 : -10;
-do_change_service_int:
-			v = GetVehicle(w->window_number);
-
-			mod = GetServiceIntervalClamped(mod + v->service_interval);
-			if (mod == v->service_interval) return;
-
-			DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
-			break;
-		}
-	} break;
-
-	case WE_ON_EDIT_TEXT: {
-		if (e->we.edittext.str[0] != '\0') {
-			_cmd_text = e->we.edittext.str;
-			DoCommandP(0, w->window_number, 0, NULL,
-				CMD_NAME_VEHICLE | CMD_MSG(STR_902D_CAN_T_NAME_ROAD_VEHICLE));
-		}
-	} break;
-
 	}
 }
 
-static const Widget _roadveh_details_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,         STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,    14,    11,   339,     0,    13, STR_900C_DETAILS, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   340,   379,     0,    13, STR_01AA_NAME,    STR_902E_NAME_ROAD_VEHICLE},
-{      WWT_PANEL,   RESIZE_NONE,    14,     0,   379,    14,    55, 0x0,              STR_NULL},
-{      WWT_PANEL,   RESIZE_BOTTOM,  14,     0,   379,    56,   100, 0x0,              STR_NULL},
-{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    10,   101,   106, STR_0188,         STR_884D_INCREASE_SERVICING_INTERVAL},
-{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    10,   107,   112, STR_0189,         STR_884E_DECREASE_SERVICING_INTERVAL},
-{      WWT_PANEL,   RESIZE_TB,      14,    11,   379,   101,   112, 0x0,              STR_NULL},
-{   WIDGETS_END},
-};
-
-static const WindowDesc _roadveh_details_desc = {
-	WDP_AUTO, WDP_AUTO, 380, 113, 380, 113,
-	WC_VEHICLE_DETAILS,WC_VEHICLE_VIEW,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
-	_roadveh_details_widgets,
-	RoadVehDetailsWndProc
-};
-
-
-void ShowRoadVehDetailsWindow(const Vehicle *v)
-{
-	Window *w;
-	VehicleID veh = v->index;
-
-	DeleteWindowById(WC_VEHICLE_ORDERS, veh);
-	DeleteWindowById(WC_VEHICLE_DETAILS, veh);
-
-	w = AllocateWindowDescFront(&_roadveh_details_desc, veh);
-	w->caption_color = v->owner;
-}
-
 void CcBuildRoadVeh(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
 	const Vehicle *v;
@@ -273,7 +128,7 @@
 	v = GetVehicle(_new_vehicle_id);
 	if (v->tile == _backup_orders_tile) {
 		_backup_orders_tile = 0;
-		RestoreVehicleOrders(v, _backup_orders_data);
+		RestoreVehicleOrders(v);
 	}
 	ShowVehicleViewWindow(v);
 }
--- a/src/saveload.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/saveload.h	Sat Oct 06 21:16:00 2007 +0000
@@ -13,7 +13,7 @@
 
 #define SIZE_MAX ((size_t)-1)
 
-static const uint NEWGRF_AIRPORTS_SAVEGAME = 75;
+static const uint NEWGRF_AIRPORTS_SAVEGAME = 80;
 
 enum SaveOrLoadResult {
 	SL_OK     = 0, ///< completed successfully
@@ -213,10 +213,10 @@
 #define SLE_WRITEBYTE(base, variable, value) SLE_GENERAL(SL_WRITEBYTE, base, variable, 0, 0, value, value)
 
 /* The same as the ones at the top, only the offset is given directly; used for unions */
-#define SLE_GENERALX(cmd, offset, type, len, param1, param2) {false, cmd, type, len, param1, param2, (void*)(offset)}
+#define SLE_GENERALX(cmd, offset, type, length, param1, param2) {false, cmd, type, length, param1, param2, (void*)(offset)}
 #define SLE_CONDVARX(offset, type, from, to) SLE_GENERALX(SL_VAR, offset, type, 0, from, to)
+#define SLE_CONDARRX(offset, type, length, from, to) SLE_GENERALX(SL_ARR, offset, type, length, from, to)
 #define SLE_CONDREFX(offset, type, from, to) SLE_GENERALX(SL_REF, offset, type, 0, from, to)
-#define SLE_CONDARRX(offset, type, length, from, to) SLE_GENERALX(SL_ARR, offset, type, length, from, to)
 
 #define SLE_VARX(offset, type) SLE_CONDVARX(offset, type, 0, SL_MAX_VERSION)
 #define SLE_REFX(offset, type) SLE_CONDREFX(offset, type, 0, SL_MAX_VERSION)
--- a/src/settings.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/settings.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -1245,6 +1245,7 @@
 	  SDTG_STR("videodriver",      SLE_STRB,C|S,0, _ini_videodriver,       NULL,    STR_NULL, NULL),
 	  SDTG_STR("musicdriver",      SLE_STRB,C|S,0, _ini_musicdriver,       NULL,    STR_NULL, NULL),
 	  SDTG_STR("sounddriver",      SLE_STRB,C|S,0, _ini_sounddriver,       NULL,    STR_NULL, NULL),
+	  SDTG_STR("blitter",          SLE_STRB,C|S,0, _ini_blitter,           NULL,    STR_NULL, NULL),
 	  SDTG_STR("language",         SLE_STRB, S, 0, _dynlang.curr_file,     NULL,    STR_NULL, NULL),
 	 SDTG_LIST("resolution",     SLE_UINT16, S, 0, _cur_resolution,   "640,480",    STR_NULL, NULL),
 	  SDTG_STR("screenshot_format",SLE_STRB, S, 0, _screenshot_format_name,NULL,    STR_NULL, NULL),
@@ -1353,14 +1354,15 @@
 	SDT_VAR(Patches,right_mouse_btn_emulation,SLE_UINT8,S,MS,0, 0, 2, 0, STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU,   NULL),
 #endif
 	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),
+	 SDT_VAR(Patches,advanced_vehicle_list,SLE_UINT8,S,MS, 1,  0,  2, 0, STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS,NULL),
 	SDT_BOOL(Patches, timetable_in_ticks,            S, 0, false,        STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS,    NULL),
-	SDT_BOOL(Patches, loading_indicators,            S, 0, true,         STR_CONFIG_PATCHES_LOADING_INDICATORS,    RedrawScreen),
+	 SDT_VAR(Patches, loading_indicators, SLE_UINT8, S,MS,  1, 0,  2, 0, STR_CONFIG_PATCHES_LOADING_INDICATORS,    RedrawScreen),
 	 SDT_VAR(Patches, default_rail_type,  SLE_UINT8, S,MS,  4, 0,  6, 0, STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE,     NULL),
 
 	/***************************************************************************/
 	/* Construction section of the GUI-configure patches window */
 	SDT_BOOL(Patches, build_on_slopes,               0, 0,  true,        STR_CONFIG_PATCHES_BUILDONSLOPES,       NULL),
+	SDT_CONDBOOL(Patches, autoslope,                75, SL_MAX_VERSION, 0, 0, true,  STR_CONFIG_PATCHES_AUTOSLOPE,            NULL),
 	SDT_BOOL(Patches, extra_dynamite,                0, 0, false,        STR_CONFIG_PATCHES_EXTRADYNAMITE,       NULL),
 	SDT_BOOL(Patches, longbridges,                   0, 0,  true,        STR_CONFIG_PATCHES_LONGBRIDGES,         NULL),
 	SDT_BOOL(Patches, signal_side,                   N, 0,  true,        STR_CONFIG_PATCHES_SIGNALSIDE,          RedrawScreen),
@@ -1427,6 +1429,8 @@
 	SDT_BOOL(Patches, multiple_industry_per_town, 0, 0, false,            STR_CONFIG_PATCHES_MULTIPINDTOWN,    NULL),
 	SDT_BOOL(Patches, same_industry_close,        0, 0, false,            STR_CONFIG_PATCHES_SAMEINDCLOSE,     NULL),
 	SDT_BOOL(Patches, bribe,                      0, 0,  true,            STR_CONFIG_PATCHES_BRIBE,            NULL),
+	SDT_CONDBOOL(Patches, exclusive_rights,           79, SL_MAX_VERSION, 0, 0, true,           STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE, NULL),
+	SDT_CONDBOOL(Patches, give_money,                 79, SL_MAX_VERSION, 0, 0, true,           STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY, NULL),
 	 SDT_VAR(Patches, snow_line_height,SLE_UINT8, 0, 0,     7,  2, 13, 0, STR_CONFIG_PATCHES_SNOWLINE_HEIGHT,  NULL),
 	 SDT_VAR(Patches, colored_news_year,SLE_INT32, 0,NC,  2000, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_PATCHES_COLORED_NEWS_YEAR,NULL),
 	 SDT_VAR(Patches, starting_year,    SLE_INT32, 0,NC,  1950, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_PATCHES_STARTING_YEAR,NULL),
@@ -1436,6 +1440,7 @@
 	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),
+	SDT_CONDBOOL(Patches, mod_road_rebuild,            77, SL_MAX_VERSION, 0, 0, false,         STR_CONFIG_MODIFIED_ROAD_REBUILD,        NULL),
 
 	/***************************************************************************/
 	/* AI section of the GUI-configure patches window */
--- a/src/settings_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/settings_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -664,6 +664,7 @@
 
 static const char *_patches_construction[] = {
 	"build_on_slopes",
+	"autoslope",
 	"extra_dynamite",
 	"longbridges",
 	"signal_side",
@@ -671,7 +672,6 @@
 	"drag_signals_density",
 	"oil_refinery_limit",
 	"semaphore_build_before",
-	"town_layout",
 };
 
 static const char *_patches_stations[] = {
@@ -695,10 +695,14 @@
 	"multiple_industry_per_town",
 	"same_industry_close",
 	"bribe",
+	"exclusive_rights",
+	"give_money",
 	"colored_news_year",
 	"ending_year",
 	"smooth_economy",
 	"allow_shares",
+	"town_layout",
+	"mod_road_rebuild",
 	"town_growth_rate",
 	"larger_towns",
 	"initial_city_size",
--- a/src/ship_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ship_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -1004,6 +1004,7 @@
 			 * Now we change the setting to apply the new one and let the vehicle head for the same depot.
 			 * Note: the if is (true for requesting service == true for ordered to stop in depot)          */
 			if (flags & DC_EXEC) {
+				CLRBIT(v->current_order.flags, OFB_PART_OF_ORDERS);
 				TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 			}
@@ -1078,7 +1079,7 @@
 	SET_EXPENSES_TYPE(EXPENSES_SHIP_RUN);
 
 	/* Check the refit capacity callback */
-	if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
+	if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
 		/* Back up the existing cargo type */
 		CargoID temp_cid = v->cargo_type;
 		byte temp_subtype = v->cargo_subtype;
--- a/src/ship_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ship_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -27,153 +27,6 @@
 	}
 }
 
-static void ShipDetailsWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_PAINT: {
-		const Vehicle *v = GetVehicle(w->window_number);
-		StringID str;
-
-		SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
-		/* disable service-scroller when interval is set to disabled */
-		SetWindowWidgetDisabledState(w, 5, !_patches.servint_ships);
-		SetWindowWidgetDisabledState(w, 6, !_patches.servint_ships);
-
-		SetDParam(0, v->index);
-		DrawWindowWidgets(w);
-
-		/* Draw running cost */
-		{
-			int year = v->age / 366;
-
-			SetDParam(1, year);
-
-			SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
-			SetDParam(2, v->max_age / 366);
-			SetDParam(3, v->GetDisplayRunningCost());
-			DrawString(2, 15, STR_9812_AGE_RUNNING_COST_YR, 0);
-		}
-
-		/* Draw max speed */
-		{
-			SetDParam(0, v->GetDisplayMaxSpeed());
-			DrawString(2, 25, STR_9813_MAX_SPEED, 0);
-		}
-
-		/* Draw profit */
-		{
-			SetDParam(0, v->profit_this_year);
-			SetDParam(1, v->profit_last_year);
-			DrawString(2, 35, STR_9814_PROFIT_THIS_YEAR_LAST_YEAR, 0);
-		}
-
-		/* Draw breakdown & reliability */
-		{
-			SetDParam(0, v->reliability * 100 >> 16);
-			SetDParam(1, v->breakdowns_since_last_service);
-			DrawString(2, 45, STR_9815_RELIABILITY_BREAKDOWNS, 0);
-		}
-
-		/* Draw service interval text */
-		{
-			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);
-		}
-
-		DrawShipImage(v, 3, 57, INVALID_VEHICLE);
-
-		SetDParam(0, v->engine_type);
-		SetDParam(1, v->build_year);
-		SetDParam(2, v->value);
-		DrawString(74, 57, STR_9816_BUILT_VALUE, 0);
-
-		SetDParam(0, v->cargo_type);
-		SetDParam(1, v->cargo_cap);
-		DrawString(74, 67, STR_9817_CAPACITY, 0);
-
-		str = STR_8812_EMPTY;
-		if (!v->cargo.Empty()) {
-			SetDParam(0, v->cargo_type);
-			SetDParam(1, v->cargo.Count());
-			SetDParam(2, v->cargo.Source());
-			str = STR_8813_FROM;
-		}
-		DrawString(74, 78, str, 0);
-
-		/* Draw Transfer credits text */
-		SetDParam(0, v->cargo.FeederShare());
-		DrawString(74, 89, STR_FEEDER_CARGO_VALUE, 0);
-
-	} break;
-
-	case WE_CLICK: {
-		int mod;
-		const Vehicle *v;
-		switch (e->we.click.widget) {
-		case 2: /* rename */
-			v = GetVehicle(w->window_number);
-			SetDParam(0, v->index);
-			ShowQueryString(STR_VEHICLE_NAME, STR_9831_NAME_SHIP, 31, 150, w, CS_ALPHANUMERAL);
-			break;
-		case 5: /* increase int */
-			mod = _ctrl_pressed? 5 : 10;
-			goto do_change_service_int;
-		case 6: /* decrease int */
-			mod = _ctrl_pressed ? - 5 : -10;
-do_change_service_int:
-			v = GetVehicle(w->window_number);
-
-			mod = GetServiceIntervalClamped(mod + v->service_interval);
-			if (mod == v->service_interval) return;
-
-			DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
-			break;
-		}
-	} break;
-
-	case WE_ON_EDIT_TEXT:
-		if (e->we.edittext.str[0] != '\0') {
-			_cmd_text = e->we.edittext.str;
-			DoCommandP(0, w->window_number, 0, NULL,
-				CMD_NAME_VEHICLE | CMD_MSG(STR_9832_CAN_T_NAME_SHIP));
-		}
-		break;
-	}
-}
-
-
-static const Widget _ship_details_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,         STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,    14,    11,   364,     0,    13, STR_9811_DETAILS, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   365,   404,     0,    13, STR_01AA_NAME,    STR_982F_NAME_SHIP},
-{      WWT_PANEL,   RESIZE_NONE,    14,     0,   404,    14,    55, 0x0,              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,     0,   404,    56,   100, 0x0,              STR_NULL},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,    10,   101,   106, STR_0188,         STR_884D_INCREASE_SERVICING_INTERVAL},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,    10,   107,   112, STR_0189,         STR_884E_DECREASE_SERVICING_INTERVAL},
-{      WWT_PANEL,   RESIZE_NONE,    14,    11,   404,   101,   112, 0x0,              STR_NULL},
-{   WIDGETS_END},
-};
-
-static const WindowDesc _ship_details_desc = {
-	WDP_AUTO, WDP_AUTO, 405, 113, 405, 113,
-	WC_VEHICLE_DETAILS, WC_VEHICLE_VIEW,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
-	_ship_details_widgets,
-	ShipDetailsWndProc
-};
-
-void ShowShipDetailsWindow(const Vehicle *v)
-{
-	Window *w;
-	VehicleID veh = v->index;
-
-	DeleteWindowById(WC_VEHICLE_ORDERS, veh);
-	DeleteWindowById(WC_VEHICLE_DETAILS, veh);
-	w = AllocateWindowDescFront(&_ship_details_desc, veh);
-	w->caption_color = v->owner;
-}
-
 void CcBuildShip(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
 	const Vehicle *v;
@@ -182,7 +35,39 @@
 	v = GetVehicle(_new_vehicle_id);
 	if (v->tile == _backup_orders_tile) {
 		_backup_orders_tile = 0;
-		RestoreVehicleOrders(v, _backup_orders_data);
+		RestoreVehicleOrders(v);
 	}
 	ShowVehicleViewWindow(v);
 }
+
+/**
+* Draw the details for the given vehicle at the position (x,y)
+*
+* @param v current vehicle
+* @param x The x coordinate
+* @param y The y coordinate
+*/
+void DrawShipDetails(const Vehicle *v, int x, int y)
+{
+	SetDParam(0, v->engine_type);
+	SetDParam(1, v->build_year);
+	SetDParam(2, v->value);
+	DrawString(x, y, STR_9816_BUILT_VALUE, 0);
+
+	SetDParam(0, v->cargo_type);
+	SetDParam(1, v->cargo_cap);
+	DrawString(x, y + 10, STR_9817_CAPACITY, 0);
+
+	StringID str = STR_8812_EMPTY;
+	if (!v->cargo.Empty()) {
+		SetDParam(0, v->cargo_type);
+		SetDParam(1, v->cargo.Count());
+		SetDParam(2, v->cargo.Source());
+		str = STR_8813_FROM;
+	}
+	DrawString(x, y + 21, str, 0);
+
+	/* Draw Transfer credits text */
+	SetDParam(0, v->cargo.FeederShare());
+	DrawString(x, y + 33, STR_FEEDER_CARGO_VALUE, 0);
+}
--- a/src/signs.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/signs.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -60,10 +60,12 @@
 }
 
 /**
+ * Marks the region of a sign as dirty.
  *
- * Marks the region of a sign as dirty
+ * This function marks the sign in all viewports as dirty for repaint.
  *
  * @param si Pointer to the Sign
+ * @ingroup dirty
  */
 static void MarkSignDirty(Sign *si)
 {
--- a/src/slope.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/slope.h	Sat Oct 06 21:16:00 2007 +0000
@@ -41,6 +41,16 @@
 };
 
 /**
+ * Enumeration of tile corners
+ */
+enum Corner {
+	CORNER_W = 0,
+	CORNER_S = 1,
+	CORNER_E = 2,
+	CORNER_N = 3,
+};
+
+/**
  * Checks if a slope is steep.
  *
  * @param s The given #Slope.
@@ -73,23 +83,70 @@
  *
  * @pre      The slope must be a slope with one corner raised or a steep slope.
  * @param s  The #Slope.
- * @return   Number of the highest corner. (0 west, 1 south, 2 east, 3 north)
+ * @return   Highest corner.
  */
-static inline byte GetHighestSlopeCorner(Slope s)
+static inline Corner GetHighestSlopeCorner(Slope s)
 {
 	switch (s) {
 		case SLOPE_W:
-		case SLOPE_STEEP_W: return 0;
+		case SLOPE_STEEP_W: return CORNER_W;
 		case SLOPE_S:
-		case SLOPE_STEEP_S: return 1;
+		case SLOPE_STEEP_S: return CORNER_S;
 		case SLOPE_E:
-		case SLOPE_STEEP_E: return 2;
+		case SLOPE_STEEP_E: return CORNER_E;
 		case SLOPE_N:
-		case SLOPE_STEEP_N: return 3;
+		case SLOPE_STEEP_N: return CORNER_N;
 		default: NOT_REACHED();
 	}
 }
 
+/**
+ * Returns the height of the highest corner of a slope relative to TileZ (= minimal height)
+ *
+ * @param s The #Slope.
+ * @return Relative height of highest corner.
+ */
+static inline uint GetSlopeMaxZ(Slope s)
+{
+	if (s == SLOPE_FLAT) return 0;
+	if (IsSteepSlope(s)) return 2 * TILE_HEIGHT;
+	return TILE_HEIGHT;
+}
+
+/**
+ * Returns the opposite corner.
+ *
+ * @param corner A #Corner.
+ * @return The opposite corner to "corner".
+ */
+static inline Corner OppositeCorner(Corner corner)
+{
+	return (Corner)(corner ^ 2);
+}
+
+/**
+ * Returns the slope with a specific corner raised.
+ *
+ * @param corner The #Corner.
+ * @return The #Slope with corner "corner" raised.
+ */
+static inline Slope SlopeWithOneCornerRaised(Corner corner)
+{
+	assert(IS_INT_INSIDE(corner, 0, 4));
+	return (Slope)(1 << corner);
+}
+
+/**
+ * Returns the slope with all except one corner raised.
+ *
+ * @param corner The #Corner.
+ * @return The #Slope with all corners but "corner" raised.
+ */
+static inline Slope SlopeWithThreeCornersRaised(Corner corner)
+{
+	return ComplementSlope(SlopeWithOneCornerRaised(corner));
+}
+
 
 /**
  * Enumeration for Foundations.
--- a/src/sound.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/sound.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -30,6 +30,7 @@
 	uint i;
 
 	FioOpenFile(SOUND_SLOT, filename);
+	uint pos = FioGetPos();
 	count = FioReadDword() / 8;
 	FileEntry *fe = CallocT<FileEntry>(count);
 
@@ -42,10 +43,11 @@
 	_file_count = count;
 	_files = fe;
 
-	FioSeekTo(0, SEEK_SET);
+	FioSeekTo(pos, SEEK_SET);
 
 	for (i = 0; i != count; i++) {
-		fe[i].file_offset = FioReadDword();
+		fe[i].file_slot = SOUND_SLOT;
+		fe[i].file_offset = FioReadDword() + pos;
 		fe[i].file_size = FioReadDword();
 	}
 
@@ -75,7 +77,8 @@
 					FioSeekTo(size - (2 + 2 + 4 + 4 + 2 + 1), SEEK_CUR);
 				} else if (tag == 'atad') {
 					fe->file_size = size;
-					fe->file_offset = FioGetPos() | (SOUND_SLOT << 24);
+					fe->file_slot = SOUND_SLOT;
+					fe->file_offset = FioGetPos();
 					break;
 				} else {
 					fe->file_size = 0;
@@ -91,7 +94,8 @@
 			fe->channels = 1;
 			fe->rate = 11025;
 			fe->bits_per_sample = 8;
-			fe->file_offset = FioGetPos() | (SOUND_SLOT << 24);
+			fe->file_slot = SOUND_SLOT;
+			fe->file_offset = FioGetPos();
 		}
 	}
 }
@@ -114,7 +118,7 @@
 	int8 *mem = MallocT<int8>(fe->file_size);
 	if (mem == NULL) return false;
 
-	FioSeekToFile(fe->file_offset);
+	FioSeekToFile(fe->file_slot, fe->file_offset);
 	FioReadBlock(mem, fe->file_size);
 
 	for (i = 0; i != fe->file_size; i++)
--- a/src/sound.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/sound.h	Sat Oct 06 21:16:00 2007 +0000
@@ -21,6 +21,7 @@
 VARDEF MusicFileSettings msf;
 
 struct FileEntry {
+	uint8 file_slot;
 	uint32 file_offset;
 	uint32 file_size;
 	uint16 rate;
--- a/src/sprite.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/sprite.h	Sat Oct 06 21:16:00 2007 +0000
@@ -34,10 +34,10 @@
 struct DrawBuildingsTileStruct {
 	PalSpriteID ground;
 	PalSpriteID building;
-	byte subtile_x:4;
-	byte subtile_y:4;
-	byte width:4;
-	byte height:4;
+	byte subtile_x;
+	byte subtile_y;
+	byte width;
+	byte height;
 	byte dz;
 	byte draw_proc;  /* this allows to specify a special drawing procedure.*/
 };
--- a/src/spritecache.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spritecache.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -25,6 +25,7 @@
 
 struct SpriteCache {
 	void *ptr;
+	uint8 file_slot;
 	uint32 file_pos;
 	int16 lru;
 	uint32 id;
@@ -120,13 +121,14 @@
 	/* Special case for Sprite ID zero -- its position is also 0... */
 	if (id == 0) return true;
 	if (id >= _spritecache_items) return false;
-	return GetSpriteCache(id)->file_pos != 0;
+	return !(GetSpriteCache(id)->file_pos == 0 && GetSpriteCache(id)->file_slot == 0);
 }
 
 void* AllocSprite(size_t);
 
 static void* ReadSprite(SpriteCache *sc, SpriteID id, bool real_sprite)
 {
+	uint8 file_slot = sc->file_slot;
 	uint32 file_pos = sc->file_pos;
 
 	DEBUG(sprite, 9, "Load sprite %d", id);
@@ -136,7 +138,8 @@
 
 		/* SPR_IMG_QUERY is a BIG FAT RED ? */
 		id = SPR_IMG_QUERY;
-		file_pos = GetSpriteCache(SPR_IMG_QUERY)->file_pos;
+		file_slot = GetSpriteCache(SPR_IMG_QUERY)->file_slot;
+		file_pos  = GetSpriteCache(SPR_IMG_QUERY)->file_pos;
 	}
 
 	if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() == 32) {
@@ -145,7 +148,7 @@
 		SpriteLoaderPNG sprite_loader;
 		SpriteLoader::Sprite sprite;
 
-		if (sprite_loader.LoadSprite(&sprite, sc->grf_name, sc->id)) {
+		if (sprite_loader.LoadSprite(&sprite, sc->grf_name, 0, sc->id)) {
 			sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite);
 			free(sprite.data);
 
@@ -161,7 +164,7 @@
 #endif /* WITH_PNG */
 	}
 
-	FioSeekToFile(file_pos);
+	FioSeekToFile(file_slot, file_pos);
 
 	/* Read the size and type */
 	int num  = FioReadWord();
@@ -232,7 +235,7 @@
 	SpriteLoaderGrf sprite_loader;
 	SpriteLoader::Sprite sprite;
 
-	if (!sprite_loader.LoadSprite(&sprite, sc->grf_name, file_pos)) return NULL;
+	if (!sprite_loader.LoadSprite(&sprite, sc->grf_name, file_slot, file_pos)) return NULL;
 	if (id == 142) sprite.height = 10; // Compensate for a TTD bug
 	sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite);
 	free(sprite.data);
@@ -241,10 +244,10 @@
 }
 
 
-bool LoadNextSprite(int load_index, byte file_index, uint file_sprite_id)
+bool LoadNextSprite(int load_index, byte file_slot, uint file_sprite_id)
 {
 	SpriteCache *sc;
-	uint32 file_pos = FioGetPos() | (file_index << 24);
+	uint32 file_pos = FioGetPos();
 
 	if (!ReadSpriteHeaderSkipData()) return false;
 
@@ -253,6 +256,7 @@
 	}
 
 	sc = AllocateSpriteCache(load_index);
+	sc->file_slot = file_slot;
 	sc->file_pos = file_pos;
 	sc->ptr = NULL;
 	sc->lru = 0;
@@ -280,6 +284,7 @@
 	SpriteCache *scold = GetSpriteCache(old_spr);
 	SpriteCache *scnew = AllocateSpriteCache(new_spr);
 
+	scnew->file_slot = scold->file_slot;
 	scnew->file_pos = scold->file_pos;
 	scnew->ptr = NULL;
 	scnew->id = scold->id;
--- a/src/spriteloader/grf.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/grf.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -8,10 +8,10 @@
 #include "../debug.h"
 #include "grf.hpp"
 
-bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos)
+bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos)
 {
 	/* Open the right file and go to the correct position */
-	FioSeekToFile(file_pos);
+	FioSeekToFile(file_slot, file_pos);
 
 	/* Read the size and type */
 	int num = FioReadWord();
--- a/src/spriteloader/grf.hpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/grf.hpp	Sat Oct 06 21:16:00 2007 +0000
@@ -12,7 +12,7 @@
 	/**
 	 * Load a sprite from the disk and return a sprite struct which is the same for all loaders.
 	 */
-	bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos);
+	bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos);
 };
 
 #endif /* SPRITELOADER_GRF_HPP */
--- a/src/spriteloader/png.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/png.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -180,7 +180,7 @@
 	return true;
 }
 
-bool SpriteLoaderPNG::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos)
+bool SpriteLoaderPNG::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos)
 {
 	if (!LoadPNG(sprite, filename, file_pos, false)) return false;
 	if (!LoadPNG(sprite, filename, file_pos, true)) return false;
--- a/src/spriteloader/png.hpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/png.hpp	Sat Oct 06 21:16:00 2007 +0000
@@ -12,7 +12,7 @@
 	/**
 	 * Load a sprite from the disk and return a sprite struct which is the same for all loaders.
 	 */
-	bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos);
+	bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos);
 };
 
 #endif /* SPRITELOADER_PNG_HPP */
--- a/src/spriteloader/spriteloader.hpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/spriteloader.hpp	Sat Oct 06 21:16:00 2007 +0000
@@ -26,7 +26,7 @@
 	/**
 	 * Load a sprite from the disk and return a sprite struct which is the same for all loaders.
 	 */
-	virtual bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos) = 0;
+	virtual bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos) = 0;
 
 	virtual ~SpriteLoader() { }
 };
--- a/src/station.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/station.h	Sat Oct 06 21:16:00 2007 +0000
@@ -184,7 +184,19 @@
 	virtual ~Station();
 
 	void AddFacility(byte new_facility_bit, TileIndex facil_xy);
+
+	/**
+	 * Mark the sign of a station dirty for repaint.
+	 *
+	 * @ingroup dirty
+	 */
 	void MarkDirty() const;
+
+	/**
+	 * Marks the tiles of the station as dirty.
+	 *
+	 * @ingroup dirty
+	 */
 	void MarkTilesDirty(bool cargo_change) const;
 	bool TileBelongsToRailStation(TileIndex tile) const;
 	uint GetPlatformLength(TileIndex tile, DiagDirection dir) const;
--- a/src/station_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/station_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -42,6 +42,7 @@
 #include "road.h"
 #include "cargotype.h"
 #include "strings.h"
+#include "autoslope.h"
 #include "newgrf_fsmports.h"
 
 DEFINE_OLD_POOL_GENERIC(Station, Station)
@@ -226,14 +227,14 @@
 	/* No industry */
 	if (!IsTileType(tile, MP_INDUSTRY)) return false;
 
-	const IndustrySpec *indsp = GetIndustrySpec(GetIndustryByTile(tile)->type);
+	const Industry *ind = GetIndustryByTile(tile);
 
 	/* No extractive industry */
-	if ((indsp->life_type & INDUSTRYLIFE_EXTRACTIVE) == 0) return false;
-
-	for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) {
+	if ((GetIndustrySpec(ind->type)->life_type & INDUSTRYLIFE_EXTRACTIVE) == 0) return false;
+
+	for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
 		/* The industry extracts something non-liquid, i.e. no oil or plastic, so it is a mine */
-		if (indsp->produced_cargo[i] != CT_INVALID && (GetCargo(indsp->produced_cargo[i])->classes & CC_LIQUID) == 0) return true;
+		if (ind->produced_cargo[i] != CT_INVALID && (GetCargo(ind->produced_cargo[i])->classes & CC_LIQUID) == 0) return true;
 	}
 
 	return false;
@@ -269,14 +270,14 @@
 	/* No industry */
 	if (!IsTileType(tile, MP_INDUSTRY)) return false;
 
-	const IndustrySpec *indsp = GetIndustrySpec(GetIndustryByTile(tile)->type);
+	const Industry *ind = GetIndustryByTile(tile);
 
 	/* No extractive industry */
-	if ((indsp->life_type & INDUSTRYLIFE_ORGANIC) == 0) return false;
-
-	for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) {
+	if ((GetIndustrySpec(ind->type)->life_type & INDUSTRYLIFE_ORGANIC) == 0) return false;
+
+	for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
 		/* The industry produces wood. */
-		if (indsp->produced_cargo[i] != CT_INVALID && GetCargo(indsp->produced_cargo[i])->label == 'WOOD') return true;
+		if (ind->produced_cargo[i] != CT_INVALID && GetCargo(ind->produced_cargo[i])->label == 'WOOD') return true;
 	}
 
 	return false;
@@ -437,7 +438,14 @@
 	}
 }
 
-// Update the station virt coords while making the modified parts dirty.
+/**
+ * Update the station virt coords while making the modified parts dirty.
+ *
+ * This function updates the virt coords and mark the modified parts as dirty
+ *
+ * @param st The station to update the virt coords
+ * @ingroup dirty
+ */
 static void UpdateStationVirtCoordDirty(Station *st)
 {
 	st->MarkDirty();
@@ -1316,22 +1324,14 @@
  */
 CommandCost DoConvertStationRail(TileIndex tile, RailType totype, bool exec)
 {
-	const Station* st = GetStationByTile(tile);
-
-	if (!CheckOwnership(st->owner) || !EnsureNoVehicle(tile)) return CMD_ERROR;
-
-	// tile is not a railroad station?
+	/* Tile is not a railroad station? */
 	if (!IsRailwayStation(tile)) return CMD_ERROR;
 
-	if (GetRailType(tile) == totype) return CMD_ERROR;
-
-	// '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) {
 		SetRailType(tile, totype);
 		MarkTileDirtyByTile(tile);
 		YapfNotifyTrackLayoutChange(tile, GetRailStationTrack(tile));
+		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 	}
 
 	return CommandCost(_price.build_rail / 2);
@@ -1803,7 +1803,7 @@
 	BEGIN_TILE_LOOP(tile_cur, w, h, tile)
 		byte layout = *layout_ptr++;
 		if ((byte)layout != (byte)255) {
-			if (!EnsureNoVehicle(tile_cur)) return CMD_ERROR;
+			if (!EnsureNoVehicleOnGround(tile_cur)) return CMD_ERROR;
 
 			if (flags & DC_EXEC) {
 				DeleteAnimatedTile(tile_cur);
@@ -2139,7 +2139,7 @@
 
 			relocation = GetCustomStationRelocation(statspec, st, ti->tile);
 
-			if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
+			if (HASBIT(statspec->callbackmask, CBM_STATION_SPRITE_LAYOUT)) {
 				uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0, 0, statspec, st, ti->tile);
 				if (callback != CALLBACK_FAILED) tile = (callback & ~1) + GetRailStationAxis(ti->tile);
 			}
@@ -2219,7 +2219,7 @@
 				HASBIT(_transparent_opt, TO_BUILDINGS)
 			);
 		} else {
-			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y);
+			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, HASBIT(_transparent_opt, TO_BUILDINGS));
 		}
 	}
 }
@@ -2999,6 +2999,36 @@
 
 static CommandCost TerraformTile_Station(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
 {
+	if (_patches.build_on_slopes && AutoslopeEnabled()) {
+		/* TODO: If you implement newgrf callback 149 'land slope check', you have to decide what to do with it here.
+		 *       TTDP does not call it.
+		 */
+		if (!IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) {
+			switch (GetStationType(tile)) {
+				case STATION_RAIL: {
+					DiagDirection direction = AxisToDiagDir(GetRailStationAxis(tile));
+					if (!AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, direction)) break;
+					if (!AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, ReverseDiagDir(direction))) break;
+					return _price.terraform;
+				}
+
+				case STATION_AIRPORT:
+					return _price.terraform;
+
+				case STATION_TRUCK:
+				case STATION_BUS: {
+					DiagDirection direction = GetRoadStopDir(tile);
+					if (!AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, direction)) break;
+					if (IsDriveThroughStopTile(tile)) {
+						if (!AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, ReverseDiagDir(direction))) break;
+					}
+					return _price.terraform;
+				}
+
+				default: break;
+			}
+		}
+	}
 	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 }
 
--- a/src/strings.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/strings.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -531,6 +531,12 @@
 	uint modifier = 0;
 
 	while ((b = Utf8Consume(&str)) != '\0') {
+		if (SCC_NEWGRF_FIRST <= b && b <= SCC_NEWGRF_LAST) {
+			/* We need to pass some stuff as it might be modified; oh boy. */
+			b = RemapNewGRFStringControlCode(b, &buff, &str, (int64*)argv);
+			if (b == 0) continue;
+		}
+
 		switch (b) {
 			case SCC_SETX: // {SETX}
 				if (buff + Utf8CharLen(SCC_SETX) + 1 < last) {
--- a/src/table/control_codes.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/control_codes.h	Sat Oct 06 21:16:00 2007 +0000
@@ -6,7 +6,7 @@
 /* List of string control codes used for string formatting, displaying, and
  * by strgen to generate the language files. */
 
-enum {
+enum StringControlCode {
 	SCC_CONTROL_START = 0xE000,
 	SCC_CONTROL_END   = 0xE1FF,
 
@@ -90,6 +90,28 @@
 	SCC_BLACK,
 	SCC_PREVIOUS_COLOUR,
 
+	/**
+	 * The next variables are part of a NewGRF subsystem for creating text strings.
+	 * It uses a "stack" of bytes and reads from there.
+	 */
+	SCC_NEWGRF_FIRST,
+	SCC_NEWGRF_PRINT_DWORD = SCC_NEWGRF_FIRST, ///< Read 4 bytes from the stack
+	SCC_NEWGRF_PRINT_SIGNED_WORD,              ///< Read 2 bytes from the stack as signed value
+	SCC_NEWGRF_PRINT_SIGNED_BYTE,              ///< Read 1 bytes from the stack as signed value
+	SCC_NEWGRF_PRINT_UNSIGNED_WORD,            ///< Read 2 bytes from the stack as unsigned value
+	SCC_NEWGRF_PRINT_DWORD_CURRENCY,           ///< Read 4 bytes from the stack as currency
+	SCC_NEWGRF_PRINT_STRING_ID,                ///< Read 2 bytes from the stack as String ID
+	SCC_NEWGRF_PRINT_DATE,                     ///< Read 2 bytes from the stack as base 1920 date
+	SCC_NEWGRF_PRINT_MONTH_YEAR,               ///< Read 2 bytes from the stack as base 1920 date
+	SCC_NEWGRF_PRINT_WORD_SPEED,               ///< Read 2 bytes from the stack as signed speed
+	SCC_NEWGRF_PRINT_WORD_LITRES,              ///< Read 2 bytes from the stack as signed litres
+	SCC_NEWGRF_PRINT_QWORD_CURRENCY,           ///< Read 8 bytes from the stack as currency
+	SCC_NEWGRF_PUSH_WORD,                      ///< Pushes 2 bytes onto the stack
+	SCC_NEWGRF_UNPRINT,                        ///< "Unprints" the given number of bytes from the string
+	SCC_NEWGRF_DISCARD_WORD,                   ///< Discard the next two bytes
+	SCC_NEWGRF_ROTATE_TOP_4_WORDS,             ///< Rotate the top 4 words of the stack (W4 W1 W2 W3)
+	SCC_NEWGRF_LAST = SCC_NEWGRF_ROTATE_TOP_4_WORDS,
+
 	/* Special printable symbols.
 	 * These are mapped to the original glyphs */
 	SCC_LESSTHAN       = SCC_SPRITE_START + 0x3C,
--- a/src/table/elrail_data.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/elrail_data.h	Sat Oct 06 21:16:00 2007 +0000
@@ -229,13 +229,13 @@
 	}
 };
 /* Geometric placement of the PCP relative to the tile origin */
-static const int8 x_pcp_offsets[DIAGDIR_END] = {0,  8, 15, 8};
-static const int8 y_pcp_offsets[DIAGDIR_END] = {8, 15,  8, 0};
+static const int8 x_pcp_offsets[DIAGDIR_END] = {0,  8, 16, 8};
+static const int8 y_pcp_offsets[DIAGDIR_END] = {8, 16,  8, 0};
 /* Geometric placement of the PPP relative to the PCP*/
-static const int8 x_ppp_offsets[DIR_END] = {-3, -4, -3,  0,  3,  4,  3,  0};
-static const int8 y_ppp_offsets[DIR_END] = {-3,  0,  3,  4,  3,  0, -3, -4};
+static const int8 x_ppp_offsets[DIR_END] = {-2, -4, -2,  0,  2,  4,  2,  0};
+static const int8 y_ppp_offsets[DIR_END] = {-2,  0,  2,  4,  2,  0, -2, -4};
 /* The type of pylon to draw at each PPP */
-static const SpriteID pylons_normal[] = {
+static const SpriteID pylon_sprites[] = {
 	SPR_PYLON_EW_N,
 	SPR_PYLON_Y_NE,
 	SPR_PYLON_NS_E,
@@ -246,13 +246,6 @@
 	SPR_PYLON_X_NW
 };
 
-static const SpriteID pylons_bridge[] = {
-	SPR_PYLON_X_NW,
-	SPR_PYLON_X_SE,
-	SPR_PYLON_Y_NE,
-	SPR_PYLON_Y_SW
-};
-
 struct SortableSpriteStruct {
 	SpriteID image;
 	int8 x_offset;
@@ -265,9 +258,7 @@
 
 enum {
 	/** Distance between wire and rail */
-	ELRAIL_ELEVATION = 8,
-	/** Corrects an off-by-one error in some places (tileh 12 and 9) (TODO -- find source of error) */
-	ELRAIL_ELEV_CORR = ELRAIL_ELEVATION + 1,
+	ELRAIL_ELEVATION = 10,
 	/** Wires that a draw one level higher than the north corner. */
 	ELRAIL_ELEVRAISE = ELRAIL_ELEVATION + TILE_HEIGHT
 };
@@ -276,41 +267,41 @@
 /* X direction */
 	/* Flat tiles: */
 		/* Wires */
-	{ SPR_WIRE_X_SW,          0,  8, 16,  1,  1, ELRAIL_ELEVATION }, //! 0: Wire in X direction, pylon on the SW end only
-	{ SPR_WIRE_X_NE,          0,  8, 16,  1,  1, ELRAIL_ELEVATION }, //! 1: Wire in X direction, pylon on the NE end
-	{ SPR_WIRE_X_SHORT,       0,  8, 16,  1,  1, ELRAIL_ELEVATION }, //! 2: Wire in X direction, pylon on both ends
+	{ SPR_WIRE_X_SW,          0,  7, 15,  1,  1, ELRAIL_ELEVATION }, //! 0: Wire in X direction, pylon on the SW end only
+	{ SPR_WIRE_X_NE,          0,  7, 15,  1,  1, ELRAIL_ELEVATION }, //! 1: Wire in X direction, pylon on the NE end
+	{ SPR_WIRE_X_SHORT,       0,  7, 15,  1,  1, ELRAIL_ELEVATION }, //! 2: Wire in X direction, pylon on both ends
 
 	/* "up" tiles */
 		/* Wires */
-	{ SPR_WIRE_X_SW_UP,       0,  8, 16,  8,  1, ELRAIL_ELEVRAISE }, //! 3: Wire in X pitch up, pylon on the SW end only
-	{ SPR_WIRE_X_NE_UP,       0,  8, 16,  8,  1, ELRAIL_ELEVRAISE }, //! 4: Wire in X pitch up, pylon on the NE end
-	{ SPR_WIRE_X_SHORT_UP,    0,  8, 16,  8,  1, ELRAIL_ELEVRAISE }, //! 5: Wire in X pitch up, pylon on both ends
+	{ SPR_WIRE_X_SW_UP,       0,  7, 15,  8,  1, ELRAIL_ELEVRAISE }, //! 3: Wire in X pitch up, pylon on the SW end only
+	{ SPR_WIRE_X_NE_UP,       0,  7, 15,  8,  1, ELRAIL_ELEVRAISE }, //! 4: Wire in X pitch up, pylon on the NE end
+	{ SPR_WIRE_X_SHORT_UP,    0,  7, 15,  8,  1, ELRAIL_ELEVRAISE }, //! 5: Wire in X pitch up, pylon on both ends
 
 	/* "down" tiles */
 		/* Wires */
-	{ SPR_WIRE_X_SW_DOWN,     0,  8, 16,  8,  1, ELRAIL_ELEV_CORR }, //! 6: Wire in X pitch down, pylon on the SW end
-	{ SPR_WIRE_X_NE_DOWN,     0,  8, 16,  8,  1, ELRAIL_ELEV_CORR }, //! 7: Wire in X pitch down, pylon on the NE end
-	{ SPR_WIRE_X_SHORT_DOWN,  0,  8, 16,  8,  1, ELRAIL_ELEV_CORR }, //! 8: Wire in X pitch down, pylon on both ends
+	{ SPR_WIRE_X_SW_DOWN,     0,  7, 15,  8,  1, ELRAIL_ELEVATION }, //! 6: Wire in X pitch down, pylon on the SW end
+	{ SPR_WIRE_X_NE_DOWN,     0,  7, 15,  8,  1, ELRAIL_ELEVATION }, //! 7: Wire in X pitch down, pylon on the NE end
+	{ SPR_WIRE_X_SHORT_DOWN,  0,  7, 15,  8,  1, ELRAIL_ELEVATION }, //! 8: Wire in X pitch down, pylon on both ends
 
 
 /* Y direction */
 	/* Flat tiles: */
 		/* Wires */
-	{ SPR_WIRE_Y_SE,          8,  0,  1, 16,  1, ELRAIL_ELEVATION }, //! 9: Wire in Y direction, pylon on the SE end only
-	{ SPR_WIRE_Y_NW,          8,  0,  1, 16,  1, ELRAIL_ELEVATION }, //!10: Wire in Y direction, pylon on the NW end
-	{ SPR_WIRE_Y_SHORT,       8,  0,  1, 16,  1, ELRAIL_ELEVATION }, //!11: Wire in Y direction, pylon on both ends
+	{ SPR_WIRE_Y_SE,          7,  0,  1, 15,  1, ELRAIL_ELEVATION }, //! 9: Wire in Y direction, pylon on the SE end only
+	{ SPR_WIRE_Y_NW,          7,  0,  1, 15,  1, ELRAIL_ELEVATION }, //!10: Wire in Y direction, pylon on the NW end
+	{ SPR_WIRE_Y_SHORT,       7,  0,  1, 15,  1, ELRAIL_ELEVATION }, //!11: Wire in Y direction, pylon on both ends
 
 	/* "up" tiles */
 		/* Wires */
-	{ SPR_WIRE_Y_SE_UP,       8,  0,  8, 16,  1, ELRAIL_ELEVRAISE }, //!12: Wire in Y pitch up, pylon on the SE end only
-	{ SPR_WIRE_Y_NW_UP,       8,  0,  8, 16,  1, ELRAIL_ELEVRAISE }, //!13: Wire in Y pitch up, pylon on the NW end
-	{ SPR_WIRE_Y_SHORT_UP,    8,  0,  8, 16,  1, ELRAIL_ELEVRAISE }, //!14: Wire in Y pitch up, pylon on both ends
+	{ SPR_WIRE_Y_SE_UP,       7,  0,  8, 15,  1, ELRAIL_ELEVRAISE }, //!12: Wire in Y pitch up, pylon on the SE end only
+	{ SPR_WIRE_Y_NW_UP,       7,  0,  8, 15,  1, ELRAIL_ELEVRAISE }, //!13: Wire in Y pitch up, pylon on the NW end
+	{ SPR_WIRE_Y_SHORT_UP,    7,  0,  8, 15,  1, ELRAIL_ELEVRAISE }, //!14: Wire in Y pitch up, pylon on both ends
 
 	/* "down" tiles */
 		/* Wires */
-	{ SPR_WIRE_Y_SE_DOWN,     8,  0,  8, 16,  1, ELRAIL_ELEV_CORR }, //!15: Wire in Y pitch down, pylon on the SE end
-	{ SPR_WIRE_Y_NW_DOWN,     8,  0,  8, 16,  1, ELRAIL_ELEV_CORR }, //!16: Wire in Y pitch down, pylon on the NW end
-	{ SPR_WIRE_Y_SHORT_DOWN,  8,  0,  8, 16,  1, ELRAIL_ELEV_CORR }, //!17: Wire in Y pitch down, pylon on both ends
+	{ SPR_WIRE_Y_SE_DOWN,     7,  0,  8, 15,  1, ELRAIL_ELEVATION }, //!15: Wire in Y pitch down, pylon on the SE end
+	{ SPR_WIRE_Y_NW_DOWN,     7,  0,  8, 15,  1, ELRAIL_ELEVATION }, //!16: Wire in Y pitch down, pylon on the NW end
+	{ SPR_WIRE_Y_SHORT_DOWN,  7,  0,  8, 15,  1, ELRAIL_ELEVATION }, //!17: Wire in Y pitch down, pylon on both ends
 
 /* NS Direction */
 	{ SPR_WIRE_NS_SHORT,      8,  0,  8,  8,  1, ELRAIL_ELEVATION }, //!18: LEFT  trackbit wire, pylon on both ends
@@ -323,28 +314,28 @@
 	{ SPR_WIRE_NS_S,          0,  8,  8,  8,  1, ELRAIL_ELEVATION }, //!23: RIGHT trackbit wire, pylon on S end
 
 /* EW Direction */
-	{ SPR_WIRE_EW_SHORT,      8,  0,  8,  8,  1, ELRAIL_ELEVATION }, //!24: UPPER trackbit wire, pylon on both ends
-	{ SPR_WIRE_EW_SHORT,     16,  8,  8,  8,  1, ELRAIL_ELEVATION }, //!25: LOWER trackbit wire, pylon on both ends
+	{ SPR_WIRE_EW_SHORT,      7,  0,  1,  1,  1, ELRAIL_ELEVATION }, //!24: UPPER trackbit wire, pylon on both ends
+	{ SPR_WIRE_EW_SHORT,     15,  8,  3,  3,  1, ELRAIL_ELEVATION }, //!25: LOWER trackbit wire, pylon on both ends
 
-	{ SPR_WIRE_EW_W,          8,  0,  8,  8,  1, ELRAIL_ELEVATION }, //!28: UPPER trackbit wire, pylon on both ends
-	{ SPR_WIRE_EW_W,         16,  8,  8,  8,  1, ELRAIL_ELEVATION }, //!29: LOWER trackbit wire, pylon on both ends
+	{ SPR_WIRE_EW_W,          7,  0,  1,  1,  1, ELRAIL_ELEVATION }, //!28: UPPER trackbit wire, pylon on both ends
+	{ SPR_WIRE_EW_W,         15,  8,  3,  3,  1, ELRAIL_ELEVATION }, //!29: LOWER trackbit wire, pylon on both ends
 
-	{ SPR_WIRE_EW_E,          8,  0,  8,  8,  1, ELRAIL_ELEVATION }, //!32: UPPER trackbit wire, pylon on both ends
-	{ SPR_WIRE_EW_E,         16,  8,  8,  8,  1, ELRAIL_ELEVATION }  //!33: LOWER trackbit wire, pylon on both ends
+	{ SPR_WIRE_EW_E,          7,  0,  1,  1,  1, ELRAIL_ELEVATION }, //!32: UPPER trackbit wire, pylon on both ends
+	{ SPR_WIRE_EW_E,         15,  8,  3,  3,  1, ELRAIL_ELEVATION }  //!33: LOWER trackbit wire, pylon on both ends
 };
 
 static const SortableSpriteStruct CatenarySpriteData_Depot[] = {
-	{ SPR_WIRE_DEPOT_NE,      0,  8,  8,  1,  1, ELRAIL_ELEVATION }, //! Wire for NE depot exit
-	{ SPR_WIRE_DEPOT_SE,      8,  0,  1,  8,  1, ELRAIL_ELEVATION }, //! Wire for SE depot exit
-	{ SPR_WIRE_DEPOT_SW,      0,  8,  8,  1,  1, ELRAIL_ELEVATION }, //! Wire for SW depot exit
-	{ SPR_WIRE_DEPOT_NW,      8,  0,  1,  8,  1, ELRAIL_ELEVATION }  //! Wire for NW depot exit
+	{ SPR_WIRE_DEPOT_NE,      0,  7, 15,  1,  1, ELRAIL_ELEVATION }, //! Wire for NE depot exit
+	{ SPR_WIRE_DEPOT_SE,      7,  0,  1, 15,  1, ELRAIL_ELEVATION }, //! Wire for SE depot exit
+	{ SPR_WIRE_DEPOT_SW,      0,  7, 15,  1,  1, ELRAIL_ELEVATION }, //! Wire for SW depot exit
+	{ SPR_WIRE_DEPOT_NW,      7,  0,  1, 15,  1, ELRAIL_ELEVATION }  //! Wire for NW depot exit
 };
 
 static const SortableSpriteStruct CatenarySpriteData_Tunnel[] = {
-	{ SPR_WIRE_TUNNEL_NE,      0,  8,  8,  1,  1, ELRAIL_ELEVATION }, //! Wire for NE tunnel exit
-	{ SPR_WIRE_TUNNEL_SE,      8,  0,  1,  8,  1, ELRAIL_ELEVATION }, //! Wire for SE tunnel exit
-	{ SPR_WIRE_TUNNEL_SW,      0,  8,  8,  1,  1, ELRAIL_ELEVATION }, //! Wire for SW tunnel exit
-	{ SPR_WIRE_TUNNEL_NW,      8,  0,  1,  8,  1, ELRAIL_ELEVATION }  //! Wire for NW tunnel exit
+	{ SPR_WIRE_TUNNEL_NE,      0,  7, 15,  1,  1, ELRAIL_ELEVATION }, //! Wire for NE tunnel exit
+	{ SPR_WIRE_TUNNEL_SE,      7,  0,  1, 15,  1, ELRAIL_ELEVATION }, //! Wire for SE tunnel exit
+	{ SPR_WIRE_TUNNEL_SW,      0,  7, 15,  1,  1, ELRAIL_ELEVATION }, //! Wire for SW tunnel exit
+	{ SPR_WIRE_TUNNEL_NW,      7,  0,  1, 15,  1, ELRAIL_ELEVATION }  //! Wire for NW tunnel exit
 };
 
 
--- a/src/table/industry_land.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/industry_land.h	Sat Oct 06 21:16:00 2007 +0000
@@ -39,7 +39,7 @@
  * @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 }
+#define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w, h, dz, p }
 
 /** Structure for industry tiles drawing */
 static const DrawBuildingsTileStruct _industry_draw_tile_data[NEW_INDUSTRYTILEOFFSET * 4] = {
--- a/src/table/sprites.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/sprites.h	Sat Oct 06 21:16:00 2007 +0000
@@ -184,8 +184,11 @@
 	/* One way road sprites */
 	SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + 113,
 
+	/* Not really a sprite, but an empty bounding box. Used to construct bounding boxes, that help sorting the sprites, but do not have a sprite associated. */
+	SPR_EMPTY_BOUNDING_BOX = SPR_ONEWAY_BASE + 6,
+
 	/* Flags sprites (in same order as enum NetworkLanguage) */
-	SPR_FLAGS_BASE = SPR_ONEWAY_BASE + 6,
+	SPR_FLAGS_BASE = SPR_EMPTY_BOUNDING_BOX + 1,
 
 	/* Manager face sprites */
 	SPR_GRADIENT = 874, // background gradient behind manager face
--- a/src/table/town_land.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/town_land.h	Sat Oct 06 21:16:00 2007 +0000
@@ -15,7 +15,7 @@
  * @param dz the virtual height of the sprite
  * @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}
+#define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w, h, dz, p}
 
 /** structure of houses graphics*/
 static const DrawBuildingsTileStruct _town_draw_tile_data[] = {
--- a/src/terraform_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/terraform_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -109,7 +109,7 @@
 			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);
+			DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_LEVEL_LAND);
 			break;
 		case DDSP_CREATE_ROCKS:
 			GenerateRockyArea(end_tile, start_tile);
@@ -118,7 +118,7 @@
 			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));
+			DoCommandP(end_tile, start_tile, _ctrl_pressed, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
 			break;
 		default:
 			return false;
@@ -148,7 +148,7 @@
 {
 	DoCommandP(
 		tile, SLOPE_N, 1, CcTerraform,
-		CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(STR_0808_CAN_T_RAISE_LAND_HERE)
+		CMD_TERRAFORM_LAND | CMD_MSG(STR_0808_CAN_T_RAISE_LAND_HERE)
 	);
 }
 
@@ -156,7 +156,7 @@
 {
 	DoCommandP(
 		tile, SLOPE_N, 0, CcTerraform,
-		CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(STR_0809_CAN_T_LOWER_LAND_HERE)
+		CMD_TERRAFORM_LAND | CMD_MSG(STR_0809_CAN_T_LOWER_LAND_HERE)
 	);
 }
 
--- a/src/texteff.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/texteff.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -256,9 +256,18 @@
 	_chatmessage_dirty = false;
 }
 
-/** Text Effects */
+/* Text Effects */
+/**
+ * Mark the area of the text effect as dirty.
+ *
+ * This function marks the area of a text effect as dirty for repaint.
+ *
+ * @param te The TextEffect to mark the area dirty
+ * @ingroup dirty
+ */
 static void MarkTextEffectAreaDirty(TextEffect *te)
 {
+	/* Width and height of the text effect are doubled, so they are correct in both zoom out levels 1x and 2x. */
 	MarkAllViewportsDirty(
 		te->x,
 		te->y - 1,
@@ -321,6 +330,15 @@
 	te->params_1 = GetDParam(0);
 	te->params_2 = GetDParam(4);
 
+	/* Update width of text effect */
+	char buffer[100];
+	GetString(buffer, msg, lastof(buffer));
+	int w = GetStringBoundingBox(buffer).width;
+
+	/* Only allow to make it broader, so it completely covers the old text. That avoids remnants of the old text. */
+	int right_new = te->x + w;
+	if (te->right < right_new) te->right = right_new;
+
 	MarkTextEffectAreaDirty(te);
 }
 
--- a/src/town_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/town_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -41,6 +41,7 @@
 #include "newgrf_commons.h"
 #include "newgrf_townname.h"
 #include "misc/autoptr.hpp"
+#include "autoslope.h"
 
 /* Initialize the town-pool */
 DEFINE_OLD_POOL_GENERIC(Town, Town)
@@ -97,6 +98,13 @@
 // Local
 static int _grow_town_result;
 
+/* Describe the possible states */
+enum TownGrowthResult {
+	GROWTH_SUCCEED         = -1,
+	GROWTH_SEARCH_STOPPED  =  0
+//	GROWTH_SEARCH_RUNNING >=  1
+};
+
 static bool BuildTownHouse(Town *t, TileIndex tile);
 static void DoBuildTownHouse(Town *t, TileIndex tile);
 
@@ -122,6 +130,16 @@
 }
 
 /**
+ * Return a random direction
+ *
+ * @return a random direction
+ */
+static inline DiagDirection RandomDiagDir()
+{
+	return (DiagDirection)(3 & Random());
+}
+
+/**
  * House Tile drawing handler.
  * Part of the tile loop process
  * @param ti TileInfo of the tile to draw
@@ -160,8 +178,8 @@
 		AddSortableSpriteToDraw(image, dcts->building.pal,
 			ti->x + dcts->subtile_x,
 			ti->y + dcts->subtile_y,
-			dcts->width + 1,
-			dcts->height + 1,
+			dcts->width,
+			dcts->height,
 			dcts->dz,
 			ti->z,
 			HASBIT(_transparent_opt, TO_HOUSES)
@@ -256,8 +274,12 @@
 }
 
 /**
- * Marks the town sign as needing a repaint
- * @param t Town requesting repaint
+ * Marks the town sign as needing a repaint.
+ *
+ * This function marks the area of the sign of a town as dirty for repaint.
+ *
+ * @param t Town requesting town sign for repaint
+ * @ingroup dirty
  */
 static void MarkTownSignDirty(Town *t)
 {
@@ -332,7 +354,7 @@
 	if (GetHouseConstructionTick(tile) != 0) return;
 
 	/* Check and/or  */
-	if (HASBIT(GetHouseSpecs(GetHouseType(tile))->callback_mask, CBM_CONSTRUCTION_STATE_CHANGE)) {
+	if (HASBIT(GetHouseSpecs(GetHouseType(tile))->callback_mask, CBM_HOUSE_CONSTRUCTION_STATE_CHANGE)) {
 		uint16 callback_res = GetHouseCallback(CBID_HOUSE_CONSTRUCTION_STATE_CHANGE, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 		if (callback_res != CALLBACK_FAILED) ChangeHouseAnimationFrame(tile, callback_res);
 	}
@@ -520,7 +542,7 @@
 	}
 
 	/* Check for custom cargo acceptance */
-	if (HASBIT(hs->callback_mask, CBM_CARGO_ACCEPTANCE)) {
+	if (HASBIT(hs->callback_mask, CBM_HOUSE_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);
@@ -563,29 +585,6 @@
 	/* not used */
 }
 
-
-static const TileIndexDiffC _roadblock_tileadd[] = {
-	{ 0, -1},
-	{ 1,  0},
-	{ 0,  1},
-	{-1,  0},
-
-	/* 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);
 
 static void TownTickHandler(Town *t)
@@ -623,7 +622,15 @@
 	}
 }
 
-static RoadBits GetTownRoadMask(TileIndex tile)
+/**
+ * Return the RoadBits of a tile
+ *
+ * @note There are many other functions doing things like that.
+ * @note Needs to be checked for needlessness.
+ * @param tile The tile we want to analyse
+ * @return The roadbits of the given tile
+ */
+static RoadBits GetTownRoadBits(TileIndex tile)
 {
 	TrackBits b = GetAnyRoadTrackBits(tile, ROADTYPE_ROAD);
 	RoadBits r = ROAD_NONE;
@@ -645,22 +652,48 @@
  * @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
+ *  given distance is a road tile else false
  */
-static bool IsNeighborRoadTile(TileIndex tile, int dir, RoadBlockTitleDistance dist_multi)
+static bool IsNeighborRoadTile(TileIndex tile, DiagDirection dir, uint 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 TileIndexDiff tid_lt[3]; // lookup table for the used diff values
+	tid_lt[0] = TileOffsByDiagDir(ChangeDiagDir(dir, DIAGDIRDIFF_90RIGHT));
+	tid_lt[1] = TileOffsByDiagDir(ChangeDiagDir(dir, DIAGDIRDIFF_90LEFT));
+	tid_lt[2] = TileOffsByDiagDir(ReverseDiagDir(dir));
+
+	/* We add 1 to the distance because we want to get 1 for
+	 * the min distance multiplyer and not 0.
+	 * Therefore we start at 4. The 4 is used because
+	 * there are 4 tiles per distance step to check.
+	 */
+	dist_multi = (dist_multi + 1) * 4;
+	for (uint pos = 4; pos < dist_multi; pos++) {
+		TileIndexDiff cur = 0;
+		/* For each even value of pos add the right TileIndexDiff
+		 * for each uneven value the left TileIndexDiff
+		 * for each with 2nd bit set (2,3,6,7,..) add the reversed TileIndexDiff
+		 */
+		cur += tid_lt[(pos & 1) ? 0 : 1];
+		if (pos & 2) cur += tid_lt[2];
+
+		cur = (uint)(pos / 4) * cur; // Multiply for the fitting distance
+		if (GetTownRoadBits(TILE_ADD(tile, cur)) & DiagDirToRoadBits((pos & 2) ? dir : ReverseDiagDir(dir))) return true;
+	}
+	return false;
 }
 
-static bool IsRoadAllowedHere(TileIndex tile, int dir)
+/**
+ * Check if a Road is allowed on a given tile
+ *
+ * @param tile The target tile
+ * @param dir The direction in which we want to extend the town
+ * @return true if it is allowed else false
+ */
+static bool IsRoadAllowedHere(TileIndex tile, DiagDirection dir)
 {
 	if (TileX(tile) < 2 || TileY(tile) < 2 || MapMaxX() <= TileX(tile) || MapMaxY() <= TileY(tile)) return false;
 
-	Slope k;
-	Slope slope;
+	Slope cur_slope, desired_slope;
 
 	/* If this assertion fails, it might be because the world contains
 	 *  land at the edges. This is not ok. */
@@ -668,47 +701,44 @@
 
 	for (;;) {
 		/* Check if there already is a road at this point? */
-		if (GetAnyRoadTrackBits(tile, ROADTYPE_ROAD) == 0) {
+		if (GetTownRoadBits(tile) == ROAD_NONE) {
 			/* 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 & ROAD_NW ? ROAD_X : ROAD_Y), 0, DC_AUTO, CMD_BUILD_ROAD)) &&
+			if (CmdFailed(DoCommand(tile, ((dir == DIAGDIR_NW || dir == DIAGDIR_SE) ? ROAD_X : ROAD_Y), 0, DC_AUTO, CMD_BUILD_ROAD)) &&
 					CmdFailed(DoCommand(tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR)))
 				return false;
 		}
 
-		slope = GetTileSlope(tile, NULL);
-		if (slope == SLOPE_FLAT) {
+		cur_slope = GetTileSlope(tile, NULL);
+		if (cur_slope == SLOPE_FLAT) {
 no_slope:
 			/* 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 !IsNeighborRoadTile(tile, dir, RB_TILE_DIST1);
+					return !IsNeighborRoadTile(tile, dir, 1);
 
 				case TL_BETTER_ROADS: /* Disallow the road if any neighboring tile has a road (distance: 1 and 2). */
-					return !(IsNeighborRoadTile(tile, dir, RB_TILE_DIST1) ||
-							IsNeighborRoadTile(tile, dir, RB_TILE_DIST2));
+					return !IsNeighborRoadTile(tile, dir, 2);
 			}
 		}
 
 		/* If the tile is not a slope in the right direction, then
 		 * maybe terraform some. */
-		k = (dir & ROAD_NW) ? SLOPE_NE : SLOPE_NW;
-		if (k != slope && ComplementSlope(k) != slope) {
+		desired_slope = (dir == DIAGDIR_NW || dir == DIAGDIR_SE) ? SLOPE_NE : SLOPE_NW;
+		if (desired_slope != cur_slope && ComplementSlope(desired_slope) != cur_slope) {
 			uint32 r = Random();
 
 			if (CHANCE16I(1, 8, r) && !_generating_world) {
 				CommandCost res;
 
 				if (CHANCE16I(1, 16, r)) {
-					res = DoCommand(tile, slope, 0, DC_EXEC | DC_AUTO | DC_NO_WATER,
-					                      CMD_TERRAFORM_LAND);
+					res = DoCommand(tile, cur_slope, 0, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
 				} else {
 					/* Note: Do not replace " ^ 0xF" with ComplementSlope(). The slope might be steep. */
-					res = DoCommand(tile, slope ^ 0xF, 1, DC_EXEC | DC_AUTO | DC_NO_WATER,
-					                      CMD_TERRAFORM_LAND);
+					res = DoCommand(tile, cur_slope ^ 0xF, 1, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
 				}
 				if (CmdFailed(res) && CHANCE16I(1, 3, r)) {
 					/* We can consider building on the slope, though. */
@@ -755,101 +785,169 @@
  *
  * @param t current town
  * @param tile tile in reference to the town
+ * @param dir The direction to which we are growing ATM
  * @return the RoadBit of the current tile regarding
  *  the selected town layout
  */
-static RoadBits GetTownRoadGridElement(Town* t, TileIndex tile)
+static RoadBits GetTownRoadGridElement(Town* t, TileIndex tile, DiagDirection dir)
 {
 	/* 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;
+	TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile); // Vector from downtown to the tile
+	RoadBits rcmd = ROAD_NONE;
 
 	switch (_patches.town_layout) {
 		default: NOT_REACHED();
 
 		case TL_2X2_GRID:
-			lx = ((grid_pos.x % 3) == 0);
-			ly = ((grid_pos.y % 3) == 0);
+			if ((grid_pos.x % 3) == 0) rcmd |= ROAD_Y;
+			if ((grid_pos.y % 3) == 0) rcmd |= ROAD_X;
 			break;
 
 		case TL_3X3_GRID:
-			lx = ((grid_pos.x % 4) == 0);
-			ly = ((grid_pos.y % 4) == 0);
+			if ((grid_pos.x % 4) == 0) rcmd |= ROAD_Y;
+			if ((grid_pos.y % 4) == 0) rcmd |= ROAD_X;
 			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 :( */
+	/* Stop if the tile is not a part of the grid lines */
+	if (rcmd == ROAD_NONE) return rcmd;
+
+	/* Optimise only X-junctions */
+	if (COUNTBITS(rcmd) != 2) {
+		RoadBits rb_template;
+
 		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;
+			default:       rb_template = ROAD_ALL; break;
+			case SLOPE_W:  rb_template = ROAD_NW | ROAD_SW; break;
+			case SLOPE_SW: rb_template = ROAD_Y  | ROAD_SW; break;
+			case SLOPE_S:  rb_template = ROAD_SW | ROAD_SE; break;
+			case SLOPE_SE: rb_template = ROAD_X  | ROAD_SE; break;
+			case SLOPE_E:  rb_template = ROAD_SE | ROAD_NE; break;
+			case SLOPE_NE: rb_template = ROAD_Y  | ROAD_NE; break;
+			case SLOPE_N:  rb_template = ROAD_NE | ROAD_NW; break;
+			case SLOPE_NW: rb_template = ROAD_X  | ROAD_NW; break;
 			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;
+			case SLOPE_STEEP_N:
+				rb_template = ROAD_NONE;
+				break;
 		}
+
+		/* Stop if the template is compatible to the growth dir */
+		if (DiagDirToRoadBits(ReverseDiagDir(dir)) & rb_template) return rb_template;
+		/* If not generate a straight road in the direction of the growth */
+		return DiagDirToRoadBits(dir) | DiagDirToRoadBits(ReverseDiagDir(dir));
 	}
+
+	return rcmd;
 }
 
 /**
- * Check there are enougth neighbor house tiles next to the current tile
+ * Grows the town with an extra house.
+ *  Check if there are enough neighbor house tiles
+ *  next to the current tile. If there are enough
+ *  add another house.
  *
- * @param tile current tile
- * @return true if there are more than 2 house tiles next
- *  to the current one
+ * @param t The current town
+ * @param tile The target tile for the extra house
+ * @return true if an extra house has been added
  */
-static bool AreNeighborsHouseTiles(TileIndex tile)
+static bool GrowTownWithExtraHouse(Town *t, 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;
+	if (TileX(tile) < 2 || TileY(tile) < 2 || MapMaxX() <= TileX(tile) || MapMaxY() <= TileY(tile)) return false;
+
+	uint counter = 0; // counts the house neighbor tiles
+
+	/* Check the tiles E,N,W and S of the current tile for houses */
+	for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
+
+		if (IsTileType(TileAddByDiagDir(tile, dir), MP_HOUSE)) counter++;
+
+		/* If there are enough neighbors stop here */
+		if (counter >= 3) {
+			if (BuildTownHouse(t, tile)) {
+				_grow_town_result = GROWTH_SUCCEED;
+				return true;
+			}
+			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++;
+	return false;
+}
+
+/**
+ * Grows the town with a road piece.
+ *
+ * @param t The current town
+ * @param tile The current tile
+ * @param rcmd The RoadBits we want to build on the tile
+ * @return true if the RoadBits have been added else false
+ */
+static bool GrowTownWithRoad(const Town *t, TileIndex tile, RoadBits rcmd)
+{
+	if (CmdSucceeded(DoCommand(tile, rcmd, t->index, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD))) {
+		_grow_town_result = GROWTH_SUCCEED;
+		return true;
+	}
+	return false;
+}
+
+/**
+ * Grows the town with a bridge.
+ *  At first we check if a bridge is reasonable.
+ *  If so we check if we are able to build it.
+ *
+ * @param t The current town
+ * @param tile The current tile
+ * @param rcmd The RoadBits which are possible on this tile
+ * @return true if a bridge has been build else false
+ */
+static bool GrowTownWithBridge(const Town *t, TileIndex tile, RoadBits rcmd)
+{
+	DiagDirection bridge_dir; // The direction of a bridge we maybe want to build
+
+	/* Determine direction of slope,
+	 *  and build a road if not a special slope. */
+	switch (GetTileSlope(tile, NULL)) {
+		case SLOPE_SW: bridge_dir = DIAGDIR_NE; break;
+		case SLOPE_SE: bridge_dir = DIAGDIR_NW; break;
+		case SLOPE_NW: bridge_dir = DIAGDIR_SE; break;
+		case SLOPE_NE: bridge_dir = DIAGDIR_SW; break;
+
+		default: return false;
+	}
+
+	/* Check if the bridge will be compatible to the RoadBits */
+	if (!(rcmd & DiagDirToRoadBits(ReverseDiagDir(bridge_dir)))) return false;
+
+	/* We are in the right direction */
+	uint32 bridge_length = 0;     // This value stores the length of the possible bridge
+	TileIndex bridge_tile = tile; // Used to store the other waterside
+
+	do {
+		if (bridge_length++ >= 11) {
+			/* Max 11 tile long bridges */
+			return false;
 		}
-
-		/* If there are enougth neighbor's stop it here */
-		if (counter >= 3) {
+		bridge_tile = TILE_MASK(bridge_tile + TileOffsByDiagDir(bridge_dir));
+	} while (IsClearWaterTile(bridge_tile));
+
+	/* no water tiles in between? */
+	if (bridge_length == 1) return false;
+
+	for (uint8 times = 0; times <= 22; times++) {
+		byte bridge_type = RandomRange(MAX_BRIDGES - 1);
+
+		/* Can we actually build the bridge? */
+		if (CmdSucceeded(DoCommand(tile, bridge_tile, bridge_type | ((0x80 | ROADTYPES_ROAD) << 8), DC_AUTO, CMD_BUILD_BRIDGE))) {
+			DoCommand(tile, bridge_tile, bridge_type | ((0x80 | ROADTYPES_ROAD) << 8), DC_EXEC | DC_AUTO, CMD_BUILD_BRIDGE);
+			_grow_town_result = GROWTH_SUCCEED;
 			return true;
 		}
 	}
+	/* Quit if it selecting an appropiate bridge type fails a large number of times. */
 	return false;
 }
 
@@ -857,37 +955,31 @@
  * 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
+ *  @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
+ * @param tile_ptr The current tile
+ * @param cur_rb The current tiles RoadBits
+ * @param target_dir The target road dir
+ * @param t1 The current town
  */
-static void GrowTownInTile(TileIndex* tile_ptr, RoadBits mask, int block, Town* t1)
+static void GrowTownInTile(TileIndex *tile_ptr, RoadBits cur_rb, DiagDirection target_dir, Town *t1)
 {
-	RoadBits rcmd;
-	TileIndex tmptile;
-	DiagDirection i;
-	int j;
-	TileIndex tile = *tile_ptr;
+	RoadBits rcmd = ROAD_NONE;  // RoadBits for the road construction command
+	TileIndex tile = *tile_ptr; // The main tile on which we base our growth
 
 	TILE_ASSERT(tile);
 
-	if (mask == 0) {
-		int a;
-		int b;
-
+	if (cur_rb == ROAD_NONE) {
 		/* Tile has no road. First reset the status counter
 		 * to say that this is the last iteration. */
-		_grow_town_result = 0;
+		_grow_town_result = GROWTH_SEARCH_STOPPED;
 
 		/* Remove hills etc */
 		LevelTownLand(tile);
@@ -901,37 +993,29 @@
 
 			case TL_3X3_GRID:
 			case TL_2X2_GRID:
-				rcmd = GetTownRoadGridElement(t1, tile);
-				if (rcmd == ROAD_NONE) {
-					return;
-				}
+				rcmd = GetTownRoadGridElement(t1, tile, target_dir);
+				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 (!IsRoadAllowedHere(tile, target_dir)) return;
+
+				DiagDirection source_dir = ReverseDiagDir(target_dir);
+
 				if (CHANCE16(1, 4)) {
-					do {
-						a = GB(Random(), 0, 2);
-					} while (a == b);
+					/* Randomize a new target dir */
+					do target_dir = RandomDiagDir(); while (target_dir == source_dir);
 				}
 
-				if (!IsRoadAllowedHere(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a])), a)) {
+				if (!IsRoadAllowedHere(TileAddByDiagDir(tile, target_dir), target_dir)) {
 					/* 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 the road we're trying to build is curved. */
+					if (target_dir != ReverseDiagDir(source_dir)) 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)) {
+					if (!IsTileType(TileAddByDiagDir(tile, ChangeDiagDir(target_dir, DIAGDIRDIFF_90RIGHT)), MP_HOUSE) &&
+							!IsTileType(TileAddByDiagDir(tile, ChangeDiagDir(target_dir, DIAGDIRDIFF_90LEFT)), MP_HOUSE)) {
 						return;
 					}
 
@@ -939,14 +1023,15 @@
 					 *  at any side of the new road. */
 				}
 
-				rcmd = (RoadBits)((ROAD_NW << a) + (ROAD_NW << b));
+				rcmd = DiagDirToRoadBits(target_dir) | DiagDirToRoadBits(source_dir);
 				break;
 		}
 
-	} else if (block < 5 && !HASBIT(mask, block ^ 2)) {
+	} else if (target_dir < DIAGDIR_END && !(cur_rb & DiagDirToRoadBits(ReverseDiagDir(target_dir)))) {
 		/* Continue building on a partial road.
-		 * Always OK. */
-		_grow_town_result = 0;
+		 * Should be allways OK, so we only generate
+		 * the fitting RoadBits */
+		_grow_town_result = GROWTH_SEARCH_STOPPED;
 
 		switch (_patches.town_layout) {
 			default: NOT_REACHED();
@@ -956,18 +1041,16 @@
 
 			case TL_3X3_GRID:
 			case TL_2X2_GRID:
-			 	rcmd = GetTownRoadGridElement(t1, tile);
+			 	rcmd = GetTownRoadGridElement(t1, tile, target_dir);
 				break;
 
 			case TL_BETTER_ROADS:
 			case TL_ORIGINAL:
-				rcmd = (RoadBits)(ROAD_NW << (block ^ 2));
+				rcmd = DiagDirToRoadBits(ReverseDiagDir(target_dir));
 				break;
 		}
 	} else {
-		int i;
-		bool allow_house = false;
-		TileIndex tmptile2;
+		bool allow_house = false; // Value which decides if we want to construct a house
 
 		/* Reached a tunnel/bridge? Then continue at the other side of it. */
 		if (IsTileType(tile, MP_TUNNELBRIDGE)) {
@@ -981,14 +1064,14 @@
 
 		/* 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;
+		target_dir = RandomDiagDir();
+		if (cur_rb & DiagDirToRoadBits(target_dir)) return;
 
 		/* 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. */
-		if (IsClearWaterTile(tmptile)) return;
+		TileIndex house_tile = TileAddByDiagDir(tile, target_dir); // position of a possible house
+
+		/* Don't walk into water. */
+		if (IsClearWaterTile(house_tile)) return;
 
 		switch (_patches.town_layout) {
 			default: NOT_REACHED();
@@ -998,103 +1081,54 @@
 				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 (AreNeighborsHouseTiles(tmptile2) && BuildTownHouse(t1, tmptile2)) {
-					_grow_town_result = -1;
-				}
+				GrowTownWithExtraHouse(t1, TileAddByDiagDir(house_tile, target_dir));
+				/* FALL THROUGH */
 
 			case TL_2X2_GRID:
-				rcmd = GetTownRoadGridElement(t1, tmptile);
+				rcmd = GetTownRoadGridElement(t1, house_tile, target_dir);
 				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 (AreNeighborsHouseTiles(tmptile2) && BuildTownHouse(t1, tmptile2)) {
-					_grow_town_result = -1;
-				}
+				GrowTownWithExtraHouse(t1, TileAddByDiagDir(house_tile, target_dir));
+				/* FALL THROUGH */
 
 			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));
+				rcmd = DiagDirToRoadBits(target_dir);
+				allow_house = (!IsRoadAllowedHere(house_tile, target_dir) || CHANCE16(6, 10));
 				break;
 		}
 
-
 		if (allow_house) {
 			/* Build a house, but not if there already is a house there. */
-			if (!IsTileType(tmptile, MP_HOUSE)) {
+			if (!IsTileType(house_tile, MP_HOUSE)) {
 				/* Level the land if possible */
-				LevelTownLand(tmptile);
+				LevelTownLand(house_tile);
 
 				/* And build a house.
 				 * Set result to -1 if we managed to build it. */
-				if (BuildTownHouse(t1, tmptile)) {
-					_grow_town_result = -1;
+				if (BuildTownHouse(t1, house_tile)) {
+					_grow_town_result = GROWTH_SUCCEED;
 				}
 			}
 			return;
 		}
 
-		_grow_town_result = 0;
-		rcmd = (RoadBits)(ROAD_NW << i);
+		_grow_town_result = GROWTH_SEARCH_STOPPED;
 	}
 
 	/* Return if a water tile */
 	if (IsClearWaterTile(tile)) return;
 
-	/* 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;
-		case SLOPE_NW: i = DIAGDIR_SE; break;
-		case SLOPE_NE: i = DIAGDIR_SW; break;
-
-		default:
-build_road_and_exit:
-			if (CmdSucceeded(DoCommand(tile, rcmd, t1->index, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD))) {
-				_grow_town_result = -1;
-			}
-			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 */
-	j = -11; // max 11 tile long bridges
-	do {
-		if (++j == 0)
-			goto build_road_and_exit;
-		tmptile = TILE_MASK(tmptile + TileOffsByDiagDir(i));
-	} while (IsClearWaterTile(tmptile));
-
-	/* 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. */
-	j = 22;
-	do {
-		byte bridge_type = RandomRange(MAX_BRIDGES - 1);
-		/* Can we actually build the bridge? */
-		if (CmdSucceeded(DoCommand(tile, tmptile, bridge_type | ((0x80 | ROADTYPES_ROAD) << 8), DC_AUTO, CMD_BUILD_BRIDGE))) {
-			DoCommand(tile, tmptile, bridge_type | ((0x80 | ROADTYPES_ROAD) << 8), 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 */
-			return;
-		}
-	} while (--j != 0);
+	/* Make the roads look nicer */
+	rcmd = CleanUpRoadBits(tile, rcmd);
+	if (rcmd == ROAD_NONE) return;
+
+	if (GrowTownWithBridge(t1, tile, rcmd)) return;
+
+	GrowTownWithRoad(t1, tile, rcmd);
 }
 
 /** Returns "growth" if a house was built, or no if the build failed.
@@ -1104,7 +1138,10 @@
  */
 static int GrowTownAtRoad(Town *t, TileIndex tile)
 {
-	int block = 5; // special case
+	/* Special case.
+	 * @see GrowTownInTile Check the else if
+	 */
+	DiagDirection target_dir = DIAGDIR_END; // The direction in which we want to extend the town
 
 	TILE_ASSERT(tile);
 
@@ -1127,27 +1164,26 @@
 	}
 
 	do {
-		/* Get a bitmask of the road blocks on a tile */
-		RoadBits mask = GetTownRoadMask(tile);
+		RoadBits cur_rb = GetTownRoadBits(tile); // The RoadBits of the current tile
 
 		/* Try to grow the town from this point */
-		GrowTownInTile(&tile, mask, block, t);
+		GrowTownInTile(&tile, cur_rb, target_dir, t);
 
 		/* Exclude the source position from the bitmask
 		 * and return if no more road blocks available */
-		ClrBitT(mask, (block ^ 2));
-		if (mask == ROAD_NONE)
+		cur_rb &= ~DiagDirToRoadBits(ReverseDiagDir(target_dir));
+		if (cur_rb == ROAD_NONE)
 			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));
-		tile += ToTileIndexDiff(_roadblock_tileadd[block]);
+		do target_dir = RandomDiagDir(); while (!(cur_rb & DiagDirToRoadBits(target_dir)));
+		tile = TileAddByDiagDir(tile, target_dir);
 
 		if (IsTileType(tile, MP_ROAD)) {
 			/* Don't allow building over roads of other cities */
 			if (IsTileOwner(tile, OWNER_TOWN) && GetTownByTile(tile) != t) {
-				_grow_town_result = -1;
+				_grow_town_result = GROWTH_SUCCEED;
 			} else if (_game_mode == GM_EDITOR) {
 				/* If we are in the SE, and this road-piece has no town owner yet, it just found an
 				 * owner :) (happy happy happy road now) */
@@ -1162,25 +1198,33 @@
 	return (_grow_town_result == -2);
 }
 
-/** Generate a random road block
+/**
+ * Generate a random road block.
  * The probability of a straight road
- * is somewhat higher than a curved. */
+ * is somewhat higher than a curved.
+ *
+ * @return A RoadBits value with 2 bits set
+ */
 static RoadBits GenRandomRoadBits()
 {
 	uint32 r = Random();
 	uint a = GB(r, 0, 2);
 	uint b = GB(r, 8, 2);
 	if (a == b) b ^= 2;
-	return (RoadBits)((1 << a) + (1 << b));
+	return (RoadBits)((ROAD_NW << a) + (ROAD_NW << b));
 }
 
 /** Grow the town
  * @Return true if a house was built, or no if the build failed. */
 static bool GrowTown(Town *t)
 {
-	TileIndex tile;
-	const TileIndexDiffC *ptr;
-	PlayerID old_player;
+
+	/* 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;
+	}
 
 	static const TileIndexDiffC _town_coord_mod[] = {
 		{-1,  0},
@@ -1197,22 +1241,17 @@
 		{ 2, -2},
 		{ 0,  0}
 	};
-
-	/* 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;
-	}
+	const TileIndexDiffC *ptr;
 
 	/* Current player is a town */
-	old_player = _current_player;
+	PlayerID old_player = _current_player;
 	_current_player = OWNER_TOWN;
 
+	TileIndex tile = t->xy; // The tile we are working with ATM
+
 	/* 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, ROADTYPE_ROAD) != 0) {
+		if (GetTownRoadBits(tile) != ROAD_NONE) {
 			int r = GrowTownAtRoad(t, tile);
 			_current_player = old_player;
 			return r != 0;
@@ -1924,7 +1963,8 @@
 	PlayerID old;
 	CommandCost r;
 
-	if (GetTileSlope(tile, NULL) != SLOPE_FLAT) return false;
+	/* Statues can be build on slopes, just like houses. Only the steep slopes is a no go. */
+	if (IsSteepSlope(GetTileSlope(tile, NULL))) return false;
 
 	if (!IsTileType(tile, MP_HOUSE) &&
 			!IsTileType(tile, MP_CLEAR) &&
@@ -1981,6 +2021,9 @@
 
 static void TownActionBuyRights(Town* t)
 {
+	/* Check if it's allowed to by the rights */
+	if (!_patches.exclusive_rights) return;
+
 	t->exclusive_counter = 12;
 	t->exclusivity = _current_player;
 
@@ -2097,8 +2140,8 @@
 	/** 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
+		{ 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) {
@@ -2239,9 +2282,9 @@
 /* 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
+	{  0, 128, 384}, // Permissive
+	{ 48, 192, 480}, // Neutral
+	{ 96, 384, 768}, // Hostile
 };
 
 bool CheckforTownRating(uint32 flags, Town *t, byte type)
@@ -2303,6 +2346,15 @@
 
 static CommandCost TerraformTile_Town(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
 {
+	if (AutoslopeEnabled()) {
+		HouseID house = GetHouseType(tile);
+		HouseSpec *hs = GetHouseSpecs(house);
+
+		/* Here we differ from TTDP by checking TILE_NOT_SLOPED */
+		if (((hs->building_flags & TILE_NOT_SLOPED) == 0) && !IsSteepSlope(tileh_new) &&
+			(GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) return _price.terraform;
+	}
+
 	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 }
 
@@ -2477,4 +2529,7 @@
 {
 	memset(&_house_specs, 0, sizeof(_house_specs));
 	memcpy(&_house_specs, &_original_house_specs, sizeof(_original_house_specs));
+
+	/* Reset any overrides that have been set. */
+	_house_mngr.ResetOverride();
 }
--- a/src/town_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/town_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -20,19 +20,49 @@
 #include "variables.h"
 #include "helpers.hpp"
 
+enum TownAuthorityWidget {
+	TWA_CLOSEBOX = 0,
+	TWA_CAPTION,
+	TWA_RATING_INFO,
+	TWA_COMMAND_LIST,
+	TWA_SCROLLBAR,
+	TWA_ACTION_INFO,
+	TWA_EXECUTE,
+};
+
 static const Widget _town_authority_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,    13,     0,    10,     0,    13, STR_00C5,                 STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,    13,    11,   316,     0,    13, STR_2022_LOCAL_AUTHORITY, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,    13,     0,   316,    14,   105, 0x0,                      STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    13,     0,   304,   106,   157, 0x0,                      STR_2043_LIST_OF_THINGS_TO_DO_AT},
-{  WWT_SCROLLBAR,   RESIZE_NONE,    13,   305,   316,   106,   157, 0x0,                      STR_0190_SCROLL_BAR_SCROLLS_LIST},
-{      WWT_PANEL,   RESIZE_NONE,    13,     0,   316,   158,   209, 0x0,                      STR_NULL},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    13,     0,   316,   210,   221, STR_2042_DO_IT,           STR_2044_CARRY_OUT_THE_HIGHLIGHTED},
+{   WWT_CLOSEBOX,   RESIZE_NONE,    13,     0,    10,     0,    13, STR_00C5,                 STR_018B_CLOSE_WINDOW},              // TWA_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,    13,    11,   316,     0,    13, STR_2022_LOCAL_AUTHORITY, STR_018C_WINDOW_TITLE_DRAG_THIS},    // TWA_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,    13,     0,   316,    14,   105, 0x0,                      STR_NULL},                           // TWA_RATING_INFO
+{      WWT_PANEL,   RESIZE_NONE,    13,     0,   304,   106,   157, 0x0,                      STR_2043_LIST_OF_THINGS_TO_DO_AT},   // TWA_COMMAND_LIST
+{  WWT_SCROLLBAR,   RESIZE_NONE,    13,   305,   316,   106,   157, 0x0,                      STR_0190_SCROLL_BAR_SCROLLS_LIST},   // TWA_SCROLLBAR
+{      WWT_PANEL,   RESIZE_NONE,    13,     0,   316,   158,   209, 0x0,                      STR_NULL},                           // TWA_ACTION_INFO
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    13,     0,   316,   210,   221, STR_2042_DO_IT,           STR_2044_CARRY_OUT_THE_HIGHLIGHTED}, // TWA_EXECUTE
 {   WIDGETS_END},
 };
 
 extern const byte _town_action_costs[8];
 
+enum TownActions {
+	TACT_NONE             = 0x00,
+
+	TACT_ADVERTISE_SMALL  = 0x01,
+	TACT_ADVERTISE_MEDIUM = 0x02,
+	TACT_ADVERTISE_LARGE  = 0x04,
+	TACT_ROAD_REBUILD     = 0x08,
+	TACT_BUILD_STATUE     = 0x10,
+	TACT_FOUND_BUILDINGS  = 0x20,
+	TACT_BUY_RIGHTS       = 0x40,
+	TACT_BRIBE            = 0x80,
+
+	TACT_ADVERTISE        = TACT_ADVERTISE_SMALL | TACT_ADVERTISE_MEDIUM | TACT_ADVERTISE_LARGE,
+	TACT_CONSTRUCTION     = TACT_ROAD_REBUILD | TACT_BUILD_STATUE | TACT_FOUND_BUILDINGS,
+	TACT_FUNDS            = TACT_BUY_RIGHTS | TACT_BRIBE,
+	TACT_ALL              = TACT_ADVERTISE | TACT_CONSTRUCTION | TACT_FUNDS,
+};
+
+DECLARE_ENUM_AS_BIT_SET(TownActions);
+
 /** 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 pid the player that is querying the town
@@ -41,41 +71,38 @@
  */
 uint GetMaskOfTownActions(int *nump, PlayerID pid, const Town *t)
 {
-	Money avail, ref;
 	int num = 0;
-	uint avail_buttons = 0x7F; // by default all buttons except bribe are enabled.
-	uint buttons = 0;
-
-	if (pid != PLAYER_SPECTATOR) {
-		uint i;
+	TownActions buttons = TACT_NONE;
 
-		/* bribe option enabled? */
-		if (_patches.bribe) {
-			/* if unwanted, disable everything. */
-			if (t->unwanted[pid]) {
-				avail_buttons = 0;
-			} else if (t->ratings[pid] < RATING_BRIBE_MAXIMUM) {
-				SETBIT(avail_buttons, 7); // Allow bribing
-			}
-		}
+	/* Spectators and unwanted have no options */
+	if (pid != PLAYER_SPECTATOR && !(_patches.bribe && t->unwanted[pid])) {
 
 		/* Things worth more than this are not shown */
-		avail = GetPlayer(pid)->player_money + _price.station_value * 200;
-		ref = _price.build_industry >> 8;
+		Money avail = GetPlayer(pid)->player_money + _price.station_value * 200;
+		Money ref = _price.build_industry >> 8;
 
-		for (i = 0; i != lengthof(_town_action_costs); i++, avail_buttons >>= 1) {
-			if (HASBIT(avail_buttons, 0) && avail >= _town_action_costs[i] * ref) {
-				SETBIT(buttons, i);
+		/* Check the action bits for validity and
+		 * if they are valid add them */
+		for (uint i = 0; i != lengthof(_town_action_costs); i++) {
+			const TownActions cur = (TownActions)(1 << i);
+
+			/* Is the player not able to bribe ? */
+			if (cur == TACT_BRIBE && (!_patches.bribe || t->ratings[pid] >= RATING_BRIBE_MAXIMUM))
+				continue;
+
+			/* Is the player not able to buy exclusive rights ? */
+			if (cur == TACT_BUY_RIGHTS && !_patches.exclusive_rights)
+				continue;
+
+			/* Is the player not able to build a statue ? */
+			if (cur == TACT_BUILD_STATUE && HASBIT(t->statues, pid))
+				continue;
+
+			if (avail >= _town_action_costs[i] * ref) {
+				buttons |= cur;
 				num++;
 			}
 		}
-
-		/* Disable build statue if already built */
-		if (HASBIT(t->statues, pid)) {
-			CLRBIT(buttons, 4);
-			num--;
-		}
-
 	}
 
 	if (nump != NULL) *nump = num;
@@ -161,9 +188,9 @@
 				y += 10;
 			}
 			for (i = 0; buttons; i++, buttons >>= 1) {
-				if (pos <= -5) break;
+				if (pos <= -5) break; ///< Draw only the 5 fitting lines
 
-				if (buttons&1 && --pos < 0) {
+				if ((buttons & 1) && --pos < 0) {
 					DrawString(3, y, STR_2046_SMALL_ADVERTISING_CAMPAIGN + i, 6);
 					y += 10;
 				}
@@ -185,7 +212,7 @@
 	case WE_DOUBLE_CLICK:
 	case WE_CLICK:
 		switch (e->we.click.widget) {
-		case 3: { /* listbox */
+		case TWA_COMMAND_LIST: {
 			const Town *t = GetTown(w->window_number);
 			int y = (e->we.click.pt.y - 0x6B) / 10;
 
@@ -200,7 +227,7 @@
 			if (e->event != WE_DOUBLE_CLICK || y < 0) break;
 		}
 
-		case 6: { /* carry out the action */
+		case TWA_EXECUTE: {
 			DoCommandP(GetTown(w->window_number)->xy, w->window_number, WP(w,def_d).data_1, NULL, CMD_DO_TOWN_ACTION | CMD_MSG(STR_00B4_CAN_T_DO_THIS));
 			break;
 		}
--- a/src/train.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/train.h	Sat Oct 06 21:16:00 2007 +0000
@@ -225,6 +225,16 @@
 	return v;
 }
 
+/** Tell if we are dealing with the rear end of a multiheaded engine.
+ * @param v Vehicle.
+ * @return True if the engine is the rear part of a dualheaded engine.
+ */
+static inline bool IsRearDualheaded(const Vehicle *v)
+{
+	assert(v->type == VEH_TRAIN);
+	return (IsMultiheaded(v) && !IsTrainEngine(v));
+}
+
 /** Get the next real (non-articulated part) vehicle in the consist.
  * @param v Vehicle.
  * @return Next vehicle in the consist.
@@ -238,6 +248,19 @@
 	return v->Next();
 }
 
+/** Get the next real (non-articulated part and non rear part of dualheaded engine) vehicle in the consist.
+ * @param v Vehicle.
+ * @return Next vehicle in the consist.
+ */
+static inline Vehicle *GetNextUnit(Vehicle *v)
+{
+	assert(v->type == VEH_TRAIN);
+	v = GetNextVehicle(v);
+	if (v != NULL && IsRearDualheaded(v)) v = v->Next();
+
+	return v;
+}
+
 void ConvertOldMultiheadToNew();
 void ConnectMultiheadedTrains();
 uint CountArticulatedParts(EngineID engine_type);
@@ -273,9 +296,8 @@
 	WindowClass GetVehicleListWindowClass() const { return WC_TRAINS_LIST; }
 	void PlayLeaveStationSound() const;
 	bool IsPrimaryVehicle() const { return IsFrontEngine(this); }
-	bool HasFront() const { return true; }
 	int GetImage(Direction direction) const;
-	int GetDisplaySpeed() const { return this->cur_speed * 10 / 16; }
+	int GetDisplaySpeed() const { return this->u.rail.last_speed * 10 / 16; }
 	int GetDisplayMaxSpeed() const { return this->u.rail.cached_max_speed * 10 / 16; }
 	Money GetRunningCost() const;
 	bool IsInDepot() const { return CheckTrainInDepot(this, false) != -1; }
--- a/src/train_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/train_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -95,6 +95,9 @@
 	}
 
 	if (v->u.rail.cached_power != total_power || v->u.rail.cached_max_te != max_te) {
+		/* If it has no power (no catenary), stop the train */
+		if (total_power == 0) v->vehstatus |= VS_STOPPED;
+
 		v->u.rail.cached_power = total_power;
 		v->u.rail.cached_max_te = max_te;
 		InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
@@ -190,7 +193,7 @@
 
 		if (!IsArticulatedPart(u)) {
 			/* Check powered wagon / visual effect callback */
-			if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_WAGON_POWER)) {
+			if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_TRAIN_WAGON_POWER)) {
 				uint16 callback = GetVehicleCallback(CBID_TRAIN_WAGON_POWER, 0, 0, u->engine_type, u);
 
 				if (callback != CALLBACK_FAILED) u->u.rail.cached_vis_effect = callback;
@@ -301,7 +304,7 @@
 static int GetTrainAcceleration(Vehicle *v, bool mode)
 {
 	int max_speed = 2000;
-	int speed = v->GetDisplaySpeed(); //[mph]
+	int speed = v->cur_speed * 10 / 16; // km-ish/h -> mp/h
 	int curvecount[2] = {0, 0};
 
 	/*first find the curve speed limit */
@@ -511,12 +514,12 @@
 	const RailVehicleInfo *rvi = RailVehInfo(engine);
 	CommandCost value((GetEngineProperty(engine, 0x17, rvi->base_cost) * _price.build_railwagon) >> 8);
 
-	uint num_vehicles = 1 + CountArticulatedParts(engine);
+	uint num_vehicles = 1 + CountArticulatedParts(engine, false);
 
 	if (!(flags & DC_QUERY_COST)) {
-		Vehicle *vl[11]; // Allow for wagon and upto 10 artic parts.
-
-		memset(&vl, 0, sizeof(vl));
+		/* Allow for the wagon and the articulated parts, plus one to "terminate" the list. */
+		Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
+		memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
 
 		if (!Vehicle::AllocateList(vl, num_vehicles))
 			return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
@@ -679,12 +682,12 @@
 
 	uint num_vehicles =
 		(rvi->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1) +
-		CountArticulatedParts(p1);
+		CountArticulatedParts(p1, false);
 
 	if (!(flags & DC_QUERY_COST)) {
-		Vehicle *vl[12]; // Allow for upto 10 artic parts and dual-heads
-
-		memset(&vl, 0, sizeof(vl));
+		/* Allow for the dual-heads and the articulated parts, plus one to "terminate" the list. */
+		Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
+		memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
 
 		if (!Vehicle::AllocateList(vl, num_vehicles))
 			return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
@@ -798,7 +801,7 @@
 		 * engines with more articulated parts than before works correctly.
 		 *
 		 * Also skip counting rear ends of multiheaded engines */
-		if (!IsArticulatedPart(v) && !(!IsTrainEngine(v) && IsMultiheaded(v))) count++;
+		if (!IsArticulatedPart(v) && !IsRearDualheaded(v)) count++;
 		if (v->u.rail.track != TRACK_BIT_DEPOT || v->tile != tile ||
 				(IsFrontEngine(v) && needs_to_be_stopped && !(v->vehstatus & VS_STOPPED))) {
 			return -1;
@@ -953,7 +956,7 @@
 		dst_head = NULL;
 	}
 
-	if (IsMultiheaded(src) && !IsTrainEngine(src)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
+	if (IsRearDualheaded(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 */
 	if (HASBIT(p2, 0) && src_head == dst_head) return CommandCost();
@@ -1025,10 +1028,11 @@
 		/* 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);
+			Vehicle *v = GetNextVehicle(src);
+
+			if (v != NULL && IsTrainEngine(v)) {
+				v->group_id   = src->group_id;
+				src->group_id = DEFAULT_GROUP;
 			}
 		}
 
@@ -1079,6 +1083,7 @@
 				/* 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);
+				RemoveVehicleFromGroup(src);
 			}
 
 			if (IsFrontEngine(src) || IsFreeWagon(src)) {
@@ -1221,7 +1226,7 @@
 		return_cmd_error(STR_881A_TRAINS_CAN_ONLY_BE_ALTERED);
 	}
 
-	if (IsMultiheaded(v) && !IsTrainEngine(v)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
+	if (IsRearDualheaded(v)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
 
 	if (flags & DC_EXEC) {
 		if (v == first && IsFrontEngine(first)) {
@@ -1268,6 +1273,7 @@
 					new_f->cur_order_index = first->cur_order_index;
 					new_f->orders          = first->orders;
 					new_f->num_orders      = first->num_orders;
+					new_f->group_id        = first->group_id;
 
 					if (first->prev_shared != NULL) {
 						first->prev_shared->next_shared = new_f;
@@ -1277,8 +1283,6 @@
 					if (first->next_shared != NULL) {
 						first->next_shared->prev_shared = new_f;
 						new_f->next_shared = first->next_shared;
-					} else {
-						RemoveVehicleFromGroup(v);
 					}
 
 					/*
@@ -1289,6 +1293,7 @@
 					first->orders      = NULL;
 					first->prev_shared = NULL;
 					first->next_shared = NULL;
+					first->group_id    = DEFAULT_GROUP;
 
 					/* If we deleted a window then open a new one for the 'new' train */
 					if (IsLocalPlayer() && w != NULL) ShowVehicleViewWindow(new_f);
@@ -1373,7 +1378,6 @@
 					first = UnlinkWagon(v, first);
 					DeleteDepotHighlightOfVehicle(v);
 					delete v;
-					RemoveVehicleFromGroup(v);
 				}
 			}
 
@@ -1621,7 +1625,7 @@
 	if (p2) {
 		/* turn a single unit around */
 
-		if (IsMultiheaded(v) || HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) {
+		if (IsMultiheaded(v) || HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) {
 			return_cmd_error(STR_ONLY_TURN_SINGLE_UNIT);
 		}
 
@@ -1712,7 +1716,7 @@
 		if (v->cargo_cap != 0) {
 			uint16 amount = CALLBACK_FAILED;
 
-			if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
+			if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
 				/* Back up the vehicle's cargo type */
 				CargoID temp_cid = v->cargo_type;
 				byte temp_subtype = v->cargo_subtype;
@@ -1888,6 +1892,7 @@
 			 * Now we change the setting to apply the new one and let the vehicle head for the same depot.
 			 * Note: the if is (true for requesting service == true for ordered to stop in depot)          */
 			if (flags & DC_EXEC) {
+				CLRBIT(v->current_order.flags, OFB_PART_OF_ORDERS);
 				TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 			}
--- a/src/train_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/train_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -54,7 +54,7 @@
 	v = GetVehicle(_new_vehicle_id);
 	if (tile == _backup_orders_tile) {
 		_backup_orders_tile = 0;
-		RestoreVehicleOrders(v, _backup_orders_data);
+		RestoreVehicleOrders(v);
 	}
 	ShowVehicleViewWindow(v);
 }
@@ -152,32 +152,21 @@
 	}
 }
 
-
-static void DrawTrainDetailsWindow(Window *w)
+int GetTrainDetailsWndVScroll(VehicleID veh_id, byte det_tab)
 {
-	byte det_tab = WP(w, traindetails_d).tab;
-	const Vehicle *v;
-	const Vehicle *u;
 	AcceptedCargo act_cargo;
 	AcceptedCargo max_cargo;
-	int num;
-	int x;
-	int y;
-	int sel;
+	int num = 0;
 
-	num = 0;
-	u = v = GetVehicle(w->window_number);
 	if (det_tab == 3) { // Total cargo tab
-		for (CargoID i = 0; i < lengthof(act_cargo); i++) {
-			act_cargo[i] = 0;
-			max_cargo[i] = 0;
+		memset(max_cargo, 0, sizeof(max_cargo));
+		memset(act_cargo, 0, sizeof(act_cargo));
+
+		for (const Vehicle *v = GetVehicle(veh_id) ; v != NULL ; v = v->Next()) {
+			act_cargo[v->cargo_type] += v->cargo.Count();
+			max_cargo[v->cargo_type] += v->cargo_cap;
 		}
 
-		do {
-			act_cargo[u->cargo_type] += u->cargo.Count();
-			max_cargo[u->cargo_type] += u->cargo_cap;
-		} while ((u = u->Next()) != NULL);
-
 		/* Set scroll-amount seperately from counting, as to not compute num double
 		 * for more carriages of the same type
 		 */
@@ -186,60 +175,22 @@
 		}
 		num++; // needs one more because first line is description string
 	} else {
-		do {
-			if (!IsArticulatedPart(u) || u->cargo_cap != 0) num++;
-		} while ((u = u->Next()) != NULL);
+		for (const Vehicle *v = GetVehicle(veh_id) ; v != NULL ; v = v->Next()) {
+			if (!IsArticulatedPart(v) || v->cargo_cap != 0) num++;
+		}
 	}
 
-	SetVScrollCount(w, num);
-
-	DisableWindowWidget(w, det_tab + 9);
-	SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
-
-	/* disable service-scroller when interval is set to disabled */
-	SetWindowWidgetDisabledState(w, 6, !_patches.servint_trains);
-	SetWindowWidgetDisabledState(w, 7, !_patches.servint_trains);
-
-	SetDParam(0, v->index);
-	DrawWindowWidgets(w);
-
-	SetDParam(1, v->age / 366);
-
-	x = 2;
-
-	SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
-	SetDParam(2, v->max_age / 366);
-	SetDParam(3, v->GetDisplayRunningCost());
-	DrawString(x, 15, STR_885D_AGE_RUNNING_COST_YR, 0);
+	return num;
+}
 
-	SetDParam(2, v->GetDisplayMaxSpeed());
-	SetDParam(1, v->u.rail.cached_power);
-	SetDParam(0, v->u.rail.cached_weight);
-	SetDParam(3, v->u.rail.cached_max_te / 1000);
-	DrawString(x, 25, (_patches.realistic_acceleration && v->u.rail.railtype != RAILTYPE_MAGLEV) ?
-		STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :
-		STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED, 0);
-
-	SetDParam(0, v->profit_this_year);
-	SetDParam(1, v->profit_last_year);
-	DrawString(x, 35, STR_885F_PROFIT_THIS_YEAR_LAST_YEAR, 0);
-
-	SetDParam(0, 100 * (v->reliability>>8) >> 8);
-	SetDParam(1, v->breakdowns_since_last_service);
-	DrawString(x, 45, STR_8860_RELIABILITY_BREAKDOWNS, 0);
-
-	SetDParam(0, v->service_interval);
-	SetDParam(1, v->date_of_last_service);
-	DrawString(x + 11, 57 + (w->vscroll.cap * 14), _patches.servint_ispercent ? STR_SERVICING_INTERVAL_PERCENT : STR_883C_SERVICING_INTERVAL_DAYS, 0);
-
-	y = 57;
-	sel = w->vscroll.pos;
-
+void DrawTrainDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint16 vscroll_cap, byte det_tab)
+{
 	/* draw the first 3 details tabs */
 	if (det_tab != 3) {
+		const Vehicle *u = v;
 		x = 1;
 		for (;;) {
-			if (--sel < 0 && sel >= -w->vscroll.cap) {
+			if (--vscroll_pos < 0 && vscroll_pos >= -vscroll_cap) {
 				int dx = 0;
 				int px;
 				int py;
@@ -277,10 +228,21 @@
 			if (v == NULL) return;
 		}
 	} else {
+		AcceptedCargo act_cargo;
+		AcceptedCargo max_cargo;
+
+		memset(max_cargo, 0, sizeof(max_cargo));
+		memset(act_cargo, 0, sizeof(act_cargo));
+
+		for (const Vehicle *u = v; u != NULL ; u = u->Next()) {
+			act_cargo[u->cargo_type] += u->cargo.Count();
+			max_cargo[u->cargo_type] += u->cargo_cap;
+		}
+
 		/* 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) {
+			if (max_cargo[i] > 0 && --vscroll_pos < 0 && vscroll_pos > -vscroll_cap) {
 				y += 14;
 				SetDParam(0, i);            // {CARGO} #1
 				SetDParam(1, act_cargo[i]); // {CARGO} #2
@@ -294,114 +256,3 @@
 		DrawString(x, y + 15, STR_FEEDER_CARGO_VALUE, 0);
 	}
 }
-
-static void TrainDetailsWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_PAINT:
-		DrawTrainDetailsWindow(w);
-		break;
-	case WE_CLICK: {
-		int mod;
-		const Vehicle *v;
-		switch (e->we.click.widget) {
-		case 2: /* name train */
-			v = GetVehicle(w->window_number);
-			SetDParam(0, v->index);
-			ShowQueryString(STR_VEHICLE_NAME, STR_8865_NAME_TRAIN, 31, 150, w, CS_ALPHANUMERAL);
-			break;
-		case 6: /* inc serv interval */
-			mod = _ctrl_pressed? 5 : 10;
-			goto do_change_service_int;
-
-		case 7: /* dec serv interval */
-			mod = _ctrl_pressed? -5 : -10;
-do_change_service_int:
-			v = GetVehicle(w->window_number);
-
-			mod = GetServiceIntervalClamped(mod + v->service_interval);
-			if (mod == v->service_interval) return;
-
-			DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
-			break;
-		/* details buttons*/
-		case 9:  // Cargo
-		case 10: // Information
-		case 11: // Capacities
-		case 12: // Total cargo
-			EnableWindowWidget(w,  9);
-			EnableWindowWidget(w, 10);
-			EnableWindowWidget(w, 11);
-			EnableWindowWidget(w, 12);
-			EnableWindowWidget(w, e->we.click.widget);
-			WP(w,traindetails_d).tab = e->we.click.widget - 9;
-			SetWindowDirty(w);
-			break;
-		}
-	} break;
-
-	case WE_ON_EDIT_TEXT:
-		if (e->we.edittext.str[0] != '\0') {
-			_cmd_text = e->we.edittext.str;
-			DoCommandP(0, w->window_number, 0, NULL,
-				CMD_NAME_VEHICLE | CMD_MSG(STR_8866_CAN_T_NAME_TRAIN));
-		}
-		break;
-
-	case WE_RESIZE:
-		if (e->we.sizing.diff.x != 0) ResizeButtons(w, 9, 12);
-		if (e->we.sizing.diff.y == 0) break;
-
-		w->vscroll.cap += e->we.sizing.diff.y / 14;
-		w->widget[4].data = (w->vscroll.cap << 8) + 1;
-		break;
-	}
-}
-
-static const Widget _train_details_widgets[] = {
-{   WWT_CLOSEBOX, RESIZE_NONE,   14,   0,  10,   0,  13, STR_00C5,             STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION, RESIZE_RIGHT,  14,  11, 329,   0,  13, STR_8802_DETAILS,     STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PUSHTXTBTN, RESIZE_LR,     14, 330, 369,   0,  13, STR_01AA_NAME,        STR_8867_NAME_TRAIN},
-{      WWT_PANEL, RESIZE_RIGHT,  14,   0, 369,  14,  55, 0x0,                  STR_NULL},
-{     WWT_MATRIX, RESIZE_RB,     14,   0, 357,  56, 139, 0x601,                STR_NULL},
-{  WWT_SCROLLBAR, RESIZE_LRB,    14, 358, 369,  56, 139, 0x0,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN, RESIZE_TB,     14,   0,  10, 140, 145, STR_0188,             STR_884D_INCREASE_SERVICING_INTERVAL},
-{ WWT_PUSHTXTBTN, RESIZE_TB,     14,   0,  10, 146, 151, STR_0189,             STR_884E_DECREASE_SERVICING_INTERVAL},
-{      WWT_PANEL, RESIZE_RTB,    14,  11, 369, 140, 151, 0x0,                  STR_NULL},
-{ WWT_PUSHTXTBTN, RESIZE_TB,     14,   0,  89, 152, 163, STR_013C_CARGO,       STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED},
-{ WWT_PUSHTXTBTN, RESIZE_TB,     14,  90, 178, 152, 163, STR_013D_INFORMATION, STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES},
-{ WWT_PUSHTXTBTN, RESIZE_TB,     14, 179, 268, 152, 163, STR_013E_CAPACITIES,  STR_8851_SHOW_CAPACITIES_OF_EACH},
-{ WWT_PUSHTXTBTN, RESIZE_RTB,    14, 269, 357, 152, 163, STR_013E_TOTAL_CARGO, STR_8852_SHOW_TOTAL_CARGO},
-{  WWT_RESIZEBOX, RESIZE_LRTB,   14, 358, 369, 152, 163, 0x0,                  STR_RESIZE_BUTTON},
-{   WIDGETS_END},
-};
-
-
-static const WindowDesc _train_details_desc = {
-	WDP_AUTO, WDP_AUTO, 370, 164, 370, 164,
-	WC_VEHICLE_DETAILS,WC_VEHICLE_VIEW,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
-	_train_details_widgets,
-	TrainDetailsWndProc
-};
-
-
-void ShowTrainDetailsWindow(const Vehicle *v)
-{
-	Window *w;
-	VehicleID veh = v->index;
-
-	DeleteWindowById(WC_VEHICLE_ORDERS, veh);
-	DeleteWindowById(WC_VEHICLE_DETAILS, veh);
-
-	w = AllocateWindowDescFront(&_train_details_desc, veh);
-
-	w->caption_color = v->owner;
-	w->vscroll.cap = 6;
-	w->widget[4].data = (w->vscroll.cap << 8) + 1;
-
-	w->resize.step_height = 14;
-	w->resize.height = w->height - 14 * 2; /* Minimum of 4 wagons in the display */
-
-	WP(w,traindetails_d).tab = 0;
-}
--- a/src/tree_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/tree_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -21,12 +21,28 @@
 #include "variables.h"
 #include "genworld.h"
 
+/**
+ * List of tree placer algorithm.
+ *
+ * This enumeration defines all possible tree placer algorithm in the game.
+ */
 enum TreePlacer {
-	TP_NONE,
-	TP_ORIGINAL,
-	TP_IMPROVED,
+	TP_NONE,     ///< No tree placer algorithm
+	TP_ORIGINAL, ///< The original algorithm
+	TP_IMPROVED, ///< A 'improved' algorithm
 };
 
+/**
+ * Get a random TreeType for the given tile based on a given seed
+ *
+ * This function returns a random TreeType which can be placed on the given tile.
+ * The seed for randomness must be less or equal 256, use #GB on the value of Random()
+ * to get such a value.
+ *
+ * @param tile The tile to get a random TreeType from
+ * @param seed The seed for randomness, must be less or equal 256
+ * @return The random tree type
+ */
 static TreeType GetRandomTreeType(TileIndex tile, uint seed)
 {
 	switch (_opt.landscape) {
@@ -48,6 +64,15 @@
 	}
 }
 
+/**
+ * Make a random tree tile of the given tile
+ *
+ * Create a new tree-tile for the given tile. The second parameter is used for
+ * randomness like type and number of trees.
+ *
+ * @param tile The tile to make a tree-tile from
+ * @param r The randomness value from a Random() value
+ */
 static void PlaceTree(TileIndex tile, uint32 r)
 {
 	TreeType tree = GetRandomTreeType(tile, GB(r, 24, 8));
@@ -66,6 +91,15 @@
 	}
 }
 
+/**
+ * Place some amount of trees around a given tile.
+ *
+ * This function adds some trees around a given tile. As this function use
+ * the Random() call it depends on the random how many trees are actually placed
+ * around the given tile.
+ *
+ * @param tile The center of the trees to add
+ */
 static void DoPlaceMoreTrees(TileIndex tile)
 {
 	uint i;
@@ -87,6 +121,11 @@
 	}
 }
 
+/**
+ * Place more trees on the map.
+ *
+ * This function add more trees to the map.
+ */
 static void PlaceMoreTrees()
 {
 	uint i = ScaleByMapSize(GB(Random(), 0, 5) + 25);
@@ -97,7 +136,12 @@
 
 /**
  * Place a tree at the same height as an existing tree.
- *  This gives cool effects to the map.
+ *
+ * Add a new tree around the given tile which is at the same
+ * height or at some offset (2 units) of it.
+ *
+ * @param tile The base tile to add a new tree somewhere around
+ * @param height The height (like the one from the tile)
  */
 void PlaceTreeAtSameHeight(TileIndex tile, uint height)
 {
@@ -127,6 +171,11 @@
 	}
 }
 
+/**
+ * Place some trees randomly
+ *
+ * This function just place some trees randomly on the map.
+ */
 void PlaceTreesRandomly()
 {
 	uint i, j, ht;
@@ -183,6 +232,12 @@
 	}
 }
 
+/**
+ * Place new trees.
+ *
+ * This function takes care of the selected tree placer algorithm and
+ * place randomly the trees for a new game.
+ */
 void GenerateTrees()
 {
 	uint i, total;
@@ -404,7 +459,7 @@
 
 			if (tep == NULL) break;
 
-			AddSortableSpriteToDraw(tep->image, tep->pal, ti->x + tep->x, ti->y + tep->y, 5, 5, 0x10, z, HASBIT(_transparent_opt, TO_TREES));
+			AddSortableSpriteToDraw(tep->image, tep->pal, ti->x + tep->x, ti->y + tep->y, 16 - tep->x, 16 - tep->y, 0x30, z, HASBIT(_transparent_opt, TO_TREES), -tep->x, -tep->y);
 			tep->image = 0;
 		}
 	}
--- a/src/tree_map.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/tree_map.h	Sat Oct 06 21:16:00 2007 +0000
@@ -7,54 +7,123 @@
 
 #include "macros.h"
 
+/**
+ * List of tree types along all landscape types.
+ *
+ * This enumeration contains a list of the different tree types along
+ * all landscape types. The values for the enumerations may be used for
+ * offsets from the grfs files. These points to the start of
+ * the tree list for a landscape. See the TREE_COUNT_* enumerations
+ * for the amount of different trees for a specific landscape.
+ *
+ * @note TREE_INVALID may be 0xFF according to the coding style, not -1 (Progman)
+ */
 enum TreeType {
-	TREE_INVALID      = -1,
-	TREE_TEMPERATE    = 0,
-	TREE_SUB_ARCTIC   = 12,
-	TREE_RAINFOREST   = 20,
-	TREE_CACTUS       = 27,
-	TREE_SUB_TROPICAL = 28,
-	TREE_TOYLAND      = 32
+	TREE_INVALID      = -1,   ///< An invalid tree
+	TREE_TEMPERATE    = 0x00, ///< temperate tree
+	TREE_SUB_ARCTIC   = 0x0C, ///< tree on a sub_arctic landscape
+	TREE_RAINFOREST   = 0x14, ///< tree on the 'green part' on a sub-tropical map
+	TREE_CACTUS       = 0x1B, ///< a catus for the 'desert part' on a sub-tropical map
+	TREE_SUB_TROPICAL = 0x1C, ///< tree on a sub-tropical map, non-rainforest, non-desert
+	TREE_TOYLAND      = 0x20, ///< tree on a toyland map
 };
 
+/**
+ * Counts the number of treetypes for each landscape.
+ *
+ * This list contains the counts of different treetypes for each landscape. This list contains
+ * 5 entries instead of 4 (as there are only 4 landscape types) as the sub tropic landscape
+ * got two types of area, one for normal trees and one only for cacti.
+ */
 enum {
-	TREE_COUNT_TEMPERATE    = TREE_SUB_ARCTIC   - TREE_TEMPERATE,
-	TREE_COUNT_SUB_ARCTIC   = TREE_RAINFOREST   - TREE_SUB_ARCTIC,
-	TREE_COUNT_RAINFOREST   = TREE_CACTUS       - TREE_RAINFOREST,
-	TREE_COUNT_SUB_TROPICAL = TREE_SUB_TROPICAL - TREE_CACTUS,
-	TREE_COUNT_TOYLAND      = 9
+	TREE_COUNT_TEMPERATE    = TREE_SUB_ARCTIC   - TREE_TEMPERATE,  ///< number of treetypes on a temperate map
+	TREE_COUNT_SUB_ARCTIC   = TREE_RAINFOREST   - TREE_SUB_ARCTIC, ///< number of treetypes on a sub arctic map
+	TREE_COUNT_RAINFOREST   = TREE_CACTUS       - TREE_RAINFOREST, ///< number of treetypes for the 'green part' of a sub tropic map
+	TREE_COUNT_SUB_TROPICAL = TREE_SUB_TROPICAL - TREE_CACTUS,     ///< number of treetypes for the 'desert part' of a sub tropic map
+	TREE_COUNT_TOYLAND      = 9                                    ///< number of treetypes on a toyland map
 };
 
-/* ground type, m2 bits 4...5
- * valid densities (bits 6...7) in comments after the enum */
+/**
+ * Enumeration for ground types of tiles with trees.
+ *
+ * This enumeration defines the ground types for tiles with trees on it.
+ */
 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, ///< normal grass
+	TREE_GROUND_ROUGH       = 1, ///< some rough tile
+	TREE_GROUND_SNOW_DESERT = 2  ///< a desert or snow tile, depend on landscape
 };
 
 
+/**
+ * Returns the treetype of a tile.
+ *
+ * This function returns the treetype of a given tile. As there are more
+ * possible treetypes for a tile in a game as the enumeration #TreeType defines
+ * this function may be return a value which isn't catch by an entry of the
+ * enumeration #TreeType. But there is no problem known about it.
+ *
+ * @param t The tile to get the treetype from
+ * @return The treetype of the given tile with trees
+ * @pre Tile t must be of type MP_TREES
+ */
 static inline TreeType GetTreeType(TileIndex t)
 {
 	assert(IsTileType(t, MP_TREES));
 	return (TreeType)_m[t].m3;
 }
 
-
+/**
+ * Returns the groundtype for tree tiles.
+ *
+ * This function returns the groundtype of a tile with trees.
+ *
+ * @param t The tile to get the groundtype from
+ * @return The groundtype of the tile
+ * @pre Tile must be of type MP_TREES
+ */
 static inline TreeGround GetTreeGround(TileIndex t)
 {
 	assert(IsTileType(t, MP_TREES));
 	return (TreeGround)GB(_m[t].m2, 4, 2);
 }
 
-
+/**
+ * Returns the 'density' of a tile with trees.
+ *
+ * This function returns the density of a tile which got trees. Note
+ * that this value doesn't count the number of trees on a tile, use
+ * #GetTreeCount instead. This function instead returns some kind of
+ * groundtype of the tile. As the map-array is finite in size and
+ * the informations about the trees must be saved somehow other
+ * informations about a tile must be saved somewhere encoded in the
+ * tile. So this function returns the density of a tile for sub arctic
+ * and sub tropical games. This means for sub arctic the type of snowline
+ * (0 to 3 for all 4 types of snowtiles) and for sub tropical the value
+ * 3 for a desert (and 0 for non-desert). The functionname is not read as
+ * "get the tree density of a tile" but "get the density of a tile which got trees".
+ *
+ * @param t The tile to get the 'density'
+ * @pre Tile must be of type MP_TREES
+ * @see GetTreeCount
+ */
 static inline uint GetTreeDensity(TileIndex t)
 {
 	assert(IsTileType(t, MP_TREES));
 	return GB(_m[t].m2, 6, 2);
 }
 
-
+/**
+ * Set the density and ground type of a tile with trees.
+ *
+ * This functions saves the ground type and the density which belongs to it
+ * for a given tile.
+ *
+ * @param t The tile to set the density and ground type
+ * @param g The ground type to save
+ * @param d The density to save with
+ * @pre Tile must be of type MP_TREES
+ */
 static inline void SetTreeGroundDensity(TileIndex t, TreeGround g, uint d)
 {
 	assert(IsTileType(t, MP_TREES)); // XXX incomplete
@@ -62,64 +131,157 @@
 	SB(_m[t].m2, 6, 2, d);
 }
 
-
+/**
+ * Returns the number of trees on a tile.
+ *
+ * This function returns the number of trees of a tile (1-4).
+ * The tile must be contains at least one tree or be more specific: it must be
+ * of type MP_TREES.
+ *
+ * @param t The index to get the number of trees
+ * @return The number of trees (1-4)
+ * @pre Tile must be of type MP_TREES
+ */
 static inline uint GetTreeCount(TileIndex t)
 {
 	assert(IsTileType(t, MP_TREES));
 	return GB(_m[t].m5, 6, 2);
 }
 
+/**
+ * Add a amount to the tree-count value of a tile with trees.
+ *
+ * This function add a value to the tree-count value of a tile. This
+ * value may be negative to reduce the tree-counter. If the resulting
+ * value reach 0 it doesn't get converted to a "normal" tile.
+ *
+ * @param t The tile to change the tree amount
+ * @param c The value to add (or reduce) on the tree-count value
+ * @pre Tile must be of type MP_TREES
+ */
 static inline void AddTreeCount(TileIndex t, int c)
 {
 	assert(IsTileType(t, MP_TREES)); // XXX incomplete
 	_m[t].m5 += c << 6;
 }
 
+/**
+ * Sets the tree amount of a tile.
+ *
+ * This function directly sets the amount of trees of a tile.
+ *
+ * @param t The tile to set the amount of trees
+ * @param c The number of trees
+ * @pre Tile must be of type MP_TREES
+ */
 static inline void SetTreeCount(TileIndex t, uint c)
 {
 	assert(IsTileType(t, MP_TREES)); // XXX incomplete
 	SB(_m[t].m5, 6, 2, c);
 }
 
-
+/**
+ * Returns the tree growth status.
+ *
+ * This function returns the tree growth status of a tile with trees.
+ *
+ * @param t The tile to get the tree growth status
+ * @return The tree growth status
+ * @pre Tile must be of type MP_TREES
+ */
 static inline uint GetTreeGrowth(TileIndex t)
 {
 	assert(IsTileType(t, MP_TREES));
 	return GB(_m[t].m5, 0, 3);
 }
 
+/**
+ * Add a value to the tree growth status.
+ *
+ * This function adds a value to the tree grow status of a tile.
+ *
+ * @param t The tile to add the value on
+ * @param a The value to add on the tree growth status
+ * @pre Tile must be of type MP_TREES
+ */
 static inline void AddTreeGrowth(TileIndex t, int a)
 {
 	assert(IsTileType(t, MP_TREES)); // XXX incomplete
 	_m[t].m5 += a;
 }
 
+/**
+ * Sets the tree growth status of a tile.
+ *
+ * This function sets the tree growth status of a tile directly with
+ * the given value.
+ *
+ * @param t The tile to change the tree growth status
+ * @param g The new value
+ * @pre Tile must be of type MP_TREES
+ */
 static inline void SetTreeGrowth(TileIndex t, uint g)
 {
 	assert(IsTileType(t, MP_TREES)); // XXX incomplete
 	SB(_m[t].m5, 0, 3, g);
 }
 
-
+/**
+ * Get the tick counter of a tree tile.
+ *
+ * Returns the saved tick counter of a given tile.
+ *
+ * @param t The tile to get the counter value from
+ * @pre Tile must be of type MP_TREES
+ */
 static inline uint GetTreeCounter(TileIndex t)
 {
 	assert(IsTileType(t, MP_TREES));
 	return GB(_m[t].m2, 0, 4);
 }
 
+/**
+ * Add a value on the tick counter of a tree-tile
+ *
+ * This function adds a value on the tick counter of a tree-tile.
+ *
+ * @param t The tile to add the value on
+ * @param a The value to add on the tick counter
+ * @pre Tile must be of type MP_TREES
+ */
 static inline void AddTreeCounter(TileIndex t, int a)
 {
 	assert(IsTileType(t, MP_TREES)); // XXX incomplete
 	_m[t].m2 += a;
 }
 
+/**
+ * Set the tick counter for a tree-tile
+ *
+ * This function sets directly the tick counter for a tree-tile.
+ *
+ * @param t The tile to set the tick counter
+ * @param c The new tick counter value
+ * @pre Tile must be of type MP_TREES
+ */
 static inline void SetTreeCounter(TileIndex t, uint c)
 {
 	assert(IsTileType(t, MP_TREES)); // XXX incomplete
 	SB(_m[t].m2, 0, 4, c);
 }
 
-
+/**
+ * Make a tree-tile.
+ *
+ * This functions change the tile to a tile with trees and all informations which belongs to it.
+ *
+ * @param t The tile to make a tree-tile from
+ * @param type The type of the tree
+ * @param set the number of trees
+ * @param growth the growth status
+ * @param ground the ground type
+ * @param density the density (not the number of trees)
+ */
 static inline void MakeTree(TileIndex t, TreeType type, uint count, uint growth, TreeGround ground, uint density)
 {
 	SetTileType(t, MP_TREES);
--- a/src/tunnelbridge_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/tunnelbridge_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -32,6 +32,7 @@
 #include "yapf/yapf.h"
 #include "date.h"
 #include "newgrf_sound.h"
+#include "autoslope.h"
 
 #include "table/bridge_land.h"
 
@@ -255,7 +256,7 @@
 	if (IsSteepSlope(tileh_end)) z_end += TILE_HEIGHT;
 	if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION, tileh_end)) z_end += TILE_HEIGHT;
 
-	if (z_start != z_end) return_cmd_error(STR_5009_LEVEL_LAND_OR_WATER_REQUIRED);
+	if (z_start != z_end) return_cmd_error(STR_BRIDGEHEADS_NOT_SAME_HEIGHT);
 
 	/* Towns are not allowed to use bridges on slopes. */
 	allow_on_slopes = (!_is_old_ai_player
@@ -366,7 +367,7 @@
 	for (tile = tile_start + delta; tile != tile_end; tile += delta) {
 		uint z;
 
-		if (GetTileSlope(tile, &z) != SLOPE_FLAT && z >= z_start) return_cmd_error(STR_5009_LEVEL_LAND_OR_WATER_REQUIRED);
+		if (GetTileSlope(tile, &z) != SLOPE_FLAT && z >= z_start) return_cmd_error(STR_BRIDGE_TOO_LOW_FOR_TERRAIN);
 
 		if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile) && !replace_bridge) {
 			/* Disallow crossing bridges for the time being */
@@ -531,14 +532,9 @@
 
 	/* slope of end tile must be complementary to the slope of the start tile */
 	if (end_tileh != ComplementSlope(start_tileh)) {
-		/* Some (rail) track bits might be terraformed into the correct direction,
-		 * but that would still leave tracks on foundation. Therefor excavation will
-		 * always fail for rail tiles. On the other hand, for road tiles it might
-		 * succeed when there is only one road bit on the tile, but then that road
-		 * bit is removed leaving a clear tile.
-		 * This therefor preserves the behaviour that half road tiles are always removable.
-		 */
-		if (IsTileType(end_tile, MP_RAILWAY)) return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK);
+		/* Check if there is a structure on the terraformed tile. Do not add the cost, that will be done by the terraforming */
+		ret = DoCommand(end_tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR);
+		if (CmdFailed(ret)) return_cmd_error(STR_5005_UNABLE_TO_EXCAVATE_LAND);
 
 		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);
@@ -749,68 +745,67 @@
  */
 CommandCost DoConvertTunnelBridgeRail(TileIndex tile, RailType totype, bool exec)
 {
-	TileIndex endtile;
-
 	if (IsTunnel(tile) && GetTunnelTransportType(tile) == TRANSPORT_RAIL) {
 		uint length;
-
-		if (!CheckTileOwnership(tile)) return CMD_ERROR;
-
-		if (GetRailType(tile) == totype) return CMD_ERROR;
+		TileIndex endtile;
 
-		/* '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);
-		if (endtile == INVALID_TILE) return CMD_ERROR;
+		/* If not coverting rail <-> el. rail, any vehicle cannot be in tunnel */
+		if (!IsCompatibleRail(GetRailType(tile), totype)) {
+			endtile = CheckTunnelBusy(tile, &length);
+			if (endtile == INVALID_TILE) return CMD_ERROR;
+		} else {
+			endtile = GetOtherTunnelEnd(tile);
+			length = DistanceManhattan(tile, endtile);
+		}
 
 		if (exec) {
-			Track track;
 			SetRailType(tile, totype);
 			SetRailType(endtile, totype);
 			MarkTileDirtyByTile(tile);
 			MarkTileDirtyByTile(endtile);
 
-			track = AxisToTrack(DiagDirToAxis(GetTunnelDirection(tile)));
+			Track track = AxisToTrack(DiagDirToAxis(GetTunnelDirection(tile)));
+
 			YapfNotifyTrackLayoutChange(tile, track);
 			YapfNotifyTrackLayoutChange(endtile, track);
+
+			VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
+			VehicleFromPos(endtile, &endtile, UpdateTrainPowerProc);
 		}
-		return CommandCost((length + 1) * (_price.build_rail / 2));
+
+		return CommandCost((length + 1) * (_price.build_rail >> 1));
 	} else if (IsBridge(tile) && GetBridgeTransportType(tile) == TRANSPORT_RAIL) {
-
-		if (!CheckTileOwnership(tile)) return CMD_ERROR;
-
-		endtile = GetOtherBridgeEnd(tile);
+		TileIndex endtile = GetOtherBridgeEnd(tile);
 		byte bridge_height = GetBridgeHeight(tile);
 
-		if (FindVehicleOnTileZ(tile, bridge_height) != NULL ||
+		if (!IsCompatibleRail(GetRailType(tile), totype) &&
+				(FindVehicleOnTileZ(tile, bridge_height) != NULL ||
 				FindVehicleOnTileZ(endtile, bridge_height) != NULL ||
-				IsVehicleOnBridge(tile, endtile, bridge_height)) {
+				IsVehicleOnBridge(tile, endtile, bridge_height))) {
 			return CMD_ERROR;
 		}
 
-		if (GetRailType(tile) == totype) return CMD_ERROR;
-
 		if (exec) {
-			TileIndexDiff delta;
-			Track track;
-
 			SetRailType(tile, totype);
 			SetRailType(endtile, totype);
 			MarkTileDirtyByTile(tile);
 			MarkTileDirtyByTile(endtile);
 
-			track = AxisToTrack(DiagDirToAxis(GetBridgeRampDirection(tile)));
+			Track track = AxisToTrack(DiagDirToAxis(GetBridgeRampDirection(tile)));
+			TileIndexDiff delta = TileOffsByDiagDir(GetBridgeRampDirection(tile));
+
 			YapfNotifyTrackLayoutChange(tile, track);
 			YapfNotifyTrackLayoutChange(endtile, track);
 
-			delta = TileOffsByDiagDir(GetBridgeRampDirection(tile));
+			VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
+			VehicleFromPos(endtile, &endtile, UpdateTrainPowerProc);
+
 			for (tile += delta; tile != endtile; tile += delta) {
 				MarkTileDirtyByTile(tile); // TODO encapsulate this into a function
 			}
 		}
 
-		return CommandCost((DistanceManhattan(tile, endtile) + 1) * (_price.build_rail / 2));
+		return CommandCost((DistanceManhattan(tile, endtile) + 1) * (_price.build_rail >> 1));
 	} else {
 		return CMD_ERROR;
 	}
@@ -847,11 +842,11 @@
 			 * sprites is at the top
 			 */
 			if (z >= front_height) { // front facing pillar
-				AddSortableSpriteToDraw(image, psid->pal, x, y, p[4], p[5], 1, z, HASBIT(_transparent_opt, TO_BRIDGES));
+				AddSortableSpriteToDraw(image, psid->pal, x, y, p[4], p[5], BB_HEIGHT_UNDER_BRIDGE - 5, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, -5);
 			}
 
 			if (drawfarpillar && z >= back_height && z < i - TILE_HEIGHT) { // back facing pillar
-				AddSortableSpriteToDraw(image, psid->pal, x - p[6], y - p[7], p[4], p[5], 1, z, HASBIT(_transparent_opt, TO_BRIDGES));
+				AddSortableSpriteToDraw(image, psid->pal, x - p[6], y - p[7], p[4], p[5], BB_HEIGHT_UNDER_BRIDGE - 5, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, -5);
 			}
 		}
 	}
@@ -878,14 +873,23 @@
 	static const SpriteID back_offsets[6]    =   {  95,  96,  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 };
+	static const uint size_x[6] = {  1, 16, 16,  1, 16,  1 };
+	static const uint size_y[6] = { 16,  1,  1, 16,  1, 16 };
+	static const uint front_bb_offset_x[6] = { 15,  0,  0, 15,  0, 15 };
+	static const uint front_bb_offset_y[6] = {  0, 15, 15,  0, 15,  0 };
 
-	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + tram_offsets[overlay][offset], PAL_NONE, x, y, size_x[offset], size_y[offset], offset >= 2 ? 1 : 0, z, HASBIT(_transparent_opt, TO_BRIDGES));
+	/* The sprites under the vehicles are drawn as SpriteCombine. StartSpriteCombine() has already been called
+	 * The bounding boxes here are the same as for bridge front/roof */
+	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + tram_offsets[overlay][offset], PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES));
 
-	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset],  PAL_NONE, x, y, size_x[offset], size_y[offset], 0, z, HASBIT(_transparent_opt, TO_BUILDINGS));
+	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset],  PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, z, HASBIT(_transparent_opt, TO_BUILDINGS));
+
+	/* Start a new SpriteCombine for the front part */
+	EndSpriteCombine();
+	StartSpriteCombine();
+
 	/* For sloped sprites the bounding box needs to be higher, as the pylons stop on a higher point */
-	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + front_offsets[offset], PAL_NONE, x, y, size_x[offset], size_y[offset], offset >= 2 ? 0x30 : 0x10, z, HASBIT(_transparent_opt, TO_BUILDINGS));
+	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + front_offsets[offset], PAL_NONE, x, y, size_x[offset] + front_bb_offset_x[offset], size_y[offset] + front_bb_offset_y[offset], 0x28, z, HASBIT(_transparent_opt, TO_BUILDINGS), front_bb_offset_x[offset], front_bb_offset_y[offset]);
 }
 
 /**
@@ -906,6 +910,27 @@
 	SpriteID image;
 
 	if (IsTunnel(ti->tile)) {
+		/* Front view of tunnel bounding boxes:
+		 *
+		 *   122223  <- BB_Z_SEPARATOR
+		 *   1    3
+		 *   1    3                1,3 = empty helper BB
+		 *   1    3                  2 = SpriteCombine of tunnel-roof and catenary (tram & elrail)
+		 *
+		 */
+
+		static const int _tunnel_BB[4][12] = {
+			/*  tunnnel-roof  |  Z-separator  | tram-catenary
+			 * w  h  bb_x bb_y| x   y   w   h |bb_x bb_y w h */
+			{  1,  0, -15, -14,  0, 15, 16,  1, 0, 1, 16, 15 }, // NE
+			{  0,  1, -14, -15, 15,  0,  1, 16, 1, 0, 15, 16 }, // SE
+			{  1,  0, -15, -14,  0, 15, 16,  1, 0, 1, 16, 15 }, // SW
+			{  0,  1, -14, -15, 15,  0,  1, 16, 1, 0, 15, 16 }, // NW
+		};
+		static const int *BB_data = _tunnel_BB[GetTunnelDirection(ti->tile)];
+
+		bool catenary = false;
+
 		if (GetTunnelTransportType(ti->tile) == TRANSPORT_RAIL) {
 			image = GetRailTypeInfo(GetRailType(ti->tile))->base_sprites.tunnel;
 		} else {
@@ -924,13 +949,27 @@
 				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, HASBIT(_transparent_opt, TO_BUILDINGS));
+
+				catenary = true;
+				StartSpriteCombine();
+				AddSortableSpriteToDraw(SPR_TRAMWAY_TUNNEL_WIRES + dir, PAL_NONE, ti->x, ti->y, BB_data[10], BB_data[11], TILE_HEIGHT, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS), BB_data[8], BB_data[9], BB_Z_SEPARATOR);
 			}
 		} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
 			DrawCatenary(ti);
+
+			catenary = true;
+			StartSpriteCombine();
+			DrawCatenaryOnTunnel(ti);
 		}
 
-		AddSortableSpriteToDraw(image + 1, PAL_NONE, ti->x + TILE_SIZE - 1, ti->y + TILE_SIZE - 1, 1, 1, 8, (byte)ti->z);
+		AddSortableSpriteToDraw(image + 1, PAL_NONE, ti->x + TILE_SIZE - 1, ti->y + TILE_SIZE - 1, BB_data[0], BB_data[1], TILE_HEIGHT, ti->z, false, BB_data[2], BB_data[3], BB_Z_SEPARATOR);
+
+		if (catenary) EndSpriteCombine();
+
+		/* Add helper BB for sprite sorting, that separate the tunnel from things beside of it */
+		AddSortableSpriteToDraw(SPR_EMPTY_BOUNDING_BOX, PAL_NONE, ti->x             , ti->y             , BB_data[6], BB_data[7], TILE_HEIGHT, ti->z);
+		AddSortableSpriteToDraw(SPR_EMPTY_BOUNDING_BOX, PAL_NONE, ti->x + BB_data[4], ti->y + BB_data[5], BB_data[6], BB_data[7], TILE_HEIGHT, ti->z);
+
 		DrawBridgeMiddle(ti);
 	} else if (IsBridge(ti->tile)) { // XXX is this necessary?
 		const PalSpriteID *psid;
@@ -965,6 +1004,9 @@
 
 		/* draw ramp */
 
+		/* Draw Trambits as SpriteCombine */
+		if (GetBridgeTransportType(ti->tile) == TRANSPORT_ROAD) StartSpriteCombine();
+
 		/* HACK set the height of the BB of a sloped ramp to 1 so a vehicle on
 		 * it doesn't disappear behind it
 		 */
@@ -984,8 +1026,10 @@
 				} else {
 					offset += 2;
 				}
+				/* DrawBridgeTramBits() calls EndSpriteCombine() and StartSpriteCombine() */
 				DrawBridgeTramBits(ti->x, ti->y, z, offset, HASBIT(rts, ROADTYPE_ROAD));
 			}
+			EndSpriteCombine();
 		} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
 			DrawCatenary(ti);
 		}
@@ -1031,6 +1075,25 @@
 
 void DrawBridgeMiddle(const TileInfo* ti)
 {
+	/* Sectional view of bridge bounding boxes:
+	 *
+	 *  1           2                                1,2 = SpriteCombine of Bridge front/(back&floor) and TramCatenary
+	 *  1           2                                  3 = empty helper BB
+	 *  1     7     2                                4,5 = pillars under higher bridges
+	 *  1 6 88888 6 2                                  6 = elrail-pylons
+	 *  1 6 88888 6 2                                  7 = elrail-wire
+	 *  1 6 88888 6 2  <- TILE_HEIGHT                  8 = rail-vehicle on bridge
+	 *  3333333333333  <- BB_Z_SEPARATOR
+	 *                 <- unused
+	 *    4       5    <- BB_HEIGHT_UNDER_BRIDGE
+	 *    4       5
+	 *    4       5
+	 *
+	 */
+
+	/* Z position of the bridge sprites relative to bridge height (downwards) */
+	static const int BRIDGE_Z_START = 3;
+
 	const PalSpriteID* psid;
 	uint base_offset;
 	TileIndex rampnorth;
@@ -1066,12 +1129,19 @@
 	x = ti->x;
 	y = ti->y;
 	uint bridge_z = GetBridgeHeight(rampsouth);
-	z = bridge_z - 3;
+	z = bridge_z - BRIDGE_Z_START;
 
+	/* Add a bounding box, that separates the bridge from things below it. */
+	AddSortableSpriteToDraw(SPR_EMPTY_BOUNDING_BOX, PAL_NONE, x, y, 16, 16, 1, bridge_z - TILE_HEIGHT + BB_Z_SEPARATOR);
+
+	/* Draw Trambits as SpriteCombine */
+	if (GetBridgeTransportType(rampsouth) == TRANSPORT_ROAD) StartSpriteCombine();
+
+	/* Draw floor and far part of bridge*/
 	if (axis == AXIS_X) {
-		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 11, 1, z, HASBIT(_transparent_opt, TO_BRIDGES));
+		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 1, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, BRIDGE_Z_START);
 	} else {
-		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 11, 16, 1, z, HASBIT(_transparent_opt, TO_BRIDGES));
+		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 1, 16, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, BRIDGE_Z_START);
 	}
 
 	psid++;
@@ -1080,7 +1150,11 @@
 		RoadTypes rts = GetRoadTypes(rampsouth);
 
 		if (HASBIT(rts, ROADTYPE_TRAM)) {
+			/* DrawBridgeTramBits() calls EndSpriteCombine() and StartSpriteCombine() */
 			DrawBridgeTramBits(x, y, bridge_z, axis ^ 1, HASBIT(rts, ROADTYPE_ROAD));
+		} else {
+			EndSpriteCombine();
+			StartSpriteCombine();
 		}
 	} else if (GetRailType(rampsouth) == RAILTYPE_ELECTRIC) {
 		DrawCatenary(ti);
@@ -1089,12 +1163,15 @@
 	/* draw roof, the component of the bridge which is logically between the vehicle and the camera */
 	if (axis == AXIS_X) {
 		y += 12;
-		if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 1, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES));
+		if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 4, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 3, BRIDGE_Z_START);
 	} else {
 		x += 12;
-		if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 1, 16, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES));
+		if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 4, 16, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 3, 0, BRIDGE_Z_START);
 	}
 
+	/* Draw TramFront as SpriteCombine */
+	if (GetBridgeTransportType(rampsouth) == TRANSPORT_ROAD) EndSpriteCombine();
+
 	psid++;
 	if (ti->z + 5 == z) {
 		/* draw poles below for small bridges */
@@ -1370,7 +1447,7 @@
 	} else if (IsBridge(tile)) { // XXX is this necessary?
 		DiagDirection dir;
 
-		if (v->HasFront() && v->IsPrimaryVehicle()) {
+		if (v->IsPrimaryVehicle()) {
 			/* modify speed of vehicle */
 			uint16 spd = _bridge[GetBridgeType(tile)].speed;
 
@@ -1417,6 +1494,30 @@
 
 static CommandCost TerraformTile_TunnelBridge(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
 {
+	if (_patches.build_on_slopes && AutoslopeEnabled() && IsBridge(tile)) {
+		DiagDirection direction = GetBridgeRampDirection(tile);
+		Axis axis = DiagDirToAxis(direction);
+		CommandCost res;
+
+		/* Check if new slope is valid for bridges in general (so we can savely call GetBridgeFoundation()) */
+		if ((direction == DIAGDIR_NW) || (direction == DIAGDIR_NE)) {
+			res = CheckBridgeSlopeSouth(axis, tileh_new);
+		} else {
+			res = CheckBridgeSlopeNorth(axis, tileh_new);
+		}
+
+		if (!CmdFailed(res)) {
+			uint z_old;
+			Slope tileh_old = GetTileSlope(tile, &z_old);
+
+			z_old += ApplyFoundationToSlope(GetBridgeFoundation(tileh_old, axis), &tileh_old);
+			z_new += ApplyFoundationToSlope(GetBridgeFoundation(tileh_new, axis), &tileh_new);
+
+			/* Surface slope remains unchanged? */
+			if ((z_old == z_new) && (tileh_old == tileh_new)) return _price.terraform;
+		}
+	}
+
 	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 }
 
--- a/src/unmovable_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/unmovable_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -24,6 +24,7 @@
 #include "table/unmovable_land.h"
 #include "genworld.h"
 #include "bridge.h"
+#include "autoslope.h"
 
 /** Destroy a HQ.
  * During normal gameplay you can only implicitely destroy a HQ when you are
@@ -110,6 +111,8 @@
 	return cost;
 }
 
+static Foundation GetFoundation_Unmovable(TileIndex tile, Slope tileh);
+
 static void DrawTile_Unmovable(TileInfo *ti)
 {
 
@@ -132,6 +135,9 @@
 		}
 
 		case UNMOVABLE_STATUE:
+			/* This should prevent statues from sinking into the ground when on a slope. */
+			if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, GetFoundation_Unmovable(ti->tile, ti->tileh));
+
 			DrawGroundSprite(SPR_CONCRETE_GROUND, PAL_NONE);
 
 			AddSortableSpriteToDraw(SPR_STATUE_COMPANY, PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), ti->x, ti->y, 16, 16, 25, ti->z, HASBIT(_transparent_opt, TO_STRUCTURES));
@@ -142,7 +148,7 @@
 
 			AddSortableSpriteToDraw(
 				SPR_BOUGHT_LAND, PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)),
-				ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 10, GetSlopeZ(ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2)
+				ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, BB_HEIGHT_UNDER_BRIDGE, GetSlopeZ(ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2)
 			);
 			DrawBridgeMiddle(ti);
 			break;
@@ -403,6 +409,10 @@
 	/* Owned land remains unsold */
 	if (IsOwnedLand(tile) && CheckTileOwnership(tile)) return CommandCost();
 
+	if (AutoslopeEnabled() && (IsStatue(tile) || IsCompanyHQ(tile))) {
+		if (!IsSteepSlope(tileh_new) && (z_new + GetSlopeMaxZ(tileh_new) == GetTileMaxZ(tile))) return _price.terraform;
+	}
+
 	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 }
 
--- a/src/variables.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/variables.h	Sat Oct 06 21:16:00 2007 +0000
@@ -129,8 +129,8 @@
 	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
-	bool loading_indicators;            // Show loading indicators
+	uint8 advanced_vehicle_list;        // Use the "advanced" vehicle list
+	uint8 loading_indicators;           // Show loading indicators
 	uint8 default_rail_type;            ///< The default rail type for the rail GUI
 
 	uint8 toolbar_pos;                  // position of toolbars, 0=left, 1=center, 2=right
@@ -240,6 +240,13 @@
 
 	bool timetabling;        ///< Whether to allow timetabling.
 	bool timetable_in_ticks; ///< Whether to show the timetable in ticks rather than days.
+
+	bool autoslope;          ///< Allow terraforming under things.
+
+	bool mod_road_rebuild;   ///< Roadworks remove unneccesary RoadBits
+
+	bool exclusive_rights;   ///< allow buying exclusive rights
+	bool give_money;         ///< allow giving other players money
 };
 
 VARDEF Patches _patches;
@@ -315,7 +322,7 @@
 
 VARDEF Vehicle *_place_clicked_vehicle;
 
-VARDEF char _ini_videodriver[32], _ini_musicdriver[32], _ini_sounddriver[32];
+VARDEF char _ini_videodriver[32], _ini_musicdriver[32], _ini_sounddriver[32], _ini_blitter[32];
 
 VARDEF int _num_resolutions;
 VARDEF uint16 _resolutions[32][2];
@@ -335,6 +342,8 @@
 
 extern const TileTypeProcs * const _tile_type_procs[16];
 
+extern bool _draw_bounding_boxes;
+
 /* misc */
 VARDEF char _screenshot_name[128];
 VARDEF byte _vehicle_design_names;
--- a/src/vehicle.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/vehicle.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -92,9 +92,11 @@
 bool VehicleNeedsService(const Vehicle *v)
 {
 	if (v->vehstatus & (VS_STOPPED | VS_CRASHED))       return false;
-	if (_patches.gotodepot && VehicleHasDepotOrders(v)) return false;
-	if (v->current_order.type == OT_LOADING)            return false;
-	if (v->current_order.type == OT_GOTO_DEPOT && v->current_order.flags & OF_HALT_IN_DEPOT) return false;
+	if (v->current_order.type != OT_GOTO_DEPOT || !(v->current_order.flags & OF_PART_OF_ORDERS)) { // Don't interfere with a depot visit by the order list
+		if (_patches.gotodepot && VehicleHasDepotOrders(v)) return false;
+		if (v->current_order.type == OT_LOADING)            return false;
+		if (v->current_order.type == OT_GOTO_DEPOT && v->current_order.flags & OF_HALT_IN_DEPOT) return false;
+	}
 
 	if (_patches.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0) {
 		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 */
@@ -500,7 +502,7 @@
 		case VEH_AIRCRAFT: return IsNormalAircraft(v); // don't count plane shadows and helicopter rotors
 		case VEH_TRAIN:
 			return !IsArticulatedPart(v) && // tenders and other articulated parts
-			(!IsMultiheaded(v) || IsTrainEngine(v)); // rear parts of multiheaded engines
+			!IsRearDualheaded(v); // rear parts of multiheaded engines
 		case VEH_ROAD: return IsRoadVehFront(v);
 		case VEH_SHIP: return true;
 		default: return false; // Only count player buildable vehicles
@@ -1468,8 +1470,8 @@
 {
 	if (v->owner != _local_player) return;
 
-	/* Do not show getting-old message if autorenew is active */
-	if (GetPlayer(v->owner)->engine_renew) return;
+	/* Do not show getting-old message if autorenew is active (and it can replace the vehicle) */
+	if (GetPlayer(v->owner)->engine_renew && GetEngine(v->engine_type)->player_avail != 0) return;
 
 	SetDParam(0, _vehicle_type_names[v->type]);
 	SetDParam(1, v->unitnumber);
@@ -1478,14 +1480,10 @@
 
 void AgeVehicle(Vehicle *v)
 {
-	int age;
-
-	if (v->age < 65535)
-		v->age++;
-
-	age = v->age - v->max_age;
-	if (age == 366*0 || age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4)
-		v->reliability_spd_dec <<= 1;
+	if (v->age < 65535) v->age++;
+
+	int age = v->age - v->max_age;
+	if (age == 366*0 || age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4) v->reliability_spd_dec <<= 1;
 
 	InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
 
@@ -1493,7 +1491,7 @@
 		ShowVehicleGettingOld(v, STR_01A0_IS_GETTING_OLD);
 	} else if (age == 0) {
 		ShowVehicleGettingOld(v, STR_01A1_IS_GETTING_VERY_OLD);
-	} else if (age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4 || age == 366*5) {
+	} else if (age > 0 && (age % 366) == 0) {
 		ShowVehicleGettingOld(v, STR_01A2_IS_GETTING_VERY_OLD_AND);
 	}
 }
@@ -1733,7 +1731,7 @@
 	v = v_front;
 
 	do {
-		if (v->type == VEH_TRAIN && IsMultiheaded(v) && !IsTrainEngine(v)) {
+		if (v->type == VEH_TRAIN && IsRearDualheaded(v)) {
 			/* we build the rear ends of multiheaded trains with the front ones */
 			continue;
 		}
@@ -2621,7 +2619,7 @@
 	SpriteID map = PAL_NONE;
 
 	/* Check if we should use the colour map callback */
-	if (HASBIT(EngInfo(engine_type)->callbackmask, CBM_COLOUR_REMAP)) {
+	if (HASBIT(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_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... */
--- a/src/vehicle.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/vehicle.h	Sat Oct 06 21:16:00 2007 +0000
@@ -220,9 +220,12 @@
 struct Vehicle;
 DECLARE_OLD_POOL(Vehicle, Vehicle, 9, 125)
 
+/* Some declarations of functions, so we can make them friendly */
 struct SaveLoad;
-const SaveLoad *GetVehicleDescription(VehicleType vt);
-void AfterLoadVehicles();
+extern const SaveLoad *GetVehicleDescription(VehicleType vt);
+extern void AfterLoadVehicles();
+struct LoadgameState;
+extern bool LoadOldVehicle(LoadgameState *ls, int num);
 
 struct Vehicle : PoolItem<Vehicle, VehicleID, &_Vehicle_pool> {
 	VehicleTypeByte type;    ///< Type of vehicle
@@ -234,7 +237,8 @@
 	Vehicle *first;          // NOSAVE: pointer to the first vehicle in the chain
 public:
 	friend const SaveLoad *GetVehicleDescription(VehicleType vt); // So we can use private/protected variables in the saveload code
-	friend void AfterLoadVehicles();
+	friend void AfterLoadVehicles();                              // So we can set the previous and first pointers while loading
+	friend bool LoadOldVehicle(LoadgameState *ls, int num);       // So we can set the proper next pointer while loading
 
 	Vehicle *depot_list;     // NOSAVE: linked list to tell what vehicles entered a depot during the last tick. Used by autoreplace
 
@@ -382,6 +386,11 @@
 
 	/**
 	 * Marks the vehicles to be redrawn and updates cached variables
+	 *
+	 * This method marks the area of the vehicle on the screen as dirty.
+	 * It can be use to repaint the vehicle.
+	 *
+	 * @ingroup dirty
 	 */
 	virtual void MarkDirty() {}
 
@@ -414,12 +423,6 @@
 	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; }
-
-	/**
 	 * Gets the sprite to show for the given direction
 	 * @param direction the direction the vehicle is facing
 	 * @return the sprite for the given vehicle in the given direction
--- a/src/vehicle_gui.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/vehicle_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -208,7 +208,7 @@
 			if (!HASBIT(cmask, cid)) continue;
 
 			/* Check the vehicle's callback mask for cargo suffixes */
-			if (HASBIT(callbackmask, CBM_CARGO_SUFFIX)) {
+			if (HASBIT(callbackmask, CBM_VEHICLE_CARGO_SUFFIX)) {
 				/* Make a note of the original cargo type. It has to be
 				 * changed to test the cargo & subtype... */
 				CargoID temp_cargo = u->cargo_type;
@@ -1240,7 +1240,12 @@
 
 void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type)
 {
-	if (player == _local_player && _patches.advanced_vehicle_list) {
+	/* If _patches.advanced_vehicle_list > 1, display the Advanced list
+	 * if _patches.advanced_vehicle_list == 1, display Advanced list only for local player
+	 * if _ctrl_pressed, do the opposite action (Advanced list x Normal list)
+	 */
+
+	if ((_patches.advanced_vehicle_list > (uint)(player != _local_player)) != _ctrl_pressed) {
 		ShowPlayerGroup(player, vehicle_type);
 	} else {
 		ShowVehicleListWindowLocal(player, VLW_STANDARD, vehicle_type, 0);
@@ -1273,6 +1278,374 @@
 }
 
 
+/* Unified vehicle GUI - Vehicle Details Window */
+
+/** Constants of vehicle details widget indices */
+enum VehicleDetailsWindowWidgets {
+	VLD_WIDGET_CLOSEBOX = 0,
+	VLD_WIDGET_CAPTION,
+	VLD_WIDGET_RENAME_VEHICLE,
+	VLD_WIDGET_TOP_DETAILS,
+	VLD_WIDGET_INCREASE_SERVICING_INTERVAL,
+	VLD_WIDGET_DECREASE_SERVICING_INTERVAL,
+	VLD_WIDGET_BOTTOM_RIGHT,
+	VLD_WIDGET_MIDDLE_DETAILS,
+	VLD_WIDGET_SCROLLBAR,
+	VLD_WIDGET_DETAILS_CARGO_CARRIED,
+	VLD_WIDGET_DETAILS_TRAIN_VEHICLES,
+	VLD_WIDGET_DETAILS_CAPACITY_OF_EACH,
+	VLD_WIDGET_DETAILS_TOTAL_CARGO,
+	VLD_WIDGET_RESIZE,
+};
+
+/** Vehicle details widgets. */
+static const Widget _vehicle_details_widgets[] = {
+	{   WWT_CLOSEBOX,   RESIZE_NONE, 14,   0,  10,   0,  13, STR_00C5,             STR_018B_CLOSE_WINDOW},                  // VLD_WIDGET_CLOSEBOX
+	{    WWT_CAPTION,  RESIZE_RIGHT, 14,  11, 364,   0,  13, 0x0,                  STR_018C_WINDOW_TITLE_DRAG_THIS},        // VLD_WIDGET_CAPTION
+	{ WWT_PUSHTXTBTN,     RESIZE_LR, 14, 365, 404,   0,  13, STR_01AA_NAME,        STR_NULL /* filled in later */},         // VLD_WIDGET_RENAME_VEHICLE
+	{      WWT_PANEL,  RESIZE_RIGHT, 14,   0, 404,  14,  55, 0x0,                  STR_NULL},                               // VLD_WIDGET_TOP_DETAILS
+	{ WWT_PUSHTXTBTN,     RESIZE_TB, 14,   0,  10, 101, 106, STR_0188,             STR_884D_INCREASE_SERVICING_INTERVAL},   // VLD_WIDGET_INCREASE_SERVICING_INTERVAL
+	{ WWT_PUSHTXTBTN,     RESIZE_TB, 14,   0,  10, 107, 112, STR_0189,             STR_884E_DECREASE_SERVICING_INTERVAL},   // VLD_WIDGET_DECREASE_SERVICING_INTERVAL
+	{      WWT_PANEL,    RESIZE_RTB, 14,  11, 404, 101, 112, 0x0,                  STR_NULL},                               // VLD_WIDGET_BOTTOM_RIGHT
+	{     WWT_MATRIX,     RESIZE_RB, 14,   0, 392,  56, 100, 0x701,                STR_NULL},                               // VLD_WIDGET_MIDDLE_DETAILS
+	{  WWT_SCROLLBAR,    RESIZE_LRB, 14, 393, 404,  56, 100, 0x0,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},       // VLD_WIDGET_SCROLLBAR
+	{ WWT_PUSHTXTBTN,     RESIZE_TB, 14,   0,  95, 113, 124, STR_013C_CARGO,       STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED}, // VLD_WIDGET_DETAILS_CARGO_CARRIED
+	{ WWT_PUSHTXTBTN,     RESIZE_TB, 14,  96, 194, 113, 124, STR_013D_INFORMATION, STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES},// VLD_WIDGET_DETAILS_TRAIN_VEHICLES
+	{ WWT_PUSHTXTBTN,     RESIZE_TB, 14, 195, 293, 113, 124, STR_013E_CAPACITIES,  STR_8851_SHOW_CAPACITIES_OF_EACH},       // VLD_WIDGET_DETAILS_CAPACITY_OF_EACH
+	{ WWT_PUSHTXTBTN,    RESIZE_RTB, 14, 294, 392, 113, 124, STR_013E_TOTAL_CARGO, STR_8852_SHOW_TOTAL_CARGO},              // VLD_WIDGET_DETAILS_TOTAL_CARGO
+	{  WWT_RESIZEBOX,   RESIZE_LRTB, 14, 393, 404, 113, 124, 0x0,                  STR_RESIZE_BUTTON},                      // VLD_RESIZE
+	{   WIDGETS_END},
+};
+
+
+/** Command indices for the _vehicle_command_translation_table. */
+enum VehicleStringTranslation {
+	VST_VEHICLE_AGE_RUNNING_COST_YR,
+	VST_VEHICLE_MAX_SPEED,
+	VST_VEHICLE_PROFIT_THIS_YEAR_LAST_YEAR,
+	VST_VEHICLE_RELIABILITY_BREAKDOWNS,
+};
+
+/** Command codes for the shared buttons indexed by VehicleCommandTranslation and vehicle type. */
+static const StringID _vehicle_translation_table[][4] = {
+	{ // VST_VEHICLE_AGE_RUNNING_COST_YR
+		STR_885D_AGE_RUNNING_COST_YR,
+		STR_900D_AGE_RUNNING_COST_YR,
+		STR_9812_AGE_RUNNING_COST_YR,
+		STR_A00D_AGE_RUNNING_COST_YR,
+	},
+	{ // VST_VEHICLE_MAX_SPEED
+		STR_NULL,
+		STR_900E_MAX_SPEED,
+		STR_9813_MAX_SPEED,
+		STR_A00E_MAX_SPEED,
+	},
+	{ // VST_VEHICLE_PROFIT_THIS_YEAR_LAST_YEAR
+		STR_885F_PROFIT_THIS_YEAR_LAST_YEAR,
+		STR_900F_PROFIT_THIS_YEAR_LAST_YEAR,
+		STR_9814_PROFIT_THIS_YEAR_LAST_YEAR,
+		STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR,
+	},
+	{ // VST_VEHICLE_RELIABILITY_BREAKDOWNS
+		STR_8860_RELIABILITY_BREAKDOWNS,
+		STR_9010_RELIABILITY_BREAKDOWNS,
+		STR_9815_RELIABILITY_BREAKDOWNS,
+		STR_A010_RELIABILITY_BREAKDOWNS,
+	},
+};
+
+/** Initialize a newly created vehicle details window */
+void CreateVehicleDetailsWindow(Window *w)
+{
+	const Vehicle *v = GetVehicle(w->window_number);
+
+	switch (v->type) {
+		case VEH_TRAIN:
+			ResizeWindow(w, 0, 39);
+
+			w->vscroll.cap = 6;
+			w->height += 12;
+			w->resize.step_height = 14;
+			w->resize.height = w->height - 14 * 2; // Minimum of 4 wagons in the display
+
+			w->widget[VLD_WIDGET_RENAME_VEHICLE].tooltips = STR_8867_NAME_TRAIN;
+			w->widget[VLD_WIDGET_CAPTION].data = STR_8802_DETAILS;
+			break;
+
+		case VEH_ROAD: {
+			w->widget[VLD_WIDGET_CAPTION].data = STR_900C_DETAILS;
+			w->widget[VLD_WIDGET_RENAME_VEHICLE].tooltips = STR_902E_NAME_ROAD_VEHICLE;
+
+			if (!RoadVehHasArticPart(v)) break;
+
+			/* Draw the text under the vehicle instead of next to it, minus the
+			* height already allocated for the cargo of the first vehicle. */
+			uint height_extension = 15 - 11;
+
+			/* Add space for the cargo amount for each part. */
+			for (const Vehicle *u = v; u != NULL; u = u->Next()) {
+				height_extension += 11;
+			}
+
+			ResizeWindow(w, 0, height_extension);
+		} break;
+
+		case VEH_SHIP:
+			w->widget[VLD_WIDGET_RENAME_VEHICLE].tooltips = STR_982F_NAME_SHIP;
+			w->widget[VLD_WIDGET_CAPTION].data = STR_9811_DETAILS;
+			break;
+
+		case VEH_AIRCRAFT:
+			ResizeWindow(w, 0, 11);
+			w->widget[VLD_WIDGET_RENAME_VEHICLE].tooltips = STR_A032_NAME_AIRCRAFT;
+			w->widget[VLD_WIDGET_CAPTION].data = STR_A00C_DETAILS;
+			break;
+		default: NOT_REACHED();
+	}
+
+	if (v->type != VEH_TRAIN) {
+		w->vscroll.cap = 1;
+		w->widget[VLD_WIDGET_MIDDLE_DETAILS].right += 12;
+	}
+
+	w->widget[VLD_WIDGET_MIDDLE_DETAILS].data = (w->vscroll.cap << 8) + 1;
+	w->caption_color = v->owner;
+
+	WP(w, vehicledetails_d).tab = 0;
+}
+
+/** Checks whether service interval is enabled for the vehicle. */
+static bool inline IsVehicleServiceIntervalEnabled(const VehicleType vehicle_type)
+{
+	switch (vehicle_type) {
+		case VEH_TRAIN:    return _patches.servint_trains   != 0; break;
+		case VEH_ROAD:     return _patches.servint_roadveh  != 0; break;
+		case VEH_SHIP:     return _patches.servint_ships    != 0; break;
+		case VEH_AIRCRAFT: return _patches.servint_aircraft != 0; break;
+		default: NOT_REACHED();
+	}
+}
+
+extern int GetTrainDetailsWndVScroll(VehicleID veh_id, byte det_tab);
+extern void DrawTrainDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint16 vscroll_cap, byte det_tab);
+extern void DrawRoadVehDetails(const Vehicle *v, int x, int y);
+extern void DrawShipDetails(const Vehicle *v, int x, int y);
+extern void DrawAircraftDetails(const Vehicle *v, int x, int y);
+
+/**
+* Draw the details for the given vehicle at the position (x,y) of the Details windows
+*
+* @param v current vehicle
+* @param x The x coordinate
+* @param y The y coordinate
+* @param vscroll_pos (train only)
+* @param vscroll_cap (train only)
+* @param det_tab (train only)
+*/
+static inline void DrawVehicleDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint vscroll_cap, byte det_tab)
+{
+	switch (v->type) {
+		case VEH_TRAIN:    DrawTrainDetails(v, x, y, vscroll_pos, vscroll_cap, det_tab);  break;
+		case VEH_ROAD:     DrawRoadVehDetails(v, x, y);  break;
+		case VEH_SHIP:     DrawShipDetails(v, x, y);     break;
+		case VEH_AIRCRAFT: DrawAircraftDetails(v, x, y); break;
+		default: NOT_REACHED();
+	}
+}
+
+/** Repaint vehicle details window. */
+static void DrawVehicleDetailsWindow(Window *w)
+{
+	const Vehicle *v = GetVehicle(w->window_number);
+	byte det_tab = WP(w, vehicledetails_d).tab;
+
+	SetWindowWidgetDisabledState(w, VLD_WIDGET_RENAME_VEHICLE, v->owner != _local_player);
+
+	if (v->type == VEH_TRAIN) {
+		DisableWindowWidget(w, det_tab + VLD_WIDGET_DETAILS_CARGO_CARRIED);
+		SetVScrollCount(w, GetTrainDetailsWndVScroll(v->index, det_tab));
+	}
+
+	SetWindowWidgetsHiddenState(w, v->type != VEH_TRAIN,
+		VLD_WIDGET_SCROLLBAR,
+		VLD_WIDGET_DETAILS_CARGO_CARRIED,
+		VLD_WIDGET_DETAILS_TRAIN_VEHICLES,
+		VLD_WIDGET_DETAILS_CAPACITY_OF_EACH,
+		VLD_WIDGET_DETAILS_TOTAL_CARGO,
+		VLD_WIDGET_RESIZE,
+		WIDGET_LIST_END);
+
+	/* Disable service-scroller when interval is set to disabled */
+	SetWindowWidgetsDisabledState(w, !IsVehicleServiceIntervalEnabled(v->type),
+		VLD_WIDGET_INCREASE_SERVICING_INTERVAL,
+		VLD_WIDGET_DECREASE_SERVICING_INTERVAL,
+		WIDGET_LIST_END);
+
+
+	SetDParam(0, v->index);
+	DrawWindowWidgets(w);
+
+	/* Draw running cost */
+	SetDParam(1, v->age / 366);
+	SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
+	SetDParam(2, v->max_age / 366);
+	SetDParam(3, v->GetDisplayRunningCost());
+	DrawString(2, 15, _vehicle_translation_table[VST_VEHICLE_AGE_RUNNING_COST_YR][v->type], 0);
+
+	/* Draw max speed */
+	switch (v->type) {
+		case VEH_TRAIN:
+			SetDParam(2, v->GetDisplayMaxSpeed());
+			SetDParam(1, v->u.rail.cached_power);
+			SetDParam(0, v->u.rail.cached_weight);
+			SetDParam(3, v->u.rail.cached_max_te / 1000);
+			DrawString(2, 25, (_patches.realistic_acceleration && v->u.rail.railtype != RAILTYPE_MAGLEV) ?
+				STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :
+				STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED, 0);
+			break;
+
+		case VEH_ROAD:
+		case VEH_SHIP:
+		case VEH_AIRCRAFT:
+			SetDParam(0, v->GetDisplayMaxSpeed());
+			DrawString(2, 25, _vehicle_translation_table[VST_VEHICLE_MAX_SPEED][v->type], 0);
+			break;
+
+		default: NOT_REACHED();
+	}
+
+	/* Draw profit */
+	SetDParam(0, v->profit_this_year);
+	SetDParam(1, v->profit_last_year);
+	DrawString(2, 35, _vehicle_translation_table[VST_VEHICLE_PROFIT_THIS_YEAR_LAST_YEAR][v->type], 0);
+
+	/* Draw breakdown & reliability */
+	SetDParam(0, v->reliability * 100 >> 16);
+	SetDParam(1, v->breakdowns_since_last_service);
+	DrawString(2, 45, _vehicle_translation_table[VST_VEHICLE_RELIABILITY_BREAKDOWNS][v->type], 0);
+
+	/* Draw service interval text */
+	SetDParam(0, v->service_interval);
+	SetDParam(1, v->date_of_last_service);
+	DrawString(13, w->height - (v->type != VEH_TRAIN ? 11 : 23), _patches.servint_ispercent ? STR_SERVICING_INTERVAL_PERCENT : STR_883C_SERVICING_INTERVAL_DAYS, 0);
+
+	switch (v->type) {
+		case VEH_TRAIN:
+			DrawVehicleDetails(v, 2, 57, w->vscroll.pos, w->vscroll.cap, det_tab);
+			break;
+
+		case VEH_ROAD:
+		case VEH_SHIP:
+		case VEH_AIRCRAFT:
+			DrawVehicleImage(v, 3, 57, 0, 0, INVALID_VEHICLE);
+			DrawVehicleDetails(v, 75, 57, w->vscroll.pos, w->vscroll.cap, det_tab);
+			break;
+
+		default: NOT_REACHED();
+	}
+}
+
+/** Message strings for renaming vehicles indexed by vehicle type. */
+static const StringID _name_vehicle_title[] = {
+	STR_8865_NAME_TRAIN,
+	STR_902C_NAME_ROAD_VEHICLE,
+	STR_9831_NAME_SHIP,
+	STR_A030_NAME_AIRCRAFT
+};
+
+/** Message strings for error while renaming indexed by vehicle type. */
+static const StringID _name_vehicle_error[] = {
+	STR_8866_CAN_T_NAME_TRAIN,
+	STR_902D_CAN_T_NAME_ROAD_VEHICLE,
+	STR_9832_CAN_T_NAME_SHIP,
+	STR_A031_CAN_T_NAME_AIRCRAFT
+};
+
+/** Window event hook for vehicle details. */
+static void VehicleDetailsWndProc(Window *w, WindowEvent *e)
+{
+	switch (e->event) {
+		case WE_CREATE:
+			CreateVehicleDetailsWindow(w);
+			break;
+
+		case WE_PAINT:
+			DrawVehicleDetailsWindow(w);
+			break;
+
+		case WE_CLICK: {
+			switch (e->we.click.widget) {
+				case VLD_WIDGET_RENAME_VEHICLE: {// rename
+					const Vehicle *v = GetVehicle(w->window_number);
+					SetDParam(0, v->index);
+					ShowQueryString(STR_VEHICLE_NAME, _name_vehicle_title[v->type], 31, 150, w, CS_ALPHANUMERAL);
+				} break;
+
+				case VLD_WIDGET_INCREASE_SERVICING_INTERVAL:   // increase int
+				case VLD_WIDGET_DECREASE_SERVICING_INTERVAL: { // decrease int
+					int mod = _ctrl_pressed ? 5 : 10;
+					const Vehicle *v = GetVehicle(w->window_number);
+
+					mod = (e->we.click.widget == VLD_WIDGET_DECREASE_SERVICING_INTERVAL) ? -mod : mod;
+					mod = GetServiceIntervalClamped(mod + v->service_interval);
+					if (mod == v->service_interval) return;
+
+					DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
+				} break;
+
+				case VLD_WIDGET_DETAILS_CARGO_CARRIED:
+				case VLD_WIDGET_DETAILS_TRAIN_VEHICLES:
+				case VLD_WIDGET_DETAILS_CAPACITY_OF_EACH:
+				case VLD_WIDGET_DETAILS_TOTAL_CARGO:
+					SetWindowWidgetsDisabledState(w, false,
+						VLD_WIDGET_DETAILS_CARGO_CARRIED,
+						VLD_WIDGET_DETAILS_TRAIN_VEHICLES,
+						VLD_WIDGET_DETAILS_CAPACITY_OF_EACH,
+						VLD_WIDGET_DETAILS_TOTAL_CARGO,
+						e->we.click.widget,
+						WIDGET_LIST_END);
+
+					WP(w, vehicledetails_d).tab = e->we.click.widget - VLD_WIDGET_DETAILS_CARGO_CARRIED;
+					SetWindowDirty(w);
+					break;
+			}
+		} break;
+
+		case WE_ON_EDIT_TEXT:
+			if (!StrEmpty(e->we.edittext.str)) {
+				_cmd_text = e->we.edittext.str;
+				DoCommandP(0, w->window_number, 0, NULL, CMD_NAME_VEHICLE | CMD_MSG(_name_vehicle_error[GetVehicle(w->window_number)->type]));
+			}
+			break;
+
+		case WE_RESIZE:
+			if (e->we.sizing.diff.x != 0) ResizeButtons(w, VLD_WIDGET_DETAILS_CARGO_CARRIED, VLD_WIDGET_DETAILS_TOTAL_CARGO);
+			if (e->we.sizing.diff.y == 0) break;
+
+			w->vscroll.cap += e->we.sizing.diff.y / 14;
+			w->widget[VLD_WIDGET_MIDDLE_DETAILS].data = (w->vscroll.cap << 8) + 1;
+			break;
+	}
+}
+
+/** Vehicle details window descriptor. */
+static const WindowDesc _vehicle_details_desc = {
+	WDP_AUTO, WDP_AUTO, 405, 113, 405, 113,
+	WC_VEHICLE_DETAILS, WC_VEHICLE_VIEW,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
+	_vehicle_details_widgets,
+	VehicleDetailsWndProc
+};
+
+/** Shows the vehicle details window of the given vehicle. */
+static void ShowVehicleDetailsWindow(const Vehicle *v)
+{
+	DeleteWindowById(WC_VEHICLE_ORDERS, v->index);
+	DeleteWindowById(WC_VEHICLE_DETAILS, v->index);
+	AllocateWindowDescFront(&_vehicle_details_desc, v->index);
+}
+
+
 /* Unified vehicle GUI - Vehicle View Window */
 
 /** Constants of vehicle view widget indices */
@@ -1509,27 +1882,6 @@
 	}
 }
 
-
-/* When unified GUI is complete these functions will also be unified to one
- * function in this module */
-void ShowAircraftDetailsWindow(const Vehicle *v);
-void ShowShipDetailsWindow(const Vehicle *v);
-void ShowRoadVehDetailsWindow(const Vehicle *v);
-void ShowTrainDetailsWindow(const Vehicle *v);
-
-
-/** Provisional dispatch to vehicle-specific detail window functions. */
-static void ShowVehicleDetailsWindow(const Vehicle *v)
-{
-	switch (v->type) {
-		case VEH_TRAIN:    ShowTrainDetailsWindow(v);    break;
-		case VEH_ROAD:     ShowRoadVehDetailsWindow(v);  break;
-		case VEH_SHIP:     ShowShipDetailsWindow(v);     break;
-		case VEH_AIRCRAFT: ShowAircraftDetailsWindow(v); break;
-		default: NOT_REACHED();
-	}
-}
-
 /** Checks whether the vehicle may be refitted at the moment.*/
 static bool IsVehicleRefitable(const Vehicle *v)
 {
--- a/src/video/win32_v.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/video/win32_v.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -494,6 +494,9 @@
 			 * WM_KEYDOWN only handles CTRL+ commands and special keys like VK_LEFT, etc. */
 			if (keycode == 0 || (keycode > WKC_PAUSE && GB(keycode, 13, 4) == 0)) return 0;
 
+			/* Keys handled in WM_CHAR */
+			if ((uint)(GB(keycode, 0, 12) - WKC_NUM_DIV) <= WKC_MINUS - WKC_NUM_DIV) return 0;
+
 			HandleKeypress(0 | (keycode << 16));
 			return 0;
 		}
--- a/src/viewport.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/viewport.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -67,6 +67,7 @@
 struct TileSpriteToDraw {
 	SpriteID image;
 	SpriteID pal;
+	const SubSprite *sub;           ///< only draw a rectangular part of the sprite
 	TileSpriteToDraw *next;
 	int32 x;
 	int32 y;
@@ -76,31 +77,41 @@
 struct ChildScreenSpriteToDraw {
 	SpriteID image;
 	SpriteID pal;
+	const SubSprite *sub;           ///< only draw a rectangular part of the sprite
 	int32 x;
 	int32 y;
 	ChildScreenSpriteToDraw *next;
 };
 
 struct ParentSpriteToDraw {
-	SpriteID image;
-	SpriteID pal;
-	int32 left;
-	int32 top;
-	int32 right;
-	int32 bottom;
-	int32 xmin;
-	int32 ymin;
-	int32 xmax;
-	int32 ymax;
-	ChildScreenSpriteToDraw *child;
-	byte unk16;
-	byte zmin;
-	byte zmax;
+	SpriteID image;                 ///< sprite to draw
+	SpriteID pal;                   ///< palette to use
+	const SubSprite *sub;           ///< only draw a rectangular part of the sprite
+
+	int32 x;                        ///< screen X coordinate of sprite
+	int32 y;                        ///< screen Y coordinate of sprite
+
+	int32 left;                     ///< minimal screen X coordinate of sprite (= x + sprite->x_offs), reference point for child sprites
+	int32 top;                      ///< minimal screen Y coordinate of sprite (= y + sprite->y_offs), reference point for child sprites
+
+	int32 xmin;                     ///< minimal world X coordinate of bounding box
+	int32 xmax;                     ///< maximal world X coordinate of bounding box
+	int32 ymin;                     ///< minimal world Y coordinate of bounding box
+	int32 ymax;                     ///< maximal world Y coordinate of bounding box
+	int zmin;                       ///< minimal world Z coordinate of bounding box
+	int zmax;                       ///< maximal world Z coordinate of bounding box
+
+	ChildScreenSpriteToDraw *child; ///< head of child list;
+	bool comparison_done;           ///< Used during sprite sorting: true if sprite has been compared with all other sprites
 };
 
 /* Quick hack to know how much memory to reserve when allocating from the spritelist
  * to prevent a buffer overflow. */
 #define LARGEST_SPRITELIST_STRUCT ParentSpriteToDraw
+assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(StringSpriteToDraw));
+assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(TileSpriteToDraw));
+assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(ChildScreenSpriteToDraw));
+assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(ParentSpriteToDraw));
 
 struct ViewportDrawer {
 	DrawPixelInfo dpi;
@@ -421,7 +432,18 @@
 	InvalidateWidget(w, widget_zoom_out);
 }
 
-void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z)
+/**
+ * Draws a ground sprite at a specific world-coordinate.
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param x position x of the sprite.
+ * @param y position y of the sprite.
+ * @param z position z of the sprite.
+ * @param sub Only draw a part of the sprite.
+ *
+ */
+void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub)
 {
 	ViewportDrawer *vd = _cur_vd;
 	TileSpriteToDraw *ts;
@@ -438,6 +460,7 @@
 
 	ts->image = image;
 	ts->pal = pal;
+	ts->sub = sub;
 	ts->next = NULL;
 	ts->x = x;
 	ts->y = y;
@@ -446,14 +469,22 @@
 	vd->last_tile = &ts->next;
 }
 
-void DrawGroundSprite(SpriteID image, SpriteID pal)
+/**
+ * Draws a ground sprite for the current tile.
+ * If the current tile is drawn on top of a foundation the sprite is added as child sprite to the "foundation"-ParentSprite.
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param sub Only draw a part of the sprite.
+ */
+void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub)
 {
 	if (_offset_ground_sprites) {
 		/* offset ground sprite because of foundation? */
-		AddChildSpriteScreen(image, pal, _cur_vd->offs_x, _cur_vd->offs_y);
+		AddChildSpriteScreen(image, pal, _cur_vd->offs_x, _cur_vd->offs_y, false, sub);
 	} else {
 		_added_tile_sprite = true;
-		DrawGroundSpriteAt(image, pal, _cur_ti->x, _cur_ti->y, _cur_ti->z);
+		DrawGroundSpriteAt(image, pal, _cur_ti->x, _cur_ti->y, _cur_ti->z, sub);
 	}
 }
 
@@ -465,7 +496,18 @@
 	_offset_ground_sprites = true;
 }
 
-static void AddCombinedSprite(SpriteID image, SpriteID pal, int x, int y, byte z)
+/**
+ * Adds a child sprite to a parent sprite.
+ * In contrast to "AddChildSpriteScreen()" the sprite position is in world coordinates
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param x position x of the sprite.
+ * @param y position y of the sprite.
+ * @param z position z of the sprite.
+ * @param sub Only draw a part of the sprite.
+ */
+static void AddCombinedSprite(SpriteID image, SpriteID pal, int x, int y, byte z, const SubSprite *sub)
 {
 	const ViewportDrawer *vd = _cur_vd;
 	Point pt = RemapCoords(x, y, z);
@@ -477,26 +519,39 @@
 			pt.y + spr->y_offs + spr->height <= vd->dpi.top)
 		return;
 
-	AddChildSpriteScreen(image, pal, pt.x - vd->parent_list[-1]->left, pt.y - vd->parent_list[-1]->top);
+	AddChildSpriteScreen(image, pal, pt.x - vd->parent_list[-1]->left, pt.y - vd->parent_list[-1]->top, false, sub);
 }
 
-/** Draw a (transparent) sprite at given coordinates
+/** Draw a (transparent) sprite at given coordinates with a given bounding box.
+ * The bounding box extends from (x + bb_offset_x, y + bb_offset_y, z + bb_offset_z) to (x + w - 1, y + h - 1, z + dz - 1), both corners included.
+ * Bounding boxes with bb_offset_x == w or bb_offset_y == h or bb_offset_z == dz are allowed and produce thin slices.
+ *
+ * @note Bounding boxes are normally specified with bb_offset_x = bb_offset_y = bb_offset_z = 0. The extent of the bounding box in negative direction is
+ *       defined by the sprite offset in the grf file.
+ *       However if modifying the sprite offsets is not suitable (e.g. when using existing graphics), the bounding box can be tuned by bb_offset.
+ *
+ * @pre w >= bb_offset_x, h >= bb_offset_y, dz >= bb_offset_z. Else w, h or dz are ignored.
+ *
  * @param image the image to combine and draw,
  * @param pal the provided palette,
- * @param x position x of the sprite,
- * @param y position y of the sprite,
- * @param w width of the sprite,
- * @param h height of the sprite,
- * @param dz delta z, difference of elevation between sprite and parent sprite,
- * @param z elevation of the sprite,
- * @param transparent if true, switch the palette between the provided palette and the transparent palette
+ * @param x position X (world) of the sprite,
+ * @param y position Y (world) of the sprite,
+ * @param w bounding box extent towards positive X (world),
+ * @param h bounding box extent towards positive Y (world),
+ * @param dz bounding box extent towards positive Z (world),
+ * @param z position Z (world) of the sprite,
+ * @param transparent if true, switch the palette between the provided palette and the transparent palette,
+ * @param bb_offset_x bounding box extent towards negative X (world),
+ * @param bb_offset_y bounding box extent towards negative Y (world),
+ * @param bb_offset_z bounding box extent towards negative Z (world)
+ * @param sub Only draw a part of the sprite.
  */
-void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, byte dz, byte z, bool transparent)
+void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, int dz, int z, bool transparent, int bb_offset_x, int bb_offset_y, int bb_offset_z, const SubSprite *sub)
 {
 	ViewportDrawer *vd = _cur_vd;
 	ParentSpriteToDraw *ps;
-	const Sprite *spr;
 	Point pt;
+	int32 left, right, top, bottom;
 
 	assert((image & SPRITE_MASK) < MAX_SPRITES);
 
@@ -507,7 +562,7 @@
 	}
 
 	if (vd->combine_sprites == 2) {
-		AddCombinedSprite(image, pal, x, y, z);
+		AddCombinedSprite(image, pal, x, y, z, sub);
 		return;
 	}
 
@@ -531,11 +586,34 @@
 	}
 
 	pt = RemapCoords(x, y, z);
-	spr = GetSprite(image & SPRITE_MASK);
-	if ((ps->left   = (pt.x += spr->x_offs)) >= vd->dpi.left + vd->dpi.width ||
-			(ps->right  = (pt.x +  spr->width )) <= vd->dpi.left ||
-			(ps->top    = (pt.y += spr->y_offs)) >= vd->dpi.top + vd->dpi.height ||
-			(ps->bottom = (pt.y +  spr->height)) <= vd->dpi.top) {
+	ps->x = pt.x;
+	ps->y = pt.y;
+
+	/* Compute screen extents of sprite */
+	if (image == SPR_EMPTY_BOUNDING_BOX) {
+		left = ps->left = RemapCoords(x + w          , y + bb_offset_y, z + bb_offset_z).x;
+		right           = RemapCoords(x + bb_offset_x, y + h          , z + bb_offset_z).x + 1;
+		top  = ps->top  = RemapCoords(x + bb_offset_x, y + bb_offset_y, z + dz         ).y;
+		bottom          = RemapCoords(x + w          , y + h          , z + bb_offset_z).y + 1;
+	} else {
+		const Sprite *spr = GetSprite(image & SPRITE_MASK);
+		left = ps->left = (pt.x += spr->x_offs);
+		right           = (pt.x +  spr->width );
+		top  = ps->top  = (pt.y += spr->y_offs);
+		bottom          = (pt.y +  spr->height);
+	}
+	if (_draw_bounding_boxes && (image != SPR_EMPTY_BOUNDING_BOX)) {
+		/* Compute maximal extents of sprite and it's bounding box */
+		left   = min(left  , RemapCoords(x + w          , y + bb_offset_y, z + bb_offset_z).x);
+		right  = max(right , RemapCoords(x + bb_offset_x, y + h          , z + bb_offset_z).x + 1);
+		top    = min(top   , RemapCoords(x + bb_offset_x, y + bb_offset_y, z + dz         ).y);
+		bottom = max(bottom, RemapCoords(x + w          , y + h          , z + bb_offset_z).y + 1);
+	}
+	/* Do not add the sprite to the viewport, if it is outside */
+	if (left   >= vd->dpi.left + vd->dpi.width ||
+	    right  <= vd->dpi.left ||
+	    top    >= vd->dpi.top + vd->dpi.height ||
+	    bottom <= vd->dpi.top) {
 		return;
 	}
 
@@ -543,16 +621,17 @@
 
 	ps->image = image;
 	ps->pal = pal;
-	ps->xmin = x;
-	ps->xmax = x + w - 1;
-
-	ps->ymin = y;
-	ps->ymax = y + h - 1;
-
-	ps->zmin = z;
-	ps->zmax = z + dz - 1;
-
-	ps->unk16 = 0;
+	ps->sub = sub;
+	ps->xmin = x + bb_offset_x;
+	ps->xmax = x + max(bb_offset_x, w) - 1;
+
+	ps->ymin = y + bb_offset_y;
+	ps->ymax = y + max(bb_offset_y, h) - 1;
+
+	ps->zmin = z + bb_offset_z;
+	ps->zmax = z + max(bb_offset_z, dz) - 1;
+
+	ps->comparison_done = false;
 	ps->child = NULL;
 	vd->last_child = &ps->child;
 
@@ -571,19 +650,36 @@
 	_cur_vd->combine_sprites = 0;
 }
 
-void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y)
+/**
+ * Add a child sprite to a parent sprite.
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param x sprite x-offset (screen coordinates) relative to parent sprite.
+ * @param y sprite y-offset (screen coordinates) relative to parent sprite.
+ * @param transparent if true, switch the palette between the provided palette and the transparent palette,
+ * @param sub Only draw a part of the sprite.
+ */
+void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y, bool transparent, const SubSprite *sub)
 {
 	ViewportDrawer *vd = _cur_vd;
 	ChildScreenSpriteToDraw *cs;
 
 	assert((image & SPRITE_MASK) < MAX_SPRITES);
 
+	/* make the sprites transparent with the right palette */
+	if (transparent) {
+		SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
+		pal = PALETTE_TO_TRANSPARENT;
+	}
+
 	if (vd->spritelist_mem >= vd->eof_spritelist_mem) {
 		DEBUG(sprite, 0, "Out of sprite memory");
 		return;
 	}
 	cs = (ChildScreenSpriteToDraw*)vd->spritelist_mem;
 
+	/* If the ParentSprite was clipped by the viewport bounds, do not draw the ChildSprites either */
 	if (vd->last_child == NULL) return;
 
 	vd->spritelist_mem += sizeof(ChildScreenSpriteToDraw);
@@ -593,6 +689,7 @@
 
 	cs->image = image;
 	cs->pal = pal;
+	cs->sub = sub;
 	cs->x = x;
 	cs->y = y;
 	cs->next = NULL;
@@ -636,6 +733,17 @@
 	}
 }
 
+/**
+ * Draws a selection rectangle on a tile.
+ *
+ * @param ti TileInfo Tile that is being drawn
+ * @param pal Palette to apply.
+ */
+static void DrawTileSelectionRect(const TileInfo *ti, SpriteID pal)
+{
+	DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], pal, ti);
+}
+
 static bool IsPartOfAutoLine(int px, int py)
 {
 	px -= _thd.selstart.x;
@@ -669,17 +777,38 @@
 #include "table/autorail.h"
 
 /**
+ * Draws autorail highlights.
+ *
+ * @param *ti TileInfo Tile that is being drawn
+ * @param autorail_type Offset into _AutorailTilehSprite[][]
+ */
+static void DrawAutorailSelection(const TileInfo *ti, uint autorail_type)
+{
+	SpriteID image;
+	SpriteID pal;
+	int offset;
+
+	offset = _AutorailTilehSprite[ti->tileh][autorail_type];
+	if (offset >= 0) {
+		image = SPR_AUTORAIL_BASE + offset;
+		pal = PAL_NONE;
+	} else {
+		image = SPR_AUTORAIL_BASE - offset;
+		pal = PALETTE_SEL_TILE_RED;
+	}
+
+	DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti);
+}
+
+/**
  * Checks if the specified tile is selected and if so draws selection using correct selectionstyle.
  * @param *ti TileInfo Tile that is being drawn
  */
 static void DrawTileSelection(const TileInfo *ti)
 {
-	SpriteID image;
-	SpriteID pal;
-
 	/* 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);
+		DrawTileSelectionRect(ti, PALETTE_TILE_RED_PULSATING);
 		return;
 	}
 
@@ -705,17 +834,15 @@
 					if (_thd.FSMportMask != NULL) m++;
 				}
 				if (*b != 255) {
-					image = SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh];
 					if (_thd.FSMportMask != NULL) {
-						DrawSelectionSprite(image, *m & 0x80 ? PALETTE_SEL_TILE_BLUE : (SpriteID)PALETTE_SEL_TILE_GREEN, ti);
+						DrawTileSelectionRect(ti, *m & 0x80 ? PALETTE_SEL_TILE_BLUE : PALETTE_SEL_TILE_GREEN);
 					} else {
-						DrawSelectionSprite(image, PAL_NONE, ti);
+						DrawTileSelectionRect(ti, PAL_NONE);
 					}
 				}
 			}
 			if (_thd.FSMportLayout == NULL) {
-				image = SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh];
-				DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE, ti);
+				DrawTileSelectionRect(ti, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE);
 			}
 		} else if (_thd.drawstyle & HT_POINT) {
 			/* Figure out the Z coordinate for the single dot. */
@@ -728,25 +855,12 @@
 		} else if (_thd.drawstyle & HT_RAIL /*&& _thd.place_mode == VHM_RAIL*/) {
 			/* autorail highlight piece under cursor */
 			uint type = _thd.drawstyle & 0xF;
-			int offset;
-
 			assert(type <= 5);
-
-			offset = _AutorailTilehSprite[ti->tileh][_AutorailType[type][0]];
-			if (offset >= 0) {
-				image = SPR_AUTORAIL_BASE + offset;
-				pal = PAL_NONE;
-			} else {
-				image = SPR_AUTORAIL_BASE - offset;
-				pal = PALETTE_TO_RED;
-			}
-
-			DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti);
+			DrawAutorailSelection(ti, _AutorailType[type][0]);
 
 		} else if (IsPartOfAutoLine(ti->x, ti->y)) {
 			/* autorail highlighting long line */
 			int dir = _thd.drawstyle & ~0xF0;
-			int offset;
 			uint side;
 
 			if (dir < 2) {
@@ -756,16 +870,7 @@
 				side = delta(delta(TileX(start), TileX(ti->tile)), delta(TileY(start), TileY(ti->tile)));
 			}
 
-			offset = _AutorailTilehSprite[ti->tileh][_AutorailType[dir][side]];
-			if (offset >= 0) {
-				image = SPR_AUTORAIL_BASE + offset;
-				pal = PAL_NONE;
-			} else {
-				image = SPR_AUTORAIL_BASE - offset;
-				pal = PALETTE_TO_RED;
-			}
-
-			DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti);
+			DrawAutorailSelection(ti, _AutorailType[dir][side]);
 		}
 		return;
 	}
@@ -776,7 +881,7 @@
 			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. */
-		DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], PALETTE_SEL_TILE_BLUE, ti);
+		DrawTileSelectionRect(ti, PALETTE_SEL_TILE_BLUE);
 		return;
 	}
 }
@@ -1146,7 +1251,7 @@
 {
 	do {
 		Point pt = RemapCoords(ts->x, ts->y, ts->z);
-		DrawSprite(ts->image, ts->pal, pt.x, pt.y);
+		DrawSprite(ts->image, ts->pal, pt.x, pt.y, ts->sub);
 		ts = ts->next;
 	} while (ts != NULL);
 }
@@ -1156,23 +1261,23 @@
 	while (*psd != NULL) {
 		ParentSpriteToDraw* ps = *psd;
 
-		if (!(ps->unk16 & 1)) {
+		if (!ps->comparison_done) {
 			ParentSpriteToDraw** psd2 = psd;
 
-			ps->unk16 |= 1;
+			ps->comparison_done = true;
 
 			while (*++psd2 != NULL) {
 				ParentSpriteToDraw* ps2 = *psd2;
 				ParentSpriteToDraw** psd3;
 
-				if (ps2->unk16 & 1) continue;
+				if (ps2->comparison_done) continue;
 
 				/* Decide which comparator to use, based on whether the bounding
 				 * boxes overlap
 				 */
-				if (ps->xmax > ps2->xmin && ps->xmin < ps2->xmax && // overlap in X?
-						ps->ymax > ps2->ymin && ps->ymin < ps2->ymax && // overlap in Y?
-						ps->zmax > ps2->zmin && ps->zmin < ps2->zmax) { // overlap in Z?
+				if (ps->xmax >= ps2->xmin && ps->xmin <= ps2->xmax && // overlap in X?
+						ps->ymax >= ps2->ymin && ps->ymin <= ps2->ymax && // overlap in Y?
+						ps->zmax >= ps2->zmin && ps->zmin <= ps2->zmax) { // overlap in Z?
 					/* Use X+Y+Z as the sorting order, so sprites closer to the bottom of
 					 * the screen and with higher Z elevation, are drawn in front.
 					 * Here X,Y,Z are the coordinates of the "center of mass" of the sprite,
@@ -1184,13 +1289,13 @@
 						continue;
 					}
 				} else {
+					/* We only change the order, if it is definite.
+					 * I.e. every single order of X, Y, Z says ps2 is behind ps or they overlap.
+					 * That is: If one partial order says ps behind ps2, do not change the order.
+					 */
 					if (ps->xmax < ps2->xmin ||
 							ps->ymax < ps2->ymin ||
-							ps->zmax < ps2->zmin || (
-								ps->xmin < ps2->xmax &&
-								ps->ymin < ps2->ymax &&
-								ps->zmin < ps2->zmax
-							)) {
+							ps->zmax < ps2->zmin) {
 						continue;
 					}
 				}
@@ -1215,17 +1320,36 @@
 {
 	for (; *psd != NULL; psd++) {
 		const ParentSpriteToDraw* ps = *psd;
-		Point pt = RemapCoords(ps->xmin, ps->ymin, ps->zmin);
 		const ChildScreenSpriteToDraw* cs;
 
-		DrawSprite(ps->image, ps->pal, pt.x, pt.y);
+		if (ps->image != SPR_EMPTY_BOUNDING_BOX) DrawSprite(ps->image, ps->pal, ps->x, ps->y, ps->sub);
 
 		for (cs = ps->child; cs != NULL; cs = cs->next) {
-			DrawSprite(cs->image, cs->pal, ps->left + cs->x, ps->top + cs->y);
+			DrawSprite(cs->image, cs->pal, ps->left + cs->x, ps->top + cs->y, cs->sub);
 		}
 	}
 }
 
+/**
+ * Draws the bounding boxes of all ParentSprites
+ * @param psd Array of ParentSprites
+ */
+static void ViewportDrawBoundingBoxes(ParentSpriteToDraw *psd[])
+{
+	for (; *psd != NULL; psd++) {
+		const ParentSpriteToDraw* ps = *psd;
+		Point pt1 = RemapCoords(ps->xmax + 1, ps->ymax + 1, ps->zmax + 1); // top front corner
+		Point pt2 = RemapCoords(ps->xmin    , ps->ymax + 1, ps->zmax + 1); // top left corner
+		Point pt3 = RemapCoords(ps->xmax + 1, ps->ymin    , ps->zmax + 1); // top right corner
+		Point pt4 = RemapCoords(ps->xmax + 1, ps->ymax + 1, ps->zmin    ); // bottom front corner
+
+		DrawBox(        pt1.x,         pt1.y,
+		        pt2.x - pt1.x, pt2.y - pt1.y,
+		        pt3.x - pt1.x, pt3.y - pt1.y,
+		        pt4.x - pt1.x, pt4.y - pt1.y);
+	}
+}
+
 static void ViewportDrawStrings(DrawPixelInfo *dpi, const StringSpriteToDraw *ss)
 {
 	DrawPixelInfo dp;
@@ -1349,6 +1473,7 @@
 
 	ViewportSortParentSprites(parent_list);
 	ViewportDrawParentSprites(parent_list);
+	if (_draw_bounding_boxes) ViewportDrawBoundingBoxes(parent_list);
 
 	if (vd.first_string != NULL) ViewportDrawStrings(&vd.dpi, vd.first_string);
 
@@ -1466,6 +1591,14 @@
 	}
 }
 
+/**
+ * Marks a viewport as dirty for repaint.
+ *
+ * @param vp The viewport to mark as dirty
+ * @todo documents the missing parameters @c left, @c top, @c right and @c bottom
+ * @todo detailed description missing
+ * @ingroup dirty
+ */
 static void MarkViewportDirty(const ViewPort *vp, int left, int top, int right, int bottom)
 {
 	right -= vp->virtual_left;
@@ -1531,6 +1664,14 @@
 	);
 }
 
+/**
+ * Marks the selected tiles as dirty.
+ *
+ * This function marks the selected tiles as dirty for repaint
+ *
+ * @note Documentation may be wrong (Progman)
+ * @ingroup dirty
+ */
 static void SetSelectionTilesDirty()
 {
 	int y_size, x_size;
--- a/src/viewport.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/viewport.h	Sat Oct 06 21:16:00 2007 +0000
@@ -45,13 +45,24 @@
 	while (DoZoomInOutWindow(how, w)) {};
 }
 
+/**
+ * Some values for constructing bounding boxes (BB). The Z positions under bridges are:
+ * z=0..5  Everything that can be built under low bridges.
+ * z=6     reserved, currently unused.
+ * z=7     Z separator between bridge/tunnel and the things under/above it.
+ */
+enum {
+	BB_HEIGHT_UNDER_BRIDGE = 6, ///< Everything that can be built under low bridges, must not exceed this Z height.
+	BB_Z_SEPARATOR  = 7,        ///< Separates the bridge/tunnel from the things under/above it.
+};
+
 void OffsetGroundSprite(int x, int y);
 
-void DrawGroundSprite(SpriteID image, SpriteID pal);
-void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z);
-void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, byte dz, byte z, bool transparent = false);
+void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub = NULL);
+void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub = NULL);
+void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, int dz, int z, bool transparent = false, int bb_offset_x = 0, int bb_offset_y = 0, int bb_offset_z = 0, const SubSprite *sub = NULL);
 void *AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint64 params_2);
-void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y);
+void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y, bool transparent = false, const SubSprite *sub = NULL);
 
 
 void StartSpriteCombine();
--- a/src/water_cmd.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/water_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -183,6 +183,15 @@
 	return CommandCost(_price.clear_water * 2);
 }
 
+/**
+ * Marks the tiles around a tile as dirty.
+ *
+ * This functions marks the tiles around a given tile as dirty for repaint.
+ *
+ * @param tile The center of the tile where all other tiles are marked as dirty
+ * @ingroup dirty
+ * @see TerraformAddDirtyTileAround
+ */
 static void MarkTilesAroundDirty(TileIndex tile)
 {
 	MarkTileDirtyByTile(TILE_ADDXY(tile, 0, 1));
--- a/src/win32.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/win32.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -1031,6 +1031,7 @@
 
 void DetermineBasePaths(const char *exe)
 {
+	extern void ScanForTarFiles();
 	char tmp[MAX_PATH];
 	TCHAR path[MAX_PATH];
 #ifdef WITH_PERSONAL_DIR
@@ -1076,6 +1077,8 @@
 
 	_searchpaths[SP_INSTALLATION_DIR]       = NULL;
 	_searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL;
+
+	ScanForTarFiles();
 }
 
 /**
--- a/src/window.h	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/window.h	Sat Oct 06 21:16:00 2007 +0000
@@ -378,10 +378,10 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(order_d));
 
-struct traindetails_d {
+struct vehicledetails_d {
 	byte tab;
 };
-assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(traindetails_d));
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vehicledetails_d));
 
 struct smallmap_d {
 	int32 scroll_x;
@@ -565,6 +565,12 @@
 /* window.cpp */
 void CallWindowEventNP(Window *w, int event);
 void CallWindowTickEvent();
+
+/**
+ * Marks the window as dirty for repaint.
+ *
+ * @ingroup dirty
+ */
 void SetWindowDirty(const Window *w);
 void SendWindowMessage(WindowClass wnd_class, WindowNumber wnd_num, int msg, int wparam, int lparam);
 void SendWindowMessageClass(WindowClass wnd_class, int msg, int wparam, int lparam);