(svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565. NewGRF_ports
authorrubidium
Mon, 03 Dec 2007 23:39:38 +0000
branchNewGRF_ports
changeset 6871 5a9dc001e1ad
parent 6870 ca3fd1fbe311
child 6872 1c4a4a609f85
(svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
Makefile.in
Makefile.src.in
bin/data/2ccmap.grf
bin/data/airports.grf
bin/data/autorail.grf
bin/data/canalsw.grf
bin/data/chars.grf
bin/data/dosdummy.grf
bin/data/elrailsw.grf
bin/data/flags.grf
bin/data/group.grf
bin/data/nsignalsw.grf
bin/data/oneway.grf
bin/data/openttd.grf
bin/data/openttdd.grf
bin/data/openttdw.grf
bin/data/ottd_grf/Makefile
bin/data/ottd_grf/split/2ccmapd.nfo
bin/data/ottd_grf/split/2ccmapw.nfo
bin/data/ottd_grf/split/airports.nfo
bin/data/ottd_grf/split/airports.pcx
bin/data/ottd_grf/split/autorail.nfo
bin/data/ottd_grf/split/autorail.pcx
bin/data/ottd_grf/split/canals.nfo
bin/data/ottd_grf/split/canals.pcx
bin/data/ottd_grf/split/elrails.nfo
bin/data/ottd_grf/split/elrails.pcx
bin/data/ottd_grf/split/flags.nfo
bin/data/ottd_grf/split/flags.pcx
bin/data/ottd_grf/split/foundations.nfo
bin/data/ottd_grf/split/foundations.pcx
bin/data/ottd_grf/split/oneway.nfo
bin/data/ottd_grf/split/oneway.pcx
bin/data/ottd_grf/split/openttd.nfo
bin/data/ottd_grf/split/openttdgui.nfo
bin/data/ottd_grf/split/openttdgui.pcx
bin/data/ottd_grf/split/roadstops.nfo
bin/data/ottd_grf/split/roadstops.pcx
bin/data/ottd_grf/split/signals.nfo
bin/data/ottd_grf/split/signals.pcx
bin/data/ottd_grf/split/tramtracks.nfo
bin/data/ottd_grf/split/tramtracks.pcx
bin/data/roadstops.grf
bin/data/tramtrkw.grf
bin/data/trkfoundw.grf
changelog.txt
config.lib
docs/landscape.html
known-bugs.txt
os/debian/changelog
os/win32/installer/install.nsi
projects/determineversion.vbs
projects/generate
projects/langs.vcproj
projects/langs_vs80.vcproj
projects/langs_vs90.vcproj
projects/langs_vs90.vcproj.in
projects/openttd.vcproj
projects/openttd_vs80.vcproj
projects/openttd_vs80.vcproj.in
projects/openttd_vs90.sln
projects/openttd_vs90.vcproj
projects/openttd_vs90.vcproj.in
projects/strgen_vs90.vcproj
readme.txt
source.list
src/ai/default/default.cpp
src/ai/trolly/build.cpp
src/ai/trolly/pathfinder.cpp
src/ai/trolly/trolly.cpp
src/aircraft_cmd.cpp
src/aircraft_gui.cpp
src/airport.cpp
src/airport_gui.cpp
src/articulated_vehicles.cpp
src/autoreplace_cmd.cpp
src/autoreplace_gui.cpp
src/bridge_gui.cpp
src/bridge_map.cpp
src/bridge_map.h
src/build_vehicle_gui.cpp
src/cargotype.cpp
src/clear_cmd.cpp
src/command.cpp
src/console.cpp
src/console_cmds.cpp
src/core/bitmath_func.cpp
src/core/bitmath_func.hpp
src/core/math_func.hpp
src/core/random_func.cpp
src/core/random_func.hpp
src/date.cpp
src/depot.h
src/depot_gui.cpp
src/disaster_cmd.cpp
src/dock_gui.cpp
src/economy.cpp
src/elrail.cpp
src/engine.cpp
src/engine_gui.cpp
src/fileio.cpp
src/fios.cpp
src/fios.h
src/fontcache.cpp
src/functions.h
src/genworld.cpp
src/genworld_gui.cpp
src/gfx.cpp
src/gfx.h
src/gfxinit.cpp
src/gfxinit.h
src/graph_gui.cpp
src/group_cmd.cpp
src/group_gui.cpp
src/gui.h
src/helpers.hpp
src/industry.h
src/industry_cmd.cpp
src/industry_gui.cpp
src/industry_map.h
src/intro_gui.cpp
src/landscape.cpp
src/landscape.h
src/lang/afrikaans.txt
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/lang/unfinished/latvian.txt
src/macros.h
src/main_gui.cpp
src/map.cpp
src/mersenne.cpp
src/misc.cpp
src/misc_cmd.cpp
src/misc_gui.cpp
src/music/qtmidi.cpp
src/music_gui.cpp
src/network/core/config.h
src/network/core/os_abstraction.h
src/network/core/packet.cpp
src/network/core/udp.cpp
src/network/network.h
src/network/network_client.cpp
src/network/network_gui.cpp
src/network/network_gui.h
src/network/network_server.cpp
src/network/network_udp.cpp
src/newgrf.cpp
src/newgrf.h
src/newgrf_callbacks.h
src/newgrf_cargo.cpp
src/newgrf_cargo.h
src/newgrf_commons.cpp
src/newgrf_commons.h
src/newgrf_config.cpp
src/newgrf_config.h
src/newgrf_engine.cpp
src/newgrf_engine.h
src/newgrf_fsmports.cpp
src/newgrf_gui.cpp
src/newgrf_house.cpp
src/newgrf_house.h
src/newgrf_industries.cpp
src/newgrf_industrytiles.cpp
src/newgrf_industrytiles.h
src/newgrf_sound.cpp
src/newgrf_spritegroup.cpp
src/newgrf_station.cpp
src/newgrf_text.cpp
src/newgrf_text.h
src/newgrf_townname.cpp
src/news.h
src/news_gui.cpp
src/npf.cpp
src/npf.h
src/oldloader.cpp
src/oldpool.h
src/openttd.cpp
src/openttd.h
src/order_cmd.cpp
src/order_gui.cpp
src/os/macosx/macos.h
src/os/macosx/macos.mm
src/os/macosx/splash.cpp
src/os2.cpp
src/ottdres.rc.in
src/pathfind.cpp
src/player.h
src/player_face.h
src/player_gui.cpp
src/players.cpp
src/rail.cpp
src/rail.h
src/rail_cmd.cpp
src/rail_gui.cpp
src/rail_map.h
src/railtypes.h
src/rev.cpp.in
src/road.cpp
src/road.h
src/road_cmd.cpp
src/road_gui.cpp
src/road_map.cpp
src/road_map.h
src/roadveh_cmd.cpp
src/roadveh_gui.cpp
src/saveload.cpp
src/saveload.h
src/screenshot.cpp
src/settings.cpp
src/settings.h
src/settings_gui.cpp
src/ship_cmd.cpp
src/ship_gui.cpp
src/signs_gui.cpp
src/slope.h
src/smallmap_gui.cpp
src/sound.cpp
src/sound/cocoa_s.cpp
src/spritecache.cpp
src/station.cpp
src/station.h
src/station_cmd.cpp
src/station_gui.cpp
src/station_map.h
src/stdafx.h
src/strgen/strgen.cpp
src/string.cpp
src/strings.cpp
src/subsidy_gui.cpp
src/table/build_industry.h
src/table/cargo_const.h
src/table/files.h
src/table/landscape_sprite.h
src/table/roadveh.h
src/table/sprites.h
src/table/tree_land.h
src/terraform_gui.cpp
src/texteff.cpp
src/tgp.cpp
src/timetable_cmd.cpp
src/timetable_gui.cpp
src/town.h
src/town_cmd.cpp
src/town_gui.cpp
src/town_map.h
src/train.h
src/train_cmd.cpp
src/train_gui.cpp
src/transparency.h
src/transparency_gui.cpp
src/tree_cmd.cpp
src/tunnel_map.h
src/tunnelbridge_cmd.cpp
src/unix.cpp
src/unmovable_cmd.cpp
src/unmovable_map.h
src/variables.h
src/vehicle.cpp
src/vehicle.h
src/vehicle_gui.cpp
src/video/cocoa/cocoa_keys.h
src/video/cocoa/cocoa_v.h
src/video/cocoa/cocoa_v.mm
src/video/cocoa/event.mm
src/video/cocoa/fullscreen.mm
src/video/cocoa/wnd_quartz.mm
src/video/cocoa/wnd_quickdraw.mm
src/video/cocoa_keys.h
src/video/cocoa_v.h
src/video/cocoa_v.mm
src/video/dedicated_v.cpp
src/video/sdl_v.cpp
src/video/win32_v.cpp
src/viewport.cpp
src/viewport.h
src/water.h
src/water_cmd.cpp
src/water_map.h
src/waypoint.cpp
src/widget.cpp
src/win32.cpp
src/window.cpp
src/window.h
src/yapf/follow_track.hpp
src/yapf/yapf_base.hpp
src/yapf/yapf_common.hpp
src/yapf/yapf_costrail.hpp
src/yapf/yapf_destrail.hpp
src/yapf/yapf_road.cpp
src/zoom.hpp
--- a/Makefile.in	Sat Oct 06 21:16:00 2007 +0000
+++ b/Makefile.in	Mon Dec 03 23:39:38 2007 +0000
@@ -212,6 +212,9 @@
 ifeq ($(shell if test -n "`ls -l \"$(BIN_DIR)/scenario/heightmaps/\"* 2>/dev/null`"; then echo 1; fi), 1)
 	$(Q)cp "$(BIN_DIR)/scenario/heightmaps/"* "$(BUNDLE_DIR)/scenario/heightmap/"
 endif
+ifeq ($(TTD), openttd.exe)
+	$(Q)unix2dos "$(BUNDLE_DIR)/docs/"* "$(BUNDLE_DIR)/readme.txt" "$(BUNDLE_DIR)/COPYING"
+endif
 
 ### Packing the current bundle into several compressed file formats ###
 #
@@ -248,8 +251,10 @@
 
 bundle_dmg: bundle
 	@echo '[BUNDLE] Creating $(BUNDLE_NAME).dmg'
-	$(Q)mkdir -p "$(BUNDLES_DIR)"
-	$(Q)hdiutil create -ov -format UDZO -srcfolder "$(BUNDLE_DIR)" "$(BUNDLES_DIR)/$(BUNDLE_NAME).dmg"
+	$(Q)mkdir -p "$(BUNDLES_DIR)/OpenTTD $(REV)"
+	$(Q)cp -R "$(BUNDLE_DIR)/" "$(BUNDLES_DIR)/OpenTTD $(REV)"
+	$(Q)hdiutil create -ov -format UDZO -srcfolder "$(BUNDLES_DIR)/OpenTTD $(REV)" "$(BUNDLES_DIR)/$(BUNDLE_NAME).dmg"
+	$(Q)rm -fr "$(BUNDLES_DIR)/OpenTTD $(REV)"
 
 ifdef OSXAPP
 install:
--- a/Makefile.src.in	Sat Oct 06 21:16:00 2007 +0000
+++ b/Makefile.src.in	Mon Dec 03 23:39:38 2007 +0000
@@ -92,6 +92,7 @@
 # Make the revision number
 ifdef REVISION
 REV := $(REVISION)
+REV_NR := $(shell echo $(REVISION) | sed "s/[^0-9]//g")
 else
 # Are we a SVN dir?
 ifeq ($(shell if test -d $(SRC_DIR)/.svn; then echo 1; fi), 1)
@@ -99,16 +100,19 @@
 REV_MODIFIED := $(shell svnversion $(SRC_DIR) | sed -n 's/.*\(M\).*/\1/p' )
 # Find the revision like: rXXXX-branch
 REV := $(shell LC_ALL=C svn info $(SRC_DIR) | $(AWK) '/^URL:.*branch/ { split($$2, a, "/"); BRANCH="-"a[5] } /^Last Changed Rev:/ { REV="r"$$4"$(REV_MODIFIED)" } END { print REV BRANCH }')
+REV_NR := $(shell LC_ALL=C svn info $(SRC_DIR) | $(AWK) '/^Last Changed Rev:/ { print $$4 }')
 else
 # Are we a git dir?
 ifeq ($(shell if test -d $(SRC_DIR)/../.git; then echo 1; fi), 1)
 # 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$$//')
+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 cd "$(SRC_DIR)/.." && git diff-index HEAD src | read dummy; then echo M; fi)$(shell git branch|grep '[*]' | sed 's/\* /-/;s/^-master$$//')
+REV_NR := $(shell LC_ALL=C cd "$(SRC_DIR)/.." && git log --pretty=format:%s src | grep -m 1 "^(svn r[0-9]*)" | sed "s/.*(svn r\([0-9]*\)).*/\1/" )
 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$$//')
+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 $(SRC_DIR) | grep -v '^?' | read dummy; then echo M; fi)$(shell hg branch | sed 's/^/-/;s/^-default$$//')
+REV_NR := $(shell LC_ALL=C hg log -k "svn" -l 1 --template "{desc}\n" $(SRC_DIR) | grep -m 1 "^(svn r[0-9]*)" | sed "s/.*(svn r\([0-9]*\)).*/\1/" )
 endif
 endif
 endif
@@ -117,6 +121,7 @@
 # Make sure we have something in REV
 ifeq ($(REV),)
 REV := norev000
+REV_NR := 0
 endif
 
 # This helps to recompile if flags change
@@ -282,10 +287,10 @@
 # Revision files
 
 $(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
+	$(Q)cat $(SRC_DIR)/rev.cpp.in      | sed "s#@@REVISION@@#$(REV_NR)#g;s#@@VERSION@@#$(REV)#g;s#@@DATE@@#`date +%d.%m.%y`#g" > $(SRC_DIR)/rev.cpp
 
 $(SRC_DIR)/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/ottdres.rc.in
-	$(Q)cat $(SRC_DIR)/ottdres.rc.in | sed "s#@@VERSION@@#$(REV)#g;s#@@DATE@@#`date +%d.%m.%y`#g" > $(SRC_DIR)/ottdres.rc
+	$(Q)cat $(SRC_DIR)/ottdres.rc.in | sed "s#@@REVISION@@#$(REV_NR)#g;s#@@VERSION@@#$(REV)#g;s#@@DATE@@#`date +%d.%m.%y`#g" > $(SRC_DIR)/ottdres.rc
 
 FORCE:
 
Binary file bin/data/2ccmap.grf has changed
Binary file bin/data/airports.grf has changed
Binary file bin/data/autorail.grf has changed
Binary file bin/data/canalsw.grf has changed
Binary file bin/data/chars.grf has changed
Binary file bin/data/dosdummy.grf has changed
Binary file bin/data/elrailsw.grf has changed
Binary file bin/data/flags.grf has changed
Binary file bin/data/group.grf has changed
Binary file bin/data/nsignalsw.grf has changed
Binary file bin/data/oneway.grf has changed
Binary file bin/data/openttd.grf has changed
Binary file bin/data/openttdd.grf has changed
Binary file bin/data/openttdw.grf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/Makefile	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,40 @@
+# Some configurational settings for your environment.
+GRFCODEC := grfcodec
+RENUM    := renum
+# Remove the @ when you want a more verbose output.
+V        := @
+
+# Some "should not be changed" settings.
+NAME         := openttd
+NFO_FILES    := split/*.nfo
+PCX_FILES    := split/*.pcx
+
+# Build both GRFs by default.
+all: $(NAME)d.grf $(NAME)w.grf
+
+# Make sure the sprites directory exists.
+sprites:
+	$(V)-mkdir "$@"
+
+# DOS file.
+$(NAME)d.grf: $(PCX_FILES) $(NFO_FILES) sprites
+	$(V)-cp $(PCX_FILES) sprites 2> /dev/null
+	$(V) gcc -DDOS -Isplit -C -E - < "split/$(NAME).nfo" | sed -e '/^#/d' -e '/^$$/d' > sprites/$(NAME)d.nfo
+	$(V) $(GRFCODEC) -e -m1 $@
+	$(V) rm -f $(@:grf=bak)
+
+# Windows file.
+$(NAME)w.grf: $(PCX_FILES) $(NFO_FILES) sprites
+	$(V)-cp $(PCX_FILES) sprites 2> /dev/null
+	$(V) gcc -Isplit -C -E - < "split/$(NAME).nfo" | sed -e '/^#/d' -e '/^$$/d' > sprites/$(NAME)w.nfo
+	$(V) $(GRFCODEC) -e -p2 $@
+	$(V) rm -f $(@:grf=bak)
+
+# Clean up temporary files.
+clean:
+	$(V)rm -f *.bak $(PREPROCESSED)
+	$(V)rm -fr sprites
+
+# Clean up temporary files and result of generation, i.e. the grfs.
+mrproper: clean
+	$(v)rm -f $(NAME)d.grf $(NAME)w.grf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/2ccmapd.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,2309 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "2CC map - DOS"
+   -1 * 0	 05 0A FF 00 01
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/2ccmapw.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,2309 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "2CC map - Windows"
+   -1 * 0	 05 0A FF 00 01
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C6 C7 C8 C9 CA CB CC CD 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 61 62 63 64 65 66 67 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2A 2B 2C 2D 2E 2F 30 31 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 3E 3F 40 41 42 43 44 45 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F B3 B4 B5 B6 B7 A4 A5 A6 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 9A 9B 9C 9D 9E 9F A0 A1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 CE CF D0 D1 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 60 59 5A 5B 5C 5D 5E 5F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 92 93 94 95 96 97 98 99 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 72 73 74 75 76 77 78 79 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 80 81 82 83 84 85 86 87 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 88 89 8A 8B 8C 8D 8E 8F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 40 C0 C1 C2 C3 C4 C5 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 35 36 22 23 24 25 26 27 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 58 6A 20 21 28 F5 0A 0B 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 2A 2B 2C 2D 2E 2F 30 31 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 3E 3F 40 41 42 43 44 45 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 9A 9B 9C 9D 9E 9F A0 A1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 52 53 54 55 CE CF D0 D1 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 92 93 94 95 96 97 98 99 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 72 73 74 75 76 77 78 79 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 80 81 82 83 84 85 86 87 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 88 89 8A 8B 8C 8D 8E 8F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 40 C0 C1 C2 C3 C4 C5 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 35 36 22 23 24 25 26 27 CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 58 6A 20 21 28 F5 0A 0B CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
+   -1 * 0	 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
+	 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E
+	 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 28 F5 0A 0B 0C 0D 0E 0F 58 59 5A 5B 5C 5D 5E
+	 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E
+	 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E
+	 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE
+	 BF C0 C1 C2 C3 C4 C5 28 F5 0A 0B 0C 0D 0E 0F CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE
+	 DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE
+	 FF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/airports.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,37 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "Extra airport graphics"
+   -1 * 0	 05 10 18
+   -1 sprites/airports.pcx 18 8 09 31 64 -31 0
+   -1 sprites/airports.pcx 98 8 09 31 64 -31 0
+   -1 sprites/airports.pcx 178 8 09 31 64 -31 0
+   -1 sprites/airports.pcx 258 8 09 31 64 -31 0
+   -1 sprites/airports.pcx 338 8 09 31 64 -31 0
+   -1 sprites/airports.pcx 418 8 09 31 64 -31 0
+   -1 sprites/airports.pcx 498 8 09 55 64 -2 -38
+   -1 sprites/airports.pcx 578 8 09 17 18 16 -1
+   -1 sprites/airports.pcx 610 8 09 55 64 -2 -38
+   -1 sprites/airports.pcx 690 8 09 17 18 -30 1
+   -1 sprites/airports.pcx 722 8 09 55 64 -2 -38
+   -1 sprites/airports.pcx 2 88 09 55 64 -2 -38
+   -1 sprites/airports.pcx 82 88 09 31 64 -31 0
+   -1 sprites/airports.pcx 162 88 09 31 64 -31 0
+   -1 sprites/airports.pcx 242 88 09 31 64 -31 0
+   -1 sprites/airports.pcx 322 88 09 13 30 0 0
+   -1 sprites/airports.pcx 370 88 09 13 30 0 0
+   -1 sprites/airports.pcx 418 88 09 13 30 0 0
+   -1 sprites/airports.pcx 466 88 09 13 30 0 0
+   -1 sprites/airports.pcx 514 88 09 13 30 0 0
+   -1 sprites/airports.pcx 562 88 09 13 30 0 0
+   -1 sprites/airports.pcx 610 88 09 13 30 0 0
+   -1 sprites/airports.pcx 658 88 09 13 30 0 0
+   -1 * 257	 00 00 00 00 00 00 00 00 00 00 00 "\\\\\\\\]]" 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+	 00 62 62 00 00 00 00 00 00 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+	 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 00 00 00 00 00 00
+	 00 00 00 00 00 00 00 00 00 00 00 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+	 00 00 00 00 00 00 00 00 00 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+	 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+	 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 60 61 00 00 00 00 00 00
+	 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 00 00 00 00 00 00 00 00 00
+	 00
Binary file bin/data/ottd_grf/split/airports.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/autorail.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,60 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "Autorail graphics"
+   -1 * 0	 05 13 37
+   -1 sprites/autorail.pcx 18 8 09 31 64 -31 7
+   -1 sprites/autorail.pcx 98 8 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 178 8 09 39 64 -31 -1
+   -1 sprites/autorail.pcx 258 8 09 47 64 -31 -9
+   -1 sprites/autorail.pcx 338 8 09 31 64 -31 -5
+   -1 sprites/autorail.pcx 418 8 09 23 64 -31 7
+   -1 sprites/autorail.pcx 498 8 09 18 64 -31 4
+   -1 sprites/autorail.pcx 578 8 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 658 8 09 31 64 -31 7
+   -1 sprites/autorail.pcx 2 72 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 82 72 09 23 64 -31 7
+   -1 sprites/autorail.pcx 162 72 09 18 64 -31 4
+   -1 sprites/autorail.pcx 242 72 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 322 72 09 39 64 -31 -1
+   -1 sprites/autorail.pcx 402 72 09 47 64 -31 -9
+   -1 sprites/autorail.pcx 482 72 09 31 64 -31 -5
+   -1 sprites/autorail.pcx 562 72 09 31 64 -31 7
+   -1 sprites/autorail.pcx 642 72 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 722 72 09 47 64 -31 -9
+   -1 sprites/autorail.pcx 2 136 09 26 64 -31 4
+   -1 sprites/autorail.pcx 82 136 09 23 64 -31 4
+   -1 sprites/autorail.pcx 162 136 09 31 64 -31 -3
+   -1 sprites/autorail.pcx 242 136 09 26 64 -31 4
+   -1 sprites/autorail.pcx 322 136 09 23 64 -31 4
+   -1 sprites/autorail.pcx 402 136 09 31 64 -31 -3
+   -1 sprites/autorail.pcx 482 136 09 31 64 -31 7
+   -1 sprites/autorail.pcx 562 136 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 642 136 09 15 64 -31 7
+   -1 sprites/autorail.pcx 722 136 09 31 64 -31 7
+   -1 sprites/autorail.pcx 2 184 09 39 64 -31 -1
+   -1 sprites/autorail.pcx 82 184 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 162 184 09 31 64 -31 7
+   -1 sprites/autorail.pcx 242 184 09 39 64 -31 -1
+   -1 sprites/autorail.pcx 322 184 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 402 184 09 31 64 -31 7
+   -1 sprites/autorail.pcx 482 184 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 562 184 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 642 184 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 722 184 09 23 64 -31 7
+   -1 sprites/autorail.pcx 2 248 09 15 64 -31 7
+   -1 sprites/autorail.pcx 82 248 09 39 64 -31 -1
+   -1 sprites/autorail.pcx 162 248 09 47 64 -31 -9
+   -1 sprites/autorail.pcx 242 248 09 31 64 -31 7
+   -1 sprites/autorail.pcx 322 248 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 402 248 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 482 248 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 562 248 09 23 64 -31 7
+   -1 sprites/autorail.pcx 642 248 09 15 64 -31 7
+   -1 sprites/autorail.pcx 722 248 09 39 64 -31 -1
+   -1 sprites/autorail.pcx 2 312 09 47 64 -31 -9
+   -1 sprites/autorail.pcx 82 312 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 162 312 09 31 64 -31 -1
+   -1 sprites/autorail.pcx 242 312 09 23 64 -31 7
+   -1 sprites/autorail.pcx 322 312 09 31 64 -31 7
+   -1 sprites/autorail.pcx 402 312 09 31 64 -31 7
Binary file bin/data/ottd_grf/split/autorail.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/canals.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,70 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "Canal graphics by George"
+   -1 * 0	 05 08 41
+   -1 sprites/canals.pcx 98 8 09 23 64 -31 0
+   -1 sprites/canals.pcx 178 8 09 39 64 -31 -8
+   -1 sprites/canals.pcx 258 8 09 23 64 -31 0
+   -1 sprites/canals.pcx 338 8 09 39 64 -31 -8
+   -1 sprites/canals.pcx 418 8 09 59 64 -31 -36
+   -1 sprites/canals.pcx 498 8 09 65 64 -31 -34
+   -1 sprites/canals.pcx 578 8 09 59 64 -31 -36
+   -1 sprites/canals.pcx 658 8 09 59 64 -31 -28
+   -1 sprites/canals.pcx 2 88 09 62 64 -1 -51
+   -1 sprites/canals.pcx 82 88 09 62 64 -61 -43
+   -1 sprites/canals.pcx 162 88 09 62 64 -61 -51
+   -1 sprites/canals.pcx 242 88 09 62 64 -1 -43
+   -1 sprites/canals.pcx 322 88 09 59 64 -31 -28
+   -1 sprites/canals.pcx 402 88 09 65 66 -33 -34
+   -1 sprites/canals.pcx 482 88 09 59 64 -31 -28
+   -1 sprites/canals.pcx 562 88 09 59 64 -31 -28
+   -1 sprites/canals.pcx 642 88 09 62 64 -1 -43
+   -1 sprites/canals.pcx 722 88 09 60 64 -61 -43
+   -1 sprites/canals.pcx 2 168 09 62 66 -61 -43
+   -1 sprites/canals.pcx 82 168 09 60 64 -1 -43
+   -1 sprites/canals.pcx 162 168 09 59 64 -31 -28
+   -1 sprites/canals.pcx 242 168 09 59 64 -31 -28
+   -1 sprites/canals.pcx 322 168 09 59 64 -31 -28
+   -1 sprites/canals.pcx 402 168 09 59 64 -31 -28
+   -1 sprites/canals.pcx 482 168 09 60 64 -1 -43
+   -1 sprites/canals.pcx 562 168 09 62 68 -61 -43
+   -1 sprites/canals.pcx 642 168 09 60 64 -61 -43
+   -1 sprites/canals.pcx 722 168 09 62 64 -1 -43
+   -1 sprites/canals.pcx 2 248 09 59 64 -31 -36
+   -1 sprites/canals.pcx 82 248 09 65 64 -31 -34
+   -1 sprites/canals.pcx 162 248 09 59 64 -31 -36
+   -1 sprites/canals.pcx 242 248 09 59 64 -31 -28
+   -1 sprites/canals.pcx 322 248 09 62 64 -1 -51
+   -1 sprites/canals.pcx 402 248 09 62 64 -61 -43
+   -1 sprites/canals.pcx 482 248 09 62 64 -61 -51
+   -1 sprites/canals.pcx 562 248 09 62 64 -1 -43
+   -1 sprites/canals.pcx 642 248 09 59 64 -31 -28
+   -1 sprites/canals.pcx 722 248 09 65 66 -33 -34
+   -1 sprites/canals.pcx 2 328 09 59 64 -31 -28
+   -1 sprites/canals.pcx 82 328 09 59 64 -31 -28
+   -1 sprites/canals.pcx 162 328 09 62 64 -1 -43
+   -1 sprites/canals.pcx 242 328 09 60 64 -61 -43
+   -1 sprites/canals.pcx 322 328 09 62 66 -61 -43
+   -1 sprites/canals.pcx 402 328 09 60 64 -1 -43
+   -1 sprites/canals.pcx 482 328 09 59 64 -31 -28
+   -1 sprites/canals.pcx 562 328 09 59 64 -31 -28
+   -1 sprites/canals.pcx 642 328 09 59 64 -31 -28
+   -1 sprites/canals.pcx 722 328 09 59 64 -31 -28
+   -1 sprites/canals.pcx 2 408 09 60 64 -1 -43
+   -1 sprites/canals.pcx 82 408 09 62 68 -61 -43
+   -1 sprites/canals.pcx 162 408 09 60 64 -61 -43
+   -1 sprites/canals.pcx 242 408 09 62 64 -1 -43
+   -1 sprites/canals.pcx 322 408 09 37 70 -31 -6
+   -1 sprites/canals.pcx 402 408 09 37 70 -31 0
+   -1 sprites/canals.pcx 482 408 09 37 70 -37 0
+   -1 sprites/canals.pcx 562 408 09 37 70 -37 -6
+   -1 sprites/canals.pcx 642 408 09 31 64 -31 0
+   -1 sprites/canals.pcx 722 408 09 31 64 -31 0
+   -1 sprites/canals.pcx 2 488 09 31 64 -31 0
+   -1 sprites/canals.pcx 82 488 09 37 64 -31 -6
+   -1 sprites/canals.pcx 162 488 09 31 64 -31 0
+   -1 sprites/canals.pcx 242 488 09 31 64 -31 0
+   -1 sprites/canals.pcx 322 488 09 31 64 -31 0
+   -1 sprites/canals.pcx 402 488 09 37 64 -31 -6
+   -1 sprites/canals.pcx 482 488 09 20 20 0 0
Binary file bin/data/ottd_grf/split/canals.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/elrails.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,53 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "Electrified rail by Michael Blunck"
+   -1 * 0	 05 05 30
+   -1 sprites/elrails.pcx 66 8 01 16 32 -29 -2
+   -1 sprites/elrails.pcx 114 8 01 16 32 -1 -2
+   -1 sprites/elrails.pcx 162 8 01 1 32 -1 -2
+   -1 sprites/elrails.pcx 210 8 01 16 1 0 -3
+   -1 sprites/elrails.pcx 226 8 01 24 32 -29 -2
+   -1 sprites/elrails.pcx 274 8 01 9 32 -1 6
+   -1 sprites/elrails.pcx 322 8 01 9 32 -29 6
+   -1 sprites/elrails.pcx 370 8 01 24 32 -1 -2
+   -1 sprites/elrails.pcx 418 8 01 16 32 -29 -2
+   -1 sprites/elrails.pcx 466 8 01 16 32 -1 -2
+   -1 sprites/elrails.pcx 514 8 01 1 32 -1 -2
+   -1 sprites/elrails.pcx 562 8 01 16 1 0 -3
+   -1 sprites/elrails.pcx 578 8 01 24 32 -29 -2
+   -1 sprites/elrails.pcx 626 8 01 9 32 -1 6
+   -1 sprites/elrails.pcx 674 8 01 9 32 -29 6
+   -1 sprites/elrails.pcx 722 8 01 24 32 -1 -2
+   -1 sprites/elrails.pcx 2 56 01 16 32 -29 -2
+   -1 sprites/elrails.pcx 50 56 01 16 32 -1 -2
+   -1 sprites/elrails.pcx 98 56 01 1 32 -1 -2
+   -1 sprites/elrails.pcx 146 56 01 16 1 0 -3
+   -1 sprites/elrails.pcx 162 56 01 24 32 -29 -2
+   -1 sprites/elrails.pcx 210 56 01 9 32 -1 6
+   -1 sprites/elrails.pcx 258 56 01 9 32 -29 6
+   -1 sprites/elrails.pcx 306 56 01 24 32 -1 -2
+   -1 sprites/elrails.pcx 354 56 01 8 16 -29 6
+   -1 sprites/elrails.pcx 386 56 01 8 16 -1 -2
+   -1 sprites/elrails.pcx 418 56 01 8 16 -13 -2
+   -1 sprites/elrails.pcx 450 56 01 8 16 15 6
+   -1 sprites/elrails.pcx 482 56 01 16 8 -7 -14
+   -1 sprites/elrails.pcx 498 56 01 18 8 0 -17
+   -1 sprites/elrails.pcx 514 56 01 16 8 0 -14
+   -1 sprites/elrails.pcx 530 56 01 18 8 -7 -17
+   -1 sprites/elrails.pcx 546 56 01 16 2 0 -15
+   -1 sprites/elrails.pcx 562 56 01 18 2 0 -16
+   -1 sprites/elrails.pcx 578 56 01 16 8 0 -15
+   -1 sprites/elrails.pcx 594 56 01 16 8 -7 -15
+   -1 sprites/elrails.pcx 610 56 09 16 13 4 2
+   -1 sprites/elrails.pcx 642 56 09 16 20 0 2
+   -1 sprites/elrails.pcx 674 56 09 16 20 0 2
+   -1 sprites/elrails.pcx 706 56 09 16 20 0 2
+   -1 sprites/elrails.pcx 738 56 03 30 38 -3 -14
+   -1 sprites/elrails.pcx 2 104 03 44 72 -16 -8
+   -1 sprites/elrails.pcx 82 104 03 35 44 -21 -2
+   -1 sprites/elrails.pcx 146 104 03 44 72 -16 -35
+   -1 sprites/elrails.pcx 226 104 09 19 20 0 1
+   -1 sprites/elrails.pcx 258 104 03 32 32 0 0
+   -1 sprites/elrails.pcx 306 104 01 22 12 -9 -18
+   -1 sprites/elrails.pcx 338 104 01 22 12 -1 -18
Binary file bin/data/ottd_grf/split/elrails.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/flags.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,34 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "Flag graphics"
+   -1 * 0	 05 14 1D
+   -1 sprites/flags.pcx 18 8 09 8 11 0 0
+   -1 sprites/flags.pcx 34 8 09 8 11 0 0
+   -1 sprites/flags.pcx 50 8 09 8 11 0 0
+   -1 sprites/flags.pcx 66 8 09 8 11 0 0
+   -1 sprites/flags.pcx 82 8 09 8 11 0 0
+   -1 sprites/flags.pcx 98 8 09 8 11 0 0
+   -1 sprites/flags.pcx 114 8 09 8 11 0 0
+   -1 sprites/flags.pcx 130 8 09 8 11 0 0
+   -1 sprites/flags.pcx 146 8 09 8 11 0 0
+   -1 sprites/flags.pcx 162 8 09 8 11 0 0
+   -1 sprites/flags.pcx 178 8 09 8 11 0 0
+   -1 sprites/flags.pcx 194 8 09 8 11 0 0
+   -1 sprites/flags.pcx 210 8 09 8 11 0 0
+   -1 sprites/flags.pcx 226 8 09 8 11 0 0
+   -1 sprites/flags.pcx 242 8 09 8 11 0 0
+   -1 sprites/flags.pcx 258 8 09 8 11 0 0
+   -1 sprites/flags.pcx 274 8 09 8 11 0 0
+   -1 sprites/flags.pcx 290 8 09 8 11 0 0
+   -1 sprites/flags.pcx 306 8 09 8 11 0 0
+   -1 sprites/flags.pcx 322 8 09 8 11 0 0
+   -1 sprites/flags.pcx 338 8 09 8 11 0 0
+   -1 sprites/flags.pcx 354 8 09 8 11 0 0
+   -1 sprites/flags.pcx 370 8 09 8 11 0 0
+   -1 sprites/flags.pcx 386 8 09 8 11 0 0
+   -1 sprites/flags.pcx 402 8 09 8 11 0 0
+   -1 sprites/flags.pcx 418 8 09 8 11 0 0
+   -1 sprites/flags.pcx 434 8 09 8 11 0 0
+   -1 sprites/flags.pcx 450 8 09 8 11 0 0
+   -1 sprites/flags.pcx 466 8 09 8 11 0 0
Binary file bin/data/ottd_grf/split/flags.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/foundations.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,372 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "Foundations. Non-halftile ones by Marcin Grzegorczyk"
+   -1 * 0	 07 83 01 \7! 00 5B
+   -1 * 0	 05 06 5A
+   -1 sprites/foundations.pcx 98 8 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 178 8 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 258 8 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 338 8 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 418 8 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 498 8 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 578 8 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 658 8 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 72 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 72 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 72 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 72 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 72 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 72 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 72 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 72 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 72 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 72 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 136 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 136 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 136 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 136 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 136 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 136 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 136 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 136 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 136 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 136 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 200 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 200 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 200 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 200 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 200 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 200 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 200 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 200 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 200 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 200 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 264 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 264 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 264 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 264 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 264 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 264 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 264 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 264 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 264 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 264 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 328 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 328 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 328 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 328 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 328 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 328 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 328 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 328 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 328 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 328 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 392 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 392 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 392 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 392 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 392 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 392 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 392 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 392 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 392 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 392 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 456 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 456 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 456 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 456 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 456 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 456 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 456 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 562 456 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 642 456 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 722 456 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 2 520 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 82 520 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 162 520 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 242 520 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 322 520 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 402 520 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 482 520 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 562 520 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 642 520 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 722 520 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 2 584 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 82 584 09 33 64 -31 -9
+   -1 * 0	 07 83 01 \7! 01 5B
+   -1 * 0	 05 06 5A
+   -1 sprites/foundations.pcx 194 584 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 274 584 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 354 584 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 434 584 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 514 584 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 594 584 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 674 584 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 648 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 648 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 648 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 648 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 648 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 648 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 648 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 648 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 648 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 648 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 712 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 712 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 712 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 712 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 712 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 712 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 712 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 712 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 712 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 712 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 776 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 776 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 776 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 776 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 776 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 776 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 776 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 776 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 776 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 776 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 840 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 840 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 840 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 840 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 840 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 840 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 840 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 840 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 840 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 840 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 904 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 904 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 904 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 904 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 904 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 904 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 904 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 904 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 904 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 904 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 968 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 968 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 968 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 968 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 968 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 968 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 968 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 968 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 968 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 968 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 1032 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 1032 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 1032 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 1032 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 1032 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 1032 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 1032 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 1032 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 642 1032 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 722 1032 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 2 1096 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 82 1096 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 162 1096 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 242 1096 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 322 1096 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 402 1096 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 482 1096 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 562 1096 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 642 1096 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 722 1096 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 2 1160 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 82 1160 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 162 1160 09 33 64 -31 -9
+   -1 * 0	 07 83 01 \7! 02 5B
+   -1 * 0	 05 06 5A
+   -1 sprites/foundations.pcx 274 1160 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 354 1160 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 434 1160 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 514 1160 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 594 1160 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 674 1160 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 1224 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 1224 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 1224 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 1224 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 1224 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 1224 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 1224 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 1224 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 1224 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 1224 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 1288 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 1288 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 1288 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 1288 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 1288 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 1288 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 1288 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 1288 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 1288 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 1288 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 1352 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 1352 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 1352 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 1352 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 1352 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 1352 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 1352 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 1352 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 1352 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 1352 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 1416 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 1416 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 1416 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 1416 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 1416 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 1416 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 1416 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 1416 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 1416 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 1416 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 1480 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 1480 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 1480 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 1480 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 1480 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 1480 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 1480 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 1480 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 1480 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 1480 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 1544 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 1544 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 1544 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 1544 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 1544 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 1544 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 1544 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 1544 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 1544 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 1544 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 1608 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 1608 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 1608 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 1608 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 1608 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 1608 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 1608 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 1608 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 1608 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 722 1608 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 2 1672 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 82 1672 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 162 1672 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 242 1672 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 322 1672 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 402 1672 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 482 1672 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 562 1672 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 642 1672 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 722 1672 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 2 1736 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 82 1736 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 162 1736 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 242 1736 09 33 64 -31 -9
+   -1 * 0	 07 83 01 \7! 03 5B
+   -1 * 0	 05 06 5A
+   -1 sprites/foundations.pcx 354 1736 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 434 1736 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 514 1736 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 594 1736 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 674 1736 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 1800 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 1800 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 1800 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 1800 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 1800 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 1800 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 1800 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 1800 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 1800 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 1800 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 1864 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 1864 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 1864 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 1864 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 1864 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 1864 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 1864 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 1864 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 1864 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 1864 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 1928 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 1928 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 1928 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 1928 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 1928 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 1928 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 1928 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 1928 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 1928 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 1928 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 1992 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 1992 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 1992 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 1992 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 1992 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 1992 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 482 1992 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 1992 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 1992 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 1992 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 2056 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 2056 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 162 2056 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 2056 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 322 2056 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 2056 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 2056 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 2056 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 2056 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 722 2056 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 2 2120 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 82 2120 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 2120 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 242 2120 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 2120 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 402 2120 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 2120 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 562 2120 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 642 2120 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 2120 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 2 2184 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 82 2184 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 162 2184 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 242 2184 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 322 2184 09 32 64 -31 -9
+   -1 sprites/foundations.pcx 402 2184 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 482 2184 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 562 2184 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 642 2184 09 40 64 -31 -9
+   -1 sprites/foundations.pcx 722 2184 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 2 2248 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 82 2248 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 162 2248 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 242 2248 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 322 2248 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 402 2248 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 482 2248 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 562 2248 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 642 2248 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 722 2248 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 2 2312 09 33 64 -31 -9
+   -1 sprites/foundations.pcx 82 2312 09 40 64 -15 -17
+   -1 sprites/foundations.pcx 162 2312 09 33 64 -31 -25
+   -1 sprites/foundations.pcx 242 2312 09 40 64 -47 -17
+   -1 sprites/foundations.pcx 322 2312 09 33 64 -31 -9
Binary file bin/data/ottd_grf/split/foundations.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/oneway.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,11 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "One way road graphics"
+   -1 * 0	 05 09 06
+   -1 sprites/oneway.pcx 18 8 01 16 24 -12 -8
+   -1 sprites/oneway.pcx 50 8 01 16 24 -12 -8
+   -1 sprites/oneway.pcx 82 8 01 16 24 -12 -8
+   -1 sprites/oneway.pcx 114 8 01 16 24 -12 -8
+   -1 sprites/oneway.pcx 146 8 01 16 24 -12 -8
+   -1 sprites/oneway.pcx 178 8 01 16 24 -12 -8
Binary file bin/data/ottd_grf/split/oneway.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/openttd.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,110 @@
+// Automatically generated by GRFCODEC. Do not modify!
+// (Info version 7)
+// Format: spritenum pcxfile xpos ypos compression ysize xsize xrel yrel
+//
+// $Id$
+//
+// Sources for OpenTTD's required base graphics.
+// Checks whether the correct version of OpenTTD is used before
+// allowing it to be used.
+//
+
+//
+// -- NFO Renum 'settings' --
+// Do not make nforenum warn about the fact that we use a reserved GRF ID
+// @@WARNING DISABLE 101
+// -- End of NFO Renum 'settings --
+//
+
+//
+// Number of sprites, it is wrong, but GRFcodec automagically gets it right.
+//
+    0 * 4	 00 00 00 00
+
+
+//
+// Check whether we are running OTTD or not.
+//
+   -1 * 0	 07 9D 04 \7= 01 00 00 00 01
+   -1 * 0	 0B 03 7F FF 80 " is not for TTDPatch. Use ttdpatch(w).grf." 00
+
+
+//
+// Check for OTTD's version number
+//
+
+// First step... Variable A1 might not exist. If that's the case it always
+// skips. As we do not want to skip out of the whole testing, we skip over
+// the real version check.
+   -1 * 0	 07 A1 04 \7= FF FF FF FF 02
+
+// Real version check.
+   -1 * 0	 07 A1 04 \7> \w11432 00 06 03
+
+// If the version check is supported, the string is translateable via OpenTTD
+// itself. Use it!.
+
+   -1 * 0	 0B 03 7F 06 "0.6 (or trunk r11432)" 00
+
+// Some OTTD versions before r11130 did support Action B, so use the English
+// phrase there
+   -1 * 0	 0B 03 7F FF "Requires OpenTTD version 0.6 (or trunk r11432) or better." 00
+
+// Final fallback. No Action B support, just skip to the end of the file.
+   -1 * 0	 07 A1 04 \7= FF FF FF FF 00
+
+
+//
+// Check DOS vs Windows version.
+//
+#ifdef DOS
+   -1 * 0	 07 8D 01 \7= 00 01
+   -1 * 0	 0B 03 7F 01 "DOS" 00
+#else
+   -1 * 0	 07 8D 01 \7= 01 01
+   -1 * 0	 0B 03 7F 01 "Windows" 00
+#endif
+
+// Dos and Windows graphic files have a different GRF ID.
+   -1 * 0	 08 07 FF "OT"
+#ifdef DOS
+             "D"
+#else
+             "W"
+#endif
+
+// Name of the GRF
+             "OpenTTD's base graphics "
+#ifdef DOS
+             "(DOS)"
+#else
+             "(Windows)"
+#endif
+             00
+
+// Description of the GRF.
+             "Marcin Grzegorczyk: non-halftile foundations" 0D
+             "Michael Blunck: catenary, signals" 0D
+             "George: canals" 0D
+             "PikkaBird: tram tracks" 0D
+             "OpenTTD developers: other graphics" 00
+
+//
+// The real data of the GRF is acquired from several subfiles.
+//
+#ifdef DOS
+# include "2ccmapd.nfo"
+#else
+# include "2ccmapw.nfo"
+#endif
+#include "signals.nfo"
+#include "elrails.nfo"
+#include "foundations.nfo"
+#include "canals.nfo"
+#include "oneway.nfo"
+#include "tramtracks.nfo"
+#include "airports.nfo"
+#include "roadstops.nfo"
+#include "autorail.nfo"
+#include "flags.nfo"
+#include "openttdgui.nfo"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/openttdgui.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,141 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "OpenTTD GUI graphics"
+   -1 * 0	 05 15 88
+   -1 sprites/openttdgui.pcx 18 8 09 31 64 -31 7
+   -1 sprites/openttdgui.pcx 98 8 09 31 64 -31 7
+   -1 sprites/openttdgui.pcx 178 8 09 31 64 -31 7
+   -1 sprites/openttdgui.pcx 258 8 09 31 64 -31 7
+   -1 sprites/openttdgui.pcx 338 8 09 31 64 -31 -1
+   -1 sprites/openttdgui.pcx 418 8 09 39 64 -31 -1
+   -1 sprites/openttdgui.pcx 498 8 09 31 64 -31 -1
+   -1 sprites/openttdgui.pcx 578 8 09 23 64 -31 7
+   -1 sprites/openttdgui.pcx 658 8 09 31 64 -31 7
+   -1 sprites/openttdgui.pcx 2 72 09 23 64 -31 7
+   -1 sprites/openttdgui.pcx 82 72 09 31 64 -31 7
+   -1 sprites/openttdgui.pcx 162 72 09 39 64 -31 -1
+   -1 sprites/openttdgui.pcx 242 72 01 26 23 0 0
+   -1 sprites/openttdgui.pcx 274 72 09 26 24 0 0
+   -1 sprites/openttdgui.pcx 306 72 01 8 4 28 16
+   -1 sprites/openttdgui.pcx 322 72 01 9 4 0 1
+   -1 sprites/openttdgui.pcx 338 72 09 23 32 0 1
+   -1 sprites/openttdgui.pcx 386 72 01 8 4 -31 15
+   -1 sprites/openttdgui.pcx 402 72 01 9 4 -3 0
+   -1 sprites/openttdgui.pcx 418 72 09 23 32 -31 0
+   -1 sprites/openttdgui.pcx 466 72 01 8 4 28 16
+   -1 sprites/openttdgui.pcx 482 72 01 9 4 0 1
+   -1 sprites/openttdgui.pcx 498 72 09 23 32 0 1
+   -1 sprites/openttdgui.pcx 546 72 01 8 4 -31 15
+   -1 sprites/openttdgui.pcx 562 72 01 9 4 -3 0
+   -1 sprites/openttdgui.pcx 578 72 09 23 32 -31 0
+   -1 sprites/openttdgui.pcx 626 72 01 8 4 28 16
+   -1 sprites/openttdgui.pcx 642 72 01 9 4 0 1
+   -1 sprites/openttdgui.pcx 658 72 09 23 32 0 1
+   -1 sprites/openttdgui.pcx 706 72 01 8 4 -31 15
+   -1 sprites/openttdgui.pcx 722 72 01 9 4 -3 0
+   -1 sprites/openttdgui.pcx 738 72 09 23 32 -31 0
+   -1 sprites/openttdgui.pcx 786 72 01 8 4 28 16
+   -1 sprites/openttdgui.pcx 2 136 01 9 4 0 1
+   -1 sprites/openttdgui.pcx 18 136 09 23 32 0 1
+   -1 sprites/openttdgui.pcx 66 136 01 8 4 -31 15
+   -1 sprites/openttdgui.pcx 82 136 01 9 4 -3 0
+   -1 sprites/openttdgui.pcx 98 136 09 23 32 -31 0
+   -1 sprites/openttdgui.pcx 146 136 09 10 10 0 0
+   -1 sprites/openttdgui.pcx 162 136 01 8 8 0 0
+   -1 sprites/openttdgui.pcx 178 136 09 9 7 0 0
+   -1 sprites/openttdgui.pcx 194 136 01 7 9 0 0
+   -1 sprites/openttdgui.pcx 210 136 01 7 9 0 0
+   -1 sprites/openttdgui.pcx 226 136 01 10 10 0 0
+   -1 sprites/openttdgui.pcx 242 136 09 7 7 0 0
+   -1 sprites/openttdgui.pcx 258 136 09 4 7 1 2
+   -1 sprites/openttdgui.pcx 274 136 09 4 7 1 2
+   -1 sprites/openttdgui.pcx 290 136 09 7 4 1 1
+   -1 sprites/openttdgui.pcx 306 136 09 7 4 2 1
+   -1 sprites/openttdgui.pcx 322 136 01 8 8 1 1
+   -1 sprites/openttdgui.pcx 338 136 01 9 9 1 0
+   -1 sprites/openttdgui.pcx 354 136 01 8 7 0 0
+   -1 sprites/openttdgui.pcx 370 136 01 8 8 0 0
+   -1 sprites/openttdgui.pcx 386 136 09 13 20 0 4
+   -1 sprites/openttdgui.pcx 418 136 03 36 56 0 0
+   -1 sprites/openttdgui.pcx 482 136 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 514 136 01 32 32 0 0
+   -1 sprites/openttdgui.pcx 562 136 09 16 20 0 3
+   -1 sprites/openttdgui.pcx 594 136 03 43 56 0 0
+   -1 sprites/openttdgui.pcx 658 136 01 19 20 0 1
+   -1 sprites/openttdgui.pcx 690 136 01 32 32 0 0
+   -1 sprites/openttdgui.pcx 738 136 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 2 200 01 31 31 1 1
+   -1 sprites/openttdgui.pcx 50 200 09 15 20 0 3
+   -1 sprites/openttdgui.pcx 82 200 03 36 56 0 0
+   -1 sprites/openttdgui.pcx 146 200 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 178 200 01 32 32 0 0
+   -1 sprites/openttdgui.pcx 226 200 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 258 200 01 32 32 0 0
+   -1 sprites/openttdgui.pcx 306 200 09 11 19 0 6
+   -1 sprites/openttdgui.pcx 338 200 03 36 56 0 0
+   -1 sprites/openttdgui.pcx 402 200 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 434 200 01 32 32 0 0
+   -1 sprites/openttdgui.pcx 482 200 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 514 200 01 32 32 0 0
+   -1 sprites/openttdgui.pcx 562 200 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 594 200 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 626 200 03 32 52 0 0
+   -1 sprites/openttdgui.pcx 690 200 09 33 29 -27 -16
+   -1 sprites/openttdgui.pcx 738 200 09 39 35 -29 -29
+   -1 sprites/openttdgui.pcx 2 264 09 34 29 1 -17
+   -1 sprites/openttdgui.pcx 50 264 09 39 34 -3 -28
+   -1 sprites/openttdgui.pcx 98 264 09 13 20 0 4
+   -1 sprites/openttdgui.pcx 130 264 03 36 56 0 0
+   -1 sprites/openttdgui.pcx 194 264 09 13 20 0 4
+   -1 sprites/openttdgui.pcx 226 264 03 36 56 0 0
+   -1 sprites/openttdgui.pcx 290 264 01 18 39 -9 -9
+   -1 sprites/openttdgui.pcx 338 264 01 44 72 -16 -35
+   -1 sprites/openttdgui.pcx 418 264 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 450 264 01 44 72 -16 -35
+   -1 sprites/openttdgui.pcx 530 264 09 18 18 1 1
+   -1 sprites/openttdgui.pcx 562 264 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 594 264 01 32 32 0 0
+   -1 sprites/openttdgui.pcx 642 264 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 674 264 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 706 264 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 738 264 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 770 264 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 2 328 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 34 328 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 66 328 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 98 328 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 130 328 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 162 328 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 194 328 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 226 328 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 258 328 09 16 16 0 0
+   -1 sprites/openttdgui.pcx 290 328 01 16 16 0 0
+   -1 sprites/openttdgui.pcx 322 328 01 16 16 0 0
+   -1 sprites/openttdgui.pcx 354 328 01 16 16 0 0
+   -1 sprites/openttdgui.pcx 386 328 09 31 35 0 0
+   -1 sprites/openttdgui.pcx 434 328 01 30 33 0 0
+   -1 sprites/openttdgui.pcx 482 328 01 33 36 0 0
+   -1 sprites/openttdgui.pcx 530 328 01 33 37 0 0
+   -1 sprites/openttdgui.pcx 578 328 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 610 328 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 642 328 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 674 328 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 706 328 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 738 328 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 770 328 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 2 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 34 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 66 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 98 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 130 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 162 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 194 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 226 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 258 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 290 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 322 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 354 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 386 376 09 20 20 0 0
+   -1 sprites/openttdgui.pcx 417 376 01 20 20 0 0
+   -1 sprites/openttdgui.pcx 447 376 01 22 19 0 0
Binary file bin/data/ottd_grf/split/openttdgui.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/roadstops.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,13 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "Road stop graphics"
+   -1 * 0	 05 11 08
+   -1 sprites/roadstops.pcx 18 8 09 23 13 5 -11
+   -1 sprites/roadstops.pcx 50 8 09 15 13 5 -2
+   -1 sprites/roadstops.pcx 82 8 09 19 21 -20 -7
+   -1 sprites/roadstops.pcx 114 8 09 17 22 -25 -4
+   -1 sprites/roadstops.pcx 146 8 09 25 32 -5 -9
+   -1 sprites/roadstops.pcx 194 8 09 26 28 -3 -12
+   -1 sprites/roadstops.pcx 242 8 09 25 29 -24 -12
+   -1 sprites/roadstops.pcx 290 8 09 25 32 -25 -9
Binary file bin/data/ottd_grf/split/roadstops.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/signals.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,488 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "Pre-signal, semaphore, and PBS graphics by Michael Blunck"
+   -1 * 0	 05 04 F0
+   -1 sprites/signals.pcx 66 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 82 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 98 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 114 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 130 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 146 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 162 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 178 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 194 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 210 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 226 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 242 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 258 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 274 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 290 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 306 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 322 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 338 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 354 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 370 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 386 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 402 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 418 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 434 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 450 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 466 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 482 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 498 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 514 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 530 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 546 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 562 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 578 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 594 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 610 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 626 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 642 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 658 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 674 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 690 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 706 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 722 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 738 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 754 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 770 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 786 8 01 21 6 -2 -19
+   -1 sprites/signals.pcx 2 40 01 21 6 -2 -19
+   -1 sprites/signals.pcx 18 40 01 21 6 -2 -19
+   -1 sprites/signals.pcx 34 40 01 21 10 -6 -19
+   -1 sprites/signals.pcx 50 40 01 23 7 -3 -21
+   -1 sprites/signals.pcx 66 40 01 21 10 1 -19
+   -1 sprites/signals.pcx 82 40 01 21 9 1 -19
+   -1 sprites/signals.pcx 98 40 01 21 9 1 -19
+   -1 sprites/signals.pcx 114 40 01 23 6 1 -21
+   -1 sprites/signals.pcx 130 40 01 21 10 -7 -19
+   -1 sprites/signals.pcx 146 40 01 21 10 -7 -19
+   -1 sprites/signals.pcx 162 40 01 21 2 1 -19
+   -1 sprites/signals.pcx 178 40 01 24 2 1 -22
+   -1 sprites/signals.pcx 194 40 01 23 2 1 -21
+   -1 sprites/signals.pcx 210 40 01 26 2 1 -24
+   -1 sprites/signals.pcx 226 40 01 21 11 -7 -19
+   -1 sprites/signals.pcx 242 40 01 21 8 -4 -19
+   -1 sprites/signals.pcx 258 40 01 21 11 1 -19
+   -1 sprites/signals.pcx 274 40 01 21 8 1 -19
+   -1 sprites/signals.pcx 290 40 01 21 12 -6 -19
+   -1 sprites/signals.pcx 322 40 01 23 9 -3 -21
+   -1 sprites/signals.pcx 338 40 01 21 12 -1 -19
+   -1 sprites/signals.pcx 370 40 01 21 11 -1 -19
+   -1 sprites/signals.pcx 386 40 01 21 11 -1 -19
+   -1 sprites/signals.pcx 402 40 01 23 8 -1 -21
+   -1 sprites/signals.pcx 418 40 01 21 12 -7 -19
+   -1 sprites/signals.pcx 450 40 01 21 12 -7 -19
+   -1 sprites/signals.pcx 482 40 01 21 4 1 -19
+   -1 sprites/signals.pcx 498 40 01 24 4 1 -22
+   -1 sprites/signals.pcx 514 40 01 23 4 -1 -21
+   -1 sprites/signals.pcx 530 40 01 26 4 -1 -24
+   -1 sprites/signals.pcx 546 40 01 21 13 -7 -19
+   -1 sprites/signals.pcx 578 40 01 21 10 -4 -19
+   -1 sprites/signals.pcx 594 40 01 21 13 -1 -19
+   -1 sprites/signals.pcx 626 40 01 21 10 -1 -19
+   -1 sprites/signals.pcx 642 40 01 21 11 -6 -19
+   -1 sprites/signals.pcx 658 40 01 23 8 -3 -21
+   -1 sprites/signals.pcx 674 40 01 21 11 0 -19
+   -1 sprites/signals.pcx 690 40 01 21 10 0 -19
+   -1 sprites/signals.pcx 706 40 01 21 10 0 -19
+   -1 sprites/signals.pcx 722 40 01 23 7 0 -21
+   -1 sprites/signals.pcx 738 40 01 21 11 -7 -19
+   -1 sprites/signals.pcx 754 40 01 21 11 -7 -19
+   -1 sprites/signals.pcx 770 40 01 21 4 1 -19
+   -1 sprites/signals.pcx 786 40 01 24 4 1 -22
+   -1 sprites/signals.pcx 2 88 01 23 4 -1 -21
+   -1 sprites/signals.pcx 18 88 01 26 4 -1 -24
+   -1 sprites/signals.pcx 34 88 01 21 12 -7 -19
+   -1 sprites/signals.pcx 66 88 01 21 9 -4 -19
+   -1 sprites/signals.pcx 82 88 01 21 12 0 -19
+   -1 sprites/signals.pcx 114 88 01 21 9 0 -19
+   -1 sprites/signals.pcx 130 88 01 21 11 -6 -19
+   -1 sprites/signals.pcx 146 88 01 23 8 -3 -21
+   -1 sprites/signals.pcx 162 88 01 21 11 0 -19
+   -1 sprites/signals.pcx 178 88 01 21 10 0 -19
+   -1 sprites/signals.pcx 194 88 01 21 10 0 -19
+   -1 sprites/signals.pcx 210 88 01 23 7 0 -21
+   -1 sprites/signals.pcx 226 88 01 21 11 -7 -19
+   -1 sprites/signals.pcx 242 88 01 21 11 -7 -19
+   -1 sprites/signals.pcx 258 88 01 21 4 1 -19
+   -1 sprites/signals.pcx 274 88 01 24 4 1 -22
+   -1 sprites/signals.pcx 290 88 01 23 4 -1 -21
+   -1 sprites/signals.pcx 306 88 01 26 4 -1 -24
+   -1 sprites/signals.pcx 322 88 01 21 12 -7 -19
+   -1 sprites/signals.pcx 354 88 01 21 9 -4 -19
+   -1 sprites/signals.pcx 370 88 01 21 12 0 -19
+   -1 sprites/signals.pcx 402 88 01 21 9 0 -19
+   -1 sprites/signals.pcx 418 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 434 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 450 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 466 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 482 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 498 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 514 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 530 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 546 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 562 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 578 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 594 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 610 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 626 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 642 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 658 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 674 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 690 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 706 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 722 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 738 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 754 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 770 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 786 88 01 21 6 -2 -19
+   -1 sprites/signals.pcx 2 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 18 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 34 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 50 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 66 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 82 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 98 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 114 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 130 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 146 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 162 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 178 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 194 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 210 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 226 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 242 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 258 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 274 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 290 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 306 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 322 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 338 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 354 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 370 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 386 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 402 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 418 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 434 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 450 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 466 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 482 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 498 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 514 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 530 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 546 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 562 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 578 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 594 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 610 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 626 136 01 21 6 -2 -19
+   -1 sprites/signals.pcx 642 136 01 21 10 -6 -19
+   -1 sprites/signals.pcx 658 136 01 23 7 -3 -21
+   -1 sprites/signals.pcx 674 136 01 21 10 1 -19
+   -1 sprites/signals.pcx 690 136 01 21 9 1 -19
+   -1 sprites/signals.pcx 706 136 01 21 9 1 -19
+   -1 sprites/signals.pcx 722 136 01 23 6 1 -21
+   -1 sprites/signals.pcx 738 136 01 21 10 -7 -19
+   -1 sprites/signals.pcx 754 136 01 21 10 -7 -19
+   -1 sprites/signals.pcx 770 136 01 21 2 1 -19
+   -1 sprites/signals.pcx 786 136 01 24 2 1 -22
+   -1 sprites/signals.pcx 2 184 01 23 2 1 -21
+   -1 sprites/signals.pcx 18 184 01 26 2 1 -24
+   -1 sprites/signals.pcx 34 184 01 21 11 -7 -19
+   -1 sprites/signals.pcx 50 184 01 21 8 -4 -19
+   -1 sprites/signals.pcx 66 184 01 21 11 1 -19
+   -1 sprites/signals.pcx 82 184 01 21 8 1 -19
+   -1 sprites/signals.pcx 98 184 01 21 12 -6 -19
+   -1 sprites/signals.pcx 130 184 01 23 9 -3 -21
+   -1 sprites/signals.pcx 146 184 01 21 12 -1 -19
+   -1 sprites/signals.pcx 178 184 01 21 11 -1 -19
+   -1 sprites/signals.pcx 194 184 01 21 11 -1 -19
+   -1 sprites/signals.pcx 210 184 01 23 8 -1 -21
+   -1 sprites/signals.pcx 226 184 01 21 12 -7 -19
+   -1 sprites/signals.pcx 258 184 01 21 12 -7 -19
+   -1 sprites/signals.pcx 290 184 01 21 4 1 -19
+   -1 sprites/signals.pcx 306 184 01 24 4 1 -22
+   -1 sprites/signals.pcx 322 184 01 23 4 -1 -21
+   -1 sprites/signals.pcx 338 184 01 26 4 -1 -24
+   -1 sprites/signals.pcx 354 184 01 21 13 -7 -19
+   -1 sprites/signals.pcx 386 184 01 21 10 -4 -19
+   -1 sprites/signals.pcx 402 184 01 21 13 -1 -19
+   -1 sprites/signals.pcx 434 184 01 21 10 -1 -19
+   -1 sprites/signals.pcx 450 184 01 21 11 -6 -19
+   -1 sprites/signals.pcx 466 184 01 23 8 -3 -21
+   -1 sprites/signals.pcx 482 184 01 21 11 0 -19
+   -1 sprites/signals.pcx 498 184 01 21 10 0 -19
+   -1 sprites/signals.pcx 514 184 01 21 10 0 -19
+   -1 sprites/signals.pcx 530 184 01 23 7 0 -21
+   -1 sprites/signals.pcx 546 184 01 21 11 -7 -19
+   -1 sprites/signals.pcx 562 184 01 21 11 -7 -19
+   -1 sprites/signals.pcx 578 184 01 21 4 1 -19
+   -1 sprites/signals.pcx 594 184 01 24 4 1 -22
+   -1 sprites/signals.pcx 610 184 01 23 4 -1 -21
+   -1 sprites/signals.pcx 626 184 01 26 4 -1 -24
+   -1 sprites/signals.pcx 642 184 01 21 12 -7 -19
+   -1 sprites/signals.pcx 674 184 01 21 9 -4 -19
+   -1 sprites/signals.pcx 690 184 01 21 12 0 -19
+   -1 sprites/signals.pcx 722 184 01 21 9 0 -19
+   -1 sprites/signals.pcx 738 184 01 21 11 -6 -19
+   -1 sprites/signals.pcx 754 184 01 23 8 -3 -21
+   -1 sprites/signals.pcx 770 184 01 21 11 0 -19
+   -1 sprites/signals.pcx 786 184 01 21 10 0 -19
+   -1 sprites/signals.pcx 2 232 01 21 10 0 -19
+   -1 sprites/signals.pcx 18 232 01 23 7 0 -21
+   -1 sprites/signals.pcx 34 232 01 21 11 -7 -19
+   -1 sprites/signals.pcx 50 232 01 21 11 -7 -19
+   -1 sprites/signals.pcx 66 232 01 21 4 1 -19
+   -1 sprites/signals.pcx 82 232 01 24 4 1 -22
+   -1 sprites/signals.pcx 98 232 01 23 4 -1 -21
+   -1 sprites/signals.pcx 114 232 01 26 4 -1 -24
+   -1 sprites/signals.pcx 130 232 01 21 12 -7 -19
+   -1 sprites/signals.pcx 162 232 01 21 9 -4 -19
+   -1 sprites/signals.pcx 178 232 01 21 12 0 -19
+   -1 sprites/signals.pcx 210 232 01 21 9 0 -19
+   -1 * 0	 07 85 01 \70 3B F2
+   -1 * 0	 07 86 01 \70 04 F1
+   -1 * 0	 05 04 F0
+   -1 sprites/signals.pcx 274 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 290 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 306 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 322 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 338 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 354 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 370 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 386 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 402 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 418 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 434 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 450 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 466 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 482 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 498 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 514 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 530 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 546 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 562 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 578 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 594 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 610 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 626 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 642 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 658 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 674 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 690 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 706 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 722 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 738 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 754 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 770 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 786 232 01 21 6 -2 -19
+   -1 sprites/signals.pcx 2 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 18 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 34 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 50 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 66 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 82 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 98 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 114 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 130 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 146 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 162 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 178 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 194 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 210 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 226 280 01 21 6 -2 -19
+   -1 sprites/signals.pcx 242 280 01 21 10 -7 -19
+   -1 sprites/signals.pcx 258 280 01 23 10 -8 -21
+   -1 sprites/signals.pcx 274 280 01 23 10 -7 -21
+   -1 sprites/signals.pcx 290 280 01 26 7 -5 -24
+   -1 sprites/signals.pcx 306 280 01 21 10 -7 -19
+   -1 sprites/signals.pcx 322 280 01 23 10 -6 -21
+   -1 sprites/signals.pcx 338 280 01 23 10 1 -21
+   -1 sprites/signals.pcx 354 280 01 26 7 2 -24
+   -1 sprites/signals.pcx 370 280 01 23 3 0 -21
+   -1 sprites/signals.pcx 386 280 01 26 3 0 -24
+   -1 sprites/signals.pcx 402 280 01 21 3 0 -19
+   -1 sprites/signals.pcx 418 280 01 24 3 0 -22
+   -1 sprites/signals.pcx 434 280 01 21 12 0 -19
+   -1 sprites/signals.pcx 466 280 01 24 9 0 -22
+   -1 sprites/signals.pcx 482 280 01 21 12 -9 -19
+   -1 sprites/signals.pcx 514 280 01 24 9 -6 -22
+   -1 sprites/signals.pcx 530 280 01 21 12 -9 -19
+   -1 sprites/signals.pcx 562 280 01 23 11 -9 -21
+   -1 sprites/signals.pcx 578 280 01 23 11 -7 -21
+   -1 sprites/signals.pcx 594 280 01 26 9 -5 -24
+   -1 sprites/signals.pcx 610 280 01 21 12 -7 -19
+   -1 sprites/signals.pcx 642 280 01 23 11 -6 -21
+   -1 sprites/signals.pcx 658 280 01 23 11 0 -21
+   -1 sprites/signals.pcx 674 280 01 26 9 0 -24
+   -1 sprites/signals.pcx 690 280 01 23 5 0 -21
+   -1 sprites/signals.pcx 706 280 01 26 5 0 -24
+   -1 sprites/signals.pcx 722 280 01 21 5 -2 -19
+   -1 sprites/signals.pcx 738 280 01 24 5 -2 -22
+   -1 sprites/signals.pcx 754 280 01 21 13 -1 -19
+   -1 sprites/signals.pcx 786 280 01 24 10 -1 -22
+   -1 sprites/signals.pcx 2 328 01 21 13 -9 -19
+   -1 sprites/signals.pcx 34 328 01 24 10 -6 -22
+   -1 sprites/signals.pcx 50 328 01 21 11 -8 -19
+   -1 sprites/signals.pcx 66 328 01 23 10 -8 -21
+   -1 sprites/signals.pcx 82 328 01 23 10 -7 -21
+   -1 sprites/signals.pcx 98 328 01 26 8 -5 -24
+   -1 sprites/signals.pcx 114 328 01 21 11 -7 -19
+   -1 sprites/signals.pcx 130 328 01 23 10 -6 -21
+   -1 sprites/signals.pcx 146 328 01 23 10 1 -21
+   -1 sprites/signals.pcx 162 328 01 26 8 1 -24
+   -1 sprites/signals.pcx 178 328 01 23 5 0 -21
+   -1 sprites/signals.pcx 194 328 01 26 5 0 -24
+   -1 sprites/signals.pcx 210 328 01 21 5 -2 -19
+   -1 sprites/signals.pcx 226 328 01 24 5 -2 -22
+   -1 sprites/signals.pcx 242 328 01 21 12 0 -19
+   -1 sprites/signals.pcx 274 328 01 24 9 0 -22
+   -1 sprites/signals.pcx 290 328 01 21 12 -9 -19
+   -1 sprites/signals.pcx 322 328 01 24 9 -6 -22
+   -1 sprites/signals.pcx 338 328 01 21 11 -8 -19
+   -1 sprites/signals.pcx 354 328 01 23 10 -8 -21
+   -1 sprites/signals.pcx 370 328 01 23 10 -7 -21
+   -1 sprites/signals.pcx 386 328 01 26 8 -5 -24
+   -1 sprites/signals.pcx 402 328 01 21 11 -7 -19
+   -1 sprites/signals.pcx 418 328 01 23 10 -6 -21
+   -1 sprites/signals.pcx 434 328 01 23 10 1 -21
+   -1 sprites/signals.pcx 450 328 01 26 8 1 -24
+   -1 sprites/signals.pcx 466 328 01 23 5 0 -21
+   -1 sprites/signals.pcx 482 328 01 26 5 0 -24
+   -1 sprites/signals.pcx 498 328 01 21 5 -2 -19
+   -1 sprites/signals.pcx 514 328 01 24 5 -2 -22
+   -1 sprites/signals.pcx 530 328 01 21 12 0 -19
+   -1 sprites/signals.pcx 562 328 01 24 9 0 -22
+   -1 sprites/signals.pcx 578 328 01 21 12 -9 -19
+   -1 sprites/signals.pcx 610 328 01 24 9 -6 -22
+   -1 sprites/signals.pcx 626 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 642 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 658 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 674 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 690 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 706 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 722 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 738 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 754 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 770 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 786 328 01 21 6 -2 -19
+   -1 sprites/signals.pcx 2 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 18 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 34 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 50 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 66 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 82 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 98 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 114 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 130 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 146 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 162 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 178 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 194 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 210 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 226 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 242 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 258 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 274 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 290 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 306 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 322 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 338 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 354 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 370 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 386 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 402 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 418 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 434 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 450 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 466 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 482 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 498 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 514 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 530 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 546 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 562 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 578 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 594 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 610 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 626 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 642 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 658 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 674 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 690 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 706 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 722 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 738 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 754 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 770 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 786 376 01 21 6 -2 -19
+   -1 sprites/signals.pcx 2 408 01 21 6 -2 -19
+   -1 sprites/signals.pcx 18 408 01 21 6 -2 -19
+   -1 sprites/signals.pcx 34 408 01 21 6 -2 -19
+   -1 sprites/signals.pcx 50 408 01 21 10 -7 -19
+   -1 sprites/signals.pcx 66 408 01 23 10 -8 -21
+   -1 sprites/signals.pcx 82 408 01 23 10 -7 -21
+   -1 sprites/signals.pcx 98 408 01 26 7 -5 -24
+   -1 sprites/signals.pcx 114 408 01 21 10 -7 -19
+   -1 sprites/signals.pcx 130 408 01 23 10 -6 -21
+   -1 sprites/signals.pcx 146 408 01 23 10 1 -21
+   -1 sprites/signals.pcx 162 408 01 26 7 2 -24
+   -1 sprites/signals.pcx 178 408 01 23 3 0 -21
+   -1 sprites/signals.pcx 194 408 01 26 3 0 -24
+   -1 sprites/signals.pcx 210 408 01 21 3 0 -19
+   -1 sprites/signals.pcx 226 408 01 24 3 0 -22
+   -1 sprites/signals.pcx 242 408 01 21 12 0 -19
+   -1 sprites/signals.pcx 274 408 01 24 9 0 -22
+   -1 sprites/signals.pcx 290 408 01 21 12 -9 -19
+   -1 sprites/signals.pcx 322 408 01 24 9 -6 -22
+   -1 sprites/signals.pcx 338 408 01 21 12 -9 -19
+   -1 sprites/signals.pcx 370 408 01 23 11 -9 -21
+   -1 sprites/signals.pcx 386 408 01 23 11 -7 -21
+   -1 sprites/signals.pcx 402 408 01 26 9 -5 -24
+   -1 sprites/signals.pcx 418 408 01 21 12 -7 -19
+   -1 sprites/signals.pcx 450 408 01 23 11 -6 -21
+   -1 sprites/signals.pcx 466 408 01 23 11 0 -21
+   -1 sprites/signals.pcx 482 408 01 26 9 0 -24
+   -1 sprites/signals.pcx 498 408 01 23 5 0 -21
+   -1 sprites/signals.pcx 514 408 01 26 5 0 -24
+   -1 sprites/signals.pcx 530 408 01 21 5 -2 -19
+   -1 sprites/signals.pcx 546 408 01 24 5 -2 -22
+   -1 sprites/signals.pcx 562 408 01 21 13 -1 -19
+   -1 sprites/signals.pcx 594 408 01 24 10 -1 -22
+   -1 sprites/signals.pcx 610 408 01 21 13 -9 -19
+   -1 sprites/signals.pcx 642 408 01 24 10 -6 -22
+   -1 sprites/signals.pcx 658 408 01 21 11 -8 -19
+   -1 sprites/signals.pcx 674 408 01 23 10 -8 -21
+   -1 sprites/signals.pcx 690 408 01 23 10 -7 -21
+   -1 sprites/signals.pcx 706 408 01 26 8 -5 -24
+   -1 sprites/signals.pcx 722 408 01 21 11 -7 -19
+   -1 sprites/signals.pcx 738 408 01 23 10 -6 -21
+   -1 sprites/signals.pcx 754 408 01 23 10 1 -21
+   -1 sprites/signals.pcx 770 408 01 26 8 1 -24
+   -1 sprites/signals.pcx 786 408 01 23 5 0 -21
+   -1 sprites/signals.pcx 2 456 01 26 5 0 -24
+   -1 sprites/signals.pcx 18 456 01 21 5 -2 -19
+   -1 sprites/signals.pcx 34 456 01 24 5 -2 -22
+   -1 sprites/signals.pcx 50 456 01 21 12 0 -19
+   -1 sprites/signals.pcx 82 456 01 24 9 0 -22
+   -1 sprites/signals.pcx 98 456 01 21 12 -9 -19
+   -1 sprites/signals.pcx 130 456 01 24 9 -6 -22
+   -1 sprites/signals.pcx 146 456 01 21 11 -8 -19
+   -1 sprites/signals.pcx 162 456 01 23 10 -8 -21
+   -1 sprites/signals.pcx 178 456 01 23 10 -7 -21
+   -1 sprites/signals.pcx 194 456 01 26 8 -5 -24
+   -1 sprites/signals.pcx 210 456 01 21 11 -7 -19
+   -1 sprites/signals.pcx 226 456 01 23 10 -6 -21
+   -1 sprites/signals.pcx 242 456 01 23 10 1 -21
+   -1 sprites/signals.pcx 258 456 01 26 8 1 -24
+   -1 sprites/signals.pcx 274 456 01 23 5 0 -21
+   -1 sprites/signals.pcx 290 456 01 26 5 0 -24
+   -1 sprites/signals.pcx 306 456 01 21 5 -2 -19
+   -1 sprites/signals.pcx 322 456 01 24 5 -2 -22
+   -1 sprites/signals.pcx 338 456 01 21 12 0 -19
+   -1 sprites/signals.pcx 370 456 01 24 9 0 -22
+   -1 sprites/signals.pcx 386 456 01 21 12 -9 -19
+   -1 sprites/signals.pcx 418 456 01 24 9 -6 -22
Binary file bin/data/ottd_grf/split/signals.pcx has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/data/ottd_grf/split/tramtracks.nfo	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,118 @@
+//
+// $Id$
+//
+   -1 * 0	 0C "Tram track graphics by PikkaBird"
+   -1 * 0	 05 0B 71
+   -1 sprites/tramtracks.pcx 18 8 09 13 20 0 4
+   -1 sprites/tramtracks.pcx 50 8 09 13 20 0 4
+   -1 sprites/tramtracks.pcx 82 8 03 36 64 -18 -8
+   -1 sprites/tramtracks.pcx 162 8 03 36 62 -16 -8
+   -1 sprites/tramtracks.pcx 242 8 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 322 8 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 402 8 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 482 8 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 562 8 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 642 8 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 722 8 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 2 56 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 82 56 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 162 56 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 242 56 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 322 56 09 39 64 -31 -8
+   -1 sprites/tramtracks.pcx 402 56 09 23 64 -31 0
+   -1 sprites/tramtracks.pcx 482 56 09 23 64 -31 0
+   -1 sprites/tramtracks.pcx 562 56 09 39 64 -31 -8
+   -1 sprites/tramtracks.pcx 642 56 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 722 56 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 2 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 82 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 162 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 242 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 322 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 402 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 482 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 562 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 642 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 722 120 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 2 168 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 82 168 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 162 168 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 242 168 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 322 168 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 402 168 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 482 168 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 562 168 09 39 64 -31 -8
+   -1 sprites/tramtracks.pcx 642 168 09 23 64 -31 0
+   -1 sprites/tramtracks.pcx 722 168 09 23 64 -31 0
+   -1 sprites/tramtracks.pcx 2 232 09 39 64 -31 -8
+   -1 sprites/tramtracks.pcx 82 232 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 162 232 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 242 232 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 322 232 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 402 232 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 482 232 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 562 232 09 20 20 0 0
+   -1 sprites/tramtracks.pcx 594 232 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 674 232 09 64 62 2 -49
+   -1 sprites/tramtracks.pcx 2 312 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 82 312 09 64 62 -62 -49
+   -1 sprites/tramtracks.pcx 162 312 09 64 62 -62 -49
+   -1 sprites/tramtracks.pcx 242 312 09 64 62 2 -49
+   -1 sprites/tramtracks.pcx 322 312 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 402 312 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 482 312 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 562 312 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 642 312 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 722 312 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 2 392 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 82 392 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 162 392 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 242 392 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 322 392 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 402 392 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 482 392 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 562 392 09 56 64 -31 -25
+   -1 sprites/tramtracks.pcx 642 392 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 722 392 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 2 472 09 56 64 -31 -25
+   -1 sprites/tramtracks.pcx 82 472 09 56 64 -31 -25
+   -1 sprites/tramtracks.pcx 162 472 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 242 472 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 322 472 09 56 64 -31 -25
+   -1 sprites/tramtracks.pcx 402 472 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 482 472 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 562 472 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 642 472 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 722 472 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 2 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 82 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 162 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 242 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 322 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 402 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 482 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 562 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 642 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 722 552 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 2 616 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 82 616 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 162 616 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 242 616 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 322 616 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 402 616 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 482 616 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 562 616 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 642 616 09 56 64 -31 -25
+   -1 sprites/tramtracks.pcx 722 616 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 2 696 09 56 64 -31 -25
+   -1 sprites/tramtracks.pcx 82 696 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 162 696 09 56 64 -31 -25
+   -1 sprites/tramtracks.pcx 242 696 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 322 696 09 56 64 -31 -25
+   -1 sprites/tramtracks.pcx 402 696 09 48 64 -31 -17
+   -1 sprites/tramtracks.pcx 482 696 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 562 696 09 31 64 -31 0
+   -1 sprites/tramtracks.pcx 642 696 09 39 64 -31 -8
+   -1 sprites/tramtracks.pcx 722 696 09 23 64 -31 0
+   -1 sprites/tramtracks.pcx 2 776 09 23 64 -31 0
+   -1 sprites/tramtracks.pcx 82 776 09 39 64 -31 -8
Binary file bin/data/ottd_grf/split/tramtracks.pcx has changed
Binary file bin/data/roadstops.grf has changed
Binary file bin/data/tramtrkw.grf has changed
Binary file bin/data/trkfoundw.grf has changed
--- a/changelog.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/changelog.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1,3 +1,187 @@
+0.6.0-beta1 (2007-11-18)
+------------------------------------------------------------------------
+- Feature: Make news messages related to the industry (production) changes better configurable; you can now disable news messages popping up for industries you are not servicing (r11442)
+- Feature: When sorting stations by cargo sum, only sum the cargoes that are selected in the filter (r11437)
+- Feature: Show all players who have shares, not just the first two (r11435)
+- Feature: Make OTTD's sprites replaceable using Action 5 and make replacing contiguous subsets of sprites in for some types possible in Action 5 (r11433)
+- Feature: Allow town-bridges to be build on slopes (r11395)
+- Feature: Auto-road; same as auto-rail, but for road and trams and only on X and Y direction (r11339)
+- Feature: OTTD version checking for NewGRFs. This allows NewGRFs to do something different for different versions of OpenTTD, like disabling it for too low versions or loading different graphics (r11330)
+- Feature: Half tile- and anti-zig-zag-foundations (r11319)
+- Feature: Control-Clicking the Centre Main View button on the vehicle window allows the main viewport to follow the chosen vehicle (r11304)
+- Feature: User customisable faces (r11269)
+- Feature: Make more advanced rail types more expensive to build (r11265)
+- Feature: Implement the "moreanimation" feature of TTDP, so we can properly support newindustries (r11228)
+- Feature: [NewGRF] Add support for newindustries (r11204)
+- Feature: Sort the NewGRFs by name, making searching a specific NewGRF a lot easier (r11175)
+- Feature: Add possibility to show the bounding boxes of sprites using CTRL-B so one can get a better understanding of the used bounding boxes to fix the glitches that still exist. Note that showing the bounding boxes is not glitch free; it only gives you some knowledge where the bounding boxes are (r11174)
+- Feature: Remove the arbitrary limit of 10 articulated parts for a vehicle (r11120)
+- Feature: Autoslope, changing of slopes of tiles that already have something build on them. Does not work for tiles of houses/industries/stations that do not allow autosloping (r11107)
+- Feature: Support for encapsulating files into a .tar file; you can pack all files in your data/ directory in how ever many .tar files you like, keeping the directory-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked (r11106)
+- Feature: Allow slopes under statues (r11069)
+- Feature: [OSX] Added more options for right click emulation (controlled from the interface tab in the patch window) (r10996)
+- Feature: Allow building and removing tracks and signals when there is a train on a parallel diagonal track that does not interact with this one. (r10922)
+- Feature: Added TileHeight to the Land Area Information tool [FS#653] (r10878)
+- Feature: [OSX] OpenTTD will now pick the same language as finder is set to if no config file is found (r10851)
+- Feature: Provide an infrastructure to have resizable windows that are smaller than the default window size. Useful for playing on very low resolution systems (r10704)
+- Feature: Support for autosave_on_exit in the console, so dedicated servers can use it (r10658)
+- Feature: Add a soft limit of 4096 "entities" in a station's waiting queue and a hard limit of 32768 so (malicious) people cannot cause a "denial of service" attack by filling cargo lists (r10555)
+- Feature: Replace all the windows for Industry building by a more flexible one (r10496)
+- Feature: Support for "prospecting" raw industries, i.e. you pay an amount of money and then it might (with a given chance) build a raw industry somewhere on the map (r10451)
+- Feature: Automatic signal completion, enabled by pressing CTRL when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of CTRL-drag for changing existing signal type (r10437)
+- Feature: New sign editor features including switching to previous/next sign (r10401)
+- Feature: Disallow (in the GUI) the building of infrastructure you do not have available vehicles for. This means that the airport building button is disabled till you can actually build aircraft. The game itself will not disallow you to build the infrastructure and this "new" behaviour can be overridden with a patch setting [FS#669] (r10353)
+- Feature: Add the possibility of automatically filling in timetables based on the times from the first (or subsequent) run-throughs (r10331)
+- Feature: Option to select the "default" rail type when you start a new game or load a game. This is done either static, i.e. rail, electrified rail, monorail and maglev, or dynamic which takes either the first or last available railtype or the railtype that is used most on the map  [FS#812] (r10329)
+- Feature: Give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches [FS#917] (r10300)
+- Feature: A sticky button for the client list window [FS#885] (r10293)
+- Feature: Allow double-clicking on certain places: add NewGRF window, build-vehicle and town-action (r10265, r10267)
+- Feature: Loading indicator, which shows in % how full a vehicle is while loading/unloading (r10254)
+- Feature: Introduce a form of timetabling for vehicles (r10236)
+- Feature: [NewGRF] Add support for action 0F (town name generator) (r10211)
+- Feature: Add support for personal directories on Windows. (r10182)
+- Feature: Add support for anti aliased typefaces via FreeType. This is configurable for each font size in the configuration settings and requires using the 32bpp blitter and suitable fonts (r10166)
+- Feature: 32 bpp sprite support and dedicated driver does not blit nor render by default. Can be overruled by user (r10121)
+- Feature: Add support for articulated road vehicles (r10097)
+- Feature: Allow moving of orders instead of removing them and readding them somewhere else [FS#828] (r10071)
+- Feature: Replace hard coded spritecache size with a configuration option, sprite_cache_size. The default size is 2MB and the value can range from 1 to 64MB. If you experience slow-downs when scrolling the map, try increasing this setting (r10042)
+- Feature: Skip to the selected order in the order list when clicking on the "skip" button while pressing CTRL [FS#760] (r10033)
+- Feature: Sort the strings in server language dropdown and the town names dropdown (r10032, r10036)
+- Feature: Build windows of trains, road vehicles and ships can now be sorted by cargo capacity (planes already had this option) (r10024)
+- Feature: More languages flags for servers [FS#790] (r10017)
+- Feature: Allow different signal types on one tile [FS#362] (r10006)
+- Feature: Support for oneway roads (r9999)
+- Feature: Add smooth viewport scrolling. This must be enabled with patch setting 'smooth_scroll' (r9962)
+- Feature: Allow terraforming under bridges (r9950)
+- Feature: Support for trams (r9923)
+- Feature: Allow building new stations adjacent to existing stations by holding down control (r9905)
+- Feature: Add one new zoom-out level: 8 times (r9884)
+- Feature: Advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group (r9874)
+- Feature: Make "improved loading" a proper improved loading instead of loading one (semi-)random vehicle at a time. Furthermore fill multiple vehicles at once when there is enough cargo to do so (r9838)
+- Feature: Add drag and drop removal of station tiles (r9810)
+- Feature: Support for "curvature info", Action 2 for train, variable 45 (r9803)
+- Feature: [NewGRF] Add action 1, 2 and 3 support for canals (r9797)
+- Feature: Add the possibility to choose different road patterns for towns to use (r9779)
+- Feature: Add an option to automatically pause when starting a new game (r9734)
+- Feature: Add the concept of cities. A (configurable) proportion of towns can start off larger, and will grow twice as quickly as other towns (r9667)
+- Feature: Add NewGRF Action 5 (Sprite Replacement) support for 2cc colour maps, airport, and road stop sprites (r9645)
+- Feature: Increase cargo types from 12 to 32 and enable newcargo flag in NewGRF loader (r9638)
+- Feature: Make it possible to have some control over the town growth (r9613)
+- Feature: Add list_patches console command. This shows all patches along with their current values (r9565)
+- Feature: Add more finer control to transparency options, including a new toolbar (r9563)
+- Feature: Add support for variable snow lines in the arctic climate, supplied by NewGRF files (r9371)
+- Feature: [NewGRF] Add support for newhouses (r9315)
+- Feature: [NewGRF] Add support for Action 13, which allows you to translate GRF-specific texts. The translations will only be shown if you are using a language with a GRF language id and if a string has not already been set specifically for the language you are using (r9037)
+- Feature: Translation dependant formatting of dates (r8906)
+- Feature: If an action 7/9 leads to skipping the rest of the file, disable the NewGRF if an action 8 has not been encountered yet (r8831)
+- Feature: Stop loading and disable the current NewGRF if a fatal error message in Action B is encountered. Also be more strict on the values accepted (r8830)
+- Feature: Build aircraft windows will no longer show aircraft that cannot use the airport in question (r8771)
+- Feature: Drive-through road stops (r8735)
+- Feature: Allow upgrading bridges by building a new bridge over the top (r8567)
+- Feature: Provide aircraft with vertical separation depending on their altitude and velocity (r8534)
+- Feature: When linking the terraform toolbar to the build toolbars place them side by side instead of on top of each other (r8436)
+- Feature: The vehicle build windows are now resizable in horizontal direction as well (r8331, r8336, r8338)
+- Feature: Automatically build semaphores before a configurable date, which can be set by each network player separately (r8151)
+- Feature: Increase sprite limit from 16384 sprites to 16777216 sprites (r8128, r8129)
+- Feature: Add the ability to load savegames when you do not have the exact GRF files in your list. GRF files that are found based on GRF ID (but not on matching md5sum) are used instead of disabling them. This does not affect MP games, there you still need an exact match (r8106)
+- Feature: Show the activated status of the GRF list after pressing 'apply' in the NewGRF window, instead of the local list (r8094)
+- Feature: The station list does now remember the sort settings (r8065)
+- Feature: Make it possible to override the bind address and port of a dedicated server from the command line (r7802)
+- Feature: Add command line option to prevent saving of high score and configuration on exit and a console command to manually initiate a configuration save (r7801)
+- Feature: Add support for tractive effort to 'realistic' acceleration (7592)
+- Feature: Allow to build bridges of arbitrary rail/road combinations (including signals) (r7573)
+- Codechange: Do not allow configuration changes, that NewGRFs can directly use to change their behaviour, during network games as this can cause desyncs (r11452)
+- Codechange: Make opening a new toolbar not overlapping its parent one, by locating it under the parent, and aligned with the left side of it [FS#1310] (r11256)
+- Codechange: Do not brute force determine the first vehicle in the chain or previous vehicle, but do it by properly accounting the previous and first pointers when updating the next pointer. This gives a performance increase of about 15% when there are a lot of vehicles in the game (r11011)
+- Codechange: Cache expensive NewGRF station variables during sprite lookups/callbacks (r10509)
+- Codechange: Keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo is not thrown on a big pile when it is put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it (r10266)
+- Codechange: Do not limit the cost of tunnels (r10248)
+- Codechange: Add new vehicle hash table for collision detection and finding vehicles on a tile. The hash area scanned is far smaller than the old hash table, which is now used for viewport updates only. This should give a significant performance improvement for games with many vehicles (r10111)
+- Codechange: Don't redraw all station tiles when cargo is added or removed if the station has no custom graphics (r10062)
+- Codechange: Add some support for NewGRF var 7D, temporary storage array (r9707)
+- Codechange: Add support for returning 'ttdpatch variables' (Action D) (r9701)
+- Codechange: Implement NewGRF callback 36, which allows changing of various properties which were previously static (r9671 and several others)
+- Codechange: Add support for multiple 'base' directories for NewGRF searching (r9560)
+- Codechange: Implement actions 1/2/3 for cargoes, callback handler and custom icon sprites (rmany)
+- Codechange: Rename the 'New <vehtype>' button of the global vehicle lists to 'Available <vehtype>' as it is a view-only list, not one from which you can purchase (rolling) stock (r8420)
+- Codechange: Remove the landscaping button from the build toolbars (r8143)
+- Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D) (r7831)
+- Fix: The CHANCE16 functions were biased; a 32768 in 65536 chance was really a 32769 in 65536 chance (r11454)
+- Fix: Do not create shores in canyons (r11438)
+- Fix: Starting OpenTTD with DOS files made it look weird out of the box (r11433)
+- Fix: Properly support genders coming from NewGRFs instead of crashing [FS#1430] (r11422)
+- Fix: Do not ignore the autorenew settings for new games when creating a new game [FS#1428] (r11415)
+- Fix: Do not do a 270 degree turn when 90 degrees is enough on a commuter airport [FS#1422] (r11408)
+- Fix: In rare cases OpenTTD could segfault when resizing and scroll the main window (r11405)
+- Fix: Manually replacing a vehicle with shared orders makes it lose it is order index and service interval [FS1384] (r11370)
+- Fix: Road vehicles must not drive through each other on bridges/in tunnels [FS#1258] (r11366)
+- Fix: When stopping a ship or aircraft, set their speed to 0 so they will not continue at the speed where they were stopped at [FS#1288] (r11365)
+- Fix: Cloning vehicles with non-standard sub-cargotypes (i.e. livery refits) failed [FS#1380] (r11362)
+- Fix: Loading too many GRFs was not handled gracefully causing crashes and such [FS#1377] (r11355)
+- Fix: Add missing elrail sprites for some rail build buttons/cursors (r11350)
+- Fix: Trees can now be planted on bare land without making it grassy, planting tree in desert does not make it grassy for the first tile-cycle and when a tree dies in desert, it no longer becomes a snowy tile for the first tile-cycle (r11244)
+- Fix: The explosion vehicles were placed too far to the south [FS#1312] (r11234)
+- Fix: One could sell vehicles that were crashed in a depot, which would still yield money/one could construct trains of crashed vehicles [FS#1307, FS#1228] (r11229, r11230)
+- Fix: Electric trains were not shown as stopped in depots when converting it from elrail -> normal rail [FS#1260] (r11167)
+- Fix: A lot of graphical glitches by changing some bounding boxes. It is not perfect yet, but a *very* good step into the right direction (r11128)
+- Fix: When autorenew is enabled and it cannot renew the vehicle anymore (because the player cannot build the engine), the ageing warnings as if autorenew is not enabled are shown [FS#553] (r11064)
+- Fix: Inconsistency between rail<->elrail conversions of different kinds of rail containing tiles (normal rail, stations, depots, etc) [FS#1182] (r11059)
+- Fix: Crash when having the Finance window opened of the player you are cheating to [FS#1177] (r11028)
+- Fix: Switching players (using the cheat) crashed on Big Endian machines [FS#1150] (r11023)
+- Fix: The canal border determination did not take oil rigs into consideration (r11022)
+- Fix: Do not display income/expenses when they do not belong to a "valid" tile, like the money cheat/giving money [FS#1175] (r11021)
+- Fix: One could not give money when (s)he had too much money or rather: when casting the amount of money to an int32 becomes negative [FS#1174] (r11020)
+- Fix: When determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location [FS#1104] (r10792)
+- Fix: Determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis) [FS#1058] (r10686)
+- Fix: Graphical glitches when the "link landscape toolbar" patch is turned on when opening one of the construction toolbars [FS#1076] (r10685)
+- Fix: Trolly AI did not know about steep slopes, and used wrong tileh in some cases [FS#1070] (r10655)
+- Fix: Be consistent with the space between the company name and the player number, i.e. always put a space between them [FS#1052] (r10627)
+- Fix: [YAPF] Ships received curve penalty for non-diagonal straight move (r10578)
+- Fix: Do not segfault when you quit in the end-of-the-game screen [FS#1020] (r10548)
+- Fix: When Cheat-Window is open and a new month happens, the window was not redrawn instantly (r10547)
+- Fix: You can now have both Available Train as Available Ship window open [FS#1026] (r10546)
+- Fix: Cargo payment rates overflow and cargo payment rates diverge from cost rates making it impossible to make any profit after a certain number of years. Both are solved by stopping the inflation after 170 years; there is absolutely no point in continuing the inflation after that as it only makes the game have overflows at some point that cannot be solved; using larger variables only delays the inevitable [FS#1028] (r10541)
+- Fix: Error dialog was sometimes shown on all clients when a command failed instead of only the client that actually did the command [FS#1015] (r10501)
+- Fix: The network protocol check for required NewGRFs sent static NewGRFs too (r10414)
+- Fix: When landscape generating, allow for 200ms between screen updates instead of updating every 200ms. Previously slow screen updates would result in very slow map generation (r10396)
+- Fix: One could only build a limited number of stations before one had to rename them [FS#278] (r10320)
+- Fix: Acceleration not calculated properly when a train goes up a hill between tunnels [FS#786] (r10317)
+- Fix: [YAPF] Now it is no longer needed to invalidate the YAPF segment cache every tick in MP (read performance increase). Segment cost now does not contain the curves between segments. As a result the cache should be now accurate (r10302)
+- Fix: [YAPF] Assertion triggered in some special cases [FS#901] (r10301)
+- Fix: Flush stdout on dedicated server output to ensure an update of stdout [FS#775] (r10295)
+- Fix: With smooth_economy, when industry production hit 32, it stayed there for ever. Give it some chance to get out of that uber-lowness (although it is a very slim chance, at least it has one) (r10290)
+- Fix: Also age engines that are not front-engines [FS#202] (r10288)
+- Fix: Money overflow bugs in many locations [FS#723] (r10212)
+- Fix: Fix issues related to fixed names, fixed places of files/directories and application bundles [FS#153, FS#193, FS#502, FS#816, FS#854] (r10182)
+- Fix: A vehicle without visual effects is not per definition unpowered (r9802)
+- Fix: Do not assume that trains running on monorail/maglev cannot smoke/spark (r9801)
+- Fix: Play sound effects based on the engine class, not the rail type (r9800)
+- Fix: Separate engine class and engine running cost class (r9799)
+- Fix: Clone vehicles will no longer refit for free (r9689)
+- Fix: Improved loading does not use a huge amount of processing power anymore when having a lot of trains [FS#423] (r9683)
+- Fix: Truncate the NewGRF information text in the NewGRF GUI if it is too long (r9449)
+- Fix: Cancel in password queries reduces amount of players in the network game when they have not joined the game yet [FS#688] r9378
+- Fix: If all news-setting buttons show 'full', make the ALL-button show 'full' too (r9137)
+- Fix: Open and close messages now have their own setting, so you can hide economy changes, but do show open/close of industries [FS#525] (r9097)
+- Fix: Do not make owner signs transparent, as then you loose the information who it owns [FS#637] (r9067)
+- Fix: Store the owner of a statue, so when it gets removed, the town is notified of it [FS#638] (r9066)
+- Fix: Inactive connections are not automatically kicked, i.e. people who only open a telnet (or similar) connection to a server [FS#115] (r9038)
+- Fix: Do not select a disabled platform length/number of track count when going out of drag-drop mode [FS#450] (r8999)
+- Fix: Make an aircraft at 400 km/h go as fast as a train at 400 km/h (r8973)
+- Fix: You were unable to build roads in the scenario editor when there is no town 0, even though there are other towns (r8608)
+- Fix: Road Vehicles now can obtain a slot even if the station is very spread out [FS#577] (r8536)
+- Fix: Allow lumber mill to cut trees only when they are full grown (r8535)
+- Fix: Segmentation fault when the toolbar gets removed and you have selected one of the items in a sub menu of the toolbar (r8533)
+- Fix: Remove phantom oil rigs sometimes present in old savegames (r8485)
+- Fix: When a station is removed, vehicles do not get excessive payment any longer, as the origin TILE is now stored as long as the origin STATION for the transported cargoes (r8144)
+- Fix: The game could crash when the chat key (<ENTER>) is pressed too vehemently during the join of the game. Your client's id does not exist in the clients list yet, and returns NULL (r8132)
+- Fix: Rail vehicles can no longer enter tunnels or bridgeheads with wrong railtype (r7976)
+- Fix: When path finding onto a bridge or tunnel end from previous tile (but not warping from the opposite end) check the enter direction. This fixes signal setting if a rail ends on the top of a tunnel end (r7718)
+- Fix: When following path for signals, do not skip back to the previous tile, as for tunnels and bridge ends the entering direction is wrong (r7717)
+- Fix: [YAPF] suppress 'Train is lost' message if path finding ended on the first two-way red signal due to YAPF.rail_firstred_twoway_eol option (r7628)
+- Fix: [OPF] signal update was incorrectly propagated (r7620)
+
+
 0.5.3 (2007-09-15)
 ------------------------------------------------------------------------
 - Fix: Possible NULL pointer dereference that could be triggered remotely (r11074)
--- a/config.lib	Sat Oct 06 21:16:00 2007 +0000
+++ b/config.lib	Mon Dec 03 23:39:38 2007 +0000
@@ -805,6 +805,7 @@
 	if [ $cc_version -ge 29 ]; then
 		CFLAGS="$CFLAGS -Wall -Wno-multichar -Wsign-compare -Wundef"
 		CFLAGS="$CFLAGS -Wwrite-strings -Wpointer-arith"
+		CFLAGS="$CFLAGS -Wno-uninitialized"
 
 		CC_CFLAGS="$CC_CFLAGS -Wstrict-prototypes"
 	fi
@@ -882,6 +883,10 @@
 		LIBS="$LIBS -pthread"
 	fi
 
+	if [ "$os" = "FREEBSD" ]; then
+		LIBS="$LIBS -lpthread"
+	fi
+
 	if [ "$os" = "OSX" ]; then
 		LDFLAGS="$LDFLAGS -framework Cocoa"
 		if [ "$enable_dedicated" = "0" ]; then
@@ -1003,6 +1008,10 @@
 			CFLAGS="$CFLAGS -I$with_iconv/include"
 			LIBS="$LIBS -L$with_iconv/lib"
 		fi
+
+		if [ "$have_broken_iconv" != "no" ]; then
+			CFLAGS="$CFLAGS -DHAVE_BROKEN_ICONV"
+		fi
 	fi
 
 	if [ -n "$with_midi" ]; then
@@ -1849,6 +1858,32 @@
 	log 2 "found iconv in $iconv"
 
 	log 1 "checking iconv... found"
+
+	# Check if we need to work around buggy iconv implementation where inbuf
+	# is wrongly typed as non-const. Correct implementation is at
+	# http://www.opengroup.org/onlinepubs/007908799/xsh/iconv.html
+
+	cat > tmp.iconv.cpp << EOF
+#include "src/stdafx.h"
+#include <iconv.h>
+int main() {
+	static char buf[1024];
+	iconv_t convd = 0;
+	const char *inbuf = "";
+	char *outbuf  = buf;
+	size_t outlen = 1023;
+	size_t inlen  = 0;
+	return iconv(convd, &inbuf, &inlen, &outbuf, &outlen);
+}
+EOF
+	execute="$cxx_host $CFLAGS -c tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1"
+	eval $execute >&/dev/null
+	ret=$?
+	log 2 "executing $execute"
+	log 2 "  exit code $ret"
+	if [ "$ret" = "0" ]; then have_broken_iconv="no"; else have_broken_iconv="yes"; fi
+	log 1 "checking if iconv has non-const inbuf... $have_broken_iconv"
+	rm -f tmp.iconv tmp.iconv.cpp
 }
 
 _detect_sort() {
--- a/docs/landscape.html	Sat Oct 06 21:16:00 2007 +0000
+++ b/docs/landscape.html	Mon Dec 03 23:39:38 2007 +0000
@@ -260,6 +260,11 @@
           <td nowrap valign=top><tt>C</tt>&nbsp; </td>
           <td align=left>on snow or desert</td>
          </tr>
+
+         <tr>
+          <td nowrap valign=top><tt>D</tt>&nbsp; </td>
+          <td align=left>on grass with fence and water on the lower halftile</td>
+         </tr>
         </table>
        </li>
        <li>m5 bits 5..0: track layout: bit set = track present:
--- a/known-bugs.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/known-bugs.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1,49 +1,30 @@
 README
 ------------------------------------------------------------------------
 All bugs listed below are marked as known. Please do not submit any bugs
-that are the same as these. If you do, don't act surprised, because
+that are the same as these. If you do, do not act surprised, because
 we WILL flame you!!
 
 Of course if you have more knowledge about any of these bugs, have more
 specifics, we welcome you to report them. React to the given bug indicated
 by the number below on http://bugs.openttd.org.
+
 If the bug report is closed, it has been fixed, which then can be verified
-in the latest SVN version.
+in the latest SVN version of /trunk.
 
-Bugs for 0.5.3
+Bugs for 0.6.0-beta1
 ------------------------------------------------------------------------
 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
--716	Train Crash in Depot
--674	Map signs allow less nonenglish characters than english ones
--669	Docks/Airports/RV Stations can be built without available vehicles
--646	AI builds useless stations
--599	Reloaded game lost company passwords
--591	Autorenew fails under certain conditions
--553	Autorenew doesn't warn when replacement isn't available
--546	Overflows due to inflation
--522	Overflow on vehicle costs
--502	OSX can incorrectly print "dbg: [sl] Cannot open savegame 'data/opntitle.dat' for saving/loading."
--501	Mouse pointer gets hidden, when draging out of window and back again. Only affects Wacom etc.
--494	Get free money abusing a stock bug
--474	Overtaking car doesn't hit the against-riding car.
--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
--365	Blimp Stuck at airport
--362	Changing signal type affects whole square
--355	graphics bugs with trains - water, tunnels
--354	Maglev Trains faster than All Planes
--339	Crash in Quicktime when exiting game
--299	Disable 90 deg turns patch - AI builds 90 deg turns
--282	AI Players do not clear loans as soon as they could
--259	AIs start unnamed companies that do nothing
--202	2 Locomotives in 1 Train - Selling one results in Age of the other one Being 0
--193	Inconsistent directory usage on Mac OS X
--153	Language crash with app renaming OSX
--119	Clipping problems with vehicles on slopes
-- 51	Windows doesn't support CUSTOM_LANG_DIR
+- 1434	Network game crashes when player builds SH40
+- 1404	Spinner widget interprets one click as many
+- 1401	Crash while scrolling screen
+- 1386	Mac OS X fails to compile out of the box on 10.5
+- 1264	Autoreplace for multiple NewGRF DMU sets fails
+- 1200	Illegal names skip comparisons for uniquity
+- 1141	[OSX] Not smooth moving map with touchpad
+- 1109	[OSX] Choppy mouse cursor movement in fullscreen mode
+- 1094	Foundations showing on 'build on slopes'
+- 1074	Large slowdown when building tracks
+- 1072	Text overflows in several windows
+-  716	Train crash in depot with long long tracks
+-  119	Clipping problems with vehicles on slopes
--- a/os/debian/changelog	Sat Oct 06 21:16:00 2007 +0000
+++ b/os/debian/changelog	Mon Dec 03 23:39:38 2007 +0000
@@ -4,6 +4,12 @@
 
  -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Mon, 26 Feb 2007 21:07:05 +0100
 
+openttd (0.6.0~beta1-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Sun, 18 Nov 2007 16:05:05 +0100
+
 openttd (0.5.3-1) unstable; urgency=low
 
   * New upstream release.
--- a/os/win32/installer/install.nsi	Sat Oct 06 21:16:00 2007 +0000
+++ b/os/win32/installer/install.nsi	Mon Dec 03 23:39:38 2007 +0000
@@ -1,9 +1,9 @@
 !define APPNAME "OpenTTD"   ; Define application name
-!define APPVERSION "0.5.3"  ; Define application version
-!define INSTALLERVERSION 38 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
+!define APPVERSION "0.6.0"  ; Define application version
+!define INSTALLERVERSION 39 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
 
 !define APPURLLINK "http://www.openttd.org"
-!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}"
+!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}-beta1"
 !define APPVERSIONINTERNAL "${APPVERSION}.0" ; Needs to be of the format X.X.X.X
 
 !define MUI_ICON "..\..\..\media\openttd.ico"
--- a/projects/determineversion.vbs	Sat Oct 06 21:16:00 2007 +0000
+++ b/projects/determineversion.vbs	Mon Dec 03 23:39:38 2007 +0000
@@ -14,21 +14,47 @@
 	file.Close
 End Sub
 
-Sub UpdateFile(version, cur_date, filename)
+Sub UpdateFile(revision, version, cur_date, filename)
 	FSO.CopyFile filename & ".in", filename
+	FindReplaceInFile filename, "@@REVISION@@", revision
 	FindReplaceInFile filename, "@@VERSION@@", version
 	FindReplaceInFile filename, "@@DATE@@", cur_date
 End Sub
 
 Sub UpdateFiles(version)
-	Dim cur_date
+	Dim WshShell, cur_date, revision, oExec
+	Set WshShell = CreateObject("WScript.Shell")
 	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"
+	revision = 0
+	Select Case Mid(version, 1, 1)
+		Case "r" ' svn
+			revision = Mid(version, 2)
+			If InStr(revision, "M") Then
+				revision = Mid(revision, 1, InStr(revision, "M") - 1)
+			End If
+			If InStr(revision, "-") Then
+				revision = Mid(revision, 1, InStr(revision, "-") - 1)
+			End If
+		Case "h" ' mercurial (hg)
+			Set oExec = WshShell.Exec("hg log -k " & Chr(34) & "svn" & Chr(34) & " -l 1 --template " & Chr(34) & "{desc}\n" & Chr(34) & " ../src")
+			If Err.Number = 0 Then
+				revision = Mid(OExec.StdOut.ReadLine(), 7)
+				revision = Mid(revision, 1, InStr(revision, ")") - 1)
+			End If
+		Case "g" ' git
+			Set oExec = WshShell.Exec("git log --pretty=format:%s --grep=" & Chr(34) & "^(svn r[0-9]*)" & Chr(34) & " -1 ../src")
+			if Err.Number = 0 Then
+				revision = Mid(oExec.StdOut.ReadLine(), 7)
+				revision = Mid(revision, 1, InStr(revision, ")") - 1)
+			End If
+	End Select
+
+	UpdateFile revision, version, cur_date, "../src/rev.cpp"
+	UpdateFile revision, version, cur_date, "../src/ottdres.rc"
 End Sub
 
 Function DetermineSVNVersion()
-	Dim WshShell, version, url, oExec
+	Dim WshShell, version, url, oExec, line
 	Set WshShell = CreateObject("WScript.Shell")
 	On Error Resume Next
 
@@ -78,7 +104,6 @@
 			' 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
@@ -98,6 +123,52 @@
 			url = Mid(url, 1, InStr(2, url, "/") - 1)
 			version = version & Replace(url, "/", "-")
 		End If
+	Else
+		' svn detection failed, reset error and try git
+		Err.Clear
+		Set oExec = WshShell.Exec("git rev-parse --verify --short=8 HEAD")
+		If Err.Number = 0 Then
+			version = "g" & oExec.StdOut.ReadLine()
+			Set oExec = WshShell.Exec("git diff-index --exit-code --quiet HEAD ../src")
+			Do While oExec.Status = 0 And Err.Number = 0
+			Loop
+			If Err.Number = 0 And oExec.ExitCode = 1 Then
+				version = version & "M"
+			End If
+
+			Set oExec = WshShell.Exec("git symbolic-ref HEAD")
+			If Err.Number = 0 Then
+				line = oExec.StdOut.ReadLine()
+				line = Mid(line, InStrRev(line, "/")+1)
+				If line <> "master" Then
+					version = version & "-" & line
+				End If
+			End If
+		Else
+			' try mercurial (hg)
+			Err.Clear
+			Set oExec = WshShell.Exec("hg tip")
+			If Err.Number = 0 Then
+				version = "h" & Mid(OExec.StdOut.ReadLine(), 19, 8)
+				Set oExec = WshShell.Exec("hg status ../src")
+				If Err.Number = 0 Then
+					Do
+						line = OExec.StdOut.ReadLine()
+						If Mid(line, 1, 1) <> "?" Then
+							version = version & "M"
+							Exit Do
+						End If
+					Loop While Not OExec.StdOut.atEndOfStream
+				End If
+				Set oExec = WshShell.Exec("hg branch")
+				If Err.Number = 0 Then
+						line = OExec.StdOut.ReadLine()
+						If line <> "default" Then
+							version = version & "-" & line
+						End If
+				End If
+			End If
+		End If
 	End If
 
 	DetermineSVNVersion = version
--- a/projects/generate	Sat Oct 06 21:16:00 2007 +0000
+++ b/projects/generate	Mon Dec 03 23:39:38 2007 +0000
@@ -15,10 +15,15 @@
 	exit 1
 fi
 
+# openttd_vs90.sln    is for MSVC 2008
+# openttd_vs90.vcproj is for MSVC 2008
+# langs_vs90.vcproj   is for MSVC 2008
+# strgen_vs90.vcproj  is for MSVC 2008
+
 # openttd_vs80.sln    is for MSVC 2005
 # openttd_vs80.vcproj is for MSVC 2005
 # langs_vs80.vcproj   is for MSVC 2005
-# strgen_vs80.vcprojc is vor MSVC 2005
+# strgen_vs80.vcproj  is for MSVC 2005
 
 # openttd.sln         is for MSVC 2003
 # openttd.vcproj      is for MSVC 2003
@@ -196,5 +201,7 @@
 
 generate "$openttd" "openttd.vcproj"      "msvc2003"
 generate "$openttd" "openttd_vs80.vcproj" "msvc2005"
+generate "$openttd" "openttd_vs90.vcproj" "msvc2005"
 generate "$lang" "langs.vcproj"           "msvc2003"
 generate "$lang" "langs_vs80.vcproj"      "msvc2005"
+generate "$lang" "langs_vs90.vcproj"      "msvc2005"
--- a/projects/langs.vcproj	Sat Oct 06 21:16:00 2007 +0000
+++ b/projects/langs.vcproj	Mon Dec 03 23:39:38 2007 +0000
@@ -39,6 +39,19 @@
 	<Files>
 
 		<File
+			RelativePath="..\src\lang\afrikaans.txt">
+			<FileConfiguration
+				Name="Debug|Win32">
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating afrikaans language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;
+"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\afrikaans.lng"/>
+			</FileConfiguration>
+		</File>
+		<File
 			RelativePath="..\src\lang\american.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
--- a/projects/langs_vs80.vcproj	Sat Oct 06 21:16:00 2007 +0000
+++ b/projects/langs_vs80.vcproj	Mon Dec 03 23:39:38 2007 +0000
@@ -47,6 +47,21 @@
 	<Files>
 
 		<File
+			RelativePath="..\src\lang\afrikaans.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating afrikaans language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\afrikaans.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
 			RelativePath="..\src\lang\american.txt"
 			>
 			<FileConfiguration
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/langs_vs90.vcproj	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,623 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="langs"
+	ProjectGUID="{0F066B23-18DF-4284-8265-F4A5E7E3B966}"
+	RootNamespace="langs"
+	Keyword="MakeFileProj"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\bin\lang"
+			IntermediateDirectory="..\objs\langs"
+			ConfigurationType="10"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Generating strings.h"
+				CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName="./langs.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+
+		<File
+			RelativePath="..\src\lang\afrikaans.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating afrikaans language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\afrikaans.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\american.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating american language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\american.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\brazilian_portuguese.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating brazilian_portuguese language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\brazilian_portuguese.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\bulgarian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating bulgarian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\bulgarian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\catalan.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating catalan language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\catalan.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\croatian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating croatian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\croatian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\czech.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating czech language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\czech.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\danish.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating danish language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\danish.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\dutch.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating dutch language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\dutch.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\english.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating english language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\english.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\esperanto.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating esperanto language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\esperanto.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\estonian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating estonian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\estonian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\finnish.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating finnish language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\finnish.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\french.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating french language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\french.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\galician.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating galician language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\galician.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\german.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating german language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\german.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\hungarian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating hungarian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\hungarian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\icelandic.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating icelandic language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\icelandic.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\italian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating italian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\italian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\japanese.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating japanese language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\japanese.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\korean.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating korean language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\korean.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\lithuanian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating lithuanian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\lithuanian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\norwegian_bokmal.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating norwegian_bokmal language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\norwegian_bokmal.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\norwegian_nynorsk.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating norwegian_nynorsk language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\norwegian_nynorsk.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\origveh.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating origveh language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\origveh.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\piglatin.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating piglatin language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\piglatin.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\polish.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating polish language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\polish.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\portuguese.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating portuguese language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\portuguese.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\romanian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating romanian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\romanian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\russian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating russian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\russian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\simplified_chinese.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating simplified_chinese language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\simplified_chinese.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\slovak.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating slovak language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\slovak.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\slovenian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating slovenian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\slovenian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\spanish.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating spanish language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\spanish.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\swedish.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating swedish language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\swedish.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\traditional_chinese.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating traditional_chinese language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\traditional_chinese.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\turkish.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating turkish language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\turkish.lng"
+				/>
+			</FileConfiguration>
+		</File>
+		<File
+			RelativePath="..\src\lang\ukrainian.txt"
+			>
+			<FileConfiguration
+				Name="Debug|Win32"
+				>
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Generating ukrainian language file"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					AdditionalDependencies=""
+					Outputs="..\bin\lang\ukrainian.lng"
+				/>
+			</FileConfiguration>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/langs_vs90.vcproj.in	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="langs"
+	ProjectGUID="{0F066B23-18DF-4284-8265-F4A5E7E3B966}"
+	RootNamespace="langs"
+	Keyword="MakeFileProj"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\bin\lang"
+			IntermediateDirectory="..\objs\langs"
+			ConfigurationType="10"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Generating strings.h"
+				CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName="./langs.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+!!FILES!!
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
--- a/projects/openttd.vcproj	Sat Oct 06 21:16:00 2007 +0000
+++ b/projects/openttd.vcproj	Mon Dec 03 23:39:38 2007 +0000
@@ -198,6 +198,12 @@
 				RelativePath=".\..\src\console_cmds.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\core\bitmath_func.cpp">
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\currency.cpp">
 			</File>
 			<File
@@ -264,9 +270,6 @@
 				RelativePath=".\..\src\md5.cpp">
 			</File>
 			<File
-				RelativePath=".\..\src\mersenne.cpp">
-			</File>
-			<File
 				RelativePath=".\..\src\minilzo.cpp">
 			</File>
 			<File
@@ -430,6 +433,15 @@
 				RelativePath=".\..\src\console.h">
 			</File>
 			<File
+				RelativePath=".\..\src\core\bitmath_func.hpp">
+			</File>
+			<File
+				RelativePath=".\..\src\core\math_func.hpp">
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.hpp">
+			</File>
+			<File
 				RelativePath=".\..\src\currency.h">
 			</File>
 			<File
@@ -697,6 +709,9 @@
 				RelativePath=".\..\src\train.h">
 			</File>
 			<File
+				RelativePath=".\..\src\transparency.h">
+			</File>
+			<File
 				RelativePath=".\..\src\transparency_gui.h">
 			</File>
 			<File
--- a/projects/openttd_vs80.vcproj	Sat Oct 06 21:16:00 2007 +0000
+++ b/projects/openttd_vs80.vcproj	Mon Dec 03 23:39:38 2007 +0000
@@ -134,6 +134,103 @@
 			/>
 		</Configuration>
 		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\Debug/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="0"
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="4"
+				CallingConvention="1"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="0"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames="LIBCMT.lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
 			Name="Release|x64"
 			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
@@ -248,103 +345,6 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
-			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
-			ConfigurationType="1"
-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-			UseOfMFC="0"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-				Description="Determining version number"
-				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="MASM AMD64"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/openttd.tlb"
-				HeaderFileName=""
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				AssemblerListingLocation="$(IntDir)/"
-				ObjectFile="$(IntDir)/"
-				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
-				WarningLevel="3"
-				WarnAsError="false"
-				SuppressStartupBanner="true"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="4"
-				CallingConvention="1"
-				CompileAs="0"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="_DEBUG"
-				Culture="1053"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
-				LinkIncremental="0"
-				SuppressStartupBanner="true"
-				IgnoreDefaultLibraryNames="LIBCMT.lib"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
 			Name="Debug|x64"
 			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
@@ -496,6 +496,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\bitmath_func.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\currency.cpp"
 				>
 			</File>
@@ -584,10 +592,6 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\mersenne.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\minilzo.cpp"
 				>
 			</File>
@@ -804,6 +808,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\bitmath_func.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\math_func.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\currency.h"
 				>
 			</File>
@@ -1160,6 +1176,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\transparency.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\transparency_gui.h"
 				>
 			</File>
@@ -2080,6 +2100,14 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
+					Name="Debug|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
 					Name="Release|x64"
 					>
 					<Tool
@@ -2089,14 +2117,6 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="Debug|Win32"
-					ExcludedFromBuild="true"
-					>
-					<Tool
-						Name="VCCustomBuildTool"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
 					Name="Debug|x64"
 					>
 					<Tool
--- a/projects/openttd_vs80.vcproj.in	Sat Oct 06 21:16:00 2007 +0000
+++ b/projects/openttd_vs80.vcproj.in	Mon Dec 03 23:39:38 2007 +0000
@@ -134,6 +134,103 @@
 			/>
 		</Configuration>
 		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\Debug/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="0"
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="4"
+				CallingConvention="1"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="0"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames="LIBCMT.lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
 			Name="Release|x64"
 			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
@@ -248,103 +345,6 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
-			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
-			ConfigurationType="1"
-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-			UseOfMFC="0"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-				Description="Determining version number"
-				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="MASM AMD64"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/openttd.tlb"
-				HeaderFileName=""
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				AssemblerListingLocation="$(IntDir)/"
-				ObjectFile="$(IntDir)/"
-				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
-				WarningLevel="3"
-				WarnAsError="false"
-				SuppressStartupBanner="true"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="4"
-				CallingConvention="1"
-				CompileAs="0"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="_DEBUG"
-				Culture="1053"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
-				LinkIncremental="0"
-				SuppressStartupBanner="true"
-				IgnoreDefaultLibraryNames="LIBCMT.lib"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
 			Name="Debug|x64"
 			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
@@ -465,6 +465,14 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
+					Name="Debug|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
 					Name="Release|x64"
 					>
 					<Tool
@@ -474,14 +482,6 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="Debug|Win32"
-					ExcludedFromBuild="true"
-					>
-					<Tool
-						Name="VCCustomBuildTool"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
 					Name="Debug|x64"
 					>
 					<Tool
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/openttd_vs90.sln	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,55 @@
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openttd", "openttd_vs90.vcproj", "{668328A0-B40E-4CDB-BD72-D0064424414A}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0F066B23-18DF-4284-8265-F4A5E7E3B966} = {0F066B23-18DF-4284-8265-F4A5E7E3B966}
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1} = {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strgen", "strgen_vs90.vcproj", "{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs90.vcproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}"
+	ProjectSection(ProjectDependencies) = postProject
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1} = {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.ActiveCfg = Debug|Win32
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.Build.0 = Debug|Win32
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.ActiveCfg = Debug|Win32
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.Build.0 = Debug|Win32
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.ActiveCfg = Debug|Win32
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.Build.0 = Debug|Win32
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.ActiveCfg = Debug|Win32
+		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.Build.0 = Debug|Win32
+		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.ActiveCfg = Debug|Win32
+		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.Build.0 = Debug|Win32
+		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.ActiveCfg = Debug|Win32
+		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.Build.0 = Debug|Win32
+		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.ActiveCfg = Debug|Win32
+		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.Build.0 = Debug|Win32
+		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.ActiveCfg = Debug|Win32
+		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.Build.0 = Debug|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(DPCodeReviewSolutionGUID) = preSolution
+		DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
+	EndGlobalSection
+EndGlobal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/openttd_vs90.vcproj	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,2122 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="openttd"
+	ProjectGUID="{668328A0-B40E-4CDB-BD72-D0064424414A}"
+	RootNamespace="openttd"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+		<Platform
+			Name="x64"
+		/>
+	</Platforms>
+	<ToolFiles>
+		<ToolFile
+			RelativePath="..\src\masm64.rules"
+		/>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\Release/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="true"
+				FavorSizeOrSpeed="2"
+				OmitFramePointers="true"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				StringPooling="true"
+				ExceptionHandling="1"
+				RuntimeLibrary="0"
+				StructMemberAlignment="3"
+				BufferSecurityCheck="false"
+				EnableFunctionLevelLinking="true"
+				DefaultCharIsUnsigned="true"
+				UsePrecompiledHeader="0"
+				PrecompiledHeaderThrough=""
+				PrecompiledHeaderFile=""
+				AssemblerOutput="2"
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				BrowseInformation="1"
+				BrowseInformationFile="$(IntDir)/"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CallingConvention="1"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames=""
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				OptimizeReferences="2"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\Debug/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="0"
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="4"
+				CallingConvention="1"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="0"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames="LIBCMT.lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\Release/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="true"
+				FavorSizeOrSpeed="2"
+				OmitFramePointers="true"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				StringPooling="true"
+				ExceptionHandling="1"
+				RuntimeLibrary="0"
+				StructMemberAlignment="0"
+				BufferSecurityCheck="false"
+				EnableFunctionLevelLinking="true"
+				DefaultCharIsUnsigned="true"
+				UsePrecompiledHeader="0"
+				PrecompiledHeaderThrough=""
+				PrecompiledHeaderFile=""
+				AssemblerOutput="2"
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				BrowseInformation="1"
+				BrowseInformationFile="$(IntDir)/"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CallingConvention="1"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames=""
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				OptimizeReferences="2"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|x64"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\Debug/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="0"
+				PrecompiledHeaderThrough=""
+				PrecompiledHeaderFile=""
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="3"
+				CallingConvention="0"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="0"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames="LIBCMT.lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			>
+			<File
+				RelativePath=".\..\src\airport.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\articulated_vehicles.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\aystar.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\bmp.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\callback_table.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\cargopacket.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\cargotype.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\command.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\console.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\console_cmds.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\bitmath_func.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\currency.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\date.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\debug.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\dedicated.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\depot.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\driver.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\economy.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\elrail.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\engine.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\fileio.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\fios.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\fontcache.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\genworld.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfx.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfxinit.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\heightmap.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\helpers.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\landscape.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\map.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\md5.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\minilzo.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\mixer.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\music.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\namegen.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_client.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_data.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_gamelist.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_server.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_udp.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\npf.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\oldloader.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\oldpool.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\openttd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\os_timer.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ottdres.rc"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\pathfind.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\players.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\queue.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\rev.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\saveload.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\screenshot.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sdl.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\spritecache.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\station.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\string.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\strings.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\texteff.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tgp.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\thread.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tile.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\viewport.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\waypoint.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\win32.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\window.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			>
+			<File
+				RelativePath=".\..\src\aircraft.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\airport.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\airport_movement.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\articulated_vehicles.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoslope.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\aystar.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\bmp.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\cargopacket.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\cargotype.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\command.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\console.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\bitmath_func.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\math_func.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\currency.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\date.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\debug.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\dedicated_v.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\depot.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\direction.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\music\dmusic.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\driver.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\economy.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\engine.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\fileio.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\fios.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\fontcache.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\functions.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\genworld.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfx.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfxinit.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\group.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\heightmap.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\helpers.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\industry.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\landscape.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\livery.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\macros.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\md5.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\mixer.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\music.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_client.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_data.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_gamelist.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_server.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_udp.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_callbacks.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_canal.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_cargo.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_commons.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_config.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_engine.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_house.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_industries.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_industrytiles.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_sound.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_spritegroup.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_station.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_storage.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_text.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_town.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_townname.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\news.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\npf.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\music\null_m.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound\null_s.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\null_v.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\oldpool.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\openttd.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\pathfind.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\player.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\player_face.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\queue.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_cmd.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\saveload.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\screenshot.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound\sdl_s.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\sdl_v.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\slope.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sprite.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\spritecache.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\station.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\stdafx.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\string.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\texteff.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tgp.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\thread.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tile.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\timetable.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\town.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\train.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\transparency.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\transparency_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\variables.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\viewport.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\waypoint.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\music\win32_m.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound\win32_s.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\win32_v.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\window.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\zoom.hpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="GUI Source Code"
+			>
+			<File
+				RelativePath=".\..\src\aircraft_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\airport_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\bridge_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\build_vehicle_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\depot_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\dock_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\engine_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\genworld_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\graph_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\group_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\industry_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\intro_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\main_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\music_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\news_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\order_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\player_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\roadveh_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ship_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\smallmap_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\station_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\subsidy_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\terraform_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\timetable_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\town_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\train_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\transparency_gui.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle_gui.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Landscape"
+			>
+			<File
+				RelativePath=".\..\src\aircraft_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\clear_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\disaster_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\dummy_land.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\group_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\industry_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\order_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\roadveh_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ship_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\station_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\timetable_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\town_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\train_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tree_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tunnelbridge_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\unmovable_cmd.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\water_cmd.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Tables"
+			>
+			<File
+				RelativePath=".\..\src\table\ai_rail.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\animcursors.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\autorail.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\build_industry.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\cargo_const.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\clear_land.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\elrail_data.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\engines.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\genland.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\industry_land.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\landscape_sprite.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\namegen.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\palettes.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\road_land.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\roadveh.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\sprites.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\station_land.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\..\objs\langs\table\strings.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\town_land.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\track_land.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\train_cmd.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\tree_land.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\unmovable_land.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\water_land.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="AI Files"
+			>
+			<File
+				RelativePath=".\..\src\ai\ai.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ai\trolly\build.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ai\default\default.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ai\trolly\pathfinder.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ai\trolly\shared.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ai\trolly\trolly.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Blitters"
+			>
+			<File
+				RelativePath=".\..\src\blitter\32bpp_anim.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\32bpp_anim.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\32bpp_base.cpp"
+				>
+			</File>
+			<File
+				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
+				RelativePath=".\..\src\blitter\32bpp_simple.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\8bpp_base.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\8bpp_base.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\8bpp_debug.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\8bpp_debug.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\8bpp_optimized.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\8bpp_optimized.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\8bpp_simple.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\8bpp_simple.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\base.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\factory.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\null.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\blitter\null.hpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Drivers"
+			>
+			<File
+				RelativePath=".\..\src\music\music_driver.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound\sound_driver.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\video_driver.hpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Sprite loaders"
+			>
+			<File
+				RelativePath=".\..\src\spriteloader\grf.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\spriteloader\grf.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\spriteloader\png.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\spriteloader\png.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\spriteloader\spriteloader.hpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="NewGRF"
+			>
+			<File
+				RelativePath=".\..\src\newgrf.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_canal.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_cargo.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_commons.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_config.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_engine.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_house.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_industries.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_industrytiles.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_sound.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_spritegroup.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_station.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_storage.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_text.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_town.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_townname.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Map Accessors"
+			>
+			<File
+				RelativePath=".\..\src\bridge_map.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\bridge_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\clear_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\industry_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_map.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\station_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\town_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tree_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tunnel_map.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tunnel_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\unmovable_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\void_map.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\water_map.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Misc"
+			>
+			<File
+				RelativePath=".\..\src\misc\array.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\autocopyptr.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\autoptr.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\binaryheap.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\blob.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\countedptr.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\crc32.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\dbg_helpers.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\dbg_helpers.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\fixedsizearray.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\hashtable.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\str.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\strapi.hpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Network Core"
+			>
+			<File
+				RelativePath=".\..\src\network\core\config.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\core.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\core.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\game.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\os_abstraction.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\packet.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\packet.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\tcp.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\tcp.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\udp.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\udp.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="YAPF"
+			>
+			<File
+				RelativePath=".\..\src\yapf\follow_track.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\follow_track.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\nodelist.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\track_dir.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_base.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_common.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_common.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_costbase.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_costcache.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_costrail.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_destrail.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_node.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_node_rail.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_node_road.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_rail.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_road.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_settings.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_ship.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Video"
+			>
+			<File
+				RelativePath=".\..\src\video\dedicated_v.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\null_v.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\sdl_v.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\win32_v.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Music"
+			>
+			<File
+				RelativePath=".\..\src\music\dmusic.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\music\null_m.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\music\win32_m.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Sound"
+			>
+			<File
+				RelativePath=".\..\src\sound\null_s.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound\sdl_s.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound\win32_s.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="64-bit Specific Files"
+			Filter="asm"
+			>
+			<File
+				RelativePath=".\..\src\win64.asm"
+				>
+				<FileConfiguration
+					Name="Release|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|x64"
+					>
+					<Tool
+						Name="MASM AMD64"
+						PreserveIdentifierCase="true"
+						PreservePublicAndExternSymbolCase="true"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|x64"
+					>
+					<Tool
+						Name="MASM AMD64"
+						PreserveIdentifierCase="true"
+						PreservePublicAndExternSymbolCase="true"
+					/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<File
+			RelativePath=".\..\media\mainicon.ico"
+			>
+		</File>
+		<File
+			RelativePath=".\..\media\openttd.ico"
+			>
+		</File>
+		<File
+			RelativePath=".\..\readme.txt"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/openttd_vs90.vcproj.in	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,507 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="openttd"
+	ProjectGUID="{668328A0-B40E-4CDB-BD72-D0064424414A}"
+	RootNamespace="openttd"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+		<Platform
+			Name="x64"
+		/>
+	</Platforms>
+	<ToolFiles>
+		<ToolFile
+			RelativePath="..\src\masm64.rules"
+		/>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\Release/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="true"
+				FavorSizeOrSpeed="2"
+				OmitFramePointers="true"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				StringPooling="true"
+				ExceptionHandling="1"
+				RuntimeLibrary="0"
+				StructMemberAlignment="3"
+				BufferSecurityCheck="false"
+				EnableFunctionLevelLinking="true"
+				DefaultCharIsUnsigned="true"
+				UsePrecompiledHeader="0"
+				PrecompiledHeaderThrough=""
+				PrecompiledHeaderFile=""
+				AssemblerOutput="2"
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				BrowseInformation="1"
+				BrowseInformationFile="$(IntDir)/"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CallingConvention="1"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames=""
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				OptimizeReferences="2"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)\"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\Debug/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="0"
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="4"
+				CallingConvention="1"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="0"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames="LIBCMT.lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\Release/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="true"
+				FavorSizeOrSpeed="2"
+				OmitFramePointers="true"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				StringPooling="true"
+				ExceptionHandling="1"
+				RuntimeLibrary="0"
+				StructMemberAlignment="0"
+				BufferSecurityCheck="false"
+				EnableFunctionLevelLinking="true"
+				DefaultCharIsUnsigned="true"
+				UsePrecompiledHeader="0"
+				PrecompiledHeaderThrough=""
+				PrecompiledHeaderFile=""
+				AssemblerOutput="2"
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				BrowseInformation="1"
+				BrowseInformationFile="$(IntDir)/"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CallingConvention="1"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames=""
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				OptimizeReferences="2"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|x64"
+			OutputDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
+			IntermediateDirectory="..\objs\$(PlatformName)\$(ConfigurationName)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Determining version number"
+				CommandLine="&quot;$(InputDir)/determineversion.vbs&quot;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="MASM AMD64"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\Debug/openttd.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\objs\langs"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="0"
+				PrecompiledHeaderThrough=""
+				PrecompiledHeaderFile=""
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				WarningLevel="3"
+				WarnAsError="false"
+				SuppressStartupBanner="true"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="3"
+				CallingConvention="0"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib ws2_32.lib libpng.lib zlibstat.lib dxguid.lib libfreetype2.lib"
+				LinkIncremental="0"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames="LIBCMT.lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+!!FILES!!
+		<Filter
+			Name="64-bit Specific Files"
+			Filter="asm"
+			>
+			<File
+				RelativePath=".\..\src\win64.asm"
+				>
+				<FileConfiguration
+					Name="Release|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|x64"
+					>
+					<Tool
+						Name="MASM AMD64"
+						PreserveIdentifierCase="true"
+						PreservePublicAndExternSymbolCase="true"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|x64"
+					>
+					<Tool
+						Name="MASM AMD64"
+						PreserveIdentifierCase="true"
+						PreservePublicAndExternSymbolCase="true"
+					/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<File
+			RelativePath=".\..\media\mainicon.ico"
+			>
+		</File>
+		<File
+			RelativePath=".\..\media\openttd.ico"
+			>
+		</File>
+		<File
+			RelativePath=".\..\readme.txt"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/strgen_vs90.vcproj	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="strgen"
+	ProjectGUID="{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}"
+	RootNamespace="strgen"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\objs\strgen"
+			IntermediateDirectory="..\objs\strgen"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\Debug/strgen.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="1"
+				FavorSizeOrSpeed="2"
+				PreprocessorDefinitions="STRGEN;WIN32;_DEBUG;_CONSOLE"
+				BasicRuntimeChecks="0"
+				RuntimeLibrary="1"
+				PrecompiledHeaderFile=""
+				AssemblerOutput="2"
+				AssemblerListingLocation="$(IntDir)/"
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="$(IntDir)/$(TargetName).pdb"
+				WarningLevel="3"
+				WarnAsError="true"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1053"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(IntDir)\strgen.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(IntDir)\strgen.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+			>
+			<File
+				RelativePath="..\src\strgen\strgen.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\src\string.cpp"
+				>
+			</File>
+		</Filter>
+		<File
+			RelativePath="..\src\macros.h"
+			>
+		</File>
+		<File
+			RelativePath="..\src\stdafx.h"
+			>
+		</File>
+		<File
+			RelativePath="..\src\string.h"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
--- a/readme.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/readme.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1,6 +1,6 @@
 OpenTTD README
-Last updated:    2007-09-15
-Release version: 0.5.3
+Last updated:    2007-11-18
+Release version: 0.6.0-beta1
 ------------------------------------------------------------------------
 
 
@@ -40,7 +40,7 @@
 The OpenTTD homepage is http://www.openttd.org/.
 
 You can also find the OpenTTD forums at
-http://www.tt-forums.net/index.php?c=20
+http://forum.openttd.org/
 
 
 2.1) Reporting Bugs:
@@ -57,7 +57,7 @@
         - OpenTTD version (PLEASE test the latest SVN/nightly build)
         - Bug details, including instructions how to reproduce it
         - Platform and compiler (Win32, Linux, FreeBSD, ...)
-        - Attach a saved game or a screenshot if possible
+        - Attach a saved game *and* a screenshot if possible
         - If this bug only occurred recently please note the last
           version without the bug and the first version including
           the bug. That way we can fix it quicker by looking at the
@@ -96,9 +96,7 @@
 trgtr.grf
 
 (Alternatively you can use the TTD GRF files from the DOS version: TRG1.GRF,
-TRGC.GRF, TRGH.GRF, TRGI.GRF, TRGT.GRF. A few minor graphical glitches with
-the DOS graphics remain. E.g. the autorail button in the rail toolbar doesn't
-look as nice as with the Windows graphics.)
+TRGC.GRF, TRGH.GRF, TRGI.GRF, TRGT.GRF.
 
 If you want music you need to copy the gm/ folder from Windows TTD into your
 OpenTTD folder, not your data folder.
@@ -296,10 +294,10 @@
   Peter Nelson (peter1138)       - Spiritual descendant from newgrf gods
   Remko Bijker (Rubidium)        - THE desync hunter
   Christoph Mallon (Tron)        - Programmer, code correctness police
-  Patric Stout (TrueLight)       - Programmer, network guru, SVN-,  MS-, and website host
 
 Retired Developers:
   Dominik Scherer (dominik81)    - Lead programmer, GUI expert (0.3.0 - 0.3.6)
+  Patric Stout (TrueLight)       - Programmer, webhoster (0.3 - pre0.6)
   Ludvig Strigeus (ludde)        - OpenTTD author, main coder (0.1 - 0.3.3)
   Serge Paquet (vurlix)          - Assistant project manager, coder (0.1 - 0.3.3)
 
--- a/source.list	Sat Oct 06 21:16:00 2007 +0000
+++ b/source.list	Mon Dec 03 23:39:38 2007 +0000
@@ -10,6 +10,8 @@
 command.cpp
 console.cpp
 console_cmds.cpp
+core/bitmath_func.cpp
+core/random_func.cpp
 currency.cpp
 date.cpp
 debug.cpp
@@ -32,7 +34,6 @@
 landscape.cpp
 map.cpp
 md5.cpp
-mersenne.cpp
 minilzo.cpp
 misc.cpp
 mixer.cpp
@@ -109,6 +110,9 @@
 cargotype.h
 command.h
 console.h
+core/bitmath_func.hpp
+core/math_func.hpp
+core/random_func.hpp
 currency.h
 date.h
 debug.h
@@ -198,6 +202,7 @@
 timetable.h
 town.h
 train.h
+transparency.h
 transparency_gui.h
 variables.h
 vehicle.h
@@ -481,7 +486,11 @@
 	#end
 
 	#if COCOA
-		video/cocoa_v.mm
+		video/cocoa/cocoa_v.mm
+		video/cocoa/event.mm
+		video/cocoa/fullscreen.mm
+		video/cocoa/wnd_quartz.mm
+		video/cocoa/wnd_quickdraw.mm
 		sound/cocoa_s.cpp
 		os/macosx/splash.cpp
 	#end
--- a/src/ai/default/default.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/ai/default/default.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -146,7 +146,7 @@
 		if (!IsCompatibleRail(rvi->railtype, railtype) ||
 				rvi->railveh_type == RAILVEH_WAGON ||
 				(rvi->railveh_type == RAILVEH_MULTIHEAD && flag & 1) ||
-				!HASBIT(e->player_avail, _current_player) ||
+				!HasBit(e->player_avail, _current_player) ||
 				e->reliability < 0x8A3D) {
 			continue;
 		}
@@ -174,7 +174,7 @@
 		int32 rating;
 		CommandCost ret;
 
-		if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
+		if (!HasBit(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
 			continue;
 		}
 
@@ -209,7 +209,7 @@
 		const Engine* e = GetEngine(i);
 		CommandCost ret;
 
-		if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
+		if (!HasBit(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
 			continue;
 		}
 
@@ -643,7 +643,7 @@
 
 	if (p->ai.route_type_mask != 0 &&
 			!(p->ai.route_type_mask & bitmask) &&
-			!CHANCE16(1, 5)) {
+			!Chance16(1, 5)) {
 		return false;
 	}
 
@@ -698,11 +698,11 @@
 	for (;;) {
 		// look for one from the subsidy list
 		AiFindSubsidyIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 60, 90 + 1)) break;
+		if (IsInsideMM(fr.distance, 60, 90 + 1)) break;
 
 		// try a random one
 		AiFindRandomIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 60, 90 + 1)) break;
+		if (IsInsideMM(fr.distance, 60, 90 + 1)) break;
 
 		// only test 60 times
 		if (--i == 0) return;
@@ -801,11 +801,11 @@
 	for (;;) {
 		// look for one from the subsidy list
 		AiFindSubsidyIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 40, 60 + 1)) break;
+		if (IsInsideMM(fr.distance, 40, 60 + 1)) break;
 
 		// try a random one
 		AiFindRandomIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 40, 60 + 1)) break;
+		if (IsInsideMM(fr.distance, 40, 60 + 1)) break;
 
 		// only test 60 times
 		if (--i == 0) return;
@@ -869,11 +869,11 @@
 	for (;;) {
 		// look for one from the subsidy list
 		AiFindSubsidyIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 15, 40 + 1)) break;
+		if (IsInsideMM(fr.distance, 15, 40 + 1)) break;
 
 		// try a random one
 		AiFindRandomIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 15, 40 + 1)) break;
+		if (IsInsideMM(fr.distance, 15, 40 + 1)) break;
 
 		// only test 60 times
 		if (--i == 0) return;
@@ -937,11 +937,11 @@
 	for (;;) {
 		// look for one from the subsidy list
 		AiFindSubsidyPassengerRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 60, 110 + 1)) break;
+		if (IsInsideMM(fr.distance, 60, 110 + 1)) break;
 
 		// try a random one
 		AiFindRandomPassengerRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 60, 110 + 1)) break;
+		if (IsInsideMM(fr.distance, 60, 110 + 1)) break;
 
 		// only test 60 times
 		if (--i == 0) return;
@@ -1038,11 +1038,11 @@
 	for (;;) {
 		// look for one from the subsidy list
 		AiFindSubsidyPassengerRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 0, 55 + 1)) break;
+		if (IsInsideMM(fr.distance, 0, 55 + 1)) break;
 
 		// try a random one
 		AiFindRandomPassengerRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 0, 55 + 1)) break;
+		if (IsInsideMM(fr.distance, 0, 55 + 1)) break;
 
 		// only test 60 times
 		if (--i == 0) return;
@@ -1126,11 +1126,11 @@
 	for (;;) {
 		// look for one from the subsidy list
 		AiFindSubsidyIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 35, 55 + 1)) break;
+		if (IsInsideMM(fr.distance, 35, 55 + 1)) break;
 
 		// try a random one
 		AiFindRandomIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 35, 55 + 1)) break;
+		if (IsInsideMM(fr.distance, 35, 55 + 1)) break;
 
 		// only test 60 times
 		if (--i == 0) return;
@@ -1182,11 +1182,11 @@
 	for (;;) {
 		// look for one from the subsidy list
 		AiFindSubsidyIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 15, 40 + 1)) break;
+		if (IsInsideMM(fr.distance, 15, 40 + 1)) break;
 
 		// try a random one
 		AiFindRandomIndustryRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 15, 40 + 1)) break;
+		if (IsInsideMM(fr.distance, 15, 40 + 1)) break;
 
 		// only test 60 times
 		if (--i == 0) return;
@@ -1238,11 +1238,11 @@
 	for (;;) {
 		// look for one from the subsidy list
 		AiFindSubsidyPassengerRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 55, 180 + 1)) break;
+		if (IsInsideMM(fr.distance, 55, 180 + 1)) break;
 
 		// try a random one
 		AiFindRandomPassengerRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, 55, 180 + 1)) break;
+		if (IsInsideMM(fr.distance, 55, 180 + 1)) break;
 
 		// only test 60 times
 		if (--i == 0) return;
@@ -1407,11 +1407,11 @@
 
 		// look for one from the subsidy list
 		AiFindSubsidyPassengerRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, min_squares, max_squares + 1)) break;
+		if (IsInsideMM(fr.distance, min_squares, max_squares + 1)) break;
 
 		// try a random one
 		AiFindRandomPassengerRoute(&fr);
-		if (IS_INT_INSIDE(fr.distance, min_squares, max_squares + 1)) break;
+		if (IsInsideMM(fr.distance, min_squares, max_squares + 1)) break;
 
 		// only test 60 times
 		if (--i == 0) return;
@@ -1452,7 +1452,7 @@
 	 * Also, non-full load is more resistant against starving (by building better stations
 	 * or using exclusive rights)
 	 */
-	p->ai.num_want_fullload = CHANCE16(1, 5); // 20% chance
+	p->ai.num_want_fullload = Chance16(1, 5); // 20% chance
 //	p->ai.loco_id = INVALID_VEHICLE;
 	p->ai.order_list_blocks[0] = 0;
 	p->ai.order_list_blocks[1] = 1;
@@ -1646,13 +1646,15 @@
 				rating += _cleared_town_rating;
 			}
 		} else if (p->mode == 2) {
-			// Rail
+			/* Rail */
 			if (IsTileType(c, MP_RAILWAY)) return CMD_ERROR;
 
 			j = p->attr;
 			k = 0;
 
-			// Build the rail
+			/* Build the rail
+			 * note: FOR_EACH_SET_BIT cannot be used here
+			 */
 			for (i = 0; i != 6; i++, j >>= 1) {
 				if (j & 1) {
 					k = i;
@@ -2412,7 +2414,7 @@
 
 		if (!IsCompatibleRail(rvi->railtype, railtype) ||
 				rvi->railveh_type != RAILVEH_WAGON ||
-				!HASBIT(e->player_avail, _current_player)) {
+				!HasBit(e->player_avail, _current_player)) {
 			continue;
 		}
 
@@ -2854,7 +2856,6 @@
 	TileIndex tile;
 	DiagDirection dir = p->ai.cur_dir_a;
 	uint32 bits;
-	int i;
 
 	are.dest = p->ai.cur_tile_b;
 	tile = TILE_MASK(p->ai.cur_tile_a + TileOffsByDiagDir(dir));
@@ -2865,7 +2866,8 @@
 
 	are.best_dist = (uint)-1;
 
-	for_each_bit(i, bits) {
+	uint i;
+	FOR_EACH_SET_BIT(i, bits) {
 		FollowTrack(tile, 0x3000 | TRANSPORT_ROAD, ROADTYPES_ROAD, (DiagDirection)_dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are);
 	}
 
@@ -3823,7 +3825,7 @@
 			return;
 		}
 
-		SETBIT(p->bankrupt_asked, best_pl->index);
+		SetBit(p->bankrupt_asked, best_pl->index);
 
 		if (best_pl->index == _local_player) {
 			p->bankrupt_timeout = 4440;
--- a/src/ai/trolly/build.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/ai/trolly/build.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -185,10 +185,10 @@
 
 		// Build normal road
 		// Keep it doing till we go an other way
-		// EnsureNoVehicle makes sure we don't build on a tile where a vehicle is. This way
+		// EnsureNoVehicleOnGround makes sure we don't build on a tile where a vehicle is. This way
 		//  it will wait till the vehicle is gone..
-		if (route_extra[part-1] == 0 && route_extra[part] == 0 && (flag != DC_EXEC || EnsureNoVehicle(route[part]))) {
-			while (route_extra[part] == 0 && (flag != DC_EXEC || EnsureNoVehicle(route[part]))) {
+		if (route_extra[part-1] == 0 && route_extra[part] == 0 && (flag != DC_EXEC || EnsureNoVehicleOnGround(route[part]))) {
+			while (route_extra[part] == 0 && (flag != DC_EXEC || EnsureNoVehicleOnGround(route[part]))) {
 				// Get the current direction
 				dir = AiNew_GetRoadDirection(route[part-1], route[part], route[part+1]);
 				// Is it the same as the last one?
@@ -199,7 +199,7 @@
 					// Build the tile
 					res = AI_DoCommand(route[part], dir, 0, flag | DC_NO_WATER, CMD_BUILD_ROAD);
 					// Currently, we ignore CMD_ERRORs!
-					if (CmdFailed(res) && flag == DC_EXEC && !IsTileType(route[part], MP_ROAD) && !EnsureNoVehicle(route[part])) {
+					if (CmdFailed(res) && flag == DC_EXEC && !IsTileType(route[part], MP_ROAD) && !EnsureNoVehicleOnGround(route[part])) {
 						// Problem.. let's just abort it all!
 						DEBUG(ai, 0, "[BuidPath] route building failed at tile 0x%X, aborting", route[part]);
 						p->ainew.state = AI_STATE_NOTHING;
@@ -216,7 +216,7 @@
 			part--;
 			// We want to return the last position, so we go back one
 		}
-		if (!EnsureNoVehicle(route[part]) && flag == DC_EXEC) part--;
+		if (!EnsureNoVehicleOnGround(route[part]) && flag == DC_EXEC) part--;
 		PathFinderInfo->position = part;
 	}
 
@@ -250,7 +250,7 @@
 
 			// Is it availiable?
 			// Also, check if the reliability of the vehicle is above the AI_VEHICLE_MIN_RELIABILTY
-			if (!HASBIT(e->player_avail, _current_player) || e->reliability * 100 < AI_VEHICLE_MIN_RELIABILTY << 16) continue;
+			if (!HasBit(e->player_avail, _current_player) || e->reliability * 100 < AI_VEHICLE_MIN_RELIABILTY << 16) continue;
 
 			/* Rate and compare the engine by speed & capacity */
 			rating = rvi->max_speed * rvi->capacity;
--- a/src/ai/trolly/pathfinder.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/ai/trolly/pathfinder.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -411,7 +411,7 @@
 			if (PathFinderInfo->rail_or_road) {
 				Foundation f = GetRailFoundation(parent_tileh, (TrackBits)(1 << AiNew_GetRailDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile)));
 				// Maybe is BRIDGE_NO_FOUNDATION a bit strange here, but it contains just the right information..
-				if (IsInclinedFoundation(f) || (!IsFoundation(f) && HASBIT(BRIDGE_NO_FOUNDATION, parent_tileh))) {
+				if (IsInclinedFoundation(f) || (!IsFoundation(f) && HasBit(BRIDGE_NO_FOUNDATION, parent_tileh))) {
 					res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
 				} else {
 					res += AI_PATHFINDER_FOUNDATION_PENALTY;
@@ -419,7 +419,7 @@
 			} else {
 				if (!IsRoad(parent->path.node.tile) || !IsTileType(parent->path.node.tile, MP_TUNNELBRIDGE)) {
 					Foundation f = GetRoadFoundation(parent_tileh, (RoadBits)AiNew_GetRoadDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile));
-					if (IsInclinedFoundation(f) || (!IsFoundation(f) && HASBIT(BRIDGE_NO_FOUNDATION, parent_tileh))) {
+					if (IsInclinedFoundation(f) || (!IsFoundation(f) && HasBit(BRIDGE_NO_FOUNDATION, parent_tileh))) {
 						res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
 					} else {
 						res += AI_PATHFINDER_FOUNDATION_PENALTY;
@@ -444,13 +444,13 @@
 		res += AI_PATHFINDER_BRIDGE_PENALTY * GetBridgeLength(current->tile, parent->path.node.tile);
 		// Check if we are going up or down, first for the starting point
 		// In user_data[0] is at the 8th bit the direction
-		if (!HASBIT(BRIDGE_NO_FOUNDATION, parent_tileh)) {
+		if (!HasBit(BRIDGE_NO_FOUNDATION, parent_tileh)) {
 			if (IsLeveledFoundation(GetBridgeFoundation(parent_tileh, (Axis)((current->user_data[0] >> 8) & 1)))) {
 				res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
 			}
 		}
 		// Second for the end point
-		if (!HASBIT(BRIDGE_NO_FOUNDATION, tileh)) {
+		if (!HasBit(BRIDGE_NO_FOUNDATION, tileh)) {
 			if (IsLeveledFoundation(GetBridgeFoundation(tileh, (Axis)((current->user_data[0] >> 8) & 1)))) {
 				res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
 			}
--- a/src/ai/trolly/trolly.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/ai/trolly/trolly.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -954,7 +954,7 @@
 	//  Check if we have enough money for it!
 	if (p->ainew.new_cost > p->player_money - AI_MINIMUM_MONEY) {
 		// Too bad..
-		DEBUG(ai, 1, "Insufficient funds to build route (%d)", p->ainew.new_cost);
+		DEBUG(ai, 1, "Insufficient funds to build route (%" OTTD_PRINTF64 "d)", (int64)p->ainew.new_cost);
 		p->ainew.state = AI_STATE_NOTHING;
 		return;
 	}
@@ -1086,7 +1086,7 @@
 			}
 		}
 
-		DEBUG(ai, 1, "Finished building path, cost: %d", p->ainew.new_cost);
+		DEBUG(ai, 1, "Finished building path, cost: %" OTTD_PRINTF64 "d", (int64)p->ainew.new_cost);
 		p->ainew.state = AI_STATE_BUILD_DEPOT;
 	}
 }
@@ -1111,7 +1111,7 @@
 	}
 
 	// There is a bus on the tile we want to build road on... idle till he is gone! (BAD PERSON! :p)
-	if (!EnsureNoVehicle(p->ainew.depot_tile + TileOffsByDiagDir(p->ainew.depot_direction)))
+	if (!EnsureNoVehicleOnGround(p->ainew.depot_tile + TileOffsByDiagDir(p->ainew.depot_direction)))
 		return;
 
 	res = AiNew_Build_Depot(p, p->ainew.depot_tile, p->ainew.depot_direction, DC_EXEC);
--- a/src/aircraft_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/aircraft_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -321,7 +321,7 @@
 		return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 	}
 
-	UnitID unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_AIRCRAFT);
+	UnitID unit_num = HasBit(p2, 0) ? 0 : GetFreeUnitNumber(VEH_AIRCRAFT);
 	if (unit_num > _patches.max_aircraft)
 		return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 
@@ -329,9 +329,9 @@
 		Vehicle *v = vl[0]; // aircraft
 		Vehicle *u = vl[1]; // shadow
 
-		v->unitnumber = unit_num;
 		v = new (v) Aircraft();
 		u = new (u) Aircraft();
+		v->unitnumber = unit_num;
 		v->direction = DIR_SE;
 
 		v->owner = u->owner = _current_player;
@@ -385,7 +385,7 @@
 
 			v->cargo_type = cargo;
 
-			if (HASBIT(EngInfo(p1)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
+			if (HasBit(EngInfo(p1)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
 				callback = GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, v->engine_type, v);
 			}
 
@@ -457,7 +457,7 @@
 		u->random_bits = VehicleRandomBits();
 
 		v->vehicle_flags = 0;
-		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
+		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
 
 		UpdateAircraftCache(v);
 
@@ -526,15 +526,19 @@
 	if (v->type != VEH_AIRCRAFT || !CheckOwnership(v->owner)) return CMD_ERROR;
 	if (!v->IsStoppedInDepot()) return_cmd_error(STR_A01B_AIRCRAFT_MUST_BE_STOPPED);
 
+	if (HASBITS(v->vehstatus, VS_CRASHED)) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE);
+
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
+	CommandCost ret(-v->value);
+
 	if (flags & DC_EXEC) {
 		// Invalidate depot
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 		DoDeleteAircraft(v);
 	}
 
-	return CommandCost(-v->value);
+	return ret;
 }
 
 /** Start/Stop an aircraft.
@@ -572,6 +576,7 @@
 		}
 
 		v->vehstatus ^= VS_STOPPED;
+		v->cur_speed = 0;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 		InvalidateWindowClasses(WC_AIRCRAFT_LIST);
@@ -604,13 +609,13 @@
 	if (v->type != VEH_AIRCRAFT || !CheckOwnership(v->owner) || v->IsInDepot()) return CMD_ERROR;
 
 	if (v->current_order.type == OT_GOTO_DEPOT && !(p2 & DEPOT_LOCATE_HANGAR)) {
-		if (!!(p2 & DEPOT_SERVICE) == HASBIT(v->current_order.flags, OFB_HALT_IN_DEPOT)) {
+		if (!!(p2 & DEPOT_SERVICE) == HasBit(v->current_order.flags, OFB_HALT_IN_DEPOT)) {
 			/* We called with a different DEPOT_SERVICE setting.
 			 * 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);
+				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);
 			}
 			return CommandCost();
@@ -642,7 +647,7 @@
 
 			v->current_order.type = OT_GOTO_DEPOT;
 			v->current_order.flags = OF_NON_STOP;
-			if (!(p2 & DEPOT_SERVICE)) SETBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
+			if (!(p2 & DEPOT_SERVICE)) SetBit(v->current_order.flags, OFB_HALT_IN_DEPOT);
 			v->current_order.refit_cargo = CT_INVALID;
 			v->current_order.dest = next_airport_index;
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
@@ -686,7 +691,7 @@
 
 	/* Check the refit capacity callback */
 	uint16 callback = CALLBACK_FAILED;
-	if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_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;
@@ -869,12 +874,12 @@
 
 	Vehicle *u = v->Next();
 
-	int safe_x = clamp(x, 0, MapMaxX() * TILE_SIZE);
-	int safe_y = clamp(y - 1, 0, MapMaxY() * TILE_SIZE);
+	int safe_x = Clamp(x, 0, MapMaxX() * TILE_SIZE);
+	int safe_y = Clamp(y - 1, 0, MapMaxY() * TILE_SIZE);
 	u->x_pos = x;
 	u->y_pos = y - ((v->z_pos - GetSlopeZ(safe_x, safe_y)) >> 3);;
 
-	safe_y = clamp(u->y_pos, 0, MapMaxY() * TILE_SIZE);
+	safe_y = Clamp(u->y_pos, 0, MapMaxY() * TILE_SIZE);
 	u->z_pos = GetSlopeZ(safe_x, safe_y);
 	u->cur_image = v->cur_image;
 
@@ -1094,7 +1099,17 @@
 		tile = st->xy;
 
 		/* Jump into our "holding pattern" state machine if possible */
-	if (v->u.air.pos >= afc->num_positions) v->u.air.pos = v->u.air.previous_pos = AircraftGetEntryPoint(v, afc);
+		if (v->u.air.pos >= afc->num_positions) {
+			v->u.air.pos = v->u.air.previous_pos = AircraftGetEntryPoint(v, afc);
+		} else if (v->u.air.targetairport != v->current_order.dest) {
+			/* If not possible, just get out of here fast */
+			v->u.air.state = FLYING;
+			UpdateAircraftCache(v);
+			AircraftNextAirportPos_and_Order(v);
+			/* get aircraft back on running altitude */
+			SetAircraftPosition(v, v->x_pos, v->y_pos, GetAircraftFlyingAltitude(v));
+			return false;
+		}
 	}
 
 	/* get airport moving data */
@@ -1164,7 +1179,7 @@
 	}
 
 	/* Get distance from destination pos to current pos. */
-	uint dist = myabs(x + amd.x - v->x_pos) +  myabs(y + amd.y - v->y_pos);
+	uint dist = abs(x + amd.x - v->x_pos) +  abs(y + amd.y - v->y_pos);
 
 	/* Need exact position? */
 	if (!(amd.flag & AMED_EXACTPOS) && dist <= (amd.flag & AMED_SLOWTURN ? 8U : 4U)) return true;
@@ -1206,7 +1221,7 @@
 
 		GetNewVehiclePosResult gp;
 
-		if (dist < 4) {
+		if (dist < 4 || amd.flag & AMED_LAND) {
 			/* move vehicle one pixel towards target */
 			gp.x = (v->x_pos != (x + amd.x)) ?
 					v->x_pos + ((x + amd.x > v->x_pos) ? 1 : -1) :
@@ -1306,7 +1321,7 @@
 
 	if (v->u.air.crashed_counter < 650) {
 		uint32 r;
-		if (CHANCE16R(1,32,r)) {
+		if (Chance16R(1,32,r)) {
 			static const DirDiff delta[] = {
 				DIRDIFF_45LEFT, DIRDIFF_SAME, DIRDIFF_SAME, DIRDIFF_45RIGHT
 			};
@@ -1315,8 +1330,8 @@
 			SetAircraftPosition(v, v->x_pos, v->y_pos, v->z_pos);
 			r = Random();
 			CreateEffectVehicleRel(v,
-				GB(r, 0, 4) + 4,
-				GB(r, 4, 4) + 4,
+				GB(r, 0, 4) - 4,
+				GB(r, 4, 4) - 4,
 				GB(r, 8, 4),
 				EV_EXPLOSION_SMALL);
 		}
@@ -1813,7 +1828,7 @@
 	if (v->owner == _local_player && (
 				EngineHasReplacementForPlayer(p, v->engine_type, v->group_id) ||
 				((p->engine_renew && v->age - v->max_age > p->engine_renew_months * 30) &&
-				HASBIT(GetEngine(v->engine_type)->player_avail, _local_player))
+				HasBit(GetEngine(v->engine_type)->player_avail, _local_player))
 			)) {
 		_current_player = _local_player;
 		DoCommandP(v->tile, v->index, DEPOT_SERVICE | DEPOT_LOCATE_HANGAR, NULL, CMD_SEND_AIRCRAFT_TO_HANGAR | CMD_SHOW_NO_ERROR);
--- a/src/aircraft_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/aircraft_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -39,13 +39,13 @@
 			SetDParam(0, u->engine_type);
 			SetDParam(1, u->build_year);
 			SetDParam(2, u->value);
-			DrawString(x, y, STR_A011_BUILT_VALUE, 0);
+			DrawString(x, y, STR_A011_BUILT_VALUE, TC_FROMSTRING);
 
 			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);
+			DrawString(x, y + 10, (u->Next()->cargo_cap != 0) ? STR_A019_CAPACITY : STR_A01A_CAPACITY, TC_FROMSTRING);
 		}
 
 		if (u->cargo_cap != 0) {
@@ -57,13 +57,13 @@
 				SetDParam(0, u->cargo_type);
 				SetDParam(1, cargo_count);
 				SetDParam(2, u->cargo.Source());
-				DrawString(x, y + 21 + y_offset, STR_8813_FROM, 0);
+				DrawString(x, y + 21 + y_offset, STR_8813_FROM, TC_FROMSTRING);
 			}
 		}
 	}
 
 	SetDParam(0, v->cargo.FeederShare());
-	DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, 0);
+	DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING);
 }
 
 
--- a/src/airport.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/airport.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -102,18 +102,6 @@
 	"DUMMY" // extra heading for 255
 };
 
-static uint AirportBlockToString(uint32 block)
-{
-	uint i = 0;
-	if (block & 0xffff0000) { block >>= 16; i += 16; }
-	if (block & 0x0000ff00) { block >>=  8; i +=  8; }
-	if (block & 0x000000f0) { block >>=  4; i +=  4; }
-	if (block & 0x0000000c) { block >>=  2; i +=  2; }
-	if (block & 0x00000002) { i += 1; }
-	return i;
-}
-
-
 static void AirportPrintOut(uint nof_elements, const AirportFTA *layout, bool full_report)
 {
 	if (!full_report) printf("(P = Current Position; NP = Next Position)\n");
@@ -124,7 +112,7 @@
 				byte heading = (current->heading == 255) ? MAX_HEADINGS + 1 : current->heading;
 				printf("\tPos:%2d NPos:%2d Heading:%15s Block:%2d\n", current->position,
 					    current->next_position, _airport_heading_strings[heading],
-							AirportBlockToString(current->block));
+							FindLastBit(current->block));
 			} else {
 				printf("P:%2d NP:%2d", current->position, current->next_position);
 			}
@@ -142,7 +130,7 @@
 		for (uint j = 0; j < GetNumCustomFSMports((FSMportsClassID)i); j++) {
 			const FSMportsSpec *spec = GetCustomFSMportsSpec((FSMportsClassID)i, j);
 
-			if (!HASBIT(spec->callbackmask, CBM_STATION_AVAIL) ||
+			if (!HasBit(spec->callbackmask, CBM_STATION_AVAIL) ||
 					GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, spec, NULL, INVALID_TILE) != 0) {
 				airports.push_back(i << 8 | j);
 			}
--- a/src/airport_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/airport_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -70,12 +70,12 @@
 
 static void BuildAirClick_Airport(Window *w)
 {
-	if (HandlePlacePushButton(w, ATW_AIRPORT, SPR_CURSOR_AIRPORT, 1, PlaceAirport)) ShowBuildAirportPicker();
+	if (HandlePlacePushButton(w, ATW_AIRPORT, SPR_CURSOR_AIRPORT, VHM_RECT, PlaceAirport)) ShowBuildAirportPicker();
 }
 
 static void BuildAirClick_Demolish(Window *w)
 {
-	HandlePlacePushButton(w, ATW_DEMOLISH, ANIMCURSOR_DEMOLISH, 1, PlaceAir_DemolishArea);
+	HandlePlacePushButton(w, ATW_DEMOLISH, ANIMCURSOR_DEMOLISH, VHM_RECT, PlaceAir_DemolishArea);
 }
 
 
@@ -164,8 +164,8 @@
 {
 	switch (e->event) {
 	case WE_CREATE:
-		SetWindowWidgetLoweredState(w, 12, !_station_show_coverage);
-		SetWindowWidgetLoweredState(w, 13, _station_show_coverage);
+		w->SetWidgetLoweredState(12, !_station_show_coverage);
+		w->SetWidgetLoweredState(13, _station_show_coverage);
 		break;
 
 	case WE_PAINT: {
@@ -173,12 +173,12 @@
 
 		FSMportsSpec *fsmportspec = GetCustomFSMportsSpec(_airport.fsmports_class, _airport.station_type);
 		/* if the port is no longer available, find one that is */
-		if ((fsmportspec == NULL) || (HASBIT(fsmportspec->callbackmask, CBM_STATION_AVAIL) && GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) == 0)) {
+		if ((fsmportspec == NULL) || (HasBit(fsmportspec->callbackmask, CBM_STATION_AVAIL) && GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) == 0)) {
 			/* port not available, find new one*/
 			_airport.station_type = 0xFF;  //set to the invalid condition to prevent any selection if nothing is available
 			for (uint i = 0; i < _airport.station_count; i++) {
 				fsmportspec = GetCustomFSMportsSpec(_airport.fsmports_class, i);
-				if (!HASBIT(fsmportspec->callbackmask, CBM_STATION_AVAIL) || GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) != 0) {
+				if (!HasBit(fsmportspec->callbackmask, CBM_STATION_AVAIL) || GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) != 0) {
 					_airport.station_type = i;
 					break;
 				}
@@ -204,16 +204,14 @@
 				/* enable the permitted orientations */
 				byte *layout_ptr = (byte*)alloca(x*y + 2);
 				memcpy(layout_ptr, fsmportspec->layouts[j], (x * y) + 2);
-				SetWindowWidgetDisabledState(w, 8 + GB((byte)*layout_ptr, 1, 2), false);
+				w->SetWidgetDisabledState(8 + GB((byte)*layout_ptr, 1, 2), false);
 				if (j == _airport.layout_set) {
 					layout_ptr++;
 					preview_sprite = *layout_ptr;
 				}
 			}
-			LowerWindowWidget(w, 8 + DirToDiagDir(_airport.direction));
+			w->LowerWidget(8 + DirToDiagDir(_airport.direction));
 			w->widget[8 + DirToDiagDir(_airport.direction)].data = SPR_IMG_ARROW_NE_YELLOW + DirToDiagDir(_airport.direction);  //show in yellow
-
-
 		}
 
 		SetDParam(0, GetFSMportsClassName(_airport.fsmports_class));
@@ -223,7 +221,7 @@
 		// 'Coverage Area'
 		if (_airport.station_type != 0xFF) {
 			/* draw the preview image if the station is available */
-			if (!HASBIT(fsmportspec->callbackmask, CBM_STATION_AVAIL) || GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) != 0) {
+			if (!HasBit(fsmportspec->callbackmask, CBM_STATION_AVAIL) || GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) != 0) {
 				DrawFSMportsTile(9, 106, preview_sprite, _airport.fsmports_class, _airport.station_type);
 			}
 			_thd.FSMportLayout = &fsmportspec->layouts[_airport.layout_set];  // irregular airport support
@@ -250,7 +248,7 @@
 			const FSMportsSpec *fsmportspec = GetCustomFSMportsSpec(_airport.fsmports_class, i);
 
 			if (fsmportspec != NULL && fsmportspec->name != 0) {
-				if (HASBIT(fsmportspec->callbackmask, CBM_STATION_AVAIL) && GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) == 0) {
+				if (HasBit(fsmportspec->callbackmask, CBM_STATION_AVAIL) && GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) == 0) {
 					GfxFillRect(8, y - 2, 127, y + 10, (1 << PALETTE_MODIFIER_GREYOUT));
 				}
 				DrawStringTruncated(9, y, fsmportspec->name, i == _airport.station_type ? 12 : 16, 118);
@@ -288,7 +286,7 @@
 			/* Check station availability callback */
 			fsmportspec = GetCustomFSMportsSpec(_airport.fsmports_class, y);
 			if (fsmportspec != NULL &&
-				HASBIT(fsmportspec->callbackmask, CBM_STATION_AVAIL) &&
+				HasBit(fsmportspec->callbackmask, CBM_STATION_AVAIL) &&
 				GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) == 0) return;
 
 			_airport.station_type = y;
@@ -400,13 +398,13 @@
 	_airport.layout_set = 0;
 	_airport.direction = DIR_NE;
 	_airport.station_count = GetNumCustomFSMports(_airport.fsmports_class);
-	//if (HASBIT(fsmportspec->callbackmask, CBM_STATION_AVAIL) && GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) == 0) {
+	//if (HasBit(fsmportspec->callbackmask, CBM_STATION_AVAIL) && GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportspec, NULL, INVALID_TILE) == 0) {
 	//	_airport.station_type = 0;
 	//}
 
 	w->vscroll.count = _airport.station_count;
 	w->vscroll.cap   = 5;
-	w->vscroll.pos   = clamp(_airport.station_type - 2, 0, w->vscroll.count - w->vscroll.cap);
+	w->vscroll.pos   = Clamp(_airport.station_type - 2, 0, w->vscroll.count - w->vscroll.cap);
 }
 
 void InitializeAirportGui()
--- a/src/articulated_vehicles.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/articulated_vehicles.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -17,7 +17,7 @@
 
 uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
 {
-	if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return 0;
+	if (!HasBit(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return 0;
 
 	Vehicle *v = NULL;;
 	if (!purchase_window) {
@@ -41,7 +41,7 @@
 	const Vehicle *v = vl[0];
 	Vehicle *u = vl[0];
 
-	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return;
+	if (!HasBit(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return;
 
 	for (uint i = 1; i < MAX_UVALUE(EngineID); i++) {
 		uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, v->engine_type, v);
@@ -56,7 +56,7 @@
 		u = u->Next();
 
 		EngineID engine_type = GetFirstEngineOfType(type) + GB(callback, 0, 7);
-		bool flip_image = HASBIT(callback, 7);
+		bool flip_image = HasBit(callback, 7);
 
 		/* get common values from first engine */
 		u->direction = v->direction;
--- a/src/autoreplace_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/autoreplace_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -189,9 +189,9 @@
 			}
 		}
 
-		if (new_v->type == VEH_TRAIN && HASBIT(old_v->u.rail.flags, VRF_REVERSE_DIRECTION) && !IsMultiheaded(new_v) && !(new_v->Next() != NULL && IsArticulatedPart(new_v->Next()))) {
+		if (new_v->type == VEH_TRAIN && HasBit(old_v->u.rail.flags, VRF_REVERSE_DIRECTION) && !IsMultiheaded(new_v) && !(new_v->Next() != NULL && IsArticulatedPart(new_v->Next()))) {
 			// we are autorenewing to a single engine, so we will turn it as the old one was turned as well
-			SETBIT(new_v->u.rail.flags, VRF_REVERSE_DIRECTION);
+			SetBit(new_v->u.rail.flags, VRF_REVERSE_DIRECTION);
 		}
 
 		if (old_v->type == VEH_TRAIN && !IsFrontEngine(old_v)) {
--- a/src/autoreplace_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/autoreplace_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -164,7 +164,7 @@
 			if (!EnginesGotCargoInCommon(e, WP(w, replaceveh_d).sel_engine[0])) continue; // the engines needs to be able to carry the same cargo
 
 			/* Road vehicles can't be replaced by trams and vice-versa */
-			if (type == VEH_ROAD && HASBIT(EngInfo(WP(w, replaceveh_d).sel_engine[0])->misc_flags, EF_ROAD_TRAM) != HASBIT(EngInfo(e)->misc_flags, EF_ROAD_TRAM)) continue;
+			if (type == VEH_ROAD && HasBit(EngInfo(WP(w, replaceveh_d).sel_engine[0])->misc_flags, EF_ROAD_TRAM) != HasBit(EngInfo(e)->misc_flags, EF_ROAD_TRAM)) continue;
 			if (e == WP(w, replaceveh_d).sel_engine[0]) continue; // we can't replace an engine into itself (that would be autorenew)
 		}
 
@@ -249,7 +249,7 @@
 			 *    Either list is empty
 			 * or The selected replacement engine has a replacement (to prevent loops)
 			 * or The right list (new replacement) has the existing replacement vehicle selected */
-			SetWindowWidgetDisabledState(w, 4,
+			w->SetWidgetDisabledState(4,
 										 selected_id[0] == INVALID_ENGINE ||
 										 selected_id[1] == INVALID_ENGINE ||
 										 EngineReplacementForPlayer(p, selected_id[1], selected_group) != INVALID_ENGINE ||
@@ -258,7 +258,7 @@
 			/* Disable the "Stop Replacing" button if:
 			 *   The left list (existing vehicle) is empty
 			 *   or The selected vehicle has no replacement set up */
-			SetWindowWidgetDisabledState(w, 6,
+			w->SetWidgetDisabledState(6,
 										 selected_id[0] == INVALID_ENGINE ||
 										 !EngineHasReplacementForPlayer(p, selected_id[0], selected_group));
 
@@ -282,7 +282,7 @@
 			if (w->window_number == VEH_TRAIN) {
 				/* Draw the selected railtype in the pulldown menu */
 				RailType railtype = _railtype_selected_in_replace_gui;
-				DrawString(157, w->widget[14].top + 1, _rail_types_list[railtype], 0x10);
+				DrawString(157, w->widget[14].top + 1, _rail_types_list[railtype], TC_BLACK);
 			}
 
 			/* sets up the string for the vehicle that is being replaced to */
@@ -297,7 +297,7 @@
 				SetDParam(0, STR_NOT_REPLACING_VEHICLE_SELECTED);
 			}
 
-			DrawString(145, w->widget[5].top + 1, STR_02BD, 0x10);
+			DrawString(145, w->widget[5].top + 1, STR_02BD, TC_BLACK);
 
 			/* Draw the lists */
 			for(byte i = 0; i < 2; i++) {
--- a/src/bridge_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/bridge_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -21,8 +21,8 @@
 	uint count;
 	TileIndex start_tile;
 	TileIndex end_tile;
-	byte type;
-	byte indexes[MAX_BRIDGES];
+	uint8 type;
+	uint8 indexes[MAX_BRIDGES];
 	Money costs[MAX_BRIDGES];
 } _bridgedata;
 
@@ -42,23 +42,26 @@
 static void BuildBridgeWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-		case WE_PAINT:
+		case WE_PAINT: {
 			DrawWindowWidgets(w);
 
-			for (uint i = 0; i < 4 && i + w->vscroll.pos < _bridgedata.count; i++) {
+			uint y = 15;
+			for (uint i = 0; (i < w->vscroll.cap) && ((i + w->vscroll.pos) < _bridgedata.count); i++) {
 				const Bridge *b = &_bridge[_bridgedata.indexes[i + w->vscroll.pos]];
 
 				SetDParam(2, _bridgedata.costs[i + w->vscroll.pos]);
 				SetDParam(1, b->speed * 10 / 16);
 				SetDParam(0, b->material);
-				DrawSprite(b->sprite, b->pal, 3, 15 + i * 22);
 
-				DrawString(44, 15 + i * 22 , STR_500D, 0);
+				DrawSprite(b->sprite, b->pal, 3, y);
+				DrawString(44, y, STR_500D, TC_FROMSTRING);
+				y += w->resize.step_height;
 			}
 			break;
+		}
 
 		case WE_KEYPRESS: {
-			uint i = e->we.keypress.keycode - '1';
+			const uint8 i = e->we.keypress.keycode - '1';
 			if (i < 9 && i < _bridgedata.count) {
 				e->we.keypress.cont = false;
 				BuildBridge(w, i);
@@ -69,43 +72,55 @@
 
 		case WE_CLICK:
 			if (e->we.click.widget == 2) {
-				uint ind = ((int)e->we.click.pt.y - 14) / 22;
-				if (ind < 4 && (ind += w->vscroll.pos) < _bridgedata.count)
-					BuildBridge(w, ind);
+				uint ind = ((int)e->we.click.pt.y - 14) / w->resize.step_height;
+				if (ind < w->vscroll.cap) {
+					ind += w->vscroll.pos;
+					if (ind < _bridgedata.count) {
+						BuildBridge(w, ind);
+					}
+				}
 			}
 			break;
+
+		case WE_RESIZE:
+			w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
+			w->widget[2].data = (w->vscroll.cap << 8) + 1;
+			SetVScrollCount(w, _bridgedata.count);
+			break;
 	}
 }
 
 static const Widget _build_bridge_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                    STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   199,     0,    13, STR_100D_SELECT_RAIL_BRIDGE, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{     WWT_MATRIX,   RESIZE_NONE,     7,     0,   187,    14,   101, 0x401,                       STR_101F_BRIDGE_SELECTION_CLICK},
-{  WWT_SCROLLBAR,   RESIZE_NONE,     7,   188,   199,    14,   101, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{   WWT_CLOSEBOX,   RESIZE_NONE,  7,   0,  10,   0,  13, STR_00C5,                    STR_018B_CLOSE_WINDOW},
+{    WWT_CAPTION,   RESIZE_NONE,  7,  11, 199,   0,  13, STR_100D_SELECT_RAIL_BRIDGE, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{     WWT_MATRIX, RESIZE_BOTTOM,  7,   0, 187,  14, 101, 0x401,                       STR_101F_BRIDGE_SELECTION_CLICK},
+{  WWT_SCROLLBAR, RESIZE_BOTTOM,  7, 188, 199,  14,  89, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{  WWT_RESIZEBOX,     RESIZE_TB,  7, 188, 199,  90, 101, 0x0,                         STR_RESIZE_BUTTON},
 {   WIDGETS_END},
 };
 
 static const WindowDesc _build_bridge_desc = {
 	WDP_AUTO, WDP_AUTO, 200, 102, 200, 102,
 	WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
 	_build_bridge_widgets,
 	BuildBridgeWndProc
 };
 
 
 static const Widget _build_road_bridge_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                    STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   199,     0,    13, STR_1803_SELECT_ROAD_BRIDGE, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{     WWT_MATRIX,   RESIZE_NONE,     7,     0,   187,    14,   101, 0x401,                       STR_101F_BRIDGE_SELECTION_CLICK},
-{  WWT_SCROLLBAR,   RESIZE_NONE,     7,   188,   199,    14,   101, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{   WWT_CLOSEBOX,   RESIZE_NONE,  7,   0,  10,   0,  13, STR_00C5,                    STR_018B_CLOSE_WINDOW},
+{    WWT_CAPTION,   RESIZE_NONE,  7,  11, 199,   0,  13, STR_1803_SELECT_ROAD_BRIDGE, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{     WWT_MATRIX, RESIZE_BOTTOM,  7,   0, 187,  14, 101, 0x401,                       STR_101F_BRIDGE_SELECTION_CLICK},
+{  WWT_SCROLLBAR, RESIZE_BOTTOM,  7, 188, 199,  14,  89, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{  WWT_RESIZEBOX,     RESIZE_TB,  7, 188, 199,  90, 101, 0x0,                         STR_RESIZE_BUTTON},
 {   WIDGETS_END},
 };
 
 static const WindowDesc _build_road_bridge_desc = {
 	WDP_AUTO, WDP_AUTO, 200, 102, 200, 102,
 	WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
 	_build_road_bridge_widgets,
 	BuildBridgeWndProc
 };
@@ -113,52 +128,49 @@
 
 void ShowBuildBridgeWindow(TileIndex start, TileIndex end, byte bridge_type)
 {
-	uint j = 0;
-	CommandCost ret;
-	StringID errmsg;
-
 	DeleteWindowById(WC_BUILD_BRIDGE, 0);
 
 	_bridgedata.type = bridge_type;
 	_bridgedata.start_tile = start;
 	_bridgedata.end_tile = end;
 
-	errmsg = INVALID_STRING_ID;
+	/* only query bridge building possibility once, result is the same for all bridges!
+	 * returns CMD_ERROR on failure, and price on success */
+	StringID errmsg = INVALID_STRING_ID;
+	CommandCost ret = DoCommand(end, start, (bridge_type << 8), DC_AUTO | DC_QUERY_COST, CMD_BUILD_BRIDGE);
 
-	// only query bridge building possibility once, result is the same for all bridges!
-	// returns CMD_ERROR on failure, and price on success
-	ret = DoCommand(end, start, (bridge_type << 8), DC_AUTO | DC_QUERY_COST, CMD_BUILD_BRIDGE);
-
+	uint8 j = 0;
 	if (CmdFailed(ret)) {
 		errmsg = _error_message;
 	} else {
-		// check which bridges can be built
-		// get absolute bridge length
-		// length of the middle parts of the bridge
-		int bridge_len = GetBridgeLength(start, end);
-		// total length of bridge
-		int tot_bridgedata_len = bridge_len + 2;
+		/* check which bridges can be built
+		 * get absolute bridge length
+		 * length of the middle parts of the bridge */
+		const uint bridge_len = GetBridgeLength(start, end);
+		/* total length of bridge */
+		const uint tot_bridgedata_len = CalcBridgeLenCostFactor(bridge_len + 2);
 
-		tot_bridgedata_len = CalcBridgeLenCostFactor(tot_bridgedata_len);
-
-		for (bridge_type = 0; bridge_type != MAX_BRIDGES; bridge_type++) { // loop for all bridgetypes
+		/* loop for all bridgetypes */
+		for (bridge_type = 0; bridge_type != MAX_BRIDGES; bridge_type++) {
 			if (CheckBridge_Stuff(bridge_type, bridge_len)) {
+				/* bridge is accepted, add to list */
 				const Bridge *b = &_bridge[bridge_type];
-				// bridge is accepted, add to list
-				// add to terraforming & bulldozing costs the cost of the bridge itself (not computed with DC_QUERY_COST)
+				/* Add to terraforming & bulldozing costs the cost of the
+				 * bridge itself (not computed with DC_QUERY_COST) */
 				_bridgedata.costs[j] = ret.GetCost() + (((int64)tot_bridgedata_len * _price.build_bridge * b->price) >> 8);
 				_bridgedata.indexes[j] = bridge_type;
 				j++;
 			}
 		}
+
+		_bridgedata.count = j;
 	}
 
-	_bridgedata.count = j;
-
 	if (j != 0) {
 		Window *w = AllocateWindowDesc((_bridgedata.type & 0x80) ? &_build_road_bridge_desc : &_build_bridge_desc);
 		w->vscroll.cap = 4;
-		w->vscroll.count = (byte)j;
+		w->vscroll.count = j;
+		w->resize.step_height = 22;
 	} else {
 		ShowErrorMessage(errmsg, STR_5015_CAN_T_BUILD_BRIDGE_HERE, TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE);
 	}
--- a/src/bridge_map.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/bridge_map.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -7,6 +7,7 @@
 #include "bridge_map.h"
 #include "bridge.h"
 #include "variables.h"
+#include "landscape.h"
 
 
 TileIndex GetBridgeEnd(TileIndex tile, DiagDirection dir)
@@ -46,9 +47,6 @@
 	Slope tileh = GetTileSlope(t, &h);
 	Foundation f = GetBridgeFoundation(tileh, DiagDirToAxis(GetBridgeRampDirection(t)));
 
-	/* one height level extra if the ramp is on a flat foundation */
-	return
-		h + TILE_HEIGHT +
-		(IsLeveledFoundation(f) ? TILE_HEIGHT : 0) +
-		(IsSteepSlope(tileh) ? TILE_HEIGHT : 0);
+	/* one height level extra for the ramp */
+	return h + TILE_HEIGHT + ApplyFoundationToSlope(f, &tileh);
 }
--- a/src/bridge_map.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/bridge_map.h	Mon Dec 03 23:39:38 2007 +0000
@@ -22,7 +22,7 @@
 static inline bool IsBridge(TileIndex t)
 {
 	assert(IsTileType(t, MP_TUNNELBRIDGE));
-	return HASBIT(_m[t].m5, 7);
+	return HasBit(_m[t].m5, 7);
 }
 
 /**
@@ -126,7 +126,7 @@
 static inline bool HasBridgeSnowOrDesert(TileIndex t)
 {
 	assert(IsBridgeTile(t));
-	return HASBIT(_m[t].m4, 7);
+	return HasBit(_m[t].m4, 7);
 }
 
 
@@ -184,7 +184,7 @@
 static inline void ClearSingleBridgeMiddle(TileIndex t, Axis a)
 {
 	assert(MayHaveBridgeAbove(t));
-	CLRBIT(_m[t].m6, 6 + a);
+	ClrBit(_m[t].m6, 6 + a);
 }
 
 
@@ -208,7 +208,7 @@
 static inline void SetBridgeMiddle(TileIndex t, Axis a)
 {
 	assert(MayHaveBridgeAbove(t));
-	SETBIT(_m[t].m6, 6 + a);
+	SetBit(_m[t].m6, 6 + a);
 }
 
 /**
--- a/src/build_vehicle_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/build_vehicle_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -226,8 +226,8 @@
 		* Because of this, the return value have to be reversed as well and we return b - a instead of a - b.
 		* Another thing is that both power and running costs should be doubled for multiheaded engines.
 		* Since it would be multipling with 2 in both numerator and denumerator, it will even themselves out and we skip checking for multiheaded. */
-	Money va = (rvi_a->running_cost_base * _price.running_rail[rvi_a->running_cost_class]) / max((uint16)1, rvi_a->power);
-	Money vb = (rvi_b->running_cost_base * _price.running_rail[rvi_b->running_cost_class]) / max((uint16)1, rvi_b->power);
+	Money va = (rvi_a->running_cost_base * _price.running_rail[rvi_a->running_cost_class]) / max(1U, (uint)rvi_a->power);
+	Money vb = (rvi_b->running_cost_base * _price.running_rail[rvi_b->running_cost_class]) / max(1U, (uint)rvi_b->power);
 	int r = ClampToI32(vb - va);
 
 	return _internal_sort_order ? -r : r;
@@ -437,14 +437,14 @@
 {
 	/* Purchase cost */
 	SetDParam(0, (GetEngineProperty(engine_number, 0x17, rvi->base_cost) * _price.build_railwagon) >> 8);
-	DrawString(x, y, STR_PURCHASE_INFO_COST, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_COST, TC_FROMSTRING);
 	y += 10;
 
 	/* Wagon weight - (including cargo) */
 	uint weight = GetEngineProperty(engine_number, 0x16, rvi->weight);
 	SetDParam(0, weight);
 	SetDParam(1, (GetCargo(rvi->cargo_type)->weight * GetEngineProperty(engine_number, 0x14, rvi->capacity) >> 4) + weight);
-	DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, TC_FROMSTRING);
 	y += 10;
 
 	/* Wagon speed limit, displayed if above zero */
@@ -452,7 +452,7 @@
 		uint max_speed = GetEngineProperty(engine_number, 0x09, rvi->max_speed);
 		if (max_speed > 0) {
 			SetDParam(0, max_speed * 10 / 16);
-			DrawString(x, y, STR_PURCHASE_INFO_SPEED, 0);
+			DrawString(x, y, STR_PURCHASE_INFO_SPEED, TC_FROMSTRING);
 			y += 10;
 		}
 	}
@@ -468,32 +468,32 @@
 	/* Purchase Cost - Engine weight */
 	SetDParam(0, GetEngineProperty(engine_number, 0x17, rvi->base_cost) * (_price.build_railvehicle >> 3) >> 5);
 	SetDParam(1, weight << multihead);
-	DrawString(x, y, STR_PURCHASE_INFO_COST_WEIGHT, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_COST_WEIGHT, TC_FROMSTRING);
 	y += 10;
 
 	/* Max speed - Engine power */
 	SetDParam(0, GetEngineProperty(engine_number, 0x09, rvi->max_speed) * 10 / 16);
 	SetDParam(1, GetEngineProperty(engine_number, 0x0B, rvi->power) << multihead);
-	DrawString(x, y, STR_PURCHASE_INFO_SPEED_POWER, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_SPEED_POWER, TC_FROMSTRING);
 	y += 10;
 
 	/* Max tractive effort - not applicable if old acceleration or maglev */
 	if (_patches.realistic_acceleration && rvi->railtype != RAILTYPE_MAGLEV) {
 		SetDParam(0, ((weight << multihead) * 10 * GetEngineProperty(engine_number, 0x1F, rvi->tractive_effort)) / 256);
-		DrawString(x, y, STR_PURCHASE_INFO_MAX_TE, 0);
+		DrawString(x, y, STR_PURCHASE_INFO_MAX_TE, TC_FROMSTRING);
 		y += 10;
 	}
 
 	/* Running cost */
 	SetDParam(0, (GetEngineProperty(engine_number, 0x0D, rvi->running_cost_base) * _price.running_rail[rvi->running_cost_class] >> 8) << multihead);
-	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, TC_FROMSTRING);
 	y += 10;
 
 	/* Powered wagons power - Powered wagons extra weight */
 	if (rvi->pow_wag_power != 0) {
 		SetDParam(0, rvi->pow_wag_power);
 		SetDParam(1, rvi->pow_wag_weight);
-		DrawString(x, y, STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT, 0);
+		DrawString(x, y, STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT, TC_FROMSTRING);
 		y += 10;
 	};
 
@@ -508,19 +508,19 @@
 	/* Purchase cost - Max speed */
 	SetDParam(0, GetEngineProperty(engine_number, 0x11, rvi->base_cost) * (_price.roadveh_base >> 3) >> 5);
 	SetDParam(1, rvi->max_speed * 10 / 32);
-	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, TC_FROMSTRING);
 	y += 10;
 
 	/* Running cost */
 	SetDParam(0, rvi->running_cost * _price.roadveh_running >> 8);
-	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, TC_FROMSTRING);
 	y += 10;
 
 	/* Cargo type + capacity */
 	SetDParam(0, rvi->cargo_type);
 	SetDParam(1, GetEngineProperty(engine_number, 0x0F, rvi->capacity));
 	SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY);
-	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
 	y += 10;
 
 	return y;
@@ -532,19 +532,19 @@
 	/* Purchase cost - Max speed */
 	SetDParam(0, GetEngineProperty(engine_number, 0x0A, svi->base_cost) * (_price.ship_base >> 3) >> 5);
 	SetDParam(1, GetEngineProperty(engine_number, 0x0B, svi->max_speed) * 10 / 32);
-	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, TC_FROMSTRING);
 	y += 10;
 
 	/* Cargo type + capacity */
 	SetDParam(0, svi->cargo_type);
 	SetDParam(1, GetEngineProperty(engine_number, 0x0D, svi->capacity));
 	SetDParam(2, svi->refittable ? STR_9842_REFITTABLE : STR_EMPTY);
-	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
 	y += 10;
 
 	/* Running cost */
 	SetDParam(0, GetEngineProperty(engine_number, 0x0F, svi->running_cost) * _price.ship_running >> 8);
-	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, TC_FROMSTRING);
 	y += 10;
 
 	return y;
@@ -558,7 +558,7 @@
 	/* Purchase cost - Max speed */
 	SetDParam(0, GetEngineProperty(engine_number, 0x0B, avi->base_cost) * (_price.aircraft_base >> 3) >> 5);
 	SetDParam(1, avi->max_speed * 10 / 16);
-	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, TC_FROMSTRING);
 	y += 10;
 
 	/* Cargo capacity */
@@ -566,20 +566,20 @@
 	if (cargo == CT_INVALID || cargo == CT_PASSENGERS) {
 		SetDParam(0, avi->passenger_capacity);
 		SetDParam(1, avi->mail_capacity);
-		DrawString(x, y, STR_PURCHASE_INFO_AIRCRAFT_CAPACITY, 0);
+		DrawString(x, y, STR_PURCHASE_INFO_AIRCRAFT_CAPACITY, TC_FROMSTRING);
 	} else {
 		/* Note, if the default capacity is selected by the refit capacity
 		* callback, then the capacity shown is likely to be incorrect. */
 		SetDParam(0, cargo);
 		SetDParam(1, AircraftDefaultCargoCapacity(cargo, avi));
 		SetDParam(2, STR_9842_REFITTABLE);
-		DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
+		DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
 	}
 	y += 10;
 
 	/* Running cost */
 	SetDParam(0, GetEngineProperty(engine_number, 0x0E, avi->running_cost) * _price.aircraft_running >> 8);
-	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, TC_FROMSTRING);
 	y += 10;
 
 	return y;
@@ -624,7 +624,7 @@
 				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);
+			DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
 			y += 10;
 		}
 			break;
@@ -648,12 +648,12 @@
 		/* Design date - Life length */
 		SetDParam(0, ymd.year);
 		SetDParam(1, e->lifelength);
-		DrawString(x, y, STR_PURCHASE_INFO_DESIGNED_LIFE, 0);
+		DrawString(x, y, STR_PURCHASE_INFO_DESIGNED_LIFE, TC_FROMSTRING);
 		y += 10;
 
 		/* Reliability */
 		SetDParam(0, e->reliability * 100 >> 16);
-		DrawString(x, y, STR_PURCHASE_INFO_RELIABILITY, 0);
+		DrawString(x, y, STR_PURCHASE_INFO_RELIABILITY, TC_FROMSTRING);
 		y += 10;
 	}
 
@@ -722,7 +722,7 @@
 
 	for (eid = ROAD_ENGINES_INDEX; eid < ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES; eid++) {
 		if (!IsEngineBuildable(eid, VEH_ROAD, _local_player)) continue;
-		if (!HASBIT(bv->filter.roadtypes, HASBIT(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD)) continue;
+		if (!HasBit(bv->filter.roadtypes, HasBit(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD)) continue;
 		EngList_Add(&bv->eng_list, eid);
 
 		if (eid == bv->sel_engine) sel_id = eid;
@@ -857,11 +857,11 @@
 		const uint num_engines = GetGroupNumEngines(_local_player, selected_group, engine);
 
 		SetDParam(0, engine);
-		DrawString(x + x_offset, y, STR_ENGINE_NAME, engine == selected_id ? 0xC : 0x10);
+		DrawString(x + x_offset, y, STR_ENGINE_NAME, engine == selected_id ? TC_WHITE : TC_BLACK);
 		DrawVehicleEngine(type, x, y + y_offset, engine, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_player));
 		if (show_count) {
 			SetDParam(0, num_engines);
-			DrawStringRightAligned(213, y + (GetVehicleListHeight(type) == 14 ? 3 : 8), STR_TINY_BLACK, 0);
+			DrawStringRightAligned(213, y + (GetVehicleListHeight(type) == 14 ? 3 : 8), STR_TINY_BLACK, TC_FROMSTRING);
 		}
 	}
 }
@@ -888,7 +888,7 @@
 	const buildvehicle_d *bv = &WP(w, buildvehicle_d);
 	uint max = min(w->vscroll.pos + w->vscroll.cap, EngList_Count(&bv->eng_list));
 
-	SetWindowWidgetDisabledState(w, BUILD_VEHICLE_WIDGET_BUILD, w->window_number <= VEH_END);
+	w->SetWidgetDisabledState(BUILD_VEHICLE_WIDGET_BUILD, w->window_number <= VEH_END);
 
 	SetVScrollCount(w, EngList_Count(&bv->eng_list));
 	SetDParam(0, bv->filter.railtype + STR_881C_NEW_RAIL_VEHICLES); // This should only affect rail vehicles
@@ -903,8 +903,8 @@
 		if (text_end > wi->bottom) ExpandPurchaseInfoWidget(w, text_end - wi->bottom);
 	}
 
-	DrawString(85, 15, _sort_listing[bv->vehicle_type][bv->sort_criteria], 0x10);
-	DoDrawString(bv->descending_sort_order ? DOWNARROW : UPARROW, 69, 15, 0x10);
+	DrawString(85, 15, _sort_listing[bv->vehicle_type][bv->sort_criteria], TC_BLACK);
+	DoDrawString(bv->descending_sort_order ? DOWNARROW : UPARROW, 69, 15, TC_BLACK);
 }
 
 static void BuildVehicleClickEvent(Window *w, WindowEvent *e)
--- a/src/cargotype.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/cargotype.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -37,7 +37,7 @@
 		if (cl < lengthof(_default_cargo)) {
 			/* Copy the indexed cargo */
 			_cargo[i] = _default_cargo[cl];
-			SETBIT(_cargo_mask, i);
+			SetBit(_cargo_mask, i);
 			continue;
 		}
 
@@ -48,7 +48,7 @@
 				_cargo[i] = _default_cargo[j];
 
 				/* Populate the available cargo mask */
-				SETBIT(_cargo_mask, i);
+				SetBit(_cargo_mask, i);
 				break;
 			}
 		}
--- a/src/clear_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/clear_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -438,20 +438,19 @@
 		MarkTileDirtyByTile(tile);
 	}
 
-	return cost.AddCost(_price.purchase_land * 10);
+	return cost.AddCost(_price.clear_roughland * 10);
 }
 
 
 static CommandCost ClearTile_Clear(TileIndex tile, byte flags)
 {
 	static const Money* clear_price_table[] = {
-		&_price.clear_1,
-		&_price.purchase_land,
-		&_price.clear_2,
-		&_price.clear_3,
-		&_price.purchase_land,
-		&_price.purchase_land,
-		&_price.clear_2, // XXX unused?
+		&_price.clear_grass,
+		&_price.clear_roughland,
+		&_price.clear_rocks,
+		&_price.clear_fields,
+		&_price.clear_roughland,
+		&_price.clear_roughland,
 	};
 	CommandCost price;
 
@@ -480,11 +479,11 @@
 	if (!CheckTileOwnership(tile) && _current_player != OWNER_WATER) return CMD_ERROR;
 
 
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 	if (flags & DC_EXEC) DoClearSquare(tile);
 
-	return CommandCost(- _price.purchase_land * 2);
+	return CommandCost(- _price.clear_roughland * 2);
 }
 
 
--- a/src/command.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/command.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -677,25 +677,13 @@
 
 CommandCost CommandCost::AddCost(Money cost)
 {
-	/* Overflow protection */
-	if (cost < 0 && (this->cost + cost) > this->cost) {
-		this->cost = INT64_MIN;
-	} else if (cost > 0 && (this->cost + cost) < this->cost) {
-		this->cost = INT64_MAX;
-	} else  {
-		this->cost += cost;
-	}
+	this->cost += cost;
 	return *this;
 }
 
 CommandCost CommandCost::MultiplyCost(int factor)
 {
-	/* Overflow protection */
-	if (factor != 0 && (INT64_MAX / myabs(factor)) < myabs(this->cost)) {
-		this->cost = (this->cost < 0 == factor < 0) ? INT64_MAX : INT64_MIN;
-	} else {
-		this->cost *= factor;
-	}
+	this->cost *= factor;
 	return *this;
 }
 
--- a/src/console.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/console.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -88,7 +88,7 @@
 			DoDrawString(_iconsole_cmdline.buf, 10 + delta, w->height - ICON_LINE_HEIGHT, _icolour_cmd);
 
 			if (_iconsole_cmdline.caret)
-				DoDrawString("_", 10 + delta + _iconsole_cmdline.caretxoffs, w->height - ICON_LINE_HEIGHT, 12);
+				DoDrawString("_", 10 + delta + _iconsole_cmdline.caretxoffs, w->height - ICON_LINE_HEIGHT, TC_WHITE);
 			break;
 		}
 		case WE_MOUSELOOP:
@@ -215,7 +215,7 @@
 	_icolour_err  =  3;
 	_icolour_warn = 13;
 	_icolour_dbg  =  5;
-	_icolour_cmd  =  2;
+	_icolour_cmd  = TC_GOLD;
 	_iconsole_historypos = ICON_HISTORY_SIZE - 1;
 	_iconsole_mode = ICONSOLE_CLOSED;
 
@@ -305,12 +305,12 @@
 			w->height = _screen.height / 3;
 			w->width = _screen.width;
 			_iconsole_mode = ICONSOLE_OPENED;
-			SETBIT(_no_scroll, SCROLL_CON); // override cursor arrows; the gamefield will not scroll
+			SetBit(_no_scroll, SCROLL_CON); // override cursor arrows; the gamefield will not scroll
 		} break;
 		case ICONSOLE_OPENED: case ICONSOLE_FULL:
 			DeleteWindowById(WC_CONSOLE, 0);
 			_iconsole_mode = ICONSOLE_CLOSED;
-			CLRBIT(_no_scroll, SCROLL_CON);
+			ClrBit(_no_scroll, SCROLL_CON);
 			break;
 	}
 
@@ -356,7 +356,7 @@
 	_iconsole_historypos = i;
 	IConsoleClearCommand();
 	/* copy history to 'command prompt / bash' */
-	assert(_iconsole_history[i] != NULL && IS_INT_INSIDE(i, 0, ICON_HISTORY_SIZE));
+	assert(_iconsole_history[i] != NULL && IsInsideMM(i, 0, ICON_HISTORY_SIZE));
 	ttd_strlcpy(_iconsole_cmdline.buf, _iconsole_history[i], _iconsole_cmdline.maxlength);
 	UpdateTextBufferSize(&_iconsole_cmdline);
 }
--- a/src/console_cmds.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/console_cmds.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -233,7 +233,7 @@
 		if (file == endptr || *endptr != '\0') i = -1;
 	}
 
-	return IS_INT_INSIDE(i, 0, _fios_num) ? &_fios_list[i] : NULL;
+	return IsInsideMM(i, 0, _fios_num) ? &_fios_list[i] : NULL;
 }
 
 
@@ -593,10 +593,8 @@
 
 DEF_CONSOLE_HOOK(ConHookValidateMaxClientsCount)
 {
-	/* XXX - hardcoded, string limiation -- TrueLight
-	 * XXX - also see network.c:NetworkStartup ~1356 */
-	if (_network_game_info.clients_max > 10) {
-		_network_game_info.clients_max = 10;
+	if (_network_game_info.clients_max > MAX_CLIENTS) {
+		_network_game_info.clients_max = MAX_CLIENTS;
 		IConsoleError("Maximum clients out of bounds, truncating to limit.");
 	}
 
@@ -1251,7 +1249,7 @@
 
 		GetString(buffer, STR_00D1_DARK_BLUE + _player_colors[p->index], lastof(buffer));
 		IConsolePrintF(8, "#:%d(%s) Company Name: '%s'  Year Founded: %d  Money: %" OTTD_PRINTF64 "d  Loan: %" OTTD_PRINTF64 "d  Value: %" OTTD_PRINTF64 "d  (T:%d, R:%d, P:%d, S:%d) %sprotected",
-			p->index + 1, buffer, npi->company_name, p->inaugurated_year, p->player_money, p->current_loan, CalculateCompanyValue(p),
+			p->index + 1, buffer, npi->company_name, p->inaugurated_year, (int64)p->player_money, (int64)p->current_loan, (int64)CalculateCompanyValue(p),
 			/* trains      */ npi->num_vehicle[0],
 			/* lorry + bus */ npi->num_vehicle[1] + npi->num_vehicle[2],
 			/* planes      */ npi->num_vehicle[3],
@@ -1328,6 +1326,8 @@
 	return true;
 }
 
+extern void HashCurrentCompanyPassword();
+
 /* Also use from within player_gui to change the password graphically */
 bool NetworkChangeCompanyPassword(byte argc, char *argv[])
 {
@@ -1348,8 +1348,11 @@
 
 	ttd_strlcpy(_network_player_info[_local_player].password, argv[0], sizeof(_network_player_info[_local_player].password));
 
-	if (!_network_server)
+	if (!_network_server) {
 		SEND_COMMAND(PACKET_CLIENT_SET_PASSWORD)(_network_player_info[_local_player].password);
+	} else {
+		HashCurrentCompanyPassword();
+	}
 
 	IConsolePrintF(_icolour_warn, "'company_pw' changed to:  %s", _network_player_info[_local_player].password);
 
@@ -1425,7 +1428,11 @@
 
 		if (GetArgumentInteger(&val, argv[2])) {
 			if (!IConsoleSetPatchSetting(argv[1], val)) {
-				IConsoleError("This command/variable is only available to a network server.");
+				if (_network_server) {
+					IConsoleError("This command/variable is not available during network games.");
+				} else {
+					IConsoleError("This command/variable is only available to a network server.");
+				}
 			}
 		}
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/bitmath_func.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,71 @@
+/* $Id$ */
+
+/** @file bitmath_func.cpp */
+
+#include "../stdafx.h"
+#include "bitmath_func.hpp"
+
+const uint8 _ffb_64[64] = {
+ 0,  0,  1,  0,  2,  0,  1,  0,
+ 3,  0,  1,  0,  2,  0,  1,  0,
+ 4,  0,  1,  0,  2,  0,  1,  0,
+ 3,  0,  1,  0,  2,  0,  1,  0,
+ 5,  0,  1,  0,  2,  0,  1,  0,
+ 3,  0,  1,  0,  2,  0,  1,  0,
+ 4,  0,  1,  0,  2,  0,  1,  0,
+ 3,  0,  1,  0,  2,  0,  1,  0,
+};
+
+/**
+ * Search the first set bit in a 32 bit variable.
+ *
+ * This algorithm is a static implementation of a log
+ * conguence search algorithm. It checks the first half
+ * if there is a bit set search there further. And this
+ * way further. If no bit is set return 0.
+ *
+ * @param x The value to search
+ * @return The position of the first bit set
+ */
+uint8 FindFirstBit(uint32 x)
+{
+	if (x == 0) return 0;
+	/* The macro FIND_FIRST_BIT is better to use when your x is
+	  not more than 128. */
+
+	uint8 pos = 0;
+
+	if ((x & 0x0000ffff) == 0) { x >>= 16; pos += 16; }
+	if ((x & 0x000000ff) == 0) { x >>= 8;  pos += 8;  }
+	if ((x & 0x0000000f) == 0) { x >>= 4;  pos += 4;  }
+	if ((x & 0x00000003) == 0) { x >>= 2;  pos += 2;  }
+	if ((x & 0x00000001) == 0) { pos += 1; }
+
+	return pos;
+}
+
+/**
+ * Search the last set bit in a 32 bit variable.
+ *
+ * This algorithm is a static implementation of a log
+ * conguence search algorithm. It checks the second half
+ * if there is a bit set search there further. And this
+ * way further. If no bit is set return 0.
+ *
+ * @param x The value to search
+ * @return The position of the last bit set
+ */
+uint8 FindLastBit(uint32 x)
+{
+	if (x == 0) return 0;
+
+	uint8 pos = 0;
+
+	if ((x & 0xffff0000) != 0) { x >>= 16; pos += 16; }
+	if ((x & 0x0000ff00) != 0) { x >>= 8;  pos += 8;  }
+	if ((x & 0x000000f0) != 0) { x >>= 4;  pos += 4;  }
+	if ((x & 0x0000000c) != 0) { x >>= 2;  pos += 2;  }
+	if ((x & 0x00000002) != 0) { pos += 1; }
+
+	return pos;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/bitmath_func.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,279 @@
+/* $Id$ */
+
+/** @file bitmath_func.hpp */
+
+#ifndef BITMATH_FUNC_HPP
+#define BITMATH_FUNC_HPP
+
+/**
+ * Fetch n bits from x, started at bit s.
+ *
+ * This function can be used to fetch n bits from the value x. The
+ * s value set the startposition to read. The startposition is
+ * count from the LSB and starts at 0. The result starts at a
+ * LSB, as this isn't just an and-bitmask but also some
+ * bit-shifting operations. GB(0xFF, 2, 1) will so
+ * return 0x01 (0000 0001) instead of
+ * 0x04 (0000 0100).
+ *
+ * @param x The value to read some bits.
+ * @param s The startposition to read some bits.
+ * @param n The number of bits to read.
+ * @return The selected bits, aligned to a LSB.
+ */
+template<typename T> static inline uint GB(const T x, const uint8 s, const uint8 n)
+{
+	return (x >> s) & ((1U << n) - 1);
+}
+
+/** Set n bits from x starting at bit s to d
+ *
+ * This function sets n bits from x which started as bit s to the value of
+ * d. The parameters x, s and n works the same as the parameters of
+ * #GB. The result is saved in x again. Unused bits in the window
+ * provided by n are set to 0 if the value of b isn't "big" enough.
+ * This is not a bug, its a feature.
+ *
+ * @note Parameter x must be a variable as the result is saved there.
+ * @note To avoid unexpecting results the value of b should not use more
+ *       space as the provided space of n bits (log2)
+ * @param x The variable to change some bits
+ * @param s The startposition for the new bits
+ * @param n The size/window for the new bits
+ * @param d The actually new bits to save in the defined position.
+ * @return The new value of x
+ */
+template<typename T, typename U> static inline T SB(T& x, const uint8 s, const uint8 n, const U d)
+{
+	x &= (T)(~(((1U << n) - 1) << s));
+	x |= (T)(d << s);
+	return x;
+}
+
+/** Add i to n bits of x starting at bit s.
+ *
+ * This add the value of i on n bits of x starting at bit s. The parameters x,
+ * s, i are similar to #GB besides x must be a variable as the result are
+ * saved there. An overflow does not affect the following bits of the given
+ * bit window and is simply ignored.
+ *
+ * @note Parameter x must be a variable as the result is saved there.
+ * @param x The variable to add some bits at some position
+ * @param s The startposition of the addition
+ * @param n The size/window for the addition
+ * @param i The value to add at the given startposition in the given window.
+ * @return The new value of x
+ */
+template<typename T, typename U> static inline T AB(T& x, const uint8 s, const uint8 n, const U i)
+{
+	const T mask = (T)(((1U << n) - 1) << s);
+	x = (T)((x & ~mask) | ((x + (i << s)) & mask));
+	return x;
+}
+
+/**
+ * Checks if a bit in a value is set.
+ *
+ * This function checks if a bit inside a value is set or not.
+ * The y value specific the position of the bit, started at the
+ * LSB and count from 0.
+ *
+ * @param x The value to check
+ * @param y The position of the bit to check, started from the LSB
+ * @return True if the bit is set, false else.
+ */
+template<typename T> static inline bool HasBit(const T x, const uint8 y)
+{
+	return (x & ((T)1U << y)) != 0;
+}
+
+/**
+ * Check several bits in a value.
+ *
+ * This macro checks if a value contains at least one bit of an other
+ * value.
+ *
+ * @param x The first value
+ * @param y The second value
+ * @return True if at least one bit is set in both values, false else.
+ */
+#define HASBITS(x, y) ((x) & (y))
+
+/**
+ * Set a bit in a variable.
+ *
+ * This function sets a bit in a variable. The variable is changed
+ * and the value is also returned. Parameter y defines the bit and
+ * starts at the LSB with 0.
+ *
+ * @param x The variable to set a bit
+ * @param y The bit position to set
+ * @return The new value of the old value with the bit set
+ */
+template<typename T> static inline T SetBit(T& x, const uint8 y)
+{
+	return x = (T)(x | (T)(1U << y));
+}
+
+/**
+ * Sets several bits in a variable.
+ *
+ * This macro sets several bits in a variable. The bits to set are provided
+ * by a value. The new value is also returned.
+ *
+ * @param x The variable to set some bits
+ * @param y The value with set bits for setting them in the variable
+ * @return The new value of x
+ */
+#define SETBITS(x, y) ((x) |= (y))
+
+/**
+ * Clears a bit in a variable.
+ *
+ * This function clears a bit in a variable. The variable is
+ * changed and the value is also returned. Parameter y defines the bit
+ * to clear and starts at the LSB with 0.
+ *
+ * @param x The variable to clear the bit
+ * @param y The bit position to clear
+ * @return The new value of the old value with the bit cleared
+ */
+template<typename T> static inline T ClrBit(T& x, const uint8 y)
+{
+	return x = (T)(x & ~((T)1U << y));
+}
+
+/**
+ * Clears several bits in a variable.
+ *
+ * This macro clears several bits in a variable. The bits to clear are
+ * provided by a value. The new value is also returned.
+ *
+ * @param x The variable to clear some bits
+ * @param y The value with set bits for clearing them in the variable
+ * @return The new value of x
+ */
+#define CLRBITS(x, y) ((x) &= ~(y))
+
+/**
+ * Toggles a bit in a variable.
+ *
+ * This function toggles a bit in a variable. The variable is
+ * changed and the value is also returned. Parameter y defines the bit
+ * to toggle and starts at the LSB with 0.
+ *
+ * @param x The varliable to toggle the bit
+ * @param y The bit position to toggle
+ * @return The new value of the old value with the bit toggled
+ */
+template<typename T> static inline T ToggleBit(T& x, const uint8 y)
+{
+	return x = (T)(x ^ (T)(1U << y));
+}
+
+
+/** Lookup table to check which bit is set in a 6 bit variable */
+extern const uint8 _ffb_64[64];
+
+/**
+ * Returns the first occure of a bit in a 6-bit value (from right).
+ *
+ * Returns the position of the first bit that is not zero, counted from the
+ * LSB. Ie, 110100 returns 2, 000001 returns 0, etc. When x == 0 returns
+ * 0.
+ *
+ * @param x The 6-bit value to check the first zero-bit
+ * @return The first position of a bit started from the LSB or 0 if x is 0.
+ */
+#define FIND_FIRST_BIT(x) _ffb_64[(x)]
+
+/**
+ * Finds the position of the first bit in an integer.
+ *
+ * This function returns the position of the first bit set in the
+ * integer. It does only check the bits of the bitmask
+ * 0x3F3F (0011111100111111) and checks only the
+ * bits of the bitmask 0x3F00 if and only if the
+ * lower part 0x00FF is 0. This results the bits at 0x00C0 must
+ * be also zero to check the bits at 0x3F00.
+ *
+ * @param value The value to check the first bits
+ * @return The position of the first bit which is set
+ * @see FIND_FIRST_BIT
+ */
+static inline uint8 FindFirstBit2x64(const int value)
+{
+	if ((value & 0xFF) == 0) {
+		return FIND_FIRST_BIT((value >> 8) & 0x3F) + 8;
+	} else {
+		return FIND_FIRST_BIT(value & 0x3F);
+	}
+}
+
+uint8 FindFirstBit(uint32 x);
+uint8 FindLastBit(uint32 x);
+
+/**
+ * Clear the first bit in an integer.
+ *
+ * This function returns a value where the first bit (from LSB)
+ * is cleared.
+ * So, 110100 returns 110000, 000001 returns 000000, etc.
+ *
+ * @param value The value to clear the first bit
+ * @return The new value with the first bit cleared
+ */
+template<typename T> static inline T KillFirstBit(T value)
+{
+	return value &= (T)(value - 1);
+}
+
+/**
+ * Counts the number of set bits in a variable.
+ *
+ * @param value the value to count the number of bits in.
+ * @return the number of bits.
+ */
+template<typename T> static inline uint CountBits(T value)
+{
+	uint num;
+
+	/* This loop is only called once for every bit set by clearing the lowest
+	 * bit in each loop. The number of bits is therefore equal to the number of
+	 * times the loop was called. It was found at the following website:
+	 * http://graphics.stanford.edu/~seander/bithacks.html */
+
+	for (num = 0; value != 0; num++) {
+		value &= (T)(value - 1);
+	}
+
+	return num;
+}
+
+/**
+ * ROtate x Left by n
+ *
+ * @note Assumes a byte has 8 bits
+ * @param x The value which we want to rotate
+ * @param n The number how many we waht to rotate
+ * @return A bit rotated number
+ */
+template<typename T> static inline T ROL(const T x, const uint8 n)
+{
+	return (T)(x << n | x >> (sizeof(x) * 8 - n));
+}
+
+/**
+ * ROtate x Right by n
+ *
+ * @note Assumes a byte has 8 bits
+ * @param x The value which we want to rotate
+ * @param n The number how many we waht to rotate
+ * @return A bit rotated number
+ */
+template<typename T> static inline T ROR(const T x, const uint8 n)
+{
+	return (T)(x >> n | x << (sizeof(x) * 8 - n));
+}
+
+#endif /* BITMATH_FUNC_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/math_func.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,214 @@
+/* $Id */
+
+/** @file math_func.hpp */
+
+#ifndef MATH_FUNC_HPP
+#define MATH_FUNC_HPP
+
+#ifdef min
+#undef min
+#endif
+
+#ifdef max
+#undef max
+#endif
+
+#ifdef abs
+#undef abs
+#endif
+
+/**
+ * Returns the maximum of two values.
+ *
+ * This function returns the greater value of two given values.
+ * If they are equal the value of a is returned.
+ *
+ * @param a The first value
+ * @param b The second value
+ * @return The greater value or a if equals
+ */
+template<typename T> static inline T max(const T a, const T b)
+{
+	return (a >= b) ? a : b;
+}
+
+/**
+ * Returns the minimum of two values.
+ *
+ * This function returns the smaller value of two given values.
+ * If they are equal the value of b is returned.
+ *
+ * @param a The first value
+ * @param b The second value
+ * @return The smaller value or b if equals
+ */
+template<typename T> static inline T min(const T a, const T b)
+{
+	return (a < b) ? a : b;
+}
+
+/**
+ * Returns the minimum of two integer.
+ *
+ * This function returns the smaller value of two given integers.
+ *
+ * @param a The first integer
+ * @param b The second integer
+ * @return The smaller value
+ */
+static inline int min(const int a, const int b)
+{
+	return (a < b) ? a : b;
+}
+
+/**
+ * Returns the minimum of two unsigned integers.
+ *
+ * This function returns the smaller value of two given unsigned integers.
+ *
+ * @param a The first unsigned integer
+ * @param b The second unsigned integer
+ * @return The smaller value
+ */
+static inline uint minu(const uint a, const uint b)
+{
+	return (a < b) ? a : b;
+}
+
+/**
+ * Returns the absolute value of (scalar) variable.
+ *
+ * @note assumes variable to be signed
+ * @param a The value we want to unsign
+ * @return The unsigned value
+ */
+template <typename T> static inline T abs(const T a)
+{
+	return (a < (T)0) ? -a : a;
+}
+
+/**
+ * Return the smallest multiple of n equal or greater than x
+ *
+ * @note n must be a power of 2
+ * @param x The min value
+ * @param n The base of the number we are searching
+ * @return The smallest multiple of n equal or greater than x
+ */
+template<typename T> static inline T Align(const T x, uint n)
+{
+	n--;
+	return (T)((x + n) & ~(n));
+}
+
+/**
+ * Clamp an integer between an interval.
+ *
+ * This function returns a value which is between the given interval of
+ * min and max. If the given value is in this interval the value itself
+ * is returned otherwise the border of the interval is returned, according
+ * which side of the interval was 'left'.
+ *
+ * @note The min value must be less or equal of max or you get some
+ *       unexpected results.
+ * @param a The value to clamp/truncate.
+ * @param min The minimum of the interval.
+ * @param max the maximum of the interval.
+ * @returns A value between min and max which is closest to a.
+ * @see ClampU(uint, uint, uint)
+ */
+static inline int Clamp(const int a, const int min, const int max)
+{
+	if (a <= min) return min;
+	if (a >= max) return max;
+	return a;
+}
+
+/**
+ * Clamp an unsigned integer between an interval.
+ *
+ * This function returns a value which is between the given interval of
+ * min and max. If the given value is in this interval the value itself
+ * is returned otherwise the border of the interval is returned, according
+ * which side of the interval was 'left'.
+ *
+ * @note The min value must be less or equal of max or you get some
+ *       unexpected results.
+ * @param a The value to clamp/truncate.
+ * @param min The minimum of the interval.
+ * @param max the maximum of the interval.
+ * @returns A value between min and max which is closest to a.
+ * @see Clamp(int, int, int)
+ */
+static inline uint ClampU(const uint a, const uint min, const uint max)
+{
+	if (a <= min) return min;
+	if (a >= max) return max;
+	return a;
+}
+
+/**
+ * Reduce a signed 64-bit int to a signed 32-bit one
+ *
+ * This function clamps a 64-bit integer to a 32-bit integer.
+ * If the 64-bit value is smaller than the smallest 32-bit integer
+ * value 0x80000000 this value is returned (the left one bit is the sign bit).
+ * If the 64-bit value is greater than the greatest 32-bit integer value 0x7FFFFFFF
+ * this value is returned. In all other cases the 64-bit value 'fits' in a
+ * 32-bits integer field and so the value is casted to int32 and returned.
+ *
+ * @param a The 64-bit value to clamps
+ * @return The 64-bit value reduced to a 32-bit value
+ * @see Clamp(int, int, int)
+ */
+static inline int32 ClampToI32(const int64 a)
+{
+	if (a <= (int32)0x80000000) return 0x80000000;
+	if (a >= (int32)0x7FFFFFFF) return 0x7FFFFFFF;
+	return (int32)a;
+}
+
+/**
+ * Returns the (absolute) difference between two (scalar) variables
+ *
+ * @param a The first scalar
+ * @param b The second scalar
+ * @return The absolute difference between the given scalars
+ */
+template <typename T> static inline T Delta(const T a, const T b) {
+	return (a < b) ? b - a : a - b;
+}
+
+/**
+ * Checks if a value is between a window started at some base point.
+ *
+ * This function checks if the value x is between the value of base
+ * and base+size. If x equals base this returns true. If x equals
+ * base+size this returns false.
+ *
+ * @param x The value to check
+ * @param base The base value of the interval
+ * @param size The size of the interval
+ * @return True if the value is in the interval, false else.
+ */
+template<typename T> static inline bool IsInsideBS(const T x, const uint base, const uint size)
+{
+	return (uint)(x - base) < size;
+}
+
+/**
+ * Checks if a value is in an interval.
+ *
+ * Returns true if a value is in the interval of [min, max).
+ *
+ * @param a The value to check
+ * @param min The minimum of the interval
+ * @param max The maximum of the interval
+ * @see IsInsideBS()
+ */
+template<typename T> static inline bool IsInsideMM(const T x, const uint min, const uint max)
+{
+	return (uint)(x - min) < (max - min);
+}
+
+#endif /* MATH_FUNC_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/random_func.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,155 @@
+/* $Id$ */
+
+/** @file random_func.cpp */
+
+#include "../stdafx.h"
+#include "../macros.h"
+#include "../variables.h"
+#include "random_func.hpp"
+
+uint32 InteractiveRandom()
+{
+	const uint32 s = _random_seeds[1][0];
+	const uint32 t = _random_seeds[1][1];
+
+	_random_seeds[1][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
+	return _random_seeds[1][1] = ROR(s, 3) - 1;
+}
+
+uint InteractiveRandomRange(uint max)
+{
+	return GB(InteractiveRandom(), 0, 16) * max >> 16;
+}
+
+#ifdef MERSENNE_TWISTER
+// Source code for Mersenne Twister.
+// A Random number generator with much higher quality random numbers.
+
+#define N              (624)                 // length of _mt_state vector
+#define M              (397)                 // a period parameter
+#define K              (0x9908B0DFU)         // a magic constant
+#define hiBit(u)       ((u) & 0x80000000U)   // mask all but highest   bit of u
+#define loBit(u)       ((u) & 0x00000001U)   // mask all but lowest    bit of u
+#define loBits(u)      ((u) & 0x7FFFFFFFU)   // mask     the highest   bit of u
+#define mixBits(u, v)  (hiBit(u)|loBits(v))  // move hi bit of u to hi bit of v
+
+static uint32 _mt_state[N+1];     // _mt_state vector + 1 extra to not violate ANSI C
+static uint32 *_mt_next;          // _mt_next random value is computed from here
+static int    _mt_left = -1;      // can *_mt_next++ this many times before reloading
+
+void SetRandomSeed(register uint32 seed)
+{
+	register uint32 *s = _mt_state;
+	_mt_left = 0;
+
+	seed |= 1U;
+	seed &= 0xFFFFFFFFU;
+
+	*s = seed;
+
+	for (register uint i = N; i != 0; i--) {
+		seed *= 69069U;
+		*s++;
+		*s = seed & 0xFFFFFFFFU;
+	}
+}
+
+static uint32 ReloadRandom()
+{
+	if (_mt_left < -1) SetRandomSeed(4357U);
+
+	_mt_left = N - 1;
+	_mt_next = _mt_state + 1;
+
+	register uint32 *p0 = _mt_state;
+	register uint32 *p2 = _mt_state + 2;
+	register uint32 *pM = _mt_state + M;
+
+	register uint32 s0 = _mt_state[0];
+	register uint32 s1 = _mt_state[1];
+
+	register uint i = 0;
+
+	for (i = (N - M + 1); i != 0; i--) {
+		s0 = s1;
+		s1 = *p2;
+		*p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
+		*p0++;
+		*p2++;
+		*pM++;
+	}
+
+	pM = _mt_state;
+
+	for (i = M; i != 0; i--) {
+		s0 = s1;
+		s1 = *p2;
+		*p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
+		*p0++;
+		*p2++;
+		*pM++;
+	}
+
+	s1 = _mt_state[0];
+	*p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
+
+	s1 ^= (s1 >> 11);
+	s1 ^= (s1 <<  7) & 0x9D2C5680U;
+	s1 ^= (s1 << 15) & 0xEFC60000U;
+	s1 ^= (s1 >> 18);
+	return s1;
+}
+
+uint32 Random()
+{
+	_mt_left--;
+	if (_mt_left < 0) return ReloadRandom();
+
+	uint32 y = *_mt_next;
+	*_mt_next++;
+
+	y ^= (y >> 11);
+	y ^= (y <<  7) & 0x9D2C5680U;
+	y ^= (y << 15) & 0xEFC60000U;
+	y ^= (y >> 18);
+	return y;
+}
+
+#else /* MERSENNE_TWISTER */
+void SetRandomSeed(uint32 seed)
+{
+	_random_seeds[0][0] = seed;
+	_random_seeds[0][1] = seed;
+	_random_seeds[1][0] = seed * 0x1234567;
+	_random_seeds[1][1] = _random_seeds[1][0];
+}
+
+#ifdef RANDOM_DEBUG
+#include "network/network_data.h"
+uint32 DoRandom(int line, const char *file)
+{
+	if (_networking && (DEREF_CLIENT(0)->status != STATUS_INACTIVE || !_network_server))
+		printf("Random [%d/%d] %s:%d\n",_frame_counter, (byte)_current_player, file, line);
+#else /* RANDOM_DEBUG */
+uint32 Random()
+{
+#endif /* RANDOM_DEBUG */
+	const uint32 s = _random_seeds[0][0];
+	const uint32 t = _random_seeds[0][1];
+
+	_random_seeds[0][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
+	return _random_seeds[0][1] = ROR(s, 3) - 1;
+}
+#endif /* MERSENNE_TWISTER */
+
+#if defined(RANDOM_DEBUG) && !defined(MERSENNE_TWISTER)
+uint DoRandomRange(uint max, int line, const char *file)
+{
+	return GB(DoRandom(line, file), 0, 16) * max >> 16;
+}
+#else /* RANDOM_DEBUG & !MERSENNE_TWISTER */
+uint RandomRange(uint max)
+{
+	return GB(Random(), 0, 16) * max >> 16;
+}
+#endif /* RANDOM_DEBUG & !MERSENNE_TWISTER */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/random_func.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,98 @@
+/* $Id$ */
+
+/** @file random_func.h */
+
+#ifndef RANDOM_FUNC_HPP
+#define RANDOM_FUNC_HPP
+
+/**************
+ * Warning: DO NOT enable this unless you understand what it does
+ *
+ * If enabled, in a network game all randoms will be dumped to the
+ *  stdout if the first client joins (or if you are a client). This
+ *  is to help finding desync problems.
+ *
+ * Warning: DO NOT enable this unless you understand what it does
+ **************/
+
+//#define RANDOM_DEBUG
+
+
+// Enable this to produce higher quality random numbers.
+// Doesn't work with network yet.
+// #define MERSENNE_TWISTER
+
+void SetRandomSeed(uint32 seed);
+#ifdef RANDOM_DEBUG
+	#define Random() DoRandom(__LINE__, __FILE__)
+	uint32 DoRandom(int line, const char *file);
+	#define RandomRange(max) DoRandomRange(max, __LINE__, __FILE__)
+	uint DoRandomRange(uint max, int line, const char *file);
+#else
+	uint32 Random();
+	uint RandomRange(uint max);
+#endif
+
+uint32 InteractiveRandom(); // Used for random sequences that are not the same on the other end of the multiplayer link
+uint InteractiveRandomRange(uint max);
+
+/**
+ * Checks if a given randomize-number is below a given probability.
+ *
+ * This function is used to check if the given probability by the fraction of (a/b)
+ * is greater than low 16 bits of the given randomize-number v.
+ *
+ * Do not use this function twice on the same random 16 bits as it will yield
+ * the same result. One can use a random number for two calls to Chance16I,
+ * where one call sends the low 16 bits and the other the high 16 bits.
+ *
+ * @param a The numerator of the fraction
+ * @param b The denominator of the fraction, must of course not be null
+ * @param r The given randomize-number
+ * @return True if v is less or equals (a/b)
+ */
+static inline bool Chance16I(const uint a, const uint b, const uint32 r)
+{
+	assert(b != 0);
+	return (uint16)r < (uint16)((a << 16) / b);
+}
+
+/**
+ * Flips a coin with a given probability.
+ *
+ * This macro can be used to get true or false randomized according to a
+ * given probability. The parameter a and b create a percent value with
+ * (a/b). The macro returns true in (a/b) percent.
+ *
+ * @see Chance16I()
+ * @param a The numerator of the fraction
+ * @param b The denominator of the fraction
+ * @return True in (a/b) percent
+ */
+static inline bool Chance16(const uint a, const uint b)
+{
+	return Chance16I(a, b, Random());
+}
+
+/**
+ * Flips a coin with a given probability and saves the randomize-number in a variable.
+ *
+ * This function uses the same parameters as Chance16. The third parameter
+ * must be a variable the randomize-number from Random() is saved in.
+ *
+ * The low 16 bits of r will already be used and can therefor not be passed to
+ * Chance16I. One can only send the high 16 bits to Chance16I.
+ *
+ * @see Chance16I()
+ * @param a The numerator of the fraction
+ * @param b The denominator of the fraction
+ * @param r The variable to save the randomize-number from Random()
+ * @return True in (a/b) percent
+ */
+static inline bool Chance16R(const uint a, const uint b, uint32 &r)
+{
+	r = Random();
+	return Chance16I(a, b, r);
+}
+
+#endif /* RANDOM_FUNC_HPP */
--- a/src/date.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/date.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -220,7 +220,11 @@
 	for (i = daytick; i < total; i += DAY_TICKS) {
 		Vehicle *v = GetVehicle(i);
 
-		if (v->IsValid()) _on_new_vehicle_day_proc[v->type](v);
+		if (v->IsValid()) {
+			/* Call the 32-day callback if needed */
+			CheckVehicle32Day(v);
+			_on_new_vehicle_day_proc[v->type](v);
+		}
 	}
 }
 
--- a/src/depot.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/depot.h	Mon Dec 03 23:39:38 2007 +0000
@@ -51,7 +51,7 @@
  */
 static inline Date GetServiceIntervalClamped(uint index)
 {
-	return (_patches.servint_ispercent) ? clamp(index, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : clamp(index, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS);
+	return (_patches.servint_ispercent) ? Clamp(index, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : Clamp(index, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS);
 }
 
 /**
--- a/src/depot_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/depot_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -175,7 +175,7 @@
 
 			/* Number of wagons relative to a standard length wagon (rounded up) */
 			SetDParam(0, (v->u.rail.cached_total_length + 7) / 8);
-			DrawStringRightAligned(w->widget[DEPOT_WIDGET_MATRIX].right - 1, y + 4, STR_TINY_BLACK, 0); // Draw the counter
+			DrawStringRightAligned(w->widget[DEPOT_WIDGET_MATRIX].right - 1, y + 4, STR_TINY_BLACK, TC_FROMSTRING); // Draw the counter
 			break;
 
 		case VEH_ROAD:     DrawRoadVehImage( v, x + 24, sprite_y, 1, WP(w, depot_d).sel); break;
@@ -200,7 +200,7 @@
 	DrawSprite((v->vehstatus & VS_STOPPED) ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, x + diff_x, y + diff_y);
 
 	SetDParam(0, v->unitnumber);
-	DrawString(x, y + 2, (uint16)(v->max_age-366) >= v->age ? STR_00E2 : STR_00E3, 0);
+	DrawString(x, y + 2, (uint16)(v->max_age-366) >= v->age ? STR_00E2 : STR_00E3, TC_FROMSTRING);
 }
 
 static void DrawDepotWindow(Window *w)
@@ -216,7 +216,7 @@
 	uint16 boxes_in_each_row = w->widget[DEPOT_WIDGET_MATRIX].data & 0xFF;
 
 	/* setup disabled buttons */
-	SetWindowWidgetsDisabledState(w, !IsTileOwner(tile, _local_player),
+	w->SetWidgetsDisabledState(!IsTileOwner(tile, _local_player),
 		DEPOT_WIDGET_STOP_ALL,
 		DEPOT_WIDGET_START_ALL,
 		DEPOT_WIDGET_SELL,
@@ -274,14 +274,14 @@
 		const Vehicle *u;
 
 		DrawTrainImage(v, x + 50, y, w->hscroll.cap - 29, 0, WP(w,depot_d).sel);
-		DrawString(x, y + 2, STR_8816, 0);
+		DrawString(x, y + 2, STR_8816, TC_FROMSTRING);
 
 		/*Draw the train counter */
 		i = 0;
 		u = v;
 		do i++; while ((u = u->Next()) != NULL); // Determine length of train
 		SetDParam(0, i);                      // Set the counter
-		DrawStringRightAligned(w->widget[DEPOT_WIDGET_MATRIX].right - 1, y + 4, STR_TINY_BLACK, 0); // Draw the counter
+		DrawStringRightAligned(w->widget[DEPOT_WIDGET_MATRIX].right - 1, y + 4, STR_TINY_BLACK, TC_FROMSTRING); // Draw the counter
 	}
 }
 
@@ -290,14 +290,14 @@
 	Vehicle *wagon;
 };
 
-enum {
-	MODE_ERROR        =  1,
-	MODE_DRAG_VEHICLE =  0,
-	MODE_SHOW_VEHICLE = -1,
-	MODE_START_STOP   = -2,
+enum DepotGUIAction {
+	MODE_ERROR,
+	MODE_DRAG_VEHICLE,
+	MODE_SHOW_VEHICLE,
+	MODE_START_STOP,
 };
 
-static int GetVehicleFromDepotWndPt(const Window *w, int x, int y, Vehicle **veh, GetDepotVehiclePtData *d)
+static DepotGUIAction GetVehicleFromDepotWndPt(const Window *w, int x, int y, Vehicle **veh, GetDepotVehiclePtData *d)
 {
 	Vehicle **vl = WP(w, depot_d).vehicle_list;
 	uint xt, row, xm = 0, ym = 0;
@@ -411,10 +411,10 @@
 {
 	GetDepotVehiclePtData gdvp;
 	Vehicle *v = NULL;
-	int mode = GetVehicleFromDepotWndPt(w, x, y, &v, &gdvp);
+	DepotGUIAction mode = GetVehicleFromDepotWndPt(w, x, y, &v, &gdvp);
 
 	/* share / copy orders */
-	if (_thd.place_mode && mode <= 0) {
+	if (_thd.place_mode != VHM_NONE && mode != MODE_ERROR) {
 		_place_clicked_vehicle = (WP(w, depot_d).type == VEH_TRAIN ? gdvp.head : v);
 		return;
 	}
@@ -436,7 +436,7 @@
 
 				WP(w, depot_d).sel = v->index;
 				SetWindowDirty(w);
-				SetObjectToPlaceWnd(image, GetVehiclePalette(v), 4, w);
+				SetObjectToPlaceWnd(image, GetVehiclePalette(v), VHM_DRAG, w);
 			}
 			}
 			break;
@@ -724,7 +724,7 @@
 		+ (type == VEH_TRAIN ? 1 : w->hscroll.cap); // number of boxes in each row. Trains always have just one
 
 
-	SetWindowWidgetsHiddenState(w, type != VEH_TRAIN,
+	w->SetWidgetsHiddenState(type != VEH_TRAIN,
 		DEPOT_WIDGET_H_SCROLL,
 		DEPOT_WIDGET_SELL_CHAIN,
 		WIDGET_LIST_END);
@@ -795,9 +795,9 @@
 
 				case DEPOT_WIDGET_CLONE: // Clone button
 					InvalidateWidget(w, DEPOT_WIDGET_CLONE);
-					ToggleWidgetLoweredState(w, DEPOT_WIDGET_CLONE);
+					w->ToggleWidgetLoweredState(DEPOT_WIDGET_CLONE);
 
-					if (IsWindowWidgetLowered(w, DEPOT_WIDGET_CLONE)) {
+					if (w->IsWidgetLowered(DEPOT_WIDGET_CLONE)) {
 						static const CursorID clone_icons[] = {
 							SPR_CURSOR_CLONE_TRAIN, SPR_CURSOR_CLONE_ROADVEH,
 							SPR_CURSOR_CLONE_SHIP, SPR_CURSOR_CLONE_AIRPLANE
@@ -855,7 +855,7 @@
 		} break;
 
 		case WE_ABORT_PLACE_OBJ: {
-			RaiseWindowWidget(w, DEPOT_WIDGET_CLONE);
+			w->RaiseWidget(DEPOT_WIDGET_CLONE);
 			InvalidateWidget(w, DEPOT_WIDGET_CLONE);
 		} break;
 
@@ -864,7 +864,7 @@
 			const Vehicle *v = _place_clicked_vehicle;
 
 			/* since OTTD checks all open depot windows, we will make sure that it triggers the one with a clicked clone button */
-			if (v != NULL && IsWindowWidgetLowered(w, DEPOT_WIDGET_CLONE)) {
+			if (v != NULL && w->IsWidgetLowered(DEPOT_WIDGET_CLONE)) {
 				_place_clicked_vehicle = NULL;
 				HandleCloneVehClick(v, w);
 			}
@@ -906,14 +906,14 @@
 				} break;
 
 				case DEPOT_WIDGET_SELL: case DEPOT_WIDGET_SELL_CHAIN:
-					if (!IsWindowWidgetDisabled(w, DEPOT_WIDGET_SELL) &&
+					if (!w->IsWidgetDisabled(DEPOT_WIDGET_SELL) &&
 						WP(w, depot_d).sel != INVALID_VEHICLE) {
 						Vehicle *v;
 						uint command;
 						int sell_cmd;
 						bool is_engine;
 
-						if (IsWindowWidgetDisabled(w, e->we.click.widget)) return;
+						if (w->IsWidgetDisabled(e->we.click.widget)) return;
 						if (WP(w, depot_d).sel == INVALID_VEHICLE) return;
 
 						HandleButtonClick(w, e->we.click.widget);
--- a/src/disaster_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/disaster_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -60,7 +60,7 @@
 
 static void DisasterClearSquare(TileIndex tile)
 {
-	if (!EnsureNoVehicle(tile)) return;
+	if (!EnsureNoVehicleOnGround(tile)) return;
 
 	switch (GetTileType(tile)) {
 		case MP_RAILWAY:
@@ -159,13 +159,13 @@
 	EndVehicleMove(v);
 
 	if ((u = v->Next()) != NULL) {
-		int safe_x = clamp(x, 0, MapMaxX() * TILE_SIZE);
-		int safe_y = clamp(y - 1, 0, MapMaxY() * TILE_SIZE);
+		int safe_x = Clamp(x, 0, MapMaxX() * TILE_SIZE);
+		int safe_y = Clamp(y - 1, 0, MapMaxY() * TILE_SIZE);
 		BeginVehicleMove(u);
 
 		u->x_pos = x;
 		u->y_pos = y - 1 - (max(z - GetSlopeZ(safe_x, safe_y), 0U) >> 3);
-		safe_y = clamp(u->y_pos, 0, MapMaxY() * TILE_SIZE);
+		safe_y = Clamp(u->y_pos, 0, MapMaxY() * TILE_SIZE);
 		u->z_pos = GetSlopeZ(safe_x, safe_y);
 		u->direction = v->direction;
 
@@ -205,7 +205,7 @@
 	v->tick_counter++;
 
 	if (v->current_order.dest < 2) {
-		if (HASBIT(v->tick_counter, 0)) return;
+		if (HasBit(v->tick_counter, 0)) return;
 
 		GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 
@@ -308,13 +308,13 @@
 	uint dist;
 	byte z;
 
-	v->u.disaster.image_override = (HASBIT(++v->tick_counter, 3)) ? SPR_UFO_SMALL_SCOUT_DARKER : SPR_UFO_SMALL_SCOUT;
+	v->u.disaster.image_override = (HasBit(++v->tick_counter, 3)) ? SPR_UFO_SMALL_SCOUT_DARKER : SPR_UFO_SMALL_SCOUT;
 
 	if (v->current_order.dest == 0) {
 		/* Fly around randomly */
 		int x = TileX(v->dest_tile) * TILE_SIZE;
 		int y = TileY(v->dest_tile) * TILE_SIZE;
-		if (delta(x, v->x_pos) + delta(y, v->y_pos) >= TILE_SIZE) {
+		if (Delta(x, v->x_pos) + Delta(y, v->y_pos) >= TILE_SIZE) {
 			v->direction = GetDirectionTowards(v, x, y);
 			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 			SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@@ -343,7 +343,7 @@
 			return;
 		}
 
-		dist = delta(v->x_pos, u->x_pos) + delta(v->y_pos, u->y_pos);
+		dist = Delta(v->x_pos, u->x_pos) + Delta(v->y_pos, u->y_pos);
 
 		if (dist < TILE_SIZE && !(u->vehstatus & VS_HIDDEN) && u->breakdown_ctr == 0) {
 			u->breakdown_ctr = 3;
@@ -403,7 +403,7 @@
 {
 	v->tick_counter++;
 	v->u.disaster.image_override =
-		(v->current_order.dest == 1 && HASBIT(v->tick_counter, 2)) ? SPR_F_15_FIRING : 0;
+		(v->current_order.dest == 1 && HasBit(v->tick_counter, 2)) ? SPR_F_15_FIRING : 0;
 
 	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 	SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@@ -476,7 +476,7 @@
 {
 	v->tick_counter++;
 	v->u.disaster.image_override =
-		(v->current_order.dest == 1 && HASBIT(v->tick_counter, 2)) ? SPR_AH_64A_FIRING : 0;
+		(v->current_order.dest == 1 && HasBit(v->tick_counter, 2)) ? SPR_AH_64A_FIRING : 0;
 
 	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 	SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@@ -542,7 +542,7 @@
 static void DisasterTick_Helicopter_Rotors(Vehicle *v)
 {
 	v->tick_counter++;
-	if (HASBIT(v->tick_counter, 0)) return;
+	if (HasBit(v->tick_counter, 0)) return;
 
 	if (++v->cur_image > SPR_ROTOR_MOVING_3) v->cur_image = SPR_ROTOR_MOVING_1;
 
@@ -570,7 +570,7 @@
 	if (v->current_order.dest == 1) {
 		int x = TileX(v->dest_tile) * TILE_SIZE + TILE_SIZE / 2;
 		int y = TileY(v->dest_tile) * TILE_SIZE + TILE_SIZE / 2;
-		if (delta(v->x_pos, x) + delta(v->y_pos, y) >= 8) {
+		if (Delta(v->x_pos, x) + Delta(v->y_pos, y) >= 8) {
 			v->direction = GetDirectionTowards(v, x, y);
 
 			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
@@ -588,7 +588,7 @@
 
 		FOR_ALL_VEHICLES(u) {
 			if (u->type == VEH_TRAIN || u->type == VEH_ROAD) {
-				if (delta(u->x_pos, v->x_pos) + delta(u->y_pos, v->y_pos) <= 12 * TILE_SIZE) {
+				if (Delta(u->x_pos, v->x_pos) + Delta(u->y_pos, v->y_pos) <= 12 * TILE_SIZE) {
 					u->breakdown_ctr = 5;
 					u->breakdown_delay = 0xF0;
 				}
@@ -620,7 +620,7 @@
 	} else if (v->current_order.dest == 0) {
 		int x = TileX(v->dest_tile) * TILE_SIZE;
 		int y = TileY(v->dest_tile) * TILE_SIZE;
-		if (delta(x, v->x_pos) + delta(y, v->y_pos) >= TILE_SIZE) {
+		if (Delta(x, v->x_pos) + Delta(y, v->y_pos) >= TILE_SIZE) {
 			v->direction = GetDirectionTowards(v, x, y);
 			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 			SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@@ -670,7 +670,7 @@
 
 	if (v->current_order.dest == 0) {
 		u = GetVehicle(v->u.disaster.big_ufo_destroyer_target);
-		if (delta(v->x_pos, u->x_pos) > TILE_SIZE) return;
+		if (Delta(v->x_pos, u->x_pos) > TILE_SIZE) return;
 		v->current_order.dest = 1;
 
 		CreateEffectVehicleRel(u, 0, 7, 8, EV_EXPLOSION_LARGE);
@@ -712,13 +712,13 @@
 		return;
 	}
 
-	if (!HASBIT(v->tick_counter, 0)) return;
+	if (!HasBit(v->tick_counter, 0)) return;
 
 	tile = v->tile + TileOffsByDiagDir(DirToDiagDir(v->direction));
 	if (IsValidTile(tile)) {
 		TrackdirBits r = (TrackdirBits)GetTileTrackStatus(tile, TRANSPORT_WATER, 0);
 
-		if (TrackdirBitsToTrackBits(r) == TRACK_BIT_ALL && !CHANCE16(1, 90)) {
+		if (TrackdirBitsToTrackBits(r) == TRACK_BIT_ALL && !Chance16(1, 90)) {
 			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 			SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 			return;
@@ -828,7 +828,7 @@
 
 	FOR_ALL_INDUSTRIES(i) {
 		if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_AIRPLANE_ATTACKS) &&
-				(found == NULL || CHANCE16(1, 2))) {
+				(found == NULL || Chance16(1, 2))) {
 			found = i;
 		}
 	}
@@ -864,7 +864,7 @@
 
 	FOR_ALL_INDUSTRIES(i) {
 		if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CHOPPER_ATTACKS) &&
-				(found == NULL || CHANCE16(1, 2))) {
+				(found == NULL || Chance16(1, 2))) {
 			found = i;
 		}
 	}
@@ -933,7 +933,7 @@
 	r = Random();
 	x = TileX(r) * TILE_SIZE + TILE_SIZE / 2;
 
-	if (HASBIT(r, 31)) {
+	if (HasBit(r, 31)) {
 		y = MapMaxX() * TILE_SIZE - TILE_SIZE / 2 - 1;
 		dir = DIR_NW;
 	} else {
@@ -958,7 +958,7 @@
 	r = Random();
 	x = TileX(r) * TILE_SIZE + TILE_SIZE / 2;
 
-	if (HASBIT(r, 31)) {
+	if (HasBit(r, 31)) {
 		y = MapMaxX() * TILE_SIZE - TILE_SIZE / 2 - 1;
 		dir = DIR_NW;
 	} else {
--- a/src/dock_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/dock_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -16,6 +16,7 @@
 #include "sound.h"
 #include "command.h"
 #include "variables.h"
+#include "water.h"
 
 static void ShowBuildDockStationPicker();
 static void ShowBuildDocksDepotPicker();
@@ -79,35 +80,35 @@
 
 static void BuildDocksClick_Canal(Window *w)
 {
-	HandlePlacePushButton(w, DTW_CANAL, SPR_CURSOR_CANAL, 1, PlaceDocks_BuildCanal);
+	HandlePlacePushButton(w, DTW_CANAL, SPR_CURSOR_CANAL, VHM_RECT, PlaceDocks_BuildCanal);
 }
 
 static void BuildDocksClick_Lock(Window *w)
 {
-	HandlePlacePushButton(w, DTW_LOCK, SPR_CURSOR_LOCK, 1, PlaceDocks_BuildLock);
+	HandlePlacePushButton(w, DTW_LOCK, SPR_CURSOR_LOCK, VHM_RECT, PlaceDocks_BuildLock);
 }
 
 static void BuildDocksClick_Demolish(Window *w)
 {
-	HandlePlacePushButton(w, DTW_DEMOLISH, ANIMCURSOR_DEMOLISH, 1, PlaceDocks_DemolishArea);
+	HandlePlacePushButton(w, DTW_DEMOLISH, ANIMCURSOR_DEMOLISH, VHM_RECT, PlaceDocks_DemolishArea);
 }
 
 static void BuildDocksClick_Depot(Window *w)
 {
 	if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
-	if (HandlePlacePushButton(w, DTW_DEPOT, SPR_CURSOR_SHIP_DEPOT, 1, PlaceDocks_Depot)) ShowBuildDocksDepotPicker();
+	if (HandlePlacePushButton(w, DTW_DEPOT, SPR_CURSOR_SHIP_DEPOT, VHM_RECT, PlaceDocks_Depot)) ShowBuildDocksDepotPicker();
 }
 
 static void BuildDocksClick_Dock(Window *w)
 {
 	if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
-	if (HandlePlacePushButton(w, DTW_STATION, SPR_CURSOR_DOCK, 3, PlaceDocks_Dock)) ShowBuildDockStationPicker();
+	if (HandlePlacePushButton(w, DTW_STATION, SPR_CURSOR_DOCK, VHM_SPECIAL, PlaceDocks_Dock)) ShowBuildDockStationPicker();
 }
 
 static void BuildDocksClick_Buoy(Window *w)
 {
 	if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
-	HandlePlacePushButton(w, DTW_BUOY, SPR_CURSOR_BOUY, 1, PlaceDocks_Buoy);
+	HandlePlacePushButton(w, DTW_BUOY, SPR_CURSOR_BOUY, VHM_RECT, PlaceDocks_Buoy);
 }
 
 
@@ -127,7 +128,7 @@
 	switch (e->event) {
 	case WE_PAINT:
 		DrawWindowWidgets(w);
-		SetWindowWidgetsDisabledState(w, !CanBuildVehicleInfrastructure(VEH_SHIP), 7, 8, 9, WIDGET_LIST_END);
+		w->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_SHIP), 7, 8, 9, WIDGET_LIST_END);
 		break;
 
 	case WE_CLICK:
@@ -236,7 +237,7 @@
 static void BuildDockStationWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: LowerWindowWidget(w, _station_show_coverage + 3); break;
+	case WE_CREATE: w->LowerWidget(_station_show_coverage + 3); break;
 
 	case WE_PAINT: {
 		int rad = (_patches.modified_catchment) ? CA_DOCK : 4;
@@ -263,9 +264,9 @@
 		switch (e->we.click.widget) {
 			case 3:
 			case 4:
-				RaiseWindowWidget(w, _station_show_coverage + 3);
+				w->RaiseWidget(_station_show_coverage + 3);
 				_station_show_coverage = (e->we.click.widget != 3);
-				LowerWindowWidget(w, _station_show_coverage + 3);
+				w->LowerWidget(_station_show_coverage + 3);
 				SndPlayFx(SND_15_BEEP);
 				SetWindowDirty(w);
 				break;
@@ -322,7 +323,7 @@
 static void BuildDocksDepotWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: LowerWindowWidget(w, _ship_depot_direction + 3); break;
+	case WE_CREATE: w->LowerWidget(_ship_depot_direction + 3); break;
 
 	case WE_PAINT:
 		DrawWindowWidgets(w);
@@ -337,9 +338,9 @@
 		switch (e->we.click.widget) {
 		case 3:
 		case 4:
-			RaiseWindowWidget(w, _ship_depot_direction + 3);
+			w->RaiseWidget(_ship_depot_direction + 3);
 			_ship_depot_direction = (e->we.click.widget == 3 ? AXIS_X : AXIS_Y);
-			LowerWindowWidget(w, _ship_depot_direction + 3);
+			w->LowerWidget(_ship_depot_direction + 3);
 			SndPlayFx(SND_15_BEEP);
 			UpdateDocksDirection();
 			SetWindowDirty(w);
--- a/src/economy.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/economy.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -43,6 +43,38 @@
 #include "player_face.h"
 #include "group.h"
 
+/**
+ * Multiply two integer values and shift the results to right.
+ *
+ * This function multiplies two integer values. The result is
+ * shifted by the amount of shift to right.
+ *
+ * @param a The first integer
+ * @param b The second integer
+ * @param shift The amount to shift the value to right.
+ * @return The shifted result
+ */
+static inline int32 BigMulS(const int32 a, const int32 b, const uint8 shift)
+{
+	return (int32)((int64)a * (int64)b >> shift);
+}
+
+/**
+ * Multiply two unsigned integers and shift the results to right.
+ *
+ * This function multiplies two unsigned integers. The result is
+ * shifted by the amount of shift to right.
+ *
+ * @param a The first unsigned integer
+ * @param b The second unsigned integer
+ * @param shift The amount to shift the value to right.
+ * @return The shifted result
+ */
+static inline uint32 BigMulSU(const uint32 a, const uint32 b, const uint8 shift)
+{
+	return (uint32)((uint64)a * (uint64)b >> shift);
+}
+
 /* Score info */
 const ScoreInfo _score_info[] = {
 	{ SCORE_VEHICLES,        120, 100 },
@@ -63,39 +95,34 @@
 {
 	PlayerID owner = p->index;
 	/* Do a little nasty by using CommandCost, so we can use the "overflow" protection of CommandCost */
-	CommandCost value;
+	Money value = 0;
 
-	{
-		Station *st;
-		uint num = 0;
+	Station *st;
+	uint num = 0;
 
-		FOR_ALL_STATIONS(st) {
-			if (st->owner == owner) num += COUNTBITS(st->facilities);
-		}
-
-		value.AddCost(num * _price.station_value * 25);
+	FOR_ALL_STATIONS(st) {
+		if (st->owner == owner) num += CountBits(st->facilities);
 	}
 
-	{
-		Vehicle *v;
-
-		FOR_ALL_VEHICLES(v) {
-			if (v->owner != owner) continue;
+	value += num * _price.station_value * 25;
 
-			if (v->type == VEH_TRAIN ||
-					v->type == VEH_ROAD ||
-					(v->type == VEH_AIRCRAFT && IsNormalAircraft(v)) ||
-					v->type == VEH_SHIP) {
-				value.AddCost(v->value * 3 >> 1);
-			}
+	Vehicle *v;
+	FOR_ALL_VEHICLES(v) {
+		if (v->owner != owner) continue;
+
+		if (v->type == VEH_TRAIN ||
+				v->type == VEH_ROAD ||
+				(v->type == VEH_AIRCRAFT && IsNormalAircraft(v)) ||
+				v->type == VEH_SHIP) {
+			value += v->value * 3 >> 1;
 		}
 	}
 
 	/* Add real money value */
-	value.AddCost(-p->current_loan);
-	value.AddCost(p->player_money);
+	value -= p->current_loan;
+	value += p->player_money;
 
-	return max(value.GetCost(), 1LL);
+	return max(value, (Money)1);
 }
 
 /** if update is set to true, the economy is updated with this score
@@ -146,7 +173,7 @@
 		const Station* st;
 
 		FOR_ALL_STATIONS(st) {
-			if (st->owner == owner) num += COUNTBITS(st->facilities);
+			if (st->owner == owner) num += CountBits(st->facilities);
 		}
 		_score_part[owner][SCORE_STATIONS] = num;
 	}
@@ -191,7 +218,7 @@
 
 /* Generate score for variety of cargo */
 	{
-		uint num = COUNTBITS(p->cargo_types);
+		uint num = CountBits(p->cargo_types);
 		_score_part[owner][SCORE_CARGO] = num;
 		if (update) p->cargo_types = 0;
 	}
@@ -217,7 +244,7 @@
 			/* Skip the total */
 			if (i == SCORE_TOTAL) continue;
 			/*  Check the score */
-			s = clamp(_score_part[owner][i], 0, _score_info[i].needed) * _score_info[i].score / _score_info[i].needed;
+			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;
 		}
@@ -301,12 +328,12 @@
 	FOR_ALL_TOWNS(t) {
 		/* If a player takes over, give the ratings to that player. */
 		if (new_player != PLAYER_SPECTATOR) {
-			if (HASBIT(t->have_ratings, old_player)) {
-				if (HASBIT(t->have_ratings, new_player)) {
+			if (HasBit(t->have_ratings, old_player)) {
+				if (HasBit(t->have_ratings, new_player)) {
 					// use max of the two ratings.
 					t->ratings[new_player] = max(t->ratings[new_player], t->ratings[old_player]);
 				} else {
-					SETBIT(t->have_ratings, new_player);
+					SetBit(t->have_ratings, new_player);
 					t->ratings[new_player] = t->ratings[old_player];
 				}
 			}
@@ -314,7 +341,7 @@
 
 		/* Reset the ratings for the old player */
 		t->ratings[old_player] = 500;
-		CLRBIT(t->have_ratings, old_player);
+		ClrBit(t->have_ratings, old_player);
 	}
 
 	{
@@ -338,7 +365,7 @@
 		}
 
 		FOR_ALL_VEHICLES(v) {
-			if (v->owner == old_player && IS_BYTE_INSIDE(v->type, VEH_TRAIN, VEH_AIRCRAFT + 1)) {
+			if (v->owner == old_player && IsInsideMM(v->type, VEH_TRAIN, VEH_AIRCRAFT + 1)) {
 				if (new_player == PLAYER_SPECTATOR) {
 					DeleteWindowById(WC_VEHICLE_VIEW, v->index);
 					DeleteWindowById(WC_VEHICLE_DETAILS, v->index);
@@ -519,7 +546,7 @@
 
 	switch (ni->string_id & 0xF0) {
 	case NB_BTROUBLE:
-		DrawStringCentered(w->width >> 1, 1, STR_7056_TRANSPORT_COMPANY_IN_TROUBLE, 0);
+		DrawStringCentered(w->width >> 1, 1, STR_7056_TRANSPORT_COMPANY_IN_TROUBLE, TC_FROMSTRING);
 
 		SetDParam(0, p->index);
 
@@ -531,7 +558,7 @@
 		break;
 
 	case NB_BMERGER:
-		DrawStringCentered(w->width >> 1, 1, STR_7059_TRANSPORT_COMPANY_MERGER, 0);
+		DrawStringCentered(w->width >> 1, 1, STR_7059_TRANSPORT_COMPANY_MERGER, TC_FROMSTRING);
 		SetDParam(0, ni->params[0]);
 		SetDParam(1, p->index);
 		SetDParam(2, ni->params[1]);
@@ -543,7 +570,7 @@
 		break;
 
 	case NB_BBANKRUPT:
-		DrawStringCentered(w->width >> 1, 1, STR_705C_BANKRUPT, 0);
+		DrawStringCentered(w->width >> 1, 1, STR_705C_BANKRUPT, TC_FROMSTRING);
 		SetDParam(0, ni->params[0]);
 		DrawStringMultiCenter(
 			((w->width - 101) >> 1) + 98,
@@ -553,7 +580,7 @@
 		break;
 
 	case NB_BNEWCOMPANY:
-		DrawStringCentered(w->width >> 1, 1, STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED, 0);
+		DrawStringCentered(w->width >> 1, 1, STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED, TC_FROMSTRING);
 		SetDParam(0, p->index);
 		SetDParam(1, ni->params[0]);
 		DrawStringMultiCenter(
@@ -612,7 +639,7 @@
 		SubtractMoneyFromPlayer(_price.station_value >> 1);
 	}
 
-	if (!HASBIT(1<<0|1<<3|1<<6|1<<9, _cur_month))
+	if (!HasBit(1<<0|1<<3|1<<6|1<<9, _cur_month))
 		return;
 
 	FOR_ALL_PLAYERS(p) {
@@ -711,7 +738,7 @@
 		_current_player = p->index;
 		SET_EXPENSES_TYPE(EXPENSES_LOAN_INT);
 
-		SubtractMoneyFromPlayer(CommandCost((Money)BIGMULUS(p->current_loan, interest, 16)));
+		SubtractMoneyFromPlayer(CommandCost((Money)BigMulSU(p->current_loan, interest, 16)));
 
 		SET_EXPENSES_TYPE(EXPENSES_OTHER);
 		SubtractMoneyFromPlayer(_price.station_value >> 2);
@@ -764,10 +791,10 @@
 	  65000, ///< ship_base
 	     20, ///< build_trees
 	    250, ///< terraform
-	     20, ///< clear_1
-	     40, ///< purchase_land
-	    200, ///< clear_2
-	    500, ///< clear_3
+	     20, ///< clear_grass
+	     40, ///< clear_roughland
+	    200, ///< clear_rocks
+	    500, ///< clear_fields
 	     20, ///< remove_trees
 	    -70, ///< remove_rail
 	     10, ///< remove_signals
@@ -982,7 +1009,7 @@
 	if (i == NULL) return;
 
 	/* Randomize cargo type */
-	if (HASBIT(Random(), 0) && i->produced_cargo[1] != CT_INVALID) {
+	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];
@@ -1075,7 +1102,7 @@
 	}
 
 	/* 25% chance to go on */
-	if (CHANCE16(1,4)) {
+	if (Chance16(1,4)) {
 		/*  Find a free slot*/
 		s = _subsidies;
 		while (s->cargo_type != CT_INVALID) {
@@ -1152,14 +1179,14 @@
 	const CargoSpec *cs = GetCargo(cargo_type);
 
 	/* Use callback to calculate cargo profit, if available */
-	if (HASBIT(cs->callback_mask, CBM_CARGO_PROFIT_CALC)) {
+	if (HasBit(cs->callback_mask, CBM_CARGO_PROFIT_CALC)) {
 		uint32 var18 = min(dist, 0xFFFF) | (min(num_pieces, 0xFF) << 16) | (transit_days << 24);
 		uint16 callback = GetCargoCallback(CBID_CARGO_PROFIT_CALC, 0, var18, cs);
 		if (callback != CALLBACK_FAILED) {
 			int result = GB(callback, 0, 14);
 
 			/* Simulate a 15 bit signed value */
-			if (HASBIT(callback, 14)) result = 0x4000 - result;
+			if (HasBit(callback, 14)) result = 0x4000 - result;
 
 			/* "The result should be a signed multiplier that gets multiplied
 			 * by the amount of cargo moved and the price factor, then gets
@@ -1200,7 +1227,7 @@
 
 	if (time_factor < MIN_TIME_FACTOR) time_factor = MIN_TIME_FACTOR;
 
-	return BIGMULSS(dist * time_factor * num_pieces, _cargo_payment_rates[cargo_type], 21);
+	return BigMulS(dist * time_factor * num_pieces, _cargo_payment_rates[cargo_type], 21);
 }
 
 static void DeliverGoodsToIndustry(TileIndex xy, CargoID cargo_type, int num_pieces)
@@ -1227,7 +1254,7 @@
 		/* Check if matching cargo has been found */
 		if (i == lengthof(ind->accepts_cargo)) continue;
 
-		if (HASBIT(indspec->callback_flags, CBM_IND_REFUSE_CARGO)) {
+		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);
 			if (res == 0) continue;
 		}
@@ -1249,9 +1276,9 @@
 		best->was_cargo_delivered = true;
 		best->last_cargo_accepted_at = _date;
 
-		if (HASBIT(callback, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HASBIT(callback, CBM_IND_PRODUCTION_256_TICKS)) {
+		if (HasBit(callback, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(callback, CBM_IND_PRODUCTION_256_TICKS)) {
 			best->incoming_cargo_waiting[accepted_cargo_index] = min(num_pieces + best->incoming_cargo_waiting[accepted_cargo_index], 0xFFFF);
-			if (HASBIT(callback, CBM_IND_PRODUCTION_CARGO_ARRIVAL)) {
+			if (HasBit(callback, CBM_IND_PRODUCTION_CARGO_ARRIVAL)) {
 				IndustryProductionCallback(best, 0);
 			} else {
 				InvalidateWindow(WC_INDUSTRY_VIEW, best->index);
@@ -1261,6 +1288,7 @@
 			best->produced_cargo_waiting[1] = min(best->produced_cargo_waiting[1] + (num_pieces * indspec->input_cargo_multiplier[accepted_cargo_index][1] / 256), 0xFFFF);
 		}
 
+		TriggerIndustry(best, INDUSTRY_TRIGGER_RECEIVED_CARGO);
 		StartStopIndustryTileAnimation(best, IAT_INDUSTRY_RECEIVED_CARGO);
 	}
 }
@@ -1343,7 +1371,7 @@
 	{
 		Player *p = GetPlayer(_current_player);
 		p->cur_economy.delivered_cargo += num_pieces;
-		SETBIT(p->cargo_types, cargo_type);
+		SetBit(p->cargo_types, cargo_type);
 	}
 
 	/* Get station pointers. */
@@ -1397,7 +1425,7 @@
 	_current_player = front_v->owner;
 
 	/* At this moment loading cannot be finished */
-	CLRBIT(front_v->vehicle_flags, VF_LOADING_FINISHED);
+	ClrBit(front_v->vehicle_flags, VF_LOADING_FINISHED);
 
 	/* Start unloading in at the first possible moment */
 	front_v->load_unload_time_rem = 1;
@@ -1408,7 +1436,7 @@
 
 		/* All cargo has already been paid for, no need to pay again */
 		if (!v->cargo.UnpaidCargo()) {
-			SETBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+			SetBit(v->vehicle_flags, VF_CARGO_UNLOADING);
 			continue;
 		}
 
@@ -1419,7 +1447,7 @@
 			CargoPacket *cp = *it;
 			if (!cp->paid_for &&
 					cp->source != last_visited &&
-					HASBIT(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) &&
+					HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) &&
 					(front_v->current_order.flags & OF_TRANSFER) == 0) {
 				/* Deliver goods to the station */
 				st->time_since_unload = 0;
@@ -1432,7 +1460,7 @@
 
 				result |= 1;
 
-				SETBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+				SetBit(v->vehicle_flags, VF_CARGO_UNLOADING);
 			} else if (front_v->current_order.flags & (OF_UNLOAD | OF_TRANSFER)) {
 				if (!cp->paid_for && (front_v->current_order.flags & OF_TRANSFER) != 0) {
 					Money profit = GetTransportedGoodsIncome(
@@ -1449,7 +1477,7 @@
 				}
 				result |= 2;
 
-				SETBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+				SetBit(v->vehicle_flags, VF_CARGO_UNLOADING);
 			}
 		}
 		v->cargo.InvalidateCache();
@@ -1487,7 +1515,7 @@
 
 	/* We have not waited enough time till the next round of loading/unloading */
 	if (--v->load_unload_time_rem != 0) {
-		if (_patches.improved_load && HASBIT(v->current_order.flags, OFB_FULL_LOAD)) {
+		if (_patches.improved_load && HasBit(v->current_order.flags, OFB_FULL_LOAD)) {
 			/* 'Reserve' this cargo for this vehicle, because we were first. */
 			for (; v != NULL; v = v->Next()) {
 				if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo.Count();
@@ -1499,7 +1527,7 @@
 	if (v->type == VEH_TRAIN && !IsTileType(v->tile, MP_STATION)) {
 		/* The train reversed in the station. Take the "easy" way
 		 * out and let the train just leave as it always did. */
-		SETBIT(v->vehicle_flags, VF_LOADING_FINISHED);
+		SetBit(v->vehicle_flags, VF_LOADING_FINISHED);
 		return;
 	}
 
@@ -1523,32 +1551,32 @@
 		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_VEHICLE_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;
+			if (cb_load_amount != CALLBACK_FAILED && cb_load_amount != 0) load_amount = cb_load_amount & 0xFF;
 		}
 
 		GoodsEntry *ge = &st->goods[v->cargo_type];
 
-		if (HASBIT(v->vehicle_flags, VF_CARGO_UNLOADING)) {
+		if (HasBit(v->vehicle_flags, VF_CARGO_UNLOADING)) {
 			uint cargo_count = v->cargo.Count();
 			uint amount_unloaded = _patches.gradual_loading ? min(cargo_count, load_amount) : cargo_count;
 			bool remaining; // Are there cargo entities in this vehicle that can still be unloaded here?
 
-			if (HASBIT(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && !(u->current_order.flags & OF_TRANSFER)) {
+			if (HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && !(u->current_order.flags & OF_TRANSFER)) {
 				/* The cargo has reached it's final destination, the packets may now be destroyed */
 				remaining = v->cargo.MoveTo(NULL, amount_unloaded, CargoList::MTA_FINAL_DELIVERY, last_visited);
 
 				result |= 1;
 			} else if (u->current_order.flags & (OF_UNLOAD | OF_TRANSFER)) {
 				remaining = v->cargo.MoveTo(&ge->cargo, amount_unloaded);
-				SETBIT(ge->acceptance_pickup, GoodsEntry::PICKUP);
+				SetBit(ge->acceptance_pickup, GoodsEntry::PICKUP);
 
 				result |= 2;
 			} else {
 				/* The order changed while unloading (unset unload/transfer) or the
 				 * station does not accept goods anymore. */
-				CLRBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+				ClrBit(v->vehicle_flags, VF_CARGO_UNLOADING);
 				continue;
 			}
 
@@ -1562,7 +1590,7 @@
 				completely_empty = false;
 			} else {
 				/* We have finished unloading (cargo count == 0) */
-				CLRBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+				ClrBit(v->vehicle_flags, VF_CARGO_UNLOADING);
 			}
 
 			continue;
@@ -1593,7 +1621,7 @@
 			/* Skip loading this vehicle if another train/vehicle is already handling
 			 * the same cargo type at this station */
 			if (_patches.improved_load && cargo_left[v->cargo_type] <= 0) {
-				SETBIT(cargo_not_full, v->cargo_type);
+				SetBit(cargo_not_full, v->cargo_type);
 				continue;
 			}
 
@@ -1628,9 +1656,9 @@
 		}
 
 		if (v->cargo.Count() == v->cargo_cap) {
-			SETBIT(cargo_full, v->cargo_type);
+			SetBit(cargo_full, v->cargo_type);
 		} else {
-			SETBIT(cargo_not_full, v->cargo_type);
+			SetBit(cargo_not_full, v->cargo_type);
 		}
 	}
 
@@ -1638,7 +1666,7 @@
 	 * all wagons at the same time instead of using the same 'improved'
 	 * loading algorithm for the wagons (only fill wagon when there is
 	 * enough to fill the previous wagons) */
-	if (_patches.improved_load && HASBIT(u->current_order.flags, OFB_FULL_LOAD)) {
+	if (_patches.improved_load && HasBit(u->current_order.flags, OFB_FULL_LOAD)) {
 		/* Update left cargo */
 		for (v = u; v != NULL; v = v->Next()) {
 			if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo.Count();
@@ -1657,7 +1685,7 @@
 		}
 	} else {
 		bool finished_loading = true;
-		if (HASBIT(v->current_order.flags, OFB_FULL_LOAD)) {
+		if (HasBit(v->current_order.flags, OFB_FULL_LOAD)) {
 			if (_patches.full_load_any) {
 				/* if the aircraft carries passengers and is NOT full, then
 				 * continue loading, no matter how much mail is in */
--- a/src/elrail.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/elrail.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -65,10 +65,11 @@
 #include "vehicle.h"
 #include "train.h"
 #include "gui.h"
+#include "transparency.h"
 
 static inline TLG GetTLG(TileIndex t)
 {
-	return (TLG)((HASBIT(TileX(t), 0) << 1) + HASBIT(TileY(t), 0));
+	return (TLG)((HasBit(TileX(t), 0) << 1) + HasBit(TileY(t), 0));
 }
 
 /** Finds which Rail Bits are present on a given tile. For bridge tiles,
@@ -195,7 +196,7 @@
 		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),
+		IsTransparencySet(TO_BUILDINGS),
 		BB_data[0] - sss->x_offset, BB_data[1] - sss->y_offset, BB_Z_SEPARATOR - sss->z_offset
 	);
 }
@@ -213,6 +214,10 @@
 	/* Note that ti->tileh has already been adjusted for Foundations */
 	Slope tileh[TS_END] = { ti->tileh, SLOPE_FLAT };
 
+	/* Half tile slopes coincide only with horizontal/vertical track.
+	 * Faking a flat slope results in the correct sprites on positions. */
+	if (IsHalftileSlope(tileh[TS_HOME])) tileh[TS_HOME] = SLOPE_FLAT;
+
 	TLG tlg = GetTLG(ti->tile);
 	byte PCPstatus = 0;
 	byte OverridePCP = 0;
@@ -265,11 +270,11 @@
 
 			/* We check whether the track in question (k) is present in the tile
 			 * (TrackSourceTile) */
-			if (HASBIT(trackconfig[TrackSourceTile[i][k]], TracksAtPCP[i][k])) {
+			if (HasBit(trackconfig[TrackSourceTile[i][k]], TracksAtPCP[i][k])) {
 				/* track found, if track is in the neighbour tile, adjust the number
 				 * of the PCP for preferred/allowed determination*/
 				DiagDirection PCPpos = (TrackSourceTile[i][k] == TS_HOME) ? i : ReverseDiagDir(i);
-				SETBIT(PCPstatus, i); // This PCP is in use
+				SetBit(PCPstatus, i); // This PCP is in use
 
 				PPPpreferred[i] &= PreferredPPPofTrackAtPCP[TracksAtPCP[i][k]][PCPpos];
 				PPPallowed[i] &= ~DisallowedPPPofTrackAtPCP[TracksAtPCP[i][k]][PCPpos];
@@ -277,8 +282,8 @@
 		}
 
 		/* Deactivate all PPPs if PCP is not used */
-		PPPpreferred[i] *= HASBIT(PCPstatus, i);
-		PPPallowed[i] *= HASBIT(PCPstatus, i);
+		PPPpreferred[i] *= HasBit(PCPstatus, i);
+		PPPallowed[i] *= HasBit(PCPstatus, i);
 
 		/* A station is always "flat", so adjust the tileh accordingly */
 		if (IsTileType(neighbour, MP_STATION)) tileh[TS_NEIGHBOUR] = SLOPE_FLAT;
@@ -291,6 +296,10 @@
 
 		ApplyFoundationToSlope(foundation, &tileh[TS_NEIGHBOUR]);
 
+	/* Half tile slopes coincide only with horizontal/vertical track.
+	 * Faking a flat slope results in the correct sprites on positions. */
+		if (IsHalftileSlope(tileh[TS_NEIGHBOUR])) tileh[TS_NEIGHBOUR] = SLOPE_FLAT;
+
 		AdjustTileh(neighbour, &tileh[TS_NEIGHBOUR]);
 
 		/* If we have a straight (and level) track, we want a pylon only every 2 tiles
@@ -298,7 +307,7 @@
 		/* Level means that the slope is the same, or the track is flat */
 		if (tileh[TS_HOME] == tileh[TS_NEIGHBOUR] || (isflat[TS_HOME] && isflat[TS_NEIGHBOUR])) {
 			for (k = 0; k < NUM_IGNORE_GROUPS; k++)
-				if (PPPpreferred[i] == IgnoredPCP[k][tlg][i]) CLRBIT(PCPstatus, i);
+				if (PPPpreferred[i] == IgnoredPCP[k][tlg][i]) ClrBit(PCPstatus, i);
 		}
 
 		/* Now decide where we draw our pylons. First try the preferred PPPs, but they may not exist.
@@ -313,20 +322,20 @@
 
 			if ((height <= GetTileMaxZ(ti->tile) + TILE_HEIGHT) &&
 					(i == PCPpositions[bridgetrack][0] || i == PCPpositions[bridgetrack][1])) {
-				SETBIT(OverridePCP, i);
+				SetBit(OverridePCP, i);
 			}
 		}
 
-		if (PPPallowed[i] != 0 && HASBIT(PCPstatus, i) && !HASBIT(OverridePCP, i)) {
+		if (PPPallowed[i] != 0 && HasBit(PCPstatus, i) && !HasBit(OverridePCP, i)) {
 			for (k = 0; k < DIR_END; k++) {
 				byte temp = PPPorder[i][GetTLG(ti->tile)][k];
 
-				if (HASBIT(PPPallowed[i], temp)) {
+				if (HasBit(PPPallowed[i], temp)) {
 					uint x  = ti->x + x_pcp_offsets[i] + x_ppp_offsets[temp];
 					uint y  = ti->y + y_pcp_offsets[i] + y_ppp_offsets[temp];
 
 					/* Don't build the pylon if it would be outside the tile */
-					if (!HASBIT(OwnedPPPonPCP[i], temp)) {
+					if (!HasBit(OwnedPPPonPCP[i], temp)) {
 						/* We have a neighour that will draw it, bail out */
 						if (trackconfig[TS_NEIGHBOUR] != 0) break;
 						continue; /* No neighbour, go looking for a better position */
@@ -334,7 +343,7 @@
 
 					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);
+							IsTransparencySet(TO_BUILDINGS), -1, -1);
 					break; /* We already have drawn a pylon, bail out */
 				}
 			}
@@ -342,7 +351,7 @@
 	}
 
 	/* Don't draw a wire under a low bridge */
-	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !HASBIT(_transparent_opt, TO_BUILDINGS)) {
+	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_BUILDINGS)) {
 		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
 
 		if (height <= GetTileMaxZ(ti->tile) + TILE_HEIGHT) return;
@@ -350,10 +359,10 @@
 
 	/* Drawing of pylons is finished, now draw the wires */
 	for (t = TRACK_BEGIN; t < TRACK_END; t++) {
-		if (HASBIT(trackconfig[TS_HOME], t)) {
+		if (HasBit(trackconfig[TS_HOME], t)) {
 			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);
+			byte PCPconfig = HasBit(PCPstatus, PCPpositions[t][0]) +
+				(HasBit(PCPstatus, PCPpositions[t][1]) << 1);
 
 			const SortableSpriteStruct *sss;
 			int tileh_selector = !(tileh[TS_HOME] % 3) * tileh[TS_HOME] / 3; /* tileh for the slopes, 0 otherwise */
@@ -369,7 +378,7 @@
 			 */
 			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 + sss->x_offset, ti->y + sss->y_offset) + sss->z_offset,
-				HASBIT(_transparent_opt, TO_BUILDINGS));
+				IsTransparencySet(TO_BUILDINGS));
 		}
 	}
 }
@@ -402,7 +411,7 @@
 
 	AddSortableSpriteToDraw(sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
 		sss->x_size, sss->y_size, sss->z_size, height + sss->z_offset,
-		HASBIT(_transparent_opt, TO_BUILDINGS)
+		IsTransparencySet(TO_BUILDINGS)
 	);
 
 	/* Finished with wires, draw pylons */
@@ -410,20 +419,20 @@
 	if (num % 2) {
 		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);
+		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);
+		AddSortableSpriteToDraw(pylon_sprites[PPPpos], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, height, IsTransparencySet(TO_BUILDINGS), -1, -1);
 	}
 
 	/* need a pylon on the southern end of the bridge */
 	if (DistanceMax(ti->tile, start) == length) {
 		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);
+		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);
+		AddSortableSpriteToDraw(pylon_sprites[PPPpos], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, height, IsTransparencySet(TO_BUILDINGS), -1, -1);
 	}
 }
 
@@ -449,7 +458,7 @@
 					sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
 					sss->x_size, sss->y_size, sss->z_size,
 					GetTileMaxZ(ti->tile) + sss->z_offset,
-					HASBIT(_transparent_opt, TO_BUILDINGS)
+					IsTransparencySet(TO_BUILDINGS)
 				);
 				return;
 			}
@@ -495,7 +504,7 @@
 				*  so add there also normal rail compatibility */
 				v->u.rail.compatible_railtypes |= (1 << RAILTYPE_RAIL);
 				v->u.rail.railtype = RAILTYPE_RAIL;
-				SETBIT(v->u.rail.flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL);
+				SetBit(v->u.rail.flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL);
 			}
 		}
 	}
--- a/src/engine.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/engine.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -165,7 +165,7 @@
 		e->lifelength = ei->lifelength + _patches.extend_vehicle_life;
 
 		/* prevent certain engines from ever appearing. */
-		if (!HASBIT(ei->climates, _opt.landscape)) {
+		if (!HasBit(ei->climates, _opt.landscape)) {
 			e->flags |= ENGINE_AVAILABLE;
 			e->player_avail = 0;
 		}
@@ -183,14 +183,14 @@
 	Engine *e = GetEngine(eid);
 	Player *p = GetPlayer(player);
 
-	SETBIT(e->player_avail, player);
+	SetBit(e->player_avail, player);
 	if (e->type == VEH_TRAIN) {
 		const RailVehicleInfo *rvi = RailVehInfo(eid);
 
 		assert(rvi->railtype < RAILTYPE_END);
-		SETBIT(p->avail_railtypes, rvi->railtype);
+		SetBit(p->avail_railtypes, rvi->railtype);
 	} else if (e->type == VEH_ROAD) {
-		SETBIT(p->avail_roadtypes, HASBIT(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
+		SetBit(p->avail_roadtypes, HasBit(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
 	}
 
 	e->preview_player = INVALID_PLAYER;
@@ -210,7 +210,7 @@
 		best_hist = -1;
 		best_player = PLAYER_SPECTATOR;
 		FOR_ALL_PLAYERS(p) {
-			if (p->is_active && p->block_preview == 0 && !HASBIT(mask, p->index) &&
+			if (p->is_active && p->block_preview == 0 && !HasBit(mask, p->index) &&
 					p->old_economy[0].performance_history > best_hist) {
 				best_hist = p->old_economy[0].performance_history;
 				best_player = p->index;
@@ -219,7 +219,7 @@
 
 		if (best_player == PLAYER_SPECTATOR) return PLAYER_SPECTATOR;
 
-		SETBIT(mask, best_player);
+		SetBit(mask, best_player);
 	} while (pp--, pp != 0);
 
 	return best_player;
@@ -300,7 +300,7 @@
 		FOR_ALL_PLAYERS(p) {
 			uint block_preview = p->block_preview;
 
-			if (!HASBIT(e->player_avail, p->index)) continue;
+			if (!HasBit(e->player_avail, p->index)) continue;
 
 			/* We assume the user did NOT build it.. prove me wrong ;) */
 			p->block_preview = 20;
@@ -332,13 +332,13 @@
 		RailType railtype = RailVehInfo(index)->railtype;
 		assert(railtype < RAILTYPE_END);
 		FOR_ALL_PLAYERS(p) {
-			if (p->is_active) SETBIT(p->avail_railtypes, railtype);
+			if (p->is_active) SetBit(p->avail_railtypes, railtype);
 		}
 	}
 	if ((index - NUM_TRAIN_ENGINES) < NUM_ROAD_ENGINES) {
 		/* maybe make another road type available */
 		FOR_ALL_PLAYERS(p) {
-			if (p->is_active) SETBIT(p->avail_roadtypes, HASBIT(EngInfo(index)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
+			if (p->is_active) SetBit(p->avail_roadtypes, HasBit(EngInfo(index)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
 		}
 	}
 	AddNewsItem(index, NEWS_FLAGS(NM_CALLBACK, 0, NT_NEW_VEHICLES, DNC_VEHICLEAVAIL), 0, 0);
@@ -436,12 +436,12 @@
 	if (e->type != type) return false;
 
 	/* check if it's available */
-	if (!HASBIT(e->player_avail, player)) return false;
+	if (!HasBit(e->player_avail, player)) return false;
 
 	if (type == VEH_TRAIN) {
 		/* Check if the rail type is available to this player */
 		const Player *p = GetPlayer(player);
-		if (!HASBIT(p->avail_railtypes, RailVehInfo(engine)->railtype)) return false;
+		if (!HasBit(p->avail_railtypes, RailVehInfo(engine)->railtype)) return false;
 	}
 
 	return true;
--- a/src/engine_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/engine_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -80,7 +80,7 @@
 		DrawStringMultiCenter(150, 44, STR_8101_WE_HAVE_JUST_DESIGNED_A, 296);
 
 		SetDParam(0, engine);
-		DrawStringCentered(w->width >> 1, 80, STR_ENGINE_NAME, 0x10);
+		DrawStringCentered(w->width >> 1, 80, STR_ENGINE_NAME, TC_BLACK);
 
 		dei = &_draw_engine_list[GetEngine(engine)->type];
 
@@ -120,7 +120,7 @@
 static void DrawTrainEngineInfo(EngineID engine, int x, int y, int maxw)
 {
 	const RailVehicleInfo *rvi = RailVehInfo(engine);
-	uint multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD) ? 1 : 0;
+	int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD) ? 1 : 0;
 
 	SetDParam(0, (_price.build_railvehicle >> 3) * rvi->base_cost >> 5);
 	SetDParam(2, rvi->max_speed * 10 / 16);
--- a/src/fileio.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/fileio.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -24,19 +24,18 @@
 /*************************************************/
 
 #define FIO_BUFFER_SIZE 512
-#define MAX_HANDLES 64
 
 struct Fio {
-	byte *buffer, *buffer_end;          ///< position pointer in local buffer and last valid byte of buffer
-	uint32 pos;                         ///< current (system) position in file
-	FILE *cur_fh;                       ///< current file handle
-	const char *filename;               ///< current filename
-	FILE *handles[MAX_HANDLES];         ///< array of file handles we can have open
-	byte buffer_start[FIO_BUFFER_SIZE]; ///< local buffer when read from file
-	const char *filenames[MAX_HANDLES]; ///< array of filenames we (should) have open
+	byte *buffer, *buffer_end;             ///< position pointer in local buffer and last valid byte of buffer
+	uint32 pos;                            ///< current (system) position in file
+	FILE *cur_fh;                          ///< current file handle
+	const char *filename;                  ///< current filename
+	FILE *handles[MAX_FILE_SLOTS];         ///< array of file handles we can have open
+	byte buffer_start[FIO_BUFFER_SIZE];    ///< local buffer when read from file
+	const char *filenames[MAX_FILE_SLOTS]; ///< array of filenames we (should) have open
 #if defined(LIMITED_FDS)
-	uint open_handles;                  ///< current amount of open handles
-	uint usage_count[MAX_HANDLES];      ///< count how many times this file has been opened
+	uint open_handles;                     ///< current amount of open handles
+	uint usage_count[MAX_FILE_SLOTS];      ///< count how many times this file has been opened
 #endif /* LIMITED_FDS */
 };
 
@@ -364,6 +363,16 @@
 	CreateDirectory(OTTD2FS(name), NULL);
 #elif defined(OS2) && !defined(__INNOTEK_LIBC__)
 	mkdir(OTTD2FS(name));
+#elif defined(__MORPHOS__) || defined(__AMIGAOS__)
+	char buf[MAX_PATH];
+	ttd_strlcpy(buf, name, MAX_PATH);
+
+	size_t len = strlen(name) - 1;
+	if (buf[len] == '/') {
+		buf[len] = '\0'; // Kill pathsep, so mkdir() will not fail
+	}
+
+	mkdir(OTTD2FS(buf), 0755);
 #else
 	mkdir(OTTD2FS(name), 0755);
 #endif
@@ -509,7 +518,7 @@
 		if (_tar_filelist.insert(TarFileList::value_type(name, entry)).second) num++;
 
 		/* Skip to the next block.. */
-		skip = ALIGN(skip, 512);
+		skip = Align(skip, 512);
 		fseek(f, skip, SEEK_CUR);
 		pos += skip;
 	}
@@ -721,7 +730,10 @@
 	char *autosave_dir = str_fmt("%s%s", _personal_dir, FioGetSubdirectory(AUTOSAVE_DIR));
 
 	/* Make the necessary folders */
+#if !defined(__MORPHOS__) && !defined(__AMIGA__) && defined(WITH_PERSONAL_DIR)
 	FioCreateDirectory(_personal_dir);
+#endif
+
 	FioCreateDirectory(save_dir);
 	FioCreateDirectory(autosave_dir);
 
--- a/src/fios.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/fios.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -145,15 +145,7 @@
 	case FIOS_TYPE_BMP:
 	{
 		static char str_buffr[512];
-
-#if defined(__MORPHOS__) || defined(__AMIGAOS__)
-		/* On MorphOS or AmigaOS paths look like: "Volume:directory/subdirectory" */
-		if (FiosIsRoot(path)) {
-			snprintf(str_buffr, lengthof(str_buffr), "%s:%s", path, item->name);
-		} else // XXX - only next line!
-#endif
 		snprintf(str_buffr, lengthof(str_buffr), "%s%s", path, item->name);
-
 		return str_buffr;
 	}
 	}
@@ -170,8 +162,21 @@
 	/* Don't append the extension if it is already there */
 	period = strrchr(name, '.');
 	if (period != NULL && strcasecmp(period, extension) == 0) extension = "";
+#if  defined(__MORPHOS__) || defined(__AMIGAOS__)
+	if (_fios_path != NULL) {
+		unsigned char sepchar = _fios_path[(strlen(_fios_path) - 1)];
 
+		if (sepchar != ':' && sepchar != '/') {
+			snprintf(buf, size, "%s" PATHSEP "%s%s", _fios_path, name, extension);
+		} else {
+			snprintf(buf, size, "%s%s%s", _fios_path, name, extension);
+		}
+	} else {
+		snprintf(buf, size, "%s%s", name, extension);
+	}
+#else
 	snprintf(buf, size, "%s" PATHSEP "%s%s", _fios_path, name, extension);
+#endif
 }
 
 #if defined(WIN32)
--- a/src/fios.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/fios.h	Mon Dec 03 23:39:38 2007 +0000
@@ -5,6 +5,24 @@
 #ifndef FIOS_H
 #define FIOS_H
 
+enum {
+	/**
+	 * Slot used for the GRF scanning and such. This slot cannot be reused
+	 * as it will otherwise cause issues when pressing "rescan directories".
+	 * It can furthermore not be larger than LAST_GRF_SLOT as that complicates
+	 * the testing for "too much NewGRFs".
+	 */
+	CONFIG_SLOT    =  0,
+	/** Slot for the sound. */
+	SOUND_SLOT     =  1,
+	/** First slot useable for (New)GRFs used during the game. */
+	FIRST_GRF_SLOT =  2,
+	/** Last slot useable for (New)GRFs used during the game. */
+	LAST_GRF_SLOT  = 63,
+	/** Maximum number of slots. */
+	MAX_FILE_SLOTS = 64
+};
+
 /* Deals with finding savegames */
 struct FiosItem {
 	byte type;
--- a/src/fontcache.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/fontcache.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -434,7 +434,7 @@
 	if (size == FS_NORMAL) {
 		for (y = 0; y < slot->bitmap.rows; y++) {
 			for (x = 0; x < slot->bitmap.width; x++) {
-				if (aa ? (slot->bitmap.buffer[x + y * slot->bitmap.pitch] > 0) : HASBIT(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) {
+				if (aa ? (slot->bitmap.buffer[x + y * slot->bitmap.pitch] > 0) : HasBit(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) {
 					sprite.data[1 + x + (1 + y) * sprite.width].m = SHADOW_COLOUR;
 					sprite.data[1 + x + (1 + y) * sprite.width].a = aa ? slot->bitmap.buffer[x + y * slot->bitmap.pitch] : 0xFF;
 				}
@@ -444,7 +444,7 @@
 
 	for (y = 0; y < slot->bitmap.rows; y++) {
 		for (x = 0; x < slot->bitmap.width; x++) {
-			if (aa ? (slot->bitmap.buffer[x + y * slot->bitmap.pitch] > 0) : HASBIT(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) {
+			if (aa ? (slot->bitmap.buffer[x + y * slot->bitmap.pitch] > 0) : HasBit(slot->bitmap.buffer[(x / 8) + y * slot->bitmap.pitch], 7 - (x % 8))) {
 				sprite.data[x + y * sprite.width].m = FACE_COLOUR;
 				sprite.data[x + y * sprite.width].a = aa ? slot->bitmap.buffer[x + y * slot->bitmap.pitch] : 0xFF;
 			}
--- a/src/functions.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/functions.h	Mon Dec 03 23:39:38 2007 +0000
@@ -6,6 +6,8 @@
 #define FUNCTIONS_H
 
 #include "gfx.h"
+#include "viewport.h"
+#include "core/random_func.hpp"
 
 void UpdateTownMaxPass(Town *t);
 
@@ -15,10 +17,6 @@
 void DrawClearLandFence(const TileInfo *ti);
 void TileLoopClearHelper(TileIndex tile);
 
-/* water_land.cpp */
-void DrawShipDepotSprite(int x, int y, int image);
-void TileLoop_Water(TileIndex tile);
-
 /* players.cpp */
 bool CheckPlayerHasMoney(CommandCost cost);
 void SubtractMoneyFromPlayer(CommandCost cost);
@@ -31,54 +29,11 @@
 void CDECL ShowInfoF(const char *str, ...);
 
 /* openttd.cpp */
-
-/**************
- * Warning: DO NOT enable this unless you understand what it does
- *
- * If enabled, in a network game all randoms will be dumped to the
- *  stdout if the first client joins (or if you are a client). This
- *  is to help finding desync problems.
- *
- * Warning: DO NOT enable this unless you understand what it does
- **************/
-
-//#define RANDOM_DEBUG
-
-
-// Enable this to produce higher quality random numbers.
-// Doesn't work with network yet.
-//#define MERSENNE_TWISTER
-
-// Mersenne twister functions
-void SeedMT(uint32 seed);
-uint32 RandomMT();
-
-
-#ifdef MERSENNE_TWISTER
-	static inline uint32 Random() { return RandomMT(); }
-	uint RandomRange(uint max);
-#else
-
-#ifdef RANDOM_DEBUG
-	#define Random() DoRandom(__LINE__, __FILE__)
-	uint32 DoRandom(int line, const char *file);
-	#define RandomRange(max) DoRandomRange(max, __LINE__, __FILE__)
-	uint DoRandomRange(uint max, int line, const char *file);
-#else
-	uint32 Random();
-	uint RandomRange(uint max);
-#endif
-#endif // MERSENNE_TWISTER
-
 static inline TileIndex RandomTileSeed(uint32 r) { return TILE_MASK(r); }
 static inline TileIndex RandomTile() { return TILE_MASK(Random()); }
 
-
-uint32 InteractiveRandom(); // Used for random sequences that are not the same on the other end of the multiplayer link
-uint InteractiveRandomRange(uint max);
-
 /* texteff.cpp */
-bool AddAnimatedTile(TileIndex tile);
+void AddAnimatedTile(TileIndex tile);
 void DeleteAnimatedTile(TileIndex tile);
 void AnimateAnimatedTiles();
 void InitializeAnimatedTiles();
@@ -123,8 +78,8 @@
 void DeleteWindowById(WindowClass cls, WindowNumber number);
 void DeleteWindowByClass(WindowClass cls);
 
-void SetObjectToPlaceWnd(CursorID icon, SpriteID pal, byte mode, Window *w);
-void SetObjectToPlace(CursorID icon, SpriteID pal, byte mode, WindowClass window_class, WindowNumber window_num);
+void SetObjectToPlaceWnd(CursorID icon, SpriteID pal, ViewportHighlightMode mode, Window *w);
+void SetObjectToPlace(CursorID icon, SpriteID pal, ViewportHighlightMode mode, WindowClass window_class, WindowNumber window_num);
 
 void ResetObjectToPlace();
 
@@ -132,7 +87,6 @@
 
 bool ScrollMainWindowToTile(TileIndex tile, bool instant = false);
 bool ScrollMainWindowTo(int x, int y, bool instant = false);
-bool EnsureNoVehicle(TileIndex tile);
 bool EnsureNoVehicleOnGround(TileIndex tile);
 
 /**
@@ -151,8 +105,6 @@
 uint GetTownRadiusGroup(const Town* t, TileIndex tile);
 void ShowHighscoreTable(int difficulty, int8 rank);
 
-int FindFirstBit(uint32 x);
-
 void AfterLoadTown();
 void UpdatePatches();
 void AskExitGame();
--- a/src/genworld.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/genworld.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -20,6 +20,7 @@
 #include "settings.h"
 #include "heightmap.h"
 #include "date.h"
+#include "viewport.h"
 
 void GenerateClearTile();
 void GenerateIndustries();
@@ -85,7 +86,7 @@
 	if (_patches.generation_seed == GENERATE_NEW_SEED) _patches.generation_seed = _patches_newgame.generation_seed = InteractiveRandom();
 	_random_seeds[0][0] = _random_seeds[0][1] = _patches.generation_seed;
 	SetGeneratingWorldProgress(GWP_MAP_INIT, 2);
-	SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, 0, WC_MAIN_WINDOW, 0);
+	SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, VHM_NONE, WC_MAIN_WINDOW, 0);
 
 	IncreaseGeneratingWorldProgress(GWP_MAP_INIT);
 	/* Must start economy early because of the costs. */
--- a/src/genworld_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/genworld_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -228,7 +228,7 @@
 
 	switch (e->event) {
 	case WE_CREATE:
-		LowerWindowWidget(w, _opt_newgame.landscape + GLAND_TEMPERATE);
+		w->LowerWidget(_opt_newgame.landscape + GLAND_TEMPERATE);
 
 		snprintf(_genseed_buffer, sizeof(_genseed_buffer), "%u", _patches_newgame.generation_seed);
 		InitializeTextBuffer(&_genseed_query.text, _genseed_buffer, lengthof(_genseed_buffer), 120);
@@ -239,73 +239,73 @@
 	case WE_PAINT:
 		/* You can't select smoothness if not terragenesis */
 		if (mode == GLWP_GENERATE) {
-			SetWindowWidgetDisabledState(w, GLAND_SMOOTHNESS_TEXT,     _patches_newgame.land_generator == 0);
-			SetWindowWidgetDisabledState(w, GLAND_SMOOTHNESS_PULLDOWN, _patches_newgame.land_generator == 0);
+			w->SetWidgetDisabledState(GLAND_SMOOTHNESS_TEXT,     _patches_newgame.land_generator == 0);
+			w->SetWidgetDisabledState(GLAND_SMOOTHNESS_PULLDOWN, _patches_newgame.land_generator == 0);
 		}
 		/* Disable snowline if not hilly */
-		SetWindowWidgetDisabledState(w, GLAND_SNOW_LEVEL_TEXT, _opt_newgame.landscape != LT_ARCTIC);
+		w->SetWidgetDisabledState(GLAND_SNOW_LEVEL_TEXT, _opt_newgame.landscape != LT_ARCTIC);
 		/* Disable town, industry and trees in SE */
-		SetWindowWidgetDisabledState(w, GLAND_TOWN_TEXT,         _game_mode == GM_EDITOR);
-		SetWindowWidgetDisabledState(w, GLAND_TOWN_PULLDOWN,     _game_mode == GM_EDITOR);
-		SetWindowWidgetDisabledState(w, GLAND_INDUSTRY_TEXT,     _game_mode == GM_EDITOR);
-		SetWindowWidgetDisabledState(w, GLAND_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
-		SetWindowWidgetDisabledState(w, GLAND_TREE_TEXT,         _game_mode == GM_EDITOR);
-		SetWindowWidgetDisabledState(w, GLAND_TREE_PULLDOWN,     _game_mode == GM_EDITOR);
+		w->SetWidgetDisabledState(GLAND_TOWN_TEXT,         _game_mode == GM_EDITOR);
+		w->SetWidgetDisabledState(GLAND_TOWN_PULLDOWN,     _game_mode == GM_EDITOR);
+		w->SetWidgetDisabledState(GLAND_INDUSTRY_TEXT,     _game_mode == GM_EDITOR);
+		w->SetWidgetDisabledState(GLAND_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
+		w->SetWidgetDisabledState(GLAND_TREE_TEXT,         _game_mode == GM_EDITOR);
+		w->SetWidgetDisabledState(GLAND_TREE_PULLDOWN,     _game_mode == GM_EDITOR);
 
-		SetWindowWidgetDisabledState(w, GLAND_START_DATE_DOWN, _patches_newgame.starting_year <= MIN_YEAR);
-		SetWindowWidgetDisabledState(w, GLAND_START_DATE_UP,   _patches_newgame.starting_year >= MAX_YEAR);
-		SetWindowWidgetDisabledState(w, GLAND_SNOW_LEVEL_DOWN, _patches_newgame.snow_line_height <= 2 || _opt_newgame.landscape != LT_ARCTIC);
-		SetWindowWidgetDisabledState(w, GLAND_SNOW_LEVEL_UP,   _patches_newgame.snow_line_height >= MAX_SNOWLINE_HEIGHT || _opt_newgame.landscape != LT_ARCTIC);
+		w->SetWidgetDisabledState(GLAND_START_DATE_DOWN, _patches_newgame.starting_year <= MIN_YEAR);
+		w->SetWidgetDisabledState(GLAND_START_DATE_UP,   _patches_newgame.starting_year >= MAX_YEAR);
+		w->SetWidgetDisabledState(GLAND_SNOW_LEVEL_DOWN, _patches_newgame.snow_line_height <= 2 || _opt_newgame.landscape != LT_ARCTIC);
+		w->SetWidgetDisabledState(GLAND_SNOW_LEVEL_UP,   _patches_newgame.snow_line_height >= MAX_SNOWLINE_HEIGHT || _opt_newgame.landscape != LT_ARCTIC);
 
-		SetWindowWidgetLoweredState(w, GLAND_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
-		SetWindowWidgetLoweredState(w, GLAND_ARCTIC,    _opt_newgame.landscape == LT_ARCTIC);
-		SetWindowWidgetLoweredState(w, GLAND_TROPICAL,  _opt_newgame.landscape == LT_TROPIC);
-		SetWindowWidgetLoweredState(w, GLAND_TOYLAND,   _opt_newgame.landscape == LT_TOYLAND);
+		w->SetWidgetLoweredState(GLAND_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
+		w->SetWidgetLoweredState(GLAND_ARCTIC,    _opt_newgame.landscape == LT_ARCTIC);
+		w->SetWidgetLoweredState(GLAND_TROPICAL,  _opt_newgame.landscape == LT_TROPIC);
+		w->SetWidgetLoweredState(GLAND_TOYLAND,   _opt_newgame.landscape == LT_TOYLAND);
 		DrawWindowWidgets(w);
 
 		y = (mode == GLWP_HEIGHTMAP) ? 22 : 0;
 
-		DrawString( 12,  91 + y, STR_MAPSIZE, 0);
-		DrawString(119,  91 + y, mapsizes[_patches_newgame.map_x - 6], 0x10);
-		DrawString(168,  91 + y, STR_BY, 0);
-		DrawString(182,  91 + y, mapsizes[_patches_newgame.map_y - 6], 0x10);
+		DrawString( 12,  91 + y, STR_MAPSIZE, TC_FROMSTRING);
+		DrawString(119,  91 + y, mapsizes[_patches_newgame.map_x - 6], TC_BLACK);
+		DrawString(168,  91 + y, STR_BY, TC_FROMSTRING);
+		DrawString(182,  91 + y, mapsizes[_patches_newgame.map_y - 6], TC_BLACK);
 
-		DrawString( 12, 113 + y, STR_NUMBER_OF_TOWNS, 0);
-		DrawString( 12, 131 + y, STR_NUMBER_OF_INDUSTRIES, 0);
+		DrawString( 12, 113 + y, STR_NUMBER_OF_TOWNS, TC_FROMSTRING);
+		DrawString( 12, 131 + y, STR_NUMBER_OF_INDUSTRIES, TC_FROMSTRING);
 		if (_game_mode == GM_EDITOR) {
-			DrawString(118, 113 + y, STR_6836_OFF, 0x10);
-			DrawString(118, 131 + y, STR_6836_OFF, 0x10);
+			DrawString(118, 113 + y, STR_6836_OFF, TC_BLACK);
+			DrawString(118, 131 + y, STR_6836_OFF, TC_BLACK);
 		} else {
-			DrawString(118, 113 + y, num_towns[_opt_newgame.diff.number_towns], 0x10);
-			DrawString(118, 131 + y, num_inds[_opt_newgame.diff.number_industries], 0x10);
+			DrawString(118, 113 + y, num_towns[_opt_newgame.diff.number_towns], TC_BLACK);
+			DrawString(118, 131 + y, num_inds[_opt_newgame.diff.number_industries], TC_BLACK);
 		}
 
-		DrawString( 12, 153 + y, STR_RANDOM_SEED, 0);
+		DrawString( 12, 153 + y, STR_RANDOM_SEED, TC_FROMSTRING);
 		DrawEditBox(w, &_genseed_query, GLAND_RANDOM_EDITBOX);
 
-		DrawString(182, 113 + y, STR_DATE, 0);
+		DrawString(182, 113 + y, STR_DATE, TC_FROMSTRING);
 		SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
-		DrawStringCentered(271, 113 + y, STR_GENERATE_DATE, 0);
+		DrawStringCentered(271, 113 + y, STR_GENERATE_DATE, TC_FROMSTRING);
 
-		DrawString(182, 131 + y, STR_SNOW_LINE_HEIGHT, 0);
+		DrawString(182, 131 + y, STR_SNOW_LINE_HEIGHT, TC_FROMSTRING);
 		SetDParam(0, _patches_newgame.snow_line_height);
-		DrawStringCentered(303, 131 + y, STR_SNOW_LINE_HEIGHT_NUM, 0x10);
+		DrawStringCentered(303, 131 + y, STR_SNOW_LINE_HEIGHT_NUM, TC_BLACK);
 
 		if (mode == GLWP_GENERATE) {
-			DrawString( 12, 175, STR_LAND_GENERATOR, 0);
-			DrawString(118, 175, landscape[_patches_newgame.land_generator], 0x10);
-
-			DrawString( 12, 193, STR_TREE_PLACER, 0);
-			DrawString(118, 193, tree_placer[_patches_newgame.tree_placer], 0x10);
+			DrawString( 12, 175, STR_LAND_GENERATOR, TC_FROMSTRING);
+			DrawString(118, 175, landscape[_patches_newgame.land_generator], TC_BLACK);
 
-			DrawString( 12, 211, STR_TERRAIN_TYPE, 0);
-			DrawString(118, 211, elevations[_opt_newgame.diff.terrain_type], 0x10);
+			DrawString( 12, 193, STR_TREE_PLACER, TC_FROMSTRING);
+			DrawString(118, 193, tree_placer[_patches_newgame.tree_placer], TC_BLACK);
 
-			DrawString( 12, 229, STR_QUANTITY_OF_SEA_LAKES, 0);
-			DrawString(118, 229, sea_lakes[_opt_newgame.diff.quantity_sea_lakes], 0x10);
+			DrawString( 12, 211, STR_TERRAIN_TYPE, TC_FROMSTRING);
+			DrawString(118, 211, elevations[_opt_newgame.diff.terrain_type], TC_BLACK);
 
-			DrawString( 12, 247, STR_SMOOTHNESS, 0);
-			DrawString(118, 247, smoothness[_patches_newgame.tgen_smoothness], 0x10);
+			DrawString( 12, 229, STR_QUANTITY_OF_SEA_LAKES, TC_FROMSTRING);
+			DrawString(118, 229, sea_lakes[_opt_newgame.diff.quantity_sea_lakes], TC_BLACK);
+
+			DrawString( 12, 247, STR_SMOOTHNESS, TC_FROMSTRING);
+			DrawString(118, 247, smoothness[_patches_newgame.tgen_smoothness], TC_BLACK);
 		} else {
 			char buffer[512];
 
@@ -317,17 +317,17 @@
 				SetDParam(1, WP(w, generate_d).y);
 			}
 			GetString(buffer, STR_HEIGHTMAP_SIZE, lastof(buffer));
-			DrawStringRightAligned(326, 91, STR_HEIGHTMAP_SIZE, 0x10);
+			DrawStringRightAligned(326, 91, STR_HEIGHTMAP_SIZE, TC_BLACK);
 
-			DrawString( 12,  91, STR_HEIGHTMAP_NAME, 0x10);
+			DrawString( 12,  91, STR_HEIGHTMAP_NAME, TC_BLACK);
 			SetDParamStr(0, WP(w, generate_d).name);
-			DrawStringTruncated(114,  91, STR_ORANGE, 0x10, 326 - 114 - GetStringBoundingBox(buffer).width - 5);
+			DrawStringTruncated(114,  91, STR_ORANGE, TC_BLACK, 326 - 114 - GetStringBoundingBox(buffer).width - 5);
 
-			DrawString( 12, 197, STR_TREE_PLACER, 0);
-			DrawString(118, 197, tree_placer[_patches_newgame.tree_placer], 0x10);
+			DrawString( 12, 197, STR_TREE_PLACER, TC_FROMSTRING);
+			DrawString(118, 197, tree_placer[_patches_newgame.tree_placer], TC_BLACK);
 
-			DrawString( 12, 215, STR_HEIGHTMAP_ROTATION, 0);
-			DrawString(118, 215, rotation[_patches_newgame.heightmap_rotation], 0x10);
+			DrawString( 12, 215, STR_HEIGHTMAP_ROTATION, TC_FROMSTRING);
+			DrawString(118, 215, rotation[_patches_newgame.heightmap_rotation], TC_BLACK);
 		}
 
 		break;
@@ -335,7 +335,7 @@
 		switch (e->we.click.widget) {
 		case 0: DeleteWindow(w); break;
 		case GLAND_TEMPERATE: case GLAND_ARCTIC: case GLAND_TROPICAL: case GLAND_TOYLAND:
-			RaiseWindowWidget(w, _opt_newgame.landscape + GLAND_TEMPERATE);
+			w->RaiseWidget(_opt_newgame.landscape + GLAND_TEMPERATE);
 			SetNewLandscapeType(e->we.click.widget - GLAND_TEMPERATE);
 			break;
 		case GLAND_MAPSIZE_X_TEXT: case GLAND_MAPSIZE_X_PULLDOWN: // Mapsize X
@@ -387,7 +387,7 @@
 				HandleButtonClick(w, e->we.click.widget);
 				SetWindowDirty(w);
 
-				_patches_newgame.starting_year = clamp(_patches_newgame.starting_year + e->we.click.widget - GLAND_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
+				_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year + e->we.click.widget - GLAND_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
 			}
 			_left_button_clicked = false;
 			break;
@@ -402,7 +402,7 @@
 				HandleButtonClick(w, e->we.click.widget);
 				SetWindowDirty(w);
 
-				_patches_newgame.snow_line_height = clamp(_patches_newgame.snow_line_height + e->we.click.widget - GLAND_SNOW_LEVEL_TEXT, 2, MAX_SNOWLINE_HEIGHT);
+				_patches_newgame.snow_line_height = Clamp(_patches_newgame.snow_line_height + e->we.click.widget - GLAND_SNOW_LEVEL_TEXT, 2, MAX_SNOWLINE_HEIGHT);
 			}
 			_left_button_clicked = false;
 			break;
@@ -494,11 +494,11 @@
 			switch (WP(w, generate_d).widget_id) {
 			case GLAND_START_DATE_TEXT:
 				InvalidateWidget(w, GLAND_START_DATE_TEXT);
-				_patches_newgame.starting_year = clamp(value, MIN_YEAR, MAX_YEAR);
+				_patches_newgame.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR);
 				break;
 			case GLAND_SNOW_LEVEL_TEXT:
 				InvalidateWidget(w, GLAND_SNOW_LEVEL_TEXT);
-				_patches_newgame.snow_line_height = clamp(value, 2, MAX_SNOWLINE_HEIGHT);
+				_patches_newgame.snow_line_height = Clamp(value, 2, MAX_SNOWLINE_HEIGHT);
 				break;
 			}
 
@@ -605,38 +605,38 @@
 	static const StringID mapsizes[] = {STR_64, STR_128, STR_256, STR_512, STR_1024, STR_2048, INVALID_STRING_ID};
 
 	switch (e->event) {
-	case WE_CREATE: LowerWindowWidget(w, _opt_newgame.landscape + CSCEN_TEMPERATE); break;
+	case WE_CREATE: w->LowerWidget(_opt_newgame.landscape + CSCEN_TEMPERATE); break;
 
 	case WE_PAINT:
-		SetWindowWidgetDisabledState(w, CSCEN_START_DATE_DOWN,       _patches_newgame.starting_year <= MIN_YEAR);
-		SetWindowWidgetDisabledState(w, CSCEN_START_DATE_UP,         _patches_newgame.starting_year >= MAX_YEAR);
-		SetWindowWidgetDisabledState(w, CSCEN_FLAT_LAND_HEIGHT_DOWN, _patches_newgame.se_flat_world_height <= 0);
-		SetWindowWidgetDisabledState(w, CSCEN_FLAT_LAND_HEIGHT_UP,   _patches_newgame.se_flat_world_height >= MAX_TILE_HEIGHT);
+		w->SetWidgetDisabledState(CSCEN_START_DATE_DOWN,       _patches_newgame.starting_year <= MIN_YEAR);
+		w->SetWidgetDisabledState(CSCEN_START_DATE_UP,         _patches_newgame.starting_year >= MAX_YEAR);
+		w->SetWidgetDisabledState(CSCEN_FLAT_LAND_HEIGHT_DOWN, _patches_newgame.se_flat_world_height <= 0);
+		w->SetWidgetDisabledState(CSCEN_FLAT_LAND_HEIGHT_UP,   _patches_newgame.se_flat_world_height >= MAX_TILE_HEIGHT);
 
-		SetWindowWidgetLoweredState(w, CSCEN_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
-		SetWindowWidgetLoweredState(w, CSCEN_ARCTIC,    _opt_newgame.landscape == LT_ARCTIC);
-		SetWindowWidgetLoweredState(w, CSCEN_TROPICAL,  _opt_newgame.landscape == LT_TROPIC);
-		SetWindowWidgetLoweredState(w, CSCEN_TOYLAND,   _opt_newgame.landscape == LT_TOYLAND);
+		w->SetWidgetLoweredState(CSCEN_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
+		w->SetWidgetLoweredState(CSCEN_ARCTIC,    _opt_newgame.landscape == LT_ARCTIC);
+		w->SetWidgetLoweredState(CSCEN_TROPICAL,  _opt_newgame.landscape == LT_TROPIC);
+		w->SetWidgetLoweredState(CSCEN_TOYLAND,   _opt_newgame.landscape == LT_TOYLAND);
 		DrawWindowWidgets(w);
 
-		DrawStringRightAligned(211, 97, STR_MAPSIZE, 0);
-		DrawString(            221, 97, mapsizes[_patches_newgame.map_x - 6], 0x10);
-		DrawStringCentered(    272, 97, STR_BY, 0);
-		DrawString(            284, 97, mapsizes[_patches_newgame.map_y - 6], 0x10);
+		DrawStringRightAligned(211, 97, STR_MAPSIZE, TC_FROMSTRING);
+		DrawString(            221, 97, mapsizes[_patches_newgame.map_x - 6], TC_BLACK);
+		DrawStringCentered(    272, 97, STR_BY, TC_FROMSTRING);
+		DrawString(            284, 97, mapsizes[_patches_newgame.map_y - 6], TC_BLACK);
 
-		DrawStringRightAligned(211, 115, STR_DATE, 0);
+		DrawStringRightAligned(211, 115, STR_DATE, TC_FROMSTRING);
 		SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
-		DrawStringCentered(271, 115, STR_GENERATE_DATE, 0);
+		DrawStringCentered(271, 115, STR_GENERATE_DATE, TC_FROMSTRING);
 
-		DrawStringRightAligned(278, 133, STR_FLAT_WORLD_HEIGHT, 0);
+		DrawStringRightAligned(278, 133, STR_FLAT_WORLD_HEIGHT, TC_FROMSTRING);
 		SetDParam(0, _patches_newgame.se_flat_world_height);
-		DrawStringCentered(303, 133, STR_FLAT_WORLD_HEIGHT_NUM, 0x10);
+		DrawStringCentered(303, 133, STR_FLAT_WORLD_HEIGHT_NUM, TC_BLACK);
 
 		break;
 	case WE_CLICK:
 		switch (e->we.click.widget) {
 		case CSCEN_TEMPERATE: case CSCEN_ARCTIC: case CSCEN_TROPICAL: case CSCEN_TOYLAND:
-			RaiseWindowWidget(w, _opt_newgame.landscape + CSCEN_TEMPERATE);
+			w->RaiseWidget(_opt_newgame.landscape + CSCEN_TEMPERATE);
 			SetNewLandscapeType(e->we.click.widget - CSCEN_TEMPERATE);
 			break;
 		case CSCEN_MAPSIZE_X_TEXT: case CSCEN_MAPSIZE_X_PULLDOWN: // Mapsize X
@@ -657,7 +657,7 @@
 				HandleButtonClick(w, e->we.click.widget);
 				SetWindowDirty(w);
 
-				_patches_newgame.starting_year = clamp(_patches_newgame.starting_year + e->we.click.widget - CSCEN_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
+				_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year + e->we.click.widget - CSCEN_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
 			}
 			_left_button_clicked = false;
 			break;
@@ -672,7 +672,7 @@
 				HandleButtonClick(w, e->we.click.widget);
 				SetWindowDirty(w);
 
-				_patches_newgame.se_flat_world_height = clamp(_patches_newgame.se_flat_world_height + e->we.click.widget - CSCEN_FLAT_LAND_HEIGHT_TEXT, 0, MAX_TILE_HEIGHT);
+				_patches_newgame.se_flat_world_height = Clamp(_patches_newgame.se_flat_world_height + e->we.click.widget - CSCEN_FLAT_LAND_HEIGHT_TEXT, 0, MAX_TILE_HEIGHT);
 			}
 			_left_button_clicked = false;
 			break;
@@ -699,11 +699,11 @@
 			switch (WP(w, generate_d).widget_id) {
 			case CSCEN_START_DATE_TEXT:
 				InvalidateWidget(w, CSCEN_START_DATE_TEXT);
-				_patches_newgame.starting_year = clamp(value, MIN_YEAR, MAX_YEAR);
+				_patches_newgame.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR);
 				break;
 			case CSCEN_FLAT_LAND_HEIGHT_TEXT:
 				InvalidateWidget(w, CSCEN_FLAT_LAND_HEIGHT_TEXT);
-				_patches_newgame.se_flat_world_height = clamp(value, 0, MAX_TILE_HEIGHT);
+				_patches_newgame.se_flat_world_height = Clamp(value, 0, MAX_TILE_HEIGHT);
 				break;
 			}
 
@@ -807,15 +807,15 @@
 		DrawFrameRect(19, 20, (w->width - 18), 37, 14, FR_BORDERONLY);
 		DrawFrameRect(20, 21, (int)((w->width - 40) * _tp.percent / 100) + 20, 36, 10, FR_NONE);
 		SetDParam(0, _tp.percent);
-		DrawStringCentered(90, 25, STR_PROGRESS, 0);
+		DrawStringCentered(90, 25, STR_PROGRESS, TC_FROMSTRING);
 
 		/* Tell which class we are generating */
-		DrawStringCentered(90, 46, _tp.cls, 0);
+		DrawStringCentered(90, 46, _tp.cls, TC_FROMSTRING);
 
 		/* And say where we are in that class */
 		SetDParam(0, _tp.current);
 		SetDParam(1, _tp.total);
-		DrawStringCentered(90, 58, STR_GENERATION_PROGRESS, 0);
+		DrawStringCentered(90, 58, STR_GENERATION_PROGRESS, TC_FROMSTRING);
 
 		SetWindowDirty(w);
 		break;
--- a/src/gfx.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/gfx.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -105,8 +105,8 @@
 
 	dst = blitter->MoveTo(dpi->dst_ptr, left, top);
 
-	if (!HASBIT(color, PALETTE_MODIFIER_GREYOUT)) {
-		if (!HASBIT(color, USE_COLORTABLE)) {
+	if (!HasBit(color, PALETTE_MODIFIER_GREYOUT)) {
+		if (!HasBit(color, USE_COLORTABLE)) {
 			blitter->DrawRect(dst, right, bottom, (uint8)color);
 		} else {
 			blitter->DrawColorMappingRect(dst, right, bottom, GB(color, 0, PALETTE_WIDTH));
@@ -562,7 +562,7 @@
  * @param x offset from left side of the screen, if negative offset from the right side
  * @param y offset from top side of the screen, if negative offset from the bottom
  * @param real_color colour of the string, see _string_colormap in
- * table/palettes.h or docs/ottd-colourtext-palette.png
+ * table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx.h
  * @return the x-coordinates where the drawing has finished. If nothing is drawn
  * the originally passed x-coordinate is returned */
 int DoDrawString(const char *string, int x, int y, uint16 real_color)
@@ -654,7 +654,7 @@
 
 void DrawSprite(SpriteID img, SpriteID pal, int x, int y, const SubSprite *sub)
 {
-	if (HASBIT(img, PALETTE_MODIFIER_TRANSPARENT)) {
+	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, sub);
 	} else if (pal != PAL_NONE) {
@@ -1015,8 +1015,8 @@
 void DrawDirtyBlocks()
 {
 	byte *b = _dirty_blocks;
-	const int w = ALIGN(_screen.width, 64);
-	const int h = ALIGN(_screen.height, 8);
+	const int w = Align(_screen.width, 64);
+	const int h = Align(_screen.height, 8);
 	int x;
 	int y;
 
--- a/src/gfx.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/gfx.h	Mon Dec 03 23:39:38 2007 +0000
@@ -361,6 +361,28 @@
 	COLOUR_WHITE
 };
 
+/** Colour of the strings, see _string_colormap in table/palettes.h or docs/ottd-colourtext-palette.png */
+enum TextColour {
+	TC_FROMSTRING  = 0x00,
+	TC_BLUE        = 0x00,
+	TC_SILVER      = 0x01,
+	TC_GOLD        = 0x02,
+	TC_RED         = 0x03,
+	TC_PURPLE      = 0x04,
+	TC_LIGHT_BROWN = 0x05,
+	TC_ORANGE      = 0x06,
+	TC_GREEN       = 0x07,
+	TC_YELLOW      = 0x08,
+	TC_DARK_GREEN  = 0x09,
+	TC_CREAM       = 0x0A,
+	TC_BROWN       = 0x0B,
+	TC_WHITE       = 0x0C,
+	TC_LIGHT_BLUE  = 0x0D,
+	TC_GREY        = 0x0E,
+	TC_DARK_BLUE   = 0x0F,
+	TC_BLACK       = 0x10,
+};
+
 /**
  * All 16 colour gradients
  * 8 colours per gradient from darkest (0) to lightest (7)
--- a/src/gfxinit.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/gfxinit.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -11,6 +11,7 @@
 #include "spritecache.h"
 #include "table/sprites.h"
 #include "fileio.h"
+#include "fios.h"
 #include "string.h"
 #include "newgrf.h"
 #include "md5.h"
@@ -24,13 +25,11 @@
 };
 
 struct FileList {
-	MD5File basic[4];          ///< grf files that always have to be loaded
-	MD5File landscape[3];      ///< landscape specific grf files
-};
-
-enum {
-	SKIP = 0xFFFE,
-	END  = 0xFFFF
+	MD5File basic[2];     ///< GRF files that always have to be loaded
+	MD5File landscape[3]; ///< Landscape specific grf files
+	MD5File sound;        ///< Sound samples
+	MD5File chars;        ///< GRF File with character replacements
+	MD5File openttd;      ///< GRF File with OTTD specific graphics
 };
 
 #include "table/files.h"
@@ -42,15 +41,7 @@
 	_landscape_spriteindexes_3,
 };
 
-static const SpriteID * const _slopes_spriteindexes[] = {
-	_slopes_spriteindexes_0,
-	_slopes_spriteindexes_1,
-	_slopes_spriteindexes_2,
-	_slopes_spriteindexes_3,
-};
-
-
-static uint LoadGrfFile(const char* filename, uint load_index, int file_index)
+static uint LoadGrfFile(const char *filename, uint load_index, int file_index)
 {
 	uint load_index_org = load_index;
 	uint sprite_id = 0;
@@ -72,47 +63,47 @@
 }
 
 
+void LoadSpritesIndexed(int file_index, uint *sprite_id, const SpriteID *index_tbl)
+{
+	uint start;
+	while ((start = *index_tbl++) != END) {
+		uint end = *index_tbl++;
+
+		if (start == SKIP) { // skip sprites (amount in second var)
+			SkipSprites(end);
+			(*sprite_id) += end;
+		} else { // load sprites and use indexes from start to end
+			do {
+			#ifdef NDEBUG
+				LoadNextSprite(start, file_index, *sprite_id);
+			#else
+				bool b = LoadNextSprite(start, file_index, *sprite_id);
+				assert(b);
+			#endif
+				(*sprite_id)++;
+			} while (++start <= end);
+		}
+	}
+}
+
 static void LoadGrfIndexed(const char* filename, const SpriteID* index_tbl, int file_index)
 {
-	uint start;
 	uint sprite_id = 0;
 
 	FioOpenFile(file_index, filename);
 
 	DEBUG(sprite, 2, "Reading indexed grf-file '%s'", filename);
 
-	while ((start = *index_tbl++) != END) {
-		uint end = *index_tbl++;
-
-		if (start == SKIP) { // skip sprites (amount in second var)
-			SkipSprites(end);
-			sprite_id += end;
-		} else { // load sprites and use indexes from start to end
-			do {
-			#ifdef NDEBUG
-				LoadNextSprite(start, file_index, sprite_id);
-			#else
-				bool b = LoadNextSprite(start, file_index, sprite_id);
-				assert(b);
-			#endif
-				sprite_id++;
-			} while (++start <= end);
-		}
-	}
+	LoadSpritesIndexed(file_index, &sprite_id, index_tbl);
 }
 
 
-/* Check that the supplied MD5 hash matches that stored for the supplied filename */
-static bool CheckMD5Digest(const MD5File file, md5_byte_t *digest, bool warn)
-{
-	if (memcmp(file.hash, digest, sizeof(file.hash)) == 0) return true;
-	if (warn) fprintf(stderr, "MD5 of %s is ****INCORRECT**** - File Corrupt.\n", file.filename);
-	return false;
-}
-
-/* Calculate and check the MD5 hash of the supplied filename.
- * returns true if the checksum is correct */
-static bool FileMD5(const MD5File file, bool warn)
+/**
+ * Calculate and check the MD5 hash of the supplied filename.
+ * @param file filename and expected MD5 hash for the given filename.
+ * @return true if the checksum is correct.
+ */
+static bool FileMD5(const MD5File file)
 {
 	size_t size;
 	FILE *f = FioFOpenFile(file.filename, "rb", DATA_DIR, &size);
@@ -129,53 +120,38 @@
 			md5_append(&filemd5state, buffer, len);
 		}
 
-		if (ferror(f) && warn) ShowInfoF("Error Reading from %s \n", file.filename);
 		FioFCloseFile(f);
 
 		md5_finish(&filemd5state, digest);
-		return CheckMD5Digest(file, digest, warn);
+		return memcmp(file.hash, digest, sizeof(file.hash)) == 0;
 	} else { // file not found
 		return false;
 	}
 }
 
-/* Checks, if either the Windows files exist (TRG1R.GRF) or the DOS files (TRG1.GRF)
- * by comparing the MD5 checksums of the files. _use_dos_palette is set accordingly.
- * If neither are found, Windows palette is assumed.
- *
- * (Note: Also checks sample.cat for corruption) */
-void CheckExternalFiles()
+/**
+ * Determine the palette that has to be used.
+ *  - forced DOS palette via command line -> leave it that way
+ *  - all Windows files present -> Windows palette
+ *  - all DOS files present -> DOS palette
+ *  - no Windows files present and any DOS file present -> DOS palette
+ *  - otherwise -> Windows palette
+ */
+static void DeterminePalette()
 {
-	uint i;
-	/* count of files from this version */
+	if (_use_dos_palette) return;
+
+	/* Count of files from the different versions. */
 	uint dos = 0;
 	uint win = 0;
 
-	for (i = 0; i < 2; i++) if (FileMD5(files_dos.basic[i], true)) dos++;
-	for (i = 0; i < 3; i++) if (FileMD5(files_dos.landscape[i], true)) dos++;
-
-	for (i = 0; i < 2; i++) if (FileMD5(files_win.basic[i], true)) win++;
-	for (i = 0; i < 3; i++) if (FileMD5(files_win.landscape[i], true)) win++;
-
-	if (!FileMD5(sample_cat_win, false) && !FileMD5(sample_cat_dos, false))
-		ShowInfo("Your 'sample.cat' file is corrupted or missing!");
+	for (uint i = 0; i < lengthof(files_dos.basic); i++) if (FioCheckFileExists(files_dos.basic[i].filename)) dos++;
+	for (uint i = 0; i < lengthof(files_dos.landscape); i++) if (FioCheckFileExists(files_dos.landscape[i].filename)) dos++;
 
-	for (i = 0; i < lengthof(files_openttd); i++) {
-		if (!FileMD5(files_openttd[i], false)) {
-			ShowInfoF("Your '%s' file is corrupted or missing!", files_openttd[i].filename);
-		}
-	}
+	for (uint i = 0; i < lengthof(files_win.basic); i++) if (FioCheckFileExists(files_win.basic[i].filename)) win++;
+	for (uint i = 0; i < lengthof(files_win.landscape); i++) if (FioCheckFileExists(files_win.landscape[i].filename)) win++;
 
-	/*
-	 * forced DOS palette via command line -> leave it that way
-	 * all Windows files present -> Windows palette
-	 * all DOS files present -> DOS palette
-	 * no Windows files present and any DOS file present -> DOS palette
-	 * otherwise -> Windows palette
-	 */
-	if (_use_dos_palette) {
-		return;
-	} else if (win == 5) {
+	if (win == 5) {
 		_use_dos_palette = false;
 	} else if (dos == 5 || (win == 0 && dos > 0)) {
 		_use_dos_palette = true;
@@ -184,6 +160,48 @@
 	}
 }
 
+/**
+ * Checks whether the MD5 checksums of the files are correct.
+ *
+ * @note Also checks sample.cat and other required non-NewGRF GRFs for corruption.
+ */
+void CheckExternalFiles()
+{
+	DeterminePalette();
+
+	static const size_t ERROR_MESSAGE_LENGTH = 128;
+	const FileList *files = _use_dos_palette ? &files_dos : &files_win;
+	char error_msg[ERROR_MESSAGE_LENGTH * (lengthof(files->basic) + lengthof(files->landscape) + 3)];
+	error_msg[0] = '\0';
+	char *add_pos = error_msg;
+
+	for (uint i = 0; i < lengthof(files->basic); i++) {
+		if (!FileMD5(files->basic[i])) {
+			add_pos += snprintf(add_pos, ERROR_MESSAGE_LENGTH, "Your '%s' file is corrupted or missing! You can find '%s' on your Transport Tycoon Deluxe CD-ROM.\n", files->basic[i].filename, files->basic[i].filename);
+		}
+	}
+
+	for (uint i = 0; i < lengthof(files->landscape); i++) {
+		if (!FileMD5(files->landscape[i])) {
+			add_pos += snprintf(add_pos, ERROR_MESSAGE_LENGTH, "Your '%s' file is corrupted or missing! You can find '%s' on your Transport Tycoon Deluxe CD-ROM.\n", files->landscape[i].filename, files->landscape[i].filename);
+		}
+	}
+
+	if (!FileMD5(files_win.sound) && !FileMD5(files_dos.sound)) {
+		add_pos += snprintf(add_pos, ERROR_MESSAGE_LENGTH, "Your 'sample.cat' file is corrupted or missing! You can find 'sample.cat' on your Transport Tycoon Deluxe CD-ROM.\n");
+	}
+
+	if (!FileMD5(files->chars)) {
+		add_pos += snprintf(add_pos, ERROR_MESSAGE_LENGTH, "Your '%s' file is corrupted or missing! The file was part of your installation.\n", files->chars.filename);
+	}
+
+	if (!FileMD5(files->openttd)) {
+		add_pos += snprintf(add_pos, ERROR_MESSAGE_LENGTH, "Your '%s' file is corrupted or missing! The file was part of your installation.\n", files->openttd.filename);
+	}
+
+	if (add_pos != error_msg) ShowInfoF(error_msg);
+}
+
 
 static const SpriteID trg1idx[] = {
 	   0,    1, ///< Mouse cursor, ZZZ
@@ -265,22 +283,15 @@
 	END
 };
 
-/* NOTE: When adding a normal sprite, increase OPENTTD_SPRITES_COUNT with the
- * amount of sprites and add them to the end of the list, with the index of
- * the old sprite-count offset from SPR_OPENTTD_BASE. With this there is no
- * correspondence of any kind with the ID's in the grf file, but results in
- * a maximum use of sprite slots. */
-static const SpriteID _openttd_grf_indexes[] = {
-	SPR_IMG_AUTORAIL, SPR_CURSOR_WAYPOINT, // icons etc
-	134, 134,  ///< euro symbol medium size
-	582, 582,  ///<  euro symbol large size
-	358, 358,  ///<  euro symbol tiny
-	SPR_CURSOR_CANAL, SPR_IMG_FASTFORWARD, // more icons
+/** Replace some letter sprites with some other letters */
+static const SpriteID _chars_grf_indexes[] = {
+	134, 134, ///<  euro symbol medium size
+	582, 582, ///<  euro symbol large size
+	358, 358, ///<  euro symbol tiny
 	648, 648, ///<  nordic char: æ
 	616, 616, ///<  nordic char: Æ
 	666, 666, ///<  nordic char: ø
 	634, 634, ///<  nordic char: Ø
-	SPR_PIN_UP, SPR_CURSOR_CLONE_TRAIN, // more icons
 	382, 383, ///<  Œ œ tiny
 	158, 159, ///<  Œ œ medium
 	606, 607, ///<  Œ œ large
@@ -306,39 +317,42 @@
 	317, 320, ///<  { | } ~ tiny
 	 93,  96, ///<  { | } ~ medium
 	541, 544, ///<  { | } ~ large
-	SPR_HOUSE_ICON, SPR_HOUSE_ICON,
 	585, 585, ///<  § large
 	587, 587, ///<  © large
 	592, 592, ///<  ® large
 	594, 597, ///<  ° ± ² ³ large
 	633, 633, ///<  × large
 	665, 665, ///<  ÷ large
-	SPR_SELL_TRAIN, SPR_SHARED_ORDERS_ICON,
 	377, 377, ///<  · small
 	153, 153, ///<  · medium
 	601, 601, ///<  · large
-	SPR_WARNING_SIGN, SPR_WARNING_SIGN,
 	END
 };
 
 
 static void LoadSpriteTables()
 {
-	const FileList* files = _use_dos_palette ? &files_dos : &files_win;
-	uint load_index;
-	uint i;
+	const FileList *files = _use_dos_palette ? &files_dos : &files_win;
+	uint i = FIRST_GRF_SLOT;
 
-	LoadGrfIndexed(files->basic[0].filename, trg1idx, 0);
+	LoadGrfIndexed(files->basic[0].filename, trg1idx, i++);
 	DupSprite(  2, 130); // non-breaking space medium
 	DupSprite(226, 354); // non-breaking space tiny
 	DupSprite(450, 578); // non-breaking space large
-	load_index = 4793;
 
-	for (i = 1; files->basic[i].filename != NULL; i++) {
-		load_index += LoadGrfFile(files->basic[i].filename, load_index, i);
-	}
+	/*
+	 * The second basic file always starts at the given location and does
+	 * contain a different amount of sprites depending on the "type"; DOS
+	 * has a few sprites less. However, we do not care about those missing
+	 * sprites as they are not shown anyway (logos in intro game).
+	 */
+	LoadGrfFile(files->basic[1].filename, 4793, i++);
 
-	/* Load additional sprites for climates other than temperate */
+	/*
+	 * Load additional sprites for climates other than temperate.
+	 * This overwrites some of the temperate sprites, such as foundations
+	 * and the ground sprites.
+	 */
 	if (_opt.landscape != LT_TEMPERATE) {
 		LoadGrfIndexed(
 			files->landscape[_opt.landscape - 1].filename,
@@ -347,52 +361,29 @@
 		);
 	}
 
-	assert(load_index == SPR_SIGNALS_BASE);
-	load_index += LoadGrfFile("nsignalsw.grf", load_index, i++);
-
-	assert(load_index == SPR_CANALS_BASE);
-	load_index += LoadGrfFile("canalsw.grf", load_index, i++);
-
-	assert(load_index == SPR_SLOPES_BASE);
-	LoadGrfIndexed("trkfoundw.grf", _slopes_spriteindexes[_opt.landscape], i++);
-
-	load_index = SPR_AUTORAIL_BASE;
-	load_index += LoadGrfFile("autorail.grf", load_index, i++);
-
-	assert(load_index == SPR_ELRAIL_BASE);
-	load_index += LoadGrfFile("elrailsw.grf", load_index, i++);
-
-	assert(load_index == SPR_2CCMAP_BASE);
-	load_index += LoadGrfFile("2ccmap.grf", load_index, i++);
-
-	assert(load_index == SPR_OPENTTD_BASE);
-	LoadGrfIndexed("openttd.grf", _openttd_grf_indexes, i++);
-	load_index = SPR_OPENTTD_BASE + OPENTTD_SPRITES_COUNT;
-
-	assert(load_index == SPR_AIRPORTX_BASE);
-	load_index += LoadGrfFile("airports.grf", load_index, i++);
-
-	assert(load_index == SPR_ROADSTOP_BASE);
-	load_index += LoadGrfFile("roadstops.grf", load_index, i++);
-
-	assert(load_index == SPR_GROUP_BASE);
-	load_index += LoadGrfFile("group.grf", load_index, i++);
-
-	assert(load_index == SPR_TRAMWAY_BASE);
-	load_index += LoadGrfFile("tramtrkw.grf", load_index, i++);
-
-	assert(load_index == SPR_ONEWAY_BASE);
-	load_index += LoadGrfFile("oneway.grf", load_index, i++);
-
-	load_index++; // SPR_EMPTY_BOUNDING_BOX
-
-	assert(load_index == SPR_FLAGS_BASE);
-	load_index += LoadGrfFile("flags.grf", load_index, i++);
+	LoadGrfIndexed(files->chars.filename, _chars_grf_indexes, i++);
 
 	/* Initialize the unicode to sprite mapping table */
 	InitializeUnicodeGlyphMap();
 
-	LoadNewGRF(load_index, i);
+	/*
+	 * Load the base NewGRF with OTTD required graphics as first NewGRF.
+	 * However, we do not want it to show up in the list of used NewGRFs,
+	 * so we have to manually add it, and then remove it later.
+	 */
+	GRFConfig *top = _grfconfig;
+	GRFConfig *master = CallocT<GRFConfig>(1);
+	master->filename = strdup(files->openttd.filename);
+	FillGRFDetails(master, false);
+	ClrBit(master->flags, GCF_INIT_ONLY);
+	master->next = top;
+	_grfconfig = master;
+
+	LoadNewGRF(SPR_NEWGRFS_BASE, i);
+
+	/* Free and remove the top element. */
+	ClearGRFConfig(&master);
+	_grfconfig = top;
 }
 
 
--- a/src/gfxinit.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/gfxinit.h	Mon Dec 03 23:39:38 2007 +0000
@@ -7,5 +7,6 @@
 
 void CheckExternalFiles();
 void GfxLoadSprites();
+void LoadSpritesIndexed(int file_index, uint *sprite_id, const SpriteID *index_tbl);
 
 #endif /* GFXINIT_H */
--- a/src/graph_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/graph_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -28,7 +28,7 @@
 
 enum {
 	GRAPH_MAX_DATASETS = 32,
-	GRAPH_AXIS_LABEL_COLOUR = 16,
+	GRAPH_AXIS_LABEL_COLOUR = TC_BLACK,
 	GRAPH_AXIS_LINE_COLOUR  = 215,
 
 	GRAPH_X_POSITION_BEGINNING  = 44,  ///< Start the graph 44 pixels from gw->left
@@ -41,8 +41,8 @@
 };
 
 /* Apparently these don't play well with enums. */
-static const int64 INVALID_DATAPOINT     = INT64_MAX; // Value used for a datapoint that shouldn't be drawn.
-static const uint  INVALID_DATAPOINT_POS = UINT_MAX;  // Used to determine if the previous point was drawn.
+static const OverflowSafeInt64 INVALID_DATAPOINT = INT64_MAX; // Value used for a datapoint that shouldn't be drawn.
+static const uint INVALID_DATAPOINT_POS = UINT_MAX;  // Used to determine if the previous point was drawn.
 
 struct GraphDrawer {
 	uint excluded_data; ///< bitmask of the datasets that shouldn't be displayed.
@@ -65,14 +65,14 @@
 	uint height;    ///< The height of the graph in pixels.
 	StringID format_str_y_axis;
 	byte colors[GRAPH_MAX_DATASETS];
-	Money cost[GRAPH_MAX_DATASETS][24]; ///< last 2 years
+	OverflowSafeInt64 cost[GRAPH_MAX_DATASETS][24]; ///< last 2 years
 };
 
 static void DrawGraph(const GraphDrawer *gw)
 {
-	uint x, y;            ///< Reused whenever x and y coordinates are needed.
-	int64 highest_value;  ///< Highest value to be drawn.
-	int x_axis_offset;    ///< Distance from the top of the graph to the x axis.
+	uint x, y;                       ///< Reused whenever x and y coordinates are needed.
+	OverflowSafeInt64 highest_value; ///< Highest value to be drawn.
+	int x_axis_offset;               ///< Distance from the top of the graph to the x axis.
 
 	/* the colors and cost array of GraphDrawer must accomodate
 	 * both values for cargo and players. So if any are higher, quit */
@@ -131,15 +131,15 @@
 	highest_value = x_axis_offset * 2;
 
 	for (int i = 0; i < gw->num_dataset; i++) {
-		if (!HASBIT(gw->excluded_data, i)) {
+		if (!HasBit(gw->excluded_data, i)) {
 			for (int j = 0; j < gw->num_on_x_axis; j++) {
-				Money datapoint = gw->cost[i][j];
+				OverflowSafeInt64 datapoint = gw->cost[i][j];
 
 				if (datapoint != INVALID_DATAPOINT) {
 					/* For now, if the graph has negative values the scaling is
 					 * symmetrical about the x axis, so take the absolute value
 					 * of each data point. */
-					highest_value = max(highest_value, myabs(datapoint));
+					highest_value = max(highest_value, abs(datapoint));
 				}
 			}
 		}
@@ -206,7 +206,7 @@
 
 	/* draw lines and dots */
 	for (int i = 0; i < gw->num_dataset; i++) {
-		if (!HASBIT(gw->excluded_data, i)) {
+		if (!HasBit(gw->excluded_data, i)) {
 			/* Centre the dot between the grid lines. */
 			x = gw->left + GRAPH_X_POSITION_BEGINNING + (GRAPH_X_POSITION_SEPARATION / 2);
 
@@ -215,12 +215,31 @@
 			uint prev_y = INVALID_DATAPOINT_POS;
 
 			for (int j = 0; j < gw->num_on_x_axis; j++) {
-				Money datapoint = gw->cost[i][j];
+				OverflowSafeInt64 datapoint = gw->cost[i][j];
 
 				if (datapoint != INVALID_DATAPOINT) {
-					/* XXX: This can overflow if x_axis_offset * datapoint is
-					 * too big to fit in an int64. */
-					y = gw->top + x_axis_offset - (x_axis_offset * datapoint) / highest_value;
+					/*
+					 * Check whether we need to reduce the 'accuracy' of the
+					 * datapoint value and the highest value to splut overflows.
+					 * And when 'drawing' 'one million' or 'one million and one'
+					 * there is no significant difference, so the least
+					 * significant bits can just be removed.
+					 *
+					 * If there are more bits needed than would fit in a 32 bits
+					 * integer, so at about 31 bits because of the sign bit, the
+					 * least significant bits are removed.
+					 */
+					int mult_range = FindLastBit(x_axis_offset) + FindLastBit(abs(datapoint));
+					int reduce_range = max(mult_range - 31, 0);
+
+					/* Handle negative values differently (don't shift sign) */
+					if (datapoint < 0) {
+						datapoint = -(abs(datapoint) >> reduce_range);
+					} else {
+						datapoint >>= reduce_range;
+					}
+
+					y = gw->top + x_axis_offset - (x_axis_offset * datapoint) / (highest_value >> reduce_range);
 
 					/* Draw the point. */
 					GfxFillRect(x - 1, y - 1, x + 1, y + 1, color);
@@ -250,7 +269,7 @@
 	switch (e->event) {
 		case WE_CREATE:
 			for (uint i = 3; i < w->widget_count; i++) {
-				if (!HASBIT(_legend_excluded_players, i - 3)) LowerWindowWidget(w, i);
+				if (!HasBit(_legend_excluded_players, i - 3)) w->LowerWidget(i);
 			}
 			break;
 
@@ -260,8 +279,8 @@
 			FOR_ALL_PLAYERS(p) {
 				if (p->is_active) continue;
 
-				SETBIT(_legend_excluded_players, p->index);
-				RaiseWindowWidget(w, p->index + 3);
+				SetBit(_legend_excluded_players, p->index);
+				w->RaiseWidget(p->index + 3);
 			}
 
 			DrawWindowWidgets(w);
@@ -273,16 +292,16 @@
 
 				SetDParam(0, p->index);
 				SetDParam(1, p->index);
-				DrawString(21, 17 + p->index * 12, STR_7021, HASBIT(_legend_excluded_players, p->index) ? 0x10 : 0xC);
+				DrawString(21, 17 + p->index * 12, STR_7021, HasBit(_legend_excluded_players, p->index) ? TC_BLACK : TC_WHITE);
 			}
 			break;
 		}
 
 		case WE_CLICK:
-			if (!IS_INT_INSIDE(e->we.click.widget, 3, 11)) return;
+			if (!IsInsideMM(e->we.click.widget, 3, 11)) return;
 
-			TOGGLEBIT(_legend_excluded_players, e->we.click.widget - 3);
-			ToggleWidgetLoweredState(w, e->we.click.widget);
+			ToggleBit(_legend_excluded_players, e->we.click.widget - 3);
+			w->ToggleWidgetLoweredState(e->we.click.widget);
 			SetWindowDirty(w);
 			InvalidateWindow(WC_INCOME_GRAPH, 0);
 			InvalidateWindow(WC_OPERATING_PROFIT, 0);
@@ -334,7 +353,7 @@
 
 	/* Exclude the players which aren't valid */
 	FOR_ALL_PLAYERS(p) {
-		if (!p->is_active) SETBIT(excluded_players, p->index);
+		if (!p->is_active) SetBit(excluded_players, p->index);
 	}
 	gd->excluded_data = excluded_players;
 	gd->num_vert_lines = 24;
@@ -515,7 +534,7 @@
 				if (p->is_active) {
 					gd.colors[numd] = _colour_gradient[p->player_color][6];
 					for (int j = gd.num_on_x_axis, i = 0; --j >= 0;) {
-						gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_DATAPOINT : p->old_economy[j].delivered_cargo;
+						gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_DATAPOINT : (OverflowSafeInt64)p->old_economy[j].delivered_cargo;
 						i++;
 					}
 				}
@@ -582,7 +601,7 @@
 				if (p->is_active) {
 					gd.colors[numd] = _colour_gradient[p->player_color][6];
 					for (int j = gd.num_on_x_axis, i = 0; --j >= 0;) {
-						gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_DATAPOINT : p->old_economy[j].performance_history;
+						gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_DATAPOINT : (OverflowSafeInt64)p->old_economy[j].performance_history;
 						i++;
 					}
 				}
@@ -733,12 +752,12 @@
 					 * both the text and the colored box have to be manually painted.
 					 * clk_dif will move one pixel down and one pixel to the right
 					 * when the button is clicked */
-					byte clk_dif = IsWindowWidgetLowered(w, i + 3) ? 1 : 0;
+					byte clk_dif = w->IsWidgetLowered(i + 3) ? 1 : 0;
 
 					GfxFillRect(x + clk_dif, y + clk_dif, x + 8 + clk_dif, y + 5 + clk_dif, 0);
 					GfxFillRect(x + 1 + clk_dif, y + 1 + clk_dif, x + 7 + clk_dif, y + 4 + clk_dif, cs->legend_colour);
 					SetDParam(0, cs->name);
-					DrawString(x + 14 + clk_dif, y + clk_dif, STR_7065, 0);
+					DrawString(x + 14 + clk_dif, y + clk_dif, STR_7065, TC_FROMSTRING);
 					y += 8;
 				}
 
@@ -753,15 +772,15 @@
 
 			DrawGraph(&gd);
 
-			DrawString(2 + 46, 24 + gd.height + 7, STR_7062_DAYS_IN_TRANSIT, 0);
-			DrawString(2 + 84, 24 - 9, STR_7063_PAYMENT_FOR_DELIVERING, 0);
+			DrawString(2 + 46, 24 + gd.height + 7, STR_7062_DAYS_IN_TRANSIT, TC_FROMSTRING);
+			DrawString(2 + 84, 24 - 9, STR_7063_PAYMENT_FOR_DELIVERING, TC_FROMSTRING);
 			break;
 		}
 
 		case WE_CLICK:
 			if (e->we.click.widget >= 3) {
-				TOGGLEBIT(_legend_excluded_cargo, e->we.click.widget - 3);
-				ToggleWidgetLoweredState(w, e->we.click.widget);
+				ToggleBit(_legend_excluded_cargo, e->we.click.widget - 3);
+				w->ToggleWidgetLoweredState(e->we.click.widget);
 				SetWindowDirty(w);
 			}
 			break;
@@ -816,7 +835,7 @@
 		wi->data     = 0;
 		wi->tooltips = STR_7064_TOGGLE_GRAPH_FOR_CARGO;
 
-		if (!HASBIT(_legend_excluded_cargo, i)) LowerWindowWidget(w, i + 3);
+		if (!HasBit(_legend_excluded_cargo, i)) w->LowerWidget(i + 3);
 	}
 
 	SetWindowDirty(w);
@@ -879,7 +898,7 @@
 				SetDParam(2, p->index);
 				SetDParam(3, GetPerformanceTitleFromValue(p->old_economy[1].performance_history));
 
-				DrawString(2, 15 + i * 10, i == 0 ? STR_7054 : STR_7055, 0);
+				DrawString(2, 15 + i * 10, i == 0 ? STR_7054 : STR_7055, TC_FROMSTRING);
 				DrawPlayerIcon(p->index, 27, 16 + i * 10);
 			}
 
@@ -932,8 +951,8 @@
 			if (_performance_rating_detail_player == INVALID_PLAYER || !GetPlayer(_performance_rating_detail_player)->is_active) {
 				if (_performance_rating_detail_player != INVALID_PLAYER) {
 					/* Raise and disable the widget for the previous selection. */
-					RaiseWindowWidget(w, _performance_rating_detail_player + 13);
-					DisableWindowWidget(w, _performance_rating_detail_player + 13);
+					w->RaiseWidget(_performance_rating_detail_player + 13);
+					w->DisableWidget(_performance_rating_detail_player + 13);
 					SetWindowDirty(w);
 
 					_performance_rating_detail_player = INVALID_PLAYER;
@@ -942,7 +961,7 @@
 				for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
 					if (GetPlayer(i)->is_active) {
 						/* Lower the widget corresponding to this player. */
-						LowerWindowWidget(w, i + 13);
+						w->LowerWidget(i + 13);
 						SetWindowDirty(w);
 
 						_performance_rating_detail_player = i;
@@ -958,9 +977,9 @@
 			for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
 				if (!GetPlayer(i)->is_active) {
 					/* Check if we have the player as an active player */
-					if (!IsWindowWidgetDisabled(w, i + 13)) {
+					if (!w->IsWidgetDisabled(i + 13)) {
 						/* Bah, player gone :( */
-						DisableWindowWidget(w, i + 13);
+						w->DisableWidget(i + 13);
 
 						/* We need a repaint */
 						SetWindowDirty(w);
@@ -969,9 +988,9 @@
 				}
 
 				/* Check if we have the player marked as inactive */
-				if (IsWindowWidgetDisabled(w, i + 13)) {
+				if (w->IsWidgetDisabled(i + 13)) {
 					/* New player! Yippie :p */
-					EnableWindowWidget(w, i + 13);
+					w->EnableWidget(i + 13);
 					/* We need a repaint */
 					SetWindowDirty(w);
 				}
@@ -999,14 +1018,14 @@
 					total_score += score;
 				}
 
-				DrawString(7, y, STR_PERFORMANCE_DETAIL_VEHICLES + i, 0);
+				DrawString(7, y, STR_PERFORMANCE_DETAIL_VEHICLES + i, TC_FROMSTRING);
 
 				/* Draw the score */
 				SetDParam(0, score);
-				DrawStringRightAligned(107, y, SET_PERFORMANCE_DETAIL_INT, 0);
+				DrawStringRightAligned(107, y, SET_PERFORMANCE_DETAIL_INT, TC_FROMSTRING);
 
 				/* Calculate the %-bar */
-				x = clamp(val, 0, needed) * 50 / needed;
+				x = Clamp(val, 0, needed) * 50 / needed;
 
 				/* SCORE_LOAN is inversed */
 				if (val < 0 && i == SCORE_LOAN) x = 0;
@@ -1016,14 +1035,14 @@
 				if (x != 50) GfxFillRect(112 + x, y - 2, 112 + 50, y + 10, color_notdone);
 
 				/* Calculate the % */
-				x = clamp(val, 0, needed) * 100 / needed;
+				x = Clamp(val, 0, needed) * 100 / needed;
 
 				/* SCORE_LOAN is inversed */
 				if (val < 0 && i == SCORE_LOAN) x = 0;
 
 				/* Draw it */
 				SetDParam(0, x);
-				DrawStringCentered(137, y, STR_PERFORMANCE_DETAIL_PERCENT, 0);
+				DrawStringCentered(137, y, STR_PERFORMANCE_DETAIL_PERCENT, TC_FROMSTRING);
 
 				/* SCORE_LOAN is inversed */
 				if (i == SCORE_LOAN) val = needed - val;
@@ -1038,10 +1057,10 @@
 					case SCORE_MAX_INCOME:
 					case SCORE_MONEY:
 					case SCORE_LOAN:
-						DrawString(167, y, STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY, 0);
+						DrawString(167, y, STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY, TC_FROMSTRING);
 						break;
 					default:
-						DrawString(167, y, STR_PERFORMANCE_DETAIL_AMOUNT_INT, 0);
+						DrawString(167, y, STR_PERFORMANCE_DETAIL_AMOUNT_INT, TC_FROMSTRING);
 				}
 			}
 
@@ -1050,12 +1069,12 @@
 
 		case WE_CLICK:
 			/* Check which button is clicked */
-			if (IS_INT_INSIDE(e->we.click.widget, 13, 21)) {
+			if (IsInsideMM(e->we.click.widget, 13, 21)) {
 				/* Is it no on disable? */
-				if (!IsWindowWidgetDisabled(w, e->we.click.widget)) {
-					RaiseWindowWidget(w, _performance_rating_detail_player + 13);
+				if (!w->IsWidgetDisabled(e->we.click.widget)) {
+					w->RaiseWidget(_performance_rating_detail_player + 13);
 					_performance_rating_detail_player = (PlayerID)(e->we.click.widget - 13);
-					LowerWindowWidget(w, _performance_rating_detail_player + 13);
+					w->LowerWidget(_performance_rating_detail_player + 13);
 					SetWindowDirty(w);
 				}
 			}
@@ -1066,7 +1085,7 @@
 
 			/* Disable the players who are not active */
 			for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
-				SetWindowWidgetDisabledState(w, i + 13, !GetPlayer(i)->is_active);
+				w->SetWidgetDisabledState(i + 13, !GetPlayer(i)->is_active);
 			}
 			/* Update all player stats with the current data
 			 * (this is because _score_info is not saved to a savegame) */
@@ -1077,7 +1096,7 @@
 			w->custom[0] = DAY_TICKS;
 			w->custom[1] = 5;
 
-			if (_performance_rating_detail_player != INVALID_PLAYER) LowerWindowWidget(w, _performance_rating_detail_player + 13);
+			if (_performance_rating_detail_player != INVALID_PLAYER) w->LowerWidget(_performance_rating_detail_player + 13);
 			SetWindowDirty(w);
 
 			break;
--- a/src/group_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/group_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -339,7 +339,7 @@
 	if (g->owner != _current_player) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
-		g->replace_protection = HASBIT(p2, 0);
+		g->replace_protection = HasBit(p2, 0);
 
 		InvalidateWindowData(GetWCForVT(g->vehicle_type), (g->vehicle_type << 11) | VLW_GROUP_LIST | _current_player);
 	}
--- a/src/group_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/group_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -43,7 +43,7 @@
 	if (!(gl->l.flags & VL_REBUILD)) return;
 
 	list = MallocT<const Group*>(GetGroupArraySize());
-	if (list == NULL) {
+	if (GetGroupArraySize() != 0 && list == NULL) {
 		error("Could not allocate memory for the group-sorting-list");
 	}
 
@@ -143,9 +143,9 @@
 {  WWT_STICKYBOX,     RESIZE_LR,    14,   448,   459,     0,    13, 0x0,                  STR_STICKY_BUTTON},
 {      WWT_PANEL,   RESIZE_NONE,    14,     0,   200,    14,    25, 0x0,                  STR_NULL},
 {      WWT_PANEL,   RESIZE_NONE,    14,     0,   200,    26,    38, 0x0,                  STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,     0,   200,    39,    52, 0x0,                  STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,    14,     0,   200,    39,    51, 0x0,                  STR_NULL},
 {     WWT_MATRIX, RESIZE_BOTTOM,    14,     0,   188,    52,   168, 0x701,                STR_GROUPS_CLICK_ON_GROUP_FOR_TIP},
-{  WWT_SCROLLBAR, RESIZE_BOTTOM,    14,   189,   200,    26,   168, 0x0,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{  WWT_SCROLLBAR, RESIZE_BOTTOM,    14,   189,   200,    52,   168, 0x0,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},
 { WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   201,   281,    14,    25, STR_SORT_BY,          STR_SORT_ORDER_TIP},
 {      WWT_PANEL,   RESIZE_NONE,    14,   282,   435,    14,    25, 0x0,                  STR_SORT_CRITERIA_TIP},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,   436,   447,    14,    25, STR_0225,             STR_SORT_CRITERIA_TIP},
@@ -266,7 +266,7 @@
  */
 static void UpdateGroupActionDropdown(Window *w, GroupID gid, bool refresh = true)
 {
-	if (refresh && !IsWindowWidgetLowered(w, GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN)) return;
+	if (refresh && !w->IsWidgetLowered(GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN)) return;
 
 	static StringID action_str[] = {
 		STR_REPLACE_VEHICLES,
@@ -328,8 +328,21 @@
 			SetVScrollCount(w, gl->l.list_length);
 			SetVScroll2Count(w, gv->l.list_length);
 
+			/* The drop down menu is out, *but* it may not be used, retract it. */
+			if (gv->l.list_length == 0 && w->IsWidgetLowered(GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN)) {
+				w->RaiseWidget(GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN);
+				Window **w2;
+				FOR_ALL_WINDOWS(w2) {
+					if (w->window_class  == WP(*w2, dropdown_d).parent_wnd_class &&
+							w->window_number == WP(*w2, dropdown_d).parent_wnd_num) {
+						DeleteWindow(*w2);
+						break;
+					}
+				}
+			}
+
 			/* Disable all lists management button when the list is empty */
-			SetWindowWidgetsDisabledState(w, gv->l.list_length == 0 || _local_player != owner,
+			w->SetWidgetsDisabledState(gv->l.list_length == 0 || _local_player != owner,
 					GRP_WIDGET_STOP_ALL,
 					GRP_WIDGET_START_ALL,
 					GRP_WIDGET_MANAGE_VEHICLES,
@@ -337,7 +350,7 @@
 					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) || _local_player != owner,
+			w->SetWidgetsDisabledState(IsDefaultGroupID(gv->group_sel) || IsAllGroupID(gv->group_sel) || _local_player != owner,
 					GRP_WIDGET_DELETE_GROUP,
 					GRP_WIDGET_RENAME_GROUP,
 					GRP_WIDGET_REPLACE_PROTECTION,
@@ -349,7 +362,7 @@
 			 *  verify, whether you are the owner of the vehicle,
 			 *  so it doesn't have to be disabled
 			 */
-			SetWindowWidgetsDisabledState(w, _local_player != owner,
+			w->SetWidgetsDisabledState(_local_player != owner,
 					GRP_WIDGET_CREATE_GROUP,
 					GRP_WIDGET_AVAILABLE_VEHICLES,
 					WIDGET_LIST_END);
@@ -433,11 +446,11 @@
 					break;
 				default: NOT_REACHED(); break;
 			}
-			DrawString(10, y1, str_all_veh, IsAllGroupID(gv->group_sel) ? 12 : 16);
+			DrawString(10, y1, str_all_veh, IsAllGroupID(gv->group_sel) ? TC_WHITE : TC_BLACK);
 
 			y1 += 13;
 
-			DrawString(10, y1, str_no_group_veh, IsDefaultGroupID(gv->group_sel) ? 12 : 16);
+			DrawString(10, y1, str_no_group_veh, IsDefaultGroupID(gv->group_sel) ? TC_WHITE : TC_BLACK);
 
 			max = min(w->vscroll.pos + w->vscroll.cap, gl->l.list_length);
 			for (i = w->vscroll.pos ; i < max ; ++i) {
@@ -449,16 +462,16 @@
 
 				/* draw the selected group in white, else we draw it in black */
 				SetDParam(0, g->index);
-				DrawString(10, y1, STR_GROUP_NAME, (gv->group_sel == g->index) ? 12 : 16);
+				DrawString(10, y1, STR_GROUP_NAME, (gv->group_sel == g->index) ? TC_WHITE : TC_BLACK);
 
 				/* draw the number of vehicles of the group */
 				SetDParam(0, g->num_vehicle);
-				DrawStringRightAligned(187, y1 + 1, STR_GROUP_TINY_NUM, (gv->group_sel == g->index) ? 12 : 16);
+				DrawStringRightAligned(187, y1 + 1, STR_GROUP_TINY_NUM, (gv->group_sel == g->index) ? TC_WHITE : TC_BLACK);
 			}
 
 			/* Draw Matrix Vehicle according to the vehicle list built before */
-			DrawString(285, 15, _vehicle_sort_listing[gv->l.sort_type], 0x10);
-			DoDrawString(gv->l.flags & VL_DESC ? DOWNARROW : UPARROW, 269, 15, 0x10);
+			DrawString(285, 15, _vehicle_sort_listing[gv->l.sort_type], TC_BLACK);
+			DoDrawString(gv->l.flags & VL_DESC ? DOWNARROW : UPARROW, 269, 15, TC_BLACK);
 
 			max = min(w->vscroll2.pos + w->vscroll2.cap, gv->l.list_length);
 			for (i = w->vscroll2.pos ; i < max ; ++i) {
@@ -470,17 +483,17 @@
 				DrawVehicleProfitButton(v, x, y2 + 13);
 
 				SetDParam(0, v->unitnumber);
-				DrawString(x, y2 + 2, v->IsInDepot() ? STR_021F : (v->age > v->max_age - 366 ? STR_00E3 : STR_00E2), 0);
+				DrawString(x, y2 + 2, v->IsInDepot() ? STR_021F : (v->age > v->max_age - 366 ? STR_00E3 : STR_00E2), TC_FROMSTRING);
 
 				if (w->resize.step_height == PLY_WND_PRC__SIZE_OF_ROW_BIG2) DrawSmallOrderList(v, x + 138, y2);
 
 				SetDParam(0, v->profit_this_year);
 				SetDParam(1, v->profit_last_year);
-				DrawString(x + 19, y2 + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
+				DrawString(x + 19, y2 + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, TC_FROMSTRING);
 
 				if (IsValidGroupID(v->group_id)) {
 					SetDParam(0, v->group_id);
-					DrawString(x + 19, y2, STR_GROUP_TINY_NAME, 16);
+					DrawString(x + 19, y2, STR_GROUP_TINY_NAME, TC_BLACK);
 				}
 
 				y2 += w->resize.step_height;
@@ -554,7 +567,7 @@
 					gv->vehicle_sel = v->index;
 
 					if (v->IsValid()) {
-						SetObjectToPlaceWnd(v->GetImage(DIR_W), GetVehiclePalette(v), 4, w);
+						SetObjectToPlaceWnd(v->GetImage(DIR_W), GetVehiclePalette(v), VHM_DRAG, w);
 					}
 
 					SetWindowDirty(w);
--- a/src/gui.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/gui.h	Mon Dec 03 23:39:38 2007 +0000
@@ -86,8 +86,9 @@
 	DDSP_CONVERT_RAIL,
 
 	/* Road specific actions */
-	DDSP_PLACE_ROAD_NE,
-	DDSP_PLACE_ROAD_NW,
+	DDSP_PLACE_ROAD_X_DIR,
+	DDSP_PLACE_ROAD_Y_DIR,
+	DDSP_PLACE_AUTOROAD,
 };
 
 /* misc_gui.cpp */
@@ -139,7 +140,7 @@
 void SetFiosType(const byte fiostype);
 
 /* FIOS_TYPE_FILE, FIOS_TYPE_OLDFILE etc. different colours */
-extern const byte _fios_colors[];
+extern const TextColour _fios_colors[];
 
 /* bridge_gui.cpp */
 void ShowBuildBridgeWindow(uint start, uint end, byte type);
--- a/src/helpers.hpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/helpers.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -39,11 +39,6 @@
 }
 
 
-/** returns the absolute value of (scalar) variable. @note assumes variable to be signed */
-template <typename T> static inline T myabs(T a) { return a < (T)0 ? -a : a; }
-/** returns the (absolute) difference between two (scalar) variables */
-template <typename T> static inline T delta(T a, T b) { return a < b ? b - a : a - b; }
-
 /** Some enums need to have allowed incrementing (i.e. StationClassID) */
 #define DECLARE_POSTFIX_INCREMENT(type) \
 	FORCEINLINE type operator ++(type& e, int) \
@@ -136,26 +131,156 @@
 	}
 
 	/** postfix ++ operator on tiny type */
-	FORCEINLINE TinyEnumT& operator ++ (int)
+	FORCEINLINE TinyEnumT operator ++ (int)
+	{
+		TinyEnumT org = *this;
+		if (++m_val >= end) m_val -= (storage_type)(end - begin);
+		return org;
+	}
+
+	/** prefix ++ operator on tiny type */
+	FORCEINLINE TinyEnumT& operator ++ ()
 	{
 		if (++m_val >= end) m_val -= (storage_type)(end - begin);
 		return *this;
 	}
 };
 
-template <typename T> void ClrBitT(T &t, int bit_index)
-{
-	t = (T)(t & ~((T)1 << bit_index));
-}
-
-template <typename T> void SetBitT(T &t, int bit_index)
+/**
+ * Overflow safe template for integers, i.e. integers that will never overflow
+ * you multiply the maximum value with 2, or add 2, or substract somethng from
+ * the minimum value, etc.
+ * @param T     the type these integers are stored with.
+ * @param T_MAX the maximum value for the integers.
+ * @param T_MIN the minimum value for the integers.
+ */
+template <class T, T T_MAX, T T_MIN>
+class OverflowSafeInt
 {
-	t = (T)(t | ((T)1 << bit_index));
-}
+private:
+	/** The non-overflow safe backend to store the value in. */
+	T m_value;
+public:
+	OverflowSafeInt() : m_value(0) { }
 
-template <typename T> void ToggleBitT(T &t, int bit_index)
-{
-	t = (T)(t ^ ((T)1 << bit_index));
-}
+	OverflowSafeInt(const OverflowSafeInt& other) { this->m_value = other.m_value; }
+	OverflowSafeInt(const int64 int_)             { this->m_value = int_; }
+
+	FORCEINLINE OverflowSafeInt& operator = (const OverflowSafeInt& other) { this->m_value = other.m_value; return *this; }
+
+	FORCEINLINE OverflowSafeInt operator - () const { return OverflowSafeInt(-this->m_value); }
+
+	/**
+	 * Safe implementation of addition.
+	 * @param other the amount to add
+	 * @note when the addition would yield more than T_MAX (or less than T_MIN),
+	 *       it will be T_MAX (respectively T_MIN).
+	 */
+	FORCEINLINE OverflowSafeInt& operator += (const OverflowSafeInt& other)
+	{
+		if ((T_MAX - abs(other.m_value)) < abs(this->m_value) &&
+				(this->m_value < 0) == (other.m_value < 0)) {
+			this->m_value = (this->m_value < 0) ? T_MIN : T_MAX ;
+		} else {
+			this->m_value += other.m_value;
+		}
+		return *this;
+	}
+
+	/* Operators for addition and substraction */
+	FORCEINLINE OverflowSafeInt  operator +  (const OverflowSafeInt& other) const { OverflowSafeInt result = *this; result += other; return result; }
+	FORCEINLINE OverflowSafeInt  operator +  (const int              other) const { OverflowSafeInt result = *this; result += (int64)other; return result; }
+	FORCEINLINE OverflowSafeInt  operator +  (const uint             other) const { OverflowSafeInt result = *this; result += (int64)other; return result; }
+	FORCEINLINE OverflowSafeInt& operator -= (const OverflowSafeInt& other)       { return *this += (-other); }
+	FORCEINLINE OverflowSafeInt  operator -  (const OverflowSafeInt& other) const { OverflowSafeInt result = *this; result -= other; return result; }
+	FORCEINLINE OverflowSafeInt  operator -  (const int              other) const { OverflowSafeInt result = *this; result -= (int64)other; return result; }
+	FORCEINLINE OverflowSafeInt  operator -  (const uint             other) const { OverflowSafeInt result = *this; result -= (int64)other; return result; }
+
+	FORCEINLINE OverflowSafeInt& operator ++ () { return *this += 1; }
+	FORCEINLINE OverflowSafeInt& operator -- () { return *this += -1; }
+	FORCEINLINE OverflowSafeInt operator ++ (int) { OverflowSafeInt org = *this; *this += 1; return org; }
+	FORCEINLINE OverflowSafeInt operator -- (int) { OverflowSafeInt org = *this; *this += -1; return org; }
+
+	/**
+	 * Safe implementation of multiplication.
+	 * @param factor the factor to multiply this with.
+	 * @note when the multiplication would yield more than T_MAX (or less than T_MIN),
+	 *       it will be T_MAX (respectively T_MIN).
+	 */
+	FORCEINLINE OverflowSafeInt& operator *= (const int factor)
+	{
+		if (factor != 0 && (T_MAX / abs(factor)) < abs(this->m_value)) {
+			 this->m_value = ((this->m_value < 0) == (factor < 0)) ? T_MAX : T_MIN ;
+		} else {
+			this->m_value *= factor ;
+		}
+		return *this;
+	}
+
+	/* Operators for multiplication */
+	FORCEINLINE OverflowSafeInt operator * (const int64  factor) const { OverflowSafeInt result = *this; result *= factor; return result; }
+	FORCEINLINE OverflowSafeInt operator * (const int    factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; }
+	FORCEINLINE OverflowSafeInt operator * (const uint   factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; }
+	FORCEINLINE OverflowSafeInt operator * (const uint16 factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; }
+	FORCEINLINE OverflowSafeInt operator * (const byte   factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; }
+
+	/* Operators for division */
+	FORCEINLINE OverflowSafeInt& operator /= (const int              divisor)       { this->m_value /= divisor; return *this; }
+	FORCEINLINE OverflowSafeInt  operator /  (const OverflowSafeInt& divisor) const { OverflowSafeInt result = *this; result /= divisor.m_value; return result; }
+	FORCEINLINE OverflowSafeInt  operator /  (const int              divisor) const { OverflowSafeInt result = *this; result /= divisor; return result; }
+	FORCEINLINE OverflowSafeInt  operator /  (const uint             divisor) const { OverflowSafeInt result = *this; result /= (int)divisor; return result; }
+
+	/* Operators for modulo */
+	FORCEINLINE OverflowSafeInt& operator %= (const int  divisor)       { this->m_value %= divisor; return *this; }
+	FORCEINLINE OverflowSafeInt  operator %  (const int  divisor) const { OverflowSafeInt result = *this; result %= divisor; return result; }
+
+	/* Operators for shifting */
+	FORCEINLINE OverflowSafeInt& operator <<= (const int shift)       { this->m_value <<= shift; return *this; }
+	FORCEINLINE OverflowSafeInt  operator <<  (const int shift) const { OverflowSafeInt result = *this; result <<= shift; return result; }
+	FORCEINLINE OverflowSafeInt& operator >>= (const int shift)       { this->m_value >>= shift; return *this; }
+	FORCEINLINE OverflowSafeInt  operator >>  (const int shift) const { OverflowSafeInt result = *this; result >>= shift; return result; }
+
+	/* Operators for (in)equality when comparing overflow safe ints */
+	FORCEINLINE bool operator == (const OverflowSafeInt& other) const { return this->m_value == other.m_value; }
+	FORCEINLINE bool operator != (const OverflowSafeInt& other) const { return !(*this == other); }
+	FORCEINLINE bool operator >  (const OverflowSafeInt& other) const { return this->m_value > other.m_value; }
+	FORCEINLINE bool operator >= (const OverflowSafeInt& other) const { return this->m_value >= other.m_value; }
+	FORCEINLINE bool operator <  (const OverflowSafeInt& other) const { return !(*this >= other); }
+	FORCEINLINE bool operator <= (const OverflowSafeInt& other) const { return !(*this > other); }
+
+	/* Operators for (in)equality when comparing non-overflow safe ints */
+	FORCEINLINE bool operator == (const int other) const { return this->m_value == other; }
+	FORCEINLINE bool operator != (const int other) const { return !(*this == other); }
+	FORCEINLINE bool operator >  (const int other) const { return this->m_value > other; }
+	FORCEINLINE bool operator >= (const int other) const { return this->m_value >= other; }
+	FORCEINLINE bool operator <  (const int other) const { return !(*this >= other); }
+	FORCEINLINE bool operator <= (const int other) const { return !(*this > other); }
+
+	FORCEINLINE operator int64 () const { return this->m_value; }
+};
+
+/* Sometimes we got int64 operator OverflowSafeInt instead of vice versa. Handle that properly */
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator + (int64 a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return b + a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator - (int64 a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return -b + a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator * (int64 a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return b * a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator / (int64 a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return (OverflowSafeInt<T, T_MAX, T_MIN>)a / (int)b; }
+
+/* Sometimes we got int operator OverflowSafeInt instead of vice versa. Handle that properly */
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator + (int   a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return b + a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator - (int   a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return -b + a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator * (int   a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return b * a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator / (int   a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return (OverflowSafeInt<T, T_MAX, T_MIN>)a / (int)b; }
+
+/* Sometimes we got uint operator OverflowSafeInt instead of vice versa. Handle that properly */
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator + (uint  a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return b + a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator - (uint  a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return -b + a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator * (uint  a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return b * a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator / (uint  a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return (OverflowSafeInt<T, T_MAX, T_MIN>)a / (int)b; }
+
+/* Sometimes we got byte operator OverflowSafeInt instead of vice versa. Handle that properly */
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator + (byte  a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return b + a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator - (byte  a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return -b + a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator * (byte  a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return b * a; }
+template <class T, int64 T_MAX, int64 T_MIN> FORCEINLINE OverflowSafeInt<T, T_MAX, T_MIN> operator / (byte  a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return (OverflowSafeInt<T, T_MAX, T_MIN>)a / (int)b; }
 
 #endif /* HELPERS_HPP */
--- a/src/industry.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/industry.h	Mon Dec 03 23:39:38 2007 +0000
@@ -66,7 +66,7 @@
 	IACT_USERCREATION,    ///< from the Fund/build window
 };
 
-enum IndustyBehaviour {
+enum IndustryBehaviour {
 	INDUSTRYBEH_NONE                  =      0,
 	INDUSTRYBEH_PLANT_FIELDS          = 1 << 0,  ///< periodically plants fileds around itself (temp and artic farms)
 	INDUSTRYBEH_CUT_TREES             = 1 << 1,  ///< cuts trees and produce first output cargo from them (lumber mill)
@@ -90,7 +90,7 @@
 };
 
 
-DECLARE_ENUM_AS_BIT_SET(IndustyBehaviour);
+DECLARE_ENUM_AS_BIT_SET(IndustryBehaviour);
 
 struct Industry;
 DECLARE_OLD_POOL(Industry, Industry, 3, 8000)
@@ -130,6 +130,9 @@
 	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
 
+	byte random_triggers;               ///< Triggers for the random
+	uint16 random;                      ///< Random value used for randomisation of all kinds of things
+
 	PersistentStorage psa;              ///< Persistent storage for NewGRF industries.
 
 	Industry(TileIndex tile = 0) : xy(tile) {}
@@ -158,7 +161,8 @@
 struct IndustrySpec {
 	const IndustryTileTable *const *table;///< List of the tiles composing the industry
 	byte num_table;                       ///< Number of elements in the table
-	uint8 cost_multiplier;                ///< Base cost multiplier.
+	uint8 cost_multiplier;                ///< Base construction cost multiplier.
+	uint32 removal_cost_multiplier;       ///< Base removal cost multiplier.
 	uint16 raw_industry_cost_multiplier;  ///< Multiplier for the raw industries cost
 	uint32 prospecting_chance;            ///< Chance prospecting succeeds
 	IndustryType conflicting[3];          ///< Industries this industry cannot be close to
@@ -171,7 +175,7 @@
 	uint16 input_cargo_multiplier[3][2];  ///< Input cargo multipliers (multiply amount of incoming cargo for the produced cargos)
 	IndustryLifeType life_type;           ///< This is also known as Industry production flag, in newgrf specs
 	byte climate_availability;            ///< Bitmask, giving landscape enums as bit position
-	IndustyBehaviour behaviour;           ///< How this industry will behave, and how others entities can use it
+	IndustryBehaviour behaviour;           ///< How this industry will behave, and how others entities can use it
 	byte map_colour;                      ///< colour used for the small map
 	StringID name;                        ///< Displayed name of the industry
 	StringID new_industry_text;           ///< Message appearing when the industry is built
@@ -199,6 +203,14 @@
 	 * @return the cost (inflation corrected etc)
 	 */
 	Money GetConstructionCost() const;
+
+	/**
+	 * Get the cost for removing this industry
+	 * Take note that the cost will always be zero for non-grf industries.
+	 * Only if the grf author did specified a cost will it be applicable.
+	 * @return the cost (inflation corrected etc)
+	 */
+	Money GetRemovalCost() const;
 };
 
 /**
--- a/src/industry_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/industry_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -13,6 +13,7 @@
 #include "table/sprites.h"
 #include "map.h"
 #include "tile.h"
+#include "train.h"
 #include "landscape.h"
 #include "viewport.h"
 #include "command.h"
@@ -38,6 +39,8 @@
 #include "newgrf_callbacks.h"
 #include "misc/autoptr.hpp"
 #include "autoslope.h"
+#include "transparency.h"
+#include "water.h"
 
 void ShowIndustryViewWindow(int industry);
 void BuildOilRig(TileIndex tile);
@@ -66,7 +69,7 @@
 	/* once performed, enable only the current climate industries */
 	for (IndustryType i = 0; i < NUM_INDUSTRYTYPES; i++) {
 		_industry_specs[i].enabled = i < NEW_INDUSTRYOFFSET &&
-				HASBIT(_origin_industry_specs[i].climate_availability, _opt.landscape);
+				HasBit(_origin_industry_specs[i].climate_availability, _opt.landscape);
 	}
 
 	memset(&_industry_tile_specs, 0, sizeof(_industry_tile_specs));
@@ -288,7 +291,7 @@
 			GetIndustryConstructionStage(ti->tile))];
 
 	image = dits->ground.sprite;
-	if (HASBIT(image, PALETTE_MODIFIER_COLOR) && dits->ground.pal == PAL_NONE) {
+	if (HasBit(image, PALETTE_MODIFIER_COLOR) && dits->ground.pal == PAL_NONE) {
 		pal = GENERAL_SPRITE_COLOR(ind->random_color);
 	} else {
 		pal = dits->ground.pal;
@@ -303,16 +306,16 @@
 	image = dits->building.sprite;
 	if (image != 0) {
 		AddSortableSpriteToDraw(image,
-			(HASBIT(image, PALETTE_MODIFIER_COLOR) && dits->building.pal == PAL_NONE) ? GENERAL_SPRITE_COLOR(ind->random_color) : dits->building.pal,
+			(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,
 			dits->height,
 			dits->dz,
 			ti->z,
-			HASBIT(_transparent_opt, TO_INDUSTRIES));
+			IsTransparencySet(TO_INDUSTRIES));
 
-		if (HASBIT(_transparent_opt, TO_INDUSTRIES)) return;
+		if (IsTransparencySet(TO_INDUSTRIES)) return;
 	}
 
 	{
@@ -344,7 +347,7 @@
 	const CargoID *accepts_cargo = itspec->accepts_cargo;
 	const uint8 *acceptance = itspec->acceptance;
 
-	if (HASBIT(itspec->callback_flags, CBM_INDT_ACCEPT_CARGO)) {
+	if (HasBit(itspec->callback_flags, CBM_INDT_ACCEPT_CARGO)) {
 		uint16 res = GetIndustryTileCallback(CBID_INDTILE_ACCEPT_CARGO, 0, 0, gfx, GetIndustryByTile(tile), tile);
 		if (res != CALLBACK_FAILED) {
 			accepts_cargo = raw_accepts_cargo;
@@ -352,7 +355,7 @@
 		}
 	}
 
-	if (HASBIT(itspec->callback_flags, CBM_INDT_CARGO_ACCEPTANCE)) {
+	if (HasBit(itspec->callback_flags, CBM_INDT_CARGO_ACCEPTANCE)) {
 		uint16 res = GetIndustryTileCallback(CBID_INDTILE_CARGO_ACCEPTANCE, 0, 0, gfx, GetIndustryByTile(tile), tile);
 		if (res != CALLBACK_FAILED) {
 			acceptance = raw_acceptance;
@@ -398,48 +401,41 @@
 	}
 
 	if (flags & DC_EXEC) delete i;
-	return CommandCost();
+	return CommandCost(indspec->GetRemovalCost());
 }
 
 static void TransportIndustryGoods(TileIndex tile)
 {
 	Industry *i = GetIndustryByTile(tile);
 	const IndustrySpec *indspec = GetIndustrySpec(i->type);
-	uint cw, am;
-
-	cw = min(i->produced_cargo_waiting[0], 255);
-	if (cw > indspec->minimal_cargo/* && i->produced_cargo[0] != 0xFF*/) {
-		i->produced_cargo_waiting[0] -= cw;
-
-		/* fluctuating economy? */
-		if (_economy.fluct <= 0) cw = (cw + 1) / 2;
-
-		i->this_month_production[0] += cw;
+	bool moved_cargo = false;
 
-		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;
+	for (uint j = 0; j < lengthof(i->produced_cargo_waiting); j++) {
+		uint cw = min(i->produced_cargo_waiting[j], 255);
+		if (cw > indspec->minimal_cargo && i->produced_cargo[j] != CT_INVALID) {
+			i->produced_cargo_waiting[j] -= cw;
 
-			if (newgfx != INDUSTRYTILE_NOANIM) {
-				ResetIndustryConstructionStage(tile);
-				SetIndustryCompleted(tile, true);
-				SetIndustryGfx(tile, newgfx);
-				MarkTileDirtyByTile(tile);
-			}
+			/* fluctuating economy? */
+			if (_economy.fluct <= 0) cw = (cw + 1) / 2;
+
+			i->this_month_production[j] += cw;
+
+			uint am = MoveGoodsToStation(i->xy, i->width, i->height, i->produced_cargo[j], cw);
+			i->this_month_transported[j] += am;
+
+			moved_cargo |= (am != 0);
 		}
 	}
 
-	cw = min(i->produced_cargo_waiting[1], 255);
-	if (cw > indspec->minimal_cargo) {
-		i->produced_cargo_waiting[1] -= cw;
+	if (moved_cargo && !StartStopIndustryTileAnimation(i, IAT_INDUSTRY_DISTRIBUTES_CARGO)) {
+		uint newgfx = GetIndustryTileSpec(GetIndustryGfx(tile))->anim_production;
 
-		if (_economy.fluct <= 0) cw = (cw + 1) / 2;
-
-		i->this_month_production[1] += cw;
-
-		am = MoveGoodsToStation(i->xy, i->width, i->height, i->produced_cargo[1], cw);
-		i->this_month_transported[1] += am;
+		if (newgfx != INDUSTRYTILE_NOANIM) {
+			ResetIndustryConstructionStage(tile);
+			SetIndustryCompleted(tile, true);
+			SetIndustryGfx(tile, newgfx);
+			MarkTileDirtyByTile(tile);
+		}
 	}
 }
 
@@ -562,7 +558,7 @@
 	case GFX_OILWELL_ANIMATED_2:
 	case GFX_OILWELL_ANIMATED_3:
 		if ((_tick_counter & 7) == 0) {
-			bool b = CHANCE16(1, 7);
+			bool b = Chance16(1, 7);
 			IndustryGfx gfx = GetIndustryGfx(tile);
 
 			m = GetIndustryAnimationState(tile) + 1;
@@ -649,9 +645,7 @@
 
 	IndustryGfx gfx = GetIndustryGfx(tile);
 	if (gfx >= NEW_INDUSTRYTILEOFFSET) {
-		/* New industry */
-		const IndustryTileSpec *its = GetIndustryTileSpec(gfx);
-		if (its->animation_info != 0xFFFF) AddAnimatedTile(tile);
+		/* New industries are already animated on construction. */
 		return;
 	}
 
@@ -709,6 +703,8 @@
 	IndustryGfx newgfx;
 	IndustryGfx gfx;
 
+	TriggerIndustryTile(tile, INDTILE_TRIGGER_TILE_LOOP);
+
 	if (!IsIndustryCompleted(tile)) {
 		MakeIndustryTileBigger(tile);
 		return;
@@ -742,7 +738,7 @@
 	case GFX_COAL_MINE_TOWER_NOT_ANIMATED:
 	case GFX_COPPER_MINE_TOWER_NOT_ANIMATED:
 	case GFX_GOLD_MINE_TOWER_NOT_ANIMATED:
-		if (!(_tick_counter & 0x400) && CHANCE16(1, 2)) {
+		if (!(_tick_counter & 0x400) && Chance16(1, 2)) {
 			switch (gfx) {
 				case GFX_COAL_MINE_TOWER_NOT_ANIMATED:   gfx = GFX_COAL_MINE_TOWER_ANIMATED;   break;
 				case GFX_COPPER_MINE_TOWER_NOT_ANIMATED: gfx = GFX_COPPER_MINE_TOWER_ANIMATED; break;
@@ -755,7 +751,7 @@
 		break;
 
 	case GFX_OILWELL_NOT_ANIMATED:
-		if (CHANCE16(1, 6)) {
+		if (Chance16(1, 6)) {
 			SetIndustryGfx(tile, GFX_OILWELL_ANIMATED_1);
 			SetIndustryAnimationState(tile, 0);
 			AddAnimatedTile(tile);
@@ -779,7 +775,7 @@
 		break;
 
 	case GFX_POWERPLANT_SPARKS:
-		if (CHANCE16(1, 3)) {
+		if (Chance16(1, 3)) {
 			SndPlayTileFx(SND_0C_ELECTRIC_SPARK, tile);
 			AddAnimatedTile(tile);
 		}
@@ -809,7 +805,7 @@
 		break;
 
 	case GFX_SUGAR_MINE_SIEVE:
-		if (CHANCE16(1, 3)) AddAnimatedTile(tile);
+		if (Chance16(1, 3)) AddAnimatedTile(tile);
 		break;
 	}
 }
@@ -867,7 +863,7 @@
 		if (IsTileType(tile, MP_CLEAR) || IsTileType(tile, MP_TREES)) {
 			byte or_ = type;
 
-			if (or_ == 1 && CHANCE16(1, 7)) or_ = 2;
+			if (or_ == 1 && Chance16(1, 7)) or_ = 2;
 
 			if (direction == AXIS_X) {
 				SetFenceSE(tile, or_);
@@ -994,7 +990,7 @@
 
 	/* play a sound? */
 	if ((i->counter & 0x3F) == 0) {
-		if (CHANCE16R(1, 14, r) && (num = indsp->number_of_sounds) != 0) {
+		if (Chance16R(1, 14, r) && (num = indsp->number_of_sounds) != 0) {
 			SndPlayTileFx(
 				(SoundFx)(indsp->random_sounds[((r >> 16) * num) >> 16]),
 				i->xy);
@@ -1005,25 +1001,25 @@
 
 	/* produce some cargo */
 	if ((i->counter & 0xFF) == 0) {
-		if (HASBIT(indsp->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) IndustryProductionCallback(i, 1);
+		if (HasBit(indsp->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) IndustryProductionCallback(i, 1);
 
-		IndustyBehaviour indbehav = indsp->behaviour;
+		IndustryBehaviour indbehav = indsp->behaviour;
 		i->produced_cargo_waiting[0] = min(0xffff, i->produced_cargo_waiting[0] + i->production_rate[0]);
 		i->produced_cargo_waiting[1] = min(0xffff, i->produced_cargo_waiting[1] + i->production_rate[1]);
 
 		if ((indbehav & INDUSTRYBEH_PLANT_FIELDS) != 0) {
 			bool plant;
-			if (HASBIT(indsp->callback_flags, CBM_IND_SPECIAL_EFFECT)) {
+			if (HasBit(indsp->callback_flags, CBM_IND_SPECIAL_EFFECT)) {
 				plant = (GetIndustryCallback(CBID_INDUSTRY_SPECIAL_EFFECT, Random(), 0, i, i->type, i->xy) != 0);
 			} else {
-				plant = CHANCE16(1, 8);
+				plant = Chance16(1, 8);
 			}
 
 			if (plant) PlantRandomFarmField(i);
 		}
 		if ((indbehav & INDUSTRYBEH_CUT_TREES) != 0) {
 			bool cut = ((i->counter & 0x1FF) == 0);
-			if (HASBIT(indsp->callback_flags, CBM_IND_SPECIAL_EFFECT)) {
+			if (HasBit(indsp->callback_flags, CBM_IND_SPECIAL_EFFECT)) {
 				cut = (GetIndustryCallback(CBID_INDUSTRY_SPECIAL_EFFECT, 0, 1, i, i->type, i->xy) != 0);
 			}
 
@@ -1050,6 +1046,7 @@
 	if (_game_mode == GM_EDITOR) return;
 
 	FOR_ALL_INDUSTRIES(i) {
+		TriggerIndustry(i, INDUSTRY_TRIGGER_INDUSTRY_TICK);
 		StartStopIndustryTileAnimation(i, IAT_INDUSTRY_TICK);
 		ProduceIndustryGoods(i);
 	}
@@ -1185,6 +1182,7 @@
 
 bool IsSlopeRefused(Slope current, Slope refused)
 {
+	if (IsSteepSlope(current)) return true;
 	if (current != SLOPE_FLAT) {
 		if (refused & SLOPE_STEEP) return true;
 
@@ -1220,35 +1218,25 @@
 				return false;
 			}
 		} else {
-			if (!EnsureNoVehicle(cur_tile)) return false;
+			if (!EnsureNoVehicleOnGround(cur_tile)) return false;
 			if (MayHaveBridgeAbove(cur_tile) && IsBridgeAbove(cur_tile)) return false;
 
 			const IndustryTileSpec *its = GetIndustryTileSpec(gfx);
 
-			IndustyBehaviour ind_behav = GetIndustrySpec(type)->behaviour;
+			IndustryBehaviour ind_behav = GetIndustrySpec(type)->behaviour;
 
-			if (HASBIT(its->callback_flags, CBM_INDT_SHAPE_CHECK)) {
+			/* Perform land/water check if not disabled */
+			if (!HasBit(its->slopes_refused, 5) && (IsWaterTile(cur_tile) == !(ind_behav & INDUSTRYBEH_BUILT_ONWATER))) return false;
+
+			if (HasBit(its->callback_flags, CBM_INDT_SHAPE_CHECK)) {
 				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.
-					* But that does not mean the search is over.  You have
-					* to make sure every tile of the industry will be only water*/
-					if (!IsClearWaterTile(cur_tile)) return false;
-				} else {
-					Slope tileh;
-
-					if (IsClearWaterTile(cur_tile)) return false;
-
-					tileh = GetTileSlope(cur_tile, NULL);
-					if (IsSteepSlope(tileh)) return false;
-
-					refused_slope |= IsSlopeRefused(tileh, its->slopes_refused);
-				}
+				Slope tileh = GetTileSlope(cur_tile, NULL);
+				refused_slope |= IsSlopeRefused(tileh, its->slopes_refused);
 			}
 
-			if (ind_behav & INDUSTRYBEH_ONLY_INTOWN) {
+			if (ind_behav & (INDUSTRYBEH_ONLY_INTOWN | INDUSTRYBEH_TOWN1200_MORE)) {
 				if (!IsTileType(cur_tile, MP_HOUSE)) {
 					_error_message = STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS;
 					return false;
@@ -1302,7 +1290,7 @@
 			return false;
 
 		/* Don't allow too big of a change if this is the sub-tile check */
-		if (internal != 0 && delta(curh, height) > 1) return false;
+		if (internal != 0 && Delta(curh, height) > 1) return false;
 
 		/* Different height, so the surrounding tiles of this tile
 		 *  has to be correct too (in level, or almost in level)
@@ -1441,8 +1429,11 @@
 	i->production_rate[0] = indspec->production_rate[0];
 	i->production_rate[1] = indspec->production_rate[1];
 
-	/* 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))) {
+	/* don't use smooth economy for industries using production related callbacks */
+	if (_patches.smooth_economy &&
+	    !(HasBit(indspec->callback_flags, CBM_IND_PRODUCTION_256_TICKS) || HasBit(indspec->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL)) && // production callbacks
+	    !(HasBit(indspec->callback_flags, CBM_IND_MONTHLYPROD_CHANGE) || HasBit(indspec->callback_flags, CBM_IND_PRODUCTION_CHANGE))             // production change callbacks
+	) {
 		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);
 	}
@@ -1451,8 +1442,9 @@
 	i->owner = owner;
 
 	r = Random();
-	i->random_color = GB(r, 8, 4);
-	i->counter = GB(r, 0, 12);
+	i->random_color = GB(r, 0, 4);
+	i->counter = GB(r, 4, 12);
+	i->random = GB(r, 16, 16);
 	i->produced_cargo_waiting[0] = 0;
 	i->produced_cargo_waiting[1] = 0;
 	i->incoming_cargo_waiting[0] = 0;
@@ -1472,12 +1464,12 @@
 	i->last_month_production[1] = i->production_rate[1] * 8;
 	i->founder = _current_player;
 
-	if (HASBIT(indspec->callback_flags, CBM_IND_DECIDE_COLOUR)) {
+	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)) {
+	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);
@@ -1486,7 +1478,7 @@
 		}
 	}
 
-	if (HASBIT(indspec->callback_flags, CBM_IND_OUTPUT_CARGO_TYPES)) {
+	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);
@@ -1522,10 +1514,16 @@
 			DoCommand(cur_tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
 
 			MakeIndustry(cur_tile, i->index, it->gfx);
+
 			if (_generating_world) {
 				SetIndustryConstructionCounter(cur_tile, 3);
 				SetIndustryConstructionStage(cur_tile, 2);
 			}
+			if (it->gfx >= NEW_INDUSTRYTILEOFFSET) {
+				/* New industry */
+				const IndustryTileSpec *its = GetIndustryTileSpec(it->gfx);
+				if (its->animation_info != 0xFFFF) AddAnimatedTile(cur_tile);
+			}
 		}
 	} while ((++it)->ti.x != -0x80);
 
@@ -1554,7 +1552,7 @@
 
 	if (!CheckIfIndustryTilesAreFree(tile, it, itspec_index, type, &custom_shape_check)) return NULL;
 
-	if (HASBIT(GetIndustrySpec(type)->callback_flags, CBM_IND_LOCATION)) {
+	if (HasBit(GetIndustrySpec(type)->callback_flags, CBM_IND_LOCATION)) {
 		if (!CheckIfCallBackAllowsCreation(tile, type, itspec_index)) return NULL;
 	} else {
 		if (!_check_new_industry_procs[indspec->check_proc](tile)) return NULL;
@@ -1586,13 +1584,11 @@
  * @param tile tile where industry is built
  * @param flags of operations to conduct
  * @param p1 industry type see build_industry.h and see industry.h
- * @param p2 unused
+ * @param p2 first layout to try
  * @return index of the newly create industry, or CMD_ERROR if it failed
  */
 CommandCost CmdBuildIndustry(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	int num;
-	const IndustryTileTable * const *itt;
 	const IndustrySpec *indspec;
 
 	SET_EXPENSES_TYPE(EXPENSES_OTHER);
@@ -1617,11 +1613,15 @@
 			 * is nothing we can really do about that. */
 			if (Random() <= indspec->prospecting_chance) {
 				for (int i = 0; i < 5000; i++) {
-					uint tilespec_index = RandomRange(indspec->num_table);
-					const Industry *ind = CreateNewIndustryHelper(RandomTile(), p1, flags, indspec, tilespec_index);
+					const Industry *ind = CreateNewIndustryHelper(RandomTile(), p1, flags, indspec, RandomRange(indspec->num_table));
 					if (ind != NULL) {
 						SetDParam(0, indspec->name);
-						SetDParam(1, ind->town->index);
+						if (indspec->new_industry_text > STR_LAST_STRINGID) {
+							SetDParam(1, STR_TOWN);
+							SetDParam(2, ind->town->index);
+						} else {
+							SetDParam(1, ind->town->index);
+						}
 						AddNewsItem(indspec->new_industry_text,
 								NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0), ind->xy, 0);
 						break;
@@ -1630,12 +1630,14 @@
 			}
 		}
 	} else {
-		num = indspec->num_table;
-		itt = indspec->table;
+		int count = indspec->num_table;
+		const IndustryTileTable * const *itt = indspec->table;
+		int num = Clamp(p2, 0, count - 1);
 
-
+		_error_message = STR_0239_SITE_UNSUITABLE;
 		do {
-			if (--num < 0) return_cmd_error(STR_0239_SITE_UNSUITABLE);
+			if (--count < 0) return CMD_ERROR;
+			if (--num < 0) num = indspec->num_table - 1;
 		} while (!CheckIfIndustryTilesAreFree(tile, itt[num], num, p1));
 
 		if (CreateNewIndustryHelper(tile, p1, flags, indspec, num) == NULL) return CMD_ERROR;
@@ -1796,11 +1798,14 @@
 
 	/* Generate a list of all possible industries that can be built. */
 	for (j = 0; j < NUM_INDUSTRYTYPES; j++) {
-		byte chance = GetIndustrySpec(j)->appear_ingame[_opt.landscape];
+		ind_spc = GetIndustrySpec(j);
+		byte chance = ind_spc->appear_ingame[_opt.landscape];
+
+		if (!ind_spc->enabled || chance == 0) continue;
 
 		/* If there is no Callback CBID_INDUSTRY_AVAILABLE or if this one did anot failed,
 		 * and if appearing chance for this landscape is above 0, this industry can be chosen */
-		if (CheckIfCallBackAllowsAvailability(j, IACT_RANDOMCREATION) && chance != 0) {
+		if (CheckIfCallBackAllowsAvailability(j, IACT_RANDOMCREATION)) {
 			probability_max += chance;
 			/* adds the result for this industry */
 			cumulative_probs[num].ind = j;
@@ -1829,7 +1834,12 @@
 	}
 
 	SetDParam(0, ind_spc->name);
-	SetDParam(1, ind->town->index);
+	if (ind_spc->new_industry_text > STR_LAST_STRINGID) {
+		SetDParam(1, STR_TOWN);
+		SetDParam(2, ind->town->index);
+	} else {
+		SetDParam(1, ind->town->index);
+	}
 	AddNewsItem(ind_spc->new_industry_text,
 		NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0), ind->xy, 0);
 }
@@ -1848,9 +1858,141 @@
 
 	/* 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);
+	return (indspec->behaviour & INDUSTRYBEH_CANCLOSE_LASTINSTANCE) == 0 && GetIndustryTypeCount(type) <= 1;
 }
 
+/**
+* Can given cargo type be accepted or produced by the industry?
+* @param cargo: Cargo type
+* @param ind: Industry
+* @param *c_accepts: Pointer to boolean for acceptance of cargo
+* @param *c_produces: Pointer to boolean for production of cargo
+* @return: \c *c_accepts is set when industry accepts the cargo type,
+*          \c *c_produces is set when the industry produces the cargo type
+*/
+static void CanCargoServiceIndustry(CargoID cargo, Industry *ind, bool *c_accepts, bool *c_produces)
+{
+	const IndustrySpec *indspec = GetIndustrySpec(ind->type);
+
+	/* Check for acceptance of cargo */
+	for (uint j = 0; j < lengthof(ind->accepts_cargo) && ind->accepts_cargo[j] != CT_INVALID; j++) {
+		if (cargo == ind->accepts_cargo[j]) {
+			if (HasBit(indspec->callback_flags, CBM_IND_REFUSE_CARGO)) {
+				uint16 res = GetIndustryCallback(CBID_INDUSTRY_REFUSE_CARGO,
+						0, GetReverseCargoTranslation(cargo, indspec->grf_prop.grffile),
+						ind, ind->type, ind->xy);
+				if (res == 0) continue;
+			}
+			*c_accepts = true;
+			break;
+		}
+	}
+
+	/* Check for produced cargo */
+	for (uint j = 0; j < lengthof(ind->produced_cargo) && ind->produced_cargo[j] != CT_INVALID; j++) {
+		if (cargo == ind->produced_cargo[j]) {
+			*c_produces = true;
+			break;
+		}
+	}
+}
+
+/**
+* Compute who can service the industry.
+*
+* Here, 'can service' means that he/she has trains and stations close enough
+* to the industry with the right cargo type and the right orders (ie has the
+* technical means).
+*
+* @param ind: Industry being investigated.
+*
+* @return: 0 if nobody can service the industry, 2 if the local player can
+* service the industry, and 1 otherwise (only competitors can service the
+* industry)
+*/
+int WhoCanServiceIndustry(Industry* ind)
+{
+	/* Find all stations within reach of the industry */
+	StationSet stations = FindStationsAroundIndustryTile(ind->xy, ind->width, ind->height);
+
+	if (stations.size() == 0) return 0; // No stations found at all => nobody services
+
+	const Vehicle *v;
+	int result = 0;
+	FOR_ALL_VEHICLES(v) {
+		/* Is it worthwhile to try this vehicle? */
+		if (v->owner != _local_player && result != 0) continue;
+
+		/* Check whether it accepts the right kind of cargo */
+		bool c_accepts = false;
+		bool c_produces = false;
+		if (v->type == VEH_TRAIN && IsFrontEngine(v)) {
+			const Vehicle *u = v;
+			BEGIN_ENUM_WAGONS(u)
+				CanCargoServiceIndustry(u->cargo_type, ind, &c_accepts, &c_produces);
+			END_ENUM_WAGONS(u)
+		} else if (v->type == VEH_ROAD || v->type == VEH_SHIP || v->type == VEH_AIRCRAFT) {
+			CanCargoServiceIndustry(v->cargo_type, ind, &c_accepts, &c_produces);
+		} else {
+			continue;
+		}
+		if (!c_accepts && !c_produces) continue; // Wrong cargo
+
+		/* Check orders of the vehicle.
+		 * We cannot check the first of shared orders only, since the first vehicle in such a chain
+		 * may have a different cargo type.
+		 */
+		const Order *o;
+		FOR_VEHICLE_ORDERS(v, o) {
+			if (o->type == OT_GOTO_STATION && !HasBit(o->flags, OFB_TRANSFER)) {
+				/* Vehicle visits a station to load or unload */
+				Station *st = GetStation(o->dest);
+				if (!st->IsValid()) continue;
+
+				/* Same cargo produced by industry is dropped here => not serviced by vehicle v */
+				if (HasBit(o->flags, OFB_UNLOAD) && !c_accepts) break;
+
+				if (stations.find(st) != stations.end()) {
+					if (v->owner == _local_player) return 2; // Player services industry
+					result = 1; // Competitor services industry
+				}
+			}
+		}
+	}
+	return result;
+}
+
+/**
+* Report news that industry production has changed significantly
+*
+* @param ind: Industry with changed production
+* @param type: Cargo type that has changed
+* @param percent: Percentage of change (>0 means increase, <0 means decrease)
+*/
+static void ReportNewsProductionChangeIndustry(Industry *ind, CargoID type, int percent)
+{
+	NewsType nt;
+
+	switch (WhoCanServiceIndustry(ind)) {
+		case 0: nt = NT_INDUSTRY_NOBODY; break;
+		case 1: nt = NT_INDUSTRY_OTHER;  break;
+		case 2: nt = NT_INDUSTRY_PLAYER; break;
+		default: NOT_REACHED(); break;
+	}
+	SetDParam(2, abs(percent));
+	SetDParam(0, GetCargo(type)->name);
+	SetDParam(1, ind->index);
+	AddNewsItem(
+		percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
+		NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, nt, 0),
+		ind->xy + TileDiffXY(1, 1), 0
+	);
+}
+
+enum {
+	PERCENT_TRANSPORTED_60 = 153,
+};
+
 /** 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
@@ -1863,18 +2005,22 @@
 	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));
+	/* don't use smooth economy for industries using production related 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)) && // production callbacks
+	                      !(HasBit(indspec->callback_flags, CBM_IND_MONTHLYPROD_CHANGE) || HasBit(indspec->callback_flags, CBM_IND_PRODUCTION_CHANGE));            // production change callbacks
 	byte div = 0;
 	byte mul = 0;
+	int8 increment = 0;
 
-	if (HASBIT(indspec->callback_flags, monthly ? CBM_IND_MONTHLYPROD_CHANGE : CBM_IND_PRODUCTION_CHANGE)) {
+	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);
+		standard = false;
+		monthly = false; // smooth economy is disabled so we need to fake random industry production change to allow 'use standard' result
 		if (res != CALLBACK_FAILED) {
-			standard = false;
-			suppress_message = HASBIT(res, 7);
+			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));
+			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();
@@ -1884,9 +2030,13 @@
 				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 0x8: div = res - 0x3; 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
+				case 0xC: mul = res - 0x7; break; // Multiply production by 32
+				case 0xD:                         // decrement production
+				case 0xE:                         // increment production
+					increment = res == 0x0D ? -1 : 1;
+					break;
 			}
 		}
 	}
@@ -1902,19 +2052,27 @@
 		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;
+				int mult = (i->last_month_pct_transported[j] > PERCENT_TRANSPORTED_60) ? 1 : -1;
 
 				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);
+				if (only_decrease) {
+					mult = -1;
+				} else if (Chance16(1, 3)) {
+					mult *= -1;
 				}
 
-				new_prod = clamp(new_prod, 1, 255);
+				if (Chance16(1, 22)) {
+					new_prod += mult * (max(((RandomRange(50) + 10) * old_prod) >> 8, 1U));
+				}
+
+				/* Prevent production to overflow or Oil Rig passengers to be over-"produced" */
+				new_prod = Clamp(new_prod, 1, 255);
+
+				if (((indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0) && j == 1)
+					new_prod = Clamp(new_prod, 0, 16);
+
 				/* Do not stop closing the industry when it has the lowest possible production rate */
 				if (new_prod == old_prod && old_prod > 1) {
 					closeit = false;
@@ -1927,22 +2085,14 @@
 				/* 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
-					);
+				if (abs(percent) >= 10) {
+					ReportNewsProductionChangeIndustry(i, i->produced_cargo[j], percent);
 				}
 			}
 		} else {
-			if (only_decrease || CHANCE16(1, 3)) {
+			if (only_decrease || Chance16(1, 3)) {
 				/* If you transport > 60%, 66% chance we increase, else 33% chance we increase */
-				if (!only_decrease && (i->last_month_pct_transported[0] > 153) != CHANCE16(1, 3)) {
+				if (!only_decrease && (i->last_month_pct_transported[0] > PERCENT_TRANSPORTED_60) != Chance16(1, 3)) {
 					mul = 1; // Increase production
 				} else {
 					div = 1; // Decrease production
@@ -1952,7 +2102,7 @@
 	}
 
 	if (standard && indspec->life_type & INDUSTRYLIFE_PROCESSING) {
-		if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, smooth_economy ? 180 : 2)) {
+		if ( (byte)(_cur_year - i->last_prod_year) >= 5 && Chance16(1, smooth_economy ? 180 : 2)) {
 			closeit = true;
 		}
 	}
@@ -1977,6 +2127,11 @@
 		}
 	}
 
+	if (increment != 0) {
+		i->prod_level = ClampU(i->prod_level + increment, 4, 0x80);
+		if (i->prod_level == 4) closeit = true;
+	}
+
 	/* Close if needed and allowed */
 	if (closeit && !CheckIndustryCloseDownProtection(i->type)) {
 		i->prod_level = 0;
@@ -1984,9 +2139,33 @@
 	}
 
 	if (!suppress_message && str != STR_NULL) {
-		SetDParam(0, i->index);
+		NewsType nt;
+		/* Compute news category */
+		if (closeit) {
+			nt = NT_OPENCLOSE;
+		} else {
+			switch (WhoCanServiceIndustry(i)) {
+				case 0: nt = NT_INDUSTRY_NOBODY; break;
+				case 1: nt = NT_INDUSTRY_OTHER;  break;
+				case 2: nt = NT_INDUSTRY_PLAYER; break;
+				default: NOT_REACHED(); break;
+			}
+		}
+		/* Set parameters of news string */
+		if (str > STR_LAST_STRINGID) {
+			SetDParam(0, STR_TOWN);
+			SetDParam(1, i->town->index);
+			SetDParam(2, indspec->name);
+		} else if (closeit) {
+			SetDParam(0, STR_INDUSTRY_FORMAT);
+			SetDParam(1, i->town->index);
+			SetDParam(2, indspec->name);
+		} else {
+			SetDParam(0, i->index);
+		}
+		/* and report the news to the user */
 		AddNewsItem(str,
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, closeit ? NT_OPENCLOSE : NT_ECONOMY, 0),
+			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, nt, 0),
 			i->xy + TileDiffXY(1, 1), 0);
 	}
 }
@@ -2007,7 +2186,7 @@
 	}
 
 	/* 3% chance that we start a new industry */
-	if (CHANCE16(3, 100)) {
+	if (Chance16(3, 100)) {
 		MaybeNewIndustry();
 	} else {
 		i = GetRandomIndustry();
@@ -2048,6 +2227,11 @@
 			)) >> 8;
 }
 
+Money IndustrySpec::GetRemovalCost() const
+{
+	return (_price.remove_house * this->removal_cost_multiplier) >> 8;
+}
+
 static CommandCost TerraformTile_Industry(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
 {
 	if (AutoslopeEnabled()) {
@@ -2064,12 +2248,12 @@
 			const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
 
 			/* Call callback 3C 'disable autosloping for industry tiles'. */
-			if (HASBIT(itspec->callback_flags, CBM_INDT_AUTOSLOPE)) {
+			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
+				/* allow autoslope */
 				return _price.terraform;
 			}
 		}
@@ -2131,6 +2315,9 @@
 
 	SLE_CONDARRX(cpp_offsetof(Industry, psa) + cpp_offsetof(Industry::PersistentStorage, storage), SLE_UINT32, 16, 76, SL_MAX_VERSION),
 
+	SLE_CONDVAR(Industry, random_triggers,            SLE_UINT8,                 82, SL_MAX_VERSION),
+	SLE_CONDVAR(Industry, random,                     SLE_UINT16,                82, SL_MAX_VERSION),
+
 	/* reserve extra space in savegame here. (currently 32 bytes) */
 	SLE_CONDNULL(32, 2, SL_MAX_VERSION),
 
--- a/src/industry_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/industry_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -112,28 +112,23 @@
 				WP(w, fnd_d).timer_enabled = false;
 			}
 
-			/* We'll perform two distinct loops, one for secondary industries, and the other one for
-			 * primary ones. Each loop will fill the _fund_gui structure. */
+			/* Fill the _fund_gui structure with industries.
+			 * The tests performed after the enabled allow to load the industries
+			 * In the same way they are inserted by grf (if any)
+			 */
 			for (ind = 0; ind < NUM_INDUSTRYTYPES; ind++) {
 				indsp = GetIndustrySpec(ind);
-				if (indsp->enabled && (!indsp->IsRawIndustry() || _game_mode == GM_EDITOR)) {
+				if (indsp->enabled){
+					/* Rule is that editor mode loads all industries.
+					 * In game mode, all non raw industries are loaded too
+					 * and raw ones are loaded only when setting allows it */
+					if (_game_mode != GM_EDITOR && indsp->IsRawIndustry() && _patches.raw_industry_construction == 0) continue;
 					_fund_gui.index[_fund_gui.count] = ind;
 					_fund_gui.enabled[_fund_gui.count] = (_game_mode == GM_EDITOR) || CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
 					_fund_gui.count++;
 				}
 			}
 
-			if (_patches.raw_industry_construction != 0 && _game_mode != GM_EDITOR) {
-				for (ind = 0; ind < NUM_INDUSTRYTYPES; ind++) {
-					indsp = GetIndustrySpec(ind);
-					if (indsp->enabled && indsp->IsRawIndustry()) {
-						_fund_gui.index[_fund_gui.count] = ind;
-						_fund_gui.enabled[_fund_gui.count] = (_game_mode == GM_EDITOR) || CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
-						_fund_gui.count++;
-					}
-				}
-			}
-
 			/* first indutry type is selected.
 			 * I'll be damned if there are none available ;) */
 			WP(w, fnd_d).index = 0;
@@ -143,7 +138,6 @@
 
 		case WE_PAINT: {
 			const IndustrySpec *indsp = (WP(w, fnd_d).select == INVALID_INDUSTRYTYPE) ? NULL : GetIndustrySpec(WP(w, fnd_d).select);
-			StringID str = STR_4827_REQUIRES;
 			int x_str = w->widget[DYNA_INDU_INFOPANEL].left + 3;
 			int y_str = w->widget[DYNA_INDU_INFOPANEL].top + 3;
 			const Widget *wi = &w->widget[DYNA_INDU_INFOPANEL];
@@ -158,7 +152,7 @@
 			} else {
 				w->widget[DYNA_INDU_FUND_WIDGET].data = (_patches.raw_industry_construction == 2 && indsp->IsRawIndustry()) ? STR_PROSPECT_NEW_INDUSTRY : STR_FUND_NEW_INDUSTRY;
 			}
-			SetWindowWidgetDisabledState(w, DYNA_INDU_FUND_WIDGET, !_fund_gui.enabled[WP(w, fnd_d).index]);
+			w->SetWidgetDisabledState(DYNA_INDU_FUND_WIDGET, !_fund_gui.enabled[WP(w, fnd_d).index]);
 
 			SetVScrollCount(w, _fund_gui.count);
 
@@ -172,13 +166,13 @@
 				bool selected = WP(w, fnd_d).index == i + w->vscroll.pos;
 
 				if (_fund_gui.index[i + w->vscroll.pos] == INVALID_INDUSTRYTYPE) {
-					DrawString(21, y + offset, STR_MANY_RANDOM_INDUSTRIES, selected ? 12 : 6);
+					DrawStringTruncated(20, y + offset, STR_MANY_RANDOM_INDUSTRIES, selected ? TC_WHITE : TC_ORANGE, max_width - 25);
 					continue;
 				}
 				const IndustrySpec *indsp = GetIndustrySpec(_fund_gui.index[i + w->vscroll.pos]);
 
 				/* Draw the name of the industry in white is selected, otherwise, in orange */
-				DrawString(20,     y + offset, indsp->name, selected ? 12 : 6);
+				DrawStringTruncated(20, y + offset, indsp->name, selected ? TC_WHITE : TC_ORANGE, max_width - 25);
 				GfxFillRect(x,     y + 1 + offset,  x + 10, y + 7 + offset, selected ? 15 : 0);
 				GfxFillRect(x + 1, y + 2 + offset,  x +  9, y + 6 + offset, indsp->map_colour);
 			}
@@ -190,43 +184,37 @@
 
 			if (_game_mode != GM_EDITOR) {
 				SetDParam(0, indsp->GetConstructionCost());
-				DrawStringTruncated(x_str, y_str, STR_482F_COST, 0, max_width);
+				DrawStringTruncated(x_str, y_str, STR_482F_COST, TC_FROMSTRING, max_width);
 				y_str += 11;
 			}
 
 			/* Draw the accepted cargos, if any. Otherwhise, will print "Nothing" */
-			if (indsp->accepts_cargo[0] != CT_INVALID) {
-				SetDParam(0, GetCargo(indsp->accepts_cargo[0])->name);
-				if (indsp->accepts_cargo[1] != CT_INVALID) {
-					SetDParam(1, GetCargo(indsp->accepts_cargo[1])->name);
-					str = STR_4828_REQUIRES;
-					if (indsp->accepts_cargo[2] != CT_INVALID) {
-						SetDParam(2, GetCargo(indsp->accepts_cargo[2])->name);
-						str = STR_4829_REQUIRES;
-					}
-				}
-			} else {
-				SetDParam(0, STR_00D0_NOTHING);
+			StringID str = STR_4827_REQUIRES;
+			byte p = 0;
+			SetDParam(0, STR_00D0_NOTHING);
+			for (byte j = 0; j < lengthof(indsp->accepts_cargo); j++) {
+				if (indsp->accepts_cargo[j] == CT_INVALID) continue;
+				if (p > 0) str++;
+				SetDParam(p++, GetCargo(indsp->accepts_cargo[j])->name);
 			}
-			DrawStringTruncated(x_str, y_str, str, 0, max_width);
+			DrawStringTruncated(x_str, y_str, str, TC_FROMSTRING, max_width);
+			y_str += 11;
 
-			y_str += 11;
 			/* Draw the produced cargos, if any. Otherwhise, will print "Nothing" */
 			str = STR_4827_PRODUCES;
-			if (indsp->produced_cargo[0] != CT_INVALID) {
-				SetDParam(0, GetCargo(indsp->produced_cargo[0])->name);
-				if (indsp->produced_cargo[1] != CT_INVALID) {
-					SetDParam(1, GetCargo(indsp->produced_cargo[1])->name);
-					str = STR_4828_PRODUCES;
-				}
-			} else {
-				SetDParam(0, STR_00D0_NOTHING);
+			p = 0;
+			SetDParam(0, STR_00D0_NOTHING);
+			for (byte j = 0; j < lengthof(indsp->produced_cargo); j++) {
+				if (indsp->produced_cargo[j] == CT_INVALID) continue;
+				if (p > 0) str++;
+				SetDParam(p++, GetCargo(indsp->produced_cargo[j])->name);
 			}
-			DrawStringTruncated(x_str, y_str, str, 0, max_width);
+			DrawStringTruncated(x_str, y_str, str, TC_FROMSTRING, max_width);
+			y_str += 11;
 
 			/* Get the additional purchase info text, if it has not already been */
 			if (_fund_gui.text[WP(w, fnd_d).index] == STR_NULL) {   // Have i been called already?
-				if (HASBIT(indsp->callback_flags, CBM_IND_FUND_MORE_TEXT)) {          // No. Can it be called?
+				if (HasBit(indsp->callback_flags, CBM_IND_FUND_MORE_TEXT)) {          // No. Can it be called?
 					uint16 callback_res = GetIndustryCallback(CBID_INDUSTRY_FUND_MORE_TEXT, 0, 0, NULL, WP(w, fnd_d).select, INVALID_TILE);
 					if (callback_res != CALLBACK_FAILED) {  // Did it failed?
 						StringID newtxt = GetGRFStringID(indsp->grf_prop.grffile->grfid, 0xD000 + callback_res);  // No. here's the new string
@@ -235,7 +223,6 @@
 				}
 			}
 
-			y_str += 11;
 			/* Draw the Additional purchase text, provided by newgrf callback, if any.
 			 * Otherwhise, will print Nothing */
 			str = _fund_gui.text[WP(w, fnd_d).index];
@@ -283,7 +270,7 @@
 						DoCommandP(0, WP(w, fnd_d).select, 0, NULL, CMD_BUILD_INDUSTRY | CMD_MSG(STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY));
 						HandleButtonClick(w, DYNA_INDU_FUND_WIDGET);
 					} else {
-						HandlePlacePushButton(w, DYNA_INDU_FUND_WIDGET, SPR_CURSOR_INDUSTRY, 1, NULL);
+						HandlePlacePushButton(w, DYNA_INDU_FUND_WIDGET, SPR_CURSOR_INDUSTRY, VHM_RECT, NULL);
 					}
 				} break;
 			}
@@ -296,6 +283,7 @@
 		} break;
 
 		case WE_PLACE_OBJ: {
+			bool success = true;
 			/* We do not need to protect ourselves against "Random Many Industries" in this mode */
 			const IndustrySpec *indsp = GetIndustrySpec(WP(w, fnd_d).select);
 
@@ -310,17 +298,20 @@
 				_current_player = OWNER_NONE;
 				_generating_world = true;
 				_ignore_restrictions = true;
-				if (!TryBuildIndustry(e->we.place.tile, WP(w, fnd_d).select)) {
+				success = TryBuildIndustry(e->we.place.tile, WP(w, fnd_d).select);
+				if (!success) {
 					SetDParam(0, indsp->name);
 					ShowErrorMessage(_error_message, STR_0285_CAN_T_BUILD_HERE, e->we.place.pt.x, e->we.place.pt.y);
 				}
 
 				_ignore_restrictions = false;
 				_generating_world = false;
-			} else DoCommandP(e->we.place.tile, WP(w, fnd_d).select, 0, NULL, CMD_BUILD_INDUSTRY | CMD_MSG(STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY));
+			} else {
+				success = DoCommandP(e->we.place.tile, WP(w, fnd_d).select, InteractiveRandomRange(indsp->num_table), NULL, CMD_BUILD_INDUSTRY | CMD_MSG(STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY));
+			}
 
-			/* Whatever the outcome of the actions, just reset the cursor and the system */
-			ResetObjectToPlace();
+			/* If an industry has been built, just reset the cursor and the system */
+			if (success) ResetObjectToPlace();
 		} break;
 
 		case WE_TICK:
@@ -380,12 +371,12 @@
 
 static inline bool isProductionMinimum(const Industry *i, int pt)
 {
-	return i->production_rate[pt] == 1;
+	return i->production_rate[pt] == 0;
 }
 
 static inline bool isProductionMaximum(const Industry *i, int pt)
 {
-	return i->production_rate[pt] == 255;
+	return i->production_rate[pt] >= 255;
 }
 
 static inline bool IsProductionAlterable(const Industry *i)
@@ -412,27 +403,42 @@
 		const Industry *i = GetIndustry(w->window_number);
 		const IndustrySpec *ind = GetIndustrySpec(i->type);
 		int lines = -3;
+		bool first = true;
+		bool has_accept = false;
 
-		if (HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) {
-			for (uint j = 0; j < lengthof(i->accepts_cargo) && i->accepts_cargo[j] != CT_INVALID; j++) {
-				if (j == 0) lines++;
+		if (HasBit(ind->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(ind->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) {
+			for (byte j = 0; j < lengthof(i->accepts_cargo); j++) {
+				if (i->accepts_cargo[j] == CT_INVALID) continue;
+				has_accept = true;
+				if (first) {
+					lines++;
+					first = false;
+				}
 				lines++;
 			}
-		} else if (i->accepts_cargo[0] != CT_INVALID) {
-			lines++;
+		} else {
+			for (byte j = 0; j < lengthof(i->accepts_cargo); j++) {
+				if (i->accepts_cargo[j] == CT_INVALID) continue;
+				has_accept = true;
+				lines++;
+				break;
+			}
 		}
 
-		for (uint j = 0; j < lengthof(i->produced_cargo) && i->produced_cargo[j] != CT_INVALID; j++) {
-			if (j == 0) {
-				if (i->accepts_cargo[0] != CT_INVALID) lines++;
+		first = true;
+		for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
+			if (i->produced_cargo[j] == CT_INVALID) continue;
+			if (first) {
+				if (has_accept) lines++;
 				lines++;
+				first = false;
 			}
 			lines++;
 		}
 
-		if (HASBIT(ind->callback_flags, CBM_IND_WINDOW_MORE_TEXT)) lines += 2;
+		if (HasBit(ind->callback_flags, CBM_IND_WINDOW_MORE_TEXT)) lines += 2;
 
-		for (uint j = 5; j <= 7; j++) {
+		for (byte j = 5; j <= 7; j++) {
 			if (j != 5) w->widget[j].top += lines * 10;
 			w->widget[j].bottom += lines * 10;
 		}
@@ -443,51 +449,57 @@
 		Industry *i = GetIndustry(w->window_number);
 		const IndustrySpec *ind = GetIndustrySpec(i->type);
 		int y = 111;
+		bool first = true;
+		bool has_accept = false;
 
 		SetDParam(0, w->window_number);
 		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 < lengthof(i->accepts_cargo) && i->accepts_cargo[j] != CT_INVALID; j++) {
-				if (j == 0) {
-					DrawString(2, y, STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING, 0);
+		if (HasBit(ind->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(ind->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) {
+			for (byte j = 0; j < lengthof(i->accepts_cargo); j++) {
+				if (i->accepts_cargo[j] == CT_INVALID) continue;
+				has_accept = true;
+				if (first) {
+					DrawString(2, y, STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING, TC_FROMSTRING);
 					y += 10;
+					first = false;
 				}
 				SetDParam(0, i->accepts_cargo[j]);
 				SetDParam(1, i->incoming_cargo_waiting[j]);
-				DrawString(4, y, STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO, 0);
+				DrawString(4, y, STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO, TC_FROMSTRING);
 				y += 10;
 			}
-		} else if (i->accepts_cargo[0] != CT_INVALID) {
-			StringID str;
-
-			SetDParam(0, GetCargo(i->accepts_cargo[0])->name);
-			str = STR_4827_REQUIRES;
-			if (i->accepts_cargo[1] != CT_INVALID) {
-				SetDParam(1, GetCargo(i->accepts_cargo[1])->name);
-				str = STR_4828_REQUIRES;
-				if (i->accepts_cargo[2] != CT_INVALID) {
-					SetDParam(2, GetCargo(i->accepts_cargo[2])->name);
-					str = STR_4829_REQUIRES;
-				}
+		} else {
+			StringID str = STR_4827_REQUIRES;
+			byte p = 0;
+			for (byte j = 0; j < lengthof(i->accepts_cargo); j++) {
+				if (i->accepts_cargo[j] == CT_INVALID) continue;
+				has_accept = true;
+				if (p > 0) str++;
+				SetDParam(p++, GetCargo(i->accepts_cargo[j])->name);
 			}
-			DrawString(2, y, str, 0);
-			y += 10;
+			if (has_accept) {
+				DrawString(2, y, str, TC_FROMSTRING);
+				y += 10;
+			}
 		}
 
-		for (uint j = 0; j < lengthof(i->produced_cargo) && i->produced_cargo[j] != CT_INVALID; j++) {
-			if (j == 0) {
-				if (i->accepts_cargo[0] != CT_INVALID) y += 10;
-				DrawString(2, y, STR_482A_PRODUCTION_LAST_MONTH, 0);
+		first = true;
+		for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
+			if (i->produced_cargo[j] == CT_INVALID) continue;
+			if (first) {
+				if (has_accept) y += 10;
+				DrawString(2, y, STR_482A_PRODUCTION_LAST_MONTH, TC_FROMSTRING);
 				y += 10;
 				WP(w, indview_d).production_offset_y = y;
+				first = false;
 			}
 
 			SetDParam(0, i->produced_cargo[j]);
 			SetDParam(1, i->last_month_production[j]);
 
 			SetDParam(2, i->last_month_pct_transported[j] * 100 >> 8);
-			DrawString(4 + (IsProductionAlterable(i) ? 30 : 0), y, STR_482B_TRANSPORTED, 0);
+			DrawString(4 + (IsProductionAlterable(i) ? 30 : 0), y, STR_482B_TRANSPORTED, TC_FROMSTRING);
 			/* Let's put out those buttons.. */
 			if (IsProductionAlterable(i)) {
 				DrawArrowButtons(5, y, 3, (WP(w, indview_d).clicked_line == j + 1) ? WP(w, indview_d).clicked_button : 0,
@@ -497,15 +509,15 @@
 		}
 
 		/* Get the extra message for the GUI */
-		if (HASBIT(ind->callback_flags, CBM_IND_WINDOW_MORE_TEXT)) {
+		if (HasBit(ind->callback_flags, CBM_IND_WINDOW_MORE_TEXT)) {
 			uint16 callback_res = GetIndustryCallback(CBID_INDUSTRY_WINDOW_MORE_TEXT, 0, 0, i, i->type, i->xy);
 			if (callback_res != CALLBACK_FAILED) {
 				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);
+					PrepareTextRefStackUsage(6);
+					DrawString(2, y, message, TC_FROMSTRING);
 					StopTextRefStackUsage();
 				}
 			}
@@ -527,15 +539,17 @@
 			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) && i->produced_cargo[line] != CT_INVALID) {
-				if (IS_INT_INSIDE(x, 5, 25) ) {
+			if (e->we.click.pt.y >= WP(w, indview_d).production_offset_y && IsInsideMM(line, 0, 2) && i->produced_cargo[line] != CT_INVALID) {
+				if (IsInsideMM(x, 5, 25) ) {
 					/* Clicked buttons, decrease or increase production */
 					if (x < 15) {
 						if (isProductionMinimum(i, line)) return;
-						i->production_rate[line] = max(i->production_rate[line] / 2, 1);
+						i->production_rate[line] = max(i->production_rate[line] / 2, 0);
 					} else {
+						/* a zero production industry is unlikely to give anything but zero, so push it a little bit */
+						int new_prod = i->production_rate[line] == 0 ? 1 : i->production_rate[line] * 2;
 						if (isProductionMaximum(i, line)) return;
-						i->production_rate[line] = minu(i->production_rate[line] * 2, 255);
+						i->production_rate[line] = minu(new_prod, 255);
 					}
 
 					UpdateIndustryProduction(i);
@@ -543,7 +557,7 @@
 					w->flags4 |= 5 << WF_TIMEOUT_SHL;
 					WP(w, indview_d).clicked_line = line + 1;
 					WP(w, indview_d).clicked_button = (x < 15 ? 1 : 2);
-				} else if (IS_INT_INSIDE(x, 34, 160)) {
+				} else if (IsInsideMM(x, 34, 160)) {
 					/* clicked the text */
 					WP(w, indview_d).editbox_line = line;
 					SetDParam(0, i->production_rate[line] * 8);
@@ -569,7 +583,7 @@
 			Industry* i = GetIndustry(w->window_number);
 			int line = WP(w, indview_d).editbox_line;
 
-			i->production_rate[line] = clampu(atoi(e->we.edittext.str), 0, 255);
+			i->production_rate[line] = ClampU(atoi(e->we.edittext.str), 0, 255);
 			UpdateIndustryProduction(i);
 			SetWindowDirty(w);
 		}
@@ -769,7 +783,7 @@
 		SetVScrollCount(w, _num_industry_sort);
 
 		DrawWindowWidgets(w);
-		DoDrawString(_industry_sort_order & 1 ? DOWNARROW : UPARROW, _indicator_positions[_industry_sort_order >> 1], 15, 0x10);
+		DoDrawString(_industry_sort_order & 1 ? DOWNARROW : UPARROW, _indicator_positions[_industry_sort_order >> 1], 15, TC_BLACK);
 
 		p = w->vscroll.pos;
 		n = 0;
@@ -787,13 +801,13 @@
 					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);
-					DrawString(4, 28 + n * 10, STR_INDUSTRYDIR_ITEM_TWO, 0);
+					DrawString(4, 28 + n * 10, STR_INDUSTRYDIR_ITEM_TWO, TC_FROMSTRING);
 				} else {
 					SetDParam(3, i->last_month_pct_transported[0] * 100 >> 8);
-					DrawString(4, 28 + n * 10, STR_INDUSTRYDIR_ITEM, 0);
+					DrawString(4, 28 + n * 10, STR_INDUSTRYDIR_ITEM, TC_FROMSTRING);
 				}
 			} else {
-				DrawString(4, 28 + n * 10, STR_INDUSTRYDIR_ITEM_NOPROD, 0);
+				DrawString(4, 28 + n * 10, STR_INDUSTRYDIR_ITEM_NOPROD, TC_FROMSTRING);
 			}
 			p++;
 			if (++n == w->vscroll.cap) break;
@@ -830,7 +844,7 @@
 				int y = (e->we.click.pt.y - 28) / 10;
 				uint16 p;
 
-				if (!IS_INT_INSIDE(y, 0, w->vscroll.cap)) return;
+				if (!IsInsideMM(y, 0, w->vscroll.cap)) return;
 				p = y + w->vscroll.pos;
 				if (p < _num_industry_sort) {
 					ScrollMainWindowToTile(_industry_sort[p]->xy);
--- a/src/industry_map.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/industry_map.h	Mon Dec 03 23:39:38 2007 +0000
@@ -83,7 +83,7 @@
 static inline bool IsIndustryCompleted(TileIndex t)
 {
 	assert(IsTileType(t, MP_INDUSTRY));
-	return HASBIT(_m[t].m1, 7);
+	return HasBit(_m[t].m1, 7);
 }
 
 IndustryType GetIndustryType(TileIndex tile);
@@ -169,6 +169,7 @@
 	_m[t].m3 = 0;
 	_m[t].m4 = 0;
 	SetIndustryGfx(t, gfx);
+	_me[t].m7 = Random();
 }
 
 /**
@@ -274,7 +275,7 @@
  * @param bits the random bits
  * @pre IsTileType(tile, MP_INDUSTRY)
  */
-static inline byte GetIndustryRandomBits(TileIndex tile, byte bits)
+static inline void SetIndustryRandomBits(TileIndex tile, byte bits)
 {
 	assert(IsTileType(tile, MP_INDUSTRY));
 	_me[tile].m7 = bits;
--- a/src/intro_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/intro_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -53,13 +53,13 @@
 static void SelectGameWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: LowerWindowWidget(w, _opt_newgame.landscape + 8); break;
+	case WE_CREATE: w->LowerWidget(_opt_newgame.landscape + 8); break;
 
 	case WE_PAINT:
-		SetWindowWidgetLoweredState(w, 8,  _opt_newgame.landscape == LT_TEMPERATE);
-		SetWindowWidgetLoweredState(w, 9,  _opt_newgame.landscape == LT_ARCTIC);
-		SetWindowWidgetLoweredState(w, 10, _opt_newgame.landscape == LT_TROPIC);
-		SetWindowWidgetLoweredState(w, 11, _opt_newgame.landscape == LT_TOYLAND);
+		w->SetWidgetLoweredState(8,  _opt_newgame.landscape == LT_TEMPERATE);
+		w->SetWidgetLoweredState(9,  _opt_newgame.landscape == LT_ARCTIC);
+		w->SetWidgetLoweredState(10, _opt_newgame.landscape == LT_TROPIC);
+		w->SetWidgetLoweredState(11, _opt_newgame.landscape == LT_TOYLAND);
 		SetDParam(0, STR_6801_EASY + _opt_newgame.diff_level);
 		DrawWindowWidgets(w);
 		break;
@@ -85,7 +85,7 @@
 			}
 			break;
 		case 8: case 9: case 10: case 11:
-			RaiseWindowWidget(w, _opt_newgame.landscape + 8);
+			w->RaiseWidget(_opt_newgame.landscape + 8);
 			SetNewLandscapeType(e->we.click.widget - 8);
 			break;
 		case 12: ShowGameOptions(); break;
--- a/src/landscape.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/landscape.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -76,6 +76,16 @@
 		return TILE_HEIGHT;
 	}
 
+	if (f != FOUNDATION_STEEP_BOTH && IsNonContinuousFoundation(f)) {
+		*s = HalftileSlope(*s, GetHalftileFoundationCorner(f));
+		return 0;
+	}
+
+	if (IsSpecialRailFoundation(f)) {
+		*s = SlopeWithThreeCornersRaised(OppositeCorner(GetRailFoundationCorner(f)));
+		return 0;
+	}
+
 	uint dz = IsSteepSlope(*s) ? TILE_HEIGHT : 0;
 	Corner highest_corner = GetHighestSlopeCorner(*s);
 
@@ -92,8 +102,8 @@
 			*s = SlopeWithOneCornerRaised(highest_corner);
 			break;
 
-		case FOUNDATION_STEEP_HIGHER:
-			*s = SlopeWithThreeCornersRaised(OppositeCorner(highest_corner));
+		case FOUNDATION_STEEP_BOTH:
+			*s = HalftileSlope(SlopeWithOneCornerRaised(highest_corner), highest_corner);
 			break;
 
 		default: NOT_REACHED();
@@ -104,9 +114,31 @@
 
 uint GetPartialZ(int x, int y, Slope corners)
 {
+	if (IsHalftileSlope(corners)) {
+		switch (GetHalftileSlopeCorner(corners)) {
+			case CORNER_W:
+				if (x - y >= 0) return GetSlopeMaxZ(corners);
+				break;
+
+			case CORNER_S:
+				if (x - (y ^ 0xF) >= 0) return GetSlopeMaxZ(corners);
+				break;
+
+			case CORNER_E:
+				if (y - x >= 0) return GetSlopeMaxZ(corners);
+				break;
+
+			case CORNER_N:
+				if ((y ^ 0xF) - x >= 0) return GetSlopeMaxZ(corners);
+				break;
+
+			default: NOT_REACHED();
+		}
+	}
+
 	int z = 0;
 
-	switch (corners) {
+	switch (corners & ~SLOPE_HALFTILE_MASK) {
 	case SLOPE_W:
 		if (x - y >= 0)
 			z = (x - y) >> 1;
@@ -206,6 +238,56 @@
 	return _tile_type_procs[GetTileType(tile)]->get_slope_z_proc(tile, x, y);
 }
 
+/**
+ * Determine the Z height of a corner relative to TileZ.
+ *
+ * @pre The slope must not be a halftile slope.
+ *
+ * @param tileh The slope.
+ * @param corner The corner.
+ * @return Z position of corner relative to TileZ.
+ */
+int GetSlopeZInCorner(Slope tileh, Corner corner)
+{
+	assert(!IsHalftileSlope(tileh));
+	static const int _corner_slopes[4][2] = {
+		{ SLOPE_W, SLOPE_STEEP_W }, { SLOPE_S, SLOPE_STEEP_S }, { SLOPE_E, SLOPE_STEEP_E }, { SLOPE_N, SLOPE_STEEP_N }
+	};
+	return ((tileh & _corner_slopes[corner][0]) != 0 ? TILE_HEIGHT : 0) + (tileh == _corner_slopes[corner][1] ? TILE_HEIGHT : 0);
+}
+
+/**
+ * Determine the Z height of the corners of a specific tile edge
+ *
+ * @note If a tile has a non-continuous halftile foundation, a corner can have different heights wrt. it's edges.
+ *
+ * @pre z1 and z2 must be initialized (typ. with TileZ). The corner heights just get added.
+ *
+ * @param tileh The slope of the tile.
+ * @param edge The edge of interest.
+ * @param z1 Gets incremented by the height of the first corner of the edge. (near corner wrt. the camera)
+ * @param z2 Gets incremented by the height of the second corner of the edge. (far corner wrt. the camera)
+ */
+void GetSlopeZOnEdge(Slope tileh, DiagDirection edge, int *z1, int *z2)
+{
+	static const Slope corners[4][4] = {
+		/*    corner     |          steep slope
+		 *  z1      z2   |       z1             z2        */
+		{SLOPE_E, SLOPE_N, SLOPE_STEEP_E, SLOPE_STEEP_N}, // DIAGDIR_NE, z1 = E, z2 = N
+		{SLOPE_S, SLOPE_E, SLOPE_STEEP_S, SLOPE_STEEP_E}, // DIAGDIR_SE, z1 = S, z2 = E
+		{SLOPE_S, SLOPE_W, SLOPE_STEEP_S, SLOPE_STEEP_W}, // DIAGDIR_SW, z1 = S, z2 = W
+		{SLOPE_W, SLOPE_N, SLOPE_STEEP_W, SLOPE_STEEP_N}, // DIAGDIR_NW, z1 = W, z2 = N
+	};
+
+	int halftile_test = (IsHalftileSlope(tileh) ? SlopeWithOneCornerRaised(GetHalftileSlopeCorner(tileh)) : 0);
+	if (halftile_test == corners[edge][0]) *z2 += TILE_HEIGHT; // The slope is non-continuous in z2. z2 is on the upper side.
+	if (halftile_test == corners[edge][1]) *z1 += TILE_HEIGHT; // The slope is non-continuous in z1. z1 is on the upper side.
+
+	if ((tileh & corners[edge][0]) != 0) *z1 += TILE_HEIGHT; // z1 is raised
+	if ((tileh & corners[edge][1]) != 0) *z2 += TILE_HEIGHT; // z2 is raised
+	if ((tileh & ~SLOPE_HALFTILE_MASK) == corners[edge][2]) *z1 += TILE_HEIGHT; // z1 is highest corner of a steep slope
+	if ((tileh & ~SLOPE_HALFTILE_MASK) == corners[edge][3]) *z2 += TILE_HEIGHT; // z2 is highest corner of a steep slope
+}
 
 static Slope GetFoundationSlope(TileIndex tile, uint* z)
 {
@@ -219,32 +301,34 @@
 static bool HasFoundationNW(TileIndex tile, Slope slope_here, uint z_here)
 {
 	uint z;
-	Slope slope = GetFoundationSlope(TILE_ADDXY(tile, 0, -1), &z);
 
-	return
-		(
-			z_here + (slope_here & SLOPE_N ? TILE_HEIGHT : 0) + (slope_here == SLOPE_STEEP_N ? TILE_HEIGHT : 0) >
-			z      + (slope      & SLOPE_E ? TILE_HEIGHT : 0) + (slope      == SLOPE_STEEP_E ? TILE_HEIGHT : 0)
-		) || (
-			z_here + (slope_here & SLOPE_W ? TILE_HEIGHT : 0) + (slope_here == SLOPE_STEEP_W ? TILE_HEIGHT : 0) >
-			z      + (slope      & SLOPE_S ? TILE_HEIGHT : 0) + (slope      == SLOPE_STEEP_S ? TILE_HEIGHT : 0)
-		);
+	int z_W_here = z_here;
+	int z_N_here = z_here;
+	GetSlopeZOnEdge(slope_here, DIAGDIR_NW, &z_W_here, &z_N_here);
+
+	Slope slope = GetFoundationSlope(TILE_ADDXY(tile, 0, -1), &z);
+	int z_W = z;
+	int z_N = z;
+	GetSlopeZOnEdge(slope, DIAGDIR_SE, &z_W, &z_N);
+
+	return (z_N_here > z_N) || (z_W_here > z_W);
 }
 
 
 static bool HasFoundationNE(TileIndex tile, Slope slope_here, uint z_here)
 {
 	uint z;
-	Slope slope = GetFoundationSlope(TILE_ADDXY(tile, -1, 0), &z);
 
-	return
-		(
-			z_here + (slope_here & SLOPE_N ? TILE_HEIGHT : 0) + (slope_here == SLOPE_STEEP_N ? TILE_HEIGHT : 0) >
-			z      + (slope      & SLOPE_W ? TILE_HEIGHT : 0) + (slope      == SLOPE_STEEP_W ? TILE_HEIGHT : 0)
-		) || (
-			z_here + (slope_here & SLOPE_E ? TILE_HEIGHT : 0) + (slope_here == SLOPE_STEEP_E ? TILE_HEIGHT : 0) >
-			z      + (slope      & SLOPE_S ? TILE_HEIGHT : 0) + (slope      == SLOPE_STEEP_S ? TILE_HEIGHT : 0)
-		);
+	int z_E_here = z_here;
+	int z_N_here = z_here;
+	GetSlopeZOnEdge(slope_here, DIAGDIR_NE, &z_E_here, &z_N_here);
+
+	Slope slope = GetFoundationSlope(TILE_ADDXY(tile, -1, 0), &z);
+	int z_E = z;
+	int z_N = z;
+	GetSlopeZOnEdge(slope, DIAGDIR_SW, &z_E, &z_N);
+
+	return (z_N_here > z_N) || (z_E_here > z_E);
 }
 
 
@@ -252,24 +336,34 @@
 {
 	if (!IsFoundation(f)) return;
 
-	SpriteID sprite_base = SPR_SLOPES_VIRTUAL_BASE;
+	/* Two part foundations must be drawn separately */
+	assert(f != FOUNDATION_STEEP_BOTH);
+
+	uint sprite_block = 0;
 	uint z;
 	Slope slope = GetFoundationSlope(ti->tile, &z);
 
-	if (!HasFoundationNW(ti->tile, slope, z)) sprite_base += SPR_SLOPES_NO_FOUNDATION_NW_OFFSET;
-	if (!HasFoundationNE(ti->tile, slope, z)) sprite_base += SPR_SLOPES_NO_FOUNDATION_NE_OFFSET;
+	/* Select the needed block of foundations sprites
+	 * Block 0: Walls at NW and NE edge
+	 * Block 1: Wall  at        NE edge
+	 * Block 2: Wall  at NW        edge
+	 * Block 3: No walls at NW or NE edge
+	 */
+	if (!HasFoundationNW(ti->tile, slope, z)) sprite_block += 1;
+	if (!HasFoundationNE(ti->tile, slope, z)) sprite_block += 2;
+
+	/* Use the original slope sprites if NW and NE borders should be visible */
+	SpriteID leveled_base = (sprite_block == 0 ? (int)SPR_FOUNDATION_BASE : (SPR_SLOPES_VIRTUAL_BASE + sprite_block * SPR_TRKFOUND_BLOCK_SIZE));
+	SpriteID inclined_base = SPR_SLOPES_VIRTUAL_BASE + SPR_SLOPES_INCLINED_OFFSET + sprite_block * SPR_TRKFOUND_BLOCK_SIZE;
+	SpriteID halftile_base = SPR_HALFTILE_FOUNDATION_BASE + sprite_block * SPR_HALFTILE_BLOCK_SIZE;
 
 	if (IsSteepSlope(ti->tileh)) {
-		SpriteID lower_base;
-
-		/* Lower part of foundation
-		 * Use the original slope sprites if NW and NE borders should be visible
-		 */
-		lower_base = sprite_base;
-		if (lower_base == SPR_SLOPES_VIRTUAL_BASE) lower_base = SPR_FOUNDATION_BASE;
-		AddSortableSpriteToDraw(
-			lower_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z
-		);
+		if (!IsNonContinuousFoundation(f)) {
+			/* Lower part of foundation */
+			AddSortableSpriteToDraw(
+				leveled_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z
+			);
+		}
 
 		Corner highest_corner = GetHighestSlopeCorner(ti->tileh);
 		ti->z += ApplyFoundationToSlope(f, &ti->tileh);
@@ -278,35 +372,49 @@
 			/* inclined foundation */
 			byte inclined = highest_corner * 2 + (f == FOUNDATION_INCLINED_Y ? 1 : 0);
 
-			AddSortableSpriteToDraw(sprite_base + SPR_SLOPES_INCLINED_OFFSET + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
+			AddSortableSpriteToDraw(inclined_base + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
 			OffsetGroundSprite(31, 9);
-		} else if (f >= FOUNDATION_STEEP_HIGHER) {
-			/* three corners raised:
-			 * Draw inclined foundations for both axes, that results in the needed image.
-			 */
-			SpriteID upper = sprite_base + SPR_SLOPES_INCLINED_OFFSET + highest_corner * 2;
-
-			AddSortableSpriteToDraw(upper, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
-			AddChildSpriteScreen(upper + 1, PAL_NONE, 31, 9);
-			OffsetGroundSprite(31, 9);
-		} else {
+		} else if (f == FOUNDATION_STEEP_LOWER) {
 			/* one corner raised */
 			OffsetGroundSprite(31, 1);
+		} else {
+			/* halftile foundation */
+			int x_bb = (((highest_corner == CORNER_W) || (highest_corner == CORNER_S)) ? 8 : 0);
+			int y_bb = (((highest_corner == CORNER_S) || (highest_corner == CORNER_E)) ? 8 : 0);
+
+			AddSortableSpriteToDraw(halftile_base + highest_corner, PAL_NONE, ti->x + x_bb, ti->y + y_bb, 8, 8, 7, ti->z + TILE_HEIGHT);
+			OffsetGroundSprite(31, 9);
 		}
 	} else {
 		if (IsLeveledFoundation(f)) {
-			/* leveled foundation
-			 * Use the original slope sprites if NW and NE borders should be visible
-			 */
-			if (sprite_base == SPR_SLOPES_VIRTUAL_BASE) sprite_base = SPR_FOUNDATION_BASE;
+			/* leveled foundation */
+			AddSortableSpriteToDraw(leveled_base + ti->tileh, PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z);
+			OffsetGroundSprite(31, 1);
+		} else if (IsNonContinuousFoundation(f)) {
+			/* halftile foundation */
+			Corner halftile_corner = GetHalftileFoundationCorner(f);
+			int x_bb = (((halftile_corner == CORNER_W) || (halftile_corner == CORNER_S)) ? 8 : 0);
+			int y_bb = (((halftile_corner == CORNER_S) || (halftile_corner == CORNER_E)) ? 8 : 0);
 
-			AddSortableSpriteToDraw(sprite_base + ti->tileh, PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z);
-			OffsetGroundSprite(31, 1);
+			AddSortableSpriteToDraw(halftile_base + halftile_corner, PAL_NONE, ti->x + x_bb, ti->y + y_bb, 8, 8, 7, ti->z);
+			OffsetGroundSprite(31, 9);
+		} else if (IsSpecialRailFoundation(f)) {
+			/* anti-zig-zag foundation */
+			SpriteID spr;
+			if (ti->tileh == SLOPE_NS || ti->tileh == SLOPE_EW) {
+				/* half of leveled foundation under track corner */
+				spr = leveled_base + SlopeWithThreeCornersRaised(GetRailFoundationCorner(f));
+			} else {
+				/* tile-slope = sloped along X/Y, foundation-slope = three corners raised */
+				spr = inclined_base + 2 * GetRailFoundationCorner(f) + ((ti->tileh == SLOPE_SW || ti->tileh == SLOPE_NE) ? 1 : 0);
+			}
+			AddSortableSpriteToDraw(spr, PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z);
+			OffsetGroundSprite(31, 9);
 		} else {
 			/* inclined foundation */
 			byte inclined = GetHighestSlopeCorner(ti->tileh) * 2 + (f == FOUNDATION_INCLINED_Y ? 1 : 0);
 
-			AddSortableSpriteToDraw(sprite_base + SPR_SLOPES_INCLINED_OFFSET + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
+			AddSortableSpriteToDraw(inclined_base + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
 			OffsetGroundSprite(31, 9);
 		}
 		ti->z += ApplyFoundationToSlope(f, &ti->tileh);
@@ -550,11 +658,23 @@
 				case SLOPE_E:
 				case SLOPE_S:
 				case SLOPE_W:
+					MakeShore(tile);
+					break;
+
 				case SLOPE_NW:
+					if (GetTileSlope(TileAddByDiagDir(tile, DIAGDIR_SE), NULL) != SLOPE_SE) MakeShore(tile);
+					break;
+
 				case SLOPE_SW:
+					if (GetTileSlope(TileAddByDiagDir(tile, DIAGDIR_NE), NULL) != SLOPE_NE) MakeShore(tile);
+					break;
+
 				case SLOPE_SE:
+					if (GetTileSlope(TileAddByDiagDir(tile, DIAGDIR_NW), NULL) != SLOPE_NW) MakeShore(tile);
+					break;
+
 				case SLOPE_NE:
-					MakeShore(tile);
+					if (GetTileSlope(TileAddByDiagDir(tile, DIAGDIR_SW), NULL) != SLOPE_SW) MakeShore(tile);
 					break;
 
 				default:
--- a/src/landscape.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/landscape.h	Mon Dec 03 23:39:38 2007 +0000
@@ -25,6 +25,8 @@
 
 uint GetPartialZ(int x, int y, Slope corners);
 uint GetSlopeZ(int x, int y);
+void GetSlopeZOnEdge(Slope tileh, DiagDirection edge, int *z1, int *z2);
+int GetSlopeZInCorner(Slope tileh, Corner corner);
 
 static inline Point RemapCoords(int x, int y, int z)
 {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lang/afrikaans.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,3441 @@
+##name Afrikaans
+##ownname Afrikaans
+##isocode af_ZA
+##plural 0
+
+#
+
+##id 0x0000
+STR_NULL                                                        :
+STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Af rand van werfkaart
+STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}Te naby aan rand van werfkaart
+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}Plat daal vereis
+STR_0008_WAITING                                                :{BLACK}Wag: {WHITE}{STRING}
+STR_0009                                                        :{WHITE}{CARGO}
+STR_000A_EN_ROUTE_FROM                                          :{WHITE}{CARGO}{YELLOW}  (en-roete van
+STR_000B                                                        :{YELLOW}{STATION})
+STR_000C_ACCEPTS                                                :{BLACK}Aanvaar: {WHITE}
+STR_000D_ACCEPTS                                                :{BLACK}Aanvaar: {GOLD}
+STR_000E                                                        :
+STR_000F_PASSENGERS                                             :Passasiers
+STR_0010_COAL                                                   :Kool
+STR_0011_MAIL                                                   :Pos
+STR_0012_OIL                                                    :Olie
+STR_0013_LIVESTOCK                                              :Lewende Hawe
+STR_0014_GOODS                                                  :Goedere
+STR_0015_GRAIN                                                  :Korrel
+STR_0016_WOOD                                                   :Hout
+STR_0017_IRON_ORE                                               :Yster Erts
+STR_0018_STEEL                                                  :Staal
+STR_0019_VALUABLES                                              :Kosbaarhede
+STR_001A_COPPER_ORE                                             :Koper Erts
+STR_001B_MAIZE                                                  :Mielies
+STR_001C_FRUIT                                                  :Vrugte
+STR_001D_DIAMONDS                                               :Diamante
+STR_001E_FOOD                                                   :Voedsel
+STR_001F_PAPER                                                  :Papier
+STR_0020_GOLD                                                   :Goud
+STR_0021_WATER                                                  :Water
+STR_0022_WHEAT                                                  :Koring
+STR_0023_RUBBER                                                 :Gomlastiek
+STR_0024_SUGAR                                                  :Suiker
+STR_0025_TOYS                                                   :Speelgoed
+STR_0026_CANDY                                                  :Lekkers
+STR_0027_COLA                                                   :Cola
+STR_0028_COTTON_CANDY                                           :Spookasem
+STR_0029_BUBBLES                                                :Borrels
+STR_002A_TOFFEE                                                 :Tameletjie
+STR_002B_BATTERIES                                              :Batterye
+STR_002C_PLASTIC                                                :Plastiek
+STR_002D_FIZZY_DRINKS                                           :Koeldranke
+STR_002E                                                        :
+STR_002F_PASSENGER                                              :Passasier
+STR_0030_COAL                                                   :Kool
+STR_0031_MAIL                                                   :Pos
+STR_0032_OIL                                                    :Olie
+STR_0033_LIVESTOCK                                              :Lewende Hawe
+STR_0034_GOODS                                                  :Goedere
+STR_0035_GRAIN                                                  :Korrel
+STR_0036_WOOD                                                   :Hout
+STR_0037_IRON_ORE                                               :Yster Erts
+STR_0038_STEEL                                                  :Staal
+STR_0039_VALUABLES                                              :Kosbaarhede
+STR_003A_COPPER_ORE                                             :Koper Erts
+STR_003B_MAIZE                                                  :Mielies
+STR_003C_FRUIT                                                  :Vrugte
+STR_003D_DIAMOND                                                :Diamant
+STR_003E_FOOD                                                   :Voedsel
+STR_003F_PAPER                                                  :Papier
+STR_0040_GOLD                                                   :Goud
+STR_0041_WATER                                                  :Water
+STR_0042_WHEAT                                                  :Koring
+STR_0043_RUBBER                                                 :Gomlastiek
+STR_0044_SUGAR                                                  :Suiker
+STR_0045_TOY                                                    :Speelgoed
+STR_0046_CANDY                                                  :Lekker
+STR_0047_COLA                                                   :Cola
+STR_0048_COTTON_CANDY                                           :Spookasem
+STR_0049_BUBBLE                                                 :Borrel
+STR_004A_TOFFEE                                                 :Tameletjie
+STR_004B_BATTERY                                                :Battery
+STR_004C_PLASTIC                                                :Plastiek
+STR_004D_FIZZY_DRINK                                            :Koeldrank
+STR_QUANTITY_NOTHING                                            :
+STR_QUANTITY_PASSENGERS                                         :{COMMA} Passasier{P "" s}
+STR_QUANTITY_COAL                                               :{WEIGHT} van kool
+STR_QUANTITY_MAIL                                               :{COMMA} sak{P "" e} van pos
+STR_QUANTITY_OIL                                                :{VOLUME} van olie
+STR_QUANTITY_LIVESTOCK                                          :{COMMA} item{P "" s} van lewende hawe
+STR_QUANTITY_GOODS                                              :{COMMA} hok{P "" ke} van goedere
+STR_QUANTITY_GRAIN                                              :{WEIGHT} van graan
+STR_QUANTITY_WOOD                                               :{WEIGHT} van hout
+STR_QUANTITY_IRON_ORE                                           :{WEIGHT} van yster erts
+STR_QUANTITY_STEEL                                              :{WEIGHT} van staal
+STR_QUANTITY_VALUABLES                                          :{COMMA} sak{P "" ke} van kosbaarhede
+STR_QUANTITY_COPPER_ORE                                         :{WEIGHT} van koper erts
+STR_QUANTITY_MAIZE                                              :{WEIGHT} van graan
+STR_QUANTITY_FRUIT                                              :{WEIGHT} van vrugte
+STR_QUANTITY_DIAMONDS                                           :{COMMA} sak{P "" ke} van diamante
+STR_QUANTITY_FOOD                                               :{WEIGHT} van kos
+STR_QUANTITY_PAPER                                              :{WEIGHT} van papier
+STR_QUANTITY_GOLD                                               :{COMMA} sak{P "" ke} van goud
+STR_QUANTITY_WATER                                              :{VOLUME} van water
+STR_QUANTITY_WHEAT                                              :{WEIGHT} van koring
+STR_QUANTITY_RUBBER                                             :{VOLUME} van gomlastiek
+STR_QUANTITY_SUGAR                                              :{WEIGHT} van suiker
+STR_QUANTITY_TOYS                                               :{COMMA} speel{P ding goed}
+STR_QUANTITY_SWEETS                                             :{COMMA} sak{P "" ke} van lekkers
+STR_QUANTITY_COLA                                               :{VOLUME} van cola
+STR_QUANTITY_CANDYFLOSS                                         :{WEIGHT} van spookasem
+STR_QUANTITY_BUBBLES                                            :{COMMA} borrel{P "" s}
+STR_QUANTITY_TOFFEE                                             :{WEIGHT} van tameletjie
+STR_QUANTITY_BATTERIES                                          :{COMMA} batter{P y ye}
+STR_QUANTITY_PLASTIC                                            :{VOLUME} van plastiek
+STR_QUANTITY_FIZZY_DRINKS                                       :{COMMA} koeldran{P k ke}
+STR_ABBREV_NOTHING                                              :
+STR_ABBREV_PASSENGERS                                           :{TINYFONT}PS
+STR_ABBREV_COAL                                                 :{TINYFONT}SK
+STR_ABBREV_MAIL                                                 :{TINYFONT}PS
+STR_ABBREV_OIL                                                  :{TINYFONT}OL
+STR_ABBREV_LIVESTOCK                                            :{TINYFONT}LH
+STR_ABBREV_GOODS                                                :{TINYFONT}GS
+STR_ABBREV_GRAIN                                                :{TINYFONT}GR
+STR_ABBREV_WOOD                                                 :{TINYFONT}HT
+STR_ABBREV_IRON_ORE                                             :{TINYFONT}YE
+STR_ABBREV_STEEL                                                :{TINYFONT}ST
+STR_ABBREV_VALUABLES                                            :{TINYFONT}KH
+STR_ABBREV_COPPER_ORE                                           :{TINYFONT}KE
+STR_ABBREV_MAIZE                                                :{TINYFONT}GR
+STR_ABBREV_FRUIT                                                :{TINYFONT}VR
+STR_ABBREV_DIAMONDS                                             :{TINYFONT}DM
+STR_ABBREV_FOOD                                                 :{TINYFONT}KO
+STR_ABBREV_PAPER                                                :{TINYFONT}PR
+STR_ABBREV_GOLD                                                 :{TINYFONT}GD
+STR_ABBREV_WATER                                                :{TINYFONT}WR
+STR_ABBREV_WHEAT                                                :{TINYFONT}GR
+STR_ABBREV_RUBBER                                               :{TINYFONT}GL
+STR_ABBREV_SUGAR                                                :{TINYFONT}SK
+STR_ABBREV_TOYS                                                 :{TINYFONT}SG
+STR_ABBREV_SWEETS                                               :{TINYFONT}LE
+STR_ABBREV_COLA                                                 :{TINYFONT}CL
+STR_ABBREV_CANDYFLOSS                                           :{TINYFONT}SA
+STR_ABBREV_BUBBLES                                              :{TINYFONT}BO
+STR_ABBREV_TOFFEE                                               :{TINYFONT}TL
+STR_ABBREV_BATTERIES                                            :{TINYFONT}BA
+STR_ABBREV_PLASTIC                                              :{TINYFONT}PL
+STR_ABBREV_FIZZY_DRINKS                                         :{TINYFONT}KD
+STR_ABBREV_NONE                                                 :{TINYFONT}NS
+STR_ABBREV_ALL                                                  :{TINYFONT}ALLE
+STR_00AE                                                        :{WHITE}{DATE_SHORT}
+STR_00AF                                                        :{WHITE}{DATE_LONG}
+STR_00B0_MAP                                                    :{WHITE}Werfkaart - {STRING}
+STR_00B1_GAME_OPTIONS                                           :{WHITE}Speletjie Opsies
+STR_00B2_MESSAGE                                                :{YELLOW}Boodskap
+STR_00B3_MESSAGE_FROM                                           :{YELLOW}Boodskap van {STRING}
+STR_POPUP_CAUTION_CAPTION                                       :{WHITE}Versigtig!
+STR_00B4_CAN_T_DO_THIS                                          :{WHITE}Kan nie dit doen nie....
+STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Kan nie die area reinig nie....
+STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}Oorspronklik kopiereg {COPYRIGHT} 1995 Chris Sawyer, Alle regte voorbehou
+STR_00B7_VERSION                                                :{BLACK}OpenTTD uitgawe {REV}
+STR_00BA_COPYRIGHT_OPENTTD                                      :{BLACK}OpenTTD {COPYRIGHT}2002-2007 Die OpenTTD span
+STR_TRANSLATED_BY                                               :{BLACK}  Vertaler(s) -
+
+STR_00C5                                                        :{BLACK}{CROSS}
+STR_00C6                                                        :{SILVER}{CROSS}
+STR_00C7_QUIT                                                   :{WHITE}Verlaat
+STR_00C8_YES                                                    :{BLACK}Ja
+STR_00C9_NO                                                     :{BLACK}Nee
+STR_00CA_ARE_YOU_SURE_YOU_WANT_TO                               :{YELLOW}Is jy seker u wil hierdie speletjie verlaat en keer terug na {STRING}?
+STR_00CB_1                                                      :{BLACK}1
+STR_00CC_2                                                      :{BLACK}2
+STR_00CD_3                                                      :{BLACK}3
+STR_00CE_4                                                      :{BLACK}4
+STR_00CF_5                                                      :{BLACK}5
+STR_00D0_NOTHING                                                :Niks
+STR_00D1_DARK_BLUE                                              :Donker Blou
+STR_00D2_PALE_GREEN                                             :Bleek Groen
+STR_00D3_PINK                                                   :Pienk
+STR_00D4_YELLOW                                                 :Geel
+STR_00D5_RED                                                    :Rooi
+STR_00D6_LIGHT_BLUE                                             :Ligte Blou
+STR_00D7_GREEN                                                  :Groen
+STR_00D8_DARK_GREEN                                             :Donker Groen
+STR_00D9_BLUE                                                   :Blou
+STR_00DA_CREAM                                                  :Room
+STR_00DB_MAUVE                                                  :Ligpers
+STR_00DC_PURPLE                                                 :Pers
+STR_00DD_ORANGE                                                 :Oranje
+STR_00DE_BROWN                                                  :Bruin
+STR_00DF_GREY                                                   :Grys
+STR_00E0_WHITE                                                  :Wit
+STR_00E1_TOO_MANY_VEHICLES_IN_GAME                              :{WHITE}Te veel voertuie in speletjie
+STR_00E2                                                        :{BLACK}{COMMA}
+STR_00E3                                                        :{RED}{COMMA}
+STR_00E4_LOCATION                                               :{BLACK}Lokasie
+STR_00E5_CONTOURS                                               :Kantoere
+STR_00E6_VEHICLES                                               :Voertuie
+STR_00E7_INDUSTRIES                                             :Nywerhede
+STR_00E8_ROUTES                                                 :Roete
+STR_00E9_VEGETATION                                             :Plantegroei
+STR_00EA_OWNERS                                                 :Eienaars
+STR_00EB_ROADS                                                  :{BLACK}{TINYFONT}Paaie
+STR_00EC_RAILROADS                                              :{BLACK}{TINYFONT}Spoorwege
+STR_00ED_STATIONS_AIRPORTS_DOCKS                                :{BLACK}{TINYFONT}Stasies/Lughawes/Werfe
+STR_00EE_BUILDINGS_INDUSTRIES                                   :{BLACK}{TINYFONT}Geboue/Nywerhede
+STR_00EF_VEHICLES                                               :{BLACK}{TINYFONT}Voertuie
+STR_00F0_100M                                                   :{BLACK}{TINYFONT}100m
+STR_00F1_200M                                                   :{BLACK}{TINYFONT}200m
+STR_00F2_300M                                                   :{BLACK}{TINYFONT}300m
+STR_00F3_400M                                                   :{BLACK}{TINYFONT}400m
+STR_00F4_500M                                                   :{BLACK}{TINYFONT}500m
+STR_00F5_TRAINS                                                 :{BLACK}{TINYFONT}Treine
+STR_00F6_ROAD_VEHICLES                                          :{BLACK}{TINYFONT}Pad Voertuie
+STR_00F7_SHIPS                                                  :{BLACK}{TINYFONT}Skepe
+STR_00F8_AIRCRAFT                                               :{BLACK}{TINYFONT}Vliegtuie
+STR_00F9_TRANSPORT_ROUTES                                       :{BLACK}{TINYFONT}Vervoer Roete
+STR_00FA_COAL_MINE                                              :{BLACK}{TINYFONT}Kool Myn
+STR_00FB_POWER_STATION                                          :{BLACK}{TINYFONT}Krag Stasie
+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}Boerdery
+STR_0100_FACTORY                                                :{BLACK}{TINYFONT}Fabriek
+STR_0101_PRINTING_WORKS                                         :{BLACK}{TINYFONT}Drukwerke
+STR_0102_OIL_WELLS                                              :{BLACK}{TINYFONT}Olie Spruite
+STR_0103_IRON_ORE_MINE                                          :{BLACK}{TINYFONT}Yster Erts Myn
+STR_0104_STEEL_MILL                                             :{BLACK}{TINYFONT}Staal Meule
+STR_0105_BANK                                                   :{BLACK}{TINYFONT}Bank
+STR_0106_PAPER_MILL                                             :{BLACK}{TINYFONT}Papier Meule
+STR_0107_GOLD_MINE                                              :{BLACK}{TINYFONT}Goud Myn
+STR_0108_FOOD_PROCESSING_PLANT                                  :{BLACK}{TINYFONT}Kos Verwerkings Fabriek
+STR_0109_DIAMOND_MINE                                           :{BLACK}{TINYFONT}Diamant Myn
+STR_010A_COPPER_ORE_MINE                                        :{BLACK}{TINYFONT}Koper Erts Myn
+STR_010B_FRUIT_PLANTATION                                       :{BLACK}{TINYFONT}Vrugte Plantasie
+STR_010C_RUBBER_PLANTATION                                      :{BLACK}{TINYFONT}Gomlastiek Plantasie
+STR_010D_WATER_SUPPLY                                           :{BLACK}{TINYFONT}Water Verskaf
+STR_010E_WATER_TOWER                                            :{BLACK}{TINYFONT}Water Toring
+STR_010F_LUMBER_MILL                                            :{BLACK}{TINYFONT}Timmerhout Meule
+STR_0110_COTTON_CANDY_FOREST                                    :{BLACK}{TINYFONT}Spookasem Woud
+STR_0111_CANDY_FACTORY                                          :{BLACK}{TINYFONT}Lekker Fabriek
+STR_0112_BATTERY_FARM                                           :{BLACK}{TINYFONT}Battery Plaas
+STR_0113_COLA_WELLS                                             :{BLACK}{TINYFONT}Cola Spruite
+STR_0114_TOY_SHOP                                               :{BLACK}{TINYFONT}Speelgoed Winkel
+STR_0115_TOY_FACTORY                                            :{BLACK}{TINYFONT}Speelgoed Fabriek
+STR_0116_PLASTIC_FOUNTAINS                                      :{BLACK}{TINYFONT}Plastiek Fonteine
+STR_0117_FIZZY_DRINK_FACTORY                                    :{BLACK}{TINYFONT}Koeldrank Fabriek
+STR_0118_BUBBLE_GENERATOR                                       :{BLACK}{TINYFONT}Borrel Genereerder
+STR_0119_TOFFEE_QUARRY                                          :{BLACK}{TINYFONT}Tameletjie Prooi
+STR_011A_SUGAR_MINE                                             :{BLACK}{TINYFONT}Suiker Myn
+STR_011B_RAILROAD_STATION                                       :{BLACK}{TINYFONT}Spoorweg Stasie
+STR_011C_TRUCK_LOADING_BAY                                      :{BLACK}{TINYFONT}Vragmotor Laai Area
+STR_011D_BUS_STATION                                            :{BLACK}{TINYFONT}Bus Stasie
+STR_011E_AIRPORT_HELIPORT                                       :{BLACK}{TINYFONT}Lughawe/Helihawe
+STR_011F_DOCK                                                   :{BLACK}{TINYFONT}Hawe
+STR_0120_ROUGH_LAND                                             :{BLACK}{TINYFONT}Rof Daal
+STR_0121_GRASS_LAND                                             :{BLACK}{TINYFONT}Gras Daal
+STR_0122_BARE_LAND                                              :{BLACK}{TINYFONT}Hou Daal
+STR_0123_FIELDS                                                 :{BLACK}{TINYFONT}Velde
+STR_0124_TREES                                                  :{BLACK}{TINYFONT}Boome
+STR_0125_ROCKS                                                  :{BLACK}{TINYFONT}Rotse
+STR_0126_WATER                                                  :{BLACK}{TINYFONT}Water
+STR_0127_NO_OWNER                                               :{BLACK}{TINYFONT}Geen Eienaar
+STR_0128_TOWNS                                                  :{BLACK}{TINYFONT}Dorpe
+STR_0129_INDUSTRIES                                             :{BLACK}{TINYFONT}Nywerhede
+STR_012A_DESERT                                                 :{BLACK}{TINYFONT}Woestyn
+STR_012B_SNOW                                                   :{BLACK}{TINYFONT}Sneeu
+STR_012C_MESSAGE                                                :{WHITE}Boodskap
+STR_012D                                                        :{WHITE}{STRING}
+STR_012E_CANCEL                                                 :{BLACK}Kanselleer
+STR_012F_OK                                                     :{BLACK}OK
+STR_0130_RENAME                                                 :{BLACK}Hernoem
+STR_0131_TOO_MANY_NAMES_DEFINED                                 :{WHITE}Te veel name bepaal
+STR_0132_CHOSEN_NAME_IN_USE_ALREADY                             :{WHITE}Gekies naam alreeds in gebruik
+
+STR_0133_WINDOWS                                                :Windows
+STR_0134_UNIX                                                   :Unix
+STR_0135_OSX                                                    :OS X
+STR_OSNAME_BEOS                                                 :BeOS
+STR_OSNAME_MORPHOS                                              :MorphOS
+STR_OSNAME_AMIGAOS                                              :AmigaOS
+STR_OSNAME_OS2                                                  :OS/2
+STR_OSNAME_SUNOS                                                :SunOS
+
+STR_013B_OWNED_BY                                               :{WHITE}...besit deur {STRING}
+STR_013C_CARGO                                                  :{BLACK}Vrag
+STR_013D_INFORMATION                                            :{BLACK}Inligting
+STR_013E_CAPACITIES                                             :{BLACK}Kapasiteite
+STR_013E_TOTAL_CARGO                                            :{BLACK}Totaale Vrag
+STR_013F_CAPACITY                                               :{BLACK}Kapasiteit: {LTBLUE}{CARGO}
+STR_CAPACITY_MULT                                               :{BLACK}Kapasiteit: {LTBLUE}{CARGO} (x{NUM})
+STR_013F_TOTAL_CAPACITY_TEXT                                    :{BLACK}Totaale vrag kapasitiet van die trein:
+STR_013F_TOTAL_CAPACITY                                         :{LTBLUE}- {CARGO} ({SHORTCARGO})
+STR_TOTAL_CAPACITY_MULT                                         :{LTBLUE}- {CARGO} ({SHORTCARGO}) (x{NUM})
+STR_0140_NEW_GAME                                               :{BLACK}Nuwe Speletjie
+STR_0141_LOAD_GAME                                              :{BLACK}Laai Speletjie
+STR_SINGLE_PLAYER                                               :{BLACK}Enkel speeler
+STR_MULTIPLAYER                                                 :{BLACK}Veelspeler
+STR_SCENARIO_EDITOR                                             :{BLACK}Draaiboek Redakteur
+
+STR_64                                                          :64
+STR_128                                                         :128
+STR_256                                                         :256
+STR_512                                                         :512
+STR_1024                                                        :1024
+STR_2048                                                        :2048
+STR_MAPSIZE                                                     :{BLACK}Werfkaart groote:
+STR_BY                                                          :{BLACK}*
+STR_0148_GAME_OPTIONS                                           :{BLACK}Speletjie Opsies
+
+STR_0150_SOMEONE                                                :iemand{SKIP}{SKIP}
+STR_0151_MAP_OF_WORLD                                           :Werfkaart van wêreld
+STR_0152_TOWN_DIRECTORY                                         :Dorp gids
+STR_0153_SUBSIDIES                                              :Subsidiëe
+
+STR_UNITS_IMPERIAL                                              :Imperiaal
+STR_UNITS_METRIC                                                :Metriek
+STR_UNITS_SI                                                    :SI
+
+STR_UNITS_VELOCITY_IMPERIAL                                     :{COMMA} mph
+STR_UNITS_VELOCITY_METRIC                                       :{COMMA} km/h
+STR_UNITS_VELOCITY_SI                                           :{COMMA} m/s
+
+STR_UNITS_POWER_IMPERIAL                                        :{COMMA}hp
+STR_UNITS_POWER_METRIC                                          :{COMMA}hp
+STR_UNITS_POWER_SI                                              :{COMMA}kW
+
+STR_UNITS_WEIGHT_SHORT_IMPERIAL                                 :{COMMA}t
+STR_UNITS_WEIGHT_SHORT_METRIC                                   :{COMMA}t
+STR_UNITS_WEIGHT_SHORT_SI                                       :{COMMA}kg
+
+STR_UNITS_WEIGHT_LONG_IMPERIAL                                  :{COMMA} ton{P "" ne}
+STR_UNITS_WEIGHT_LONG_METRIC                                    :{COMMA} tonne{P "" s}
+STR_UNITS_WEIGHT_LONG_SI                                        :{COMMA} kg
+
+STR_UNITS_VOLUME_SHORT_IMPERIAL                                 :{COMMA}gal
+STR_UNITS_VOLUME_SHORT_METRIC                                   :{COMMA}l
+STR_UNITS_VOLUME_SHORT_SI                                       :{COMMA}m³
+
+STR_UNITS_VOLUME_LONG_IMPERIAL                                  :{COMMA} gallon{P "" s}
+STR_UNITS_VOLUME_LONG_METRIC                                    :{COMMA} litre{P "" s}
+STR_UNITS_VOLUME_LONG_SI                                        :{COMMA} m³
+
+STR_UNITS_FORCE_IMPERIAL                                        :{COMMA}x10³ lbf
+STR_UNITS_FORCE_METRIC                                          :{COMMA} ton krag
+STR_UNITS_FORCE_SI                                              :{COMMA} kN
+
+############ range for menu starts
+STR_0154_OPERATING_PROFIT_GRAPH                                 :Bediening profyt grafiek
+STR_0155_INCOME_GRAPH                                           :Inkomste grafiek
+STR_0156_DELIVERED_CARGO_GRAPH                                  :Gelewer cargo grafiek
+STR_0157_PERFORMANCE_HISTORY_GRAPH                              :Werkverrigting geskiedenis grafiek
+STR_0158_COMPANY_VALUE_GRAPH                                    :Maatskappy waarde grafiek
+STR_0159_CARGO_PAYMENT_RATES                                    :Vrag vergoeding koerse
+STR_015A_COMPANY_LEAGUE_TABLE                                   :Maatskappy verbond tabel
+STR_PERFORMANCE_DETAIL_MENU                                     :Omstandig prestasie gradering
+############ range for menu ends
+
+STR_015B_OPENTTD                                                :{WHITE}Omtrent OpenTTD
+STR_015C_SAVE_GAME                                              :Spaar Speletjie
+STR_015D_LOAD_GAME                                              :Laai speletjie
+STR_015E_QUIT_GAME                                              :Verlaat Speletjie
+STR_015F_QUIT                                                   :Gaan uit
+STR_ABANDON_GAME_QUERY                                          :{YELLOW}Is jy seker jy wil die speletjie verlaat?
+STR_0161_QUIT_GAME                                              :{WHITE}Verlaat Speletjie
+STR_SORT_ORDER_TIP                                              :{BLACK}Selekteer sorteer orde (afklimende/klimende)
+STR_SORT_CRITERIA_TIP                                           :{BLACK}Selekteer sorteer maatstaf
+STR_SORT_BY                                                     :{BLACK}Sorteer by
+
+STR_SORT_BY_POPULATION                                          :{BLACK}Populasie
+STR_SORT_BY_PRODUCTION                                          :{BLACK}Produksie
+STR_SORT_BY_TYPE                                                :{BLACK}Tipe
+STR_SORT_BY_TRANSPORTED                                         :{BLACK}Uitgervoer
+STR_SORT_BY_NAME                                                :{BLACK}Naam
+STR_SORT_BY_DROPDOWN_NAME                                       :Naam
+STR_SORT_BY_DATE                                                :{BLACK}Datum
+STR_SORT_BY_NUMBER                                              :Nommer
+STR_SORT_BY_PROFIT_LAST_YEAR                                    :Profyt verlede jaar
+STR_SORT_BY_PROFIT_THIS_YEAR                                    :Profyt die jaar
+STR_SORT_BY_AGE                                                 :Ouderdom
+STR_SORT_BY_RELIABILITY                                         :Betroubaarheid
+STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE                        :Totaale kapasitiet per vrag tipe
+STR_SORT_BY_MAX_SPEED                                           :Maksimum spoed
+STR_SORT_BY_MODEL                                               :Model
+STR_SORT_BY_VALUE                                               :Waarde
+STR_SORT_BY_FACILITY                                            :Stasie tipe
+STR_SORT_BY_WAITING                                             :Wagtend vrag waarde
+STR_SORT_BY_RATING_MAX                                          :Vrag gradering
+STR_ENGINE_SORT_ENGINE_ID                                       :EngineID (klassieke sorteer)
+STR_ENGINE_SORT_COST                                            :Koste
+STR_ENGINE_SORT_POWER                                           :Krag
+STR_ENGINE_SORT_INTRO_DATE                                      :Inleiding Datum
+STR_ENGINE_SORT_RUNNING_COST                                    :Loopkoste
+STR_ENGINE_SORT_POWER_VS_RUNNING_COST                           :Krag/Loopkoste
+STR_ENGINE_SORT_CARGO_CAPACITY                                  :Vrag Kapasiteit
+STR_NO_WAITING_CARGO                                            :{BLACK}Geen vrag van enige tipe is op wag
+STR_SELECT_ALL_FACILITIES                                       :{BLACK}Kies alle fakulteite
+STR_SELECT_ALL_TYPES                                            :{BLACK}Kies alle vrag tipes (geen wag vrag ingesluit)
+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}Toon '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
+STR_REPLACE_VEHICLES                                            :Vervang voertuie
+STR_SEND_TRAIN_TO_DEPOT                                         :Stuur na Depot
+STR_SEND_ROAD_VEHICLE_TO_DEPOT                                  :Stuur na Depot
+STR_SEND_SHIP_TO_DEPOT                                          :Stuur na Depot
+STR_SEND_AIRCRAFT_TO_HANGAR                                     :Stuur na Hangar
+STR_SEND_FOR_SERVICING                                          :Stuur vir Diens
+
+############ range for months starts
+STR_0162_JAN                                                    :Jan
+STR_0163_FEB                                                    :Feb
+STR_0164_MAR                                                    :Mrt
+STR_0165_APR                                                    :Apr
+STR_0166_MAY                                                    :Mei
+STR_0167_JUN                                                    :Jun
+STR_0168_JUL                                                    :Jul
+STR_0169_AUG                                                    :Aug
+STR_016A_SEP                                                    :Sep
+STR_016B_OCT                                                    :Okt
+STR_016C_NOV                                                    :Nov
+STR_016D_DEC                                                    :Des
+############ range for months ends
+
+STR_016E                                                        :{TINYFONT}{STRING}{} {STRING}
+STR_016F                                                        :{TINYFONT}{STRING}{} {STRING}{}{NUM}
+STR_0170                                                        :{TINYFONT}{STRING}-
+STR_0171_PAUSE_GAME                                             :{BLACK}Pouse speletjie
+STR_0172_SAVE_GAME_ABANDON_GAME                                 :{BLACK}Spaar speletjie, verlaat speletjie, verlaat
+STR_0173_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se stasies
+STR_0174_DISPLAY_MAP                                            :{BLACK}Vertoon werfkaart
+STR_0175_DISPLAY_MAP_TOWN_DIRECTORY                             :{BLACK}Vertoon werfkaart, dorp gids
+STR_0176_DISPLAY_TOWN_DIRECTORY                                 :{BLACK}Vertoon stad gids
+STR_0177_DISPLAY_COMPANY_FINANCES                               :{BLACK}Vertoon maatskappy finasies inligting
+STR_0178_DISPLAY_COMPANY_GENERAL                                :{BLACK}Vertoon generale maatskappy inligting
+STR_0179_DISPLAY_GRAPHS                                         :{BLACK}Vertoon grafieke
+STR_017A_DISPLAY_COMPANY_LEAGUE                                 :{BLACK}Vertoon maatskappy verbond tafel
+STR_017B_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se treine
+STR_017C_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se pad voertuie
+STR_017D_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se skepe
+STR_017E_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se vliegtuie
+STR_017F_ZOOM_THE_VIEW_IN                                       :{BLACK}Vergroot die skerm
+STR_0180_ZOOM_THE_VIEW_OUT                                      :{BLACK}Vergroot die siening uit
+STR_0181_BUILD_RAILROAD_TRACK                                   :{BLACK}Bou spoorweg spoor
+STR_0182_BUILD_ROADS                                            :{BLACK}Bou Paaie
+STR_0183_BUILD_SHIP_DOCKS                                       :{BLACK}Bou skip hawe
+STR_0184_BUILD_AIRPORTS                                         :{BLACK}Bou lughawe
+STR_0185_PLANT_TREES_PLACE_SIGNS                                :{BLACK}Plant boome, plaas tekens ens.
+STR_0186_LAND_BLOCK_INFORMATION                                 :{BLACK}Daal area informasie
+STR_0187_OPTIONS                                                :{BLACK}Opsies
+STR_0188                                                        :{BLACK}{SMALLUPARROW}
+STR_0189                                                        :{BLACK}{SMALLDOWNARROW}
+STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}kan nie diens tussentyd verander nie...
+STR_018B_CLOSE_WINDOW                                           :{BLACK}Maak venster toe
+STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}Venster titel - sleep die om venster te beweeg
+STR_STICKY_BUTTON                                               :{BLACK}Bemerk die venste as ontoemaakbaar by die"Sluit Alle Vensters" sleutel
+STR_RESIZE_BUTTON                                               :{BLACK}Kliek en sleep om venster te vergroot
+STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}Kliek hier om na die huidige spaar/laai lêer te spring
+STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Vernietig geboue ens. op 'n vierkant van daal
+STR_018E_LOWER_A_CORNER_OF_LAND                                 :{BLACK}Laer 'n hoek van daal
+STR_018F_RAISE_A_CORNER_OF_LAND                                 :{BLACK}Verhoog 'n hoek van daal
+STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}Rol baan - rol die lys op/af
+STR_HSCROLL_BAR_SCROLLS_LIST                                    :{BLACK}Rol baan - rol die lys op/af
+STR_0191_SHOW_LAND_CONTOURS_ON_MAP                              :{BLACK}Toon daal kontoere op werfkaart
+STR_0192_SHOW_VEHICLES_ON_MAP                                   :{BLACK}Toon voertuie op werfkaart
+STR_0193_SHOW_INDUSTRIES_ON_MAP                                 :{BLACK}Toon nywerhede op werfkaart
+STR_0194_SHOW_TRANSPORT_ROUTES_ON                               :{BLACK}Toon vervoer roete op werfkaart
+STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Toon plantegroei op werfkaart
+STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}Toon daal eienaars op werfkaart
+STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Tokkel dorp name on/off op werfkaart
+STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}Profyt die jaar: {CURRENCY} (verlede jaar: {CURRENCY})
+
+############ range for service numbers starts
+STR_AGE                                                         :{COMMA} ja{P ar re} ({COMMA})
+STR_AGE_RED                                                     :{RED}{COMMA} ja{P ar re} ({COMMA})
+############ range for service numbers ends
+
+STR_019C_ROAD_VEHICLE                                           :Pad voertuig
+STR_019D_AIRCRAFT                                               :Vliegtuig
+STR_019E_SHIP                                                   :Skip
+STR_019F_TRAIN                                                  :Trein
+STR_01A0_IS_GETTING_OLD                                         :{WHITE}{STRING} {COMMA} word ou
+STR_01A1_IS_GETTING_VERY_OLD                                    :{WHITE}{STRING} {COMMA} word baie ou
+STR_01A2_IS_GETTING_VERY_OLD_AND                                :{WHITE}{STRING} {COMMA} word baie ou en dringend benodig vervang
+STR_01A3_LAND_AREA_INFORMATION                                  :{WHITE}Daal area informasie
+STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}Kos om te reinig: {LTBLUE}N/A
+STR_01A5_COST_TO_CLEAR                                          :{BLACK}Kos om te reinig: {LTBLUE}{CURRENCY}
+STR_01A6_N_A                                                    :N/A
+STR_01A7_OWNER                                                  :{BLACK}Eienaar: {LTBLUE}{STRING}
+STR_01A8_LOCAL_AUTHORITY                                        :{BLACK}Plaaslike raad: {LTBLUE}{STRING}
+STR_01A9_NONE                                                   :Geen
+STR_01AA_NAME                                                   :{BLACK}Naam
+STR_01AB                                                        :{BLACK}{TINYFONT}{VEHICLE}
+
+############ range for days starts
+STR_01AC_1ST                                                    :1ste
+STR_01AD_2ND                                                    :2de
+STR_01AE_3RD                                                    :3de
+STR_01AF_4TH                                                    :4de
+STR_01B0_5TH                                                    :5de
+STR_01B1_6TH                                                    :6de
+STR_01B2_7TH                                                    :7de
+STR_01B3_8TH                                                    :8ste
+STR_01B4_9TH                                                    :9de
+STR_01B5_10TH                                                   :10de
+STR_01B6_11TH                                                   :11de
+STR_01B7_12TH                                                   :12de
+STR_01B8_13TH                                                   :13de
+STR_01B9_14TH                                                   :14de
+STR_01BA_15TH                                                   :15de
+STR_01BB_16TH                                                   :16de
+STR_01BC_17TH                                                   :17de
+STR_01BD_18TH                                                   :18de
+STR_01BE_19TH                                                   :19de
+STR_01BF_20TH                                                   :20ste
+STR_01C0_21ST                                                   :21ste
+STR_01C1_22ND                                                   :22ste
+STR_01C2_23RD                                                   :23ste
+STR_01C3_24TH                                                   :24ste
+STR_01C4_25TH                                                   :25ste
+STR_01C5_26TH                                                   :26ste
+STR_01C6_27TH                                                   :27ste
+STR_01C7_28TH                                                   :28ste
+STR_01C8_29TH                                                   :29ste
+STR_01C9_30TH                                                   :30ste
+STR_01CA_31ST                                                   :31ste
+############ range for days ends
+
+STR_01CB                                                        :{TINYFONT}{COMMA}
+
+STR_01CE_CARGO_ACCEPTED                                         :{BLACK}Vrag aanvaar: {LTBLUE}
+
+STR_01D1_8                                                      :({COMMA}/8 {STRING})
+STR_01D2_JAZZ_JUKEBOX                                           :{WHITE}Jazz Bl�kas
+STR_01D3_SOUND_MUSIC                                            :Klank/musiek
+STR_01D4_SHOW_SOUND_MUSIC_WINDOW                                :{BLACK}Vertoon klank/musiek venster
+STR_01D5_ALL                                                    :{TINYFONT}Alle
+STR_01D6_OLD_STYLE                                              :{TINYFONT}Ou Styl
+STR_01D7_NEW_STYLE                                              :{TINYFONT}Nuwe Styl
+STR_01D8_EZY_STREET                                             :{TINYFONT}Ezy Straat
+STR_01D9_CUSTOM_1                                               :{TINYFONT}Gewoonte 1
+STR_01DA_CUSTOM_2                                               :{TINYFONT}Gewoonte 2
+STR_01DB_MUSIC_VOLUME                                           :{BLACK}{TINYFONT}Musiek Volume
+STR_01DC_EFFECTS_VOLUME                                         :{BLACK}{TINYFONT}Effekte Volume
+STR_01DD_MIN_MAX                                                :{BLACK}{TINYFONT}MIN  '  '  ' '  '  '  MAKS
+STR_01DE_SKIP_TO_PREVIOUS_TRACK                                 :{BLACK}Gaan terug na vorig liedjie in keuse
+STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION                        :{BLACK}Gaan voor na volgende liedjie in keuse
+STR_01E0_STOP_PLAYING_MUSIC                                     :{BLACK}Ophou musiek speel
+STR_01E1_START_PLAYING_MUSIC                                    :{BLACK}Begin musiek speel
+STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC                              :{BLACK}Sleep skyfie om musiek en effekte volumes te stel
+STR_01E3                                                        :{DKGREEN}{TINYFONT}--
+STR_01E4_0                                                      :{DKGREEN}{TINYFONT}0{COMMA}
+STR_01E5                                                        :{DKGREEN}{TINYFONT}{COMMA}
+STR_01E6                                                        :{DKGREEN}{TINYFONT}------
+STR_01E7                                                        :{DKGREEN}{TINYFONT}"{STRING}"
+STR_01E8_TRACK_XTITLE                                           :{BLACK}{TINYFONT}Liedjie{SETX 88}Titel
+STR_01E9_SHUFFLE                                                :{TINYFONT}Skuifel
+STR_01EA_PROGRAM                                                :{TINYFONT}{BLACK}Musiek lys
+STR_01EB_MUSIC_PROGRAM_SELECTION                                :{WHITE}Musiek Lys Keuse
+STR_01EC_0                                                      :{TINYFONT}{LTBLUE}0{COMMA} "{STRING}"
+STR_01ED                                                        :{TINYFONT}{LTBLUE}{COMMA} "{STRING}"
+STR_01EE_TRACK_INDEX                                            :{TINYFONT}{BLACK}Liedjie Index
+STR_01EF_PROGRAM                                                :{TINYFONT}{BLACK}Musiek Lys - '{STRING}'
+STR_01F0_CLEAR                                                  :{TINYFONT}{BLACK}Reinig
+STR_01F1_SAVE                                                   :{TINYFONT}{BLACK}Spaar
+STR_01F2_CURRENT_PROGRAM_OF_MUSIC                               :{BLACK}Huidige musiek keuse
+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' (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}Spaar musiek stellings
+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}Tokkel musiek lys skuifel aan/af
+STR_01FC_SHOW_MUSIC_TRACK_SELECTION                             :{BLACK}Vertoon musiek liedjie keuse venster
+STR_01FD_CLICK_ON_SERVICE_TO_CENTER                             :{BLACK}Kliek op diens om uitsig te senter op nywerheid/stad
+STR_01FE_DIFFICULTY                                             :{BLACK}Moeilikheid ({STRING})
+STR_01FF                                                        :{TINYFONT}{BLACK}{DATE_LONG}
+STR_0200_LAST_MESSAGE_NEWS_REPORT                               :Laaste boodskap/nuus verslag
+STR_0201_MESSAGE_SETTINGS                                       :Boodskap stellings
+STR_MESSAGE_HISTORY_MENU                                        :Boodskap Geskidenis
+STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}Vertoon laaste boodskap/nuus verslag, vertoon boodskap opsies
+STR_0204_MESSAGE_OPTIONS                                        :{WHITE}Boodskap Opsies
+STR_0205_MESSAGE_TYPES                                          :{BLACK}Boodskap tipes:
+STR_0206_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Aankoms van eerste voertuig tot speler se stasie
+STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Aankoms van eerste voertuig tot mededinger se stasie
+STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Ongelukke / rampe
+STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Maatskappy informasie
+STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Oop / sluiting van nywerhede
+STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Ekonomie veranderings
+STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Raad / informasie op speler se voertuie
+STR_020C_NEW_VEHICLES                                           :{YELLOW}Nuwe voertuie
+STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Veranderings na vrag aanvarde
+STR_020E_SUBSIDIES                                              :{YELLOW}Subsidiee
+STR_020F_GENERAL_INFORMATION                                    :{YELLOW}Generale informasie
+STR_MESSAGES_ALL                                                :{YELLOW}Stel alle boodskap tipes na: Af/Opsomming/Volle
+STR_MESSAGE_SOUND                                               :{YELLOW}Speel geluid vir opsommige nuus boodskappe
+STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO                       :{WHITE}...te ver van vorige destinasie
+STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}Hoof maatskappye wat het {NUM}{}({STRING} Vlak) gekry
+STR_TOP_COMPANIES_NETWORK_GAME                                  :{BIGFONT}{BLACK}Maatskappy Liga Tafel in {NUM}
+STR_0212                                                        :{BIGFONT}{COMMA}.
+STR_0213_BUSINESSMAN                                            :Sakeman
+STR_0214_ENTREPRENEUR                                           :Ondernemer
+STR_0215_INDUSTRIALIST                                          :Nyweraar
+STR_0216_CAPITALIST                                             :Kapitalis
+STR_0217_MAGNATE                                                :Magnaat
+STR_0218_MOGUL                                                  :Mongool
+STR_0219_TYCOON_OF_THE_CENTURY                                  :Magnaat van die eeu
+STR_HIGHSCORE_NAME                                              :{BIGFONT}{PLAYERNAME}, {COMPANY}
+STR_HIGHSCORE_STATS                                             :{BIGFONT}'{STRING}'   ({COMMA})
+STR_021B_ACHIEVES_STATUS                                        :{BLACK}{BIGFONT}{COMPANY} behaal '{STRING}' stand!
+STR_021C_OF_ACHIEVES_STATUS                                     :{WHITE}{BIGFONT}{PLAYERNAME} van {COMPANY} behaal '{STRING}' stand!
+STR_021F                                                        :{BLUE}{COMMA}
+STR_0221_OPENTTD                                                :{YELLOW}OpenTTD
+STR_0222_SCENARIO_EDITOR                                        :{YELLOW}Draaiboek Redigeerder
+STR_0223_LAND_GENERATION                                        :{WHITE}Daal Generasie
+STR_0224                                                        :{BLACK}{UPARROW}
+STR_0225                                                        :{BLACK}{DOWNARROW}
+STR_0228_INCREASE_SIZE_OF_LAND_AREA                             :{BLACK}Vergroot land area om te verlaag/verhoog
+STR_0229_DECREASE_SIZE_OF_LAND_AREA                             :{BLACK}Verminder land area om te verlaag/verhoog
+STR_022A_GENERATE_RANDOM_LAND                                   :{BLACK}Opwek lukraak daal
+STR_022B_RESET_LANDSCAPE                                        :{BLACK}Herstel landskap
+STR_022C_RESET_LANDSCAPE                                        :{WHITE}Herstel landskap
+STR_RESET_LANDSCAPE_TOOLTIP                                     :{BLACK}Verwyder alle speler-besit eiendom van die werfkaart
+STR_RESET_LANDSCAPE_CONFIRMATION_TEXT                           :{WHITE}Is jy seker u wil alle speler-besit eiendom verwyder?
+STR_022E_LANDSCAPE_GENERATION                                   :{BLACK}Landskap generasie
+STR_022F_TOWN_GENERATION                                        :{BLACK}Dorp generasie
+STR_0230_INDUSTRY_GENERATION                                    :{BLACK}Nyweheid generasie
+STR_0231_ROAD_CONSTRUCTION                                      :{BLACK}Pad samestelling
+STR_0233_TOWN_GENERATION                                        :{WHITE}Dorp Generasie
+STR_0234_NEW_TOWN                                               :{BLACK}Nuwe Dorp
+STR_0235_CONSTRUCT_NEW_TOWN                                     :{BLACK}Bou nuwe dorp
+STR_0236_CAN_T_BUILD_TOWN_HERE                                  :{WHITE}Dorp kan nie hier gebou word nie...
+STR_0237_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}...te naby aan rand van werfkaart
+STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN                              :{WHITE}...te naby aan 'n ander dorp
+STR_0239_SITE_UNSUITABLE                                        :{WHITE}...werf nie geskik nie
+STR_023A_TOO_MANY_TOWNS                                         :{WHITE}...te veel dorpe
+STR_CANNOT_GENERATE_TOWN                                        :{WHITE}Kan nie enige stede bou nie
+STR_NO_SPACE_FOR_TOWN                                           :{WHITE}...daar is nie meer spasie op die werfkaart nie
+STR_023B_INCREASE_SIZE_OF_TOWN                                  :{BLACK}verhoog grootte van dorp
+STR_023C_EXPAND                                                 :{BLACK}Sprei uit
+STR_023D_RANDOM_TOWN                                            :{BLACK}Lukraak Dorp
+STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION                          :{BLACK}Bou dorp in lukraak lokasie
+STR_023F_INDUSTRY_GENERATION                                    :{WHITE}Nywerheid Generasie
+STR_0240_COAL_MINE                                              :{BLACK}Kool Myn
+STR_0241_POWER_STATION                                          :{BLACK}Krag Stasie
+STR_0242_SAWMILL                                                :{BLACK}Saagmeul
+STR_0243_FOREST                                                 :{BLACK}Woud
+STR_0244_OIL_REFINERY                                           :{BLACK}Olie Raffineerdery
+STR_0245_OIL_RIG                                                :{BLACK}Olieboor
+STR_0246_FACTORY                                                :{BLACK}Fabriek
+STR_0247_STEEL_MILL                                             :{BLACK}Staalmeul
+STR_0248_FARM                                                   :{BLACK}Plaas
+STR_0249_IRON_ORE_MINE                                          :{BLACK}Yster Erts Myn
+STR_024A_OIL_WELLS                                              :{BLACK}Olie Bron
+STR_024B_BANK                                                   :{BLACK}Bank
+STR_024C_PAPER_MILL                                             :{BLACK}Papiermeul
+STR_024D_FOOD_PROCESSING_PLANT                                  :{BLACK}Kos Verwerking Fabriek
+STR_024E_PRINTING_WORKS                                         :{BLACK}Drukwerke
+STR_024F_GOLD_MINE                                              :{BLACK}Goud Myn
+STR_0250_LUMBER_MILL                                            :{BLACK}Timmehout Meule
+STR_0251_FRUIT_PLANTATION                                       :{BLACK}Vrugte Plantasie
+STR_0252_RUBBER_PLANTATION                                      :{BLACK}Gomlastiek Plantasie
+STR_0253_WATER_SUPPLY                                           :{BLACK}Water Verskaf
+STR_0254_WATER_TOWER                                            :{BLACK}Water Toring
+STR_0255_DIAMOND_MINE                                           :{BLACK}Diamant Myn
+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 Boerdery
+STR_025A_COLA_WELLS                                             :{BLACK}Cola Spruite
+STR_025B_TOY_SHOP                                               :{BLACK}Speelgoed Winkel
+STR_025C_TOY_FACTORY                                            :{BLACK}Speelgoed Fabriek
+STR_025D_PLASTIC_FOUNTAINS                                      :{BLACK}Plastiek Fonteine
+STR_025E_FIZZY_DRINK_FACTORY                                    :{BLACK}Koeldrank Fabriek
+STR_025F_BUBBLE_GENERATOR                                       :{BLACK}Borrel Genereerder
+STR_0260_TOFFEE_QUARRY                                          :{BLACK}Tameletjie Prooi
+STR_0261_SUGAR_MINE                                             :{BLACK}Suiker Myn
+STR_0262_CONSTRUCT_COAL_MINE                                    :{BLACK}Bou Kool Myn
+STR_0263_CONSTRUCT_POWER_STATION                                :{BLACK}Bou Krag Stasie
+STR_0264_CONSTRUCT_SAWMILL                                      :{BLACK}Bou Saagmeule
+STR_0265_PLANT_FOREST                                           :{BLACK}Beplant Woud
+STR_0266_CONSTRUCT_OIL_REFINERY                                 :{BLACK}Bou Olie Raffineerdery
+STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY                             :{BLACK}Bou Olieboor (Kan slegs naby aan kante van werfkaart gebou word)
+STR_0268_CONSTRUCT_FACTORY                                      :{BLACK}Bou Fabriek
+STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}Bou Staal Meule
+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 Spruite
+STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Bou Bank (kan slegs in dorpe met 'n populasie grooter as 1200 gebou word)
+STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}Bou Papier Meule
+STR_026F_CONSTRUCT_FOOD_PROCESSING                              :{BLACK}Bou Kos Verwerkings Fabriek
+STR_0270_CONSTRUCT_PRINTING_WORKS                               :{BLACK}Bou Drukwerke
+STR_0271_CONSTRUCT_GOLD_MINE                                    :{BLACK}Bou Goud Myn
+STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Bou Bank (Kan slegs in dorpe gebou word)
+STR_0273_CONSTRUCT_LUMBER_MILL_TO                               :{BLACK}Bou Timmerhoutmeul (om reenwoud te reinig en Hout te maak)
+STR_0274_PLANT_FRUIT_PLANTATION                                 :{BLACK}Beplant Vrugte Plantasie
+STR_0275_PLANT_RUBBER_PLANTATION                                :{BLACK}Beplant Gomlastiek Plantasie
+STR_0276_CONSTRUCT_WATER_SUPPLY                                 :{BLACK}Bou Water Verskaf
+STR_0277_CONSTRUCT_WATER_TOWER_CAN                              :{BLACK}Bou Water Toring (Kan slegs in dorpe gebou word)
+STR_0278_CONSTRUCT_DIAMOND_MINE                                 :{BLACK}Bou Diamant Myn
+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 Boerdery
+STR_027D_CONSTRUCT_COLA_WELLS                                   :{BLACK}Bou Cola Spruite
+STR_027E_CONSTRUCT_TOY_SHOP                                     :{BLACK}Bou Speelgoed Winkel
+STR_027F_CONSTRUCT_TOY_FACTORY                                  :{BLACK}Bou Speelgoed Fabriek
+STR_0280_CONSTRUCT_PLASTIC_FOUNTAINS                            :{BLACK}Bou Plastiek Fonteine
+STR_0281_CONSTRUCT_FIZZY_DRINK_FACTORY                          :{BLACK}Bou Koeldrank Fabriek
+STR_0282_CONSTRUCT_BUBBLE_GENERATOR                             :{BLACK}Bou Borrel Genereerder
+STR_0283_CONSTRUCT_TOFFEE_QUARRY                                :{BLACK}Bou Tameletjie Prooi
+STR_0284_CONSTRUCT_SUGAR_MINE                                   :{BLACK}Bou Suiker Myn
+STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}Kan nie {STRING} hier bou nie...
+STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...moet eers dorp bou
+STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...slegs een toegelaat per dorp
+STR_0288_PLANT_TREES                                            :{BLACK}Boome beplant
+STR_0289_PLACE_SIGN                                             :{BLACK}Plaas teken
+STR_028A_RANDOM_TREES                                           :{BLACK}Lukraak Boome
+STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}Beplant bome wildweg oor landskap
+STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE                         :{BLACK}Plaas rotse op landskap
+STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Plaas vuurtoring
+STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Plaas sender
+STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Bepaal woestyn area.{}Druk en hou CTRL om te verwyder
+STR_CREATE_LAKE                                                 :{BLACK}Bepaal water area.{}Maak 'n kanaal, tensy CTRL is ingehou teen seevlak, dan sal dit vloed vul die omgewings
+STR_0290_DELETE                                                 :{BLACK}Uitvee
+STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Uitvee hierdie dorp heeltemal
+STR_0292_SAVE_SCENARIO                                          :Spaar draaiboek
+STR_0293_LOAD_SCENARIO                                          :Laai draaiboek
+STR_LOAD_HEIGHTMAP                                              :Laai Hoogtekaart
+STR_0294_QUIT_EDITOR                                            :Laat vaar redigeerder
+STR_0295                                                        :
+STR_0296_QUIT                                                   :Laat vaar
+STR_0297_SAVE_SCENARIO_LOAD_SCENARIO                            :{BLACK}Spaar draaiboek, laai draaiboek, verlaat draaiboek redigeerder, laat vaar
+STR_0298_LOAD_SCENARIO                                          :{WHITE}Laai Draaiboek
+STR_0299_SAVE_SCENARIO                                          :{WHITE}Spaar Draaiboek
+STR_029A_PLAY_SCENARIO                                          :{BLACK}Speel Draaiboek
+STR_PLAY_HEIGHTMAP                                              :{BLACK}Speel Hoogtekaart
+STR_PLAY_HEIGHTMAP_HINT                                         :{BLACK}begin 'n nuwe speletjie, gebruikend 'n hoogtekaart as 'n landskap
+STR_QUIT_SCENARIO_QUERY                                         :{YELLOW}Is jy seker jy wil die draaiboek verlaat?
+STR_029C_QUIT_EDITOR                                            :{WHITE}Laat vaar Redigeerder
+STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan slegs in dorpe met 'n populasie van te minste 1200 gebou word
+STR_029E_MOVE_THE_STARTING_DATE                                 :{BLACK}Beweeg die begin datum 1 jaar terug
+STR_029F_MOVE_THE_STARTING_DATE                                 :{BLACK}Beweeg die begin datum 1 jaar voor
+STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH                               :{WHITE}...albei einde van brug moet op daal wees
+STR_02A1_SMALL                                                  :{BLACK}Klein
+STR_02A2_MEDIUM                                                 :{BLACK}Middel
+STR_02A3_LARGE                                                  :{BLACK}Groot
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Stad
+STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Kies dorp groote
+STR_02A5_TOWN_SIZE                                              :{YELLOW}Dorp groote:
+
+STR_02B6                                                        :{STRING}  -  {STRING}
+STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS                              :{BLACK}Toon laas boodskap of nuus verslag
+STR_OFF                                                         :Af
+STR_SUMMARY                                                     :Opsomming
+STR_FULL                                                        :Vol
+STR_02BA                                                        :{SILVER}- -  {COMPANY}  - -
+STR_02BB_TOWN_DIRECTORY                                         :Dorp gids
+STR_02BC_VEHICLE_DESIGN_NAMES                                   :{BLACK}Voertuig ontwerp name
+STR_02BD                                                        :{BLACK}{STRING}
+STR_02BE_DEFAULT                                                :Verstek
+STR_02BF_CUSTOM                                                 :Gewoonte
+STR_02C0_SAVE_CUSTOM_NAMES                                      :{BLACK}Spaar gewoonte name
+STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION                         :{BLACK}Voertuig ontwerp name keuse
+STR_02C2_SAVE_CUSTOMIZED_VEHICLE                                :{BLACK}Spaar pasgemaak voertuig ontwerp name
+
+STR_CHECKMARK                                                   :{CHECKMARK}
+############ range for menu starts
+STR_02C3_GAME_OPTIONS                                           :Speletjie opsies
+STR_02C5_DIFFICULTY_SETTINGS                                    :Moeite stellings
+STR_02C7_CONFIG_PATCHES                                         :Konfigureer laslappe
+STR_NEWGRF_SETTINGS                                             :NewGRF stellings
+STR_TRANSPARENCY_OPTIONS                                        :Deursigtigheid opsies
+STR_GAMEOPTMENU_0A                                              :
+STR_02CA_TOWN_NAMES_DISPLAYED                                   :{SETX 12}Dorp name vertoon
+STR_02CC_STATION_NAMES_DISPLAYED                                :{SETX 12}Stasie name vertoon
+STR_02CE_SIGNS_DISPLAYED                                        :{SETX 12}Tekens vertoon
+STR_WAYPOINTS_DISPLAYED2                                        :{SETX 12}Wegpunte vertoon
+STR_02D0_FULL_ANIMATION                                         :{SETX 12}Volle animasie
+STR_02D2_FULL_DETAIL                                            :{SETX 12}Vol aanwyse
+STR_02D4_TRANSPARENT_BUILDINGS                                  :{SETX 12}Deurskynend geboue
+STR_TRANSPARENT_SIGNS                                           :{SETX 12}Deurskynend stasie tekens
+############ range ends here
+
+############ range for menu starts
+STR_02D5_LAND_BLOCK_INFO                                        :Daal area informasie
+STR_02D6                                                        :
+STR_CONSOLE_SETTING                                             :Skakel troos
+STR_02D7_SCREENSHOT_CTRL_S                                      :Skermskyf (Ctrl-S)
+STR_02D8_GIANT_SCREENSHOT_CTRL_G                                :Reus Skermskyf (Ctrl-G)
+STR_02D9_ABOUT_OPENTTD                                          :Rakend 'OpenTTD'
+############ range ends here
+
+STR_02DB_OFF                                                    :{BLACK}Af
+STR_02DA_ON                                                     :{BLACK}An
+STR_02DC_DISPLAY_SUBSIDIES                                      :{BLACK}Toon subsidiee
+STR_02DD_SUBSIDIES                                              :Subsidiee
+STR_02DE_MAP_OF_WORLD                                           :Werfkaart van wêreld
+STR_EXTRA_VIEW_PORT                                             :Ekstra gesigswerf
+STR_SIGN_LIST                                                   :Teken lys
+STR_02DF_TOWN_DIRECTORY                                         :Dorp gids
+STR_TOWN_POPULATION                                             :{BLACK}Wêreld populasie: {COMMA}
+STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Gesigswerf {COMMA}
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN                                :{BLACK}Kopie na gesigswerf
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT                             :{BLACK}Kopie die lokasie van die wereldwerf na die gesigswerf
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW                                :{BLACK}Deeg van gesigswerf
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT                             :{BLACK}Deeg die lokasie van die gesigspunt na die hoofskerm
+
+STR_02E0_CURRENCY_UNITS                                         :{BLACK}Koers eenhede
+STR_02E1                                                        :{BLACK}{SKIP}{STRING}
+STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Koers eendhede keuse
+STR_MEASURING_UNITS                                             :{BLACK}Meet eenhede
+STR_02E4                                                        :{BLACK}{SKIP}{SKIP}{STRING}
+STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Meet eenhede keuse
+STR_02E6_ROAD_VEHICLES                                          :{BLACK}Pad voertuie
+STR_02E7                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
+STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Kies kant van pad waarop voetuie bestuur
+STR_02E9_DRIVE_ON_LEFT                                          :Bestuur op links
+STR_02EA_DRIVE_ON_RIGHT                                         :Bestuur op regs
+STR_02EB_TOWN_NAMES                                             :{BLACK}Dorp name
+STR_02EC                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
+STR_02ED_SELECT_STYLE_OF_TOWN_NAMES                             :{BLACK}Kies styl van stad name
+
+STR_02F4_AUTOSAVE                                               :{BLACK}Outobewaar
+STR_02F5                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
+STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Kies afstand tussen outomatiese spel bewaarde
+STR_02F7_OFF                                                    :Af
+STR_02F8_EVERY_3_MONTHS                                         :Elke 3 maande
+STR_02F9_EVERY_6_MONTHS                                         :Elke 6 maande
+STR_02FA_EVERY_12_MONTHS                                        :Elke 12 maande
+STR_02FB_START_A_NEW_GAME                                       :{BLACK}Begin nuwe spel
+STR_02FC_LOAD_A_SAVED_GAME                                      :{BLACK}Laai 'n gespaarde spel
+STR_02FE_CREATE_A_CUSTOMIZED_GAME                               :{BLACK}Skep 'n doelgeboude spel wêreld/draaiboek
+STR_02FF_SELECT_SINGLE_PLAYER_GAME                              :{BLACK}Kies enkel-speler speletjie
+STR_0300_SELECT_MULTIPLAYER_GAME                                :{BLACK}Kies multispeler speletjie van 2-8 spelers
+STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Vertoon speletjie opsies
+STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Vertoon moeite opsies
+STR_0303_START_A_NEW_GAME_USING                                 :{BLACK}Begin 'n nuwe speletjie, met 'n pasgemaak draaiboek
+STR_0304_QUIT                                                   :{BLACK}Laat vaar
+STR_0305_QUIT_OPENTTD                                           :{BLACK}Laat vaar 'OpenTTD'
+STR_0307_OPENTTD                                                :{WHITE}OpenTTD {REV}
+STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan slegs in dorpe gebou word
+STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Kies 'matig' landskap styl
+STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE                            :{BLACK}Kies 'onder-noordpool' landskap styl
+STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE                          :{BLACK}Kies 'onder-tropise' landskap styl
+STR_0311_SELECT_TOYLAND_LANDSCAPE                               :{BLACK}Kies 'speelgoedland' landskap styl
+STR_0312_FUND_CONSTRUCTION_OF_NEW                               :{BLACK}Fonds konstruksie van nuwe nywerheid
+
+############ range for menu starts
+STR_INDUSTRY_DIR                                                :Nywerheid Gids
+STR_0313_FUND_NEW_INDUSTRY                                      :Fonds nuwe nywerheid
+############ range ends here
+
+STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Fonds nuwe nywerheid
+STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
+STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan slegs in dorpe gebou word
+STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...kan slegs in reenwoud areas gebou word
+STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...kan slegs in woestyn areas gebou word
+STR_0319_PAUSED                                                 :{YELLOW}* *  GEPOOS  *  *
+
+STR_031B_SCREENSHOT_SUCCESSFULLY                                :{WHITE}Skermskyf suksesvol gespaar as '{STRING}'
+STR_031C_SCREENSHOT_FAILED                                      :{WHITE}Skermskyf misluk!
+
+STR_0329_PURCHASE_LAND_FOR_FUTURE                               :{BLACK}Koop daal vir toekoms gebruik
+STR_032F_AUTOSAVE                                               :{RED}OUTOSPAAR
+STR_SAVING_GAME                                                 :{RED}*  *  BESPARING SPELETJIE  *  *
+STR_SAVE_STILL_IN_PROGRESS                                      :{WHITE}Spaar nog in vorder, {}wag asb tot dit klaar is!
+STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Kies 'Ezy Straat styl musiek' musiek lys
+
+STR_0335_6                                                      :{BLACK}6
+STR_0336_7                                                      :{BLACK}7
+
+############ start of townname region
+STR_TOWNNAME_ORIGINAL_ENGLISH                                   :Engels (Oorspronkilik)
+STR_TOWNNAME_FRENCH                                             :Frans
+STR_TOWNNAME_GERMAN                                             :Duits
+STR_TOWNNAME_ADDITIONAL_ENGLISH                                 :Engels (Addisioneel)
+STR_TOWNNAME_LATIN_AMERICAN                                     :Latyns-Amerikaans
+STR_TOWNNAME_SILLY                                              :Snaaks
+STR_TOWNNAME_SWEDISH                                            :Sweeds
+STR_TOWNNAME_DUTCH                                              :Hollands
+STR_TOWNNAME_FINNISH                                            :Finnish
+STR_TOWNNAME_POLISH                                             :Polish
+STR_TOWNNAME_SLOVAKISH                                          :Slovakish
+STR_TOWNNAME_NORWEGIAN                                          :Norwegian
+STR_TOWNNAME_HUNGARIAN                                          :Hungarian
+STR_TOWNNAME_AUSTRIAN                                           :Austrian
+STR_TOWNNAME_ROMANIAN                                           :Romanian
+STR_TOWNNAME_CZECH                                              :Czech
+STR_TOWNNAME_SWISS                                              :Swiss
+STR_TOWNNAME_DANISH                                             :Deens
+STR_TOWNNAME_TURKISH                                            :Turks
+STR_TOWNNAME_ITALIAN                                            :Italiaans
+STR_TOWNNAME_CATALAN                                            :Catalan
+############ end of townname region
+
+STR_CURR_GBP                                                    :Pounds ()
+STR_CURR_USD                                                    :Dollars ($)
+STR_CURR_EUR                                                    :Euro (€)
+STR_CURR_YEN                                                    :Yen (¥)
+STR_CURR_ATS                                                    :Austrian Shilling (ATS)
+STR_CURR_BEF                                                    :Belgian Franc (BEF)
+STR_CURR_CHF                                                    :Swiss Franc (CHF)
+STR_CURR_CZK                                                    :Czech Koruna (CZK)
+STR_CURR_DEM                                                    :Deutschmark (DEM)
+STR_CURR_DKK                                                    :Danish Krone (DKK)
+STR_CURR_ESP                                                    :Peseta (ESP)
+STR_CURR_FIM                                                    :Finnish Markka (FIM)
+STR_CURR_FRF                                                    :Franc (FRF)
+STR_CURR_GRD                                                    :Greek Drachma (GRD)
+STR_CURR_HUF                                                    :Hungarian Forint (HUF)
+STR_CURR_ISK                                                    :Icelandic Krona (ISK)
+STR_CURR_ITL                                                    :Italian Lira (ITL)
+STR_CURR_NLG                                                    :Dutch Guilder (NLG)
+STR_CURR_NOK                                                    :Norwegian Krone (NOK)
+STR_CURR_PLN                                                    :Polish Zloty (PLN)
+STR_CURR_ROL                                                    :Romanian Leu (ROL)
+STR_CURR_RUR                                                    :Russian Rubles (RUR)
+STR_CURR_SIT                                                    :Slovenian Tolar (SIT)
+STR_CURR_SEK                                                    :Swedish Krona (SEK)
+STR_CURR_YTL                                                    :Turkish Lira (YTL)
+STR_CURR_SKK                                                    :Slovak Koruna (SKK)
+STR_CURR_BRR                                                    :Brazilian Real (BRL)
+
+STR_CURR_CUSTOM                                                 :Gebruiklike...
+
+STR_OPTIONS_LANG                                                :{BLACK}Taal
+STR_OPTIONS_LANG_CBO                                            :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
+STR_OPTIONS_LANG_TIP                                            :{BLACK}Kies die koppelvlak taal om te gebruik
+
+STR_OPTIONS_FULLSCREEN                                          :{BLACK}Volskerm
+STR_OPTIONS_FULLSCREEN_TIP                                      :{BLACK}Kies die blokkie om OpenTTD in volleskerm te speel
+
+STR_OPTIONS_RES                                                 :{BLACK}Skerm resolusie
+STR_OPTIONS_RES_CBO                                             :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
+STR_OPTIONS_RES_TIP                                             :{BLACK}Kies die skerm resolusie om te gebruik
+
+STR_OPTIONS_SCREENSHOT_FORMAT                                   :{BLACK}Skermskyf formaat
+STR_OPTIONS_SCREENSHOT_FORMAT_CBO                               :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
+STR_OPTIONS_SCREENSHOT_FORMAT_TIP                               :{BLACK}Kies die skermskyf formaat om te gebruik
+
+STR_AUTOSAVE_1_MONTH                                            :Elke maand
+STR_AUTOSAVE_FAILED                                             :{WHITE}Outospaar misluk
+
+STR_MONTH_JAN                                                   :Januarie
+STR_MONTH_FEB                                                   :Februarie
+STR_MONTH_MAR                                                   :Maart
+STR_MONTH_APR                                                   :April
+STR_MONTH_MAY                                                   :Mei
+STR_MONTH_JUN                                                   :Junie
+STR_MONTH_JUL                                                   :Julie
+STR_MONTH_AUG                                                   :Augustus
+STR_MONTH_SEP                                                   :September
+STR_MONTH_OCT                                                   :Oktober
+STR_MONTH_NOV                                                   :November
+STR_MONTH_DEC                                                   :Desember
+
+STR_HEADING_FOR_STATION                                         :{LTBLUE}Op pad na {STATION}
+STR_HEADING_FOR_STATION_VEL                                     :{LTBLUE}Op pad na {STATION}, {VELOCITY}
+STR_NO_ORDERS                                                   :{LTBLUE}Geen opdrae
+STR_NO_ORDERS_VEL                                               :{LTBLUE}Geen opdrae, {VELOCITY}
+
+STR_PASSENGERS                                                  :passasiers
+STR_BAGS                                                        :sakke
+STR_TONS                                                        :tonne
+STR_LITERS                                                      :litres
+STR_ITEMS                                                       :items
+STR_CRATES                                                      :hokke
+STR_RES_OTHER                                                   :ander
+STR_NOTHING                                                     :
+
+STR_SMALL_RIGHT_ARROW                                           :{TINYFONT}{RIGHTARROW}
+
+STR_CANT_SHARE_ORDER_LIST                                       :{WHITE}Kan nie opdraglys deel nie...
+STR_CANT_COPY_ORDER_LIST                                        :{WHITE}Kan nie opdrag lys kopie nie...
+STR_END_OF_SHARED_ORDERS                                        :{SETX 10}- - Einde van Gedeel Opdrae - -
+
+STR_TRAIN_IS_LOST                                               :{WHITE}Trein {COMMA} is verloor.
+STR_TRAIN_IS_UNPROFITABLE                                       :{WHITE}Trein {COMMA} se profyt verlede jaar was {CURRENCY}
+STR_EURO_INTRODUCE                                              :{BLACK}{BIGFONT}Europees Geldelik Samesmelting!{}{}Die Euro is ingevoer as die enigste koers vir daagliks transaksies in u land!
+
+# Start of order review system.
+# DON'T ADD OR REMOVE LINES HERE
+STR_TRAIN_HAS_TOO_FEW_ORDERS                                    :{WHITE}Trein {COMMA} het te paar opdrae in die skedule
+STR_TRAIN_HAS_VOID_ORDER                                        :{WHITE}Trein {COMMA} het 'n leemte opdrag
+STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}Trein {COMMA} het dupliseer opdrae
+STR_TRAIN_HAS_INVALID_ENTRY                                     :{WHITE}Trein {COMMA} het 'n ongeldig stasie in sy opdrae
+STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS                              :{WHITE}Pad Voertuig {COMMA} het te paar opdrae in die skedule
+STR_ROADVEHICLE_HAS_VOID_ORDER                                  :{WHITE}Pad Voertuig {COMMA} het 'n leemte opdrag
+STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY                             :{WHITE}Pad voertuig {COMMA} het dupliseer opdrae
+STR_ROADVEHICLE_HAS_INVALID_ENTRY                               :{WHITE}Pad Voertuig {COMMA} het 'n ongeldig stasie in sy opdrae
+STR_SHIP_HAS_TOO_FEW_ORDERS                                     :{WHITE}Skip {COMMA} het te paar opdrae in die skedule
+STR_SHIP_HAS_VOID_ORDER                                         :{WHITE}Skip {COMMA} het 'n leemte oprdag
+STR_SHIP_HAS_DUPLICATE_ENTRY                                    :{WHITE}Skip {COMMA} het dupliseer opdrae
+STR_SHIP_HAS_INVALID_ENTRY                                      :{WHITE}Skip {COMMA} het 'n ongeldig stasie in sy opdrae
+STR_AIRCRAFT_HAS_TOO_FEW_ORDERS                                 :{WHITE}Vliegtuig {COMMA} het te min opdrae in die opgawe
+STR_AIRCRAFT_HAS_VOID_ORDER                                     :{WHITE}vliegtuig {COMMA} het 'n leemte opdrag
+STR_AIRCRAFT_HAS_DUPLICATE_ENTRY                                :{WHITE}Vliegtuig {COMMA} het duplikaat opdrae
+STR_AIRCRAFT_HAS_INVALID_ENTRY                                  :{WHITE}Vliegtuig {COMMA} hen 'n ongeldig stasie in sy opdrae
+# end of order system
+
+STR_TRAIN_AUTORENEW_FAILED                                      :{WHITE}Outohernu misluk op trien {COMMA} (geld perk)
+STR_ROADVEHICLE_AUTORENEW_FAILED                                :{WHITE}Outohernu misluk op pad voertuig {COMMA} (geld perk)
+STR_SHIP_AUTORENEW_FAILED                                       :{WHITE}Outohernu misluk op skip {COMMA} (geld perk)
+STR_AIRCRAFT_AUTORENEW_FAILED                                   :{WHITE}Outohernuwe misluk op vliegtuig {COMMA} (geld perk)
+STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT                            :{WHITE}Trein {COMMA} is te lank na vervang
+
+STR_CONFIG_PATCHES                                              :{BLACK}Konfigureer Laslappe
+STR_CONFIG_PATCHES_TIP                                          :{BLACK}Konfigureer die laslappe
+STR_CONFIG_PATCHES_CAPTION                                      :{WHITE}konfigureer Laslappe
+
+STR_CONFIG_PATCHES_OFF                                          :Af
+STR_CONFIG_PATCHES_ON                                           :Aan
+STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Wys voertuig spoed in die standbaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Laattoe gebou op skuinstes en kusse: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Laattoe terraforming onder geboue, spoore, ens. (autoslope): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Laattoe meer realisties grootte opvanggebied: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Toelaat verwydering van meer stad-besite paaie, bruge, ens: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Ontsper gebou van baie lang treine: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_REALISTICACCEL                               :{LTBLUE}Ontsper realistiese versnelling vir treine: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Verbied triene en skepe om 90 graad draaie te maak: {ORANGE}{STRING} {LTBLUE} (benodig NPF)
+STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}sluit aan trein stasies gebou naby mekaar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}Verlaat stasie as enige vrag vol is, as 'volle gelaai': {ORANGE}{STRING}
+STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Gebruik verebeterde laai algoritme: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_GRADUAL_LOADING                              :{LTBLUE}Laai voertuie geleidelik: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_INFLATION                                    :{LTBLUE}Inflasie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Aflewer vrag na 'n stasie slegs as daar 'n aanvrag is:: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Toelaat opbou van baie lank bruge: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Laattoe gaan na depot opdrae: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD             :{LTBLUE}Manual primêre nywerheid konstruksie metode: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE        :geen
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL      :as ander nywerhede
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :vooruitsigting
+STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Laattoe vele soortgelyke nywerhede per dorp: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Nywerhede van die selfde tipe kan naby aan mekaar gebou word: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Toon altyd lang datum in die standbaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Toon seine op die bestuur kant: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Toon finansies venster op die einde van die jaar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}TTDPatch versoenbaar deurgaande hantering: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Pad voertuig toustaan (met kwantum effekte): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Was skerm as muis by die kant is: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Laattoe die omkooping van plaaslike raad: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Laattoe die koop van eksklusief vervoer regte: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Laattoe die stuur van geld na ander maatskappye: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ongelyk stasies: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nuwe wêreldwyd padvind (NPF, oorbrug NTP): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Gewig vermenivoud vir vrag om swaar treine te simuleer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Laattoe skyf-deur pad stop op dorp besit paaie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Laattoe gebou van aangrensend stasies: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Altyd laattoe klein lughawenst: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Waarsku as trein verloor is: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}Bespreek voertuig se opdrae: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ORDER_REVIEW_OFF                             :nee
+STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :ja, maar sluit uit gestop voertuie
+STR_CONFIG_PATCHES_ORDER_REVIEW_ON                              :van alle voertuie
+STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Waarsku as trein inkomste negatief is: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}Voertuie verval nooit nie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}Outohernuwe voertuig as hy oud raak
+STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Outohernuwe wanner voertuig is {ORANGE}{STRING}{LTBLUE} maande voor/agter maks ouderdom
+STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Outohernuwe minimum vereisde geld vir hernuwe: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duur van fout boodskap: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Toon dorp populasie in die dorp naam etiket: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Onsigbaar boome (met deurskynend geboue): {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Land genereerder: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Oorspronklik
+STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS                 :TerraGenesis
+STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Maks afstand van kant vir Olie Raffineerderye {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SNOWLINE_HEIGHT                              :{LTBLUE}Sneeu lyn hoogte: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}Grofheif van terrein (slegs TerraGenesis) : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Baie Glad
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_SMOOTH                  :Glad
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_ROUGH                   :Rof
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_ROUGH              :Baie Rof
+STR_CONFIG_PATCHES_TREE_PLACER                                  :{LTBLUE}Boom plaas algoritme: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TREE_PLACER_NONE                             :Geen
+STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL                         :Oorspronklik
+STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED                         :Verbeter
+STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION                           :{LTBLUE}Hoogtekaart rotasie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE         :Teller vooruit
+STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE                 :Vooruit
+STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT                         :{LTBLUE}Die hoogte vlak 'n plat draaiboek werfkaart word: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}Maks stasie gesprei: {ORANGE}{STRING} {RED}Waarskuwing: hoë stel vertraag speletjie
+STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Versien helikopters by helihawes outomaties: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Verbind landereye werktuigbaan na spoor/pad/water/lughawe werktuigbaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Omkeer rol rigting: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Versag kykpoort rollees: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Toon 'n meting wanneer jy verskeie bou-gereedskap gebruik: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Toon maatskappy lewerye: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES_NONE                                :Geen
+STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Eie maatskappy
+STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Alle maatskappye
+STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Verkies span klets met <ENTER>: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Funksie van rolwiel: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Zoem werfkaart
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Rol werfkaart
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Af
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Werfkaart rolwiel spoed: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Regs-kliek emulasie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command-kliek
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control-kliek
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Af
+
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Outomaties pouse wanneer om te begin 'n nuwe speletjie: {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_LOADING_INDICATORS                           :{LTBLUE}Gebruik laai aanwysers: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Af
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Eie maatskappy
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Alle maatskappye
+STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Ontsper timetabling vir voertuie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Toon rooster in ticks liewer as dae: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Verstek spoor tipe (na nuwe spel/spel laai): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Gewone Spoor
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Elektrifiseerde Spoor
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Eenspoor
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV                     :Maglev
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :Eers beskikbaar
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Laas beskikbaar
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :Meeste gebruik
+
+STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Toon gebou gereedskap wanneer geen geskik voertuie is beskikbaar : {ORANGE}{STRING}
+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}
+STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}Max skepe per speler: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_AI_BUILDS_TRAINS                             :{LTBLUE}Sper treine vir rekenaar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH                            :{LTBLUE}Sper pad voertuie vir rekenaar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}Sper vliegtuie vir rekenaar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}Sper skepe vir rekenaar: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Ontsper nuwe AI (alpha) in staat: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Laattoe AIe in multispeler (eksperimentele): {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Verstek diens pouse vir treine: {ORANGE}{STRING} dae/%
+STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Verstek diens pouse vir treine: {ORANGE}strem
+STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Verstek diens pouse vir pad voertuie: {ORANGE}{STRING} dae/%
+STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Verstek diens pouse vir pad voertuie: {ORANGE}strem
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Gebrekte versien tussentyd vir vlietuie: {ORANGE}{STRING} dae/%
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Gebrekte versien tussentyd vir vlietuie: {ORANGE}gestrem
+STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Verstek diens pouse vir skepe: {ORANGE}{STRING} dae/%
+STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Verstek diens pouse vir skepe: {ORANGE}strem
+STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}Sper diens wanneer komplikasies is na geen gestel: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}Stel wa spoed limite in staak: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DISABLE_ELRAILS                              :{LTBLUE}Gestrem elektriese spoore: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_COLORED_NEWS_YEAR                            :{LTBLUE}Gekleurde nuus verskyn in: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}Jaar om te begin: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ENDING_YEAR                                  :{LTBLUE}Eindig speletjie in: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}Ontsper versag ekonomie (meer, kleiner veranderings)
+STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Laattoe deele aankoop van ander maatskappye
+STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Wanneer sleep, plaas seine elke: {ORANGE}{STRING} teel(e)
+STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Outomaties bou semaphores voor: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Die dorp uitleg "niks meer paaie" is nie geldig in die draaiboek redigeerder
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Kies dorp-pad uitleg: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :niks meer paaie
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :verstek
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :beter paaie
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 grid
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 grid
+
+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
+STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Regs
+STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Venster slag straal: {ORANGE}{STRING} px
+STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Venster slag straal: {ORANGE}strem
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Dorp groei spoed: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Geen
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Stadig
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normaal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Vinnig
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Baie vinnig
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Gedeelte van dorpe wat sal stede word: {ORANGE}1 in {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Gedeelte van dorpe wat sal stede word: {ORANGE}None
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Aanvanklike stad grootte multiplier: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Verwyder verspot pad-elemente gedurende die pad konstruksie
+
+STR_CONFIG_PATCHES_GUI                                          :{BLACK}koppelvlak
+STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruksie
+STR_CONFIG_PATCHES_VEHICLES                                     :{BLACK}Voertuie
+STR_CONFIG_PATCHES_STATIONS                                     :{BLACK}Stasies
+STR_CONFIG_PATCHES_ECONOMY                                      :{BLACK}Ekonomie
+STR_CONFIG_PATCHES_AI                                           :{BLACK}Mededingers
+
+STR_CONFIG_PATCHES_DISABLED                                     :gestrem
+STR_CONFIG_PATCHES_INT32                                        :{NUM}
+STR_CONFIG_PATCHES_CURRENCY                                     :{CURRENCY}
+
+STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Verander stel waarde
+STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Sommige of almal van die verstek diens pouse(s) onder is onversoenbaar met die gekies stel! 5-90% en 30-800 dae is geldig
+STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Gebruik YAPF vir skepe: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Gebruik YAPF vir pad voertuie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Gebruik YAPF vir treine: {ORANGE}{STRING}
+
+STR_TEMPERATE_LANDSCAPE                                         :Magtig landskap
+STR_SUB_ARCTIC_LANDSCAPE                                        :Onder-noordpool landskap
+STR_SUB_TROPICAL_LANDSCAPE                                      :Onder-tropies landskap
+STR_TOYLAND_LANDSCAPE                                           :Speelgoedland landskap
+
+STR_CHEATS                                                      :{WHITE}Kullery
+STR_CHEATS_TIP                                                  :{BLACK}Tikblokkies wys ann as jy die bedreig vroeë gebruik het
+STR_CHEATS_WARNING                                              :{BLACK}Waarskuwing! U staan op die punt om jou mededinger te verrai. Hou in gedagte dat so 'n skande sal vir ewigheid onthou word.
+STR_CHEAT_MONEY                                                 :{LTBLUE}Vermeerder geld by {CURRENCY}
+STR_CHEAT_CHANGE_PLAYER                                         :{LTBLUE}Speel as speler: {ORANGE}{COMMA}
+STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}Tower stootskraper (uitwis nywerhede, onbeweegbares): {ORANGE}{STRING}
+STR_CHEAT_CROSSINGTUNNELS                                       :{LTBLUE}Tonnels mag vir mekaar kruis: {ORANGE}{STRING}
+STR_CHEAT_BUILD_IN_PAUSE                                        :{LTBLUE}Bou terwyl in pouse modus: {ORANGE}{STRING}
+STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}Straalvliegtuie sal nie (dikwels) op klein lughawe bots nie: {ORANGE} {STRING}
+STR_CHEAT_SWITCH_CLIMATE                                        :{LTBLUE}Skakel klimaat: {ORANGE} {STRING}
+STR_CHEAT_CHANGE_DATE                                           :{LTBLUE}Verander datum: {ORANGE} {DATE_SHORT}
+STR_CHEAT_SETUP_PROD                                            :{LTBLUE}Ontsper modifisering van produksie waardes: {ORANGE}{STRING}
+
+STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}Op pad na {WAYPOINT}
+STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Op pad na {WAYPOINT}, {VELOCITY}
+
+STR_GO_TO_WAYPOINT                                              :Gaan oor {WAYPOINT}
+STR_GO_NON_STOP_TO_WAYPOINT                                     :Gaan deurgaande oor {WAYPOINT}
+
+STR_WAYPOINTNAME_CITY                                           :Wegpunt {TOWN}
+STR_WAYPOINTNAME_CITY_SERIAL                                    :Wegpunt {TOWN} #{COMMA}
+STR_LANDINFO_WAYPOINT                                           :Wegpunt
+
+STR_WAYPOINT                                                    :{WHITE}Wegpunt
+STR_WAYPOINT_GRAPHICS_TIP                                       :{BLACK}Kies wegpunt tipe
+
+STR_WAYPOINT_VIEWPORT                                           :{WHITE}{WAYPOINT}
+STR_WAYPOINT_VIEWPORT_TINY                                      :{TINYFONT}{WHITE}{WAYPOINT}
+STR_WAYPOINT_RAW                                                :{WAYPOINT}
+STR_EDIT_WAYPOINT_NAME                                          :{WHITE}Redigeer wegpunt naam
+
+STR_CANT_CHANGE_WAYPOINT_NAME                                   :{WHITE}Kan nie wegpunt naam verander nie...
+STR_CONVERT_RAIL_TO_WAYPOINT_TIP                                :{BLACK}Verdoel spoor na wegpunt
+STR_CANT_BUILD_TRAIN_WAYPOINT                                   :{WHITE}Kanie nie trein wegpunt hier bou nie...
+STR_CANT_REMOVE_TRAIN_WAYPOINT                                  :{WHITE}Kan nie trein wegpunt van hier werwyder nie...
+
+STR_BUILD_AUTORAIL_TIP                                          :{BLACK}Bou spoorweg spoor met die Outospoor metode
+
+STR_NO_TOWN_IN_SCENARIO                                         :{WHITE}...daar is geen dorp in die draaiboek
+
+STR_GENERATE_RANDOM_LANDSCAPE                                   :{WHITE}Is jy seker jy wil 'n lukraake landeryke skep?
+STR_MANY_RANDOM_TOWNS                                           :{BLACK}Baie lukraak dorpe
+STR_RANDOM_TOWNS_TIP                                            :{BLACK}Omslag die werfkaart met lukraak geplaas dorpe
+STR_MANY_RANDOM_INDUSTRIES                                      :Baie luraak nywehede
+STR_RANDOM_INDUSTRIES_TIP                                       :{BLACK}Omslag die werfkaart met wildweg geplaas nywerhede
+STR_CAN_T_GENERATE_INDUSTRIES                                   :{WHITE}Kan nie nywerhede opwek nie...
+
+STR_LANDSCAPING_TOOLBAR_TIP                                     :{BLACK}Oppe die landargitekteur werktuigbaan om land te verhoog/verlaag, boome beplant, ens.
+STR_LANDSCAPING_TOOLBAR                                         :{WHITE}Landargitekteur
+STR_LEVEL_LAND_TOOLTIP                                          :{BLACK}Vlakte daal
+
+
+STR_TREES_RANDOM_TYPE                                           :{BLACK}Boome van lukraak tipe
+STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Plaas boome van lukraak tipe
+
+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...
+STR_BUILD_LOCKS_TIP                                             :{BLACK}Bou sluite
+STR_LANDINFO_LOCK                                               :Sluit
+
+STR_BUOY_IS_IN_USE                                              :{WHITE}...baken is in gebruik!
+
+STR_LANDINFO_COORDS                                             :{BLACK}Koördineer: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
+
+STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Kan nie deel van stasie verwyder nie...
+STR_CANT_CONVERT_RAIL                                           :{WHITE}Kan nie spoor tipe hier verdoel nie...
+STR_CONVERT_RAIL_TIP                                            :{BLACK}Verdoel/Opgradeer die spoor tipe
+
+STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP                                :{BLACK}Sleep trein enjin hier om hele trein te verkoop
+
+STR_DRAG_DROP                                                   :{BLACK}Sleep & Drop
+STR_STATION_DRAG_DROP                                           :{BLACK}Bou 'n stasie gebruikend sleep & drop
+STR_SELECT_STATION_CLASS_TIP                                    :{BLACK}Kies 'n stasie klas om te vertoon
+STR_SELECT_STATION_TYPE_TIP                                     :{BLACK}Kies die stasie tipe om te bou
+
+STR_FAST_FORWARD                                                :{BLACK}Vinnig vooruit die spel
+STR_MESSAGE_HISTORY                                             :{WHITE}Boodskap Geskidenis
+STR_MESSAGE_HISTORY_TIP                                         :{BLACK}'n Lys van al die onlangs nuus boodskappe
+STR_MESSAGES_DISABLE_ALL                                        :{BLACK}Sper alle
+STR_MESSAGES_ENABLE_ALL                                         :{BLACK}Ontsper alle
+
+STR_CONSTRUCT_COAL_MINE_TIP                                     :{BLACK}Bou Kool Myn
+STR_CONSTRUCT_FOREST_TIP                                        :{BLACK}Wout Beplant
+STR_CONSTRUCT_OIL_RIG_TIP                                       :{BLACK}Bou Olieboor
+STR_CONSTRUCT_FARM_TIP                                          :{BLACK}Fonds Boerdery
+STR_CONSTRUCT_COPPER_ORE_MINE_TIP                               :{BLACK}Bou Koper Erts Myn
+STR_CONSTRUCT_OIL_WELLS_TIP                                     :{BLACK}Boor vir Olie
+STR_CONSTRUCT_GOLD_MINE_TIP                                     :{BLACK}Bou Goud Myn
+STR_CONSTRUCT_DIAMOND_MINE_TIP                                  :{BLACK}Bou Diamant Myn
+STR_CONSTRUCT_IRON_ORE_MINE_TIP                                 :{BLACK}Bou Yster Erts Myn
+STR_CONSTRUCT_FRUIT_PLANTATION_TIP                              :{BLACK}Fonds Vrugte Plantasie
+STR_CONSTRUCT_RUBBER_PLANTATION_TIP                             :{BLACK}Fonds Gomlastiek Plantasie
+STR_CONSTRUCT_WATER_SUPPLY_TIP                                  :{BLACK}Fonds Water Verskaf
+STR_CONSTRUCT_COTTON_CANDY_TIP                                  :{BLACK}Beplant Spookasem Woud
+STR_CONSTRUCT_BATTERY_FARM_TIP                                  :{BLACK}Befonds Battery Boerdery
+STR_CONSTRUCT_COLA_WELLS_TIP                                    :{BLACK}Boor vir Cola
+STR_CONSTRUCT_PLASTIC_FOUNTAINS_TIP                             :{BLACK}Fonds Plastiek Fonteine
+STR_CONSTRUCT_BUBBLE_GENERATOR_TIP                              :{BLACK}Bou Borrel Genereerder
+STR_CONSTRUCT_TOFFEE_QUARRY_TIP                                 :{BLACK}Fonds Tameletjie Prooi
+STR_CONSTRUCT_SUGAR_MINE_TIP                                    :{BLACK}Bou Suiker Myn
+
+STR_INDUSTRYDIR_CAPTION                                         :{WHITE}Nywerhede
+STR_INDUSTRYDIR_ITEM                                            :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}){YELLOW} ({COMMA}% uitgevoer)
+STR_INDUSTRYDIR_ITEM_TWO                                        :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}/{CARGO}){YELLOW} ({COMMA}%/{COMMA}% uitgevoer)
+STR_INDUSTRYDIR_ITEM_NOPROD                                     :{ORANGE}{INDUSTRY}
+
+STR_INDUSTRY_TOO_CLOSE                                          :{WHITE}...te naby aan 'n ander nywerheid
+
+STR_RAIL_REFIT_VEHICLE_TO_CARRY                                 :{BLACK}Herstel trein om 'n ander vrag tipe te ontvoer
+STR_RAIL_REFIT_VEHICLE                                          :{BLACK}Herstel trein
+STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Kies vrag tipe vir trein te ontvoer
+STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED                             :{BLACK}Herstel trein om verlig vrag tipe te ontvoer
+STR_RAIL_CAN_T_REFIT_VEHICLE                                    :{WHITE}kan nie trein herstel nie...
+STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Diens pouse is in persente: {ORANGE}{STRING}
+STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Verander produksie
+
+TEMP_AI_IN_PROGRESS                                             :{WHITE}Welkom by die nuwe ai onder ontwikkeling. Indien u ontmoet probleme, neem 'n skermskyf en pos dit in die forum.
+TEMP_AI_ACTIVATED                                               :{WHITE}Waarskuwing: die nuwe AI is nogsteeds alfa! Tans, slegs vragmotors en busse werk!
+TEMP_AI_MULTIPLAYER                                             :{WHITE}waarskuwing: implementasie is steeds eksperimentele (gebruikend nuwe AI). asseblief rapporteer enige probleme na truelight@openttd.org.
+
+############ network gui strings
+
+STR_NETWORK_MULTIPLAYER                                         :{WHITE}Multispeler
+
+STR_NETWORK_PLAYER_NAME                                         :{BLACK}Speler naam:
+STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Die is die naam waarmee ander spelers sal jou aanwys
+STR_NETWORK_CONNECTION                                          :{BLACK}Verbinding:
+STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Kies teen internet spel of 'n Plaaslike Area Netwerk (LAN) spel
+
+STR_NETWORK_START_SERVER                                        :{BLACK}Begin verskaffer
+STR_NETWORK_START_SERVER_TIP                                    :{BLACK}Begin u eie verskaffer
+
+STR_NETWORK_GAME_NAME                                           :{BLACK}Naam
+STR_NETWORK_GAME_NAME_TIP                                       :{BLACK}Naam van die speletjie
+STR_NETWORK_INFO_ICONS_TIP                                      :{BLACK}Taal, bediender verwerking, ens.
+STR_NETWORK_CLICK_GAME_TO_SELECT                                :{BLACK}Kliek 'n speletjie van die lys om dit te selekteer
+
+STR_NETWORK_FIND_SERVER                                         :{BLACK}Versoek verskaffer
+STR_NETWORK_FIND_SERVER_TIP                                     :{BLACK}Versoek netwerk vir 'n verskaffer
+STR_NETWORK_ADD_SERVER                                          :{BLACK}Byvoeg Bediender
+STR_NETWORK_ADD_SERVER_TIP                                      :{BLACK}Voeg 'n verskaffer tot die lys wat sal altyd wees gemerk vir loopende speletjies.
+STR_NETWORK_ENTER_IP                                            :{BLACK}Invoeg die adres van die gasheer
+
+STR_NETWORK_GENERAL_ONLINE                                      :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA}
+STR_NETWORK_CLIENTS_CAPTION                                     :{BLACK}Kliente
+STR_NETWORK_CLIENTS_CAPTION_TIP                                 :{BLACK}Kliente oplyn / Kliente maks{}Maatskappye oplyn / Maatskappye maks
+STR_NETWORK_GAME_INFO                                           :{SILVER}SPEL INFORMASIE
+STR_ORANGE                                                      :{ORANGE}{STRING}
+STR_NETWORK_CLIENTS                                             :{SILVER}Kliente:  {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
+STR_NETWORK_LANGUAGE                                            :{SILVER}Taal:  {WHITE}{STRING}
+STR_NETWORK_TILESET                                             :{SILVER}Blokkiestel:  {WHITE}{STRING}
+STR_NETWORK_MAP_SIZE                                            :{SILVER}Werfkaart groote:  {WHITE}{COMMA}x{COMMA}
+STR_NETWORK_SERVER_VERSION                                      :{SILVER}Verskaffer hersiening:  {WHITE}{STRING}
+STR_NETWORK_SERVER_ADDRESS                                      :{SILVER}Verskaffer adres:  {WHITE}{STRING} : {NUM}
+STR_NETWORK_START_DATE                                          :{SILVER}Begin datum:  {WHITE}{DATE_SHORT}
+STR_NETWORK_CURRENT_DATE                                        :{SILVER}Huidige datum:  {WHITE}{DATE_SHORT}
+STR_NETWORK_PASSWORD                                            :{SILVER}Wagwoord beskerm!
+STR_NETWORK_SERVER_OFFLINE                                      :{SILVER}VERSKAFFER AFLYN
+STR_NETWORK_SERVER_FULL                                         :{SILVER}VERSKAFFER VOL
+STR_NETWORK_VERSION_MISMATCH                                    :{SILVER}HERSIENING ONGELYK
+STR_NETWORK_GRF_MISMATCH                                        :{SILVER}NEWGRF MISPAS
+
+STR_NETWORK_JOIN_GAME                                           :{BLACK}Verbind spel
+
+
+STR_NETWORK_START_GAME_WINDOW                                   :{WHITE}Begin nuwe multispeler speletjie
+
+STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Spel naam:
+STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Die spel naam sal vertoon word na ander spelers in die multispeler keuse
+STR_NETWORK_SET_PASSWORD                                        :{BLACK}Stel wagwoord
+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 werfkaart
+STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Watter werfkaart wil jy speel?
+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 (adverteer)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} Klient{P "" e}
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maks kliente:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Kies die maksimum nommer van kliente. Alle gleufe hoef nie om vol te wees nie
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} Maatskap{P py pye}
+STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Maks maatskappye:
+STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Beperk die verskaffer na 'n sekere bedrag van maatskappye
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} aanskouer{P "" s}
+STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Maks aanskouers:
+STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Beperk die verskaffer na 'n sekere bedrag van aanskouers
+STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Taal gepraat:
+STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Ander spelers sal weet watter taal op die verskaffer gepraat is
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
+STR_NETWORK_START_GAME                                          :{BLACK}Begin Speletjie
+STR_NETWORK_START_GAME_TIP                                      :{BLACK}Begin 'n nuwe netwerk spel van 'n lukraak werfkaart, of draaiboek
+STR_NETWORK_LOAD_GAME                                           :{BLACK}Laai Speletjie
+STR_NETWORK_LOAD_GAME_TIP                                       :{BLACK}Hervat 'n vroeër gespaar multispeler speletjie (wees seker om te konnekteer as die korrekte speler)
+
+############ Leave those lines in this order!!
+STR_NETWORK_LANG_ANY                                            :Enige
+STR_NETWORK_LANG_ENGLISH                                        :Engels
+STR_NETWORK_LANG_GERMAN                                         :Duits
+STR_NETWORK_LANG_FRENCH                                         :Frans
+STR_NETWORK_LANG_BRAZILIAN                                      :Brazilian
+STR_NETWORK_LANG_BULGARIAN                                      :Bulgarian
+STR_NETWORK_LANG_CHINESE                                        :Chinese
+STR_NETWORK_LANG_CZECH                                          :Czech
+STR_NETWORK_LANG_DANISH                                         :Danish
+STR_NETWORK_LANG_DUTCH                                          :Dutch
+STR_NETWORK_LANG_ESPERANTO                                      :Esperanto
+STR_NETWORK_LANG_FINNISH                                        :Finnish
+STR_NETWORK_LANG_HUNGARIAN                                      :Hungarian
+STR_NETWORK_LANG_ICELANDIC                                      :Icelandic
+STR_NETWORK_LANG_ITALIAN                                        :Italian
+STR_NETWORK_LANG_JAPANESE                                       :Japanese
+STR_NETWORK_LANG_KOREAN                                         :Korean
+STR_NETWORK_LANG_LITHUANIAN                                     :Lithuanian
+STR_NETWORK_LANG_NORWEGIAN                                      :Norwegian
+STR_NETWORK_LANG_POLISH                                         :Polish
+STR_NETWORK_LANG_PORTUGUESE                                     :Portuguese
+STR_NETWORK_LANG_ROMANIAN                                       :Romanian
+STR_NETWORK_LANG_RUSSIAN                                        :Russian
+STR_NETWORK_LANG_SLOVAK                                         :Slovak
+STR_NETWORK_LANG_SLOVENIAN                                      :Slovenian
+STR_NETWORK_LANG_SPANISH                                        :Spanish
+STR_NETWORK_LANG_SWEDISH                                        :Swedish
+STR_NETWORK_LANG_TURKISH                                        :Turkish
+STR_NETWORK_LANG_UKRAINIAN                                      :Ukrainian
+############ End of leave-in-this-order
+
+STR_NETWORK_GAME_LOBBY                                          :{WHITE}Multispeler spel tuiste
+
+STR_NETWORK_PREPARE_TO_JOIN                                     :{BLACK}Voorberei om te verbind:   {ORANGE}{STRING}
+STR_NETWORK_COMPANY_LIST_TIP                                    :{BLACK}'n Lys van alle ondernemings tans in hierdie speletjie. U kan een van beide sluit aan een of begin 'n nuwe een indien daar is 'n vry maatskappy gleuf
+STR_NETWORK_NEW_COMPANY                                         :{BLACK}Nuwe Maatskappy
+STR_NETWORK_NEW_COMPANY_TIP                                     :{BLACK}Skep 'n nuwe maatskappy
+STR_NETWORK_SPECTATE_GAME                                       :{BLACK}Aanskou speletjie
+STR_NETWORK_SPECTATE_GAME_TIP                                   :{BLACK}Bekyk die spel as 'n aanskouer
+STR_NETWORK_JOIN_COMPANY                                        :{BLACK}Verbind maatskappy
+STR_NETWORK_JOIN_COMPANY_TIP                                    :{BLACK}Hulp om die maatskappy te bestuur
+STR_NETWORK_REFRESH                                             :{BLACK}Vervris verskaffer
+STR_NETWORK_REFRESH_TIP                                         :{BLACK}Vervris die verskaffer inligting
+
+STR_NETWORK_COMPANY_INFO                                        :{SILVER}MAATSKAPPY INFORMASIE
+
+STR_NETWORK_COMPANY_NAME                                        :{SILVER}Maatskappy naam:  {WHITE}{STRING}
+STR_NETWORK_INAUGURATION_YEAR                                   :{SILVER}Inwyding:  {WHITE}{NUM}
+STR_NETWORK_VALUE                                               :{SILVER}Maatskappy waarde:  {WHITE}{CURRENCY}
+STR_NETWORK_CURRENT_BALANCE                                     :{SILVER}Hudige balans:  {WHITE}{CURRENCY}
+STR_NETWORK_LAST_YEARS_INCOME                                   :{SILVER}Verlede jaar se inkome:  {WHITE}{CURRENCY}
+STR_NETWORK_PERFORMANCE                                         :{SILVER}Prestasie:  {WHITE}{NUM}
+
+STR_NETWORK_VEHICLES                                            :{SILVER}Voertuie:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
+STR_NETWORK_STATIONS                                            :{SILVER}Stasies:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
+STR_NETWORK_PLAYERS                                             :{SILVER}Spelers:  {WHITE}{STRING}
+
+STR_NETWORK_CONNECTING                                          :{WHITE}Besig om the konnek...
+
+############ Leave those lines in this order!!
+STR_NETWORK_CONNECTING_1                                        :{BLACK}(1/6) Konnek...
+STR_NETWORK_CONNECTING_2                                        :{BLACK}(2/6) Gemagtiging...
+STR_NETWORK_CONNECTING_3                                        :{BLACK}(3/6) Opwagting...
+STR_NETWORK_CONNECTING_4                                        :{BLACK}(4/6) Werfkaart aflaai..
+STR_NETWORK_CONNECTING_5                                        :{BLACK}(5/6) Verwerk Data...
+STR_NETWORK_CONNECTING_6                                        :{BLACK}(6/6) Registreer...
+
+STR_NETWORK_CONNECTING_SPECIAL_1                                :{BLACK}Haal speletjie informasie...
+STR_NETWORK_CONNECTING_SPECIAL_2                                :{BLACK}Haal maatskappy informasie...
+############ End of leave-in-this-order
+STR_NETWORK_CONNECTING_WAITING                                  :{BLACK}{NUM} Klient{P "" e} voor jou
+STR_NETWORK_CONNECTING_DOWNLOADING                              :{BLACK}{NUM} / {NUM} kbytes afgelaai dusver
+
+STR_NETWORK_DISCONNECT                                          :{BLACK}Loskoppel
+
+STR_NETWORK_GIVE_MONEY_CAPTION                                  :{WHITE}Invoeg die bedrag van geld jy wil gee
+STR_NETWORK_NEED_GAME_PASSWORD_CAPTION                          :{WHITE}Verskaffer is beskerm. Invoeg wagwoord
+STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION                       :{WHITE}Maatskappy is beskerm. Invoeg wagwoord
+STR_NETWORK_CLIENT_LIST                                         :{WHITE}Klient Lys
+
+STR_NETWORK_ERR_NOTAVAILABLE                                    :{WHITE} Geen netwerk ontwerp gevind of voldoen sonder ENABLE_NETWORK
+STR_NETWORK_ERR_NOSERVER                                        :{WHITE} Kan nie enige netwerk spele vind nie
+STR_NETWORK_ERR_NOCONNECTION                                    :{WHITE} Die verskaffer het nie die versoek geantwoord nie
+STR_NETWORK_ERR_NEWGRF_MISMATCH                                 :{WHITE} Kan nie konnekteer te danke aan newgrf mispas nie
+STR_NETWORK_ERR_DESYNC                                          :{WHITE} Netwerk-Spel sinchroniseering gedop
+STR_NETWORK_ERR_LOSTCONNECTION                                  :{WHITE} Netwerk-Spel verbinding verloor
+STR_NETWORK_ERR_SAVEGAMEERROR                                   :{WHITE} Kan nie spaarspel laai nie
+STR_NETWORK_ERR_SERVER_START                                    :{WHITE} Verskaffer kan nie aangesit word nie
+STR_NETWORK_ERR_CLIENT_START                                    :{WHITE} Kan nie verbinding kry nie
+STR_NETWORK_ERR_TIMEOUT                                         :{WHITE} Verbinding #{NUM} het betyds uitgeloop
+STR_NETWORK_ERR_SERVER_ERROR                                    :{WHITE} A protokol-fout was gemaak en die verbinding was verlore
+STR_NETWORK_ERR_WRONG_REVISION                                  :{WHITE} Die hersiening van die klient is nie gelyk aan die verskaffer se hersiening nie
+STR_NETWORK_ERR_WRONG_PASSWORD                                  :{WHITE} Verkeerde wagwoord
+STR_NETWORK_ERR_SERVER_FULL                                     :{WHITE} Die verskaffer is vol
+STR_NETWORK_ERR_SERVER_BANNED                                   :{WHITE} Jy is van die verskaffer verban
+STR_NETWORK_ERR_KICKED                                          :{WHITE} Jy is van die spel geskop
+STR_NETWORK_ERR_CHEATER                                         :{WHITE} Bedrieg is nie toegelaat op hierdie verskaffer
+
+STR_NETWORK_ERR_LEFT                                            :het die spel verlaat
+############ Leave those lines in this order!!
+STR_NETWORK_ERR_CLIENT_GENERAL                                  :algemeen fout
+STR_NETWORK_ERR_CLIENT_DESYNC                                   :desync fout
+STR_NETWORK_ERR_CLIENT_SAVEGAME                                 :kan nie kaart laai nie
+STR_NETWORK_ERR_CLIENT_CONNECTION_LOST                          :verbinding verloor
+STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR                           :protokol fout
+STR_NETWORK_ERR_CLIENT_NEWGRF_MISMATCH                          :NewGRF mispas
+STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED                           :nie gemagtig nie
+STR_NETWORK_ERR_CLIENT_NOT_EXPECTED                             :vreemde pakket aanvaar
+STR_NETWORK_ERR_CLIENT_WRONG_REVISION                           :verkeerde hersiening
+STR_NETWORK_ERR_CLIENT_NAME_IN_USE                              :naam reeds in gebruik
+STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD                           :verkeerde wagwoord
+STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH                          :verkeerde speler-id in DoCommand
+STR_NETWORK_ERR_CLIENT_KICKED                                   :geskop by verskaffer
+STR_NETWORK_ERR_CLIENT_CHEATER                                  :het probeer om 'n bedreig te gebruik
+STR_NETWORK_ERR_CLIENT_SERVER_FULL                              :verskaffer vol
+############ End of leave-in-this-order
+STR_NETWORK_CLIENT_JOINED                                       :het die speletjie verbind
+STR_NETWORK_GIVE_MONEY                                          :het vir u maatskappy geld gegee ({CURRENCY})
+STR_NETWORK_GAVE_MONEY_AWAY                                     :u het vir {STRING} geld ({CURRENCY}) gegee
+STR_NETWORK_CHAT_COMPANY_CAPTION                                :[Span] :
+STR_NETWORK_CHAT_COMPANY                                        :[Span] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_TO_COMPANY                                     :[Span] Na {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_CLIENT_CAPTION                                 :[Privaat] :
+STR_NETWORK_CHAT_CLIENT                                         :[Privaat] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_TO_CLIENT                                      :[Privaat] Na {STRING}:{GRAY}{STRING}
+STR_NETWORK_CHAT_ALL_CAPTION                                    :[All] :
+STR_NETWORK_CHAT_ALL                                            :[All] {STRING}: {GRAY}{STRING}
+STR_NETWORK_NAME_CHANGE                                         :het hy/sy naam verander na
+STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Die verskaffer het die sessie toegemaak
+STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Die verskaffer is besig om te weerbegin...{}Wag asb...
+
+STR_NETWORK_SERVER                                              :Verskaffer
+STR_NETWORK_CLIENT                                              :Klient
+STR_NETWORK_SPECTATORS                                          :Aanskouers
+
+STR_NETWORK_CLIENTLIST_NONE                                     :(geen)
+STR_NETWORK_CLIENTLIST_KICK                                     :Skop
+STR_NETWORK_CLIENTLIST_GIVE_MONEY                               :Gee geld
+STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL                             :Praat met almal
+STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY                         :Praat met maatskappy
+STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT                          :Privaate boodskap
+
+
+STR_NETWORK_SEND                                                :{BLACK}Stuur
+
+############ end network gui strings
+
+
+STR_CONFIG_PATCHES_MAP_X                                        :{LTBLUE}X-groote van werfkaart: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAP_Y                                        :{LTBLUE}Y-groote van werfkaart: {ORANGE}{STRING}
+
+
+##### PNG-MAP-Loader
+
+STR_PNGMAP_ERROR                                                :{WHITE}Kan nie landskap van PNG laai nie...
+STR_PNGMAP_ERR_FILE_NOT_FOUND                                   :{WHITE}...lêer nie gevind nie.
+STR_PNGMAP_ERR_IMAGE_TYPE                                       :{WHITE}...kan nie prent tipe verdoel. 8 of 24-bit PNG prent vereis.
+STR_PNGMAP_ERR_MISC                                             :{WHITE}...iets het verkeerd gegaan. Jammer. (moontlik korrup lêer)
+
+STR_BMPMAP_ERROR                                                :{WHITE}Kan nie landskap van BMP laai nie...
+STR_BMPMAP_ERR_IMAGE_TYPE                                       :{WHITE}...kan nie beeld tipe verdoel nie.
+
+##id 0x0800
+STR_0800_COST                                                   :{TINYFONT}{RED}Kos: {CURRENCY}
+STR_0801_COST                                                   :{RED}Kos: {CURRENCY}
+STR_0802_INCOME                                                 :{TINYFONT}{GREEN}Inkome: {CURRENCY}
+STR_0803_INCOME                                                 :{GREEN}Inkome: {CURRENCY}
+STR_FEEDER_TINY                                                 :{TINYFONT}{YELLOW}Oorplaas: {CURRENCY}
+STR_FEEDER                                                      :{YELLOW}Oorplaas: {CURRENCY}
+STR_0805_ESTIMATED_COST                                         :{WHITE}Beraamde Kos: {CURRENCY}
+STR_0807_ESTIMATED_INCOME                                       :{WHITE}Beraamde Inkome: {CURRENCY}
+STR_0808_CAN_T_RAISE_LAND_HERE                                  :{WHITE}kan nie daal hier verhoog nie...
+STR_0809_CAN_T_LOWER_LAND_HERE                                  :{WHITE}Kan nie daal hier verlaag nie...
+STR_080A_ROCKS                                                  :Rotse
+STR_080B_ROUGH_LAND                                             :Rof daal
+STR_080C_BARE_LAND                                              :Hou daal
+STR_080D_GRASS                                                  :Gras
+STR_080E_FIELDS                                                 :Velde
+STR_080F_SNOW_COVERED_LAND                                      :Sneeu-bedekte land
+STR_0810_DESERT                                                 :Woestyn
+
+##id 0x1000
+STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION                         :{WHITE}Daal skuins in verkeerde rigting
+STR_1001_IMPOSSIBLE_TRACK_COMBINATION                           :{WHITE}Onmoontlik spoor kombinasie
+STR_1002_EXCAVATION_WOULD_DAMAGE                                :{WHITE}Uitgrawing sal tonnel beskadig
+STR_1003_ALREADY_AT_SEA_LEVEL                                   :{WHITE}Reeds op seevlak
+STR_1004_TOO_HIGH                                               :{WHITE}Te hoog
+STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Geen geskik spoorweg spoor
+STR_1007_ALREADY_BUILT                                          :{WHITE}...reeds gebou
+STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Moet eers spoorweg spoor verwyder
+STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Spoorweg Kostruksie
+STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Elektrifiseerde Spoorweg Konstruksie
+STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Eenspoor Konstruksie
+STR_100C_MAGLEV_CONSTRUCTION                                    :{WHITE}MagLev Konstruksie
+STR_100D_SELECT_RAIL_BRIDGE                                     :{WHITE}Kies Spoor Brug
+STR_100E_CAN_T_BUILD_TRAIN_DEPOT                                :{WHITE}Kan nie trein depot hier bou nie...
+STR_100F_CAN_T_BUILD_RAILROAD_STATION                           :{WHITE}Kan nie spoorweg stasie hier bou nie...
+STR_1010_CAN_T_BUILD_SIGNALS_HERE                               :{WHITE}Kan nie seine hier bou nie...
+STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Kan nie spoorweg spoor hier bou nie...
+STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Kan nie spoorweg spoor van hier af verwyder nie...
+STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Kan nie seine van hier verwyder nie...
+STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Trein Depot Orientasie
+STR_1015_RAILROAD_CONSTRUCTION                                  :Spoorweg konstruksie
+STR_TOOLB_ELRAIL_CONSTRUCTION                                   :Elektrifiseerde Spoorweg konstruksie
+STR_1016_MONORAIL_CONSTRUCTION                                  :Eenspoor konstruksie
+STR_1017_MAGLEV_CONSTRUCTION                                    :MagLev konstruksie
+STR_1018_BUILD_RAILROAD_TRACK                                   :{BLACK}Bou spoorweg spoor
+STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING                         :{BLACK}Bou trein depot (vir die bou en diens van treine)
+STR_101A_BUILD_RAILROAD_STATION                                 :{BLACK}Bou spoorweg stasie
+STR_101B_BUILD_RAILROAD_SIGNALS                                 :{BLACK}Bou spoorweg seine
+STR_101C_BUILD_RAILROAD_BRIDGE                                  :{BLACK}Bou spoorweg brug
+STR_101D_BUILD_RAILROAD_TUNNEL                                  :{BLACK}Bou spoorweg tonnel
+STR_101E_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Tokkel bou/verwyder vir spoorweg spoor en seine
+STR_101F_BRIDGE_SELECTION_CLICK                                 :{BLACK}Brug keuse - kliek op jou verkies brug om dit te bou
+STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO                       :{BLACK}Kies spoorweg depot orientasie
+STR_1021_RAILROAD_TRACK                                         :Spoorweg spoor
+STR_1023_RAILROAD_TRAIN_DEPOT                                   :Spoorweg trein depot
+STR_1024_AREA_IS_OWNED_BY_ANOTHER                               :{WHITE}...area is besit deur 'n ander maatskappy
+STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Spoorweg spoor met gewone seine
+STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Spoorweg spoor met gewone seine
+STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Spoorweg spoor met uitgang-seine
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Spoorweg spoor met kombo-seine
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Spoorweg spoor met gewone en pre-seine
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Spoorweg spoor met geowne en uitgang-seine
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Spoorweg spoor met gewone en kombo-seine
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Spoorweg spoor met pre- en uitgang-seine
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Spoorweg spoor met pre- en kombo-seine
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Spoorweg spoor met uitgang- en kombo-seine
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Moet eers spoorweg stasie verwyder
+
+
+
+##id 0x1800
+STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Moet pad eers verwyder
+STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Pad werke in vorder
+STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Pad Konstruksie
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Tremweg Konstruksie
+STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Kies Pad Brug
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... een rigting paaie kan nie aansluitings hê nie
+STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Kan nie pad hier bou nie...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Kan nie tremweg hier bou nie...
+STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Kan nie pad van hier verwyder nie...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Kan nie tremweg van hier af verwyder nie...
+STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Pad Depot Ori�tering
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Trem Depot Orientasie
+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 vragmotor stasie bou nie...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Kan nie passasier trem stasie bou nie...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Kan nie vrag trem stasie bou nie...
+STR_180A_ROAD_CONSTRUCTION                                      :Pad konstruksie
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Tremweg konstruksie
+STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Bou pad afdeling
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Bou pad seksie gebruikend Outopad metode
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Bou tremweg afdeling
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Bou tremweg gebruikend die Outotrem metode
+STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Bou pad voertuig depot (vir bou en diens 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}Tokkel bou/verwyder vir pad bou
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Tokkel bou/verwyder vir tremweg konstruksie
+STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Kies pad voertuig depot orientasie
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Kies trem voertuig depot orientasie
+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 vlak kruising
+STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Kan nie bus stasie verwyder nie...
+STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Kan nie vragmotor 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}Dorpe
+STR_TOWN_LABEL_POP                                              :{WHITE}{TOWN} ({COMMA})
+STR_TOWN_LABEL                                                  :{WHITE}{TOWN}
+STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
+STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
+STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+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                                            :Hernoem Dorp
+STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Kan nie dorp hernoem nie...
+STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN} plaaslike raad weier om dit te toelaat
+STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}Dorp naam - kliek naam om skerm op stad te senter
+STR_200B_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Senter skerm op dorp lokasie
+STR_200C_CHANGE_TOWN_NAME                                       :{BLACK}Verander dorp naam
+STR_200D_PASSENGERS_LAST_MONTH_MAX                              :{BLACK}Passasiers verlede maand: {ORANGE}{COMMA}{BLACK}  maks: {ORANGE}{COMMA}
+STR_200E_MAIL_LAST_MONTH_MAX                                    :{BLACK}Pos verlede maand: {ORANGE}{COMMA}{BLACK}  maks: {ORANGE}{COMMA}
+STR_200F_TALL_OFFICE_BLOCK                                      :Hoog kantoor blok
+STR_2010_OFFICE_BLOCK                                           :Kantoor blok
+STR_2011_SMALL_BLOCK_OF_FLATS                                   :Klein blok van woonstelle
+STR_2012_CHURCH                                                 :Kerk
+STR_2013_LARGE_OFFICE_BLOCK                                     :Groot kantoor blok
+STR_2014_TOWN_HOUSES                                            :Meenthuise
+STR_2015_HOTEL                                                  :Hotel
+STR_2016_STATUE                                                 :Standbeeld
+STR_2017_FOUNTAIN                                               :Fontein
+STR_2018_PARK                                                   :Park
+STR_2019_OFFICE_BLOCK                                           :Kantoor blok
+STR_201A_SHOPS_AND_OFFICES                                      :Winkels en kantoore
+STR_201B_MODERN_OFFICE_BUILDING                                 :Moderne kantoor gebou
+STR_201C_WAREHOUSE                                              :Pakhuis
+STR_201D_OFFICE_BLOCK                                           :Kantoor blok
+STR_201E_STADIUM                                                :Stadion
+STR_201F_OLD_HOUSES                                             :Ou huise
+STR_2020_LOCAL_AUTHORITY                                        :{BLACK}Plaaslike raad
+STR_2021_SHOW_INFORMATION_ON_LOCAL                              :{BLACK}Toon informasie oor plaaslike raad
+STR_2022_LOCAL_AUTHORITY                                        :{WHITE}{TOWN} plaaslike raad
+STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}Vervoer maatskappy graderings:
+STR_2024                                                        :{YELLOW}{COMPANY} {COMPANYNUM}: {ORANGE}{STRING}
+STR_2025_SUBSIDIES                                              :{WHITE}Subsidiee
+STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}Subsidiee op aanbod vir diens opneming:
+STR_2027_FROM_TO                                                :{ORANGE}{STRING} van {STRING} tot {STRING}
+STR_2028_BY                                                     :{YELLOW} (voor {DATE_SHORT})
+STR_202A_NONE                                                   :{ORANGE}Geen
+STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}Dienste reeds gesubsidieer:
+STR_202C_FROM_TO                                                :{ORANGE}{STRING} van {STATION} tot {STATION}{YELLOW} ({COMPANY}
+STR_202D_UNTIL                                                  :{YELLOW}, tot {DATE_SHORT})
+STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Aanbod van subsidie verval:{}{}{STRING} van {STRING} tot {STRING} sal nou nie 'n subsidie aantrek nie.
+STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}Subsidie terugtrek:{}{}{STRING} diens van {STATION} tot {STATION} is nie meer gesubsideieer nie.
+STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Diens subsidie aanbod:{}{}Eerste {STRING} diens van {STRING} tot {STRING} sal 'n jaar se subsidie van die plaaslike raad kry!
+STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Diens subsidie toeken aan {COMPANY}!{}{}{STRING} Diens van {STATION} tot {STATION} sal nou 50% extra vir die volgende jaar betaal!
+STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Diens subsidie toeken aan {COMPANY}!{}{}{STRING} diens van {STATION} tot {STATION} sal nou dubbel pryse vir die volgende jaar betaal!
+STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Diens subsidie toeken aan {COMPANY}!{}{}{STRING} diens van {STATION} tot {STATION} sal nou driemaal pryse vir die volgende jaar betaal!
+STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Diens subsidie toeken aan {COMPANY}!{}{}{STRING} diens van {STATION} tot {STATION} sal nou viervoud pryse vir die volgende jaar betaal!
+STR_2035_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN} plaaslike raad weier om nog ‘n lighawe te bou in hierdie stad
+STR_2036_COTTAGES                                               :Kothuise
+STR_2037_HOUSES                                                 :Huise
+STR_2038_FLATS                                                  :Woonstelle
+STR_2039_TALL_OFFICE_BLOCK                                      :Hoog kantoor blok
+STR_203A_SHOPS_AND_OFFICES                                      :Winkels en kantoore
+STR_203B_SHOPS_AND_OFFICES                                      :Winkels en kantoore
+STR_203C_THEATER                                                :Teatre
+STR_203D_STADIUM                                                :Stadion
+STR_203E_OFFICES                                                :Kantoore
+STR_203F_HOUSES                                                 :Huise
+STR_2040_CINEMA                                                 :Kinema
+STR_2041_SHOPPING_MALL                                          :Inkoopies winkelplein
+STR_2042_DO_IT                                                  :{BLACK}Doen dit
+STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}Lys van dinge om te doen by hierdie dorp - kliek op item vir meer besonderhede
+STR_2044_CARRY_OUT_THE_HIGHLIGHTED                              :{BLACK}Voeg die verlig aksie in die lys bo uit
+STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}Aksies beskikbaar:
+STR_2046_SMALL_ADVERTISING_CAMPAIGN                             :Klein adverteer kampeer
+STR_2047_MEDIUM_ADVERTISING_CAMPAIGN                            :Medium adverteer kampeer
+STR_2048_LARGE_ADVERTISING_CAMPAIGN                             :Groot adverteer kampeer
+STR_2049_FUND_LOCAL_ROAD_RECONSTRUCTION                         :Befonds plaaslike pad heropbou
+STR_204A_BUILD_STATUE_OF_COMPANY                                :Bou standbeeld van maatskappy eienaar
+STR_204B_FUND_NEW_BUILDINGS                                     :Befonds nuwe geboue
+STR_204C_BUY_EXCLUSIVE_TRANSPORT                                :Koop eksklusief vervoer regte
+STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY                              :Omkoop die plaaslike raad
+STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inwy 'n klein plaaslik advertering veldtog, om meer passasiers en cargo tot jou vervoer dienste te lok.{}  Prys: {CURRENCY}
+STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} Inwy 'n medium plaaslik advertering veldtog, om meer passasiers en cargo tot jou vervoer dienste te lok.{}  Prys: {CURRENCY}
+STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inwy 'n groot plaaslik advertering veldtog, om meer passasiers en cargo tot jou vervoer dienste te lok.{}  Prys: {CURRENCY}
+STR_2050_FUND_THE_RECONSTRUCTION                                :{WHITE}{STRING}{}{YELLOW} Fonds die herkonstruksie van die stedelik pad netwerk. Veroorsaak aansienlike skeuring to pad verkeer vir op tot 6 maande.{}  Prys: {CURRENCY}
+STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} Bou 'n standbeeld in eer van u maatskappy.{} Prys: {CURRENCY}
+STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} Fonds die bou van nuwe kommersieel geboue in die stad.{}  Prys: {CURRENCY}
+STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} Koop 1 jare eksklusief vervoer regte in dorp. Dorp raad sal slegs passasiers en cargo toelaat om jou maatskappy se stasies te gebruik.{} Prys: {CURRENCY}
+STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC                         :{WHITE}{STRING}{}{YELLOW} Omkoop die plaaslike raad om jou gradering te verbeter, by die risiko van 'n ernstig straf indien gevang{}  Kos: {CURRENCY}
+STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}Verkeer warboel in {TOWN}!{}{}Pad heropbou program befonds deur {COMPANY} bring 6 maande van ellende na motoriste!
+STR_2056                                                        :{TINYFONT}{WHITE}{TOWN}
+STR_2057                                                        :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_2058_UNDER_CONSTRUCTION                                     :{STRING} (onder konstruksie)
+STR_2059_IGLOO                                                  :Igloo
+STR_205A_TEPEES                                                 :Tepees
+STR_205B_TEAPOT_HOUSE                                           :Teepot-Huis
+STR_205C_PIGGY_BANK                                             :Varkie-Bank
+
+STR_INDUSTRY                                                    :{INDUSTRY}
+STR_TOWN                                                        :{TOWN}
+STR_INDUSTRY_FORMAT                                             :{TOWN} {STRING}
+STR_STATION                                                     :{STATION}
+
+##id 0x2800
+STR_LANDSCAPING                                                 :Landargitekteur
+STR_2800_PLANT_TREES                                            :Boome beplant
+STR_2801_PLACE_SIGN                                             :Plaas teken
+STR_2802_TREES                                                  :{WHITE}Boome
+STR_2803_TREE_ALREADY_HERE                                      :{WHITE}...boom reeds daar
+STR_2804_SITE_UNSUITABLE                                        :{WHITE}...plek ongeskik
+STR_2805_CAN_T_PLANT_TREE_HERE                                  :{WHITE}Kan nie boom hier beplant nie...
+STR_2806                                                        :{WHITE}{SIGN}
+STR_2808_TOO_MANY_SIGNS                                         :{WHITE}...te veel tekens
+STR_2809_CAN_T_PLACE_SIGN_HERE                                  :{WHITE}Kan nie teken hier plaas nie...
+STR_280A_SIGN                                                   :Teken
+STR_280B_EDIT_SIGN_TEXT                                         :{WHITE}Redigeer teken teks
+STR_280C_CAN_T_CHANGE_SIGN_NAME                                 :{WHITE}Kan nie teken naam verander nie...
+STR_280D_SELECT_TREE_TYPE_TO_PLANT                              :{BLACK}Kies boom tipe om te beplant
+STR_280E_TREES                                                  :Boome
+STR_280F_RAINFOREST                                             :Reenwoud
+STR_2810_CACTUS_PLANTS                                          :Kaktus Plante
+
+##id 0x3000
+STR_3000_RAIL_STATION_SELECTION                                 :{WHITE}Spoor Stasie Keuse
+STR_3001_AIRPORT_SELECTION                                      :{WHITE}Lughawe Keuse
+STR_3002_ORIENTATION                                            :{BLACK}Orientasie
+STR_3003_NUMBER_OF_TRACKS                                       :{BLACK}Nommer van spoore
+STR_3004_PLATFORM_LENGTH                                        :{BLACK}Verhoog lengte
+STR_3005_TOO_CLOSE_TO_ANOTHER_RAILROAD                          :{WHITE}Te naby aan 'n ander spoorweg stasie
+STR_3006_ADJOINS_MORE_THAN_ONE_EXISTING                         :{WHITE}Grens aan meer as een bestaande stasie/laai area
+STR_3007_TOO_MANY_STATIONS_LOADING                              :{WHITE}Te veel stasies/laai areas in die stad
+STR_3008_TOO_MANY_STATIONS_LOADING                              :{WHITE}Te veel stasies/laai areas
+STR_3008A_TOO_MANY_BUS_STOPS                                    :{WHITE}Te veel bushalte
+STR_3008B_TOO_MANY_TRUCK_STOPS                                  :{WHITE}Te veel vragmotor stasies
+STR_3009_TOO_CLOSE_TO_ANOTHER_STATION                           :{WHITE}Te naby aan 'n ander stasie/laai area
+STR_300A_0                                                      :{WHITE}{STATION} {STATIONFEATURES}
+STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Moet eers spoorweg stasie afbreek
+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                                 :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
+
+############ range for rating starts
+STR_3035_APPALLING                                              :Onsettend
+STR_3036_VERY_POOR                                              :Baie Arm
+STR_3037_POOR                                                   :Arm
+STR_3038_MEDIOCRE                                               :Middelmagtig
+STR_3039_GOOD                                                   :Goed
+STR_303A_VERY_GOOD                                              :Baie Goed
+STR_303B_EXCELLENT                                              :Uitsteekent
+STR_303C_OUTSTANDING                                            :Treffend
+############ range for rating ends
+
+STR_303D                                                        :{WHITE}{STRING}: {YELLOW}{STRING} ({COMMA}%)
+STR_303E_NO_LONGER_ACCEPTS                                      :{WHITE}{STATION} aanvaar nie meer {STRING} nie
+STR_303F_NO_LONGER_ACCEPTS_OR                                   :{WHITE}{STATION} aanvaar nie meer {STRING} of {STRING} nie
+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 Orientasie
+STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Vragmotor Stasie Orientasie
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Passasier Trem Orientasie
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Vrag Trem Orientasie
+STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Moet eers bus stasie afbreek
+STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Moet eers vragmotor 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 -
+STR_304B_SITE_UNSUITABLE                                        :{WHITE}...plek ongeskik
+STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK                              :{WHITE}Te naby aan 'n ander werf
+STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Moet eers werf afbreek
+STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Kies spoorweg stasie orientasie
+STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Kies nommer van verhoogte vir spoorweg stasie
+STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Kies lengte van spoorweg stasie
+STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Kies bus stasie orientasie
+STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Kies vragmotor laai area orientasie
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Kies passasier trem stasie orientasie
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Kies vrag trem stasie orientasie
+STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Senter skerm op stasie
+STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Toon stasie graderings
+STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Verander naam van stasie
+STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO                            :{BLACK}Toon lys van aanvaarde vrag
+STR_3057_STATION_NAMES_CLICK_ON                                 :{BLACK}Stasie naame - Kliek naam om skerm op stasie te senter
+STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT                            :{BLACK}Kies groote/tipe van lughawe
+STR_305C_0                                                      :{STATION} {STATIONFEATURES}
+STR_STATION_SIGN_TINY                                           :{TINYFONT}{STATION}
+STR_305E_RAILROAD_STATION                                       :Spoorweg stasie
+STR_305F_AIRCRAFT_HANGAR                                        :Vliegtuig hangar
+STR_3060_AIRPORT                                                :Lughawe
+STR_3061_TRUCK_LOADING_AREA                                     :Vragmotor laai area
+STR_3062_BUS_STATION                                            :Bus stasie
+STR_3063_SHIP_DOCK                                              :Skip werf
+STR_3064_HIGHLIGHT_COVERAGE_AREA                                :{BLACK}Verlig dekking area van die voorgestelde bouterrein
+STR_3065_DON_T_HIGHLIGHT_COVERAGE                               :{BLACK}Moenie die dekking area van die voorgestelde bouterrein verlig nie
+STR_3066_COVERAGE_AREA_HIGHLIGHT                                :{BLACK}Dekking area verlig
+STR_3068_DOCK                                                   :{WHITE}Werf
+STR_3069_BUOY                                                   :Baken
+STR_306A_BUOY_IN_THE_WAY                                        :{WHITE}...baken in die pad
+STR_306C_STATION_TOO_SPREAD_OUT                                 :{WHITE}...Stasie te ver van mekaar af
+STR_306D_NONUNIFORM_STATIONS_DISALLOWED                         :{WHITE}...ongelyk stasies is versper
+STR_USE_CTRL_TO_SELECT_MORE                                     :{BLACK}Hou in CTRL om meer as een item te selekteer
+
+STR_UNDEFINED                                                   :(undefined string)
+STR_STAT_CLASS_DFLT                                             :Verstek stasie
+STR_STAT_CLASS_WAYP                                             :Wegpunte
+
+##id 0x3800
+STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Skip Depot Orientasie
+STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...moet op water gebou word
+STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Skip depot kan nie hier gebou word nie...
+STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Kies skip depot orientasie
+STR_3804_WATER                                                  :Water
+STR_3805_COAST_OR_RIVERBANK                                     :Kus of oewer
+STR_3806_SHIP_DEPOT                                             :Skip depot
+STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...Kan nie op water bou nie
+STR_MUST_DEMOLISH_CANAL_FIRST                                   :{WHITE}Moet eers kanaale afbreek
+
+##id 0x4000
+STR_4000_SAVE_GAME                                              :{WHITE}Spaar Speletjie
+STR_4001_LOAD_GAME                                              :{WHITE}Laai Speletjie
+STR_4002_SAVE                                                   :{BLACK}Spaar
+STR_4003_DELETE                                                 :{BLACK}Uitvee
+STR_4004                                                        :{COMPANY}, {DATE_LONG}
+STR_4005_BYTES_FREE                                             :{BLACK}{COMMA} megabyte{P "" s} vry
+STR_4006_UNABLE_TO_READ_DRIVE                                   :{BLACK}Kan nie skyf lees nie
+STR_4007_GAME_SAVE_FAILED                                       :{WHITE}Speletjie Spaar Misluk{}{STRING}
+STR_4008_UNABLE_TO_DELETE_FILE                                  :{WHITE}Onbekwaam om lêer te uitvee
+STR_4009_GAME_LOAD_FAILED                                       :{WHITE}Speletjie Laai Misluk{}{STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR                   :Interne fout: {STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME                         :Gebreek spaarspeletjie - {STRING}
+STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME                        :Spaarspeletjie is gemaak met nuwer uitgawe
+STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE                       :Lêer nie leesbare
+STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE                      :Lêer nie skryfbaar
+STR_400A_LIST_OF_DRIVES_DIRECTORIES                             :{BLACK}Lys van skywe, gidse en spaar-speletjie lêers
+STR_400B_CURRENTLY_SELECTED_NAME                                :{BLACK}Huidige naam vir spaar-speletjie
+STR_400C_DELETE_THE_CURRENTLY_SELECTED                          :{BLACK}Vee uit die huidige verkieste spaar-speletjie
+STR_400D_SAVE_THE_CURRENT_GAME_USING                            :{BLACK}Spaar die huidige speletjie, met die verkieste naame
+STR_400E_SELECT_NEW_GAME_TYPE                                   :{WHITE}Kies Nuwe Speletjie Tipe
+STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Kies draaiboek (groen), vooraf-stel speletjie (blou), of lukraak nuwe speletjie
+STR_4010_GENERATE_RANDOM_NEW_GAME                               :Opwek lukraak nuwe speletjie
+STR_4011_LOAD_HEIGHTMAP                                         :{WHITE}Laai Hoogtekaart
+
+##id 0x4800
+STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} in die pad
+STR_4801                                                        :{WHITE}{INDUSTRY}
+STR_4802_COAL_MINE                                              :Kool Myn
+STR_4803_POWER_STATION                                          :Krag Stasie
+STR_4804_SAWMILL                                                :Saagmeul
+STR_4805_FOREST                                                 :Woud
+STR_4806_OIL_REFINERY                                           :Olie Raffineerdery
+STR_4807_OIL_RIG                                                :Olieboor
+STR_4808_FACTORY                                                :Fabriek
+STR_4809_PRINTING_WORKS                                         :Drukwerke
+STR_480A_STEEL_MILL                                             :Staal Meule
+STR_480B_FARM                                                   :Boerdery
+STR_480C_COPPER_ORE_MINE                                        :Koper Erts Myn
+STR_480D_OIL_WELLS                                              :Olie Bron
+STR_480E_BANK                                                   :Bank
+STR_480F_FOOD_PROCESSING_PLANT                                  :Kos Verwerkings Fabriek
+STR_4810_PAPER_MILL                                             :Papiermeul
+STR_4811_GOLD_MINE                                              :Goud Myn
+STR_4812_BANK                                                   :Bank
+STR_4813_DIAMOND_MINE                                           :Diamant Myn
+STR_4814_IRON_ORE_MINE                                          :Yster Erts Myn
+STR_4815_FRUIT_PLANTATION                                       :Vrugte Plantasie
+STR_4816_RUBBER_PLANTATION                                      :Gomlastiek Plantasie
+STR_4817_WATER_SUPPLY                                           :Water Verskaf
+STR_4818_WATER_TOWER                                            :Water Toring
+STR_4819_FACTORY                                                :Fabriek
+STR_481A_FARM                                                   :Boerdery
+STR_481B_LUMBER_MILL                                            :Timmerhout Meule
+STR_481C_COTTON_CANDY_FOREST                                    :Spookasem Woud
+STR_481D_CANDY_FACTORY                                          :Lekker Fabriek
+STR_481E_BATTERY_FARM                                           :Battery Boerdery
+STR_481F_COLA_WELLS                                             :Cola Spruite
+STR_4820_TOY_SHOP                                               :Speelgoed Winkel
+STR_4821_TOY_FACTORY                                            :Speelgoed Fabriek
+STR_4822_PLASTIC_FOUNTAINS                                      :Plastiek Fonteine
+STR_4823_FIZZY_DRINK_FACTORY                                    :Koeldrank Fabriek
+STR_4824_BUBBLE_GENERATOR                                       :Borrel Genereerder
+STR_4825_TOFFEE_QUARRY                                          :Tamletjie Prooi
+STR_4826_SUGAR_MINE                                             :Suiker Myn
+
+############ range for requires starts
+STR_4827_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}, {STRING}
+STR_4829_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}, {STRING}, {STRING}
+############ range for requires ends
+
+############ range for produces starts
+STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Vrag wag om geprosesseer te wees:
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
+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
+STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nuwe {STRING} onder opbou naby {TOWN}!
+STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nuwe {STRING} word naby {TOWN} beplant!
+STR_482F_COST                                                   :{BLACK}Koste: {YELLOW}{CURRENCY}
+STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Nywerheid tipe kan nie hier gebou word nie...
+STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...woud kan net bo sneeu-lyn beplant word
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} aankondig dreigend sluiting!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Lewering probleme veroorsaak {STRING} om dreigend sluting te aankondig!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Gemis van naby boome veroorsaak {STRING} om dreigend sluiting te aankondig!
+STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} vermeerder produksie!
+STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nuwe kool laag gevind by {INDUSTRY}!{}Produksie is verwag om te verdubbel!
+STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nuwe olie reserwes gevind by {INDUSTRY}!{}Produksie is verwag om te verdubbel!
+STR_4838_IMPROVED_FARMING_METHODS                               :{BLACK}{BIGFONT}Verbeterde boerdery metodes by {INDUSTRY} sal produksie verdubbel!
+STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}{INDUSTRY} produksie verminder 50%
+STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}Insek vervuiling oorsaak verwoesting by {INDUSTRY}!{}Produksie verminder 50%
+STR_483B_CAN_ONLY_BE_POSITIONED                                 :{WHITE}...kan net naby aan kant van werfkaart geplaas word
+STR_INDUSTRY_PROD_GOUP                                          :{BLACK}{BIGFONT}{STRING} produksie by {INDUSTRY} vermeerder {COMMA}%!
+STR_INDUSTRY_PROD_GODOWN                                        :{BLACK}{BIGFONT}{STRING} produksie by {INDUSTRY} verminder {COMMA}%!
+
+##id 0x5000
+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}Kan nie daal 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Brug hoofde is nie op die selfde vlak nie
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Brug is te laag vie die daal
+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}
+STR_500E_SUSPENSION_STEEL                                       :Suspensie, Staal
+STR_500F_GIRDER_STEEL                                           :Balk, Staal
+STR_5010_CANTILEVER_STEEL                                       :Vrydraer, Staal
+STR_5011_SUSPENSION_CONCRETE                                    :Suspensie, Beton
+STR_5012_WOODEN                                                 :Houterig
+STR_5013_CONCRETE                                               :Beton
+STR_5014_TUBULAR_STEEL                                          : Buis, Staal
+STR_BRIDGE_TUBULAR_SILICON                                      :Buis, Silicon
+STR_5015_CAN_T_BUILD_BRIDGE_HERE                                :{WHITE}Brug kan nie daar gebou word nie...
+STR_5016_CAN_T_BUILD_TUNNEL_HERE                                :{WHITE}Tonnel kan nie daar gebou word nie...
+STR_5017_RAILROAD_TUNNEL                                        :Spoorweg tonnel
+STR_5018_ROAD_TUNNEL                                            :Pad tonnel
+STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE                           :Staal stuspensie spoor brug
+STR_501C_STEEL_GIRDER_RAIL_BRIDGE                               :Staal balk spoor brug
+STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE                           :Staal vrydraer spoor brug
+STR_501E_REINFORCED_CONCRETE_SUSPENSION                         :Versterk beton suspensie spoor brug
+STR_501F_WOODEN_RAIL_BRIDGE                                     :Houterig spoor brug
+STR_5020_CONCRETE_RAIL_BRIDGE                                   :Beton spoor brug
+STR_5021_STEEL_SUSPENSION_ROAD_BRIDGE                           :Staal suspensie pad brug
+STR_5022_STEEL_GIRDER_ROAD_BRIDGE                               :Staal balk pad brug
+STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE                           :Staal vrydraer pad brug
+STR_5024_REINFORCED_CONCRETE_SUSPENSION                         :Versterk beton suspensie pad brug
+STR_5025_WOODEN_ROAD_BRIDGE                                     :Houterig pad brug
+STR_5026_CONCRETE_ROAD_BRIDGE                                   :Beton pad brug
+STR_5027_TUBULAR_RAIL_BRIDGE                                    :Buis spoor brug
+STR_5028_TUBULAR_ROAD_BRIDGE                                    :Buis pad brug
+
+##id 0x5800
+STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}Voorwerp in die pad
+STR_5801_TRANSMITTER                                            :Sender
+STR_5802_LIGHTHOUSE                                             :Vuurtoring
+STR_5803_COMPANY_HEADQUARTERS                                   :Maatskappy Hoofkwartier
+STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...maatskappy hoofkwartier in die weg
+STR_5805_COMPANY_OWNED_LAND                                     :Maatskappy-besitte land
+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!
+
+
+############ WARNING, using range 0x6000 for strings that are stored in the savegame
+############ These strings may never get a new id, or savegames will break!
+##id 0x6000
+STR_SV_EMPTY                                                    :
+STR_SV_UNNAMED                                                  :Onbenaam
+STR_SV_TRAIN_NAME                                               :Trein {COMMA}
+STR_SV_ROADVEH_NAME                                             :Pad Voertuig {COMMA}
+STR_SV_SHIP_NAME                                                :Skip {COMMA}
+STR_SV_AIRCRAFT_NAME                                            :Vliegtuig {COMMA}
+
+STR_SV_STNAME                                                   :{STRING}
+STR_SV_STNAME_NORTH                                             :{STRING} Noord
+STR_SV_STNAME_SOUTH                                             :{STRING} Suid
+STR_SV_STNAME_EAST                                              :{STRING} Oos
+STR_SV_STNAME_WEST                                              :{STRING} Wes
+STR_SV_STNAME_CENTRAL                                           :{STRING} Sentraal
+STR_SV_STNAME_TRANSFER                                          :{STRING} Oorplaas
+STR_SV_STNAME_HALT                                              :{STRING} Halte
+STR_SV_STNAME_VALLEY                                            :{STRING} Vallei
+STR_SV_STNAME_HEIGHTS                                           :{STRING} Hoogtes
+STR_SV_STNAME_WOODS                                             :{STRING} Woude
+STR_SV_STNAME_LAKESIDE                                          :{STRING} Meerkant
+STR_SV_STNAME_EXCHANGE                                          :{STRING} Wissel
+STR_SV_STNAME_AIRPORT                                           :{STRING} Lughawe
+STR_SV_STNAME_OILFIELD                                          :{STRING} Olieveld
+STR_SV_STNAME_MINES                                             :{STRING} Myne
+STR_SV_STNAME_DOCKS                                             :{STRING} Werfe
+STR_SV_STNAME_BUOY_1                                            :{STRING} Baken 1
+STR_SV_STNAME_BUOY_2                                            :{STRING} Baken 2
+STR_SV_STNAME_BUOY_3                                            :{STRING} Baken 3
+STR_SV_STNAME_BUOY_4                                            :{STRING} Baken 4
+STR_SV_STNAME_BUOY_5                                            :{STRING} Baken 5
+STR_SV_STNAME_BUOY_6                                            :{STRING} Baken 6
+STR_SV_STNAME_BUOY_7                                            :{STRING} Baken 7
+STR_SV_STNAME_BUOY_8                                            :{STRING} Baken 8
+STR_SV_STNAME_BUOY_9                                            :{STRING} Baken 9
+STR_SV_STNAME_ANNEXE                                            :{STRING} Anneks
+STR_SV_STNAME_SIDINGS                                           :{STRING} Wisselspoore
+STR_SV_STNAME_BRANCH                                            :{STRING} Tak
+STR_SV_STNAME_UPPER                                             :Bo {STRING}
+STR_SV_STNAME_LOWER                                             :Laer {STRING}
+STR_SV_STNAME_HELIPORT                                          :{STRING} Helihawe
+STR_SV_STNAME_FOREST                                            :{STRING} Woud
+STR_SV_STNAME_FALLBACK                                          :{STRING} Stasie #{NUM}
+
+############ end of savegame specific region!
+
+##id 0x6800
+STR_6800_DIFFICULTY_LEVEL                                       :{WHITE}Moeite Vlak
+STR_OPTIONS_SAVE_CHANGES                                        :{BLACK}Bewaar
+
+############ range for difficulty levels starts
+STR_6801_EASY                                                   :{BLACK}Maklik
+STR_6802_MEDIUM                                                 :{BLACK}Gemiddel
+STR_6803_HARD                                                   :{BLACK}Streng
+STR_6804_CUSTOM                                                 :{BLACK}Gewoonte
+############ range for difficulty levels ends
+
+############ range for difficulty settings starts
+STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Maksimum no. mededingers: {ORANGE}{COMMA}
+STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}Mededinger begin tyd: {ORANGE}{STRING}
+STR_6807_NO_OF_TOWNS                                            :{LTBLUE}No. van dorpe: {ORANGE}{STRING}
+STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}No. van nywerhede: {ORANGE}{STRING}
+STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}Maksimum inisieele lening: {ORANGE}{CURRENCY}
+STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}Inisieele rente koers: {ORANGE}{COMMA}%
+STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Voertuig loopkoste: {ORANGE}{STRING}
+STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}Konstruksie spoed van mededinge: {ORANGE}{STRING}
+STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}Intelligensie van mededinge: {ORANGE}{STRING}
+STR_680E_VEHICLE_BREAKDOWNS                                     :{LTBLUE}Voertuig komplikasies: {ORANGE}{STRING}
+STR_680F_SUBSIDY_MULTIPLIER                                     :{LTBLUE}Subsidie vermenigvuld: {ORANGE}{STRING}
+STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}koste van konstruksie: {ORANGE}{STRING}
+STR_6811_TERRAIN_TYPE                                           :{LTBLUE}Landskap tipe: {ORANGE}{STRING}
+STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}Hoeveelheid see/panne: {ORANGE}{STRING}
+STR_6813_ECONOMY                                                :{LTBLUE}Ekonomie: {ORANGE}{STRING}
+STR_6814_TRAIN_REVERSING                                        :{LTBLUE}Trein omkeer: {ORANGE}{STRING}
+STR_6815_DISASTERS                                              :{LTBLUE}Rampe: {ORANGE}{STRING}
+STR_16816_CITY_APPROVAL                                         :{LTBLUE}Stad raad se houding na area herstruktuuring: {ORANGE}{STRING}
+############ range for difficulty settings ends
+
+STR_26816_NONE                                                  :Geen
+STR_NUM_VERY_LOW                                                :Baie laag
+STR_6816_LOW                                                    :Laag
+STR_6817_NORMAL                                                 :Normaal
+STR_6818_HIGH                                                   :Hoog
+STR_6819                                                        :{BLACK}{SMALLLEFTARROW}
+STR_681A                                                        :{BLACK}{SMALLRIGHTARROW}
+STR_681B_VERY_SLOW                                              :Baie Stadig
+STR_681C_SLOW                                                   :Stadig
+STR_681D_MEDIUM                                                 :Gemiddel
+STR_681E_FAST                                                   :Vinnig
+STR_681F_VERY_FAST                                              :Baie Vinnig
+STR_VERY_LOW                                                    :Baie Laag
+STR_6820_LOW                                                    :Laag
+STR_6821_MEDIUM                                                 :Gemiddel
+STR_6822_HIGH                                                   :Hoog
+STR_6823_NONE                                                   :Geen
+STR_6824_REDUCED                                                :Verminder
+STR_6825_NORMAL                                                 :Normaal
+STR_6826_X1_5                                                   :x1.5
+STR_6827_X2                                                     :x2
+STR_6828_X3                                                     :x3
+STR_6829_X4                                                     :x4
+STR_682A_VERY_FLAT                                              :Baie Plat
+STR_682B_FLAT                                                   :Plat
+STR_682C_HILLY                                                  :Koppierig
+STR_682D_MOUNTAINOUS                                            :Bergagtig
+STR_682E_STEADY                                                 :Gereeld
+STR_682F_FLUCTUATING                                            :Skommelende
+STR_6830_IMMEDIATE                                              :Onmiddelik
+STR_6831_3_MONTHS_AFTER_PLAYER                                  :3 maande na speler
+STR_6832_6_MONTHS_AFTER_PLAYER                                  :6 maande na speler
+STR_6833_9_MONTHS_AFTER_PLAYER                                  :9 maande na speler
+STR_6834_AT_END_OF_LINE_AND_AT_STATIONS                         :Op die einde van die lyn, en by stasies
+STR_6835_AT_END_OF_LINE_ONLY                                    :Slegs op die ende van die lyn
+STR_6836_OFF                                                    :Af
+STR_6837_ON                                                     :Aan
+STR_6838_SHOW_HI_SCORE_CHART                                    :{BLACK}Wys ho�telling tabel
+STR_6839_PERMISSIVE                                             :Permissief
+STR_683A_TOLERANT                                               :Toelaatbaar
+STR_683B_HOSTILE                                                :Vyandelik
+
+##id 0x7000
+STR_7000                                                        :
+STR_7001                                                        :{WHITE}{COMPANY} {BLACK}{COMPANYNUM}
+STR_7002_PLAYER                                                 :(Speler {COMMA})
+STR_7004_NEW_FACE                                               :{BLACK}Nuwe Gesig
+STR_7005_COLOR_SCHEME                                           :{BLACK}Kleur Skema
+STR_7006_COLOR_SCHEME                                           :{GOLD}Kleur Skema
+STR_7007_NEW_COLOR_SCHEME                                       :{WHITE}Nuwe Kleur Skema
+STR_7008_COMPANY_NAME                                           :{BLACK}Maatskappy Naam
+STR_7009_PRESIDENT_NAME                                         :{BLACK}Bestuurder Naam
+STR_700A_COMPANY_NAME                                           :Maatskappy Naam
+STR_700B_PRESIDENT_S_NAME                                       :Bestuurder se Naam
+STR_700C_CAN_T_CHANGE_COMPANY_NAME                              :{WHITE}Maatskappy naam kan nie verander word nie...
+STR_700D_CAN_T_CHANGE_PRESIDENT                                 :{WHITE}Bestuurder se naam kan nie verander word nie...
+STR_700E_FINANCES                                               :{WHITE}{COMPANY} Finansies {BLACK}{COMPANYNUM}
+STR_700F_EXPENDITURE_INCOME                                     :{WHITE}Onkoste/Inkome
+STR_7010                                                        :{WHITE}{NUM}
+STR_7011_CONSTRUCTION                                           :{GOLD}Konstruksie
+STR_7012_NEW_VEHICLES                                           :{GOLD}Nuwe Voertuie
+STR_7013_TRAIN_RUNNING_COSTS                                    :{GOLD}Trein Loopkoste
+STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Pad Voertuig Loopkoste
+STR_7015_AIRCRAFT_RUNNING_COSTS                                 :{GOLD}Vliegtuig Loopkoste
+STR_7016_SHIP_RUNNING_COSTS                                     :{GOLD}Skip loopkoste
+STR_7017_PROPERTY_MAINTENANCE                                   :{GOLD}Eiendom Onderhoud
+STR_7018_TRAIN_INCOME                                           :{GOLD}Trein Inkome
+STR_7019_ROAD_VEHICLES_INCOME                                   :{GOLD}Pad Voertuig Inkome
+STR_701A_AIRCRAFT_INCOME                                        :{GOLD}Vliegtuig Inkome
+STR_701B_SHIP_INCOME                                            :{GOLD}Skip Inkome
+STR_701C_LOAN_INTEREST                                          :{GOLD}Lening Rente
+STR_701D_OTHER                                                  :{GOLD}Ander
+STR_701E                                                        :{BLACK}-{CURRENCY}
+STR_701F                                                        :{BLACK}+{CURRENCY}
+STR_7020_TOTAL                                                  :{WHITE}Totaal:
+STR_7021                                                        :{COMPANY} {COMPANYNUM}
+STR_7022_INCOME_GRAPH                                           :{WHITE}Inkome Grafiek
+STR_CURRCOMPACT                                                 :{CURRCOMPACT}
+STR_7024                                                        :{COMMA}
+STR_7025_OPERATING_PROFIT_GRAPH                                 :{WHITE}Bediening Profyt Grafiek
+STR_7026_BANK_BALANCE                                           :{WHITE}Bank Balans
+STR_7027_LOAN                                                   :{WHITE}Lening
+STR_MAX_LOAN                                                    :{WHITE}Maks Lening:  {BLACK}{CURRENCY}
+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 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 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...
+STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Kies nuwe gesig vir bestuurder
+STR_7031_CHANGE_THE_COMPANY_VEHICLE                             :{BLACK}Verander die maatskappy voertuig lewery
+STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Verander bestuurder se naam
+STR_7033_CHANGE_THE_COMPANY_NAME                                :{BLACK}Verander die maatskappy se naam
+STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Kliek op verkieste kleur skema
+STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Vermeer groote van lening
+STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Terugbetaal deel van lening
+STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Bestuurder)
+STR_7038_INAUGURATED                                            :{GOLD}Bevestig: {WHITE}{NUM}
+STR_7039_VEHICLES                                               :{GOLD}Voertuie
+STR_TRAINS                                                      :{WHITE}{COMMA} trein{P "" e}
+STR_ROAD_VEHICLES                                               :{WHITE}{COMMA} pad voertui{P g e}
+STR_AIRCRAFT                                                    :{WHITE}{COMMA} vliegtuig
+STR_SHIPS                                                       :{WHITE}{COMMA} sk{P ip epe}
+STR_7042_NONE                                                   :{WHITE}Geen
+STR_7043_FACE_SELECTION                                         :{WHITE}Gesig Keuse
+STR_7044_MALE                                                   :{BLACK}Manlik
+STR_7045_FEMALE                                                 :{BLACK}Vroulik
+STR_7046_NEW_FACE                                               :{BLACK}Nuwe Gesig
+STR_7047_CANCEL_NEW_FACE_SELECTION                              :{BLACK}Kanselleer nuwe gesig keuse
+STR_7048_ACCEPT_NEW_FACE_SELECTION                              :{BLACK}Aanvar nuwe gesig keuse
+STR_7049_SELECT_MALE_FACES                                      :{BLACK}Kies manlik gesige
+STR_704A_SELECT_FEMALE_FACES                                    :{BLACK}Kies vroulik gesige
+STR_704B_GENERATE_RANDOM_NEW_FACE                               :{BLACK}Opwek lukrake nuwe gesig
+STR_704C_KEY                                                    :{BLACK}Sleutel
+STR_704D_SHOW_KEY_TO_GRAPHS                                     :{BLACK}Wys sleutel na grafieke
+STR_704E_KEY_TO_COMPANY_GRAPHS                                  :{WHITE}Sleutel vir maatskappy grafieke
+STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY                           :{BLACK}Kliek hier om maatskappy se intrede op grafiek aan/af te skakel
+STR_7050_UNITS_OF_CARGO_DELIVERED                               :{WHITE}Eenheide van vrag afgelewer
+STR_7051_COMPANY_PERFORMANCE_RATINGS                            :{WHITE}Maatskappy prestasie graderings (maksimum gradering=1000)
+STR_7052_COMPANY_VALUES                                         :{WHITE}Maatskappy waarde
+STR_7053_COMPANY_LEAGUE_TABLE                                   :{WHITE}Maatskappy Liga Tabel
+STR_7054                                                        :{WHITE}{STRING}{SETX 45}{ORANGE}{COMPANY} {BLACK}{COMPANYNUM} '{STRING}'
+STR_7055                                                        :{YELLOW}{STRING}{SETX 45}{ORANGE}{COMPANY} {BLACK}{COMPANYNUM}  '{STRING}'
+STR_7056_TRANSPORT_COMPANY_IN_TROUBLE                           :{BLACK}{BIGFONT}Vervoer maatsappy in moelikheid!
+STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT}{COMPANY} sal binnekort afverkoop of bankrospeler verklaar word tensy prestasie verbeter!
+STR_7058_PRESIDENT                                              :{BLACK}{PLAYERNAME}{}(Bestuurder)
+STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Vervoer maatskappy samesmelting!
+STR_705A_HAS_BEEN_SOLD_TO_FOR                                   :{BLACK}{BIGFONT}{COMPANY} is na {COMPANY} vir  {CURRENCY} verkoop!
+STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT                         :{WHITE}Ons is opsoek na 'n vervoer maatskappy wat ons se maatskappy sal oorvat.{}{}Wil jy {COMPANY} koop vir {CURRENCY}?
+STR_705C_BANKRUPT                                               :{BLACK}{BIGFONT}Bankrotspeler!
+STR_705D_HAS_BEEN_CLOSED_DOWN_BY                                :{BLACK}{BIGFONT}{COMPANY} is deur skuldeisers toegemaak en alle bates is afverkoop!
+STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED                         :{BLACK}{BIGFONT}Nuwe vervoer maatskappy geloods!
+STR_705F_STARTS_CONSTRUCTION_NEAR                               :{BLACK}{BIGFONT}{COMPANY} begin konstruksie naby {TOWN}!
+STR_7060_CAN_T_BUY_COMPANY                                      :{WHITE}Maatskappy kan nie aangekoop word nie...
+STR_7061_CARGO_PAYMENT_RATES                                    :{WHITE}Vrag Betaalings Grade
+STR_7062_DAYS_IN_TRANSIT                                        :{BLACK}{TINYFONT}Dae in deurtog
+STR_7063_PAYMENT_FOR_DELIVERING                                 :{BLACK}{TINYFONT}Betaaling vir aflewering van 10 eenhuide (of 10,000 liters) van vrag 'n afstand van 20 blokkies
+STR_7064_TOGGLE_GRAPH_FOR_CARGO                                 :{BLACK}Skakel grafiek vir vrag tipe aan/af
+STR_7065                                                        :{BLACK}{TINYFONT}{STRING}
+STR_7066_ENGINEER                                               :Ingenieur
+STR_7067_TRAFFIC_MANAGER                                        :Verkeer Bestuurder
+STR_7068_TRANSPORT_COORDINATOR                                  :Vervoer Ko�eerder
+STR_7069_ROUTE_SUPERVISOR                                       :Roete Opsiener
+STR_706A_DIRECTOR                                               :Direkteur
+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
+STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Maatskappy hoofkwartiers kan nie hier gebou word nie...
+STR_7072_VIEW_HQ                                                :{BLACK}Wys HK
+STR_RELOCATE_HQ                                                 :{BLACK}Beweeg HQ
+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                                        :{BLACK}Stel maatskappy wagwoord
+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 nywerhede as ekonomie versterk!
+STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Tokkel groot/klein venster groote
+STR_7076_COMPANY_VALUE                                          :{GOLD}Maatskappy waarde: {WHITE}{CURRENCY}
+STR_7077_BUY_25_SHARE_IN_COMPANY                                :{BLACK}Koop 25% aandeel in maatskappy
+STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}Verkoop 25% aandeel in maatskappy
+STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}Koop 25% aandeel in die maatskappy
+STR_707A_SELL_25_SHARE_IN_THIS_COMPANY                          :{BLACK}Verkoop 25% aandeel in die maatskappy
+STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Kan nie 25% aandeel in die maatskappy koop nie...
+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_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
+STR_LIVERY_STEAM                                                :Stoom Enjin
+STR_LIVERY_DIESEL                                               :Diesel Enjin
+STR_LIVERY_ELECTRIC                                             :Elektriese Enjin
+STR_LIVERY_MONORAIL                                             :Eenspoor Enjin
+STR_LIVERY_MAGLEV                                               :Maglev Enjin
+STR_LIVERY_DMU                                                  :DMU
+STR_LIVERY_EMU                                                  :EMU
+STR_LIVERY_PASSENGER_WAGON_STEAM                                :Passasier Rytuig (Stoom)
+STR_LIVERY_PASSENGER_WAGON_DIESEL                               :Passasier Rytuig (Diesel)
+STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :Passasier Rytuig (Elektries)
+STR_LIVERY_FREIGHT_WAGON                                        :Vraag Wa
+STR_LIVERY_BUS                                                  :Bus
+STR_LIVERY_TRUCK                                                :Vragmotor
+STR_LIVERY_PASSENGER_SHIP                                       :Passasier Veer
+STR_LIVERY_FREIGHT_SHIP                                         :Vraag Skip
+STR_LIVERY_HELICOPTER                                           :Helikopter
+STR_LIVERY_SMALL_PLANE                                          :Klein Vliegtuig
+STR_LIVERY_LARGE_PLANE                                          :Groot Vliegtuig
+STR_LIVERY_PASSENGER_TRAM                                       :Passasier Trem
+STR_LIVERY_FREIGHT_TRAM                                         :Vrag Trem
+
+STR_LIVERY_GENERAL_TIP                                          :{BLACK}Toon generaal kleur skemas
+STR_LIVERY_TRAIN_TIP                                            :{BLACK}Wys trein kleur skemas
+STR_LIVERY_ROADVEH_TIP                                          :{BLACK}Toon pad voertuig kleur skemas
+STR_LIVERY_SHIP_TIP                                             :{BLACK}Toon skip kleur skemas
+STR_LIVERY_AIRCRAFT_TIP                                         :{BLACK}Toon vliegtuig kleurskemas
+STR_LIVERY_PRIMARY_TIP                                          :{BLACK}Kies die premere kleur vir die verkieste skema
+STR_LIVERY_SECONDARY_TIP                                        :{BLACK}Kies die sekondere kleur vir die verkieste skema
+STR_LIVERY_PANEL_TIP                                            :{BLACK}Kies 'n kleur skema te verander, of veelvoud skemas met CTRL+kliek. Kliek op die boks te skakel gebruik van skema
+
+##id 0x8000
+STR_8000_KIRBY_PAUL_TANK_STEAM                                  :Kirby Paul Tank (Stoom)
+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 (Stoom)
+STR_8008_CHANEY_JUBILEE_STEAM                                   :Chaney 'Jubilee' (Stoom)
+STR_8009_GINZU_A4_STEAM                                         :Ginzu 'A4' (Stoom)
+STR_800A_SH_8P_STEAM                                            :SH '8P' (Stoom)
+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)
+STR_800E_UU_37_DIESEL                                           :UU '37' (Diesel)
+STR_800F_FLOSS_47_DIESEL                                        :Floss '47' (Diesel)
+STR_8010_CS_4000_DIESEL                                         :CS 4000 (Diesel)
+STR_8011_CS_2400_DIESEL                                         :CS 2400 (Diesel)
+STR_8012_CENTENNIAL_DIESEL                                      :Centennial (Diesel)
+STR_8013_KELLING_3100_DIESEL                                    :Kelling 3100 (Diesel)
+STR_8014_TURNER_TURBO_DIESEL                                    :Turner Turbo (Diesel)
+STR_8015_MJS_1000_DIESEL                                        :MJS 1000 (Diesel)
+STR_8016_SH_125_DIESEL                                          :SH '125' (Diesel)
+STR_8017_SH_30_ELECTRIC                                         :SH '30' (Elektries)
+STR_8018_SH_40_ELECTRIC                                         :SH '40' (Elektries)
+STR_8019_T_I_M_ELECTRIC                                         :'T.I.M.' (Elektries)
+STR_801A_ASIASTAR_ELECTRIC                                      :'AsiaStar' (Elektries)
+STR_801B_PASSENGER_CAR                                          :Passasier Rytuig
+STR_801C_MAIL_VAN                                               :Pos Wa
+STR_801D_COAL_CAR                                               :Kool Wa
+STR_801E_OIL_TANKER                                             :Olie Tenkwa
+STR_801F_LIVESTOCK_VAN                                          :Lewende Hawe Wa
+STR_8020_GOODS_VAN                                              :Goedere Wa
+STR_8021_GRAIN_HOPPER                                           :Graan Laai Bak
+STR_8022_WOOD_TRUCK                                             :Hout Trok
+STR_8023_IRON_ORE_HOPPER                                        :Yster Erts Laai Bak
+STR_8024_STEEL_TRUCK                                            :Staal Trok
+STR_8025_ARMORED_VAN                                            :Gepantserde Wa
+STR_8026_FOOD_VAN                                               :Kos Wa
+STR_8027_PAPER_TRUCK                                            :Papier Trok
+STR_8028_COPPER_ORE_HOPPER                                      :Koper Erts Laai Bak
+STR_8029_WATER_TANKER                                           :Water Tenkwa
+STR_802A_FRUIT_TRUCK                                            :Vrugte Trok
+STR_802B_RUBBER_TRUCK                                           :Gomlastiek Trok
+STR_802C_SUGAR_TRUCK                                            :Suiker Trok
+STR_802D_COTTON_CANDY_HOPPER                                    :Spookasem Laai Bak
+STR_802E_TOFFEE_HOPPER                                          :Tameletjie Laai Bak
+STR_802F_BUBBLE_VAN                                             :Borrel Wa
+STR_8030_COLA_TANKER                                            :Cola Tenkwa
+STR_8031_CANDY_VAN                                              :Lekker Wa
+STR_8032_TOY_VAN                                                :Speelgoed Wa
+STR_8033_BATTERY_TRUCK                                          :Battery Trok
+STR_8034_FIZZY_DRINK_TRUCK                                      :Koeldrank Trok
+STR_8035_PLASTIC_TRUCK                                          :Plastiek Trok
+STR_8036_X2001_ELECTRIC                                         :'X2001' (Elektries)
+STR_8037_MILLENNIUM_Z1_ELECTRIC                                 :'Millennium Z1' (Elektries)
+STR_8038_WIZZOWOW_Z99                                           :Wizzowow Z99
+STR_8039_PASSENGER_CAR                                          :Passasier Rytuig
+STR_803A_MAIL_VAN                                               :Pos Wa
+STR_803B_COAL_CAR                                               :Kool Trok
+STR_803C_OIL_TANKER                                             :Olie Tenkwa
+STR_803D_LIVESTOCK_VAN                                          :Lewende Hawe Wa
+STR_803E_GOODS_VAN                                              :Goedere Wa
+STR_803F_GRAIN_HOPPER                                           :Graan Laai Bak
+STR_8040_WOOD_TRUCK                                             :Hout Trok
+STR_8041_IRON_ORE_HOPPER                                        :Yster Erts Laai Bak
+STR_8042_STEEL_TRUCK                                            :Staal Trok
+STR_8043_ARMORED_VAN                                            :Gepantserde Wa
+STR_8044_FOOD_VAN                                               :Kos Wa
+STR_8045_PAPER_TRUCK                                            :Papier Trok
+STR_8046_COPPER_ORE_HOPPER                                      :Coper Erts Laai Bak
+STR_8047_WATER_TANKER                                           :Water Tenkwa
+STR_8048_FRUIT_TRUCK                                            :Vrugte Trok
+STR_8049_RUBBER_TRUCK                                           :Gomlastiek Wa
+STR_804A_SUGAR_TRUCK                                            :Suiker Trok
+STR_804B_COTTON_CANDY_HOPPER                                    :Spookasem Laai Bak
+STR_804C_TOFFEE_HOPPER                                          :Tameletjie Laai Bak
+STR_804D_BUBBLE_VAN                                             :Borrel Wa
+STR_804E_COLA_TANKER                                            :Cola Tenkwa
+STR_804F_CANDY_VAN                                              :Lekker Wa
+STR_8050_TOY_VAN                                                :Speelgoed Wa
+STR_8051_BATTERY_TRUCK                                          :Bettery Trok
+STR_8052_FIZZY_DRINK_TRUCK                                      :Koeldrank Trok
+STR_8053_PLASTIC_TRUCK                                          :Plastiek Trok
+STR_8054_LEV1_LEVIATHAN_ELECTRIC                                :Lev1 'Leviathan' (Elektries)
+STR_8055_LEV2_CYCLOPS_ELECTRIC                                  :Lev2 'Cyclops' (Elektries)
+STR_8056_LEV3_PEGASUS_ELECTRIC                                  :Lev3 'Pegasus' (Elektries)
+STR_8057_LEV4_CHIMAERA_ELECTRIC                                 :Lev4 'Chimaera' (Elektries)
+STR_8058_WIZZOWOW_ROCKETEER                                     :Wizzowow Rocketeer
+STR_8059_PASSENGER_CAR                                          :Passasier Rytuig
+STR_805A_MAIL_VAN                                               :Pos Wa
+STR_805B_COAL_CAR                                               :Kool Trok
+STR_805C_OIL_TANKER                                             :Olie Tenkwa
+STR_805D_LIVESTOCK_VAN                                          :Lewende Hawe Wa
+STR_805E_GOODS_VAN                                              :Goedere Wa
+STR_805F_GRAIN_HOPPER                                           :Graan Laai Bak
+STR_8060_WOOD_TRUCK                                             :Hout Trok
+STR_8061_IRON_ORE_HOPPER                                        :Yster Erts Laai Bak
+STR_8062_STEEL_TRUCK                                            :Staal Trok
+STR_8063_ARMORED_VAN                                            :Gepantserde Wa
+STR_8064_FOOD_VAN                                               :Kos Wa
+STR_8065_PAPER_TRUCK                                            :Papier Trok
+STR_8066_COPPER_ORE_HOPPER                                      :Koper Erts Laai Bak
+STR_8067_WATER_TANKER                                           :Water Tenkwa
+STR_8068_FRUIT_TRUCK                                            :Vrugte Trok
+STR_8069_RUBBER_TRUCK                                           :Gomlastiek Trok
+STR_806A_SUGAR_TRUCK                                            :Suiker Trok
+STR_806B_COTTON_CANDY_HOPPER                                    :Spookasem Laai Bak
+STR_806C_TOFFEE_HOPPER                                          :Tameletjie Laai Bak
+STR_806D_BUBBLE_VAN                                             :Borrel Wa
+STR_806E_COLA_TANKER                                            :Cola Tenkwa
+STR_806F_CANDY_VAN                                              :Lekker Wa
+STR_8070_TOY_VAN                                                :Speelgoed Wa
+STR_8071_BATTERY_TRUCK                                          :Battery Trok
+STR_8072_FIZZY_DRINK_TRUCK                                      :Koeldrank Wa
+STR_8073_PLASTIC_TRUCK                                          :Plastiek Trok
+STR_8074_MPS_REGAL_BUS                                          :MPS Regal Bus
+STR_8075_HEREFORD_LEOPARD_BUS                                   :Hereford Leopard Bus
+STR_8076_FOSTER_BUS                                             :Foster Bus
+STR_8077_FOSTER_MKII_SUPERBUS                                   :Foster MkII Superbus
+STR_8078_PLODDYPHUT_MKI_BUS                                     :Ploddyphut MkI Bus
+STR_8079_PLODDYPHUT_MKII_BUS                                    :Ploddyphut MkII Bus
+STR_807A_PLODDYPHUT_MKIII_BUS                                   :Ploddyphut MkIII Bus
+STR_807B_BALOGH_COAL_TRUCK                                      :Balogh Kool Trok
+STR_807C_UHL_COAL_TRUCK                                         :Uhl Kool Trok
+STR_807D_DW_COAL_TRUCK                                          :DW Kool Trok
+STR_807E_MPS_MAIL_TRUCK                                         :MPS Pos Trok
+STR_807F_REYNARD_MAIL_TRUCK                                     :Reynard Pos Trok
+STR_8080_PERRY_MAIL_TRUCK                                       :Perry Pos Trok
+STR_8081_MIGHTYMOVER_MAIL_TRUCK                                 :MightyMover Pos Trok
+STR_8082_POWERNAUGHT_MAIL_TRUCK                                 :Powernaught Pos Trok
+STR_8083_WIZZOWOW_MAIL_TRUCK                                    :Wizzowow Pos Trok
+STR_8084_WITCOMBE_OIL_TANKER                                    :Witcombe Olie Tenkwa
+STR_8085_FOSTER_OIL_TANKER                                      :Foster Olie Tenkwa
+STR_8086_PERRY_OIL_TANKER                                       :Perry Olie Tenkwa
+STR_8087_TALBOTT_LIVESTOCK_VAN                                  :Talbott Lewende Hawe Wa
+STR_8088_UHL_LIVESTOCK_VAN                                      :Uhl Lewende Hawe Wa
+STR_8089_FOSTER_LIVESTOCK_VAN                                   :Foster Lewende Hawe Wa
+STR_808A_BALOGH_GOODS_TRUCK                                     :Balogh Goedere Trok
+STR_808B_CRAIGHEAD_GOODS_TRUCK                                  :Craighead Goedere Trok
+STR_808C_GOSS_GOODS_TRUCK                                       :Goss Goedere Trok
+STR_808D_HEREFORD_GRAIN_TRUCK                                   :Hereford Graan Trok
+STR_808E_THOMAS_GRAIN_TRUCK                                     :Thomas Graan Trok
+STR_808F_GOSS_GRAIN_TRUCK                                       :Goss Graan Trok
+STR_8090_WITCOMBE_WOOD_TRUCK                                    :Witcombe Hout Trok
+STR_8091_FOSTER_WOOD_TRUCK                                      :Foster Hout Trok
+STR_8092_MORELAND_WOOD_TRUCK                                    :Moreland Hout Trok
+STR_8093_MPS_IRON_ORE_TRUCK                                     :MPS Yster Erts Trok
+STR_8094_UHL_IRON_ORE_TRUCK                                     :Uhl Iron Yster Erts Trok
+STR_8095_CHIPPY_IRON_ORE_TRUCK                                  :Chippy Yster Erts Trok
+STR_8096_BALOGH_STEEL_TRUCK                                     :Balogh Staal Trok
+STR_8097_UHL_STEEL_TRUCK                                        :Uhl Staal Trok
+STR_8098_KELLING_STEEL_TRUCK                                    :Kelling Staal Trok
+STR_8099_BALOGH_ARMORED_TRUCK                                   :Balogh Gepantserde Trok
+STR_809A_UHL_ARMORED_TRUCK                                      :Uhl Gepantserde Trok
+STR_809B_FOSTER_ARMORED_TRUCK                                   :Foster Gepantserde Trok
+STR_809C_FOSTER_FOOD_VAN                                        :Foster Kos Wa
+STR_809D_PERRY_FOOD_VAN                                         :Perry Kos Wa
+STR_809E_CHIPPY_FOOD_VAN                                        :Chippy Kos Wa
+STR_809F_UHL_PAPER_TRUCK                                        :Uhl Papier Trok
+STR_80A0_BALOGH_PAPER_TRUCK                                     :Balogh Papier Trok
+STR_80A1_MPS_PAPER_TRUCK                                        :MPS Papier Trok
+STR_80A2_MPS_COPPER_ORE_TRUCK                                   :MPS Koper Erts Trok
+STR_80A3_UHL_COPPER_ORE_TRUCK                                   :Uhl Koper Erts Trok
+STR_80A4_GOSS_COPPER_ORE_TRUCK                                  :Goss Koper Erts Trok
+STR_80A5_UHL_WATER_TANKER                                       :Uhl Water Tenkwa
+STR_80A6_BALOGH_WATER_TANKER                                    :Balogh Water Tenkwa
+STR_80A7_MPS_WATER_TANKER                                       :MPS Water Tenkwa
+STR_80A8_BALOGH_FRUIT_TRUCK                                     :Balogh Vrugte Trok
+STR_80A9_UHL_FRUIT_TRUCK                                        :Uhl Vrugte Trok
+STR_80AA_KELLING_FRUIT_TRUCK                                    :Kelling Vrugte Trok
+STR_80AB_BALOGH_RUBBER_TRUCK                                    :Balogh Gomlastiek Trok
+STR_80AC_UHL_RUBBER_TRUCK                                       :Uhl Gomlastiek Trok
+STR_80AD_RMT_RUBBER_TRUCK                                       :RMT Gomlastiek Trok
+STR_80AE_MIGHTYMOVER_SUGAR_TRUCK                                :MightyMover Suiker Trok
+STR_80AF_POWERNAUGHT_SUGAR_TRUCK                                :Powernaught Suiker Trok
+STR_80B0_WIZZOWOW_SUGAR_TRUCK                                   :Wizzowow Suiker Trok
+STR_80B1_MIGHTYMOVER_COLA_TRUCK                                 :MightyMover Cola Trok
+STR_80B2_POWERNAUGHT_COLA_TRUCK                                 :Powernaught Cola Trok
+STR_80B3_WIZZOWOW_COLA_TRUCK                                    :Wizzowow Cola Trok
+STR_80B4_MIGHTYMOVER_COTTON_CANDY                               :MightyMover Spookasem Trok
+STR_80B5_POWERNAUGHT_COTTON_CANDY                               :Powernaught Spookasem Trok
+STR_80B6_WIZZOWOW_COTTON_CANDY_TRUCK                            :Wizzowow Spookasem Trok
+STR_80B7_MIGHTYMOVER_TOFFEE_TRUCK                               :MightyMover Tameletjie Trok
+STR_80B8_POWERNAUGHT_TOFFEE_TRUCK                               :Powernaught Tameletjie Trok
+STR_80B9_WIZZOWOW_TOFFEE_TRUCK                                  :Wizzowow Tameletjie Trok
+STR_80BA_MIGHTYMOVER_TOY_VAN                                    :MightyMover Speelgoed Wa
+STR_80BB_POWERNAUGHT_TOY_VAN                                    :Powernaught Speelgoed Wa
+STR_80BC_WIZZOWOW_TOY_VAN                                       :Wizzowow Speelgoed Wa
+STR_80BD_MIGHTYMOVER_CANDY_TRUCK                                :MightyMover Lekker Trok
+STR_80BE_POWERNAUGHT_CANDY_TRUCK                                :Powernaught Lekker Trok
+STR_80BF_WIZZOWOW_CANDY_TRUCK                                   :Wizzowow Lekker Trok
+STR_80C0_MIGHTYMOVER_BATTERY_TRUCK                              :MightyMover Battery Trok
+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 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
+STR_80C8_WIZZOWOW_PLASTIC_TRUCK                                 :Wizzowow Plastiek Trok
+STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK                               :MightyMover Borrel Trok
+STR_80CA_POWERNAUGHT_BUBBLE_TRUCK                               :Powernaught Borrel Trok
+STR_80CB_WIZZOWOW_BUBBLE_TRUCK                                  :Wizzowow Borrel Trok
+STR_80CC_MPS_OIL_TANKER                                         :MPS Olie Tenkskip
+STR_80CD_CS_INC_OIL_TANKER                                      :CS-Inc. Olie Tenkskip
+STR_80CE_MPS_PASSENGER_FERRY                                    :MPS Passasier Veerboot
+STR_80CF_FFP_PASSENGER_FERRY                                    :FFP Passasier Veerboot
+STR_80D0_BAKEWELL_300_HOVERCRAFT                                :Bakewell 300 Skeertuig
+STR_80D1_CHUGGER_CHUG_PASSENGER                                 :Chugger-Chug Passasier Veerboot
+STR_80D2_SHIVERSHAKE_PASSENGER_FERRY                            :Shivershake Passasier Veerboot
+STR_80D3_YATE_CARGO_SHIP                                        :Yate Vrag skip
+STR_80D4_BAKEWELL_CARGO_SHIP                                    :Bakewell Vrag skip
+STR_80D5_MIGHTYMOVER_CARGO_SHIP                                 :Mightymover Vrag skip
+STR_80D6_POWERNAUT_CARGO_SHIP                                   :Powernaut Vrag skip
+STR_80D7_SAMPSON_U52                                            :Sampson U52
+STR_80D8_COLEMAN_COUNT                                          :Coleman Count
+STR_80D9_FFP_DART                                               :FFP Dart
+STR_80DA_YATE_HAUGAN                                            :Yate Haugan
+STR_80DB_BAKEWELL_COTSWALD_LB_3                                 :Bakewell Cotswald LB-3
+STR_80DC_BAKEWELL_LUCKETT_LB_8                                  :Bakewell Luckett LB-8
+STR_80DD_BAKEWELL_LUCKETT_LB_9                                  :Bakewell Luckett LB-9
+STR_80DE_BAKEWELL_LUCKETT_LB80                                  :Bakewell Luckett LB80
+STR_80DF_BAKEWELL_LUCKETT_LB_10                                 :Bakewell Luckett LB-10
+STR_80E0_BAKEWELL_LUCKETT_LB_11                                 :Bakewell Luckett LB-11
+STR_80E1_YATE_AEROSPACE_YAC_1_11                                :Yate Aerospace YAC 1-11
+STR_80E2_DARWIN_100                                             :Darwin 100
+STR_80E3_DARWIN_200                                             :Darwin 200
+STR_80E4_DARWIN_300                                             :Darwin 300
+STR_80E5_DARWIN_400                                             :Darwin 400
+STR_80E6_DARWIN_500                                             :Darwin 500
+STR_80E7_DARWIN_600                                             :Darwin 600
+STR_80E8_GURU_GALAXY                                            :Guru Galaxy
+STR_80E9_AIRTAXI_A21                                            :Airtaxi A21
+STR_80EA_AIRTAXI_A31                                            :Airtaxi A31
+STR_80EB_AIRTAXI_A32                                            :Airtaxi A32
+STR_80EC_AIRTAXI_A33                                            :Airtaxi A33
+STR_80ED_YATE_AEROSPACE_YAE46                                   :Yate Aerospace YAe46
+STR_80EE_DINGER_100                                             :Dinger 100
+STR_80EF_AIRTAXI_A34_1000                                       :AirTaxi A34-1000
+STR_80F0_YATE_Z_SHUTTLE                                         :Yate Z-Shuttle
+STR_80F1_KELLING_K1                                             :Kelling K1
+STR_80F2_KELLING_K6                                             :Kelling K6
+STR_80F3_KELLING_K7                                             :Kelling K7
+STR_80F4_DARWIN_700                                             :Darwin 700
+STR_80F5_FFP_HYPERDART_2                                        :FFP Hyperdart 2
+STR_80F6_DINGER_200                                             :Dinger 200
+STR_80F7_DINGER_1000                                            :Dinger 1000
+STR_80F8_PLODDYPHUT_100                                         :Ploddyphut 100
+STR_80F9_PLODDYPHUT_500                                         :Ploddyphut 500
+STR_80FA_FLASHBANG_X1                                           :Flashbang X1
+STR_80FB_JUGGERPLANE_M1                                         :Juggerplane M1
+STR_80FC_FLASHBANG_WIZZER                                       :Flashbang Wizzer
+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}Boodskap van voertuig fabrikant
+STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Ons het sopas ‘n nuwe {STRING} ontwerp, sal jy belangstel om hierdie voertuig eksklusief vir ‘n jaar te gebruik. Hierdie word gedoen om te kyk hoe die voertuig doen voordat hy wereld wyd in produksie gesit word?
+STR_8102_RAILROAD_LOCOMOTIVE                                    :spoorweg lokomotief
+STR_8103_ROAD_VEHICLE                                           :pad voertuig
+STR_8104_AIRCRAFT                                               :vliegtuig
+STR_8105_SHIP                                                   :skip
+STR_8106_MONORAIL_LOCOMOTIVE                                    :eenspoor lokomotief
+STR_8107_MAGLEV_LOCOMOTIVE                                      :maglev lokomotief
+
+##id 0x8800
+STR_8800_TRAIN_DEPOT                                            :{WHITE}{TOWN} Trein Depot
+STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste trein arriveer by {STATION}!
+STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Aanwyse)
+STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Trein in die weg
+STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
+STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_8806_GO_TO                                                  :Gaan na {STATION}
+STR_8807_GO_TO_TRANSFER                                         :Gaan na {STATION} (Oordrag en vat vrag)
+STR_8808_GO_TO_UNLOAD                                           :Gaan na {STATION} (Aflaai)
+STR_8809_GO_TO_TRANSFER_UNLOAD                                  :Gaan na {STATION} (Oordrag en verlaat leeg)
+STR_880A_GO_TO_LOAD                                             :Gaan na {STATION} (Laai)
+STR_880B_GO_TO_TRANSFER_LOAD                                    :Gaan na {STATION} (Oordrag en wag vir volle lading)
+STR_880C_GO_NON_STOP_TO                                         :Gaan deurgaande na {STATION}
+STR_880D_GO_TO_NON_STOP_TRANSFER                                :Gaan deurgaande na {STATION} (Oordra en neem vrag)
+STR_880E_GO_NON_STOP_TO_UNLOAD                                  :Gaan deurgaande na {STATION} (Aflaai)
+STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Gaan deurgaande na {STATION} (Oordra en verlaat leë)
+STR_8810_GO_NON_STOP_TO_LOAD                                    :Gaan deurgaande na {STATION} (Laai)
+STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Gaan deurgaande na {STATION} (Oordra en wag vir volle lading)
+STR_GO_TO_TRAIN_DEPOT                                           :Gaan na {TOWN} Trein Depot
+STR_SERVICE_AT_TRAIN_DEPOT                                      :Diens by {TOWN} Trein Depot
+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_TIMETABLE_GO_TO                                             :{STRING} {STRING}
+STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Reis (Nie gerooster nie)
+STR_TIMETABLE_TRAVEL_FOR                                        :Reis vir {STRING}
+STR_TIMETABLE_STAY_FOR                                          :en bly vir {STRING}
+STR_TIMETABLE_DAYS                                              :{COMMA} da{P g e}
+STR_TIMETABLE_TICKS                                             :{COMMA} tick{P "" e}
+
+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
+STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL                         :{LTBLUE}Diens by {TOWN} Trein Depot, {VELOCITY}
+
+STR_INVALID_ORDER                                               :{RED} (Ongeldig Opdrag)
+
+STR_UNKNOWN_DESTINATION                                         :onbekende destinasie
+STR_8812_EMPTY                                                  :{LTBLUE}Leë
+STR_8813_FROM                                                   :{LTBLUE}{CARGO} vanaf {STATION}
+STR_FROM_MULT                                                   :{LTBLUE}{CARGO} van {STATION} (x{NUM})
+STR_8814_TRAIN_IS_WAITING_IN_DEPOT                              :{WHITE}Trein {COMMA} wag in depot
+STR_8815_NEW_VEHICLES                                           :{BLACK}Nuwe Voertuie
+STR_8816                                                        :{BLACK}-
+STR_8819_TRAIN_TOO_LONG                                         :{WHITE}Trein te lank
+STR_881A_TRAINS_CAN_ONLY_BE_ALTERED                             :{WHITE}Treine kan slegs verander word as hulle in die depot gestop is
+STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} Trein{P "" e}
+
+STR_881C_NEW_RAIL_VEHICLES                                      :{WHITE}Nuwe Spoor Voertuie
+STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Nuwe Elektries Spoor Voertuie
+STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Nuwe Eenspoor Voertuie
+STR_881E_NEW_MAGLEV_VEHICLES                                    :{WHITE}Nuwe Maglev Voertuie
+STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}Spoorweg Voertuie
+
+STR_881F_BUILD_VEHICLE                                          :{BLACK}Bou Voertuig
+STR_CLONE_ROAD_VEHICLE                                          :{BLACK}Kloon Voertuig
+STR_CLONE_ROAD_VEHICLE_INFO                                     :{BLACK}Dit sal 'n kopie van die pad voertuig bou. Control-kliek sal die opdrae deel
+STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Dit sal 'n kopie van 'n pad voertuig bou. Kliek die knoppie en dan op 'n pad voertuig binne of buite die depot. Control-kliek sal die opdrae deel
+STR_CLONE_TRAIN                                                 :{BLACK}Kloon Trein
+STR_CLONE_TRAIN_INFO                                            :{BLACK}Dit sa 'n kopie van die trein bou insluitend alle trokke. Control-kliek sal die opdrae deel
+STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Dit sal 'n kopie 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}Hernoem
+STR_8823_SKIP                                                   :{BLACK}Sprong
+STR_8824_DELETE                                                 :{BLACK}Uit vee
+STR_8825_NON_STOP                                               :{BLACK}Deurgaande
+STR_8826_GO_TO                                                  :{BLACK}Gaan Na
+STR_8827_FULL_LOAD                                              :{BLACK}Volle Lading
+STR_8828_UNLOAD                                                 :{BLACK}Aflaai
+STR_REFIT                                                       :{BLACK}Herpas
+STR_REFIT_TIP                                                   :{BLACK}Kies watter vrag tipe te herpas na in die opdraag. CTRL-kliek om herpas instruksie te verwyder
+STR_REFIT_ORDER                                                 :(Herpas na {STRING})
+STR_TIMETABLE_VIEW                                              :{BLACK}Rooster
+STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Skakel na die rooster uitsig
+STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Opdrae)
+STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Einde van Opdrae - -
+STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
+STR_SERVICE                                                     :{BLACK}Diens
+STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Kan nie spoorweg voertuig bou nie...
+STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebou: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
+STR_882D_VALUE                                                  :{LTBLUE}{ENGINE}{BLACK}   Waarde: {LTBLUE}{CURRENCY}
+STR_882E                                                        :{WHITE}{VEHICLE}
+STR_882F_LOADING_UNLOADING                                      :{LTBLUE}Laai / Aflaai
+STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}Trein moet binne in 'n depot gestop word
+STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT                              :{WHITE}Kan nie trein na depot stuur nie...
+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}Kan nie die opdrag uitvee 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}Kan nie voertuig beweeg nie...
+STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}Die agterste motor sal altyd die voorste motor volg
+STR_8838_N_A                                                    :N/A{SKIP}
+STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Kan nie spoorweg voertuig verkoop nie...
+STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Kan nie roete na plaaslike depot vind nie
+STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Trein kan nie stop/aanvang word nie...
+STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Diens tussentyd: {LTBLUE}{COMMA}dae{BLACK}   Laaste diens: {LTBLUE}{DATE_LONG}
+STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Diens tussentyd: {LTBLUE}{COMMA}%{BLACK}   Laaste diens: {LTBLUE}{DATE_LONG}
+STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Treine - kliek op trein vir informasie
+STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Bou nuwe treine (vereis trein depot)
+STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Treine - kliek op trein vir info., sleep voertuig om te bysit/verwyder van trein
+STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}Bou nuwe trein voertuig
+STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Sleep trein voertuig hier om dit te verkoop
+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 verlig trein voertuig
+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/aanskakel
+STR_8847_SHOW_TRAIN_S_ORDERS                                    :{BLACK}Toon trein se opdrae
+STR_8848_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Senter skerm op trein
+STR_8849_SEND_TRAIN_TO_DEPOT                                    :{BLACK}Stuur trein na depot. CTRL+kliek sal net diens
+STR_884A_FORCE_TRAIN_TO_PROCEED                                 :{BLACK}Forseer trein om voort te gaan sonder om vir sien die uit te klaar
+STR_884B_REVERSE_DIRECTION_OF_TRAIN                             :{BLACK}Omkeer rigting van trein
+STR_884C_SHOW_TRAIN_DETAILS                                     :{BLACK}Toon trein besonderhede
+STR_884D_INCREASE_SERVICING_INTERVAL                            :{BLACK}Vergroot diens tussentyd
+STR_884E_DECREASE_SERVICING_INTERVAL                            :{BLACK}Verminder diens tussentyd
+STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED                          :{BLACK}Toon besonderhede van vrag gedra
+STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES                         :{BLACK}Toon besonderhede van trein voertuie
+STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Toon kapasiteite van elke voertuig
+STR_8852_SHOW_TOTAL_CARGO                                       :{BLACK}Toon totaale kapasitiet van trein, verdeel by vrag tipe
+STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Opdraglys - kliek op 'n opdrag om dit te verlig. 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}Vee uit die verlig opdrag
+STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Maak die verlig opdrag deurgaande
+STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Invoeg 'n nuwe opdrag voor die verlig opdrag, of byvoeg na einde van lys
+STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Maak die verlig opdrag forseer die voertuig om vir 'n volle laai te wag
+STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Maak die verlig opdrag forseer die voertuig te aflaai
+STR_TIMETABLE_TOOLTIP                                           :{BLACK}Rooster - kliek op 'n opdrag om dit te verlig
+STR_TIMETABLE_WAIT_TIME_TOOLTIP                                 :{BLACK}Verander die bedrag van tyd die verlig opdrag moes vat
+STR_TIMETABLE_CLEAR_TIME_TOOLTIP                                :{BLACK}Skoon die totaal van tyd vir die verlig opdrag
+STR_TIMETABLE_RESET_LATENESS_TOOLTIP                            :{BLACK}Herstel die laat teller, so dat die voertuig is op tyd
+STR_SERVICE_HINT                                                :{BLACK}Sprong die opdraag tensy 'n diens nodig is
+STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Kos: {CURRENCY} Gewig: {WEIGHT_S}{}Spoed: {VELOCITY}  Krag: {POWER}{}Loopkoste: {CURRENCY}/jr{}Kapasitiet: {CARGO}
+STR_885C_BROKEN_DOWN                                            :{RED}Komplikasies
+STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}Ouderdom: {LTBLUE}{STRING}{BLACK}   Loopkoste: {LTBLUE}{CURRENCY}/Jr
+STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}Gewig: {LTBLUE}{WEIGHT_S}  {BLACK}Krag: {LTBLUE}{POWER}{BLACK} Max. spoed: {LTBLUE}{VELOCITY}
+STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}Gewig: {LTBLUE}{WEIGHT_S} {BLACK}Krag: {LTBLUE}{POWER}{BLACK} Max. spoed: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE}
+STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profyt die jaar: {LTBLUE}{CURRENCY}  (verlede jaar: {CURRENCY})
+STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}Betroubaarheid: {LTBLUE}{COMMA}%  {BLACK}Komplikasies na laaste diens: {LTBLUE}{COMMA}
+STR_8861_STOPPED                                                :{RED}Gestop
+STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}Kan nie trein forseer om sein te vermy op gevaar...
+STR_8863_CRASHED                                                :{RED}Botsing!
+
+STR_8865_NAME_TRAIN                                             :{WHITE}Benaam trein
+STR_8866_CAN_T_NAME_TRAIN                                       :{WHITE}Trein kan nie benaam word nie...
+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}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 verlig opdrag forseer die voertuig om sy vrag te stort
+STR_886F_TRANSFER                                               :{BLACK}Oordra
+STR_CLEAR_TIME                                                  :{BLACK}Reinig Tyd
+STR_RESET_LATENESS                                              :{BLACK}Herstel Laat Teller
+
+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_TRAIN_START_NO_CATENARY                                     :Die spoort kort catenary, dus kan die trien nie aanskakel nie
+
+STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Nuwe {STRING} nou beskikbaar!
+STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
+STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nuwe {STRING} nou beskikbaar!  -  {ENGINE}
+
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Kan nie vernietige voertuig verkoop nie...
+
+STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Kan nie rooster voertuig nie...
+STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Voertuie gan slegs by stasies wag.
+STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Die voertuig stop nie by die stasie nie.
+STR_TIMETABLE_CHANGE_TIME                                       :{BLACK}Verander Tyd
+STR_TIMETABLE_STATUS_ON_TIME                                    :Die voertuig loop tans op tyd
+STR_TIMETABLE_STATUS_LATE                                       :Die voertuig loop tans {STRING} laat
+STR_TIMETABLE_STATUS_EARLY                                      :Die voertuig loop tans {STRING} vroeg
+STR_TIMETABLE_TOTAL_TIME                                        :Die rooster sal  {STRING} vat om te verklaar
+STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :Die rooster sal te minste {STRING} vat om te verklaar (nie alles gerooster nie)
+STR_TIMETABLE_AUTOFILL                                          :{BLACK}Outovul
+STR_TIMETABLE_AUTOFILL_TOOLTIP                                  :{BLACK}Outomaties vul die rooster met die waardes van die eerste reis
+
+##id 0x9000
+STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Pad voertuig in die pad
+STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Pad voert{P uig uie}
+STR_9002                                                        :{WHITE}{VEHICLE}
+STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}{TOWN} Pad Voertuig Depot
+STR_9004_NEW_VEHICLES                                           :{BLACK}Nuwe Voertuie
+STR_9006_NEW_ROAD_VEHICLES                                      :{WHITE}Nuwe Pad Voertuie
+STR_9007_BUILD_VEHICLE                                          :{BLACK}Bou Voertuig
+STR_9009_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Kan nie pad voertuig bou nie...
+STR_900C_DETAILS                                                :{WHITE}{VEHICLE} (Aanwyse)
+STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}Ouderdom: {LTBLUE}{STRING}{BLACK}   Loopkoste: {LTBLUE}{CURRENCY}/Jr
+STR_900E_MAX_SPEED                                              :{BLACK}Max. spoed: {LTBLUE}{VELOCITY}
+STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profyt die jaar: {LTBLUE}{CURRENCY}  (verlede jaar: {CURRENCY})
+STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Betroubaarheid: {LTBLUE}{COMMA}% {BLACK}Komplikasies na laaste diens: {LTBLUE}{COMMA}
+STR_9011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebou: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
+STR_9012_CAPACITY                                               :{BLACK}Kapasitiet: {LTBLUE}{CARGO}
+STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...moet gestop binne 'n pad voertuig depot wees
+STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}Kan nie pad voertuig verkoop nie
+STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}Kani nie pad voertuig stop/aanskakel nie...
+STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}Pad voertuig {COMMA} wag in depot
+STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Op pad na {TOWN} Pad Depot
+STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Op pad na {TOWN} Pad Depot, {VELOCITY}
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Diens by {TOWN} Pad Depot
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}Diens by {TOWN} Pad Depot, {VELOCITY}
+STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT                            :{WHITE}Kan nie voertuig na depot stuur nie...
+STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Kan nie plaaslike depot vind nie
+STR_901A_ROAD_VEHICLES_CLICK_ON                                 :{BLACK}Pad voertuie - kliek op voertuig vir inligting
+STR_901B_BUILD_NEW_ROAD_VEHICLES                                :{BLACK}Bou nuwe pad voertuie (vereis pad voertuig depot)
+STR_901C_CURRENT_VEHICLE_ACTION                                 :{BLACK}Huidige voertuig aksie - kliek hier om voertuig to stop/aanskakel
+STR_901D_SHOW_VEHICLE_S_ORDERS                                  :{BLACK}Toon 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}Forseer 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
+STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Sleep pad voertuig hier om dit te verkoop
+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 verlig pad voertuig
+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 forseer om te omdraai nie...
+STR_ONLY_TURN_SINGLE_UNIT                                       :{WHITE}Kan nie voertuie van veel deele draai 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                                    :Diens by {TOWN} Pad Voertuig Depot
+
+STR_REFIT_ROAD_VEHICLE_TO_CARRY                                 :{BLACK}Herpas pad voertuig om 'n ander vrag tipe te ontvoer
+STR_REFIT_ROAD_VEHICLE                                          :{BLACK}Herpas pad voertuig
+STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Herpas pad voertuig om beklemtoonde vrat tipe te ontvoer
+STR_REFIT_ROAD_VEHICLE_CAN_T                                    :{WHITE}Kan nie pad voertuig herpas nie...
+STR_ROAD_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Kies vrag tipe vir pad voertuig te ontvoer
+
+##id 0x9800
+STR_9800_DOCK_CONSTRUCTION                                      :Werf konstruksie
+STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}Werf konstruksie
+STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Kan nie werf hier bou nie...
+STR_9803_SHIP_DEPOT                                             :{WHITE}{TOWN} Skip Depot
+STR_9804_NEW_SHIPS                                              :{BLACK}Nuwe Skepe
+STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} Skeep{P "" e}
+STR_9808_NEW_SHIPS                                              :{WHITE}Nuwe Skepe
+STR_9809_BUILD_SHIP                                             :{BLACK}Bou Skip
+STR_CLONE_SHIP                                                  :{BLACK}Kloon Skip
+STR_CLONE_SHIP_INFO                                             :{BLACK}Dit sal 'n kopie van die skip bou. Control-kliek sal die opdrae deel
+STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Dit sal 'n kopie van 'n skip bou. Kliek die knoppie en dan op 'n skip binne of buite die depot. Control-kliek sal die opdrae deel
+STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Skip moet in 'n depot gestop wees
+STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Skip kan nie verkoop word nie...
+STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Kan nie skip bou nie...
+STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Skip in die pad
+STR_980F                                                        :{WHITE}{VEHICLE}
+STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (Aanwyse)
+STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}Ouderdom: {LTBLUE}{STRING}{BLACK}   Loopkoste: {LTBLUE}{CURRENCY}/Jr
+STR_9813_MAX_SPEED                                              :{BLACK}Max. spoed: {LTBLUE}{VELOCITY}
+STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profyt die jaar: {LTBLUE}{CURRENCY}  (verlede jaar: {CURRENCY})
+STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}Betroubaarheid: {LTBLUE}{COMMA}%  {BLACK}Komplikasies na laaste diens: {LTBLUE}{COMMA}
+STR_9816_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebou: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
+STR_9817_CAPACITY                                               :{BLACK}Kapasitiet: {LTBLUE}{CARGO}
+STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}Kan nie skip stop/aanskakel nie
+STR_9819_CAN_T_SEND_SHIP_TO_DEPOT                               :{WHITE}Kan nie skip na depot stuur nie...
+STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Kan nie plaaslike depot vind nie
+STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Op pad na {TOWN} Skip Depot
+STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Op pad na {TOWN} Skip Depot, {VELOCITY}
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE                              :{LTBLUE}Diens by {TOWN} Skip Depot
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL                          :{LTBLUE}Diens by {TOWN} Skip Depot, {VELOCITY}
+STR_981C_SHIP_IS_WAITING_IN_DEPOT                               :{WHITE}Skip {COMMA} wag in depot
+STR_981D_BUILD_SHIP_DOCK                                        :{BLACK}Bou skip werf
+STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING                          :{BLACK}Bou skip depot (vir opbou en diens van skepe)
+STR_981F_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Skepe - kliek op skeep vir inligting
+STR_9820_BUILD_NEW_SHIP                                         :{BLACK}Bou nuwe skip
+STR_9821_DRAG_SHIP_TO_HERE_TO_SELL                              :{BLACK}Sleep skip hier om dit te verkoop
+STR_9822_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Senter skerm op skip depot
+STR_9823_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Skepe - kliek op skip vir informasie
+STR_9824_BUILD_NEW_SHIPS_REQUIRES                               :{BLACK}Bou nuwe skepe (vereis skip depot)
+STR_9825_SHIP_SELECTION_LIST_CLICK                              :{BLACK}Skip keuse lys - kliek op skip vir inligting
+STR_9826_BUILD_THE_HIGHLIGHTED_SHIP                             :{BLACK}Bou die verlig skip
+STR_9827_CURRENT_SHIP_ACTION_CLICK                              :{BLACK}Huidige skip aksie - kliek hier om skip te stop/aanskakel
+STR_9828_SHOW_SHIP_S_ORDERS                                     :{BLACK}Wys skip se opdrae
+STR_9829_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Senter skerm op skip
+STR_982A_SEND_SHIP_TO_DEPOT                                     :{BLACK}Stuur skip na depot
+STR_982B_SHOW_SHIP_DETAILS                                      :{BLACK}Wys skip se aanwyse
+STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Koste: {CURRENCY} Max. Spoed: {VELOCITY}{}Kapasitiet: {CARGO}{}Loopkoste: {CURRENCY}/yr
+STR_982F_NAME_SHIP                                              :{BLACK}Benaam skip
+
+STR_9831_NAME_SHIP                                              :{WHITE}Benaam skip
+STR_9832_CAN_T_NAME_SHIP                                        :{WHITE}Kan nie skip benaam nie...
+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}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
+STR_983D_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Kies vrag tipe vir skip te ontvoer
+STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED                        :{BLACK}Herstel skip om die verlig vrag tipe te ontvoer
+STR_983F_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Kies vrag tipe vir skip te ontvoer:
+STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nuwe kapasiteit: {GOLD}{CARGO}{}{BLACK}Herstelkoste: {GOLD}{CURRENCY}
+STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Skip kan nie herstel word nie...
+STR_9842_REFITTABLE                                             :(herstelbaar)
+STR_GO_TO_SHIP_DEPOT                                            :Gaan na {TOWN} Skip Depot
+SERVICE_AT_SHIP_DEPOT                                           :Diens by {TOWN} Skip Depot
+
+##id 0xA000
+STR_A000_AIRPORTS                                               :{WHITE}Lughawe
+STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}Lughawe kan nie hier gebou word nie...
+STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}{STATION} Vliegtuig Hangar
+STR_A003_NEW_AIRCRAFT                                           :{BLACK}Nuwe Vliegtuig
+STR_CLONE_AIRCRAFT                                              :{BLACK}Kloon Vliegtuig
+STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Dit sal 'n kopie van die vliegtuig bou. Control-kliek sal die opdrae deel
+STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}Dit sal 'n kopie van 'n vliegtuig bou. Kliek die knoppie en dan op 'n vliegtuig binne of buite die hangar. Control-kliek sal die opdrae deel
+STR_A005_NEW_AIRCRAFT                                           :{WHITE}Nuwe Vliegtuig
+STR_A006_BUILD_AIRCRAFT                                         :{BLACK}Bou Vliegtuig
+STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}Kan nie vliegtuig bou nie...
+STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA} Vliegtuie
+STR_A00A                                                        :{WHITE}{VEHICLE}
+STR_A00B_ORDERS                                                 :{WHITE}{VEHICLE} (Opdrae)
+STR_A00C_DETAILS                                                :{WHITE}{VEHICLE} (Aanwyse)
+STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}Ouderdom: {LTBLUE}{STRING}{BLACK}   Loopkoste: {LTBLUE}{CURRENCY}/Jr
+STR_A00E_MAX_SPEED                                              :{BLACK}Max. spoed: {LTBLUE}{VELOCITY}
+STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profyt die jaar: {LTBLUE}{CURRENCY}  (verlede jaar: {CURRENCY})
+STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Betroubaarheid: {LTBLUE}{COMMA}%  {BLACK}Komplikasies na laaste diens: {LTBLUE}{COMMA}
+STR_A011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebou: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
+STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Kan nie vlietuig na hangar stuur nie...
+STR_HEADING_FOR_HANGAR                                          :{ORANGE}Op pad na {STATION} Hangar
+STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}Op pad na {STATION} Hangar, {VELOCITY}
+STR_HEADING_FOR_HANGAR_SERVICE                                  :{LTBLUE}Diens by {STATION} Hangar
+STR_HEADING_FOR_HANGAR_SERVICE_VEL                              :{LTBLUE}Diens by {STATION} Hangar, {VELOCITY}
+STR_A014_AIRCRAFT_IS_WAITING_IN                                 :{WHITE}Vliegtuig {COMMA} wag in die vliegtuig hangar
+STR_A015_AIRCRAFT_IN_THE_WAY                                    :{WHITE}Vliegtuig in die pad
+STR_A016_CAN_T_STOP_START_AIRCRAFT                              :{WHITE}Kan nie vliegtuig stop/aanskakel nie...
+STR_A017_AIRCRAFT_IS_IN_FLIGHT                                  :{WHITE}Vliegtuig is opvlug
+STR_A019_CAPACITY                                               :{BLACK}Kapasiteit: {LTBLUE}{CARGO}, {CARGO}
+STR_A01A_CAPACITY                                               :{BLACK}Kapasiteit: {LTBLUE}{CARGO}
+STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}Vliegtuig moet in hangar gestop wees
+STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Vliegtuig kan nie verkoop word nie...
+STR_A01D_AIRPORT_CONSTRUCTION                                   :Lughawe konstruksie
+STR_A01E_BUILD_AIRPORT                                          :{BLACK}Bou lughawe
+STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Vliegtuie - kliek op vliegtuig vir informasie
+STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES                            :{BLACK}Bou nuwe vliegtuig (vereis lughawe met hangar)
+STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Vliegtuie - kliek op vliegtuig vir informasie
+STR_A022_BUILD_NEW_AIRCRAFT                                     :{BLACK}Bou nuwe vliegtuig
+STR_A023_DRAG_AIRCRAFT_TO_HERE_TO                               :{BLACK}Sleep vliegtuig hier om dit te verkoop
+STR_A024_CENTER_MAIN_VIEW_ON_HANGAR                             :{BLACK}Senter skerm op hangar
+STR_A025_AIRCRAFT_SELECTION_LIST                                :{BLACK}Vliegtuig keuse lys - kliek op vliegtuig vir inligting
+STR_A026_BUILD_THE_HIGHLIGHTED_AIRCRAFT                         :{BLACK}Bou die verlig vliegtuig
+STR_A027_CURRENT_AIRCRAFT_ACTION                                :{BLACK}Huidige vliegtuig aksie - kliek hier on vliegtuig te stop/aanskakel
+STR_A028_SHOW_AIRCRAFT_S_ORDERS                                 :{BLACK}Toon vliegtuig se opdrae
+STR_A029_CENTER_MAIN_VIEW_ON_AIRCRAFT                           :{BLACK}Senter skerm op vliegtuig
+STR_A02A_SEND_AIRCRAFT_TO_HANGAR                                :{BLACK}Stuur vliegtuig na hangar. CTRL+kliek sal net diens
+STR_A02B_SHOW_AIRCRAFT_DETAILS                                  :{BLACK}Toon vliegtuig aanwyse
+STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Koste: {CURRENCY} Max. Spoed: {VELOCITY}{}Kapasiteit: {COMMA} passasiers, {COMMA} sakke van pos{}Loopkoste: {CURRENCY}/Jr
+
+STR_A030_NAME_AIRCRAFT                                          :{WHITE}Benaam vliegtuig
+STR_A031_CAN_T_NAME_AIRCRAFT                                    :{WHITE}Vliegtuig kan nie benaam word nie...
+STR_A032_NAME_AIRCRAFT                                          :{BLACK}Benaam vliegtuig
+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_PLANE_CRASH_OUT_OF_FUEL                                     :{BLACK}{BIGFONT}Vliegtuig Ongeluk!{}Vliegtuig het geen petrol nie, {COMMA} sterf in 'n bal van vuur!
+STR_A036                                                        :{TINYFONT}{BLACK}{STATION}
+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
+STR_A03E_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Kies vrag tipe vir vliegtuig om te ontvoer
+STR_A03F_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Herstel vliegtuig om verlig vrag tipe te ontvoer
+STR_A040_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Kies vrag tipe om te ontvoer:
+STR_A041_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nuwe kapasiteit: {GOLD}{STRING}{}{BLACK}Herstelkoste: {GOLD}{CURRENCY}
+STR_A042_CAN_T_REFIT_AIRCRAFT                                   :{WHITE}Vliegtuig kan nie herstel word nie...
+STR_GO_TO_AIRPORT_HANGAR                                        :Gaan na {STATION} Hangar
+SERVICE_AT_AIRPORT_HANGAR                                       :Diens by {STATION} Hangar
+
+STR_TIMETABLE_TITLE                                             :{WHITE}{VEHICLE} (Rooster)
+
+##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!
+STR_B002_OIL_REFINERY_EXPLOSION                                 :{BLACK}{BIGFONT}Olie raffineerdery ontploffing naby {TOWN}!
+STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS                        :{BLACK}{BIGFONT}fabriek vernietig in agterdogtig omstandighede naby {TOWN}!
+STR_B004_UFO_LANDS_NEAR                                         :{BLACK}{BIGFONT}'VVV' beland naby {TOWN}!
+STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Kool myn bedaaring los spoor van vernietiging naby {TOWN}!
+STR_B006_FLOOD_VEHICLE_DESTROYED                                :{BLACK}{BIGFONT}Oorstroom!{}Te minste {COMMA} vermis, aangeneem dood na beduidende oorstroom!
+
+STR_BRIBE_FAILED                                                :{WHITE}Jou omkooping onderneeming is deur
+STR_BRIBE_FAILED_2                                              :{WHITE}'n streek navorser uitgevind
+STR_BUILD_DATE                                                  :{BLACK}Gebou: {LTBLUE}{DATE_LONG}
+
+STR_PERFORMANCE_DETAIL                                          :{WHITE}Aanwysend prestasie gradering
+STR_PERFORMANCE_DETAIL_KEY                                      :{BLACK}Aanwyse
+STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY                          :{BLACK}({CURRCOMPACT}/{CURRCOMPACT})
+STR_PERFORMANCE_DETAIL_AMOUNT_INT                               :{BLACK}({COMMA}/{COMMA})
+STR_PERFORMANCE_DETAIL_PERCENT                                  :{WHITE}{NUM}%
+SET_PERFORMANCE_DETAIL_INT                                      :{BLACK}{NUM}
+############ Those following lines need to be in this order!!
+STR_PERFORMANCE_DETAIL_VEHICLES                                 :{BLACK}Voertuie:
+STR_PERFORMANCE_DETAIL_STATIONS                                 :{BLACK}Stasies:
+STR_PERFORMANCE_DETAIL_MIN_PROFIT                               :{BLACK}Min. profyt:
+STR_PERFORMANCE_DETAIL_MIN_INCOME                               :{BLACK}Min. inkome:
+STR_PERFORMANCE_DETAIL_MAX_INCOME                               :{BLACK}Maks. inkome:
+STR_PERFORMANCE_DETAIL_DELIVERED                                :{BLACK}Afgelewer:
+STR_PERFORMANCE_DETAIL_CARGO                                    :{BLACK}Vrag:
+STR_PERFORMANCE_DETAIL_MONEY                                    :{BLACK}Geld:
+STR_PERFORMANCE_DETAIL_LOAN                                     :{BLACK}Lening:
+STR_PERFORMANCE_DETAIL_TOTAL                                    :{BLACK}Totaal:
+############ End of order list
+STR_PERFORMANCE_DETAIL_VEHICLES_TIP                             :{BLACK}Nommer van voertuie; dit sluit pad voertuie, treine, skepe en vliegtuie in
+STR_PERFORMANCE_DETAIL_STATIONS_TIP                             :{BLACK}Aantal van stasie parte. Elke deel van 'n stasie (b.v. trein stasie, bushalte, lughawe) is getel, selfs indien hulle is konnekteer as een stasie
+STR_PERFORMANCE_DETAIL_MIN_PROFIT_TIP                           :{BLACK}Die profyt van die voertuig met die laagste inkome (van alle voertuie ouer as 2 jaare)
+STR_PERFORMANCE_DETAIL_MIN_INCOME_TIP                           :{BLACK}Bedrag van kontant gemaak in die maand met die laagste profyt in die laaste 12 kwartiers
+STR_PERFORMANCE_DETAIL_MAX_INCOME_TIP                           :{BLACK}Bedrag van kontant gemaak in die maand met die hoogste profyt in die laaste 12 kwartiers
+STR_PERFORMANCE_DETAIL_DELIVERED_TIP                            :{BLACK}Eenheide van vrag afgelewer in die laaste vier kwartiers
+STR_PERFORMANCE_DETAIL_CARGO_TIP                                :{BLACK}Nommer van vrag tipes afgelewer in die verlede kwartier
+STR_PERFORMANCE_DETAIL_MONEY_TIP                                :{BLACK}Bedrag van geld die maatskappy het in die bank
+STR_PERFORMANCE_DETAIL_LOAN_TIP                                 :{BLACK}Die bedrag van geld dat die maatskappy het gevat op lening
+STR_PERFORMANCE_DETAIL_TOTAL_TIP                                :{BLACK}Totaale punte uit van moontlike punte
+
+STR_NEWGRF_SETTINGS_BUTTON                                      :{BLACK}NewGRF Stellings
+STR_NEWGRF_SETTINGS_CAPTION                                     :{WHITE}NewGRF stellings
+STR_NEWGRF_APPLY_CHANGES                                        :{BLACK}Wend aan veranderings
+STR_NEWGRF_SET_PARAMETERS                                       :{BLACK}Stel parameters
+STR_NEWGRF_TIP                                                  :{BLACK}'n Lys van al die Newgrf stelle wat ingestel is. Kliek op 'n stel om die stellings te verander
+STR_NEWGRF_NO_FILES_INSTALLED                                   :{BLACK}Daar is tans geen NewGRF lêers installeer! Asseblief verwys na die handleiding vir instruksies op installering van nuwe grafieke
+STR_NEWGRF_FILENAME                                             :{BLACK}Lêer naam: {SILVER}{STRING}
+STR_NEWGRF_GRF_ID                                               :{BLACK}GRF ID: {SILVER}{STRING}
+STR_NEWGRF_MD5SUM                                               :{BLACK}MD5sum: {SILVER}{STRING}
+STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}Jy is besig om veranderings op ‘n tans gebruikte speletjie te doen. Dit kan OpenTTD beskadig. {}Is jy heeltemal seker ?
+
+STR_NEWGRF_ERROR_MSG_INFO                                       :{SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_WARNING                                    :{RED}Waarskuwing: {SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_ERROR                                      :{RED}Fout: {SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_FATAL                                      :{RED}Fataal: {SILVER}{STRING}
+STR_NEWGRF_ERROR_VERSION_NUMBER                                 :{STRING} sal nie met die TTDPatch uitgawe rapporteer deur OpenTTD werk nie.
+STR_NEWGRF_ERROR_DOS_OR_WINDOWS                                 :{STRING} is vir die {STRING} uitgawe van TTD.
+STR_NEWGRF_ERROR_UNSET_SWITCH                                   :{STRING} is onderwerp om saam met {STRING} gebruik te word
+STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Ongeldig parameter vir {STRING}: parameter {STRING} ({NUM})
+STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} moet voor {STRING} gelaai word.
+STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} moet na {STRING} gelaai word.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} vereis OpenTTD uitgawe {STRING} of beter.
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :die GRF lêer dit was ontwerp om te vertaal
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Te veel NewGRFs gelaai
+
+STR_NEWGRF_ADD                                                  :{BLACK}Voeg
+STR_NEWGRF_ADD_TIP                                              :{BLACK}Voeg 'n NewGRF na die lys
+STR_NEWGRF_REMOVE                                               :{BLACK}Verwyder
+STR_NEWGRF_REMOVE_TIP                                           :{BLACK}Verwyder die gekose NewGRF lêer van die lys
+STR_NEWGRF_MOVEUP                                               :{BLACK}Beweeg Op
+STR_NEWGRF_MOVEUP_TIP                                           :{BLACK}Beweeg die gekose NewGRF op in die lys
+STR_NEWGRF_MOVEDOWN                                             :{BLACK}Beweeg Af
+STR_NEWGRF_MOVEDOWN_TIP                                         :{BLACK}Beweeg die gekose NewGRF af in die lys
+STR_NEWGRF_FILE_TIP                                             :{BLACK}'n Lys van die NewGRF lêers wat installer. Kliek 'n lêer om sy parameter te verander.
+STR_NEWGRF_PARAMETER                                            :{BLACK}Parameters: {SILVER}{STRING}
+STR_NEWGRF_PARAMETER_QUERY                                      :{BLACK}Invoer NewGRF parameters
+STR_NEWGRF_NO_INFO                                              :{BLACK}Geen informasie beskikbaar
+
+STR_NEWGRF_ADD_CAPTION                                          :{WHITE}Beskikbaar NewGRF lêers
+STR_NEWGRF_ADD_FILE                                             :{BLACK}Voeg na seleksie
+STR_NEWGRF_ADD_FILE_TIP                                         :{BLACK}Voeg die verkiesde NewGRF lêer na u configurasie
+STR_NEWGRF_RESCAN_FILES                                         :{BLACK}Herskandeer lêers
+STR_NEWGRF_RESCAN_FILES_TIP                                     :{BLACK}Bywerk die lys van beskikbaar NewGRF lêers
+STR_NEWGRF_DUPLICATE_GRFID                                      :{WHITE}Kan nie lêer voeg: duplikaat GRF ID
+
+STR_NEWGRF_NOT_FOUND                                            :{RED}Gelyke lêer nie gevind nie
+STR_NEWGRF_DISABLED                                             :{RED}Gestrem
+STR_NEWGRF_COMPATIBLE_LOADED                                    :{ORANGE}Gelyke lêer nie gevind nie (versoenbaar GRF gelaai)
+
+STR_NEWGRF_COMPATIBLE_LOAD_WARNING                              :{WHITE}Versoenbaar GRF(s) gelaai vir vermis lêers
+STR_NEWGRF_DISABLED_WARNING                                     :{WHITE}Vermis GRF lêers is gestrem
+STR_NEWGRF_NOT_FOUND_WARNING                                    :{WHITE}Vermis GRF lêer(s) om speletjie te laai
+
+STR_CURRENCY_WINDOW                                             :{WHITE}Gewoonte koers
+STR_CURRENCY_EXCHANGE_RATE                                      :{LTBLUE}Wissel koers: {ORANGE}{CURRENCY} = £ {COMMA}
+STR_CURRENCY_SEPARATOR                                          :{LTBLUE}Afskeier
+STR_CURRENCY_PREFIX                                             :{LTBLUE}Vervoegsel:
+STR_CURRENCY_SUFFIX                                             :{LTBLUE}Agtervoegsel:
+STR_CURRENCY_SWITCH_TO_EURO                                     :{LTBLUE}Verwissel na Euro: {ORANGE}{NUM}
+STR_CURRENCY_SWITCH_TO_EURO_NEVER                               :{LTBLUE}Verwissel na Euro: {ORANGE}nooit
+STR_CURRENCY_PREVIEW                                            :{LTBLUE}Voorskou: {ORANGE}{CURRENCY}
+STR_CURRENCY_CHANGE_PARAMETER                                   :{BLACK}verander gebruiklike koers parameter
+
+STR_TRAIN                                                       :{BLACK}{TRAIN}
+STR_BUS                                                         :{BLACK}{BUS}
+STR_LORRY                                                       :{BLACK}{LORRY}
+STR_PLANE                                                       :{BLACK}{PLANE}
+STR_SHIP                                                        :{BLACK}{SHIP}
+
+STR_SCHEDULED_TRAINS                                            :{WHITE}{STATION} - {COMMA} Trein{P "" e}
+STR_SCHEDULED_ROAD_VEHICLES                                     :{WHITE}{STATION} - {COMMA} Pad Voertui{P g e}
+STR_SCHEDULED_AIRCRAFT                                          :{WHITE}{STATION} - {COMMA} Vliegtuig
+STR_SCHEDULED_SHIPS                                             :{WHITE}{STATION} - {COMMA} Sk{P ip epe}
+
+STR_SCHEDULED_TRAINS_TIP                                        :{BLACK}Toon alle treine wat hierdie stasie op hul skedule het
+STR_SCHEDULED_ROAD_VEHICLES_TIP                                 :{BLACK}Toon alle pad voertuie wat hierdie stasie op hul skedule het
+STR_SCHEDULED_AIRCRAFT_TIP                                      :{BLACK}Toon alle vliegtuie wat hierdie stasie op hul skedule het
+STR_SCHEDULED_SHIPS_TIP                                         :{BLACK}Toon alle skepe wat hierdie stasie op hul skedule het
+
+STR_VEH_WITH_SHARED_ORDERS_LIST                                 :{WHITE}Gedeel opdrae van {COMMA} Voertui{P g e}
+STR_VEH_WITH_SHARED_ORDERS_LIST_TIP                             :{BLACK}Toon alle voertuie wat die rooster deel
+
+### depot strings
+STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}U staan op die punt om al die voertuie in die depot te verkoop. Is jy seker?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Verkeerde depot tipe
+
+STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Verkoop allep treine in die depot
+STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Verkoop alle pad voertuie in die depot
+STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP                              :{BLACK}Verkoop alle skepe in die depot
+STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP                          :{BLACK}Verkoop alle vliegtuie in die hangar
+
+STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Kry 'n lys van alle treine met die huidige depot in sy opdrae
+STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Kry 'n lys van alle pad voertuie met die huidige depot in sy opdrae
+STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Kry 'n lys van alle skepe met die huidige depot in sy opdrae
+STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Kry 'n lys van alle vliegtuie wat enige hangar by die lughawe in sy opdrae het
+
+STR_DEPOT_AUTOREPLACE_TRAIN_TIP                                 :{BLACK}Outovervang alle treine in die depot
+STR_DEPOT_AUTOREPLACE_ROADVEH_TIP                               :{BLACK}Outovervang alle pad voertuie in die depot
+STR_DEPOT_AUTOREPLACE_SHIP_TIP                                  :{BLACK}Outovervang alle skepe in die depot
+STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP                              :{BLACK}Outovervang alle vlietuie in die hangar
+
+STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - {COMMA} Trein{P "" e}
+STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - {COMMA} Pad Voertui{P g e}
+STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA} Sk{P ip epe}
+STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} Vliegtuig
+
+STR_REPLACE_VEHICLES_WHITE                                      :{WHITE}Vervang {STRING}
+STR_REPLACE_VEHICLES_START                                      :{BLACK}Begin Voertuie Vervang
+STR_REPLACE_VEHICLES_STOP                                       :{BLACK}Stop Voertuie Vervang
+STR_NOT_REPLACING                                               :{BLACK}Word nie vervang nie
+STR_NOT_REPLACING_VEHICLE_SELECTED                              :{BLACK}Geen voertuig gekies
+STR_REPLACE_HELP_LEFT_ARRAY                                     :{BLACK}Kies die enjin tipe te vervang
+STR_REPLACE_HELP_RIGHT_ARRAY                                    :{BLACK}Kies die nuwe enjin tipe jy wou gebriuk in plaas van die linkerkant gekose enjin tipe
+STR_REPLACE_HELP_STOP_BUTTON                                    :{BLACK}Druk om te stop die vervanger van die enjin tipe gekose links
+STR_REPLACE_HELP_START_BUTTON                                   :{BLACK}Druk om te begin vervanger van die linkerkant gekose enjin tipe met die regte gekose enjin tipe
+STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}Kies die spoortipe waarvoor jy wil enjine vervang
+STR_REPLACE_HELP_REPLACE_INFO_TAB                               :{BLACK}Toon watter enjin die linkerkand gekose enjin word vervang met, of enige
+STR_REPLACE_HELP                                                :{BLACK}Hierdie laat jou toe om te vervang een enjin tipe met 'n ander tipe, wanneer treine van die oorspronklike tipe arriveer by 'n depot
+STR_REPLACE_REMOVE_WAGON                                        :{BLACK}Wa verwydering: {ORANGE}{SKIP}{STRING}
+STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Maak autoreplace hou die lengte van 'n trein dieselfde deur verwyder waens (begin by die voor), indien vervang die enjin sal die trein langer maak
+STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Vervang: {ORANGE}{SKIP}{SKIP}{STRING}
+STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EKSPERIMENTELE KENMERK {} Skakel tussen enjin en wa vervang vensters. {} Wa vervang sal alleen gedoen word indien die nuwe wa kan wees herpas binne-in dra dieselfde tipe van cargo as die ou een. Hierdie is gemerk vir elke wa wanneer die vervang plaasvind.
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Voertuig is nie beskikbaar nie
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Voertuig is nie beskikbaar nie
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Skip is nie beskikbaar
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Vliegtuig is nie beskikbaar nie
+
+STR_ENGINES                                                     :Enjine
+STR_WAGONS                                                      :Waens
+
+STR_MASS_STOP_DEPOT_TRAIN_TIP                                   :{BLACK}Kliek om alle treine in die depot te stop
+STR_MASS_STOP_DEPOT_ROADVEH_TIP                                 :{BLACK}Kliek om alle pad voertuie in die depot te stop
+STR_MASS_STOP_DEPOT_SHIP_TIP                                    :{BLACK}Kliek om alle skepe in die depot te stop
+STR_MASS_STOP_HANGAR_TIP                                        :{BLACK}Kliek om alle vlietuie in die hangar te stop
+
+STR_MASS_START_DEPOT_TRAIN_TIP                                  :{BLACK}Kliek om alle treine in die depot te aanskakel
+STR_MASS_START_DEPOT_ROADVEH_TIP                                :{BLACK}Kliek om alle pad voertuie in die depot te aanskakel
+STR_MASS_START_DEPOT_SHIP_TIP                                   :{BLACK}Kliek om alle skepe in die depot te aanskakel
+STR_MASS_START_HANGAR_TIP                                       :{BLACK}Kliek om alle vliegtuie in die hangar te aanskakel
+
+STR_MASS_STOP_LIST_TIP                                          :{BLACK}Kliek om alle voertuie in die lys te stop
+STR_MASS_START_LIST_TIP                                         :{BLACK}Kliek om aller voertuie in die lys te aanskakel
+
+STR_SHORT_DATE                                                  :{WHITE}{DATE_TINY}
+STR_SIGN_LIST_CAPTION                                           :{WHITE}Teken Lys - {COMMA} Teken{P "" s}
+
+STR_ORDER_REFIT_FAILED                                          :{WHITE}Opdrag herstel mislukking gestop {STRING} {COMMA}
+
+############ Lists rail types
+
+STR_RAIL_VEHICLES                                               :Spoort voertuie
+STR_ELRAIL_VEHICLES                                             :Elektrifiseerde Spoor Voertuie
+STR_MONORAIL_VEHICLES                                           :Eenspoor Voertuie
+STR_MAGLEV_VEHICLES                                             :Maglev Voertuie
+
+############ End of list of rail types
+
+STR_TINY_BLACK                                                  :{BLACK}{TINYFONT}{COMMA}
+
+STR_PURCHASE_INFO_COST_WEIGHT                                   :{BLACK}Kos: {GOLD}{CURRENCY}{BLACK} Gewig: {GOLD}{WEIGHT_S}
+STR_PURCHASE_INFO_SPEED_POWER                                   :{BLACK}Spoed: {GOLD}{VELOCITY}{BLACK}   Krag: {GOLD}{POWER}
+STR_PURCHASE_INFO_SPEED                                         :{BLACK}Spoed: {GOLD}{VELOCITY}
+STR_PURCHASE_INFO_RUNNINGCOST                                   :{BLACK}Loopkoste: {GOLD}{CURRENCY}/jr
+STR_PURCHASE_INFO_CAPACITY                                      :{BLACK}Kapasiteit: {GOLD}{CARGO} {STRING}
+STR_PURCHASE_INFO_DESIGNED_LIFE                                 :{BLACK}Ontwerp: {GOLD}{NUM}{BLACK} Lewe: {GOLD}{COMMA} jare
+STR_PURCHASE_INFO_RELIABILITY                                   :{BLACK}Maks. Betroubaarheid: {GOLD}{COMMA}%
+STR_PURCHASE_INFO_COST                                          :{BLACK}Kos: {GOLD}{CURRENCY}
+STR_PURCHASE_INFO_WEIGHT_CWEIGHT                                :{BLACK}Gewig: {GOLD}{WEIGHT_S}  ({WEIGHT_S})
+STR_PURCHASE_INFO_COST_SPEED                                    :{BLACK}Kos: {GOLD}{CURRENCY}{BLACK} Spoed: {GOLD}{VELOCITY}
+STR_PURCHASE_INFO_AIRCRAFT_CAPACITY                             :{BLACK}Kapasiteit: {GOLD}{COMMA} passasiers, {COMMA} sakke van pos
+STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT                          :{BLACK}Self Krag Waens: {GOLD}+{POWER}{BLACK} Gewig: {GOLD}+{WEIGHT_S}
+STR_PURCHASE_INFO_REFITTABLE_TO                                 :{BLACK}Herpasbaar na: {GOLD}
+STR_PURCHASE_INFO_ALL_TYPES                                     :Alle vrag tipes
+STR_PURCHASE_INFO_ALL_BUT                                       :Alles behalwe {GOLD}
+STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}Maks. Traktiewe Poging: {GOLD}{FORCE}
+
+########### String for New Landscape Generator
+
+STR_GENERATE                                                    :{WHITE}Opwek
+STR_RANDOM                                                      :{BLACK}Lukraake
+STR_RANDOM_HELP                                                 :{BLACK}Verander die lukraak saad gebruik vir Terrein Generasie
+STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Wêreld generasie
+STR_RANDOM_SEED                                                 :{BLACK}Lukraak Saad:
+STR_RANDOM_SEED_HELP                                            :{BLACK}Kliek om 'n lukraak saad in te voeg
+STR_LAND_GENERATOR                                              :{BLACK}Daal genereerder:
+STR_TREE_PLACER                                                 :{BLACK}Boom algoritme:
+STR_HEIGHTMAP_ROTATION                                          :{BLACK}Hoogtekaart rotasie:
+STR_TERRAIN_TYPE                                                :{BLACK}Terrein tipe:
+STR_QUANTITY_OF_SEA_LAKES                                       :{BLACK}Seevlak:
+STR_SMOOTHNESS                                                  :{BLACK}Gladheid:
+STR_SNOW_LINE_HEIGHT                                            :{BLACK}Sneeu lyn hoogte:
+STR_DATE                                                        :{BLACK}Date:
+STR_NUMBER_OF_TOWNS                                             :{BLACK}Hoev. van dorpe
+STR_NUMBER_OF_INDUSTRIES                                        :{BLACK}Hoev. van nywerhede
+STR_GENERATE_DATE                                               :{BLACK}{DATE_LONG}
+STR_SNOW_LINE_UP                                                :{BLACK}Beweeg die sneeu lyn een op
+STR_SNOW_LINE_DOWN                                              :{BLACK}Beweeg die sneeu lyn een af
+STR_SNOW_LINE_QUERY_CAPT                                        :{WHITE}Verander sneeu lyn hoogte
+STR_START_DATE_QUERY_CAPT                                       :{WHITE}Verander begins jaar
+STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Skaal waaskuwing
+STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Om te verstel oorsprong werfkaart te is nie aanbeveel. Voortgaan met die generasie?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Dorp uitleg waarskuwing
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Die dorp uitleg "geen meer paaie" is nie aanbeveel nie. Gaan aan met generasie?
+STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
+STR_HEIGHTMAP_NAME                                              :{BLACK}Hoogtekaart name:
+STR_HEIGHTMAP_SIZE                                              :{BLACK}Groote: {ORANGE}{NUM} x {NUM}
+STR_GENERATION_WORLD                                            :{WHITE}Genereer wêreld...
+STR_GENERATION_ABORT                                            :{BLACK}Verlaat
+STR_GENERATION_ABORT_CAPTION                                    :{WHITE}Verlaat Wêreld Generasie
+STR_GENERATION_ABORT_MESSAGE                                    :{YELLOW}Wil jy rerig die generasie verlaat?
+STR_PROGRESS                                                    :{WHITE}{NUM}% klaar
+STR_GENERATION_PROGRESS                                         :{BLACK}{NUM} / {NUM}
+STR_WORLD_GENERATION                                            :{BLACK}Wêreld generasie
+STR_TREE_GENERATION                                             :{BLACK}Boom generasie
+STR_UNMOVABLE_GENERATION                                        :{BLACK}Onbeweegbaar generasie
+STR_CLEARING_TILES                                              :{BLACK}Ru en rotserig area ontwikkeling
+STR_SETTINGUP_GAME                                              :{BLACK}Stel speletjie op
+STR_PREPARING_TILELOOP                                          :{BLACK}Hardloop teël-herhaling
+STR_PREPARING_GAME                                              :{BLACK}Voorbereiding speletjie
+STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Hierdie aksie verander die moeite vlak to gebruiklike
+STR_SE_FLAT_WORLD                                               :{WHITE}Platte daal
+STR_SE_FLAT_WORLD_TIP                                           :{BLACK}Opwek 'n plat daal
+STR_SE_RANDOM_LAND                                              :{WHITE}Lukraak daal
+STR_SE_NEW_WORLD                                                :{BLACK}Skep nuwe draaiboek
+STR_SE_CAPTION                                                  :{WHITE}Draaiboek tipe
+STR_FLAT_WORLD_HEIGHT_DOWN                                      :{BLACK}Beweeg die hoogte van platte daal een af
+STR_FLAT_WORLD_HEIGHT_UP                                        :{BLACK}Beweeg die hoogte van platte daal bo een
+STR_FLAT_WORLD_HEIGHT_QUERY_CAPT                                :{WHITE}Verander die hoogte van platte daal
+STR_FLAT_WORLD_HEIGHT                                           :{BLACK}Hoogte van platte daal:
+STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
+
+STR_SMALLMAP_CENTER                                             :{BLACK}Senter die kleinwerfkaart op die huidige posisie
+
+########### String for new airports
+STR_SMALL_AIRPORT                                               :{BLACK}Klein
+STR_CITY_AIRPORT                                                :{BLACK}Dorp
+STR_METRO_AIRPORT                                               :{BLACK}Metropolitaans lughawe
+STR_INTERNATIONAL_AIRPORT                                       :{BLACK}Internasionaale lughawe
+STR_COMMUTER_AIRPORT                                            :{BLACK}Pendelaar
+STR_INTERCONTINENTAL_AIRPORT                                    :{BLACK}Tussenkontinentaal
+STR_HELIPORT                                                    :{BLACK}Helihawe
+STR_HELIDEPOT                                                   :{BLACK}Helidepot
+STR_HELISTATION                                                 :{BLACK}Helistasie
+
+STR_SMALL_AIRPORTS                                              :{BLACK}Klein lughawe
+STR_LARGE_AIRPORTS                                              :{BLACK}Groot Lughawe
+STR_HUB_AIRPORTS                                                :{BLACK}Naaf lughawe
+STR_HELIPORTS                                                   :{BLACK}Helikopter lughawe
+
+############ Tooltip measurment
+
+STR_MEASURE_LENGTH                                              :{BLACK}Lengte: {NUM}
+STR_MEASURE_AREA                                                :{BLACK}Area: {NUM} x {NUM}
+STR_MEASURE_LENGTH_HEIGHTDIFF                                   :{BLACK}Lengte: {NUM}{}Hoogte verskil: {NUM} m
+STR_MEASURE_AREA_HEIGHTDIFF                                     :{BLACK}Area: {NUM} x {NUM}{}Hoogte verskil: {NUM} m
+
+############ Date formatting
+STR_DATE_TINY                                                   :{STRING}-{STRING}-{NUM}
+STR_DATE_SHORT                                                  :{STRING} {NUM}
+STR_DATE_LONG                                                   :{STRING} {STRING} {NUM}
+
+########
+
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}oordra Krediete: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...hierdie is 'n dorp besit pad
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...pad teenoor in die verkeerde rigting
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Deursigtigheid Opsies
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Tokkel deursigtigheid vir stasie tekens
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Tokkel deursigtigheid vir boome
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Tokkel deursigtigheid vir huise
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Tokkel deursigtigheid vir nywerhede
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Tokkel deursigtigheid vir boubaardes soos stasies, depots, weypunte en catenary
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Tokkel deursigtigheid vir brue
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Tokkel deursigtigheid vir strukture soos vuurtorings en senders, miskien in toekoms vir ooglekkers
+STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Tokkel deursigtigheid vir laai aanwysers
+
+STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
+STR_PERCENT_UP                                                  :{WHITE}{NUM}%{UPARROW}
+STR_PERCENT_DOWN_SMALL                                          :{TINYFONT}{WHITE}{NUM}%{DOWNARROW}
+STR_PERCENT_DOWN                                                :{WHITE}{NUM}%{DOWNARROW}
+STR_PERCENT_UP_DOWN_SMALL                                       :{TINYFONT}{WHITE}{NUM}%{UPARROW}{DOWNARROW}
+STR_PERCENT_UP_DOWN                                             :{WHITE}{NUM}%{UPARROW}{DOWNARROW}
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Groep {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Alle triene
+STR_GROUP_ALL_ROADS                                             :Alle pad voertuie
+STR_GROUP_ALL_SHIPS                                             :Alle skepe
+STR_GROUP_ALL_AIRCRAFTS                                         :Alle vliegtuie
+STR_GROUP_DEFAULT_TRAINS                                        :Ongegroepeerde treine
+STR_GROUP_DEFAULT_ROADS                                         :Ongegroepeerde pad voertuie
+STR_GROUP_DEFAULT_SHIPS                                         :Ongegroepeerde skepe
+STR_GROUP_DEFAULT_AIRCRAFTS                                     :Ongegroepeerde vliegtuig
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Voeg gedeel voertuie
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Verwyder alle voertuie
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Trein{P "" e}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Pad Voer{P tuig tuie}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Sk{P ip epe}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Vliegtuie
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Hernoem groep
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Vervang Voertuie van "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Kan nie groep skep nie...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Kan nie groep uitvee nie...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Kan nie groep hernoem nie...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Kan nie alle voertuie van groep verwyder nie...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Kan nie voeg die voertuig tot hierdie groep nie...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Kan nie gedeel voertuie na groep byvoeg...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Groepe - Kliek op 'n groep om te lys alle voertuie van hierdie groep
+STR_GROUP_CREATE_TIP                                            :{BLACK}kliek om groep te skep
+STR_GROUP_DELETE_TIP                                            :{BLACK}Vee uit die gekose groep
+STR_GROUP_RENAME_TIP                                            :{BLACK}Hernoem die gekose groep
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Kliek om te beskerm hierdie groep van wêreldwyd outovervang
+
+STR_COMPANY_NAME                                                :{COMPANY}
+STR_ENGINE_NAME                                                 :{ENGINE}
+STR_GROUP_NAME                                                  :{GROUP}
+STR_PLAYER_NAME                                                 :{PLAYERNAME}
+STR_SIGN_NAME                                                   :{SIGN}
+STR_VEHICLE_NAME                                                :{VEHICLE}
+
+STR_NAME_MUST_BE_UNIQUE                                         :{WHITE}Naam moet unike wees
+
+#### Improved sign GUI
+STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Gaan na volgende teken
+STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Gaan na vorige teken
+
+########
+
+STR_FUND_NEW_INDUSTRY                                           :{BLACK}Fonds
+STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospek
+STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Bou
+STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Kies die paslike nywerheid van hierdie lys
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Voorlopend
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Voorloopend gesig keuse.
+STR_FACE_SIMPLE                                                 :{BLACK}Eenvoudig
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Eenvoudig gesig keuse.
+STR_FACE_LOAD                                                   :{BLACK}Laai
+STR_FACE_LOAD_TIP                                               :{BLACK}Laai gunsteling gesig
+STR_FACE_LOAD_DONE                                              :{WHITE}Jou gunsteling gesig is van die OpenTTD stellings lêer gelaai.
+STR_FACE_FACECODE                                               :{BLACK}Speler gesig no.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Toon en/of stel speler gesig nommer
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Toon en/of stel speler gesig nommer
+STR_FACE_FACECODE_SET                                           :{WHITE}Nuwe gesig nommer kode is gestel.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Kon nie speler gesig nommer stel - moet numeries wees tussen 0 en 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Spaar
+STR_FACE_SAVE_TIP                                               :{BLACK}Spaar gunsteling gesig
+STR_FACE_SAVE_DONE                                              :{WHITE}Die gesig sal as u gunsteling gesig in die OpenTTD stellings lêer gespaar word.
+STR_FACE_EUROPEAN                                               :{BLACK}Europiese
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Kies europiese gesige
+STR_FACE_AFRICAN                                                :{BLACK}Afrikaanse
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Kies  afrikaanse gesige
+STR_FACE_YES                                                    :Ja
+STR_FACE_NO                                                     :Nee
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Ontsper snor of oorbel
+STR_FACE_HAIR                                                   :Hare:
+STR_FACE_HAIR_TIP                                               :{BLACK}Verander hare
+STR_FACE_EYEBROWS                                               :Winkbroue:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Verander winkbroue
+STR_FACE_EYECOLOUR                                              :Oog kleur:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Verander oogkleur
+STR_FACE_GLASSES                                                :Brille:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Ontsper brille
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Verander brille
+STR_FACE_NOSE                                                   :Neus:
+STR_FACE_NOSE_TIP                                               :{BLACK}Verander neus
+STR_FACE_LIPS                                                   :Lippe:
+STR_FACE_MOUSTACHE                                              :Snor:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Verander lippe of snor
+STR_FACE_CHIN                                                   :Ken:
+STR_FACE_CHIN_TIP                                               :{BLACK}Verander ken
+STR_FACE_JACKET                                                 :Jas:
+STR_FACE_JACKET_TIP                                             :{BLACK}Verander jas
+STR_FACE_COLLAR                                                 :Kraag:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Verander kraag
+STR_FACE_TIE                                                    :Das:
+STR_FACE_EARRING                                                :Oorbel:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Verander das of oorbel
+########
--- a/src/lang/american.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/american.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -860,6 +860,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Fund new industry
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...can only be built in towns
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...can only be built in rainforest areas
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...can only be built in desert areas
@@ -1047,6 +1048,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Road vehicle queueing (with quantum effects): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Pan window when mouse is at the edge: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Allow bribing of the local authority: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Allow buying exclusive transport rights: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Allow sending money to other companies: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Nonuniform stations: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}New global pathfinding (NPF, overrides NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Weight multiplier for freight to simulate heavy trains: {ORANGE}{STRING}
@@ -1187,6 +1190,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proportion of towns that will grow twice as fast: {ORANGE}1 in {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proportion of towns that will grow twice as fast: {ORANGE}None
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Initial city size multiplier: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Remove absurd road-elements during the road construction
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construction
@@ -1996,9 +2000,9 @@
 STR_482F_COST                                                   :{BLACK}Cost: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Can't construct this industry type here...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...forest can only be planted above snow-line
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} announces imminent closure!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Supply problems cause {INDUSTRY} to announce imminent closure!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lack of nearby trees causes {INDUSTRY} to announce imminent closure!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} announces imminent closure!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Supply problems cause {STRING} to announce imminent closure!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lack of nearby trees causes {STRING} to announce imminent closure!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} increases production!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}New coal seam found at {INDUSTRY}!{}Production is expected to double!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}New oil reserves found at {INDUSTRY}!{}Production is expected to double!
@@ -2017,6 +2021,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 on same position
+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}
@@ -2296,7 +2302,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Relocate HQ
 STR_COMPANY_PASSWORD                                            :{BLACK}Password
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Password-protect your company to prevent unauthorized users from joining.
-STR_SET_COMPANY_PASSWORD                                        :Set company password
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Set company password
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}World Recession!{}{}Financial experts fear worst as economy slumps!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recession Over!{}{}Upturn in trade gives confidence to industries as economy strengthens!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Toggle large/small window size
@@ -2308,7 +2314,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Can't buy 25% share in this company...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Can't sell 25% share in this company...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% owned by {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% owned by {COMPANY}{}   {COMMA}% owned by {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} has been taken over by {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}This company is not old enough to trade shares yet...
 
@@ -2777,6 +2782,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}New {STRING} now available!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Can't sell destroyed vehicle...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Can't timetable vehicle...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Vehicles can only wait at stations.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}This vehicle is not stopping at this station.
@@ -3380,3 +3387,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospect
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Build
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Choose the appropriate industry from this list
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Advanced
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Advanced face selection.
+STR_FACE_SIMPLE                                                 :{BLACK}Simple
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Simple face selection.
+STR_FACE_LOAD                                                   :{BLACK}Load
+STR_FACE_LOAD_TIP                                               :{BLACK}Load favorite face
+STR_FACE_LOAD_DONE                                              :{WHITE}Your favorite face has been loaded from the OpenTTD config file.
+STR_FACE_FACECODE                                               :{BLACK}Player face no.
+STR_FACE_FACECODE_TIP                                           :{BLACK}View and/or set player face number
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}View and/or set player face number
+STR_FACE_FACECODE_SET                                           :{WHITE}New face number code has been set.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Couldn't set player face number - must be numeric between 0 and 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Save
+STR_FACE_SAVE_TIP                                               :{BLACK}Save favorite face
+STR_FACE_SAVE_DONE                                              :{WHITE}This face will be saved as your favorite in the OpenTTD config file.
+STR_FACE_EUROPEAN                                               :{BLACK}European
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Select European faces
+STR_FACE_AFRICAN                                                :{BLACK}African
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Select African faces
+STR_FACE_YES                                                    :Yes
+STR_FACE_NO                                                     :No
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Enable mustache or earring
+STR_FACE_HAIR                                                   :Hair:
+STR_FACE_HAIR_TIP                                               :{BLACK}Change hair
+STR_FACE_EYEBROWS                                               :Eyebrows:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Change eyebrows
+STR_FACE_EYECOLOUR                                              :Eye color:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Change eyecolor
+STR_FACE_GLASSES                                                :Glasses:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Enable glasses
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Change glasses
+STR_FACE_NOSE                                                   :Nose:
+STR_FACE_NOSE_TIP                                               :{BLACK}Change nose
+STR_FACE_LIPS                                                   :Lips:
+STR_FACE_MOUSTACHE                                              :Mustache:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Change lips or mustache
+STR_FACE_CHIN                                                   :Chin:
+STR_FACE_CHIN_TIP                                               :{BLACK}Change chin
+STR_FACE_JACKET                                                 :Jacket:
+STR_FACE_JACKET_TIP                                             :{BLACK}Change jacket
+STR_FACE_COLLAR                                                 :Collar:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Change collar
+STR_FACE_TIE                                                    :Tie:
+STR_FACE_EARRING                                                :Earring:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Change tie or earring
+########
--- a/src/lang/brazilian_portuguese.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/brazilian_portuguese.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -596,6 +596,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informações da empresa
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Abrir / fechar industrias
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Alterações econômicas
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Mudanças na produção de indústrias providas pelo jogador
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Mudanças na produção de indústrias providas pelo(s) competidor(es)
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Outras mudanças de produção das indústrias
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Avisos / informações dos veículos do jogador
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Novos veículos
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Alterações de aceitação de carga
@@ -862,6 +865,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Financiar nova indústria
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...só pode ser construído em cidades
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...só pode ser construído em zonas florestais
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...só pode ser construído em áreas desérticas
@@ -1049,6 +1053,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Fila de automóveis (com efeitos de quantidade): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Deslocar janela quando o cursor está na borda do mapa: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Permitir o suborno da autoridade local: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Permtir compra de direitos exclusivos de transporte: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permitir o envio de dinheiro a outras companhias: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novo busca de caminho global (NPF, sobrepõe NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de peso para trens simulando trens pesados: {ORANGE}{STRING}
@@ -1189,6 +1195,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporção de cidades que irão crescer duas vezes mais rápido: {ORANGE}1 em {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporção de cidades que irão crescer duas vezes mais rápido: {ORANGE}Nenhum
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicador do tamanho inicial da cidade: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Remover elementos de estrada absurdos ao construir ruas
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construção
@@ -1665,7 +1672,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Construir rodovias
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Construção de Bonde
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construir trecho rodoviário
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Construir estradas usando o modo Autoestrada
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Construir linha de bonde
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Construir linha de bonde usando o modo Automático
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construir garagem (para construção e manutenção de automóveis)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Construir depósito de bonde (para construção e manutenção de bondes)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Construir estação de ônibus
@@ -1676,6 +1685,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Construir ponte de bonde
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Construir túnel rodoviário
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Construir túnel de bonde
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Ativar/Desativar vias de mão única
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Alternar construir/remover para contrução rodoviária
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Alternar construir/remover linhas de bonde e sinais
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Selecionar a orientação da garagem
@@ -1697,6 +1707,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 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}
@@ -2000,9 +2011,9 @@
 STR_482F_COST                                                   :{BLACK}Custo: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Impossível construir este tipo de indústria aqui...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...a floresta só pode ser plantada acima do nível de neve
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} anuncia o fechamento!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemas de abastecimento forçaram {INDUSTRY} a anunciar o fechamento!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Falta de árvores nas proximidades forçaram {INDUSTRY} a anunciar o fechamento!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} anuncia o fechamento!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemas de abastecimento forçaram {STRING} a anunciar o fechamento!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Falta de árvores nas proximidades forçaram {STRING} a anunciar o fechamento!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} aumenta a produção!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nova jazida de carvão encontrada em {INDUSTRY}!{}A expectativa é dobrar a produção!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Novas reservas de petróleo encontradas em {INDUSTRY}!{}A expectativa é dobrar a produção!
@@ -2021,6 +2032,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Extremidades da ponte não estão no mesmo nível
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Ponte é muito baixa para o terreno
 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}
@@ -2300,7 +2313,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Mover sede
 STR_COMPANY_PASSWORD                                            :{BLACK}Senha
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Usar senha na empresa para prevenir utilizadores não autorizados.
-STR_SET_COMPANY_PASSWORD                                        :Definir senha para empresa
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Definir senha para empresa
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Recesso Mundial!{}{}Economistas temem crise!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Fim do recesso!{}{}Melhoras no comércio inspiram confiança nas indústrias à medida que a economia se fortalece!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Alternar entre janela grande/pequena
@@ -2312,7 +2325,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Impossível comprar 25% das ações desta empresa...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Impossível vender 25% das ações desta empresa...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% propriedade de {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% propriedade de {COMPANY}{}   {COMMA}% propriedade de {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} foi comprada por {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Esta empresa ainda não troca ações...
 
@@ -2781,6 +2793,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Novo {STRING} agora disponível!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Impossível vender veículo destruído...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Impossível programar veículo...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Veículos só podem aguardar em estações
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Esse veículo não pára nesta estação
@@ -3069,7 +3083,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :parâmetro inválido para {STRING}: parâmetro {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} deve ser carregado antes de {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} deve ser carregado depois de {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} requer versão {STRING} ou maior do OpenTTD.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :o arquivo GRF foi designado para tradução
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Muitos NewGRFs foram carregados.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Adicionar
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Adiciona um NewGRF à lista
@@ -3278,6 +3294,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centralizar o minimapa na posição atual
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Pequeno
@@ -3384,3 +3401,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prosperir
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Construir
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Escolha a indústria apropriada
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avançado
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Seleção de face avançada.
+STR_FACE_SIMPLE                                                 :{BLACK}Simples
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Seleção de face simples.
+STR_FACE_LOAD                                                   :{BLACK}Carregar
+STR_FACE_LOAD_TIP                                               :{BLACK}Carregar face favorita
+STR_FACE_LOAD_DONE                                              :{WHITE}Sua face favorita foi carregada do arquivo de configuração do OpenTTD.
+STR_FACE_FACECODE                                               :{BLACK}Número da face do jogador.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Ver e/ou alterar número da face do jogador
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Ver e/ou alterar número da face do jogador
+STR_FACE_FACECODE_SET                                           :{WHITE}Novo código de número da face face foi alterado
+STR_FACE_FACECODE_ERR                                           :{WHITE}Não pode alterar o número de face do jogador  precisa ser um número entre 0 e 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Salvar
+STR_FACE_SAVE_TIP                                               :{BLACK}Salvar face favorita
+STR_FACE_SAVE_DONE                                              :{WHITE}Esta face irá ser salva como sua face favorita no arquivo de configuração do OpenTTD.
+STR_FACE_EUROPEAN                                               :{BLACK}Europeu
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Selecione faces européias
+STR_FACE_AFRICAN                                                :{BLACK}Africano
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Selecione faces africanas
+STR_FACE_YES                                                    :Sim
+STR_FACE_NO                                                     :Não
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Ativar bigode ou brinco
+STR_FACE_HAIR                                                   :Cabelo:
+STR_FACE_HAIR_TIP                                               :{BLACK}Alterar cabelo
+STR_FACE_EYEBROWS                                               :Sombrancelhas:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Alterar sombrancelhas
+STR_FACE_EYECOLOUR                                              :Cor do olho:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Alterar cor do olho
+STR_FACE_GLASSES                                                :Óculos:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Ativar óculos
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Alterar óculos
+STR_FACE_NOSE                                                   :Nariz:
+STR_FACE_NOSE_TIP                                               :{BLACK}Alterar nariz
+STR_FACE_LIPS                                                   :Boca:
+STR_FACE_MOUSTACHE                                              :Bigode:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Alterar boca ou bigode
+STR_FACE_CHIN                                                   :Queixo:
+STR_FACE_CHIN_TIP                                               :{BLACK}Alterar queixo
+STR_FACE_JACKET                                                 :Casaco:
+STR_FACE_JACKET_TIP                                             :{BLACK}Alterar casaco
+STR_FACE_COLLAR                                                 :Colarinho:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Alterar colarinho
+STR_FACE_TIE                                                    :Gravata:
+STR_FACE_EARRING                                                :Brinco:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Alterar gravata ou brinco
+########
--- a/src/lang/bulgarian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/bulgarian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -862,6 +862,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Инвестирай в нова индустрия
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...може да бъде построено само в градовете
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...може да бъде построено само около и в джунглите
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...може да бъде построено само около и в пустините
@@ -1047,6 +1048,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Опашка на колите (със сумарен ефект): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Преместване на прозореца когато мишката е в края: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Подкупване на местната власт: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Позволи купуване на изклучителни транспортни права: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Позволи изпращане на пари до други компаний: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Нестандартни станции: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Нов глобален навигатор (NPF, отменя NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Теглови множител към товарите за симулация на тежки влакове: {ORANGE}{STRING}
@@ -1105,6 +1108,9 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Изклучен
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Scrollwheel скорост на картата: {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}
@@ -1183,6 +1189,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Съразмерност на градове който ще пораснат двойно по-бързо: {ORANGE}1 в {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Съразмерност на градове който ще пораснат двойно по-бързо: {ORANGE}Нито един
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Множител за големината на града: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Премахни абсурдни пътни-елементи по пътниат строеж
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Интерфейс
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Строене
@@ -1390,6 +1397,7 @@
 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_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 "" s}
@@ -1626,8 +1634,11 @@
 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}Железопътната гара трябва да бъде премахната първо
 
@@ -1655,7 +1666,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Пътно строителство
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Конструкциа на трамвайна линиа
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Строене на път
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Построи отсечка от шосе използвайки Афто-шосе методът
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Построи секциа от трамвайна линиа
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Построи отсечка от железопътна линиа използвайки Афто-линиа методът
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Строене на гараж (за строене и сервиз на МПС-та)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Построи трамвайно депо (за стройтелни и сервизни коли)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Строене на автогара
@@ -1987,9 +2000,9 @@
 STR_482F_COST                                                   :{BLACK}Цена: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Този вид индустия не може да бъде построена тук...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...гора може да се засажда само над линията на снега
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} обяви незабавно закриване!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Проблеми с доставките предизвикаха незабавно закриване на {INDUSTRY}!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Липса на дървета предизвикаха незабавно закриване на {INDUSTRY}!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} обяви незабавно закриване!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Проблеми с доставките предизвикаха незабавно закриване на {STRING}!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Липса на дървета предизвикаха незабавно закриване на {STRING}!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} увеличава прозводството!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Нови залежи на въглища са намерени в {INDUSTRY}!{}Очаква се производството  да се удвои!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Нови залежи на Нефт са намерени в {INDUSTRY}!{}Очаква се производстото да се удвои!
@@ -2008,6 +2021,8 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Първо разрушете тунела
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Първо трябва да разрушите моста
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Не може да започва и да свърша на едно и също място
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Мостни начала не са на същото ниво
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Мостът е ту нисък за теренът
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Началото и краят трябва да са на една линия
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Мястото е неподходящо за вход на тунел
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2287,7 +2302,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Преместване ЦК
 STR_COMPANY_PASSWORD                                            :{BLACK}Парола
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Постави парола за да предпазиш компанията си от неоторизирани потребители.
-STR_SET_COMPANY_PASSWORD                                        :Поставяне парола на компанията
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Поставяне парола на компанията
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Световна икономическа криза!{}{}Финансовите експерти очакват най-лошото от сриващата се световна икономика!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Световната икономическа криза отмина!{}{}Възходът на търговията дава увереност на индустриите в новата засилваща се икономическа реалност!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Активирай голям/малък размер на прозореца
@@ -2299,7 +2314,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Не може да купиш 25% от акциите на тази компания...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Не може да продадеш 25% от акциите на тази компания...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% е притежание на {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% е притежание на {COMPANY}{}   {COMMA}% е притежание на {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} бе закупена от {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Тази компания все още не е достатъчно стара да предлага акции...
 
@@ -2629,6 +2643,7 @@
 STR_TIMETABLE_TRAVEL_FOR                                        :Патувай за {STRING}
 STR_TIMETABLE_STAY_FOR                                          :и остани за {STRING}
 STR_TIMETABLE_DAYS                                              :{COMMA} ден{P "" s}
+STR_TIMETABLE_TICKS                                             :{COMMA} щракане{P "" та}
 
 STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Отиващ към Влаковото депо на {TOWN}
 STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Отиващ към Влаковото депо на {TOWN}, {VELOCITY}
@@ -2767,6 +2782,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Нов {STRING} е на разположение! - {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Унищожено превозно средство не може да се продаде...
+
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Превозни средства могат да чакат само на гари.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Това превознот средство не спира на тази гара.
 STR_TIMETABLE_CHANGE_TIME                                       :{BLACK}Промени времето
@@ -2826,6 +2843,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Преименувай МПС-то
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Хората празнуват . . .{}Първи автобус пристигна на {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Хората празнуват . . .{}Първи камион пристигна на {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Гражданите празнуват . . .{}Първиат пътнически трамвай пристига на {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Гражданите празнуват . . .{}Първиат товарен трамвай пристига на {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Пътно-транспортно Произшествие!{}Шофьор загина на място при екплозия на МПС след сблъсък с влак
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Пътно-транспортно Произшествие!{}{COMMA} загинаха на място при екплозия на МПС след сблъсък с влак
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Не може да обърнеш МПС-то...
@@ -3051,6 +3070,7 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Невалиден параметър за {STRING}: параметър {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} трябва да бъде зареден преди {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} трябва да бъде зареден след {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} поискай OpenTTD версиа {STRING} или по-добра.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF файлат беше предназначен да преведе
 
 STR_NEWGRF_ADD                                                  :{BLACK}Добави
@@ -3366,3 +3386,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Перспектива
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Построи
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Избери правилната промишленост от следниат списък
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Hапреднат
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Напредната лице селекциа.
+STR_FACE_SIMPLE                                                 :{BLACK}Прост
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Проста лице селекциа.
+STR_FACE_LOAD                                                   :{BLACK}Зареди
+STR_FACE_LOAD_TIP                                               :{BLACK}Зареди любимо лице
+STR_FACE_LOAD_DONE                                              :{WHITE}Твоето любимо лице е заредено от OpenTTD config файлът.
+STR_FACE_FACECODE                                               :{BLACK}Номер на лице на играч.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Виж и/или избери номер на лицето на играчът
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Виж и/или избери номер на лицето на играчът
+STR_FACE_FACECODE_SET                                           :{WHITE}Нов номер на лицето е избран.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Нов номер на лицето неможе да бъде избран - трябва да бъде номер между 0 и 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Запази
+STR_FACE_SAVE_TIP                                               :{BLACK}Запази любимо лице
+STR_FACE_SAVE_DONE                                              :{WHITE}Това лице ще бъде запазено като твоето любимо в OpenTTD config файлът.
+STR_FACE_EUROPEAN                                               :{BLACK}Eвропеец
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Избери Европейски лица
+STR_FACE_AFRICAN                                                :{BLACK}Aфриканец
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Избери Африкански лица
+STR_FACE_YES                                                    :Дa
+STR_FACE_NO                                                     :He
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Позволи мустак или обица
+STR_FACE_HAIR                                                   :Kоса:
+STR_FACE_HAIR_TIP                                               :{BLACK}Cмени kocaтa
+STR_FACE_EYEBROWS                                               :Вежди:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Смени веждите
+STR_FACE_EYECOLOUR                                              :Цвят на очи:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Смени цветът на очите
+STR_FACE_GLASSES                                                :Oчила:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Позволи oчила
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Cмени очилатa
+STR_FACE_NOSE                                                   :Hoc:
+STR_FACE_NOSE_TIP                                               :{BLACK}Cмени носът
+STR_FACE_LIPS                                                   :Устни:
+STR_FACE_MOUSTACHE                                              :Mустак :
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Cмени устните или mустакът
+STR_FACE_CHIN                                                   :Брада:
+STR_FACE_CHIN_TIP                                               :{BLACK}Cмени брадатa
+STR_FACE_JACKET                                                 :Cако:
+STR_FACE_JACKET_TIP                                             :{BLACK}Cмени cakoтo
+STR_FACE_COLLAR                                                 :Яка:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Cмени якатa
+STR_FACE_TIE                                                    :Вратовръзкa:
+STR_FACE_EARRING                                                :Oбица:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Cмени вратовръзкатa или oбицатa
+########
--- a/src/lang/catalan.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/catalan.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -594,6 +594,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informació de l'Empresa
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Obrir / tancar d'indústries
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Canvis de l'Economia
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Canvis de producció en indústries proveïdes pel jugador
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Canvis de producció en indústries proveïdes pel competidor(s)
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Altres canvis de producció de l'indústria
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Avisos / informació dels teus vehicles
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nous vehicles
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Canvis en admisió de càrrega
@@ -860,6 +863,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Financia una nova indústria
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...només es pot construir en poblacions
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...només es pot construir en àrees de selva tropical
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...només es pot construir en àrees de desert
@@ -1047,6 +1051,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Cues d'automòbils (amb efectes quàntics): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Finestra d'avis quan el ratolí és al marc del programa: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Permet subornar a les autoritats locals: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Permet comprar els drets del transport en exclusiva: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permet enviar diners a altres companyies: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estacions no uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nova cerca de rutes global (NPF, anul·la NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de pes per contenidor per simular trens pesats: {ORANGE}{STRING}
@@ -1187,6 +1193,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporció de ciutats que creixeran el doble de ràpid: {ORANGE}1 de cada {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporció de ciutats que creixeran el doble de ràpid: {ORANGE}Cap
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicador de mida de ciutat inicial: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Treu els elements de carretera absurds durant la reconstrucció de carretera
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interficie
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construcció
@@ -1663,7 +1670,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Construcció de Carreteres
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Construcció de Tramvies
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construeix una secció de carretera
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Construeix secció de carretera utilitzant el mode Autocarretera
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Construeix una secció de via de tramvia
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Construeix secció de tramvia utilitzant el mode Autotramvia
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construeix una cotxera (per construir i mantenir vehicles)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Construeix cotxeres de tramvies (per construir i revisar tramvies)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Constueix una parada d'autobús
@@ -1674,6 +1683,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Construeix pont per tramvies
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Construeix un túnel per carretera
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Construeix túnel per tramvies
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Activa/Desactiva les carreteres d'un sentit
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Intercanvia funció construeix/treu per la construcció de carreteres
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Canvia construeix/treu de la construcció de vies de tramvia
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Selecciona la orientació de les Cotxeres
@@ -1695,6 +1705,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}L'edifici s'ha d'enderrocar primer
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Població: {ORANGE}{COMMA}{BLACK}  Cases: {ORANGE}{COMMA}
@@ -1996,9 +2007,9 @@
 STR_482F_COST                                                   :{BLACK}Cost: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Aquí no es pot construir aquest tipus d'indústria...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...els boscos només es poden plantar sota la cota de neu
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} anuncia el seu inminent tancament!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemes de subministrament fan que {INDUSTRY} anuncïi el seu inminent tancament!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}La falta d'arbres propers fan que {INDUSTRY} anuncïi el seu inminent tancament!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} anuncia el seu inminent tancament!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemes de subministrament fan que {STRING} anuncïi el seu inminent tancament!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}La falta d'arbres propers fan que {STRING} anuncïi el seu inminent tancament!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} incrementa la producció!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nova veta de carbó trobada a {INDUSTRY}!{}Es preveu doblar la producció!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Noves reserves de petroli trobades a {INDUSTRY}!{}Es preveu doblar la producció!
@@ -2017,6 +2028,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Les capçaleres del pont no són al mateix nivell
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}El pont és massa baix pel terreny
 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}
@@ -2296,7 +2309,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Trasllada la Seu
 STR_COMPANY_PASSWORD                                            :{BLACK}Contrasenya
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Protegeix la teva Empresa amb contrasenya per tal d'evitar que la utilitzin usuaris no autoritzats.
-STR_SET_COMPANY_PASSWORD                                        :Estableix la contrasenya de l'Empresa
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Estableix la contrasenya de l'Empresa
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Recessió Mundial!{}{}Economistes experts temen que l'economia es desplomi!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recessió Acabada!{}{}La millora als negocis dóna confiança a les indústries a la vegada que l'economia s'enforteix!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Intercanvia mida gran/petita de finestra
@@ -2308,7 +2321,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}No pots comprar el 25% de participació en aquesta empresa...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}No pots vendre el 25% de participació en aquesta empresa...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% propietat de {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% propietat de {COMPANY}{}   {COMMA}% propietat de {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} ha estat absorbida per {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Aquesta empresa ja no negocia participacions...
 
@@ -2777,6 +2789,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nou/Nova {STRING} disponible!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}No es pot vendre el vehicle destruït...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Impossible establir l'horari del vehicle...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Els vehicles només poden esperar a les estacions.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Aquest vehicle no para en aquesta estació.
@@ -3065,7 +3079,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Paràmetre invàlid per {STRING}: paràmetre {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} ha de ser carregat abans de {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} ha de ser carregat després de {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} necessita OpenTTD versió {STRING} o més modern.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :l'arxiu GRF dissenyat està pendent de traduir
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Hi ha massa arxius NewGRF carregats.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Afegeix
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Afegeix un arxiu NewGRF a la llista
@@ -3274,6 +3290,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centrar el mapa petit a la posició actual
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Petit
@@ -3380,3 +3397,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospecciona
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Construeix
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Escolleix el tipus d'indústria adequada d'aquesta llista
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avançat
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Selecció de cara avançada.
+STR_FACE_SIMPLE                                                 :{BLACK}Simple
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Selecció de cara simple.
+STR_FACE_LOAD                                                   :{BLACK}Carrega
+STR_FACE_LOAD_TIP                                               :{BLACK}Carrega la cara preferida
+STR_FACE_LOAD_DONE                                              :{WHITE}La teva cara preferida ha estat carregada des de l'arxiu de configuració d'OpenTTD.
+STR_FACE_FACECODE                                               :{BLACK}Cara jugador nu.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Veure i/o assigna la cara del jugador número
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Veure i/o assigna la cara del jugador número
+STR_FACE_FACECODE_SET                                           :{WHITE}El número de la nova cara ha estat assignat.
+STR_FACE_FACECODE_ERR                                           :{WHITE}No s'ha pogut assignar el número de cara del jugador - ha de ser un nombre entre 0 i 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Desa
+STR_FACE_SAVE_TIP                                               :{BLACK}Desa la cara preferida
+STR_FACE_SAVE_DONE                                              :{WHITE}Aquesta cara serà desada com a preferida a l'arxiu de configuració d'OpenTTD.
+STR_FACE_EUROPEAN                                               :{BLACK}Europea
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Selecciona cares europees
+STR_FACE_AFRICAN                                                :{BLACK}Africana
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Selecciona cares africanes
+STR_FACE_YES                                                    :Si
+STR_FACE_NO                                                     :No
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Activa el bigoti o les arracades
+STR_FACE_HAIR                                                   :Cabell:
+STR_FACE_HAIR_TIP                                               :{BLACK}Canvia el cabell
+STR_FACE_EYEBROWS                                               :Celles
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Canvia les celles
+STR_FACE_EYECOLOUR                                              :Color dels ulls:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Canvia el color del ulls:
+STR_FACE_GLASSES                                                :Ulleres:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Activa les ulleres
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Canvia les ulleres
+STR_FACE_NOSE                                                   :Nas:
+STR_FACE_NOSE_TIP                                               :{BLACK}Canvia el nas
+STR_FACE_LIPS                                                   :Llavis:
+STR_FACE_MOUSTACHE                                              :Bigoti:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Canvia els llavis o el bigoti
+STR_FACE_CHIN                                                   :Barbeta:
+STR_FACE_CHIN_TIP                                               :{BLACK}Canvia la barbeta
+STR_FACE_JACKET                                                 :Jaqueta:
+STR_FACE_JACKET_TIP                                             :{BLACK}Canvia la jaqueta
+STR_FACE_COLLAR                                                 :Coll:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Canvia el collaret
+STR_FACE_TIE                                                    :Corbata:
+STR_FACE_EARRING                                                :Arracades:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Canvia la corbata o les arracades
+########
--- a/src/lang/croatian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/croatian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -862,6 +862,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Financiraj novu industriju
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...može biti izgrađen samo u gradovima
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...može biti izgrađen samo u predjelima kišnih šuma
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...može biti izgrađen samo u pustinjskim područjima
@@ -1049,6 +1050,8 @@
 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_ALLOW_EXCLUSIVE                              :{LTBLUE}Dopusti kupovinu ekskluzivnih prijevoznih prava: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Dopusti slanje novca drugim tvrtkama: {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}
@@ -1189,6 +1192,7 @@
 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_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Ukloni apsurne cestovne elemente tijekom konstrukcije prometnica
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Sučelje
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Izgradnja
@@ -1665,7 +1669,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Izgradnja ceste
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Izgradnja tramvaja
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Izgradi dio ceste
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Izgradi cestu koristeći Autoroad način gradnje
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Izgradi tramvajski dio
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Izgradi tramvajsku prugu koristeći Autotram način gradnje
 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 spremište tramvajskih vozila (za izgradnju i servisiranje vozila)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Izgradi autobusnu stanicu
@@ -1998,9 +2004,9 @@
 STR_482F_COST                                                   :{BLACK}Trošak: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Ovdje nije moguće izgraditi ovu vrstu industrije...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...šume mogu jedino biti posađene iznad linije snijega
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} objavljuje skoro zatvaranje!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Zbog problema u nabavi {INDUSTRY} se uskoro zatvara!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Manjak drveća u glavni je razlog što se {INDUSTRY} se uskoro zatvara!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} objavljuje skoro zatvaranje!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Zbog problema u nabavi {STRING} se uskoro zatvara!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Manjak drveća u glavni je razlog što se {STRING} se uskoro zatvara!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} povećava proizvodnju!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}{INDUSTRY} očekuje udvostručenje proizvodnje!{}Pronađena je nova pukotina ugljena!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}{INDUSTRY} očekuje udvostručenje proizvodnje!{}Pronađene su nove rezerve nafte!
@@ -2019,6 +2025,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Glave mosta nisu na istoj razini
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Most je prenizak za teren
 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}
@@ -2298,7 +2306,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Premjesti sjedište kompanije
 STR_COMPANY_PASSWORD                                            :{BLACK}Zaporka
 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_SET_COMPANY_PASSWORD                                        :{BLACK}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
@@ -2310,7 +2318,6 @@
 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...
 
@@ -2779,6 +2786,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Novi {STRING} je sada dostupan! - {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Ne mogu prodati uništeno 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.
@@ -3067,7 +3076,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Nevažeći parametar za  {STRING}: parametar {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} se mora učitati prije {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} se mora učitati nakon {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} zahtijeva OpenTTD verziju {STRING} ili bolju.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF datoteka je dizajnirana za prijevod
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Previše je učitanih NewGRF-ova.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Dodaj
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Dodaj NewGRF datoteku u listu
@@ -3382,3 +3393,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospekt
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Izgradi
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Izaberi prikladnu industriju s ovog popisa
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Napredno
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Napredan odabir lica.
+STR_FACE_SIMPLE                                                 :{BLACK}Jednostavno
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Jednostavan odabir lica.
+STR_FACE_LOAD                                                   :{BLACK}Učitaj
+STR_FACE_LOAD_TIP                                               :{BLACK}Učitaj omiljeno lice
+STR_FACE_LOAD_DONE                                              :{WHITE}Tvoje omiljeno lice je učitano iz OpenTTD konfiguracijske datoteke.
+STR_FACE_FACECODE                                               :{BLACK}Broj igračevog lica
+STR_FACE_FACECODE_TIP                                           :{BLACK}Pogledaj i/ili postavi broj igračevog lica
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Pogledaj i/ili postavi broj igračevog lica
+STR_FACE_FACECODE_SET                                           :{WHITE}Novi kod za broj igračevog lica je postavljen.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Ne mogu postaviti broj igračevog lica - mora biti numerička vrijednost između 0 i 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Spremi
+STR_FACE_SAVE_TIP                                               :{BLACK}Izaberi omiljeno lice
+STR_FACE_SAVE_DONE                                              :{WHITE}Ovo lice bit će spremljeno kao tvoje omiljeno u OpenTTD konfiguracijsku datoteku.
+STR_FACE_EUROPEAN                                               :{BLACK}Europljanin
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Izaberi europska lica
+STR_FACE_AFRICAN                                                :{BLACK}Afrikanac
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Izaberi afrička lica
+STR_FACE_YES                                                    :Da
+STR_FACE_NO                                                     :Ne
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Uključi brkove ili naušnicu
+STR_FACE_HAIR                                                   :Kosa:
+STR_FACE_HAIR_TIP                                               :{BLACK}Promijeni kosu
+STR_FACE_EYEBROWS                                               :Obrve:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Promijeni obrve
+STR_FACE_EYECOLOUR                                              :Boja očiju:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Promijeni boju očiju
+STR_FACE_GLASSES                                                :Naočale:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Omogući naočale
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Promijeni naočale
+STR_FACE_NOSE                                                   :Nos:
+STR_FACE_NOSE_TIP                                               :{BLACK}Promijeni nos
+STR_FACE_LIPS                                                   :Usne:
+STR_FACE_MOUSTACHE                                              :Brkovi:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Promijeni usne ili brkove
+STR_FACE_CHIN                                                   :Brada:
+STR_FACE_CHIN_TIP                                               :{BLACK}Promijeni bradu
+STR_FACE_JACKET                                                 :Jakna
+STR_FACE_JACKET_TIP                                             :{BLACK}Promijeni jaknu
+STR_FACE_COLLAR                                                 :Kragna:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Promijeni kragnu
+STR_FACE_TIE                                                    :Kravata:
+STR_FACE_EARRING                                                :Naušnica:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Promijeni kravatu ili naušnicu
+########
--- a/src/lang/czech.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/czech.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -652,6 +652,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informace o společnosti
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Otevření / zavření továren
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Změny v ekonomice
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Změny produkce průmyslu obsluhovaného hráčem
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Změny produkce průmyslu obsluhovaného konkurencí
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Jiné změny produkce průmyslu
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Rady / informace o hráčových vozidlech
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nový dopravní prostředek
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Změny příjmu zboží
@@ -918,6 +921,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Investovat do průmyslu
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}... může být budováno jen ve městech
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}... může být budováno jen v pralesech
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}... může být budováno jen na pouštích
@@ -1105,6 +1109,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Silniční vozidla stojí fronty (s kvantovým efektem): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Posouvat okno, když je kurzor na okraji: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Povolit úplatek místní správě: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Umožnit kupování výhradních přepravních práv: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Umožnit zasílání peněz ostatním společnostem: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Nejednolité stanice: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nový globální algoritmus hledání cesty (NPF, nahradí NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Pro simulaci těžkých vlaků vynásobit hmotnost nákladu: {ORANGE}{STRING}x
@@ -1245,6 +1251,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Podíl měst, které budou růst dvakrát tak rychle: {ORANGE}1 z {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Podíl měst, které budou růst dvakrát tak rychle: {ORANGE}žádné
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Násobitel původní velikosti města: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Odstraňovat nesmyslné prvky vozovky při výstavbě silnic
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Ovládaní
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Výstavba
@@ -1389,7 +1396,7 @@
 
 TEMP_AI_IN_PROGRESS                                             :{WHITE}Představujeme ti novou umělou inteligenci (pracovní). Není ještě OK, takže s ní jsou problémy. Kdykoli můžeš, udělej screenshot a přispěj s ním do fóra. Ať se ti líbí!
 TEMP_AI_ACTIVATED                                               :{WHITE}Pozor: tato nová umělá inteligence je ještě v alfa verzi (= nebyla moc testována)! Zatím umí pracovat jen se silničními vozidly!
-TEMP_AI_MULTIPLAYER                                             :{WHITE}Varování: tato funkce je stále experimentální. Prosím posílejte jakékoli problémy na truelight@openttd.org.
+TEMP_AI_MULTIPLAYER                                             :{WHITE}Varování: tato funkce je stále experimentální (při použití nové umělé inteligence).
 
 ############ network gui strings
 
@@ -1721,7 +1728,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Výstavba silnic
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Výstavba tramvajové tratě
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Postavit silnici
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Postavit úsek silnice pomocí módu Autoroad
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Položit kus kolejí pro tramvaje
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Postavit úsek tramvajové tratě pomocí módu Autoroad
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Postavit garáž (pro nákup a servis vozidel)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Vystavět tramvajové depo (na kupování a servis tramvají)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Postavit autobusovou stanici
@@ -1732,6 +1741,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Postavit tramvajový most
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Postavit silniční tunel
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Postavit tramvajový tunel
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Povolit / zakázat jednosměrné silnice
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Přepnout stavba / odstranění silnice
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Přepínání mezi výstavbou a bouráním tramvajové tratě
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Výběr orientace garáže
@@ -1753,6 +1763,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Budova musí být nejprve zničena
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Populace: {ORANGE}{COMMA}{BLACK} Domů: {ORANGE}{COMMA}
@@ -2054,9 +2065,9 @@
 STR_482F_COST                                                   :{BLACK}Cena: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Tento druh průmyslu zde nemohu postavit...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}... lesy lze vysadit jen nad sněhovou čáru
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} ohlašuje okamžité uzavření!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Zásobovací problémy způsobily uzavření {INDUSTRY}!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Nedostatek stromů způsobil uzavření {INDUSTRY}!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} ohlašuje okamžité uzavření!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Zásobovací problémy způsobily uzavření {STRING}!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Nedostatek stromů způsobil uzavření {STRING}!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} zvyšuje produkci!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nové ložisko uhlí nalezené v {INDUSTRY}!{}Zdvojnásobí se produkce!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nové zásoby ropy nalezené v {INDUSTRY}!{}Zdvojnásobí se produkce!
@@ -2075,6 +2086,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Nájezdy na most nejsou ve stejné výšce
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Most je pro terén moc nízký
 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}
@@ -2354,7 +2367,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Přesídlit
 STR_COMPANY_PASSWORD                                            :{BLACK}Heslo
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Heslo - zabrání neautorizovaným uživatelům v připojení se k tvé společnosti.
-STR_SET_COMPANY_PASSWORD                                        :Nastav heslo společnosti.
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Nastav heslo společnosti.
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Celosvětový hospodářský úpadek!{}{}Finanční experti se kvůli prudkému poklesu ekonomiky obávají nejhoršího!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Konec hospodářského úpadku!{}{}Posílení trhu zvýšilo u průmyslu důvěru!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Přepnout velké/malé okno
@@ -2366,7 +2379,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Nemohu koupit podíl v této společnosti...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Nemohu prodat podíl v této společnosti...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% vlastněno {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% vlastněno {COMPANY}{}   {COMMA}% vlastněno {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} byla převzata {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Tato společnost zatím neobchoduje s akciemi...
 
@@ -2841,6 +2853,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nov{G á ý é} {STRING} k dispozici!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Nelze prodat zničené vozidlo...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Tomuto vozidlu nejde nastavit jízdní řád...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Vozidla mohou čekat jen ve stanicích.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Toto vozidlo v této stanici nestaví.
@@ -3129,7 +3143,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Neplatný parametr pro {STRING}: parametr {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} musí být nahráván před {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} musí být nahráván po {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} potřebuje verzi OpenTTD {STRING} nebo vyšší.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF soubor, který se měl přeložit
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Je nahráno příliš mnoho grafik.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Přidat
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Přidat NewGRF soubor do seznamu
@@ -3334,10 +3350,11 @@
 STR_FLAT_WORLD_HEIGHT_DOWN                                      :{BLACK}Snížit výšku ploché země o jednu úroveň
 STR_FLAT_WORLD_HEIGHT_UP                                        :{BLACK}Zvednout výšku ploché země o jednu úroveň
 STR_FLAT_WORLD_HEIGHT_QUERY_CAPT                                :{WHITE}Změnit výšku ploché země
-STR_FLAT_WORLD_HEIGHT                                           :{BLACK}Výška ploché zeme:
+STR_FLAT_WORLD_HEIGHT                                           :{BLACK}Výška ploché země:
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Vycentrovat malou mapu na tomto místě
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Malé
@@ -3444,3 +3461,54 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Hledat
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Postavit
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Vyber si vhodnou továrnu ze seznamu
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Podrobně
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Pokročilý výběr tváře.
+STR_FACE_SIMPLE                                                 :{BLACK}Jednodušše
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Základní výběr tváře.
+STR_FACE_LOAD                                                   :{BLACK}Nahrát
+STR_FACE_LOAD_TIP                                               :{BLACK}Nahrát oblíbený obličej
+STR_FACE_LOAD_DONE                                              :{WHITE}Tvůj oblíbený obličej se nahrál z konfiguračního souboru.
+STR_FACE_FACECODE                                               :{BLACK}Číslo tváře
+STR_FACE_FACECODE_TIP                                           :{BLACK}Zobrazit a/nebo nastavit číslo tváře
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Zobrazit a/nebo nastavit číslo tváře
+STR_FACE_FACECODE_SET                                           :{WHITE}Nové číslo obličeje bylo nastaveno.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Nešlo nastavit číslo tváře - musí jít o číslo mezi 0 a 4 294 967 295!
+STR_FACE_SAVE                                                   :{BLACK}Uložit
+STR_FACE_SAVE_TIP                                               :{BLACK}Uložit oblíbený obličej
+STR_FACE_SAVE_DONE                                              :{WHITE}Tato tvář bude uložena jako tvá oblíbená do konfiguračního souboru.
+STR_FACE_EUROPEAN                                               :{BLACK}Europoidní
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Vybrat europoidní tváře
+STR_FACE_AFRICAN                                                :{BLACK}Africká
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Vybrat africké tváře
+STR_FACE_YES                                                    :Ano
+STR_FACE_NO                                                     :Ne
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Povolit knír nebo náušnici
+STR_FACE_HAIR                                                   :Vlasy:
+STR_FACE_HAIR_TIP                                               :{BLACK}Změnit vlasy
+STR_FACE_EYEBROWS                                               :Obočí:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Změnit obočí
+STR_FACE_EYECOLOUR                                              :Barva očí:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Změnit barvu očí
+STR_FACE_GLASSES                                                :Brýle:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Povolit brýle
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Změnit brýle
+STR_FACE_NOSE                                                   :Nos:
+STR_FACE_NOSE_TIP                                               :{BLACK}Změnit nos
+STR_FACE_LIPS                                                   :Rty:
+STR_FACE_MOUSTACHE                                              :Knír:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Změnit rty nebo knír
+STR_FACE_CHIN                                                   :Brada:
+STR_FACE_CHIN_TIP                                               :{BLACK}Změnit bradu
+STR_FACE_JACKET                                                 :Sako:
+STR_FACE_JACKET_TIP                                             :{BLACK}Změnit sako
+STR_FACE_COLLAR                                                 :Límec:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Změnit límec
+STR_FACE_TIE                                                    :Kravata:
+STR_FACE_EARRING                                                :Náušnice:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Změnit kravatu nebo náušnice
+########
+
+############ signal GUI
+########
--- a/src/lang/danish.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/danish.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -594,6 +594,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Selskabsinformation
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Åbning / lukning af industrier
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Økonomiændringer
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Produktionsændringer for industrier forsynet af spilleren
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Produktionsændringer for industrier forsynet af deltager(e)
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Andre produktionsændringer for industri
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Rådgivning / information om spillerens køretøjer
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nye køretøjer
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Ændring i accepteret last
@@ -821,7 +824,7 @@
 STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Vælg måleenheder
 STR_02E6_ROAD_VEHICLES                                          :{BLACK}Vejkøretøjer
 STR_02E7                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Vælg den side af vejen, køretøjer skal køre i
+STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Vælg den side af vejen, køretøjer skal kører i
 STR_02E9_DRIVE_ON_LEFT                                          :Kør i venstre side
 STR_02EA_DRIVE_ON_RIGHT                                         :Kør i højre side
 STR_02EB_TOWN_NAMES                                             :{BLACK}Bynavne
@@ -860,6 +863,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Finansiér ny industri
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan kun bygges i byer
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...kan kun bygges i regnskovsområder
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...kan kun bygges i ørkenområder
@@ -1047,6 +1051,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Kødannelse af køretøjer (med kvanteeffekt): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Pannorer vindue når musen er ved kanten: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Tillad bestikkelse af de lokale myndigheder: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Tillad køb af eksklusive transportrettigheder: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Tillad at sende penge til andre firmaer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ikke uniforme stationer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ny global ruteplanlægger (NPF, tilsidesætter NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Vægtfaktor for fragt for at simulere tunge tog: {ORANGE}{STRING}
@@ -1187,6 +1193,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Andel af byer der vil vokse dobbelt så hurtigt: {ORANGE}1 af {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Andel af byer der vil vokse dobbelt så hurtigt: {ORANGE}Ingen
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Startværdi for bystørrelsesfaktor: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Fjern absurde vejelementer under opførelse af vej
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Brugerflade
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruktion
@@ -1323,7 +1330,7 @@
 
 STR_RAIL_REFIT_VEHICLE_TO_CARRY                                 :{BLACK}Ombyg toget til at køre med en anden lasttype
 STR_RAIL_REFIT_VEHICLE                                          :{BLACK}Ombyg toget
-STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Vælg den lasttype toget skal køre med
+STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Vælg den lasttype toget skal kører med
 STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED                             :{BLACK}Ombyg toget til at køre med den markerede lasttype
 STR_RAIL_CAN_T_REFIT_VEHICLE                                    :{WHITE}Kan ikke ombygge toget...
 STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Service intervaller er i procent: {ORANGE}{STRING}
@@ -1663,7 +1670,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Vejkonstruktion
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Sporvejskonstruktion
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Byg en sektion vej
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Byg vejsektion ved hjælp af 'Auto-vej'
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Byg sporvejssektion
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Byg sporvejssektion ved hjælp af 'Auto-sporvej'
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Byg værksted (til bygning og servicering af vejkøretøjer)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Byg sporvognsremise (til konstruktion og service af vogne)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Byg rutebilstation
@@ -1674,6 +1683,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Byg sporvejsbro
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Byg tunnel
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Byg sporvejstunnel
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Aktiver/Deaktiver ensrettede veje
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Skift mellem bygning/fjernelse af veje
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Skift mellem bygning/fjernelse af sporveje
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Vælg retning for værksted
@@ -1996,9 +2006,9 @@
 STR_482F_COST                                                   :{BLACK}Pris: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Kan ikke bygge denne industritype her...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...skov kan kun plantes over snelinjen
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} rapporterer om øjeblikkelig nedlukning!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Forsyningsproblemer får {INDUSTRY} til at lukke omgående!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Mangel på træer i nærheden får {INDUSTRY} til at lukke omgående!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} rapporterer om øjeblikkelig nedlukning!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Forsyningsproblemer får {STRING} til at lukke omgående!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Mangel på træer i nærheden får {STRING} til at lukke omgående!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} øger produktionen!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Ny kulåre fundet tæt på {INDUSTRY}!{}Produktionen forventes fordoblet!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nye oliereserver fundet tæt ved {INDUSTRY}!{}Produktionen forventes fordoblet!
@@ -2017,6 +2027,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Brohoveder er ikke i samme niveau
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Broen er for lav til terrænet
 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}
@@ -2296,7 +2308,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Flyt hovedkvarter
 STR_COMPANY_PASSWORD                                            :{BLACK}Kodeord
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Beskyt dit selskab med et kodeord for at undgå, at fremmede slutter sig til spillet.
-STR_SET_COMPANY_PASSWORD                                        :Sæt selskabets kodeord
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Sæt selskabets kodeord
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Lavkonjuktur over hele verden!{}{}Vismændende frygter det værste, økonomien skrumper!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Økonomisk krise overvundet!{}{}Stigning i forbrug giver industrien selvtilliden tilbage, produktionen øges!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Skift mellem stort/lille vindue
@@ -2308,7 +2320,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Kan ikke købe 25% aktier i dette selskab...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Kan ikke sælge 25% aktier i dette selskab...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% ejes af {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% ejes af {COMPANY}{}   {COMMA}% ejes af {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} er blevet overtaget af {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Dette selskab sælger ikke aktier endnu...
 
@@ -2771,12 +2782,14 @@
 STR_TRAIN_STOPPING_VEL                                          :{RED}Stopper, {VELOCITY}
 STR_INCOMPATIBLE_RAIL_TYPES                                     :Skinnetyperne passer ikke sammen
 STR_TRAIN_NO_POWER                                              :{RED}Ingen strøm
-STR_TRAIN_START_NO_CATENARY                                     :Toget kan ikke køre, fordi sporet ikke har køreledninger
+STR_TRAIN_START_NO_CATENARY                                     :Toget kan ikke kører, fordi sporet ikke har køreledninger
 
 STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Ny {STRING} er nu tilgængelig!
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Ny {STRING} er nu tilgængelig!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Kan ikke sælge ødelagt køretøj...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Kan ikke lave køreplan for transportmiddel...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Transportmidler kan kun vente ved stationer.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Dette transportmiddel stopper ikke ved denne station.
@@ -3065,7 +3078,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Ugyldig parameter for {STRING}: parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} skal indlæses før {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} skal indlæses efter {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} kræver OpenTTD version {STRING} eller højere.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF filen, som den er lavet til at oversætte,
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :For mange NewGRF sæt er indlæst.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Tilføj
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Tilføj et NewGRF sæt til listen
@@ -3274,6 +3289,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centrer det lille kort ved den nuværende position
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Lille
@@ -3380,3 +3396,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Efterforsk
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Byg
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Vælg passende industri fra denne liste
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avanceret
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Avanceret valg af ansigt.
+STR_FACE_SIMPLE                                                 :{BLACK}Simpel
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Simpelt valg af ansigt.
+STR_FACE_LOAD                                                   :{BLACK}Hent
+STR_FACE_LOAD_TIP                                               :{BLACK}Hent favoritansigt
+STR_FACE_LOAD_DONE                                              :{WHITE}Dit favoritansigt er hentet fra OpenTTD-konfigurationsfilen.
+STR_FACE_FACECODE                                               :{BLACK}Spiller ansigtsnr.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Vis og/eller indstil spillers ansigtsnummer
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Vis og/eller indstil spillers ansigtsnummer
+STR_FACE_FACECODE_SET                                           :{WHITE}Ny ansigtsnummer-kode er indstillet.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Kunne ikke indstille spillers ansigtsnummer - skal være et nummer mellem 0 og 4.294.967.295!
+STR_FACE_SAVE                                                   :{BLACK}Gem
+STR_FACE_SAVE_TIP                                               :{BLACK}Gem favoritansigt
+STR_FACE_SAVE_DONE                                              :{WHITE}Dette ansigt bliver gemt som din favorit i OpenTTD konfigurationsfilen.
+STR_FACE_EUROPEAN                                               :{BLACK}Europæisk
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Vælg europæiske ansigter
+STR_FACE_AFRICAN                                                :{BLACK}Afrikansk
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Vælg afrikanske ansigter
+STR_FACE_YES                                                    :Ja
+STR_FACE_NO                                                     :Nej
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Slå overskæg eller ørering til
+STR_FACE_HAIR                                                   :Hår:
+STR_FACE_HAIR_TIP                                               :{BLACK}Ændre hår
+STR_FACE_EYEBROWS                                               :Øjenbryn:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Ændre øjenbryn
+STR_FACE_EYECOLOUR                                              :Øjenfarve:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Ændre øjenfarve
+STR_FACE_GLASSES                                                :Briller:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Slå briller til
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Ændre briller
+STR_FACE_NOSE                                                   :Næse:
+STR_FACE_NOSE_TIP                                               :{BLACK}Ændre næse
+STR_FACE_LIPS                                                   :Læber:
+STR_FACE_MOUSTACHE                                              :Overskæg:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Ændre læber eller overskæg
+STR_FACE_CHIN                                                   :Hage:
+STR_FACE_CHIN_TIP                                               :{BLACK}Ændre hage
+STR_FACE_JACKET                                                 :Jakke:
+STR_FACE_JACKET_TIP                                             :{BLACK}Ændre jakke
+STR_FACE_COLLAR                                                 :Krave:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Ændre krave
+STR_FACE_TIE                                                    :Slips:
+STR_FACE_EARRING                                                :Ørering:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Ændre slips eller ørering
+########
--- a/src/lang/dutch.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/dutch.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -594,6 +594,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Bedrijfsinformatie
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Openen / sluiten van industrieën
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Veranderingen in de economie
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Productie veranderingen van industriën bezocht door speler
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Productie veranderingen van industriën bezocht door tegenstander(s)
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Andere productie aanpassingen van industriën
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Advies/informatie over voertuigen van de speler
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nieuwe voertuigen
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Verandering geaccepteerde goederen
@@ -860,6 +863,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Betaal nieuwe industrie
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan alleen in steden gebouwd worden
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...kan alleen in het regenwoud gebouwd worden
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...kan alleen in woestijngebieden gebouwd worden
@@ -1047,6 +1051,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Rijvorming bij wegvoertuigen (met bijwerkingen): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Verschuif scherm als muis aan de rand is: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Omkopen van de gemeente toestaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Kopen van exclusieve transportrechten toestaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Geld geven aan andere bedrijven toestaan: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Vrij gevormde stations: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nieuwe globale routeplanner (NPF, voorkeur over NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Gewichtsverhouding voor vracht om zware treinen te simuleren: {ORANGE}{STRING}
@@ -1187,6 +1193,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Verhouding van steden die twee keer zo snel groeien: {ORANGE}1 in {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Verhouding van steden die twee keer zo snel groeien: {ORANGE}Niet
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Stad groei indicator: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Verwijder  rare weg-elementen tijdens het herbouwen van de weg
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Constructie
@@ -1663,7 +1670,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Wegenbouw
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Tramrails constructie
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Bouw weg
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Bouw weg met de Autoweg-methode
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Bouw tramrails onderdeel
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Bouw tramrails met de Autotram-methode
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Bouw wegvoertuigdepot (om voertuigen te bouwen en te repareren)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Bouw tram voertuig depot (voor de bouw en onderhoud)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Bouw bushalte
@@ -1674,6 +1683,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Bouw tramrails brug
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Bouw wegtunnel
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Bouw tramrails tunnel
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Activeer/Deactiveer eenrichtingsverkeer
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Schakel tussen bouwen en verwijderen voor wegbouw
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Schakelaar tussen bouwen/verwijderen van tramrails
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Selecteer richting van wegvoertuigdepot
@@ -1695,6 +1705,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Gebouw moet eerst gesloopt worden
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Bevolking: {ORANGE}{COMMA}{BLACK}  Huizen: {ORANGE}{COMMA}
@@ -1996,9 +2007,9 @@
 STR_482F_COST                                                   :{BLACK}Kosten: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Kan dit type industrie hier niet bouwen...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...bossen kunnen alleen worden geplant boven de sneeuwgrens
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} kondigt dreigend faillissement aan!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Leveringsproblemen noodzaken {INDUSTRY} dreigend faillissement aan te kondigen!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Gebrek aan nabije bomen noodzaakt {INDUSTRY} dreigend faillissement aan te kondigen!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} kondigt dreigend faillissement aan!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Leveringsproblemen noodzaken {STRING} dreigend faillissement aan te kondigen!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Gebrek aan nabije bomen noodzaakt {STRING} dreigend faillissement aan te kondigen!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} verhoogt productie!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nieuwe kolenader gevonden bij {INDUSTRY}!{}Men verwacht productieverdubbeling!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nieuwe oliebronnen gevonden bij {INDUSTRY}!{}Men verwacht productieverdubbeling!
@@ -2017,6 +2028,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Begin van bruggen niet op hetzelfde niveau
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Brug is de laag voor dit terrein
 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}
@@ -2296,7 +2309,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Verplaats HQ
 STR_COMPANY_PASSWORD                                            :{BLACK}Wachtwoord
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Bescherm het bedrijf met een wachtwoord zodat niet geautoriseerde personen niet mee kunnen doen.
-STR_SET_COMPANY_PASSWORD                                        :Geef bedrijfswachtwoord op
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Geef bedrijfswachtwoord op
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Wereld Recessie!{}{}Financiële experts vrezen het ergste terwijl economie ineen stort!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recessie Voorbij!{}{}Stijgende handel geeft industrie vertrouwen terwijl economie verstevigt!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Schakel tussen groot/klein venster
@@ -2308,7 +2321,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Kan geen 25% aandeel in dit bedrijf kopen...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Kan geen 25% aandeel in dit bedrijf verkopen...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% eigendom van {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% eigendom van {COMPANY}{}   {COMMA}% eigendom van {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} is overgenomen door {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Dit bedrijf verhandelt nog geen aandelen...
 
@@ -2777,6 +2789,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nieuw {STRING} nu beschikbaar!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Kan verwoest voertuig niet verkopen...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Kan geen dienstregeling opzetten voor dit voertuig...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Voertuigen kunnen alleen wachten op stations.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Dit voertuig stopt niet op dit station
@@ -3065,7 +3079,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Ongeldige parameter voor {STRING}: parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} moet geladen zijn voor {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} moet geladen zijn na {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} heeft OpenTTD versie {STRING} of beter nodig.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :het GRF bestand is bedoelt voor het vertalen van
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Er zijn teveel NewGRFs geladen.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Toevoegen
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Voeg een NewGRF bestand toe aan te lijst
@@ -3274,6 +3290,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centreer de kleine kaart op huidige positie
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Klein
@@ -3380,3 +3397,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Onderzoek
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Bouw
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Kies de aangewezen industrie van de lijst
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Geavanceerd
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Geavanceerde gezichtskeuze
+STR_FACE_SIMPLE                                                 :{BLACK}Eenvoudig
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Eenvoudige gezichtskeuze.
+STR_FACE_LOAD                                                   :{BLACK}Laden
+STR_FACE_LOAD_TIP                                               :{BLACK}Laad favoriet gezicht
+STR_FACE_LOAD_DONE                                              :{WHITE}Je favoriete gezicfht op geladen van het OpenTTD configuratie bestand.
+STR_FACE_FACECODE                                               :{BLACK}Speler gezichtsnummer.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Bekijk en/of bewaar spelers gezichtsnummer
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Bekijken en/of bewaar gezichtnummer
+STR_FACE_FACECODE_SET                                           :{WHITE}Nieuw gezicht nummercode is opgeslagen.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Kon gezichtsnummer niet bewaren - het moet een nummer zijn tussen 0 en 4.294.967.295!
+STR_FACE_SAVE                                                   :{BLACK}Opslaan
+STR_FACE_SAVE_TIP                                               :{BLACK}Sla favoriet gezicht op
+STR_FACE_SAVE_DONE                                              :{WHITE}Dit gezicht wordt zal worden opgeslagen als jouw favoriet in het OpenTTD configuratie bestand.
+STR_FACE_EUROPEAN                                               :{BLACK}Europeaan
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Kies europeaan gezicht
+STR_FACE_AFRICAN                                                :{BLACK}Africaan
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Kies africaans gezicht
+STR_FACE_YES                                                    :Ja
+STR_FACE_NO                                                     :Nee
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Activeer snor of oorbel
+STR_FACE_HAIR                                                   :Haar:
+STR_FACE_HAIR_TIP                                               :{BLACK}Varander haar
+STR_FACE_EYEBROWS                                               :Wenkbrauwen:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Verander wenkbrauwen
+STR_FACE_EYECOLOUR                                              :Kleur ogen
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Verander kleur ogen
+STR_FACE_GLASSES                                                :Bril:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Brillen aan
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Verander bril
+STR_FACE_NOSE                                                   :Neus:
+STR_FACE_NOSE_TIP                                               :{BLACK}Verander neus
+STR_FACE_LIPS                                                   :Lippen:
+STR_FACE_MOUSTACHE                                              :Snor:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Verander lippen of snor
+STR_FACE_CHIN                                                   :Kin:
+STR_FACE_CHIN_TIP                                               :{BLACK}Verander kin
+STR_FACE_JACKET                                                 :Jas:
+STR_FACE_JACKET_TIP                                             :{BLACK}Verander jas
+STR_FACE_COLLAR                                                 :Kraag:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Verander kraag
+STR_FACE_TIE                                                    :Stropdas:
+STR_FACE_EARRING                                                :Oorbel:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Verander das of oorbel
+########
--- a/src/lang/english.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/english.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -594,6 +594,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Company information
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Open / close of industries
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Economy changes
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Production changes of industries served by the player
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Production changes of industries served by competitor(s)
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Other industry production changes
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Advice / information on player's vehicles
 STR_020C_NEW_VEHICLES                                           :{YELLOW}New vehicles
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Changes to cargo acceptance
@@ -860,6 +863,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Fund new industry
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...can only be built in towns
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...can only be built in rainforest areas
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...can only be built in desert areas
@@ -1165,6 +1169,7 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Allow buying shares from other companies
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}When dragging, place signals every: {ORANGE}{STRING1} tile(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatically build semaphores before: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI                            :{LTBLUE}Enable the signal GUI: {ORANGE}{STRING1}
 
 STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}The town layout "no more roads" isn't valid in the scenario editor
 STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Select town-road layout: {ORANGE}{STRING1}
@@ -1334,7 +1339,7 @@
 
 TEMP_AI_IN_PROGRESS                                             :{WHITE}Welcome to the new AI under development. If you encounter problems, take a screenshot and post it in the forum.
 TEMP_AI_ACTIVATED                                               :{WHITE}Warning: this new AI is still alpha! Currently, only trucks and busses work!
-TEMP_AI_MULTIPLAYER                                             :{WHITE}Warning: implementation is still experimental (using new AI). Please report any problems to truelight@openttd.org.
+TEMP_AI_MULTIPLAYER                                             :{WHITE}Warning: implementation is still experimental (using new AI).
 
 ############ network gui strings
 
@@ -1666,7 +1671,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Road construction
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Tramway construction
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Build road section
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Build road section using the Autoroad mode
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Build tramway section
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Build tramway section using the Autotram mode
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Build road vehicle depot (for building and servicing vehicles)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Build tram vehicle depot (for building and servicing vehicles)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Build bus station
@@ -1677,6 +1684,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Build tramway bridge
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Build road tunnel
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Build tramway tunnel
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Activate/Deactivate one way roads
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Toggle build/remove for road construction
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Toggle build/remove for tramway construction
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Select road vehicle depot orientation
@@ -1698,6 +1706,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Building must be demolished first
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Population: {ORANGE}{COMMA}{BLACK}  Houses: {ORANGE}{COMMA}
@@ -1999,9 +2008,9 @@
 STR_482F_COST                                                   :{BLACK}Cost: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Can't construct this industry type here...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...forest can only be planted above snow-line
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} announces imminent closure!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Supply problems cause {INDUSTRY} to announce imminent closure!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lack of nearby trees causes {INDUSTRY} to announce imminent closure!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING2} announces imminent closure!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Supply problems cause {STRING2} to announce imminent closure!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lack of nearby trees causes {STRING2} to announce imminent closure!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} increases production!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}New coal seam found at {INDUSTRY}!{}Production is expected to double!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}New oil reserves found at {INDUSTRY}!{}Production is expected to double!
@@ -2301,7 +2310,12 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Relocate HQ
 STR_COMPANY_PASSWORD                                            :{BLACK}Password
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Password-protect your company to prevent unauthorised users from joining.
-STR_SET_COMPANY_PASSWORD                                        :Set company password
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Set company password
+STR_COMPANY_PASSWORD_CANCEL                                     :{BLACK}Do not save the entered password
+STR_COMPANY_PASSWORD_OK                                         :{BLACK}Give the company the new password
+STR_COMPANY_PASSWORD_CAPTION                                    :{WHITE}Company password
+STR_MAKE_DEFAULT_COMPANY_PASSWORD                               :{BLACK}Default company password
+STR_MAKE_DEFAULT_COMPANY_PASSWORD_TIP                           :{BLACK}Use this company password as default for new companies
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}World Recession!{}{}Financial experts fear worst as economy slumps!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recession Over!{}{}Upturn in trade gives confidence to industries as economy strengthens!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Toggle large/small window size
@@ -2313,7 +2327,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Can't buy 25% share in this company...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Can't sell 25% share in this company...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% owned by {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% owned by {COMPANY}{}   {COMMA}% owned by {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} has been taken over by {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}This company is not old enough to trade shares yet...
 
@@ -2782,6 +2795,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}New {STRING} now available!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Can't sell destroyed vehicle...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Can't timetable vehicle...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Vehicles can only wait at stations.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}This vehicle is not stopping at this station.
@@ -3070,7 +3085,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Invalid parameter for {STRING}: parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} must be loaded before {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} must be loaded after {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} requires OpenTTD version {STRING} or better.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :the GRF file it was designed to translate
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Too many NewGRFs are loaded.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Add
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Add a NewGRF file to the list
@@ -3279,6 +3296,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Center the smallmap on the current position
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Small
@@ -3385,3 +3403,68 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospect
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Build
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Choose the appropriate industry from this list
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Advanced
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Advanced face selection.
+STR_FACE_SIMPLE                                                 :{BLACK}Simple
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Simple face selection.
+STR_FACE_LOAD                                                   :{BLACK}Load
+STR_FACE_LOAD_TIP                                               :{BLACK}Load favourite face
+STR_FACE_LOAD_DONE                                              :{WHITE}Your favourite face has been loaded from the OpenTTD config file.
+STR_FACE_FACECODE                                               :{BLACK}Player face no.
+STR_FACE_FACECODE_TIP                                           :{BLACK}View and/or set player face number
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}View and/or set player face number
+STR_FACE_FACECODE_SET                                           :{WHITE}New face number code has been set.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Couldn't set player face number - must be numeric between 0 and 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Save
+STR_FACE_SAVE_TIP                                               :{BLACK}Save favourite face
+STR_FACE_SAVE_DONE                                              :{WHITE}This face will be saved as your favourite in the OpenTTD config file.
+STR_FACE_EUROPEAN                                               :{BLACK}European
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Select european faces
+STR_FACE_AFRICAN                                                :{BLACK}African
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Select african faces
+STR_FACE_YES                                                    :Yes
+STR_FACE_NO                                                     :No
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Enable moustache or earring
+STR_FACE_HAIR                                                   :Hair:
+STR_FACE_HAIR_TIP                                               :{BLACK}Change hair
+STR_FACE_EYEBROWS                                               :Eyebrows:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Change eyebrows
+STR_FACE_EYECOLOUR                                              :Eye colour:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Change eyecolour
+STR_FACE_GLASSES                                                :Glasses:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Enable glasses
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Change glasses
+STR_FACE_NOSE                                                   :Nose:
+STR_FACE_NOSE_TIP                                               :{BLACK}Change nose
+STR_FACE_LIPS                                                   :Lips:
+STR_FACE_MOUSTACHE                                              :Moustache:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Change lips or moustache
+STR_FACE_CHIN                                                   :Chin:
+STR_FACE_CHIN_TIP                                               :{BLACK}Change chin
+STR_FACE_JACKET                                                 :Jacket:
+STR_FACE_JACKET_TIP                                             :{BLACK}Change jacket
+STR_FACE_COLLAR                                                 :Collar:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Change collar
+STR_FACE_TIE                                                    :Tie:
+STR_FACE_EARRING                                                :Earring:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Change tie or earring
+########
+
+############ signal GUI
+STR_SIGNAL_SELECTION                                            :{WHITE}Signal Selection
+STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE                           :{WHITE}Can't convert signals here...
+STR_BUILD_SIGNAL_SEMAPHORE_NORM_TIP                             :{BLACK}Standard Signal (semaphore){}Signals are necessary to keep trains from crashing on railway networks with more than one train.
+STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TIP                            :{BLACK}Entry-Signal (semaphore){}Green as long as there is one or more green exit-signal from the following section of track. Otherwise it shows red.
+STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TIP                             :{BLACK}Exit-Signal (semaphore){}Behaves in the same way as a normal signal but is necessary to trigger the correct colour on entry & combo pre-signals.
+STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TIP                            :{BLACK}Combo-Signal (semaphore){}The combo signal simply acts as both an entry and exit signal. This allows you to build large "trees" of presignals.
+STR_BUILD_SIGNAL_ELECTRIC_NORM_TIP                              :{BLACK}Standard Signal (electric){}Signals are necessary to keep trains from crashing on railway networks with more than one train.
+STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TIP                             :{BLACK}Entry-Signal (electric){}Green as long as there is one or more green exit-signal from the following section of track. Otherwise it shows red.
+STR_BUILD_SIGNAL_ELECTRIC_EXIT_TIP                              :{BLACK}Exit-Signal (electric){}Behaves in the same way as a normal signal but is necessary to trigger the correct colour on entry & combo pre-signals.
+STR_BUILD_SIGNAL_ELECTRIC_COMBO_TIP                             :{BLACK}Combo-Signal (electric){}The combo signal simply acts as both an entry and exit signal. This allows you to build large "trees" of presignals.
+STR_SIGNAL_CONVERT_TIP                                          :{BLACK}Signal Convert{}When selected, clicking an existing signal will convert it to the selected signal type and variant, CTRL-click will toggle the existing variant.
+STR_DRAG_SIGNALS_DENSITY_TIP                                    :{BLACK}Dragging signal density
+STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Decrease dragging signal density
+STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Increase dragging signal density
+########
--- a/src/lang/esperanto.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/esperanto.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1889,9 +1889,9 @@
 STR_482F_COST                                                   :{BLACK}Kosto: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Industritipo ne konstrueblas ĉi tie...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...arbaro nur planteblas super neĝa limlinio
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} anoncas tre baldaŭan fermiĝon!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Liverproblemoj devigas al {INDUSTRY} anonci tre baldaŭan fermiĝon!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Pro manko da proksimaj arboj {INDUSTRY} devas anonci tre baldaŭan fermiĝon!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} anoncas tre baldaŭan fermiĝon!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Liverproblemoj devigas al {STRING} anonci tre baldaŭan fermiĝon!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Pro manko da proksimaj arboj {STRING} devas anonci tre baldaŭan fermiĝon!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} pliigas produktadon!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nova karbo trovita ĉe {INDUSTRY}!{}Oni atendas produktan duobligon!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nova oleo trovita ĉe {INDUSTRY}!{}Oni atendas produktan duobligon!
@@ -2189,7 +2189,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Relokigu HQ
 STR_COMPANY_PASSWORD                                            :{BLACK}Pasvorto
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Pasvorte protektu vian kompanion por eviti ke eksteruloj aliĝu.
-STR_SET_COMPANY_PASSWORD                                        :Agordu kompanian pasvorton
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Agordu kompanian pasvorton
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Monda Recesio!{}{}Financaj spertuloj timas ke malpliboniĝas treege! Ekonomio malboniĝadas!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recesio finiĝis!{}{}Komerca pliboniĝos donas konfidon al industrioj! Ekonomio pliboniĝas!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Ŝaltu inter granda kaj malgranda fenestro
@@ -2201,7 +2201,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Ne povas aĉeti 25%-an dividaĵon...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Ne povas vendi 25%-an dividaĵon...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% posedataj de {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% posedataj de {COMPANY}{}   {COMMA}% posedataj de {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} estas transprenita de {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Ĉi tiu kompanio ne sufiĉe aĝas por jam komerci dividaĵojn...
 
--- a/src/lang/estonian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/estonian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -252,7 +252,7 @@
 STR_00AE                                                        :{WHITE}{DATE_SHORT}
 STR_00AF                                                        :{WHITE}{DATE_LONG}
 STR_00B0_MAP                                                    :{WHITE}Kaart - {STRING}
-STR_00B1_GAME_OPTIONS                                           :{WHITE}Mängu seaded
+STR_00B1_GAME_OPTIONS                                           :{WHITE}Mängu valikud
 STR_00B2_MESSAGE                                                :{YELLOW}Sõnum
 STR_00B3_MESSAGE_FROM                                           :{YELLOW}{STRING} teatab
 STR_POPUP_CAUTION_CAPTION                                       :{WHITE}Ettevaatust!
@@ -407,7 +407,7 @@
 STR_2048                                                        :2048
 STR_MAPSIZE                                                     :{BLACK}Kaardi suurus:
 STR_BY                                                          :{BLACK}*
-STR_0148_GAME_OPTIONS                                           :{BLACK}Mängu seaded
+STR_0148_GAME_OPTIONS                                           :{BLACK}Mängu valikud
 
 STR_0150_SOMEONE                                                :keegi{SKIP}{SKIP}
 STR_0151_MAP_OF_WORLD                                           :Maailmakaart
@@ -551,7 +551,7 @@
 STR_0184_BUILD_AIRPORTS                                         :{BLACK}Ehita lennuvälju
 STR_0185_PLANT_TREES_PLACE_SIGNS                                :{BLACK}Puude istutamine, siltide paigaldamine jne.
 STR_0186_LAND_BLOCK_INFORMATION                                 :{BLACK}Maa-ala andmed
-STR_0187_OPTIONS                                                :{BLACK}Seaded
+STR_0187_OPTIONS                                                :{BLACK}Valikud
 STR_0188                                                        :{BLACK}{SMALLUPARROW}
 STR_0189                                                        :{BLACK}{SMALLDOWNARROW}
 STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}Hooldusperioodi ei saa muuta...
@@ -685,8 +685,8 @@
 STR_0200_LAST_MESSAGE_NEWS_REPORT                               :Viimane teade
 STR_0201_MESSAGE_SETTINGS                                       :Teadete seadistused
 STR_MESSAGE_HISTORY_MENU                                        :Teadete ajalugu
-STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}Näita viimast teadet, kuva teadete seaded
-STR_0204_MESSAGE_OPTIONS                                        :{WHITE}Teadete seaded
+STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}Näita viimast teadet, kuva teadete valikud
+STR_0204_MESSAGE_OPTIONS                                        :{WHITE}Teadete valikud
 STR_0205_MESSAGE_TYPES                                          :{BLACK}Teate tüüp:
 STR_0206_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Mängija jaama saabus esimene veovahend
 STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Konkurendi jaama saabus esimene veovahend
@@ -873,10 +873,10 @@
 
 STR_CHECKMARK                                                   :{CHECKMARK}
 ############ range for menu starts
-STR_02C3_GAME_OPTIONS                                           :Mängu seaded
-STR_02C5_DIFFICULTY_SETTINGS                                    :Raskusastme seaded
-STR_02C7_CONFIG_PATCHES                                         :Paranduste seaded
-STR_NEWGRF_SETTINGS                                             :Newgrf seaded
+STR_02C3_GAME_OPTIONS                                           :Mängu valikud
+STR_02C5_DIFFICULTY_SETTINGS                                    :Raskusastme seadistused
+STR_02C7_CONFIG_PATCHES                                         :Seadista paikasid
+STR_NEWGRF_SETTINGS                                             :NewGRF seadistused
 STR_TRANSPARENCY_OPTIONS                                        :Läbipaistvuse valikud
 STR_GAMEOPTMENU_0A                                              :
 STR_02CA_TOWN_NAMES_DISPLAYED                                   :{SETX 12}Näidatavad linnanimed
@@ -940,8 +940,8 @@
 STR_02FE_CREATE_A_CUSTOMIZED_GAME                               :{BLACK}Loo oma mängukaart
 STR_02FF_SELECT_SINGLE_PLAYER_GAME                              :{BLACK}Vali üksikmäng
 STR_0300_SELECT_MULTIPLAYER_GAME                                :{BLACK}Vali 2-8 mängijaga mitmikmäng
-STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Näita mängu seadeid
-STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Vaata raskusastmete seadeid
+STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Kuva mängu valikuid
+STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Kuva raskusastmete valikuid
 STR_0303_START_A_NEW_GAME_USING                                 :{BLACK}Alusta omatehtud stsenaariumit kasutades uut mängu
 STR_0304_QUIT                                                   :{BLACK}Välju
 STR_0305_QUIT_OPENTTD                                           :{BLACK}Välju 'OpenTTD'st
@@ -960,6 +960,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Rahasta uue tööstuse ehitamist
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...saab ehitada ainult linnadesse
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...saab ehitada ainult vihmametsadesse
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...saab ehitada ainult kõrbesse
@@ -1033,18 +1034,18 @@
 
 STR_OPTIONS_LANG                                                :{BLACK}Keel
 STR_OPTIONS_LANG_CBO                                            :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_LANG_TIP                                            :{BLACK}Mängus kasutatava keele valik
+STR_OPTIONS_LANG_TIP                                            :{BLACK}Vali kasutajaliideses kasutatav keel
 
 STR_OPTIONS_FULLSCREEN                                          :{BLACK}Täisekraan
-STR_OPTIONS_FULLSCREEN_TIP                                      :{BLACK}Märgistades selle kasti, toimub mäng täisekraanis
+STR_OPTIONS_FULLSCREEN_TIP                                      :{BLACK}Märgi see kast, et OpenTTD täisekraanirežiimis mängida
 
-STR_OPTIONS_RES                                                 :{BLACK}Kuvari eraldusvõime
+STR_OPTIONS_RES                                                 :{BLACK}Ekraanilahutus
 STR_OPTIONS_RES_CBO                                             :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_RES_TIP                                             :{BLACK}Kuvari eraldusvõime valimine
+STR_OPTIONS_RES_TIP                                             :{BLACK}Ekraanilahutuse valimine
 
-STR_OPTIONS_SCREENSHOT_FORMAT                                   :{BLACK}Ekraanitõmmise formaat
+STR_OPTIONS_SCREENSHOT_FORMAT                                   :{BLACK}Ekraanipildi vorming
 STR_OPTIONS_SCREENSHOT_FORMAT_CBO                               :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_SCREENSHOT_FORMAT_TIP                               :{BLACK}Valik, millises formaadis salvestatakse ekraanitõmmis
+STR_OPTIONS_SCREENSHOT_FORMAT_TIP                               :{BLACK}Vali kasutatav ekraanipildi vorming
 
 STR_AUTOSAVE_1_MONTH                                            :Iga kuu
 STR_AUTOSAVE_FAILED                                             :{WHITE}Isesalvestus ebaõnnestus
@@ -1112,9 +1113,9 @@
 STR_AIRCRAFT_AUTORENEW_FAILED                                   :{WHITE}Õhusõiduki iseuuendamine ebaõnnestus{COMMA} (rahapiirang)
 STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT                            :{WHITE}Rong {COMMA} on peale asendust liiga pikk
 
-STR_CONFIG_PATCHES                                              :{BLACK}Paranduste seaded
-STR_CONFIG_PATCHES_TIP                                          :{BLACK}Paranduste seadistamine
-STR_CONFIG_PATCHES_CAPTION                                      :{WHITE}Paranduste seaded
+STR_CONFIG_PATCHES                                              :{BLACK}Seadista paikasid
+STR_CONFIG_PATCHES_TIP                                          :{BLACK}Seadista paikasid
+STR_CONFIG_PATCHES_CAPTION                                      :{WHITE}Seadista paikasid
 
 STR_CONFIG_PATCHES_OFF                                          :Väljas
 STR_CONFIG_PATCHES_ON                                           :Sees
@@ -1147,6 +1148,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Mootorsõidukite järjekorrad (koos mahueffektidega): {ORANGE}{STRING}
 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_ALLOW_EXCLUSIVE                              :{LTBLUE}Luba eksklusiivseid veoõiguseid osta: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Luba teistele ettevõtetele raha saata: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Luba suvalise kujuga jaamad: {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}
@@ -1188,7 +1191,7 @@
 STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE                 :Päevapidi
 STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT                         :{LTBLUE}Kõrguse level kui kõrgele lapik kaart läheb: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}Suurim jaama ala: {ORANGE}{STRING} {RED}Hoiatus: kõrged seaded aeglustavad mängu
+STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}Suurim jaama ala: {ORANGE}{STRING} {RED}Hoiatus: kõrged seadistused aeglustavad mängu
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Hoolda maandumisplatsidel ise helikoptereid: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Liida maastikuriba raudtee/tee/vee/lennujaamade tööriistaribaga: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Kui kerid hiirega, liiguta vaade vastassuunda: {ORANGE}{STRING}
@@ -1287,6 +1290,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Topeltkiirusel kasvavaid linnu: {ORANGE}1 iga {STRING} linna kohta
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Topeltkiirusel kasvavaid linnu: {ORANGE}puudub
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Algne linna suuruse kordaja: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Eemalda teedeehituse ajal esinevad tarbetud elemendid
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Välimus
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Ehitamine
@@ -1763,7 +1767,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Tee-ehitus
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Trammitee ehitamine
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Ehita sõidutee blokk
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Ehita autotee osa kasutades Autoroad režiimi
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Ehita trammitee blokk
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Ehita trammitee osa kasutades Autotram režiimi
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Depoo ehitamine (veovahendite ehitamiseks ja hooldamiseks)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Ehita trammidepoo (veeremi ehitamiseks ja hoolduseks)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Ehita bussijaam
@@ -2096,9 +2102,9 @@
 STR_482F_COST                                                   :{BLACK}Hind: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Seda tüüpi tööstust ei saa siia ehitada...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...metsa saab istutada ainult lumepiirist kõrgemale
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} juhtkond teatab sulgemisest!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{INDUSTRY} teatab sulgemisest varustusprobleemide tõttu!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lähiümbruse puude puudumine põhjustab {INDUSTRY} sulgemise!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} juhtkond teatab sulgemisest!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{STRING} teatab sulgemisest varustusprobleemide tõttu!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lähiümbruse puude puudumine põhjustab {STRING} sulgemise!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} kasvab toodang!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}{INDUSTRY} lähedal avati uus kivisöe kiht!{}Toodang kahekordistub!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}{INDUSTRY} lähedal avastati uusi naftareserve!{}Toodang kahekordistub!
@@ -2117,6 +2123,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Sillaotsad pole samal kõrgusel
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Sild on maastiku suhtes liiga madal
 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}
@@ -2396,7 +2404,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Liiguta peakorterit
 STR_COMPANY_PASSWORD                                            :{BLACK}Salasõna
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Ettevõtte kaitsmine salasõnaga, et võõrad ei saaks ilma loata ühineda.
-STR_SET_COMPANY_PASSWORD                                        :Vali ettevõttele salasõna
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Vali ettevõttele salasõna
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Majanduslik tagasilöök!{}{}Finantseksperdid ennustavad suurt majanduslangust!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Madalseis on läbi!{}{}Suurem kauplemine julgustab majanduse tugevnemisega ettevõtteid!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Lülita aken suureks/väikseks
@@ -2408,7 +2416,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Selle ettevõtte aktsiatest ei saa 25% osta...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Selle ettevõtte aktsiatest ei saa 25% müüa...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% on ettevõtte {COMPANY} käes)
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% on ettevõtte {COMPANY} käes{}   {COMMA}% on ettevõtte {COMPANY} käes)
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} võeti üle ettevõtte {COMPANY} poolt!
 STR_7080_PROTECTED                                              :{WHITE}See ettevõtte pole veel piisavalt vana, et aktsiaid vahetada...
 
@@ -2877,6 +2884,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Uus {STRING} saadaval!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Hävinenud sõidukit ei saa müüa...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Sõidukile ei saa sõiduplaani anda...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Sõidukid saavad ainult peatustes oodata.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Sellel sõidukil pole ühtegi peatust.
@@ -3144,9 +3153,9 @@
 STR_PERFORMANCE_DETAIL_LOAN_TIP                                 :{BLACK}Selle ettevõtte kogulaen
 STR_PERFORMANCE_DETAIL_TOTAL_TIP                                :{BLACK}Kokku punkte võimalikest punktidest
 
-STR_NEWGRF_SETTINGS_BUTTON                                      :{BLACK}NewGRF seaded
+STR_NEWGRF_SETTINGS_BUTTON                                      :{BLACK}NewGRF seadistused
 STR_NEWGRF_SETTINGS_CAPTION                                     :{WHITE}Uue graafika sätted
-STR_NEWGRF_APPLY_CHANGES                                        :{BLACK}Kinnita sätted
+STR_NEWGRF_APPLY_CHANGES                                        :{BLACK}Rakenda muudatused
 STR_NEWGRF_SET_PARAMETERS                                       :{BLACK}Vali parameetrid
 STR_NEWGRF_TIP                                                  :{BLACK}Nimekiri kõikidest uue graafika sätted mida oled installeerinud. Vajuta komplektile et vahetada sätteid
 STR_NEWGRF_NO_FILES_INSTALLED                                   :{BLACK}Sa ei ole installeerinud ühtegi uue graafika komplekti! Vaata õpetust et vaadata juhendit uue graafika installeerimisek
@@ -3165,7 +3174,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :vigane parameeter {STRING} jaoks: parameeter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} peab olema laetud enne {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} peab olema laetud pärast{STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} nõuab OpenTTD versiooni {STRING} või uuemat.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF fail, mis tehti tõlkimiseks,
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Liiga palju NewGRF-e on laaditud.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Lisa
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Lisa nimekirja NewGRF fail
@@ -3480,3 +3491,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Uuri
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Ehita
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Vali siit nimistust sobiv tööstus
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Täpsem
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Täpsem näovalik
+STR_FACE_SIMPLE                                                 :{BLACK}Lihtne
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Lihtne näo valik.
+STR_FACE_LOAD                                                   :{BLACK}Lae
+STR_FACE_LOAD_TIP                                               :{BLACK}Lae lemmik nägu
+STR_FACE_LOAD_DONE                                              :{WHITE}Sinu lemmik nägu on laetud OpenTTD konfiguratsiooni failist.
+STR_FACE_FACECODE                                               :{BLACK}Mängja nägu no.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Vaata või säti näonumbrit
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Vaata või säti näonumbrit
+STR_FACE_FACECODE_SET                                           :{WHITE}Uus näonumbri kood on sätitud.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Ei saanud näonumbrit sättida - peab olema number 0 ja 4,494,967,295 vahel!
+STR_FACE_SAVE                                                   :{BLACK}Salvesta
+STR_FACE_SAVE_TIP                                               :{BLACK}Salvesta lemmiknägu
+STR_FACE_SAVE_DONE                                              :{WHITE}See nägu salvestatakse sinu lemmikuna OpenTTD seadete faili.
+STR_FACE_EUROPEAN                                               :{BLACK}Eurooplane
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Vali euroopa näod
+STR_FACE_AFRICAN                                                :{BLACK}Aafriklane
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Vali aafrika näod
+STR_FACE_YES                                                    :Jah
+STR_FACE_NO                                                     :Ei
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Vuntsid või kõrvarõngad on lubatud
+STR_FACE_HAIR                                                   :Juuksed:
+STR_FACE_HAIR_TIP                                               :{BLACK}Vaheta juukseid
+STR_FACE_EYEBROWS                                               :Kulmud:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Vaheta kulmusid
+STR_FACE_EYECOLOUR                                              :Silmavärv:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Vaheta silmavärvi:
+STR_FACE_GLASSES                                                :Prillid:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Prillid on lubatud
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Vaheta prille
+STR_FACE_NOSE                                                   :Nina:
+STR_FACE_NOSE_TIP                                               :{BLACK}Vaheta nina
+STR_FACE_LIPS                                                   :Huuled:
+STR_FACE_MOUSTACHE                                              :Vuntsid:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Vaheta huuli või vuntse
+STR_FACE_CHIN                                                   :Lõug:
+STR_FACE_CHIN_TIP                                               :{BLACK}Vaheta lõuga
+STR_FACE_JACKET                                                 :Pintsak:
+STR_FACE_JACKET_TIP                                             :{BLACK}Vaheta pintsakut
+STR_FACE_COLLAR                                                 :Krae:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Vaheta kraed
+STR_FACE_TIE                                                    :Lips:
+STR_FACE_EARRING                                                :Kõrvarõngas:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Vaheta kraed või kõrvarõngast
+########
--- a/src/lang/finnish.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/finnish.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1995,9 +1995,9 @@
 STR_482F_COST                                                   :{BLACK}Kustannus: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Teollisuustyyppiä ei voi rakentaa tähän...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...metsää voi istuttaa vain lumirajan yläpuolelle.
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY}: sulkeminen uhkaavan lähellä!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{INDUSTRY}: toimitusongelmista johtuen sulkeminen uhkaavan lähellä!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}{INDUSTRY}: puiden puutteesta johtuen sulkeminen uhkaavan lähellä!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING}: sulkeminen uhkaavan lähellä!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{STRING}: toimitusongelmista johtuen sulkeminen uhkaavan lähellä!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}{STRING}: puiden puutteesta johtuen sulkeminen uhkaavan lähellä!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY}: tuotantoa lisätään!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}{INDUSTRY}: uusi hiilijuonne löytynyt!{}Tuotannon odotetaan kaksinkertaistuvan!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}{INDUSTRY}: uusia öljyvaroja löydetty!{}Tuotannon odotetaan kaksinkertaistuvan!
@@ -2295,7 +2295,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Sijoita päämaja
 STR_COMPANY_PASSWORD                                            :{BLACK}Salasana
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Salasanalla voit suojata yhtiösi, jotta kukaan vieras ei pääse liittymään.
-STR_SET_COMPANY_PASSWORD                                        :Aseta yhtiön salasana
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Aseta yhtiön salasana
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Maailmanlaajuinen laskukausi!{}{}Rahoitusasiantuntijat pelkäävät pahinta talouden laskiessa!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Laskukausi ohi!{}{}Kaupankäynnin käänne parempaan lisää luottamusta teollisuuteen talouden vahvistuessa!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Suuri/pieni ikkunan koko
@@ -2307,7 +2307,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Tästä yhtiöstä ei voi ostaa 25{NBSP}%:n osuutta...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Tästä yhtiöstä ei voi myydä 25{NBSP}%:n osuutta...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}{NBSP}%:n omistus: {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}{NBSP}%:n omistus: {COMPANY}{}   {COMMA}{NBSP}%:n omistus {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}Yhtiön {COMPANY} on ottanut haltuun {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Tällä yhtiöllä ei ole vielä osakkeita...
 
@@ -2610,7 +2609,7 @@
 
 ##id 0x8800
 STR_8800_TRAIN_DEPOT                                            :{WHITE}{TOWN}: veturitalli
-STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Kaupungilaiset juhlivat . . .{}Ensimmäinen juna saapuu asemalle ({STATION})!
+STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Kaupunkilaiset juhlivat . . .{}Ensimmäinen juna saapuu asemalle ({STATION})!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (yksityiskohdat)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Juna on tiellä.
 STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
--- a/src/lang/french.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/french.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -108,7 +108,7 @@
 STR_QUANTITY_RUBBER                                             :{VOLUME} de caoutchouc
 STR_QUANTITY_SUGAR                                              :{WEIGHT} de sucre
 STR_QUANTITY_TOYS                                               :{COMMA} jouet{P "" s}
-STR_QUANTITY_SWEETS                                             :{COMMA} sac{P "" s} de jouets
+STR_QUANTITY_SWEETS                                             :{COMMA} sac{P "" s} de bonbons
 STR_QUANTITY_COLA                                               :{VOLUME} de cola
 STR_QUANTITY_CANDYFLOSS                                         :{WEIGHT} de barbe à papa
 STR_QUANTITY_BUBBLES                                            :{COMMA} bulle{P "" s}
@@ -595,6 +595,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informations corporatives
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Ouvertures/fermetures d'industries
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Changements économiques
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Changements de production des industries desservies par vous
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Changements de production des industries desservies par les autres
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Changement de production des industries non desservies
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Conseils / information sur les véhicules du joueur
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nouveaux véhicules
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Changements d'acceptation de marchandises
@@ -708,7 +711,7 @@
 STR_0278_CONSTRUCT_DIAMOND_MINE                                 :{BLACK}Construire une mine de diamants
 STR_0279_CONSTRUCT_COPPER_ORE_MINE                              :{BLACK}Construire une mine de cuivre
 STR_027A_PLANT_COTTON_CANDY_FOREST                              :{BLACK}Semer une Forêt de Barbe à Papa
-STR_027B_CONSTRUCT_CANDY_FACTORY                                :{BLACK}Construire une usine de sucreries
+STR_027B_CONSTRUCT_CANDY_FACTORY                                :{BLACK}Construire une usine de bonbons
 STR_027C_CONSTRUCT_BATTERY_FARM                                 :{BLACK}Construire une ferme de batteries
 STR_027D_CONSTRUCT_COLA_WELLS                                   :{BLACK}Construire un puit de cola
 STR_027E_CONSTRUCT_TOY_SHOP                                     :{BLACK}Construire une boutique de jouets
@@ -861,6 +864,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Financer une nouvelle industrie
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...peut seulement être construit en ville
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...peut seulement être construit en forêt tropicale
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...peut seulement être construit dans les endroits désertiques
@@ -1048,6 +1052,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Mise en file Véhicules Routiers (+ effets quantiques): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Défiler la vue horizontalement avec le pointeur: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Permettre la corruption de la municipalité: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Autoriser l'achat des droits de transports exclusifs: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Autoriser l'envoi d'argent aux autres compagnies: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Gares non uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nouvelle recherche de chemin global (NPF, écrase NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplier le poid pour les trains fret (simule des trains lourds): {ORANGE}{STRING}
@@ -1164,6 +1170,7 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permettre d'acheter des actions d'autres compagnies
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Espacements des signaux en mode drag & drop : {ORANGE}{STRING} case(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Construire automatiquement des sémaphores avant: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI                            :{LTBLUE}Activer le GUI des signaux: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Le schéma de ville "pas de routes" n'est pas autorisé dans l'éditeur de scénario
 STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Choisir un schéma de ville: {ORANGE}{STRING}
@@ -1188,6 +1195,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proportion des villes qui deviendront des métropoles: {ORANGE}1 sur {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proportion des villes qui deviendront des métropoles: {ORANGE}Aucune
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicateur de taille de ville initial: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Retirer les éléments absurdes pendant la reconstruction des routes
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construction
@@ -1332,7 +1340,7 @@
 
 TEMP_AI_IN_PROGRESS                                             :{WHITE}Bienvenue dans la nouvelle IA en élaboration. Si vous rencontrez des problèmes, postez-les sur le forum. Bonne partie!
 TEMP_AI_ACTIVATED                                               :{WHITE}Attention: cette nouvelle IA est en version alpha ! Pour le moment seuls les camions et les bus fonctionnent !
-TEMP_AI_MULTIPLAYER                                             :{WHITE}Attention: cette fonction est encore expérimentale. Veuillez reporter tout problème à truelight@openttd.org.
+TEMP_AI_MULTIPLAYER                                             :{WHITE}Attention: cette fonction est encore expérimentale.
 
 ############ network gui strings
 
@@ -1664,7 +1672,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Construction routière
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Construction de tramway
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construire une section de route
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Construire une route avec le mode Auto-route
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Construire une section de tramway
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Construire une section de tramway avec le mode Auto-tram
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construire un dépôt routier (pour construire et entretenir les véhicules routiers)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Construire un dépôt de tramway (pour la construction et l'entretien des véhicules)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Construire un arrêt d'autobus
@@ -1675,6 +1685,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Construire un pont
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Construire un tunnel routier
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Construire un tunnel
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Activer/Désactiver les routes à sens unique
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Basculer construire/détruire routes
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Basculer construire/retirer pour tramways
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Choisir orientation du dépôt routier
@@ -1696,6 +1707,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}L'édifice doit d'abord être démolit
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Population: {ORANGE}{COMMA}{BLACK}  Maisons: {ORANGE}{COMMA}
@@ -1997,9 +2009,9 @@
 STR_482F_COST                                                   :{BLACK}Prix: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Impossible de construire cette industrie ici...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...les forêts ne peuvent pas être plantées sur de la neige
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} annonce une fermeture imminente!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Des problèmes d'approvisionnement obligent {INDUSTRY} à fermer bientôt!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Le manque d'arbres proches oblige {INDUSTRY} à fermer bientôt!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} annonce une fermeture imminente!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Des problèmes d'approvisionnement obligent {STRING} à fermer bientôt!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Le manque d'arbres proches oblige {STRING} à fermer bientôt!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} augmente la production!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nouveau filon de charbon trouvé à {INDUSTRY}!{}La production devrait doubler!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nouveaux gisements pétrolifères découverts à {INDUSTRY}!{}La production devrait doubler!
@@ -2018,6 +2030,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Les extrémités du pont ne sont pas au même niveau
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Le pont est trop bas pour le terrain
 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}
@@ -2297,7 +2311,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Déménager le QG
 STR_COMPANY_PASSWORD                                            :{BLACK}Mot de passe
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Permet de protéger par mot de passe votre compagnie pour empêcher des utilisateurs non-autorisés de rejoindre. Utilisez '*' pour vider le mot de passe.
-STR_SET_COMPANY_PASSWORD                                        :Choisir le mot de passe de la compagnie
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Choisir le mot de passe de la compagnie
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Récession mondiale!{}{}Les experts financiers craignent le pire!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Fin de la récession!{}{}La reprise redonne confiance aux industries!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Bascule entre une grande/petite fenêtre
@@ -2309,7 +2323,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Impossible d'acheter des parts...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Impossible de vendre des parts...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% détenus par {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% détenus par {COMPANY}{}   {COMMA}% détenus par {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} a été rachetée par {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Cette compagnie ne vend pas d'actions pour le moment...
 
@@ -2394,7 +2407,7 @@
 STR_802E_TOFFEE_HOPPER                                          :Wagon à caramel
 STR_802F_BUBBLE_VAN                                             :Wagon à bulles
 STR_8030_COLA_TANKER                                            :Wagon-citerne de cola
-STR_8031_CANDY_VAN                                              :Wagon à sucreries
+STR_8031_CANDY_VAN                                              :Wagon à bonbons
 STR_8032_TOY_VAN                                                :Wagon à jouets
 STR_8033_BATTERY_TRUCK                                          :Wagon à batteries
 STR_8034_FIZZY_DRINK_TRUCK                                      :Wagon à boisson gazeuses
@@ -2424,7 +2437,7 @@
 STR_804C_TOFFEE_HOPPER                                          :Wagon à caramel
 STR_804D_BUBBLE_VAN                                             :Wagon à bulles
 STR_804E_COLA_TANKER                                            :Wagon-citerne de cola
-STR_804F_CANDY_VAN                                              :Wagon à sucreries
+STR_804F_CANDY_VAN                                              :Wagon à bonbons
 STR_8050_TOY_VAN                                                :Wagon à jouets
 STR_8051_BATTERY_TRUCK                                          :Wagon à batteries
 STR_8052_FIZZY_DRINK_TRUCK                                      :Wagon à boisson gazeuses
@@ -2456,7 +2469,7 @@
 STR_806C_TOFFEE_HOPPER                                          :Wagon à caramel
 STR_806D_BUBBLE_VAN                                             :Wagon à bulles
 STR_806E_COLA_TANKER                                            :Wagon-citerne de cola
-STR_806F_CANDY_VAN                                              :Wagon à sucreries
+STR_806F_CANDY_VAN                                              :Wagon à bonbons
 STR_8070_TOY_VAN                                                :Wagon à jouets
 STR_8071_BATTERY_TRUCK                                          :Wagon à batteries
 STR_8072_FIZZY_DRINK_TRUCK                                      :Wagon à boisson gazeuses
@@ -2530,13 +2543,13 @@
 STR_80B6_WIZZOWOW_COTTON_CANDY_TRUCK                            :Camion de barbe à papa Wizzowow
 STR_80B7_MIGHTYMOVER_TOFFEE_TRUCK                               :Camion de caramel MightyMover
 STR_80B8_POWERNAUGHT_TOFFEE_TRUCK                               :Camion de caramel Powernaught
-STR_80B9_WIZZOWOW_TOFFEE_TRUCK                                  :Camion de sucreries Wizzowow
+STR_80B9_WIZZOWOW_TOFFEE_TRUCK                                  :Camion de caramel Wizzowow
 STR_80BA_MIGHTYMOVER_TOY_VAN                                    :Camion de jouets MightyMover
 STR_80BB_POWERNAUGHT_TOY_VAN                                    :Camion de jouets Powernaught
 STR_80BC_WIZZOWOW_TOY_VAN                                       :Camion de jouets Wizzowow
-STR_80BD_MIGHTYMOVER_CANDY_TRUCK                                :Camion de sucreries MightyMover
-STR_80BE_POWERNAUGHT_CANDY_TRUCK                                :Camion de sucreries Powernaught
-STR_80BF_WIZZOWOW_CANDY_TRUCK                                   :Camion de sucreries Wizzowow
+STR_80BD_MIGHTYMOVER_CANDY_TRUCK                                :Camion de bonbons MightyMover
+STR_80BE_POWERNAUGHT_CANDY_TRUCK                                :Camion de bonbons Powernaught
+STR_80BF_WIZZOWOW_CANDY_TRUCK                                   :Camion de bonbons Wizzowow
 STR_80C0_MIGHTYMOVER_BATTERY_TRUCK                              :Camion de batteries MightyMover
 STR_80C1_POWERNAUGHT_BATTERY_TRUCK                              :Camion de batteries Powernaught
 STR_80C2_WIZZOWOW_BATTERY_TRUCK                                 :Camion de batteries Wizzowow
@@ -2778,6 +2791,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nouv{G eau el elle} {STRING} disponible!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Impossible de vendre le véhicule détruit...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Impossible d'affecter un horaire au véhicule...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Les véhicules ne peuvent attendre qu'aux stations.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Ce véhicule ne s'arrête pas à cette station.
@@ -3009,7 +3024,7 @@
 STR_B002_OIL_REFINERY_EXPLOSION                                 :{BLACK}{BIGFONT}Explosion d'une raffinerie pétrolière près de {TOWN}!
 STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS                        :{BLACK}{BIGFONT}Usine détruite dans des circonstances suspectes près de {TOWN}!
 STR_B004_UFO_LANDS_NEAR                                         :{BLACK}{BIGFONT}Un 'OVNI' a été découvert près de {TOWN}!
-STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Affaissement d'une veine de charbon entraîne la desctruction de la mine de {TOWN}!
+STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}L'affaissement d'une veine de charbon entraîne la destruction de la mine de {TOWN}!
 STR_B006_FLOOD_VEHICLE_DESTROYED                                :{BLACK}{BIGFONT}Inondations!{}Au moins {COMMA} présumé{P "" s} manquant{P "" s} ou mort{P "" s} après des inondations meurtrières!
 
 STR_BRIBE_FAILED                                                :{WHITE}Votre tentative de corruption à été
@@ -3066,7 +3081,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Paramètre invalide pour {STRING}: paramètre {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} doit être chargé avant {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} doit être chargé après {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} nécessite OpenTTD version {STRING} ou supérieur.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :le fichier GRF qu'il doit traduire
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Trop de NewGRFs sont chargés.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Ajouter
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Ajouter un fichier NewGRF à la liste
@@ -3275,6 +3292,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centrer la carte sur la position actuelle
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Petit
@@ -3381,3 +3399,68 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospecter
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Construire
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Choisissez l'industrie appropriée dans cette liste
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avancé
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Sélection avancée du visage.
+STR_FACE_SIMPLE                                                 :{BLACK}Simple
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Sélection simple du visage.
+STR_FACE_LOAD                                                   :{BLACK}Charger
+STR_FACE_LOAD_TIP                                               :{BLACK}Charger visage favori
+STR_FACE_LOAD_DONE                                              :{WHITE}Votre visage favori a été chargé depuis le fichier de configuration d'OpenTTD.
+STR_FACE_FACECODE                                               :{BLACK}No. de visage
+STR_FACE_FACECODE_TIP                                           :{BLACK}Voir et/ou définir le numéro de visage
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Voir et/ou définir le numéro de visage
+STR_FACE_FACECODE_SET                                           :{WHITE}Le nouveau numéro de visage a été défini.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Impossibe de définir le numéro de visage - doit être un nombre entre 0 et 4.294.967.295!
+STR_FACE_SAVE                                                   :{BLACK}Enregistrer
+STR_FACE_SAVE_TIP                                               :{BLACK}Enregistrer visage favori
+STR_FACE_SAVE_DONE                                              :{WHITE}Ce visage sera enregistré comme favori dans le fichier de configuration d'OpenTTD.
+STR_FACE_EUROPEAN                                               :{BLACK}Européen
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Choisir les visages européens
+STR_FACE_AFRICAN                                                :{BLACK}Africain
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Choisir les visages africains
+STR_FACE_YES                                                    :Oui
+STR_FACE_NO                                                     :Non
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Activer la moustache ou la boucle d'oreille
+STR_FACE_HAIR                                                   :Cheveux:
+STR_FACE_HAIR_TIP                                               :{BLACK}Modifier les cheveux
+STR_FACE_EYEBROWS                                               :Yeux:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Modifier les yeux
+STR_FACE_EYECOLOUR                                              :Couleur des yeux:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Modifier la couleur des yeux
+STR_FACE_GLASSES                                                :Lunettes:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Activer les lunettes
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Modifier les lunettes
+STR_FACE_NOSE                                                   :Nez:
+STR_FACE_NOSE_TIP                                               :{BLACK}Modifier le nez
+STR_FACE_LIPS                                                   :Lèvres:
+STR_FACE_MOUSTACHE                                              :Moustache:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Modifier les lèvres ou la moustache
+STR_FACE_CHIN                                                   :Menton:
+STR_FACE_CHIN_TIP                                               :{BLACK}Modifier le menton
+STR_FACE_JACKET                                                 :Veste:
+STR_FACE_JACKET_TIP                                             :{BLACK}Modifier la veste
+STR_FACE_COLLAR                                                 :Col:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Modifier le col
+STR_FACE_TIE                                                    :Cravate:
+STR_FACE_EARRING                                                :Boucle d'oreille:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Modifier la cravate ou la boucle d'oreille
+########
+
+############ signal GUI
+STR_SIGNAL_SELECTION                                            :{WHITE}Sélection des signaux
+STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE                           :{WHITE}Impossible de convertir les signaux...
+STR_BUILD_SIGNAL_SEMAPHORE_NORM_TIP                             :{BLACK}Signal normal (sémaphore){}Les signaux sont nécessaires pour éviter les collisions sur les réseaux avec plus d'un train.
+STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TIP                            :{BLACK}Signal d'entrée (sémaphore){}Vert tant qu'un ou plusieurs signaux de sortie sont verts dans le bloc. Rouge sinon.
+STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TIP                             :{BLACK}Signal de sortie (sémaphore){}Fonctionne comme un signal normal, mais est nécessaire pour commander les signaux d'entrée et combinés.
+STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TIP                            :{BLACK}Signal combiné (sémaphore){}Le signal combiné est simplement l'unification d'un signal d'entrée et d'un signal de sortie. Cela vous permet de construire de larges "arbres" de pré-signaux.
+STR_BUILD_SIGNAL_ELECTRIC_NORM_TIP                              :{BLACK}Signal normal (électrique){}Les signaux sont nécessaires pour éviter les collisions sur les réseaux avec plus d'un train.
+STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TIP                             :{BLACK}Signal d'entrée (électrique){}Vert tant qu'un ou plusieurs signaux de sortie sont verts dans le bloc. Rouge sinon.
+STR_BUILD_SIGNAL_ELECTRIC_EXIT_TIP                              :{BLACK}Signal de sortie (électrique){}Fonctionne comme un signal normal, mais est nécessaire pour commander les signaux d'entrée et combinés.
+STR_BUILD_SIGNAL_ELECTRIC_COMBO_TIP                             :{BLACK}Signal combiné (électrique){}Le signal combiné est simplement l'unification d'un signal d'entrée et d'un signal de sortie. Cela vous permet de construire de larges "arbres" de pré-signaux.
+STR_SIGNAL_CONVERT_TIP                                          :{BLACK}Conversion de signal{}Si sélectionné, cliquer sur un signal existant pour le convertir vers le type et la variante choisis, Ctrl-clic pour basculer la variante.
+STR_DRAG_SIGNALS_DENSITY_TIP                                    :{BLACK}Densité de signal
+STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Réduire la densité de signal
+STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Augmenter la densité de signal
+########
--- a/src/lang/galician.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/galician.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1050,6 +1050,8 @@
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Ningunha
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Tódalas compañías
 
+
+
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Nº máximo de trens por xogador: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Nº máximo de vehículos de estrada por xogador: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Nº máximo de aeronaves por xogador: {ORANGE}{STRING}
@@ -1287,12 +1289,12 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Protexe a túa partida cun contrasinal se non queres que outras persoas se unan
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Selecciona un mapa:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}¿Que mapa queres xogar?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Máximo de clientes permitidos:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Escolle o máximo número de clientes. Non tódolas liñas teñen que estar cubertas
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Internet
 STR_NETWORK_LAN_INTERNET                                        :LAN / Internet
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (anunciar)
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Máximo de clientes permitidos:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Escolle o máximo número de clientes. Non tódolas liñas teñen que estar cubertas
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Nº máx. de compañías:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Limita-lo servidor a unha certa cantidade de compañías
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Nº máx. de espectadores:
@@ -1835,9 +1837,9 @@
 STR_482F_COST                                                   :{BLACK}Coste: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Non se pode construír ese tipo de industria aí...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...o bosqur só se pode plantar sobre a liña de neve
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}¡{INDUSTRY} anuncia o seu peche inminente!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}¡Problemas de suministro en {INDUSTRY} provocan o seu peche inminente!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}¡A falta de árbores provoca que {INDUSTRY} anuncie o peche inminente!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}¡{STRING} anuncia o seu peche inminente!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}¡Problemas de suministro en {STRING} provocan o seu peche inminente!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}¡A falta de árbores provoca que {STRING} anuncie o peche inminente!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}¡{INDUSTRY} incrementa a súa producción!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}¡Nova veta de carbón atopada en {INDUSTRY}!{}¡Espérase que a producción dóbrese!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}¡Novas reservas de petróleo atopadas en {INDUSTRY}!{}¡Espérase que a producción dóbrese!
@@ -2132,7 +2134,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Reposicionar CX
 STR_COMPANY_PASSWORD                                            :{BLACK}Contrasinal
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Protexe a atúa compañía cun contrasinal para evitar que usuarios non autorizados se unan
-STR_SET_COMPANY_PASSWORD                                        :Establece o contrasinal da compañía
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Establece o contrasinal da compañía
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}¡Recesión Mundial!{}{}¡Os expertos en finanzas témense o peor a medida que a economía afúndese!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}¡Fin da Recesión!{}{}¡A mellora no comercio inspira confianza nas industrias a media que a economía reforzase!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Intercambiar entre fiestra grande/pequena
@@ -2144,7 +2146,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Non se pode comprar un 25% das accións nesta compañía...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Non se pode vender un 25% das accións desta compañía...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% propiedade de {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% propiedade de {COMPANY}{}   {COMMA}% propiedade de {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} comprada por  {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Esta compañía todavía non comercia con accións...
 
@@ -2495,6 +2496,7 @@
 STR_8826_GO_TO                                                  :{BLACK}Ir a
 STR_8827_FULL_LOAD                                              :{BLACK}Cargar
 STR_8828_UNLOAD                                                 :{BLACK}Descarga
+STR_TIMETABLE_VIEW                                              :{BLACK}Táboa de tempo
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordes)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fin das Ordes - -
 STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
@@ -2573,6 +2575,8 @@
 
 STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}¡Novo {STRING} agora dispoñible!
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
+STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}¡Nova{STRING} dispoñible!  -  {ENGINE}
+
 
 
 ##id 0x9000
@@ -3054,7 +3058,6 @@
 STR_GROUP_DELETE_TIP                                            :{BLACK}Borrar o grupo seleccionado
 STR_GROUP_RENAME_TIP                                            :{BLACK}Renomear o grupo seleccionado
 
-
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
 STR_GROUP_NAME                                                  :{GROUP}
@@ -3067,3 +3070,9 @@
 
 ########
 
+
+############ Face formatting
+########
+
+############ signal GUI
+########
--- a/src/lang/german.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/german.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -861,6 +861,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Neue Industrie finanzieren
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kann nur in Städten errichtet werden
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...kann nur im Regenwaldgebiet errichtet werden
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...kann nur im Wüstengebiet errichtet werden
@@ -1021,6 +1022,7 @@
 STR_CONFIG_PATCHES_ON                                           :An
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Zeige Fahrzeuggeschwindigkeit in der Statusleiste: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Erlaube das Bauen an Hängen und Küsten: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Erlaube Landschaftsbau unter Gebäuden, Schienen, usw. (autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Aktiviere realistische Einzugsgebiete: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Erlaube die Entfernung von Industrien, weiteren Straßen usw.: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Erlaube das Bauen von sehr langen Zügen: {ORANGE}{STRING}
@@ -1047,6 +1049,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Fahrzeugwarteschlange (mit Überlagerung): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Spielfeld scrollen, wenn die Maus am Bildrand anstößt: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Bestechen der Stadtverwaltung erlauben: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Erlaube den Erwerb exklusiver Transportrechte: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Erlaube es, anderen Firemn Geld zu schenken: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ungleichmäßige Bahnhöfe: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Neue globale Wegfindung für alle Fahrzeuge: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Frachtgewicht erhöhen um schwere Züge zu simulieren: {ORANGE}{STRING}
@@ -1187,6 +1191,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Anteil der Städte die doppelt so schnell wachsen: {ORANGE}jede {STRING}.
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Anteil der Städte die doppelt so schnell wachsen: {ORANGE}keine
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Startmultiplikator der Stadtgröße: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Entferne absurde Straßenteile während des Straßenbaus
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Oberfläche
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruktion
@@ -1663,7 +1668,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Straßenbau
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Straßenbahnbau
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Straße bauen
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Werkzeug zum automatischen Bauen von Straßen
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Straßenbahnabschnitt bauen
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Werkzeug zum automatischen Bauen von Schienen
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Fahrzeugdepot bauen (zum Bau und zur Wartung von Fahrzeugen)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Straßenbahndepot bauen (zum Erstellen und Warten von Straßenbahnen)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Busbahnhof bauen
@@ -1996,9 +2003,9 @@
 STR_482F_COST                                                   :{BLACK}Kosten: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Industrie kann hier nicht gebaut werden...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...Wald kann nur oberhalb der Schneegrenze gepflanzt werden
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} gibt bevorstehende Schließung bekannt!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Wegen fehlender Rohstoffe kündigt {INDUSTRY} die drohende Schließung an!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Wegen Holzmangel gibt {INDUSTRY} die bevorstehende Schließung bekannt!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} gibt bevorstehende Schließung bekannt!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Wegen fehlender Rohstoffe kündigt {STRING} die drohende Schließung an!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Wegen Holzmangel gibt {STRING} die bevorstehende Schließung bekannt!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} erhöht die Produktion!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Neue Kohlevorkommen bei {INDUSTRY} gefunden!{}Förderung verdoppelt!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Neue Ölfunde bei {INDUSTRY}!{}Förderung wird vermutlich verdoppelt!
@@ -2017,6 +2024,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Brückenköpfe nicht auf einer Höhe
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Die Brücke ist zu niedrig für diese Umgebung
 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}
@@ -2296,7 +2305,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Firmensitz verlegen
 STR_COMPANY_PASSWORD                                            :{BLACK}Passwort
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Sie können Ihre Firma mit einem Passwort schützen, sodass nur ausgewählte Spieler beitreten können.
-STR_SET_COMPANY_PASSWORD                                        :Firmenpasswort setzen
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Firmenpasswort setzen
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Weltwirtschaftskrise!{}{}Finanzexperten befürchten schlimmsten Zusammenbruch der Wirtschaft!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Wirtschaftskrise beendet!{}{}Aufschwung des Handels gibt Vertrauen in die Industrie und stärkt die Wirtschaft!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Schalter für großes/kleines Fenster
@@ -2308,7 +2317,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Kauf von 25% der Aktien dieser Firma nicht möglich...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Verkauf von 25% der Aktien dieser Firma nicht möglich...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% Eigentum von {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% Eigentum von {COMPANY}{}   {COMMA}% Eigentum von {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} wurde von {COMPANY} übernommen!
 STR_7080_PROTECTED                                              :{WHITE}Dieses Unternehmen ist noch nicht an der Börse...
 
@@ -2777,6 +2785,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Neue{G r "" s} {STRING} jetzt erhältlich!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Kann dieses Schrottfahrzeug nicht mehr verkaufen ...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Kein Fahrplan für das Fahrzeug...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Fahrzeuge halten nur an Stationen.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Das Fahrzeug hält nicht an dieser Station.
@@ -3065,6 +3075,7 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Falscher Parameter für {STRING}: Parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} muss vor {STRING} geladen werden.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} muss nach {STRING} geladen werden.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} Benötigt OpenTTD-Version {STRING} oder höher.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :der GRF-Datei, die es übersetzen soll,
 
 STR_NEWGRF_ADD                                                  :{BLACK}Hinzufügen
@@ -3380,3 +3391,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospektieren
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Bauen
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Gewünschte Industrie aus der Liste auswählen
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Detailliert
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Umfangreichere Wahl des Gesichts
+STR_FACE_SIMPLE                                                 :{BLACK}Einfach
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Einfache Wahl des Gesichts
+STR_FACE_LOAD                                                   :{BLACK}Laden
+STR_FACE_LOAD_TIP                                               :{BLACK}Lade bevorzugtes Gesicht
+STR_FACE_LOAD_DONE                                              :{WHITE}Dein bevorzugtes Gesicht wurde aus der OpenTTD-Konfigurationsdatei geladen.
+STR_FACE_FACECODE                                               :{BLACK}Nummer des Gesichts
+STR_FACE_FACECODE_TIP                                           :{BLACK}Betrachte / Setze Nummer des Gesichts
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Betrachte / Setze Nummer des Gesichts
+STR_FACE_FACECODE_SET                                           :{WHITE}Neue Nummer wurde für das Gesicht registriert.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Konnte keine Nummer für das Gesicht registrieren, sie muss zwischen 0 und 4.294.967.295 liegen!
+STR_FACE_SAVE                                                   :{BLACK}Speichern
+STR_FACE_SAVE_TIP                                               :{BLACK}Speichere bevorzugtes Gesicht
+STR_FACE_SAVE_DONE                                              :{WHITE}Dieses Gesicht wird als bevorzugtes Gesicht in der OpenTTD-Konfigurationsdatei gespiechert.
+STR_FACE_EUROPEAN                                               :{BLACK}Europäisch
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Auswahl europäischer Gesichter
+STR_FACE_AFRICAN                                                :{BLACK}Afrikanisch
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Auswahl afrikanischer Gesichter
+STR_FACE_YES                                                    :Ja
+STR_FACE_NO                                                     :Nein
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Erlaube Schnauzbart oder Ohrring
+STR_FACE_HAIR                                                   :Frisur:
+STR_FACE_HAIR_TIP                                               :{BLACK}Frisur
+STR_FACE_EYEBROWS                                               :Augenbrauen:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Augenbrauen ändern
+STR_FACE_EYECOLOUR                                              :Augenfarbe:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Augenfarbe ändern
+STR_FACE_GLASSES                                                :Brille:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Brille aufsetzen
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Brille ändern
+STR_FACE_NOSE                                                   :Nase:
+STR_FACE_NOSE_TIP                                               :{BLACK}Nase ändern
+STR_FACE_LIPS                                                   :Lippen:
+STR_FACE_MOUSTACHE                                              :Schnauzbart:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Lippen oder Schnauzbart ändern
+STR_FACE_CHIN                                                   :Kinn:
+STR_FACE_CHIN_TIP                                               :{BLACK}Kinn ändern
+STR_FACE_JACKET                                                 :Jackett:
+STR_FACE_JACKET_TIP                                             :{BLACK}Jackett ändern
+STR_FACE_COLLAR                                                 :Kragen:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Kragen ändern
+STR_FACE_TIE                                                    :Krawatte:
+STR_FACE_EARRING                                                :Ohrring:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Krawatte oder Ohrring ändern
+########
--- a/src/lang/hungarian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/hungarian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -926,6 +926,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Új gazdasági épület
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...csak városban építhető
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...csak esőerdőben építhető
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...csak sivatagban építhető
@@ -1113,6 +1114,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Közúti járművek sorbanállása (quantum effektektus): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Ablakmozgatás, ha az egér a képernyő szélén van: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Önkormányzatok lefizethetősége: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Lehessen exkluzív szállítási jogot venni: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Lehessen más vállalatoknak pénzt küldeni: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Különböző vágánytípusok engedélyezése egy állomáson: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Új útvonalkereső (NPF, felülbírálja az NTP-t): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Tömegszorzó tehervonatoknak (szimulációs célból): {ORANGE}{STRING}
@@ -1253,6 +1256,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Dupla gyorsan növekvő városok aránya: {ORANGE}{STRING} városból 1
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Dupla gyorsan növekvő városok aránya: {ORANGE}Nincsennek
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Kezdeti városméret-szorzó: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Abszurd útrészletek útépítés közbeni eltávolítása
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Megjelenítés
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Építkezés
@@ -2099,9 +2103,9 @@
 STR_482F_COST                                                   :{BLACK}Ár: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Nem építheted ide ezt a gazdasági épületet...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...erdő csak a hóhatár fölé ültethető
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} bejelentette, hogy hamarosan bezár!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{INDUSTRY} bejelentette, hogy ellátási gondok miatt hamarosan bezár!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}{INDUSTRY} bejelentette, hogy a közeli fák hiánya miatt hamarosan bezár!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} bejelentette, hogy hamarosan bezár!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{STRING} bejelentette, hogy ellátási gondok miatt hamarosan bezár!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}{STRING} bejelentette, hogy a közeli fák hiánya miatt hamarosan bezár!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} növeli a termelését!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Új szénréteget találtak {INDUSTRY}ban!{}A termelés megkétszereződik!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Új olajtartalékokat találtak {INDUSTRY} alatt!{}A termelés megkétszereződik!
@@ -2120,6 +2124,7 @@
 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_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}A híd túl alacsony a terepre
 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}
@@ -2399,7 +2404,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}FH áthelyezése
 STR_COMPANY_PASSWORD                                            :{BLACK}Jelszó
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Védd le a vállalatodat jelszóval ha nem akarod hogy mások csatlakozzanak hozzá.
-STR_SET_COMPANY_PASSWORD                                        :Vállalati jelszó beállítása
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Vállalati jelszó beállítása
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Gazdasági visszaesés!{}{}A közgazdászok gazdasági válságtól tartanak!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Vége a visszaesésnek!{}{}A kereskedelem fellendül, ami önbizalmat ad az iparnak, és erősödik a gazdaság!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Kicsi/nagy ablakméret közötti váltás
@@ -2411,7 +2416,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Nem vehetsz 25%-ot ebből a cégből...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Nem adhatsz el 25%-ot ebből a cégből...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% {COMPANY} tulajdona)
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% {COMPANY} tulajdona{}   {COMMA}% {COMPANY} tulajdona)
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} céget felvásárolta {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Ez a cég egyelőre még nem rendelkezik részvényekkel...
 
@@ -2880,6 +2884,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Új {STRING} elérhető!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}A megsemmisült jármű nem eladható...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}A jármű nem időzíthető
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}A járművek csak az állomáson várakozhatnak
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Ez a jármű nem áll meg ezen az állomáson
@@ -3483,3 +3489,33 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Támogat
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Épít
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Válaszd ki a megfelelő ipartípust a listából
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Fejlett
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Fejlett arcválasztó.
+STR_FACE_SIMPLE                                                 :{BLACK}Egyszerű
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Egyszerű arcválasztó.
+STR_FACE_LOAD                                                   :{BLACK}Betölt
+STR_FACE_LOAD_TIP                                               :{BLACK}Kedvenc arcd betöltése
+STR_FACE_LOAD_DONE                                              :{WHITE}A kedvenc arcod az OpenTTD konfig-fájlból be lett töltve.
+STR_FACE_FACECODE                                               :{BLACK}Játékos arc szám
+STR_FACE_SAVE                                                   :{BLACK}Mentés
+STR_FACE_SAVE_TIP                                               :{BLACK}Kedvenc arc elmentése
+STR_FACE_SAVE_DONE                                              :{WHITE}Ez az arc mint a kedvenc arcod fog az OpenTTD konfig-fájlba elmentődni.
+STR_FACE_EUROPEAN                                               :{BLACK}Európai
+STR_FACE_AFRICAN                                                :{BLACK}Afrikai
+STR_FACE_YES                                                    :Igen
+STR_FACE_NO                                                     :Nem
+STR_FACE_HAIR                                                   :Haj:
+STR_FACE_HAIR_TIP                                               :{BLACK}Haj váltása
+STR_FACE_GLASSES                                                :Szemüveg:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Szemüveg engedélyezése
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Szemüveg váltása
+STR_FACE_NOSE                                                   :Orr:
+STR_FACE_NOSE_TIP                                               :{BLACK}Orr váltása
+STR_FACE_LIPS                                                   :Ajkak:
+STR_FACE_MOUSTACHE                                              :Bajusz:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Ajkak vagy bajusz váltása
+STR_FACE_CHIN                                                   :Ál:
+STR_FACE_CHIN_TIP                                               :{BLACK}Ál váltása
+########
--- a/src/lang/icelandic.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/icelandic.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1856,9 +1856,9 @@
 STR_482F_COST                                                   :{BLACK}Kostnaður: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Get ekki reist þennan iðnað hér...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...skógur getur aðeins verið gróðursettur yfir snjólínu
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} tilkynnir yfirvofandi lokun!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Birgðavandamál knýja {INDUSTRY} til að tilkynna yfirvofandi lokun!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Skortur á nálægum trjám knýr {INDUSTRY} til að tilkynna yfirvofandi lokun!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} tilkynnir yfirvofandi lokun!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Birgðavandamál knýja {STRING} til að tilkynna yfirvofandi lokun!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Skortur á nálægum trjám knýr {STRING} til að tilkynna yfirvofandi lokun!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} eykur framleiðsluna!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nýtt kolalag fanns í {INDUSTRY}!{}Tvöföldun í framleiðslu væntanleg!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Meri olía finnst við {INDUSTRY}!{}Tvöföldun í framleiðslu væntanleg!
@@ -2154,7 +2154,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Flytja HS
 STR_COMPANY_PASSWORD                                            :{BLACK}Lykilorð
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Til að vernda fyrirtæki þitt frá óboðnum notendum geturðu sett lykilorð á það
-STR_SET_COMPANY_PASSWORD                                        :Setja lykilorð á fyrirtæki
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Setja lykilorð á fyrirtæki
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Heimssamdráttur!{}{}Hagfræðingar hræddir um efnahagshrun!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Samdráttur!{}{}Uppslag í viðskiptum gefur bjartari von um betri efnahag!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Stækka/smækka gluggastærð
@@ -2166,7 +2166,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Get ekki keypt 25% hlut í þessu fyrirtæki...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Get ekki selt 25% hlut í þessu fyrirtæki...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% í eigu {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% í eigu {COMPANY}{}   {COMMA}% í eigu {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} hefur verið yfirtekið af {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Þetta fyrirtæki er ekki nógu gamalt til að versla með hluti ...
 
--- a/src/lang/italian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/italian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -596,6 +596,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informazioni sulla compagnia
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Apertura / chiusura delle industrie
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Cambiamenti economici
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Cambiamenti produzione industrie servite dal giocatore
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Cambiamenti produzione industrie servite dagli avversari
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Altri cambiamenti di produzione industrie
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Avvisi / informazioni sui veicoli del giocatore
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nuovi veicoli
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Cambiamenti della merce accettata
@@ -862,6 +865,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Finanzia nuova industria
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...può essere costruita solo in città
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...può essere costruita solo nella foresta pluviale
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...può essere costruita solo in aree desertiche
@@ -1049,6 +1053,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Accodamento automezzi fuori da una stazione occupata: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Scorri la visuale quando il mouse è su un bordo: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Consenti la corruzione dell'autorità locale: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Consenti l'acquisto dell'esclusiva sui trasporti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Consenti l'invio di denaro ad altre compagnie: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Stazioni non uniformi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nuovo pathfinding globale (NPF, sovrascrive NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Moltiplicatore di peso per simulare treni merci pesanti: {ORANGE}{STRING}
@@ -1165,6 +1171,7 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permetti l'acquisto di azioni di altre compagnie
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Trascinando il cursore, piazza i segnali ogni: {ORANGE}{STRING} quadrato/i
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Costruisci automaticamente i semafori prima del: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI                            :{LTBLUE}Abilita l'interfaccia di selezione segnali: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}L'opzione "Nessuna nuova strada" non è valida nell'editor di scenari
 STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Disposizione delle strade cittadine: {ORANGE}{STRING}
@@ -1189,6 +1196,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Città che diventeranno metropoli: {ORANGE}1 su {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Città che diventeranno metropoli: {ORANGE}Nessuna
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Moltiplicatore iniziale dimensioni metropoli: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Rimuovi segmenti isolati con la ricostruzione delle strade cittadine
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interfaccia
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Costruzione
@@ -1248,7 +1256,7 @@
 STR_CANT_BUILD_TRAIN_WAYPOINT                                   :{WHITE}Impossibile costruire qui un waypoint ferroviario...
 STR_CANT_REMOVE_TRAIN_WAYPOINT                                  :{WHITE}Impossibile rimuovere il waypoint ferroviario da qui...
 
-STR_BUILD_AUTORAIL_TIP                                          :{BLACK}Costruisci binario usando la modalità automatica
+STR_BUILD_AUTORAIL_TIP                                          :{BLACK}Costruisce binari usando la modalità automatica
 
 STR_NO_TOWN_IN_SCENARIO                                         :{WHITE}...non ci sono città in questo scenario
 
@@ -1333,7 +1341,7 @@
 
 TEMP_AI_IN_PROGRESS                                             :{WHITE}Benvenuti nella nuova IA, in sviluppo. Se si incontrano dei problemi, fare uno screenshot e inviarlo sul forum.
 TEMP_AI_ACTIVATED                                               :{WHITE}Attenzione: la nuova IA è ancora in alpha! Attualmente funzionano solo camion e autobus!
-TEMP_AI_MULTIPLAYER                                             :{WHITE}Attenzione: l'implementazione è ancora sperimentale (utilizza la nuova IA). Segnalare qualsiasi problema a: truelight@openttd.org.
+TEMP_AI_MULTIPLAYER                                             :{WHITE}Attenzione: l'implementazione è ancora sperimentale (utilizza la nuova IA).
 
 ############ network gui strings
 
@@ -1665,7 +1673,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Costruzione strade
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Costruzione tranvie
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Costruisce una sezione di strada
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Costruisce sezioni di strada usando la modalità automatica
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Costruisce una sezione di tranvia
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Costruisce sezioni di tranvia usando la modalità automatica
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Costruisce un deposito automezzi (per costruire e manutenere i veicoli)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Costruisce un deposito tranviario (per costruire e manutenere i veicoli)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Costruisce una stazione degli autobus
@@ -1676,6 +1686,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Costruisce un ponte tranviario
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Costruisce un tunnel stradale
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Costruisce un tunnel tranviario
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Attiva/disattiva strade a senso unico
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Seleziona fra costruzione/rimozione di strade
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Seleziona fra costruzione/rimozione di tranvie
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Seleziona l'orientamento del deposito automezzi
@@ -1697,6 +1708,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}L'edificio deve essere demolito prima
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Popolazione: {ORANGE}{COMMA}{BLACK}  Case: {ORANGE}{COMMA}
@@ -1998,9 +2010,9 @@
 STR_482F_COST                                                   :{BLACK}Costo: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Imposibile costruire l'industria qui...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...una foresta può essere piantata solo in una zona innevata
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} annuncia imminente chiusura!!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Per problemi di rifornimenti {INDUSTRY} annuncia imminente chiusura!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}La mancanza di alberi vicini costringe la {INDUSTRY} ad imminente chiusura!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} annuncia imminente chiusura!!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Per problemi di rifornimenti {STRING} annuncia imminente chiusura!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}La mancanza di alberi vicini costringe la {STRING} ad imminente chiusura!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} incrementa la produzione!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Trovato nuovo giacimento di carbone alla {INDUSTRY}!{}Atteso un raddoppiamento della produzione!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Trovato nuovo giacimento di petrolio al {INDUSTRY}!{}Atteso un raddoppiamento della produzione!
@@ -2019,6 +2031,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Le estremità del ponte non sono allo stesso livello
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Il ponte è troppo basso per il terreno
 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}
@@ -2298,7 +2312,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Sposta sede
 STR_COMPANY_PASSWORD                                            :{BLACK}Password
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Protegge la compagnia con una password per impedire ad utenti non autorizzati di accedervi.
-STR_SET_COMPANY_PASSWORD                                        :Imposta password compagnia
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Imposta password compagnia
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Recessione mondiale!{}{}Il crollo dell'economia porta gli analisti finanziari a temere il peggio!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recessione finita!{}{}La ripresa del commercio da fiducia alle industrie e rafforza l'economia!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Seleziona dimensione grande/piccola della finestra
@@ -2310,7 +2324,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Impossibile comprare il 25% delle azioni...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Impossibile vendere il 25% delle azioni...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% posseduto dalla {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% posseduto dalla {COMPANY}{}   {COMMA}% posseduto dalla {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}La {COMPANY} è stata rilevata dalla {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Questa compagnia non è abbastanza vecchia per scambiare azioni...
 
@@ -2779,6 +2792,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nuov{G o a} {STRING} disponibile! -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Impossibile vendere un veicolo distrutto...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Impossibile dare un orario al veicolo...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}I veicoli possono attendere solo alle stazioni.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Il veicolo non ferma a questa stazione.
@@ -3067,7 +3082,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Parametro non valido per {STRING}: parametro {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} deve essere caricato prima di {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} deve essere caricato dopo {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} richiede OpenTTD versione {STRING} o superiore.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :il file GRF che era progettato per tradurre
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Troppi file NewGRF caricati.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Aggiungi
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Aggiunge un file NewGRF all'elenco
@@ -3259,9 +3276,9 @@
 STR_WORLD_GENERATION                                            :{BLACK}Generazione mondo
 STR_TREE_GENERATION                                             :{BLACK}Generazione alberi
 STR_UNMOVABLE_GENERATION                                        :{BLACK}Generazione oggetti inamovibili
-STR_CLEARING_TILES                                              :{BLACK}Generazione di aree brulle e rocciose
+STR_CLEARING_TILES                                              :{BLACK}Generazione aree brulle e rocciose
 STR_SETTINGUP_GAME                                              :{BLACK}Impostazione partita
-STR_PREPARING_TILELOOP                                          :{BLACK}Ciclo generazione riquadri del terreno
+STR_PREPARING_TILELOOP                                          :{BLACK}Generazione riquadri del terreno
 STR_PREPARING_GAME                                              :{BLACK}Preparazione della partita
 STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Questa azione ha cambiato il livello di difficolta in 'Personalizzata'
 STR_SE_FLAT_WORLD                                               :{WHITE}Pianeggiante
@@ -3276,6 +3293,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centra la minimappa sulla posizione corrente
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Piccolo
@@ -3382,3 +3400,68 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Esegui prospezione
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Costruisci
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Selezionare l'industria appropriata dalla lista
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avanzata
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Selezione avanzata della faccia
+STR_FACE_SIMPLE                                                 :{BLACK}Semplice
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Selezione semplice della faccia
+STR_FACE_LOAD                                                   :{BLACK}Carica
+STR_FACE_LOAD_TIP                                               :{BLACK}Carica la faccia preferita
+STR_FACE_LOAD_DONE                                              :{WHITE}La faccia preferita è stata caricata dal file di configurazione di OpenTTD
+STR_FACE_FACECODE                                               :{BLACK}Numero faccia
+STR_FACE_FACECODE_TIP                                           :{BLACK}Visualizza e/o imposta il numero della faccia del giocatore
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Visualizza e/o imposta il numero della faccia
+STR_FACE_FACECODE_SET                                           :{WHITE}Nuovo codice numerico faccia impostato
+STR_FACE_FACECODE_ERR                                           :{WHITE}Impossibile impostare il numero della faccia - deve essere un numero fra 0 e 4.294.967.295!
+STR_FACE_SAVE                                                   :{BLACK}Salva
+STR_FACE_SAVE_TIP                                               :{BLACK}Salva come faccia preferita
+STR_FACE_SAVE_DONE                                              :{WHITE}La faccia corrente è stata salvata come preferita nel file di configurazione di OpenTTD
+STR_FACE_EUROPEAN                                               :{BLACK}Europea
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Seleziona le facce europee
+STR_FACE_AFRICAN                                                :{BLACK}Africana
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Seleziona le facce africane
+STR_FACE_YES                                                    :Sì
+STR_FACE_NO                                                     :No
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Abilita i baffi o l'orecchino
+STR_FACE_HAIR                                                   :Capelli:
+STR_FACE_HAIR_TIP                                               :{BLACK}Cambia i capelli
+STR_FACE_EYEBROWS                                               :Sopracciglia:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Cambia le sopracciglia
+STR_FACE_EYECOLOUR                                              :Colore occhi:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Cambia il colore degli occhi
+STR_FACE_GLASSES                                                :Occhiali:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Abilita gli occhiali
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Cambia gli occhiali
+STR_FACE_NOSE                                                   :Naso:
+STR_FACE_NOSE_TIP                                               :{BLACK}Cambia il naso
+STR_FACE_LIPS                                                   :Labbra:
+STR_FACE_MOUSTACHE                                              :Baffi:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Cambia le labbra o i baffi
+STR_FACE_CHIN                                                   :Mento:
+STR_FACE_CHIN_TIP                                               :{BLACK}Cambia il mento
+STR_FACE_JACKET                                                 :Giacca:
+STR_FACE_JACKET_TIP                                             :{BLACK}Cambia la giacca
+STR_FACE_COLLAR                                                 :Colletto:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Cambia il colletto
+STR_FACE_TIE                                                    :Cravatta:
+STR_FACE_EARRING                                                :Orecchino:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Cambia la cravatta o l'orecchino
+########
+
+############ signal GUI
+STR_SIGNAL_SELECTION                                            :{WHITE}Selezione segnale
+STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE                           :{WHITE}Impossibile convertire i segnali qui...
+STR_BUILD_SIGNAL_SEMAPHORE_NORM_TIP                             :{BLACK}Segnale normale (semaforico){}I segnali sono necessari per impedire ai treni di scontrarsi su reti ferroviarie con più di un treno.
+STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TIP                            :{BLACK}Pre-segnale (semaforico){}Verde se è presente almeno un segnale di uscita verde al termine della sezione di blocco successiva. Altrimenti presenta il rosso.
+STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TIP                             :{BLACK}Segnale di uscita (semaforico){}Si comporta come un segnale normale, ma è necessario per far funzionare correttamente i pre-segnali e i segnali combinati all'ingresso della sezione di blocco.
+STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TIP                            :{BLACK}Segnale combinato (semaforico){}Un segnale combinato funziona contemporaneamente da segnale d'uscita e da pre-segnale. In questo modo è possibile costruire "alberi" di pre-segnali.
+STR_BUILD_SIGNAL_ELECTRIC_NORM_TIP                              :{BLACK}Segnale normale (luminoso){}I segnali sono necessari per impedire ai treni di scontrarsi su reti ferroviarie con più di un treno.
+STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TIP                             :{BLACK}Pre-segnale (luminoso){}Verde se è presente almeno un segnale di uscita verde al termine della sezione di blocco successiva. Altrimenti presenta il rosso.
+STR_BUILD_SIGNAL_ELECTRIC_EXIT_TIP                              :{BLACK}Segnale di uscita (luminoso){}Si comporta come un segnale normale, ma è necessario per far funzionare correttamente i pre-segnali e i segnali combinati all'ingresso della sezione di blocco.
+STR_BUILD_SIGNAL_ELECTRIC_COMBO_TIP                             :{BLACK}Segnale combinato (luminoso){}Un segnale combinato funziona contemporaneamente da segnale d'uscita e da pre-segnale. In questo modo è possibile costruire "alberi" di pre-segnali.
+STR_SIGNAL_CONVERT_TIP                                          :{BLACK}Conversione segnali - Se attivato, facendo clic su un segnale esistente lo si converte nel tipo selezionato, mentre con CTRL+clic se ne modifica la variante.
+STR_DRAG_SIGNALS_DENSITY_TIP                                    :{BLACK}Distanza fra i segnali costruiti automaticamente trascinando il cursore
+STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Riduce la distanza fra i segnali costruiti
+STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Aumenta la distanza fra i segnali costruiti
+########
--- a/src/lang/japanese.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/japanese.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -594,6 +594,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}会社情報
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}産業の開業/閉業
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}経済の変化
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}プレヤーが運送している産業の生産量が変更したとき
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}競争者が運送している産業の生産量が変更したとき
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}その他の産業の生産量が変更したとき
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}プレヤーの車両についての情報
 STR_020C_NEW_VEHICLES                                           :{YELLOW}車両の新登場
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}貨物の受入れの変化
@@ -860,6 +863,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}新規産業の建設を出資
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...町内のみに建設できます
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...雨林地域のみに建設できます
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...砂漠地域のみに建設できます
@@ -1020,6 +1024,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}
@@ -1046,6 +1051,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}車両の待ち行列を使用:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}マウスが端にあるとき画面を移動:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}町議会の買収を許容:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}独占的運送権の購入を許容:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}他社への送金を許容:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}不統一の駅を許容:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}新型グローバルパスファインダー(NPF):{ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}重い列車のシミュレーションのための重量乗数の設定:{ORANGE}{STRING}
@@ -1186,6 +1193,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}市に展開する町の割合:{ORANGE}{STRING}の1
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}市に展開する町の割合:{ORANGE}なし
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}初期の市町村のサイズの乗数:{ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}道路建設時に変な部分を破壊
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}インターフェース
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}建設
@@ -1662,7 +1670,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :道路の建設
 STR_180A_TRAMWAY_CONSTRUCTION                                   :路面電車線の建設
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}道路の部分を建設します
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}自動道路建設モードを用いて道路を建設
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}路面電車線を建設します
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}自動路面電車線建設モードを用いて路面電車線を建設
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}(バス、トラックの建設、整備のための)車庫を建設します
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}(路面電車の購入や修理のため)路面電車庫を建設します
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}バス停を建設します
@@ -1673,6 +1683,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}路面電車用橋を建設
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}道路のトンネルを建設します
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}路面電車用トンネルを建設
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}一方通行の道路を入/切
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}道路の建設/破壊を切り替えます
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}路面電車線の建設/破壊を切り替えます
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}車庫の配置の選択
@@ -1995,9 +2006,9 @@
 STR_482F_COST                                                   :{BLACK}価格:{YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}この産業がここに建設できません...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...雪線上のみに植林できます
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY}が間近く閉鎖!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}供給不足によって{INDUSTRY}が間近く閉鎖!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}周辺の森林不足によって{INDUSTRY}が間近く閉鎖!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING}が間近く閉鎖!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}供給不足によって{STRING}が間近く閉鎖!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}周辺の森林不足によって{STRING}が間近く閉鎖!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY}の生産量が増えた!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}{INDUSTRY}で新しい石炭層の発見!{}予報:生産量2倍!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}{INDUSTRY}で新しい油層の発見!{}予報:生産量 2倍!
@@ -2016,6 +2027,8 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}先にトンネルを破壊しなければなりません
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}先に橋を破壊しなければなりません
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}開始点と終了点が同じ位置に建設できません
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}橋端は同じ高さではありません
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}橋は低すぎて、地形に対応していません
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}一直線の橋しか建設できません
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}この土地はトンネルの入り口に不適当です
 STR_500D                                                        :{GOLD}{STRING}、{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2295,7 +2308,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}本部ビルを移動
 STR_COMPANY_PASSWORD                                            :{BLACK}パスワード
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}他のプレヤーがこの会社の経営に参加できないようにするには、パスワードで保護します
-STR_SET_COMPANY_PASSWORD                                        :会社のパスワードを設定
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}会社のパスワードを設定
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}世界中不景気!{}{}経済がスランプに陥る、アナリストの不安説!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}スランプの終わり!{}{}経済が上昇気流、産業が好転!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}大きい/小さいウィンドウサイズを切り替えます
@@ -2307,7 +2320,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}この会社の25%の株が買収できません...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}この会社の25%の株が販売できません...
 STR_707D_OWNED_BY                                               :{WHITE}({1:COMPANY}が{0:COMMA}%株式保有)
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({1:COMPANY}が{0:COMMA}%株式保有){} ({3:COMPANY}が{2:COMMA}%株式保有)
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY}が{COMPANY}に買収!
 STR_7080_PROTECTED                                              :{WHITE}まだ早いため、この会社は株式取引できません...
 
@@ -2776,6 +2788,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}{STRING}が新登場!ー{ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}破壊した車両が売却できません...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}この車両に時刻表が設定できません...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}車両が駅/バス停のみで停車できます。
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}この車両はこの駅/バス停で停車しません。
@@ -3064,7 +3078,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :{STRING}のパラメータが不正:パラメータ {STRING}({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{1:STRING}を読み込む前、{0:STRING}を読み込まなければなりません。
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING}は{STRING}の読み込み後のみに読み込めます。
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} は OpenTTD バージョン {STRING} もしくはそれ以降のバージョンが必要です。
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :訳しにデザインされたGRFファイル
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :読み込んだ NewGRF が多すぎます。
 
 STR_NEWGRF_ADD                                                  :{BLACK}追加
 STR_NEWGRF_ADD_TIP                                              :{BLACK}NewGRFファイルをリストに追加します
@@ -3273,6 +3289,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}予約地図を現在の場所に移動します
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}町空港
@@ -3379,3 +3396,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}調査
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}建設
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}適当な産業を選択します
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}詳しい
+STR_FACE_ADVANCED_TIP                                           :{BLACK}顔を詳しく選択します。
+STR_FACE_SIMPLE                                                 :{BLACK}簡単
+STR_FACE_SIMPLE_TIP                                             :{BLACK}顔を簡単に選択します。
+STR_FACE_LOAD                                                   :{BLACK}開く
+STR_FACE_LOAD_TIP                                               :{BLACK}お好みの顔を開きます。
+STR_FACE_LOAD_DONE                                              :{WHITE}お好みの顔は OpenTTD の設定ファイルから読み込みました。
+STR_FACE_FACECODE                                               :{BLACK}プレヤーの顔番号
+STR_FACE_FACECODE_TIP                                           :{BLACK}プレヤーの顔番号を表示/変更
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}プレヤーの顔番号を表示/変更
+STR_FACE_FACECODE_SET                                           :{WHITE}新しい顔番号が設定されました。
+STR_FACE_FACECODE_ERR                                           :{WHITE}顔記号が設定できませんでした - 0 と 4,294,967,295 の間の数値ではありません。
+STR_FACE_SAVE                                                   :{BLACK}保存
+STR_FACE_SAVE_TIP                                               :{BLACK}お好みの顔を保存します。
+STR_FACE_SAVE_DONE                                              :{WHITE}この顔はお好みの顔として OpenTTD の設定ファイルに保存します。
+STR_FACE_EUROPEAN                                               :{BLACK}白人
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}白人の顔を選択します
+STR_FACE_AFRICAN                                                :{BLACK}黒人
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}黒人の顔を選択します
+STR_FACE_YES                                                    :はい
+STR_FACE_NO                                                     :いいえ
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}口ひげもしくはイヤリングを表示
+STR_FACE_HAIR                                                   :髪の毛:
+STR_FACE_HAIR_TIP                                               :{BLACK}髪の毛を変更
+STR_FACE_EYEBROWS                                               :まゆ:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}まゆを変更
+STR_FACE_EYECOLOUR                                              :目の色:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}目の色を変更
+STR_FACE_GLASSES                                                :眼鏡:
+STR_FACE_GLASSES_TIP                                            :{BLACK}眼鏡をかける
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}眼鏡を変更
+STR_FACE_NOSE                                                   :鼻:
+STR_FACE_NOSE_TIP                                               :{BLACK}鼻を変更:
+STR_FACE_LIPS                                                   :口唇:
+STR_FACE_MOUSTACHE                                              :口ひげ:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}口唇/口ひげを変更
+STR_FACE_CHIN                                                   :顎:
+STR_FACE_CHIN_TIP                                               :{BLACK}顎を変更
+STR_FACE_JACKET                                                 :ジャケット:
+STR_FACE_JACKET_TIP                                             :{BLACK}ジャケットを変更:
+STR_FACE_COLLAR                                                 :襟:
+STR_FACE_COLLAR_TIP                                             :{BLACK}襟を変更:
+STR_FACE_TIE                                                    :ネクタイ:
+STR_FACE_EARRING                                                :イヤリング:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}ネクタイ/イヤリングを変更
+########
--- a/src/lang/korean.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/korean.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1113,6 +1113,9 @@
 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_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}
@@ -1181,6 +1184,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}2배 빠르게 성장하는 마을의 비율: {ORANGE}1 대 {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}2배 빠르게 성장하는 마을의 비율: {ORANGE}없음
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}초기의 도시 크기 배수: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}도로 건설 중 부조리한 도로 요소를 제거
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}인터페이스
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}건설
@@ -1657,7 +1661,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :도로 건설
 STR_180A_TRAMWAY_CONSTRUCTION                                   :전찻길 건설
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}도로 섹션 건설
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}자동건설 모드로 도로 섹션 건설
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}전찻길 섹션 건설
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}자동건설 모드로 전차 섹션 건설
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}차고 건설 (차량의 제작/점검용)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}차량기지 건설 (차량 건설/점검용)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}버스 정류장 건설
@@ -1668,6 +1674,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}철교 건설
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}터널 건설
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}터널 건설
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}일방통행 활성/비활성화
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}도로 제거툴 켜기/끄기
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}전찻길/신호등 제거툴 켜기/끄기
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}차고의 방향을 선택하십시오
@@ -1990,9 +1997,9 @@
 STR_482F_COST                                                   :{BLACK}가격: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}여기에 이 산업시설을 건설할 수 없습니다...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...숲은 만년설 높이 이상의 고도에만 심을 수 있습니다.
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY}의 긴급폐쇄를 알립니다!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}연결된 수요가 없는 관계로 {INDUSTRY}의 긴급 폐쇄를 알립니다!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}근처에 나무 고갈로 인한 {INDUSTRY}의 긴급 폐쇄를 알립니다!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING}의 긴급폐쇄를 알립니다!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}연결된 수요가 없는 관계로 {STRING}의 긴급 폐쇄를 알립니다!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}근처에 나무 고갈로 인한 {STRING}의 긴급 폐쇄를 알립니다!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY}이/가 생산량을 늘렸습니다!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}{INDUSTRY}에서 새로운 석탄 광맥을 찾았습니다!{}생산량이 2배가 되었습니다!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}{INDUSTRY}에서 새로운 유전을 찾았습니다!{}생산량이 2배가 되었습니다!
@@ -2011,6 +2018,8 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}터널을 먼저 제거하십시오
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}다리를 먼저 제거하십시오
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}같은 위치에서 시작하고 끝낼 수 없습니다
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}다리는 같은 높이를 연결해야 합니다
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}그 지형은 다리를 건설하기에 너무 낮습니다
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}시작과 끝은 한 줄 위에 있어야 합니다
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}터널 입구에 알맞지 않은 장소입니다
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2290,7 +2299,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}본사 재위치
 STR_COMPANY_PASSWORD                                            :{BLACK}암호
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}다른 참가자가 이 회사로의 플레이를 하지 못하도록 암호로 보호합니다
-STR_SET_COMPANY_PASSWORD                                        :회사 암호 설정
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}회사 암호 설정
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}세계 공황!{}{}경제 전문가들이 경제 슬럼프에 대해 우려를 표망하고 있습니다!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}공황 종료!{}{}무역량의 증대로 경제를 살려낸 결과 산업시설에 대한 신뢰를 가져왔습니다!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}대형/소형 창 크기 토글
@@ -2302,7 +2311,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}이 회사 주식의 25%를 매입할 수 없습니다...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}이 회사 주식의 25%를 매도할 수 없습니다...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% {COMPANY}의 소유)
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% {COMPANY}의 소유{}   {COMMA}% {COMPANY}의 소유)
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY}의 관리권이 {COMPANY}(으)로 넘어갔습니다!
 STR_7080_PROTECTED                                              :{WHITE}이 회사는 주식을 거래할 만큼 오래되지 않았습니다...
 
@@ -2771,6 +2779,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}신형 {STRING} 이(가) 출시되었습니다!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}폭발한 차량을 팔 수 없습니다...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}차량의 시간표를 정할 수 없습니다...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}정거장에서만 기다릴 수 있습니다.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}이 차량은 이 정거장에 서지 않습니다.
@@ -3059,7 +3069,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :{STRING}의 부적절한 파라미터: 파라미터 {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING}은/는 반드시 {STRING}이전에 불러와야 합니다.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING}은/는 반드시 {STRING}다음에 불러와야 합니다.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING}는 OpenTTD {STRING} 버전이나 그 이상이 필요합니다.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF 파일 자체는 번역용으로 디자인됨
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :NewGRF이 너무 많습니다.
 
 STR_NEWGRF_ADD                                                  :{BLACK}추가
 STR_NEWGRF_ADD_TIP                                              :{BLACK}NewGRF 파일을 목록에 추가
@@ -3268,6 +3280,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}소형맵을 현재 위치에 위치시킵니다
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}소형 공항
@@ -3374,3 +3387,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}예측
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}건설
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}목록에서 적당한 산업시설을 선택하십시오
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}고급
+STR_FACE_ADVANCED_TIP                                           :{BLACK}고급 얼굴 선택
+STR_FACE_SIMPLE                                                 :{BLACK}간단
+STR_FACE_SIMPLE_TIP                                             :{BLACK}간단한 얼굴 선택
+STR_FACE_LOAD                                                   :{BLACK}불러오기
+STR_FACE_LOAD_TIP                                               :{BLACK}즐겨찾는 얼굴 불러오기
+STR_FACE_LOAD_DONE                                              :{WHITE}당신이 즐겨찾는 얼굴을 OpenTTD 설정 파일로부터 불러왔습니다.
+STR_FACE_FACECODE                                               :{BLACK}플레이어 얼굴 없음.
+STR_FACE_FACECODE_TIP                                           :{BLACK}플레이어 얼굴 번호 보기/설정
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}플레이어 얼굴 번호 보기/설정
+STR_FACE_FACECODE_SET                                           :{WHITE}새 얼굴 번호 코드가 설정되었습니다.
+STR_FACE_FACECODE_ERR                                           :{WHITE}플레이어 얼굴 번호를 설정할 수 없습니다 - 0에서 4,294,967,295 사이의 값을 입력하십시오!
+STR_FACE_SAVE                                                   :{BLACK}저장
+STR_FACE_SAVE_TIP                                               :{BLACK}즐겨찾는 얼굴로 저장
+STR_FACE_SAVE_DONE                                              :{WHITE}이 얼굴이 OpenTTD 설정 파일에 즐겨찾는 얼굴로 저장될 것입니다.
+STR_FACE_EUROPEAN                                               :{BLACK}유럽인
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}유럽인 얼굴 선택
+STR_FACE_AFRICAN                                                :{BLACK}흑인
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}흑인 얼굴 선택
+STR_FACE_YES                                                    :예
+STR_FACE_NO                                                     :아니요
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}콧수염이나 귀걸이 착용
+STR_FACE_HAIR                                                   :머리:
+STR_FACE_HAIR_TIP                                               :{BLACK}머리 변경
+STR_FACE_EYEBROWS                                               :눈썹:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}눈썹 변경
+STR_FACE_EYECOLOUR                                              :눈동자 색:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}눈동자색 변경
+STR_FACE_GLASSES                                                :안경:
+STR_FACE_GLASSES_TIP                                            :{BLACK}안경 착용
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}안경 변경
+STR_FACE_NOSE                                                   :코:
+STR_FACE_NOSE_TIP                                               :{BLACK}코 변경
+STR_FACE_LIPS                                                   :입술:
+STR_FACE_MOUSTACHE                                              :콧수염:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}입술/콧수염 변경
+STR_FACE_CHIN                                                   :턱:
+STR_FACE_CHIN_TIP                                               :{BLACK}턱 변경
+STR_FACE_JACKET                                                 :자켓:
+STR_FACE_JACKET_TIP                                             :{BLACK}자켓 변경
+STR_FACE_COLLAR                                                 :옷깃:
+STR_FACE_COLLAR_TIP                                             :{BLACK}옷깃 변경
+STR_FACE_TIE                                                    :넥타이:
+STR_FACE_EARRING                                                :귀걸이:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}넥타이/귀걸이 변경
+########
--- a/src/lang/lithuanian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/lithuanian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -5,6 +5,8 @@
 ##case kas ko kam ka kuo kur kreip
 ##gender vyr mot
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Už žemelapio kraštų
@@ -313,6 +315,7 @@
 STR_OSNAME_MORPHOS                                              :MorphOS
 STR_OSNAME_AMIGAOS                                              :AmigaOS
 STR_OSNAME_OS2                                                  :OS/2
+STR_OSNAME_SUNOS                                                :SunOS
 
 STR_013B_OWNED_BY                                               :{WHITE}...priklauso {STRING}
 STR_013C_CARGO                                                  :{BLACK}Keliamoji galia
@@ -781,6 +784,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Mažas
 STR_02A2_MEDIUM                                                 :{BLACK}Vidutinis
 STR_02A3_LARGE                                                  :{BLACK}Didelis
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Miestas
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Išsirinkite miesto dydį
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Miesto dydis:
 
@@ -805,6 +809,7 @@
 STR_02C5_DIFFICULTY_SETTINGS                                    :Sunkumo lygio nustatymai
 STR_02C7_CONFIG_PATCHES                                         :Papildomi nustatymai
 STR_NEWGRF_SETTINGS                                             :Papild. grafikos nustatymai (NewGRF)
+STR_TRANSPARENCY_OPTIONS                                        :Permatomumo nustatymai
 STR_GAMEOPTMENU_0A                                              :
 STR_02CA_TOWN_NAMES_DISPLAYED                                   :{SETX 12}Rodyti miestų pavadinimus
 STR_02CC_STATION_NAMES_DISPLAYED                                :{SETX 12}Rodyti stotelių pavadinimus
@@ -1060,6 +1065,7 @@
 STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Pristatyti krovini stotelei tiktai tuomet, kai yra poreikis: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Leisti statyti labai ilgus tiltus: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Leisti naudoti uzduoti 'Keliauti i depa': {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE        :nėra
 STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Leisti kelias panašias pramonės įmones viename mieste: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Leisti statyti to paties tipo fabrikus arti vienas kito: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Rodyti pilna data busenos eiluteje: {ORANGE}{STRING}
@@ -1119,6 +1125,8 @@
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Visų kompanijų
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Rašyti komandai naudojant <ĮVESTI> (ENTER): {ORANGE}{STRING}
 
+
+
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maks. traukiniu vienam zaidejui: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maks. automobiliu zaidejui: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Maks. lektuvu zaidejui: {ORANGE}{STRING}
@@ -1151,6 +1159,8 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Leisti pirkti kitų kompanijų akcijas
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Tempiant, kopijuoti šviesoforus kas: {ORANGE}{STRING} langel{P į lius lių}
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatiškai pastatyti semaforus prieš: {ORANGE}{STRING}
+
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Pagrindines irankiu juostos pozicija: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Kaireje
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centruoti
@@ -1354,12 +1364,12 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Apsaugokite savo zaidima slaptazodziu, jei nenorite, kad jis butu viesai prieinamas
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Pasirinkite zemelapi:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Kuriame zemelapyje norite zaisti?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maksimalus klientu skaicius:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Pasirinkite maksimalu klientu skaiciu. Nebutinai visos jungtys turi buti uzpildytos
 STR_NETWORK_LAN                                                 :Vietinis tinklas
 STR_NETWORK_INTERNET                                            :Internetas
 STR_NETWORK_LAN_INTERNET                                        :Vietinis tinklas/ Internetas
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internetas (visiems)
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maksimalus klientu skaicius:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Pasirinkite maksimalu klientu skaiciu. Nebutinai visos jungtys turi buti uzpildytos
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Maksimum kompaniju:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Riboti serveri iki tam tikro skaiciaus kompaniju
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Maksimum ziurovu:
@@ -1878,6 +1888,9 @@
 STR_4829_REQUIRES                                               :{BLACK}Reikalauja: {YELLOW}{STRING.ko}, {STRING.ko}, {STRING.ko}
 ############ range for requires ends
 
+############ range for produces starts
+############ range for produces ends
+
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Praėjusio mėnesio produkcija:
 STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportuota)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Rodyti gamykla ekrano centre
@@ -1886,9 +1899,9 @@
 STR_482F_COST                                                   :{BLACK}Kaina: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Neimanoma cia pastatyti sio tipo pramones imones...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...miskas gali buti pasodintas tik zemiau sniego ribos
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} pranesa apie neatideliotina uzdaryma!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Tiekimo problemos vercia {INDUSTRY} paskelbti apie uzdaryma!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Medziu trukumas vercia {INDUSTRY} pasklebti apie neatideliotina uzdaryma!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} pranesa apie neatideliotina uzdaryma!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Tiekimo problemos vercia {STRING} paskelbti apie uzdaryma!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Medziu trukumas vercia {STRING} pasklebti apie neatideliotina uzdaryma!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} didina produkcijos apimtis!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}{INDUSTRY} pranesa apie rastus naujus anglies isteklius!{}Produkcija tikimasi dvigubinti!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}{INDUSTRY} pranesa apie rastus naujus anglies isteklius!{}Produkcija tikimasi dvigubinti!
@@ -2184,7 +2197,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Perkelti bustine
 STR_COMPANY_PASSWORD                                            :{BLACK}Slaptazodis
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Slaptazodis apsaugo tavo kompanija nuo neleistinu vartotoju prisijungimo.
-STR_SET_COMPANY_PASSWORD                                        :Ivesti slaptazodi
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Ivesti slaptazodi
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Pasauline krize!{}{}Ekonomikai griuvant, finansu ekspertai bijo paties blogiausio!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Krize iveikta!{}{}Prekybos pagyvejimas suteikia naujas viltis pramones imonems!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Pakeisti lango dydi
@@ -2196,7 +2209,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Negalima nusipirkti 25% sios kompanijos akciju...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Negalima parduoti 25% sios kompanijos akciju...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% priklauso {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% priklauso {COMPANY}{}   {COMMA}% priklauso {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} buvo perimta {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Si kompanija dar pernelyg jauna, kad galetu pardavineti savo akcijas...
 
@@ -2519,6 +2531,7 @@
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Važiuoti nestojant į {TOWN} traukinių depą
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Remontas nestojant {TOWN} traukiniu depe
 
+
 STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Kursas i {TOWN} depa
 STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Kursas i {TOWN} depa, {VELOCITY}
 STR_HEADING_FOR_TRAIN_DEPOT_SERVICE                             :{LTBLUE}Servisas {TOWN} Traukiniu Depe
@@ -2640,6 +2653,9 @@
 STR_TRAIN_NO_POWER                                              :{RED}Nėra energijos
 STR_TRAIN_START_NO_CATENARY                                     :Šiuose bėgiuose trūkta grandies, taigi traukiniai negali judėti
 
+
+
+
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Automobilis kelyje
 STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Automobiliai
@@ -2847,6 +2863,7 @@
 STR_GO_TO_AIRPORT_HANGAR                                        :Kursas: {STATION} angaras
 SERVICE_AT_AIRPORT_HANGAR                                       :Remontas {STATION} angare
 
+
 ##id 0xB000
 STR_B000_ZEPPELIN_DISASTER_AT                                   :{BLACK}{BIGFONT} Dirizablio katastrofa {STATION}!
 STR_B001_ROAD_VEHICLE_DESTROYED                                 :{BLACK}{BIGFONT}Automobilis sunaikintas ateiviu!
@@ -2900,6 +2917,7 @@
 STR_NEWGRF_MD5SUM                                               :{BLACK}MD5suma: {SILVER}{STRING}
 STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}Jūs norite atlikti pakeitimus veikiančiam žaidimui: OpenTTD gali pakibti.{}Ar jūs tikrai norite tai atlikti?
 
+
 STR_NEWGRF_ADD                                                  :{BLACK}Pridėti
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Pridėti Papild. grafikos failą į sąrašą
 STR_NEWGRF_REMOVE                                               :{BLACK}Pašalinti
@@ -3124,4 +3142,24 @@
 STR_MEASURE_LENGTH_HEIGHTDIFF                                   :{BLACK}Atstumas: {NUM}{}Aukščių skirtumas: {NUM} m
 STR_MEASURE_AREA_HEIGHTDIFF                                     :{BLACK}Sritis: {NUM} x {NUM}{}Aukščių skirtumas: {NUM} m
 
+############ Date formatting
+
 ########
+
+
+
+
+##### Mass Order
+
+
+
+
+
+
+#### Improved sign GUI
+
+########
+
+
+############ Face formatting
+########
--- a/src/lang/norwegian_bokmal.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/norwegian_bokmal.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1,7 +1,8 @@
 ##name Norwegian
-##ownname Norsk, bokmål
+##ownname Norsk (bokmål)
 ##isocode nb_NO
 ##plural 0
+##gender masculinum neutrium femininum
 
 #
 
@@ -594,6 +595,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Firmainformasjon
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Åpninger / Stengninger av industrier
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Økonomiske endringer
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Produksjonsendringer hos industrier som får leveranser av spilleren
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Produksjonsendringer hos industrier som får leveranser av motspiller(e)
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Andre produksjonsendringer
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Råd/informasjon om spillers kjøretøy
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nye kjøretøy
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Endringer i godtatte varer
@@ -860,6 +864,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Finansier ny industri
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan kun bygges i byer
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...kan kun bygges i regnskogområder
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...kan kun bygges i ørkenområder
@@ -926,7 +931,7 @@
 STR_CURR_SIT                                                    :Slovensk tolar (SIT)
 STR_CURR_SEK                                                    :Svensk krone (SEK)
 STR_CURR_YTL                                                    :Tyrkiske lire (YTL)
-STR_CURR_SKK                                                    :Slovakisk Koruna (SKK)
+STR_CURR_SKK                                                    :Slovakisk koruna (SKK)
 STR_CURR_BRR                                                    :Brasiliansk Real (BRL)
 
 STR_CURR_CUSTOM                                                 :Egendefinert...
@@ -1020,12 +1025,13 @@
 STR_CONFIG_PATCHES_ON                                           :På
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Vis kjøretøyets hastighet på statuslinja: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Tillat bygging på skråninger og i vannkanten: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Tillat landskapsendring under bygninger, spor, etc.: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Mer realistisk størrelse på oppfangingsområder: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Tillat riving av industri, mer vei, etc: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Tillat bygging av veldig lange tog : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REALISTICACCEL                               :{LTBLUE}Realistisk akslerasjon for tog: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Forby tog og skip mot å gjøre 90-graders svinger: {ORANGE}{STRING} {LTBLUE} (trenger NGR)
-STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}Slå sammen stasjoner som blir bygget på siden av hverandre: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Forby tog og skip å gjøre 90-graders svinger: {ORANGE}{STRING} {LTBLUE} (trenger NGR)
+STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}Slå sammen stasjoner som bygges ved siden av hverandre: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}Forlat stasjonen når én type varevogn er full, hvis 'full last' er på: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Bruk forbedret lastingsalgoritme: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GRADUAL_LOADING                              :{LTBLUE}Last kjøretøy gradvis: {ORANGE}{STRING}
@@ -1033,6 +1039,10 @@
 STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Lever varer til en stasjon bare når varen trengs: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Tillat bygging av veldig lange broer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Tillat 'gå til jernbanestall'-ordre: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD             :{LTBLUE}Konstruksjonsmetode for manuell primærindustri: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE        :ingen
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL      :som andre næringer
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :prospekterer
 STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Tillat flere like industrier i samme by: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Industrier av samme type kan bygges nær hverandre: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Vis alltid lang dato på statuslinjen: {ORANGE}{STRING}
@@ -1042,7 +1052,9 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Kjøretøykø (med kvantumseffekter): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Flytt på bildet hvis pilen er nær ytterkantene av skjermen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Tillat bestikkelser av bystyret: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ikke-ensartede stasjoner: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Tillat kjøp av eksklusive transportrettigheter: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Tillat pengeoverføring til andre firmaer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Uensartede stasjoner: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ny global rutesøking (NGR, overstyrer NTK): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Vektmultiplikator for frakt til å simulere tunge tog: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillat gjennomkjøring av stoppesteder på veier som er eid av byene: {ORANGE}{STRING}
@@ -1058,19 +1070,19 @@
 STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Advar hvis et tog går i underskudd: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}Kjøretøy utgår aldri: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}Bytt automatisk ut kjøretøy når det blir gammelt:
-STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Autoforny når kjøretøy er {ORANGE}{STRING}{LTBLUE} måneder før/etter maks alder
+STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Autoforny når kjøretøy er {ORANGE}{STRING}{LTBLUE}{NBSP}måneder før/etter maks alder
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Autoforny minimum penger trengst for fornying: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Varighet til feilmelding: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Vis byers befolkning i tittel: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Vis byers folketall i tittel: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Usynlige trær (med gjennomsiktige bygninger): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Landskapsgenerator: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Orginal
 STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS                 :TerraGenesis
-STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Maksimum avstand fra kartkant for oljerafinerier {ORANGE}{STRING}
+STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Maks. avstand fra kartkant for oljeraffinerier: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SNOWLINE_HEIGHT                              :{LTBLUE}Snøhøyde: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}Ulendthet på terreng (kun TerraGenesis): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Veldig levnt
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Veldig jevnt
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_SMOOTH                  :Jevnt
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_ROUGH                   :Ulendt
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_ROUGH              :Veldig ulendt
@@ -1084,10 +1096,11 @@
 STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT                         :{LTBLUE}Høyden et flatt scenariokart får: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}Maks stasjonspedning: {ORANGE}{STRING} {RED}Advarsel: Høy instilling gir tregere spill
-STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Utfør vedlikehold på helikopter automatisk på helikopterlandingsteder: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Automatisk vedlikehold ved helikopterlandingsteder: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Koble landskapsverktøylinja til tog-/vei-/vann- og flyplassverktøylinjene: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Ved rulling med musen, flytt synsvinkelen i den motsatte retning: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Vis et målings-verktøytips når forskjellige "build-tools" brukes: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Myk scrolling i ekstravindu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Vis målingsverktøy ved bruk av byggingsverktøy: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Vis firmaovertakelser: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Ingen
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Eget firma
@@ -1098,9 +1111,33 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Rull kartet
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Av
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Rullehjulets hastighet på kartet: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Høyreklikkemulasjon: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Kommando-klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Ctrl-klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Av
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Pause automatisk ved start av nytt spill: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Bruk den avanserte kjøretøyslisten: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Av
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Eget firma
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Alle firmaer
+STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Bruk lastindikatorer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Av
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Eget firma
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Alle firmaer
+STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Slå på tidstabeller for kjøretøyer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Vis tidstabell i antall tikk heller enn i dager: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Standard jernbanetype: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Vanlig jernbane
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Elektrisk jernbane
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Énskinnebane
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV                     :Maglev
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :Først tilgjengelig
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Sist tilgjengelig
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :Mest brukt
 
+STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Vis byggingsverktøy når det ikke er noen tilgjengelige kjøretøy: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maks antall tog per spiller: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maks antall kjøretøy per spiller: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Maks antall fly per spiller: {ORANGE}{STRING}
@@ -1111,8 +1148,8 @@
 STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}Hindre datamaskinen i å bygge fly: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}Hindre datamaskinen i å bygge skip: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Aktiver ny AI (alfa): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Tillat AI-spillere i flerspillermodus (eksperimentelt): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Aktiver ny kunstig intelligens (alfa): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Tillat ny kunstig intelligens i flerspillermodus (eksperimentelt): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Standard vedlikeholdsintervall for tog: {ORANGE}{STRING} dager
 STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Standard vedlikeholdsintervall for tog: {ORANGE}deaktivert
@@ -1130,15 +1167,17 @@
 STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}Start spillet i år: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ENDING_YEAR                                  :{LTBLUE}Spillet slutter {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}Jevn økonomi (flere mindre endringer)
-STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Tillat kjøping av aksjer i andre selskaper
-STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Ved opptrekking plasser signal hver: {ORANGE}{STRING} rute(r)
+STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Tillat aksjekjøp i andre selskaper
+STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Ved dra-og-slipp, plasser signal på hver {ORANGE}{STRING}. rute
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Bygg signalsystem med mast automatisk før: {ORANGE}{STRING}
 
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Byutlegget «ingen flere veier» er ikke gyldig i scenariobyggeren
 STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Velg byvei-layout: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :ingen flere veier
 STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :default
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :bedre veier
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 rutenett
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3-rutenett
 
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Plassering av hovedverktøylinje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Venstre
@@ -1155,6 +1194,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Andel tettsteder som kommer til å bli byer: {ORANGE}1 av {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Andel tettsted som kommer til å bli byer: {ORANGE}Ingen
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Innledende bystørrelse multiplikator: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Fjern absurde veielementer under veikonstruksjon
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Grensesnitt
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruksjon
@@ -1168,7 +1208,7 @@
 STR_CONFIG_PATCHES_CURRENCY                                     :{CURRENCY}
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Endre innstillingsverdi
-STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Noen eller alle av standard vedlikeholdsintervall(ene) under er inkompatible med valgte instillinger! 5-90 % og 30-800 dager er gyldige
+STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Noen eller alle av standard vedlikeholdsintervall(ene) under er inkompatible med valgte instillinger! 5-90{NBSP}% og 30-800 dager er gyldige
 STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Skip skal bruke YAPF: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Kjøretøy skal bruke YAPF: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Tog skal bruke YAPF: {ORANGE}{STRING}
@@ -1243,6 +1283,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...bøye er i bruk!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Koordinater: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Kan ikke fjerne del av stasjonen...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Kan ikke konvertere jernbanetype her...
@@ -1282,8 +1323,8 @@
 STR_CONSTRUCT_SUGAR_MINE_TIP                                    :{BLACK}Bygg sukkergruve
 
 STR_INDUSTRYDIR_CAPTION                                         :{WHITE}Industrier
-STR_INDUSTRYDIR_ITEM                                            :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}){YELLOW} ({COMMA} % transportert)
-STR_INDUSTRYDIR_ITEM_TWO                                        :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}/{CARGO}){YELLOW} ({COMMA} %/{COMMA} % transportert)
+STR_INDUSTRYDIR_ITEM                                            :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}){YELLOW} ({COMMA}{NBSP}% transportert)
+STR_INDUSTRYDIR_ITEM_TWO                                        :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}/{CARGO}){YELLOW} ({COMMA}{NBSP}%/{COMMA}{NBSP}% transportert)
 STR_INDUSTRYDIR_ITEM_NOPROD                                     :{ORANGE}{INDUSTRY}
 
 STR_INDUSTRY_TOO_CLOSE                                          :{WHITE}...for nært en annen industri
@@ -1293,7 +1334,7 @@
 STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Velg hvilken last lokomotivet skal ta
 STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED                             :{BLACK}Bygg om lokomotivet til å frakte den valgte varetypen
 STR_RAIL_CAN_T_REFIT_VEHICLE                                    :{WHITE}Kan ikke bygge om lokomotiv...
-STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Vedlikeholdsintervaller er i prosent: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Vedlikeholdsintervaller i prosent: {ORANGE}{STRING}
 STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Endre produksjon
 
 TEMP_AI_IN_PROGRESS                                             :{WHITE}Velkommen til denne nye AI, under konstruksjon. Du kan vente deg problemer. Når du finner ett problem, lag ett skjermbilde av det og post det i forumet. Mor deg!
@@ -1353,18 +1394,23 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Beskytt ditt spill med et passord hvis du ikke vil at hvem som helst skal bli med på det
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Velg et kart:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Hvilket kart vil du spille?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maksimalt antall tillatte klienter
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Velg maksimalt antall klienter. Alle plassene trenger ikke bli tatt.
+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 "" er}
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maksimalt antall tillatte klienter
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Velg maksimalt antall klienter. Alle plassene trenger ikke bli tatt.
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} firma{P "" er}
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Maks. antall firmaer:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Begrens tjeneren til et bestemt antall firmaer
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} tilskuer{P "" e}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Maks antall tilskuere
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Begrens tjeneren til et bestemt antall tilskuere
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Språk snakket på tjeneren:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Andre spillere skal kunne vite hvilket språk man snakker på denne tjeneren.
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}Start spill
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Start et nytt nettverksspill fra en tilfeldig bane, eller scenario
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Last spill
@@ -1375,12 +1421,20 @@
 STR_NETWORK_LANG_ENGLISH                                        :Engelsk
 STR_NETWORK_LANG_GERMAN                                         :Tysk
 STR_NETWORK_LANG_FRENCH                                         :Fransk
+STR_NETWORK_LANG_BRAZILIAN                                      :Brasiliansk
+STR_NETWORK_LANG_BULGARIAN                                      :Bulgarsk
+STR_NETWORK_LANG_CHINESE                                        :Kinesisk
+STR_NETWORK_LANG_CZECH                                          :Tsjekkisk
+STR_NETWORK_LANG_DANISH                                         :Dansk
+STR_NETWORK_LANG_DUTCH                                          :Nederlandsk
+STR_NETWORK_LANG_ESPERANTO                                      :Esperanto
 STR_NETWORK_LANG_FINNISH                                        :Finsk
 STR_NETWORK_LANG_HUNGARIAN                                      :Ungarsk
 STR_NETWORK_LANG_ICELANDIC                                      :Islandsk
 STR_NETWORK_LANG_ITALIAN                                        :Italiensk
 STR_NETWORK_LANG_JAPANESE                                       :Japanesisk
 STR_NETWORK_LANG_KOREAN                                         :Koreansk
+STR_NETWORK_LANG_LITHUANIAN                                     :Litauisk
 STR_NETWORK_LANG_NORWEGIAN                                      :Norsk
 STR_NETWORK_LANG_POLISH                                         :Polsk
 STR_NETWORK_LANG_PORTUGUESE                                     :Portugisisk
@@ -1584,9 +1638,13 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Jernbanespor med normale signaler
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Jernbanespor med for-signaler
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Jernbanespor med forlat-signaler
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Jernbanespor med kombosignaler
 STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Togbane med normale og pre-signaler
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Togbane med normale og utgangs-signaler
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Jernbanespor med normale og kombosignaler
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Togbane med pre- og utgangs-signaler
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Jernbanespor med pre- og kombosignaler
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Jernbanespor med utgangs- og kombosignaler
 STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Må fjerne togbanestasjon først
 
 
@@ -1595,22 +1653,42 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Må fjerne vei først
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Veiarbeid i gang
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Bygg vei
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Trikkekonstruksjon
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Velg brotype
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... enveiskjørte veier kan ikke ha kryss
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Kan ikke bygge vei her
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Kan ikke bygge trikkespor her...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Kan ikke fjerne vei herfra...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Kan ikke fjerne trikkespor herfra...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Retning for garasje
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Trikkestallretning
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Kan ikke bygge garasje her...
-STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Kan ikke bygge busstatsjon...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Kan ikke bygge trikkestall her...
+STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Kan ikke bygge busstasjon...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Kan ikke bygge lasteterminal...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Kan ikke bygge trikkestasjon for passasjerer...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Kan ikke bygge trikkestasjon for frakt...
 STR_180A_ROAD_CONSTRUCTION                                      :Bygg vei
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Trikkesporkonstruksjon
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Bygg vei
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Bygg veiseksjon ved bruk av autovei-modusen
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Bygg trikkestasjon
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Bygg trikkespor ved bruk av autotrikkespor-modusen
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Bygg garasje (trengs for bygging og vedlikehold av kjøretøy)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Bygg trikkevognstall (for kjøp og vedlikehold av kjøretøy)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Bygg bussstasjon
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Bygg lasteterminal
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Bygg trikkestasjon for passasjerer
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Bygg trikkestasjon for frakt
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Bygg bro
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Bygg bro for trikkespor
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Bygg tunnel
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Bygg tunnel for trikkespor
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Aktiver/deaktiver énveiskjørte veier
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Velg mellom bygging/fjerning for veibygging
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Velg mellom bygging/fjerning for trikkesporkonstruksjon
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Velg garasjens retning
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Velg trikkestallens retning
 STR_1814_ROAD                                                   :Vei
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Vei med gatelykter
 STR_1816_TREE_LINED_ROAD                                        :Aveny
@@ -1618,6 +1696,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Jernbaneovergang
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Kan ikke fjerne busstasjonen...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Kan ikke fjerne godsstasjonen...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Kan ikke fjerne trikkestasjon for passasjerer...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Kan ikke fjerne trikkestasjon for frakt...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Byer
@@ -1626,6 +1706,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Bygningen må rives først
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Innbyggertall: {ORANGE}{COMMA}{BLACK}  Antall hus: {ORANGE}{COMMA}
@@ -1660,19 +1741,19 @@
 STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}Vurdering av transportfirma:
 STR_2024                                                        :{YELLOW}{COMPANY} {COMPANYNUM}: {ORANGE}{STRING}
 STR_2025_SUBSIDIES                                              :{WHITE}Subsidier
-STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}Tilbudte subsidier:
+STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}Subsidietilbud:
 STR_2027_FROM_TO                                                :{ORANGE}{STRING} fra {STRING} til {STRING}
 STR_2028_BY                                                     :{YELLOW} (innen {DATE_SHORT})
 STR_202A_NONE                                                   :{ORANGE}Ingen
-STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}Tjenester som allerede er subsidiert:
+STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}Tjenester som allerede subsidieres:
 STR_202C_FROM_TO                                                :{ORANGE}{STRING} fra {STATION} til {STATION}{YELLOW} ({COMPANY}
 STR_202D_UNTIL                                                  :{YELLOW}, inntil {DATE_SHORT})
-STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Tilbud om subsidie har gått ut:{}{}{STRING} fra {STRING} til {STRING} vil ikke lenger være subsidiert.
-STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}Subsidie trukket tilbake:{}{}Transport av {STRING} fra {STATION} til {STATION} er ikke lenger subsidiert.
-STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Subsidie-tilbud:{}{}Første transport av {STRING} fra {STRING} til {STRING} vil være subsidiert i et år av bystyret!
-STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsidie gitt til {COMPANY}!{}{}Transport av {STRING} fra {STATION} til {STATION} vil gi 50% mer inntekt i løpet av ett år!
+STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Subsidietilbud har gått ut:{}{}{STRING} fra {STRING} til {STRING} vil ikke lenger gi subsidier.
+STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}Subsidie trukket tilbake:{}{}Frakt av {STRING} fra {STATION} til {STATION} subsidieres ikke lenger.
+STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Subsidietilbud:{}{}Første frakt av {STRING} fra {STRING} til {STRING} vil subsidieres i et år av bystyret!
+STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsidie gitt til {COMPANY}!{}{}Transport av {STRING} fra {STATION} til {STATION} vil gi 50{NBSP}% mer inntekt i løpet av ett år!
 STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsidie gitt til {COMPANY}!{}{}Transport av {STRING} fra {STATION} til {STATION} vil gi dobbelt så mye inntekt i løpet av et år!
-STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsidie gitt til {COMPANY}!{}{}Transport av {STRING} fra {STATION} til {STATION} vil gi tippelt så mye inntekt i løpet av et år!
+STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsidie gitt til {COMPANY}!{}{}Frakt av {STRING} fra {STATION} til {STATION} vil gi trippel betaling i løpet i ett år fra nå!
 STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsidie gitt til {COMPANY}!{}{}Transport av {STRING} fra {STATION} til {STATION} vil gi fire ganger så mye inntekt i løpet av et år!
 STR_2035_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN}s bystyre tillater ikke flere flyplasser i denne byen
 STR_2036_COTTAGES                                               :Hytter
@@ -1775,15 +1856,19 @@
 STR_303C_OUTSTANDING                                            :Fremragende
 ############ range for rating ends
 
-STR_303D                                                        :{WHITE}{STRING}: {YELLOW}{STRING} ({COMMA}%)
+STR_303D                                                        :{WHITE}{STRING}: {YELLOW}{STRING} ({COMMA}{NBSP}%)
 STR_303E_NO_LONGER_ACCEPTS                                      :{WHITE}{STATION} godtar ikke lenger {STRING}
 STR_303F_NO_LONGER_ACCEPTS_OR                                   :{WHITE}{STATION} godtar ikke lenger {STRING} eller {STRING}
 STR_3040_NOW_ACCEPTS                                            :{WHITE}{STATION} godtar nå {STRING}
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} godtar nå {STRING} og {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Retning på bussterminal
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Retning på lasteterminal
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Retning for passasjertrikk
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Retning for frakttrikk
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Må rive bussterminal først
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Må rive lasteterminal først
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Må fjerne trikkestasjon for passasjerer først
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Må fjerne trikkestasjon for frakt først
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Stasjoner
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Ingen -
@@ -1795,6 +1880,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Velg hvor lang stasjonen skal være
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Velg retning på bussterminal
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Velg retning på lasteterminal
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Velg retning på trikkestasjon for passasjerer
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Velg retning på trikkestasjon for frakt
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Sentrer bildet på stasjonen
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Vis stasjonsvurdering
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Endre navnet til stasjonen
@@ -1816,7 +1903,7 @@
 STR_3069_BUOY                                                   :Bøye
 STR_306A_BUOY_IN_THE_WAY                                        :{WHITE}...bøyen er i veien
 STR_306C_STATION_TOO_SPREAD_OUT                                 :{WHITE}...stasjonen er spredd for mye
-STR_306D_NONUNIFORM_STATIONS_DISALLOWED                         :{WHITE}...ikke-ensartede stasjoner deaktivert
+STR_306D_NONUNIFORM_STATIONS_DISALLOWED                         :{WHITE}...uensartede stasjoner deaktivert
 STR_USE_CTRL_TO_SELECT_MORE                                     :{BLACK}Hold nede CTRL for å velge mer en en ting
 
 STR_UNDEFINED                                                   :(udefinert streng)
@@ -1832,6 +1919,7 @@
 STR_3805_COAST_OR_RIVERBANK                                     :Kyst eller elvebredd
 STR_3806_SHIP_DEPOT                                             :Skipsdepot
 STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...Kan ikke bygge på vann
+STR_MUST_DEMOLISH_CANAL_FIRST                                   :{WHITE}Må fjerne kanal først
 
 ##id 0x4000
 STR_4000_SAVE_GAME                                              :{WHITE}Lagre spill
@@ -1844,6 +1932,9 @@
 STR_4007_GAME_SAVE_FAILED                                       :{WHITE}Lagring av spillet mislyktes{}{STRING}
 STR_4008_UNABLE_TO_DELETE_FILE                                  :{WHITE}Kan ikke slette fil
 STR_4009_GAME_LOAD_FAILED                                       :{WHITE}Feil ved fremhenting av spill{}{STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR                   :Intern feil: {STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME                         :Ødelagt lagret spill - {STRING}
+STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME                        :Spillet er lagret i en nyere versjon
 STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE                       :Kan ikke lese filen
 STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE                      :Kan ikke skrive til filen
 STR_400A_LIST_OF_DRIVES_DIRECTORIES                             :{BLACK}Liste over disker, mapper og lagrede spill
@@ -1902,26 +1993,33 @@
 STR_4829_REQUIRES                                               :{BLACK}Trenger: {YELLOW}{STRING}, {STRING}, {STRING}
 ############ range for requires ends
 
+############ range for produces starts
+STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Gods som venter på behandling:
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produserer: {YELLOW}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produserer: {YELLOW}{STRING}, {STRING}
+############ range for produces ends
+
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produksjon forrige måned:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA} % transportert)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}{NBSP}% transportert)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Sentrer bildet på industriområdet
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ny {STRING} under bygging i nærheten av {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ny {STRING} plantes i nærheten av {TOWN}!
 STR_482F_COST                                                   :{BLACK}Koster: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Kan ikke bygge denne typen industri her...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...skog kan bare plantes over snøgrensen
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} offentliggjør umiddelbar nedleggelse!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Leveringsproblemer forårsaker {INDUSTRY} til å offentliggjøre umiddelbar nedleggelse!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Mangel på trær i nærheten får {INDUSTRY} til å offentliggjøre umiddelbar nedleggelse!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} legger ned!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{STRING} legger ned etter leveringsproblemer
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}{STRING} legger ned grunnet tremangel
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} øker produksjonen!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Ny kullåre funnet i {INDUSTRY}!{}En dobling i produksjonen er ventet!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nye oljereserver funnet i {INDUSTRY}!{}En dobling i produksjonen er ventet!
 STR_4838_IMPROVED_FARMING_METHODS                               :{BLACK}{BIGFONT}Forbedring i gårdbruksmetoder på {INDUSTRY} er forventet å doble produksjonen!
-STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}{INDUSTRY} sin produksjon har sunket med 50 %
-STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}Insektinvasjon på {INDUSTRY}!{}Produksjonen synker med 50 %
+STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}{INDUSTRY} sin produksjon har sunket med 50{NBSP}%
+STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}Insektinvasjon på {INDUSTRY}!{}Produksjonen synker med 50{NBSP}%
 STR_483B_CAN_ONLY_BE_POSITIONED                                 :{WHITE}...kan kun plasseres i nærheten av kartkanten
-STR_INDUSTRY_PROD_GOUP                                          :{BLACK}{BIGFONT}Produksjonen av {STRING} ved {INDUSTRY} øker med {COMMA} %!
-STR_INDUSTRY_PROD_GODOWN                                        :{BLACK}{BIGFONT}Produksjonen av {STRING} ved {INDUSTRY} synker med {COMMA} %!
+STR_INDUSTRY_PROD_GOUP                                          :{BLACK}{BIGFONT}{STRING}produksjon ved {INDUSTRY} øker med {COMMA}{NBSP}%!
+STR_INDUSTRY_PROD_GODOWN                                        :{BLACK}{BIGFONT}{STRING}produksjon ved {INDUSTRY} synker med {COMMA}{NBSP}%!
 
 ##id 0x5000
 STR_5000_TRAIN_IN_TUNNEL                                        :{WHITE}Tog i tunnelen
@@ -1931,6 +2029,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Broender er ikke på samme nivå
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Broen er for lav for terrenget
 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}
@@ -2036,7 +2136,7 @@
 STR_6807_NO_OF_TOWNS                                            :{LTBLUE}Antall byer: {ORANGE}{STRING}
 STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}Antall industrier: {ORANGE}{STRING}
 STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}Maksimalt startlån: {ORANGE}{CURRENCY}
-STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}Startrente: {ORANGE}{COMMA}%
+STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}Startrente: {ORANGE}{COMMA}{NBSP}%
 STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Driftskostnader for kjøretøy: {ORANGE}{STRING}
 STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}Konstruksjonshastighet hos konkurrenter: {ORANGE}{STRING}
 STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}Konkurrentenes intelligens: {ORANGE}{STRING}
@@ -2064,9 +2164,9 @@
 STR_681E_FAST                                                   :Rask
 STR_681F_VERY_FAST                                              :Veldig rask
 STR_VERY_LOW                                                    :Veldig lavt
-STR_6820_LOW                                                    :Lavt
+STR_6820_LOW                                                    :Lav
 STR_6821_MEDIUM                                                 :Middels
-STR_6822_HIGH                                                   :Høyt
+STR_6822_HIGH                                                   :Høy
 STR_6823_NONE                                                   :Ingen
 STR_6824_REDUCED                                                :Redusert
 STR_6825_NORMAL                                                 :Normalt
@@ -2081,9 +2181,9 @@
 STR_682E_STEADY                                                 :Stødig
 STR_682F_FLUCTUATING                                            :Flytende
 STR_6830_IMMEDIATE                                              :Øyeblikkelig
-STR_6831_3_MONTHS_AFTER_PLAYER                                  :3 måneder etter spiller
-STR_6832_6_MONTHS_AFTER_PLAYER                                  :6 måneder etter spiller
-STR_6833_9_MONTHS_AFTER_PLAYER                                  :9 måneder etter spiller
+STR_6831_3_MONTHS_AFTER_PLAYER                                  :3{NBSP}måneder etter spiller
+STR_6832_6_MONTHS_AFTER_PLAYER                                  :6{NBSP}måneder etter spiller
+STR_6833_9_MONTHS_AFTER_PLAYER                                  :9{NBSP}måneder etter spiller
 STR_6834_AT_END_OF_LINE_AND_AT_STATIONS                         :Ved linjeslutt og på stasjoner
 STR_6835_AT_END_OF_LINE_ONLY                                    :Bare ved linjeslutt
 STR_6836_OFF                                                    :Av
@@ -2204,25 +2304,24 @@
 STR_706E_TYCOON                                                 :Finansfyrste
 STR_706F_BUILD_HQ                                               :{BLACK}Bygg hovedkontor
 STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}Bygg firmaets hovedkontor/se firmaets hovedkontor
-STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}Gjenoppbygg spelskapets hovedkvarter en annen plass for 1 % av selskapsverdien
+STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}Gjenoppbygg spelskapets hovedkvarter en annen plass for 1{NBSP}% av selskapsverdien
 STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Kan ikke bygge hovedkontor...
 STR_7072_VIEW_HQ                                                :{BLACK}Se hovedkontor
 STR_RELOCATE_HQ                                                 :{BLACK}Omplasser hovedkvarter
 STR_COMPANY_PASSWORD                                            :{BLACK}Passord
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Passordbeskytt ditt firma for å forhindre uautoriserte brukere fra å bli med. Bruk '*' for å tømme passord.
-STR_SET_COMPANY_PASSWORD                                        :Velg firmapassord
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Velg firmapassord
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Verdenskrise!{}{}Økonomer frykter det verste. Nedgangstider i møte.
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Verdenskrise over!{}{}Opptur i markedet gir industrien selvsikkerheten tilbake.
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Bytte mellom stor/liten vindustørrelse
 STR_7076_COMPANY_VALUE                                          :{GOLD}Firmaverdi: {WHITE}{CURRENCY}
-STR_7077_BUY_25_SHARE_IN_COMPANY                                :{BLACK}Kjøp 25 % av aksjene i firmaet
-STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}Selg 25 % av aksjene du eier
-STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}Kjøp 25 % av aksjene i firmaet
-STR_707A_SELL_25_SHARE_IN_THIS_COMPANY                          :{BLACK}Selg 25% av aksjene du eier
-STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Kan ikke kjøpe 25 % av aksjene...
-STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Kan ikke selge 25 % av aksjene...
-STR_707D_OWNED_BY                                               :{WHITE}({COMMA} % eies av {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA} % eies av {COMPANY}{}   {COMMA} % eies av {COMPANY})
+STR_7077_BUY_25_SHARE_IN_COMPANY                                :{BLACK}Kjøp 25{NBSP}% av aksjene i firmaet
+STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}Selg 25{NBSP}% av aksjene du eier
+STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}Kjøp 25{NBSP}% av aksjene i firmaet
+STR_707A_SELL_25_SHARE_IN_THIS_COMPANY                          :{BLACK}Selg 25{NBSP}% av aksjene du eier
+STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Kan ikke kjøpe 25{NBSP}% av aksjene...
+STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Kan ikke selge 25{NBSP}% av aksjene...
+STR_707D_OWNED_BY                                               :{WHITE}({COMMA}{NBSP}% eies av {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} har blitt kjøpt opp av {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Dette selskapet selger ikke aksjer enda...
 
@@ -2245,6 +2344,8 @@
 STR_LIVERY_HELICOPTER                                           :Helikopter
 STR_LIVERY_SMALL_PLANE                                          :Lite fly
 STR_LIVERY_LARGE_PLANE                                          :Stort fly
+STR_LIVERY_PASSENGER_TRAM                                       :Passasjertrikk
+STR_LIVERY_FREIGHT_TRAM                                         :Frakttrikk
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Vis generelle fargetemaer
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Vis togfargetemaer
@@ -2546,7 +2647,11 @@
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Vedlikehold (uten å stoppe) ved {TOWN} togstall
 
 STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
+STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Reise (uten tidstabell)
+STR_TIMETABLE_TRAVEL_FOR                                        :Reise for {STRING}
+STR_TIMETABLE_STAY_FOR                                          :og bli værende i {STRING}
 STR_TIMETABLE_DAYS                                              :{COMMA} dag{P "" s}
+STR_TIMETABLE_TICKS                                             :{COMMA} tikk
 
 STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Er på vei til {TOWN} togstall
 STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Er på vei til {TOWN} togstall, {VELOCITY}
@@ -2590,6 +2695,7 @@
 STR_REFIT_TIP                                                   :{BLACK}Velg varetypen det skal endres til. CTRL-klikk for å omgjøre.
 STR_REFIT_ORDER                                                 :(Bygg om til {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Tidstabell
+STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Bytt til tidstabellvisning
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordre)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Slutt på ordre - -
 STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
@@ -2615,8 +2721,8 @@
 STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Kan ikke selge jernbanekjøretøy...
 STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Kan ikke finne en togstall i nærheten
 STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Kan ikke stoppe/starte tog...
-STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Vedlikeholdsintervall: {LTBLUE}{COMMA}dager{BLACK}   Forrige vedlikehold: {LTBLUE}{DATE_LONG}
-STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Vedlikeholdsintervall: {LTBLUE}{COMMA} %{BLACK}   Forrige vedlikehold: {LTBLUE}{DATE_LONG}
+STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Vedlikeholdsintervall: {LTBLUE}{COMMA}{NBSP}dager{BLACK}   Forrige vedlikehold: {LTBLUE}{DATE_LONG}
+STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Vedlikeholdsintervall: {LTBLUE}{COMMA}{NBSP}%{BLACK}   Forrige vedlikehold: {LTBLUE}{DATE_LONG}
 STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Tog - trykk på tog for mer informasjon
 STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Bygg nye tog (trenger en togstall)
 STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Tog - trykk på tog for mer info. Dra vogn for å legge til/fjerne fra tog
@@ -2640,11 +2746,16 @@
 STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Vis kapasiteten til vognene
 STR_8852_SHOW_TOTAL_CARGO                                       :{BLACK}Vis en total kapasitet på togene oppdelt etter godstype
 STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Ordreliste - trykk på en ordre for å velge den
+STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}Hopp over den nåværende ordren og begynn på neste. CTRL + klikk hopper fram til valgte ordre
 STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}Slett den valgte ordren
 STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Gjør den valgte ordren om til en
 STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Sett inn en ordre før den valgte ordren, eller i slutten av listen.
 STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Fyll alltid kjøretøyet ved valgte stasjon
 STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Tøm alltid kjøretøyet ved valgte stasjon
+STR_TIMETABLE_TOOLTIP                                           :{BLACK}Tidstabell - klikk en ordre for å merke den.
+STR_TIMETABLE_WAIT_TIME_TOOLTIP                                 :{BLACK}Endre varigheten for valgte ordre
+STR_TIMETABLE_CLEAR_TIME_TOOLTIP                                :{BLACK}Fjern varigheten for valgte ordre
+STR_TIMETABLE_RESET_LATENESS_TOOLTIP                            :{BLACK}Nullstill senhetstelleren slik at kjøretøyet ankommer i tide
 STR_SERVICE_HINT                                                :{BLACK}Hopp over ordren med mindre vedlikehold trengs.
 STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Koster: {CURRENCY} Vekt: {WEIGHT_S}{}Fart: {VELOCITY}  Kraft: {POWER}{}Driftkostnader: {CURRENCY}/år{}Kapasitet: {CARGO}
 STR_885C_BROKEN_DOWN                                            :{RED}Havarert
@@ -2652,7 +2763,7 @@
 STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}Vekt: {LTBLUE}{WEIGHT_S}  {BLACK}Kraft: {LTBLUE}{POWER}{BLACK} Maks. fart: {LTBLUE}{VELOCITY}
 STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}Vekt: {LTBLUE}{WEIGHT_S} {BLACK}Kraft: {LTBLUE}{POWER}{BLACK} Høyeste fart: {LTBLUE}{VELOCITY} {BLACK}Høyeste hastighet.: {LTBLUE}{FORCE}
 STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Inntekt i år: {LTBLUE}{CURRENCY}  (sist år: {CURRENCY})
-STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pålitelighet: {LTBLUE}{COMMA} %  {BLACK}Havarier siden forrige vedlikehold: {LTBLUE}{COMMA}
+STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pålitelighet: {LTBLUE}{COMMA}{NBSP}%  {BLACK}Havarier siden forrige vedlikehold: {LTBLUE}{COMMA}
 STR_8861_STOPPED                                                :{RED}Stoppet
 STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}Kan ikke tvinge tog til å kjøre på rødt lys ved fare...
 STR_8863_CRASHED                                                :{RED}Krasjet
@@ -2666,6 +2777,8 @@
 STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Kan ikke gi tog/vogn nytt navn...
 STR_886D_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Få den merkede ordren til å tvinge kjøretøyet til å dumpe lasten
 STR_886F_TRANSFER                                               :{BLACK}Overfør
+STR_CLEAR_TIME                                                  :{BLACK}Nullstill tid
+STR_RESET_LATENESS                                              :{BLACK}Nullstill senhetsteller
 
 STR_TRAIN_STOPPING                                              :{RED}Stopper
 STR_TRAIN_STOPPING_VEL                                          :{RED}Stopper, {VELOCITY}
@@ -2677,13 +2790,19 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Ny {STRING} Nå tilgjengelig!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Kan ikke selge ødelagt kjøretøy...
+
+STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Kan ikke gi kjøretøy tidstabell...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Kjøretøy kan bare vente på stasjoner.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Dette kjøretøyet stopper ikke på denne stasjonen.
 STR_TIMETABLE_CHANGE_TIME                                       :{BLACK}Skift Tid
 STR_TIMETABLE_STATUS_ON_TIME                                    :Dette kjøretøyet går på tid
 STR_TIMETABLE_STATUS_LATE                                       :Dette kjøretøyet er {STRING} for sent ute
 STR_TIMETABLE_STATUS_EARLY                                      :Dette kjøretøyet er {STRING} for tidlig ute
+STR_TIMETABLE_TOTAL_TIME                                        :Det vil ta {STRING} å fullføre tidstabellen
+STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :Det vil ta minst {STRING} å fullføre denne tidstabellen (tidstabell ikke fullstendig)
 STR_TIMETABLE_AUTOFILL                                          :{BLACK}Fyll automatisk
+STR_TIMETABLE_AUTOFILL_TOOLTIP                                  :{BLACK}Fyll tidstabellen automatisk med verdiene fra forrige tur
 
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Kjøretøy i veien
@@ -2698,7 +2817,7 @@
 STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}Alder: {LTBLUE}{STRING}{BLACK}   Driftkostnader: {LTBLUE}{CURRENCY}/år
 STR_900E_MAX_SPEED                                              :{BLACK}Maks. fart: {LTBLUE}{VELOCITY}
 STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Inntekt i år: {LTBLUE}{CURRENCY}  (sist år: {CURRENCY})
-STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pålitelighet: {LTBLUE}{COMMA} %  {BLACK}Havarier siden forrige vedlikehold: {LTBLUE}{COMMA}
+STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pålitelighet: {LTBLUE}{COMMA}{NBSP}%  {BLACK}Havarier siden forrige vedlikehold: {LTBLUE}{COMMA}
 STR_9011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Bygget: {LTBLUE}{NUM}{BLACK} Verdi: {LTBLUE}{CURRENCY}
 STR_9012_CAPACITY                                               :{BLACK}Kapasitet: {LTBLUE}{CARGO}
 STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...må være stoppet i en garasje
@@ -2734,6 +2853,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Navngi kjøretøy
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Innbyggerne jubler . . .{}Første buss ankommer {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Innbyggerne jubler . . .{}Første lastebil ankommer {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Borgerne jubler . . .{}Første passasjertrikk ankommer {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Borgerne jubler . . .{}Første frakttrikk ankommer {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Kollisjon!{}Sjåfør dør etter kollisjon med tog
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Kollisjon!{}{COMMA} dør etter kollisjon med tog
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Kan ikke snu...
@@ -2772,7 +2893,7 @@
 STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}Alder: {LTBLUE}{STRING}{BLACK}   Driftkostnader: {LTBLUE}{CURRENCY}/år
 STR_9813_MAX_SPEED                                              :{BLACK}Maks. fart: {LTBLUE}{VELOCITY}
 STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Inntekt i år: {LTBLUE}{CURRENCY}  (sist år: {CURRENCY})
-STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pålitelighet: {LTBLUE}{COMMA} %  {BLACK}Havarier siden forrige vedlikehold: {LTBLUE}{COMMA}
+STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pålitelighet: {LTBLUE}{COMMA}{NBSP}%  {BLACK}Havarier siden forrige vedlikehold: {LTBLUE}{COMMA}
 STR_9816_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Bygget: {LTBLUE}{NUM}{BLACK} Verdi: {LTBLUE}{CURRENCY}
 STR_9817_CAPACITY                                               :{BLACK}Kapasitet: {LTBLUE}{CARGO}
 STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}Kan ikke starte/stoppe skip...
@@ -2840,7 +2961,7 @@
 STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}Alder: {LTBLUE}{STRING}{BLACK}   Driftkostnader: {LTBLUE}{CURRENCY}/år
 STR_A00E_MAX_SPEED                                              :{BLACK}Maks. fart: {LTBLUE}{VELOCITY}
 STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Inntekt i år: {LTBLUE}{CURRENCY}  (forrige år: {CURRENCY})
-STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pålitelighet: {LTBLUE}{COMMA} %  {BLACK}Havarier siden forrige vedlikehold: {LTBLUE}{COMMA}
+STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Pålitelighet: {LTBLUE}{COMMA}{NBSP}%  {BLACK}Havarier siden forrige vedlikehold: {LTBLUE}{COMMA}
 STR_A011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Bygget: {LTBLUE}{NUM}{BLACK} Verdi: {LTBLUE}{CURRENCY}
 STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Kan ikke sende fly til hangar...
 STR_HEADING_FOR_HANGAR                                          :{ORANGE}Er på vei til {STATION} hangar
@@ -2913,7 +3034,7 @@
 STR_PERFORMANCE_DETAIL_KEY                                      :{BLACK}Detalj
 STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY                          :{BLACK}({CURRCOMPACT}/{CURRCOMPACT})
 STR_PERFORMANCE_DETAIL_AMOUNT_INT                               :{BLACK}({COMMA}/{COMMA})
-STR_PERFORMANCE_DETAIL_PERCENT                                  :{WHITE}{NUM} %
+STR_PERFORMANCE_DETAIL_PERCENT                                  :{WHITE}{NUM}{NBSP}%
 SET_PERFORMANCE_DETAIL_INT                                      :{BLACK}{NUM}
 ############ Those following lines need to be in this order!!
 STR_PERFORMANCE_DETAIL_VEHICLES                                 :{BLACK}Kjøretøy:
@@ -2959,7 +3080,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Ugyldig parameter for {STRING}: parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} må være lastet før {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} må være lastet etter {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} krever OpenTTD versjon {STRING} eller bedre.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF filen den var laget for å oversette
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :For mange NewGRF-er er lastet.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Legg til
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Legg en ny NewGRF-fil til listen
@@ -2983,11 +3106,11 @@
 
 STR_NEWGRF_NOT_FOUND                                            :{RED}Ingen passende fil funnet
 STR_NEWGRF_DISABLED                                             :{RED}Deaktivert
-STR_NEWGRF_COMPATIBLE_LOADED                                    :{ORANGE}Matchende fil ikke funnet(kompatibel GRF lastet)
+STR_NEWGRF_COMPATIBLE_LOADED                                    :{ORANGE}Tilsvarende fil ikke funnet (kompatibel GRF lastet)
 
-STR_NEWGRF_COMPATIBLE_LOAD_WARNING                              :{WHITE}Kompatible GRF(er) lastet for manglene filer
-STR_NEWGRF_DISABLED_WARNING                                     :{WHITE}Manglende GRF fil(er) har blitt avslått
-STR_NEWGRF_NOT_FOUND_WARNING                                    :{WHITE}Mangler GRF fil(er) for å kunne laste spill
+STR_NEWGRF_COMPATIBLE_LOAD_WARNING                              :{WHITE}Kompatibel GRF lastet for manglende filer
+STR_NEWGRF_DISABLED_WARNING                                     :{WHITE}Manglende GRF-fil(er) har blitt slått av
+STR_NEWGRF_NOT_FOUND_WARNING                                    :{WHITE}Mangler GRF-fil(er) nødvendige for å laste spillet
 
 STR_CURRENCY_WINDOW                                             :{WHITE}Vanlig valuta
 STR_CURRENCY_EXCHANGE_RATE                                      :{LTBLUE}Valutakurs: {ORANGE}{CURRENCY} = £ {COMMA}
@@ -3020,6 +3143,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Du er nå i ferd med å selge alle kjøretøyene i depoet. Er du sikker på at du vil dette?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Gal stalltype
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Selg alle tog i depodet
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Selg alle kjøretøy i garasjen
@@ -3100,7 +3224,7 @@
 STR_PURCHASE_INFO_RUNNINGCOST                                   :{BLACK}Driftskostnad: {GOLD}{CURRENCY}/år
 STR_PURCHASE_INFO_CAPACITY                                      :{BLACK}Kapasitet: {GOLD}{CARGO} {STRING}
 STR_PURCHASE_INFO_DESIGNED_LIFE                                 :{BLACK}Markedsintrodusert: {GOLD}{NUM}{BLACK} Levetid: {GOLD}{COMMA} år
-STR_PURCHASE_INFO_RELIABILITY                                   :{BLACK}Maks pålitelighet: {GOLD}{COMMA} %
+STR_PURCHASE_INFO_RELIABILITY                                   :{BLACK}Maks pålitelighet: {GOLD}{COMMA}{NBSP}%
 STR_PURCHASE_INFO_COST                                          :{BLACK}Kostnad: {GOLD}{CURRENCY}
 STR_PURCHASE_INFO_WEIGHT_CWEIGHT                                :{BLACK}Vekt: {GOLD}{WEIGHT_S}  ({WEIGHT_S})
 STR_PURCHASE_INFO_COST_SPEED                                    :{BLACK}Kostnad: {GOLD}{CURRENCY}{BLACK} Hastighet: {GOLD}{VELOCITY}
@@ -3136,6 +3260,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Endre startår
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Skalaadvarsel
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Å endre kildemapstørrelsen for mye er ikke anbefalt. Fortsette generering?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Byutleggsadvarsel
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Byutlegget «ingen flere veier» anbefales ikke. Fortsette generering?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Høydekartnavn:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Størrelse: {ORANGE}{NUM} x {NUM}
@@ -3143,7 +3269,7 @@
 STR_GENERATION_ABORT                                            :{BLACK}Avbryt
 STR_GENERATION_ABORT_CAPTION                                    :{WHITE}Avbryt verdensgenerering
 STR_GENERATION_ABORT_MESSAGE                                    :{YELLOW}Vil du virkelig avbryte verdensgenereringen?
-STR_PROGRESS                                                    :{WHITE}{NUM} % ferdig
+STR_PROGRESS                                                    :{WHITE}{NUM}{NBSP}% ferdig
 STR_GENERATION_PROGRESS                                         :{BLACK}{NUM} / {NUM}
 STR_WORLD_GENERATION                                            :{BLACK}Generer en verden
 STR_TREE_GENERATION                                             :{BLACK}Tregenerering
@@ -3165,6 +3291,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Midstill oversiktskartet på den gjeldende posisjonen
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Liten
@@ -3208,13 +3335,14 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Skru på gjennomsiktighet for stasjoner, depoter, lokalstasjoner og skinner
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Skru på gjennomsiktighet for broer
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Skru på gjennomsiktighet for fyrtårn og antenner
+STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Velg gjennomsiktighet for lastingsindikatorer
 
-STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
-STR_PERCENT_UP                                                  :{WHITE}{NUM}%{UPARROW}
-STR_PERCENT_DOWN_SMALL                                          :{TINYFONT}{WHITE}{NUM}%{DOWNARROW}
-STR_PERCENT_DOWN                                                :{WHITE}{NUM}%{DOWNARROW}
-STR_PERCENT_UP_DOWN_SMALL                                       :{TINYFONT}{WHITE}{NUM}%{UPARROW}{DOWNARROW}
-STR_PERCENT_UP_DOWN                                             :{WHITE}{NUM}%{UPARROW}{DOWNARROW}
+STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}{NBSP}%{UPARROW}
+STR_PERCENT_UP                                                  :{WHITE}{NUM}{NBSP}%{UPARROW}
+STR_PERCENT_DOWN_SMALL                                          :{TINYFONT}{WHITE}{NUM}{NBSP}%{DOWNARROW}
+STR_PERCENT_DOWN                                                :{WHITE}{NUM}{NBSP}%{DOWNARROW}
+STR_PERCENT_UP_DOWN_SMALL                                       :{TINYFONT}{WHITE}{NUM}{NBSP}%{UPARROW}{DOWNARROW}
+STR_PERCENT_UP_DOWN                                             :{WHITE}{NUM}{NBSP}%{UPARROW}{DOWNARROW}
 
 ##### Mass Order
 STR_GROUP_NAME_FORMAT                                           :Gruppe {COMMA}
@@ -3223,26 +3351,33 @@
 STR_GROUP_ALL_ROADS                                             :Alle kjøretøyer
 STR_GROUP_ALL_SHIPS                                             :Alle båter
 STR_GROUP_ALL_AIRCRAFTS                                         :Alle flyfartøy
+STR_GROUP_DEFAULT_TRAINS                                        :Ugrupperte tog
+STR_GROUP_DEFAULT_ROADS                                         :Ugrupperte biler
+STR_GROUP_DEFAULT_SHIPS                                         :Ugrupperte skip
+STR_GROUP_DEFAULT_AIRCRAFTS                                     :Ugrupperte fly
 STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
 STR_GROUP_ADD_SHARED_VEHICLE                                    :Legg til delte kjøretøy
 STR_GROUP_REMOVE_ALL_VEHICLES                                   :Fjern alle kjøretøy
 
-STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Tog{P "" s}
-STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Kjøretøy{P "" s}
-STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Skip{P "" s}
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} tog
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} kjøretøy
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} skip
 STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Luftfartøy
 STR_GROUP_RENAME_CAPTION                                        :{BLACK}Gi nytt navn på gruppen
-STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Skift kjøretøyer i "{GROUP}"
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Skift ut kjøretøyer i "{GROUP}"
 
 STR_GROUP_CAN_T_CREATE                                          :{WHITE}Kan ikke opprette gruppe...
 STR_GROUP_CAN_T_DELETE                                          :{WHITE}Kan ikke slette denne gruppen...
 STR_GROUP_CAN_T_RENAME                                          :{WHITE}Kan ikke gi nytt navn på denne gruppen...
 STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Kan ikke fjerne alle kjøretøy fra denne gruppen...
 STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Kan ikke legge til kjøretøy i denne grupppen...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Kan ikke legge til delte kjøretøyer i gruppa...
 
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Grupper - Klikk en gruppe for å se alle kjøretøy i gruppa
+STR_GROUP_CREATE_TIP                                            :{BLACK}Klikk for å opprette en gruppe
 STR_GROUP_DELETE_TIP                                            :{BLACK}Fjern den valgte gruppen
 STR_GROUP_RENAME_TIP                                            :{BLACK}Gi nytt navn på den valgte gruppen
-
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Klikk for å beskytte denne gruppa fra global autoerstatting
 
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
@@ -3251,4 +3386,66 @@
 STR_SIGN_NAME                                                   :{SIGN}
 STR_VEHICLE_NAME                                                :{VEHICLE}
 
+STR_NAME_MUST_BE_UNIQUE                                         :{WHITE}Navn må være unikt
+
+#### Improved sign GUI
+STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Gå til neste signal
+STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Gå til forrige signal
+
 ########
+
+STR_FUND_NEW_INDUSTRY                                           :{BLACK}Fond
+STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospekt
+STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Bygg
+STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Velg passende industri fra listen
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avansert
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Avansert ansiktsvalg
+STR_FACE_SIMPLE                                                 :{BLACK}Enkelt
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Enkelt ansiktsvalg.
+STR_FACE_LOAD                                                   :{BLACK}Last
+STR_FACE_LOAD_TIP                                               :{BLACK}Last favorittansikt
+STR_FACE_LOAD_DONE                                              :{WHITE}Ditt favorittansikt har blitt lastet fra OpenTTDs konfigurasjonsfil.
+STR_FACE_FACECODE                                               :{BLACK}Ansiktsnummer
+STR_FACE_FACECODE_TIP                                           :{BLACK}Vis og/eller endre ansiktsnummer
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Vis og/eller endre ansiktsnummer
+STR_FACE_FACECODE_SET                                           :{WHITE}Ny ansiktsnummerkode har blitt fastsatt.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Kunne ikke endre ansiktsnummer - må være numerisk mellom 0 og 4 294 967 295!
+STR_FACE_SAVE                                                   :{BLACK}Lagre
+STR_FACE_SAVE_TIP                                               :{BLACK}Lagre favorittansikt
+STR_FACE_SAVE_DONE                                              :{WHITE}Dette ansiktet vil bli lagret som din favoritt i OpenTTDs konfigurasjonsfil.
+STR_FACE_EUROPEAN                                               :{BLACK}Europeisk
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Velg europeiske ansikter
+STR_FACE_AFRICAN                                                :{BLACK}Afrikansk
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Velg afrikanske ansikter
+STR_FACE_YES                                                    :Ja
+STR_FACE_NO                                                     :Nei
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Slå på bart eller ørering
+STR_FACE_HAIR                                                   :Hår:
+STR_FACE_HAIR_TIP                                               :{BLACK}Endre hår
+STR_FACE_EYEBROWS                                               :Øyenbryn:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Endre øyenbryn
+STR_FACE_EYECOLOUR                                              :Øyefarge:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Endre øyefarge
+STR_FACE_GLASSES                                                :Briller:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Slå på briller
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Endre briller
+STR_FACE_NOSE                                                   :Nese:
+STR_FACE_NOSE_TIP                                               :{BLACK}Endre nese
+STR_FACE_LIPS                                                   :Lepper:
+STR_FACE_MOUSTACHE                                              :Bart:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Endre lepper eller bart
+STR_FACE_CHIN                                                   :Hake:
+STR_FACE_CHIN_TIP                                               :{BLACK}Endre hake
+STR_FACE_JACKET                                                 :Jakke:
+STR_FACE_JACKET_TIP                                             :{BLACK}Endre jakke
+STR_FACE_COLLAR                                                 :Krage:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Endre krage
+STR_FACE_TIE                                                    :Slips:
+STR_FACE_EARRING                                                :Ørering:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Endre slips eller ørering
+########
+
+############ signal GUI
+########
--- a/src/lang/norwegian_nynorsk.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/norwegian_nynorsk.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -861,6 +861,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Finansier ny industri
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan berre byggjast i byar
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...kan berre byggjast i regnskogområde
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...kan berre byggjast i ørkenområde
@@ -1021,6 +1022,7 @@
 STR_CONFIG_PATCHES_ON                                           :På
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Vis farten til køyretøyet på statuslinja: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Tillat bygging på skråningar og i vasskanten: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Gje høve til å endre lanskap under bruer, spor o.s.b.(autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Meir realistisk storleik på oppfangingsområde: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Tillat riving av industri, mer vei, osb.: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Tillat bygging av veldig lange tog: {ORANGE}{STRING}
@@ -1047,6 +1049,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Køyretøykøar (med kvantumseffektar): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Flytt på biletet dersom pila er nær ytterkantane på skjermen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Tillat smørjing av bystyret: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Gje høve til å kjøpe eksklusive transportretter: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Gje høve til å sende penger til andre firma: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ikkje-einsarta stasjonar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ny global rutesøking (NGR, overstyrer NTK): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Vektmultiplikator for frakt til å simulere tunge tog: {ORANGE}{STRING}
@@ -1187,6 +1191,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporsjon på byar som vil vekse dobbelt så fort: {ORANGE}1 av {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporsjon på byar som vil vekse dobbelt så fort: {ORANGE}Ingen
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Faktor for multiplikasjon av bystorleik: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Fjern absurde veg element under vegkonstruksjon
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Grensesnitt
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruksjon
@@ -1663,7 +1668,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Bygg veg
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Trikkekonstruksjon
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Bygg veg
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Bygg vegseksjon med automatisk vegmodus
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Bygg trikkeseksjon
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Bygg trikkestasjon med automatisk trikkemodus
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Bygg garasje (trengst for bygging og vedlikehald av køyretøy)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Bygg trikkedepot ( for å bygge og vedlikeholde køyretøy)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Bygg busstasjon
@@ -1996,9 +2003,9 @@
 STR_482F_COST                                                   :{BLACK}Kostnad: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Kan ikkje byggje denne typen industri her...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...skog kan berre plantast over snøgrensa
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} legg ned verksemda straks!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Leveringsproblem gjer at {INDUSTRY} legg ned verksemda straks!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Mangel på tre i nærleiken gjer at {INDUSTRY} legg ned verksemda straks!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} legg ned verksemda straks!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Leveringsproblem gjer at {STRING} legg ned verksemda straks!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Mangel på tre i nærleiken gjer at {STRING} legg ned verksemda straks!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY}aukar produksjonen!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Ny kolåre funnen i {INDUSTRY}!{}Ei dobling i produksjon er venta!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nye oljereservar funne i {INDUSTRY}!{}Ei dobling i produksjon er venta!
@@ -2017,6 +2024,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Bruhovud er ikkje på same nivå
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Brua er for låg for terrenget
 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}
@@ -2296,7 +2305,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Omplasser hovudkvarter
 STR_COMPANY_PASSWORD                                            :{BLACK}Passord
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Passordbeskytt firmaet ditt slik at ikkje alle og einkvar kan verte med. Bruk '*' for å tømme passord.
-STR_SET_COMPANY_PASSWORD                                        :Vel firmapassord
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Vel firmapassord
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Verdskrise!{}{}Økonomar fryktar det verste. Nedgangstider i kjømda.
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Verdskrise over!{}{}Opptur i marknaden gjer industrien sjølvkjensla attende.
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Byt mellom stor/liten storleik på vindauga
@@ -2308,7 +2317,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Kan ikkje kjøpe 25 % av aksjane...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Kan ikkje selje 25 % av aksjane...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA} % eigast av {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA} % eigast av {COMPANY}{}   {COMMA} % eigast av {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} har vorte kjøpt opp av {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Dette selskapet sel ikkje aksjer enno...
 
@@ -2777,6 +2785,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Ny {STRING}type er tilgjengeleg!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Kan ikkje selge øydelagd køyretøy
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Kan ikkje lage rutetabell for køyretøyet
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Køyretøy kan berre venta på stasjonar
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Dette køyretøyet stoppar ikkje på denne stasjonen
@@ -3065,6 +3075,7 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Ugyldig parameter for {STRING}: parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} må være lasta før{STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} må være lasta etter {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} Behøver OpenTTD versjon {STRING} eller betre.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF fila den var laga for å omsetje
 
 STR_NEWGRF_ADD                                                  :{BLACK}Legg til
@@ -3380,3 +3391,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospekt
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Bygg
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Vel den rette industritypen frå lista
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avansert
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Avansert val av andlet
+STR_FACE_SIMPLE                                                 :{BLACK}Enkel
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Enkelt val av andlet
+STR_FACE_LOAD                                                   :{BLACK}Last
+STR_FACE_LOAD_TIP                                               :{BLACK}Last favoritandlet
+STR_FACE_LOAD_DONE                                              :{WHITE}Favorittandletet ditt har blitt lasta frå OpenTTD config fila
+STR_FACE_FACECODE                                               :{BLACK}Spelar andlet nummer.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Sjå og / eller set spelar andletsnummer
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Sjå og eller set spelars andletsnummer
+STR_FACE_FACECODE_SET                                           :{WHITE}Ny kode for andletsnummer er satt
+STR_FACE_FACECODE_ERR                                           :{WHITE}Kunne ikke setja spelars andletsnummer - må vera mellom  0 og 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Lagre
+STR_FACE_SAVE_TIP                                               :{BLACK}Lagre favoritandlete
+STR_FACE_SAVE_DONE                                              :{WHITE} Dette andletet vil verte lagra som favoriten din i OpenTTD config fila
+STR_FACE_EUROPEAN                                               :{BLACK}Europeisk
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Velg europeiske andlet
+STR_FACE_AFRICAN                                                :{BLACK}Afrikans
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Velg afrikanske andlet
+STR_FACE_YES                                                    :Ja
+STR_FACE_NO                                                     :Nei
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Bart eller øyrering
+STR_FACE_HAIR                                                   :Hår:
+STR_FACE_HAIR_TIP                                               :{BLACK} Bytt hår
+STR_FACE_EYEBROWS                                               :Augebryn:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Bytt augebryn
+STR_FACE_EYECOLOUR                                              :Augefarge:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Bytt augefarge:
+STR_FACE_GLASSES                                                :Briller:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Bruk briller
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Bytt briller
+STR_FACE_NOSE                                                   :Nase:
+STR_FACE_NOSE_TIP                                               :{BLACK}Bytt nase
+STR_FACE_LIPS                                                   :Lepper:
+STR_FACE_MOUSTACHE                                              :Bart:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Bytt lepper eller bart
+STR_FACE_CHIN                                                   :Hake:
+STR_FACE_CHIN_TIP                                               :{BLACK}Bytt hake
+STR_FACE_JACKET                                                 :Jakke:
+STR_FACE_JACKET_TIP                                             :{BLACK}Bytt jakke
+STR_FACE_COLLAR                                                 :Krage:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Bytt krage
+STR_FACE_TIE                                                    :Slips:
+STR_FACE_EARRING                                                :Øyrering:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Bytt slips eller øyrering
+########
--- a/src/lang/piglatin.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/piglatin.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1995,9 +1995,9 @@
 STR_482F_COST                                                   :{BLACK}Ostcay: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}An'tcay onstructcay isthay industryway ypetay erehay...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...orestfay ancay onlyway ebay antedplay aboveway owsnay-inelay
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} announcesway imminentway osureclay!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Upplysay oblemspray ausecay {INDUSTRY} otay announceway imminentway osureclay!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Acklay ofway earbynay eestray ausescay {INDUSTRY} otay announceway imminentway osureclay!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} announcesway imminentway osureclay!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Upplysay oblemspray ausecay {STRING} otay announceway imminentway osureclay!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Acklay ofway earbynay eestray ausescay {STRING} otay announceway imminentway osureclay!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} increasesway oductionpray!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Ewnay oalcay eamsay oundfay atway {INDUSTRY}!{}Oductionpray isway expectedway otay oubleday!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Ewnay oilway eservesray oundfay atway {INDUSTRY}!{}Oductionpray isway expectedway otay oubleday!
@@ -2295,7 +2295,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Elocateray HQay
 STR_COMPANY_PASSWORD                                            :{BLACK}Asswordpay
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Asswordpay-otectpray ouryay ompanycay otay eventpray unauthorisedway usersway omfray oiningjay.
-STR_SET_COMPANY_PASSWORD                                        :Etsay ompanycay asswordpay
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Etsay ompanycay asswordpay
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Orldway Ecessionray!{}{}Inancialfay expertsway earfay orstway asway economyway umpsslay!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Ecessionray Overway!{}{}Upturnway inway adetray ivesgay onfidencecay otay industriesway asway economyway engthensstray!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Oggletay argelay/allsmay indowway izesay
@@ -2307,7 +2307,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}An'tcay uybay 25% areshay inway isthay ompanycay...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}An'tcay ellsay 25% areshay inway isthay ompanycay...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% ownedway ybay {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% ownedway ybay {COMPANY}{}   {COMMA}% ownedway ybay {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} ashay eenbay akentay overway ybay {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Isthay ompanycay isway otnay oldway enoughway otay adetray aresshay etyay...
 
--- a/src/lang/polish.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/polish.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -2106,9 +2106,9 @@
 STR_482F_COST                                                   :{BLACK}Koszt: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Nie można tutaj wybudować tego przedsiębiorstwa...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...las może być posadzony tylko powyżej linii śniegu
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} ogłasza bliskie zamkniecie!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemy z zaopatrzeniem {INDUSTRY} powodują ogłoszenie zamknięcia!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Niedobór drzew powoduje ogłoszenie zamknięcia {INDUSTRY}!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} ogłasza bliskie zamkniecie!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemy z zaopatrzeniem {STRING} powodują ogłoszenie zamknięcia!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Niedobór drzew powoduje ogłoszenie zamknięcia {STRING}!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} zwiększa produkcję!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Odkryto nowy pokład węgla w {INDUSTRY}!{} Podwojenie produkcji!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Odkryte nowe rezerwy ropy w {INDUSTRY}!{} Podwojenie produkcji!
@@ -2406,7 +2406,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Przenieś SG
 STR_COMPANY_PASSWORD                                            :{BLACK}Hasło
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Ochrona hasłem Twojej firmy zapobiega nieautoryzowanemu przyłączeniu się
-STR_SET_COMPANY_PASSWORD                                        :Ustaw hasło firmy
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Ustaw hasło firmy
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Światowa recesja!{}{}Eksperci finansowi obawiają się najgorszego z powodu kryzysu!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Koniec recesji!{}{}Polepszenie się transakcji handlowych daje pewność przedsiębiorstwom dzięki umacniającej się ekonomii!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Przełącz duży/mały rozmiar okna
@@ -2418,7 +2418,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Nie można kupić 25% udziałów w tej firmie...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}nie można sprzedać 25% udziałów tej firmy...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% w posiadaniu przez {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% w posiadaniu przez {COMPANY}{}   {COMMA}% w posiadaniu przez {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} zostało przejęte przez {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Ta firma jeszcze nie sprzedaje akcji...
 
--- a/src/lang/portuguese.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/portuguese.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1103,8 +1103,15 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Percorrer mapa
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Desligado
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Velocidade do scrollwheel no mapa: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Clique para comando
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Clique para controlo
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Desligado
+
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Pausa automática ao iniciar 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                   :Sua companhia
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Usar indicadores de carga: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Activar plano de horários para veículos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Mostrar horário em tics em vez dias: {ORANGE}{STRING}
@@ -1978,9 +1985,9 @@
 STR_482F_COST                                                   :{BLACK}Custo: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Não é possível construir este tipo de indústria aqui...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...a floresta só pode ser plantada acima do nível de neve
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} anuncia fecho iminente!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemas no abastecimento levam {INDUSTRY} a anunciar fecho iminente!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Escassez de árvores nas proximidades leva {INDUSTRY} a anunciar fecho iminente!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} anuncia fecho iminente!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemas no abastecimento levam {STRING} a anunciar fecho iminente!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Escassez de árvores nas proximidades leva {STRING} a anunciar fecho iminente!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} aumenta a produção
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Novo filão de carvão encontrado em {INDUSTRY}!{}Produção deverá duplicar!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Novas reservas de petróleo encontradas em {INDUSTRY}!{}Produção deverá duplicar!
@@ -2278,7 +2285,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Mover sede
 STR_COMPANY_PASSWORD                                            :{BLACK}Palavra passe
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Usar palavra passe na empresa para prevenir utilizadores não autorizados.
-STR_SET_COMPANY_PASSWORD                                        :Definir palavra passe da empresa
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Definir palavra passe da empresa
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Retrocesso Mundial!{}{}Especialistas financeiros temem crise económica!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Fim do retrocesso!{}{}Melhoras no comércio inspiram confiança nas indústrias à medida que a economia se fortalece!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Alternar entre janela grande/pequena
@@ -2290,7 +2297,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Não é possível comprar 25% de acções nesta empresa...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Não é possível vender 25% de acções nesta empresa...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% propriedade de {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% propriedade de {COMPANY}{}   {COMMA}% propriedade de {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} foi comprada por {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Esta empresa ainda não troca acções...
 
@@ -2759,6 +2765,7 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Novo {STRING} agora disponível! - {ENGINE}
 
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Impossível programar veículo...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Veículos apenas podem esperar em estações.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Este veículo não pára nesta estação.
@@ -3362,3 +3369,6 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospectar
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Construir
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Escolha a indústria apropriada desta lista
+
+############ Face formatting
+########
--- a/src/lang/romanian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/romanian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -338,8 +338,8 @@
 STR_UNITS_VOLUME_SHORT_METRIC                                   :{COMMA}l
 STR_UNITS_VOLUME_SHORT_SI                                       :{COMMA}m³
 
-STR_UNITS_VOLUME_LONG_IMPERIAL                                  :{COMMA} galoane{P "" s}
-STR_UNITS_VOLUME_LONG_METRIC                                    :{COMMA} litri{P "" s}
+STR_UNITS_VOLUME_LONG_IMPERIAL                                  :{COMMA} galo{P n ane}
+STR_UNITS_VOLUME_LONG_METRIC                                    :{COMMA} litr{P u i}
 STR_UNITS_VOLUME_LONG_SI                                        :{COMMA} m³
 
 STR_UNITS_FORCE_IMPERIAL                                        :{COMMA}x10³ livre-forţă
@@ -860,6 +860,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Construieşte un nou obiectiv industrial
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...se poate construi doar în oraşe
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...se poate construi doar in padurile ecuatoriale
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...se poate construi doar în zonele de deşert
@@ -902,7 +903,7 @@
 ############ end of townname region
 
 STR_CURR_GBP                                                    :Liră sterlină (£)
-STR_CURR_USD                                                    :Dolar ($)
+STR_CURR_USD                                                    :Dolar American ($)
 STR_CURR_EUR                                                    :Euro (€)
 STR_CURR_YEN                                                    :Yen japonez (¥)
 STR_CURR_ATS                                                    :Şiling austriac (ATS)
@@ -1047,6 +1048,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Autovehiculele formeazã o coadã (cu efecte cuantice): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Mutã imaginea când mouse-ul este la marginea ecranului: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Permite mituirea autoritãtilor locale: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Permite cumpararea de drepturi exclusive de transport: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permite transfer de bani catre alte companii: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Statii neuniforme: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nou pathfinding global(NPF, dezactiveaza NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicator greutate pt marfar pt simularea trenurilor grele: {ORANGE}{STRING}
@@ -1187,6 +1190,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proportia oraselor care se vor dezvolta de doua ori mai repede: {ORANGE}1 in {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proportia oraselor care se vor dezvolta de doua ori mai repede: {ORANGE}None
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicator initial dimensiune oras: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Elimina elementele de drum absurde pe durata constructiei drumului
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interfatã
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construcţie
@@ -1663,7 +1667,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Construcţii rutiere
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Construcţie tramvai
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construieşte secţiune de şosea
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Construieste sectiune de sosea folosind modul Auto-sosea
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Construcieşte şină de tramvai
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Construieste sectiune de sina de tramvai folosind modul Auto-tramvai
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construieşte o autobază (pentru construire şi întreţinere de autovehicule)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Construieste depou tramvaie (pentru constructii si reparatii vehicule)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Plasează staţie de autobuz
@@ -1996,9 +2002,9 @@
 STR_482F_COST                                                   :{BLACK}Cost: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Acest tip de industrie nu se poate construi aici...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...pădurile pot fi plantate doar în zonele înzăpezite
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} anunţă închidere iminentă!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemele de aprovizionare provoacă închiderea {INDUSTRY}!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lipsa de teren împădurit provoacă închiderea {INDUSTRY}!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} anunţă închidere iminentă!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemele de aprovizionare provoacă închiderea {STRING}!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lipsa de teren împădurit provoacă închiderea {STRING}!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} măreşte producţia!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Rezerve noi de cărbune la {INDUSTRY}!{}Se preconizează dublarea producţiei!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Rezerve noi de petrol la {INDUSTRY}!{}Se preconizează dublarea producţiei!
@@ -2017,6 +2023,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Capetele podului nu sunt la acelasi nivel
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Podul este prea jos pentru terenul corespunzator
 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}
@@ -2296,7 +2304,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Muta sediu
 STR_COMPANY_PASSWORD                                            :{BLACK}Parola
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Protejeaza-ti compania cu o parola pentru a preveni accesul neautorizat.
-STR_SET_COMPANY_PASSWORD                                        :Alege parola companiei
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Alege parola companiei
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Recesiune mondială!{}{}Experţii financiari se tem de ceea ce e mai rău odată cu prăbuşirea economică!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recesiunea s-a încheiat!{}{}Creşterea comerţului dă încredere industriei, iar economia se redresează!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Comutator pentru mărimea ferestrei
@@ -2308,7 +2316,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Nu pot cumpăra 25% din acţiunile acestei companii...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Nu pot vinde 25% din acţiunile acestei companii...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% deţinute de {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% deţinute de {COMPANY}{}   {COMMA}% deţinute de {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} a fost preluată de {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Această companie încă nu vinde acţiuni...
 
@@ -2777,6 +2784,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Un nou {STRING} este acum disponibil!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Vehiculul distrus nu poate fi vandut...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Nu pot programa vehiculul...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Vehiculele pot astepta numai in statii.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Acest vehicul nu opreste in aceasta statie.
@@ -3065,6 +3074,7 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Parametru invalid pentru {STRING}: parametrul {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} trebuie sa fie incarcat inaintea {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} trebuie sa fie incarcat dupa {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} necesita OpenTTD versiunea {STRING} sau mai noua.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :fisierul GRF conceput pentru traducere
 
 STR_NEWGRF_ADD                                                  :{BLACK}Adauga
@@ -3380,3 +3390,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospecteaza
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Construieste
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Alege industria potrivita din acesta lista
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avansat
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Selectie avansata a fetei.
+STR_FACE_SIMPLE                                                 :{BLACK}Simplu
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Selectie simplă a fetei.
+STR_FACE_LOAD                                                   :{BLACK}Incarcare
+STR_FACE_LOAD_TIP                                               :{BLACK}Incarca o fata preferata
+STR_FACE_LOAD_DONE                                              :{WHITE}Fata dvs. preferata a fost incarcata din fisierul de configurare al OpenTTD.
+STR_FACE_FACECODE                                               :{BLACK}Nr. fetei pentru jucator
+STR_FACE_FACECODE_TIP                                           :{BLACK}Vizualizeaza si/sau seteaza numarul fetei pentru jucator
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Vizualizeaza si/sau seteaza numărul fetei pentru jucator
+STR_FACE_FACECODE_SET                                           :{WHITE}Noul cod numeric pentru fata a fost stabilit.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Nu am putut stabili numarul de fata al jucatorului - trebuie sa fie un numar intre 0 si 4.294.967.295!
+STR_FACE_SAVE                                                   :{BLACK}Salveaza
+STR_FACE_SAVE_TIP                                               :{BLACK}Salveaza fata preferata
+STR_FACE_SAVE_DONE                                              :{WHITE}Aceasta fata va fi salvata ca fata preferata în fisierul de configurare al OpenTTD.
+STR_FACE_EUROPEAN                                               :{BLACK}European
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Alege fete europene
+STR_FACE_AFRICAN                                                :{BLACK}African
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Alege fete africane
+STR_FACE_YES                                                    :Da
+STR_FACE_NO                                                     :Nu
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Permite mustata sau cercei
+STR_FACE_HAIR                                                   :Par:
+STR_FACE_HAIR_TIP                                               :{BLACK}Schimba parul
+STR_FACE_EYEBROWS                                               :Sprancene:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Schimba sprancenele
+STR_FACE_EYECOLOUR                                              :Culoarea ochilor:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Schimba culoarea ochilor
+STR_FACE_GLASSES                                                :Ochelari:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Permite ochelari
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Schimba ochelari
+STR_FACE_NOSE                                                   :Nas:
+STR_FACE_NOSE_TIP                                               :{BLACK}Schimba nasul
+STR_FACE_LIPS                                                   :Buze:
+STR_FACE_MOUSTACHE                                              :Mustata:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Schimba buzele sau mustata
+STR_FACE_CHIN                                                   :Barbie:
+STR_FACE_CHIN_TIP                                               :{BLACK}Schimba barbia
+STR_FACE_JACKET                                                 :Jacheta
+STR_FACE_JACKET_TIP                                             :{BLACK}Schimba jacheta
+STR_FACE_COLLAR                                                 :Guler:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Schimba gulerul
+STR_FACE_TIE                                                    :Cravata:
+STR_FACE_EARRING                                                :Cercei:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Schimba cravata sau cerceii
+########
--- a/src/lang/russian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/russian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -596,6 +596,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Информация о Компании
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Открытие / закрытие промышленности
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Изменения в экономике
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Изменения уровня производства предприятий, обслуживаемых игроком
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Изменения уровня производства предприятий, обслуживаемых соперниками
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Изменения уровня производства предприятий, никем не обслуживаемых
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Сообщения о транспорте игрока
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Новый транспорт
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Изменения в списке принимаемых грузов
@@ -862,6 +865,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Создать новое предприятие
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...можно строить только в городах
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...можно строить только в тропиках
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...можно строить только в пустыне
@@ -1022,6 +1026,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}
@@ -1048,6 +1053,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Автотранспорт строится в очередь у станции: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Смещать обзор, когда курсор находится у края экрана: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Разрешить подкупать муниципальную власть: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Разрешить покупать эксклюзивные трансп. права: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Разрешить передачу денег другим компаниям: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Станции могут быть произвольной формы: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Алгоритм навигации NPF (замена оригинального): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Множитель увеличения веса груза для товарных поездов: {ORANGE}{STRING}
@@ -1188,6 +1195,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Соотношение городов, которые растут вдвое быстрее: {ORANGE}1 из {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Соотношение городов, которые растут вдвое быстрее: {ORANGE}Выкл.
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Изначальный множитель размера города: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Удалять абсурдные элементы дорог во время строительства
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Интерфейс
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Строительство
@@ -1664,7 +1672,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Строительство дорог
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Трамваи
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Проложить дорогу
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Строить автотрассу, используя авто-режим
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Проложить трамвайные пути
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Строить трамвайный путь, используя авто-режим
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Построить гараж (для закупки и обслуживания машин)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Построить трамвайное депо (для закупки и обслуживания трамваев)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Построить автобусную остановку
@@ -1675,6 +1685,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Построить трамвайный мост
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Построить туннель (авто)
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Построить трамвайный туннель
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Включить/Отключить односторонние дороги
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Переключение строительства/удаления автомобильной инфраструктуры
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Переключение строительства/удаления трамвайной инфраструктуры
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Выбор ориентации гаража
@@ -1696,6 +1707,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Сначала надо уничтожить здания
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Население: {ORANGE}{COMMA}{BLACK}  Зданий: {ORANGE}{COMMA}
@@ -1997,9 +2009,9 @@
 STR_482F_COST                                                   :{BLACK}Цена: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Невозможно построить это предприятие здесь...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...лес можно сажать только выше линии снега
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} объявляет о немедленном закрытии!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Проблемы с поставками вынуждают {INDUSTRY} объявить о неизбежном закрытии!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Недостаток деревьев в округе вынуждает {INDUSTRY} объявить о неизбежном закрытии!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} объявляет о немедленном закрытии!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Проблемы с поставками вынуждают {STRING} объявить о неизбежном закрытии!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Недостаток деревьев в округе вынуждает {STRING} объявить о неизбежном закрытии!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} увеличивает объемы производства!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Найден новый угольный пласт в {INDUSTRY}!{}Добыча увеличена вдвое!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Обнаружены новые запасы нефти на {INDUSTRY} !{}Добыча увеличена вдвое!
@@ -2018,6 +2030,8 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Сначала удалите туннель
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Сначала удалите мост
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Не может начинаться и заканчиваться в той же точке
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Опоры мостов должны быть на одном уровне
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Слишком низкий мост
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Начало и конец должны быть на одной линии
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Неподходящее место для строительства туннеля
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2308,7 +2322,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Переместить
 STR_COMPANY_PASSWORD                                            :{BLACK}Пароль
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Защитить вашу компанию паролем, чтобы неавторизованные пользователи не могли присоединиться
-STR_SET_COMPANY_PASSWORD                                        :Установить пароль компании
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Установить пароль компании
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Мировой спад{}{}Финансовые эксперты дают ужасные прогнозы в связи с кризисом экономики!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Спад закончился!{}{}Увеличение объемов торговли внушает уверенность владельцам предприятий. Экономика укрепляет свои позиции.
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Большое/маленькое окно
@@ -2320,7 +2334,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Не могу купить 25% акций этой компании...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Не могу продать 25% акций этой компании...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% владеет {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% владеет {COMPANY}{}   {COMMA}% владеет {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} выкуплена {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Эта компания еще не может торговать акциями...
 
@@ -2789,6 +2802,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Появился новый {STRING}!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Не могу продать разбитый транспорт ...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Не могу составить расписание для этого транспорта...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Транспорт может только ждать на станции.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Этот транспорт не останавливается на этой станции.
@@ -3077,7 +3092,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Неверный параметр {STRING}: параметр {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} должен быть загружен перед {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} должен быть загружен после {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} требует OpenTTD версии {STRING} или выше.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :файл GRF, который им переводится.
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Слишком много загружено новой графики
 
 STR_NEWGRF_ADD                                                  :{BLACK}Добавить
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Добавить файл NewGRF в список
@@ -3286,6 +3303,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Центрировать миникарту по этой позиции
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Малый
@@ -3392,3 +3410,54 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Разведать
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Построить
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Выберите тип производства из списка
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Расш.
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Расширенный выбор лиц.
+STR_FACE_SIMPLE                                                 :{BLACK}Простые
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Выбор простых лиц.
+STR_FACE_LOAD                                                   :{BLACK}Загруз.
+STR_FACE_LOAD_TIP                                               :{BLACK}Загрузить любимое лицо
+STR_FACE_LOAD_DONE                                              :{WHITE}Ваше любимое лицо будет загружено из конфиг-файла.
+STR_FACE_FACECODE                                               :{BLACK}Лицо игрока.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Посмотреть и/или установить номер лица
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Посмотреть и/или установить номер лица
+STR_FACE_FACECODE_SET                                           :{WHITE}Цифровой код нового лица будет установлен
+STR_FACE_FACECODE_ERR                                           :{WHITE}Не могу установить номер лица - значение должно быть целым и лежать в диапазоне от 0 до 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Сохр.
+STR_FACE_SAVE_TIP                                               :{BLACK}Сохр. любимое лицо
+STR_FACE_SAVE_DONE                                              :{WHITE}Это лицо будет сохранено как ваше любимое в конфиг-файле.
+STR_FACE_EUROPEAN                                               :{BLACK}Европеоидное
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Выбор европеоидного типа лица
+STR_FACE_AFRICAN                                                :{BLACK}Африканское
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Выбор африканского типа лица
+STR_FACE_YES                                                    :Да
+STR_FACE_NO                                                     :Нет
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Включить усы или серьги
+STR_FACE_HAIR                                                   :Волосы:
+STR_FACE_HAIR_TIP                                               :{BLACK}Изменить волосы
+STR_FACE_EYEBROWS                                               :Брови
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Изменить брови
+STR_FACE_EYECOLOUR                                              :Цвет глаз:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Изменить цвет глаз
+STR_FACE_GLASSES                                                :Очки:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Добавить очки
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Изменить очки
+STR_FACE_NOSE                                                   :Нос:
+STR_FACE_NOSE_TIP                                               :{BLACK}Изменить нос
+STR_FACE_LIPS                                                   :Губы
+STR_FACE_MOUSTACHE                                              :Усы
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Изменить губы или усы
+STR_FACE_CHIN                                                   :Подбородок:
+STR_FACE_CHIN_TIP                                               :{BLACK}Изменить подбородок
+STR_FACE_JACKET                                                 :Жакет:
+STR_FACE_JACKET_TIP                                             :{BLACK}Изменить жакет
+STR_FACE_COLLAR                                                 :Воротник:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Изменить воротник
+STR_FACE_TIE                                                    :Галстук:
+STR_FACE_EARRING                                                :Серьга:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Изменить галстук или серьгу
+########
+
+############ signal GUI
+########
--- a/src/lang/simplified_chinese.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/simplified_chinese.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1879,9 +1879,9 @@
 STR_482F_COST                                                   :{BLACK}费用:{YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}不能在此处建设这种类型的工业设施……
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}林场只能设置在雪线以上的地方……
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} 即将倒闭!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{INDUSTRY} 没有原料供应,即将倒闭!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}{INDUSTRY} 周围没有可用的木材,即将倒闭!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} 即将倒闭!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{STRING} 没有原料供应,即将倒闭!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}{STRING} 周围没有可用的木材,即将倒闭!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} 产量增加!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}{INDUSTRY} 发现新的煤炭!{}产量即将翻番!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}{INDUSTRY} 发现新的石油!{}产量即将翻番!
@@ -2177,7 +2177,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}重置总部
 STR_COMPANY_PASSWORD                                            :{BLACK}密码
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}设置密码可以防止未经授权的用户随意加入。
-STR_SET_COMPANY_PASSWORD                                        :设置公司密码
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}设置公司密码
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}大萧条!{}{}金融专家预测世界经济将全面倒退!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}大萧条结束!{}{}贸易复苏带动经济全面启动!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}切换窗口大小
@@ -2189,7 +2189,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}不能购买此公司的股份……
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}不能出售此公司的股份……
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% 由 {COMPANY} 所有)
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% 由 {COMPANY} 所有{}   {COMMA}% 由 {COMPANY} 所有)
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} 被 {COMPANY} 收购!
 STR_7080_PROTECTED                                              :{WHITE}这个公司刚刚开业,还不能进行股权交易……
 
--- a/src/lang/slovak.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/slovak.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -480,9 +480,9 @@
 STR_0163_FEB                                                    :Feb
 STR_0164_MAR                                                    :Mar
 STR_0165_APR                                                    :Apr
-STR_0166_MAY                                                    :Maj
-STR_0167_JUN                                                    :Jun
-STR_0168_JUL                                                    :Jul
+STR_0166_MAY                                                    :Máj
+STR_0167_JUN                                                    :Jún
+STR_0168_JUL                                                    :Júl
 STR_0169_AUG                                                    :Aug
 STR_016A_SEP                                                    :Sep
 STR_016B_OCT                                                    :Okt
@@ -658,12 +658,15 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informacie o spolocnosti
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Vznik a zánik priemyslu
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Zmeny v ekonomike
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Zmeny produkcie priemyslu obsluhovaného hrácom
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Zmeny produkcie priemyslu obsluhovaného konkurenciou
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Ostatné zmeny produkcie priemyslu
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Oznamenia / Informacie o vozidlach hraca
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nove vozidla
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Zmeny prijmu nakladu
 STR_020E_SUBSIDIES                                              :{YELLOW}Dotacie
 STR_020F_GENERAL_INFORMATION                                    :{YELLOW}Hlavne informacie
-STR_MESSAGES_ALL                                                :{YELLOW}Nastavenie vs. typov sprav (vypnute/strucne/zapnute)
+STR_MESSAGES_ALL                                                :{YELLOW}Nastavenie všetkých správ (vypnuté/obsah/plné)
 STR_MESSAGE_SOUND                                               :{YELLOW}Prehrat zvuk pre strucne novinove spravy
 STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO                       :{WHITE}...prilis daleko z predchadzajuceho ciela
 STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}Najlepsie spolocnosti, ktore dosiahli {NUM}{}({STRING} uroven)
@@ -880,7 +883,7 @@
 STR_02E0_CURRENCY_UNITS                                         :{BLACK}Mena
 STR_02E1                                                        :{BLACK}{SKIP}{STRING}
 STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Vyber meny
-STR_MEASURING_UNITS                                             :{BLACK}Jednotky vzdialenosti
+STR_MEASURING_UNITS                                             :{BLACK}Merné jednotky
 STR_02E4                                                        :{BLACK}{SKIP}{SKIP}{STRING}
 STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Výber jednotiek vzdialenosti
 STR_02E6_ROAD_VEHICLES                                          :{BLACK}Cestné vozidlá
@@ -896,7 +899,7 @@
 STR_02F5                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Vyber interval automatickeho ukladania
 STR_02F7_OFF                                                    :Vypnute
-STR_02F8_EVERY_3_MONTHS                                         :Kazde 3 mesiace
+STR_02F8_EVERY_3_MONTHS                                         :Každé 3 mesiace
 STR_02F9_EVERY_6_MONTHS                                         :Každých 6 mesiacov
 STR_02FA_EVERY_12_MONTHS                                        :Každých 12 mesiacov
 STR_02FB_START_A_NEW_GAME                                       :{BLACK}Spustit novu hru
@@ -924,6 +927,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Financovat novy priemysel
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}... moze byt postavene len v meste
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}... moze byt postavene len v dazdovom pralese
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}... moze byt postavene len v pusti
@@ -1017,9 +1021,9 @@
 STR_MONTH_FEB                                                   :Februar
 STR_MONTH_MAR                                                   :Marec
 STR_MONTH_APR                                                   :April
-STR_MONTH_MAY                                                   :Maj
-STR_MONTH_JUN                                                   :Jun
-STR_MONTH_JUL                                                   :Jul
+STR_MONTH_MAY                                                   :Máj
+STR_MONTH_JUN                                                   :Jún
+STR_MONTH_JUL                                                   :Júl
 STR_MONTH_AUG                                                   :August
 STR_MONTH_SEP                                                   :September
 STR_MONTH_OCT                                                   :Oktober
@@ -1037,7 +1041,7 @@
 STR_LITERS                                                      :litrov
 STR_ITEMS                                                       :kusov
 STR_CRATES                                                      :debien
-STR_RES_OTHER                                                   :ine
+STR_RES_OTHER                                                   :iné
 STR_NOTHING                                                     :
 
 STR_SMALL_RIGHT_ARROW                                           :{TINYFONT}{RIGHTARROW}
@@ -1080,63 +1084,65 @@
 STR_CONFIG_PATCHES_TIP                                          :{BLACK}Nastavenia patchov
 STR_CONFIG_PATCHES_CAPTION                                      :{WHITE}Nastavenia patchov
 
-STR_CONFIG_PATCHES_OFF                                          :Vyp.
-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_OFF                                          :nie
+STR_CONFIG_PATCHES_ON                                           :áno
+STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Zobrazovat rýchlost v stavovej lište vozidla: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Umožnit výstavbu na svahoch a na pobreží: {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}
+STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Povolit realistickejšiu velkost oblasti pokrytia: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Umožnit odstránenie viacerých mestských ciest, mostov, ... : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Umožnit stavbu dlhých vlakov: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REALISTICACCEL                               :{LTBLUE}Zapnut realnu akceleraciu vlakov: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Zakazat vlakom a lodiam otacanie o 90 st.: {ORANGE}{STRING} {LTBLUE} (vyzaduje NPF)
+STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Zakázat vlakom a lodiam otácanie o 90 st.: {ORANGE}{STRING} {LTBLUE} (vyžaduje NPF)
 STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}Umoznit spajanie stanic: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}Opustit stanicu ked jeden z nakladov je plny, pri 'plne naloz': {ORANGE}{STRING}
 STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Pouzit vylepseny algoritmus nakladania: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GRADUAL_LOADING                              :{LTBLUE}Postupné nakladanie vozidiel: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INFLATION                                    :{LTBLUE}Inflacia: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Vykladat tovar len v stanici kde je dopyt: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Umoznit stavbu dlhych mostov: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Umoznit zaradenie depa do zoznamu prikazov: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_INFLATION                                    :{LTBLUE}Inflácia: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Vykladat náklad len v stanici kde je dopyt: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Umožnit stavbu dlhých mostov: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Umožnit zaradenie depa do zoznamu príkazov: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD             :{LTBLUE}Sposob výstavby priemyslu produkujúceho suroviny: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE        :žiadny
 STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL      :normálny
 STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :vyhladávací
-STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Umoznit viac priemyslu rovnakeho typu v jednom meste: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Umoznit viac priemyslu rovnakeho typu pri jednom meste: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Rovnaky priemysel moze byt stavany blizko seba: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Zobrazit dlhy format datumu v stavovej liste: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Zobrazit zel. signaly na strane, kde jazdia vozidla: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Zobrazovat dátum v stavovej lište v dlhom formáte: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Zobrazovat žel. signály na rovnakej strane ako jazdia vozidlá: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Zobrazit rozpocet na konci roku: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}TTDPatch kompatibilna interpretacia prikazu nonstop: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Radenie cestnych vozidiel (podla mnozstva tovaru): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Radenie cestných vozidiel (podla množstva nákladu): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Posúvat pohlad ked je kurzor myši na okraji okna: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Umoznit podplacanie miestnej spravy: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Povolit zakúpenie exkluzívnych dopravných práv: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Umožnit posielanie penazí ostatným spolocnostiam: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Roznorode stanice: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novy globalny algoritmus hladania cesty (NPF namiesto NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Váhový násobok pre nákladné vlaky: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Povolit prejazdné zastávky na mestských cestách: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Povolit stavbu oddelených staníc: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Vzdy povolit stavbu malych letisk: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Vždy povolit stavbu malých letísk: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Upozornit na stratu vlaku: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Upozornit ak vlak nedokáže nájst cestu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}Obnovenie prikazov vozidla: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ORDER_REVIEW_OFF                             :nie
 STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :ano, okrem zastavenych vozidiel
 STR_CONFIG_PATCHES_ORDER_REVIEW_ON                              :ano, u vsetkych vozidiel
-STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Upozornit ak je vlak stratovy: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Upozornit ak je vlak stratový: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}Nikdy neprestat s vyrobou starych vozidiel: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}Automaticka obnova dopravnych prostriedkov, ked su stare
 STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Obnovit vozidlo {ORANGE}{STRING}{LTBLUE} mesiacov pred/po dosiahnuti max. veku
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Min. mnozstvo penazi pre aut. obnovovanie vozidiel: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Dlzka zobrazenia chybovej spravy: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Dlžka zobrazenia chybovej správy: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Zobrazit pocet obyvatelov mesta v jeho nazve: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Neviditelne stromy (pri priesvitnych budovach): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generátor uzemia: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Povodny
 STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS                 :TerraGenesis
-STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Max. vzdialenost ropnych rafinerii od okraja mapy: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Maximálna vzdialenost ropných rafinérií od okraja mapy: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SNOWLINE_HEIGHT                              :{LTBLUE}Uroven ciary snehu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}Clenitost terenu (len pre TerraGenesis) : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Velmi rovny
@@ -1154,19 +1160,19 @@
 
 STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}Max. rozsah stanice: {ORANGE}{STRING} {RED}Pozor: Vysoke hodnoty spomaluju hru
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Automatické opravy vrtulníkov v heliporte: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Otvarat panel uprav terenu s panelom stavby trati, ciest, ... : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Otvárat panel úprav terénu s panelmi výstavby: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Pri posúvaní pohladu myšou posúvat mapu opacným smerom: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Plynulé posúvanie pohladu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Zobrazit údaje o rozmeroch pri výstavbe: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Zobrazit farebne schemy spolocnosti: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES_NONE                                :Ziadne
-STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Vlastná spolocnost
-STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Vsetky spolocnosti
+STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Zobrazit farebné schémy spolocnosti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES_NONE                                :žiadne
+STR_CONFIG_PATCHES_LIVERIES_OWN                                 :vlastná spolocnost
+STR_CONFIG_PATCHES_LIVERIES_ALL                                 :všetky spolocnosti
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Preferovaný teamový chat: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Funkcia scrolovacieho kolieska: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Zvacšit mapu
-STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Posúvat mapu
-STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Vypnuté
+STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :zvacšit mapu
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :posúvat pohlad
+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}
@@ -1179,20 +1185,20 @@
 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_LOADING_INDICATORS                           :{LTBLUE}Zobrazovat ukazovatele nakladania/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}Používat 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}
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Normálne
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Elektrifikované
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :normálne
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :elektrifikované
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Monorail
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV                     :Maglev
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :Prvé dostupné
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Posledné dostupné
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :Najpoužívanejšie
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :prvé dostupné
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :posledné dostupné
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :najpoužívanejšie
 
 STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Zobrazit nástroje výstavby ak nie sú dostupné vhodné vozidlá: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maximalny pocet vlakov hraca: {ORANGE}{STRING}
@@ -1208,7 +1214,7 @@
 STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Povolit nove AI (alpha verzia): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Povolit AI v multiplayeri (experimentalne): {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Implicitny servisny interval pre vlaky: {ORANGE}{STRING} dni
+STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Implicitný servisný interval pre vlaky: {ORANGE}{STRING} dní/%
 STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Implicitny servisny interval pre vlaky: {ORANGE}vypnuty
 STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Implicitny servisny interval pre automobily: {ORANGE}{STRING} dni/%
 STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Implicitny servisny interval pre automobily: {ORANGE}vypnuty
@@ -1217,47 +1223,48 @@
 STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Implicitny servisny interval pre lode: {ORANGE}{STRING} dni/%
 STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Implicitny servisny interval pre lode: {ORANGE}vypnuty
 STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}Vypnut servisy, ak su vypnute poruchy: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}Obmedzenie rychlosti pre vagony: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}Obmedzenie rýchlosti pre vagóny: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DISABLE_ELRAILS                              :{LTBLUE}Zakázat elektrifikovanú železnicu: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_COLORED_NEWS_YEAR                            :{LTBLUE}Farebne spravy sa prvykrat objavia v roku: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_COLORED_NEWS_YEAR                            :{LTBLUE}Zobrazovat správy farebne od roku: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}Zaciatok hry v roku: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ENDING_YEAR                                  :{LTBLUE}Koniec hry v roku: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}Mierne zmeny ekonomiky (viac mensich zmien)
-STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Povolit nakup akcii ostatnych spolocnosti
-STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Pri stavbe tahanim umiestnit semafory na kazde: {ORANGE}{STRING}. pole
-STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatická stavba semafórov pred: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Povolit kupovanie podielov v ostatných spolocnostiach
+STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Pri stavbe tahaním umiestnit signály na každé: {ORANGE}{STRING}. pole
+STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automaticky stavat semafóry namiesto signálov pred rokom: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Struktúra mesta "žiadne cesty naviac" nie je platná v editore scenárov
 STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Struktúra mestských ciest: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :žiadne cesty naviac
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :žiadne cesty
 STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :štandardná
-STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :lepšie cesty
-STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :mriežka 2x2
-STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :mriežka 3x3
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :zdokonalená
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :bloky 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :bloky 3x3
 
-STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Pozicia hlavneho menu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Nalavo
-STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :V strede
-STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Napravo
+STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Pozícia hlavného menu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :vlavo
+STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :v strede
+STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :vpravo
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Vzdialenost pre prichytenie okna: {ORANGE}{STRING} bodov
-STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Vzdialenost pre prichytenie okna: {ORANGE}vypnute
+STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Vzdialenost pre prichytenie okna: {ORANGE}vypnuté
 STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Rozvoj miest: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Žiadny
-STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Pomalý
-STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normálny
-STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rýchly
-STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Velmi rýchly
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :žiadny
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :pomalý
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :normálny
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :rýchly
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :velmi rýchly
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Pomer miest, ktoré sa budú rozvíjat rýchlejšie: {ORANGE}1 z {STRING}
-STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Pomer miest, ktoré sa budú rozvíjat rýchlejšie: {ORANGE}Žiadny
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Pomer miest, ktoré sa budú rozvíjat rýchlejšie: {ORANGE}žiadne
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Násobok pociatocnej velkosti mesta: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Odstránit nezmyselné casti pri rekonštrukcii ciest
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Rozhranie
-STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Vystavba
+STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Výstavba
 STR_CONFIG_PATCHES_VEHICLES                                     :{BLACK}Vozidlá
 STR_CONFIG_PATCHES_STATIONS                                     :{BLACK}Stanice
 STR_CONFIG_PATCHES_ECONOMY                                      :{BLACK}Ekonomika
-STR_CONFIG_PATCHES_AI                                           :{BLACK}Protivnici
+STR_CONFIG_PATCHES_AI                                           :{BLACK}Konkurenti
 
 STR_CONFIG_PATCHES_DISABLED                                     :zakazane
 STR_CONFIG_PATCHES_INT32                                        :{NUM}
@@ -1595,11 +1602,11 @@
 STR_NETWORK_CHAT_COMPANY_CAPTION                                :[Tim] :
 STR_NETWORK_CHAT_COMPANY                                        :[Tim] {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_TO_COMPANY                                     :[Tim] pre {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_CLIENT_CAPTION                                 :[Privany] :
+STR_NETWORK_CHAT_CLIENT_CAPTION                                 :[Súkromne] :
 STR_NETWORK_CHAT_CLIENT                                         :[Osobny] {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privatny] pre {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_ALL_CAPTION                                    :[Vsetci] :
-STR_NETWORK_CHAT_ALL                                            :[Vsetci] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_ALL_CAPTION                                    :[Všetkým] :
+STR_NETWORK_CHAT_ALL                                            :[Všetkým] {STRING}: {GRAY}{STRING}
 STR_NETWORK_NAME_CHANGE                                         :si zmenil meno na
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Server ukoncil relaciu
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Server sa restartuje ...{}Cakajte prosim ...
@@ -1708,7 +1715,7 @@
 ##id 0x1800
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Cesta musi byt najskor odstranena
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Prebiehaju cestne prace
-STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Vystavba cesty
+STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Výstavba cesty
 STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Výstavba elektrickovej trate
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Vyber cestny most
 STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... na jednosmerných cestách nie sú dovolené križovatky
@@ -1724,10 +1731,12 @@
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Nemozno postavit vykladku ...
 STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Nie je možné postavit elektrickovú osobnú stanicu ...
 STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Nie je možné postavit elektrickovú nákladnú stanicu ...
-STR_180A_ROAD_CONSTRUCTION                                      :Vystavba cesty
+STR_180A_ROAD_CONSTRUCTION                                      :Výstavba cesty
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Výstavba elektrickovej dráhy
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Postavit cast cesty
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Stavat casti ciest použitím automatického módu
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Postavit cast elektrickovej dráhy
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Stavat casti elektrickovej trate použitím automatického módu
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Postavit garaz (na vyroby a opravy automobilov)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Postavit elektrickové depo
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Postavit autobusovu zastavku
@@ -1738,6 +1747,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Postavit most s elektrickovou dráhou
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Postavit cestny tunel
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Postavit tunel s elektrickovou dráhou
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Prepnút stavbu jednosmerných ciest
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Prepnut stavbu/odstranovanie cesty
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Prepnút stavbu/odstranovanie elektrickovej dráhy
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Vybrat orientaciu garaze
@@ -1759,6 +1769,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Budova sa musi zburat
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Obyvatelstvo: {ORANGE}{COMMA}{BLACK}  Domov: {ORANGE}{COMMA}
@@ -2060,9 +2071,9 @@
 STR_482F_COST                                                   :{BLACK}Cena: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Tento typ priemyslu sa tu neda postavit ...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}... les sa moze sadit len pod ciarou snehu
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} oznamuje skore uzavretie!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Zasobovacie problemy donutili {INDUSTRY} oznamit skore uzavretie!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Nedostatok dostupnej drevnej suroviny donutil {INDUSTRY} oznamit skore uzavretie!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} oznamuje skore uzavretie!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Kvôli zásobovacím problémom {STRING} oznamuje skoré uzavretie!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Nedostatok dostupnej drevnej suroviny donutil {STRING} oznamit skore uzavretie!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} zvyšuje produkciu!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nove nalezisko uhlia sa objavilo v {INDUSTRY}!{}Ocakava sa zdvojnasobenie produkcie!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nove nalezisko ropy sa objavilo na {INDUSTRY}!{}Ocakava sa zdvojnasobenie produkcie!
@@ -2081,6 +2092,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Konce mosta nie sú v rovnakej výške
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Most je príliš nízky pre tento terén
 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}
@@ -2114,7 +2127,7 @@
 ##id 0x5800
 STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}V ceste je prekazka
 STR_5801_TRANSMITTER                                            :Vysielac
-STR_5802_LIGHTHOUSE                                             :Majak
+STR_5802_LIGHTHOUSE                                             :Maják
 STR_5803_COMPANY_HEADQUARTERS                                   :Sidlo firmy
 STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}... sidlo firmy v ceste
 STR_5805_COMPANY_OWNED_LAND                                     :Spolocnostou vlastneny pozemok
@@ -2181,20 +2194,20 @@
 ############ range for difficulty levels ends
 
 ############ range for difficulty settings starts
-STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Max. pocet konkurentov: {ORANGE}{COMMA}
+STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Maximálny pocet konkurentov: {ORANGE}{COMMA}
 STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}Vznik konkurencie: {ORANGE}{STRING}
 STR_6807_NO_OF_TOWNS                                            :{LTBLUE}Pocet miest: {ORANGE}{STRING}
 STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}Pocet priemyslu: {ORANGE}{STRING}
 STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}Maximálny prvotný úver: {ORANGE}{CURRENCY}
 STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}Pociatocny urok: {ORANGE}{COMMA}%
-STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Náklady na prevádzku vozidiel: {ORANGE}{STRING}
+STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Nákladnost prevádzky vozidiel: {ORANGE}{STRING}
 STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}Rychlost konkurencie: {ORANGE}{STRING}
 STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}Inteligencia konkurencie: {ORANGE}{STRING}
 STR_680E_VEHICLE_BREAKDOWNS                                     :{LTBLUE}Poruchy vozidiel: {ORANGE}{STRING}
 STR_680F_SUBSIDY_MULTIPLIER                                     :{LTBLUE}Nasobok dotacii: {ORANGE}{STRING}
-STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}Náklady na výstavbu: {ORANGE}{STRING}
+STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}Nákladnost výstavby: {ORANGE}{STRING}
 STR_6811_TERRAIN_TYPE                                           :{LTBLUE}Typ terénu: {ORANGE}{STRING}
-STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}Rozsah oceanov/jazier: {ORANGE}{STRING}
+STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}Rozloha vodnej plochy: {ORANGE}{STRING}
 STR_6813_ECONOMY                                                :{LTBLUE}Ekonomika: {ORANGE}{STRING}
 STR_6814_TRAIN_REVERSING                                        :{LTBLUE}Otacanie vlakov: {ORANGE}{STRING}
 STR_6815_DISASTERS                                              :{LTBLUE}Havarie: {ORANGE}{STRING}
@@ -2213,13 +2226,13 @@
 STR_681D_MEDIUM                                                 :Stredne
 STR_681E_FAST                                                   :Rychle
 STR_681F_VERY_FAST                                              :Velmi rychle
-STR_VERY_LOW                                                    :Velmi nizke
-STR_6820_LOW                                                    :Nízky
-STR_6821_MEDIUM                                                 :Stredne
-STR_6822_HIGH                                                   :Vysoký
+STR_VERY_LOW                                                    :Velmi nízka
+STR_6820_LOW                                                    :Nízka
+STR_6821_MEDIUM                                                 :Stredná
+STR_6822_HIGH                                                   :Vysoká
 STR_6823_NONE                                                   :Ziadne
-STR_6824_REDUCED                                                :Znizene
-STR_6825_NORMAL                                                 :Normálny
+STR_6824_REDUCED                                                :Obmedzené
+STR_6825_NORMAL                                                 :Normálne
 STR_6826_X1_5                                                   :x1.5
 STR_6827_X2                                                     :x2
 STR_6828_X3                                                     :x3
@@ -2360,7 +2373,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Premiestnit sidlo
 STR_COMPANY_PASSWORD                                            :{BLACK}Heslo
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Heslo-ochrana vasej spolocnosti proti neautorizovanemu pripojeniu hracov
-STR_SET_COMPANY_PASSWORD                                        :Nastavte heslo spolocnosti
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Nastavte heslo spolocnosti
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Svetova kriza!{}{}Financni experti maju obavy z prepadu ekonomiky!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Koniec krizy!{}{}Ocakava sa vzostup predaja a posilnenie ekonomiky!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Prepnut velkost okna
@@ -2372,7 +2385,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}25% podiel v tejto spolocnosti sa neda kupit ...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}25% podiel v tejto spolocnosti sa neda predat ...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% vlastnene {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% vlastnene {COMPANY}{}   {COMMA}% vlastnene {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} bola kupena spolocnostou {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}S akciami tejto spolocnosti nie je zatial mozne obchodovat ...
 
@@ -2745,7 +2757,7 @@
 STR_REFIT                                                       :{BLACK}Prestavba
 STR_REFIT_TIP                                                   :{BLACK}Vyberte typ nákladu na prestavbu v tomto poradí. CTRL+klik na odstránenie príkazu prestavby
 STR_REFIT_ORDER                                                 :(Prestavba na {STRING})
-STR_TIMETABLE_VIEW                                              :{BLACK}Cestovný poriadok
+STR_TIMETABLE_VIEW                                              :{BLACK}CP
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Prepnút na zobrazenie cestovného poriadku
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Prikazy)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Koniec prikazov - -
@@ -2841,6 +2853,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nové {STRING} dostupné!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Nie je možné predat znicené vozidlo ...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Vozidlu nie je možné zadat cestovný poriadok ...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Vozidlá možu cakat len v staniciach.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Toto vozidlo nezastavuje v tejto stanici.
@@ -2849,8 +2863,8 @@
 STR_TIMETABLE_STATUS_LATE                                       :Toto vozidlo mešká {STRING}
 STR_TIMETABLE_STATUS_EARLY                                      :Toto vozidlo ide {STRING} skor
 STR_TIMETABLE_TOTAL_TIME                                        :Na dokoncenie cestovného poriadku je potrebných {STRING}
-STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :Na dokoncenie cestovného poriadku je potrebných najmenej {STRING} (nie všetko je urcené)
-STR_TIMETABLE_AUTOFILL                                          :{BLACK}Autovyplnenie
+STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :Na dokoncenie cestovného poriadku je potrebných min. {STRING} (nie všetko je urcené)
+STR_TIMETABLE_AUTOFILL                                          :{BLACK}Vyplnit
 STR_TIMETABLE_AUTOFILL_TOOLTIP                                  :{BLACK}Vyplnit cestovný poriadok automaticky hodnotami z prvej cesty
 
 ##id 0x9000
@@ -3025,7 +3039,7 @@
 STR_A01A_CAPACITY                                               :{BLACK}Kapacita: {LTBLUE}{CARGO}
 STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}Lietadlo musi byt zastavene v hangari
 STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Nie je mozne predat lietadlo ...
-STR_A01D_AIRPORT_CONSTRUCTION                                   :Vystavba letiska
+STR_A01D_AIRPORT_CONSTRUCTION                                   :Výstavba letiska
 STR_A01E_BUILD_AIRPORT                                          :{BLACK}Postavit letisko
 STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Lietadlo - kliknut pre informacie
 STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES                            :{BLACK}Vyrobit nove lietadlo (potrebne letisko z hangarom)
@@ -3129,7 +3143,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Neplatný parameter {STRING}: parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} musí byt nahratý pred {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} musí byt nahratý po {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} vyžaduje verziu OpenTTD {STRING} alebo vyššiu.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF súbor bol navrhnutý na preklad
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Nahraných príliš vela NewGRF súborov.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Pridat
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Pridat NewGRF súbor do zoznamu
@@ -3284,17 +3300,17 @@
 
 ########### String for New Landscape Generator
 
-STR_GENERATE                                                    :{WHITE}Generovat
+STR_GENERATE                                                    :{WHITE}Vytvorit
 STR_RANDOM                                                      :{BLACK}Nový kód
 STR_RANDOM_HELP                                                 :{BLACK}Zmenit nahodny kod pre generovanie terenu
-STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Generovanie krajiny
+STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Vytvorenie krajiny
 STR_RANDOM_SEED                                                 :{BLACK}Náhodný kód:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Kliknite pre zadanie nahodneho kodu
 STR_LAND_GENERATOR                                              :{BLACK}Generátor krajiny:
 STR_TREE_PLACER                                                 :{BLACK}Generátor stromov:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Orientacia vyskovej mapy:
 STR_TERRAIN_TYPE                                                :{BLACK}Typ terénu:
-STR_QUANTITY_OF_SEA_LAKES                                       :{BLACK}Mnozstvo jazier:
+STR_QUANTITY_OF_SEA_LAKES                                       :{BLACK}Rozloha mora:
 STR_SMOOTHNESS                                                  :{BLACK}Clenitost:
 STR_SNOW_LINE_HEIGHT                                            :{BLACK}Vyska linie snehu:
 STR_DATE                                                        :{BLACK}Rok:
@@ -3318,7 +3334,7 @@
 STR_GENERATION_ABORT_MESSAGE                                    :{YELLOW}Skutocne chcete ukoncit generovanie?
 STR_PROGRESS                                                    :{WHITE}{NUM}% hotovych
 STR_GENERATION_PROGRESS                                         :{BLACK}{NUM} / {NUM}
-STR_WORLD_GENERATION                                            :{BLACK}Generovanie krajiny
+STR_WORLD_GENERATION                                            :{BLACK}Vytvorenie krajiny
 STR_TREE_GENERATION                                             :{BLACK}Generovanie stromov
 STR_UNMOVABLE_GENERATION                                        :{BLACK}Nepohyblive generovanie
 STR_CLEARING_TILES                                              :{BLACK}Generovanie nerovnosti a skal
@@ -3338,6 +3354,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Vycentrovat malu mapu na aktualnu poziciu
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Male
@@ -3444,3 +3461,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Vyhladat
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Postavit
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Vyberte vhodný typ priemyslu zo zoznamu
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Rozšírený
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Rozšírený výber tváre.
+STR_FACE_SIMPLE                                                 :{BLACK}Jednoduchý
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Jednoduchý výber tváre.
+STR_FACE_LOAD                                                   :{BLACK}Nahrat
+STR_FACE_LOAD_TIP                                               :{BLACK}Nahrat oblúbenú tvár
+STR_FACE_LOAD_DONE                                              :{WHITE}Vaša oblúbená tvár bola nahratá z kofiguracného súboru.
+STR_FACE_FACECODE                                               :{BLACK}Kód tváre
+STR_FACE_FACECODE_TIP                                           :{BLACK}Zobrazit/nastavit kód tváre
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Zobrazit/nastavit kód tváre
+STR_FACE_FACECODE_SET                                           :{WHITE}Nový kód tváre bol nastavený.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Nie je možné nastavit kód tváre - povolené je číslo od 0 do 4 294 967 295!
+STR_FACE_SAVE                                                   :{BLACK}Uložit
+STR_FACE_SAVE_TIP                                               :{BLACK}Uložit oblúbenú tvár
+STR_FACE_SAVE_DONE                                              :{WHITE}Táto tvár bude uložená ako oblúbená do konfiguracného súboru.
+STR_FACE_EUROPEAN                                               :{BLACK}Európan
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Vybrat európske tváre
+STR_FACE_AFRICAN                                                :{BLACK}African
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Vybrat africké tváre
+STR_FACE_YES                                                    :áno
+STR_FACE_NO                                                     :nie
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Povolit fúzy alebo náušnicu
+STR_FACE_HAIR                                                   :Vlasy:
+STR_FACE_HAIR_TIP                                               :{BLACK}Zmenit vlasy
+STR_FACE_EYEBROWS                                               :Obocie:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Zmenit obocie
+STR_FACE_EYECOLOUR                                              :Farba ocí:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Zmenit farbu ocí
+STR_FACE_GLASSES                                                :Okuliare:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Povolit okuliare
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Zmenit okuliare
+STR_FACE_NOSE                                                   :Nos:
+STR_FACE_NOSE_TIP                                               :{BLACK}Zmenit nos
+STR_FACE_LIPS                                                   :Pery:
+STR_FACE_MOUSTACHE                                              :Fúzy:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Zmenit pery alebo fúzy
+STR_FACE_CHIN                                                   :Brada:
+STR_FACE_CHIN_TIP                                               :{BLACK}Zmenit bradu
+STR_FACE_JACKET                                                 :Sako
+STR_FACE_JACKET_TIP                                             :{BLACK}Zmenit sako
+STR_FACE_COLLAR                                                 :Golier:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Zmenit golier
+STR_FACE_TIE                                                    :Kravata:
+STR_FACE_EARRING                                                :Náušnica:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Zmenit kravatu alebo náušnicu
+########
--- a/src/lang/slovenian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/slovenian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -636,6 +636,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informacije o podjetju
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Odpiranje / zapiranje industrij
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Ekonomske spremembe
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Proizvodne spremembe industrij v igralčevi oskrbi
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Proizvodne spremembe industrij v oskrbi tekmecev
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Spremembe proizvodnje drugih industrij
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Nasveti / informacije o igralčevem vozilu
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nova vozila
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Spremebe v sprejemanju tovora
@@ -902,6 +905,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Odpri novo industrijo
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE} ... gradnja mogoča samo v mestih
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE} ... gradnja mogoča samo v območju deževnega gozda
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE} ... gradnja mogoča samo v puščavi
@@ -1089,6 +1093,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Cestna vozila v vrsti (s quantum efekti): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Premakni okno, ko je miška na robu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Dovoli podkupovanje mestnih oblasti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Dovoli nakup ekskluzivnih prevoznih dovoljenj: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Dovoli pošiljanje denarja drugim podjetjem: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Neenake postaje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novo skupno iskanje poti (NPF, prevlada NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Koeficient teže tovora za simulacijo težkih vlakov: {ORANGE}{STRING}
@@ -1229,6 +1235,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Razmerje mest, ki bodo rastla z dvakratno hitrostjo: {ORANGE}1 v {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Razmerje mest, ki bodo rastla z dvakratno hitrostjo: {ORANGE}Brez
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Začetni faktor rasti mesta: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Odstrani absurdne cestne elemente med gradnjo cest
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Vmesnik
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Gradnja
@@ -1705,7 +1712,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Gradnja ceste
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Gradnja tramvaj proge
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Zgradi cestni odsek
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Gradnja cestnega odseka v avtomatskem načinu
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Zgradi odsek proge
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Gradnja tramvaj proge v avtomatskem načinu
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Zgradi garažo (za izdelavo in servis vozil)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Zgradi tramvaj garažo (za izdelavo in servisiranje vozil)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Zgradi avtobusno postajo
@@ -1716,6 +1725,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Zgradi most za tramvaj
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Zgradi cestni predor
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Zgradi predor za tramvaj
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Omogoči/onemogoči enosmerne ceste
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Preklopi gradnja/rušenje cestnih konstrukcij
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Preklop gradi/odstrani za tramvaj progo
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Izberi smer garaže
@@ -1737,6 +1747,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Najprej mora biti stavba porušena
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Prebivalstvo: {ORANGE}{COMMA}{BLACK}  Število stavb: {ORANGE}{COMMA}
@@ -2076,9 +2087,9 @@
 STR_482F_COST                                                   :{BLACK}Cena: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Nemogoča gradnja tega tipa industrije tukaj...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE} ... gozd je mogoče posaditi samo nad nivojem snežne odeje
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} napoveduje preteče zapiranje!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Zaradi težav z dobavo zalog, {INDUSTRY} napoveduje preteč stečaj!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Zaradi pomanjkanja bližnjih dreves, {INDUSTRY} napoveduje stečajni postopek!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} napoveduje preteče zapiranje!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Zaradi težav z dobavo zalog, {STRING} napoveduje preteč stečaj!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Zaradi pomanjkanja bližnjih dreves, {STRING} napoveduje stečajni postopek!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} povečuje proizvodnjo!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nova žila premoga odkrita v {INDUSTRY}!{}Pričakuje se podvojitev proizvodnje!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nove rezerve nafte odkrite v {INDUSTRY}!{}Predvidena podvojitev proizvodnje!
@@ -2097,6 +2108,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Priključki mosta niso na enaki višini
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Most je prenizek za teren
 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}
@@ -2376,7 +2389,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Preseli sedež
 STR_COMPANY_PASSWORD                                            :{BLACK}Geslo
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Zaščiti svoje podjetje z geslom, da preprečiš priključitev drugih uporabnikov k podjetju.
-STR_SET_COMPANY_PASSWORD                                        :Nastavi geslo podjetja
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Nastavi geslo podjetja
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Svetovna recesija!{}{}Ekonomisti se bojijo najhujšega ob trenutnem poteku dogodkov!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Konec recesije!{}{}Izboljšanje trgovanja povečuje zaupanje domače industrije, gospodarstvo napreduje!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Preklopi veliko/majhno velikost okna
@@ -2388,7 +2401,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Ni mogoče kupiti 25% delnic tega podjetja ...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Ni mogoče prodati 25% delnic tega podjetja ...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% v lasti podjetja {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% v lasti podjetja {COMPANY}{}   {COMMA}% v lasti podjetja {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :Podjetje {BLACK}{BIGFONT}{COMPANY} je bilo prevzeto s strani podjetja {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Podjetje še ni dovolj staro, da bi lahko trgovalo z lastnimi delnicami ...
 
@@ -2857,6 +2869,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Novo! {STRING} sedaj na razpolago!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Ni mogoča prodaja uničenega vozila...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Nemogoče določiti časa vozilu...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Vozila lahko čakajo le na postajah.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}To vozilo se ne ustavlja na tej postaji.
@@ -3145,7 +3159,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Neveljavna nastavitev za {STRING}: nastavitev {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} je potrebno naložiti pred {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} je potrebno naložiti po {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} potrebuje OpenTTD različico {STRING} ali boljšo.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF datoteka je bila narejena za prevod
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Preveč NewGrf-jev je naloženih.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Dodaj
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Dodaj NewGRF datoteko na seznam
@@ -3354,6 +3370,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centrira majhen zemljevid na trenutno točko
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Majno letališče
@@ -3460,3 +3477,54 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Obetajoča
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Zgradi
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Izberi primerno industrijo iz tega seznama
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Napredno
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Napredna izbira obraza.
+STR_FACE_SIMPLE                                                 :{BLACK}Enostavno
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Enostavna izbira obraza.
+STR_FACE_LOAD                                                   :{BLACK}Naloži
+STR_FACE_LOAD_TIP                                               :{BLACK}Naloži piljubljen obraz
+STR_FACE_LOAD_DONE                                              :{WHITE}Tvoj priljubljen obraz je bil naložen iz OpenTTD konfiguracije.
+STR_FACE_FACECODE                                               :{BLACK}Obraz igralca št.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Prikaži in/ali nastavi številko obraza igralca
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Prikaži in/ali nastavi številko obraza igralca
+STR_FACE_FACECODE_SET                                           :{WHITE}Nova koda številke obraza je nastavljena.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Nemogoča nastavitev številke obraza igralca - izbor mogoč med 0 in 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Shrani
+STR_FACE_SAVE_TIP                                               :{BLACK}Shrani priljubljen obraz
+STR_FACE_SAVE_DONE                                              :{WHITE}Ta obraz bo shranjen kot tvoj priljubljen v konfiguracijo OpenTTD.
+STR_FACE_EUROPEAN                                               :{BLACK}Evropski
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Izbor evropskih obrazov
+STR_FACE_AFRICAN                                                :{BLACK}Afriški
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Izbor afriških obrazov
+STR_FACE_YES                                                    :Da
+STR_FACE_NO                                                     :Ne
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Vklop brk ali uhanov
+STR_FACE_HAIR                                                   :Lasje:
+STR_FACE_HAIR_TIP                                               :{BLACK}Spremeni lase
+STR_FACE_EYEBROWS                                               :Obrvi:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Spremeni obrvi
+STR_FACE_EYECOLOUR                                              :Barva oči:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Spremeni barvo oči
+STR_FACE_GLASSES                                                :Očala:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Vklopi očala
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Spremeni očala
+STR_FACE_NOSE                                                   :Nos:
+STR_FACE_NOSE_TIP                                               :{BLACK}Spremeni nos
+STR_FACE_LIPS                                                   :Ustnice:
+STR_FACE_MOUSTACHE                                              :Brke:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Spremeni ustnice ali brke
+STR_FACE_CHIN                                                   :Brada:
+STR_FACE_CHIN_TIP                                               :{BLACK}Spremeni brado
+STR_FACE_JACKET                                                 :Jakna:
+STR_FACE_JACKET_TIP                                             :{BLACK}Spremeni jakno
+STR_FACE_COLLAR                                                 :Ovratnik:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Spremeni ovratnik
+STR_FACE_TIE                                                    :Kravata:
+STR_FACE_EARRING                                                :Uhani:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Spremeni kravato ali uhane
+########
+
+############ signal GUI
+########
--- a/src/lang/spanish.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/spanish.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -595,6 +595,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Información de la empresa
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Aperturas/ cierres de industrias
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Cambios en la economía
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Cambios de producción en las industrias servidas por el jugador
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Cambios de producción en las industrias servidas por los competidores
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Cambios de producción de otras industrias
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Sugerencias/info. sobre vehículos del jugador
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nuevos vehículos
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Cambios en la aceptación de carga
@@ -861,6 +864,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Fundar nueva industria
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...sólo se puede construir en poblaciones
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...sólo se puede construir en áreas de selva
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...sólo se puede construir en áreas desérticas
@@ -1048,6 +1052,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Cola de vehículos de carretera (con efecto cuantificador): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Desplazar ventana mediante el cursor en los bordes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Permitir sobornos a la autoridad local: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Permitir comprar derechos de transporte exclusivos: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permitir enviar dinero a otras empresas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estaciones no uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nuevo sistema de busq. de rutas global (NPF, anula a NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Carga el multiplicador de peso para simular trenes pesados: {ORANGE}{STRING}
@@ -1188,6 +1194,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporción de ciudades que crecerán el doble de rápido: {ORANGE}1 de {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporción de ciudades que crecerán el doble de rápido: {ORANGE}Ninguna
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicador inicial tamaño de ciudad: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Quitar elementos absurdos de la carretera durante su construcción
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interfaz
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construcción
@@ -1664,7 +1671,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Construcción de carretera
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Construcción de tranvía
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construir sección de carretera
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Construir carretera usando el modo de Autocarretera
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Construir sección de tranvía
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Construir metro usando el modo de Autometro
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construir depósito de carretera (para construir y despachar vehículos)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Construir depósito de tranvías (para vehículos de contrucción y servicio)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Construir estación de autobús
@@ -1675,6 +1684,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Construir puente de tranvía
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Construir túnel de carretera
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Construir tunel de tranvía
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Activar/Desactivar carreteras de un sentido
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Cambiar entre construir/retirar carretera
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Activar construir/quitar para construcciones de tranvía
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Elegir orientación del depósito de carretera
@@ -1696,6 +1706,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}El edificio debe demolerse primero
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Habitantes: {ORANGE}{COMMA}{BLACK}  Casas: {ORANGE}{COMMA}
@@ -1997,9 +2008,9 @@
 STR_482F_COST                                                   :{BLACK}Coste: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}No se puede construir este tipo de industria aquí...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...sólo se puede plantar un bosque sobre la línea nevada
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}¡La industria de {INDUSTRY} anuncia cierre inminente!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemas con el suministro causa que {INDUSTRY} anuncie su cierre inminente!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}¡La falta de árboles cercanos causa que  {INDUSTRY} anuncie su cierre inmediato!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}¡La industria de {STRING} anuncia cierre inminente!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemas con el suministro causa que {STRING} anuncie su cierre inminente!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}¡La falta de árboles cercanos causa que  {STRING} anuncie su cierre inmediato!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}¡{INDUSTRY} incrementa su producción!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}¡Nueva veta de carbón encontrada en {INDUSTRY}!{}¡Se espera doblar la producción!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}¡Nuevas reservas de petróleo encontradas en {INDUSTRY}!{}¡Se espera doblar la producción!
@@ -2018,6 +2029,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Las cabeceras del puente no están al mismo nivel
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}El puente es demasiado bajo para el terreno
 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}
@@ -2297,7 +2310,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Reubicar Sede
 STR_COMPANY_PASSWORD                                            :{BLACK}Contraseña
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Protege por contraseña tu empresa para prevenir que usuarios no autorizados se unan a ella.
-STR_SET_COMPANY_PASSWORD                                        :Configurar contraseña de empresa
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Configurar contraseña de empresa
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}¡Recesión Mundial!{}{}¡Los expertos financieros son pesimistas mientras la economía se hunde!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}¡Fin de la Recesión!{}{}¡Mejora en el comercio da ánimos a las industrias mientras la economía se fortalece!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Cambiar entre tamaño de ventana grande/pequeño
@@ -2309,7 +2322,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}No se puede comprar el 25% de acciones...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}No se puede vender el 25% de acciones...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% propiedad de {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% propiedad de {COMPANY}{}   {COMMA}% propiedad de {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} ha sido comprada por {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Esta empresa todavía no dispone acciones a la venta...
 
@@ -2778,6 +2790,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nuevo {STRING} ahora disponible!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}No se puede vender un vehículo destruido...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}No se puede ajustar horarios al vehículo...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Los vehículos solo pueden esperar en las estaciones.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Este vehículo no está parando en esta estación.
@@ -3066,7 +3080,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Parámetro incorrecto para {STRING}: parametro {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} debe ser cargado antes de {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} debe ser cargado después de {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} requiere OpenTTD versión {STRING} o superior.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :el fichero GRF ha sido diseñado para ser traducido
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Demasiados NewGRFs han sido cargados.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Añadir
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Añadir un NewGRF a la lista
@@ -3275,6 +3291,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centrar el mapa pequeño a la posición actual
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Pequeño
@@ -3381,3 +3398,54 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Perspectiva
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Construir
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Seleccione la industria apropiada de la lista
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avanzado
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Selección avanzada de caras.
+STR_FACE_SIMPLE                                                 :{BLACK}Simple
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Selección simple de caras.
+STR_FACE_LOAD                                                   :{BLACK}Cargar
+STR_FACE_LOAD_TIP                                               :{BLACK}Cargar cara favorita
+STR_FACE_LOAD_DONE                                              :{WHITE}Tu cara favorita ha sido cargada del fichero de configuración de OpenTTD.
+STR_FACE_FACECODE                                               :{BLACK}Cara del jugador no.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Ver y/o asignar número de cara del jugador
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Ver y/o asignar número de cara del jugador
+STR_FACE_FACECODE_SET                                           :{WHITE}Nuevo código de cara ha sido asignado.
+STR_FACE_FACECODE_ERR                                           :{WHITE}No se puede asignar código de cara - debe ser un valor numérico de 0 a 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Guardar
+STR_FACE_SAVE_TIP                                               :{BLACK}Guardar cara favorita
+STR_FACE_SAVE_DONE                                              :{WHITE}Esta cara ha sido guardada como tu favorita en el fichero de configuración.
+STR_FACE_EUROPEAN                                               :{BLACK}Europea
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Selecciona caras europeas
+STR_FACE_AFRICAN                                                :{BLACK}Africana
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Selecciona caras africanas
+STR_FACE_YES                                                    :Si
+STR_FACE_NO                                                     :No
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Activar bigotes o pendientes
+STR_FACE_HAIR                                                   :Pelo:
+STR_FACE_HAIR_TIP                                               :{BLACK}Cambiar pelo
+STR_FACE_EYEBROWS                                               :Cejas:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Cambiar cejas
+STR_FACE_EYECOLOUR                                              :Color ojos:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Cambiar color de ojos
+STR_FACE_GLASSES                                                :Gafas:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Activar gafas
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Cambiar gafas
+STR_FACE_NOSE                                                   :Nariz:
+STR_FACE_NOSE_TIP                                               :{BLACK}Cambiar nariz
+STR_FACE_LIPS                                                   :Labios:
+STR_FACE_MOUSTACHE                                              :Bigote:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Cambiar labios o bigote
+STR_FACE_CHIN                                                   :Barbilla:
+STR_FACE_CHIN_TIP                                               :{BLACK}Cambiar barbilla
+STR_FACE_JACKET                                                 :Chaqueta:
+STR_FACE_JACKET_TIP                                             :{BLACK}Cambiar chaqueta
+STR_FACE_COLLAR                                                 :Cuello:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Cambiar cuello
+STR_FACE_TIE                                                    :Corbata:
+STR_FACE_EARRING                                                :Pendientes:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Cambiar corbata o pendientes
+########
+
+############ signal GUI
+########
--- a/src/lang/swedish.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/swedish.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -594,6 +594,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Företagsinformation
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Öppning / stängning av industrier
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Förändringar av ekonomin
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Förändringar i produktion vid industrier trafikerad av spelaren
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Förändringar i produktion vid industrier trafikerad av motståndare
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Andra förändringar i produktion vid industrier.
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Råd / information om spelarens fordon
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nya fordon
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Ändringar i godsacceptans
@@ -847,9 +850,9 @@
 STR_0305_QUIT_OPENTTD                                           :{BLACK}Avsluta 'OpenTTD'
 STR_0307_OPENTTD                                                :{WHITE}OpenTTD {REV}
 STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan bara byggas i städer
-STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Välj 'tempererad' typ av landskap
-STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE                            :{BLACK}Välj 'sub-arktiskt' typ av landskap
-STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE                          :{BLACK}Välj 'sub-tropiskt' typ av landskap
+STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Välj 'tempererad' som typ av landskap
+STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE                            :{BLACK}Välj 'sub-arktiskt' som typ av landskap
+STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE                          :{BLACK}Välj 'sub-tropiskt' som typ av landskap
 STR_0311_SELECT_TOYLAND_LANDSCAPE                               :{BLACK}Välj 'leksaksland' som typ av landskap
 STR_0312_FUND_CONSTRUCTION_OF_NEW                               :{BLACK}Bekosta bygget av en ny industri
 
@@ -860,6 +863,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Bekosta ny industri
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan bara byggas i städer
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...kan bara byggas i regnskog
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...kan bara byggas i öken
@@ -1020,6 +1024,7 @@
 STR_CONFIG_PATCHES_ON                                           :På
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Visa fordonshastighet i statusfältet: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Tillåt byggnation på sluttningar och kuster: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Tillåt terraformning under byggnader, spår, etc. (autoslope): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Tillåt mer realistiska uppsamlingsområden för stationer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Tillåt borttagning av mera stadsägda vägar etc.: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Tillåt väldigt långa tåg: {ORANGE}{STRING}
@@ -1046,6 +1051,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Vägfordonsköer (med kvanteffekter): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Scrolla vyn när musen är vid kanten: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Tillåt mutning av de lokala myndigheterna: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Tillåt köp av exklusiva transporträttigheter: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Tillåt skicka pengar till andra företag: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Icke-rektangulära stationer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ny globalt sätt att hitta rutt (NPF, åsidosätter NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Godsfaktor för att simulera tunga tåg: {ORANGE}{STRING}
@@ -1186,6 +1193,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Andel av städerna som kommer växa dubbelt så fort: {ORANGE}1 av {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Andel av städerna som kommer växa dubbelt så fort: {ORANGE}Inga
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Initial stadsstorleks multiplikator: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Ta bort absurda väg-element under vägkonstruktion
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Gränssnitt
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruktion
@@ -1662,7 +1670,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Bygg väg
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Spårvagnskonstruktion
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Bygg väg
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Använd Automatvägläge för att bygga vägsektion
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Bygg spårvagnssektion
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Använd Automatspårläge för att bygga spårväg
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Bygg bussgarage (för att bygga eller reparera vägfordon)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Bygg spårvagnsdepå (för att konstruera och serva fordon)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Bygg busshållplats
@@ -1673,6 +1683,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Bygg spårvagnsbro
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Bygg vägtunnel
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Bygg spårvagnstunnel
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Aktivera/Deaktivera enkelriktade vägar
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Växla mellan att bygga/ta bort väg
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Växla byggande/rivande av spårvagnskonstruktion
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Välj riktning för bussgarage
@@ -1995,9 +2006,9 @@
 STR_482F_COST                                                   :{BLACK}Kostnad: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Kan inte bygga denna typ av industri här...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...skog kan bara planteras ovanför snölinjen
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} meddelar att de stänger ner snarast!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Leveransproblem får {INDUSTRY} att meddela att de stänger ner snarast!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Avsaknad av träd får {INDUSTRY} att meddela att de stänger ner snarast!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} meddelar att de stänger ner snarast!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Leveransproblem får {STRING} att meddela att de stänger ner snarast!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Avsaknad av träd får {STRING} att meddela att de stänger ner snarast!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} ökar produktionen!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nytt lager av kol funnet vid {INDUSTRY}!{}Produktionen fördubblas!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nya oljereserver funna vid {INDUSTRY}!{}Produktionen fördubblas!
@@ -2016,6 +2027,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Broändar ej på samma höjd
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Bro är för låg för terrängen
 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}
@@ -2295,7 +2308,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Flytta högkvarter
 STR_COMPANY_PASSWORD                                            :{BLACK}Lösenord
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Lösenordsskydda ditt företag för att förhindra att obehöriga spelare ansluter.
-STR_SET_COMPANY_PASSWORD                                        :Ange företagets lösenord
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Ange företagets lösenord
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Lågkonjuktur!{}{}Finansexperter befarar det värsta när ekonomin sjunker!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Lågkonjuktur Över!{}{}Uppsving i byteshandeln ger tillförsikt till industrier när ekonomin stärks!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Växla stor/liten fönsterstorlek
@@ -2307,7 +2320,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Kan inte köpa 25% andelar i detta företag...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Kan inte sälja 25% andelar i detta företag...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% ägs av {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% ägs av {COMPANY}{}   {COMMA}% ägs av {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} har tagits över av {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Det här företaget bedriver inte aktiehandel ännu....
 
@@ -2659,7 +2671,7 @@
 
 STR_881C_NEW_RAIL_VEHICLES                                      :{WHITE}Nytt tågfordon
 STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Nya elektriska järnvägsfordon
-STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Nytt monorail-fordon
+STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Nytt monorailfordon
 STR_881E_NEW_MAGLEV_VEHICLES                                    :{WHITE}Nytt maglevfordon
 STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}Rälsfordon
 
@@ -2772,10 +2784,12 @@
 STR_TRAIN_NO_POWER                                              :{RED}Ingen Kraft
 STR_TRAIN_START_NO_CATENARY                                     :Detta spår saknar kedjekurva, så tåget kan inte starta
 
-STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Nya {STRING} är nu tillgänglig!
+STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Ny {STRING} tillgänglig!
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nya {STRING} är nu tillgänglig  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Kan inte sälja förstört fordon...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Kan inte lägga till fordonet i en tidtabell...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Fordon kan enbart vänta vid stationer.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Detta fordon stannar inte vid denna station.
@@ -2783,10 +2797,10 @@
 STR_TIMETABLE_STATUS_ON_TIME                                    :Detta fordon ligger efter i tidtabellen
 STR_TIMETABLE_STATUS_LATE                                       :Detta fordon är för tillfället {STRING} sen
 STR_TIMETABLE_STATUS_EARLY                                      :Detta fordon är för tillfället {STRING} tidig
-STR_TIMETABLE_TOTAL_TIME                                        :Denna tidtabell kommer ta {STRING} att slutföra
+STR_TIMETABLE_TOTAL_TIME                                        :Den här tidtabellen kommer ta {STRING} att slutföra
 STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :Denna tidtabell kommer att ta åtminstonde {STRING} att slutföra (allt är inte inlagt i en tidtabell)
-STR_TIMETABLE_AUTOFILL                                          :{BLACK}Automatisk ifyllning
-STR_TIMETABLE_AUTOFILL_TOOLTIP                                  :{BLACK}Fyll tidtabellen automatiskt med värdet från den första resan
+STR_TIMETABLE_AUTOFILL                                          :{BLACK}Autofyll
+STR_TIMETABLE_AUTOFILL_TOOLTIP                                  :{BLACK}Fyll tidtabellen automatiskt med värdena från första resan
 
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Vägfordon i vägen
@@ -3064,7 +3078,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Felaktig parameter för {STRING}: parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} måste laddas innan {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} måste laddas efter {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} kräver OpenTTD version {STRING} eller bättre.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF-filen den var designad att översätta
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :För många NewGRFer är laddade.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Lägg till
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Lägg till en ny NewGRF-fil till listan
@@ -3273,6 +3289,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centrera den lilla kartan på den nuvarande positionen
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Liten
@@ -3304,7 +3321,7 @@
 
 ########
 
-STR_FEEDER_CARGO_VALUE                                          :{BLACK}Överföringingskredit: {LTBLUE}{CURRENCY}
+STR_FEEDER_CARGO_VALUE                                          :{BLACK} Överför kredit: {LTBLUE}{CURRENCY}
 STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...detta är en stadsägd väg
 STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...vägen pekar i fel riktning
 
@@ -3350,15 +3367,15 @@
 STR_GROUP_CAN_T_CREATE                                          :{WHITE}Kan inte skapa grupp...
 STR_GROUP_CAN_T_DELETE                                          :{WHITE}Kan inte ta bort denna grupp...
 STR_GROUP_CAN_T_RENAME                                          :{WHITE}Kan inte döpa om grupp...
-STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Kan inte ta bort alla fordon från denna grupp...
-STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Kan inte lägga till fordonet till denna grupp...
-STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Kan inte lägga till delade fordon till grupp...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Kan inte ta bort alla fordon i denna grupp...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Kan inte lägga till fordon i denna grupp...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Kan inte lägga till delade fordon i denna grupp...
 
-STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Grupper - Klicka på en grupp för att lista alla fordon i denna grupp
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Gripper - Klicka på en grupp för att lista alla fordon i gruppen
 STR_GROUP_CREATE_TIP                                            :{BLACK}Klicka för att skapa en grupp
-STR_GROUP_DELETE_TIP                                            :{BLACK}Ta bort den valda gruppen
-STR_GROUP_RENAME_TIP                                            :{BLACK}Döp om den valda gruppen
-STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Klicka för att skydda denna grupp från globalt autoutbyte
+STR_GROUP_DELETE_TIP                                            :{BLACK}Ta bort vald grupp
+STR_GROUP_RENAME_TIP                                            :{BLACK}Byt namn på vald grupp
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Klicka för att skydda denna grupp mot allmän autoreplace
 
 STR_COMPANY_NAME                                                :{COMPANY}
 STR_ENGINE_NAME                                                 :{ENGINE}
@@ -3379,3 +3396,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Prospektera
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Bygga
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Välj lämplig industri från denna lista
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Avancerad
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Avancerat ansiktsval.
+STR_FACE_SIMPLE                                                 :{BLACK}Enkelt
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Enkelt ansiktsval.
+STR_FACE_LOAD                                                   :{BLACK}Ladda
+STR_FACE_LOAD_TIP                                               :{BLACK}Ladda favoritansikte
+STR_FACE_LOAD_DONE                                              :{WHITE}Ditt favoritansikte har laddats från OpenTTDs konfigurationsfil.
+STR_FACE_FACECODE                                               :{BLACK}Spelaransikte nummer.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Visa och/eller välj ansiktsnummer
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Visa och/eller välj ansiktsnummer
+STR_FACE_FACECODE_SET                                           :{WHITE}Nytt kod för ansiktsnumret har valts
+STR_FACE_FACECODE_ERR                                           :{WHITE}Kunde inte ange ansiktsnumret. Det måste vara en siffra mellan 0 och 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Spara
+STR_FACE_SAVE_TIP                                               :{BLACK}Spara favoritansikte
+STR_FACE_SAVE_DONE                                              :{WHITE}Det här ansiktet kommer att sparas som ditt favoritansikte i OpenTTDs konfigurationsfil.
+STR_FACE_EUROPEAN                                               :{BLACK}Europeisk
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Välj europeiska ansikten
+STR_FACE_AFRICAN                                                :{BLACK}Afrikanska
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Välj afrikanska ansikten
+STR_FACE_YES                                                    :Ja
+STR_FACE_NO                                                     :Nej
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Aktivera mustasch eller örhänge
+STR_FACE_HAIR                                                   :Hår:
+STR_FACE_HAIR_TIP                                               :{BLACK}Ändra hår
+STR_FACE_EYEBROWS                                               :Ögonbryn:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Ändra ögonbryn
+STR_FACE_EYECOLOUR                                              :Ögonfärg:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Ändra ögonfärg
+STR_FACE_GLASSES                                                :Glasögon:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Aktivera glasögon
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Ändra glasögon
+STR_FACE_NOSE                                                   :Näsa:
+STR_FACE_NOSE_TIP                                               :{BLACK}Ändra näsa
+STR_FACE_LIPS                                                   :Läppar:
+STR_FACE_MOUSTACHE                                              :Mustasch:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Ändra läppar eller mustasch
+STR_FACE_CHIN                                                   :Haka:
+STR_FACE_CHIN_TIP                                               :{BLACK}Ändra haka
+STR_FACE_JACKET                                                 :Jacka:
+STR_FACE_JACKET_TIP                                             :{BLACK}Ändra jacka
+STR_FACE_COLLAR                                                 :Krage:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Ändra krage
+STR_FACE_TIE                                                    :Slips:
+STR_FACE_EARRING                                                :Örhänge:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Ändra slips eller örhänge
+########
--- a/src/lang/traditional_chinese.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/traditional_chinese.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -860,6 +860,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}投資成立工廠
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...只能建在城鎮裡
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...只能建在雨林區
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...只能建在沙漠區
@@ -1047,6 +1048,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}車輛排隊 (量子效應):{ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}滑鼠在視窗邊緣時移動視窗:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}可以向地方政府行賄:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}允許購買運輸公司股份:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}允許資金流通給其他公司:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}不規則形狀車站:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}新路徑搜尋演算法 (NPF 將覆蓋 NTP):{ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}貨物重量系數,以模擬較重列車:{ORANGE}{STRING}
@@ -1187,6 +1190,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}雙倍速增長城市比例: {ORANGE}{STRING} 分之一
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}雙倍速增長城市比例: {ORANGE}沒有
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}市鎮規模初始倍率:{ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}在鋪設道路時移除不合理的路面
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}介面
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}建築
@@ -1663,7 +1667,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :鋪設道路
 STR_180A_TRAMWAY_CONSTRUCTION                                   :鋪設電車軌
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}鋪設一段公路
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}鋪設道路區段時使用自動模式
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}興建電車站
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}鋪設輕軌區段時使用自動模式
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}設置車庫 (用來購置與維護公路車輛)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}興建電車維修廠 (供製造及維修用)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}設置公車站
@@ -1996,9 +2002,9 @@
 STR_482F_COST                                                   :{BLACK}費用:{YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}無法在此新建這種工業...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...森林只能種在雪線以上
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} 宣佈立即關閉!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}原料供給問題使得 {INDUSTRY} 宣告立即關閉!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}附近缺乏樹木使得 {INDUSTRY} 宣告立即關閉!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} 宣佈立即關閉!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}原料供給問題使得 {STRING} 宣告立即關閉!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}附近缺乏樹木使得 {STRING} 宣告立即關閉!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} 提高產量!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}在 {INDUSTRY} 發現新的煤礦層!{}產量可望加倍!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}在 {INDUSTRY} 發現新的油料蘊藏!{}產量可望加倍!
@@ -2017,6 +2023,8 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}必須先摧毀隧道
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}必須先摧毀橋樑
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}不能結束在開始地點
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}橋樑兩端不在同個海拔
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}橋樑太接近地面
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}開始與結束地點必須位在同一直線
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}隧道入口地點不適合
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2296,7 +2304,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}搬移總部
 STR_COMPANY_PASSWORD                                            :{BLACK}密碼
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}以密碼保護您的公司,避免其他玩家隨意接手。
-STR_SET_COMPANY_PASSWORD                                        :設定公司密碼
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}設定公司密碼
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}世界不景氣!{}{}財務專家對經濟蕭條做出最壞打算!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}景氣回升!{}{}湧現的訂單讓工業對經濟熱絡充滿信心!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}切換大/小視窗
@@ -2308,7 +2316,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}無法購買這間公司的股份...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}無法出售這間公司的股份...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% 由 {COMPANY} 擁有)
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% 由 {COMPANY} 擁有{}   {COMMA}% 由 {COMPANY} 擁有)
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} 被 {COMPANY} 收購!
 STR_7080_PROTECTED                                              :{WHITE}這間公司才剛成立,還不能交易股票...
 
@@ -2777,6 +2784,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}{STRING} 問世了! -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}損毀的運具不能出售...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}無法為運具加入時刻表...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}運具只能等待於站點。
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}此運具將不停靠此站點。
@@ -3065,6 +3074,7 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              : {STRING} 的參數無效:{STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :載入前 {1:STRING} 必須先載入 {0:STRING}。
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} 必須在 {STRING} 之後載入。
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} 需要 {STRING} 或更新的 OpenTTD 版本。
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF 檔案翻譯後出現錯誤
 
 STR_NEWGRF_ADD                                                  :{BLACK}新增
@@ -3380,3 +3390,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}探勘
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}設立
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}從列表中選擇適合的工業
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}進階
+STR_FACE_ADVANCED_TIP                                           :{BLACK}進階地選擇新臉孔
+STR_FACE_SIMPLE                                                 :{BLACK}簡易
+STR_FACE_SIMPLE_TIP                                             :{BLACK}簡易地選擇新臉孔
+STR_FACE_LOAD                                                   :{BLACK}載入
+STR_FACE_LOAD_TIP                                               :{BLACK}載入喜愛的臉孔
+STR_FACE_LOAD_DONE                                              :{WHITE}您喜愛的臉孔已從 OpenTTD 設定檔中載入
+STR_FACE_FACECODE                                               :{BLACK}玩家臉孔 No.
+STR_FACE_FACECODE_TIP                                           :{BLACK}檢視與(或)設定玩家臉孔編號
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}檢視與(或)設定玩家臉孔編號
+STR_FACE_FACECODE_SET                                           :{WHITE}新的臉孔編號已設定
+STR_FACE_FACECODE_ERR                                           :{WHITE}無法設定臉孔編號 - 應該要介於 0 到 4,294,967,295 之間!
+STR_FACE_SAVE                                                   :{BLACK}儲存
+STR_FACE_SAVE_TIP                                               :{BLACK}儲存喜愛的臉孔
+STR_FACE_SAVE_DONE                                              :{WHITE}這將被當成您喜愛的臉孔存入 OpenTTD 設定檔
+STR_FACE_EUROPEAN                                               :{BLACK}歐洲人
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}選擇歐洲人臉孔
+STR_FACE_AFRICAN                                                :{BLACK}非洲
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}選擇非洲人臉孔
+STR_FACE_YES                                                    :確定
+STR_FACE_NO                                                     :取消
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}增加鬍鬚或耳飾
+STR_FACE_HAIR                                                   :髮型:
+STR_FACE_HAIR_TIP                                               :{BLACK}改變髮型
+STR_FACE_EYEBROWS                                               :眉毛:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}改變眉毛
+STR_FACE_EYECOLOUR                                              :眼珠顏色:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}改變眼珠顏色
+STR_FACE_GLASSES                                                :眼鏡:
+STR_FACE_GLASSES_TIP                                            :{BLACK}增加眼鏡
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}改變眼鏡
+STR_FACE_NOSE                                                   :鼻子:
+STR_FACE_NOSE_TIP                                               :{BLACK}改變鼻子
+STR_FACE_LIPS                                                   :嘴唇:
+STR_FACE_MOUSTACHE                                              :鬍鬚:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}改變嘴唇或鬍鬚
+STR_FACE_CHIN                                                   :下巴:
+STR_FACE_CHIN_TIP                                               :{BLACK}改變下巴
+STR_FACE_JACKET                                                 :夾克:
+STR_FACE_JACKET_TIP                                             :{BLACK}改變夾克
+STR_FACE_COLLAR                                                 :衣領:
+STR_FACE_COLLAR_TIP                                             :{BLACK}改變衣領
+STR_FACE_TIE                                                    :領帶:
+STR_FACE_EARRING                                                :耳飾:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}改變領帶或耳飾
+########
--- a/src/lang/turkish.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/turkish.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -594,6 +594,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Şirket bilgisi
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Fabrika açılış/kapanışları
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Ekonomi değişimleri
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Oyuncunun hizmet ettiği fabrikalardaki üretim değişiklikleri
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Rakiplerin hizmet ettiği fabrikalardaki üretim değişiklikleri
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Diğer fabrikalardaki üretim değişiklikleri
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Oyuncunun araçlarıyla ilgili ögüt / bilgi
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Yeni araçlar
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Kargo isteğindeki değişiklik
@@ -860,6 +863,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Yeni fabrika aç
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...sadece şehirlere yapılabilir
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...sadece yağmur ormanlarına yapılabilir
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...sadece çöllere yapılabilir
@@ -1046,6 +1050,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Karayolu taşıtları kuyruğa girsin (içiçe geçerek): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Fare kenardayken pencere etkin: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Belediye rüşveti izinli: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Şehrin ulaşım haklarını satın alma izinli: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Diğer şirketlere para gönderme izinli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Özel istasyonlar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Yeni evrensel yol bulma (NPF, NTP üzerinde): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Ağır yük trenleri için ağırlık çarpanı: {ORANGE}{STRING}
@@ -1111,6 +1117,7 @@
 
 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_OFF                   :Kapalı
 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}
@@ -1118,6 +1125,8 @@
 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_TIMETABLE_IN_TICKS                           :{LTBLUE}Zaman tablosunda gün yerine işlemci zamanı kullan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Öntanımlı ray türü (yeni oyundan/oyun yüklemeden sonra): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Normal Ray
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Elektrikli Ray
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Monoray
@@ -1183,6 +1192,7 @@
 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_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Yol yapımı sırasında gerçekçi olmayan yerleri kaldır
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Arayüz
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}İnşaat
@@ -1415,6 +1425,7 @@
 STR_NETWORK_LANG_CZECH                                          :Çekce
 STR_NETWORK_LANG_DANISH                                         :Danimarkaca
 STR_NETWORK_LANG_DUTCH                                          :Hollandaca
+STR_NETWORK_LANG_ESPERANTO                                      :Esperanto
 STR_NETWORK_LANG_FINNISH                                        :Fince
 STR_NETWORK_LANG_HUNGARIAN                                      :Bulgarca
 STR_NETWORK_LANG_ICELANDIC                                      :İzlandaca
@@ -1658,7 +1669,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Yol yapımı
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Tramvay yapımı
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Yol bölmesi yap
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Otoyol modunu kullanarak yol yap
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Tramvay yolu yap
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Otoray modunu kullanarak tramvay yolu yap
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Garaj yap (araç alımı ve bakımlar için)
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Tramvay garı yap (araç alımı ve tamiri için)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Otobüs durağı yap
@@ -1669,6 +1682,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Tramvay köprüsü yap
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Tünel Yap
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Tramvay tüneli yap
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Tek yönlü yolları etkinleştir/kapat
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Yol yap/sil arasında geçiş yap
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Tramvay yapımı/yıkımı
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Garaj yönünü seç
@@ -1991,9 +2005,9 @@
 STR_482F_COST                                                   :{BLACK}Fiyat: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Buraya bu fabrikadan yapılamaz...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...Orman sadece kar sınırı üzerinde olabilir
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} tükendi, kapaniyor!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{INDUSTRY} kaynak sorunları yüzünden kapaniyor!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Yakında ağaç olmadığı için {INDUSTRY} kapanıyor!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} tükendi, kapaniyor!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{STRING} kaynak sorunları yüzünden kapaniyor!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Yakında ağaç olmadığı için {STRING} kapanıyor!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} üretimi arttırdi!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}{INDUSTRY}nde yeni kömür tabakasi bulundu!{} Üretimin ikiye katlanması bekleniyor!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}{INDUSTRY}nda yeni petrol rezervi bulundu!{} Üretimin ikiye katlanması bekleniyor!
@@ -2012,6 +2026,8 @@
 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_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Köprü uçları aynı seviyede değil
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Köprü bu arazi için çok alçakta
 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}
@@ -2291,7 +2307,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Binayı Taşı
 STR_COMPANY_PASSWORD                                            :{BLACK}Parola
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Başkalarınin girmemesi için parola koy.
-STR_SET_COMPANY_PASSWORD                                        :Şirket parolası
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Şirket parolası
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Dünyada Kriz!{}{}Çok büyük bir ekonomik kriz yaşanacağı öngörüldü!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Kriz Atlatıldı!{}{}Ekonomi yine eski güzel günlerine döndü!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Pencere boyutunu büyült/küçült
@@ -2303,7 +2319,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Şirketin %25'i alınamıyor...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Şirketin %25'i satılamıyor...
 STR_707D_OWNED_BY                                               :{WHITE}(%{COMMA} ortağı {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}(%{COMMA} ortağı {COMPANY}{}   %{COMMA} ortağı {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY}, {COMPANY} tarafından alındı!
 STR_7080_PROTECTED                                              :{WHITE}Bu şirket hisselerini satacak kadar eski değil...
 
@@ -2735,6 +2750,8 @@
 STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Seçili talimatı yaparken tren dolana kadar beklesin
 STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Seçili talimatı yaparken tren mutlaka yükünü boşaltsın
 STR_TIMETABLE_TOOLTIP                                           :{BLACK}Zaman çizelgesi - işaretlemek için bir talimata tıklayın.
+STR_TIMETABLE_WAIT_TIME_TOOLTIP                                 :{BLACK}Seçili talimatın harcaması gereken süreyi değiştir
+STR_TIMETABLE_CLEAR_TIME_TOOLTIP                                :{BLACK}Seçili talimatın harcaması gereken süreyi sil
 STR_TIMETABLE_RESET_LATENESS_TOOLTIP                            :{BLACK}Geç kalma sayacını sıfırla, böylece araç zamanında gitmiş sayılacak
 STR_SERVICE_HINT                                                :{BLACK}Bakım gerekmiyorsa bunu atla
 STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Fiyat: {CURRENCY} Ağırlık: {WEIGHT_S}{}Hız: {VELOCITY}  Güç: {POWER}{}Bakım: {CURRENCY}/sene{}Kapasite: {CARGO}
@@ -2770,6 +2787,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}{STRING} artık kullanılabilir!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Hurda araçlar satılamaz...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Aracın zaman çizelgesi oluşturulamıyor...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Araçlar sadece istasyonlarda bekleyebilir.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Araç bu istasyonda durmuyor.
@@ -3058,6 +3077,8 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :{STRING} için geçersiz parametre: {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} önce, {STRING} ondan sonra yüklenmeli.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} sonra, {STRING} ondan önce yüklenmeli.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} OpenTTD {STRING} veya daha yüksek bir sürüm gerektirir.
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Çok fazla NewGRF yüklendi.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Ekle
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Listeye NewGRF dosyası ekle
@@ -3369,3 +3390,29 @@
 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
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Gelişmiş
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Gelişmiş yüz seçimi.
+STR_FACE_SIMPLE                                                 :{BLACK}Basit
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Basit yüz seçimi.
+STR_FACE_LOAD                                                   :{BLACK}Yükle
+STR_FACE_LOAD_TIP                                               :{BLACK}Tercih edilen yüzü yükle
+STR_FACE_LOAD_DONE                                              :{WHITE}Tercih edilen yüz OpenTTD ayar dosyasından yüklendi.
+STR_FACE_FACECODE                                               :{BLACK}Oyuncu yüzü no.
+STR_FACE_SAVE                                                   :{BLACK}Kaydet
+STR_FACE_SAVE_TIP                                               :{BLACK}Tercih edilen yüzü kaydet
+STR_FACE_EUROPEAN                                               :{BLACK}Avrupalı
+STR_FACE_AFRICAN                                                :{BLACK}Afrikalı
+STR_FACE_YES                                                    :Evet
+STR_FACE_NO                                                     :Hayır
+STR_FACE_HAIR                                                   :Saç:
+STR_FACE_EYEBROWS                                               :Kaşlar:
+STR_FACE_EYECOLOUR                                              :Göz rengi:
+STR_FACE_GLASSES                                                :Gözlük:
+STR_FACE_NOSE                                                   :Burun:
+STR_FACE_LIPS                                                   :Dudak:
+STR_FACE_MOUSTACHE                                              :Bıyık:
+STR_FACE_CHIN                                                   :Çene:
+STR_FACE_JACKET                                                 :Ceket:
+########
--- a/src/lang/ukrainian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/ukrainian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -720,6 +720,9 @@
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Інформація компанії
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Відкриття / закриття підприємств
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Зміни в економіці
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Зміна обсягів виробництва на підприємствах гравця
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Зміна обсягів виробництва на підприємствах суперників
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Інші зміни обсягів виробництва
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Поради/інформація про транспорт гравця
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Новий транспорт
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Зміни в попиті на перевезення
@@ -986,6 +989,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Нова промисловість
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...можна будувати лише у містах
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...можна будувати лише у джунглях
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...можна будувати лише у пустелі
@@ -1173,6 +1177,8 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Ставати транспорту в чергу: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Прокручувати вікно, коли курсор з краю: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Дозволити підкупляти місцеву владу: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Дозволити купувати ексклюзивні права на перевезення: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Дозволити передавати гроші іншим компаніям: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Неоднорідні станції: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Новий глобальний пошук шляху(NPF, замість NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Множник ваги для імітації важких потягів: {ORANGE}{STRING}
@@ -1232,6 +1238,8 @@
 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}
@@ -1311,6 +1319,7 @@
 STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Кількість міст, які будуть рости вдвічі швидше: {ORANGE}1 з {STRING}
 STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Кількість міст, які будуть рости вдвічі швидше: {ORANGE}нема
 STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Початковий коефіцієнт розміру міст: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Прибрати безглузді елементи доріг під час будівництва доріг
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Вигляд
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Споруди
@@ -1787,7 +1796,9 @@
 STR_180A_ROAD_CONSTRUCTION                                      :Будувати дороги
 STR_180A_TRAMWAY_CONSTRUCTION                                   :Будівництво трамвайної колії
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Будувати дорогу
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Будувати дорогу в режимі Автобудування
 STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Будувати трамвайну колію
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Будувати трамвайну лінію в режимі Автобудування
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Будувати автомобільне депо
 STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Будувати трамвайне депо (для будівництва та обслуговування трамваїв)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Будувати зупинку
@@ -1798,6 +1809,7 @@
 STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Побудувати трамвайний міст
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Будувати тунель
 STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Побудувати трамвайний тунель
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Вкл./відкл. односторонні дороги
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Будувати/зруйнувати дорогу
 STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Будувати/демонтувати колію
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Виберіть направлення депо
@@ -1819,6 +1831,7 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Спочатку зруйнуйте споруду
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Населення: {ORANGE}{COMMA}{BLACK}  Будинки: {ORANGE}{COMMA}
@@ -2157,9 +2170,9 @@
 STR_482F_COST                                                   :{BLACK}Вартість: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Неможливо будувати тут...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...ліс може бути посаджений вище від рівня снігу
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} невдовзі закриється!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{INDUSTRY}: проблеми з поставками незабаром призведуть до закриття!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Відсутність дерев поруч незабаром призведе {INDUSTRY} до закриття!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{STRING} невдовзі закриється!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{STRING}: проблеми з поставками незабаром призведуть до закриття!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Відсутність дерев поруч незабаром призведе {STRING} до закриття!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} збільшує виробництво!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Знайдені нові залежі вугілля на {INDUSTRY}!{}Очікується збільшення виробництва вдвічі!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Знайдені нові нафтові запаси на {INDUSTRY}!{}Очікується збільшення виробництва вдвічі!
@@ -2178,6 +2191,8 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Спочатку зруйнуйте тунель
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Спочатку зруйнуйте міст
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Початок та кінець не можуть бути в одному місці
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Кінці мостів на різних рівнях
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Міст дуже низький для цього місця
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Початок та кінець мають бути на одній лінії
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Невідповідне місце для початку тунеля
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2457,7 +2472,7 @@
 STR_RELOCATE_HQ                                                 :{BLACK}Перенести Офіс
 STR_COMPANY_PASSWORD                                            :{BLACK}Пароль
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Пароль захищає вашу компанію від приєднання інших гравців.
-STR_SET_COMPANY_PASSWORD                                        :Встановлення паролю
+STR_SET_COMPANY_PASSWORD                                        :{BLACK}Встановлення паролю
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Світова економічна криза!{}{}Фінансисти очікують спад виробництва та попиту!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Криза минула!{}{}Збільшення виробництва внаслідок стабілізації економіки надає впевненості підприємствам!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Розмір вікна великий/малий
@@ -2469,7 +2484,6 @@
 STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Неможливо купити 25% акцій цієї компанії...
 STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Неможливо продати 25% акцій цієї компанії...
 STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% у власності {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% у власності {COMPANY}{}   {COMMA}% у власності {COMPANY})
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} викуплено {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Ця компанія поки ще не продається...
 
@@ -2541,7 +2555,7 @@
 STR_8021_GRAIN_HOPPER                                           :Вагон для зерна
 STR_8022_WOOD_TRUCK                                             :Вагон для деревини
 STR_8023_IRON_ORE_HOPPER                                        :Вагон для залізної руди
-STR_8024_STEEL_TRUCK                                            :Вагон лля сталі
+STR_8024_STEEL_TRUCK                                            :Платформа для сталі
 STR_8025_ARMORED_VAN                                            :Броньований вагон
 STR_8026_FOOD_VAN                                               :Вагон для продуктів
 STR_8027_PAPER_TRUCK                                            :Вагон для паперу
@@ -2594,24 +2608,24 @@
 STR_8056_LEV3_PEGASUS_ELECTRIC                                  :Lev3 'Pegasus' (електричка)
 STR_8057_LEV4_CHIMAERA_ELECTRIC                                 :Lev4 'Chimaera' (електричка)
 STR_8058_WIZZOWOW_ROCKETEER                                     :Wizzowow Rocketeer
-STR_8059_PASSENGER_CAR                                          :Пасажирський катер
+STR_8059_PASSENGER_CAR                                          :пасажирський вагон
 STR_805A_MAIL_VAN                                               :поштовий вагон
-STR_805B_COAL_CAR                                               :вугільний фургон
-STR_805C_OIL_TANKER                                             :нафтовий танкер
+STR_805B_COAL_CAR                                               :вагон для вугілля
+STR_805C_OIL_TANKER                                             :нафтова цистерна
 STR_805D_LIVESTOCK_VAN                                          :вагон для худоби
-STR_805E_GOODS_VAN                                              :вагон для товарів
+STR_805E_GOODS_VAN                                              :товарний вагон
 STR_805F_GRAIN_HOPPER                                           :вагон для зерна
 STR_8060_WOOD_TRUCK                                             :лісовіз
 STR_8061_IRON_ORE_HOPPER                                        :вагон для залізної руди
-STR_8062_STEEL_TRUCK                                            :вантажівка для сталі
-STR_8063_ARMORED_VAN                                            :броноване авто
-STR_8064_FOOD_VAN                                               :вантажівка для їжі
-STR_8065_PAPER_TRUCK                                            :вантажівка для паперу
+STR_8062_STEEL_TRUCK                                            :платформа для сталі
+STR_8063_ARMORED_VAN                                            :броньований вагон
+STR_8064_FOOD_VAN                                               :вагон для їжі
+STR_8065_PAPER_TRUCK                                            :платформа для паперу
 STR_8066_COPPER_ORE_HOPPER                                      :вагон для мідної руди
 STR_8067_WATER_TANKER                                           :цистерна для води
 STR_8068_FRUIT_TRUCK                                            :фургон для фруктів
-STR_8069_RUBBER_TRUCK                                           :вантажівка для каучуку
-STR_806A_SUGAR_TRUCK                                            :вантажівка для цукру
+STR_8069_RUBBER_TRUCK                                           :платформа для каучуку
+STR_806A_SUGAR_TRUCK                                            :вагон для цукру
 STR_806B_COTTON_CANDY_HOPPER                                    :вагон для цукрової вати
 STR_806C_TOFFEE_HOPPER                                          :вагон для ірису
 STR_806D_BUBBLE_VAN                                             :вагон для кульок
@@ -2866,16 +2880,16 @@
 STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Неможливо перемістити транспорт...
 STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}задній потяг зажди слідує  follow its front counterpart!!!
 STR_8838_N_A                                                    :немає{SKIP}
-STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Неможливо продати поїзд...
+STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Не можна продати поїзд...
 STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Неможливо знайти маршрут до місцевого депо
-STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Неможливо зупинити поїзд...
+STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Не можна зупинити/стартувати поїзд...
 STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Інтервал техогляду: {LTBLUE}{COMMA} днів{BLACK}   Останній техогляд: {LTBLUE}{DATE_LONG}
 STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Інтервал техогляду: {LTBLUE}{COMMA}%{BLACK}   Останній техогляд: {LTBLUE}{DATE_LONG}
-STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK} Поїзди - клікніть на поїзді для детальної інформаціїї
+STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Поїзди - клікніть на поїзді для детальної інформаціїї
 STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Будувати поїзд (потрібне залізничне депо)
 STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Поїзди - клікніть на поїзді для інформації, перетягніть для додавання/вилучення
-STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}Будувати новий потяг
-STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Перетягніть потяг сюди, щоб продати його
+STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}Будувати новий поїзд
+STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Перетягніть поїзд сюди, щоб продати його
 STR_8842_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Показати депо в центрі головного екрану
 STR_8843_TRAIN_VEHICLE_SELECTION                                :{BLACK}Список поїздів - клікніть на поїзді для інформації
 STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN                            :{BLACK}Будувати вибраний поїзд
@@ -2938,6 +2952,8 @@
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Став доступним новий {STRING}!  -  {ENGINE}
 
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Не можна продати знищений транспорт...
+
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Не можна встановити розклад для транспорту...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Транспорт може чекати тільки на станціях.
 STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Цей транспорт не зупиняється на цій станції.
@@ -2985,9 +3001,9 @@
 STR_9020_FORCE_VEHICLE_TO_TURN_AROUND                           :{BLACK}Розвернути авто
 STR_9021_SHOW_ROAD_VEHICLE_DETAILS                              :{BLACK}Показати авто детально
 STR_9022_VEHICLES_CLICK_ON_VEHICLE                              :{BLACK}Авто - натисніть на авто для інформації
-STR_9023_BUILD_NEW_ROAD_VEHICLE                                 :{BLACK}Будувати нове авто
-STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Перетягніть авто сюди, щоб продати
-STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}Показати авто депо в центрі екрану
+STR_9023_BUILD_NEW_ROAD_VEHICLE                                 :{BLACK}Будувати новий автомобіль
+STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Перетягніть автомобіль сюди, щоб продати
+STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}Показати автомобільне депо в центрі екрану
 STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Список авто - натисніть на авто для інформації
 STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}Будувати вибране авто
 STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Ціна: {CURRENCY}{}Швидкість: {VELOCITY}{}Транспортні витрати: {CURRENCY}/рік{}Місткість: {CARGO}
@@ -3027,9 +3043,9 @@
 STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} кораб{P ель лі лів}
 STR_9808_NEW_SHIPS                                              :{WHITE}Нові кораблі
 STR_9809_BUILD_SHIP                                             :{BLACK}Будувати корабель
-STR_CLONE_SHIP                                                  :{BLACK}Клонувати корабель
+STR_CLONE_SHIP                                                  :{BLACK}Клонувати
 STR_CLONE_SHIP_INFO                                             :{BLACK}Будувати копію корабля. Утримуйте CTRL для спільного завдання
-STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Будувати копію корабля. Натисніть на цю кнопку і потім на корабель в депо або ззовні. Утримуйте CTRL для спільного завдання
+STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Будувати копію корабля. Натисніть на цю кнопку, і потім на корабель в депо або ззовні. Утримуйте CTRL для спільного завдання
 STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Корабль має бути в депо
 STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Неможливо продати корабель...
 STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Неможливо будувати корабель...
@@ -3226,7 +3242,9 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Помилковий параметр для {STRING}: параметр {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} має бути завантажений до {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} має бути завантажений після {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} потребує версію OpenTTD не нижче {STRING}.
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF-файл, для якого це призначалось перекласти
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Завантажено забагато NewGRF-файлів.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Додати
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Додати файли NewGRF до списку
@@ -3294,10 +3312,10 @@
 STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP                              :{BLACK}Продати всі кораблі з депо
 STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP                          :{BLACK}Продати всі літаки з ангару
 
-STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Отримати список всих поїздів, що заходять до ангарів
-STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Отримати список всих авто, що заходять до ангарів
-STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Отримати список всих кораблів, що заходять до ангарів
-STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Отримати список всих літаків, що заходять до ангарів
+STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Отримати список усіх поїздів, що заходять до цього депо
+STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Отримати список усіх автомобілів, що заходять до цього депо
+STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Отримати список усіх кораблів, що заходять до цього депо
+STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Отримати список усіх літаків, що заходять до ангарів у цьому аеропорті
 
 STR_DEPOT_AUTOREPLACE_TRAIN_TIP                                 :{BLACK}Оновити всі поїзди в депо
 STR_DEPOT_AUTOREPLACE_ROADVEH_TIP                               :{BLACK}Оновити всі автомобілі в депо
@@ -3336,15 +3354,15 @@
 STR_MASS_STOP_DEPOT_TRAIN_TIP                                   :{BLACK}Натисніть для зупинки всіх поїздів, що в депо
 STR_MASS_STOP_DEPOT_ROADVEH_TIP                                 :{BLACK}Натисніть для зупинки всіх авто, що в депо
 STR_MASS_STOP_DEPOT_SHIP_TIP                                    :{BLACK}Натисніть для зупинки всіх кораблів, що в депо
-STR_MASS_STOP_HANGAR_TIP                                        :{BLACK}Натисніть для зупинки всіх літаків, що в депо
+STR_MASS_STOP_HANGAR_TIP                                        :{BLACK}Натисніть для зупинки всіх літаків, що в ангарі
 
 STR_MASS_START_DEPOT_TRAIN_TIP                                  :{BLACK}Натисніть для виїзду поїздів з депо
-STR_MASS_START_DEPOT_ROADVEH_TIP                                :{BLACK}Натисніть для виїзду всіх авто з депо
+STR_MASS_START_DEPOT_ROADVEH_TIP                                :{BLACK}Натисніть для виїзду всіх автомобілів з депо
 STR_MASS_START_DEPOT_SHIP_TIP                                   :{BLACK}Натисніть для виїзду всіх кораблів з депо
-STR_MASS_START_HANGAR_TIP                                       :{BLACK}Натисніть для вильоту всіх літаків з депо
+STR_MASS_START_HANGAR_TIP                                       :{BLACK}Натисніть для вильоту всіх літаків з ангару
 
-STR_MASS_STOP_LIST_TIP                                          :{BLACK}Натисніть для зупинки всіх авто зі списку
-STR_MASS_START_LIST_TIP                                         :{BLACK}Натисніть для виїзду всіх авто зі списку
+STR_MASS_STOP_LIST_TIP                                          :{BLACK}Натисніть для зупинки всіх авто, що у списку
+STR_MASS_START_LIST_TIP                                         :{BLACK}Натисніть для виїзду всього транспорту, що у списку
 
 STR_SHORT_DATE                                                  :{WHITE}{DATE_TINY}
 STR_SIGN_LIST_CAPTION                                           :{WHITE}Список позначень - {COMMA} Позначен{P ня ня ь}
@@ -3435,6 +3453,7 @@
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Центрувати мінікарту сюди
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Малий
@@ -3491,12 +3510,12 @@
 STR_GROUP_NAME_FORMAT                                           :Група {COMMA}
 STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
 STR_GROUP_ALL_TRAINS                                            :Усі поїзди
-STR_GROUP_ALL_ROADS                                             :Усі авто
+STR_GROUP_ALL_ROADS                                             :Усі автомобілі
 STR_GROUP_ALL_SHIPS                                             :Усі кораблі
 STR_GROUP_ALL_AIRCRAFTS                                         :Усі літаки
 STR_GROUP_DEFAULT_TRAINS                                        :Незгруповані поїзди
 STR_GROUP_DEFAULT_ROADS                                         :Незгруповані автомобілі
-STR_GROUP_DEFAULT_SHIPS                                         :Незгруповані човни
+STR_GROUP_DEFAULT_SHIPS                                         :Незгруповані кораблі
 STR_GROUP_DEFAULT_AIRCRAFTS                                     :Незгруповані літаки
 STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
 STR_GROUP_ADD_SHARED_VEHICLE                                    :Добавити спільний транспорт
@@ -3541,3 +3560,51 @@
 STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Огляд
 STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Будувати
 STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Виберіть необхідне виробництво
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Детальний
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Детальний вибір обличчя
+STR_FACE_SIMPLE                                                 :{BLACK}Простий
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Простий вибір обличчя
+STR_FACE_LOAD                                                   :{BLACK}Завантажити
+STR_FACE_LOAD_TIP                                               :{BLACK}Завантажити обране обличчя
+STR_FACE_LOAD_DONE                                              :{WHITE}Обране обличчя було завантажене з файлу конфігурації OpenTTD.
+STR_FACE_FACECODE                                               :{BLACK}Обличчя №
+STR_FACE_FACECODE_TIP                                           :{BLACK}Подивитись та/чи змінити номер обличчя гравця
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Подивитись та/чи змінити номер обличчя гравця
+STR_FACE_FACECODE_SET                                           :{WHITE}Було встановлено новий номер
+STR_FACE_FACECODE_ERR                                           :{WHITE}Не можна встановити номер обличчя гравця - це має бути число  від 0 до 4,294,967,295!
+STR_FACE_SAVE                                                   :{BLACK}Зберегти
+STR_FACE_SAVE_TIP                                               :{BLACK}Зберегти обране обличчя
+STR_FACE_SAVE_DONE                                              :{WHITE}Це обличчя буде збережене як обране у файлі конфігурації OpenTTD.
+STR_FACE_EUROPEAN                                               :{BLACK}Європейські
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Вибрати європейські обличчя
+STR_FACE_AFRICAN                                                :{BLACK}Африканські
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Вибрати африканські обличчя
+STR_FACE_YES                                                    :Так
+STR_FACE_NO                                                     :Ні
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Дозволити вуса або сережки
+STR_FACE_HAIR                                                   :Волосся:
+STR_FACE_HAIR_TIP                                               :{BLACK}Змінити волосся
+STR_FACE_EYEBROWS                                               :Брова:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Змінити брова
+STR_FACE_EYECOLOUR                                              :Колір очей:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Змінити колір очей:
+STR_FACE_GLASSES                                                :Окуляри:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Дозволити окуляри
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Змінити окуляри
+STR_FACE_NOSE                                                   :Ніс:
+STR_FACE_NOSE_TIP                                               :{BLACK}Змінити ніс
+STR_FACE_LIPS                                                   :Губи:
+STR_FACE_MOUSTACHE                                              :Вуса:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Змінити губи або вуса
+STR_FACE_CHIN                                                   :Підборіддя:
+STR_FACE_CHIN_TIP                                               :{BLACK}Змінити підборіддя
+STR_FACE_JACKET                                                 :Жакет:
+STR_FACE_JACKET_TIP                                             :{BLACK}Змінити жакет
+STR_FACE_COLLAR                                                 :Комір
+STR_FACE_COLLAR_TIP                                             :{BLACK}Змінити комір
+STR_FACE_TIE                                                    :Краватка:
+STR_FACE_EARRING                                                :Сережки:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Змінити комір або сережки
+########
--- a/src/lang/unfinished/afrikaans.txt	Sat Oct 06 21:16:00 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2929 +0,0 @@
-##name Afrikaans
-##ownname Afrikaans
-##isocode af_ZA
-##plural 0
-
-#
-
-##id 0x0000
-STR_NULL                                                        :
-STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Oor kant van kaart
-STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}Te naby aan kant van kaart
-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}Vereis platte land
-STR_0008_WAITING                                                :{BLACK}Wagtend: {WHITE}{STRING}
-STR_0009                                                        :{WHITE}{CARGO}
-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}
-STR_000E                                                        :
-STR_000F_PASSENGERS                                             :Passasiers
-STR_0010_COAL                                                   :Steenkool
-STR_0011_MAIL                                                   :Pos
-STR_0012_OIL                                                    :Olie
-STR_0013_LIVESTOCK                                              :Lewende Hawe
-STR_0014_GOODS                                                  :Goedere
-STR_0015_GRAIN                                                  :Graan
-STR_0016_WOOD                                                   :Hout
-STR_0017_IRON_ORE                                               :Yster Erts
-STR_0018_STEEL                                                  :Staal
-STR_0019_VALUABLES                                              :Kosbaarhede
-STR_001A_COPPER_ORE                                             :Koper Erts
-STR_001B_MAIZE                                                  :Mielies
-STR_001C_FRUIT                                                  :Vrugte
-STR_001D_DIAMONDS                                               :Diamante
-STR_001E_FOOD                                                   :Kos
-STR_001F_PAPER                                                  :Papier
-STR_0020_GOLD                                                   :Goud
-STR_0021_WATER                                                  :Water
-STR_0022_WHEAT                                                  :Koring
-STR_0023_RUBBER                                                 :Gomlastiek
-STR_0024_SUGAR                                                  :Suiker
-STR_0025_TOYS                                                   :Speelgoed
-STR_0026_CANDY                                                  :Lekkers
-STR_0027_COLA                                                   :Cola
-STR_0028_COTTON_CANDY                                           :Spookasem
-STR_0029_BUBBLES                                                :Borrels
-STR_002A_TOFFEE                                                 :Tameletjie
-STR_002B_BATTERIES                                              :Batterye
-STR_002C_PLASTIC                                                :Plastiek
-STR_002D_FIZZY_DRINKS                                           :Koeldranke
-STR_002E                                                        :
-STR_002F_PASSENGER                                              :Passasier
-STR_0030_COAL                                                   :Steenkool
-STR_0031_MAIL                                                   :Pos
-STR_0032_OIL                                                    :Olie
-STR_0033_LIVESTOCK                                              :Lewende Hawe
-STR_0034_GOODS                                                  :Goedere
-STR_0035_GRAIN                                                  :Graan
-STR_0036_WOOD                                                   :Hout
-STR_0037_IRON_ORE                                               :Yster Erts
-STR_0038_STEEL                                                  :Staal
-STR_0039_VALUABLES                                              :Kosbaarhede
-STR_003A_COPPER_ORE                                             :Koper Erts
-STR_003B_MAIZE                                                  :Mielies
-STR_003C_FRUIT                                                  :Vrugte
-STR_003D_DIAMOND                                                :Diamant
-STR_003E_FOOD                                                   :Kos
-STR_003F_PAPER                                                  :Papier
-STR_0040_GOLD                                                   :Goud
-STR_0041_WATER                                                  :Water
-STR_0042_WHEAT                                                  :Koring
-STR_0043_RUBBER                                                 :Gomlastiek
-STR_0044_SUGAR                                                  :Suiker
-STR_0045_TOY                                                    :Speelgoed
-STR_0046_CANDY                                                  :Lekker
-STR_0047_COLA                                                   :Cola
-STR_0048_COTTON_CANDY                                           :Spookasem
-STR_0049_BUBBLE                                                 :Borrel
-STR_004A_TOFFEE                                                 :Tameletjie
-STR_004B_BATTERY                                                :Battery
-STR_004C_PLASTIC                                                :Plastiek
-STR_004D_FIZZY_DRINK                                            :Koeldrank
-STR_QUANTITY_NOTHING                                            :
-STR_QUANTITY_PASSENGERS                                         :{COMMA} Passasier{P "" s}
-STR_QUANTITY_COAL                                               :{WEIGHT} van steenkool
-STR_QUANTITY_MAIL                                               :{COMMA} sak{P "" e} van pos
-STR_QUANTITY_OIL                                                :{VOLUME} van olie
-STR_QUANTITY_LIVESTOCK                                          :{COMMA} item{P "" s} van lewende hawe
-STR_QUANTITY_GOODS                                              :{COMMA} hok{P "" ke} van goedere
-STR_QUANTITY_GRAIN                                              :{WEIGHT} van graan
-STR_QUANTITY_WOOD                                               :{WEIGHT} van hout
-STR_QUANTITY_IRON_ORE                                           :{WEIGHT} van yster erts
-STR_QUANTITY_STEEL                                              :{WEIGHT} van staal
-STR_QUANTITY_VALUABLES                                          :{COMMA} sak{P "" ke} van kosbaarhede
-STR_QUANTITY_COPPER_ORE                                         :{WEIGHT} van koper erts
-STR_QUANTITY_MAIZE                                              :{WEIGHT} van graan
-STR_QUANTITY_FRUIT                                              :{WEIGHT} van vrugte
-STR_QUANTITY_DIAMONDS                                           :{COMMA} sak{P "" ke} van diamante
-STR_QUANTITY_FOOD                                               :{WEIGHT} van kos
-STR_QUANTITY_PAPER                                              :{WEIGHT} van papier
-STR_QUANTITY_GOLD                                               :{COMMA} sak{P "" ke} van goud
-STR_QUANTITY_WATER                                              :{VOLUME} van water
-STR_QUANTITY_WHEAT                                              :{WEIGHT} van koring
-STR_QUANTITY_RUBBER                                             :{VOLUME} van gomlastiek
-STR_QUANTITY_SUGAR                                              :{WEIGHT} van suiker
-STR_QUANTITY_TOYS                                               :{COMMA} speel{P ding goed}
-STR_QUANTITY_SWEETS                                             :{COMMA} sak{P "" ke} van lekkers
-STR_QUANTITY_COLA                                               :{VOLUME} van cola
-STR_QUANTITY_CANDYFLOSS                                         :{WEIGHT} van spookasem
-STR_QUANTITY_BUBBLES                                            :{COMMA} borrel{P "" s}
-STR_QUANTITY_TOFFEE                                             :{WEIGHT} van tameletjie
-STR_QUANTITY_BATTERIES                                          :{COMMA} batter{P y ye}
-STR_QUANTITY_PLASTIC                                            :{VOLUME} van plastiek
-STR_QUANTITY_FIZZY_DRINKS                                       :{COMMA} koeldran{P k ke}
-STR_ABBREV_NOTHING                                              :
-STR_ABBREV_PASSENGERS                                           :{TINYFONT}PS
-STR_ABBREV_COAL                                                 :{TINYFONT}SK
-STR_ABBREV_MAIL                                                 :{TINYFONT}PS
-STR_ABBREV_OIL                                                  :{TINYFONT}OL
-STR_ABBREV_LIVESTOCK                                            :{TINYFONT}LH
-STR_ABBREV_GOODS                                                :{TINYFONT}GS
-STR_ABBREV_GRAIN                                                :{TINYFONT}GR
-STR_ABBREV_WOOD                                                 :{TINYFONT}HT
-STR_ABBREV_IRON_ORE                                             :{TINYFONT}YE
-STR_ABBREV_STEEL                                                :{TINYFONT}ST
-STR_ABBREV_VALUABLES                                            :{TINYFONT}KH
-STR_ABBREV_COPPER_ORE                                           :{TINYFONT}KE
-STR_ABBREV_MAIZE                                                :{TINYFONT}GR
-STR_ABBREV_FRUIT                                                :{TINYFONT}VR
-STR_ABBREV_DIAMONDS                                             :{TINYFONT}DM
-STR_ABBREV_FOOD                                                 :{TINYFONT}KO
-STR_ABBREV_PAPER                                                :{TINYFONT}PR
-STR_ABBREV_GOLD                                                 :{TINYFONT}GD
-STR_ABBREV_WATER                                                :{TINYFONT}WR
-STR_ABBREV_WHEAT                                                :{TINYFONT}GR
-STR_ABBREV_RUBBER                                               :{TINYFONT}GL
-STR_ABBREV_SUGAR                                                :{TINYFONT}SK
-STR_ABBREV_TOYS                                                 :{TINYFONT}SG
-STR_ABBREV_SWEETS                                               :{TINYFONT}LE
-STR_ABBREV_COLA                                                 :{TINYFONT}CL
-STR_ABBREV_CANDYFLOSS                                           :{TINYFONT}SA
-STR_ABBREV_BUBBLES                                              :{TINYFONT}BO
-STR_ABBREV_TOFFEE                                               :{TINYFONT}TL
-STR_ABBREV_BATTERIES                                            :{TINYFONT}BA
-STR_ABBREV_PLASTIC                                              :{TINYFONT}PL
-STR_ABBREV_FIZZY_DRINKS                                         :{TINYFONT}KD
-STR_ABBREV_NONE                                                 :{TINYFONT}NS
-STR_ABBREV_ALL                                                  :{TINYFONT}ALLE
-STR_00AE                                                        :{WHITE}{DATE_SHORT}
-STR_00AF                                                        :{WHITE}{DATE_LONG}
-STR_00B0_MAP                                                    :{WHITE}Kaart - {STRING}
-STR_00B1_GAME_OPTIONS                                           :{WHITE}Spel Opsies
-STR_00B2_MESSAGE                                                :{YELLOW}Boodskap
-STR_00B3_MESSAGE_FROM                                           :{YELLOW}Boodskap van {STRING}
-STR_POPUP_CAUTION_CAPTION                                       :{WHITE}Waarskuwing!
-STR_00B4_CAN_T_DO_THIS                                          :{WHITE}Kan nie dit doen nie....
-STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Kan nie die area reinig nie....
-STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}Oorspronklik kopiereg {COPYRIGHT} 1995 Chris Sawyer, Alle regte voorbehou
-STR_00B7_VERSION                                                :{BLACK}OpenTTD bewerking {REV}
-STR_00BA_COPYRIGHT_OPENTTD                                      :{BLACK}OpenTTD {COPYRIGHT}2002-2007 Die OpenTTD span
-STR_TRANSLATED_BY                                               :{BLACK}  Vertaler(s) -
-
-STR_00C5                                                        :{BLACK}{CROSS}
-STR_00C6                                                        :{SILVER}{CROSS}
-STR_00C7_QUIT                                                   :{WHITE}Verlaat
-STR_00C8_YES                                                    :{BLACK}Ja
-STR_00C9_NO                                                     :{BLACK}Nee
-STR_00CA_ARE_YOU_SURE_YOU_WANT_TO                               :{YELLOW}Is jy seker jy wil die spel verlaat en terug gaan na {STRING}?
-STR_00CB_1                                                      :{BLACK}1
-STR_00CC_2                                                      :{BLACK}2
-STR_00CD_3                                                      :{BLACK}3
-STR_00CE_4                                                      :{BLACK}4
-STR_00CF_5                                                      :{BLACK}5
-STR_00D0_NOTHING                                                :Niks
-STR_00D1_DARK_BLUE                                              :Donker Blou
-STR_00D2_PALE_GREEN                                             :Bleek Groen
-STR_00D3_PINK                                                   :Pienk
-STR_00D4_YELLOW                                                 :Geel
-STR_00D5_RED                                                    :Rooi
-STR_00D6_LIGHT_BLUE                                             :Ligte Blou
-STR_00D7_GREEN                                                  :Groen
-STR_00D8_DARK_GREEN                                             :Donker Groen
-STR_00D9_BLUE                                                   :Blou
-STR_00DA_CREAM                                                  :Room
-STR_00DB_MAUVE                                                  :Ligpers
-STR_00DC_PURPLE                                                 :Pers
-STR_00DD_ORANGE                                                 :Oranje
-STR_00DE_BROWN                                                  :Bruin
-STR_00DF_GREY                                                   :Grys
-STR_00E0_WHITE                                                  :Wit
-STR_00E1_TOO_MANY_VEHICLES_IN_GAME                              :{WHITE}Te veel voertuie in spel
-STR_00E2                                                        :{BLACK}{COMMA}
-STR_00E3                                                        :{RED}{COMMA}
-STR_00E4_LOCATION                                               :{BLACK}Plek
-STR_00E5_CONTOURS                                               :Hoogtelyne
-STR_00E6_VEHICLES                                               :Voertuie
-STR_00E7_INDUSTRIES                                             :Nywerheide
-STR_00E8_ROUTES                                                 :Roete
-STR_00E9_VEGETATION                                             :Plantegroei
-STR_00EA_OWNERS                                                 :Eienaars
-STR_00EB_ROADS                                                  :{BLACK}{TINYFONT}Paaie
-STR_00EC_RAILROADS                                              :{BLACK}{TINYFONT}Spoorwege
-STR_00ED_STATIONS_AIRPORTS_DOCKS                                :{BLACK}{TINYFONT}Stasies/Lughawes/Werfe
-STR_00EE_BUILDINGS_INDUSTRIES                                   :{BLACK}{TINYFONT}Geboue/Nywerheide
-STR_00EF_VEHICLES                                               :{BLACK}{TINYFONT}Voertuie
-STR_00F0_100M                                                   :{BLACK}{TINYFONT}100m
-STR_00F1_200M                                                   :{BLACK}{TINYFONT}200m
-STR_00F2_300M                                                   :{BLACK}{TINYFONT}300m
-STR_00F3_400M                                                   :{BLACK}{TINYFONT}400m
-STR_00F4_500M                                                   :{BLACK}{TINYFONT}500m
-STR_00F5_TRAINS                                                 :{BLACK}{TINYFONT}Treine
-STR_00F6_ROAD_VEHICLES                                          :{BLACK}{TINYFONT}Pad Voertuie
-STR_00F7_SHIPS                                                  :{BLACK}{TINYFONT}Skepe
-STR_00F8_AIRCRAFT                                               :{BLACK}{TINYFONT}Vliegtuie
-STR_00F9_TRANSPORT_ROUTES                                       :{BLACK}{TINYFONT}Vervoer Roete
-STR_00FA_COAL_MINE                                              :{BLACK}{TINYFONT}Steenkool Myn
-STR_00FB_POWER_STATION                                          :{BLACK}{TINYFONT}Krag Stasie
-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}Boerdery
-STR_0100_FACTORY                                                :{BLACK}{TINYFONT}Fabriek
-STR_0101_PRINTING_WORKS                                         :{BLACK}{TINYFONT}Drukwerke
-STR_0102_OIL_WELLS                                              :{BLACK}{TINYFONT}Olie Bron
-STR_0103_IRON_ORE_MINE                                          :{BLACK}{TINYFONT}Yster Erts Myn
-STR_0104_STEEL_MILL                                             :{BLACK}{TINYFONT}Staalmeul
-STR_0105_BANK                                                   :{BLACK}{TINYFONT}Bank
-STR_0106_PAPER_MILL                                             :{BLACK}{TINYFONT}Papiermeul
-STR_0107_GOLD_MINE                                              :{BLACK}{TINYFONT}Goud Myn
-STR_0108_FOOD_PROCESSING_PLANT                                  :{BLACK}{TINYFONT}Kos Verwerkings Fabriek
-STR_0109_DIAMOND_MINE                                           :{BLACK}{TINYFONT}Diamant Myn
-STR_010A_COPPER_ORE_MINE                                        :{BLACK}{TINYFONT}Koper Erts Myn
-STR_010B_FRUIT_PLANTATION                                       :{BLACK}{TINYFONT}Vrugte Plantasie
-STR_010C_RUBBER_PLANTATION                                      :{BLACK}{TINYFONT}Gomlastiek Plantasie
-STR_010D_WATER_SUPPLY                                           :{BLACK}{TINYFONT}Water Lewering
-STR_010E_WATER_TOWER                                            :{BLACK}{TINYFONT}Water Toring
-STR_010F_LUMBER_MILL                                            :{BLACK}{TINYFONT}Timmerhout Meul
-STR_0110_COTTON_CANDY_FOREST                                    :{BLACK}{TINYFONT}Spookasem Woud
-STR_0111_CANDY_FACTORY                                          :{BLACK}{TINYFONT}Lekker Fabriek
-STR_0112_BATTERY_FARM                                           :{BLACK}{TINYFONT}Battery Plaas
-STR_0113_COLA_WELLS                                             :{BLACK}{TINYFONT}Cola Bron
-STR_0114_TOY_SHOP                                               :{BLACK}{TINYFONT}Speelgoed Winkel
-STR_0115_TOY_FACTORY                                            :{BLACK}{TINYFONT}Speelgoed Fabriek
-STR_0116_PLASTIC_FOUNTAINS                                      :{BLACK}{TINYFONT}Plastiek Fonteine
-STR_0117_FIZZY_DRINK_FACTORY                                    :{BLACK}{TINYFONT}Koeldrank Fabriek
-STR_0118_BUBBLE_GENERATOR                                       :{BLACK}{TINYFONT}Borrel Ontwikkelaar
-STR_0119_TOFFEE_QUARRY                                          :{BLACK}{TINYFONT}Tameletjie Prooi
-STR_011A_SUGAR_MINE                                             :{BLACK}{TINYFONT}Suiker Myn
-STR_011B_RAILROAD_STATION                                       :{BLACK}{TINYFONT}Spoorweg Stasie
-STR_011C_TRUCK_LOADING_BAY                                      :{BLACK}{TINYFONT}Vraagmotor Laai Area
-STR_011D_BUS_STATION                                            :{BLACK}{TINYFONT}Bus Stasie
-STR_011E_AIRPORT_HELIPORT                                       :{BLACK}{TINYFONT}Lughawe/Helihawe
-STR_011F_DOCK                                                   :{BLACK}{TINYFONT}Hawe
-STR_0120_ROUGH_LAND                                             :{BLACK}{TINYFONT}Ru Land
-STR_0121_GRASS_LAND                                             :{BLACK}{TINYFONT}Gras Land
-STR_0122_BARE_LAND                                              :{BLACK}{TINYFONT}Kaal Land
-STR_0123_FIELDS                                                 :{BLACK}{TINYFONT}Velde
-STR_0124_TREES                                                  :{BLACK}{TINYFONT}Boome
-STR_0125_ROCKS                                                  :{BLACK}{TINYFONT}Rotse
-STR_0126_WATER                                                  :{BLACK}{TINYFONT}Water
-STR_0127_NO_OWNER                                               :{BLACK}{TINYFONT}Geen Eienaar
-STR_0128_TOWNS                                                  :{BLACK}{TINYFONT}Stede
-STR_0129_INDUSTRIES                                             :{BLACK}{TINYFONT}Nywerheide
-STR_012A_DESERT                                                 :{BLACK}{TINYFONT}Woestyn
-STR_012B_SNOW                                                   :{BLACK}{TINYFONT}Sneeu
-STR_012C_MESSAGE                                                :{WHITE}Boodskap
-STR_012D                                                        :{WHITE}{STRING}
-STR_012E_CANCEL                                                 :{BLACK}Kanselleer
-STR_012F_OK                                                     :{BLACK}OK
-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
-
-STR_0133_WINDOWS                                                :Windows
-STR_0134_UNIX                                                   :Unix
-STR_0135_OSX                                                    :OS X
-STR_OSNAME_BEOS                                                 :BeOS
-STR_OSNAME_MORPHOS                                              :MorphOS
-STR_OSNAME_AMIGAOS                                              :AmigaOS
-STR_OSNAME_OS2                                                  :OS/2
-
-STR_013B_OWNED_BY                                               :{WHITE}...besit by {STRING}
-STR_013C_CARGO                                                  :{BLACK}Vrag
-STR_013D_INFORMATION                                            :{BLACK}Inligting
-STR_013E_CAPACITIES                                             :{BLACK}Kapasiteite
-STR_013E_TOTAL_CARGO                                            :{BLACK}Totaale Vrag
-STR_013F_CAPACITY                                               :{BLACK}Kapasiteit: {LTBLUE}{CARGO}
-STR_CAPACITY_MULT                                               :{BLACK}Kapasiteit: {LTBLUE}{CARGO} (x{NUM})
-STR_013F_TOTAL_CAPACITY_TEXT                                    :{BLACK}Totaale vrag kapasitiet van die trein:
-STR_013F_TOTAL_CAPACITY                                         :{LTBLUE}- {CARGO} ({SHORTCARGO})
-STR_TOTAL_CAPACITY_MULT                                         :{LTBLUE}- {CARGO} ({SHORTCARGO}) (x{NUM})
-STR_0140_NEW_GAME                                               :{BLACK}Nuwe Spel
-STR_0141_LOAD_GAME                                              :{BLACK}Laai Spel
-STR_SINGLE_PLAYER                                               :{BLACK}Enkel speeler
-STR_MULTIPLAYER                                                 :{BLACK}Veelspeler
-STR_SCENARIO_EDITOR                                             :{BLACK}Draaiboek Redakteur
-
-STR_64                                                          :64
-STR_128                                                         :128
-STR_256                                                         :256
-STR_512                                                         :512
-STR_1024                                                        :1024
-STR_2048                                                        :2048
-STR_MAPSIZE                                                     :{BLACK}Kaart groote:
-STR_BY                                                          :{BLACK}*
-STR_0148_GAME_OPTIONS                                           :{BLACK}Spel Opsies
-
-STR_0150_SOMEONE                                                :iemand{SKIP}{SKIP}
-STR_0151_MAP_OF_WORLD                                           :Kaart van die wêreld
-STR_0152_TOWN_DIRECTORY                                         :Stad index
-STR_0153_SUBSIDIES                                              :Subsidiëe
-
-STR_UNITS_IMPERIAL                                              :Imperiaal
-STR_UNITS_METRIC                                                :Metriek
-STR_UNITS_SI                                                    :SI
-
-STR_UNITS_VELOCITY_IMPERIAL                                     :{COMMA} mph
-STR_UNITS_VELOCITY_METRIC                                       :{COMMA} km/h
-STR_UNITS_VELOCITY_SI                                           :{COMMA} m/s
-
-STR_UNITS_POWER_IMPERIAL                                        :{COMMA}hp
-STR_UNITS_POWER_METRIC                                          :{COMMA}hp
-STR_UNITS_POWER_SI                                              :{COMMA}kW
-
-STR_UNITS_WEIGHT_SHORT_IMPERIAL                                 :{COMMA}t
-STR_UNITS_WEIGHT_SHORT_METRIC                                   :{COMMA}t
-STR_UNITS_WEIGHT_SHORT_SI                                       :{COMMA}kg
-
-STR_UNITS_WEIGHT_LONG_IMPERIAL                                  :{COMMA} ton{P "" s}
-STR_UNITS_WEIGHT_LONG_METRIC                                    :{COMMA} tonne{P "" s}
-STR_UNITS_WEIGHT_LONG_SI                                        :{COMMA} kg
-
-STR_UNITS_VOLUME_SHORT_IMPERIAL                                 :{COMMA}gal
-STR_UNITS_VOLUME_SHORT_METRIC                                   :{COMMA}l
-STR_UNITS_VOLUME_SHORT_SI                                       :{COMMA}m³
-
-STR_UNITS_VOLUME_LONG_IMPERIAL                                  :{COMMA} gallon{P "" s}
-STR_UNITS_VOLUME_LONG_METRIC                                    :{COMMA} litre{P "" s}
-STR_UNITS_VOLUME_LONG_SI                                        :{COMMA} m³
-
-STR_UNITS_FORCE_IMPERIAL                                        :{COMMA}x10³ lbf
-STR_UNITS_FORCE_METRIC                                          :{COMMA} ton krag
-STR_UNITS_FORCE_SI                                              :{COMMA} kN
-
-############ range for menu starts
-STR_0154_OPERATING_PROFIT_GRAPH                                 :Opereer profyt grafiek
-STR_0155_INCOME_GRAPH                                           :Inkoms grafiek
-STR_0156_DELIVERED_CARGO_GRAPH                                  :Afgelewerde vrag grafiek
-STR_0157_PERFORMANCE_HISTORY_GRAPH                              :Prestasie geskiedenis grafiek
-STR_0158_COMPANY_VALUE_GRAPH                                    :Maatskappy waarde grafiek
-STR_0159_CARGO_PAYMENT_RATES                                    :Vrag betaaling grade
-STR_015A_COMPANY_LEAGUE_TABLE                                   :Maatskappy verbond tafel
-STR_PERFORMANCE_DETAIL_MENU                                     :Omstandig prestasie gradering
-############ range for menu ends
-
-STR_015B_OPENTTD                                                :{WHITE}Omtrent OpenTTD
-STR_015C_SAVE_GAME                                              :Bewaar spel
-STR_015D_LOAD_GAME                                              :Laai spel
-STR_015E_QUIT_GAME                                              :Verlaat Spel
-STR_015F_QUIT                                                   :Uitgang
-STR_ABANDON_GAME_QUERY                                          :{YELLOW}Is jy seker jy wil die spel verlaat?
-STR_0161_QUIT_GAME                                              :{WHITE}Verlaat Spel
-STR_SORT_ORDER_TIP                                              :{BLACK}Selekteer sorteer orde (afklimende/klimende)
-STR_SORT_CRITERIA_TIP                                           :{BLACK}Selekteer sorteer maatstaf
-STR_SORT_BY                                                     :{BLACK}Sorteer by
-
-STR_SORT_BY_POPULATION                                          :{BLACK}Populasie
-STR_SORT_BY_PRODUCTION                                          :{BLACK}Produksie
-STR_SORT_BY_TYPE                                                :{BLACK}Tipe
-STR_SORT_BY_TRANSPORTED                                         :{BLACK}Uitvervoer
-STR_SORT_BY_NAME                                                :{BLACK}Naam
-STR_SORT_BY_DROPDOWN_NAME                                       :Naam
-STR_SORT_BY_DATE                                                :{BLACK}Datum
-STR_SORT_BY_NUMBER                                              :Nommer
-STR_SORT_BY_PROFIT_LAST_YEAR                                    :Profyt verlede jaar
-STR_SORT_BY_PROFIT_THIS_YEAR                                    :Profyt die jaar
-STR_SORT_BY_AGE                                                 :Ouderdom
-STR_SORT_BY_RELIABILITY                                         :Deeglikheid
-STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE                        :Totaale kapasitiet per vrag tipe
-STR_SORT_BY_MAX_SPEED                                           :Maksimum spoed
-STR_SORT_BY_MODEL                                               :Model
-STR_SORT_BY_VALUE                                               :Waarde
-STR_SORT_BY_FACILITY                                            :Stasie tipe
-STR_SORT_BY_WAITING                                             :Wagtend vrag waarde
-STR_SORT_BY_RATING_MAX                                          :Vrag gradering
-STR_ENGINE_SORT_ENGINE_ID                                       :EngineID (klassieke sorteer)
-STR_ENGINE_SORT_COST                                            :Koste
-STR_ENGINE_SORT_POWER                                           :Krag
-STR_ENGINE_SORT_INTRO_DATE                                      :Inleiding Datum
-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
-STR_REPLACE_VEHICLES                                            :Vervang voertuie
-STR_SEND_TRAIN_TO_DEPOT                                         :Stuur na Depot
-STR_SEND_ROAD_VEHICLE_TO_DEPOT                                  :Stuur na Depot
-STR_SEND_SHIP_TO_DEPOT                                          :Stuur na Depot
-STR_SEND_AIRCRAFT_TO_HANGAR                                     :Stuur na Hangar
-STR_SEND_FOR_SERVICING                                          :Stuur vir Diens
-
-############ range for months starts
-STR_0162_JAN                                                    :Jan
-STR_0163_FEB                                                    :Feb
-STR_0164_MAR                                                    :Mrt
-STR_0165_APR                                                    :Apr
-STR_0166_MAY                                                    :Mei
-STR_0167_JUN                                                    :Jun
-STR_0168_JUL                                                    :Jul
-STR_0169_AUG                                                    :Aug
-STR_016A_SEP                                                    :Sep
-STR_016B_OCT                                                    :Okt
-STR_016C_NOV                                                    :Nov
-STR_016D_DEC                                                    :Des
-############ range for months ends
-
-STR_016E                                                        :{TINYFONT}{STRING}{} {STRING}
-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, 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
-STR_0176_DISPLAY_TOWN_DIRECTORY                                 :{BLACK}Vertoon stad index
-STR_0177_DISPLAY_COMPANY_FINANCES                               :{BLACK}Vertoon maatskappy finasi�e inligting
-STR_0178_DISPLAY_COMPANY_GENERAL                                :{BLACK}Vertoon generale maatskappy inligting
-STR_0179_DISPLAY_GRAPHS                                         :{BLACK}Vertoon grafieke
-STR_017A_DISPLAY_COMPANY_LEAGUE                                 :{BLACK}Vertoon maatskappy verbond tafel
-STR_017B_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se treine
-STR_017C_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se pad voertuie
-STR_017D_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se skepe
-STR_017E_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Vertoon lys van maatskappy se vliegtuie
-STR_017F_ZOOM_THE_VIEW_IN                                       :{BLACK}Vergroot die skerm
-STR_0180_ZOOM_THE_VIEW_OUT                                      :{BLACK}Verklein die skerm
-STR_0181_BUILD_RAILROAD_TRACK                                   :{BLACK}Bou spoorweg spoor
-STR_0182_BUILD_ROADS                                            :{BLACK}Bou Paaie
-STR_0183_BUILD_SHIP_DOCKS                                       :{BLACK}Bou skip hawe
-STR_0184_BUILD_AIRPORTS                                         :{BLACK}Bou lughawe
-STR_0185_PLANT_TREES_PLACE_SIGNS                                :{BLACK}Plant boome, plaas tekens ens.
-STR_0186_LAND_BLOCK_INFORMATION                                 :{BLACK}Land area inligting
-STR_0187_OPTIONS                                                :{BLACK}Opsies
-STR_0188                                                        :{BLACK}{SMALLUPARROW}
-STR_0189                                                        :{BLACK}{SMALLDOWNARROW}
-STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}kan nie versiening tussentyd verander nie...
-STR_018B_CLOSE_WINDOW                                           :{BLACK}Maak venster toe
-STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}Venster titel - sleep die om venster te beweeg
-STR_STICKY_BUTTON                                               :{BLACK}Bemerk die venste as ontoemaakbaar by die"Sluit Alle Vensters" sleutel
-STR_RESIZE_BUTTON                                               :{BLACK}Kliek en sleep om venster te vergroot
-STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}Kliek hier om na die huidige bewaar/laai leer te spring
-STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Breek gebou af ens. op 'n landblokkie
-STR_018E_LOWER_A_CORNER_OF_LAND                                 :{BLACK}Verlaag 'n hoek van land
-STR_018F_RAISE_A_CORNER_OF_LAND                                 :{BLACK}Verhoog 'n hoek van land
-STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}Rol baan - rol die lys op/af
-STR_HSCROLL_BAR_SCROLLS_LIST                                    :{BLACK}Rol baan - rol die lys op/af
-STR_0191_SHOW_LAND_CONTOURS_ON_MAP                              :{BLACK}Vertoon land hoogtelyne op kaart
-STR_0192_SHOW_VEHICLES_ON_MAP                                   :{BLACK}Vertoon voertuie op kaart
-STR_0193_SHOW_INDUSTRIES_ON_MAP                                 :{BLACK}Vertoon nywerheide op kaart
-STR_0194_SHOW_TRANSPORT_ROUTES_ON                               :{BLACK}Vertoon vervoer roete op kaart
-STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Vertoon plantegroei op kaart
-STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}Vertoon land eienaars op kaart
-STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Skakel stad naame aan/af op kaart
-STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}Profyt die jaar: {CURRENCY} (verlede jaar: {CURRENCY})
-
-############ range for service numbers starts
-STR_AGE                                                         :{COMMA} jaar{P "" e} ({COMMA})
-STR_AGE_RED                                                     :{RED}{COMMA} jaar{P "" e} ({COMMA})
-############ range for service numbers ends
-
-STR_019C_ROAD_VEHICLE                                           :Pad voertuig
-STR_019D_AIRCRAFT                                               :Vliegtuig
-STR_019E_SHIP                                                   :Skip
-STR_019F_TRAIN                                                  :Trein
-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
-STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}Prys om te reinig: {LTBLUE}N/A
-STR_01A5_COST_TO_CLEAR                                          :{BLACK}Prys om te reinig: {LTBLUE}{CURRENCY}
-STR_01A6_N_A                                                    :N/A
-STR_01A7_OWNER                                                  :{BLACK}Eienaar: {LTBLUE}{STRING}
-STR_01A8_LOCAL_AUTHORITY                                        :{BLACK}Plaaslike raad: {LTBLUE}{STRING}
-STR_01A9_NONE                                                   :Geen
-STR_01AA_NAME                                                   :{BLACK}Naam
-STR_01AB                                                        :{BLACK}{TINYFONT}{VEHICLE}
-
-############ range for days starts
-STR_01AC_1ST                                                    :1ste
-STR_01AD_2ND                                                    :2de
-STR_01AE_3RD                                                    :3de
-STR_01AF_4TH                                                    :4de
-STR_01B0_5TH                                                    :5de
-STR_01B1_6TH                                                    :6de
-STR_01B2_7TH                                                    :7de
-STR_01B3_8TH                                                    :8ste
-STR_01B4_9TH                                                    :9de
-STR_01B5_10TH                                                   :10de
-STR_01B6_11TH                                                   :11de
-STR_01B7_12TH                                                   :12de
-STR_01B8_13TH                                                   :13de
-STR_01B9_14TH                                                   :14de
-STR_01BA_15TH                                                   :15de
-STR_01BB_16TH                                                   :16de
-STR_01BC_17TH                                                   :17de
-STR_01BD_18TH                                                   :18de
-STR_01BE_19TH                                                   :19de
-STR_01BF_20TH                                                   :20ste
-STR_01C0_21ST                                                   :21ste
-STR_01C1_22ND                                                   :22ste
-STR_01C2_23RD                                                   :23ste
-STR_01C3_24TH                                                   :24ste
-STR_01C4_25TH                                                   :25ste
-STR_01C5_26TH                                                   :26ste
-STR_01C6_27TH                                                   :27ste
-STR_01C7_28TH                                                   :28ste
-STR_01C8_29TH                                                   :29ste
-STR_01C9_30TH                                                   :30ste
-STR_01CA_31ST                                                   :31ste
-############ range for days ends
-
-STR_01CB                                                        :{TINYFONT}{COMMA}
-
-STR_01CE_CARGO_ACCEPTED                                         :{BLACK}Vrag aanvaar: {LTBLUE}
-
-STR_01D1_8                                                      :({COMMA}/8 {STRING})
-STR_01D2_JAZZ_JUKEBOX                                           :{WHITE}Jazz Bl�kas
-STR_01D3_SOUND_MUSIC                                            :Klank/musiek
-STR_01D4_SHOW_SOUND_MUSIC_WINDOW                                :{BLACK}Vertoon klank/musiek venster
-STR_01D5_ALL                                                    :{TINYFONT}Alle
-STR_01D6_OLD_STYLE                                              :{TINYFONT}Ou Styl
-STR_01D7_NEW_STYLE                                              :{TINYFONT}Nuwe Styl
-STR_01D8_EZY_STREET                                             :{TINYFONT}Ezy Straat
-STR_01D9_CUSTOM_1                                               :{TINYFONT}Gewoonte 1
-STR_01DA_CUSTOM_2                                               :{TINYFONT}Gewoonte 2
-STR_01DB_MUSIC_VOLUME                                           :{BLACK}{TINYFONT}Musiek Volume
-STR_01DC_EFFECTS_VOLUME                                         :{BLACK}{TINYFONT}Effekte Volume
-STR_01DD_MIN_MAX                                                :{BLACK}{TINYFONT}MIN  '  '  ' '  '  '  MAX
-STR_01DE_SKIP_TO_PREVIOUS_TRACK                                 :{BLACK}Gaan terug na vorig liedjie in keuse
-STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION                        :{BLACK}Gaan voor na volgende liedjie in keuse
-STR_01E0_STOP_PLAYING_MUSIC                                     :{BLACK}Ophou musiek speel
-STR_01E1_START_PLAYING_MUSIC                                    :{BLACK}Begin musiek speel
-STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC                              :{BLACK}Sleep skyfie om musiek en effekte volumes te stel
-STR_01E3                                                        :{DKGREEN}{TINYFONT}--
-STR_01E4_0                                                      :{DKGREEN}{TINYFONT}0{COMMA}
-STR_01E5                                                        :{DKGREEN}{TINYFONT}{COMMA}
-STR_01E6                                                        :{DKGREEN}{TINYFONT}------
-STR_01E7                                                        :{DKGREEN}{TINYFONT}"{STRING}"
-STR_01E8_TRACK_XTITLE                                           :{BLACK}{TINYFONT}Liedjie{SETX 88}Titel
-STR_01E9_SHUFFLE                                                :{TINYFONT}Skuifel
-STR_01EA_PROGRAM                                                :{TINYFONT}{BLACK}Musiek lys
-STR_01EB_MUSIC_PROGRAM_SELECTION                                :{WHITE}Musiek Lys Keuse
-STR_01EC_0                                                      :{TINYFONT}{LTBLUE}0{COMMA} "{STRING}"
-STR_01ED                                                        :{TINYFONT}{LTBLUE}{COMMA} "{STRING}"
-STR_01EE_TRACK_INDEX                                            :{TINYFONT}{BLACK}Liedjie Index
-STR_01EF_PROGRAM                                                :{TINYFONT}{BLACK}Musiek Lys - '{STRING}'
-STR_01F0_CLEAR                                                  :{TINYFONT}{BLACK}Reinig
-STR_01F1_SAVE                                                   :{TINYFONT}{BLACK}Bewaar
-STR_01F2_CURRENT_PROGRAM_OF_MUSIC                               :{BLACK}Huidige musiek keuse
-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' (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 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
-STR_01FD_CLICK_ON_SERVICE_TO_CENTER                             :{BLACK}Kliek op diens om uitsig te senter op nywerheid/stad
-STR_01FE_DIFFICULTY                                             :{BLACK}Moeilikheid ({STRING})
-STR_01FF                                                        :{TINYFONT}{BLACK}{DATE_LONG}
-STR_0200_LAST_MESSAGE_NEWS_REPORT                               :Laaste boodskap/nuus verslag
-STR_0201_MESSAGE_SETTINGS                                       :Boodskap stellings
-STR_MESSAGE_HISTORY_MENU                                        :Boodskap Geskidenis
-STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}Vertoon laaste boodskap/nuus verslag, vertoon boodskap opsies
-STR_0204_MESSAGE_OPTIONS                                        :{WHITE}Boodskap Opsies
-STR_0205_MESSAGE_TYPES                                          :{BLACK}Boodskap tipes:
-STR_0206_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Aankoms van eerste voetuig by speler se stasie
-STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Aankoms van eerste voertuig by mededinger se stasie
-STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Ongelukke / rampe
-STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Maatkappy inligting
-STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Ekonomie veranderings
-STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Raad / inligting op speler se voertuie
-STR_020C_NEW_VEHICLES                                           :{YELLOW}Nuwe voertuie
-STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Veranderings na vrag aanvarde
-STR_020E_SUBSIDIES                                              :{YELLOW}Subsidiee
-STR_020F_GENERAL_INFORMATION                                    :{YELLOW}Generale inligting
-STR_MESSAGES_ALL                                                :{YELLOW}Stel alle boodskap tipes na: Af/Opsomming/Volle
-STR_MESSAGE_SOUND                                               :{YELLOW}Speel geluid vir opsommige nuus boodskappe
-STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO                       :{WHITE}...te ver van vorige destinasie
-STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}Hoof maatskappye wat het {NUM}{}({STRING} Vlak) gekry
-STR_TOP_COMPANIES_NETWORK_GAME                                  :{BIGFONT}{BLACK}Maatskappy Liga Tafel in {NUM}
-STR_0212                                                        :{BIGFONT}{COMMA}.
-STR_0213_BUSINESSMAN                                            :Sakeman
-STR_0214_ENTREPRENEUR                                           :Ondernemer
-STR_0215_INDUSTRIALIST                                          :Nyweraar
-STR_0216_CAPITALIST                                             :Kapitalis
-STR_0217_MAGNATE                                                :Magnaat
-STR_0218_MOGUL                                                  :Mongool
-STR_0219_TYCOON_OF_THE_CENTURY                                  :Magnaat van die eeu
-STR_HIGHSCORE_NAME                                              :{BIGFONT}{PLAYERNAME}, {COMPANY}
-STR_HIGHSCORE_STATS                                             :{BIGFONT}'{STRING}'   ({COMMA})
-STR_021B_ACHIEVES_STATUS                                        :{BLACK}{BIGFONT}{COMPANY} behaal '{STRING}' stand!
-STR_021C_OF_ACHIEVES_STATUS                                     :{WHITE}{BIGFONT}{PLAYERNAME} van {COMPANY} behaal '{STRING}' stand!
-STR_021F                                                        :{BLUE}{COMMA}
-STR_0221_OPENTTD                                                :{YELLOW}OpenTTD
-STR_0222_SCENARIO_EDITOR                                        :{YELLOW}Draaiboek Redakteur
-STR_0223_LAND_GENERATION                                        :{WHITE}Land Ontwikkeling
-STR_0224                                                        :{BLACK}{UPARROW}
-STR_0225                                                        :{BLACK}{DOWNARROW}
-STR_0228_INCREASE_SIZE_OF_LAND_AREA                             :{BLACK}Vergroot land area om te verlaag/verhoog
-STR_0229_DECREASE_SIZE_OF_LAND_AREA                             :{BLACK}Verminder land area om te verlaag/verhoog
-STR_022A_GENERATE_RANDOM_LAND                                   :{BLACK}Ontwikkel lukraak land
-STR_022B_RESET_LANDSCAPE                                        :{BLACK}Herstel landerye
-STR_022C_RESET_LANDSCAPE                                        :{WHITE}Herstel landerye
-STR_RESET_LANDSCAPE_CONFIRMATION_TEXT                           :{WHITE}Is jy seker jy wil alle speler-besittend eiendom verwyder?
-STR_022E_LANDSCAPE_GENERATION                                   :{BLACK}Landerye ontwikkeling
-STR_022F_TOWN_GENERATION                                        :{BLACK}Stad ontwikkeling
-STR_0230_INDUSTRY_GENERATION                                    :{BLACK}Nyweheid ontwikkeling
-STR_0231_ROAD_CONSTRUCTION                                      :{BLACK}Pad konstruksie
-STR_0233_TOWN_GENERATION                                        :{WHITE}Stad Ontwikkeling
-STR_0234_NEW_TOWN                                               :{BLACK}Nuwe Stad
-STR_0235_CONSTRUCT_NEW_TOWN                                     :{BLACK}Bou nuwe stad
-STR_0236_CAN_T_BUILD_TOWN_HERE                                  :{WHITE}Stad kan nie hier gebou word nie...
-STR_0237_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}...te naby aan kant van kaart
-STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN                              :{WHITE}...te naby aan 'n ander stad
-STR_0239_SITE_UNSUITABLE                                        :{WHITE}...plek ongeskik
-STR_023A_TOO_MANY_TOWNS                                         :{WHITE}...te veel stede
-STR_CANNOT_GENERATE_TOWN                                        :{WHITE}Kan nie enige stede bou nie
-STR_NO_SPACE_FOR_TOWN                                           :{WHITE}...daar is nie meer spasie op die kaart nie
-STR_023B_INCREASE_SIZE_OF_TOWN                                  :{BLACK}Vergroot stad
-STR_023C_EXPAND                                                 :{BLACK}Uitbrei
-STR_023D_RANDOM_TOWN                                            :{BLACK}Lukraak Stad
-STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION                          :{BLACK}Bou stad in lukraak plek
-STR_023F_INDUSTRY_GENERATION                                    :{WHITE}Nywerheid Ontwikkeling
-STR_0240_COAL_MINE                                              :{BLACK}Steenkool Myn
-STR_0241_POWER_STATION                                          :{BLACK}Krag Stasie
-STR_0242_SAWMILL                                                :{BLACK}Saagmeul
-STR_0243_FOREST                                                 :{BLACK}Woud
-STR_0244_OIL_REFINERY                                           :{BLACK}Olie Raffineerdery
-STR_0245_OIL_RIG                                                :{BLACK}Olieboor
-STR_0246_FACTORY                                                :{BLACK}Fabriek
-STR_0247_STEEL_MILL                                             :{BLACK}Staalmeul
-STR_0248_FARM                                                   :{BLACK}Plaas
-STR_0249_IRON_ORE_MINE                                          :{BLACK}Yster Erts Myn
-STR_024A_OIL_WELLS                                              :{BLACK}Olie Bron
-STR_024B_BANK                                                   :{BLACK}Bank
-STR_024C_PAPER_MILL                                             :{BLACK}Papiermeul
-STR_024D_FOOD_PROCESSING_PLANT                                  :{BLACK}Kos Verwerking Fabriek
-STR_024E_PRINTING_WORKS                                         :{BLACK}Drukwerke
-STR_024F_GOLD_MINE                                              :{BLACK}Goud Myn
-STR_0250_LUMBER_MILL                                            :{BLACK}Timmehoutmeul
-STR_0251_FRUIT_PLANTATION                                       :{BLACK}Vrugte Plantasie
-STR_0252_RUBBER_PLANTATION                                      :{BLACK}Gomlastiek Plantasie
-STR_0253_WATER_SUPPLY                                           :{BLACK}Water Lewering
-STR_0254_WATER_TOWER                                            :{BLACK}Water Toring
-STR_0255_DIAMOND_MINE                                           :{BLACK}Diamant Myn
-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 Boerdery
-STR_025A_COLA_WELLS                                             :{BLACK}Cola Bron
-STR_025B_TOY_SHOP                                               :{BLACK}Speelgoed Winkel
-STR_025C_TOY_FACTORY                                            :{BLACK}Speelgoed Fabriek
-STR_025D_PLASTIC_FOUNTAINS                                      :{BLACK}Plastiek Fonteine
-STR_025E_FIZZY_DRINK_FACTORY                                    :{BLACK}Koeldrank Fabriek
-STR_025F_BUBBLE_GENERATOR                                       :{BLACK}Borrel Ontwikkelaar
-STR_0260_TOFFEE_QUARRY                                          :{BLACK}Tameletjie Prooi
-STR_0261_SUGAR_MINE                                             :{BLACK}Suiker Myn
-STR_0262_CONSTRUCT_COAL_MINE                                    :{BLACK}Bou Steenkool Myn
-STR_0263_CONSTRUCT_POWER_STATION                                :{BLACK}Bou Krag Stasie
-STR_0264_CONSTRUCT_SAWMILL                                      :{BLACK}Bou Saagmeul
-STR_0265_PLANT_FOREST                                           :{BLACK}Beplant Woud
-STR_0266_CONSTRUCT_OIL_REFINERY                                 :{BLACK}Bou Olie Raffineerdery
-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 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)
-STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}Bou Papiermeul
-STR_026F_CONSTRUCT_FOOD_PROCESSING                              :{BLACK}Bou Kos Verwerkings Fabriek
-STR_0270_CONSTRUCT_PRINTING_WORKS                               :{BLACK}Bou Drukwerke
-STR_0271_CONSTRUCT_GOLD_MINE                                    :{BLACK}Bou Goud Myn
-STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Bou Bank (Kan slegs in stede gebou word)
-STR_0273_CONSTRUCT_LUMBER_MILL_TO                               :{BLACK}Bou Timmerhoutmeul (om reenwoud te reinig en hout te maak)
-STR_0274_PLANT_FRUIT_PLANTATION                                 :{BLACK}Beplant Vrugte Plantasie
-STR_0275_PLANT_RUBBER_PLANTATION                                :{BLACK}Beplant Gomlastiek Plantasie
-STR_0276_CONSTRUCT_WATER_SUPPLY                                 :{BLACK}Bou Water Lewering
-STR_0277_CONSTRUCT_WATER_TOWER_CAN                              :{BLACK}Bou Water Toring (Kan slegs in stede gebou word)
-STR_0278_CONSTRUCT_DIAMOND_MINE                                 :{BLACK}Bou Diamant Myn
-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 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
-STR_0280_CONSTRUCT_PLASTIC_FOUNTAINS                            :{BLACK}Bou Plastiek Fonteine
-STR_0281_CONSTRUCT_FIZZY_DRINK_FACTORY                          :{BLACK}Bou Koeldrank Fabriek
-STR_0282_CONSTRUCT_BUBBLE_GENERATOR                             :{BLACK}Bou Borrel Ontwikkelaar
-STR_0283_CONSTRUCT_TOFFEE_QUARRY                                :{BLACK}Bou Tameletjie Prooi
-STR_0284_CONSTRUCT_SUGAR_MINE                                   :{BLACK}Bou Suiker Myn
-STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}Kan nie {STRING} hier bou nie...
-STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...moet eers stad bou
-STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...slegs een toegelaat per stad
-STR_0288_PLANT_TREES                                            :{BLACK}Boome beplant
-STR_0289_PLACE_SIGN                                             :{BLACK}Plaas teken
-STR_028A_RANDOM_TREES                                           :{BLACK}Lukraak Boome
-STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}Beplant boome lukraake oor laderye
-STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE                         :{BLACK}Plaas rotse op landerye
-STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Plaas vuurtoring
-STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Plaas sender
-STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Bepaal woestyn area.{}Druk en hou CTRL om te verwyder
-STR_0290_DELETE                                                 :{BLACK}Uitwis
-STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Uitwis hele stad
-STR_0292_SAVE_SCENARIO                                          :Bewaar draaiboek
-STR_0293_LOAD_SCENARIO                                          :Laai draaiboek
-STR_LOAD_HEIGHTMAP                                              :Laai Hoogtekaart
-STR_0294_QUIT_EDITOR                                            :Verlaat redakteur
-STR_0295                                                        :
-STR_0296_QUIT                                                   :Verlaat
-STR_0297_SAVE_SCENARIO_LOAD_SCENARIO                            :{BLACK}Bewaar draaiboek, laai draaiboek, verlaat draaiboek redakteur, Verlaat
-STR_0298_LOAD_SCENARIO                                          :{WHITE}Laai Draaiboek
-STR_0299_SAVE_SCENARIO                                          :{WHITE}Bewaar Draaiboek
-STR_029A_PLAY_SCENARIO                                          :{BLACK}Speel Draaiboek
-STR_PLAY_HEIGHTMAP                                              :{BLACK}Speel Hoogtekaart
-STR_PLAY_HEIGHTMAP_HINT                                         :{BLACK}begin 'n nuwe spel, gebruikend 'n hoogtekaart as oStart a new game, using a heightmap as landscape
-STR_QUIT_SCENARIO_QUERY                                         :{YELLOW}Is jy seker jy wil die draaiboek verlaat?
-STR_029C_QUIT_EDITOR                                            :{WHITE}Verlaat Redakteur
-STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan slegs in stede met 'n populasie van te minste 1200 gebou word
-STR_029E_MOVE_THE_STARTING_DATE                                 :{BLACK}Beweeg die begin datum 1 jaar terug
-STR_029F_MOVE_THE_STARTING_DATE                                 :{BLACK}Beweeg die begin datum 1 jaar voor
-STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH                               :{WHITE}...albei einde van brug moet op land wees
-STR_02A1_SMALL                                                  :{BLACK}Klein
-STR_02A2_MEDIUM                                                 :{BLACK}Middel
-STR_02A3_LARGE                                                  :{BLACK}Groot
-STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Kies stad groote
-STR_02A5_TOWN_SIZE                                              :{YELLOW}Stad groote:
-
-STR_02B6                                                        :{STRING}  -  {STRING}
-STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS                              :{BLACK}Wys laaste boodskap of nuus verslag
-STR_OFF                                                         :Af
-STR_SUMMARY                                                     :Opsomming
-STR_FULL                                                        :Vol
-STR_02BA                                                        :{SILVER}- -  {COMPANY}  - -
-STR_02BB_TOWN_DIRECTORY                                         :Stad index
-STR_02BC_VEHICLE_DESIGN_NAMES                                   :{BLACK}Voertuig ontwerp naame
-STR_02BD                                                        :{BLACK}{STRING}
-STR_02BE_DEFAULT                                                :Gebrekte
-STR_02BF_CUSTOM                                                 :Gewoonte
-STR_02C0_SAVE_CUSTOM_NAMES                                      :{BLACK}Bewaar gewoonte naame
-STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION                         :{BLACK}Voertuig ontwerp name keuse
-STR_02C2_SAVE_CUSTOMIZED_VEHICLE                                :{BLACK}Bewaar doelgeboude voertuig ontwerp naame
-
-STR_CHECKMARK                                                   :{CHECKMARK}
-############ range for menu starts
-STR_02C3_GAME_OPTIONS                                           :Spel opsies
-STR_02C5_DIFFICULTY_SETTINGS                                    :Moeilikheid stellings
-STR_02C7_CONFIG_PATCHES                                         :Skep stukke
-STR_NEWGRF_SETTINGS                                             :Newgrf stellings
-STR_GAMEOPTMENU_0A                                              :
-STR_02CA_TOWN_NAMES_DISPLAYED                                   :{SETX 12}Stad naame vertoon
-STR_02CC_STATION_NAMES_DISPLAYED                                :{SETX 12}Stasie naame vertoon
-STR_02CE_SIGNS_DISPLAYED                                        :{SETX 12}Tekens vertoon
-STR_WAYPOINTS_DISPLAYED2                                        :{SETX 12}Wegpunte vertoon
-STR_02D0_FULL_ANIMATION                                         :{SETX 12}Volle animasie
-STR_02D2_FULL_DETAIL                                            :{SETX 12}Volle aanwyse
-STR_02D4_TRANSPARENT_BUILDINGS                                  :{SETX 12}Deurskynend geboue
-STR_TRANSPARENT_SIGNS                                           :{SETX 12}Deurskynend stasie tekens
-############ range ends here
-
-############ range for menu starts
-STR_02D5_LAND_BLOCK_INFO                                        :Land area inligting
-STR_02D6                                                        :
-STR_CONSOLE_SETTING                                             :Skakel troos
-STR_02D7_SCREENSHOT_CTRL_S                                      :Skermskut (Ctrl-S)
-STR_02D8_GIANT_SCREENSHOT_CTRL_G                                :Reuse Skermskut (Ctrl-G)
-STR_02D9_ABOUT_OPENTTD                                          :Rakend 'OpenTTD'
-############ range ends here
-
-STR_02DB_OFF                                                    :{BLACK}Af
-STR_02DA_ON                                                     :{BLACK}An
-STR_02DC_DISPLAY_SUBSIDIES                                      :{BLACK}Vertoon subsidiee
-STR_02DD_SUBSIDIES                                              :Subsidiee
-STR_02DE_MAP_OF_WORLD                                           :Kaart van wêreld
-STR_EXTRA_VIEW_PORT                                             :Ekstra gesigswerf
-STR_SIGN_LIST                                                   :Teken lys
-STR_02DF_TOWN_DIRECTORY                                         :Stad indeks
-STR_TOWN_POPULATION                                             :{BLACK}Wereld populasie: {COMMA}
-STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Gesigswerf {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN                                :{BLACK}Afskryf na gesigswerf
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT                             :{BLACK}Afskryf die lokasie van die wereldwerf na die gesigswerf
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW                                :{BLACK}Deeg van gesigswerf
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT                             :{BLACK}Deeg die lokasie van die gesigspunt na die hoofskerm
-
-STR_02E0_CURRENCY_UNITS                                         :{BLACK}Koers eenheide
-STR_02E1                                                        :{BLACK}{SKIP}{STRING}
-STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Koers eendheide keuse
-STR_MEASURING_UNITS                                             :{BLACK}Maatre� eenheide
-STR_02E4                                                        :{BLACK}{SKIP}{SKIP}{STRING}
-STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Maatre� eenheide keuse
-STR_02E6_ROAD_VEHICLES                                          :{BLACK}Pad voertuie
-STR_02E7                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Kies kant van pad waarop voetuie bestuur
-STR_02E9_DRIVE_ON_LEFT                                          :Bestuur op links
-STR_02EA_DRIVE_ON_RIGHT                                         :Bestuur op regs
-STR_02EB_TOWN_NAMES                                             :{BLACK}Stad naame
-STR_02EC                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02ED_SELECT_STYLE_OF_TOWN_NAMES                             :{BLACK}Kies styl van stad naame
-
-STR_02F4_AUTOSAVE                                               :{BLACK}Outobewaar
-STR_02F5                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Kies afstand tussen outomatiese spel bewaarde
-STR_02F7_OFF                                                    :Af
-STR_02F8_EVERY_3_MONTHS                                         :Elke 3 maande
-STR_02F9_EVERY_6_MONTHS                                         :Elke 6 maande
-STR_02FA_EVERY_12_MONTHS                                        :Elke 12 maande
-STR_02FB_START_A_NEW_GAME                                       :{BLACK}Begin nuwe spel
-STR_02FC_LOAD_A_SAVED_GAME                                      :{BLACK}Laai 'n bewaarde spel
-STR_02FE_CREATE_A_CUSTOMIZED_GAME                               :{BLACK}Skep 'n doelgeboude spel wêreld/draaiboek
-STR_02FF_SELECT_SINGLE_PLAYER_GAME                              :{BLACK}Kies enkel-speler spel
-STR_0300_SELECT_MULTIPLAYER_GAME                                :{BLACK}Kies veelspeler spel met 2-8 spelers
-STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Vertoon spel opsies
-STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Vertoon moeilikheid opsies
-STR_0303_START_A_NEW_GAME_USING                                 :{BLACK}Begin 'n nuwe spel, met 'n doelgemaakte draaiboek
-STR_0304_QUIT                                                   :{BLACK}Verlaat
-STR_0305_QUIT_OPENTTD                                           :{BLACK}Verlaat 'OpenTTD'
-STR_0307_OPENTTD                                                :{WHITE}OpenTTD {REV}
-STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan slegs in stede gebou word
-STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Kies 'gematig' landerye styl
-STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE                            :{BLACK}Kies 'onder-noordpool' landerye styl
-STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE                          :{BLACK}Kies 'onder-tropise' landerye styl
-STR_0311_SELECT_TOYLAND_LANDSCAPE                               :{BLACK}Kies 'speelgoedland' landerye styl
-STR_0312_FUND_CONSTRUCTION_OF_NEW                               :{BLACK}Befonds gebou van nuwe nywerheid
-
-############ range for menu starts
-STR_INDUSTRY_DIR                                                :Nywerheid Indeks
-STR_0313_FUND_NEW_INDUSTRY                                      :Befonds nuwe nywerheid
-############ range ends here
-
-STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Befonds nuwe nywerheid
-STR_JUST_STRING                                                 :{STRING}
-STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...kan slegs in stede gebou word
-STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...kan slegs in reenwoud areas gebou word
-STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...kan slegs in woestyn areas gebou word
-STR_0319_PAUSED                                                 :{YELLOW}* *  POUSEER  *  *
-
-STR_031B_SCREENSHOT_SUCCESSFULLY                                :{WHITE}Skermskut suksesvollig bewaar as '{STRING}'
-STR_031C_SCREENSHOT_FAILED                                      :{WHITE}Skermskut gedop!
-
-STR_0329_PURCHASE_LAND_FOR_FUTURE                               :{BLACK}Koop land vir toekomende gebruik
-STR_032F_AUTOSAVE                                               :{RED}OUTOBEWAAR
-STR_SAVING_GAME                                                 :{RED}*  *  BEWAAR SPEL  *  *
-STR_SAVE_STILL_IN_PROGRESS                                      :{WHITE}Bewaar nog in vorder, wag asb tot dit klaar is!
-STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Kies 'Ezy Straat styl musiek' musiek lys
-
-STR_0335_6                                                      :{BLACK}6
-STR_0336_7                                                      :{BLACK}7
-
-############ start of townname region
-STR_TOWNNAME_ORIGINAL_ENGLISH                                   :Engels (Oorspronkilik)
-STR_TOWNNAME_FRENCH                                             :Frans
-STR_TOWNNAME_DUTCH                                              :Hollands
-STR_TOWNNAME_FINNISH                                            :Finnish
-STR_TOWNNAME_POLISH                                             :Polish
-STR_TOWNNAME_SLOVAKISH                                          :Slovakish
-STR_TOWNNAME_NORWEGIAN                                          :Norwegian
-STR_TOWNNAME_HUNGARIAN                                          :Hungarian
-STR_TOWNNAME_AUSTRIAN                                           :Austrian
-STR_TOWNNAME_ROMANIAN                                           :Romanian
-STR_TOWNNAME_CZECH                                              :Czech
-STR_TOWNNAME_SWISS                                              :Swiss
-############ end of townname region
-
-STR_CURR_GBP                                                    :Pounds ()
-STR_CURR_USD                                                    :Dollars ($)
-STR_CURR_EUR                                                    :Euro (€)
-STR_CURR_YEN                                                    :Yen (¥)
-STR_CURR_ATS                                                    :Austrian Shilling (ATS)
-STR_CURR_BEF                                                    :Belgian Franc (BEF)
-STR_CURR_CHF                                                    :Swiss Franc (CHF)
-STR_CURR_CZK                                                    :Czech Koruna (CZK)
-STR_CURR_DEM                                                    :Deutschmark (DEM)
-STR_CURR_DKK                                                    :Danish Krone (DKK)
-STR_CURR_ESP                                                    :Peseta (ESP)
-STR_CURR_FIM                                                    :Finnish Markka (FIM)
-STR_CURR_FRF                                                    :Franc (FRF)
-STR_CURR_GRD                                                    :Greek Drachma (GRD)
-STR_CURR_HUF                                                    :Hungarian Forint (HUF)
-STR_CURR_ISK                                                    :Icelandic Krona (ISK)
-STR_CURR_ITL                                                    :Italian Lira (ITL)
-STR_CURR_NLG                                                    :Dutch Guilder (NLG)
-STR_CURR_NOK                                                    :Norwegian Krone (NOK)
-STR_CURR_PLN                                                    :Polish Zloty (PLN)
-STR_CURR_ROL                                                    :Romanian Leu (ROL)
-STR_CURR_RUR                                                    :Russian Rubles (RUR)
-STR_CURR_SIT                                                    :Slovenian Tolar (SIT)
-STR_CURR_SEK                                                    :Swedish Krona (SEK)
-STR_CURR_YTL                                                    :Turkish Lira (YTL)
-STR_CURR_SKK                                                    :Slovak Koruna (SKK)
-STR_CURR_BRR                                                    :Brazilian Real (BRL)
-
-STR_CURR_CUSTOM                                                 :Gewoonte...
-
-STR_OPTIONS_LANG                                                :{BLACK}Taal
-STR_OPTIONS_LANG_CBO                                            :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-
-STR_OPTIONS_FULLSCREEN                                          :{BLACK}Volskerm
-
-STR_OPTIONS_RES_CBO                                             :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-
-STR_OPTIONS_SCREENSHOT_FORMAT_CBO                               :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-
-STR_AUTOSAVE_1_MONTH                                            :Elke maand
-STR_AUTOSAVE_FAILED                                             :{WHITE}Outobewaar gedop
-
-STR_MONTH_JAN                                                   :Januarie
-STR_MONTH_FEB                                                   :Februarie
-STR_MONTH_MAR                                                   :Maart
-STR_MONTH_APR                                                   :April
-STR_MONTH_MAY                                                   :Mei
-STR_MONTH_JUN                                                   :Junie
-STR_MONTH_JUL                                                   :Julie
-STR_MONTH_AUG                                                   :Augustus
-STR_MONTH_SEP                                                   :September
-STR_MONTH_OCT                                                   :Oktober
-STR_MONTH_NOV                                                   :November
-STR_MONTH_DEC                                                   :Desember
-
-STR_HEADING_FOR_STATION                                         :{LTBLUE}Op pad na {STATION}
-STR_HEADING_FOR_STATION_VEL                                     :{LTBLUE}Op pad na {STATION}, {VELOCITY}
-STR_NO_ORDERS                                                   :{LTBLUE}Geen Opdrae
-STR_NO_ORDERS_VEL                                               :{LTBLUE}Geen opdrae, {VELOCITY}
-
-STR_PASSENGERS                                                  :passasiers
-STR_BAGS                                                        :sakke
-STR_LITERS                                                      :litres
-STR_ITEMS                                                       :items
-STR_CRATES                                                      :hokke
-STR_NOTHING                                                     :
-
-
-STR_CANT_SHARE_ORDER_LIST                                       :{WHITE}Kan nie opdraglys deel nie...
-STR_CANT_COPY_ORDER_LIST                                        :{WHITE}Kan nie opdraglys afskryf nie...
-STR_END_OF_SHARED_ORDERS                                        :{SETX 10}- - Einde van Verdeelde Opdrae - -
-
-STR_EURO_INTRODUCE                                              :{BLACK}{BIGFONT}Europees Geldelik Samesmelting!{}{}Die Euro is ingevoer as die enigste koers vir daagliks transaksies in u land!
-
-# Start of order review system.
-# DON'T ADD OR REMOVE LINES HERE
-STR_AIRCRAFT_HAS_TOO_FEW_ORDERS                                 :{WHITE}Vliegtuig {COMMA} het te min opdrae in die opgawe
-STR_AIRCRAFT_HAS_VOID_ORDER                                     :{WHITE}vliegtuig {COMMA} het 'n nietig opdrag
-STR_AIRCRAFT_HAS_DUPLICATE_ENTRY                                :{WHITE}Vliegtuig {COMMA} het duplikaat opdrae
-STR_AIRCRAFT_HAS_INVALID_ENTRY                                  :{WHITE}Vliegtuig {COMMA} hen 'n swak opdrag in sy opdrae
-# end of order system
-
-STR_AIRCRAFT_AUTORENEW_FAILED                                   :{WHITE}Outohernuwe gedop op vliegtuig {COMMA} (geldperk)
-
-
-STR_CONFIG_PATCHES_OFF                                          :Af
-STR_CONFIG_PATCHES_ON                                           :Aan
-STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Wys voertuig spoed in die standbaan: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Toelaat opbou op hellings en strande: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Toelaat meer werklikheide opvanggebied groote: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Toelaat verwydering van meer stad-besite paaie, bruge, ens: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Stel in staat die gebou van baie lang treine: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REALISTICACCEL                               :{LTBLUE}Stel in staat realistiese versnelling vir treine: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Verbied triene en skepe om 90 graad draaie te maak: {ORANGE}{STRING} {LTBLUE} (benodig NPF)
-STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}Verbind trein stasies wat langsaan gebou is: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}Verlaat stasie as enige vrag vol is, as 'volle gelaai': {ORANGE}{STRING}
-STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Gebruik verebeterde laai algoritme: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INFLATION                                    :{LTBLUE}Inflasie: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Aflewer vrag na 'n stasie slegs as daar 'n aanvrag is:: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Toelaat opbou van baie lank bruge: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Toelaat gaan na depot opdrae: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Toelaat veelvout soortgelyke nywerheide per stad: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Nywerheide van die selfde tipe kan naby aan mekaar gebou word: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Altyd wys lang datum in die standbaan: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Wys seine op die bestuur kant: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Wys finansies venster op die einde van die jaar: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}TTDPatch bestaanbaar deurgaande behandeling: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Pad voertuig toustaan (met kwantum effekte): {ORANGE}{STRING}
-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}
-
-STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Waarsku as trein verloor is: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}Bespreek voertuig se opdrae: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ORDER_REVIEW_OFF                             :nee
-STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :ja, maar uitsluit gestopde voertuie
-STR_CONFIG_PATCHES_ORDER_REVIEW_ON                              :van alle voertuie
-STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Waarsku as trein inkomste negatief is: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}Voertuie verval nooit nie: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}Outohernuwe voertuig as hy oud raak
-STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Outohernuwe wanner voertuig is {ORANGE}{STRING}{LTBLUE} maande voor/agter max ouderdom
-STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Outohernuwe minimum vereisde geld vir hernuwe: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Tydgrens van fout boodskap: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Wys stad populasie in stad naam teken: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Onsigbaar boome (met deurskynend geboue): {ORANGE}{STRING}
-
-STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Land ontwikkelaar: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Oorspronklik
-STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS                 :TerraGenesis
-STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Max afstand van kant vir Olie Raffineerderye {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SNOWLINE_HEIGHT                              :{LTBLUE}Sneeu lyn hoogte: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}Ruheid van terrein (slegs TerraGenesis) : {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Baie Glad
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_SMOOTH                  :Glad
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_ROUGH                   :Ru
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_ROUGH              :Baie Ru
-STR_CONFIG_PATCHES_TREE_PLACER                                  :{LTBLUE}Boom plaas algoritme: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TREE_PLACER_NONE                             :Geen
-STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL                         :Oorspronklik
-STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED                         :Verbeterde
-STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION                           :{LTBLUE}Hoogtekaart rotasie: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT                         :{LTBLUE}Die hoogtevlak 'n platte landerye kaart kry: {ORANGE}{STRING}
-
-STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}Max stasie omvang: {ORANGE}{STRING} {RED}Waarskuwing: Ho�stelling vertraag spel
-STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Versien helikopters by helihawes outomaties: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Verbind landereye werktuigbaan na spoor/pad/water/lughawe werktuigbaan: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Omkeer rol rigting: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Wys maatskappy lewerye: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES_NONE                                :Geen
-STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Eie maatskappy
-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}
-STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}Max skepe per speler: {ORANGE}{STRING}
-
-STR_CONFIG_PATCHES_AI_BUILDS_TRAINS                             :{LTBLUE}Vermink treine vir rekenaar: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH                            :{LTBLUE}Vermink pad voertuie vir rekenaar: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}Vermink vliegtuie vir rekenaar: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}Vermink skepe vir rekenaar: {ORANGE}{STRING}
-
-STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Stel nuwe AI (alpha) in staat: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Toelaat AIe in veelspeeler (proefondervindelik): {ORANGE}{STRING}
-
-STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Gebrekte versien tussentyd vir treine: {ORANGE}{STRING} dae/%
-STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Gebrekte versien tussentyd vir treine: {ORANGE}gestrem
-STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Gebrekte versien tussentyd vir pad voertuie: {ORANGE}{STRING} dae/%
-STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Gebrekte versien tussentyd vir pad voertuie: {ORANGE}gestrem
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Gebrekte versien tussentyd vir vlietuie: {ORANGE}{STRING} dae/%
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Gebrekte versien tussentyd vir vlietuie: {ORANGE}gestrem
-STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Gebrekte versien tussentyd vir skepe: {ORANGE}{STRING} dae/%
-STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Gebrekte versien tussentyd vir skepe: {ORANGE}gestrem
-STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}Gestrem versiening wanneer oponthoude is na geen gestel: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}Stel wa spoed limite in staak: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DISABLE_ELRAILS                              :{LTBLUE}Gestrem elektriese spoore: {ORANGE}{STRING}
-
-STR_CONFIG_PATCHES_COLORED_NEWS_YEAR                            :{LTBLUE}Gekleurde nuus verskyn in: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}Begins datum: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ENDING_YEAR                                  :{LTBLUE}Eindig spel in: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}Stel vloeiende ekonomie in staak (meer, kleiner veranderings)
-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
-STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Regs
-STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Venster slag straal: {ORANGE}{STRING} px
-STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Venster slag straal: {ORANGE}gestrem
-
-STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruksie
-STR_CONFIG_PATCHES_VEHICLES                                     :{BLACK}Voertuie
-STR_CONFIG_PATCHES_STATIONS                                     :{BLACK}Stasies
-STR_CONFIG_PATCHES_ECONOMY                                      :{BLACK}Ekonomie
-STR_CONFIG_PATCHES_AI                                           :{BLACK}Mededingers
-
-STR_CONFIG_PATCHES_DISABLED                                     :gestrem
-STR_CONFIG_PATCHES_INT32                                        :{NUM}
-STR_CONFIG_PATCHES_CURRENCY                                     :{CURRENCY}
-
-STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Verander stelling waarde
-STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Party of almal van die gebrekte versien tussentyd(e) onder is onbestaanbaar met die verkiesde stelling! 5-90% en 30-800 dae is geldig
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Gebruik YAPF vir skepe: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Gebruik YAPF vir pad voertuie: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Gebruik YAPF vir treine: {ORANGE}{STRING}
-
-
-STR_CHEATS                                                      :{WHITE}Bedriege
-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}
-STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}Tower stootskraper (uitwis nywerheide, onbeweegbares): {ORANGE}{STRING}
-STR_CHEAT_CROSSINGTUNNELS                                       :{LTBLUE}Tonnels mag vir mekaar kruis: {ORANGE}{STRING}
-STR_CHEAT_BUILD_IN_PAUSE                                        :{LTBLUE}Bou terwyl in pouseer: {ORANGE}{STRING}
-STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}Straalvliegtuie sal nie (dikwels) op klein lughawe bots nie: {ORANGE} {STRING}
-STR_CHEAT_SWITCH_CLIMATE                                        :{LTBLUE}Skakel klimaat: {ORANGE} {STRING}
-STR_CHEAT_CHANGE_DATE                                           :{LTBLUE}Verander datum: {ORANGE} {DATE_SHORT}
-STR_CHEAT_SETUP_PROD                                            :{LTBLUE}Stel modifikasie van produksie waarde in staak: {ORANGE}{STRING}
-
-STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}Op pad na {WAYPOINT}
-STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Op pad na {WAYPOINT}, {VELOCITY}
-
-STR_GO_TO_WAYPOINT                                              :Gaan oor {WAYPOINT}
-STR_GO_NON_STOP_TO_WAYPOINT                                     :Gaan deurgaande oor {WAYPOINT}
-
-STR_LANDINFO_WAYPOINT                                           :Wegpunt
-
-
-STR_EDIT_WAYPOINT_NAME                                          :{WHITE}Redigeer wegpunt naam
-
-STR_CANT_CHANGE_WAYPOINT_NAME                                   :{WHITE}Kan nie wegpunt naam verander nie...
-STR_CONVERT_RAIL_TO_WAYPOINT_TIP                                :{BLACK}Verdoel spoor na wegpunt
-STR_CANT_BUILD_TRAIN_WAYPOINT                                   :{WHITE}Kanie nie trein wegpunt hier bou nie...
-STR_CANT_REMOVE_TRAIN_WAYPOINT                                  :{WHITE}Kan nie trein wegpunt van hier werwyder nie...
-
-STR_BUILD_AUTORAIL_TIP                                          :{BLACK}Bou spoorweg spoor met die Outospoor metode
-
-STR_NO_TOWN_IN_SCENARIO                                         :{WHITE}...daar is geen stad in die draaiboek
-
-STR_GENERATE_RANDOM_LANDSCAPE                                   :{WHITE}Is jy seker jy wil 'n lukraake landeryke skep?
-STR_MANY_RANDOM_TOWNS                                           :{BLACK}Baie lukraak stede
-STR_MANY_RANDOM_INDUSTRIES                                      :Baie luraak nyweheide
-STR_CAN_T_GENERATE_INDUSTRIES                                   :{WHITE}Kan nie nywerheide ontwikkel nie...
-
-STR_LANDSCAPING_TOOLBAR_TIP                                     :{BLACK}Oppe die landargitekteur werktuigbaan om land te verhoog/verlaag, boome beplant, ens.
-STR_LANDSCAPING_TOOLBAR                                         :{WHITE}Landargitekteur
-STR_LEVEL_LAND_TOOLTIP                                          :{BLACK}Vlakte land
-
-
-
-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...
-STR_BUILD_LOCKS_TIP                                             :{BLACK}Bou sluite
-STR_LANDINFO_LOCK                                               :Sluit
-
-STR_BUOY_IS_IN_USE                                              :{WHITE}...baken is in gebruik!
-
-
-STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Kan nie deel van stasie verwyder nie...
-STR_CANT_CONVERT_RAIL                                           :{WHITE}Kan nie spoor tipe hier verdoel nie...
-STR_CONVERT_RAIL_TIP                                            :{BLACK}Verdoel/Opgradeer die spoor tipe
-
-STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP                                :{BLACK}Sleep trein enjin hier om hele trein te verkoop
-
-STR_DRAG_DROP                                                   :{BLACK}Sleep & Drop
-
-STR_FAST_FORWARD                                                :{BLACK}Vinnig vooruit die spel
-STR_MESSAGE_HISTORY                                             :{WHITE}Boodskap Geskidenis
-STR_MESSAGE_HISTORY_TIP                                         :{BLACK}'n Lys van al die onlangs nuus boodskappe
-STR_MESSAGES_DISABLE_ALL                                        :{BLACK}Gestrem alle
-STR_MESSAGES_ENABLE_ALL                                         :{BLACK}Stel alle in staak
-
-STR_CONSTRUCT_COAL_MINE_TIP                                     :{BLACK}Bou Steenkool Myn
-STR_CONSTRUCT_FOREST_TIP                                        :{BLACK}Wout Beplant
-STR_CONSTRUCT_OIL_RIG_TIP                                       :{BLACK}Bou Olieboor
-STR_CONSTRUCT_FARM_TIP                                          :{BLACK}Befonds Plaas
-STR_CONSTRUCT_COPPER_ORE_MINE_TIP                               :{BLACK}Bou Koper Erts Myn
-STR_CONSTRUCT_OIL_WELLS_TIP                                     :{BLACK}Boor vir Olie
-STR_CONSTRUCT_GOLD_MINE_TIP                                     :{BLACK}Bou Goud Myn
-STR_CONSTRUCT_DIAMOND_MINE_TIP                                  :{BLACK}Bou Diamant Myn
-STR_CONSTRUCT_IRON_ORE_MINE_TIP                                 :{BLACK}Bou Yster Erts Myn
-STR_CONSTRUCT_FRUIT_PLANTATION_TIP                              :{BLACK}Befonds Vrugte Plantasie
-STR_CONSTRUCT_RUBBER_PLANTATION_TIP                             :{BLACK}Befonds Gomlastiek Plantasie
-STR_CONSTRUCT_WATER_SUPPLY_TIP                                  :{BLACK}Befonds Water Lewering
-STR_CONSTRUCT_COTTON_CANDY_TIP                                  :{BLACK}Beplant Spookasem Woud
-STR_CONSTRUCT_BATTERY_FARM_TIP                                  :{BLACK}Befonds Battery Plaas
-STR_CONSTRUCT_COLA_WELLS_TIP                                    :{BLACK}Boor vir Cola
-STR_CONSTRUCT_PLASTIC_FOUNTAINS_TIP                             :{BLACK}Befonds Plastiek Fonteine
-STR_CONSTRUCT_BUBBLE_GENERATOR_TIP                              :{BLACK}Bou Borrel Ontwikkelaar
-STR_CONSTRUCT_TOFFEE_QUARRY_TIP                                 :{BLACK}Befonds Tameletjie Prooi
-STR_CONSTRUCT_SUGAR_MINE_TIP                                    :{BLACK}Bou Suiker Myn
-
-STR_INDUSTRYDIR_CAPTION                                         :{WHITE}Nywerheide
-STR_INDUSTRYDIR_ITEM                                            :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}){YELLOW} ({COMMA}% uitgevoer)
-STR_INDUSTRYDIR_ITEM_TWO                                        :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}/{CARGO}){YELLOW} ({COMMA}%/{COMMA}% uitgevoer)
-STR_INDUSTRYDIR_ITEM_NOPROD                                     :{ORANGE}{INDUSTRY}
-
-STR_INDUSTRY_TOO_CLOSE                                          :{WHITE}...te naby aan 'n ander nywerheid
-
-STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Versien tussentye is in persente: {ORANGE}{STRING}
-STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Verander produksie
-
-
-############ network gui strings
-
-STR_NETWORK_MULTIPLAYER                                         :{WHITE}Veelspeler
-
-STR_NETWORK_PLAYER_NAME                                         :{BLACK}Speler naam:
-STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Die is die naam waarmee ander spelers sal jou aanwys
-STR_NETWORK_CONNECTION                                          :{BLACK}Verbinding:
-STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Kies teen internet spel of 'n Plaaslike Area Netwerk (LAN) spel
-
-STR_NETWORK_START_SERVER                                        :{BLACK}Begin bediender
-STR_NETWORK_START_SERVER_TIP                                    :{BLACK}Begin u eie bediender
-
-STR_NETWORK_GAME_NAME                                           :{BLACK}Naam
-STR_NETWORK_GAME_NAME_TIP                                       :{BLACK}Naam van die spel
-STR_NETWORK_INFO_ICONS_TIP                                      :{BLACK}Taal, bediender verwerking, ens.
-STR_NETWORK_CLICK_GAME_TO_SELECT                                :{BLACK}kliek 'n naam op die lys om dit te kies
-
-STR_NETWORK_FIND_SERVER                                         :{BLACK}Versoek bediender
-STR_NETWORK_FIND_SERVER_TIP                                     :{BLACK}Versoek netwerk vir 'n bediender
-STR_NETWORK_ADD_SERVER                                          :{BLACK}Byvoeg Bediender
-STR_NETWORK_ADD_SERVER_TIP                                      :{BLACK}Byvoeg 'n bediender na die lys wat sal altyd nagaan vir lopende spele
-STR_NETWORK_ENTER_IP                                            :{BLACK}Invoeg die adres van die gasheer
-
-STR_NETWORK_GENERAL_ONLINE                                      :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA}
-STR_NETWORK_CLIENTS_CAPTION                                     :{BLACK}Kliente
-STR_NETWORK_CLIENTS_CAPTION_TIP                                 :{BLACK}Kliente oplyn / Kliente max{}Maatskappye oplyn / Maatskappye max
-STR_NETWORK_GAME_INFO                                           :{SILVER}SPEL INLIGTING
-STR_ORANGE                                                      :{ORANGE}{STRING}
-STR_NETWORK_CLIENTS                                             :{SILVER}Kliente:  {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
-STR_NETWORK_LANGUAGE                                            :{SILVER}Taal:  {WHITE}{STRING}
-STR_NETWORK_TILESET                                             :{SILVER}Blokkiestel:  {WHITE}{STRING}
-STR_NETWORK_MAP_SIZE                                            :{SILVER}Kaart groote:  {WHITE}{COMMA}x{COMMA}
-STR_NETWORK_SERVER_VERSION                                      :{SILVER}Bediender hersiening:  {WHITE}{STRING}
-STR_NETWORK_SERVER_ADDRESS                                      :{SILVER}Bediender adres:  {WHITE}{STRING} : {NUM}
-STR_NETWORK_START_DATE                                          :{SILVER}Begin datum:  {WHITE}{DATE_SHORT}
-STR_NETWORK_CURRENT_DATE                                        :{SILVER}Huidige datum:  {WHITE}{DATE_SHORT}
-STR_NETWORK_PASSWORD                                            :{SILVER}Wagwoord beskerm!
-STR_NETWORK_SERVER_OFFLINE                                      :{SILVER}BEDIENDER AFLYN
-STR_NETWORK_SERVER_FULL                                         :{SILVER}BEDIENDER VOL
-STR_NETWORK_VERSION_MISMATCH                                    :{SILVER}HERSIENING ONGELYK
-
-STR_NETWORK_JOIN_GAME                                           :{BLACK}Verbind spel
-
-
-STR_NETWORK_START_GAME_WINDOW                                   :{WHITE}Begin nuwe veelspeler spel
-
-STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Spel naam:
-STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Die spel naam sal vertoon word na ander spelers in die veelspeler keuse
-STR_NETWORK_SET_PASSWORD                                        :{BLACK}Stel wagwoord
-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_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:
-STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Beperk die bediender na 'n sekere bedrag van aanskouers
-STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Taal gepraat:
-STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Ander spelers sal weet watter taal op die bediender gepraat is
-STR_NETWORK_START_GAME                                          :{BLACK}Begin Spel
-STR_NETWORK_START_GAME_TIP                                      :{BLACK}Begin 'n nuwe netwerk spel van 'n lukraak kaart, of draaiboek
-STR_NETWORK_LOAD_GAME                                           :{BLACK}Laai Spel
-STR_NETWORK_LOAD_GAME_TIP                                       :{BLACK}Vervolg 'n vroe� bewaarde veelspeler spel (wees seker om te verbind as die korrekte speler)
-
-############ Leave those lines in this order!!
-STR_NETWORK_LANG_ANY                                            :Enige
-STR_NETWORK_LANG_ENGLISH                                        :Engels
-STR_NETWORK_LANG_GERMAN                                         :Duits
-STR_NETWORK_LANG_FRENCH                                         :Frans
-############ End of leave-in-this-order
-
-STR_NETWORK_GAME_LOBBY                                          :{WHITE}Veelspeler spel tuiste
-
-STR_NETWORK_PREPARE_TO_JOIN                                     :{BLACK}Voorberei om te verbind:   {ORANGE}{STRING}
-STR_NETWORK_COMPANY_LIST_TIP                                    :{BLACK}'n Lys van alle maatskappye huiding in die spel. Of kan jy een verbind of as daar 'n vry maatskappy gleuf is 'n nuwe ene begin
-STR_NETWORK_NEW_COMPANY                                         :{BLACK}Nuwe Maatskappy
-STR_NETWORK_NEW_COMPANY_TIP                                     :{BLACK}Skep 'n nuwe maatskappy
-STR_NETWORK_SPECTATE_GAME                                       :{BLACK}Aanskou spel
-STR_NETWORK_SPECTATE_GAME_TIP                                   :{BLACK}Bekyk die spel as 'n aanskouer
-STR_NETWORK_JOIN_COMPANY                                        :{BLACK}Verbind maatskappy
-STR_NETWORK_JOIN_COMPANY_TIP                                    :{BLACK}Hulp om die maatskappy te bestuur
-STR_NETWORK_REFRESH                                             :{BLACK}Vervris bediender
-STR_NETWORK_REFRESH_TIP                                         :{BLACK}Vervris die bediender inligting
-
-STR_NETWORK_COMPANY_INFO                                        :{SILVER}MAATSKAPPY INLIGTING
-
-STR_NETWORK_COMPANY_NAME                                        :{SILVER}Maatskappy naam:  {WHITE}{STRING}
-STR_NETWORK_INAUGURATION_YEAR                                   :{SILVER}Inwyding:  {WHITE}{NUM}
-STR_NETWORK_VALUE                                               :{SILVER}Maatskappy waarde:  {WHITE}{CURRENCY}
-STR_NETWORK_CURRENT_BALANCE                                     :{SILVER}Hudige balans:  {WHITE}{CURRENCY}
-STR_NETWORK_LAST_YEARS_INCOME                                   :{SILVER}Verlede jaar se inkome:  {WHITE}{CURRENCY}
-STR_NETWORK_PERFORMANCE                                         :{SILVER}Prestasie:  {WHITE}{NUM}
-
-STR_NETWORK_VEHICLES                                            :{SILVER}Voertuie:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
-STR_NETWORK_STATIONS                                            :{SILVER}Stasies:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
-STR_NETWORK_PLAYERS                                             :{SILVER}Spelers:  {WHITE}{STRING}
-
-STR_NETWORK_CONNECTING                                          :{WHITE}Aansluit...
-
-############ Leave those lines in this order!!
-STR_NETWORK_CONNECTING_1                                        :{BLACK}(1/6) Aansluit..
-STR_NETWORK_CONNECTING_2                                        :{BLACK}(2/6) Gemagtiging...
-STR_NETWORK_CONNECTING_3                                        :{BLACK}(3/6) Opwagting...
-STR_NETWORK_CONNECTING_4                                        :{BLACK}(4/6) Kaart aflaai..
-STR_NETWORK_CONNECTING_5                                        :{BLACK}(5/6) Verwerk Data...
-STR_NETWORK_CONNECTING_6                                        :{BLACK}(6/6) Registreer...
-
-STR_NETWORK_CONNECTING_SPECIAL_1                                :{BLACK}Haal spel inligting...
-STR_NETWORK_CONNECTING_SPECIAL_2                                :{BLACK}Haal maatskappy inligting...
-############ End of leave-in-this-order
-STR_NETWORK_CONNECTING_WAITING                                  :{BLACK}{NUM} Klient{P "" e} voor jou
-STR_NETWORK_CONNECTING_DOWNLOADING                              :{BLACK}{NUM} / {NUM} kbytes afgelaai dusver
-
-STR_NETWORK_DISCONNECT                                          :{BLACK}Loskoppel
-
-STR_NETWORK_GIVE_MONEY_CAPTION                                  :{WHITE}Invoeg die bedrag van geld jy wil gee
-STR_NETWORK_NEED_GAME_PASSWORD_CAPTION                          :{WHITE}Bediender is beskerm. Invoeg wagwoord
-STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION                       :{WHITE}Maatskappy is beskerm. Invoeg wagwoord
-STR_NETWORK_CLIENT_LIST                                         :{WHITE}Klient Lys
-
-STR_NETWORK_ERR_NOTAVAILABLE                                    :{WHITE} Geen netwerk ontwerp gevind of voldoen sonder ENABLE_NETWORK
-STR_NETWORK_ERR_NOSERVER                                        :{WHITE} Kan nie enige netwerk spele vind nie
-STR_NETWORK_ERR_NOCONNECTION                                    :{WHITE} Die bedinder het nie die versoek geantwoord nie
-STR_NETWORK_ERR_DESYNC                                          :{WHITE} Netwerk-Spel sinchroniseering gedop
-STR_NETWORK_ERR_LOSTCONNECTION                                  :{WHITE} Netwerk-Spel verbinding verloor
-STR_NETWORK_ERR_SAVEGAMEERROR                                   :{WHITE} Kan nie bewaarespel laai nie
-STR_NETWORK_ERR_SERVER_START                                    :{WHITE} Bediender kan nie aangesit word nie
-STR_NETWORK_ERR_CLIENT_START                                    :{WHITE} Kan nie verbinding kry nie
-STR_NETWORK_ERR_TIMEOUT                                         :{WHITE} Verbinding #{NUM} het betyds uitgeloop
-STR_NETWORK_ERR_SERVER_ERROR                                    :{WHITE} A protokol-fout was gemaak en die verbinding was verlore
-STR_NETWORK_ERR_WRONG_REVISION                                  :{WHITE} Die hersiening van die klient is nie gelyk aan die bediender se hersiening nie
-STR_NETWORK_ERR_WRONG_PASSWORD                                  :{WHITE} Verkeerde wagwoord
-STR_NETWORK_ERR_SERVER_FULL                                     :{WHITE} Die bediender is vol
-STR_NETWORK_ERR_SERVER_BANNED                                   :{WHITE} Jy is van die bediender verban
-STR_NETWORK_ERR_KICKED                                          :{WHITE} Jy is van die spel geskop
-STR_NETWORK_ERR_CHEATER                                         :{WHITE} Bedreiging is nie op die bediender toegelaat
-
-STR_NETWORK_ERR_LEFT                                            :het die spel verlaat
-############ Leave those lines in this order!!
-STR_NETWORK_ERR_CLIENT_GENERAL                                  :algemeen fout
-STR_NETWORK_ERR_CLIENT_DESYNC                                   :desync fout
-STR_NETWORK_ERR_CLIENT_SAVEGAME                                 :kan nie kaart laai nie
-STR_NETWORK_ERR_CLIENT_CONNECTION_LOST                          :verbinding verloor
-STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR                           :protokol fout
-STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED                           :nie gemagtig nie
-STR_NETWORK_ERR_CLIENT_NOT_EXPECTED                             :vreemde pakket aanvaar
-STR_NETWORK_ERR_CLIENT_WRONG_REVISION                           :verkeerde hersiening
-STR_NETWORK_ERR_CLIENT_NAME_IN_USE                              :naam reeds in gebruik
-STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD                           :verkeerde wagwoord
-STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH                          :verkeerde speler-id in DoCommand
-STR_NETWORK_ERR_CLIENT_KICKED                                   :geskop by bediender
-STR_NETWORK_ERR_CLIENT_CHEATER                                  :was op die proef stel om 'n bereig te gebruik
-STR_NETWORK_ERR_CLIENT_SERVER_FULL                              :bediender vol
-############ End of leave-in-this-order
-STR_NETWORK_CLIENT_JOINED                                       :het die spel verbind
-STR_NETWORK_GIVE_MONEY                                          :het vir u maatskappy geld gegee ({CURRENCY})
-STR_NETWORK_GAVE_MONEY_AWAY                                     :u het vir {STRING} geld ({CURRENCY}) gegee
-STR_NETWORK_CHAT_COMPANY_CAPTION                                :[Span] :
-STR_NETWORK_CHAT_COMPANY                                        :[Span] {STRING}:
-STR_NETWORK_CHAT_TO_COMPANY                                     :[Span] Na {STRING}:
-STR_NETWORK_CHAT_CLIENT_CAPTION                                 :[Privaat] :
-STR_NETWORK_CHAT_CLIENT                                         :[Privaat] {STRING}:
-STR_NETWORK_CHAT_TO_CLIENT                                      :[Privaat] Na {STRING}:
-STR_NETWORK_CHAT_ALL_CAPTION                                    :[All] :
-STR_NETWORK_CHAT_ALL                                            :[All] {STRING}:
-STR_NETWORK_NAME_CHANGE                                         :het hy/sy naam verander na
-STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Die bediender het die sessie toegemaak
-STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Die bediender is besig om te weerbegin...{}Wag asb...
-
-STR_NETWORK_SERVER                                              :Bediender
-STR_NETWORK_CLIENT                                              :Klient
-
-STR_NETWORK_CLIENTLIST_NONE                                     :(geen)
-STR_NETWORK_CLIENTLIST_KICK                                     :Skop
-STR_NETWORK_CLIENTLIST_GIVE_MONEY                               :Gee geld
-STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL                             :Praat met almal
-STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY                         :Praat met maatskappy
-STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT                          :Privaate boodskap
-
-
-STR_NETWORK_SEND                                                :{BLACK}Stuur
-
-############ end network gui strings
-
-
-STR_CONFIG_PATCHES_MAP_X                                        :{LTBLUE}X-groote van kaart: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAP_Y                                        :{LTBLUE}Y-groote van kaart: {ORANGE}{STRING}
-
-
-##### PNG-MAP-Loader
-
-
-STR_BMPMAP_ERROR                                                :{WHITE}Kan nie landerye van BMP laai nie...
-STR_BMPMAP_ERR_IMAGE_TYPE                                       :{WHITE}...kan nie prent tipe verdoel nie.
-
-##id 0x0800
-STR_0800_COST                                                   :{TINYFONT}{RED}Koste: {CURRENCY}
-STR_0801_COST                                                   :{RED}Koste: {CURRENCY}
-STR_0802_INCOME                                                 :{TINYFONT}{GREEN}Inkome: {CURRENCY}
-STR_0803_INCOME                                                 :{GREEN}Inkome: {CURRENCY}
-STR_FEEDER_TINY                                                 :{TINYFONT}{YELLOW}Oorplaas: {CURRENCY}
-STR_FEEDER                                                      :{YELLOW}Oorplaas: {CURRENCY}
-STR_0805_ESTIMATED_COST                                         :{WHITE}Geraamde Koste: {CURRENCY}
-STR_0807_ESTIMATED_INCOME                                       :{WHITE}Geraamde Inkome: {CURRENCY}
-STR_0808_CAN_T_RAISE_LAND_HERE                                  :{WHITE}Kan nie land verhoog hier nie...
-STR_0809_CAN_T_LOWER_LAND_HERE                                  :{WHITE}Kan nie land verlaag hier nie...
-STR_080A_ROCKS                                                  :Rotse
-STR_080B_ROUGH_LAND                                             :Ru land
-STR_080C_BARE_LAND                                              :Kaal land
-STR_080D_GRASS                                                  :Gras
-STR_080E_FIELDS                                                 :Velde
-STR_080F_SNOW_COVERED_LAND                                      :Sneeu-bedekte land
-STR_0810_DESERT                                                 :Woestyn
-
-##id 0x1000
-STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION                         :{WHITE}Land skuins in verkeerde rigting
-STR_1001_IMPOSSIBLE_TRACK_COMBINATION                           :{WHITE}Onmoontlike spoor kombinasie
-STR_1002_EXCAVATION_WOULD_DAMAGE                                :{WHITE}Uitgrawing sal tonnel beskadig
-STR_1003_ALREADY_AT_SEA_LEVEL                                   :{WHITE}Reeds op seevlak
-STR_1004_TOO_HIGH                                               :{WHITE}Te hoog
-STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Geen paslik spoorweg spoor
-STR_1007_ALREADY_BUILT                                          :{WHITE}...reeds gebou
-STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Moet eers spoorweg spoor verwyder
-STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Spoorweg Kostruksie
-STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Eenspoor Konstruksie
-STR_100C_MAGLEV_CONSTRUCTION                                    :{WHITE}MagLev Konstruksie
-STR_100D_SELECT_RAIL_BRIDGE                                     :{WHITE}Kies Spoor Brug
-STR_100E_CAN_T_BUILD_TRAIN_DEPOT                                :{WHITE}Kan nie trein depot hier bou nie...
-STR_100F_CAN_T_BUILD_RAILROAD_STATION                           :{WHITE}Kan nie spoorweg stasie hier bou nie...
-STR_1010_CAN_T_BUILD_SIGNALS_HERE                               :{WHITE}Kan nie seine hier bou nie...
-STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Kan nie spoorweg spoor hier bou nie...
-STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Kan nie spoorweg spoor van hier af verwyder nie...
-STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Kan nie seine van hier verwyder nie...
-STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Trein Depot Ori�tering
-STR_1015_RAILROAD_CONSTRUCTION                                  :Spoorweg konstruksie
-STR_1016_MONORAIL_CONSTRUCTION                                  :Eenspoor konstruksie
-STR_1017_MAGLEV_CONSTRUCTION                                    :MagLev konstruksie
-STR_1018_BUILD_RAILROAD_TRACK                                   :{BLACK}Bou spoorweg spoor
-STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING                         :{BLACK}Bou trein depot (vir gebou en diens van treine)
-STR_101A_BUILD_RAILROAD_STATION                                 :{BLACK}Bou spoorweg stasie
-STR_101B_BUILD_RAILROAD_SIGNALS                                 :{BLACK}Bou spoorweg seine
-STR_101C_BUILD_RAILROAD_BRIDGE                                  :{BLACK}Bou spoorweg brug
-STR_101D_BUILD_RAILROAD_TUNNEL                                  :{BLACK}Bou spoorweg tonnel
-STR_101E_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Skakel bou/verwyder vir spoorweg spoor en seine
-STR_101F_BRIDGE_SELECTION_CLICK                                 :{BLACK}Brug keuse - kliek op jou verkiesde brug om dit te bou
-STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO                       :{BLACK}Kies spoorweg depot ori�tering
-STR_1021_RAILROAD_TRACK                                         :Spoorweg spoor
-STR_1023_RAILROAD_TRAIN_DEPOT                                   :Spoorweg trein depot
-STR_1024_AREA_IS_OWNED_BY_ANOTHER                               :{WHITE}...area is besit by 'n ander maatskappy
-
-
-
-##id 0x1800
-STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Moet pad eers verwyder
-STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Pad Konstruksie
-STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Kies Pad Brug
-STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Kan nie pad hier bou nie...
-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 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
-STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
-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                                            :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
-STR_200C_CHANGE_TOWN_NAME                                       :{BLACK}Verander stad naam
-STR_200D_PASSENGERS_LAST_MONTH_MAX                              :{BLACK}Passasiers verlede maand: {ORANGE}{COMMA}{BLACK}  max: {ORANGE}{COMMA}
-STR_200E_MAIL_LAST_MONTH_MAX                                    :{BLACK}Pos verlede maand: {ORANGE}{COMMA}{BLACK}  max: {ORANGE}{COMMA}
-STR_200F_TALL_OFFICE_BLOCK                                      :Lank kantoor blok
-STR_2010_OFFICE_BLOCK                                           :Kantoor blok
-STR_2011_SMALL_BLOCK_OF_FLATS                                   :Klein blok van woonstelle
-STR_2012_CHURCH                                                 :Kerk
-STR_2013_LARGE_OFFICE_BLOCK                                     :Groot kantoor blok
-STR_2014_TOWN_HOUSES                                            :Meenthuise
-STR_2015_HOTEL                                                  :Hotel
-STR_2016_STATUE                                                 :Standbeeld
-STR_2017_FOUNTAIN                                               :Fontein
-STR_2018_PARK                                                   :Park
-STR_2019_OFFICE_BLOCK                                           :Kantoor blok
-STR_201A_SHOPS_AND_OFFICES                                      :Winkels en kantoore
-STR_201B_MODERN_OFFICE_BUILDING                                 :Moderne kantoor gebou
-STR_201C_WAREHOUSE                                              :Pakhuis
-STR_201D_OFFICE_BLOCK                                           :Kantoor blok
-STR_201E_STADIUM                                                :Stadion
-STR_201F_OLD_HOUSES                                             :Ou huise
-STR_2020_LOCAL_AUTHORITY                                        :{BLACK}Plaaslike raad
-STR_2021_SHOW_INFORMATION_ON_LOCAL                              :{BLACK}Wys inlingting oor plaaslike raad
-STR_2022_LOCAL_AUTHORITY                                        :{WHITE}{TOWN} plaaslike raad
-STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}Vervoer maatskappy graderings:
-STR_2024                                                        :{YELLOW}{COMPANY} {COMPANYNUM}: {ORANGE}{STRING}
-STR_2025_SUBSIDIES                                              :{WHITE}Subsidiee
-STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}Subsidiee op aanbod vir diens opneming:
-STR_2027_FROM_TO                                                :{ORANGE}{STRING} van {STRING} tot {STRING}
-STR_2028_BY                                                     :{YELLOW} (voor {DATE_SHORT})
-STR_202A_NONE                                                   :{ORANGE}Geen
-STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}Dienste reeds gesubsidieer:
-STR_202C_FROM_TO                                                :{ORANGE}{STRING} van {STATION} tot {STATION}{YELLOW} ({COMPANY}
-STR_202D_UNTIL                                                  :{YELLOW}, tot {DATE_SHORT})
-STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Aanbod van subsidie verval:{}{}{STRING} van {STRING} tot {STRING} sal nou nie 'n subsidie aantrek nie.
-STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}Subsidie terugtrek:{}{}{STRING} diens van {STATION} tot {STATION} is nie meer gesubsideieer nie.
-STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Diens subsidie aanbod:{}{}Eerste {STRING} diens van {STRING} tot {STRING} sal 'n jaar se subsidie van die plaaslike raad kry!
-STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Diens subsidie toeken aan {COMPANY}!{}{}{STRING} Diens van {STATION} tot {STATION} sal nou 50% extra vir die volgende jaar betaal!
-STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Diens subsidie toeken aan {COMPANY}!{}{}{STRING} diens van {STATION} tot {STATION} sal nou dubbel pryse vir die volgende jaar betaal!
-STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Diens subsidie toeken aan {COMPANY}!{}{}{STRING} diens van {STATION} tot {STATION} sal nou driemaal pryse vir die volgende jaar betaal!
-STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Diens subsidie toeken aan {COMPANY}!{}{}{STRING} diens van {STATION} tot {STATION} sal nou viervoud pryse vir die volgende jaar betaal!
-STR_2035_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN} plaaslike raad weier om nog 'n lughawe in die stad gebou te laat word
-STR_2036_COTTAGES                                               :Kothuise
-STR_2037_HOUSES                                                 :Huise
-STR_2038_FLATS                                                  :Woonstelle
-STR_2039_TALL_OFFICE_BLOCK                                      :Lank kantoor blok
-STR_203A_SHOPS_AND_OFFICES                                      :Winkels en kantoore
-STR_203B_SHOPS_AND_OFFICES                                      :Winkels en kantoore
-STR_203C_THEATER                                                :Teatre
-STR_203D_STADIUM                                                :Stadion
-STR_203E_OFFICES                                                :Kantoore
-STR_203F_HOUSES                                                 :Huise
-STR_2040_CINEMA                                                 :Kinema
-STR_2041_SHOPPING_MALL                                          :Inkoopies winkelplein
-STR_2042_DO_IT                                                  :{BLACK}Doen dit
-STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}Lys van dinge te doen by die stad - kliek op item vir meer besonderheide
-STR_2044_CARRY_OUT_THE_HIGHLIGHTED                              :{BLACK}Voeg die beklemtoonde aksie in die lys bo uit
-STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}Aksies beskikbaar:
-STR_2046_SMALL_ADVERTISING_CAMPAIGN                             :Klein adverteer kampeer
-STR_2047_MEDIUM_ADVERTISING_CAMPAIGN                            :Medium adverteer kampeer
-STR_2048_LARGE_ADVERTISING_CAMPAIGN                             :Groot adverteer kampeer
-STR_2049_FUND_LOCAL_ROAD_RECONSTRUCTION                         :Befonds plaaslike pad heropbou
-STR_204A_BUILD_STATUE_OF_COMPANY                                :Bou standbeeld van maatskappy eienaar
-STR_204B_FUND_NEW_BUILDINGS                                     :Befonds nuwe geboue
-STR_204C_BUY_EXCLUSIVE_TRANSPORT                                :Koop eksklusief vervoer regte
-STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inlei 'n klein plaaslike adverteer kampeer, om meer passasiers en vrag na jou vervoer dienste te aantrek.{}  Prys: {CURRENCY}
-STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} Inlei 'n medium plaaslike adverteer kampeer, om meer passasiers en vrag na jou vervoer dienste te aantrek.{}  Prys: {CURRENCY}
-STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inlei 'n groot plaaslike adverteer kampeer, om meer passasiers en vrag na jou vervoer dienste te aantrek.{}  Prys: {CURRENCY}
-STR_2050_FUND_THE_RECONSTRUCTION                                :{WHITE}{STRING}{}{YELLOW} Befonds die heropbou van die stedelike pad netwerk. Veroorsaak aanmerklike ontwrigging na pad verkeer vir omtrent 6 maande.{}  Prys: {CURRENCY}
-STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} Bou 'n standbeeld in eer van u maatskappy.{} Prys: {CURRENCY}
-STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} Befonds die bou van nuwe kommersieel geboue in die stad.{}  Prys: {CURRENCY}
-STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} Koop 1 jaar se ekslusief vervoer regte in stad. Stad raad sal passasiers en vrag slegs toelaat om jou maatskappy se stasies te gebruik.{} Prys: {CURRENCY}
-STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}Verkeer warboel in {TOWN}!{}{}Pad heropbou program befonds by {COMPANY} bring 6 maande van narigheid na motoriste!
-STR_2056                                                        :{TINYFONT}{WHITE}{TOWN}
-STR_2057                                                        :{ORANGE}{TOWN}{BLACK} ({COMMA})
-STR_2058_UNDER_CONSTRUCTION                                     :{STRING} (onder opbou)
-STR_2059_IGLOO                                                  :Igloo
-STR_205A_TEPEES                                                 :Tepees
-STR_205B_TEAPOT_HOUSE                                           :Teepot-Huis
-STR_205C_PIGGY_BANK                                             :Varkie-Bank
-
-STR_INDUSTRY                                                    :{INDUSTRY}
-STR_INDUSTRY_FORMAT                                             :{TOWN} {STRING}
-
-##id 0x2800
-STR_LANDSCAPING                                                 :Landargitekteur
-STR_2800_PLANT_TREES                                            :Boome beplant
-STR_2801_PLACE_SIGN                                             :Plaas teken
-STR_2802_TREES                                                  :{WHITE}Boome
-STR_2803_TREE_ALREADY_HERE                                      :{WHITE}...boom reeds daar
-STR_2804_SITE_UNSUITABLE                                        :{WHITE}...plek ongeskik
-STR_2805_CAN_T_PLANT_TREE_HERE                                  :{WHITE}Kan nie boom hier beplant nie...
-STR_2806                                                        :{WHITE}{SIGN}
-STR_2808_TOO_MANY_SIGNS                                         :{WHITE}...te veel tekens
-STR_2809_CAN_T_PLACE_SIGN_HERE                                  :{WHITE}Kan nie teken hier plaas nie...
-STR_280A_SIGN                                                   :Teken
-STR_280B_EDIT_SIGN_TEXT                                         :{WHITE}Verander teken teks
-STR_280C_CAN_T_CHANGE_SIGN_NAME                                 :{WHITE}Teken naam kan nie verander word nie...
-STR_280D_SELECT_TREE_TYPE_TO_PLANT                              :{BLACK}Kies boom tipe om te beplant
-STR_280E_TREES                                                  :Boome
-STR_280F_RAINFOREST                                             :Reenwoud
-STR_2810_CACTUS_PLANTS                                          :Kaktus Plante
-
-##id 0x3000
-STR_3000_RAIL_STATION_SELECTION                                 :{WHITE}Spoor Stasie Keuse
-STR_3001_AIRPORT_SELECTION                                      :{WHITE}Lughawe Keuse
-STR_3002_ORIENTATION                                            :{BLACK}Ori�tering
-STR_3003_NUMBER_OF_TRACKS                                       :{BLACK}Nommer van spoore
-STR_3004_PLATFORM_LENGTH                                        :{BLACK}Verhoog lengte
-STR_3005_TOO_CLOSE_TO_ANOTHER_RAILROAD                          :{WHITE}Te naby aan 'n ander spoorweg stasie
-STR_3006_ADJOINS_MORE_THAN_ONE_EXISTING                         :{WHITE}Grens aan meer as een bestaande stasie/laai area
-STR_3007_TOO_MANY_STATIONS_LOADING                              :{WHITE}Te veel stasies/laai areas in die stad
-STR_3008_TOO_MANY_STATIONS_LOADING                              :{WHITE}Te veel stasies/laai areas
-STR_3008A_TOO_MANY_BUS_STOPS                                    :{WHITE}Te veel bushalte
-STR_3008B_TOO_MANY_TRUCK_STOPS                                  :{WHITE}Te veel vraagmotor stasies
-STR_3009_TOO_CLOSE_TO_ANOTHER_STATION                           :{WHITE}Te naby aan 'n ander stasie/laai area
-STR_300A_0                                                      :{WHITE}{STATION} {STATIONFEATURES}
-STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Moet eers spoorweg stasie afbreek
-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                                 :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
-
-############ range for rating starts
-STR_3035_APPALLING                                              :Onsettend
-STR_3036_VERY_POOR                                              :Baie Arm
-STR_3037_POOR                                                   :Arm
-STR_3038_MEDIOCRE                                               :Middelmagtig
-STR_3039_GOOD                                                   :Goed
-STR_303A_VERY_GOOD                                              :Baie Goed
-STR_303B_EXCELLENT                                              :Uitsteekent
-STR_303C_OUTSTANDING                                            :Treffend
-############ range for rating ends
-
-STR_303D                                                        :{WHITE}{STRING}: {YELLOW}{STRING} ({COMMA}%)
-STR_303E_NO_LONGER_ACCEPTS                                      :{WHITE}{STATION} aanvaar nie meer {STRING} nie
-STR_303F_NO_LONGER_ACCEPTS_OR                                   :{WHITE}{STATION} aanvaar nie meer {STRING} of {STRING} nie
-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�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 -
-STR_304B_SITE_UNSUITABLE                                        :{WHITE}...plek ongeskik
-STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK                              :{WHITE}Te naby aan 'n ander werf
-STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Moet eers werf afbreek
-STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Kies spoorweg stasie ori�tering
-STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Kies nommer van verhoogte vir spoorweg stasie
-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
-STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO                            :{BLACK}Wys lys van aanvaarde vrag
-STR_3057_STATION_NAMES_CLICK_ON                                 :{BLACK}Stasie naame - Kliek naam om skerm op stasie te senter
-STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT                            :{BLACK}Kies groote/tipe van lughawe
-STR_305C_0                                                      :{STATION} {STATIONFEATURES}
-STR_305E_RAILROAD_STATION                                       :Spoorweg stasie
-STR_305F_AIRCRAFT_HANGAR                                        :Vliegtuig hangar
-STR_3060_AIRPORT                                                :Lughawe
-STR_3061_TRUCK_LOADING_AREA                                     :Vraagmotor laai area
-STR_3062_BUS_STATION                                            :Bus stasie
-STR_3063_SHIP_DOCK                                              :Skip werf
-STR_3064_HIGHLIGHT_COVERAGE_AREA                                :{BLACK}Beklemtoon dekkingsarea van die voorgestelde bouterrein
-STR_3065_DON_T_HIGHLIGHT_COVERAGE                               :{BLACK}Moenie die dekkingsarea van die voorgestelde bouterrein beklemtoon nie
-STR_3066_COVERAGE_AREA_HIGHLIGHT                                :{BLACK}Dekkingsarea beklemtoon
-STR_3068_DOCK                                                   :{WHITE}Werf
-STR_3069_BUOY                                                   :Baken
-STR_306A_BUOY_IN_THE_WAY                                        :{WHITE}...baken in die pad
-STR_306C_STATION_TOO_SPREAD_OUT                                 :{WHITE}...Stasie te ver van mekaar af
-STR_306D_NONUNIFORM_STATIONS_DISALLOWED                         :{WHITE}...ongelyk stasies is gestrem
-
-
-##id 0x3800
-STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Skip Depot Ori�tering
-STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...moet op water gebou word
-STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Skip depot kan nie hier gebou word nie...
-STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Kies skip depot ori�tering
-STR_3804_WATER                                                  :Water
-STR_3805_COAST_OR_RIVERBANK                                     :Strand of oewer
-STR_3806_SHIP_DEPOT                                             :Skip depot
-STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...Kan nie op water bou nie
-
-##id 0x4000
-STR_4000_SAVE_GAME                                              :{WHITE}Bewar Spel
-STR_4001_LOAD_GAME                                              :{WHITE}Laai Spel
-STR_4002_SAVE                                                   :{BLACK}Bewaar
-STR_4003_DELETE                                                 :{BLACK}Uitwis
-STR_4004                                                        :{COMPANY}, {DATE_LONG}
-STR_4005_BYTES_FREE                                             :{BLACK}{COMMA} megabyte{P "" s} vry
-STR_4006_UNABLE_TO_READ_DRIVE                                   :{BLACK}Kan nie skyf lees nie
-STR_4007_GAME_SAVE_FAILED                                       :{WHITE}Spel Bewaar Gedop{}{STRING}
-STR_4008_UNABLE_TO_DELETE_FILE                                  :{WHITE}Kan nie l�r uitwis nie
-STR_4009_GAME_LOAD_FAILED                                       :{WHITE}Spel Laai Gedop{}{STRING}
-STR_400A_LIST_OF_DRIVES_DIRECTORIES                             :{BLACK}Lys van skywe, voublaaie en spel-bewaar l�rs
-STR_400B_CURRENTLY_SELECTED_NAME                                :{BLACK}Huidige naam vir bewaarde-spel
-STR_400C_DELETE_THE_CURRENTLY_SELECTED                          :{BLACK}Uitwis die verkieste bewaarde-spel
-STR_400D_SAVE_THE_CURRENT_GAME_USING                            :{BLACK}Bewaar die huidige spel, met die verkieste naame
-STR_400E_SELECT_NEW_GAME_TYPE                                   :{WHITE}Kies Nuwe Spel Tipe
-STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Kies draaiboek (groen), voor-gestelde spel (blou), of lukraak nuwe spel
-STR_4010_GENERATE_RANDOM_NEW_GAME                               :Onwikkel lukraak nuwe spel
-STR_4011_LOAD_HEIGHTMAP                                         :{WHITE}Laai Hoogtekaart
-
-##id 0x4800
-STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} in die pad
-STR_4801                                                        :{WHITE}{INDUSTRY}
-STR_4802_COAL_MINE                                              :Steenkool Myn
-STR_4803_POWER_STATION                                          :Krag Stasie
-STR_4804_SAWMILL                                                :Saagmeul
-STR_4805_FOREST                                                 :Woud
-STR_4806_OIL_REFINERY                                           :Olie Raffineerdery
-STR_4807_OIL_RIG                                                :Olieboor
-STR_4808_FACTORY                                                :Fabriek
-STR_4809_PRINTING_WORKS                                         :Drukwerke
-STR_480A_STEEL_MILL                                             :Staalmeul
-STR_480B_FARM                                                   :Boerdery
-STR_480C_COPPER_ORE_MINE                                        :Koper Erts Myn
-STR_480D_OIL_WELLS                                              :Olie Bron
-STR_480E_BANK                                                   :Bank
-STR_480F_FOOD_PROCESSING_PLANT                                  :Kos Verwerkings Fabriek
-STR_4810_PAPER_MILL                                             :Papiermeul
-STR_4811_GOLD_MINE                                              :Goud Myn
-STR_4812_BANK                                                   :Bank
-STR_4813_DIAMOND_MINE                                           :Diamant Myn
-STR_4814_IRON_ORE_MINE                                          :Yster Erts Myn
-STR_4815_FRUIT_PLANTATION                                       :Vrugte Plantasie
-STR_4816_RUBBER_PLANTATION                                      :Gomlastiek Plantasie
-STR_4817_WATER_SUPPLY                                           :Water Lewering
-STR_4818_WATER_TOWER                                            :Water Toring
-STR_4819_FACTORY                                                :Fabriek
-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 Boerdery
-STR_481F_COLA_WELLS                                             :Cola Bron
-STR_4820_TOY_SHOP                                               :Speelgoed Winkel
-STR_4821_TOY_FACTORY                                            :Speelgoed Fabriek
-STR_4822_PLASTIC_FOUNTAINS                                      :Plastiek Fonteine
-STR_4823_FIZZY_DRINK_FACTORY                                    :Koeldrank Fabriek
-STR_4824_BUBBLE_GENERATOR                                       :Borrel Ontwikkelaar
-STR_4825_TOFFEE_QUARRY                                          :Tamletjie Prooi
-STR_4826_SUGAR_MINE                                             :Suiker Myn
-
-############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}, {STRING}
-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
-STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nuwe {STRING} onder opbou naby {TOWN}!
-STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nuwe {STRING} word naby {TOWN} beplant!
-STR_482F_COST                                                   :{BLACK}Koste: {YELLOW}{CURRENCY}
-STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Nywerheid tipe kan nie hier gebou word nie...
-STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...woud kan net bo sneeu-lyn beplant word
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} aankondig dreigend sluiting!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Lewering probleme veroorsaak {INDUSTRY} om dreigend sluting te aankondig!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Gemis van naby boome veroorsaak {INDUSTRY} om dreigend sluiting te aankondig!
-STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} vermeerder produksie!
-STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nuwe steenkool laag gevind by {INDUSTRY}!{}Produksie is verwag om te verdubbel!
-STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nuwe olie reserwes gevind by {INDUSTRY}!{}Produksie is verwag om te verdubbel!
-STR_4838_IMPROVED_FARMING_METHODS                               :{BLACK}{BIGFONT}Verbeterde boerdery metodes by {INDUSTRY} sal produksie verdubbel!
-STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}{INDUSTRY} produksie verminder 50%
-STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}Insek vervuiling oorsaak verwoesting by {INDUSTRY}!{}Produksie verminder 50%
-STR_483B_CAN_ONLY_BE_POSITIONED                                 :{WHITE}...kan net naby aan kant van kaart geplaas word
-STR_INDUSTRY_PROD_GOUP                                          :{BLACK}{BIGFONT}{STRING} produksie by {INDUSTRY} vermeerder {COMMA}%!
-STR_INDUSTRY_PROD_GODOWN                                        :{BLACK}{BIGFONT}{STRING} produksie by {INDUSTRY} verminder {COMMA}%!
-
-##id 0x5000
-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}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_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}
-STR_500E_SUSPENSION_STEEL                                       :Staking, Staal
-STR_500F_GIRDER_STEEL                                           :Staaf, Staal
-STR_5010_CANTILEVER_STEEL                                       :Vrydraer, Staal
-STR_5011_SUSPENSION_CONCRETE                                    :Staking, Beton
-STR_5012_WOODEN                                                 :Houterig
-STR_5013_CONCRETE                                               :Beton
-STR_5014_TUBULAR_STEEL                                          : Buis, Staal
-STR_BRIDGE_TUBULAR_SILICON                                      :Buis, Silicon
-STR_5015_CAN_T_BUILD_BRIDGE_HERE                                :{WHITE}Brug kan nie daar gebou word nie...
-STR_5016_CAN_T_BUILD_TUNNEL_HERE                                :{WHITE}Tonnel kan nie daar gebou word nie...
-STR_5017_RAILROAD_TUNNEL                                        :Spoorweg tonnel
-STR_5018_ROAD_TUNNEL                                            :Pad tonnel
-STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE                           :Staal staking spoor brug
-STR_501C_STEEL_GIRDER_RAIL_BRIDGE                               :Staal staaf spoor brug
-STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE                           :Staal vrydraer spoor brug
-STR_501E_REINFORCED_CONCRETE_SUSPENSION                         :Gewapende beton staking spoor brug
-STR_501F_WOODEN_RAIL_BRIDGE                                     :Houterig spoor brug
-STR_5020_CONCRETE_RAIL_BRIDGE                                   :Beton spoor brug
-STR_5021_STEEL_SUSPENSION_ROAD_BRIDGE                           :Staal staking pad brug
-STR_5022_STEEL_GIRDER_ROAD_BRIDGE                               :Staal staaf pad brug
-STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE                           :Staal vrydraer pad brug
-STR_5024_REINFORCED_CONCRETE_SUSPENSION                         :Gewapende beton staking pad brug
-STR_5025_WOODEN_ROAD_BRIDGE                                     :Houterig pad brug
-STR_5026_CONCRETE_ROAD_BRIDGE                                   :Beton pad brug
-STR_5027_TUBULAR_RAIL_BRIDGE                                    :Buis spoor brug
-STR_5028_TUBULAR_ROAD_BRIDGE                                    :Buis pad brug
-
-##id 0x5800
-STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}Voorwerp in die pad
-STR_5801_TRANSMITTER                                            :Sender
-STR_5802_LIGHTHOUSE                                             :Vuurtoring
-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}Die land area kan nie aangekoop word nie...
-STR_5807_YOU_ALREADY_OWN_IT                                     :{WHITE}...jy besit dit alreeds!
-
-
-############ WARNING, using range 0x6000 for strings that are stored in the savegame
-############ These strings may never get a new id, or savegames will break!
-##id 0x6000
-
-STR_SV_STNAME_CENTRAL                                           :{STRING} Sentraal
-STR_SV_STNAME_TRANSFER                                          :{STRING} Verplaas
-STR_SV_STNAME_HALT                                              :{STRING} Halte
-STR_SV_STNAME_VALLEY                                            :{STRING} Vallei
-STR_SV_STNAME_HEIGHTS                                           :{STRING} Hoogtes
-STR_SV_STNAME_WOODS                                             :{STRING} Woude
-STR_SV_STNAME_LAKESIDE                                          :{STRING} Meerkant
-STR_SV_STNAME_EXCHANGE                                          :{STRING} Wissel
-STR_SV_STNAME_AIRPORT                                           :{STRING} Lughawe
-STR_SV_STNAME_OILFIELD                                          :{STRING} Olieveld
-STR_SV_STNAME_MINES                                             :{STRING} Myne
-STR_SV_STNAME_DOCKS                                             :{STRING} Werfe
-STR_SV_STNAME_BUOY_1                                            :{STRING} Baken 1
-STR_SV_STNAME_BUOY_2                                            :{STRING} Baken 2
-STR_SV_STNAME_BUOY_3                                            :{STRING} Baken 3
-STR_SV_STNAME_BUOY_4                                            :{STRING} Baken 4
-STR_SV_STNAME_BUOY_5                                            :{STRING} Baken 5
-STR_SV_STNAME_BUOY_6                                            :{STRING} Baken 6
-STR_SV_STNAME_BUOY_7                                            :{STRING} Baken 7
-STR_SV_STNAME_BUOY_8                                            :{STRING} Baken 8
-STR_SV_STNAME_BUOY_9                                            :{STRING} Baken 9
-STR_SV_STNAME_ANNEXE                                            :{STRING} Anneks
-STR_SV_STNAME_SIDINGS                                           :{STRING} Wisselspoore
-STR_SV_STNAME_BRANCH                                            :{STRING} Tak
-STR_SV_STNAME_UPPER                                             :Bo {STRING}
-STR_SV_STNAME_LOWER                                             :Laer {STRING}
-STR_SV_STNAME_HELIPORT                                          :{STRING} Helihawe
-STR_SV_STNAME_FOREST                                            :{STRING} Woud
-
-############ end of savegame specific region!
-
-##id 0x6800
-STR_6800_DIFFICULTY_LEVEL                                       :{WHITE}Moeilikheid Vlak
-STR_OPTIONS_SAVE_CHANGES                                        :{BLACK}Bewaar
-
-############ range for difficulty levels starts
-STR_6801_EASY                                                   :{BLACK}Maklik
-STR_6802_MEDIUM                                                 :{BLACK}Gemiddel
-STR_6803_HARD                                                   :{BLACK}Streng
-STR_6804_CUSTOM                                                 :{BLACK}Gewoonte
-############ range for difficulty levels ends
-
-############ range for difficulty settings starts
-STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Maksimum no. mededingers: {ORANGE}{COMMA}
-STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}Mededinger begin tyd: {ORANGE}{STRING}
-STR_6807_NO_OF_TOWNS                                            :{LTBLUE}No. van stede: {ORANGE}{STRING}
-STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}No. van nywerheide: {ORANGE}{STRING}
-STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}Maksimum inisieele lening: {ORANGE}{CURRENCY}
-STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}Inisieele rente koers: {ORANGE}{COMMA}%
-STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Voertuig loopkoste: {ORANGE}{STRING}
-STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}Konstruksie spoed van mededinge: {ORANGE}{STRING}
-STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}Intelligensie van mededinge: {ORANGE}{STRING}
-STR_680E_VEHICLE_BREAKDOWNS                                     :{LTBLUE}Voertuig oponthoude: {ORANGE}{STRING}
-STR_680F_SUBSIDY_MULTIPLIER                                     :{LTBLUE}Subsidie vermenigvuld: {ORANGE}{STRING}
-STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}koste van konstruksie: {ORANGE}{STRING}
-STR_6811_TERRAIN_TYPE                                           :{LTBLUE}Landerye tipe: {ORANGE}{STRING}
-STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}Hoeveelheid see/panne: {ORANGE}{STRING}
-STR_6813_ECONOMY                                                :{LTBLUE}Ekonomie: {ORANGE}{STRING}
-STR_6814_TRAIN_REVERSING                                        :{LTBLUE}Trein omkeer: {ORANGE}{STRING}
-STR_6815_DISASTERS                                              :{LTBLUE}Rampe: {ORANGE}{STRING}
-STR_16816_CITY_APPROVAL                                         :{LTBLUE}Stad raad se houding na area herstruktuuring: {ORANGE}{STRING}
-############ range for difficulty settings ends
-
-STR_26816_NONE                                                  :Geen
-STR_6816_LOW                                                    :Laag
-STR_6817_NORMAL                                                 :Normaal
-STR_6818_HIGH                                                   :Hoog
-STR_6819                                                        :{BLACK}{SMALLLEFTARROW}
-STR_681A                                                        :{BLACK}{SMALLRIGHTARROW}
-STR_681B_VERY_SLOW                                              :Baie Stadig
-STR_681C_SLOW                                                   :Stadig
-STR_681D_MEDIUM                                                 :Gemiddel
-STR_681E_FAST                                                   :Vinnig
-STR_681F_VERY_FAST                                              :Baie Vinnig
-STR_VERY_LOW                                                    :Baie Laag
-STR_6820_LOW                                                    :Laag
-STR_6821_MEDIUM                                                 :Gemiddel
-STR_6822_HIGH                                                   :Hoog
-STR_6823_NONE                                                   :Geen
-STR_6824_REDUCED                                                :Verminder
-STR_6825_NORMAL                                                 :Normaal
-STR_6826_X1_5                                                   :x1.5
-STR_6827_X2                                                     :x2
-STR_6828_X3                                                     :x3
-STR_6829_X4                                                     :x4
-STR_682A_VERY_FLAT                                              :Baie Plat
-STR_682B_FLAT                                                   :Plat
-STR_682C_HILLY                                                  :Koppierig
-STR_682D_MOUNTAINOUS                                            :Bergagtig
-STR_682E_STEADY                                                 :Gereeld
-STR_682F_FLUCTUATING                                            :Skommelende
-STR_6830_IMMEDIATE                                              :Onmiddelik
-STR_6831_3_MONTHS_AFTER_PLAYER                                  :3 maande na speler
-STR_6832_6_MONTHS_AFTER_PLAYER                                  :6 maande na speler
-STR_6833_9_MONTHS_AFTER_PLAYER                                  :9 maande na speler
-STR_6834_AT_END_OF_LINE_AND_AT_STATIONS                         :Op die einde van die lyn, en by stasies
-STR_6835_AT_END_OF_LINE_ONLY                                    :Slegs op die ende van die lyn
-STR_6836_OFF                                                    :Af
-STR_6837_ON                                                     :Aan
-STR_6838_SHOW_HI_SCORE_CHART                                    :{BLACK}Wys ho�telling tabel
-STR_6839_PERMISSIVE                                             :Permissief
-STR_683A_TOLERANT                                               :Toelaatbaar
-STR_683B_HOSTILE                                                :Vyandelik
-
-##id 0x7000
-STR_7000                                                        :
-STR_7001                                                        :{WHITE}{COMPANY} {BLACK}{COMPANYNUM}
-STR_7002_PLAYER                                                 :(Speler {COMMA})
-STR_7004_NEW_FACE                                               :{BLACK}Nuwe Gesig
-STR_7005_COLOR_SCHEME                                           :{BLACK}Kleur Skema
-STR_7006_COLOR_SCHEME                                           :{GOLD}Kleur Skema
-STR_7007_NEW_COLOR_SCHEME                                       :{WHITE}Nuwe Kleur Skema
-STR_7008_COMPANY_NAME                                           :{BLACK}Maatskappy Naam
-STR_7009_PRESIDENT_NAME                                         :{BLACK}Bestuurder Naam
-STR_700A_COMPANY_NAME                                           :Maatskappy Naam
-STR_700B_PRESIDENT_S_NAME                                       :Bestuurder se Naam
-STR_700C_CAN_T_CHANGE_COMPANY_NAME                              :{WHITE}Maatskappy naam kan nie verander word nie...
-STR_700D_CAN_T_CHANGE_PRESIDENT                                 :{WHITE}Bestuurder se naam kan nie verander word nie...
-STR_700E_FINANCES                                               :{WHITE}{COMPANY} Finansies {BLACK}{COMPANYNUM}
-STR_700F_EXPENDITURE_INCOME                                     :{WHITE}Onkoste/Inkome
-STR_7010                                                        :{WHITE}{NUM}
-STR_7011_CONSTRUCTION                                           :{GOLD}Konstruksie
-STR_7012_NEW_VEHICLES                                           :{GOLD}Nuwe Voertuie
-STR_7013_TRAIN_RUNNING_COSTS                                    :{GOLD}Trein Loopkoste
-STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Pad Voertuig Loopkoste
-STR_7015_AIRCRAFT_RUNNING_COSTS                                 :{GOLD}Vliegtuig Loopkoste
-STR_7016_SHIP_RUNNING_COSTS                                     :{GOLD}Skip loopkoste
-STR_7017_PROPERTY_MAINTENANCE                                   :{GOLD}Eiendom Onderhoud
-STR_7018_TRAIN_INCOME                                           :{GOLD}Trein Inkome
-STR_7019_ROAD_VEHICLES_INCOME                                   :{GOLD}Pad Voertuig Inkome
-STR_701A_AIRCRAFT_INCOME                                        :{GOLD}Vliegtuig Inkome
-STR_701B_SHIP_INCOME                                            :{GOLD}Skip Inkome
-STR_701C_LOAN_INTEREST                                          :{GOLD}Lening Rente
-STR_701D_OTHER                                                  :{GOLD}Ander
-STR_701E                                                        :{BLACK}-{CURRENCY}
-STR_701F                                                        :{BLACK}+{CURRENCY}
-STR_7020_TOTAL                                                  :{WHITE}Totaal:
-STR_7021                                                        :{COMPANY} {COMPANYNUM}
-STR_7022_INCOME_GRAPH                                           :{WHITE}Inkome Grafiek
-STR_CURRCOMPACT                                                 :{CURRCOMPACT}
-STR_7024                                                        :{COMMA}
-STR_7025_OPERATING_PROFIT_GRAPH                                 :{WHITE}Bewerking Profyt Grafiek
-STR_7026_BANK_BALANCE                                           :{WHITE}Bank Balans
-STR_7027_LOAN                                                   :{WHITE}Lening
-STR_MAX_LOAN                                                    :{WHITE}Max Lening:  {BLACK}{CURRENCY}
-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 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 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...
-STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Kies nuwe gesig vir bestuurder
-STR_7031_CHANGE_THE_COMPANY_VEHICLE                             :{BLACK}Verander die maatskappy voertuig lewery
-STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Verander bestuurder se naam
-STR_7033_CHANGE_THE_COMPANY_NAME                                :{BLACK}Verander die maatskappy se naam
-STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Kliek op verkieste kleur skema
-STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Vermeer groote van lening
-STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Terugbetaal deel van lening
-STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Bestuurder)
-STR_7038_INAUGURATED                                            :{GOLD}Bevestig: {WHITE}{NUM}
-STR_7039_VEHICLES                                               :{GOLD}Voertuie
-STR_TRAINS                                                      :{WHITE}{COMMA} trein{P "" e}
-STR_ROAD_VEHICLES                                               :{WHITE}{COMMA} pad voertui{P g e}
-STR_AIRCRAFT                                                    :{WHITE}{COMMA} vliegtuig
-STR_SHIPS                                                       :{WHITE}{COMMA} sk{P ip epe}
-STR_7042_NONE                                                   :{WHITE}Geen
-STR_7043_FACE_SELECTION                                         :{WHITE}Gesig Keuse
-STR_7044_MALE                                                   :{BLACK}Manlik
-STR_7045_FEMALE                                                 :{BLACK}Vroulik
-STR_7046_NEW_FACE                                               :{BLACK}Nuwe Gesig
-STR_7047_CANCEL_NEW_FACE_SELECTION                              :{BLACK}Kanselleer nuwe gesig keuse
-STR_7048_ACCEPT_NEW_FACE_SELECTION                              :{BLACK}Aanvar nuwe gesig keuse
-STR_7049_SELECT_MALE_FACES                                      :{BLACK}Kies manlik gesige
-STR_704A_SELECT_FEMALE_FACES                                    :{BLACK}Kies vroulik gesige
-STR_704B_GENERATE_RANDOM_NEW_FACE                               :{BLACK}Ontwikkel lukrake nuwe gesig
-STR_704C_KEY                                                    :{BLACK}Sleutel
-STR_704D_SHOW_KEY_TO_GRAPHS                                     :{BLACK}Wys sleutel na grafieke
-STR_704E_KEY_TO_COMPANY_GRAPHS                                  :{WHITE}Sleutel na maatskappy grafieke
-STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY                           :{BLACK}Kliek hier om maatskappy se intrede op grafiek aan/af te skakel
-STR_7050_UNITS_OF_CARGO_DELIVERED                               :{WHITE}Eenheide van vrag afgelewer
-STR_7051_COMPANY_PERFORMANCE_RATINGS                            :{WHITE}Maatskappy prestasie graderings (maksimum gradering=1000)
-STR_7052_COMPANY_VALUES                                         :{WHITE}Maatskappy waarde
-STR_7053_COMPANY_LEAGUE_TABLE                                   :{WHITE}Maatskappy Liga Tabel
-STR_7054                                                        :{WHITE}{STRING}{SETX 45}{ORANGE}{COMPANY} {BLACK}{COMPANYNUM} '{STRING}'
-STR_7055                                                        :{YELLOW}{STRING}{SETX 45}{ORANGE}{COMPANY} {BLACK}{COMPANYNUM}  '{STRING}'
-STR_7056_TRANSPORT_COMPANY_IN_TROUBLE                           :{BLACK}{BIGFONT}Vervoer maatsappy in moelikheid!
-STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT}{COMPANY} sal binnekort afverkoop of bankrospeler verklaar word tensy prestasie verbeter!
-STR_7058_PRESIDENT                                              :{BLACK}{PLAYERNAME}{}(Bestuurder)
-STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Vervoer maatskappy samesmelting!
-STR_705A_HAS_BEEN_SOLD_TO_FOR                                   :{BLACK}{BIGFONT}{COMPANY} is na {COMPANY} vir  {CURRENCY} verkoop!
-STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT                         :{WHITE}Ons is opsoek na 'n vervoer maatskappy wat ons se maatskappy sal oorvat.{}{}Wil jy {COMPANY} koop vir {CURRENCY}?
-STR_705C_BANKRUPT                                               :{BLACK}{BIGFONT}Bankrotspeler!
-STR_705D_HAS_BEEN_CLOSED_DOWN_BY                                :{BLACK}{BIGFONT}{COMPANY} is deur skuldeisers toegemaak en alle bates is afverkoop!
-STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED                         :{BLACK}{BIGFONT}Nuwe vervoer maatskappy geloods!
-STR_705F_STARTS_CONSTRUCTION_NEAR                               :{BLACK}{BIGFONT}{COMPANY} begin konstruksie naby {TOWN}!
-STR_7060_CAN_T_BUY_COMPANY                                      :{WHITE}Maatskappy kan nie aangekoop word nie...
-STR_7061_CARGO_PAYMENT_RATES                                    :{WHITE}Vrag Betaalings Grade
-STR_7062_DAYS_IN_TRANSIT                                        :{BLACK}{TINYFONT}Dae in deurtog
-STR_7063_PAYMENT_FOR_DELIVERING                                 :{BLACK}{TINYFONT}Betaaling vir aflewering van 10 eenhuide (of 10,000 liters) van vrag 'n afstand van 20 blokkies
-STR_7064_TOGGLE_GRAPH_FOR_CARGO                                 :{BLACK}Skakel grafiek vir vrag tipe aan/af
-STR_7065                                                        :{BLACK}{TINYFONT}{STRING}
-STR_7066_ENGINEER                                               :Ingenieur
-STR_7067_TRAFFIC_MANAGER                                        :Verkeer Bestuurder
-STR_7068_TRANSPORT_COORDINATOR                                  :Vervoer Ko�eerder
-STR_7069_ROUTE_SUPERVISOR                                       :Roete Opsiener
-STR_706A_DIRECTOR                                               :Direkteur
-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
-STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Maatskappy hoofkwartiers kan nie hier gebou word nie...
-STR_7072_VIEW_HQ                                                :{BLACK}Wys HK
-STR_RELOCATE_HQ                                                 :{BLACK}Beweeg HQ
-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 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}
-STR_7077_BUY_25_SHARE_IN_COMPANY                                :{BLACK}Koop 25% aandeel in maatskappy
-STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}Verkoop 25% aandeel in maatskappy
-STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}Koop 25% aandeel in die maatskappy
-STR_707A_SELL_25_SHARE_IN_THIS_COMPANY                          :{BLACK}Verkoop 25% aandeel in die maatskappy
-STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Kan nie 25% aandeel in die maatskappy koop nie...
-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_7080_PROTECTED                                              :{WHITE}Die maatskappy is nie oud genoeg om aandeele te handel nie...
-
-STR_LIVERY_DEFAULT                                              :Standaard Lewery
-STR_LIVERY_STEAM                                                :Stoom Enjin
-STR_LIVERY_DIESEL                                               :Diesel Enjin
-STR_LIVERY_ELECTRIC                                             :Elektriese Enjin
-STR_LIVERY_MONORAIL                                             :Eenspoor Enjin
-STR_LIVERY_MAGLEV                                               :Maglev Enjin
-STR_LIVERY_DMU                                                  :DMU
-STR_LIVERY_EMU                                                  :EMU
-STR_LIVERY_PASSENGER_WAGON_STEAM                                :Passasier Rytuig (Stoom)
-STR_LIVERY_PASSENGER_WAGON_DIESEL                               :Passasier Rytuig (Diesel)
-STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :Passasier Rytuig (Elektries)
-STR_LIVERY_FREIGHT_WAGON                                        :Vraag Wa
-STR_LIVERY_BUS                                                  :Bus
-STR_LIVERY_TRUCK                                                :Vraagmotor
-STR_LIVERY_PASSENGER_SHIP                                       :Passasier Veer
-STR_LIVERY_FREIGHT_SHIP                                         :Vraag Skip
-STR_LIVERY_HELICOPTER                                           :Helikopter
-STR_LIVERY_SMALL_PLANE                                          :Klein Vliegtuig
-STR_LIVERY_LARGE_PLANE                                          :Groot Vliegtuig
-
-STR_LIVERY_GENERAL_TIP                                          :{BLACK}Wys generaal kleur skemas
-STR_LIVERY_TRAIN_TIP                                            :{BLACK}Wys trein kleur skemas
-STR_LIVERY_ROADVEH_TIP                                          :{BLACK}Wys pad voertuig kleur skemas
-STR_LIVERY_SHIP_TIP                                             :{BLACK}Wys skip kleur skemas
-STR_LIVERY_AIRCRAFT_TIP                                         :{BLACK}Wys vliegtuig kleurskemas
-STR_LIVERY_PRIMARY_TIP                                          :{BLACK}Kies die premere kleur vir die verkieste skema
-STR_LIVERY_SECONDARY_TIP                                        :{BLACK}Kies die sekondere kleur vir die verkieste skema
-STR_LIVERY_PANEL_TIP                                            :{BLACK}Kies 'n kleur skema te verander, of veelvoud skemas met CTRL+kliek. Kliek op die boks te skakel gebruik van skema
-
-##id 0x8000
-STR_8000_KIRBY_PAUL_TANK_STEAM                                  :Kirby Paul Tank (Stoom)
-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 (Stoom)
-STR_8008_CHANEY_JUBILEE_STEAM                                   :Chaney 'Jubilee' (Stoom)
-STR_8009_GINZU_A4_STEAM                                         :Ginzu 'A4' (Stoom)
-STR_800A_SH_8P_STEAM                                            :SH '8P' (Stoom)
-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)
-STR_800E_UU_37_DIESEL                                           :UU '37' (Diesel)
-STR_800F_FLOSS_47_DIESEL                                        :Floss '47' (Diesel)
-STR_8010_CS_4000_DIESEL                                         :CS 4000 (Diesel)
-STR_8011_CS_2400_DIESEL                                         :CS 2400 (Diesel)
-STR_8012_CENTENNIAL_DIESEL                                      :Centennial (Diesel)
-STR_8013_KELLING_3100_DIESEL                                    :Kelling 3100 (Diesel)
-STR_8014_TURNER_TURBO_DIESEL                                    :Turner Turbo (Diesel)
-STR_8015_MJS_1000_DIESEL                                        :MJS 1000 (Diesel)
-STR_8016_SH_125_DIESEL                                          :SH '125' (Diesel)
-STR_8017_SH_30_ELECTRIC                                         :SH '30' (Elektries)
-STR_8018_SH_40_ELECTRIC                                         :SH '40' (Elektries)
-STR_8019_T_I_M_ELECTRIC                                         :'T.I.M.' (Elektries)
-STR_801A_ASIASTAR_ELECTRIC                                      :'AsiaStar' (Elektries)
-STR_801B_PASSENGER_CAR                                          :Passasier Rytuig
-STR_801C_MAIL_VAN                                               :Pos Wa
-STR_801D_COAL_CAR                                               :Steenkool Wa
-STR_801E_OIL_TANKER                                             :Olie Tenkwa
-STR_801F_LIVESTOCK_VAN                                          :Lewende Hawe Wa
-STR_8020_GOODS_VAN                                              :Goedere Wa
-STR_8021_GRAIN_HOPPER                                           :Graan Laai Bak
-STR_8022_WOOD_TRUCK                                             :Hout Trok
-STR_8023_IRON_ORE_HOPPER                                        :Yster Erts Laai Bak
-STR_8024_STEEL_TRUCK                                            :Staal Trok
-STR_8025_ARMORED_VAN                                            :Gepantserde Wa
-STR_8026_FOOD_VAN                                               :Kos Wa
-STR_8027_PAPER_TRUCK                                            :Papier Trok
-STR_8028_COPPER_ORE_HOPPER                                      :Koper Erts Laai Bak
-STR_8029_WATER_TANKER                                           :Water Tenkwa
-STR_802A_FRUIT_TRUCK                                            :Vrugte Trok
-STR_802B_RUBBER_TRUCK                                           :Gomlastiek Trok
-STR_802C_SUGAR_TRUCK                                            :Suiker Trok
-STR_802D_COTTON_CANDY_HOPPER                                    :Spookasem Laai Bak
-STR_802E_TOFFEE_HOPPER                                          :Tameletjie Laai Bak
-STR_802F_BUBBLE_VAN                                             :Borrel Wa
-STR_8030_COLA_TANKER                                            :Cola Tenkwa
-STR_8031_CANDY_VAN                                              :Lekker Wa
-STR_8032_TOY_VAN                                                :Speelgoed Wa
-STR_8033_BATTERY_TRUCK                                          :Battery Trok
-STR_8034_FIZZY_DRINK_TRUCK                                      :Koeldrank Trok
-STR_8035_PLASTIC_TRUCK                                          :Plastiek Trok
-STR_8036_X2001_ELECTRIC                                         :'X2001' (Elektries)
-STR_8037_MILLENNIUM_Z1_ELECTRIC                                 :'Millennium Z1' (Elektries)
-STR_8038_WIZZOWOW_Z99                                           :Wizzowow Z99
-STR_8039_PASSENGER_CAR                                          :Passasier Rytuig
-STR_803A_MAIL_VAN                                               :Pos Wa
-STR_803B_COAL_CAR                                               :Steenkool Trok
-STR_803C_OIL_TANKER                                             :Olie Tenkwa
-STR_803D_LIVESTOCK_VAN                                          :Lewende Hawe Wa
-STR_803E_GOODS_VAN                                              :Goedere Wa
-STR_803F_GRAIN_HOPPER                                           :Graan Laai Bak
-STR_8040_WOOD_TRUCK                                             :Hout Trok
-STR_8041_IRON_ORE_HOPPER                                        :Yster Erts Laai Bak
-STR_8042_STEEL_TRUCK                                            :Staal Trok
-STR_8043_ARMORED_VAN                                            :Gepantserde Wa
-STR_8044_FOOD_VAN                                               :Kos Wa
-STR_8045_PAPER_TRUCK                                            :Papier Trok
-STR_8046_COPPER_ORE_HOPPER                                      :Coper Erts Laai Bak
-STR_8047_WATER_TANKER                                           :Water Tenkwa
-STR_8048_FRUIT_TRUCK                                            :Vrugte Trok
-STR_8049_RUBBER_TRUCK                                           :Gomlastiek Wa
-STR_804A_SUGAR_TRUCK                                            :Suiker Trok
-STR_804B_COTTON_CANDY_HOPPER                                    :Spookasem Laai Bak
-STR_804C_TOFFEE_HOPPER                                          :Tameletjie Laai Bak
-STR_804D_BUBBLE_VAN                                             :Borrel Wa
-STR_804E_COLA_TANKER                                            :Cola Tenkwa
-STR_804F_CANDY_VAN                                              :Lekker Wa
-STR_8050_TOY_VAN                                                :Speelgoed Wa
-STR_8051_BATTERY_TRUCK                                          :Bettery Trok
-STR_8052_FIZZY_DRINK_TRUCK                                      :Koeldrank Trok
-STR_8053_PLASTIC_TRUCK                                          :Plastiek Trok
-STR_8054_LEV1_LEVIATHAN_ELECTRIC                                :Lev1 'Leviathan' (Elektries)
-STR_8055_LEV2_CYCLOPS_ELECTRIC                                  :Lev2 'Cyclops' (Elektries)
-STR_8056_LEV3_PEGASUS_ELECTRIC                                  :Lev3 'Pegasus' (Elektries)
-STR_8057_LEV4_CHIMAERA_ELECTRIC                                 :Lev4 'Chimaera' (Elektries)
-STR_8058_WIZZOWOW_ROCKETEER                                     :Wizzowow Rocketeer
-STR_8059_PASSENGER_CAR                                          :Passasier Rytuig
-STR_805A_MAIL_VAN                                               :Pos Wa
-STR_805B_COAL_CAR                                               :Steenkool Trok
-STR_805C_OIL_TANKER                                             :Olie Tenkwa
-STR_805D_LIVESTOCK_VAN                                          :Lewende Hawe Wa
-STR_805E_GOODS_VAN                                              :Goedere Wa
-STR_805F_GRAIN_HOPPER                                           :Graan Laai Bak
-STR_8060_WOOD_TRUCK                                             :Hout Trok
-STR_8061_IRON_ORE_HOPPER                                        :Yster Erts Laai Bak
-STR_8062_STEEL_TRUCK                                            :Staal Trok
-STR_8063_ARMORED_VAN                                            :Gepantserde Wa
-STR_8064_FOOD_VAN                                               :Kos Wa
-STR_8065_PAPER_TRUCK                                            :Papier Trok
-STR_8066_COPPER_ORE_HOPPER                                      :Koper Erts Laai Bak
-STR_8067_WATER_TANKER                                           :Water Tenkwa
-STR_8068_FRUIT_TRUCK                                            :Vrugte Trok
-STR_8069_RUBBER_TRUCK                                           :Gomlastiek Trok
-STR_806A_SUGAR_TRUCK                                            :Suiker Trok
-STR_806B_COTTON_CANDY_HOPPER                                    :Spookasem Laai Bak
-STR_806C_TOFFEE_HOPPER                                          :Tameletjie Laai Bak
-STR_806D_BUBBLE_VAN                                             :Borrel Wa
-STR_806E_COLA_TANKER                                            :Cola Tenkwa
-STR_806F_CANDY_VAN                                              :Lekker Wa
-STR_8070_TOY_VAN                                                :Speelgoed Wa
-STR_8071_BATTERY_TRUCK                                          :Battery Trok
-STR_8072_FIZZY_DRINK_TRUCK                                      :Koeldrank Wa
-STR_8073_PLASTIC_TRUCK                                          :Plastiek Trok
-STR_8074_MPS_REGAL_BUS                                          :MPS Regal Bus
-STR_8075_HEREFORD_LEOPARD_BUS                                   :Hereford Leopard Bus
-STR_8076_FOSTER_BUS                                             :Foster Bus
-STR_8077_FOSTER_MKII_SUPERBUS                                   :Foster MkII Superbus
-STR_8078_PLODDYPHUT_MKI_BUS                                     :Ploddyphut MkI Bus
-STR_8079_PLODDYPHUT_MKII_BUS                                    :Ploddyphut MkII Bus
-STR_807A_PLODDYPHUT_MKIII_BUS                                   :Ploddyphut MkIII Bus
-STR_807B_BALOGH_COAL_TRUCK                                      :Balogh Steenkool Trok
-STR_807C_UHL_COAL_TRUCK                                         :Uhl Steenkool Trok
-STR_807D_DW_COAL_TRUCK                                          :DW Steenkool Trok
-STR_807E_MPS_MAIL_TRUCK                                         :MPS Pos Trok
-STR_807F_REYNARD_MAIL_TRUCK                                     :Reynard Pos Trok
-STR_8080_PERRY_MAIL_TRUCK                                       :Perry Pos Trok
-STR_8081_MIGHTYMOVER_MAIL_TRUCK                                 :MightyMover Pos Trok
-STR_8082_POWERNAUGHT_MAIL_TRUCK                                 :Powernaught Pos Trok
-STR_8083_WIZZOWOW_MAIL_TRUCK                                    :Wizzowow Pos Trok
-STR_8084_WITCOMBE_OIL_TANKER                                    :Witcombe Olie Tenkwa
-STR_8085_FOSTER_OIL_TANKER                                      :Foster Olie Tenkwa
-STR_8086_PERRY_OIL_TANKER                                       :Perry Olie Tenkwa
-STR_8087_TALBOTT_LIVESTOCK_VAN                                  :Talbott Lewende Hawe Wa
-STR_8088_UHL_LIVESTOCK_VAN                                      :Uhl Lewende Hawe Wa
-STR_8089_FOSTER_LIVESTOCK_VAN                                   :Foster Lewende Hawe Wa
-STR_808A_BALOGH_GOODS_TRUCK                                     :Balogh Goedere Trok
-STR_808B_CRAIGHEAD_GOODS_TRUCK                                  :Craighead Goedere Trok
-STR_808C_GOSS_GOODS_TRUCK                                       :Goss Goedere Trok
-STR_808D_HEREFORD_GRAIN_TRUCK                                   :Hereford Graan Trok
-STR_808E_THOMAS_GRAIN_TRUCK                                     :Thomas Graan Trok
-STR_808F_GOSS_GRAIN_TRUCK                                       :Goss Graan Trok
-STR_8090_WITCOMBE_WOOD_TRUCK                                    :Witcombe Hout Trok
-STR_8091_FOSTER_WOOD_TRUCK                                      :Foster Hout Trok
-STR_8092_MORELAND_WOOD_TRUCK                                    :Moreland Hout Trok
-STR_8093_MPS_IRON_ORE_TRUCK                                     :MPS Yster Erts Trok
-STR_8094_UHL_IRON_ORE_TRUCK                                     :Uhl Iron Yster Erts Trok
-STR_8095_CHIPPY_IRON_ORE_TRUCK                                  :Chippy Yster Erts Trok
-STR_8096_BALOGH_STEEL_TRUCK                                     :Balogh Staal Trok
-STR_8097_UHL_STEEL_TRUCK                                        :Uhl Staal Trok
-STR_8098_KELLING_STEEL_TRUCK                                    :Kelling Staal Trok
-STR_8099_BALOGH_ARMORED_TRUCK                                   :Balogh Gepantserde Trok
-STR_809A_UHL_ARMORED_TRUCK                                      :Uhl Gepantserde Trok
-STR_809B_FOSTER_ARMORED_TRUCK                                   :Foster Gepantserde Trok
-STR_809C_FOSTER_FOOD_VAN                                        :Foster Kos Wa
-STR_809D_PERRY_FOOD_VAN                                         :Perry Kos Wa
-STR_809E_CHIPPY_FOOD_VAN                                        :Chippy Kos Wa
-STR_809F_UHL_PAPER_TRUCK                                        :Uhl Papier Trok
-STR_80A0_BALOGH_PAPER_TRUCK                                     :Balogh Papier Trok
-STR_80A1_MPS_PAPER_TRUCK                                        :MPS Papier Trok
-STR_80A2_MPS_COPPER_ORE_TRUCK                                   :MPS Koper Erts Trok
-STR_80A3_UHL_COPPER_ORE_TRUCK                                   :Uhl Koper Erts Trok
-STR_80A4_GOSS_COPPER_ORE_TRUCK                                  :Goss Koper Erts Trok
-STR_80A5_UHL_WATER_TANKER                                       :Uhl Water Tenkwa
-STR_80A6_BALOGH_WATER_TANKER                                    :Balogh Water Tenkwa
-STR_80A7_MPS_WATER_TANKER                                       :MPS Water Tenkwa
-STR_80A8_BALOGH_FRUIT_TRUCK                                     :Balogh Vrugte Trok
-STR_80A9_UHL_FRUIT_TRUCK                                        :Uhl Vrugte Trok
-STR_80AA_KELLING_FRUIT_TRUCK                                    :Kelling Vrugte Trok
-STR_80AB_BALOGH_RUBBER_TRUCK                                    :Balogh Gomlastiek Trok
-STR_80AC_UHL_RUBBER_TRUCK                                       :Uhl Gomlastiek Trok
-STR_80AD_RMT_RUBBER_TRUCK                                       :RMT Gomlastiek Trok
-STR_80AE_MIGHTYMOVER_SUGAR_TRUCK                                :MightyMover Suiker Trok
-STR_80AF_POWERNAUGHT_SUGAR_TRUCK                                :Powernaught Suiker Trok
-STR_80B0_WIZZOWOW_SUGAR_TRUCK                                   :Wizzowow Suiker Trok
-STR_80B1_MIGHTYMOVER_COLA_TRUCK                                 :MightyMover Cola Trok
-STR_80B2_POWERNAUGHT_COLA_TRUCK                                 :Powernaught Cola Trok
-STR_80B3_WIZZOWOW_COLA_TRUCK                                    :Wizzowow Cola Trok
-STR_80B4_MIGHTYMOVER_COTTON_CANDY                               :MightyMover Spookasem Trok
-STR_80B5_POWERNAUGHT_COTTON_CANDY                               :Powernaught Spookasem Trok
-STR_80B6_WIZZOWOW_COTTON_CANDY_TRUCK                            :Wizzowow Spookasem Trok
-STR_80B7_MIGHTYMOVER_TOFFEE_TRUCK                               :MightyMover Tameletjie Trok
-STR_80B8_POWERNAUGHT_TOFFEE_TRUCK                               :Powernaught Tameletjie Trok
-STR_80B9_WIZZOWOW_TOFFEE_TRUCK                                  :Wizzowow Tameletjie Trok
-STR_80BA_MIGHTYMOVER_TOY_VAN                                    :MightyMover Speelgoed Wa
-STR_80BB_POWERNAUGHT_TOY_VAN                                    :Powernaught Speelgoed Wa
-STR_80BC_WIZZOWOW_TOY_VAN                                       :Wizzowow Speelgoed Wa
-STR_80BD_MIGHTYMOVER_CANDY_TRUCK                                :MightyMover Lekker Trok
-STR_80BE_POWERNAUGHT_CANDY_TRUCK                                :Powernaught Lekker Trok
-STR_80BF_WIZZOWOW_CANDY_TRUCK                                   :Wizzowow Lekker Trok
-STR_80C0_MIGHTYMOVER_BATTERY_TRUCK                              :MightyMover Battery Trok
-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 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
-STR_80C8_WIZZOWOW_PLASTIC_TRUCK                                 :Wizzowow Plastiek Trok
-STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK                               :MightyMover Borrel Trok
-STR_80CA_POWERNAUGHT_BUBBLE_TRUCK                               :Powernaught Borrel Trok
-STR_80CB_WIZZOWOW_BUBBLE_TRUCK                                  :Wizzowow Borrel Trok
-STR_80CC_MPS_OIL_TANKER                                         :MPS Olie Tenkskip
-STR_80CD_CS_INC_OIL_TANKER                                      :CS-Inc. Olie Tenkskip
-STR_80CE_MPS_PASSENGER_FERRY                                    :MPS Passasier Veerboot
-STR_80CF_FFP_PASSENGER_FERRY                                    :FFP Passasier Veerboot
-STR_80D0_BAKEWELL_300_HOVERCRAFT                                :Bakewell 300 Skeertuig
-STR_80D1_CHUGGER_CHUG_PASSENGER                                 :Chugger-Chug Passasier Veerboot
-STR_80D2_SHIVERSHAKE_PASSENGER_FERRY                            :Shivershake Passasier Veerboot
-STR_80D3_YATE_CARGO_SHIP                                        :Yate Vrag skip
-STR_80D4_BAKEWELL_CARGO_SHIP                                    :Bakewell Vrag skip
-STR_80D5_MIGHTYMOVER_CARGO_SHIP                                 :Mightymover Vrag skip
-STR_80D6_POWERNAUT_CARGO_SHIP                                   :Powernaut Vrag skip
-STR_80D7_SAMPSON_U52                                            :Sampson U52
-STR_80D8_COLEMAN_COUNT                                          :Coleman Count
-STR_80D9_FFP_DART                                               :FFP Dart
-STR_80DA_YATE_HAUGAN                                            :Yate Haugan
-STR_80DB_BAKEWELL_COTSWALD_LB_3                                 :Bakewell Cotswald LB-3
-STR_80DC_BAKEWELL_LUCKETT_LB_8                                  :Bakewell Luckett LB-8
-STR_80DD_BAKEWELL_LUCKETT_LB_9                                  :Bakewell Luckett LB-9
-STR_80DE_BAKEWELL_LUCKETT_LB80                                  :Bakewell Luckett LB80
-STR_80DF_BAKEWELL_LUCKETT_LB_10                                 :Bakewell Luckett LB-10
-STR_80E0_BAKEWELL_LUCKETT_LB_11                                 :Bakewell Luckett LB-11
-STR_80E1_YATE_AEROSPACE_YAC_1_11                                :Yate Aerospace YAC 1-11
-STR_80E2_DARWIN_100                                             :Darwin 100
-STR_80E3_DARWIN_200                                             :Darwin 200
-STR_80E4_DARWIN_300                                             :Darwin 300
-STR_80E5_DARWIN_400                                             :Darwin 400
-STR_80E6_DARWIN_500                                             :Darwin 500
-STR_80E7_DARWIN_600                                             :Darwin 600
-STR_80E8_GURU_GALAXY                                            :Guru Galaxy
-STR_80E9_AIRTAXI_A21                                            :Airtaxi A21
-STR_80EA_AIRTAXI_A31                                            :Airtaxi A31
-STR_80EB_AIRTAXI_A32                                            :Airtaxi A32
-STR_80EC_AIRTAXI_A33                                            :Airtaxi A33
-STR_80ED_YATE_AEROSPACE_YAE46                                   :Yate Aerospace YAe46
-STR_80EE_DINGER_100                                             :Dinger 100
-STR_80EF_AIRTAXI_A34_1000                                       :AirTaxi A34-1000
-STR_80F0_YATE_Z_SHUTTLE                                         :Yate Z-Shuttle
-STR_80F1_KELLING_K1                                             :Kelling K1
-STR_80F2_KELLING_K6                                             :Kelling K6
-STR_80F3_KELLING_K7                                             :Kelling K7
-STR_80F4_DARWIN_700                                             :Darwin 700
-STR_80F5_FFP_HYPERDART_2                                        :FFP Hyperdart 2
-STR_80F6_DINGER_200                                             :Dinger 200
-STR_80F7_DINGER_1000                                            :Dinger 1000
-STR_80F8_PLODDYPHUT_100                                         :Ploddyphut 100
-STR_80F9_PLODDYPHUT_500                                         :Ploddyphut 500
-STR_80FA_FLASHBANG_X1                                           :Flashbang X1
-STR_80FB_JUGGERPLANE_M1                                         :Juggerplane M1
-STR_80FC_FLASHBANG_WIZZER                                       :Flashbang Wizzer
-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}Boodskap van voertuig fabrikant
-STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Ons het juis 'n nuwe {STRING} ontwerp - sal jy in 'n jaar se eksklusief gebruik van die voertuig belang stel, dus kan ons sien hoe hy uitvoer voor dit algemeen beskikbaar is?
-STR_8102_RAILROAD_LOCOMOTIVE                                    :spoorweg lokomotief
-STR_8103_ROAD_VEHICLE                                           :pad voertuig
-STR_8104_AIRCRAFT                                               :vliegtuig
-STR_8105_SHIP                                                   :skip
-STR_8106_MONORAIL_LOCOMOTIVE                                    :eenspoor lokomotief
-STR_8107_MAGLEV_LOCOMOTIVE                                      :maglev lokomotief
-
-##id 0x8800
-STR_8800_TRAIN_DEPOT                                            :{WHITE}{TOWN} Trein Depot
-STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste trein arriveer by {STATION}!
-STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Aanwyse)
-STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Trein in die pad
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Gaan na {STATION}
-STR_8807_GO_TO_TRANSFER                                         :Gaan na {STATION} (Oordrag en vat vrag)
-STR_8808_GO_TO_UNLOAD                                           :Gaan na {STATION} (Aflaai)
-STR_8809_GO_TO_TRANSFER_UNLOAD                                  :Gaan na {STATION} (Oordrag en verlaat leeg)
-STR_880A_GO_TO_LOAD                                             :Gaan na {STATION} (Laai)
-STR_880B_GO_TO_TRANSFER_LOAD                                    :Gaan na {STATION} (Oordrag en wag vir volle lading)
-STR_880C_GO_NON_STOP_TO                                         :Gaan deurgaande na {STATION}
-STR_880D_GO_TO_NON_STOP_TRANSFER                                :Gaan deurgaande na {STATION} (Oordrag en vat vrag)
-STR_880E_GO_NON_STOP_TO_UNLOAD                                  :Gaan deurgaande na {STATION} (Aflaai)
-STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Gaan deurgaande na {STATION} (Oordrag en verlaat leeg)
-STR_8810_GO_NON_STOP_TO_LOAD                                    :Gaan deurgaande na {STATION} (Laai)
-STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Gaan deurgaande na {STATION} (Oordrag en wag vir volle lading)
-STR_GO_TO_TRAIN_DEPOT                                           :Gaan na {TOWN} Trein Depot
-STR_SERVICE_AT_TRAIN_DEPOT                                      :Diens by {TOWN} Trein Depot
-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
-STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL                         :{LTBLUE}Diens by {TOWN} Trein Depot, {VELOCITY}
-
-STR_INVALID_ORDER                                               :{RED} (Swak Opdrag)
-
-STR_UNKNOWN_DESTINATION                                         :onbekende destinasie
-STR_8812_EMPTY                                                  :{LTBLUE}Leeg
-STR_8813_FROM                                                   :{LTBLUE}{CARGO} vanaf {STATION}
-STR_FROM_MULT                                                   :{LTBLUE}{CARGO} van {STATION} (x{NUM})
-STR_8814_TRAIN_IS_WAITING_IN_DEPOT                              :{WHITE}Trein {COMMA} wag in depot
-STR_8815_NEW_VEHICLES                                           :{BLACK}Nuwe Voertuie
-STR_8816                                                        :{BLACK}-
-STR_8819_TRAIN_TOO_LONG                                         :{WHITE}Trein te lank
-STR_881A_TRAINS_CAN_ONLY_BE_ALTERED                             :{WHITE}Treine kan slegs verander word as hulle in die depot gestop is
-STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} Trein{P "" e}
-
-STR_881C_NEW_RAIL_VEHICLES                                      :{WHITE}Nuwe Spoor Voertuie
-STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Nuwe Elektries Spoor Voertuie
-STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Nuwe Eenspoor Voertuie
-STR_881E_NEW_MAGLEV_VEHICLES                                    :{WHITE}Nuwe Maglev Voertuie
-STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}Spoorweg Voertuie
-
-STR_881F_BUILD_VEHICLE                                          :{BLACK}Bou Voertuig
-STR_CLONE_ROAD_VEHICLE                                          :{BLACK}Kloon Voertuig
-STR_CLONE_ROAD_VEHICLE_INFO                                     :{BLACK}Dit sal 'n afskrywing van die pad voertuig bou. Control-kliek sal die opdrae deel
-STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Dit sal 'n afskrywing van 'n pad voertuig bou. Kliek die knoppie en dan op 'n pad voertuig binne of buite die depot. Control-kliek sal die opdrae deel
-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}Hernoem
-STR_8823_SKIP                                                   :{BLACK}Sprong
-STR_8824_DELETE                                                 :{BLACK}Uitwis
-STR_8825_NON_STOP                                               :{BLACK}Deurgaande
-STR_8826_GO_TO                                                  :{BLACK}Gaan Na
-STR_8827_FULL_LOAD                                              :{BLACK}Volle Lading
-STR_8828_UNLOAD                                                 :{BLACK}Aflaai
-STR_REFIT                                                       :{BLACK}Herpas
-STR_REFIT_TIP                                                   :{BLACK}Kies watter vrag tipe te herpas na in die opdraag. CTRL-kliek om herpas instruksie te verwyder
-STR_REFIT_ORDER                                                 :(Herpas na {STRING})
-STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Opdrae)
-STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Einde van Opdrae - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
-STR_SERVICE                                                     :{BLACK}Diens
-STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Kan nie spoorweg voertuig bou nie...
-STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebou: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
-STR_882D_VALUE                                                  :{LTBLUE}{ENGINE}{BLACK}   Waarde: {LTBLUE}{CURRENCY}
-STR_882E                                                        :{WHITE}{VEHICLE}
-STR_882F_LOADING_UNLOADING                                      :{LTBLUE}Laai / Aflaai
-STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}Trein moet binne in 'n depot gestop word
-STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT                              :{WHITE}Kan nie trein na depot stuur nie...
-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}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...
-STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Kan nie roete na plaaslike depot vind nie
-STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Trein kan nie stop/aanvang word nie...
-STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Diens tussentyd: {LTBLUE}{COMMA}dae{BLACK}   Laaste diens: {LTBLUE}{DATE_LONG}
-STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Versiens tussentyd: {LTBLUE}{COMMA}%{BLACK}   Laaste versiening: {LTBLUE}{DATE_LONG}
-STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Treine - kliek op trein vir inligting
-STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Bou nuwe treine (vereis trein depot)
-STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Treine - kliek op trein vir info., sleep voertuig om te bysit/verwyder van trein
-STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}Bou nuwe trein voertuig
-STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Sleep trein voertuig hier om dit te verkoop
-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}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
-STR_8849_SEND_TRAIN_TO_DEPOT                                    :{BLACK}Stuur trein na depot. CTRL+kliek sal net diens
-STR_884A_FORCE_TRAIN_TO_PROCEED                                 :{BLACK}Dwing trein om voort te gaan sonder om vir seine te wag
-STR_884B_REVERSE_DIRECTION_OF_TRAIN                             :{BLACK}Omkeer rigting van trein
-STR_884C_SHOW_TRAIN_DETAILS                                     :{BLACK}Wys trein se aanwyse
-STR_884D_INCREASE_SERVICING_INTERVAL                            :{BLACK}Vergroot diens tussentyd
-STR_884E_DECREASE_SERVICING_INTERVAL                            :{BLACK}Verminder diens tussentyd
-STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED                          :{BLACK}Wys aanwyse van vrag gedra
-STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES                         :{BLACK}Wys aanwyse van trein voertuie
-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
-STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Maak die beklemtoonde opdrag dwing die voertuig om vir 'n volle lading te wag
-STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Maak die beklemtoonde opdrag dwing die voertuig te aflaai
-STR_SERVICE_HINT                                                :{BLACK}Sprong die opdraag tensy 'n versiening nodig is
-STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Koste: {CURRENCY} Gewig: {WEIGHT_S}{}Spoed: {VELOCITY}  Krag: {POWER}{}Loopkoste: {CURRENCY}/jr{}Kapasitiet: {CARGO}
-STR_885C_BROKEN_DOWN                                            :{RED}Oponthoud
-STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}Ouderdom: {LTBLUE}{STRING}{BLACK}   Loopkoste: {LTBLUE}{CURRENCY}/Jr
-STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}Gewig: {LTBLUE}{WEIGHT_S}  {BLACK}Krag: {LTBLUE}{POWER}{BLACK} Max. spoed: {LTBLUE}{VELOCITY}
-STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}Gewig: {LTBLUE}{WEIGHT_S} {BLACK}Krag: {LTBLUE}{POWER}{BLACK} Max. spoed: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE}
-STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profyt die jaar: {LTBLUE}{CURRENCY}  (verlede jaar: {CURRENCY})
-STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}Deeglikheid: {LTBLUE}{COMMA}%  {BLACK}Oponthoude sedert laaste diens: {LTBLUE}{COMMA}
-STR_8861_STOPPED                                                :{RED}Gestop
-STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}Kan nie trein dwing om sein te vermy op gevaar...
-STR_8863_CRASHED                                                :{RED}Botsing!
-
-STR_8865_NAME_TRAIN                                             :{WHITE}Benaam trein
-STR_8866_CAN_T_NAME_TRAIN                                       :{WHITE}Trein kan nie benaam word nie...
-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}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}
-STR_9002                                                        :{WHITE}{VEHICLE}
-STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}{TOWN} Pad Voertuig Depot
-STR_9004_NEW_VEHICLES                                           :{BLACK}Nuwe Voertuie
-STR_9006_NEW_ROAD_VEHICLES                                      :{WHITE}Nuwe Pad Voertuie
-STR_9007_BUILD_VEHICLE                                          :{BLACK}Bou Voertuig
-STR_9009_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Kan nie pad voertuig bou nie...
-STR_900C_DETAILS                                                :{WHITE}{VEHICLE} (Aanwyse)
-STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}Ouderdom: {LTBLUE}{STRING}{BLACK}   Loopkoste: {LTBLUE}{CURRENCY}/Jr
-STR_900E_MAX_SPEED                                              :{BLACK}Max. spoed: {LTBLUE}{VELOCITY}
-STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profyt die jaar: {LTBLUE}{CURRENCY}  (verlede jaar: {CURRENCY})
-STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Deeglikheid: {LTBLUE}{COMMA}%  {BLACK}Oponthoude sedert laaste diens: {LTBLUE}{COMMA}
-STR_9011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebou: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
-STR_9012_CAPACITY                                               :{BLACK}Kapasitiet: {LTBLUE}{CARGO}
-STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...moet gestop binne 'n pad voertuig depot wees
-STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}Kan nie pad voertuig verkoop nie
-STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}Kani nie pad voertuig stop/aanvang nie...
-STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}Pad voertuig {COMMA} wag in depot
-STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Op pad na {TOWN} Pad Depot
-STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Op pad na {TOWN} Pad Depot, {VELOCITY}
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Diens by {TOWN} Pad Depot
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}Diens by {TOWN} Pad Depot, {VELOCITY}
-STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT                            :{WHITE}Kan nie voertuig na depot stuur nie...
-STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Kan nie plaaslike depot vind nie
-STR_901A_ROAD_VEHICLES_CLICK_ON                                 :{BLACK}Pad voertuie - kliek op voertuig vir inligting
-STR_901B_BUILD_NEW_ROAD_VEHICLES                                :{BLACK}Bou nuwe pad voertuie (vereis pad voertuig depot)
-STR_901C_CURRENT_VEHICLE_ACTION                                 :{BLACK}Huidige voertuig aksie - kliek hier om voertuig to stop/aanvang
-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 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
-STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Sleep pad voertuig hier om dit te verkoop
-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}/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}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
-
-STR_REFIT_ROAD_VEHICLE_TO_CARRY                                 :{BLACK}Herpas pad voertuig om 'n ander vrag tipe te ontvoer
-STR_REFIT_ROAD_VEHICLE                                          :{BLACK}Herpas pad voertuig
-STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Herpas pad voertuig om beklemtoonde vrat tipe te ontvoer
-
-##id 0x9800
-STR_9800_DOCK_CONSTRUCTION                                      :Werf konstruksie
-STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}Werf konstruksie
-STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Kan nie werf hier bou nie...
-STR_9803_SHIP_DEPOT                                             :{WHITE}{TOWN} Skip Depot
-STR_9804_NEW_SHIPS                                              :{BLACK}Nuwe Skepe
-STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} Skeep{P "" e}
-STR_9808_NEW_SHIPS                                              :{WHITE}Nuwe Skepe
-STR_9809_BUILD_SHIP                                             :{BLACK}Bou Skip
-STR_CLONE_SHIP                                                  :{BLACK}Kloon Skip
-STR_CLONE_SHIP_INFO                                             :{BLACK}Dit sal 'n afskrywing van die skip bou. Control-kliek sal die opdrae deel
-STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Dit sal 'n afskrywing van 'n skip bou. Kliek die knoppie en dan op 'n skip binne of buite die depot. Control-kliek sal die opdrae deel
-STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Skip moet in 'n depot gestop wees
-STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Skip kan nie verkoop word nie...
-STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Kan nie skip bou nie...
-STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Skip in die pad
-STR_980F                                                        :{WHITE}{VEHICLE}
-STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (Aanwyse)
-STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}Ouderdom: {LTBLUE}{STRING}{BLACK}   Loopkoste: {LTBLUE}{CURRENCY}/Jr
-STR_9813_MAX_SPEED                                              :{BLACK}Max. spoed: {LTBLUE}{VELOCITY}
-STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profyt die jaar: {LTBLUE}{CURRENCY}  (verlede jaar: {CURRENCY})
-STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}Deeglikheid: {LTBLUE}{COMMA}%  {BLACK}Oponthoude sedert laaste diens: {LTBLUE}{COMMA}
-STR_9816_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebou: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
-STR_9817_CAPACITY                                               :{BLACK}Kapasitiet: {LTBLUE}{CARGO}
-STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}Kan nie skip stop/aanvang nie
-STR_9819_CAN_T_SEND_SHIP_TO_DEPOT                               :{WHITE}Kan nie skip na depot stuur nie...
-STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Kan nie plaaslike depot vind nie
-STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Op pad na {TOWN} Skip Depot
-STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Op pad na {TOWN} Skip Depot, {VELOCITY}
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE                              :{LTBLUE}Diens by {TOWN} Skip Depot
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL                          :{LTBLUE}Diens by {TOWN} Skip Depot, {VELOCITY}
-STR_981C_SHIP_IS_WAITING_IN_DEPOT                               :{WHITE}Skip {COMMA} wag in depot
-STR_981D_BUILD_SHIP_DOCK                                        :{BLACK}Bou skip werf
-STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING                          :{BLACK}Bou skip depot (vir opbou en diens van skepe)
-STR_981F_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Skepe - kliek op skeep vir inligting
-STR_9820_BUILD_NEW_SHIP                                         :{BLACK}Bou nuwe skip
-STR_9821_DRAG_SHIP_TO_HERE_TO_SELL                              :{BLACK}Sleep skip hier om dit te verkoop
-STR_9822_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Senter skerm op skip depot
-STR_9823_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Skepe - kliek op skip vir inligting
-STR_9824_BUILD_NEW_SHIPS_REQUIRES                               :{BLACK}Bou nuwe skepe (vereis skip depot)
-STR_9825_SHIP_SELECTION_LIST_CLICK                              :{BLACK}Skip keuse lys - kliek op skip vir inligting
-STR_9826_BUILD_THE_HIGHLIGHTED_SHIP                             :{BLACK}Bou die beklemtoonde skip
-STR_9827_CURRENT_SHIP_ACTION_CLICK                              :{BLACK}Huidige skip aksie - kliek hier om skip te stop/aanvang
-STR_9828_SHOW_SHIP_S_ORDERS                                     :{BLACK}Wys skip se opdrae
-STR_9829_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Senter skerm op skip
-STR_982A_SEND_SHIP_TO_DEPOT                                     :{BLACK}Stuur skip na depot
-STR_982B_SHOW_SHIP_DETAILS                                      :{BLACK}Wys skip se aanwyse
-STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Koste: {CURRENCY} Max. Spoed: {VELOCITY}{}Kapasitiet: {CARGO}{}Loopkoste: {CURRENCY}/yr
-STR_982F_NAME_SHIP                                              :{BLACK}Benaam skip
-
-STR_9831_NAME_SHIP                                              :{WHITE}Benaam skip
-STR_9832_CAN_T_NAME_SHIP                                        :{WHITE}Kan nie skip benaam nie...
-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}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
-STR_983D_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Kies vrag tipe vir skip te ontvoer
-STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED                        :{BLACK}Herstel skip om die beklemtoonde vrag tipe te ontvoer
-STR_983F_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Kies vrag tipe vir skip te ontvoer:
-STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nuwe kapasiteit: {GOLD}{CARGO}{}{BLACK}Herstelkoste: {GOLD}{CURRENCY}
-STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Skip kan nie herstel word nie...
-STR_9842_REFITTABLE                                             :(herstelbaar)
-STR_GO_TO_SHIP_DEPOT                                            :Gaan na {TOWN} Skip Depot
-SERVICE_AT_SHIP_DEPOT                                           :Versiening by {TOWN} Skip Depot
-
-##id 0xA000
-STR_A000_AIRPORTS                                               :{WHITE}Lughawe
-STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}Lughawe kan nie hier gebou word nie...
-STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}{STATION} Vliegtuig Hangar
-STR_A003_NEW_AIRCRAFT                                           :{BLACK}Nuwe Vliegtuig
-STR_CLONE_AIRCRAFT                                              :{BLACK}Kloon Vliegtuig
-STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Dit sal 'n afskrywing van die vliegtuig bou. Control-kliek sal die opdrae deel
-STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}Dit sal 'n afskrywing van 'n vliegtuig bou. Kliek die knoppie en dan op 'n vliegtuig binne of buite die hangar. Control-kliek sal die opdrae deel
-STR_A005_NEW_AIRCRAFT                                           :{WHITE}Nuwe Vliegtuig
-STR_A006_BUILD_AIRCRAFT                                         :{BLACK}Bou Vliegtuig
-STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}Kan nie vliegtuig bou nie...
-STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA} Vliegtuie
-STR_A00A                                                        :{WHITE}{VEHICLE}
-STR_A00B_ORDERS                                                 :{WHITE}{VEHICLE} (Opdrae)
-STR_A00C_DETAILS                                                :{WHITE}{VEHICLE} (Aanwyse)
-STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}Ouderdom: {LTBLUE}{STRING}{BLACK}   Loopkoste: {LTBLUE}{CURRENCY}/Jr
-STR_A00E_MAX_SPEED                                              :{BLACK}Max. spoed: {LTBLUE}{VELOCITY}
-STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profyt die jaar: {LTBLUE}{CURRENCY}  (verlede jaar: {CURRENCY})
-STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Deeglikheid: {LTBLUE}{COMMA}%  {BLACK}Oponthoude sedert laaste diens: {LTBLUE}{COMMA}
-STR_A011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebou: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
-STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Kan nie vlietuig na hangar stuur nie...
-STR_HEADING_FOR_HANGAR                                          :{ORANGE}Op pad na {STATION} Hangar
-STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}Op pad na {STATION} Hangar, {VELOCITY}
-STR_HEADING_FOR_HANGAR_SERVICE                                  :{LTBLUE}Diens by {STATION} Hangar
-STR_HEADING_FOR_HANGAR_SERVICE_VEL                              :{LTBLUE}Diens by {STATION} Hangar, {VELOCITY}
-STR_A014_AIRCRAFT_IS_WAITING_IN                                 :{WHITE}Vliegtuig {COMMA} wag in die vliegtuig hangar
-STR_A015_AIRCRAFT_IN_THE_WAY                                    :{WHITE}Vliegtuig in die pad
-STR_A016_CAN_T_STOP_START_AIRCRAFT                              :{WHITE}Kan nie vliegtuig stop/aanvang nie...
-STR_A017_AIRCRAFT_IS_IN_FLIGHT                                  :{WHITE}Vliegtuig is opvlug
-STR_A019_CAPACITY                                               :{BLACK}Kapasiteit: {LTBLUE}{CARGO}, {CARGO}
-STR_A01A_CAPACITY                                               :{BLACK}Kapasiteit: {LTBLUE}{CARGO}
-STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}Vliegtuig moet in hangar gestop wees
-STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Vliegtuig kan nie verkoop word nie...
-STR_A01D_AIRPORT_CONSTRUCTION                                   :Lughawe konstruksie
-STR_A01E_BUILD_AIRPORT                                          :{BLACK}Bou lughawe
-STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Vliegtuie - kliek op vliegtuig vir inligting
-STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES                            :{BLACK}Bou nuwe vliegtuig (vereis lughawe met hangar)
-STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Vliegtuie - kliek op vliegtuig vir inligting
-STR_A022_BUILD_NEW_AIRCRAFT                                     :{BLACK}Bou nuwe vliegtuig
-STR_A023_DRAG_AIRCRAFT_TO_HERE_TO                               :{BLACK}Sleep vliegtuig hier om dit te verkoop
-STR_A024_CENTER_MAIN_VIEW_ON_HANGAR                             :{BLACK}Senter skerm op hangar
-STR_A025_AIRCRAFT_SELECTION_LIST                                :{BLACK}Vliegtuig keuse lys - kliek op vliegtuig vir inligting
-STR_A026_BUILD_THE_HIGHLIGHTED_AIRCRAFT                         :{BLACK}Bou die beklemtoonde vliegtuig
-STR_A027_CURRENT_AIRCRAFT_ACTION                                :{BLACK}Huidige vliegtuig aksie - kliek hier on vliegtuig te stop/aanvang
-STR_A028_SHOW_AIRCRAFT_S_ORDERS                                 :{BLACK}Wys vliegtuig se opdrae
-STR_A029_CENTER_MAIN_VIEW_ON_AIRCRAFT                           :{BLACK}Senter skerm op vliegtuig
-STR_A02A_SEND_AIRCRAFT_TO_HANGAR                                :{BLACK}Stuur vliegtuig na hangar. CTRL+kliek sal net diens
-STR_A02B_SHOW_AIRCRAFT_DETAILS                                  :{BLACK}Wys vliegtuig aanwyse
-STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Koste: {CURRENCY} Max. Spoed: {VELOCITY}{}Kapasiteit: {COMMA} passasiers, {COMMA} sakke van pos{}Loopkoste: {CURRENCY}/Jr
-
-STR_A030_NAME_AIRCRAFT                                          :{WHITE}Benaam vliegtuig
-STR_A031_CAN_T_NAME_AIRCRAFT                                    :{WHITE}Vliegtuig kan nie benaam word nie...
-STR_A032_NAME_AIRCRAFT                                          :{BLACK}Benaam vliegtuig
-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}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
-STR_A03E_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Kies vrag tipe vir vliegtuig om te ontvoer
-STR_A03F_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Herstel vliegtuig om beklemtoonde vrag tipe te ontvoer
-STR_A040_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Kies vrag tipe om te ontvoer:
-STR_A041_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nuwe kapasiteit: {GOLD}{STRING}{}{BLACK}Herstelkoste: {GOLD}{CURRENCY}
-STR_A042_CAN_T_REFIT_AIRCRAFT                                   :{WHITE}Vliegtuig kan nie herstel word nie...
-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!
-STR_B002_OIL_REFINERY_EXPLOSION                                 :{BLACK}{BIGFONT}Olie raffineerdery ontploffing naby {TOWN}!
-STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS                        :{BLACK}{BIGFONT}Fabriek vernietig in verdage omstandighede naby {TOWN}!
-STR_B004_UFO_LANDS_NEAR                                         :{BLACK}{BIGFONT}'VVV' beland naby {TOWN}!
-STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Steenkool myn bedaaring los spoor van vernietiging naby {TOWN}!
-STR_B006_FLOOD_VEHICLE_DESTROYED                                :{BLACK}{BIGFONT}Vloede!{}Te minste {COMMA} verlore, vermoede dood agter beduidend vloeding!
-
-STR_BRIBE_FAILED                                                :{WHITE}Jou omkooping onderneeming is deur
-STR_BRIBE_FAILED_2                                              :{WHITE}'n streek navorser uitgevind
-STR_BUILD_DATE                                                  :{BLACK}Gebou: {LTBLUE}{DATE_LONG}
-
-STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY                          :{BLACK}({CURRCOMPACT}/{CURRCOMPACT})
-STR_PERFORMANCE_DETAIL_AMOUNT_INT                               :{BLACK}({COMMA}/{COMMA})
-STR_PERFORMANCE_DETAIL_PERCENT                                  :{WHITE}{NUM}%
-SET_PERFORMANCE_DETAIL_INT                                      :{BLACK}{NUM}
-############ Those following lines need to be in this order!!
-STR_PERFORMANCE_DETAIL_VEHICLES                                 :{BLACK}Voertuie:
-STR_PERFORMANCE_DETAIL_STATIONS                                 :{BLACK}Stasies:
-STR_PERFORMANCE_DETAIL_MIN_PROFIT                               :{BLACK}Min. profyt:
-STR_PERFORMANCE_DETAIL_MIN_INCOME                               :{BLACK}Min. inkome:
-STR_PERFORMANCE_DETAIL_MAX_INCOME                               :{BLACK}Max. inkome:
-STR_PERFORMANCE_DETAIL_DELIVERED                                :{BLACK}Afgelewer:
-STR_PERFORMANCE_DETAIL_CARGO                                    :{BLACK}Vrag:
-STR_PERFORMANCE_DETAIL_MONEY                                    :{BLACK}Geld:
-STR_PERFORMANCE_DETAIL_LOAN                                     :{BLACK}Lening:
-STR_PERFORMANCE_DETAIL_TOTAL                                    :{BLACK}Totaal:
-############ End of order list
-STR_PERFORMANCE_DETAIL_VEHICLES_TIP                             :{BLACK}Nommer van voertuie; dit sluit pad voertuie, treine, skepe en vliegtuie in
-STR_PERFORMANCE_DETAIL_MIN_PROFIT_TIP                           :{BLACK}Die profyt van die voertuig met die laagste inkome (van alle voertuie ouer as 2 jaare)
-STR_PERFORMANCE_DETAIL_MIN_INCOME_TIP                           :{BLACK}Bedrag van kontant gemaak in die maand met die laagste profyt in die laaste 12 kwartiers
-STR_PERFORMANCE_DETAIL_MAX_INCOME_TIP                           :{BLACK}Bedrag van kontant gemaak in die maand met die hoogste profyt in die laaste 12 kwartiers
-STR_PERFORMANCE_DETAIL_DELIVERED_TIP                            :{BLACK}Eenheide van vrag afgelewer in die laaste vier kwartiers
-STR_PERFORMANCE_DETAIL_CARGO_TIP                                :{BLACK}Nommer van vrag tipes afgelewer in die verlede kwartier
-STR_PERFORMANCE_DETAIL_MONEY_TIP                                :{BLACK}Bedrag van geld die maatskappy het in die bank
-STR_PERFORMANCE_DETAIL_LOAN_TIP                                 :{BLACK}Die bedrag van geld dat die maatskappy het gevat op lening
-
-STR_NEWGRF_SETTINGS_CAPTION                                     :{WHITE}Newgrf stellings
-STR_NEWGRF_TIP                                                  :{BLACK}'n Lys van al die Newgrf stelle wat ingestel is. Kliek op 'n stel om die stellings te verander
-STR_NEWGRF_FILENAME                                             :{BLACK}Leernaam: {SILVER}{STRING}
-STR_NEWGRF_GRF_ID                                               :{BLACK}GRF ID: {SILVER}{STRING}
-
-
-
-
-
-
-STR_CURRENCY_WINDOW                                             :{WHITE}Gewoonte koers
-STR_CURRENCY_EXCHANGE_RATE                                      :{LTBLUE}Wisselkoers: {ORANGE}{CURRENCY} =  {COMMA}
-STR_CURRENCY_SEPARATOR                                          :{LTBLUE}Afskeier
-STR_CURRENCY_PREFIX                                             :{LTBLUE}Vervoegsel:
-STR_CURRENCY_SUFFIX                                             :{LTBLUE}Agtervoegsel:
-STR_CURRENCY_SWITCH_TO_EURO                                     :{LTBLUE}Verwissel na Euro: {ORANGE}{NUM}
-STR_CURRENCY_SWITCH_TO_EURO_NEVER                               :{LTBLUE}Verwissel na Euro: {ORANGE}nooit
-STR_CURRENCY_PREVIEW                                            :{LTBLUE}Voorskou: {ORANGE}{CURRENCY}
-STR_CURRENCY_CHANGE_PARAMETER                                   :{BLACK}Verander gewoonte koers stelling
-
-STR_BUS                                                         :{BLACK}{BUS}
-STR_LORRY                                                       :{BLACK}{LORRY}
-STR_PLANE                                                       :{BLACK}{PLANE}
-
-
-
-
-### depot strings
-STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Is jy seker jy wil al die voertuie in die depot nou verkoop?
-
-STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Verkoop allep treine in die depot
-STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Verkoop alle pad voertuie in die depot
-STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP                              :{BLACK}Verkoop alle skepe in die depot
-STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP                          :{BLACK}Verkoop alle vliegtuie in die hangar
-
-STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Kry 'n lys van alle treine met die huidige depot in sy opdrae
-STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Kry 'n lys van alle pad voertuie met die huidige depot in sy opdrae
-STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Kry 'n lys van alle skepe met die huidige depot in sy opdrae
-STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Kry 'n lys van alle vliegtuie wat enige hangar by die lughawe in sy opdrae het
-
-STR_DEPOT_AUTOREPLACE_TRAIN_TIP                                 :{BLACK}Outovervang alle treine in die depot
-STR_DEPOT_AUTOREPLACE_ROADVEH_TIP                               :{BLACK}Outovervang alle pad voertuie in die depot
-STR_DEPOT_AUTOREPLACE_SHIP_TIP                                  :{BLACK}Outovervang alle skepe in die depot
-STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP                              :{BLACK}Outovervang alle vlietuie in die hangar
-
-
-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
-
-STR_MASS_STOP_DEPOT_TRAIN_TIP                                   :{BLACK}Kliek om alle treine in die depot te stop
-STR_MASS_STOP_DEPOT_ROADVEH_TIP                                 :{BLACK}Kliek om alle pad voertuie in die depot te stop
-STR_MASS_STOP_DEPOT_SHIP_TIP                                    :{BLACK}Kliek om alle skepe in die depot te stop
-STR_MASS_STOP_HANGAR_TIP                                        :{BLACK}Kliek om alle vlietuie in die hangar te stop
-
-STR_MASS_START_DEPOT_TRAIN_TIP                                  :{BLACK}Kliek om alle treine in die depot te laat ry
-STR_MASS_START_DEPOT_ROADVEH_TIP                                :{BLACK}Kliek om alle pad voertuie in die depot te laayt ry
-STR_MASS_START_DEPOT_SHIP_TIP                                   :{BLACK}Kliek om alle skepe in die depot te laat ry
-STR_MASS_START_HANGAR_TIP                                       :{BLACK}Kliek om alle vliegtuie in die hangar te laat ry
-
-STR_MASS_STOP_LIST_TIP                                          :{BLACK}Kliek om alle voertuie in die lys te stop
-STR_MASS_START_LIST_TIP                                         :{BLACK}Kliek om aller voertuie in die lys te laat ry
-
-
-
-############ Lists rail types
-
-STR_ELRAIL_VEHICLES                                             :Elektrifiseerde Spoor Voertuie
-STR_MONORAIL_VEHICLES                                           :Eenspoor Voertuie
-STR_MAGLEV_VEHICLES                                             :Maglev Voertuie
-
-############ End of list of rail types
-
-
-
-########### String for New Landscape Generator
-
-STR_GENERATE                                                    :{WHITE}Ontwikkel
-STR_LAND_GENERATOR                                              :{BLACK}Land ontwikkelaar:
-STR_HEIGHTMAP_ROTATION                                          :{BLACK}Hoogtekaart rotasie:
-STR_DATE                                                        :{BLACK}Date:
-STR_GENERATE_DATE                                               :{BLACK}{DATE_LONG}
-STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Skaal waaskuwing
-STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Te veel afskaaling van oorpsrong kaart is nie goedgekeur nie. Gaan aan met ontwikkeling?
-STR_HEIGHTMAP_NAME                                              :{BLACK}Hoogtekaart name:
-STR_HEIGHTMAP_SIZE                                              :{BLACK}Groote: {ORANGE}{NUM} x {NUM}
-STR_GENERATION_WORLD                                            :{WHITE}Wereld Ontwikkeling...
-STR_GENERATION_ABORT                                            :{BLACK}Verlaat
-STR_GENERATION_ABORT_CAPTION                                    :{WHITE}Verlaat Wereld Ontwikkeling
-STR_GENERATION_ABORT_MESSAGE                                    :{YELLOW}Wil jy rerig die ontwikkeling verlaat?
-STR_GENERATION_PROGRESS                                         :{BLACK}{NUM} / {NUM}
-STR_CLEARING_TILES                                              :{BLACK}Ru en rotserig area ontwikkeling
-STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Die aksie het die moeilikheids vlak na gewoonte verander
-STR_FLAT_WORLD_HEIGHT_DOWN                                      :{BLACK}Beweeg die hoogte van platte land een af
-STR_FLAT_WORLD_HEIGHT_UP                                        :{BLACK}Beweeg die hoogte van platte land bo een
-STR_FLAT_WORLD_HEIGHT_QUERY_CAPT                                :{WHITE}Verander die hoogte van platte land
-STR_FLAT_WORLD_HEIGHT                                           :{BLACK}Hoogte van platte land:
-STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
-
-
-########### String for new airports
-STR_CITY_AIRPORT                                                :{BLACK}Stad
-STR_METRO_AIRPORT                                               :{BLACK}Metropolitaans lughawe
-STR_INTERNATIONAL_AIRPORT                                       :{BLACK}Internasionaale lughawe
-STR_COMMUTER_AIRPORT                                            :{BLACK}Pendelaar
-STR_INTERCONTINENTAL_AIRPORT                                    :{BLACK}Tussenkontinentaal
-STR_HELIPORT                                                    :{BLACK}Helihawe
-STR_HELIDEPOT                                                   :{BLACK}Helidepot
-STR_HELISTATION                                                 :{BLACK}Helistasie
-
-STR_LARGE_AIRPORTS                                              :{BLACK}Groot Lughawe
-STR_HUB_AIRPORTS                                                :{BLACK}Naaf lughawe
-STR_HELIPORTS                                                   :{BLACK}Helikopter lughawe
-
-############ Tooltip measurment
-
-STR_MEASURE_LENGTH                                              :{BLACK}Lengte: {NUM}
-STR_MEASURE_AREA                                                :{BLACK}Area: {NUM} x {NUM}
-STR_MEASURE_LENGTH_HEIGHTDIFF                                   :{BLACK}Lengte: {NUM}{}Hoogte verskil: {NUM} m
-STR_MEASURE_AREA_HEIGHTDIFF                                     :{BLACK}Area: {NUM} x {NUM}{}Hoogte verskil: {NUM} m
-
-############ Date formatting
-
-########
-
-
-
-
-##### Mass Order
-
-
-
-
-STR_COMPANY_NAME                                                :{COMPANY}
-
-
-#### Improved sign GUI
-
-########
-
-STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Bou
--- a/src/lang/unfinished/greek.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/unfinished/greek.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1621,9 +1621,9 @@
 STR_482F_COST                                                   :{BLACK}Κόστος: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Αδύνατο να χτιστεί αυτός ο τύπος βιομηχανίας εδώ...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...το δάσος μπορεί να φυτευτεί μόνο πάνω από την γραμμή χιονιού
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}Η βιομηχανία {INDUSTRY} ανακοίνωσε άμεσο κλείσιμο!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Προβλήματα στην προμήθεια αναγκάζουν την εταιρεία {INDUSTRY} να κλείσει αμέσως!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Η έλλειψη δέντρων αναγκάζει την βιομηχανία {INDUSTRY} να κλείσει αμέσως!
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}Η βιομηχανία {STRING} ανακοίνωσε άμεσο κλείσιμο!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Προβλήματα στην προμήθεια αναγκάζουν την εταιρεία {STRING} να κλείσει αμέσως!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Η έλλειψη δέντρων αναγκάζει την βιομηχανία {STRING} να κλείσει αμέσως!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}Η βιομηχανία {INDUSTRY} ανεβάζει την παραγωγή!
 STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Νέα φλέβα άνθρακα βρέθηκε στο {INDUSTRY}!{}Η παραγωγή αναμένεται να διπλασιαστεί!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Νέα αποθέματα πετρελαίου βρέθηκαν στην {INDUSTRY}!{}Η παραγωγή αναμένεται να διπλασιαστεί!
--- a/src/lang/unfinished/latvian.txt	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/lang/unfinished/latvian.txt	Mon Dec 03 23:39:38 2007 +0000
@@ -1021,6 +1021,7 @@
 STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Transporte't kravu uz staciju tikai tad ja ir pieprasijums: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Atl'aut l'oti garu tiltu cels'anu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Atl'aut "iet uz depo" komandu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL      :kā citas industrijas
 STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Atl'aut vaira'kas li'dzi'gas industrijas vienai pilse'tai: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Viena veida industrijas var tikt celtas tuvu viena no otras: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Vienme'r ra'di't garu datumu statusa josla': {ORANGE}{STRING}
@@ -1076,6 +1077,8 @@
 
 
 
+
+
 STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Iespējot jauno mākslīgo intelektu (alpha): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Atļaut mākslīgo intelektu daudzlietotāju režīmā (eksperimentāls): {ORANGE}{STRING}
 
@@ -1298,12 +1301,12 @@
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Aizsargā jūsu spēli ar paroli, ja jūs nevēlaties, lai tā būtu publiski pieejama
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Izvēlaties karti:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Kuru karti jūs vēlaties spēlēt?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maks. klientu sk.:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Izvēlaties maksimālo klientu skaitu. Ne visiem slotiem ir jābūt aizpildītiem
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Internets
 STR_NETWORK_LAN_INTERNET                                        :LAN / Internets
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internets (reklamēt)
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Maks. klientu sk.:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Izvēlaties maksimālo klientu skaitu. Ne visiem slotiem ir jābūt aizpildītiem
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Maks. uzņēmumu sk.:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Ierobežo serveri noteiktam uzņēmumu daudzumam
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Maks. novērotāju sk.:
@@ -1343,20 +1346,42 @@
 
 
 
+STR_NETWORK_COMPANY_NAME                                        :{SILVER}Kompānijas nosaukums:  {WHITE}{STRING}
+STR_NETWORK_LAST_YEARS_INCOME                                   :{SILVER}Pagājušā gada ienākumi:  {WHITE}{CURRENCY}
 
+STR_NETWORK_PLAYERS                                             :{SILVER}Spēlētāji:  {WHITE}{STRING}
 
 STR_NETWORK_CONNECTING                                          :{WHITE}Savienojas...
 
 ############ Leave those lines in this order!!
+STR_NETWORK_CONNECTING_4                                        :{BLACK}(4/6) Lejupielādē trasi
+STR_NETWORK_CONNECTING_6                                        :{BLACK}(6/6) Reģistrējas...
 
 ############ End of leave-in-this-order
 
+STR_NETWORK_DISCONNECT                                          :{BLACK}Disconnect
 
+STR_NETWORK_GIVE_MONEY_CAPTION                                  :{WHITE}Ieraksti cik daudz naudu tu gribi dot
+STR_NETWORK_NEED_GAME_PASSWORD_CAPTION                          :{WHITE}Serveris ir aizsargāts. Ieraksti paroli
+STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION                       :{WHITE}Uzņēmums ir aizsargāts. Ieraksti paroli
+STR_NETWORK_CLIENT_LIST                                         :{WHITE}Klientu saraksts
 
+STR_NETWORK_ERR_NOSERVER                                        :{WHITE} Nevar atrast nevienu interneta spēli
+STR_NETWORK_ERR_NOCONNECTION                                    :{WHITE}Serveris neadbildēja uz pieprasījumu
+STR_NETWORK_ERR_LOSTCONNECTION                                  :{WHITE} Interneta spēlei pazudis savienojums
+STR_NETWORK_ERR_SAVEGAMEERROR                                   :{WHITE} Nevar ielādēt saglabāto spēli
+STR_NETWORK_ERR_SERVER_START                                    :{WHITE} Nevar uzsākt servara darbību
+STR_NETWORK_ERR_CLIENT_START                                    :{WHITE} Nevar savienot
+STR_NETWORK_ERR_TIMEOUT                                         :{WHITE} Savienojums #{NUM} beidzies
 STR_NETWORK_ERR_WRONG_PASSWORD                                  :{WHITE} Nepareiza Parole
+STR_NETWORK_ERR_SERVER_FULL                                     :{WHITE} Serveris ir pilns
 STR_NETWORK_ERR_SERVER_BANNED                                   :{WHITE} Jûs esat izraidîts no ðî servera
+STR_NETWORK_ERR_KICKED                                          :{WHITE} Tu esi izmests no šīs spēles
+STR_NETWORK_ERR_CHEATER                                         :{WHITE} Krāpšanās nav atļauta uz šī servera
 
+STR_NETWORK_ERR_LEFT                                            :ir atstājis spēli
 ############ Leave those lines in this order!!
+STR_NETWORK_ERR_CLIENT_GENERAL                                  :Galvanā kļūda
 STR_NETWORK_ERR_CLIENT_NAME_IN_USE                              :ðo vârdu jau lieto
 ############ End of leave-in-this-order
 
@@ -1797,17 +1822,32 @@
 
 
 
+
 ##id 0x9000
 STR_9002                                                        :{WHITE}{VEHICLE}
 STR_9012_CAPACITY                                               :{BLACK}Capacitâte: {LTBLUE}{CARGO}
 STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Cena: {CURRENCY}{}Atrums: {VELOCITY}{}Running Cost: {CURRENCY}/yr{}Capacity: {CARGO}
 
 STR_9034_RENAME                                                 :{BLACK}Pârsaukt
+STR_9038_GO_TO_ROADVEH_DEPOT                                    :Dodas uz {TOWN} ceļa mašīnu depo
 
 
 ##id 0x9800
+STR_9800_DOCK_CONSTRUCTION                                      :Ostas uzbūve
+STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}Ostas uzbūve
+STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Nevar uzbūvēt ostu šeit
+STR_9803_SHIP_DEPOT                                             :{WHITE}{TOWN} Kuģu depo
+STR_9804_NEW_SHIPS                                              :{BLACK}Jauni kuģi
 STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} Kuìi
+STR_9808_NEW_SHIPS                                              :{WHITE}Jauni kuģi
+STR_9809_BUILD_SHIP                                             :{BLACK}Uzbūvēt kuģi
+STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Kuģim jābūt apstādinātam depo
+STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Nevar pārdot kuģi...
+STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Nevar uzbūvēt kuģi...
+STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Kuģis ir ceļā
 STR_980F                                                        :{WHITE}{VEHICLE}
+STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (Detaļas)
+STR_9813_MAX_SPEED                                              :{BLACK}Maksimālais ātrums: {LTBLUE}{VELOCITY}
 STR_9820_BUILD_NEW_SHIP                                         :{BLACK}Uzbûvet jauno kuìi
 
 STR_9836_RENAME                                                 :{BLACK}Pârsaukt
@@ -1930,8 +1970,10 @@
 
 
 
-
 #### Improved sign GUI
 
 ########
 
+
+############ Face formatting
+########
--- a/src/macros.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/macros.h	Mon Dec 03 23:39:38 2007 +0000
@@ -5,338 +5,8 @@
 #ifndef MACROS_H
 #define MACROS_H
 
-/**
- * Fetch n bits from x, started at bit s.
- *
- * This macro can be used to fetch n bits from the value x. The
- * s value set the startposition to read. The startposition is
- * count from the LSB and starts at 0. The result starts at a
- * LSB, as this isn't just an and-bitmask but also some
- * bit-shifting operations. GB(0xFF, 2, 1) will so
- * return 0x01 (0000 0001) instead of
- * 0x04 (0000 0100).
- *
- * @param x The value to read some bits.
- * @param s The startposition to read some bits.
- * @param n The number of bits to read.
- * @return The selected bits, aligned to a LSB.
- */
-#define GB(x, s, n) (((x) >> (s)) & ((1U << (n)) - 1))
-
-/** Set n bits from x starting at bit s to d
- *
- * This macro sets n bits from x which started as bit s to the value of
- * d. The parameters x, s and n works the same as the parameters of
- * #GB. The result is saved in x again. Unused bits in the window
- * provided by n are set to 0 if the value of b isn't "big" enough.
- * This is not a bug, its a feature.
- *
- * @note Parameter x must be a variable as the result is saved there.
- * @note To avoid unexpecting results the value of b should not use more
- *       space as the provided space of n bits (log2)
- * @param x The variable to change some bits
- * @param s The startposition for the new bits
- * @param n The size/window for the new bits
- * @param d The actually new bits to save in the defined position.
- * @return The new value of x
- */
-#define SB(x, s, n, d) ((x) = ((x) & ~(((1U << (n)) - 1) << (s))) | ((d) << (s)))
-
-/** Add i to n bits of x starting at bit s.
- *
- * This add the value of i on n bits of x starting at bit s. The parameters x,
- * s, i are similar to #GB besides x must be a variable as the result are
- * saved there. An overflow does not affect the following bits of the given
- * bit window and is simply ignored.
- *
- * @note Parameter x must be a variable as the result is saved there.
- * @param x The variable to add some bits at some position
- * @param s The startposition of the addition
- * @param n The size/window for the addition
- * @param i The value to add at the given startposition in the given window.
- * @return The new value of x
- */
-#define AB(x, s, n, i) ((x) = ((x) & ~(((1U << (n)) - 1) << (s))) | (((x) + ((i) << (s))) & (((1U << (n)) - 1) << (s))))
-
-#ifdef min
-#undef min
-#endif
-
-#ifdef max
-#undef max
-#endif
-
-/**
- * Returns the maximum of two values.
- *
- * This function returns the greater value of two given values.
- * If they are equal the value of a is returned.
- *
- * @param a The first value
- * @param b The second value
- * @return The greater value or a if equals
- */
-template <typename T>
-static inline T max(T a, T b)
-{
-	return a >= b ? a : b;
-}
-
-/**
- * Returns the minimum of two values.
- *
- * This function returns the smaller value of two given values.
- * If they are equal the value of b is returned.
- *
- * @param a The first value
- * @param b The second value
- * @return The smaller value or b if equals
- */
-template <typename T>
-static inline T min(T a, T b)
-{
-	return a < b ? a : b;
-}
-
-/**
- * Returns the minimum of two integer.
- *
- * This function returns the smaller value of two given integers.
- *
- * @param a The first integer
- * @param b The second integer
- * @return The smaller value
- */
-static inline int min(int a, int b) { if (a <= b) return a; return b; }
-
-/**
- * Returns the minimum of two unsigned integers.
- *
- * This function returns the smaller value of two given unsigned integers.
- *
- * @param a The first unsigned integer
- * @param b The second unsigned integer
- * @return The smaller value
- */
-static inline uint minu(uint a, uint b) { if (a <= b) return a; return b; }
-
-/**
- * Clamp an integer between an interval.
- *
- * This function returns a value which is between the given interval of
- * min and max. If the given value is in this interval the value itself
- * is returned otherwise the border of the interval is returned, according
- * which side of the interval was 'left'.
- *
- * @note The min value must be less or equal of max or you get some
- *       unexpected results.
- * @param a The value to clamp/truncate.
- * @param min The minimum of the interval.
- * @param max the maximum of the interval.
- * @returns A value between min and max which is closest to a.
- * @see clampu(uint, uint, uint)
- */
-static inline int clamp(int a, int min, int max)
-{
-	if (a <= min) return min;
-	if (a >= max) return max;
-	return a;
-}
-
-/**
- * Clamp an unsigned integer between an interval.
- *
- * This function returns a value which is between the given interval of
- * min and max. If the given value is in this interval the value itself
- * is returned otherwise the border of the interval is returned, according
- * which side of the interval was 'left'.
- *
- * @note The min value must be less or equal of max or you get some
- *       unexpected results.
- * @param a The value to clamp/truncate.
- * @param min The minimum of the interval.
- * @param max the maximum of the interval.
- * @returns A value between min and max which is closest to a.
- * @see clamp(int, int, int)
- */
-static inline uint clampu(uint a, uint min, uint max)
-{
-	if (a <= min) return min;
-	if (a >= max) return max;
-	return a;
-}
-
-/**
- * Reduce a signed 64-bit int to a signed 32-bit one
- *
- * This function clamps a 64-bit integer to a 32-bit integer.
- * If the 64-bit value is smaller than the smallest 32-bit integer
- * value 0x80000000 this value is returned (the left one bit is the sign bit).
- * If the 64-bit value is greater than the greatest 32-bit integer value 0x7FFFFFFF
- * this value is returned. In all other cases the 64-bit value 'fits' in a
- * 32-bits integer field and so the value is casted to int32 and returned.
- *
- * @param a The 64-bit value to clamps
- * @return The 64-bit value reduced to a 32-bit value
- * @see clamp(int, int, int)
- */
-static inline int32 ClampToI32(int64 a)
-{
-	if (a <= (int32)0x80000000) return 0x80000000;
-	if (a >= (int32)0x7FFFFFFF) return 0x7FFFFFFF;
-	return (int32)a;
-}
-
-/**
- * Multiply two integer values and shift the results to right.
- *
- * This function multiplies two integer values. The result is
- * shifted by the amount of shift to right.
- *
- * @param a The first integer
- * @param b The second integer
- * @param shift The amount to shift the value to right.
- * @return The shifted result
- */
-static inline int32 BIGMULSS(int32 a, int32 b, int shift)
-{
-	return (int32)((int64)a * (int64)b >> shift);
-}
-
-/**
- * Multiply two unsigned integers and shift the results to right.
- *
- * This function multiplies two unsigned integers. The result is
- * shifted by the amount of shift to right.
- *
- * @param a The first unsigned integer
- * @param b The second unsigned integer
- * @param shift The amount to shift the value to right.
- * @return The shifted result
- */
-static inline uint32 BIGMULUS(uint32 a, uint32 b, int shift)
-{
-	return (uint32)((uint64)a * (uint64)b >> shift);
-}
-
-
-/**
- * Checks if a value is between a window started at some base point.
- *
- * This macro checks if the value x is between the value of base
- * and base+size. If x equals base this returns true. If x equals
- * base+size this returns false.
- *
- * @param x The value to check
- * @param base The base value of the interval
- * @param size The size of the interval
- * @return True if the value is in the interval, false else.
- */
-/* OPT: optimized into an unsigned comparison */
-//#define IS_INSIDE_1D(x, base, size) ((x) >= (base) && (x) < (base) + (size))
-#define IS_INSIDE_1D(x, base, size) ( (uint)((x) - (base)) < ((uint)(size)) )
-
-/**
- * Checks if a bit in a value is set.
- *
- * This function checks if a bit inside a value is set or not.
- * The y value specific the position of the bit, started at the
- * LSB and count from 0.
- *
- * @param x The value to check
- * @param y The position of the bit to check, started from the LSB
- * @return True if the bit is set, false else.
- */
-template<typename T> static inline bool HASBIT(T x, int y)
-{
-	return (x & ((T)1 << y)) != 0;
-}
-
-/**
- * Set a bit in a variable.
- *
- * This function sets a bit in a variable. The variable is changed
- * and the value is also returned. Parameter y defines the bit and
- * starts at the LSB with 0.
- *
- * @param x The variable to set a bit
- * @param y The bit position to set
- * @return The new value of the old value with the bit set
- */
-template<typename T> static inline T SETBIT(T& x, int y)
-{
-	return x |= (T)1 << y;
-}
-
-/**
- * Clears a bit in a variable.
- *
- * This function clears a bit in a variable. The variable is
- * changed and the value is also returned. Parameter y defines the bit
- * to clear and starts at the LSB with 0.
- *
- * @param x The variable to clear the bit
- * @param y The bit position to clear
- * @return The new value of the old value with the bit cleared
- */
-template<typename T> static inline T CLRBIT(T& x, int y)
-{
-	return x &= ~((T)1 << y);
-}
-
-/**
- * Toggles a bit in a variable.
- *
- * This function toggles a bit in a variable. The variable is
- * changed and the value is also returned. Parameter y defines the bit
- * to toggle and starts at the LSB with 0.
- *
- * @param x The varliable to toggle the bit
- * @param y The bit position to toggle
- * @return The new value of the old value with the bit toggled
- */
-template<typename T> static inline T TOGGLEBIT(T& x, int y)
-{
-	return x ^= (T)1 << y;
-}
-
-
-/* checking more bits. Maybe unneccessary, but easy to use */
-/**
- * Check several bits in a value.
- *
- * This macro checks if a value contains at least one bit of an other
- * value.
- *
- * @param x The first value
- * @param y The second value
- * @return True if at least one bit is set in both values, false else.
- */
-#define HASBITS(x, y) ((x) & (y))
-
-/**
- * Sets several bits in a variable.
- *
- * This macro sets several bits in a variable. The bits to set are provided
- * by a value. The new value is also returned.
- *
- * @param x The variable to set some bits
- * @param y The value with set bits for setting them in the variable
- * @return The new value of x
- */
-#define SETBITS(x, y) ((x) |= (y))
-
-/**
- * Clears several bits in a variable.
- *
- * This macro clears several bits in a variable. The bits to clear are
- * provided by a value. The new value is also returned.
- *
- * @param x The variable to clear some bits
- * @param y The value with set bits for clearing them in the variable
- * @return The new value of x
- */
-#define CLRBITS(x, y) ((x) &= ~(y))
+#include "core/bitmath_func.hpp"
+#include "core/math_func.hpp"
 
 #define GENERAL_SPRITE_COLOR(color) ((color) + PALETTE_RECOLOR_START)
 #define PLAYER_SPRITE_COLOR(owner) (GENERAL_SPRITE_COLOR(_player_colors[owner]))
@@ -350,186 +20,20 @@
  */
 #define IS_CUSTOM_SPRITE(sprite) ((sprite) >= SPR_SIGNALS_BASE)
 
-extern const byte _ffb_64[128];
-
-/**
- * Returns the first occure of a bit in a 6-bit value (from right).
- *
- * Returns the position of the first bit that is not zero, counted from the
- * LSB. Ie, 110100 returns 2, 000001 returns 0, etc. When x == 0 returns
- * 0.
- *
- * @param x The 6-bit value to check the first zero-bit
- * @return The first position of a bit started from the LSB or 0 if x is 0.
- */
-#define FIND_FIRST_BIT(x) _ffb_64[(x)]
-
 /**
- * Returns a value with the first occured of a bit set to zero.
- *
- * Returns x with the first bit from LSB that is not zero set
- * to zero. So, 110100 returns 110000, 000001 returns 000000, etc.
- *
- * @param x The value to returned a new value
- * @return The value which the first bit is set to zero
- */
-#define KILL_FIRST_BIT(x) _ffb_64[(x) + 64]
-
-/**
- * Finds the position of the first bit in an integer.
- *
- * This function returns the position of the first bit set in the
- * integer. It does only check the bits of the bitmask
- * 0x3F3F (0011111100111111) and checks only the
- * bits of the bitmask 0x3F00 if and only if the
- * lower part 0x00FF is 0. This results the bits at 0x00C0 must
- * be also zero to check the bits at 0x3F00.
+ * Do an operation for each set set bit in a value.
  *
- * @param value The value to check the first bits
- * @return The position of the first bit which is set
- * @see FIND_FIRST_BIT
- */
-static inline int FindFirstBit2x64(int value)
-{
-/*
-	int i = 0;
-	if ( (byte) value == 0) {
-		i += 8;
-		value >>= 8;
-	}
-	return i + FIND_FIRST_BIT(value & 0x3F);
-
-Faster ( or at least cleaner ) implementation below?
-*/
-	if (GB(value, 0, 8) == 0) {
-		return FIND_FIRST_BIT(GB(value, 8, 6)) + 8;
-	} else {
-		return FIND_FIRST_BIT(GB(value, 0, 6));
-	}
-}
-
-/**
- * Clear the first bit in an integer.
+ * This macros is used to do an operation for each set
+ * bit in a variable. The first variable can be reused
+ * in the operation due to it's the bit position counter.
+ * The second variable will be cleared during the usage
  *
- * This function returns a value where the first bit (from LSB)
- * is cleared. This function checks, similar to FindFirstBit2x64,
- * the bits at 0x3F3F.
- *
- * @param value The value to clear the first bit
- * @return The new value with the first bit cleared
- * @see KILL_FIRST_BIT
- * @see FindFirstBit2x64
- */
-static inline int KillFirstBit2x64(int value)
-{
-	if (GB(value, 0, 8) == 0) {
-		return KILL_FIRST_BIT(GB(value, 8, 6)) << 8;
-	} else {
-		return value & (KILL_FIRST_BIT(GB(value, 0, 6)) | 0x3F00);
-	}
-}
-
-/**
- * Counts the number of set bits in a variable.
- *
- * @param value the value to count the number of bits in.
- * @return the number of bits.
+ * @param i The position counter
+ * @param b The value which we check for set bits
  */
-template<typename T> static inline uint COUNTBITS(T value)
-{
-	uint num;
-
-	/* This loop is only called once for every bit set by clearing the lowest
-	 * bit in each loop. The number of bits is therefore equal to the number of
-	 * times the loop was called. It was found at the following website:
-	 * http://graphics.stanford.edu/~seander/bithacks.html */
-
-	for (num = 0; value != 0; num++) {
-		value &= (T)(value - 1);
-	}
-
-	return num;
-}
-
-/**
- * Returns true if value a has only one bit set to 1
- *
- * This macro returns true if only one bit is set.
- *
- * @param a The value to check
- * @return True if only one bit is set, false else
- */
-#define HAS_SINGLE_BIT(a) ( ((a) & ((a) - 1)) == 0)
-
-/**
- * Checks if a byte is in an interval.
- *
- * This macro returns true if a byte value is in the interval of [min, max).
- *
- * @param a The byte value to check
- * @param min The minimum of the interval
- * @param max The maximum of the interval
- * @see IS_INSIDE_1D
- */
-#define IS_BYTE_INSIDE(a, min, max) ((byte)((a) - (min)) < (byte)((max) - (min)))
-
-/**
- * Checks if an int is in an interval.
- *
- * This macro returns true if a integer value is in the interval of [min, max).
- *
- * @param a The integer value to check
- * @param min The minimum of the interval
- * @param max The maximum of the interval
- * @see IS_INSIDE_1D
- */
-#define IS_INT_INSIDE(a, min, max) ((uint)((a) - (min)) < (uint)((max) - (min)))
-
-/**
- * Flips a coin with a given probability.
- *
- * This macro can be used to get true or false randomized according to a
- * given probability. The parameter a and b create a percent value with
- * (a/b). The macro returns true in (a/b) percent.
- *
- * @param a The numerator of the fraction
- * @param b The denominator of the fraction, must of course not be null
- * @return True in (a/b) percent
- */
-#define CHANCE16(a, b) ((uint16)Random() <= (uint16)((65536 * (a)) / (b)))
-
-/**
- * Flips a coin with a given probability and saves the randomize-number in a variable.
- *
- * This macro uses the same parameters as the CHANCE16 marco. The third parameter
- * must be a variable the randomize-number from Random() is saved in.
- *
- * @param a The numerator of the fraction, see CHANCE16
- * @param b The denominator of the fraction, see CHANCE16
- * @param r The variable to save the randomize-number from Random()
- * @return True in (a/b) percent
- */
-#define CHANCE16R(a, b, r) ((uint16)(r = Random()) <= (uint16)((65536 * (a)) / (b)))
-
-/**
- * Checks if a given randomize-number is below a given probability.
- *
- * This macro is used to check if the given probability by the fraction of (a/b)
- * is greater than the given randomize-number v.
- *
- * @param a The numerator of the fraction, see CHANCE16
- * @param b The denominator of the fraction, see CHANCE16
- * @param v The given randomize-number
- * @return True if v is less or equals (a/b)
- */
-#define CHANCE16I(a, b, v) ((uint16)(v) <= (uint16)((65536 * (a)) / (b)))
-
-
-#define for_each_bit(_i, _b)            \
-	for (_i = 0; _b != 0; _i++, _b >>= 1) \
-		if (_b & 1)
-
-#define abs myabs
+#define FOR_EACH_SET_BIT(i, b)            \
+	for (i = 0; b != 0; i++, b >>= 1) \
+		if (b & 1)
 
 
 static inline uint16 ReadLE16Aligned(const void* x)
@@ -547,19 +51,6 @@
 }
 
 
-/**
- * ROtate x Left/Right by n (must be >= 0)
- * @note Assumes a byte has 8 bits
- */
-#define ROL(x, n) ((x) << (n) | (x) >> (sizeof(x) * 8 - (n)))
-#define ROR(x, n) ((x) >> (n) | (x) << (sizeof(x) * 8 - (n)))
-
-/**
- * Return the smallest multiple of n equal or greater than x
- * @note n must be a power of 2
- */
-#define ALIGN(x, n) (((x) + (n) - 1) & ~((n) - 1))
-
 /** return the largest value that can be entered in a variable.
  */
 #define MAX_UVALUE(type) ((type)~(type)0)
--- a/src/main_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/main_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -19,6 +19,7 @@
 #include "viewport.h"
 #include "gfx.h"
 #include "player.h"
+#include "road.h"
 #include "command.h"
 #include "news.h"
 #include "town.h"
@@ -47,6 +48,7 @@
 #include "network/network_server.h"
 #include "network/network_gui.h"
 #include "industry.h"
+#include "transparency.h"
 
 static int _rename_id = 1;
 static int _rename_what = -1;
@@ -94,7 +96,7 @@
 		const Player *p = GetPlayer(_current_player);
 		Money money = min(p->player_money - p->current_loan, (Money)(atoi(str) / _currency->rate));
 
-		uint32 money_c = clamp(ClampToI32(money), 0, 20000000); // Clamp between 20 million and 0
+		uint32 money_c = Clamp(ClampToI32(money), 0, 20000000); // Clamp between 20 million and 0
 
 		/* Give 'id' the money, and substract it from ourself */
 		DoCommandP(0, money_c, id, CcGiveMoney, CMD_GIVE_MONEY | CMD_MSG(STR_INSUFFICIENT_FUNDS));
@@ -117,20 +119,20 @@
  * @param placeproc Procedure which will be called when someone clicks on the map
  * @return true if the button is clicked, false if it's unclicked
  */
-bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, int mode, PlaceProc *placeproc)
+bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, ViewportHighlightMode mode, PlaceProc *placeproc)
 {
-	if (IsWindowWidgetDisabled(w, widget)) return false;
+	if (w->IsWidgetDisabled(widget)) return false;
 
 	SndPlayFx(SND_15_BEEP);
 	SetWindowDirty(w);
 
-	if (IsWindowWidgetLowered(w, widget)) {
+	if (w->IsWidgetLowered(widget)) {
 		ResetObjectToPlace();
 		return false;
 	}
 
 	SetObjectToPlace(cursor, PAL_NONE, mode, w->window_class, w->window_number);
-	LowerWindowWidget(w, widget);
+	w->LowerWidget(widget);
 	_place_proc = placeproc;
 	return true;
 }
@@ -156,22 +158,6 @@
 }
 
 
-/** Toggle all transparency options, except for signs */
-static void ToggleTransparency()
-{
-	static byte trans_opt = ~0;
-
-	if (GB(_transparent_opt, 1, 7) == 0) {
-		SB(_transparent_opt, 1, 7, GB(trans_opt, 1, 7));
-	} else {
-		trans_opt = _transparent_opt;
-		SB(_transparent_opt, 1, 7, 0);
-	}
-
-	MarkWholeScreenDirty();
-}
-
-
 static void MenuClickSettings(int index)
 {
 	switch (index) {
@@ -181,14 +167,17 @@
 		case 3: ShowNewGRFSettings(!_networking, true, true, &_grfconfig);   return;
 		case 4: ShowTransparencyToolbar(); break;
 
-		case  6: TOGGLEBIT(_display_opt, DO_SHOW_TOWN_NAMES);    break;
-		case  7: TOGGLEBIT(_display_opt, DO_SHOW_STATION_NAMES); break;
-		case  8: TOGGLEBIT(_display_opt, DO_SHOW_SIGNS);         break;
-		case  9: TOGGLEBIT(_display_opt, DO_WAYPOINTS);          break;
-		case 10: TOGGLEBIT(_display_opt, DO_FULL_ANIMATION);     break;
-		case 11: TOGGLEBIT(_display_opt, DO_FULL_DETAIL);        break;
-		case 12: ToggleTransparency(); break;
-		case 13: TOGGLEBIT(_transparent_opt, TO_SIGNS); break;
+		case  6: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES);    break;
+		case  7: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
+		case  8: ToggleBit(_display_opt, DO_SHOW_SIGNS);         break;
+		case  9: ToggleBit(_display_opt, DO_WAYPOINTS);          break;
+		case 10: ToggleBit(_display_opt, DO_FULL_ANIMATION);     break;
+		case 11: ToggleBit(_display_opt, DO_FULL_DETAIL);        break;
+		case 12:
+			ToggleTransparency(TO_TREES);
+			ToggleTransparency(TO_HOUSES);
+			break;
+		case 13: ToggleTransparency(TO_SIGNS);                   break;
 	}
 	MarkWholeScreenDirty();
 }
@@ -363,7 +352,7 @@
 	if (_cursor.sprite == SPR_CURSOR_SIGN) {
 		ResetObjectToPlace();
 	} else {
-		SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, 1, WC_MAIN_TOOLBAR, 0);
+		SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, VHM_RECT, WC_MAIN_TOOLBAR, 0);
 		_place_proc = PlaceProc_Sign;
 	}
 }
@@ -465,10 +454,10 @@
 		y = 1;
 
 		for (; count != 0; count--, string++, sel--) {
-			byte color = HASBIT(dis, 0) ? 14 : (sel == 0) ? 12 : 16;
+			TextColour color = HasBit(dis, 0) ? TC_GREY : (sel == 0) ? TC_WHITE : TC_BLACK;
 			if (sel == 0) GfxFillRect(x, y, x + w->width - 3, y + 9, 0);
 
-			if (HASBIT(chk, 0)) DrawString(x + 2, y, STR_CHECKMARK, color);
+			if (HasBit(chk, 0)) DrawString(x + 2, y, STR_CHECKMARK, color);
 			DrawString(x + 2, y, string, color);
 
 			y += 10;
@@ -479,7 +468,7 @@
 
 	case WE_DESTROY: {
 			Window *v = FindWindowById(WC_MAIN_TOOLBAR, 0);
-			RaiseWindowWidget(v, WP(w,menu_d).main_button);
+			v->RaiseWidget(WP(w,menu_d).main_button);
 			SetWindowDirty(v);
 			return;
 		}
@@ -566,7 +555,8 @@
 	switch (e->event) {
 	case WE_PAINT: {
 		int x,y;
-		byte sel, color;
+		byte sel;
+		TextColour color;
 		Player *p;
 		uint16 chk;
 
@@ -583,7 +573,7 @@
 			if (sel == 0) {
 				GfxFillRect(x, y, x + 238, y + 9, 0);
 			}
-			DrawString(x + 19, y, STR_NETWORK_CLIENT_LIST, 0x0);
+			DrawString(x + 19, y, STR_NETWORK_CLIENT_LIST, TC_FROMSTRING);
 			y += 10;
 			sel--;
 		}
@@ -599,8 +589,8 @@
 				SetDParam(0, p->index);
 				SetDParam(1, p->index);
 
-				color = (p->index == sel) ? 0xC : 0x10;
-				if (chk&1) color = 14;
+				color = (p->index == sel) ? TC_WHITE : TC_BLACK;
+				if (chk&1) color = TC_GREY;
 				DrawString(x + 19, y, STR_7021, color);
 
 				y += 10;
@@ -613,7 +603,7 @@
 
 	case WE_DESTROY: {
 		Window *v = FindWindowById(WC_MAIN_TOOLBAR, 0);
-		RaiseWindowWidget(v, WP(w,menu_d).main_button);
+		v->RaiseWidget(WP(w,menu_d).main_button);
 		SetWindowDirty(v);
 		return;
 		}
@@ -715,7 +705,7 @@
 	int x = w->widget[GB(parent_button, 0, 8)].left;
 
 	assert(disabled_mask == 0 || item_count <= 8);
-	LowerWindowWidget(w, parent_button);
+	w->LowerWidget(parent_button);
 	InvalidateWidget(w, parent_button);
 
 	DeleteWindowById(WC_TOOLBAR_MENU, 0);
@@ -726,7 +716,7 @@
 	 * we clicked on and w->left the toolbar window itself. So meaning that
 	 * the default position is aligned with the left side of the clicked button */
 	width = max(GetStringListMaxWidth(base_string, item_count) + 6, 140);
-	x = w->left + clamp(x, 0, w->width - width); // or alternatively '_screen.width - width'
+	x = w->left + Clamp(x, 0, w->width - width); // or alternatively '_screen.width - width'
 
 	w = AllocateWindow(x, 22, width, item_count * 10 + 2, MenuWndProc, WC_TOOLBAR_MENU, _menu_widgets);
 	w->widget[0].bottom = item_count * 10 + 1;
@@ -750,7 +740,7 @@
 {
 	int x = w->widget[main_button].left + w->left;
 
-	LowerWindowWidget(w, main_button);
+	w->LowerWidget(main_button);
 	InvalidateWidget(w, main_button);
 
 	DeleteWindowById(WC_TOOLBAR_MENU, 0);
@@ -832,7 +822,7 @@
 	int dis = -1;
 
 	FOR_ALL_VEHICLES(v) {
-		if (v->type == VEH_TRAIN && IsFrontEngine(v)) CLRBIT(dis, v->owner);
+		if (v->type == VEH_TRAIN && IsFrontEngine(v)) ClrBit(dis, v->owner);
 	}
 	PopupMainPlayerToolbMenu(w, 13, dis);
 }
@@ -843,7 +833,7 @@
 	int dis = -1;
 
 	FOR_ALL_VEHICLES(v) {
-		if (v->type == VEH_ROAD && IsRoadVehFront(v)) CLRBIT(dis, v->owner);
+		if (v->type == VEH_ROAD && IsRoadVehFront(v)) ClrBit(dis, v->owner);
 	}
 	PopupMainPlayerToolbMenu(w, 14, dis);
 }
@@ -854,7 +844,7 @@
 	int dis = -1;
 
 	FOR_ALL_VEHICLES(v) {
-		if (v->type == VEH_SHIP) CLRBIT(dis, v->owner);
+		if (v->type == VEH_SHIP) ClrBit(dis, v->owner);
 	}
 	PopupMainPlayerToolbMenu(w, 15, dis);
 }
@@ -865,7 +855,7 @@
 	int dis = -1;
 
 	FOR_ALL_VEHICLES(v) {
-		if (v->type == VEH_AIRCRAFT) CLRBIT(dis, v->owner);
+		if (v->type == VEH_AIRCRAFT) ClrBit(dis, v->owner);
 	}
 	PopupMainPlayerToolbMenu(w, 16, dis);
 }
@@ -941,7 +931,7 @@
 {
 	const Player *p = GetPlayer(_local_player);
 	/* The standard road button is *always* available */
-	Window *w2 = PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 2, ~(p->avail_roadtypes | 1));
+	Window *w2 = PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 2, ~(p->avail_roadtypes | ROADTYPES_ROAD));
 	WP(w2, menu_d).sel_index = _last_built_roadtype;
 }
 
@@ -981,14 +971,14 @@
 
 	w = PopupMainToolbMenu(w, 2, STR_02C3_GAME_OPTIONS, 14, 0);
 
-	if (HASBIT(_display_opt, DO_SHOW_TOWN_NAMES))    SETBIT(x,  6);
-	if (HASBIT(_display_opt, DO_SHOW_STATION_NAMES)) SETBIT(x,  7);
-	if (HASBIT(_display_opt, DO_SHOW_SIGNS))         SETBIT(x,  8);
-	if (HASBIT(_display_opt, DO_WAYPOINTS))          SETBIT(x,  9);
-	if (HASBIT(_display_opt, DO_FULL_ANIMATION))     SETBIT(x, 10);
-	if (HASBIT(_display_opt, DO_FULL_DETAIL))        SETBIT(x, 11);
-	if (GB(_transparent_opt, 1, 7) != 0)      SETBIT(x, 12);
-	if (HASBIT(_transparent_opt, TO_SIGNS))   SETBIT(x, 13);
+	if (HasBit(_display_opt, DO_SHOW_TOWN_NAMES))    SetBit(x,  6);
+	if (HasBit(_display_opt, DO_SHOW_STATION_NAMES)) SetBit(x,  7);
+	if (HasBit(_display_opt, DO_SHOW_SIGNS))         SetBit(x,  8);
+	if (HasBit(_display_opt, DO_WAYPOINTS))          SetBit(x,  9);
+	if (HasBit(_display_opt, DO_FULL_ANIMATION))     SetBit(x, 10);
+	if (HasBit(_display_opt, DO_FULL_DETAIL))        SetBit(x, 11);
+	if (IsTransparencySet(TO_HOUSES) && IsTransparencySet(TO_TREES)) SetBit(x, 12);
+	if (IsTransparencySet(TO_SIGNS))                     SetBit(x, 13);
 	WP(w,menu_d).checked_items = x;
 }
 
@@ -1005,7 +995,7 @@
 		HandleButtonClick(w, 6);
 		SetWindowDirty(w);
 
-		_patches_newgame.starting_year = clamp(_patches_newgame.starting_year - 1, MIN_YEAR, MAX_YEAR);
+		_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year - 1, MIN_YEAR, MAX_YEAR);
 		SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
 	}
 	_left_button_clicked = false;
@@ -1018,7 +1008,7 @@
 		HandleButtonClick(w, 7);
 		SetWindowDirty(w);
 
-		_patches_newgame.starting_year = clamp(_patches_newgame.starting_year + 1, MIN_YEAR, MAX_YEAR);
+		_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year + 1, MIN_YEAR, MAX_YEAR);
 		SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
 	}
 	_left_button_clicked = false;
@@ -1207,42 +1197,42 @@
  */
 static void EditorTerraformClick_Dynamite(Window *w)
 {
-	HandlePlacePushButton(w, 4, ANIMCURSOR_DEMOLISH, 1, PlaceProc_DemolishArea);
+	HandlePlacePushButton(w, 4, ANIMCURSOR_DEMOLISH, VHM_RECT, PlaceProc_DemolishArea);
 }
 
 static void EditorTerraformClick_LowerBigLand(Window *w)
 {
-	HandlePlacePushButton(w, 5, ANIMCURSOR_LOWERLAND, 2, PlaceProc_LowerBigLand);
+	HandlePlacePushButton(w, 5, ANIMCURSOR_LOWERLAND, VHM_POINT, PlaceProc_LowerBigLand);
 }
 
 static void EditorTerraformClick_RaiseBigLand(Window *w)
 {
-	HandlePlacePushButton(w, 6, ANIMCURSOR_RAISELAND, 2, PlaceProc_RaiseBigLand);
+	HandlePlacePushButton(w, 6, ANIMCURSOR_RAISELAND, VHM_POINT, PlaceProc_RaiseBigLand);
 }
 
 static void EditorTerraformClick_LevelLand(Window *w)
 {
-	HandlePlacePushButton(w, 7, SPR_CURSOR_LEVEL_LAND, 2, PlaceProc_LevelLand);
+	HandlePlacePushButton(w, 7, SPR_CURSOR_LEVEL_LAND, VHM_POINT, PlaceProc_LevelLand);
 }
 
 static void EditorTerraformClick_WaterArea(Window *w)
 {
-	HandlePlacePushButton(w, 8, SPR_CURSOR_CANAL, 1, PlaceProc_WaterArea);
+	HandlePlacePushButton(w, 8, SPR_CURSOR_CANAL, VHM_RECT, PlaceProc_WaterArea);
 }
 
 static void EditorTerraformClick_RockyArea(Window *w)
 {
-	HandlePlacePushButton(w, 9, SPR_CURSOR_ROCKY_AREA, 1, PlaceProc_RockyArea);
+	HandlePlacePushButton(w, 9, SPR_CURSOR_ROCKY_AREA, VHM_RECT, PlaceProc_RockyArea);
 }
 
 static void EditorTerraformClick_DesertLightHouse(Window *w)
 {
-	HandlePlacePushButton(w, 10, SPR_CURSOR_LIGHTHOUSE, 1, (_opt.landscape == LT_TROPIC) ? PlaceProc_DesertArea : PlaceProc_LightHouse);
+	HandlePlacePushButton(w, 10, SPR_CURSOR_LIGHTHOUSE, VHM_RECT, (_opt.landscape == LT_TROPIC) ? PlaceProc_DesertArea : PlaceProc_LightHouse);
 }
 
 static void EditorTerraformClick_Transmitter(Window *w)
 {
-	HandlePlacePushButton(w, 11, SPR_CURSOR_TRANSMITTER, 1, PlaceProc_Transmitter);
+	HandlePlacePushButton(w, 11, SPR_CURSOR_TRANSMITTER, VHM_RECT, PlaceProc_Transmitter);
 }
 
 static const uint16 _editor_terraform_keycodes[] = {
@@ -1319,7 +1309,7 @@
 			} while (--n);
 		}
 
-		if (IsWindowWidgetLowered(w, 5) || IsWindowWidgetLowered(w, 6)) // change area-size if raise/lower corner is selected
+		if (w->IsWidgetLowered(5) || w->IsWidgetLowered(6)) // change area-size if raise/lower corner is selected
 			SetTileSelectSize(_terraform_size, _terraform_size);
 
 		break;
@@ -1346,7 +1336,7 @@
 			HandleButtonClick(w, e->we.click.widget);
 			size += _terraform_size;
 
-			if (!IS_INT_INSIDE(size, 1, 8 + 1)) return;
+			if (!IsInsideMM(size, 1, 8 + 1)) return;
 			_terraform_size = size;
 
 			SndPlayFx(SND_15_BEEP);
@@ -1369,8 +1359,8 @@
 	case WE_TIMEOUT: {
 		uint i;
 		for (i = 0; i < w->widget_count; i++) {
-			if (IsWindowWidgetLowered(w, i)) {
-				RaiseWindowWidget(w, i);
+			if (w->IsWidgetLowered(i)) {
+				w->RaiseWidget(i);
 				InvalidateWidget(w, i);
 			}
 			if (i == 3) i = 11;
@@ -1466,13 +1456,13 @@
 		break;
 
 	case WE_CREATE:
-		LowerWindowWidget(w, _scengen_town_size + 7);
+		w->LowerWidget(_scengen_town_size + 7);
 		break;
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
 		case 4: // new town
-			HandlePlacePushButton(w, 4, SPR_CURSOR_TOWN, 1, PlaceProc_Town);
+			HandlePlacePushButton(w, 4, SPR_CURSOR_TOWN, VHM_RECT, PlaceProc_Town);
 			break;
 		case 5: {// random town
 			Town *t;
@@ -1502,17 +1492,17 @@
 		}
 
 		case 7: case 8: case 9: case 10:
-			RaiseWindowWidget(w, _scengen_town_size + 7);
+			w->RaiseWidget(_scengen_town_size + 7);
 			_scengen_town_size = e->we.click.widget - 7;
-			LowerWindowWidget(w, _scengen_town_size + 7);
+			w->LowerWidget(_scengen_town_size + 7);
 			SetWindowDirty(w);
 			break;
 		}
 		break;
 
 	case WE_TIMEOUT:
-		RaiseWindowWidget(w, 5);
-		RaiseWindowWidget(w, 6);
+		w->RaiseWidget(5);
+		w->RaiseWidget(6);
 		SetWindowDirty(w);
 		break;
 	case WE_PLACE_OBJ:
@@ -1520,7 +1510,7 @@
 		break;
 	case WE_ABORT_PLACE_OBJ:
 		RaiseWindowButtons(w);
-		LowerWindowWidget(w, _scengen_town_size + 7);
+		w->LowerWidget(_scengen_town_size + 7);
 		SetWindowDirty(w);
 		break;
 	}
@@ -1618,18 +1608,18 @@
 		/* If spectator, disable all construction buttons
 		 * ie : Build road, rail, ships, airports and landscaping
 		 * Since enabled state is the default, just disable when needed */
-		SetWindowWidgetsDisabledState(w, _current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END);
+		w->SetWidgetsDisabledState(_current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END);
 		/* disable company list drop downs, if there are no companies */
-		SetWindowWidgetsDisabledState(w, ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END);
+		w->SetWidgetsDisabledState(ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END);
 
-		SetWindowWidgetDisabledState(w, 19, !CanBuildVehicleInfrastructure(VEH_TRAIN));
-		SetWindowWidgetDisabledState(w, 22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
+		w->SetWidgetDisabledState(19, !CanBuildVehicleInfrastructure(VEH_TRAIN));
+		w->SetWidgetDisabledState(22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
 
 		DrawWindowWidgets(w);
 		break;
 
 	case WE_CLICK: {
-		if (_game_mode != GM_MENU && !IsWindowWidgetDisabled(w, e->we.click.widget))
+		if (_game_mode != GM_MENU && !w->IsWidgetDisabled(e->we.click.widget))
 			_toolbar_button_procs[e->we.click.widget](w);
 	} break;
 
@@ -1682,18 +1672,18 @@
 	} break;
 
 	case WE_ABORT_PLACE_OBJ: {
-		RaiseWindowWidget(w, 25);
+		w->RaiseWidget(25);
 		SetWindowDirty(w);
 	} break;
 
 	case WE_MOUSELOOP:
-		if (IsWindowWidgetLowered(w, 0) != !!_pause_game) {
-			ToggleWidgetLoweredState(w, 0);
+		if (w->IsWidgetLowered(0) != !!_pause_game) {
+			w->ToggleWidgetLoweredState(0);
 			InvalidateWidget(w, 0);
 		}
 
-		if (IsWindowWidgetLowered(w, 1) != !!_fast_forward) {
-			ToggleWidgetLoweredState(w, 1);
+		if (w->IsWidgetLowered(1) != !!_fast_forward) {
+			w->ToggleWidgetLoweredState(1);
 			InvalidateWidget(w, 1);
 		}
 		break;
@@ -1728,8 +1718,8 @@
 	case WE_TIMEOUT: {
 		uint i;
 		for (i = 2; i < w->widget_count; i++) {
-			if (IsWindowWidgetLowered(w, i)) {
-				RaiseWindowWidget(w, i);
+			if (w->IsWidgetLowered(i)) {
+				w->RaiseWidget(i);
 				InvalidateWidget(w, i);
 			}
 		}
@@ -1859,8 +1849,8 @@
 {
 	switch (e->event) {
 	case WE_PAINT:
-		SetWindowWidgetDisabledState(w, 6, _patches_newgame.starting_year <= MIN_YEAR);
-		SetWindowWidgetDisabledState(w, 7, _patches_newgame.starting_year >= MAX_YEAR);
+		w->SetWidgetDisabledState(6, _patches_newgame.starting_year <= MIN_YEAR);
+		w->SetWidgetDisabledState(7, _patches_newgame.starting_year >= MAX_YEAR);
 
 		/* Draw brown-red toolbar bg. */
 		GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
@@ -1869,12 +1859,12 @@
 		DrawWindowWidgets(w);
 
 		SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
-		DrawStringCenteredTruncated(w->widget[6].right, w->widget[7].left, 6, STR_00AF, 0);
+		DrawStringCenteredTruncated(w->widget[6].right, w->widget[7].left, 6, STR_00AF, TC_FROMSTRING);
 
 		/* We hide this panel when the toolbar space gets too small */
 		if (w->widget[4].left != w->widget[4].right) {
-			DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1,  1, STR_0221_OPENTTD, 0);
-			DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, 0);
+			DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1,  1, STR_0221_OPENTTD, TC_FROMSTRING);
+			DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING);
 		}
 
 		break;
@@ -1910,7 +1900,7 @@
 	} break;
 
 	case WE_ABORT_PLACE_OBJ: {
-		RaiseWindowWidget(w, 25);
+		w->RaiseWidget(25);
 		SetWindowDirty(w);
 	} break;
 
@@ -1981,13 +1971,13 @@
 	} break;
 
 	case WE_MOUSELOOP:
-		if (IsWindowWidgetLowered(w, 0) != !!_pause_game) {
-			ToggleWidgetLoweredState(w, 0);
+		if (w->IsWidgetLowered(0) != !!_pause_game) {
+			w->ToggleWidgetLoweredState(0);
 			SetWindowDirty(w);
 		}
 
-		if (IsWindowWidgetLowered(w, 1) != !!_fast_forward) {
-			ToggleWidgetLoweredState(w, 1);
+		if (w->IsWidgetLowered(1) != !!_fast_forward) {
+			w->ToggleWidgetLoweredState(1);
 			SetWindowDirty(w);
 		}
 		break;
@@ -2019,7 +2009,7 @@
 	int x;
 	char buffer[256];
 
-	if (ni->display_mode == 3) {
+	if (ni->display_mode == NM_CALLBACK) {
 		str = _get_news_string_callback[ni->callback](ni);
 	} else {
 		CopyInDParam(0, ni->params, lengthof(ni->params));
@@ -2049,7 +2039,7 @@
 	old_dpi = _cur_dpi;
 	_cur_dpi = &tmp_dpi;
 
-	x = DoDrawString(buffer, pos, 0, 13);
+	x = DoDrawString(buffer, pos, 0, TC_LIGHT_BLUE);
 	_cur_dpi = old_dpi;
 
 	return x > 0;
@@ -2064,22 +2054,22 @@
 		DrawWindowWidgets(w);
 		SetDParam(0, _date);
 		DrawStringCentered(
-			70, 1, (_pause_game || _patches.status_long_date) ? STR_00AF : STR_00AE, 0
+			70, 1, (_pause_game || _patches.status_long_date) ? STR_00AF : STR_00AE, TC_FROMSTRING
 		);
 
 		if (p != NULL) {
 			/* Draw player money */
 			SetDParam(0, p->player_money);
-			DrawStringCentered(w->widget[2].left + 70, 1, STR_0004, 0);
+			DrawStringCentered(w->widget[2].left + 70, 1, STR_0004, TC_FROMSTRING);
 		}
 
 		/* Draw status bar */
 		if (w->message.msg) { // true when saving is active
-			DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_SAVING_GAME, 0);
+			DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_SAVING_GAME, TC_FROMSTRING);
 		} else if (_do_autosave) {
-			DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_032F_AUTOSAVE, 0);
+			DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_032F_AUTOSAVE, TC_FROMSTRING);
 		} else if (_pause_game) {
-			DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_0319_PAUSED, 0);
+			DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_0319_PAUSED, TC_FROMSTRING);
 		} else if (WP(w,def_d).data_1 > -1280 && FindWindowById(WC_NEWS_WINDOW,0) == NULL && _statusbar_news_item.string_id != 0) {
 			/* Draw the scrolling news text */
 			if (!DrawScrollingStatusText(&_statusbar_news_item, WP(w,def_d).data_1, w->widget[1].right - w->widget[1].left - 2)) {
@@ -2087,14 +2077,14 @@
 				if (p != NULL) {
 					/* This is the default text */
 					SetDParam(0, p->index);
-					DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_02BA, 0);
+					DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_02BA, TC_FROMSTRING);
 				}
 			}
 		} else {
 			if (p != NULL) {
 				/* This is the default text */
 				SetDParam(0, p->index);
-				DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_02BA, 0);
+				DrawStringCenteredTruncated(w->widget[1].left + 1, w->widget[1].right - 1, 1, STR_02BA, TC_FROMSTRING);
 			}
 		}
 
@@ -2258,8 +2248,9 @@
 			case '5' | WKC_CTRL:
 			case '6' | WKC_CTRL:
 			case '7' | WKC_CTRL:
+			case '8' | WKC_CTRL:
 				/* Transparency toggle hot keys */
-				TOGGLEBIT(_transparent_opt, e->we.keypress.keycode - ('1' | WKC_CTRL));
+				ToggleTransparency((TransparencyOption)(e->we.keypress.keycode - ('1' | WKC_CTRL)));
 				MarkWholeScreenDirty();
 				break;
 
@@ -2268,7 +2259,7 @@
 				break;
 
 			case 'X':
-				ToggleTransparency();
+				ResetRestoreAllTransparency();
 				break;
 
 #ifdef ENABLE_NETWORK
@@ -2383,8 +2374,8 @@
 
 	CLRBITS(w->flags4, WF_WHITE_BORDER_MASK);
 
-	SetWindowWidgetDisabledState(w, 0, _networking && !_network_server); // if not server, disable pause button
-	SetWindowWidgetDisabledState(w, 1, _networking); // if networking, disable fast-forward button
+	w->SetWidgetDisabledState(0, _networking && !_network_server); // if not server, disable pause button
+	w->SetWidgetDisabledState(1, _networking); // if networking, disable fast-forward button
 
 	/* 'w' is for sure a WC_MAIN_TOOLBAR */
 	PositionMainToolbar(w);
@@ -2417,3 +2408,4 @@
 
 
 
+
--- a/src/map.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/map.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -184,8 +184,8 @@
  */
 uint DistanceManhattan(TileIndex t0, TileIndex t1)
 {
-	const uint dx = delta(TileX(t0), TileX(t1));
-	const uint dy = delta(TileY(t0), TileY(t1));
+	const uint dx = Delta(TileX(t0), TileX(t1));
+	const uint dy = Delta(TileY(t0), TileY(t1));
 	return dx + dy;
 }
 
@@ -216,9 +216,9 @@
  */
 uint DistanceMax(TileIndex t0, TileIndex t1)
 {
-	const uint dx = delta(TileX(t0), TileX(t1));
-	const uint dy = delta(TileY(t0), TileY(t1));
-	return dx > dy ? dx : dy;
+	const uint dx = Delta(TileX(t0), TileX(t1));
+	const uint dy = Delta(TileY(t0), TileY(t1));
+	return max(dx, dy);
 }
 
 
@@ -232,8 +232,8 @@
  */
 uint DistanceMaxPlusManhattan(TileIndex t0, TileIndex t1)
 {
-	const uint dx = delta(TileX(t0), TileX(t1));
-	const uint dy = delta(TileY(t0), TileY(t1));
+	const uint dx = Delta(TileX(t0), TileX(t1));
+	const uint dy = Delta(TileY(t0), TileY(t1));
 	return dx > dy ? 2 * dx + dy : 2 * dy + dx;
 }
 
@@ -248,9 +248,9 @@
 	const uint yl = TileY(tile);
 	const uint xh = MapSizeX() - 1 - xl;
 	const uint yh = MapSizeY() - 1 - yl;
-	const uint minl = xl < yl ? xl : yl;
-	const uint minh = xh < yh ? xh : yh;
-	return minl < minh ? minl : minh;
+	const uint minl = min(xl, yl);
+	const uint minh = min(xh, yh);
+	return min(minl, minh);
 }
 
 /*!
--- a/src/mersenne.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/* $Id$ */
-
-/** @file mersenne.cpp */
-
-#include "stdafx.h"
-#include "openttd.h"
-
-#ifdef MERSENNE_TWISTER
-
-// Source code for Mersenne Twister.
-// A Random number generator with much higher quality random numbers.
-
-#define N              (624)                 // length of _mt_state vector
-#define M              (397)                 // a period parameter
-#define K              (0x9908B0DFU)         // a magic constant
-#define hiBit(u)       ((u) & 0x80000000U)   // mask all but highest   bit of u
-#define loBit(u)       ((u) & 0x00000001U)   // mask all but lowest    bit of u
-#define loBits(u)      ((u) & 0x7FFFFFFFU)   // mask     the highest   bit of u
-#define mixBits(u, v)  (hiBit(u)|loBits(v))  // move hi bit of u to hi bit of v
-
-static uint32   _mt_state[N+1];     // _mt_state vector + 1 extra to not violate ANSI C
-static uint32   *_mt_next;          // _mt_next random value is computed from here
-static int      _mt_left = -1;      // can *_mt_next++ this many times before reloading
-
-void SeedMT(uint32 seed)
-{
-    register uint32 x = (seed | 1U) & 0xFFFFFFFFU, *s = _mt_state;
-    register int    j;
-
-    for (_mt_left=0, *s++=x, j=N; --j;
-        *s++ = (x*=69069U) & 0xFFFFFFFFU);
- }
-
-
-static uint32 ReloadMT()
- {
-    register uint32 *p0=_mt_state, *p2=_mt_state+2, *pM=_mt_state+M, s0, s1;
-    register int    j;
-
-    if (_mt_left < -1)
-        SeedMT(4357U);
-
-    _mt_left=N-1, _mt_next=_mt_state+1;
-
-    for (s0=_mt_state[0], s1=_mt_state[1], j=N-M+1; --j; s0=s1, s1=*p2++)
-        *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
-
-    for (pM=_mt_state, j=M; --j; s0=s1, s1=*p2++)
-        *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
-
-    s1=_mt_state[0], *p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
-    s1 ^= (s1 >> 11);
-    s1 ^= (s1 <<  7) & 0x9D2C5680U;
-    s1 ^= (s1 << 15) & 0xEFC60000U;
-    return(s1 ^ (s1 >> 18));
- }
-
-
-uint32 RandomMT()
-{
-	uint32 y;
-
-	if (--_mt_left < 0)
-		return ReloadMT();
-
-	y  = *_mt_next++;
-	y ^= (y >> 11);
-	y ^= (y <<  7) & 0x9D2C5680U;
-	y ^= (y << 15) & 0xEFC60000U;
-	return y ^ (y >> 18);
-}
-#else
-
-void SeedMT(uint32 seed) {}
-
-#endif /* MERSENNE_TWISTER */
--- a/src/misc.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/misc.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -23,60 +23,10 @@
 #include "date.h"
 #include "cargotype.h"
 #include "group.h"
+#include "viewport.h"
 
 char _name_array[512][32];
 
-#ifndef MERSENNE_TWISTER
-
-#ifdef RANDOM_DEBUG
-#include "network/network_data.h"
-uint32 DoRandom(int line, const char *file)
-#else // RANDOM_DEBUG
-uint32 Random()
-#endif // RANDOM_DEBUG
-{
-
-uint32 s;
-uint32 t;
-
-#ifdef RANDOM_DEBUG
-	if (_networking && (DEREF_CLIENT(0)->status != STATUS_INACTIVE || !_network_server))
-		printf("Random [%d/%d] %s:%d\n",_frame_counter, (byte)_current_player, file, line);
-#endif
-
-	s = _random_seeds[0][0];
-	t = _random_seeds[0][1];
-	_random_seeds[0][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
-	return _random_seeds[0][1] = ROR(s, 3) - 1;
-}
-#endif // MERSENNE_TWISTER
-
-#if defined(RANDOM_DEBUG) && !defined(MERSENNE_TWISTER)
-uint DoRandomRange(uint max, int line, const char *file)
-{
-	return GB(DoRandom(line, file), 0, 16) * max >> 16;
-}
-#else
-uint RandomRange(uint max)
-{
-	return GB(Random(), 0, 16) * max >> 16;
-}
-#endif
-
-
-uint32 InteractiveRandom()
-{
-	uint32 t = _random_seeds[1][1];
-	uint32 s = _random_seeds[1][0];
-	_random_seeds[1][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
-	return _random_seeds[1][1] = ROR(s, 3) - 1;
-}
-
-uint InteractiveRandomRange(uint max)
-{
-	return GB(InteractiveRandom(), 0, 16) * max >> 16;
-}
-
 void InitializeVehicles();
 void InitializeWaypoints();
 void InitializeDepots();
@@ -105,7 +55,7 @@
 
 	AddTypeToEngines(); // make sure all engines have a type
 
-	SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, 0, WC_MAIN_WINDOW, 0);
+	SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, VHM_NONE, WC_MAIN_WINDOW, 0);
 
 	_pause_game = 0;
 	_fast_forward = 0;
@@ -255,24 +205,6 @@
 }
 
 
-
-int FindFirstBit(uint32 value)
-{
-	/* The macro FIND_FIRST_BIT is better to use when your value is
-	  not more than 128. */
-	byte i = 0;
-
-	if (value == 0) return 0;
-
-	if ((value & 0x0000ffff) == 0) { value >>= 16; i += 16; }
-	if ((value & 0x000000ff) == 0) { value >>= 8;  i += 8;  }
-	if ((value & 0x0000000f) == 0) { value >>= 4;  i += 4;  }
-	if ((value & 0x00000003) == 0) { value >>= 2;  i += 2;  }
-	if ((value & 0x00000001) == 0) { i += 1; }
-
-	return i;
-}
-
 static void Save_NAME()
 {
 	int i;
--- a/src/misc_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/misc_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -113,6 +113,7 @@
 			default:
 				break;
 		}
+		ResetVehicleColorMap();
 		MarkWholeScreenDirty();
 	}
 	return CommandCost();
@@ -380,7 +381,7 @@
 
 	if (flags & DC_EXEC) {
 		if (p1 != (uint32)-1L) {
-			((int*)&_opt_ptr->diff)[p1] = p2;
+			((GDType*)&_opt_ptr->diff)[p1] = p2;
 			_opt_ptr->diff_level = 3; // custom difficulty level
 		} else {
 			_opt_ptr->diff_level = p2;
--- a/src/misc_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/misc_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -9,6 +9,7 @@
 #include "functions.h"
 #include "landscape.h"
 #include "newgrf.h"
+#include "newgrf_text.h"
 #include "saveload.h"
 #include "strings.h"
 #include "table/sprites.h"
@@ -59,13 +60,13 @@
 	if (e->event == WE_PAINT) {
 		DrawWindowWidgets(w);
 
-		DoDrawStringCentered(140, 16, _landinfo_data[0], 13);
-		DoDrawStringCentered(140, 27, _landinfo_data[1], 0);
-		DoDrawStringCentered(140, 38, _landinfo_data[2], 0);
-		DoDrawStringCentered(140, 49, _landinfo_data[3], 0);
-		DoDrawStringCentered(140, 60, _landinfo_data[4], 0);
+		DoDrawStringCentered(140, 16, _landinfo_data[0], TC_LIGHT_BLUE);
+		DoDrawStringCentered(140, 27, _landinfo_data[1], TC_FROMSTRING);
+		DoDrawStringCentered(140, 38, _landinfo_data[2], TC_FROMSTRING);
+		DoDrawStringCentered(140, 49, _landinfo_data[3], TC_FROMSTRING);
+		DoDrawStringCentered(140, 60, _landinfo_data[4], TC_FROMSTRING);
 		if (_landinfo_data[5][0] != '\0') DrawStringMultiCenter(140, 76, BindCString(_landinfo_data[5]), w->width - 4);
-		if (_landinfo_data[6][0] != '\0') DoDrawStringCentered(140, 71, _landinfo_data[6], 0);
+		if (_landinfo_data[6][0] != '\0') DoDrawStringCentered(140, 71, _landinfo_data[6], TC_FROMSTRING);
 	}
 }
 
@@ -198,7 +199,7 @@
 		ResetObjectToPlace();
 	} else {
 		_place_proc = Place_LandInfo;
-		SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, 1, WC_MAIN_TOOLBAR, 0);
+		SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, VHM_RECT, WC_MAIN_TOOLBAR, 0);
 	}
 }
 
@@ -222,12 +223,12 @@
 	"  Peter Nelson (peter1138) - Spiritual descendant from newgrf gods",
 	"  Remko Bijker (Rubidium) - THE desync hunter",
 	"  Christoph Mallon (Tron) - Programmer, code correctness police",
-	"  Patric Stout (TrueLight) - Coder, network guru, SVN-, MS- and website host",
 	"",
 	"Retired Developers:",
 	"  Ludvig Strigeus (ludde) - OpenTTD author, main coder (0.1 - 0.3.3)",
 	"  Serge Paquet (vurlix) - Assistant project manager, coder (0.1 - 0.3.3)",
 	"  Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3.0 - 0.3.6)",
+	"  Patric Stout (TrueLight) - Programmer, webhoster (0.3 - pre0.6)",
 	"",
 	"Special thanks go out to:",
 	"  Josef Drexler - For his great work on TTDPatch",
@@ -264,13 +265,13 @@
 		DrawWindowWidgets(w);
 
 		/* Show original copyright and revision version */
-		DrawStringCentered(210, 17, STR_00B6_ORIGINAL_COPYRIGHT, 0);
-		DrawStringCentered(210, 17 + 10, STR_00B7_VERSION, 0);
+		DrawStringCentered(210, 17, STR_00B6_ORIGINAL_COPYRIGHT, TC_FROMSTRING);
+		DrawStringCentered(210, 17 + 10, STR_00B7_VERSION, TC_FROMSTRING);
 
 		/* Show all scrolling credits */
 		for (i = 0; i < lengthof(credits); i++) {
 			if (y >= 50 && y < (w->height - 40)) {
-				DoDrawString(credits[i], 10, y, 0x10);
+				DoDrawString(credits[i], 10, y, TC_BLACK);
 			}
 			y += 10;
 		}
@@ -278,8 +279,8 @@
 		/* If the last text has scrolled start anew from the start */
 		if (y < 50) WP(w, scroller_d).height = w->height - 40;
 
-		DoDrawStringCentered(210, w->height - 25, "Website: http://www.openttd.org", 16);
-		DrawStringCentered(210, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, 0);
+		DoDrawStringCentered(210, w->height - 25, "Website: http://www.openttd.org", TC_BLACK);
+		DrawStringCentered(210, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, TC_FROMSTRING);
 	} break;
 	case WE_MOUSELOOP: // Timer to scroll the text and adjust the new top
 		if (WP(w, scroller_d).counter++ % 3 == 0) {
@@ -365,17 +366,17 @@
 		case 11:case 12: case 13: case 14:
 			if (wid - 3 >= WP(w,tree_d).count) break;
 
-			if (HandlePlacePushButton(w, wid, SPR_CURSOR_TREE, 1, NULL))
+			if (HandlePlacePushButton(w, wid, SPR_CURSOR_TREE, VHM_RECT, NULL))
 				_tree_to_plant = WP(w,tree_d).base + wid - 3;
 			break;
 
 		case 15: // tree of random type.
-			if (HandlePlacePushButton(w, 15, SPR_CURSOR_TREE, 1, NULL))
+			if (HandlePlacePushButton(w, 15, SPR_CURSOR_TREE, VHM_RECT, NULL))
 				_tree_to_plant = -1;
 			break;
 
 		case 16: // place trees randomly over the landscape
-			LowerWindowWidget(w, 16);
+			w->LowerWidget(16);
 			w->flags4 |= 5 << WF_TIMEOUT_SHL;
 			SndPlayFx(SND_15_BEEP);
 			PlaceTreesRandomly();
@@ -401,7 +402,7 @@
 		break;
 
 	case WE_TIMEOUT:
-		RaiseWindowWidget(w, 16);
+		w->RaiseWidget(16);
 		break;
 
 	case WE_ABORT_PLACE_OBJ:
@@ -505,6 +506,13 @@
 		CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
 		DrawWindowWidgets(w);
 		CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
+
+		/* If the error message comes from a NewGRF, we must use the text ref. stack reserved for error messages.
+		 * If the message doesn't come from a NewGRF, it won't use the TTDP-style text ref. stack, so we won't hurt anything
+		 */
+		SwitchToErrorRefStack();
+		RewindTextRefStack();
+
 		if (!IsWindowOfPrototype(w, _errmsg_face_widgets)) {
 			DrawStringMultiCenter(
 				120,
@@ -533,6 +541,9 @@
 					_errmsg_message_1,
 					w->width - 2);
 		}
+
+		/* Switch back to the normal text ref. stack for NewGRF texts */
+		SwitchToNormalRefStack();
 		break;
 
 	case WE_MOUSELOOP:
@@ -598,8 +609,8 @@
 		if ( (x|y) != 0) {
 			pt = RemapCoords2(x, y);
 			vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
-			pt.x = clamp(UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left - (334/2), 0, _screen.width - 334);
-			pt.y = clamp(UnScaleByZoom(pt.y - vp->virtual_top, vp->zoom) + vp->top - (137/2), 22, _screen.height - 137);
+			pt.x = Clamp(UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left - (334/2), 0, _screen.width - 334);
+			pt.y = Clamp(UnScaleByZoom(pt.y - vp->virtual_top, vp->zoom) + vp->top - (137/2), 22, _screen.height - 137);
 		} else {
 			pt.x = (_screen.width - 334) >> 1;
 			pt.y = (_screen.height - 137) >> 1;
@@ -735,9 +746,9 @@
 	/* Correctly position the tooltip position, watch out for window and cursor size
 	 * Clamp value to below main toolbar and above statusbar. If tooltip would
 	 * go below window, flip it so it is shown above the cursor */
-	y = clamp(_cursor.pos.y + _cursor.size.y + _cursor.offs.y + 5, 22, _screen.height - 12);
+	y = Clamp(_cursor.pos.y + _cursor.size.y + _cursor.offs.y + 5, 22, _screen.height - 12);
 	if (y + br.height > _screen.height - 12) y = _cursor.pos.y + _cursor.offs.y - br.height - 5;
-	x = clamp(_cursor.pos.x - (br.width >> 1), 0, _screen.width - br.width);
+	x = Clamp(_cursor.pos.x - (br.width >> 1), 0, _screen.width - br.width);
 
 	w = AllocateWindow(x, y, br.width, br.height, TooltipsWndProc, WC_TOOLTIPS, _tooltips_widgets);
 
@@ -1076,8 +1087,8 @@
 
 	if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
 
-	DoDrawString(tb->buf, delta, 0, 8);
-	if (tb->caret) DoDrawString("_", tb->caretxoffs + delta, 0, 12);
+	DoDrawString(tb->buf, delta, 0, TC_YELLOW);
+	if (tb->caret) DoDrawString("_", tb->caretxoffs + delta, 0, TC_WHITE);
 
 	_cur_dpi = old_dpi;
 }
@@ -1095,7 +1106,7 @@
 
 	switch (e->event) {
 		case WE_CREATE:
-			SETBIT(_no_scroll, SCROLL_EDIT);
+			SetBit(_no_scroll, SCROLL_EDIT);
 			break;
 
 		case WE_PAINT:
@@ -1151,7 +1162,7 @@
 				e.event = WE_ON_EDIT_TEXT_CANCEL;
 				parent->wndproc(parent, &e);
 			}
-			CLRBIT(_no_scroll, SCROLL_EDIT);
+			ClrBit(_no_scroll, SCROLL_EDIT);
 			break;
 		}
 }
@@ -1209,7 +1220,7 @@
 		WP(w, querystr_d).orig = orig_str_buf;
 	}
 
-	LowerWindowWidget(w, QUERY_STR_WIDGET_TEXT);
+	w->LowerWidget(QUERY_STR_WIDGET_TEXT);
 	WP(w, querystr_d).caption = caption;
 	WP(w, querystr_d).afilter = afilter;
 	InitializeTextBuffer(&WP(w, querystr_d).text, _edit_str_buf, realmaxlen, maxwidth);
@@ -1359,7 +1370,10 @@
 };
 
 /* Colors for fios types */
-const byte _fios_colors[] = {13, 9, 9, 6, 5, 6, 5, 6, 6, 8};
+const TextColour _fios_colors[] = {
+	TC_LIGHT_BLUE, TC_DARK_GREEN,  TC_DARK_GREEN, TC_ORANGE, TC_LIGHT_BROWN,
+	TC_ORANGE,     TC_LIGHT_BROWN, TC_ORANGE,     TC_ORANGE, TC_YELLOW
+};
 
 void BuildFileList()
 {
@@ -1390,8 +1404,8 @@
 	}
 
 	if (str != STR_4006_UNABLE_TO_READ_DRIVE) SetDParam(0, tot);
-	DrawString(2, 37, str, 0);
-	DoDrawStringTruncated(path, 2, 27, 16, maxw);
+	DrawString(2, 37, str, TC_FROMSTRING);
+	DoDrawStringTruncated(path, 2, 27, TC_BLACK, maxw);
 }
 
 static void MakeSortedSaveGameList()
@@ -1480,7 +1494,7 @@
 		DoDrawString(
 			_savegame_sort_order & SORT_DESCENDING ? DOWNARROW : UPARROW,
 			_savegame_sort_order & SORT_BY_NAME ? w->widget[2].right - 9 : w->widget[3].right - 9,
-			15, 16
+			15, TC_BLACK
 		);
 
 		y = w->widget[7].top + 1;
@@ -1585,7 +1599,7 @@
 		 * in those two saveload mode  */
 		if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO)) break;
 
-		if (IsWindowWidgetLowered(w, 11)) { // Delete button clicked
+		if (w->IsWidgetLowered(11)) { // Delete button clicked
 			if (!FiosDelete(WP(w, querystr_d).text.buf)) {
 				ShowErrorMessage(INVALID_STRING_ID, STR_4008_UNABLE_TO_DELETE_FILE, 0, 0);
 			} else {
@@ -1596,7 +1610,7 @@
 
 			UpdateTextBufferSize(&WP(w, querystr_d).text);
 			SetWindowDirty(w);
-		} else if (IsWindowWidgetLowered(w, 12)) { // Save button clicked
+		} else if (w->IsWidgetLowered(12)) { // Save button clicked
 			_switch_mode = SM_SAVE;
 			FiosMakeSavegameName(_file_to_saveload.name, WP(w, querystr_d).text.buf, sizeof(_file_to_saveload.name));
 
@@ -1610,7 +1624,7 @@
 			DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
 		}
 		FiosFreeSavegameList();
-		CLRBIT(_no_scroll, SCROLL_SAVE);
+		ClrBit(_no_scroll, SCROLL_SAVE);
 		break;
 	case WE_RESIZE: {
 		/* Widget 2 and 3 have to go with halve speed, make it so obiwan */
@@ -1661,12 +1675,12 @@
 	const WindowDesc *sld = &_save_dialog_desc;
 
 
-	SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, 0, WC_MAIN_WINDOW, 0);
+	SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, VHM_NONE, WC_MAIN_WINDOW, 0);
 	DeleteWindowById(WC_QUERY_STRING, 0);
 	DeleteWindowById(WC_SAVELOAD, 0);
 
 	_saveload_mode = mode;
-	SETBIT(_no_scroll, SCROLL_SAVE);
+	SetBit(_no_scroll, SCROLL_SAVE);
 
 	switch (mode) {
 		case SLD_SAVE_GAME:     GenerateFileName(); break;
@@ -1677,7 +1691,7 @@
 	assert((uint)mode < lengthof(saveload_captions));
 	w = AllocateWindowDesc(sld);
 	w->widget[1].data = saveload_captions[mode];
-	LowerWindowWidget(w, 7);
+	w->LowerWidget(7);
 
 	WP(w, querystr_d).afilter = CS_ALPHANUMERAL;
 	InitializeTextBuffer(&WP(w, querystr_d).text, _edit_str_buf, lengthof(_edit_str_buf), 240);
@@ -1889,7 +1903,7 @@
 			} break;
 			}
 
-			DrawString(50, y + 1, ce->str, 0);
+			DrawString(50, y + 1, ce->str, TC_FROMSTRING);
 
 			y += 12;
 		}
@@ -1903,7 +1917,7 @@
 			uint x = e->we.click.pt.x;
 
 			/* not clicking a button? */
-			if (!IS_INT_INSIDE(x, 20, 40) || btn >= lengthof(_cheats_ui)) break;
+			if (!IsInsideMM(x, 20, 40) || btn >= lengthof(_cheats_ui)) break;
 
 			ce = &_cheats_ui[btn];
 			oldvalue = value = (int32)ReadValue(ce->variable, ce->type);
@@ -1924,7 +1938,7 @@
 
 				/* Increase or decrease the value and clamp it to extremes */
 				value += (x >= 30) ? step : -step;
-				value = clamp(value, ce->min, ce->max);
+				value = Clamp(value, ce->min, ce->max);
 
 				/* take whatever the function returns */
 				value = ce->proc(value, (x >= 30) ? 1 : -1);
--- a/src/music/qtmidi.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/music/qtmidi.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -19,6 +19,9 @@
  */
 
 
+#define MAC_OS_X_VERSION_MIN_REQUIRED    MAC_OS_X_VERSION_10_3
+#include <AvailabilityMacros.h>
+
 /*
  * OpenTTD includes.
  */
@@ -27,7 +30,6 @@
 #undef   WindowClass
 
 #include "../stdafx.h"
-#include "../openttd.h"
 #include "qtmidi.h"
 
 /*
@@ -56,48 +58,24 @@
 
 
 /**
- * Converts a Unix-like pathname to a @c FSSpec structure which may be
- * used with functions from several MacOS X frameworks (Carbon, QuickTime,
- * etc). The pointed file or directory must exist.
- *
- * @param *path A string containing a Unix-like path.
- * @param *spec Pointer to a @c FSSpec structure where the result will be
- *              stored.
- * @return Wether the conversion was successful.
- */
-static bool PathToFSSpec(const char *path, FSSpec *spec)
-{
-	FSRef ref;
-	assert(spec != NULL);
-	assert(path != NULL);
-
-	return
-		FSPathMakeRef((UInt8*)path, &ref, NULL) == noErr &&
-		FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, spec, NULL) == noErr;
-}
-
-
-/**
  * Sets the @c OSType of a given file to @c 'Midi', but only if it's not
  * already set.
  *
  * @param *spec A @c FSSpec structure referencing a file.
  */
-static void SetMIDITypeIfNeeded(const FSSpec *spec)
+static void SetMIDITypeIfNeeded(const FSRef *ref)
 {
-	FSRef ref;
 	FSCatalogInfo catalogInfo;
 
-	assert(spec);
+	assert(ref);
 
-	if (noErr != FSpMakeFSRef(spec, &ref)) return;
-	if (noErr != FSGetCatalogInfo(&ref, kFSCatInfoNodeFlags | kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL)) return;
+	if (noErr != FSGetCatalogInfo(ref, kFSCatInfoNodeFlags | kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL)) return;
 	if (!(catalogInfo.nodeFlags & kFSNodeIsDirectoryMask)) {
 		FileInfo * const info = (FileInfo *) catalogInfo.finderInfo;
 		if (info->fileType != midiType && !(info->finderFlags & kIsAlias)) {
 			OSErr e;
 			info->fileType = midiType;
-			e = FSSetCatalogInfo(&ref, kFSCatInfoFinderInfo, &catalogInfo);
+			e = FSSetCatalogInfo(ref, kFSCatInfoFinderInfo, &catalogInfo);
 			if (e == noErr) {
 				DEBUG(driver, 3, "qtmidi: changed filetype to 'Midi'");
 			} else {
@@ -120,6 +98,7 @@
 	int fd;
 	int ret;
 	char magic[4];
+	FSRef fsref;
 	FSSpec fsspec;
 	short refnum = 0;
 	short resid  = 0;
@@ -145,9 +124,10 @@
 	if (magic[0] != 'M' || magic[1] != 'T' || magic[2] != 'h' || magic[3] != 'd')
 		return false;
 
-	if (!PathToFSSpec(path, &fsspec)) return false;
-	SetMIDITypeIfNeeded(&fsspec);
+	if (noErr != FSPathMakeRef((const UInt8 *) path, &fsref, NULL)) return false;
+	SetMIDITypeIfNeeded(&fsref);
 
+	if (noErr != FSGetCatalogInfo(&fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL)) return false;
 	if (OpenMovieFile(&fsspec, &refnum, fsRdPerm) != noErr) return false;
 	DEBUG(driver, 3, "qtmidi: '%s' successfully opened", path);
 
--- a/src/music_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/music_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -118,7 +118,8 @@
 		}
 	} while (_playlists[msf.playlist][i++] != 0 && i < lengthof(_cur_playlist) - 1);
 
-	if (msf.shuffle) {
+	/* Do not shuffle when on the intro-start window, as the song to play has to be the original TTD Theme*/
+	if (msf.shuffle && _game_mode != GM_MENU) {
 		i = 500;
 		do {
 			uint32 r = InteractiveRandom();
@@ -198,33 +199,33 @@
 		uint i;
 		int y;
 
-		SetWindowWidgetDisabledState(w, 11, msf.playlist <= 3);
-		LowerWindowWidget(w, 3);
-		LowerWindowWidget(w, 4);
+		w->SetWidgetDisabledState(11, msf.playlist <= 3);
+		w->LowerWidget(3);
+		w->LowerWidget(4);
 		DrawWindowWidgets(w);
 
 		GfxFillRect(3, 23, 3 + 177, 23 + 191, 0);
 		GfxFillRect(251, 23, 251 + 177, 23 + 191, 0);
 
-		DrawStringCentered(92, 15, STR_01EE_TRACK_INDEX, 0);
+		DrawStringCentered(92, 15, STR_01EE_TRACK_INDEX, TC_FROMSTRING);
 
 		SetDParam(0, STR_01D5_ALL + msf.playlist);
-		DrawStringCentered(340, 15, STR_01EF_PROGRAM, 0);
+		DrawStringCentered(340, 15, STR_01EF_PROGRAM, TC_FROMSTRING);
 
 		for (i = 1; i <= NUM_SONGS_AVAILABLE; i++) {
 			SetDParam(0, i);
 			SetDParam(2, i);
 			SetDParam(1, SPECSTR_SONGNAME);
-			DrawString(4, 23 + (i - 1) * 6, (i < 10) ? STR_01EC_0 : STR_01ED, 0);
+			DrawString(4, 23 + (i - 1) * 6, (i < 10) ? STR_01EC_0 : STR_01ED, TC_FROMSTRING);
 		}
 
 		for (i = 0; i != 6; i++) {
-			DrawStringCentered(216, 45 + i * 8, STR_01D5_ALL + i, (i == msf.playlist) ? 0xC : 0x10);
+			DrawStringCentered(216, 45 + i * 8, STR_01D5_ALL + i, (i == msf.playlist) ? TC_WHITE : TC_BLACK);
 		}
 
-		DrawStringCentered(216, 45 + 8 * 6 + 16, STR_01F0_CLEAR, 0);
+		DrawStringCentered(216, 45 + 8 * 6 + 16, STR_01F0_CLEAR, TC_FROMSTRING);
 #if 0
-		DrawStringCentered(216, 45 + 8 * 6 + 16 * 2, STR_01F1_SAVE, 0);
+		DrawStringCentered(216, 45 + 8 * 6 + 16 * 2, STR_01F1_SAVE, TC_FROMSTRING);
 #endif
 
 		y = 23;
@@ -232,7 +233,7 @@
 			SetDParam(0, i);
 			SetDParam(1, SPECSTR_SONGNAME);
 			SetDParam(2, i);
-			DrawString(252, y, (i < 10) ? STR_01EC_0 : STR_01ED, 0);
+			DrawString(252, y, (i < 10) ? STR_01EC_0 : STR_01ED, TC_FROMSTRING);
 			y += 6;
 		}
 		break;
@@ -246,7 +247,7 @@
 			byte *p;
 
 			if (msf.playlist < 4) return;
-			if (!IS_INT_INSIDE(y, 0, NUM_SONGS_AVAILABLE)) return;
+			if (!IsInsideMM(y, 0, NUM_SONGS_AVAILABLE)) return;
 
 			p = _playlists[msf.playlist];
 			for (i = 0; i != NUM_SONGS_PLAYLIST - 1; i++) {
@@ -266,7 +267,7 @@
 			byte *p;
 
 			if (msf.playlist < 4) return;
-			if (!IS_INT_INSIDE(y, 0, NUM_SONGS_AVAILABLE)) return;
+			if (!IsInsideMM(y, 0, NUM_SONGS_AVAILABLE)) return;
 
 			p = _playlists[msf.playlist];
 			for (i = y; i != NUM_SONGS_PLAYLIST - 1; i++) {
@@ -341,8 +342,8 @@
 		uint i;
 		StringID str;
 
-		RaiseWindowWidget(w, 7);
-		RaiseWindowWidget(w, 9);
+		w->RaiseWidget(7);
+		w->RaiseWidget(9);
 		DrawWindowWidgets(w);
 
 		GfxFillRect(187, 16, 200, 33, 0);
@@ -366,7 +367,7 @@
 			SetDParam(0, _music_wnd_cursong);
 			str = (_music_wnd_cursong < 10) ? STR_01E4_0 : STR_01E5;
 		}
-		DrawString(62, 46, str, 0);
+		DrawString(62, 46, str, TC_FROMSTRING);
 
 		str = STR_01E6;
 		if (_song_is_active != 0 && _music_wnd_cursong != 0) {
@@ -374,21 +375,21 @@
 			SetDParam(0, SPECSTR_SONGNAME);
 			SetDParam(1, _music_wnd_cursong);
 		}
-		DrawStringCentered(155, 46, str, 0);
+		DrawStringCentered(155, 46, str, TC_FROMSTRING);
 
 
-		DrawString(60, 38, STR_01E8_TRACK_XTITLE, 0);
+		DrawString(60, 38, STR_01E8_TRACK_XTITLE, TC_FROMSTRING);
 
 		for (i = 0; i != 6; i++) {
-			DrawStringCentered(25 + i * 50, 59, STR_01D5_ALL + i, msf.playlist == i ? 0xC : 0x10);
+			DrawStringCentered(25 + i * 50, 59, STR_01D5_ALL + i, msf.playlist == i ? TC_WHITE : TC_BLACK);
 		}
 
-		DrawStringCentered(31, 43, STR_01E9_SHUFFLE, (msf.shuffle ? 0xC : 0x10));
-		DrawStringCentered(269, 43, STR_01EA_PROGRAM, 0);
-		DrawStringCentered(141, 15, STR_01DB_MUSIC_VOLUME, 0);
-		DrawStringCentered(141, 29, STR_01DD_MIN_MAX, 0);
-		DrawStringCentered(247, 15, STR_01DC_EFFECTS_VOLUME, 0);
-		DrawStringCentered(247, 29, STR_01DD_MIN_MAX, 0);
+		DrawStringCentered(31, 43, STR_01E9_SHUFFLE, (msf.shuffle ? TC_WHITE : TC_BLACK));
+		DrawStringCentered(269, 43, STR_01EA_PROGRAM, TC_FROMSTRING);
+		DrawStringCentered(141, 15, STR_01DB_MUSIC_VOLUME, TC_FROMSTRING);
+		DrawStringCentered(141, 29, STR_01DD_MIN_MAX, TC_FROMSTRING);
+		DrawStringCentered(247, 15, STR_01DC_EFFECTS_VOLUME, TC_FROMSTRING);
+		DrawStringCentered(247, 29, STR_01DD_MIN_MAX, TC_FROMSTRING);
 
 		DrawFrameRect(108, 23, 174, 26, 14, FR_LOWERED);
 		DrawFrameRect(214, 23, 280, 26, 14, FR_LOWERED);
--- a/src/network/core/config.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/core/config.h	Mon Dec 03 23:39:38 2007 +0000
@@ -27,8 +27,9 @@
 
 	NETWORK_NAME_LENGTH           =   80, ///< The maximum length of the server name and map name, in bytes including '\0'
 	NETWORK_HOSTNAME_LENGTH       =   80, ///< The maximum length of the host name, in bytes including '\0'
+	NETWORK_UNIQUE_ID_LENGTH      =   33, ///< The maximum length of the unique id of the clients, in bytes including '\0'
 	NETWORK_REVISION_LENGTH       =   15, ///< The maximum length of the revision, in bytes including '\0'
-	NETWORK_PASSWORD_LENGTH       =   20, ///< The maximum length of the password, in bytes including '\0'
+	NETWORK_PASSWORD_LENGTH       =   33, ///< The maximum length of the password, in bytes including '\0' (must be >= NETWORK_UNIQUE_ID_LENGTH)
 	NETWORK_PLAYERS_LENGTH        =  200, ///< The maximum length for the list of players that controls a company, in bytes including '\0'
 	NETWORK_CLIENT_NAME_LENGTH    =   25, ///< The maximum length of a player, in bytes including '\0'
 	NETWORK_RCONCOMMAND_LENGTH    =  500, ///< The maximum length of a rconsole command, in bytes including '\0'
--- a/src/network/core/os_abstraction.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/core/os_abstraction.h	Mon Dec 03 23:39:38 2007 +0000
@@ -202,11 +202,6 @@
 #endif
 }
 
-#ifdef __APPLE__
-/* Looks like sys/socket.h uses a name we got in macros.h */
-#undef ALIGN
-#endif
-
 #endif /* ENABLE_NETWORK */
 
 #endif /* NETWORK_CORE_OS_ABSTRACTION_H */
--- a/src/network/core/packet.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/core/packet.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -133,7 +133,8 @@
 void Packet::Send_string(const char* data)
 {
 	assert(data != NULL);
-	assert(this->size < sizeof(this->buffer) - strlen(data) - 1);
+	/* The <= *is* valid due to the fact that we are comparing sizes and not the index. */
+	assert(this->size + strlen(data) + 1 <= sizeof(this->buffer));
 	while ((this->buffer[this->size++] = *data++) != '\0') {}
 }
 
--- a/src/network/core/udp.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/core/udp.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -160,13 +160,13 @@
 
 		/* Count number of GRFs to send information about */
 		for (c = info->grfconfig; c != NULL; c = c->next) {
-			if (!HASBIT(c->flags, GCF_STATIC)) count++;
+			if (!HasBit(c->flags, GCF_STATIC)) count++;
 		}
 		p->Send_uint8 (count); // Send number of GRFs
 
 		/* Send actual GRF Identifications */
 		for (c = info->grfconfig; c != NULL; c = c->next) {
-			if (!HASBIT(c->flags, GCF_STATIC)) this->Send_GRFIdentifier(p, c);
+			if (!HasBit(c->flags, GCF_STATIC)) this->Send_GRFIdentifier(p, c);
 		}
 	}
 
@@ -230,8 +230,8 @@
 			}
 		} /* Fallthrough */
 		case 3:
-			info->game_date      = clamp(p->Recv_uint32(), 0, MAX_DATE);
-			info->start_date     = clamp(p->Recv_uint32(), 0, MAX_DATE);
+			info->game_date      = Clamp(p->Recv_uint32(), 0, MAX_DATE);
+			info->start_date     = Clamp(p->Recv_uint32(), 0, MAX_DATE);
 			/* Fallthrough */
 		case 2:
 			info->companies_max  = p->Recv_uint8 ();
--- a/src/network/network.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/network.h	Mon Dec 03 23:39:38 2007 +0000
@@ -71,7 +71,7 @@
 	PlayerID client_playas;                         // As which player is this client playing (PlayerID)
 	uint32 client_ip;                               // IP-address of the client (so he can be banned)
 	Date join_date;                                 // Gamedate the player has joined
-	char unique_id[NETWORK_NAME_LENGTH];            // Every play sends an unique id so we can indentify him
+	char unique_id[NETWORK_UNIQUE_ID_LENGTH];       // Every play sends an unique id so we can indentify him
 };
 
 enum NetworkJoinStatus {
@@ -127,7 +127,7 @@
 VARDEF char _network_default_ip[NETWORK_HOSTNAME_LENGTH];
 
 VARDEF uint16 _network_own_client_index;
-VARDEF char _network_unique_id[NETWORK_NAME_LENGTH]; // Our own unique ID
+VARDEF char _network_unique_id[NETWORK_UNIQUE_ID_LENGTH]; // Our own unique ID
 
 VARDEF uint32 _frame_counter_server; // The frame_counter of the server, if in network-mode
 VARDEF uint32 _frame_counter_max; // To where we may go with our clients
@@ -147,6 +147,7 @@
 VARDEF char _network_server_name[NETWORK_NAME_LENGTH];
 VARDEF char _network_server_password[NETWORK_PASSWORD_LENGTH];
 VARDEF char _network_rcon_password[NETWORK_PASSWORD_LENGTH];
+VARDEF char _network_default_company_pass[NETWORK_PASSWORD_LENGTH];
 
 VARDEF uint16 _network_max_join_time;             ///< Time a client can max take to join
 VARDEF bool _network_pause_on_join;               ///< Pause the game when a client tries to join (more chance of succeeding join)
--- a/src/network/network_client.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/network_client.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -23,6 +23,7 @@
 #include "../ai/ai.h"
 #include "../helpers.hpp"
 #include "../fileio.h"
+#include "../md5.h"
 
 // This file handles all the client-commands
 
@@ -32,6 +33,59 @@
 
 static uint32 last_ack_frame;
 
+/** One bit of 'entropy' used to generate a salt for the company passwords. */
+static uint32 _password_game_seed;
+/** The other bit of 'entropy' used to generate a salt for the company passwords. */
+static char _password_server_unique_id[NETWORK_UNIQUE_ID_LENGTH];
+
+/** Make sure the unique ID length is the same as a md5 hash. */
+assert_compile(NETWORK_UNIQUE_ID_LENGTH == 16 * 2 + 1);
+
+/**
+ * Generates a hashed password for the company name.
+ * @param password the password to 'encrypt'.
+ * @return the hashed password.
+ */
+static const char *GenerateCompanyPasswordHash(const char *password)
+{
+	if (StrEmpty(password)) return password;
+
+	char salted_password[NETWORK_UNIQUE_ID_LENGTH];
+
+	memset(salted_password, 0, sizeof(salted_password));
+	snprintf(salted_password, sizeof(salted_password), "%s", password);
+	/* Add the game seed and the server's unique ID as the salt. */
+	for (uint i = 0; i < NETWORK_UNIQUE_ID_LENGTH; i++) salted_password[i] ^= _password_server_unique_id[i] ^ (_password_game_seed >> i);
+
+	md5_state_t state;
+	md5_byte_t digest[16];
+	static char hashed_password[NETWORK_UNIQUE_ID_LENGTH];
+
+	/* Generate the MD5 hash */
+	md5_init(&state);
+	md5_append(&state, (const md5_byte_t*)salted_password, sizeof(salted_password));
+	md5_finish(&state, digest);
+
+	for (int di = 0; di < 16; di++) sprintf(hashed_password + di * 2, "%02x", digest[di]);
+
+	return hashed_password;
+}
+
+/**
+ * Hash the current company password; used when the server 'player' sets his/her password.
+ */
+void HashCurrentCompanyPassword()
+{
+	if (StrEmpty(_network_player_info[_local_player].password)) return;
+
+	_password_game_seed = _patches.generation_seed;
+	snprintf(_password_server_unique_id, sizeof(_password_server_unique_id), _network_unique_id);
+
+	const char *new_pw = GenerateCompanyPasswordHash(_network_player_info[_local_player].password);
+	snprintf(_network_player_info[_local_player].password, sizeof(_network_player_info[_local_player].password), new_pw);
+}
+
+
 // **********
 // Sending functions
 //   DEF_CLIENT_SEND_COMMAND has no parameters
@@ -103,7 +157,7 @@
 	//
 	Packet *p = NetworkSend_Init(PACKET_CLIENT_PASSWORD);
 	p->Send_uint8 (type);
-	p->Send_string(password);
+	p->Send_string(type == NETWORK_GAME_PASSWORD ? password : GenerateCompanyPasswordHash(password));
 	MY_CLIENT->Send_Packet(p);
 }
 
@@ -224,7 +278,7 @@
 	//
 	Packet *p = NetworkSend_Init(PACKET_CLIENT_SET_PASSWORD);
 
-	p->Send_string(password);
+	p->Send_string(GenerateCompanyPasswordHash(password));
 	MY_CLIENT->Send_Packet(p);
 }
 
@@ -341,7 +395,7 @@
 	uint16 index = p->Recv_uint16();
 	PlayerID playas = (Owner)p->Recv_uint8();
 	char name[NETWORK_NAME_LENGTH];
-	char unique_id[NETWORK_NAME_LENGTH];
+	char unique_id[NETWORK_UNIQUE_ID_LENGTH];
 
 	p->Recv_string(name, sizeof(name));
 	p->Recv_string(unique_id, sizeof(unique_id));
@@ -458,8 +512,13 @@
 	NetworkPasswordType type = (NetworkPasswordType)p->Recv_uint8();
 
 	switch (type) {
+		case NETWORK_COMPANY_PASSWORD:
+			/* Initialize the password hash salting variables. */
+			_password_game_seed = p->Recv_uint32();
+			p->Recv_string(_password_server_unique_id, sizeof(_password_server_unique_id));
+			if (MY_CLIENT->has_quit) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
+
 		case NETWORK_GAME_PASSWORD:
-		case NETWORK_COMPANY_PASSWORD:
 			ShowNetworkNeedPassword(type);
 			return NETWORK_RECV_STATUS_OKAY;
 
@@ -471,6 +530,10 @@
 {
 	_network_own_client_index = p->Recv_uint16();
 
+	/* Initialize the password hash salting variables, even if they were previously. */
+	_password_game_seed = p->Recv_uint32();
+	p->Recv_string(_password_server_unique_id, sizeof(_password_server_unique_id));
+
 	// Start receiving the map
 	SEND_COMMAND(PACKET_CLIENT_GETMAP)();
 	return NETWORK_RECV_STATUS_OKAY;
--- a/src/network/network_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/network_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -209,18 +209,51 @@
 	nqld->l.flags &= ~VL_RESORT;
 }
 
-/* Uses network_ql_d (network_d, querystr_d and list_d) WP macro */
+/** Enum for NetworkGameWindow, referring to _network_game_window_widgets */
+enum NetworkGameWindowWidgets {
+	NGWW_CLOSE    = 0,  ///< Close 'X' button
+	NGWW_CONN_TXT = 4,  ///< 'Connection' droplist
+	NGWW_CONN_BTN = 5,  ///< 'Connection' droplist button
+	NGWW_PLAYER   = 6,  ///< Panel with editbox to set player name
+
+	NGWW_NAME     = 7,  ///< 'Name' button
+	NGWW_CLIENTS,       ///< 'Clients' button
+	NGWW_INFO,          ///< Third button in the game list panel
+
+	NGWW_MATRIX   = 10, ///< Panel with list of games
+
+	NGWW_DETAILS  = 12, ///< Panel with game details
+	NGWW_JOIN     = 13, ///< 'Join game' button
+	NGWW_REFRESH  = 14, ///< 'Refresh server' button
+	NGWW_NEWGRF   = 15, ///< 'NewGRF Settings' button
+
+	NGWW_FIND     = 16, ///< 'Find server' button
+	NGWW_ADD,           ///< 'Add server' button
+	NGWW_START,         ///< 'Start server' button
+	NGWW_CANCEL,        ///< 'Cancel' button
+};
+
+/**
+ * Handler of actions done in the NetworkStartServer window
+ *
+ * @param w pointer to the Window structure
+ * @param e pointer to window event
+ * @note    Uses network_ql_d (network_d, querystr_d and list_d) WP macro
+ * @see     struct _network_game_window_widgets
+ * @see     enum NetworkGameWindowWidgets
+ */
+
 static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
 {
 	network_d *nd = &WP(w, network_ql_d).n;
 	list_d *ld = &WP(w, network_ql_d).l;
 
 	switch (e->event) {
-	case WE_CREATE: /* Focus input box */
+	case WE_CREATE: // Focus input box
 		w->vscroll.cap = 13;
 		w->resize.step_height = NET_PRC__SIZE_OF_ROW;
 
-		nd->field = 3;
+		nd->field = NGWW_PLAYER;
 		nd->server = NULL;
 
 		WP(w, network_ql_d).sort_list = NULL;
@@ -238,14 +271,16 @@
 		}
 		if (ld->flags & VL_RESORT) SortNetworkGameList(&WP(w, network_ql_d));
 
-		SetWindowWidgetDisabledState(w, 17, sel == NULL);
-		/* Join Button disabling conditions */
-		SetWindowWidgetDisabledState(w, 16, sel == NULL || // no Selected Server
+		/* 'Refresh' button invisible if no server selected */
+		w->SetWidgetDisabledState(NGWW_REFRESH, sel == NULL);
+		/* 'Join' button disabling conditions */
+		w->SetWidgetDisabledState(NGWW_JOIN, sel == NULL || // no Selected Server
 				!sel->online || // Server offline
 				sel->info.clients_on >= sel->info.clients_max || // Server full
 				!sel->info.compatible); // Revision mismatch
 
-		SetWindowWidgetHiddenState(w, 18, sel == NULL ||
+		/* 'NewGRF Settings' button invisible if no NewGRF is used */
+		w->SetWidgetHiddenState(NGWW_NEWGRF, sel == NULL ||
 				!sel->online ||
 				sel->info.grfconfig == NULL);
 
@@ -253,23 +288,23 @@
 		SetDParam(1, _lan_internet_types_dropdown[_network_lan_internet]);
 		DrawWindowWidgets(w);
 
-		DrawEditBox(w, &WP(w, network_ql_d).q, 3);
+		/* Edit box to set player name */
+		DrawEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
 
-		DrawString(9, 23, STR_NETWORK_CONNECTION, 2);
-		DrawString(w->widget[3].left - 100, 23, STR_NETWORK_PLAYER_NAME, 2);
+		DrawString(w->widget[NGWW_PLAYER].left - 100, 23, STR_NETWORK_PLAYER_NAME, TC_GOLD);
 
 		/* Sort based on widgets: name, clients, compatibility */
 		switch (ld->sort_type) {
-			case 6 - 6: DoDrawString(arrow, w->widget[6].right - 10, 42, 0x10); break;
-			case 7 - 6: DoDrawString(arrow, w->widget[7].right - 10, 42, 0x10); break;
-			case 8 - 6: DoDrawString(arrow, w->widget[8].right - 10, 42, 0x10); break;
+			case NGWW_NAME    - NGWW_NAME: DoDrawString(arrow, w->widget[NGWW_NAME].right    - 10, 42, TC_BLACK); break;
+			case NGWW_CLIENTS - NGWW_NAME: DoDrawString(arrow, w->widget[NGWW_CLIENTS].right - 10, 42, TC_BLACK); break;
+			case NGWW_INFO    - NGWW_NAME: DoDrawString(arrow, w->widget[NGWW_INFO].right    - 10, 42, TC_BLACK); break;
 		}
 
 		{ // draw list of games
 			uint16 y = NET_PRC__OFFSET_TOP_WIDGET + 3;
 			int32 n = 0;
 			int32 pos = w->vscroll.pos;
-			uint max_name_width = w->widget[6].right - w->widget[6].left - 5;
+			uint max_name_width = w->widget[NGWW_NAME].right - w->widget[NGWW_NAME].left - 5;
 			const NetworkGameList *cur_item = _network_game_list;
 
 			while (pos > 0 && cur_item != NULL) {
@@ -278,28 +313,28 @@
 			}
 
 			while (cur_item != NULL) {
-				// show highlighted item with a different colour
-				if (cur_item == sel) GfxFillRect(w->widget[6].left + 1, y - 2, w->widget[8].right - 1, y + 9, 10);
+				/* show highlighted item with a different colour */
+				if (cur_item == sel) GfxFillRect(w->widget[NGWW_NAME].left + 1, y - 2, w->widget[NGWW_INFO].right - 1, y + 9, 10);
 
 				SetDParamStr(0, cur_item->info.server_name);
-				DrawStringTruncated(w->widget[6].left + 5, y, STR_02BD, 16, max_name_width);
+				DrawStringTruncated(w->widget[NGWW_NAME].left + 5, y, STR_02BD, TC_BLACK, max_name_width);
 
 				SetDParam(0, cur_item->info.clients_on);
 				SetDParam(1, cur_item->info.clients_max);
 				SetDParam(2, cur_item->info.companies_on);
 				SetDParam(3, cur_item->info.companies_max);
-				DrawStringCentered(w->widget[7].left + 39, y, STR_NETWORK_GENERAL_ONLINE, 2);
+				DrawStringCentered(w->widget[NGWW_CLIENTS].left + 39, y, STR_NETWORK_GENERAL_ONLINE, TC_GOLD);
 
-				// only draw icons if the server is online
+				/* only draw icons if the server is online */
 				if (cur_item->online) {
-					// draw a lock if the server is password protected.
-					if (cur_item->info.use_password) DrawSprite(SPR_LOCK, PAL_NONE, w->widget[8].left + 5, y - 1);
+					/* draw a lock if the server is password protected */
+					if (cur_item->info.use_password) DrawSprite(SPR_LOCK, PAL_NONE, w->widget[NGWW_INFO].left + 5, y - 1);
 
-					// draw red or green icon, depending on compatibility with server.
-					DrawSprite(SPR_BLOT, (cur_item->info.compatible ? PALETTE_TO_GREEN : (cur_item->info.version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED)), w->widget[8].left + 15, y);
+					/* draw red or green icon, depending on compatibility with server */
+					DrawSprite(SPR_BLOT, (cur_item->info.compatible ? PALETTE_TO_GREEN : (cur_item->info.version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED)), w->widget[NGWW_INFO].left + 15, y);
 
-					// draw flag according to server language
-					DrawSprite(SPR_FLAGS_BASE + cur_item->info.server_lang, PAL_NONE, w->widget[8].left + 25, y);
+					/* draw flag according to server language */
+					DrawSprite(SPR_FLAGS_BASE + cur_item->info.server_lang, PAL_NONE, w->widget[NGWW_INFO].left + 25, y);
 				}
 
 				cur_item = cur_item->next;
@@ -309,73 +344,73 @@
 		}
 
 		/* Draw the right menu */
-		GfxFillRect(w->widget[15].left + 1, 43, w->widget[15].right - 1, 92, 157);
+		GfxFillRect(w->widget[NGWW_DETAILS].left + 1, 43, w->widget[NGWW_DETAILS].right - 1, 92, 157);
 		if (sel == NULL) {
-			DrawStringCentered(w->widget[15].left + 115, 58, STR_NETWORK_GAME_INFO, 0);
+			DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 58, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
 		} else if (!sel->online) {
 			SetDParamStr(0, sel->info.server_name);
-			DrawStringCentered(w->widget[15].left + 115, 68, STR_ORANGE, 0); // game name
+			DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 68, STR_ORANGE, TC_FROMSTRING); // game name
 
-			DrawStringCentered(w->widget[15].left + 115, 132, STR_NETWORK_SERVER_OFFLINE, 0); // server offline
+			DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 132, STR_NETWORK_SERVER_OFFLINE, TC_FROMSTRING); // server offline
 		} else { // show game info
 			uint16 y = 100;
-			const uint16 x = w->widget[15].left + 5;
+			const uint16 x = w->widget[NGWW_DETAILS].left + 5;
 
-			DrawStringCentered(w->widget[15].left + 115, 48, STR_NETWORK_GAME_INFO, 0);
+			DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 48, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
 
 
 			SetDParamStr(0, sel->info.server_name);
-			DrawStringCenteredTruncated(w->widget[15].left, w->widget[15].right, 62, STR_ORANGE, 16); // game name
+			DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 62, STR_ORANGE, TC_BLACK); // game name
 
 			SetDParamStr(0, sel->info.map_name);
-			DrawStringCenteredTruncated(w->widget[15].left, w->widget[15].right, 74, STR_02BD, 16); // map name
+			DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 74, STR_02BD, TC_BLACK); // map name
 
 			SetDParam(0, sel->info.clients_on);
 			SetDParam(1, sel->info.clients_max);
 			SetDParam(2, sel->info.companies_on);
 			SetDParam(3, sel->info.companies_max);
-			DrawString(x, y, STR_NETWORK_CLIENTS, 2);
+			DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
 			y += 10;
 
 			SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang);
-			DrawString(x, y, STR_NETWORK_LANGUAGE, 2); // server language
+			DrawString(x, y, STR_NETWORK_LANGUAGE, TC_GOLD); // server language
 			y += 10;
 
 			SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set);
-			DrawString(x, y, STR_NETWORK_TILESET, 2); // tileset
+			DrawString(x, y, STR_NETWORK_TILESET, TC_GOLD); // tileset
 			y += 10;
 
 			SetDParam(0, sel->info.map_width);
 			SetDParam(1, sel->info.map_height);
-			DrawString(x, y, STR_NETWORK_MAP_SIZE, 2); // map size
+			DrawString(x, y, STR_NETWORK_MAP_SIZE, TC_GOLD); // map size
 			y += 10;
 
 			SetDParamStr(0, sel->info.server_revision);
-			DrawString(x, y, STR_NETWORK_SERVER_VERSION, 2); // server version
+			DrawString(x, y, STR_NETWORK_SERVER_VERSION, TC_GOLD); // server version
 			y += 10;
 
 			SetDParamStr(0, sel->info.hostname);
 			SetDParam(1, sel->port);
-			DrawString(x, y, STR_NETWORK_SERVER_ADDRESS, 2); // server address
+			DrawString(x, y, STR_NETWORK_SERVER_ADDRESS, TC_GOLD); // server address
 			y += 10;
 
 			SetDParam(0, sel->info.start_date);
-			DrawString(x, y, STR_NETWORK_START_DATE, 2); // start date
+			DrawString(x, y, STR_NETWORK_START_DATE, TC_GOLD); // start date
 			y += 10;
 
 			SetDParam(0, sel->info.game_date);
-			DrawString(x, y, STR_NETWORK_CURRENT_DATE, 2); // current date
+			DrawString(x, y, STR_NETWORK_CURRENT_DATE, TC_GOLD); // current date
 			y += 10;
 
 			y += 2;
 
 			if (!sel->info.compatible) {
-				DrawStringCentered(w->widget[15].left + 115, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, 0); // server mismatch
+				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, TC_FROMSTRING); // server mismatch
 			} else if (sel->info.clients_on == sel->info.clients_max) {
-				// Show: server full, when clients_on == clients_max
-				DrawStringCentered(w->widget[15].left + 115, y, STR_NETWORK_SERVER_FULL, 0); // server full
+				/* Show: server full, when clients_on == clients_max */
+				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_SERVER_FULL, TC_FROMSTRING); // server full
 			} else if (sel->info.use_password) {
-				DrawStringCentered(w->widget[15].left + 115, y, STR_NETWORK_PASSWORD, 0); // password warning
+				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_PASSWORD, TC_FROMSTRING); // password warning
 			}
 
 			y += 10;
@@ -385,24 +420,24 @@
 	case WE_CLICK:
 		nd->field = e->we.click.widget;
 		switch (e->we.click.widget) {
-		case 14: // Cancel button
+		case NGWW_CANCEL: // Cancel button
 			DeleteWindowById(WC_NETWORK_WINDOW, 0);
 			break;
-		case 4: case 5:
-			ShowDropDownMenu(w, _lan_internet_types_dropdown, _network_lan_internet, 5, 0, 0); // do it for widget 5
+		case NGWW_CONN_TXT: case NGWW_CONN_BTN: // 'Connection' droplist
+			ShowDropDownMenu(w, _lan_internet_types_dropdown, _network_lan_internet, NGWW_CONN_BTN, 0, 0); // do it for widget NSSW_CONN_BTN
 			break;
-		case 6: /* Sort by name */
-		case 7: /* Sort by connected clients */
-		case 8: /* Connectivity (green dot) */
-			if (ld->sort_type == e->we.click.widget - 6) ld->flags ^= VL_DESC;
+		case NGWW_NAME: // Sort by name
+		case NGWW_CLIENTS: // Sort by connected clients
+		case NGWW_INFO: // Connectivity (green dot)
+			if (ld->sort_type == e->we.click.widget - NGWW_NAME) ld->flags ^= VL_DESC;
 			ld->flags |= VL_RESORT;
-			ld->sort_type = e->we.click.widget - 6;
+			ld->sort_type = e->we.click.widget - NGWW_NAME;
 
 			_ng_sorting.order = !!(ld->flags & VL_DESC);
 			_ng_sorting.criteria = ld->sort_type;
 			SetWindowDirty(w);
 			break;
-		case 9: { /* Matrix to show networkgames */
+		case NGWW_MATRIX: { // Matrix to show networkgames
 			NetworkGameList *cur_item;
 			uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW;
 
@@ -415,52 +450,54 @@
 			nd->server = cur_item;
 			SetWindowDirty(w);
 		} break;
-		case 11: /* Find server automatically */
+		case NGWW_FIND: // Find server automatically
 			switch (_network_lan_internet) {
 				case 0: NetworkUDPSearchGame(); break;
 				case 1: NetworkUDPQueryMasterServer(); break;
 			}
 			break;
-		case 12: { // Add a server
-				ShowQueryString(
+		case NGWW_ADD: { // Add a server
+			ShowQueryString(
 				BindCString(_network_default_ip),
 				STR_NETWORK_ENTER_IP,
 				31 | 0x1000,  // maximum number of characters OR
 				250, // characters up to this width pixels, whichever is satisfied first
 				w, CS_ALPHANUMERAL);
 		} break;
-		case 13: /* Start server */
+		case NGWW_START: // Start server
 			ShowNetworkStartServerWindow();
 			break;
-		case 16: /* Join Game */
+		case NGWW_JOIN: // Join Game
 			if (nd->server != NULL) {
 				snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&nd->server->ip));
 				_network_last_port = nd->server->port;
 				ShowNetworkLobbyWindow(nd->server);
 			}
 			break;
-		case 17: // Refresh
+		case NGWW_REFRESH: // Refresh
 			if (nd->server != NULL)
 				NetworkUDPQueryServer(nd->server->info.hostname, nd->server->port);
 			break;
-		case 18: // NewGRF Settings
+		case NGWW_NEWGRF: // NewGRF Settings
 			if (nd->server != NULL) ShowNewGRFSettings(false, false, false, &nd->server->info.grfconfig);
 			break;
 
 	} break;
 
-	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
+	case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
 		switch (e->we.dropdown.button) {
-			case 5:
+			case NGWW_CONN_BTN:
 				_network_lan_internet = e->we.dropdown.index;
 				break;
+			default:
+				NOT_REACHED();
 		}
 
 		SetWindowDirty(w);
 		break;
 
 	case WE_MOUSELOOP:
-		if (nd->field == 3) HandleEditBox(w, &WP(w, network_ql_d).q, 3);
+		if (nd->field == NGWW_PLAYER) HandleEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
 		break;
 
 	case WE_MESSAGE:
@@ -470,9 +507,9 @@
 		break;
 
 	case WE_KEYPRESS:
-		if (nd->field != 3) {
+		if (nd->field != NGWW_PLAYER) {
 			if (nd->server != NULL) {
-				if (e->we.keypress.keycode == WKC_DELETE) { /* Press 'delete' to remove servers */
+				if (e->we.keypress.keycode == WKC_DELETE) { // Press 'delete' to remove servers
 					NetworkGameListRemoveItem(nd->server);
 					NetworkRebuildHostList();
 					nd->server = NULL;
@@ -481,9 +518,9 @@
 			break;
 		}
 
-		if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, 3, e) == 1) break; // enter pressed
+		if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NGWW_PLAYER, e) == 1) break; // enter pressed
 
-		// The name is only allowed when it starts with a letter!
+		/* The name is only allowed when it starts with a letter! */
 		if (_edit_str_buf[0] != '\0' && _edit_str_buf[0] != ' ') {
 			ttd_strlcpy(_network_player_name, _edit_str_buf, lengthof(_network_player_name));
 		} else {
@@ -500,57 +537,61 @@
 	case WE_RESIZE: {
 		w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
 
-		w->widget[9].data = (w->vscroll.cap << 8) + 1;
+		w->widget[NGWW_MATRIX].data = (w->vscroll.cap << 8) + 1;
 
-		int widget_width = w->widget[11].right - w->widget[11].left;
+		SetVScrollCount(w, ld->list_length);
+
+		int widget_width = w->widget[NGWW_FIND].right - w->widget[NGWW_FIND].left;
 		int space = (w->width - 4 * widget_width - 25) / 3;
 
 		int offset = 10;
 		for (uint i = 0; i < 4; i++) {
-			w->widget[11 + i].left  = offset;
+			w->widget[NGWW_FIND + i].left  = offset;
 			offset += widget_width;
-			w->widget[11 + i].right = offset;
+			w->widget[NGWW_FIND + i].right = offset;
 			offset += space;
 		}
 	} break;
 
-	case WE_DESTROY: /* Nicely clean up the sort-list */
+	case WE_DESTROY: // Nicely clean up the sort-list
 		free(WP(w, network_ql_d).sort_list);
 		break;
 	}
 }
 
 static const Widget _network_game_window_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                       STR_018B_CLOSE_WINDOW},
+/* TOP */
+{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                       STR_018B_CLOSE_WINDOW},            // NGWW_CLOSE
 {    WWT_CAPTION,   RESIZE_RIGHT,  BGC,    11,   449,     0,    13, STR_NETWORK_MULTIPLAYER,        STR_NULL},
 {      WWT_PANEL,   RESIZE_RB,     BGC,     0,   449,    14,   263, 0x0,                            STR_NULL},
 
-/* LEFT SIDE */
-{      WWT_PANEL,   RESIZE_LR,     BGC,   290,   440,    22,    33, 0x0,                            STR_NETWORK_ENTER_NAME_TIP},
-
-{      WWT_INSET,   RESIZE_NONE,   BGC,    90,   181,    22,    33, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP},
-{    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   170,   180,    23,    32, STR_0225,                       STR_NETWORK_CONNECTION_TIP},
+{       WWT_TEXT,   RESIZE_NONE,   BGC,     9,    85,    23,    35, STR_NETWORK_CONNECTION,         STR_NULL},
+{      WWT_INSET,   RESIZE_NONE,   BGC,    90,   181,    22,    33, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP},       // NGWW_CONN_TXT
+{    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   170,   180,    23,    32, STR_0225,                       STR_NETWORK_CONNECTION_TIP},       // NGWW_CONN_BTN
 
-{ WWT_PUSHTXTBTN,   RESIZE_RIGHT,  BTC,    10,    70,    42,    53, STR_NETWORK_GAME_NAME,          STR_NETWORK_GAME_NAME_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,    71,   150,    42,    53, STR_NETWORK_CLIENTS_CAPTION,    STR_NETWORK_CLIENTS_CAPTION_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,   151,   190,    42,    53, STR_EMPTY,                      STR_NETWORK_INFO_ICONS_TIP},
+{      WWT_PANEL,   RESIZE_LR,     BGC,   290,   440,    22,    33, 0x0,                            STR_NETWORK_ENTER_NAME_TIP},       // NGWW_PLAYER
 
-{     WWT_MATRIX,   RESIZE_RB,     BGC,    10,   190,    54,   236, (13 << 8) + 1,                  STR_NETWORK_CLICK_GAME_TO_SELECT},
-{  WWT_SCROLLBAR,   RESIZE_LRB,    BGC,   191,   202,    42,   236, STR_NULL,                       STR_0190_SCROLL_BAR_SCROLLS_LIST},
+/* LEFT SIDE */
+{ WWT_PUSHTXTBTN,   RESIZE_RIGHT,  BTC,    10,    70,    42,    53, STR_NETWORK_GAME_NAME,          STR_NETWORK_GAME_NAME_TIP},        // NGWW_NAME
+{ WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,    71,   150,    42,    53, STR_NETWORK_CLIENTS_CAPTION,    STR_NETWORK_CLIENTS_CAPTION_TIP},  // NGWW_CLIENTS
+{ WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,   151,   190,    42,    53, STR_EMPTY,                      STR_NETWORK_INFO_ICONS_TIP},       // NGWW_INFO
 
-{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,    10,   110,   246,   257, STR_NETWORK_FIND_SERVER,        STR_NETWORK_FIND_SERVER_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   118,   218,   246,   257, STR_NETWORK_ADD_SERVER,         STR_NETWORK_ADD_SERVER_TIP},
+{     WWT_MATRIX,   RESIZE_RB,     BGC,    10,   190,    54,   236, (13 << 8) + 1,                  STR_NETWORK_CLICK_GAME_TO_SELECT}, // NGWW_MATRIX
+{  WWT_SCROLLBAR,   RESIZE_LRB,    BGC,   191,   202,    42,   236, 0x0,                            STR_0190_SCROLL_BAR_SCROLLS_LIST},
 
 /* RIGHT SIDE */
-{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   226,   326,   246,   257, STR_NETWORK_START_SERVER,       STR_NETWORK_START_SERVER_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   334,   434,   246,   257, STR_012E_CANCEL,                STR_NULL},
+{      WWT_PANEL,   RESIZE_LRB,    BGC,   210,   440,    42,   236, 0x0,                            STR_NULL},                         // NGWW_DETAILS
 
-{      WWT_PANEL,   RESIZE_LRB,    BGC,   210,   440,    42,   236, 0x0,                            STR_NULL},
+{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   215,   315,   215,   226, STR_NETWORK_JOIN_GAME,          STR_NULL},                         // NGWW_JOIN
+{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   215,   226, STR_NETWORK_REFRESH,            STR_NETWORK_REFRESH_TIP},          // NGWW_REFRESH
 
-{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   215,   315,   215,   226, STR_NETWORK_JOIN_GAME,          STR_NULL},
-{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   215,   226, STR_NETWORK_REFRESH,            STR_NETWORK_REFRESH_TIP},
+{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   197,   208, STR_NEWGRF_SETTINGS_BUTTON,     STR_NULL},                         // NGWW_NEWGRF
 
-{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   197,   208, STR_NEWGRF_SETTINGS_BUTTON,     STR_NULL},
+/* BOTTOM */
+{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,    10,   110,   246,   257, STR_NETWORK_FIND_SERVER,        STR_NETWORK_FIND_SERVER_TIP},      // NGWW_FIND
+{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   118,   218,   246,   257, STR_NETWORK_ADD_SERVER,         STR_NETWORK_ADD_SERVER_TIP},       // NGWW_ADD
+{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   226,   326,   246,   257, STR_NETWORK_START_SERVER,       STR_NETWORK_START_SERVER_TIP},     // NGWW_START
+{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   334,   434,   246,   257, STR_012E_CANCEL,                STR_NULL},                         // NGWW_CANCEL
 
 {  WWT_RESIZEBOX,   RESIZE_LRTB,   BGC,   438,   449,   252,   263, 0x0,                            STR_RESIZE_BUTTON },
 
@@ -602,14 +643,46 @@
 	NSSWND_ROWSIZE = 12
 };
 
-/* Uses network_ql_d (network_d, querystr_d and list_d) WP macro */
+/** Enum for NetworkStartServerWindow, referring to _network_start_server_window_widgets */
+enum NetworkStartServerWidgets {
+	NSSW_CLOSE           =  0,   ///< Close 'X' button
+	NSSW_GAMENAME        =  4,   ///< Background for editbox to set game name
+	NSSW_SETPWD          =  5,   ///< 'Set password' button
+	NSSW_SELMAP          =  7,   ///< 'Select map' list
+	NSSW_CONNTYPE_TXT    = 10,   ///< 'Connection type' droplist
+	NSSW_CONNTYPE_BTN    = 11,   ///< 'Connection type' droplist button
+	NSSW_CLIENTS_BTND    = 13,   ///< 'Max clients' downarrow
+	NSSW_CLIENTS_TXT     = 14,   ///< 'Max clients' text
+	NSSW_CLIENTS_BTNU    = 15,   ///< 'Max clients' uparrow
+	NSSW_COMPANIES_BTND  = 17,   ///< 'Max companies' downarrow
+	NSSW_COMPANIES_TXT   = 18,   ///< 'Max companies' text
+	NSSW_COMPANIES_BTNU  = 19,   ///< 'Max companies' uparrow
+	NSSW_SPECTATORS_BTND = 21,   ///< 'Max spectators' downarrow
+	NSSW_SPECTATORS_TXT  = 22,   ///< 'Max spectators' text
+	NSSW_SPECTATORS_BTNU = 23,   ///< 'Max spectators' uparrow
+	NSSW_LANGUAGE_TXT    = 25,   ///< 'Language spoken' droplist
+	NSSW_LANGUAGE_BTN    = 26,   ///< 'Language spoken' droplist button
+	NSSW_START           = 27,   ///< 'Start' button
+	NSSW_LOAD            = 28,   ///< 'Load' button
+	NSSW_CANCEL          = 29,   ///< 'Cancel' button
+};
+
+/**
+ * Handler of actions done in the NetworkStartServer window
+ *
+ * @param w pointer to the Window structure
+ * @param e pointer to window event
+ * @note    Uses network_ql_d (network_d, querystr_d and list_d) WP macro
+ * @see     struct _network_start_server_window_widgets
+ * @see     enum NetworkStartServerWidgets
+ */
 static void NetworkStartServerWindowWndProc(Window *w, WindowEvent *e)
 {
 	network_d *nd = &WP(w, network_ql_d).n;
 
 	switch (e->event) {
-	case WE_CREATE: /* focus input box */
-		nd->field = 3;
+	case WE_CREATE: // focus input box
+		nd->field = NSSW_GAMENAME;
 		_network_game_info.use_password = (_network_server_password[0] != '\0');
 		break;
 
@@ -617,6 +690,7 @@
 		int y = NSSWND_START, pos;
 		const FiosItem *item;
 
+		/* draw basic widgets */
 		SetDParam(1, _connection_types_dropdown[_network_advertise]);
 		SetDParam(2, _network_game_info.clients_max);
 		SetDParam(3, _network_game_info.companies_max);
@@ -624,22 +698,15 @@
 		SetDParam(5, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
 		DrawWindowWidgets(w);
 
-		GfxFillRect(11, 63, 258, 215, 0xD7);
-		DrawEditBox(w, &WP(w, network_ql_d).q, 3);
-
-		DrawString(10, 22, STR_NETWORK_NEW_GAME_NAME, 2);
-
-		DrawString(10, 43, STR_NETWORK_SELECT_MAP, 2);
+		/* editbox to set game name */
+		DrawEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
 
-		DrawString(280,  63, STR_NETWORK_CONNECTION, 2);
-		DrawString(280,  95, STR_NETWORK_NUMBER_OF_CLIENTS, 2);
-		DrawString(280, 127, STR_NETWORK_NUMBER_OF_COMPANIES, 2);
-		DrawString(280, 159, STR_NETWORK_NUMBER_OF_SPECTATORS, 2);
-		DrawString(280, 191, STR_NETWORK_LANGUAGE_SPOKEN, 2);
+		/* if password is set, draw red '*' next to 'Set password' button */
+		if (_network_game_info.use_password) DoDrawString("*", 408, 23, TC_RED);
 
-		if (_network_game_info.use_password) DoDrawString("*", 408, 23, 3);
+		/* draw list of maps */
+		GfxFillRect(11, 63, 258, 215, 0xD7);  // black background of maps list
 
-		// draw list of maps
 		pos = w->vscroll.pos;
 		while (pos < _fios_num + 1) {
 			item = _fios_list + pos - 1;
@@ -647,7 +714,7 @@
 				GfxFillRect(11, y - 1, 258, y + 10, 155); // show highlighted item with a different colour
 
 			if (pos == 0) {
-				DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, 9);
+				DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, TC_DARK_GREEN);
 			} else {
 				DoDrawString(item->title, 14, y, _fios_colors[item->type] );
 			}
@@ -661,17 +728,17 @@
 	case WE_CLICK:
 		nd->field = e->we.click.widget;
 		switch (e->we.click.widget) {
-		case 0: /* Close 'X' */
-		case 22: /* Cancel button */
+		case NSSW_CLOSE:  // Close 'X'
+		case NSSW_CANCEL: // Cancel button
 			ShowNetworkGameWindow();
 			break;
 
-		case 4: /* Set password button */
-			nd->widget_id = 4;
+		case NSSW_SETPWD: // Set password button
+			nd->widget_id = NSSW_SETPWD;
 			ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, w, CS_ALPHANUMERAL);
 			break;
 
-		case 5: { /* Select map */
+		case NSSW_SELMAP: { // Select map
 			int y = (e->we.click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
 
 			y += w->vscroll.pos;
@@ -680,41 +747,47 @@
 			nd->map = (y == 0) ? NULL : _fios_list + y - 1;
 			SetWindowDirty(w);
 			} break;
-		case 7: case 8: /* Connection type */
-			ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, 8, 0, 0); // do it for widget 8
+		case NSSW_CONNTYPE_TXT: case NSSW_CONNTYPE_BTN: // Connection type
+			ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, NSSW_CONNTYPE_BTN, 0, 0); // do it for widget NSSW_CONNTYPE_BTN
 			break;
-		case  9: case 11: // Click on up/down button for number of players
-		case 12: case 14: // Click on up/down button for number of companies
-		case 15: case 17: // Click on up/down button for number of spectators
+		case NSSW_CLIENTS_BTND:    case NSSW_CLIENTS_BTNU:    // Click on up/down button for number of clients
+		case NSSW_COMPANIES_BTND:  case NSSW_COMPANIES_BTNU:  // Click on up/down button for number of companies
+		case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU: // Click on up/down button for number of spectators
 			/* Don't allow too fast scrolling */
 			if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
 				HandleButtonClick(w, e->we.click.widget);
 				SetWindowDirty(w);
 				switch (e->we.click.widget) {
 					default: NOT_REACHED();
-					case  9: case 11: _network_game_info.clients_max    = clamp(_network_game_info.clients_max    + e->we.click.widget - 10, 2, MAX_CLIENTS); break;
-					case 12: case 14: _network_game_info.companies_max  = clamp(_network_game_info.companies_max  + e->we.click.widget - 13, 1, MAX_PLAYERS); break;
-					case 15: case 17: _network_game_info.spectators_max = clamp(_network_game_info.spectators_max + e->we.click.widget - 16, 0, MAX_CLIENTS); break;
+					case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU:
+						_network_game_info.clients_max    = Clamp(_network_game_info.clients_max    + e->we.click.widget - NSSW_CLIENTS_TXT,    2, MAX_CLIENTS);
+						break;
+					case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU:
+						_network_game_info.companies_max  = Clamp(_network_game_info.companies_max  + e->we.click.widget - NSSW_COMPANIES_TXT,  1, MAX_PLAYERS);
+						break;
+					case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU:
+						_network_game_info.spectators_max = Clamp(_network_game_info.spectators_max + e->we.click.widget - NSSW_SPECTATORS_TXT, 0, MAX_CLIENTS);
+						break;
 				}
 			}
 			_left_button_clicked = false;
 			break;
-		case 10: // Click on number of players
-			nd->widget_id = 10;
+		case NSSW_CLIENTS_TXT:    // Click on number of players
+			nd->widget_id = NSSW_CLIENTS_TXT;
 			SetDParam(0, _network_game_info.clients_max);
-			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS, 3, 50, w, CS_NUMERAL);
+			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS,    3, 50, w, CS_NUMERAL);
 			break;
-		case 13: // Click on number of companies
-			nd->widget_id = 13;
+		case NSSW_COMPANIES_TXT:  // Click on number of companies
+			nd->widget_id = NSSW_COMPANIES_TXT;
 			SetDParam(0, _network_game_info.companies_max);
-			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_COMPANIES, 3, 50, w, CS_NUMERAL);
+			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_COMPANIES,  3, 50, w, CS_NUMERAL);
 			break;
-		case 16: // Click on number of companies
-			nd->widget_id = 16;
+		case NSSW_SPECTATORS_TXT: // Click on number of spectators
+			nd->widget_id = NSSW_SPECTATORS_TXT;
 			SetDParam(0, _network_game_info.spectators_max);
 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_SPECTATORS, 3, 50, w, CS_NUMERAL);
 			break;
-		case 18: case 19: { /* Language */
+		case NSSW_LANGUAGE_TXT: case NSSW_LANGUAGE_BTN: { // Language
 			uint sel = 0;
 			for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) {
 				if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) {
@@ -722,10 +795,10 @@
 					break;
 				}
 			}
-			ShowDropDownMenu(w, _language_dropdown, sel, 19, 0, 0);
+			ShowDropDownMenu(w, _language_dropdown, sel, NSSW_LANGUAGE_BTN, 0, 0);
 			break;
 		}
-		case 20: /* Start game */
+		case NSSW_START: // Start game
 			_is_network_server = true;
 
 			if (nd->map == NULL) { // start random new game
@@ -742,37 +815,38 @@
 				}
 			}
 			break;
-		case 21: /* Load game */
+		case NSSW_LOAD: // Load game
 			_is_network_server = true;
-			/* XXX - WC_NETWORK_WINDOW should stay, but if it stays, it gets
+			/* XXX - WC_NETWORK_WINDOW (this window) should stay, but if it stays, it gets
 			 * copied all the elements of 'load game' and upon closing that, it segfaults */
-			DeleteWindowById(WC_NETWORK_WINDOW, 0);
+			DeleteWindow(w);
 			ShowSaveLoadDialog(SLD_LOAD_GAME);
 			break;
 		}
 		break;
 
-	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
+	case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
 		switch (e->we.dropdown.button) {
-			case  8: _network_advertise                = (e->we.dropdown.index != 0); break;
-			case 10: _network_game_info.clients_max    = e->we.dropdown.index;        break;
-			case 12: _network_game_info.companies_max  = e->we.dropdown.index;        break;
-			case 14: _network_game_info.spectators_max = e->we.dropdown.index;        break;
-			case 16:
+			case NSSW_CONNTYPE_BTN:
+				_network_advertise = (e->we.dropdown.index != 0);
+				break;
+			case NSSW_LANGUAGE_BTN:
 				_network_game_info.server_lang = _language_dropdown[e->we.dropdown.index] - STR_NETWORK_LANG_ANY;
 				break;
+			default:
+				NOT_REACHED();
 		}
 
 		SetWindowDirty(w);
 		break;
 
 	case WE_MOUSELOOP:
-		if (nd->field == 3) HandleEditBox(w, &WP(w, network_ql_d).q, 3);
+		if (nd->field == NSSW_GAMENAME) HandleEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
 		break;
 
 	case WE_KEYPRESS:
-		if (nd->field == 3) {
-			if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, 3, e) == 1) break; // enter pressed
+		if (nd->field == NSSW_GAMENAME) {
+			if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, e) == 1) break; // enter pressed
 
 			ttd_strlcpy(_network_server_name, WP(w, network_ql_d).q.text.buf, sizeof(_network_server_name));
 		}
@@ -781,7 +855,7 @@
 	case WE_ON_EDIT_TEXT:
 		if (e->we.edittext.str == NULL) break;
 
-		if (nd->widget_id == 4) {
+		if (nd->widget_id == NSSW_SETPWD) {
 			ttd_strlcpy(_network_server_password, e->we.edittext.str, lengthof(_network_server_password));
 			_network_game_info.use_password = (_network_server_password[0] != '\0');
 		} else {
@@ -789,9 +863,9 @@
 			InvalidateWidget(w, nd->widget_id);
 			switch (nd->widget_id) {
 				default: NOT_REACHED();
-				case 10: _network_game_info.clients_max    = clamp(value, 2, MAX_CLIENTS); break;
-				case 13: _network_game_info.companies_max  = clamp(value, 1, MAX_PLAYERS); break;
-				case 16: _network_game_info.spectators_max = clamp(value, 0, MAX_CLIENTS); break;
+				case NSSW_CLIENTS_TXT:    _network_game_info.clients_max    = Clamp(value, 2, MAX_CLIENTS); break;
+				case NSSW_COMPANIES_TXT:  _network_game_info.companies_max  = Clamp(value, 1, MAX_PLAYERS); break;
+				case NSSW_SPECTATORS_TXT: _network_game_info.spectators_max = Clamp(value, 0, MAX_CLIENTS); break;
 			}
 		}
 
@@ -801,34 +875,50 @@
 }
 
 static const Widget _network_start_server_window_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                       STR_018B_CLOSE_WINDOW },
-{    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_START_GAME_WINDOW,  STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   243, 0x0,                            STR_NULL},
+/* Window decoration and background panel */
+{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW },               // NSSW_CLOSE
+{    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_START_GAME_WINDOW,    STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   243, 0x0,                              STR_NULL},
 
-{      WWT_PANEL,   RESIZE_NONE,   BGC,   100,   272,    22,    33, 0x0,                            STR_NETWORK_NEW_GAME_NAME_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   285,   405,    22,    33, STR_NETWORK_SET_PASSWORD,       STR_NETWORK_PASSWORD_TIP},
+/* Set game name and password widgets */
+{       WWT_TEXT,   RESIZE_NONE,   BGC,    10,    90,    22,    34, STR_NETWORK_NEW_GAME_NAME,        STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,   BGC,   100,   272,    22,    33, 0x0,                              STR_NETWORK_NEW_GAME_NAME_TIP},        // NSSW_GAMENAME
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   285,   405,    22,    33, STR_NETWORK_SET_PASSWORD,         STR_NETWORK_PASSWORD_TIP},             // NSSW_SETPWD
 
-{      WWT_INSET,   RESIZE_NONE,   BGC,    10,   271,    62,   216, 0x0,                            STR_NETWORK_SELECT_MAP_TIP},
-{  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   259,   270,    63,   215, 0x0,                            STR_0190_SCROLL_BAR_SCROLLS_LIST},
+/* List of playable scenarios */
+{       WWT_TEXT,   RESIZE_NONE,   BGC,    10,   110,    43,    55, STR_NETWORK_SELECT_MAP,           STR_NULL},
+{      WWT_INSET,   RESIZE_NONE,   BGC,    10,   271,    62,   216, STR_NULL,                         STR_NETWORK_SELECT_MAP_TIP},           // NSSW_SELMAP
+{  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   259,   270,    63,   215, 0x0,                              STR_0190_SCROLL_BAR_SCROLLS_LIST},
+
 /* Combo/selection boxes to control Connection Type / Max Clients / Max Companies / Max Observers / Language */
-{      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,    77,    88, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP},
-{    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,    78,    87, STR_0225,                       STR_NETWORK_CONNECTION_TIP},
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   109,   120, SPR_ARROW_DOWN,                 STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   109,   120, STR_NETWORK_CLIENTS_SELECT,     STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   109,   120, SPR_ARROW_UP,                   STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   141,   152, SPR_ARROW_DOWN,                 STR_NETWORK_NUMBER_OF_COMPANIES_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   141,   152, STR_NETWORK_COMPANIES_SELECT,   STR_NETWORK_NUMBER_OF_COMPANIES_TIP},
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   141,   152, SPR_ARROW_UP,                   STR_NETWORK_NUMBER_OF_COMPANIES_TIP},
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   173,   184, SPR_ARROW_DOWN,                 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   173,   184, STR_NETWORK_SPECTATORS_SELECT,  STR_NETWORK_NUMBER_OF_SPECTATORS_TIP},
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   173,   184, SPR_ARROW_UP,                   STR_NETWORK_NUMBER_OF_SPECTATORS_TIP},
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,    63,    75, STR_NETWORK_CONNECTION,           STR_NULL},
+{      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,    77,    88, STR_NETWORK_LAN_INTERNET_COMBO,   STR_NETWORK_CONNECTION_TIP},           // NSSW_CONNTYPE_TXT
+{    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,    78,    87, STR_0225,                         STR_NETWORK_CONNECTION_TIP},           // NSSW_CONNTYPE_BTN
 
-{      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,   205,   216, STR_NETWORK_LANGUAGE_COMBO,     STR_NETWORK_LANGUAGE_TIP},
-{    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,   206,   215, STR_0225,                       STR_NETWORK_LANGUAGE_TIP},
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,    95,   107, STR_NETWORK_NUMBER_OF_CLIENTS,    STR_NULL},
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   109,   120, SPR_ARROW_DOWN,                   STR_NETWORK_NUMBER_OF_CLIENTS_TIP},    // NSSW_CLIENTS_BTND
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   109,   120, STR_NETWORK_CLIENTS_SELECT,       STR_NETWORK_NUMBER_OF_CLIENTS_TIP},    // NSSW_CLIENTS_TXT
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   109,   120, SPR_ARROW_UP,                     STR_NETWORK_NUMBER_OF_CLIENTS_TIP},    // NSSW_CLIENTS_BTNU
 
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    40,   140,   224,   235, STR_NETWORK_START_GAME,         STR_NETWORK_START_GAME_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   150,   250,   224,   235, STR_NETWORK_LOAD_GAME,          STR_NETWORK_LOAD_GAME_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   260,   360,   224,   235, STR_012E_CANCEL,                STR_NULL},
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,   127,   139, STR_NETWORK_NUMBER_OF_COMPANIES,  STR_NULL},
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   141,   152, SPR_ARROW_DOWN,                   STR_NETWORK_NUMBER_OF_COMPANIES_TIP},  // NSSW_COMPANIES_BTND
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   141,   152, STR_NETWORK_COMPANIES_SELECT,     STR_NETWORK_NUMBER_OF_COMPANIES_TIP},  // NSSW_COMPANIES_TXT
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   141,   152, SPR_ARROW_UP,                     STR_NETWORK_NUMBER_OF_COMPANIES_TIP},  // NSSW_COMPANIES_BTNU
+
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,   159,   171, STR_NETWORK_NUMBER_OF_SPECTATORS, STR_NULL},
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   173,   184, SPR_ARROW_DOWN,                   STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTND
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   173,   184, STR_NETWORK_SPECTATORS_SELECT,    STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_TXT
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   173,   184, SPR_ARROW_UP,                     STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTNU
+
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,   191,   203, STR_NETWORK_LANGUAGE_SPOKEN,      STR_NULL},
+{      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,   205,   216, STR_NETWORK_LANGUAGE_COMBO,       STR_NETWORK_LANGUAGE_TIP},             // NSSW_LANGUAGE_TXT
+{    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,   206,   215, STR_0225,                         STR_NETWORK_LANGUAGE_TIP},             // NSSW_LANGUAGE_BTN
+
+/* Buttons Start / Load / Cancel */
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    40,   140,   224,   235, STR_NETWORK_START_GAME,           STR_NETWORK_START_GAME_TIP},           // NSSW_START
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   150,   250,   224,   235, STR_NETWORK_LOAD_GAME,            STR_NETWORK_LOAD_GAME_TIP},            // NSSW_LOAD
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   260,   360,   224,   235, STR_012E_CANCEL,                  STR_NULL},                             // NSSW_CANCEL
+
 {   WIDGETS_END},
 };
 
@@ -872,7 +962,27 @@
 	return PLAYER_FIRST;
 }
 
-/* uses network_d WP macro */
+/** Enum for NetworkLobbyWindow, referring to _network_lobby_window_widgets */
+enum NetworkLobbyWindowWidgets {
+	NLWW_CLOSE    =  0, ///< Close 'X' button
+	NLWW_MATRIX   =  5, ///< List of companies
+	NLWW_DETAILS  =  7, ///< Company details
+	NLWW_JOIN     =  8, ///< 'Join company' button
+	NLWW_NEW      =  9, ///< 'New company' button
+	NLWW_SPECTATE = 10, ///< 'Spectate game' button
+	NLWW_REFRESH  = 11, ///< 'Refresh server' button
+	NLWW_CANCEL   = 12, ///< 'Cancel' button
+};
+
+/**
+ * Handler of actions done in the NetworkLobby window
+ *
+ * @param w pointer to the Window structure
+ * @param e pointer to window event
+ * @note    uses network_d WP macro
+ * @see     struct _network_lobby_window_widgets
+ * @see     enum NetworkLobbyWindowWidgets
+ */
 static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
 {
 	network_d *nd = &WP(w, network_d);
@@ -886,18 +996,17 @@
 		const NetworkGameInfo *gi = &nd->server->info;
 		int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
 
-		SetWindowWidgetDisabledState(w, 7, nd->company == (byte)-1);
-		SetWindowWidgetDisabledState(w, 8, gi->companies_on >= gi->companies_max);
-		/* You can not join a server as spectator when it has no companies active..
-		 * it causes some nasty crashes */
-		SetWindowWidgetDisabledState(w, 9, gi->spectators_on >= gi->spectators_max ||
-				gi->companies_on == 0);
+		/* Join button is disabled when no company is selected */
+		w->SetWidgetDisabledState(NLWW_JOIN, nd->company == INVALID_PLAYER);
+		/* Cannot start new company if there are too many */
+		w->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max);
+		/* Cannot spectate if there are too many spectators */
+		w->SetWidgetDisabledState(NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max);
 
+		/* Draw window widgets */
+		SetDParamStr(0, gi->server_name);
 		DrawWindowWidgets(w);
 
-		SetDParamStr(0, gi->server_name);
-		DrawString(10, 22, STR_NETWORK_PREPARE_TO_JOIN, 2);
-
 		/* Draw company list */
 		pos = w->vscroll.pos;
 		while (pos < gi->companies_on) {
@@ -906,7 +1015,7 @@
 			if (nd->company == company)
 				GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour
 
-			DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, 16, 135 - 13);
+			DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13);
 			if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y);
 
 			/* If the company's income was positive puts a green dot else a red dot */
@@ -920,41 +1029,41 @@
 
 		/* Draw info about selected company when it is selected in the left window */
 		GfxFillRect(174, 39, 403, 75, 157);
-		DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, 0);
-		if (nd->company != (byte)-1) {
+		DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
+		if (nd->company != INVALID_PLAYER) {
 			const uint x = 183;
-			const uint trunc_width = w->widget[6].right - x;
+			const uint trunc_width = w->widget[NLWW_DETAILS].right - x;
 			y = 80;
 
 			SetDParam(0, nd->server->info.clients_on);
 			SetDParam(1, nd->server->info.clients_max);
 			SetDParam(2, nd->server->info.companies_on);
 			SetDParam(3, nd->server->info.companies_max);
-			DrawString(x, y, STR_NETWORK_CLIENTS, 2);
+			DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
 			y += 10;
 
 			SetDParamStr(0, _network_player_info[nd->company].company_name);
-			DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, 2, trunc_width);
+			DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width);
 			y += 10;
 
 			SetDParam(0, _network_player_info[nd->company].inaugurated_year);
-			DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, 2); // inauguration year
+			DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year
 			y += 10;
 
 			SetDParam(0, _network_player_info[nd->company].company_value);
-			DrawString(x, y, STR_NETWORK_VALUE, 2); // company value
+			DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value
 			y += 10;
 
 			SetDParam(0, _network_player_info[nd->company].money);
-			DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, 2); // current balance
+			DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance
 			y += 10;
 
 			SetDParam(0, _network_player_info[nd->company].income);
-			DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, 2); // last year's income
+			DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income
 			y += 10;
 
 			SetDParam(0, _network_player_info[nd->company].performance);
-			DrawString(x, y, STR_NETWORK_PERFORMANCE, 2); // performance
+			DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance
 			y += 10;
 
 			SetDParam(0, _network_player_info[nd->company].num_vehicle[0]);
@@ -962,7 +1071,7 @@
 			SetDParam(2, _network_player_info[nd->company].num_vehicle[2]);
 			SetDParam(3, _network_player_info[nd->company].num_vehicle[3]);
 			SetDParam(4, _network_player_info[nd->company].num_vehicle[4]);
-			DrawString(x, y, STR_NETWORK_VEHICLES, 2); // vehicles
+			DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles
 			y += 10;
 
 			SetDParam(0, _network_player_info[nd->company].num_station[0]);
@@ -970,43 +1079,43 @@
 			SetDParam(2, _network_player_info[nd->company].num_station[2]);
 			SetDParam(3, _network_player_info[nd->company].num_station[3]);
 			SetDParam(4, _network_player_info[nd->company].num_station[4]);
-			DrawString(x, y, STR_NETWORK_STATIONS, 2); // stations
+			DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations
 			y += 10;
 
 			SetDParamStr(0, _network_player_info[nd->company].players);
-			DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, 2, trunc_width); // players
+			DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players
 		}
 	} break;
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
-		case 0: case 11: /* Close 'X' | Cancel button */
+		case NLWW_CLOSE:    // Close 'X'
+		case NLWW_CANCEL:   // Cancel button
 			ShowNetworkGameWindow();
 			break;
-		case 4: { /* Company list */
+		case NLWW_MATRIX: { // Company list
 			uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW;
 
-			if (id_v >= w->vscroll.cap) return;
+			if (id_v >= w->vscroll.cap) break;
 
 			id_v += w->vscroll.pos;
 			nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
 			SetWindowDirty(w);
 		} break;
-		case 7: /* Join company */
-			if (nd->company != (byte)-1) {
-				_network_playas = nd->company;
-				NetworkClientConnectGame(_network_last_host, _network_last_port);
-			}
+		case NLWW_JOIN:     // Join company
+			/* Button can be clicked only when it is enabled */
+			_network_playas = nd->company;
+			NetworkClientConnectGame(_network_last_host, _network_last_port);
 			break;
-		case 8: /* New company */
+		case NLWW_NEW:      // New company
 			_network_playas = PLAYER_NEW_COMPANY;
 			NetworkClientConnectGame(_network_last_host, _network_last_port);
 			break;
-		case 9: /* Spectate game */
+		case NLWW_SPECTATE: // Spectate game
 			_network_playas = PLAYER_SPECTATOR;
 			NetworkClientConnectGame(_network_last_host, _network_last_port);
 			break;
-		case 10: /* Refresh */
+		case NLWW_REFRESH:  // Refresh
 			NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
 			NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
 			break;
@@ -1019,24 +1128,25 @@
 }
 
 static const Widget _network_lobby_window_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                  STR_018B_CLOSE_WINDOW },
-{    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_GAME_LOBBY,    STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   234, 0x0,                       STR_NULL},
-
-// company list
-{      WWT_PANEL,   RESIZE_NONE,   BTC,    10,   155,    38,    49, 0x0,                       STR_NULL},
-{     WWT_MATRIX,   RESIZE_NONE,   BGC,    10,   155,    50,   190, (10 << 8) + 1,             STR_NETWORK_COMPANY_LIST_TIP},
-{  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   156,   167,    38,   190, STR_NULL,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                    STR_018B_CLOSE_WINDOW },           // NLWW_CLOSE
+{    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_GAME_LOBBY,      STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   234, 0x0,                         STR_NULL},
+{       WWT_TEXT,   RESIZE_NONE,   BGC,    10,   419,    22,    34, STR_NETWORK_PREPARE_TO_JOIN, STR_NULL},
 
-// company/player info
-{      WWT_PANEL,   RESIZE_NONE,   BGC,   173,   404,    38,   190, 0x0,                       STR_NULL},
+/* company list */
+{      WWT_PANEL,   RESIZE_NONE,   BTC,    10,   155,    38,    49, 0x0,                         STR_NULL},
+{     WWT_MATRIX,   RESIZE_NONE,   BGC,    10,   155,    50,   190, (10 << 8) + 1,               STR_NETWORK_COMPANY_LIST_TIP},     // NLWW_MATRIX
+{  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   156,   167,    38,   190, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST},
 
-// buttons
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    10,   151,   200,   211, STR_NETWORK_JOIN_COMPANY,  STR_NETWORK_JOIN_COMPANY_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    10,   151,   215,   226, STR_NETWORK_NEW_COMPANY,   STR_NETWORK_NEW_COMPANY_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   158,   268,   200,   211, STR_NETWORK_SPECTATE_GAME, STR_NETWORK_SPECTATE_GAME_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   158,   268,   215,   226, STR_NETWORK_REFRESH,       STR_NETWORK_REFRESH_TIP},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   278,   388,   200,   211, STR_012E_CANCEL,           STR_NULL},
+/* company/player info */
+{      WWT_PANEL,   RESIZE_NONE,   BGC,   173,   404,    38,   190, 0x0,                         STR_NULL},                         // NLWW_DETAILS
+
+/* buttons */
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    10,   151,   200,   211, STR_NETWORK_JOIN_COMPANY,    STR_NETWORK_JOIN_COMPANY_TIP},     // NLWW_JOIN
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    10,   151,   215,   226, STR_NETWORK_NEW_COMPANY,     STR_NETWORK_NEW_COMPANY_TIP},      // NLWW_NEW
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   158,   268,   200,   211, STR_NETWORK_SPECTATE_GAME,   STR_NETWORK_SPECTATE_GAME_TIP},    // NLWW_SPECTATE
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   158,   268,   215,   226, STR_NETWORK_REFRESH,         STR_NETWORK_REFRESH_TIP},          // NLWW_REFRESH
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   278,   388,   200,   211, STR_012E_CANCEL,             STR_NULL},                         // NLWW_CANCEL
 
 {   WIDGETS_END},
 };
@@ -1311,7 +1421,7 @@
 	switch (e->event) {
 	case WE_PAINT: {
 		int i, y, sel;
-		byte colour;
+		TextColour colour;
 		DrawWindowWidgets(w);
 
 		// Draw the actions
@@ -1323,9 +1433,9 @@
 
 			if (sel-- == 0) { // Selected item, highlight it
 				GfxFillRect(1, y, 150 - 2, y + CLNWND_ROWSIZE - 1, 0);
-				colour = 0xC;
+				colour = TC_WHITE;
 			} else {
-				colour = 0x10;
+				colour = TC_BLACK;
 			}
 
 			DoDrawString(_clientlist_action[i], 4, y, colour);
@@ -1362,7 +1472,7 @@
 	case WE_PAINT: {
 		NetworkClientInfo *ci;
 		int y, i = 0;
-		byte colour;
+		TextColour colour;
 
 		// Check if we need to reset the height
 		if (!CheckClientListHeight(w)) break;
@@ -1374,9 +1484,9 @@
 		FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
 			if (_selected_clientlist_item == i++) { // Selected item, highlight it
 				GfxFillRect(1, y, 248, y + CLNWND_ROWSIZE - 1, 0);
-				colour = 0xC;
+				colour = TC_WHITE;
 			} else {
-				colour = 0x10;
+				colour = TC_BLACK;
 			}
 
 			if (ci->client_index == NETWORK_SERVER_INDEX) {
@@ -1463,7 +1573,7 @@
 		uint8 progress; // used for progress bar
 		DrawWindowWidgets(w);
 
-		DrawStringCentered(125, 35, STR_NETWORK_CONNECTING_1 + _network_join_status, 14);
+		DrawStringCentered(125, 35, STR_NETWORK_CONNECTING_1 + _network_join_status, TC_GREY);
 		switch (_network_join_status) {
 			case NETWORK_JOIN_STATUS_CONNECTING: case NETWORK_JOIN_STATUS_AUTHORIZING:
 			case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO:
@@ -1471,13 +1581,13 @@
 				break;
 			case NETWORK_JOIN_STATUS_WAITING:
 				SetDParam(0, _network_join_waiting);
-				DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_WAITING, 14);
+				DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_WAITING, TC_GREY);
 				progress = 15; // third stage is 15%
 				break;
 			case NETWORK_JOIN_STATUS_DOWNLOADING:
 				SetDParam(0, _network_join_kbytes);
 				SetDParam(1, _network_join_kbytes_total);
-				DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_DOWNLOADING, 14);
+				DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_DOWNLOADING, TC_GREY);
 				/* Fallthrough */
 			default: /* Waiting is 15%, so the resting receivement of map is maximum 70% */
 				progress = 15 + _network_join_kbytes * (100 - 15) / _network_join_kbytes_total;
@@ -1685,23 +1795,11 @@
 {
 	switch (e->event) {
 	case WE_CREATE:
-		SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0);
-		SETBIT(_no_scroll, SCROLL_CHAT); // do not scroll the game with the arrow-keys
 		break;
 
 	case WE_PAINT: {
-		static const StringID chat_captions[] = {
-			STR_NETWORK_CHAT_ALL_CAPTION,
-			STR_NETWORK_CHAT_COMPANY_CAPTION,
-			STR_NETWORK_CHAT_CLIENT_CAPTION
-		};
-		StringID msg;
-
 		DrawWindowWidgets(w);
 
-		assert(WP(w, chatquerystr_d).caption < lengthof(chat_captions));
-		msg = chat_captions[WP(w, chatquerystr_d).caption];
-		DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, msg, 16);
 		DrawEditBox(w, &WP(w, chatquerystr_d), 2);
 	} break;
 
@@ -1738,7 +1836,7 @@
 
 	case WE_DESTROY:
 		SendWindowMessage(WC_NEWS_WINDOW, 0, WE_DESTROY, 0, 0);
-		CLRBIT(_no_scroll, SCROLL_CHAT);
+		ClrBit(_no_scroll, SCROLL_CHAT);
 		break;
 	}
 }
@@ -1770,11 +1868,102 @@
 
 	w = AllocateWindowDesc(&_chat_window_desc);
 
-	LowerWindowWidget(w, 2);
+	w->LowerWidget(2);
 	WP(w, chatquerystr_d).caption = type; // Misuse of caption
 	WP(w, chatquerystr_d).dest    = dest;
 	WP(w, chatquerystr_d).afilter = CS_ALPHANUMERAL;
 	InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_buf, lengthof(_edit_str_buf), 0);
 }
 
+/** Enum for NetworkGameWindow, referring to _network_game_window_widgets */
+enum NetworkCompanyPasswordWindowWidgets {
+	NCPWW_CLOSE,                    ///< Close 'X' button
+	NCPWW_CAPTION,                  ///< Caption of the whole window
+	NCPWW_BACKGROUND,               ///< The background of the interface
+	NCPWW_LABEL,                    ///< Label in front of the password field
+	NCPWW_PASSWORD,                 ///< Input field for the password
+	NCPWW_SAVE_AS_DEFAULT_PASSWORD, ///< Toggle 'button' for saving the current password as default password
+	NCPWW_CANCEL,                   ///< Close the window without changing anything
+	NCPWW_OK,                       ///< Safe the password etc.
+};
+
+static void NetworkCompanyPasswordWindowWndProc(Window *w, WindowEvent *e)
+{
+	switch (e->event) {
+		case WE_PAINT:
+			DrawWindowWidgets(w);
+			DrawEditBox(w, &WP(w, chatquerystr_d), 4);
+			break;
+
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case NCPWW_OK: {
+					if (w->IsWidgetLowered(NCPWW_SAVE_AS_DEFAULT_PASSWORD)) {
+						snprintf(_network_default_company_pass, lengthof(_network_default_company_pass), "%s", _edit_str_buf);
+					}
+
+					/* empty password is a '*' because of console argument */
+					if (StrEmpty(_edit_str_buf)) snprintf(_edit_str_buf, lengthof(_edit_str_buf), "*");
+					char *password = _edit_str_buf;
+					NetworkChangeCompanyPassword(1, &password);
+				}
+
+				/* FALL THROUGH */
+				case NCPWW_CANCEL:
+					DeleteWindow(w);
+					break;
+
+				case NCPWW_SAVE_AS_DEFAULT_PASSWORD:
+					w->ToggleWidgetLoweredState(NCPWW_SAVE_AS_DEFAULT_PASSWORD);
+					SetWindowDirty(w);
+					break;
+			}
+			break;
+
+		case WE_MOUSELOOP:
+			HandleEditBox(w, &WP(w, chatquerystr_d), 4);
+			break;
+
+		case WE_KEYPRESS:
+			switch (HandleEditBoxKey(w, &WP(w, chatquerystr_d), 4, e)) {
+				case 1: // Return
+					/* FALLTHROUGH */
+				case 2: // Escape
+					DeleteWindow(w);
+					break;
+			}
+			break;
+	}
+}
+
+static const Widget _ncp_window_widgets[] = {
+{   WWT_CLOSEBOX, RESIZE_NONE, 14,   0,  10,  0, 13, STR_00C5,                          STR_018B_CLOSE_WINDOW},
+{    WWT_CAPTION, RESIZE_NONE, 14,  11, 299,  0, 13, STR_COMPANY_PASSWORD_CAPTION,      STR_018C_WINDOW_TITLE_DRAG_THIS},
+{      WWT_PANEL, RESIZE_NONE, 14,   0, 299, 14, 50, 0x0,                               STR_NULL},
+{       WWT_TEXT, RESIZE_NONE, 14,   5, 100, 19, 30, STR_COMPANY_PASSWORD,              STR_NULL},
+{      WWT_PANEL, RESIZE_NONE, 14, 101, 294, 19, 30, 0x0,                               STR_NULL},
+{    WWT_TEXTBTN, RESIZE_NONE, 14, 101, 294, 35, 46, STR_MAKE_DEFAULT_COMPANY_PASSWORD, STR_MAKE_DEFAULT_COMPANY_PASSWORD_TIP},
+{ WWT_PUSHTXTBTN, RESIZE_NONE, 14,   0, 149, 51, 62, STR_012E_CANCEL,                   STR_COMPANY_PASSWORD_CANCEL},
+{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 150, 299, 51, 62, STR_012F_OK,                       STR_COMPANY_PASSWORD_OK},
+{   WIDGETS_END},
+};
+
+static const WindowDesc _ncp_window_desc = {
+	WDP_AUTO, WDP_AUTO, 300, 63, 300, 63,
+	WC_COMPANY_PASSWORD_WINDOW, WC_NONE,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON,
+	_ncp_window_widgets,
+	NetworkCompanyPasswordWindowWndProc
+};
+
+void ShowNetworkCompanyPasswordWindow()
+{
+	DeleteWindowById(WC_COMPANY_PASSWORD_WINDOW, 0);
+
+	_edit_str_buf[0] = '\0';
+	Window *w = AllocateWindowDesc(&_ncp_window_desc);
+	WP(w, chatquerystr_d).afilter = CS_ALPHANUMERAL;
+	InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_buf, min(lengthof(_network_default_company_pass), lengthof(_edit_str_buf)), 0);
+}
+
 #endif /* ENABLE_NETWORK */
--- a/src/network/network_gui.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/network_gui.h	Mon Dec 03 23:39:38 2007 +0000
@@ -13,6 +13,7 @@
 void ShowJoinStatusWindow();
 void ShowNetworkGameWindow();
 void ShowClientList();
+void ShowNetworkCompanyPasswordWindow();
 
 #else /* ENABLE_NETWORK */
 /* Network function stubs when networking is disabled */
@@ -20,6 +21,7 @@
 static inline void ShowNetworkChatQueryWindow(byte desttype, int dest) {}
 static inline void ShowClientList() {}
 static inline void ShowNetworkGameWindow() {}
+static inline void ShowNetworkCompanyPasswordWindow() {}
 
 #endif /* ENABLE_NETWORK */
 
--- a/src/network/network_server.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/network_server.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -197,12 +197,12 @@
 	uint grf_count = 0;
 
 	for (c = _grfconfig; c != NULL; c = c->next) {
-		if (!HASBIT(c->flags, GCF_STATIC)) grf_count++;
+		if (!HasBit(c->flags, GCF_STATIC)) grf_count++;
 	}
 
 	p->Send_uint8 (grf_count);
 	for (c = _grfconfig; c != NULL; c = c->next) {
-		if (!HASBIT(c->flags, GCF_STATIC)) cs->Send_GRFIdentifier(p, c);
+		if (!HasBit(c->flags, GCF_STATIC)) cs->Send_GRFIdentifier(p, c);
 	}
 
 	cs->Send_Packet(p);
@@ -224,6 +224,8 @@
 
 	Packet *p = NetworkSend_Init(PACKET_SERVER_NEED_PASSWORD);
 	p->Send_uint8(type);
+	p->Send_uint32(_patches.generation_seed);
+	p->Send_string(_network_unique_id);
 	cs->Send_Packet(p);
 }
 
@@ -247,6 +249,8 @@
 
 	p = NetworkSend_Init(PACKET_SERVER_WELCOME);
 	p->Send_uint16(cs->index);
+	p->Send_uint32(_patches.generation_seed);
+	p->Send_string(_network_unique_id);
 	cs->Send_Packet(p);
 
 		// Transmit info about all the active clients
@@ -619,7 +623,7 @@
 DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
 {
 	char name[NETWORK_CLIENT_NAME_LENGTH];
-	char unique_id[NETWORK_NAME_LENGTH];
+	char unique_id[NETWORK_UNIQUE_ID_LENGTH];
 	NetworkClientInfo *ci;
 	PlayerID playas;
 	NetworkLanguage client_lang;
--- a/src/network/network_udp.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/network/network_udp.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -398,7 +398,7 @@
 		config->name      = f->name;
 		config->info      = f->info;
 	}
-	SETBIT(config->flags, GCF_COPY);
+	SetBit(config->flags, GCF_COPY);
 }
 
 // Close UDP connection
--- a/src/newgrf.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -46,6 +46,9 @@
 #include "newgrf_townname.h"
 #include "newgrf_industries.h"
 #include "newgrf_fsmports.h"
+#include "table/landscape_sprite.h"
+#include "gfxinit.h"
+#include "fios.h"
 
 /* TTDPatch extended GRF format codec
  * (c) Petr Baudis 2004 (GPL'd)
@@ -59,7 +62,6 @@
 
 static int _skip_sprites; // XXX
 static uint _file_index; // XXX
-SpriteID _signal_base;
 SpriteID _coast_base;
 
 static GRFFile *_cur_grffile;
@@ -249,6 +251,17 @@
  */
 StringID MapGRFStringID(uint32 grfid, StringID str)
 {
+	/* StringID table for TextIDs 0x4E->0x6D */
+	static StringID units_volume[] = {
+		STR_NOTHING,    STR_PASSENGERS, STR_TONS,       STR_BAGS,
+		STR_LITERS,     STR_ITEMS,      STR_CRATES,     STR_TONS,
+		STR_TONS,       STR_TONS,       STR_TONS,       STR_BAGS,
+		STR_TONS,       STR_TONS,       STR_TONS,       STR_BAGS,
+		STR_TONS,       STR_TONS,       STR_BAGS,       STR_LITERS,
+		STR_TONS,       STR_LITERS,     STR_TONS,       STR_NOTHING,
+		STR_BAGS,       STR_LITERS,     STR_TONS,       STR_NOTHING,
+		STR_TONS,       STR_NOTHING,    STR_LITERS,     STR_NOTHING
+	};
 	/* 0xD0 and 0xDC stand for all the TextIDs in the range
 	 * of 0xD000 (misc graphics texts) and 0xDC00 (misc persistent texts).
 	 * These strings are unique to each grf file, and thus require to be used with the
@@ -260,7 +273,7 @@
 	/* We have some changes in our cargo strings, resulting in some missing. */
 	TEXID_TO_STRINGID(0x000E, 0x002D, STR_000E);
 	TEXID_TO_STRINGID(0x002E, 0x004D, STR_002E);
-	TEXID_TO_STRINGID(0x004E, 0x006D, STR_QUANTITY_NOTHING);
+	if (str >= 0x004E && str <= 0x006D) str = units_volume[str - 0x004E];
 	TEXID_TO_STRINGID(0x006E, 0x008D, STR_QUANTITY_NOTHING);
 	TEXID_TO_STRINGID(0x008E, 0x00AD, STR_ABBREV_NOTHING);
 
@@ -418,7 +431,7 @@
 			case 0x15: { // Cargo type
 				uint8 ctype = grf_load_byte(&buf);
 
-				if (ctype < NUM_CARGO && HASBIT(_cargo_mask, ctype)) {
+				if (ctype < NUM_CARGO && HasBit(_cargo_mask, ctype)) {
 					rvi->cargo_type = ctype;
 				} else {
 					rvi->cargo_type = CT_INVALID;
@@ -498,6 +511,12 @@
 				rvi->tractive_effort = grf_load_byte(&buf);
 				break;
 
+			case 0x20: // Air drag
+				/** @todo Air drag for trains. */
+				grf_load_byte(&buf);
+				ret = true;
+				break;
+
 			case 0x21: // Shorter vehicle
 				rvi->shorten_factor = grf_load_byte(&buf);
 				break;
@@ -531,7 +550,7 @@
 
 			case 0x27: // Miscellaneous flags
 				ei->misc_flags = grf_load_byte(&buf);
-				_loaded_newgrf_features.has_2CC |= HASBIT(ei->misc_flags, EF_USES_2CC);
+				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
 				break;
 
 			case 0x28: // Cargo classes allowed
@@ -546,12 +565,6 @@
 				ei->base_intro = grf_load_dword(&buf);
 				break;
 
-			case 0x20: // Air drag
-				/** @todo Air drag for trains. */
-				grf_load_byte(&buf);
-				ret = true;
-				break;
-
 			default:
 				ret = true;
 				break;
@@ -605,7 +618,7 @@
 			case 0x10: { // Cargo type
 				uint8 cargo = grf_load_byte(&buf);
 
-				if (cargo < NUM_CARGO && HASBIT(_cargo_mask, cargo)) {
+				if (cargo < NUM_CARGO && HasBit(_cargo_mask, cargo)) {
 					rvi->cargo_type = cargo;
 				} else {
 					rvi->cargo_type = CT_INVALID;
@@ -639,6 +652,13 @@
 				ei->callbackmask = grf_load_byte(&buf);
 				break;
 
+			case 0x18: // Tractive effort
+			case 0x19: // Air drag
+				/** @todo Tractive effort and air drag for road vehicles. */
+				grf_load_byte(&buf);
+				ret = true;
+				break;
+
 			case 0x1A: // Refit cost
 				ei->refit_cost = grf_load_byte(&buf);
 				break;
@@ -649,7 +669,7 @@
 
 			case 0x1C: // Miscellaneous flags
 				ei->misc_flags = grf_load_byte(&buf);
-				_loaded_newgrf_features.has_2CC |= HASBIT(ei->misc_flags, EF_USES_2CC);
+				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
 				break;
 
 			case 0x1D: // Cargo classes allowed
@@ -664,13 +684,6 @@
 				ei->base_intro = grf_load_dword(&buf);
 				break;
 
-			case 0x18: // Tractive effort
-			case 0x19: // Air drag
-				/** @todo Tractive effort and air drag for road vehicles. */
-				grf_load_byte(&buf);
-				ret = true;
-				break;
-
 			default:
 				ret = true;
 				break;
@@ -717,7 +730,7 @@
 			case 0x0C: { // Cargo type
 				uint8 cargo = grf_load_byte(&buf);
 
-				if (cargo < NUM_CARGO && HASBIT(_cargo_mask, cargo)) {
+				if (cargo < NUM_CARGO && HasBit(_cargo_mask, cargo)) {
 					svi->cargo_type = cargo;
 				} else {
 					svi->cargo_type = CT_INVALID;
@@ -749,13 +762,20 @@
 				ei->refit_cost = grf_load_byte(&buf);
 				break;
 
+			case 0x14: // Ocean speed fraction
+			case 0x15: // Canal speed fraction
+				/** @todo Speed fractions for ships on oceans and canals */
+				grf_load_byte(&buf);
+				ret = true;
+				break;
+
 			case 0x16: // Retire vehicle early
 				ei->retire_early = grf_load_byte(&buf);
 				break;
 
 			case 0x17: // Miscellaneous flags
 				ei->misc_flags = grf_load_byte(&buf);
-				_loaded_newgrf_features.has_2CC |= HASBIT(ei->misc_flags, EF_USES_2CC);
+				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
 				break;
 
 			case 0x18: // Cargo classes allowed
@@ -770,13 +790,6 @@
 				ei->base_intro = grf_load_dword(&buf);
 				break;
 
-			case 0x14: // Ocean speed fraction
-			case 0x15: // Canal speed fraction
-				/** @todo Speed fractions for ships on oceans and canals */
-				grf_load_byte(&buf);
-				ret = true;
-				break;
-
 			default:
 				ret = true;
 				break;
@@ -871,7 +884,7 @@
 
 			case 0x17: // Miscellaneous flags
 				ei->misc_flags = grf_load_byte(&buf);
-				_loaded_newgrf_features.has_2CC |= HASBIT(ei->misc_flags, EF_USES_2CC);
+				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
 				break;
 
 			case 0x18: // Cargo classes allowed
@@ -943,9 +956,9 @@
 					dts->ground_sprite = grf_load_word(&buf);
 					dts->ground_pal = grf_load_word(&buf);
 					if (dts->ground_sprite == 0) continue;
-					if (HASBIT(dts->ground_pal, 15)) {
-						CLRBIT(dts->ground_pal, 15);
-						SETBIT(dts->ground_sprite, SPRITE_MODIFIER_USE_OFFSET);
+					if (HasBit(dts->ground_pal, 15)) {
+						ClrBit(dts->ground_pal, 15);
+						SetBit(dts->ground_sprite, SPRITE_MODIFIER_USE_OFFSET);
 					}
 
 					while (buf < *bufp + len) {
@@ -966,18 +979,18 @@
 						dtss->pal = grf_load_word(&buf);
 
 						/* Remap flags as ours collide */
-						if (HASBIT(dtss->pal, 15)) {
-							CLRBIT(dtss->pal, 15);
-							SETBIT(dtss->image, SPRITE_MODIFIER_USE_OFFSET);
+						if (HasBit(dtss->pal, 15)) {
+							ClrBit(dtss->pal, 15);
+							SetBit(dtss->image, SPRITE_MODIFIER_USE_OFFSET);
 						}
 
-						if (HASBIT(dtss->image, 15)) {
-							CLRBIT(dtss->image, 15);
-							SETBIT(dtss->image, PALETTE_MODIFIER_COLOR);
+						if (HasBit(dtss->image, 15)) {
+							ClrBit(dtss->image, 15);
+							SetBit(dtss->image, PALETTE_MODIFIER_COLOR);
 						}
-						if (HASBIT(dtss->image, 14)) {
-							CLRBIT(dtss->image, 14);
-							SETBIT(dtss->image, PALETTE_MODIFIER_TRANSPARENT);
+						if (HasBit(dtss->image, 14)) {
+							ClrBit(dtss->image, 14);
+							SetBit(dtss->image, PALETTE_MODIFIER_TRANSPARENT);
 						}
 					}
 				}
@@ -1170,12 +1183,12 @@
 						SpriteID image = grf_load_word(&buf);
 						SpriteID pal   = grf_load_word(&buf);
 
-						if (HASBIT(pal, 15)) {
-							SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
+						if (HasBit(pal, 15)) {
+							SetBit(image, PALETTE_MODIFIER_TRANSPARENT);
 						}
 
 						/* Clear old color modifer bit */
-						CLRBIT(image, 15);
+						ClrBit(image, 15);
 
 						bridge->sprite_table[tableid][sprite].sprite = image;
 						bridge->sprite_table[tableid][sprite].pal    = pal;
@@ -1188,7 +1201,7 @@
 				break;
 
 			case 0x0F: // Long format year of availability (year since year 0)
-				bridge->avail_year = clamp(grf_load_dword(&buf), MIN_YEAR, MAX_YEAR);
+				bridge->avail_year = Clamp(grf_load_dword(&buf), MIN_YEAR, MAX_YEAR);
 				break;
 
 			default:
@@ -1341,7 +1354,7 @@
 					continue;
 				}
 
-				_house_mngr.Add(hid + i, override);
+				_house_mngr.Add(hid + i, _cur_grffile->grfid, override);
 			} break;
 
 			case 0x16: // Periodic refresh multiplier
@@ -1365,7 +1378,7 @@
 				break;
 
 			case 0x1B: // Animation speed
-				housespec->animation_speed = clamp(grf_load_byte(&buf), 2, 16);
+				housespec->animation_speed = Clamp(grf_load_byte(&buf), 2, 16);
 				break;
 
 			case 0x1C: // Class of the building type
@@ -1400,6 +1413,12 @@
 				housespec->minimum_life = grf_load_byte(&buf);
 				break;
 
+			case 0x20: { // @todo Cargo acceptance watch list
+				byte count = grf_load_byte(&buf);
+				for (byte j = 0; j < count; j++) grf_load_byte(&buf);
+				ret = true;
+			} break;
+
 			default:
 				ret = true;
 				break;
@@ -1428,11 +1447,21 @@
 				}
 			} break;
 
-			case 0x09: // Cargo translation table
-				/* This is loaded during the initialisation stage, so just skip it here. */
-				/* Each entry is 4 bytes. */
-				buf += 4;
-				break;
+			case 0x09: { // Cargo translation table
+				if (gvid != 0) {
+					if (i == 0) grfmsg(1, "InitChangeInfo: Cargo translation table must start at zero");
+					/* Skip data */
+					buf += 4;
+					break;
+				}
+				if (i == 0) {
+					free(_cur_grffile->cargo_list);
+					_cur_grffile->cargo_max = numinfo;
+					_cur_grffile->cargo_list = MallocT<CargoLabel>(numinfo);
+				}
+				CargoLabel cl = grf_load_dword(&buf);
+				_cur_grffile->cargo_list[i] = BSWAP32(cl);
+			} break;
 
 			case 0x0A: { // Currency display names
 				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
@@ -1549,11 +1578,11 @@
 		switch (prop) {
 			case 0x08: /* Bit number of cargo */
 				cs->bitnum = grf_load_byte(&buf);
-				cs->grfid = _cur_grffile->grfid;
 				if (cs->IsValid()) {
-					SETBIT(_cargo_mask, cid + i);
+					cs->grfid = _cur_grffile->grfid;
+					SetBit(_cargo_mask, cid + i);
 				} else {
-					CLRBIT(_cargo_mask, cid + i);
+					ClrBit(_cargo_mask, cid + i);
 				}
 				break;
 
@@ -1763,8 +1792,7 @@
 					return false;
 				}
 
-				tsp->grf_prop.override = ovrid;
-				_industile_mngr.Add(indtid + i, ovrid);
+				_industile_mngr.Add(indtid + i, _cur_grffile->grfid, ovrid);
 			} break;
 
 			case 0x0A: // Tile acceptance
@@ -1862,6 +1890,9 @@
 					indsp->grf_prop.local_id = indid + i;
 					indsp->grf_prop.subst_id = subs_id;
 					indsp->grf_prop.grffile = _cur_grffile;
+					/* If the grf industry needs to check its surounding upon creation, it should
+					 * rely on callbacks, not on the original placement functions */
+					indsp->check_proc = CHECK_NOTHING;
 				}
 			} break;
 
@@ -1874,7 +1905,7 @@
 					return false;
 				}
 				indsp->grf_prop.override = ovrid;
-				_industry_mngr.Add(indid + i, ovrid);
+				_industry_mngr.Add(indid + i, _cur_grffile->grfid, ovrid);
 			} break;
 
 			case 0x0A: { // Set industry layout(s)
@@ -1896,8 +1927,7 @@
 
 							copy_from = (IndustryTileTable*)_origin_industry_specs[type].table[laynbr];
 							for (size = 1;; size++) {
-								if (_origin_industry_specs[type].table[laynbr + (size - 1)]->ti.x == -0x80 &&
-										_origin_industry_specs[type].table[laynbr + (size - 1)]->ti.y == 0) break;
+								if (copy_from[size - 1].ti.x == -0x80 && copy_from[size - 1].ti.y == 0) break;
 							}
 							break;
 						}
@@ -1943,7 +1973,7 @@
 				}
 				/* Install final layout construction in the industry spec */
 				indsp->table = tile_table;
-				SETBIT(indsp->cleanup_flag, 1);
+				SetBit(indsp->cleanup_flag, 1);
 				free(itt);
 			} break;
 
@@ -1995,7 +2025,7 @@
 
 				for (uint8 j = 0; j < indsp->number_of_sounds; j++) sounds[j] = grf_load_byte(&buf);
 				indsp->random_sounds = sounds;
-				SETBIT(indsp->cleanup_flag, 0);
+				SetBit(indsp->cleanup_flag, 0);
 			} break;
 
 			case 0x16: // Conflicting industry types
@@ -2015,7 +2045,7 @@
 				break;
 
 			case 0x1A: // Special industry flags to define special behavior
-				indsp->behaviour = (IndustyBehaviour)grf_load_dword(&buf);
+				indsp->behaviour = (IndustryBehaviour)grf_load_dword(&buf);
 				break;
 
 			case 0x1B: // New industry text ID
@@ -2044,6 +2074,10 @@
 				SB(indsp->callback_flags, (prop - 0x21) * 8, 8, aflag);
 			} break;
 
+			case 0x23: // removal cost multiplier
+				indsp->removal_cost_multiplier = grf_load_dword(&buf);
+				break;
+
 			default:
 				ret = true;
 				break;
@@ -2134,9 +2168,9 @@
 					dts->ground_sprite = grf_load_word(&buf);
 					dts->ground_pal = grf_load_word(&buf);
 					if (dts->ground_sprite == 0) continue;
-					if (HASBIT(dts->ground_pal, 15)) {
-						CLRBIT(dts->ground_pal, 15);
-						SETBIT(dts->ground_sprite, SPRITE_MODIFIER_USE_OFFSET);
+					if (HasBit(dts->ground_pal, 15)) {
+						ClrBit(dts->ground_pal, 15);
+						SetBit(dts->ground_sprite, SPRITE_MODIFIER_USE_OFFSET);
 					}
 
 					while (buf < *bufp + len) {
@@ -2157,18 +2191,18 @@
 						dtss->pal = grf_load_word(&buf);
 
 						/* Remap flags as ours collide */
-						if (HASBIT(dtss->pal, 15)) {
-							CLRBIT(dtss->pal, 15);
-							SETBIT(dtss->image, SPRITE_MODIFIER_USE_OFFSET);
+						if (HasBit(dtss->pal, 15)) {
+							ClrBit(dtss->pal, 15);
+							SetBit(dtss->image, SPRITE_MODIFIER_USE_OFFSET);
 						}
 
-						if (HASBIT(dtss->image, 15)) {
-							CLRBIT(dtss->image, 15);
-							SETBIT(dtss->image, PALETTE_MODIFIER_COLOR);
+						if (HasBit(dtss->image, 15)) {
+							ClrBit(dtss->image, 15);
+							SetBit(dtss->image, PALETTE_MODIFIER_COLOR);
 						}
-						if (HASBIT(dtss->image, 14)) {
-							CLRBIT(dtss->image, 14);
-							SETBIT(dtss->image, PALETTE_MODIFIER_TRANSPARENT);
+						if (HasBit(dtss->image, 14)) {
+							ClrBit(dtss->image, 14);
+							SetBit(dtss->image, PALETTE_MODIFIER_TRANSPARENT);
 						}
 					}
 				}
@@ -2400,7 +2434,7 @@
 	 *                 4 for defining new train station sets
 	 * B num-props     how many properties to change per vehicle/station
 	 * B num-info      how many vehicles/stations to change
-	 * B id            ID of first vehicle/station to change, if num-info is
+	 * E id            ID of first vehicle/station to change, if num-info is
 	 *                 greater than one, this one and the following
 	 *                 vehicles/stations will be changed
 	 * B property      what property to change, depends on the feature
@@ -2416,7 +2450,7 @@
 		/* GSF_CANAL */        NULL,
 		/* GSF_BRIDGE */       BridgeChangeInfo,
 		/* GSF_TOWNHOUSE */    TownHouseChangeInfo,
-		/* GSF_GLOBALVAR */    GlobalVarChangeInfo,
+		/* GSF_GLOBALVAR */    NULL, /* Global variables are handled during reservation */
 		/* GSF_INDUSTRYTILES */IndustrytilesChangeInfo,
 		/* GSF_INDUSTRIES */   IndustriesChangeInfo,
 		/* GSF_CARGOS */       NULL, /* Cargo is handled during reservation */
@@ -2429,7 +2463,7 @@
 	uint8 feature  = grf_load_byte(&buf);
 	uint8 numprops = grf_load_byte(&buf);
 	uint numinfo  = grf_load_byte(&buf);
-	uint engine   = grf_load_byte(&buf);
+	uint engine   = grf_load_extended(&buf);
 
 	grfmsg(6, "FeatureChangeInfo: feature %d, %d properties, to apply to %d+%d",
 	               feature, numprops, engine, numinfo);
@@ -2516,8 +2550,8 @@
 	buf++;
 	uint8 feature  = grf_load_byte(&buf);
 	uint8 numprops = grf_load_byte(&buf);
-	grf_load_byte(&buf);
-	grf_load_byte(&buf);
+	grf_load_byte(&buf);     // num-info
+	grf_load_extended(&buf); // id
 
 	if (feature == GSF_BRIDGE && numprops == 1) {
 		uint8 prop = grf_load_byte(&buf);
@@ -2526,51 +2560,12 @@
 		if (prop == 0x0D) return;
 	}
 
-	SETBIT(_cur_grfconfig->flags, GCF_UNSAFE);
+	SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
 
 	/* Skip remainder of GRF */
 	_skip_sprites = -1;
 }
 
-/* Action 0x00 (GLS_INIT) */
-static void InitChangeInfo(byte *buf, int len)
-{
-	byte *bufend = buf + len;
-
-	if (!check_length(len, 6, "InitChangeInfo")) return;
-	buf++;
-	uint8 feature  = grf_load_byte(&buf);
-	uint8 numprops = grf_load_byte(&buf);
-	uint8 numinfo  = grf_load_byte(&buf);
-	uint8 index    = grf_load_byte(&buf);
-
-	while (numprops-- && buf < bufend) {
-		uint8 prop = grf_load_byte(&buf);
-
-		switch (feature) {
-			case GSF_GLOBALVAR:
-				switch (prop) {
-					case 0x09: // Cargo Translation Table
-						if (index != 0) {
-							grfmsg(1, "InitChangeInfo: Cargo translation table must start at zero");
-							return;
-						}
-
-						free(_cur_grffile->cargo_list);
-						_cur_grffile->cargo_max = numinfo;
-						_cur_grffile->cargo_list = MallocT<CargoLabel>(numinfo);
-
-						for (uint i = 0; i < numinfo; i++) {
-							CargoLabel cl = grf_load_dword(&buf);
-							_cur_grffile->cargo_list[i] = BSWAP32(cl);
-						}
-						break;
-				}
-				break;
-		}
-	}
-}
-
 /* Action 0x00 (GLS_RESERVE) */
 static void ReserveChangeInfo(byte *buf, int len)
 {
@@ -2580,18 +2575,27 @@
 	buf++;
 	uint8 feature  = grf_load_byte(&buf);
 
-	if (feature != GSF_CARGOS) return;
+	if (feature != GSF_CARGOS && feature != GSF_GLOBALVAR) return;
 
 	uint8 numprops = grf_load_byte(&buf);
 	uint8 numinfo  = grf_load_byte(&buf);
-	uint8 index    = grf_load_byte(&buf);
+	uint8 index    = grf_load_extended(&buf);
 
 	while (numprops-- && buf < bufend) {
 		uint8 prop = grf_load_byte(&buf);
-
-		if (CargoChangeInfo(index, numinfo, prop, &buf, bufend - buf)) {
-			grfmsg(2, "ReserveChangeInfo: Ignoring property 0x%02X (not implemented)", prop);
+		bool ignoring = false;
+
+		switch (feature) {
+			default: NOT_REACHED();
+			case GSF_CARGOS:
+				ignoring = CargoChangeInfo(index, numinfo, prop, &buf, bufend - buf);
+				break;
+			case GSF_GLOBALVAR:
+				ignoring = GlobalVarChangeInfo(index, numinfo, prop, &buf, bufend - buf);
+				break;
 		}
+
+		if (ignoring) grfmsg(2, "ReserveChangeInfo: Ignoring property 0x%02X (not implemented)", prop);
 	}
 }
 
@@ -2665,8 +2669,8 @@
 	);
 
 	for (uint16 i = 0; i < num_sets * num_ents; i++) {
+		_nfo_line++;
 		LoadNextSprite(_cur_spriteid++, _file_index, _nfo_line);
-		_nfo_line++;
 	}
 }
 
@@ -2688,7 +2692,7 @@
  * defined spritegroup. */
 static const SpriteGroup* GetGroupFromGroupID(byte setid, byte type, uint16 groupid)
 {
-	if (HASBIT(groupid, 15)) return NewCallBackResultSpriteGroup(groupid);
+	if (HasBit(groupid, 15)) return NewCallBackResultSpriteGroup(groupid);
 
 	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
 		grfmsg(1, "GetGroupFromGroupID(0x%02X:0x%02X): Groupid 0x%04X does not exist, leaving empty", setid, type, groupid);
@@ -2701,7 +2705,7 @@
 /* Helper function to either create a callback or a result sprite group. */
 static const SpriteGroup* CreateGroupFromGroupID(byte feature, byte setid, byte type, uint16 spriteid, uint16 num_sprites)
 {
-	if (HASBIT(spriteid, 15)) return NewCallBackResultSpriteGroup(spriteid);
+	if (HasBit(spriteid, 15)) return NewCallBackResultSpriteGroup(spriteid);
 
 	if (spriteid >= _cur_grffile->spriteset_numsets) {
 		grfmsg(1, "CreateGroupFromGroupID(0x%02X:0x%02X): Sprite set %u invalid, max %u", setid, type, spriteid, _cur_grffile->spriteset_numsets);
@@ -2777,7 +2781,7 @@
 
 			group = AllocateSpriteGroup();
 			group->type = SGT_DETERMINISTIC;
-			group->g.determ.var_scope = HASBIT(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
+			group->g.determ.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
 
 			switch (GB(type, 2, 2)) {
 				default: NOT_REACHED();
@@ -2809,7 +2813,7 @@
 					/* Link subroutine group */
 					adjust->subroutine = GetGroupFromGroupID(setid, type, grf_load_byte(&buf));
 				} else {
-					adjust->parameter = IS_BYTE_INSIDE(adjust->variable, 0x60, 0x80) ? grf_load_byte(&buf) : 0;
+					adjust->parameter = IsInsideMM(adjust->variable, 0x60, 0x80) ? grf_load_byte(&buf) : 0;
 				}
 
 				varadjust = grf_load_byte(&buf);
@@ -2826,7 +2830,7 @@
 				}
 
 				/* Continue reading var adjusts while bit 5 is set. */
-			} while (HASBIT(varadjust, 5));
+			} while (HasBit(varadjust, 5));
 
 			group->g.determ.num_ranges = grf_load_byte(&buf);
 			if (group->g.determ.num_ranges > 0) group->g.determ.ranges = CallocT<DeterministicSpriteGroupRange>(group->g.determ.num_ranges);
@@ -2851,11 +2855,11 @@
 
 			group = AllocateSpriteGroup();
 			group->type = SGT_RANDOMIZED;
-			group->g.random.var_scope = HASBIT(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
+			group->g.random.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
 
 			uint8 triggers = grf_load_byte(&buf);
 			group->g.random.triggers       = GB(triggers, 0, 7);
-			group->g.random.cmp_mode       = HASBIT(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
+			group->g.random.cmp_mode       = HasBit(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
 			group->g.random.lowest_randbit = grf_load_byte(&buf);
 			group->g.random.num_groups     = grf_load_byte(&buf);
 			group->g.random.groups = CallocT<const SpriteGroup*>(group->g.random.num_groups);
@@ -2936,24 +2940,24 @@
 					group->g.layout.dts->ground_sprite = grf_load_word(&buf);
 					group->g.layout.dts->ground_pal    = grf_load_word(&buf);
 					/* Remap transparent/colour modifier bits */
-					if (HASBIT(group->g.layout.dts->ground_sprite, 14)) {
-						CLRBIT(group->g.layout.dts->ground_sprite, 14);
-						SETBIT(group->g.layout.dts->ground_sprite, PALETTE_MODIFIER_TRANSPARENT);
+					if (HasBit(group->g.layout.dts->ground_sprite, 14)) {
+						ClrBit(group->g.layout.dts->ground_sprite, 14);
+						SetBit(group->g.layout.dts->ground_sprite, PALETTE_MODIFIER_TRANSPARENT);
 					}
-					if (HASBIT(group->g.layout.dts->ground_sprite, 15)) {
-						CLRBIT(group->g.layout.dts->ground_sprite, 15);
-						SETBIT(group->g.layout.dts->ground_sprite, PALETTE_MODIFIER_COLOR);
+					if (HasBit(group->g.layout.dts->ground_sprite, 15)) {
+						ClrBit(group->g.layout.dts->ground_sprite, 15);
+						SetBit(group->g.layout.dts->ground_sprite, PALETTE_MODIFIER_COLOR);
 					}
-					if (HASBIT(group->g.layout.dts->ground_pal, 14)) {
-						CLRBIT(group->g.layout.dts->ground_pal, 14);
-						SETBIT(group->g.layout.dts->ground_sprite, SPRITE_MODIFIER_OPAQUE);
+					if (HasBit(group->g.layout.dts->ground_pal, 14)) {
+						ClrBit(group->g.layout.dts->ground_pal, 14);
+						SetBit(group->g.layout.dts->ground_sprite, SPRITE_MODIFIER_OPAQUE);
 					}
-					if (HASBIT(group->g.layout.dts->ground_pal, 15)) {
+					if (HasBit(group->g.layout.dts->ground_pal, 15)) {
 						/* Bit 31 set means this is a custom sprite, so rewrite it to the
 						 * last spriteset defined. */
 						SpriteID sprite = _cur_grffile->spriteset_start + GB(group->g.layout.dts->ground_sprite, 0, 14) * sprites;
 						SB(group->g.layout.dts->ground_sprite, 0, SPRITE_WIDTH, sprite);
-						CLRBIT(group->g.layout.dts->ground_pal, 15);
+						ClrBit(group->g.layout.dts->ground_pal, 15);
 					}
 
 					group->g.layout.dts->seq = CallocT<DrawTileSeqStruct>(num_sprites + 1);
@@ -2966,24 +2970,24 @@
 						seq->delta_x = grf_load_byte(&buf);
 						seq->delta_y = grf_load_byte(&buf);
 
-						if (HASBIT(seq->image, 14)) {
-							CLRBIT(seq->image, 14);
-							SETBIT(seq->image, PALETTE_MODIFIER_TRANSPARENT);
+						if (HasBit(seq->image, 14)) {
+							ClrBit(seq->image, 14);
+							SetBit(seq->image, PALETTE_MODIFIER_TRANSPARENT);
 						}
-						if (HASBIT(seq->image, 15)) {
-							CLRBIT(seq->image, 15);
-							SETBIT(seq->image, PALETTE_MODIFIER_COLOR);
+						if (HasBit(seq->image, 15)) {
+							ClrBit(seq->image, 15);
+							SetBit(seq->image, PALETTE_MODIFIER_COLOR);
 						}
-						if (HASBIT(seq->pal, 14)) {
-							CLRBIT(seq->pal, 14);
-							SETBIT(seq->image, SPRITE_MODIFIER_OPAQUE);
+						if (HasBit(seq->pal, 14)) {
+							ClrBit(seq->pal, 14);
+							SetBit(seq->image, SPRITE_MODIFIER_OPAQUE);
 						}
-						if (HASBIT(seq->pal, 15)) {
+						if (HasBit(seq->pal, 15)) {
 							/* Bit 31 set means this is a custom sprite, so rewrite it to the
 							 * last spriteset defined. */
 							SpriteID sprite = _cur_grffile->spriteset_start + GB(seq->image, 0, 14) * sprites;
 							SB(seq->image, 0, SPRITE_WIDTH, sprite);
-							CLRBIT(seq->pal, 15);
+							ClrBit(seq->pal, 15);
 						}
 
 						if (type > 0) {
@@ -3210,6 +3214,12 @@
 	for (uint i = 0; i < idcount; i++) {
 		uint8 stid = buf[3 + i];
 		StationSpec *statspec = _cur_grffile->stations[stid];
+
+		if (statspec == NULL) {
+			grfmsg(1, "StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", stid);
+			return;
+		}
+
 		byte *bp = &buf[4 + idcount];
 
 		for (uint c = 0; c < cidcount; c++) {
@@ -3242,6 +3252,10 @@
 		for (uint i = 0; i < idcount; i++) {
 			uint8 stid = buf[3 + i];
 			StationSpec *statspec = _cur_grffile->stations[stid];
+			if (statspec == NULL) {
+				grfmsg(1, "StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", stid);
+				continue;
+			}
 
 			statspec->spritegroup[CT_DEFAULT] = _cur_grffile->spritegroups[groupid];
 			statspec->grffile = _cur_grffile;
@@ -3507,10 +3521,10 @@
 	uint8 feature  = grf_load_byte(&buf);
 	uint8 lang     = grf_load_byte(&buf);
 	uint8 num      = grf_load_byte(&buf);
-	bool generic   = HASBIT(lang, 7);
+	bool generic   = HasBit(lang, 7);
 	uint16 id      = generic ? grf_load_word(&buf) : grf_load_byte(&buf);
 
-	CLRBIT(lang, 7);
+	ClrBit(lang, 7);
 
 	if (feature <= GSF_AIRCRAFT && id < _vehcounts[feature]) {
 		id += _vehshifts[feature];
@@ -3632,6 +3646,34 @@
 	}
 }
 
+/**
+ * Sanitize incoming sprite offsets for Action 5 graphics replacements.
+ * @param num         the number of sprites to load.
+ * @param offset      offset from the base.
+ * @param max_sprites the maximum number of sprites that can be loaded in this action 5.
+ * @param name        used for error warnings.
+ * @return the number of sprites that is going to be skipped
+ */
+static uint16 SanitizeSpriteOffset(uint16& num, uint16 offset, int max_sprites, const char *name)
+{
+
+	if (offset >= max_sprites) {
+		grfmsg(1, "GraphicsNew: %s sprite offset must be less than %i, skipping", name, max_sprites);
+		uint orig_num = num;
+		num = 0;
+		return orig_num;
+	}
+
+	if (offset + num > max_sprites) {
+		grfmsg(4, "GraphicsNew: %s sprite overflow, truncating...", name);
+		uint orig_num = num;
+		num = max(max_sprites - offset, 0);
+		return orig_num - num;
+	}
+
+	return 0;
+}
+
 /* Action 0x05 */
 static void GraphicsNew(byte *buf, int len)
 {
@@ -3648,42 +3690,47 @@
 	buf++;
 	uint8 type = grf_load_byte(&buf);
 	uint16 num = grf_load_extended(&buf);
+	uint16 skip_num = 0;
+	uint16 offset = HasBit(type, 7) ? grf_load_extended(&buf) : 0;
+	ClrBit(type, 7); // Clear the high bit as that only indicates whether there is an offset.
 
 	switch (type) {
 		case 0x04: // Signal graphics
-			if (num != 112 && num != 240) {
-				grfmsg(1, "GraphicsNew: Signal graphics sprite count must be 112 or 240, skipping");
+			if (num != PRESIGNAL_SPRITE_COUNT && num != PRESIGNAL_AND_SEMAPHORE_SPRITE_COUNT && num != PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT) {
+				grfmsg(1, "GraphicsNew: Signal graphics sprite count must be 48, 112 or 240, skipping");
 				return;
 			}
-			_signal_base = _cur_spriteid;
+			replace = SPR_SIGNALS_BASE;
 			break;
 
 		case 0x05: // Catenary graphics
-			if (num != 48) {
+			if (num != ELRAIL_SPRITE_COUNT) {
 				grfmsg(1, "GraphicsNew: Catenary graphics sprite count must be 48, skipping");
 				return;
 			}
-			replace = SPR_ELRAIL_BASE + 3;
+			replace = SPR_ELRAIL_BASE;
 			break;
 
 		case 0x06: // Foundations
-			if (num != 74) {
-				grfmsg(1, "GraphicsNew: Foundation graphics sprite count must be 74, skipping");
+			if (num != NORMAL_FOUNDATION_SPRITE_COUNT && num != NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT) {
+				grfmsg(1, "GraphicsNew: Foundation graphics sprite count must be 74 or 90, skipping");
 				return;
 			}
-			replace = SPR_SLOPES_BASE;
+			replace = SPR_SLOPES_BASE; break;
 			break;
 
+		/* case 0x07: // TTDP GUI sprites. Not used by OTTD. */
+
 		case 0x08: // Canal graphics
-			if (num != 65) {
+			if (num != CANALS_SPRITE_COUNT) {
 				grfmsg(1, "GraphicsNew: Canal graphics sprite count must be 65, skipping");
 				return;
 			}
-			replace = SPR_CANALS_BASE + 5;
+			replace = SPR_CANALS_BASE;
 			break;
 
 		case 0x09: // One way graphics
-			if (num != 6) {
+			if (num != ONEWAY_SPRITE_COUNT) {
 				grfmsg(1, "GraphicsNew: One way road graphics sprite count must be 6, skipping");
 				return;
 			}
@@ -3691,7 +3738,7 @@
 			break;
 
 		case 0x0A: // 2CC colour maps
-			if (num != 256) {
+			if (num != TWOCCMAP_SPRITE_COUNT) {
 				grfmsg(1, "GraphicsNew: 2CC colour maps sprite count must be 256, skipping");
 				return;
 			}
@@ -3699,37 +3746,64 @@
 			break;
 
 		case 0x0B: // tramways
-			if (num != 113) {
+			if (num != TRAMWAY_SPRITE_COUNT) {
 				grfmsg(1, "GraphicsNew: Tramway graphics sprite count must be 113, skipping");
 				return;
 			}
 			replace = SPR_TRAMWAY_BASE;
 			break;
 
+		/* case 0x0C: // Snowy temperate trees. Not yet used by OTTD. */
+
 		case 0x0D: // Coast graphics
 			if (num != 16) {
 				grfmsg(1, "GraphicsNew: Coast graphics sprite count must be 16, skipping");
 				return;
 			}
 			_coast_base = _cur_spriteid;
+			_loaded_newgrf_features.has_newwater = true;
 			break;
 
+		/* case 0x0E: // New Signals. Not yet used by OTTD. */
+
+		/* case 0x0F: // Tracks for marking sloped rail. Not yet used by OTTD. */
+
 		case 0x10: // New airport sprites
-			if (num != 15) {
-				grfmsg(1, "GraphicsNew: Airport graphics sprite count must be 15, skipping");
+			if (num != AIRPORTX_SPRITE_COUNT && num != 15) {
+				grfmsg(1, "GraphicsNew: Airport graphics sprite count must be 15 or 24, skipping");
 				return;
 			}
 			replace = SPR_AIRPORTX_BASE;
 			break;
 
 		case 0x11: // Road stop sprites
-			if (num != 8) {
+			if (num != ROADSTOP_SPRITE_COUNT) {
 				grfmsg(1, "GraphicsNew: Road stop graphics sprite count must be 8, skipping");
 				return;
 			}
 			replace = SPR_ROADSTOP_BASE;
 			break;
 
+		/* case 0x12: // Aqueduct sprites. Not yet used by OTTD. */
+
+		case 0x13: // Autorail sprites
+			if (num != AUTORAIL_SPRITE_COUNT) {
+				grfmsg(1, "GraphicsNew: Autorail graphics sprite count must be 55, skipping");
+				return;
+			}
+			replace = SPR_AUTORAIL_BASE;
+			break;
+
+		case 0x14: // Flag sprites
+			skip_num = SanitizeSpriteOffset(num, offset, FLAGS_SPRITE_COUNT, "Flag graphics");
+			replace = SPR_FLAGS_BASE + offset;
+			break;
+
+		case 0x15: // OpenTTD GUI sprites
+			skip_num = SanitizeSpriteOffset(num, offset, OPENTTD_SPRITE_COUNT, "OpenTTD graphics");
+			replace = SPR_OPENTTD_BASE + offset;
+			break;
+
 		default:
 			grfmsg(2, "GraphicsNew: Custom graphics (type 0x%02X) sprite block of length %u (unimplemented, ignoring)",
 					type, num);
@@ -3744,9 +3818,11 @@
 	}
 
 	for (; num > 0; num--) {
+		_nfo_line++;
 		LoadNextSprite(replace == 0 ? _cur_spriteid++ : replace++, _file_index, _nfo_line);
-		_nfo_line++;
 	}
+
+	_skip_sprites = skip_num;
 }
 
 /* Action 0x05 (SKIP) */
@@ -3768,7 +3844,7 @@
 {
 	switch (param) {
 		case 0x81: // current year
-			return clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
+			return Clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
 
 		case 0x83: // current climate, 0=temp, 1=arctic, 2=trop, 3=toyland
 			return _opt.landscape;
@@ -3776,9 +3852,9 @@
 		case 0x84: { // GRF loading stage
 			uint32 res = 0;
 
-			if (_cur_stage > GLS_INIT) SETBIT(res, 0);
-			if (_cur_stage == GLS_RESERVE) SETBIT(res, 8);
-			if (_cur_stage == GLS_ACTIVATION) SETBIT(res, 9);
+			if (_cur_stage > GLS_INIT) SetBit(res, 0);
+			if (_cur_stage == GLS_RESERVE) SetBit(res, 8);
+			if (_cur_stage == GLS_ACTIVATION) SetBit(res, 9);
 			return res;
 		}
 
@@ -3824,6 +3900,11 @@
 		case 0x9E: // Miscellaneous GRF features
 			return _misc_grf_features;
 
+		case 0xA1: { // OpenTTD version
+			extern uint32 _openttd_newgrf_version;
+			return _openttd_newgrf_version;
+		}
+
 		default:
 			/* GRF Parameter */
 			if (param < 0x80) return _cur_grffile->param[param];
@@ -3887,7 +3968,7 @@
 
 		/* Bit 7 of param_size indicates we should add to the original value
 		 * instead of replacing it. */
-		add_value  = HASBIT(param_size, 7);
+		add_value  = HasBit(param_size, 7);
 		param_size = GB(param_size, 0, 7);
 
 		/* Where to apply the data to within the pseudo sprite data. */
@@ -3964,7 +4045,14 @@
 
 	grfmsg(7, "SkipIf: Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
 
-	if (param == 0x88) {
+	/*
+	 * Parameter (variable in specs) 0x88 can only have GRF ID checking
+	 * conditions, except conditions 0x0B and 0x0C (cargo availability)
+	 * as those ignore the parameter. So, when the condition type is
+	 * either of those, the specific variable 0x88 code is skipped, so
+	 * the "general" code for the cargo availability conditions kicks in.
+	 */
+	if (param == 0x88 && condtype != 0x0B && condtype != 0x0C) {
 		/* GRF ID checks */
 
 		const GRFConfig *c = GetGRFConfig(cond_val);
@@ -3975,51 +4063,51 @@
 		}
 
 		switch (condtype) {
-			/* Tests 6 to 10 are only for param 0x88, GRFID checks */
-			case 6: // Is GRFID active?
+			/* Tests 0x06 to 0x0A are only for param 0x88, GRFID checks */
+			case 0x06: // Is GRFID active?
 				result = c->status == GCS_ACTIVATED;
 				break;
 
-			case 7: // Is GRFID non-active?
+			case 0x07: // Is GRFID non-active?
 				result = c->status != GCS_ACTIVATED;
 				break;
 
-			case 8: // GRFID is not but will be active?
+			case 0x08: // GRFID is not but will be active?
 				result = c->status == GCS_INITIALISED;
 				break;
 
-			case 9: // GRFID is or will be active?
+			case 0x09: // GRFID is or will be active?
 				result = c->status == GCS_ACTIVATED || c->status == GCS_INITIALISED;
 				break;
 
-			case 10: // GRFID is not nor will be active
+			case 0x0A: // GRFID is not nor will be active
 				/* This is the only condtype that doesn't get ignored if the GRFID is not found */
 				result = c == NULL || c->flags == GCS_DISABLED || c->status == GCS_NOT_FOUND;
 				break;
 
-			default: grfmsg(1, "SkipIf: Unsupported GRF test %d. Ignoring", condtype); return;
+			default: grfmsg(1, "SkipIf: Unsupported GRF condition type %02X. Ignoring", condtype); return;
 		}
 	} else {
 		/* Parameter or variable tests */
 		switch (condtype) {
-			case 0: result = !!(param_val & (1 << cond_val));
-				break;
-			case 1: result = !(param_val & (1 << cond_val));
-				break;
-			case 2: result = (param_val & mask) == cond_val;
-				break;
-			case 3: result = (param_val & mask) != cond_val;
-				break;
-			case 4: result = (param_val & mask) < cond_val;
-				break;
-			case 5: result = (param_val & mask) > cond_val;
-				break;
-			case 11: result = GetCargoIDByLabel(BSWAP32(cond_val)) == CT_INVALID;
-				break;
-			case 12: result = GetCargoIDByLabel(BSWAP32(cond_val)) != CT_INVALID;
-				break;
-
-			default: grfmsg(1, "SkipIf: Unsupported test %d. Ignoring", condtype); return;
+			case 0x00: result = !!(param_val & (1 << cond_val));
+				break;
+			case 0x01: result = !(param_val & (1 << cond_val));
+				break;
+			case 0x02: result = (param_val & mask) == cond_val;
+				break;
+			case 0x03: result = (param_val & mask) != cond_val;
+				break;
+			case 0x04: result = (param_val & mask) < cond_val;
+				break;
+			case 0x05: result = (param_val & mask) > cond_val;
+				break;
+			case 0x0B: result = GetCargoIDByLabel(BSWAP32(cond_val)) == CT_INVALID;
+				break;
+			case 0x0C: result = GetCargoIDByLabel(BSWAP32(cond_val)) != CT_INVALID;
+				break;
+
+			default: grfmsg(1, "SkipIf: Unsupported condition type %02X. Ignoring", condtype); return;
 		}
 	}
 
@@ -4081,7 +4169,7 @@
 	_cur_grfconfig->grfid = grfid;
 
 	/* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */
-	if (GB(grfid, 24, 8) == 0xFF) SETBIT(_cur_grfconfig->flags, GCF_SYSTEM);
+	if (GB(grfid, 24, 8) == 0xFF) SetBit(_cur_grfconfig->flags, GCF_SYSTEM);
 
 	len -= 6;
 	const char *name = grf_load_string(&buf, len);
@@ -4144,8 +4232,8 @@
 		);
 
 		for (uint j = 0; j < num_sprites; j++) {
+			_nfo_line++;
 			LoadNextSprite(first_sprite + j, _file_index, _nfo_line); // XXX
-			_nfo_line++;
 		}
 	}
 }
@@ -4190,7 +4278,8 @@
 		STR_NEWGRF_ERROR_UNSET_SWITCH,
 		STR_NEWGRF_ERROR_INVALID_PARAMETER,
 		STR_NEWGRF_ERROR_LOAD_BEFORE,
-		STR_NEWGRF_ERROR_LOAD_AFTER
+		STR_NEWGRF_ERROR_LOAD_AFTER,
+		STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER,
 	};
 
 	static const StringID sevstr[] = {
@@ -4216,11 +4305,11 @@
 
 	/* Skip the error until the activation stage unless bit 7 of the severity
 	 * is set. */
-	if (!HASBIT(severity, 7) && _cur_stage == GLS_INIT) {
+	if (!HasBit(severity, 7) && _cur_stage == GLS_INIT) {
 		grfmsg(7, "GRFLoadError: Skipping non-fatal GRFLoadError in stage %d", _cur_stage);
 		return;
 	}
-	CLRBIT(severity, 7);
+	ClrBit(severity, 7);
 
 	if (severity >= lengthof(sevstr)) {
 		grfmsg(7, "GRFLoadError: Invalid severity id %d. Setting to 2 (non-fatal error).", severity);
@@ -4304,7 +4393,7 @@
 	 * reserved, it would be marked unsafe anyway. GRM for (e.g. bridge)
 	 * sprites  is considered safe. */
 
-	SETBIT(_cur_grfconfig->flags, GCF_UNSAFE);
+	SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
 
 	/* Skip remainder of GRF */
 	_skip_sprites = -1;
@@ -4421,7 +4510,7 @@
 	 * - it has been set to any value in the newgrf(w).cfg parameter list
 	 * - it OR A PARAMETER WITH HIGHER NUMBER has been set to any value by
 	 *   an earlier action D */
-	if (HASBIT(oper, 7)) {
+	if (HasBit(oper, 7)) {
 		if (target < 0x80 && target < _cur_grffile->param_end) {
 			grfmsg(7, "ParamSet: Param %u already defined, skipping", target);
 			return;
@@ -4482,7 +4571,8 @@
 							break;
 
 						case 0x0B: // Cargo
-							src1 = PerformGRM(_grm_cargos, NUM_CARGO, count, op, target, "cargos");
+							/* There are two ranges: one for cargo IDs and one for cargo bitmasks */
+							src1 = PerformGRM(_grm_cargos, NUM_CARGO * 2, count, op, target, "cargos");
 							if (_skip_sprites == -1) return;
 							break;
 
@@ -4601,8 +4691,19 @@
 			_traininfo_vehicle_pitch = res;
 			break;
 
+		case 0x8F: // Rail track type cost factors
+			_railtype_cost_multiplier[0] = GB(res, 0, 8);
+			if (_patches.disable_elrails) {
+				_railtype_cost_multiplier[1] = GB(res, 0, 8);
+				_railtype_cost_multiplier[2] = GB(res, 8, 8);
+			} else {
+				_railtype_cost_multiplier[1] = GB(res, 8, 8);
+				_railtype_cost_multiplier[2] = GB(res, 16, 8);
+			}
+			_railtype_cost_multiplier[3] = GB(res, 16, 8);
+			break;
+
 		/* @todo implement */
-		case 0x8F: // Rail track type cost factors
 		case 0x93: // Tile refresh offset to left
 		case 0x94: // Tile refresh offset to right
 		case 0x95: // Tile refresh offset upwards
@@ -4647,7 +4748,7 @@
 
 		/* GRF is unsafe it if tries to deactivate other GRFs */
 		if (grfid != _cur_grfconfig->grfid) {
-			SETBIT(_cur_grfconfig->flags, GCF_UNSAFE);
+			SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
 
 			/* Skip remainder of GRF */
 			_skip_sprites = -1;
@@ -4703,9 +4804,9 @@
 	len--;
 	grfmsg(6, "FeatureTownName: definition 0x%02X", id & 0x7F);
 
-	if (HASBIT(id, 7)) {
+	if (HasBit(id, 7)) {
 		/* Final definition */
-		CLRBIT(id, 7);
+		ClrBit(id, 7);
 		bool new_scheme = _cur_grffile->grf_version >= 7;
 
 		if (!check_length(len, 1, "FeatureTownName: lang_id")) return;
@@ -4714,7 +4815,7 @@
 
 		byte nb_gen = townname->nb_gen;
 		do {
-			CLRBIT(lang, 7);
+			ClrBit(lang, 7);
 
 			if (!check_length(len, 1, "FeatureTownName: style name")) return;
 			const char *name = grf_load_string(&buf, len);
@@ -4755,7 +4856,7 @@
 			byte prob = grf_load_byte(&buf);
 			len--;
 
-			if (HASBIT(prob, 7)) {
+			if (HasBit(prob, 7)) {
 				byte ref_id = grf_load_byte(&buf);
 				len--;
 
@@ -4967,8 +5068,8 @@
 
 		for (uint c = 0; c < num_char; c++) {
 			SetUnicodeGlyph(size, base_char + c, _cur_spriteid);
+			_nfo_line++;
 			LoadNextSprite(_cur_spriteid++, _file_index, _nfo_line);
-			_nfo_line++;
 		}
 	}
 }
@@ -5070,7 +5171,7 @@
 /* Used during safety scan on unsafe actions */
 static void GRFUnsafe(byte *buf, int len)
 {
-	SETBIT(_cur_grfconfig->flags, GCF_UNSAFE);
+	SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
 
 	/* Skip remainder of GRF */
 	_skip_sprites = -1;
@@ -5105,7 +5206,7 @@
 	                   |                                        (1 << 0x19)  // newships
 	                   |                                        (1 << 0x1A)  // newplanes
 	                   |           ((_patches.signal_side ? 1 : 0) << 0x1B)  // signalsontrafficside
-	                   |                                        (1 << 0x1C); // electrifiedrailway
+	                   |       ((_patches.disable_elrails ? 0 : 1) << 0x1C); // electrifiedrailway
 
 	_ttdpatch_flags[2] =                                        (1 << 0x01)  // loadallgraphics - obsolote
 	                   |                                        (1 << 0x03)  // semaphores
@@ -5117,7 +5218,7 @@
 	                   |                                        (0 << 0x10)  // moreindustriesperclimate - obsolete
 	                   |                                        (0 << 0x11)  // moretoylandfeatures
 	                   |                                        (1 << 0x12)  // newstations
-	                   |                                        (0 << 0x13)  // tracktypecostdiff
+	                   |                                        (1 << 0x13)  // tracktypecostdiff
 	                   |                                        (1 << 0x14)  // manualconvert
 	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x15)  // buildoncoasts
 	                   |                                        (1 << 0x16)  // canals
@@ -5126,7 +5227,7 @@
 	                   |                                        (1 << 0x19)  // newhouses
 	                   |                                        (1 << 0x1A)  // newbridges
 	                   |                                        (1 << 0x1B)  // newtownnames
-	                   |                                        (0 << 0x1C)  // moreanimations
+	                   |                                        (1 << 0x1C)  // moreanimation
 	                   |    ((_patches.wagon_speed_limits ? 1 : 0) << 0x1D)  // wagonspeedlimits
 	                   |                                        (1 << 0x1E)  // newshistory
 	                   |                                        (0 << 0x1F); // custombridgeheads
@@ -5227,12 +5328,12 @@
 
 				if (ind != NULL) {
 					/* We need to remove the sounds array */
-					if (HASBIT(ind->cleanup_flag, CLEAN_RANDOMSOUNDS)) {
+					if (HasBit(ind->cleanup_flag, CLEAN_RANDOMSOUNDS)) {
 						free((void*)ind->random_sounds);
 					}
 
 					/* We need to remove the tiles layouts */
-					if (HASBIT(ind->cleanup_flag, CLEAN_TILELSAYOUT) && ind->table != NULL) {
+					if (HasBit(ind->cleanup_flag, CLEAN_TILELSAYOUT) && ind->table != NULL) {
 						for (int j = 0; j < ind->num_table; j++) {
 							/* remove the individual layouts */
 							if (ind->table[j] != NULL) {
@@ -5286,7 +5387,7 @@
 static void ResetNewGRFErrors()
 {
 	for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
-		if (!HASBIT(c->flags, GCF_COPY) && c->error != NULL) {
+		if (!HasBit(c->flags, GCF_COPY) && c->error != NULL) {
 			free(c->error->custom_message);
 			free(c->error->data);
 			free(c->error);
@@ -5380,11 +5481,13 @@
 	_traininfo_vehicle_pitch = 0;
 	_traininfo_vehicle_width = 29;
 
+	/* Reset track cost multipliers. */
+	memcpy(&_railtype_cost_multiplier, &_default_railtype_cost_multiplier, sizeof(_default_railtype_cost_multiplier));
+
 	_loaded_newgrf_features.has_2CC           = false;
 	_loaded_newgrf_features.has_newhouses     = false;
 	_loaded_newgrf_features.has_newindustries = false;
-
-	_signal_base = 0;
+	_loaded_newgrf_features.has_newwater      = false;
 	_coast_base = 0;
 
 	InitializeSoundPool();
@@ -5511,12 +5614,12 @@
 				/* Apply cargo translation table to the refit mask */
 				uint num_cargo = min(32, file->cargo_max);
 				for (uint i = 0; i < num_cargo; i++) {
-					if (!HASBIT(_engine_info[engine].refit_mask, i)) continue;
+					if (!HasBit(_engine_info[engine].refit_mask, i)) continue;
 
 					CargoID c = GetCargoIDByLabel(file->cargo_list[i]);
 					if (c == CT_INVALID) continue;
 
-					SETBIT(xor_mask, c);
+					SetBit(xor_mask, c);
 				}
 			} else {
 				/* No cargo table, so use the cargo bitnum values */
@@ -5524,7 +5627,7 @@
 					const CargoSpec *cs = GetCargo(c);
 					if (!cs->IsValid()) continue;
 
-					if (HASBIT(_engine_info[engine].refit_mask, cs->bitnum)) SETBIT(xor_mask, c);
+					if (HasBit(_engine_info[engine].refit_mask, cs->bitnum)) SetBit(xor_mask, c);
 				}
 			}
 		}
@@ -5533,8 +5636,8 @@
 			/* Build up the list of cargo types from the set cargo classes. */
 			for (CargoID i = 0; i < NUM_CARGO; i++) {
 				const CargoSpec *cs = GetCargo(i);
-				if (cargo_allowed[engine]    & cs->classes) SETBIT(mask,     i);
-				if (cargo_disallowed[engine] & cs->classes) SETBIT(not_mask, i);
+				if (cargo_allowed[engine]    & cs->classes) SetBit(mask,     i);
+				if (cargo_disallowed[engine] & cs->classes) SetBit(not_mask, i);
 			}
 		} else {
 			/* Don't apply default refit mask to wagons or engines with no capacity */
@@ -5551,7 +5654,7 @@
 					CargoID cargo = GetCargoIDByLabel(cl[i]);
 					if (cargo == CT_INVALID) continue;
 
-					SETBIT(xor_mask, cargo);
+					SetBit(xor_mask, cargo);
 				}
 			}
 		}
@@ -5683,7 +5786,7 @@
 	for (CargoID c = 0; c < NUM_CARGO; c++) {
 		CargoSpec *cs = &_cargo[c];
 		/* Don't map if the cargo is unavailable or not from NewGRF */
-		if (!cs->IsValid() || cs->grfid == 0) continue;
+		if (cs->grfid == 0) continue;
 
 		cs->name         = MapGRFStringID(cs->grfid, cs->name);
 		cs->name_single  = MapGRFStringID(cs->grfid, cs->name_single);
@@ -5715,7 +5818,7 @@
 	 * is not in memory and scanning the file every time would be too expensive.
 	 * In other stages we skip action 0x10 since it's already dealt with. */
 	static const SpecialSpriteHandler handlers[][GLS_END] = {
-		/* 0x00 */ { NULL,     SafeChangeInfo, NULL,       InitChangeInfo, ReserveChangeInfo, FeatureChangeInfo, },
+		/* 0x00 */ { NULL,     SafeChangeInfo, NULL,       NULL,           ReserveChangeInfo, FeatureChangeInfo, },
 		/* 0x01 */ { SkipAct1, SkipAct1,  SkipAct1,        SkipAct1,       SkipAct1,          NewSpriteSet, },
 		/* 0x02 */ { NULL,     NULL,      NULL,            NULL,           NULL,              NewSpriteGroup, },
 		/* 0x03 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              FeatureMapSpriteGroup, },
@@ -5761,7 +5864,7 @@
 		grfmsg(7, "DecodeSpecialSprite: Handling data block in stage %d", stage);
 		GRFDataBlock(buf, num);
 	} else if (action == 0xFE) {
-		grfmsg(7, "DecodeSpecialSprite: andling import block in stage %d", stage);
+		grfmsg(7, "DecodeSpecialSprite: Handling import block in stage %d", stage);
 		GRFImportBlock(buf, num);
 	} else if (action >= lengthof(handlers)) {
 		grfmsg(7, "DecodeSpecialSprite: Skipping unknown action 0x%02X", action);
@@ -5793,7 +5896,16 @@
 		_cur_grffile = GetFileByFilename(filename);
 		if (_cur_grffile == NULL) error("File '%s' lost in cache.\n", filename);
 		if (stage == GLS_RESERVE && config->status != GCS_INITIALISED) return;
-		if (stage == GLS_ACTIVATION && config->status != GCS_INITIALISED) return;
+		if (stage == GLS_ACTIVATION && !HasBit(config->flags, GCF_RESERVED)) return;
+	}
+
+	if (file_index > LAST_GRF_SLOT) {
+		DEBUG(grf, 0, "'%s' is not loaded as the maximum number of GRFs has been reached", filename);
+		config->status = GCS_DISABLED;
+		config->error  = CallocT<GRFError>(1);
+		config->error->severity = STR_NEWGRF_ERROR_MSG_FATAL;
+		config->error->message  = STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED;
+		return;
 	}
 
 	FioOpenFile(file_index, filename);
@@ -5907,30 +6019,27 @@
 	/* 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;
 		_cur_spriteid = load_index;
 		for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
 			if (c->status == GCS_DISABLED || c->status == GCS_NOT_FOUND) continue;
-			if (stage > GLS_INIT && HASBIT(c->flags, GCF_INIT_ONLY)) continue;
+			if (stage > GLS_INIT && HasBit(c->flags, GCF_INIT_ONLY)) continue;
 
 			/* @todo usererror() */
 			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;
-				_cur_stage = GLS_ACTIVATION;
-				LoadNewGRFFile(c, slot++, GLS_ACTIVATION);
-				_cur_stage = stage;
+				SetBit(c->flags, GCF_RESERVED);
+			} else if (stage == GLS_ACTIVATION) {
+				ClrBit(c->flags, GCF_RESERVED);
 				ClearTemporaryNewGRFData();
 				BuildCargoTranslationMap();
 				DEBUG(sprite, 2, "LoadNewGRF: Currently %i sprites are loaded", _cur_spriteid);
-			} else {
-				slot++;
 			}
 		}
 	}
@@ -5941,5 +6050,5 @@
 
 bool HasGrfMiscBit(GrfMiscBit bit)
 {
-	return HASBIT(_misc_grf_features, bit);
+	return HasBit(_misc_grf_features, bit);
 }
--- a/src/newgrf.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf.h	Mon Dec 03 23:39:38 2007 +0000
@@ -87,13 +87,13 @@
 
 extern GRFFile *_first_grffile;
 
-extern SpriteID _signal_base;
 extern SpriteID _coast_base;
 
 struct GRFLoadedFeatures {
 	bool has_2CC;             ///< Set if any vehicle is loaded which uses 2cc (two company colours).
 	bool has_newhouses;       ///< Set if there are any newhouses loaded.
 	bool has_newindustries;   ///< Set if there are any newindustries loaded.
+	bool has_newwater;        ///< Set it there are any newwater grf loaded
 };
 
 /* Indicates which are the newgrf features currently loaded ingame */
--- a/src/newgrf_callbacks.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_callbacks.h	Mon Dec 03 23:39:38 2007 +0000
@@ -134,7 +134,7 @@
 	CBID_VEHICLE_START_STOP_CHECK        = 0x31,
 
 	/** Called for every vehicle every 32 days (not all on same date though). */
-	CBID_VEHICLE_32DAY_CALLBACK          = 0x32, // not implemented
+	CBID_VEHICLE_32DAY_CALLBACK          = 0x32,
 
 	/** Called to play a special sound effect */
 	CBID_VEHICLE_SOUND_EFFECT            = 0x33,
@@ -170,7 +170,16 @@
 	/** 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. */
+	/* There are no callbacks 0x3E - 0x13F */
+
+	/** Called for periodically starting or stopping the animation. */
+	CBID_STATION_ANIM_START_STOP         = 0x140, // not implemented
+
+	/** Called to determine station tile next animation frame. */
+	CBID_STATION_ANIM_NEXT_FRAME         = 0x141, // not implemented
+
+	/** Called to indicate how long the current animation frame should last. */
+	CBID_STATION_ANIMATION_SPEED         = 0x142, // not implemented
 
 	/** Called to determine whether a town building can be destroyed. */
 	CBID_HOUSE_DENY_DESTRUCTION          = 0x143,
@@ -187,7 +196,8 @@
 	/** Add an offset to the default sprite numbers to show another sprite. */
 	CBID_CANALS_SPRITE_OFFSET            = 0x147, // not implemented
 
-	/* There is no callback 0x148.*/
+	/** Called when a cargo type specified in property 20 is accepted. */
+	CBID_HOUSE_WATCHED_CARGO_ACCEPTED    = 0x148, // not implemented
 
 	/** Callback done for each tile of a station to check the slope. */
 	CBID_STATION_LAND_SLOPE_CHECK        = 0x149, // not implemented
--- a/src/newgrf_cargo.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_cargo.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -98,17 +98,19 @@
 }
 
 
-CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile)
+CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile, bool usebit)
 {
 	/* Pre-version 7 uses the 'climate dependent' ID, i.e. cargo is the cargo ID */
-	if (grffile->grf_version < 7) return HASBIT(_cargo_mask, cargo) ? cargo : (CargoID) CT_INVALID;
-
-	/* If the GRF contains a translation table (and the cargo is in bounds)
-	 * then get the cargo ID for the label */
-	if (cargo < grffile->cargo_max) return GetCargoIDByLabel(grffile->cargo_list[cargo]);
-
-	/* Else the cargo value is a 'climate independent' 'bitnum' */
-	return GetCargoIDByBitnum(cargo);
+	if (grffile->grf_version < 7) {
+		if (!usebit) return cargo;
+		/* Else the cargo value is a 'climate independent' 'bitnum' */
+		if (HasBit(_cargo_mask, cargo)) return GetCargoIDByBitnum(cargo);
+	} else {
+		/* If the GRF contains a translation table (and the cargo is in bounds)
+		 * then get the cargo ID for the label */
+		if (cargo < grffile->cargo_max) return GetCargoIDByLabel(grffile->cargo_list[cargo]);
+	}
+	return CT_INVALID;
 }
 
 uint8 GetReverseCargoTranslation(CargoID cargo, const GRFFile *grffile)
--- a/src/newgrf_cargo.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_cargo.h	Mon Dec 03 23:39:38 2007 +0000
@@ -29,7 +29,7 @@
 
 SpriteID GetCustomCargoSprite(const CargoSpec *cs);
 uint16 GetCargoCallback(CallbackID callback, uint32 param1, uint32 param2, const CargoSpec *cs);
-CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile);
+CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile, bool usebit = false);
 uint8 GetReverseCargoTranslation(CargoID cargo, const GRFFile *grffile);
 
 #endif /* NEWGRF_CARGO_H */
--- a/src/newgrf_commons.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_commons.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -27,6 +27,7 @@
 	mapping_ID = CallocT<EntityIDMapping>(max_new_entities);
 	entity_overrides = MallocT<uint16>(max_offset);
 	memset(entity_overrides, invalid, sizeof(entity_overrides));
+	grfid_overrides = CallocT<uint32>(max_offset);
 }
 
 /** Destructor of the generic class.
@@ -36,18 +37,23 @@
 {
 	free(mapping_ID);
 	free(entity_overrides);
+	free(grfid_overrides);
 }
 
 /** Since the entity IDs defined by the GRF file does not necessarily correlate
  * to those used by the game, the IDs used for overriding old entities must be
  * translated when the entity spec is set.
- * @param local_id id in grf file
+ * @param local_id ID in grf file
+ * @param grfid  ID of the grf file
  * @param entity_type original entity type
  */
-void OverrideManagerBase::Add(uint8 local_id, uint entity_type)
+void OverrideManagerBase::Add(uint8 local_id, uint32 grfid, uint entity_type)
 {
 	assert(entity_type < max_offset);
+	/* An override can be set only once */
+	if (entity_overrides[entity_type] != invalid_ID) return;
 	entity_overrides[entity_type] = local_id;
+	grfid_overrides[entity_type] = grfid;
 }
 
 /** Resets the mapping, which is used while initializing game */
@@ -61,6 +67,7 @@
 {
 	for (uint16 i = 0; i < max_offset; i++) {
 		entity_overrides[i] = invalid_ID;
+		grfid_overrides[i] = 0;
 	}
 }
 
@@ -79,6 +86,12 @@
 			return id;
 		}
 	}
+
+	/* No mapping found, try the overrides */
+	for (uint16 id = 0; id < max_offset; id++) {
+		if (entity_overrides[id] == grf_local_id && grfid_overrides[id] == grfid) return id;
+	}
+
 	return invalid_ID;
 }
 
@@ -144,10 +157,11 @@
 	for (int i = 0; i != max_offset; i++) {
 		HouseSpec *overridden_hs = GetHouseSpecs(i);
 
-		if (entity_overrides[i] != hs->local_id) continue;
+		if (entity_overrides[i] != hs->local_id || grfid_overrides[i] != hs->grffile->grfid) continue;
 
 		overridden_hs->override = house_id;
 		entity_overrides[i] = invalid_ID;
+		grfid_overrides[i] = 0;
 	}
 }
 
@@ -161,6 +175,9 @@
 {
 	/* This entity hasn't been defined before, so give it an ID now. */
 	for (uint16 id = 0; id < max_new_entities; id++) {
+		/* Skip overriden industries */
+		if (id < max_offset && entity_overrides[id] != invalid_ID) continue;
+
 		/* Get the real live industry */
 		const IndustrySpec *inds = GetIndustrySpec(id);
 
@@ -193,21 +210,13 @@
 	/* 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);
 
-	if (ind_id == invalid_ID) { // not found?  So this is the introduction of a new industry
-		/* Second step is dealing with the override. */
-		if (inds->grf_prop.override != invalid_ID && _industry_specs[inds->grf_prop.override].grf_prop.override == invalid_ID) {
-			/* this is an override, which means it will take the place of the industry it is
-			 * designed to replace. Before we conclude that the override is allowed,
-			* we first need to verify that the slot is not holding another override
-			* If it's the case,it will be considered as a normal substitute */
-			ind_id = inds->grf_prop.override;
-		} else {
-			/* It has already been overriden, so you've lost your place old boy.
-			 * 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
-		}
+	if (ind_id == invalid_ID) {
+		/* Not found.
+		 * Or it has already been overriden, so you've lost your place old boy.
+		 * Or it is a simple substitute.
+		 * 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
 	}
 
 	if (ind_id == invalid_ID) {
@@ -236,11 +245,12 @@
 	for (int i = 0; i < max_offset; i++) {
 		IndustryTileSpec *overridden_its = &_industry_tile_specs[i];
 
-		if (entity_overrides[i] != its->grf_prop.local_id) continue;
+		if (entity_overrides[i] != its->grf_prop.local_id || grfid_overrides[i] != its->grf_prop.grffile->grfid) continue;
 
 		overridden_its->grf_prop.override = indt_id;
 		overridden_its->enabled = false;
 		entity_overrides[i] = invalid_ID;
+		grfid_overrides[i] = 0;
 	}
 }
 
--- a/src/newgrf_commons.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_commons.h	Mon Dec 03 23:39:38 2007 +0000
@@ -28,6 +28,7 @@
 class OverrideManagerBase {
 protected:
 	uint16 *entity_overrides;
+	uint32 *grfid_overrides;
 
 	uint16 max_offset;       ///< what is the length of the original entity's array of specs
 	uint16 max_new_entities; ///< what is the amount of entities, old and new summed
@@ -44,7 +45,7 @@
 	void ResetOverride();
 	void ResetMapping();
 
-	void Add(uint8 local_id, uint entity_type);
+	void Add(uint8 local_id, uint32 grfid, uint entity_type);
 	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
 
 	uint16 GetSubstituteID(byte entity_id);
--- a/src/newgrf_config.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_config.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -66,19 +66,17 @@
 	}
 
 	/* Find and load the Action 8 information */
-	/* 62 is the last file slot before sample.cat.
-	 * Should perhaps be some "don't care" value */
-	LoadNewGRFFile(config, 62, GLS_FILESCAN);
+	LoadNewGRFFile(config, CONFIG_SLOT, GLS_FILESCAN);
 
 	/* Skip if the grfid is 0 (not read) or 0xFFFFFFFF (ttdp system grf) */
-	if (config->grfid == 0 || config->grfid == 0xFFFFFFFF) return false;
+	if (config->grfid == 0 || config->grfid == 0xFFFFFFFF || config->IsOpenTTDBaseGRF()) return false;
 
 	if (is_static) {
 		/* Perform a 'safety scan' for static GRFs */
 		LoadNewGRFFile(config, 62, GLS_SAFETYSCAN);
 
 		/* GCF_UNSAFE is set if GLS_SAFETYSCAN finds unsafe actions */
-		if (HASBIT(config->flags, GCF_UNSAFE)) return false;
+		if (HasBit(config->flags, GCF_UNSAFE)) return false;
 	}
 
 	return CalcGRFMD5Sum(config);
@@ -88,7 +86,7 @@
 void ClearGRFConfig(GRFConfig **config)
 {
 	/* GCF_COPY as in NOT strdupped/alloced the filename, name and info */
-	if (!HASBIT((*config)->flags, GCF_COPY)) {
+	if (!HasBit((*config)->flags, GCF_COPY)) {
 		free((*config)->filename);
 		free((*config)->name);
 		free((*config)->info);
@@ -123,7 +121,7 @@
 	for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
 		if (c->grfid == grfid) {
 			/* The required GRF is already in the list; for it to be loaded properly */
-			CLRBIT(c->flags, GCF_INIT_ONLY);
+			ClrBit(c->flags, GCF_INIT_ONLY);
 			return;
 		}
 	}
@@ -162,8 +160,8 @@
 			if (src->error->custom_message != NULL) c->error->custom_message = strdup(src->error->custom_message);
 		}
 
-		CLRBIT(c->flags, GCF_INIT_ONLY);
-		if (init_only) SETBIT(c->flags, GCF_INIT_ONLY);
+		ClrBit(c->flags, GCF_INIT_ONLY);
+		if (init_only) SetBit(c->flags, GCF_INIT_ONLY);
 
 		*dst = c;
 		dst = &c->next;
@@ -262,7 +260,7 @@
 			if (f != NULL) {
 				md5sumToString(buf, lastof(buf), c->md5sum);
 				DEBUG(grf, 1, "NewGRF %08X (%s) not found; checksum %s. Compatibility mode on", BSWAP32(c->grfid), c->filename, buf);
-				SETBIT(c->flags, GCF_COMPATIBLE);
+				SetBit(c->flags, GCF_COMPATIBLE);
 
 				/* Non-found has precedence over compatibility load */
 				if (res != GLC_NOT_FOUND) res = GLC_COMPATIBLE;
@@ -283,7 +281,7 @@
 			 * in any case and set the name and info when it is not set already.
 			 * When the GCF_COPY flag is set, it is certain that the filename is
 			 * already a local one, so there is no need to replace it. */
-			if (!HASBIT(c->flags, GCF_COPY)) {
+			if (!HasBit(c->flags, GCF_COPY)) {
 				free(c->filename);
 				c->filename = strdup(f->filename);
 				memcpy(c->md5sum, f->md5sum, sizeof(c->md5sum));
@@ -550,6 +548,18 @@
 	return dst;
 }
 
+/** Base GRF ID for OpenTTD's base graphics GRFs. */
+static const uint32 OPENTTD_GRAPHICS_BASE_GRF_ID = BSWAP32(0xFF4F5400);
+
+/**
+ * Checks whether this GRF is a OpenTTD base graphic GRF.
+ * @return true if and only if it is a base GRF.
+ */
+bool GRFConfig::IsOpenTTDBaseGRF() const
+{
+	return (this->grfid & 0x00FFFFFF) == OPENTTD_GRAPHICS_BASE_GRF_ID;
+}
+
 
 static const SaveLoad _grfconfig_desc[] = {
 	SLE_STR(GRFConfig, filename,   SLE_STR, 0x40),
@@ -566,7 +576,7 @@
 	int index = 0;
 
 	for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
-		if (HASBIT(c->flags, GCF_STATIC)) continue;
+		if (HasBit(c->flags, GCF_STATIC)) continue;
 		SlSetArrayIndex(index++);
 		SlObject(c, _grfconfig_desc);
 	}
--- a/src/newgrf_config.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_config.h	Mon Dec 03 23:39:38 2007 +0000
@@ -15,6 +15,7 @@
 	GCF_COMPATIBLE,///< GRF file does not exactly match the requested GRF (different MD5SUM), but grfid matches)
 	GCF_COPY,      ///< The data is copied from a grf in _all_grfs
 	GCF_INIT_ONLY, ///< GRF file is processed up to GLS_INIT
+	GCF_RESERVED,  ///< GRF file passed GLS_RESERVE stage
 };
 
 enum GRFStatus {
@@ -57,6 +58,8 @@
 	uint8 num_params;
 
 	struct GRFConfig *next;
+
+	bool IsOpenTTDBaseGRF() const;
 };
 
 /* First item in list of all scanned NewGRFs */
--- a/src/newgrf_engine.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_engine.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -486,7 +486,7 @@
 			case 0x43: return _current_player | (LiveryHelper(object->u.vehicle.self_type, NULL) << 24); // Owner information
 			case 0x46: return 0;               // Motion counter
 			case 0x48: return GetEngine(object->u.vehicle.self_type)->flags; // Vehicle Type Info
-			case 0xC4: return clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; // Build year
+			case 0xC4: return Clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; // Build year
 			case 0xDA: return INVALID_VEHICLE; // Next vehicle
 			case 0x7F: return GetGRFParameter(object->u.vehicle.self_type, parameter); // Read GRF parameter
 		}
@@ -538,7 +538,7 @@
 
 				cargo_classes |= GetCargo(u->cargo_type)->classes;
 				common_cargos[u->cargo_type]++;
-				if (v->type == VEH_TRAIN) user_def_data |= RailVehInfo(u->engine_type)->user_def_data;
+				if (v->type == VEH_TRAIN) user_def_data |= u->u.rail.user_def_data;
 				common_subtypes[u->cargo_subtype]++;
 			}
 
@@ -644,7 +644,7 @@
 			 *   bit 8: (Maybe?) Toggled whenever the train reverses.
 			 */
 
-			if (HASBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE)) SETBIT(modflags, 10);
+			if (HasBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE)) SetBit(modflags, 10);
 
 			return variable == 0xFE ? modflags : GB(modflags, 8, 8);
 		}
@@ -695,7 +695,7 @@
 		case 0x41: return GB(v->age, 8, 8);
 		case 0x42: return v->max_age;
 		case 0x43: return GB(v->max_age, 8, 8);
-		case 0x44: return clamp(v->build_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
+		case 0x44: return Clamp(v->build_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
 		case 0x45: return v->unitnumber;
 		case 0x46: return v->engine_type;
 		case 0x47: return GB(v->engine_type, 8, 8);
@@ -827,11 +827,12 @@
 /** Retrieve the SpriteGroup for the specified vehicle.
  * If the vehicle is not specified, the purchase list group for the engine is
  * chosen. For trains, an additional engine override lookup is performed.
- * @param engine Engine type of the vehicle.
- * @param v      The vehicle itself.
- * @returns      The selected SpriteGroup for the vehicle.
+ * @param engine    Engine type of the vehicle.
+ * @param v         The vehicle itself.
+ * @param use_cache Use cached override
+ * @returns         The selected SpriteGroup for the vehicle.
  */
-static const SpriteGroup *GetVehicleSpriteGroup(EngineID engine, const Vehicle *v)
+static const SpriteGroup *GetVehicleSpriteGroup(EngineID engine, const Vehicle *v, bool use_cache = true)
 {
 	const SpriteGroup *group;
 	CargoID cargo;
@@ -842,7 +843,10 @@
 		cargo = v->cargo_type;
 
 		if (v->type == VEH_TRAIN) {
-			group = v->u.rail.cached_override;
+			/* We always use cached value, except for callbacks because the override spriteset
+			 * to use may be different than the one cached. It happens for callback 0x15 (refit engine),
+			 * as v->cargo_type is temporary changed to the new type */
+			group = use_cache ? v->u.rail.cached_override : GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine);
 			if (group != NULL) return group;
 		}
 	}
@@ -926,7 +930,7 @@
 	object.callback_param1 = param1;
 	object.callback_param2 = param2;
 
-	group = Resolve(GetVehicleSpriteGroup(engine, v), &object);
+	group = Resolve(GetVehicleSpriteGroup(engine, v, false), &object);
 	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
 
 	return group->g.callback.result;
@@ -955,7 +959,7 @@
 
 	object.u.vehicle.parent = parent;
 
-	group = Resolve(GetVehicleSpriteGroup(engine, v), &object);
+	group = Resolve(GetVehicleSpriteGroup(engine, v, false), &object);
 	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
 
 	return group->g.callback.result;
@@ -995,6 +999,7 @@
 	object.trigger = trigger;
 
 	group = Resolve(GetVehicleSpriteGroup(v->engine_type, v), &object);
+	if (group == NULL) return;
 
 	new_random_bits = Random();
 	v->random_bits &= ~object.reseed;
@@ -1034,6 +1039,10 @@
 			assert(!first);
 			if (v->Next() != NULL) DoTriggerVehicle(v->Next(), VEHICLE_TRIGGER_ANY_NEW_CARGO, base_random_bits, false);
 			break;
+
+		case VEHICLE_TRIGGER_CALLBACK_32:
+			/* Do not do any recursion */
+			break;
 	}
 }
 
--- a/src/newgrf_engine.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_engine.h	Mon Dec 03 23:39:38 2007 +0000
@@ -42,13 +42,15 @@
 uint GetEngineProperty(EngineID engine, uint8 property, uint orig_value);
 
 enum VehicleTrigger {
-	VEHICLE_TRIGGER_NEW_CARGO     = 1,
+	VEHICLE_TRIGGER_NEW_CARGO     = 0x01,
 	/* Externally triggered only for the first vehicle in chain */
-	VEHICLE_TRIGGER_DEPOT         = 2,
+	VEHICLE_TRIGGER_DEPOT         = 0x02,
 	/* Externally triggered only for the first vehicle in chain, only if whole chain is empty */
-	VEHICLE_TRIGGER_EMPTY         = 4,
+	VEHICLE_TRIGGER_EMPTY         = 0x04,
 	/* Not triggered externally (called for the whole chain if we got NEW_CARGO) */
-	VEHICLE_TRIGGER_ANY_NEW_CARGO = 8,
+	VEHICLE_TRIGGER_ANY_NEW_CARGO = 0x08,
+	/* Externally triggered for each vehicle in chain */
+	VEHICLE_TRIGGER_CALLBACK_32   = 0x10,
 };
 void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger);
 
--- a/src/newgrf_fsmports.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_fsmports.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -299,7 +299,7 @@
 			case 0x42: return 0;               // Rail type (XXX Get current type from GUI?)
 			case 0x43: return _current_player; // Station owner
 			case 0x44: return 2;               // PBS status
-			case 0xFA: return clamp(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Build date, clamped to a 16 bit value
+			case 0xFA: return Clamp(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Build date, Clamped to a 16 bit value
 		}
 
 		*available = false;
@@ -315,7 +315,7 @@
 			uint32 value = 0;
 
 			for (cargo_type = 0; cargo_type < NUM_CARGO; cargo_type++) {
-				if (HASBIT(st->goods[cargo_type].acceptance_pickup, GoodsEntry::ACCEPTANCE)) SETBIT(value, cargo_type);
+				if (HasBit(st->goods[cargo_type].acceptance_pickup, GoodsEntry::ACCEPTANCE)) SetBit(value, cargo_type);
 			}
 			return value;
 		}
@@ -334,7 +334,7 @@
 		//TODO: need to decide how/what to return
 		//case 0xF6: return st->airport_flags;
 		//case 0xF7: return GB(st->airport_flags, 8, 8);
-		case 0xFA: return clamp(st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535);
+		case 0xFA: return Clamp(st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535);
 	}
 
 	/* Handle cargo variables with parameter, 0x60 to 0x65 */
@@ -407,7 +407,7 @@
 			break;
 	}
 
-	if (HASBIT(fsmportspec->flags, 1)) cargo /= (st->trainst_w + st->trainst_h);
+	if (HasBit(fsmportspec->flags, 1)) cargo /= (st->trainst_w + st->trainst_h);
 	cargo = min(0xfff, cargo);
 
 	if (cargo > fsmportspec->cargo_threshold) {
--- a/src/newgrf_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -16,7 +16,6 @@
 #include "strings.h"
 #include "helpers.hpp"
 
-
 /** Parse an integerlist string and set each found value
  * @param p the string to be parsed. Each element in the list is seperated by a
  * comma or a space character
@@ -95,7 +94,7 @@
 	/* Show flags */
 	if (c->status == GCS_NOT_FOUND)        y += DrawStringMultiLine(x, y, STR_NEWGRF_NOT_FOUND, w, bottom - y);
 	if (c->status == GCS_DISABLED)         y += DrawStringMultiLine(x, y, STR_NEWGRF_DISABLED, w, bottom - y);
-	if (HASBIT(c->flags, GCF_COMPATIBLE)) y += DrawStringMultiLine(x, y, STR_NEWGRF_COMPATIBLE_LOADED, w, bottom - y);
+	if (HasBit(c->flags, GCF_COMPATIBLE)) y += DrawStringMultiLine(x, y, STR_NEWGRF_COMPATIBLE_LOADED, w, bottom - y);
 
 	/* Draw GRF info if it exists */
 	if (c->info != NULL && !StrEmpty(c->info)) {
@@ -128,7 +127,7 @@
 			w->vscroll.cap = (w->widget[3].bottom - w->widget[3].top) / 10;
 			SetVScrollCount(w, n);
 
-			SetWindowWidgetDisabledState(w, 6, WP(w, newgrf_add_d).sel == NULL);
+			w->SetWidgetDisabledState(6, WP(w, newgrf_add_d).sel == NULL || WP(w, newgrf_add_d).sel->IsOpenTTDBaseGRF());
 			DrawWindowWidgets(w);
 
 			GfxFillRect(w->widget[3].left + 1, w->widget[3].top + 1, w->widget[3].right, w->widget[3].bottom, 0xD7);
@@ -143,7 +142,7 @@
 
 					/* Draw selection background */
 					if (h) GfxFillRect(3, y, w->width - 15, y + 9, 156);
-					DoDrawStringTruncated(text, 4, y, h ? 0xC : 0x6, w->width - 18);
+					DoDrawStringTruncated(text, 4, y, h ? TC_WHITE : TC_ORANGE, w->width - 18);
 					y += 10;
 				}
 				n++;
@@ -270,19 +269,20 @@
 {
 	bool disable_all = WP(w, newgrf_d).sel == NULL || !WP(w, newgrf_d).editable;
 
-	SetWindowWidgetDisabledState(w, 3, !WP(w, newgrf_d).editable);
-	SetWindowWidgetsDisabledState(w, disable_all,
+	w->SetWidgetDisabledState(3, !WP(w, newgrf_d).editable);
+	w->SetWidgetsDisabledState(disable_all,
 		SNGRFS_REMOVE,
 		SNGRFS_MOVE_UP,
 		SNGRFS_MOVE_DOWN,
 		WIDGET_LIST_END
 	);
-	SetWindowWidgetDisabledState(w, SNGRFS_SET_PARAMETERS, !WP(w, newgrf_d).show_params || disable_all);
+	w->SetWidgetDisabledState(SNGRFS_SET_PARAMETERS, !WP(w, newgrf_d).show_params || disable_all);
 
 	if (!disable_all) {
 		/* All widgets are now enabled, so disable widgets we can't use */
-		if (WP(w, newgrf_d).sel == *WP(w, newgrf_d).list) DisableWindowWidget(w, SNGRFS_MOVE_UP);
-		if (WP(w, newgrf_d).sel->next == NULL) DisableWindowWidget(w, SNGRFS_MOVE_DOWN);
+		if (WP(w, newgrf_d).sel == *WP(w, newgrf_d).list) w->DisableWidget(SNGRFS_MOVE_UP);
+		if (WP(w, newgrf_d).sel->next == NULL) w->DisableWidget(SNGRFS_MOVE_DOWN);
+		if (WP(w, newgrf_d).sel->IsOpenTTDBaseGRF()) w->DisableWidget(SNGRFS_REMOVE);
 	}
 }
 
@@ -296,7 +296,7 @@
 
 	w->vscroll.cap = (w->widget[SNGRFS_FILE_LIST].bottom - w->widget[SNGRFS_FILE_LIST].top) / 14 + 1;
 	SetVScrollCount(w, i);
-	SetWindowWidgetDisabledState(w, SNGRFS_APPLY_CHANGES, !WP(w, newgrf_d).editable);
+	w->SetWidgetDisabledState(SNGRFS_APPLY_CHANGES, !WP(w, newgrf_d).editable);
 }
 
 
@@ -342,6 +342,7 @@
 				if (i >= w->vscroll.pos && i < w->vscroll.pos + w->vscroll.cap) {
 					const char *text = (c->name != NULL && !StrEmpty(c->name)) ? c->name : c->filename;
 					SpriteID pal;
+					byte txtoffset;
 
 					/* Pick a colour */
 					switch (c->status) {
@@ -357,15 +358,19 @@
 							break;
 					}
 
-					if (HASBIT(c->flags, GCF_STATIC)) {
-						pal = PALETTE_TO_GREY;
-					} else if (HASBIT(c->flags, GCF_COMPATIBLE)) {
-						pal = PALETTE_TO_ORANGE;
+					/* Do not show a "not-failure" colour when it actually failed to load */
+					if (pal != PALETTE_TO_RED) {
+						if (HasBit(c->flags, GCF_STATIC)) {
+							pal = PALETTE_TO_GREY;
+						} else if (HasBit(c->flags, GCF_COMPATIBLE)) {
+							pal = PALETTE_TO_ORANGE;
+						}
 					}
 
 					DrawSprite(SPR_SQUARE, pal, 5, y + 2);
 					if (c->error != NULL) DrawSprite(SPR_WARNING_SIGN, 0, 20, y + 2);
-					DoDrawString(text, c->error != NULL ? 35 : 25, y + 3, WP(w, newgrf_d).sel == c ? 0xC : 0x10);
+					txtoffset = c->error != NULL ? 35 : 25;
+					DoDrawStringTruncated(text, txtoffset, y + 3, WP(w, newgrf_d).sel == c ? TC_WHITE : TC_BLACK, w->width - txtoffset - 10);
 					y += 14;
 				}
 			}
--- a/src/newgrf_house.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_house.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -25,6 +25,7 @@
 #include "newgrf_town.h"
 #include "newgrf_sound.h"
 #include "newgrf_commons.h"
+#include "transparency.h"
 
 static BuildingCounts    _building_counts;
 static HouseClassMapping _class_mapping[HOUSE_CLASS_MAX];
@@ -210,7 +211,7 @@
 		case 0x40: return (IsTileType(tile, MP_HOUSE) ? GetHouseBuildingStage(tile) : 0) | OriginalTileRandomiser(TileX(tile), TileY(tile)) << 2;
 
 		/* Building age. */
-		case 0x41: return clamp(_cur_year - GetHouseConstructionYear(tile), 0, 0xFF);
+		case 0x41: return Clamp(_cur_year - GetHouseConstructionYear(tile), 0, 0xFF);
 
 		/* Town zone */
 		case 0x42: return GetTownRadiusGroup(town, tile);
@@ -320,14 +321,14 @@
 
 		if (IS_CUSTOM_SPRITE(image)) image += stage;
 
-		if ((HASBIT(image, SPRITE_MODIFIER_OPAQUE) || !HASBIT(_transparent_opt, TO_HOUSES)) && HASBIT(image, PALETTE_MODIFIER_COLOR)) {
+		if ((HasBit(image, SPRITE_MODIFIER_OPAQUE) || !IsTransparencySet(TO_HOUSES)) && HasBit(image, PALETTE_MODIFIER_COLOR)) {
 			if (pal == 0) {
 				const HouseSpec *hs = GetHouseSpecs(house_id);
-				if (HASBIT(hs->callback_mask, CBM_HOUSE_COLOUR)) {
+				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;
+						pal = HasBit(callback, 14) ? GB(callback, 0, 8) + SPR_2CCMAP_BASE : callback;
 					}
 				} else {
 					pal = hs->random_colour[OriginalTileRandomiser(ti->x, ti->y)] + PALETTE_RECOLOR_START;
@@ -343,10 +344,10 @@
 				ti->x + dtss->delta_x, ti->y + dtss->delta_y,
 				dtss->size_x, dtss->size_y,
 				dtss->size_z, ti->z + dtss->delta_z,
-				HASBIT(_transparent_opt, TO_HOUSES)
+				IsTransparencySet(TO_HOUSES)
 			);
 		} else {
-			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, HASBIT(_transparent_opt, TO_HOUSES));
+			AddChildSpriteScreen(image, pal, (byte)dtss->delta_x, (byte)dtss->delta_y, IsTransparencySet(TO_HOUSES));
 		}
 	}
 }
@@ -368,7 +369,7 @@
 	} else {
 		/* Limit the building stage to the number of stages supplied. */
 		byte stage = GetHouseBuildingStage(ti->tile);
-		stage = clamp(stage - 4 + group->g.layout.num_sprites, 0, group->g.layout.num_sprites - 1);
+		stage = Clamp(stage - 4 + group->g.layout.num_sprites, 0, group->g.layout.num_sprites - 1);
 		DrawTileLayout(ti, group, stage, house_id);
 	}
 }
@@ -379,9 +380,9 @@
 	byte animation_speed = hs->animation_speed;
 	bool frame_set_by_callback = false;
 
-	if (HASBIT(hs->callback_mask, CBM_HOUSE_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);
+		if (callback_res != CALLBACK_FAILED) animation_speed = Clamp(callback_res & 0xFF, 2, 16);
 	}
 
 	/* An animation speed of 2 means the animation frame changes 4 ticks, and
@@ -393,7 +394,7 @@
 	byte frame      = GetHouseAnimationFrame(tile);
 	byte num_frames = GB(hs->animation_frames, 0, 7);
 
-	if (HASBIT(hs->callback_mask, CBM_HOUSE_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);
 
@@ -422,7 +423,7 @@
 	if (!frame_set_by_callback) {
 		if (frame < num_frames) {
 			frame++;
-		} else if (frame == num_frames && HASBIT(hs->animation_frames, 7)) {
+		} else if (frame == num_frames && HasBit(hs->animation_frames, 7)) {
 			/* This animation loops, so start again from the beginning */
 			frame = 0;
 		} else {
@@ -460,7 +461,7 @@
 	if ((IsValidPlayer(_current_player) && IsHumanPlayer(_current_player))
 			|| _current_player == OWNER_WATER || _current_player == OWNER_NONE) return true;
 
-	if (HASBIT(hs->callback_mask, CBM_HOUSE_DENY_DESTRUCTION)) {
+	if (HasBit(hs->callback_mask, CBM_HOUSE_DENY_DESTRUCTION)) {
 		uint16 callback_res = GetHouseCallback(CBID_HOUSE_DENY_DESTRUCTION, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 		return (callback_res == CALLBACK_FAILED || callback_res == 0);
 	} else {
@@ -472,7 +473,7 @@
 {
 	const HouseSpec *hs = GetHouseSpecs(GetHouseType(tile));
 
-	if (HASBIT(hs->callback_mask, CBM_HOUSE_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,13 +490,10 @@
 		return true;
 	}
 
-	/* @todo: Magic with triggers goes here.  Got to implement that, one day. ..
-	 * Process randomizing of tiles following specs.
-	 * Once done, redraw the house
-	 * MarkTileDirtyByTile(tile);
-	 */
+	TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP);
+	TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP_TOP);
 
-	if (HASBIT(hs->callback_mask, CBM_HOUSE_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
@@ -513,7 +511,7 @@
 	}
 
 	/* Check callback 21, which determines if a house should be destroyed. */
-	if (HASBIT(hs->callback_mask, CBM_HOUSE_DESTRUCTION)) {
+	if (HasBit(hs->callback_mask, CBM_HOUSE_DESTRUCTION)) {
 		uint16 callback_res = GetHouseCallback(CBID_HOUSE_DESTRUCTION, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 		if (callback_res != CALLBACK_FAILED && callback_res > 0) {
 			ClearTownHouse(GetTownByTile(tile), tile);
@@ -524,3 +522,47 @@
 	SetHouseProcessingTime(tile, hs->processing_time);
 	return true;
 }
+
+static void DoTriggerHouse(TileIndex tile, HouseTrigger trigger, byte base_random, bool first)
+{
+	ResolverObject object;
+
+	/* We can't trigger a non-existent building... */
+	assert(IsTileType(tile, MP_HOUSE));
+
+	HouseID hid = GetHouseType(tile);
+	HouseSpec *hs = GetHouseSpecs(hid);
+
+	NewHouseResolver(&object, hid, tile, GetTownByTile(tile));
+
+	object.callback = CBID_RANDOM_TRIGGER;
+	object.trigger = trigger;
+
+	const SpriteGroup *group = Resolve(hs->spritegroup, &object);
+	if (group == NULL) return;
+
+	byte new_random_bits = Random();
+	byte random_bits = GetHouseRandomBits(tile);
+	random_bits &= ~object.reseed;
+	random_bits |= (first ? new_random_bits : base_random) & object.reseed;
+	SetHouseRandomBits(tile, random_bits);
+
+	switch (trigger) {
+		case HOUSE_TRIGGER_TILE_LOOP:
+			/* Random value already set. */
+			break;
+
+		case HOUSE_TRIGGER_TILE_LOOP_TOP:
+			if (!first) break;
+			/* Random value of first tile already set. */
+			if (hs->building_flags & BUILDING_2_TILES_Y)   DoTriggerHouse(TILE_ADDXY(tile, 0, 1), trigger, random_bits, false);
+			if (hs->building_flags & BUILDING_2_TILES_X)   DoTriggerHouse(TILE_ADDXY(tile, 1, 0), trigger, random_bits, false);
+			if (hs->building_flags & BUILDING_HAS_4_TILES) DoTriggerHouse(TILE_ADDXY(tile, 1, 1), trigger, random_bits, false);
+			break;
+	}
+}
+
+void TriggerHouse(TileIndex t, HouseTrigger trigger)
+{
+	DoTriggerHouse(t, trigger, 0, true);
+}
--- a/src/newgrf_house.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_house.h	Mon Dec 03 23:39:38 2007 +0000
@@ -45,4 +45,15 @@
 
 bool NewHouseTileLoop(TileIndex tile);
 
+enum HouseTrigger {
+	/* The tile of the house has been triggered during the tileloop. */
+	HOUSE_TRIGGER_TILE_LOOP     = 0x01,
+	/*
+	 * The top tile of a (multitile) building has been triggered during and all
+	 * the tileloop other tiles of the same building get the same random value.
+	 */
+	HOUSE_TRIGGER_TILE_LOOP_TOP = 0x02,
+};
+void TriggerHouse(TileIndex t, HouseTrigger trigger);
+
 #endif /* NEWGRF_HOUSE_H */
--- a/src/newgrf_industries.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_industries.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -16,6 +16,7 @@
 #include "newgrf_callbacks.h"
 #include "newgrf_spritegroup.h"
 #include "newgrf_industries.h"
+#include "newgrf_industrytiles.h"
 #include "newgrf_commons.h"
 #include "newgrf_text.h"
 #include "newgrf_town.h"
@@ -30,7 +31,7 @@
 IndustryType MapNewGRFIndustryType(IndustryType grf_type, uint32 grf_id)
 {
 	if (grf_type == IT_INVALID) return IT_INVALID;
-	if (!HASBIT(grf_type, 7)) return GB(grf_type, 0, 6);
+	if (!HasBit(grf_type, 7)) return GB(grf_type, 0, 6);
 
 	return _industry_mngr.GetID(GB(grf_type, 0, 6), grf_id);
 }
@@ -83,7 +84,7 @@
  * @return value encoded as per NFO specs */
 uint32 GetIndustryIDAtOffset(TileIndex tile, const Industry *i)
 {
-	if (!IsTileType(tile, MP_INDUSTRY) || GetIndustryIndex(tile) == i->index) {
+	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;
 	}
@@ -157,6 +158,7 @@
 			/* Fall through */
 
 		default: //use the grfid specified in register 100h
+			SetBit(param_setID, 7); // bit 7 means it is not an old type
 			ind_index = MapNewGRFIndustryType(param_setID, GrfID);
 			break;
 	}
@@ -198,8 +200,12 @@
 		case 0x41:
 		case 0x42: { // waiting cargo, but only if those two callback flags are set
 			uint16 callback = indspec->callback_flags;
-			if (HASBIT(callback, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HASBIT(callback, CBM_IND_PRODUCTION_256_TICKS)) {
-				return min(industry->incoming_cargo_waiting[variable - 0x40], (uint16)0xFFFF);
+			if (HasBit(callback, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(callback, CBM_IND_PRODUCTION_256_TICKS)) {
+				if ((indspec->behaviour & INDUSTRYBEH_PROD_MULTI_HNDLING) != 0) {
+					return min(industry->incoming_cargo_waiting[variable - 0x40] / industry->prod_level, (uint16)0xFFFF);
+				} else {
+					return min(industry->incoming_cargo_waiting[variable - 0x40], (uint16)0xFFFF);
+				}
 			} else {
 				return 0;
 			}
@@ -313,14 +319,14 @@
 		case 0xA6: return industry->type;
 		case 0xA7: return industry->founder;
 		case 0xA8: return industry->random_color;
-		case 0xA9: return clamp(0, industry->last_prod_year - 1920, 255);
+		case 0xA9: return Clamp(0, industry->last_prod_year - 1920, 255);
 		case 0xAA: return industry->counter;
 		case 0xAB: return GB(industry->counter, 8, 8);
 		case 0xAC: return industry->was_cargo_delivered;
 
-		case 0xB0: return clamp(0, industry->construction_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 65535); // Date when built since 1920 (in days)
+		case 0xB0: return Clamp(0, industry->construction_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 65535); // Date when built since 1920 (in days)
 		case 0xB3: return industry->construction_type; // Construction type
-		case 0xB4: return clamp(0, industry->last_cargo_accepted_at - DAYS_TILL_ORIGINAL_BASE_YEAR, 65535); // Date last cargo accepted since 1920 (in days)
+		case 0xB4: return Clamp(0, industry->last_cargo_accepted_at - DAYS_TILL_ORIGINAL_BASE_YEAR, 65535); // Date last cargo accepted since 1920 (in days)
 	}
 
 	DEBUG(grf, 1, "Unhandled industry property 0x%X", variable);
@@ -337,18 +343,18 @@
 
 static uint32 IndustryGetRandomBits(const ResolverObject *object)
 {
-	return object->u.industry.ind == NULL ? 0 : 0; //object->u.industry.ind->random_bits;
+	return object->u.industry.ind == NULL ? 0 : object->u.industry.ind->random;
 }
 
 static uint32 IndustryGetTriggers(const ResolverObject *object)
 {
-	return object->u.industry.ind == NULL ? 0 : 0; //object->u.industry.ind->triggers;
+	return object->u.industry.ind == NULL ? 0 : object->u.industry.ind->random_triggers;
 }
 
 static void IndustrySetTriggers(const ResolverObject *object, int triggers)
 {
 	if (object->u.industry.ind == NULL) return;
-	//object->u.industry.ind->triggers = triggers;
+	object->u.industry.ind->random_triggers = triggers;
 }
 
 static void NewIndustryResolver(ResolverObject *res, TileIndex tile, Industry *indus)
@@ -458,6 +464,11 @@
 	 * the building of the industry, as that's how it's done in TTDP. */
 	if (group == NULL || group->type != SGT_CALLBACK) return true;
 
+	/* Copy some parameters from the registers to the error message text ref. stack */
+	SwitchToErrorRefStack();
+	PrepareTextRefStackUsage(4);
+	SwitchToNormalRefStack();
+
 	switch (group->g.callback.result) {
 		case 0x400: return true;
 		case 0x401: _error_message = STR_0239_SITE_UNSUITABLE; break;
@@ -473,7 +484,7 @@
 {
 	const IndustrySpec *indspec = GetIndustrySpec(type);
 
-	if (HASBIT(indspec->callback_flags, CBM_IND_AVAILABLE)) {
+	if (HasBit(indspec->callback_flags, CBM_IND_AVAILABLE)) {
 		uint16 res = GetIndustryCallback(CBID_INDUSTRY_AVAILABLE, 0, creation_type, NULL, type, INVALID_TILE);
 		if (res != CALLBACK_FAILED) {
 			return (res == 0);
@@ -498,6 +509,8 @@
 	ResolverObject object;
 	NewIndustryResolver(&object, ind->xy, ind);
 	if ((spec->behaviour & INDUSTRYBEH_PRODCALLBACK_RANDOM) != 0) object.callback_param1 = Random();
+	int multiplier = 1;
+	if ((spec->behaviour & INDUSTRYBEH_PROD_MULTI_HNDLING) != 0) multiplier = ind->prod_level;
 	object.callback_param2 = reason;
 
 	for (uint loop = 0;; loop++) {
@@ -508,10 +521,10 @@
 		bool deref = (group->g.indprod.version == 1);
 
 		for (uint i = 0; i < 3; i++) {
-			ind->incoming_cargo_waiting[i] = clamp(ind->incoming_cargo_waiting[i] - DerefIndProd(group->g.indprod.substract_input[i], deref), 0, 0xFFFF);
+			ind->incoming_cargo_waiting[i] = Clamp(ind->incoming_cargo_waiting[i] - DerefIndProd(group->g.indprod.substract_input[i], deref) * multiplier, 0, 0xFFFF);
 		}
 		for (uint i = 0; i < 2; i++) {
-			ind->produced_cargo_waiting[i] = clamp(ind->produced_cargo_waiting[i] + DerefIndProd(group->g.indprod.add_output[i], deref), 0, 0xFFFF);
+			ind->produced_cargo_waiting[i] = Clamp(ind->produced_cargo_waiting[i] + max(DerefIndProd(group->g.indprod.add_output[i], deref), 0) * multiplier, 0, 0xFFFF);
 		}
 
 		int32 again = DerefIndProd(group->g.indprod.again, deref);
@@ -522,3 +535,19 @@
 
 	InvalidateWindow(WC_INDUSTRY_VIEW, ind->index);
 }
+
+void DoTriggerIndustry(Industry *ind, IndustryTileTrigger trigger)
+{
+	ResolverObject object;
+
+	NewIndustryResolver(&object, ind->xy, ind);
+	object.callback = CBID_RANDOM_TRIGGER;
+	object.trigger = trigger;
+
+	const SpriteGroup *group = Resolve(GetIndustrySpec(ind->type)->grf_prop.spritegroup, &object);
+	if (group == NULL) return;
+
+	byte new_random_bits = Random();
+	ind->random &= ~object.reseed;
+	ind->random |= new_random_bits & object.reseed;
+}
--- a/src/newgrf_industrytiles.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_industrytiles.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -22,6 +22,7 @@
 #include "table/sprites.h"
 #include "table/strings.h"
 #include "sprite.h"
+#include "transparency.h"
 
 /**
  * Based on newhouses equivalent, but adapted for newindustries
@@ -118,14 +119,14 @@
 {
 	const TileIndex tile = object->u.industry.tile;
 	if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
-	return (object->scope == VSG_SCOPE_SELF) ? GetIndustryRandomBits(tile) : 0; //GetIndustryByTile(tile)->random_bits;
+	return (object->scope == VSG_SCOPE_SELF) ? GetIndustryRandomBits(tile) : GetIndustryByTile(tile)->random;
 }
 
 static uint32 IndustryTileGetTriggers(const ResolverObject *object)
 {
 	const TileIndex tile = object->u.industry.tile;
 	if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
-	return (object->scope == VSG_SCOPE_SELF) ? GetIndustryTriggers(tile) : 0; //GetIndustryByTile(tile)->triggers;
+	return (object->scope == VSG_SCOPE_SELF) ? GetIndustryTriggers(tile) : GetIndustryByTile(tile)->random_triggers;
 }
 
 static void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
@@ -133,10 +134,10 @@
 	const TileIndex tile = object->u.industry.tile;
 	if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return;
 
-	if (object->scope != VSG_SCOPE_SELF) {
+	if (object->scope == VSG_SCOPE_SELF) {
 		SetIndustryTriggers(tile, triggers);
 	} else {
-		//GetIndustryByTile(tile)->triggers = triggers;
+		GetIndustryByTile(tile)->random_triggers = triggers;
 	}
 }
 
@@ -181,8 +182,10 @@
 
 		if (IS_CUSTOM_SPRITE(image)) image += stage;
 
-		if (HASBIT(image, PALETTE_MODIFIER_COLOR)) {
-			pal = GENERAL_SPRITE_COLOR(rnd_color);
+		if (HasBit(image, PALETTE_MODIFIER_COLOR)) {
+			if (pal == 0) {
+				pal = GENERAL_SPRITE_COLOR(rnd_color);
+			}
 		} else {
 			pal = PAL_NONE;
 		}
@@ -193,10 +196,10 @@
 				ti->x + dtss->delta_x, ti->y + dtss->delta_y,
 				dtss->size_x, dtss->size_y,
 				dtss->size_z, ti->z + dtss->delta_z,
-				!HASBIT(image, SPRITE_MODIFIER_OPAQUE) && HASBIT(_transparent_opt, TO_INDUSTRIES)
+				!HasBit(image, SPRITE_MODIFIER_OPAQUE) && IsTransparencySet(TO_INDUSTRIES)
 			);
 		} else {
-			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, HASBIT(_transparent_opt, TO_INDUSTRIES));
+			AddChildSpriteScreen(image, pal, (byte)dtss->delta_x, (byte)dtss->delta_y, IsTransparencySet(TO_INDUSTRIES));
 		}
 	}
 }
@@ -224,7 +227,7 @@
 
 	if (ti->tileh != SLOPE_FLAT) {
 		bool draw_old_one = true;
-		if (HASBIT(inds->callback_flags, CBM_INDT_DRAW_FOUNDATIONS)) {
+		if (HasBit(inds->callback_flags, CBM_INDT_DRAW_FOUNDATIONS)) {
 			/* Called to determine the type (if any) of foundation to draw for industry tile */
 			uint32 callback_res = GetIndustryTileCallback(CBID_INDUSTRY_DRAW_FOUNDATIONS, 0, 0, gfx, i, ti->tile);
 			draw_old_one = callback_res != 0;
@@ -241,7 +244,7 @@
 	} else {
 		/* Limit the building stage to the number of stages supplied. */
 		byte stage = GetIndustryConstructionStage(ti->tile);
-		stage = clamp(stage - 4 + group->g.layout.num_sprites, 0, group->g.layout.num_sprites - 1);
+		stage = Clamp(stage - 4 + group->g.layout.num_sprites, 0, group->g.layout.num_sprites - 1);
 		IndustryDrawTileLayout(ti, group, i->random_color, stage, gfx);
 		return true;
 	}
@@ -265,6 +268,11 @@
 		return callback_res != 0;
 	}
 
+	/* Copy some parameters from the registers to the error message text ref. stack */
+	SwitchToErrorRefStack();
+	PrepareTextRefStackUsage(4);
+	SwitchToNormalRefStack();
+
 	switch (callback_res) {
 		case 0x400: return true;
 		case 0x401: _error_message = STR_0239_SITE_UNSUITABLE;                 return false;
@@ -281,9 +289,9 @@
 	const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
 	byte animation_speed = itspec->animation_speed;
 
-	if (HASBIT(itspec->callback_flags, CBM_INDT_ANIM_SPEED)) {
+	if (HasBit(itspec->callback_flags, CBM_INDT_ANIM_SPEED)) {
 		uint16 callback_res = GetIndustryTileCallback(CBID_INDTILE_ANIMATION_SPEED, 0, 0, gfx, ind, tile);
-		if (callback_res != CALLBACK_FAILED) animation_speed = clamp(callback_res & 0xFF, 0, 16);
+		if (callback_res != CALLBACK_FAILED) animation_speed = Clamp(callback_res & 0xFF, 0, 16);
 	}
 
 	/* An animation speed of 2 means the animation frame changes 4 ticks, and
@@ -294,10 +302,10 @@
 
 	bool frame_set_by_callback = false;
 	byte frame = GetIndustryAnimationState(tile);
-	uint16 num_frames = GB(itspec->animation_info, 0, 8) + 1;
+	uint16 num_frames = GB(itspec->animation_info, 0, 8);
 
-	if (HASBIT(itspec->callback_flags, CBM_INDT_ANIM_NEXT_FRAME)) {
-		uint16 callback_res = GetIndustryTileCallback(CBID_INDTILE_ANIM_NEXT_FRAME, HASBIT(itspec->animation_special_flags, 0) ? Random() : 0, 0, gfx, ind, tile);
+	if (HasBit(itspec->callback_flags, CBM_INDT_ANIM_NEXT_FRAME)) {
+		uint16 callback_res = GetIndustryTileCallback(CBID_INDTILE_ANIM_NEXT_FRAME, HasBit(itspec->animation_special_flags, 0) ? Random() : 0, 0, gfx, ind, tile);
 
 		if (callback_res != CALLBACK_FAILED) {
 			frame_set_by_callback = true;
@@ -354,7 +362,7 @@
 	IndustryGfx gfx = GetIndustryGfx(tile);
 	const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
 
-	if (!HASBIT(itspec->animation_triggers, iat)) return false;
+	if (!HasBit(itspec->animation_triggers, iat)) return false;
 
 	Industry *ind = GetIndustryByTile(tile);
 	ChangeIndustryTileAnimationFrame(tile, iat, random, gfx, ind);
@@ -377,3 +385,43 @@
 
 	return ret;
 }
+
+static void DoTriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger, Industry *ind)
+{
+	ResolverObject object;
+
+	IndustryGfx gfx = GetIndustryGfx(tile);
+	const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
+
+	NewIndustryTileResolver(&object, gfx, tile, ind);
+
+	object.callback = CBID_RANDOM_TRIGGER;
+	object.trigger = trigger;
+
+	const SpriteGroup *group = Resolve(itspec->grf_prop.spritegroup, &object);
+	if (group == NULL) return;
+
+	byte new_random_bits = Random();
+	byte random_bits = GetIndustryRandomBits(tile);
+	random_bits &= ~object.reseed;
+	random_bits |= new_random_bits & object.reseed;
+	SetIndustryRandomBits(tile, random_bits);
+}
+
+void TriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger)
+{
+	DoTriggerIndustryTile(tile, trigger, GetIndustryByTile(tile));
+}
+
+extern void DoTriggerIndustry(Industry *ind, IndustryTileTrigger trigger);
+
+void TriggerIndustry(Industry *ind, IndustryTileTrigger trigger)
+{
+	BEGIN_TILE_LOOP(tile, ind->width, ind->height, ind->xy)
+		if (IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == ind->index) {
+			DoTriggerIndustryTile(tile, trigger, ind);
+		}
+	END_TILE_LOOP(tile, ind->width, ind->height, ind->xy)
+
+	DoTriggerIndustry(ind, trigger);
+}
--- a/src/newgrf_industrytiles.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_industrytiles.h	Mon Dec 03 23:39:38 2007 +0000
@@ -21,4 +21,16 @@
 bool StartStopIndustryTileAnimation(TileIndex tile, IndustryAnimationTrigger iat, uint32 random = Random());
 bool StartStopIndustryTileAnimation(const Industry *ind, IndustryAnimationTrigger iat);
 
+
+enum IndustryTileTrigger {
+	/* The tile of the industry has been triggered during the tileloop. */
+	INDTILE_TRIGGER_TILE_LOOP       = 0x01,
+	/* The industry has been triggered via it's tick. */
+	INDUSTRY_TRIGGER_INDUSTRY_TICK  = 0x02,
+	/* Cargo has been delivered. */
+	INDUSTRY_TRIGGER_RECEIVED_CARGO = 0x04,
+};
+void TriggerIndustryTile(TileIndex t, IndustryTileTrigger trigger);
+void TriggerIndustry(Industry *ind, IndustryTileTrigger trigger);
+
 #endif /* NEWGRF_INDUSTRYTILES_H */
--- a/src/newgrf_sound.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_sound.cpp	Mon Dec 03 23:39:38 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_VEHICLE_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	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_spritegroup.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -84,7 +84,7 @@
 	/* Return common variables */
 	switch (variable) {
 		case 0x00: return max(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0);
-		case 0x01: return clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
+		case 0x01: return Clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
 		case 0x02: return _cur_month;
 		case 0x03: return _opt.landscape;
 		case 0x09: return _date_fract;
--- a/src/newgrf_station.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_station.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -311,10 +311,10 @@
 		uint32 ts = GetTileTrackStatus(tile + TileOffsByDir(*dir), TRANSPORT_RAIL, 0);
 		if (ts != 0) {
 			/* If there is any track on the tile, set the bit in the second byte */
-			SETBIT(res, i + 8);
+			SetBit(res, i + 8);
 
 			/* If any track reaches our exit direction, set the bit in the lower byte */
-			if (ts & DiagdirReachesTracks(*diagdir)) SETBIT(res, i);
+			if (ts & DiagdirReachesTracks(*diagdir)) SetBit(res, i);
 		}
 	}
 
@@ -392,7 +392,7 @@
 			case 0x42: return 0;               // Rail type (XXX Get current type from GUI?)
 			case 0x43: return _current_player; // Station owner
 			case 0x44: return 2;               // PBS status
-			case 0xFA: return clamp(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Build date, clamped to a 16 bit value
+			case 0xFA: return Clamp(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Build date, clamped to a 16 bit value
 		}
 
 		*available = false;
@@ -402,26 +402,26 @@
 	switch (variable) {
 		/* Calculated station variables */
 		case 0x40:
-			if (!HASBIT(_svc.valid, 0)) { _svc.v40 = GetPlatformInfoHelper(tile, false, false, false); SETBIT(_svc.valid, 0); }
+			if (!HasBit(_svc.valid, 0)) { _svc.v40 = GetPlatformInfoHelper(tile, false, false, false); SetBit(_svc.valid, 0); }
 			return _svc.v40;
 
 		case 0x41:
-			if (!HASBIT(_svc.valid, 1)) { _svc.v41 = GetPlatformInfoHelper(tile, true,  false, false); SETBIT(_svc.valid, 1); }
+			if (!HasBit(_svc.valid, 1)) { _svc.v41 = GetPlatformInfoHelper(tile, true,  false, false); SetBit(_svc.valid, 1); }
 			return _svc.v41;
 
 		case 0x42: return GetTerrainType(tile) | (GetRailType(tile) << 8);
 		case 0x43: return st->owner; // Station owner
 		case 0x44: return 2;         // PBS status
 		case 0x45:
-			if (!HASBIT(_svc.valid, 2)) { _svc.v45 = GetRailContinuationInfo(tile); SETBIT(_svc.valid, 2); }
+			if (!HasBit(_svc.valid, 2)) { _svc.v45 = GetRailContinuationInfo(tile); SetBit(_svc.valid, 2); }
 			return _svc.v45;
 
 		case 0x46:
-			if (!HASBIT(_svc.valid, 3)) { _svc.v46 = GetPlatformInfoHelper(tile, false, false, true); SETBIT(_svc.valid, 3); }
+			if (!HasBit(_svc.valid, 3)) { _svc.v46 = GetPlatformInfoHelper(tile, false, false, true); SetBit(_svc.valid, 3); }
 			return _svc.v46;
 
 		case 0x47:
-			if (!HASBIT(_svc.valid, 4)) { _svc.v47 = GetPlatformInfoHelper(tile, true,  false, true); SETBIT(_svc.valid, 4); }
+			if (!HasBit(_svc.valid, 4)) { _svc.v47 = GetPlatformInfoHelper(tile, true,  false, true); SetBit(_svc.valid, 4); }
 			return _svc.v47;
 
 		case 0x48: { // Accepted cargo types
@@ -429,12 +429,12 @@
 			uint32 value = 0;
 
 			for (cargo_type = 0; cargo_type < NUM_CARGO; cargo_type++) {
-				if (HASBIT(st->goods[cargo_type].acceptance_pickup, GoodsEntry::PICKUP)) SETBIT(value, cargo_type);
+				if (HasBit(st->goods[cargo_type].acceptance_pickup, GoodsEntry::PICKUP)) SetBit(value, cargo_type);
 			}
 			return value;
 		}
 		case 0x49:
-			if (!HASBIT(_svc.valid, 5)) { _svc.v49 = GetPlatformInfoHelper(tile, false, true, false); SETBIT(_svc.valid, 5); }
+			if (!HasBit(_svc.valid, 5)) { _svc.v49 = GetPlatformInfoHelper(tile, false, true, false); SetBit(_svc.valid, 5); }
 			return _svc.v49;
 
 		/* Variables which use the parameter */
@@ -452,7 +452,7 @@
 		//TODO: how/what to return here
 		//case 0xF6: return st->airport_flags;
 		//case 0xF7: return GB(st->airport_flags, 8, 8);
-		case 0xFA: return clamp(st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535);
+		case 0xFA: return Clamp(st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535);
 	}
 
 	/* Handle cargo variables with parameter, 0x60 to 0x65 */
@@ -525,7 +525,7 @@
 			break;
 	}
 
-	if (HASBIT(statspec->flags, 1)) cargo /= (st->trainst_w + st->trainst_h);
+	if (HasBit(statspec->flags, 1)) cargo /= (st->trainst_w + st->trainst_h);
 	cargo = min(0xfff, cargo);
 
 	if (cargo > statspec->cargo_threshold) {
@@ -752,7 +752,7 @@
 
 	relocation = GetCustomStationRelocation(statspec, NULL, INVALID_TILE);
 
-	if (HASBIT(statspec->callbackmask, CBM_STATION_SPRITE_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;
 	}
@@ -764,7 +764,7 @@
 	}
 
 	image = sprites->ground_sprite;
-	if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
+	if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 		image += GetCustomStationGroundRelocation(statspec, NULL, INVALID_TILE);
 		image += rti->custom_ground_offset;
 	} else {
@@ -776,7 +776,7 @@
 	foreach_draw_tile_seq(seq, sprites->seq) {
 		Point pt;
 		image = seq->image;
-		if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
+		if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 			image += rti->total_offset;
 		} else {
 			image += relocation;
@@ -811,7 +811,7 @@
 {
 	const StationSpec* statspec = GetStationSpec(tile);
 
-	return statspec != NULL && HASBIT(statspec->blocked, GetStationGfx(tile));
+	return statspec != NULL && HasBit(statspec->blocked, GetStationGfx(tile));
 }
 
 /* Check if a rail station tile is electrifiable.
@@ -822,6 +822,6 @@
 
 	return
 		statspec == NULL ||
-		HASBIT(statspec->pylons, GetStationGfx(tile)) ||
-		!HASBIT(statspec->wires, GetStationGfx(tile));
+		HasBit(statspec->pylons, GetStationGfx(tile)) ||
+		!HasBit(statspec->wires, GetStationGfx(tile));
 }
--- a/src/newgrf_text.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_text.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -538,30 +538,52 @@
 		this->stack[this->position + 1] = GB(word, 8, 8);
 	}
 
-	void ResetStack() { this->used = true; this->position = 0; }
+	void ResetStack()  { this->position = 0; this->used = true; }
+	void RewindStack() { this->position = 0; }
 };
 
+static TextRefStack _newgrf_normal_textrefstack;
+static TextRefStack _newgrf_error_textrefstack;
+
 /** The stack that is used for TTDP compatible string code parsing */
-static TextRefStack _newgrf_textrefstack;
+static TextRefStack *_newgrf_textrefstack = &_newgrf_normal_textrefstack;
 
-/** Prepare the TTDP compatible string code parsing */
-void PrepareTextRefStackUsage()
+/**
+ * Prepare the TTDP compatible string code parsing
+ * @param numEntries number of entries to copy from the registers
+ */
+void PrepareTextRefStackUsage(byte numEntries)
 {
 	extern TemporaryStorageArray<uint32, 0x110> _temp_store;
 
-	_newgrf_textrefstack.ResetStack();
+	_newgrf_textrefstack->ResetStack();
 
-	byte *p = _newgrf_textrefstack.stack;
-	for (uint i = 0; i < 6; i++) {
+	byte *p = _newgrf_textrefstack->stack;
+	for (uint i = 0; i < numEntries; i++) {
 		for (uint j = 0; j < 32; j += 8) {
-			*p = GB(_temp_store.Get(0x100 + i), 32 - j, 8);
+			*p = GB(_temp_store.Get(0x100 + i), j, 8);
 			p++;
 		}
 	}
 }
 
 /** Stop using the TTDP compatible string code parsing */
-void StopTextRefStackUsage() { _newgrf_textrefstack.used = false; }
+void StopTextRefStackUsage() { _newgrf_textrefstack->used = false; }
+
+void SwitchToNormalRefStack()
+{
+	_newgrf_textrefstack = &_newgrf_normal_textrefstack;
+}
+
+void SwitchToErrorRefStack()
+{
+	_newgrf_textrefstack = &_newgrf_error_textrefstack;
+}
+
+void RewindTextRefStack()
+{
+	_newgrf_textrefstack->RewindStack();
+}
 
 /**
  * FormatString for NewGRF specific "magic" string control codes
@@ -571,31 +593,31 @@
  */
 uint RemapNewGRFStringControlCode(uint scc, char **buff, const char **str, int64 *argv)
 {
-	if (_newgrf_textrefstack.used) {
+	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_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_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_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_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_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_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();
+				*argv = _newgrf_textrefstack->PopUnsignedWord();
 				if (*argv == STR_NULL) *argv = STR_EMPTY;
 				break;
 		}
@@ -614,7 +636,7 @@
 			return SCC_CURRENCY;
 
 		case SCC_NEWGRF_PRINT_STRING_ID:
-			return SCC_STRING;
+			return SCC_STRING1;
 
 		case SCC_NEWGRF_PRINT_DATE:
 			return SCC_DATE_LONG;
--- a/src/newgrf_text.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_text.h	Mon Dec 03 23:39:38 2007 +0000
@@ -15,8 +15,11 @@
 
 bool CheckGrfLangID(byte lang_id, byte grf_version);
 
-void PrepareTextRefStackUsage();
+void PrepareTextRefStackUsage(byte numEntries);
 void StopTextRefStackUsage();
+void SwitchToNormalRefStack();
+void SwitchToErrorRefStack();
+void RewindTextRefStack();
 uint RemapNewGRFStringControlCode(uint scc, char **buff, const char **str, int64 *argv);
 
 #endif /* NEWGRF_TEXT_H */
--- a/src/newgrf_townname.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/newgrf_townname.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -44,7 +44,7 @@
 		for (int i = 0; i < 128; i++) {
 			for (int j = 0; j < t->nbparts[i]; j++) {
 				for (int k = 0; k < t->partlist[i][j].partcount; k++) {
-					if (!HASBIT(t->partlist[i][j].parts[k].prob, 7)) free(t->partlist[i][j].parts[k].data.text);
+					if (!HasBit(t->partlist[i][j].parts[k].prob, 7)) free(t->partlist[i][j].parts[k].data.text);
 				}
 				free(t->partlist[i][j].parts);
 			}
@@ -70,7 +70,7 @@
 			byte prob = t->partlist[id][i].parts[j].prob;
 			maxprob -= GB(prob, 0, 7);
 			if (maxprob > r) continue;
-			if (HASBIT(prob, 7)) {
+			if (HasBit(prob, 7)) {
 				buf = RandomPart(buf, t, seed, t->partlist[id][i].parts[j].data.id, last);
 			} else {
 				buf = strecat(buf, t->partlist[id][i].parts[j].data.text, last);
--- a/src/news.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/news.h	Mon Dec 03 23:39:38 2007 +0000
@@ -53,6 +53,9 @@
 	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_INDUSTRY_PLAYER, ///< Production changes of industry serviced by local player
+	NT_INDUSTRY_OTHER,  ///< Production changes of industry serviced by competitor(s)
+	NT_INDUSTRY_NOBODY, ///< Other industry production changes
 	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
--- a/src/news_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/news_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -17,6 +17,7 @@
 #include "variables.h"
 #include "date.h"
 #include "string.h"
+#include "transparency.h"
 
 /** @file news_gui.cpp
  *
@@ -106,7 +107,7 @@
 	GfxFillRect(left, top, right, top, 0xD7);
 	GfxFillRect(left, bottom, right, bottom, 0xD7);
 
-	DrawString(left + 2, top + 1, STR_00C6, 0);
+	DrawString(left + 2, top + 1, STR_00C6, TC_FROMSTRING);
 }
 
 static void NewsWindowProc(Window *w, WindowEvent *e)
@@ -126,10 +127,10 @@
 			case NM_THIN: {
 				DrawNewsBorder(w);
 
-				DrawString(2, 1, STR_00C6, 0);
+				DrawString(2, 1, STR_00C6, TC_FROMSTRING);
 
 				SetDParam(0, ni->date);
-				DrawStringRightAligned(428, 1, STR_01FF, 0);
+				DrawStringRightAligned(428, 1, STR_01FF, TC_FROMSTRING);
 
 				if (!(ni->flags & NF_VIEWPORT)) {
 					CopyInDParam(0, ni->params, lengthof(ni->params));
@@ -137,10 +138,10 @@
 						ni->string_id, w->width - 4);
 				} else {
 					/* Back up transparency options to draw news view */
-					byte to_backup = _transparent_opt;
-					_transparent_opt = 0;
+					TransparencyOptionBits to_backup = _transparency_opt;
+					_transparency_opt = 0;
 					DrawWindowViewport(w);
-					_transparent_opt = to_backup;
+					_transparency_opt = to_backup;
 
 					/* Shade the viewport into gray, or color*/
 					vp = w->viewport;
@@ -219,7 +220,7 @@
 		if (w->viewport != NULL)
 			w->viewport->top += y - w->top;
 
-		diff = delta(w->top, y);
+		diff = Delta(w->top, y);
 		w->top = y;
 
 		SetDirtyBlocks(w->left, w->top - diff, w->left + w->width, w->top + w->height);
@@ -340,6 +341,9 @@
 	60,  ///< NT_COMPANY_INFO
 	90,  ///< NT_OPENCLOSE
 	30,  ///< NT_ECONOMY
+	30,  ///< NT_INDUSTRY_PLAYER
+	30,  ///< NT_INDUSTRY_OTHER
+	30,  ///< NT_INDUSTRY_NOBODY
 	150, ///< NT_ADVICE
 	30,  ///< NT_NEW_VEHICLES
 	90,  ///< NT_ACCEPTANCE
@@ -393,17 +397,20 @@
 };
 
 static const SoundFx _news_sounds[NT_END] = {
-	SND_1D_APPLAUSE,
-	SND_1D_APPLAUSE,
-	SND_BEGIN,
-	SND_BEGIN,
-	SND_BEGIN,
-	SND_BEGIN,
-	SND_BEGIN,
-	SND_1E_OOOOH,
-	SND_BEGIN,
-	SND_BEGIN,
-	SND_BEGIN,
+	SND_1D_APPLAUSE,	///< NT_ARRIVAL_PLAYER
+	SND_1D_APPLAUSE,	///< NT_ARRIVAL_OTHER
+	SND_BEGIN,		///< NT_ACCIDENT
+	SND_BEGIN,		///< NT_COMPANY_INFO
+	SND_BEGIN,		///< NT_OPENCLOSE
+	SND_BEGIN,		///< NT_ECONOMY
+	SND_BEGIN,		///< NT_INDUSTRY_PLAYER
+	SND_BEGIN,		///< NT_INDUSTRY_OTHER
+	SND_BEGIN,		///< NT_INDUSTRY_NOBODY
+	SND_BEGIN,		///< NT_ADVICE
+	SND_1E_OOOOH,		///< NT_NEW_VEHICLES
+	SND_BEGIN,		///< NT_ACCEPTANCE
+	SND_BEGIN,		///< NT_SUBSIDIES
+	SND_BEGIN,		///< NT_GENERAL
 };
 
 const char *_news_display_name[NT_END] = {
@@ -413,6 +420,9 @@
 	"company_info",
 	"openclose",
 	"economy",
+	"production_player",
+	"production_other",
+	"production_nobody",
 	"advice",
 	"new_vehicles",
 	"acceptance",
@@ -651,7 +661,7 @@
 	char *dest;
 	StringID str;
 
-	if (ni->display_mode == 3) {
+	if (ni->display_mode == NM_CALLBACK) {
 		str = _get_news_string_callback[ni->callback](ni);
 	} else {
 		CopyInDParam(0, ni->params, lengthof(ni->params));
@@ -704,9 +714,9 @@
 			const NewsItem *ni = &_news_items[getNews(p)];
 
 			SetDParam(0, ni->date);
-			DrawString(4, y, STR_SHORT_DATE, 12);
+			DrawString(4, y, STR_SHORT_DATE, TC_WHITE);
 
-			DrawNewsString(82, y, 12, ni, w->width - 95);
+			DrawNewsString(82, y, TC_WHITE, ni, w->width - 95);
 			y += 12;
 		}
 		break;
@@ -770,6 +780,7 @@
 }
 
 
+/** News settings window widget offset constants */
 enum {
 	WIDGET_NEWSOPT_BTN_SUMMARY  = 4,  ///< Button that adjusts at once the level for all settings
 	WIDGET_NEWSOPT_DROP_SUMMARY,      ///< Drop down button for same upper button
@@ -790,8 +801,8 @@
 {
 	element *= NB_WIDG_PER_SETTING;
 
-	SetWindowWidgetDisabledState(w, element + WIDGET_NEWSOPT_START_OPTION, value == 0);
-	SetWindowWidgetDisabledState(w, element + WIDGET_NEWSOPT_START_OPTION + 2, value == 2);
+	w->SetWidgetDisabledState(element + WIDGET_NEWSOPT_START_OPTION, value == 0);
+	w->SetWidgetDisabledState(element + WIDGET_NEWSOPT_START_OPTION + 2, value == 2);
 }
 
 /**
@@ -825,18 +836,18 @@
 			uint32 val = _news_display_opt;
 			int i, y;
 
-			if (_news_ticker_sound) LowerWindowWidget(w, WIDGET_NEWSOPT_SOUNDTICKER);
+			if (_news_ticker_sound) w->LowerWidget(WIDGET_NEWSOPT_SOUNDTICKER);
 			DrawWindowWidgets(w);
 
 			/* Draw the string of each setting on each button. */
 			for (i = 0, y = 26; i < NT_END; i++, y += 12, val >>= 2) {
 				/* 51 comes from 13 + 89 (left and right of the button)+1, shiefted by one as to get division,
 				 * which will give centered position */
-				DrawStringCentered(51, y + 1, message_opt[val & 0x3], 0x10);
+				DrawStringCentered(51, y + 1, message_opt[val & 0x3], TC_BLACK);
 			}
 
 			/* Draw the general bottom button string as well */
-			DrawStringCentered(51, y + 10, message_opt[WP(w, def_d).data_1], 0x10);
+			DrawStringCentered(51, y + 10, message_opt[WP(w, def_d).data_1], TC_BLACK);
 		} break;
 
 		case WE_CLICK:
@@ -848,7 +859,7 @@
 
 				case WIDGET_NEWSOPT_SOUNDTICKER: // Change ticker sound on/off
 					_news_ticker_sound ^= 1;
-					ToggleWidgetLoweredState(w, e->we.click.widget);
+					w->ToggleWidgetLoweredState(e->we.click.widget);
 					InvalidateWidget(w, e->we.click.widget);
 					break;
 
@@ -879,83 +890,106 @@
 	}
 }
 
+
+/*
+* The news settings window widgets
+*
+* Main part of the window is a list of news-setting lines, one for each news category.
+* Each line is constructed by an expansion of the \c NEWS_SETTINGS_LINE macro
+*/
+
+/**
+* Macro to construct one news-setting line in the news-settings window.
+* One line consists of four widgets, namely
+* - A [<] button
+* - A [...] label
+* - A [>] button
+* - A text label describing the news category
+* Horizontal positions of the widgets are hard-coded, vertical start position is (\a basey + \a linenum * \c NEWS_SETTING_BASELINE_SKIP).
+* Height of one line is 12, with the text label shifted 1 pixel down.
+*
+* First line should be widget number WIDGET_NEWSOPT_START_OPTION
+*
+* @param basey: Base Y coordinate
+* @param linenum: Count, news-setting is the \a linenum-th line
+* @param text: StringID for the text label to display
+*/
+#define NEWS_SETTINGS_LINE(basey, linenum, text) \
+	{ WWT_PUSHIMGBTN, RESIZE_NONE, COLOUR_YELLOW, \
+	    4,  12,  basey     + linenum * NEWS_SETTING_BASELINE_SKIP,  basey + 11 + linenum * NEWS_SETTING_BASELINE_SKIP, \
+	  SPR_ARROW_LEFT, STR_HSCROLL_BAR_SCROLLS_LIST}, \
+	{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_YELLOW, \
+	   13,  89,  basey     + linenum * NEWS_SETTING_BASELINE_SKIP,  basey + 11 + linenum * NEWS_SETTING_BASELINE_SKIP, \
+	  STR_EMPTY, STR_NULL}, \
+	{ WWT_PUSHIMGBTN, RESIZE_NONE, COLOUR_YELLOW, \
+	   90,  98,  basey     + linenum * NEWS_SETTING_BASELINE_SKIP,  basey + 11 + linenum * NEWS_SETTING_BASELINE_SKIP, \
+	  SPR_ARROW_RIGHT, STR_HSCROLL_BAR_SCROLLS_LIST}, \
+        { WWT_TEXT, RESIZE_NONE, COLOUR_YELLOW, \
+	  103, 409,  basey + 1 + linenum * NEWS_SETTING_BASELINE_SKIP,  basey + 13 + linenum * NEWS_SETTING_BASELINE_SKIP, \
+	  text, STR_NULL}
+
+static const int NEWS_SETTING_BASELINE_SKIP = 12; ///< Distance between two news-setting lines, should be at least 12
+
+
 static const Widget _message_options_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,    13,     0,   10,     0,    13, STR_00C5,                              STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,    13,    11,  409,     0,    13, STR_0204_MESSAGE_OPTIONS,              STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,    13,     0,  409,    14,   196, 0x0,                                   STR_NULL},
+{ WWT_CLOSEBOX, RESIZE_NONE, COLOUR_BROWN,   0,  10,  0, 13,
+	STR_00C5,                 STR_018B_CLOSE_WINDOW},
+{  WWT_CAPTION, RESIZE_NONE, COLOUR_BROWN,  11, 409,  0, 13,
+	STR_0204_MESSAGE_OPTIONS, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{    WWT_PANEL, RESIZE_NONE, COLOUR_BROWN,   0, 409, 14, 64 + NT_END * NEWS_SETTING_BASELINE_SKIP,
+	0x0,                      STR_NULL},
 
 /* Text at the top of the main panel, in black */
-{      WWT_LABEL,   RESIZE_NONE,    13,     0,  409,    13,    26, STR_0205_MESSAGE_TYPES,                STR_NULL},
-
-/* General drop down and sound button */
-{      WWT_PANEL,   RESIZE_NONE,     3,     4,   86,   166,   177, 0x0,                                   STR_NULL},
-{    WWT_TEXTBTN,   RESIZE_NONE,     3,    87,   98,   166,   177, STR_0225,                              STR_NULL},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,   167,   179, STR_MESSAGES_ALL,                      STR_NULL},
-
-{  WWT_TEXTBTN_2,   RESIZE_NONE,     3,     4,   98,   178,   189, STR_02DB_OFF,                          STR_NULL},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,   179,   191, STR_MESSAGE_SOUND,                     STR_NULL},
-
-/* Each four group is composed of the buttons [<] [..] [>] and the descriptor of the setting */
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,    26,    37, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,    26,    37, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,    26,    37, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,    27,    39, STR_0206_ARRIVAL_OF_FIRST_VEHICLE,     STR_NULL},
-
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,    38,    49, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,    38,    49, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,    38,    49, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,    39,    51, STR_0207_ARRIVAL_OF_FIRST_VEHICLE,     STR_NULL},
-
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,    50,    61, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,    50,    61, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,    50,    61, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,    51,    63, STR_0208_ACCIDENTS_DISASTERS,          STR_NULL},
-
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,    62,    73, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,    62,    73, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,    62,    73, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,    63,    75, STR_0209_COMPANY_INFORMATION,          STR_NULL},
+{    WWT_LABEL, RESIZE_NONE, COLOUR_BROWN,
+	  0, 409, 13, 26,
+	STR_0205_MESSAGE_TYPES,   STR_NULL},
 
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,    74,    85, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,    74,    85, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,    74,    85, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,    75,    87, STR_NEWS_OPEN_CLOSE,                   STR_NULL},
-
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,    86,    97, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,    86,    97, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,    86,    97, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,    87,    99, STR_020A_ECONOMY_CHANGES,              STR_NULL},
-
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,    98,   109, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,    98,   109, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,    98,   109, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,    99,   111, STR_020B_ADVICE_INFORMATION_ON_PLAYER, STR_NULL},
+/* General drop down and sound button, widgets WIDGET_NEWSOPT_BTN_SUMMARY and WIDGET_NEWSOPT_DROP_SUMMARY */
+{     WWT_PANEL, RESIZE_NONE, COLOUR_YELLOW,
+	  4,  86,  34 + NT_END * NEWS_SETTING_BASELINE_SKIP,  45 + NT_END * NEWS_SETTING_BASELINE_SKIP,
+	0x0, STR_NULL},
 
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,   110,   121, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,   110,   121, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,   110,   121, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,   111,   123, STR_020C_NEW_VEHICLES,                 STR_NULL},
+{   WWT_TEXTBTN, RESIZE_NONE, COLOUR_YELLOW,
+	 87,  98,  34 + NT_END * NEWS_SETTING_BASELINE_SKIP,  45 + NT_END * NEWS_SETTING_BASELINE_SKIP,
+	STR_0225, STR_NULL},
 
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,   122,   133, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,   122,   133, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,   122,   133, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,   123,   135, STR_020D_CHANGES_OF_CARGO_ACCEPTANCE,  STR_NULL},
+{      WWT_TEXT, RESIZE_NONE, COLOUR_YELLOW,
+	103, 409,  35 + NT_END * NEWS_SETTING_BASELINE_SKIP,  47 + NT_END * NEWS_SETTING_BASELINE_SKIP,
+	STR_MESSAGES_ALL, STR_NULL},
 
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,   134,   145, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,   134,   145, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,   134,   145, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,   135,   147, STR_020E_SUBSIDIES,                    STR_NULL},
+/* Below is widget WIDGET_NEWSOPT_SOUNDTICKER */
+{ WWT_TEXTBTN_2, RESIZE_NONE, COLOUR_YELLOW,
+	  4,  98,  46 + NT_END * NEWS_SETTING_BASELINE_SKIP,  57 + NT_END * NEWS_SETTING_BASELINE_SKIP,
+	STR_02DB_OFF,  STR_NULL},
 
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,     4,   12,   146,   157, SPR_ARROW_LEFT,                        STR_HSCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,     3,    13,   89,   146,   157, STR_EMPTY,                             STR_NULL},
-{ WWT_PUSHIMGBTN,   RESIZE_NONE,     3,    90,   98,   146,   157, SPR_ARROW_RIGHT,                       STR_HSCROLL_BAR_SCROLLS_LIST},
-{       WWT_TEXT,   RESIZE_NONE,     3,    103, 409,   147,   159, STR_020F_GENERAL_INFORMATION,          STR_NULL},
+{      WWT_TEXT, RESIZE_NONE, COLOUR_YELLOW,
+	103, 409,  47 + NT_END * NEWS_SETTING_BASELINE_SKIP,  59 + NT_END * NEWS_SETTING_BASELINE_SKIP,
+	STR_MESSAGE_SOUND, STR_NULL},
+
+/* List of news-setting lines (4 widgets for each line).
+ * First widget must be number WIDGET_NEWSOPT_START_OPTION
+ */
+NEWS_SETTINGS_LINE(26, NT_ARRIVAL_PLAYER, STR_0206_ARRIVAL_OF_FIRST_VEHICLE),
+NEWS_SETTINGS_LINE(26, NT_ARRIVAL_OTHER,  STR_0207_ARRIVAL_OF_FIRST_VEHICLE),
+NEWS_SETTINGS_LINE(26, NT_ACCIDENT, STR_0208_ACCIDENTS_DISASTERS),
+NEWS_SETTINGS_LINE(26, NT_COMPANY_INFO, STR_0209_COMPANY_INFORMATION),
+NEWS_SETTINGS_LINE(26, NT_OPENCLOSE, STR_NEWS_OPEN_CLOSE),
+NEWS_SETTINGS_LINE(26, NT_ECONOMY, STR_020A_ECONOMY_CHANGES),
+NEWS_SETTINGS_LINE(26, NT_INDUSTRY_PLAYER, STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER),
+NEWS_SETTINGS_LINE(26, NT_INDUSTRY_OTHER, STR_INDUSTRY_CHANGES_SERVED_BY_OTHER),
+NEWS_SETTINGS_LINE(26, NT_INDUSTRY_NOBODY, STR_OTHER_INDUSTRY_PRODUCTION_CHANGES),
+NEWS_SETTINGS_LINE(26, NT_ADVICE, STR_020B_ADVICE_INFORMATION_ON_PLAYER),
+NEWS_SETTINGS_LINE(26, NT_NEW_VEHICLES, STR_020C_NEW_VEHICLES),
+NEWS_SETTINGS_LINE(26, NT_ACCEPTANCE, STR_020D_CHANGES_OF_CARGO_ACCEPTANCE),
+NEWS_SETTINGS_LINE(26, NT_SUBSIDIES, STR_020E_SUBSIDIES),
+NEWS_SETTINGS_LINE(26, NT_GENERAL, STR_020F_GENERAL_INFORMATION),
 
 {   WIDGETS_END},
 };
 
 static const WindowDesc _message_options_desc = {
-	270, 22, 410, 197, 410, 197,
+	270,  22,  410,  65 + NT_END * NEWS_SETTING_BASELINE_SKIP,
+	           410,  65 + NT_END * NEWS_SETTING_BASELINE_SKIP,
 	WC_GAME_OPTIONS, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
 	_message_options_widgets,
--- a/src/npf.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/npf.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -40,8 +40,8 @@
  */
 static uint NPFDistanceTrack(TileIndex t0, TileIndex t1)
 {
-	const uint dx = delta(TileX(t0), TileX(t1));
-	const uint dy = delta(TileY(t0), TileY(t1));
+	const uint dx = Delta(TileX(t0), TileX(t1));
+	const uint dy = Delta(TileY(t0), TileY(t1));
 
 	const uint straightTracks = 2 * min(dx, dy); /* The number of straight (not full length) tracks */
 	/* OPTIMISATION:
@@ -104,10 +104,10 @@
 
 	/* we are going the aim for the x coordinate of the closest corner
 	 * but if we are between those coordinates, we will aim for our own x coordinate */
-	x = clamp(TileX(tile), minx, maxx);
+	x = Clamp(TileX(tile), minx, maxx);
 
 	/* same for y coordinate, see above comment */
-	y = clamp(TileY(tile), miny, maxy);
+	y = Clamp(TileY(tile), miny, maxy);
 
 	/* return the tile of our target coordinates */
 	return TileXY(x, y);
@@ -192,18 +192,21 @@
 static uint NPFSlopeCost(AyStarNode* current)
 {
 	TileIndex next = current->tile + TileOffsByDiagDir(TrackdirToExitdir((Trackdir)current->direction));
-	int x,y;
-	int8 z1,z2;
 
-	x = TileX(current->tile) * TILE_SIZE;
-	y = TileY(current->tile) * TILE_SIZE;
-	/* get the height of the center of the current tile */
-	z1 = GetSlopeZ(x + TILE_SIZE / 2, y + TILE_SIZE / 2);
+	/* Get center of tiles */
+	int x1 = TileX(current->tile) * TILE_SIZE + TILE_SIZE / 2;
+	int y1 = TileY(current->tile) * TILE_SIZE + TILE_SIZE / 2;
+	int x2 = TileX(next) * TILE_SIZE + TILE_SIZE / 2;
+	int y2 = TileY(next) * TILE_SIZE + TILE_SIZE / 2;
 
-	x = TileX(next) * TILE_SIZE;
-	y = TileY(next) * TILE_SIZE;
-	/* get the height of the center of the next tile */
-	z2 = GetSlopeZ(x + TILE_SIZE / 2, y + TILE_SIZE / 2);
+	int dx4 = (x2 - x1) / 4;
+	int dy4 = (y2 - y1) / 4;
+
+	/* Get the height on both sides of the tile edge.
+	 * Avoid testing the height on the tile-center. This will fail for halftile-foundations.
+	 */
+	int z1 = GetSlopeZ(x1 + dx4, y1 + dy4);
+	int z2 = GetSlopeZ(x2 - dx4, y2 - dy4);
 
 	if (z2 - z1 > 1) {
 		/* Slope up */
@@ -599,7 +602,7 @@
 	/* check correct rail type (mono, maglev, etc) */
 	if (type == TRANSPORT_RAIL) {
 		RailType dst_type = GetTileRailType(dst_tile);
-		if (!HASBIT(aystar->user_data[NPF_RAILTYPES], dst_type))
+		if (!HasBit(aystar->user_data[NPF_RAILTYPES], dst_type))
 			return;
 	}
 
--- a/src/npf.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/npf.h	Mon Dec 03 23:39:38 2007 +0000
@@ -112,7 +112,7 @@
  */
 static inline bool NPFGetFlag(const AyStarNode* node, NPFNodeFlag flag)
 {
-	return HASBIT(node->user_data[NPF_NODE_FLAGS], flag);
+	return HasBit(node->user_data[NPF_NODE_FLAGS], flag);
 }
 
 /**
@@ -121,9 +121,9 @@
 static inline void NPFSetFlag(AyStarNode* node, NPFNodeFlag flag, bool value)
 {
 	if (value)
-		SETBIT(node->user_data[NPF_NODE_FLAGS], flag);
+		SetBit(node->user_data[NPF_NODE_FLAGS], flag);
 	else
-		CLRBIT(node->user_data[NPF_NODE_FLAGS], flag);
+		ClrBit(node->user_data[NPF_NODE_FLAGS], flag);
 }
 
 #endif /* NPF_H */
--- a/src/oldloader.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/oldloader.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -224,7 +224,7 @@
 					default: break;
 				}
 			} else {
-				uint32 res = 0;
+				uint64 res = 0;
 
 				/* Reading from the file: bits 16 to 23 have the FILE type */
 				switch (GetOldChunkFileType(chunk->type)) {
@@ -302,7 +302,7 @@
 
 	/* Convert town-names if needed */
 	FOR_ALL_TOWNS(town) {
-		if (IS_INT_INSIDE(town->townnametype, 0x20C1, 0x20C3)) {
+		if (IsInsideMM(town->townnametype, 0x20C1, 0x20C3)) {
 			town->townnametype = SPECSTR_TOWNNAME_ENGLISH + _opt.town_name;
 			town->townnameparts = GetOldTownName(town->townnameparts, _opt.town_name);
 		}
@@ -333,7 +333,7 @@
 		if (v->type == VEH_ROAD &&
 				v->u.road.state != RVSB_IN_DEPOT &&
 				v->u.road.state != RVSB_WORMHOLE) {
-			CLRBIT(v->u.road.state, RVS_IS_STOPPING);
+			ClrBit(v->u.road.state, RVS_IS_STOPPING);
 		}
 
 		FOR_ALL_VEHICLES_FROM(u, v->index + 1) {
@@ -376,7 +376,8 @@
 #define REMAP_TOWN_IDX(x) ((x) - (0x0459154 - 0x0458EF0)) / 94
 #define REMAP_ORDER_IDX(x) ((x) - (0x045AB08 - 0x0458EF0)) / 2
 
-extern TileIndex _animated_tile_list[256];
+extern TileIndex *_animated_tile_list;
+extern uint _animated_tile_count;
 extern char _name_array[512][32];
 
 static byte   _old_vehicle_multiplier;
@@ -501,6 +502,29 @@
 	return true;
 }
 
+static bool LoadOldAnimTileList(LoadgameState *ls, int num)
+{
+	/* This is sligthly hackish - we must load a chunk into an array whose
+	 * address isn't static, but instead pointed to by _animated_tile_list.
+	 * To achieve that, create an OldChunks list on the stack on the fly.
+	 * The list cannot be static because the value of _animated_tile_list
+	 * can change between calls. */
+
+	const OldChunks anim_chunk[] = {
+		OCL_VAR (   OC_TILE, 256, _animated_tile_list ),
+		OCL_END ()
+	};
+
+	if (!LoadChunk(ls, NULL, anim_chunk)) return false;
+
+	/* Update the animated tile counter by counting till the first zero in the array */
+	for (_animated_tile_count = 0; _animated_tile_count < 256; _animated_tile_count++) {
+		if (_animated_tile_list[_animated_tile_count] == 0) break;
+	}
+
+	return true;
+}
+
 static const OldChunks depot_chunk[] = {
 	OCL_SVAR(   OC_TILE, Depot, xy ),
 	OCL_VAR ( OC_UINT32,   1, &_old_town_index ),
@@ -581,7 +605,7 @@
 	bool ret = LoadChunk(ls, ge, goods_chunk);
 	if (!ret) return false;
 
-	SB(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, HASBIT(_waiting_acceptance, 15));
+	SB(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, HasBit(_waiting_acceptance, 15));
 	SB(ge->acceptance_pickup, GoodsEntry::PICKUP, 1, _cargo_source != 0xFF);
 	if (GB(_waiting_acceptance, 0, 12) != 0) {
 		CargoPacket *cp = new CargoPacket();
@@ -706,6 +730,7 @@
 
 	if (i->IsValid()) {
 		i->town = GetTown(REMAP_TOWN_IDX(_old_town_index));
+		IncIndustryTypeCount(i->type);
 	}
 
 	return true;
@@ -734,8 +759,8 @@
 }
 
 static const OldChunks player_economy_chunk[] = {
-	OCL_SVAR( OC_INT32, PlayerEconomyEntry, income ),
-	OCL_SVAR( OC_INT32, PlayerEconomyEntry, expenses ),
+	OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, PlayerEconomyEntry, income ),
+	OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, PlayerEconomyEntry, expenses ),
 	OCL_SVAR( OC_INT32, PlayerEconomyEntry, delivered_cargo ),
 	OCL_SVAR( OC_INT32, PlayerEconomyEntry, performance_history ),
 	OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, PlayerEconomyEntry, company_value ),
@@ -918,7 +943,7 @@
 	OCL_SVAR(  OC_UINT8, Player, player_money_fraction ),
 	OCL_SVAR(  OC_UINT8, Player, quarters_of_bankrupcy ),
 	OCL_SVAR(  OC_UINT8, Player, bankrupt_asked ),
-	OCL_SVAR( OC_UINT32, Player, bankrupt_value ),
+	OCL_SVAR( OC_FILE_U32 | OC_VAR_I64, Player, bankrupt_value ),
 	OCL_SVAR( OC_UINT16, Player, bankrupt_timeout ),
 
 	OCL_SVAR( OC_FILE_U32 | OC_VAR_U16, Player, cargo_types ),
@@ -1159,8 +1184,8 @@
 	OCL_SVAR( OC_UINT16, Vehicle, reliability ),
 	OCL_SVAR( OC_UINT16, Vehicle, reliability_spd_dec ),
 
-	OCL_SVAR(  OC_INT32, Vehicle, profit_this_year ),
-	OCL_SVAR(  OC_INT32, Vehicle, profit_last_year ),
+	OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, Vehicle, profit_this_year ),
+	OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, Vehicle, profit_last_year ),
 
 	OCL_VAR ( OC_UINT16,   1, &_old_next_ptr ),
 
@@ -1206,7 +1231,7 @@
 			default:   v->spritenum >>= 1; break;
 		}
 
-		if (_old_next_ptr != 0xFFFF) v->next = GetVehicle(_old_next_ptr);
+		if (_old_next_ptr != 0xFFFF) v->next = GetVehiclePoolSize() <= _old_next_ptr ? new (_old_next_ptr) InvalidVehicle() : GetVehicle(_old_next_ptr);
 
 		v->string_id = RemapOldStringID(_old_string_id);
 
@@ -1288,23 +1313,23 @@
 }
 
 static const OldChunks game_difficulty_chunk[] = {
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, max_no_competitors ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, competitor_start_time ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, number_towns ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, number_industries ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, max_loan ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, initial_interest ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, vehicle_costs ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, competitor_speed ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, competitor_intelligence ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, vehicle_breakdowns ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, subsidy_multiplier ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, construction_cost ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, terrain_type ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, quantity_sea_lakes ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, economy ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, line_reverse_mode ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, GameDifficulty, disasters ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, max_no_competitors ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, competitor_start_time ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, number_towns ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, number_industries ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, max_loan ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, initial_interest ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, vehicle_costs ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, competitor_speed ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, competitor_intelligence ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, vehicle_breakdowns ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, subsidy_multiplier ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, construction_cost ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, terrain_type ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, quantity_sea_lakes ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, economy ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, line_reverse_mode ),
+	OCL_SVAR( OC_UINT16, GameDifficulty, disasters ),
 	OCL_END()
 };
 
@@ -1422,7 +1447,7 @@
 	OCL_CHUNK(5000, LoadOldOrder ),
 	OCL_ASSERT( 0x4328 ),
 
-	OCL_VAR (   OC_TILE, 256, &_animated_tile_list[0] ),
+	OCL_CHUNK( 1, LoadOldAnimTileList ),
 	OCL_NULL( 4 ),              ///< old end-of-order-list-pointer, no longer in use
 
 	OCL_CHUNK( 255, LoadOldDepot ),
@@ -1471,9 +1496,9 @@
 	OCL_VAR ( OC_FILE_I16 | OC_VAR_I32,   1, &_saved_scrollpos_y ),
 	OCL_VAR ( OC_FILE_U16 | OC_VAR_U8,    1, &_saved_scrollpos_zoom ),
 
-	OCL_VAR ( OC_UINT32,    1, &_economy.max_loan ),
-	OCL_VAR ( OC_UINT32,    1, &_economy.max_loan_unround ),
-	OCL_VAR ( OC_FILE_U16 | OC_VAR_U32,    1, &_economy.fluct ),
+	OCL_VAR ( OC_FILE_U32 | OC_VAR_I64,   1, &_economy.max_loan ),
+	OCL_VAR ( OC_FILE_U32 | OC_VAR_I64,   1, &_economy.max_loan_unround ),
+	OCL_VAR ( OC_FILE_U16 | OC_VAR_U32,   1, &_economy.fluct ),
 
 	OCL_VAR ( OC_UINT16,    1, &_disaster_delay ),
 
@@ -1592,6 +1617,16 @@
 		}
 	}
 
+	/* Make sure the available engines are really available, otherwise
+	 * we will get a "new vehicle"-spree. */
+	for (Engine *e = _engines; e != endof(_engines); e++) {
+		if (_date >= (e->intro_date + 365)) {
+			e->flags = (e->flags & ~ENGINE_EXCLUSIVE_PREVIEW) | ENGINE_AVAILABLE;
+			AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type);
+			e->player_avail = (byte)-1;
+		}
+	}
+
 	/* Fix the game to be compatible with OpenTTD */
 	FixOldTowns();
 	FixOldStations();
@@ -1600,7 +1635,7 @@
 	AddTypeToEngines();
 
 	/* We have a new difficulty setting */
-	_opt.diff.town_council_tolerance = clamp(_opt.diff_level, 0, 2);
+	_opt.diff.town_council_tolerance = Clamp(_opt.diff_level, 0, 2);
 
 	DEBUG(oldloader, 3, "Finished converting game data");
 	DEBUG(oldloader, 1, "TTD(Patch) savegame successfully converted");
--- a/src/oldpool.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/oldpool.h	Mon Dec 03 23:39:38 2007 +0000
@@ -47,6 +47,16 @@
 	byte **blocks;              ///< An array of blocks (one block hold all the items)
 
 	/**
+	 * Check if the index of pool item being deleted is lower than cached first_free_index
+	 * @param index index of pool item
+	 * @note usage of min() will result in better code on some architectures
+	 */
+	inline void UpdateFirstFreeIndex(uint index)
+	{
+		first_free_index = min(first_free_index, index);
+	}
+
+	/**
 	 * Get the size of this pool, i.e. the total number of items you
 	 * can put into it at the current moment; the pool might still
 	 * be able to increase the size of the pool.
@@ -157,10 +167,26 @@
 
 	/**
 	 * We like to have the correct class destructed.
+	 * @warning It is called even for object allocated on stack,
+	 *          so it is not present in the TPool!
+	 *          Then, index is undefined, not associated with TPool in any way.
+	 * @note    The idea is to free up allocated memory etc.
 	 */
 	virtual ~PoolItem()
 	{
-		if (this->index < Tpool->first_free_index) Tpool->first_free_index = this->index;
+
+	}
+
+	/**
+	 * Constructor of given class.
+	 * @warning It is called even for object allocated on stack,
+	 *          so it may not be present in TPool!
+	 *          Then, index is undefined, not associated with TPool in any way.
+	 * @note    The idea is to initialize variables (except index)
+	 */
+	PoolItem()
+	{
+
 	}
 
 	/**
@@ -176,9 +202,11 @@
 	/**
 	 * 'Free' the memory allocated by the overriden new.
 	 * @param p the memory to 'free'
+	 * @note we only update Tpool->first_free_index
 	 */
 	void operator delete(void *p)
 	{
+		Tpool->UpdateFirstFreeIndex(((T*)p)->index);
 	}
 
 	/**
@@ -199,9 +227,11 @@
 	 * 'Free' the memory allocated by the overriden new.
 	 * @param p     the memory to 'free'
 	 * @param index the original parameter given to create the memory
+	 * @note we only update Tpool->first_free_index
 	 */
 	void operator delete(void *p, int index)
 	{
+		Tpool->UpdateFirstFreeIndex(index);
 	}
 
 	/**
@@ -220,9 +250,11 @@
 	 * 'Free' the memory allocated by the overriden new.
 	 * @param p  the memory to 'free'
 	 * @param pn the pointer that was given to 'new' on creation.
+	 * @note we only update Tpool->first_free_index
 	 */
 	void operator delete(void *p, T *pn)
 	{
+		Tpool->UpdateFirstFreeIndex(pn->index);
 	}
 
 private:
--- a/src/openttd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/openttd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -77,6 +77,7 @@
 #include "water_map.h"
 #include "industry_map.h"
 #include "unmovable_map.h"
+#include "tree_map.h"
 
 #include <stdarg.h>
 
@@ -280,8 +281,8 @@
 		return;
 	}
 
-	res[0] = clamp(strtoul(s, NULL, 0), 64, MAX_SCREEN_WIDTH);
-	res[1] = clamp(strtoul(t + 1, NULL, 0), 64, MAX_SCREEN_HEIGHT);
+	res[0] = Clamp(strtoul(s, NULL, 0), 64, MAX_SCREEN_WIDTH);
+	res[1] = Clamp(strtoul(t + 1, NULL, 0), 64, MAX_SCREEN_HEIGHT);
 }
 
 static void InitializeDynamicVariables()
@@ -318,9 +319,6 @@
 {
 	_game_mode = GM_MENU;
 
-	/* Clear transparency options */
-	_transparent_opt = 0;
-
 	_opt_ptr = &_opt_newgame;
 	ResetGRFConfig(false);
 
@@ -721,6 +719,13 @@
 	SettingsDisableElrail(_patches.disable_elrails);
 	SetDefaultRailGui();
 
+	/* We are the server, we start a new player (not dedicated),
+	 * so set the default password *if* needed. */
+	if (_network_server && !StrEmpty(_network_default_company_pass)) {
+		char *password = _network_default_company_pass;
+		NetworkChangeCompanyPassword(1, &password);
+	}
+
 	MarkWholeScreenDirty();
 }
 
@@ -1130,7 +1135,7 @@
 	StateGameLoop();
 #endif /* ENABLE_NETWORK */
 
-	if (!_pause_game && HASBIT(_display_opt, DO_FULL_ANIMATION)) DoPaletteAnimations();
+	if (!_pause_game && HasBit(_display_opt, DO_FULL_ANIMATION)) DoPaletteAnimations();
 
 	if (!_pause_game || _cheats.build_in_pause.value) MoveAllTextEffects();
 
@@ -1157,7 +1162,7 @@
 	for (tile = 0; tile != MapSize(); tile++) {
 		switch (GetTileType(tile)) {
 			case MP_ROAD:
-				if (GB(_m[tile].m5, 4, 2) == ROAD_TILE_CROSSING && HASBIT(_m[tile].m4, 7)) {
+				if (GB(_m[tile].m5, 4, 2) == ROAD_TILE_CROSSING && HasBit(_m[tile].m4, 7)) {
 					_m[tile].m4 = OWNER_TOWN;
 				}
 				/* FALLTHROUGH */
@@ -1268,11 +1273,74 @@
 	}
 }
 
+/**
+ * Initialization of the windows and several kinds of caches.
+ * This is not done directly in AfterLoadGame because these
+ * functions require that all saveload conversions have been
+ * done. As people tend to add savegame conversion stuff after
+ * the intialization of the windows and caches quite some bugs
+ * had been made.
+ * Moving this out of there is both cleaner and less bug-prone.
+ *
+ * @return true if everything went according to plan, otherwise false.
+ */
+static bool InitializeWindowsAndCaches()
+{
+	/* Initialize windows */
+	ResetWindowSystem();
+	SetupColorsAndInitialWindow();
+
+	Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
+
+	WP(w, vp_d).scrollpos_x = _saved_scrollpos_x;
+	WP(w, vp_d).scrollpos_y = _saved_scrollpos_y;
+	WP(w, vp_d).dest_scrollpos_x = _saved_scrollpos_x;
+	WP(w, vp_d).dest_scrollpos_y = _saved_scrollpos_y;
+
+	ViewPort *vp = w->viewport;
+	vp->zoom = (ZoomLevel)min(_saved_scrollpos_zoom, ZOOM_LVL_MAX);
+	vp->virtual_width = ScaleByZoom(vp->width, vp->zoom);
+	vp->virtual_height = ScaleByZoom(vp->height, vp->zoom);
+
+	DoZoomInOutWindow(ZOOM_NONE, w); // update button status
+	MarkWholeScreenDirty();
+
+	/* Update coordinates of the signs. */
+	UpdateAllStationVirtCoord();
+	UpdateAllSignVirtCoords();
+	UpdateAllTownVirtCoords();
+	UpdateAllWaypointSigns();
+
+	/* Recalculate */
+	Group *g;
+	FOR_ALL_GROUPS(g) {
+		const Vehicle *v;
+		FOR_ALL_VEHICLES(v) {
+			if (!IsEngineCountable(v)) continue;
+
+			if (v->group_id != g->index || v->type != g->vehicle_type || v->owner != g->owner) continue;
+
+			g->num_engines[v->engine_type]++;
+		}
+	}
+
+	/* Set up the engine count for all players */
+	Player *players[MAX_PLAYERS];
+	const Vehicle *v;
+
+	for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) players[i] = GetPlayer(i);
+
+	FOR_ALL_VEHICLES(v) {
+		if (!IsEngineCountable(v)) continue;
+		players[v->owner]->num_engines[v->engine_type]++;
+	}
+
+	return true;
+}
+
 bool AfterLoadGame()
 {
 	TileIndex map_size = MapSize();
-	Window *w;
-	ViewPort *vp;
 	Player *p;
 
 	/* in version 2.1 of the savegame, town owner was unified. */
@@ -1339,28 +1407,14 @@
 	/* Update all waypoints */
 	if (CheckSavegameVersion(12)) FixOldWaypoints();
 
+	AfterLoadTown();
+
 	/* make sure there is a town in the game */
 	if (_game_mode == GM_NORMAL && !ClosestTownFromTile(0, (uint)-1)) {
 		SetSaveLoadError(STR_NO_TOWN_IN_SCENARIO);
 		return false;
 	}
 
-	/* Initialize windows */
-	ResetWindowSystem();
-	SetupColorsAndInitialWindow();
-
-	w = FindWindowById(WC_MAIN_WINDOW, 0);
-
-	WP(w,vp_d).scrollpos_x = _saved_scrollpos_x;
-	WP(w,vp_d).scrollpos_y = _saved_scrollpos_y;
-	WP(w,vp_d).dest_scrollpos_x = _saved_scrollpos_x;
-	WP(w,vp_d).dest_scrollpos_y = _saved_scrollpos_y;
-
-	vp = w->viewport;
-	vp->zoom = (ZoomLevel)min(_saved_scrollpos_zoom, ZOOM_LVL_MAX);
-	vp->virtual_width = ScaleByZoom(vp->width, vp->zoom);
-	vp->virtual_height = ScaleByZoom(vp->height, vp->zoom);
-
 	/* in version 4.1 of the savegame, is_active was introduced to determine
 	 * if a player does exist, rather then checking name_1 */
 	if (CheckSavegameVersionOldStyle(4, 1)) CheckIsPlayerActive();
@@ -1375,9 +1429,6 @@
 	if (!_players[0].is_active && (!_networking || (_networking && _network_server && !_network_dedicated)))
 		DoStartupNewPlayer(false);
 
-	DoZoomInOutWindow(ZOOM_NONE, w); // update button status
-	MarkWholeScreenDirty();
-
 	if (CheckSavegameVersion(72)) {
 		/* Locks/shiplifts in very old savegames had OWNER_WATER as owner */
 		for (TileIndex t = 0; t < MapSize(); t++) {
@@ -1389,37 +1440,37 @@
 					break;
 
 				case MP_STATION: {
-					if (HASBIT(_m[t].m6, 3)) SETBIT(_m[t].m6, 2);
+					if (HasBit(_m[t].m6, 3)) SetBit(_m[t].m6, 2);
 					StationGfx gfx = GetStationGfx(t);
 					StationType st;
-					if (       IS_INT_INSIDE(gfx,   0,   8)) { // Railway station
+					if (       IsInsideMM(gfx,   0,   8)) { // Railway station
 						st = STATION_RAIL;
 						SetStationGfx(t, gfx - 0);
-					} else if (IS_INT_INSIDE(gfx,   8,  67)) { // Airport
+					} else if (IsInsideMM(gfx,   8,  67)) { // Airport
 						st = STATION_AIRPORT;
 						SetStationGfx(t, gfx - 8);
-					} else if (IS_INT_INSIDE(gfx,  67,  71)) { // Truck
+					} else if (IsInsideMM(gfx,  67,  71)) { // Truck
 						st = STATION_TRUCK;
 						SetStationGfx(t, gfx - 67);
-					} else if (IS_INT_INSIDE(gfx,  71,  75)) { // Bus
+					} else if (IsInsideMM(gfx,  71,  75)) { // Bus
 						st = STATION_BUS;
 						SetStationGfx(t, gfx - 71);
 					} else if (gfx == 75) {                    // Oil rig
 						st = STATION_OILRIG;
 						SetStationGfx(t, gfx - 75);
-					} else if (IS_INT_INSIDE(gfx,  76,  82)) { // Dock
+					} else if (IsInsideMM(gfx,  76,  82)) { // Dock
 						st = STATION_DOCK;
 						SetStationGfx(t, gfx - 76);
 					} else if (gfx == 82) {                    // Buoy
 						st = STATION_BUOY;
 						SetStationGfx(t, gfx - 82);
-					} else if (IS_INT_INSIDE(gfx,  83, 168)) { // Extended airport
+					} else if (IsInsideMM(gfx,  83, 168)) { // Extended airport
 						st = STATION_AIRPORT;
 						SetStationGfx(t, gfx - 83 + 67 - 8);
-					} else if (IS_INT_INSIDE(gfx, 168, 170)) { // Drive through truck
+					} else if (IsInsideMM(gfx, 168, 170)) { // Drive through truck
 						st = STATION_TRUCK;
 						SetStationGfx(t, gfx - 168 + GFX_TRUCK_BUS_DRIVETHROUGH_OFFSET);
-					} else if (IS_INT_INSIDE(gfx, 170, 172)) { // Drive through bus
+					} else if (IsInsideMM(gfx, 170, 172)) { // Drive through bus
 						st = STATION_BUS;
 						SetStationGfx(t, gfx - 170 + GFX_TRUCK_BUS_DRIVETHROUGH_OFFSET);
 					} else {
@@ -1459,10 +1510,10 @@
 						 * an oil rig which got shut down, but not completly removed from
 						 * the map
 						 */
-						TileIndex t1 = TILE_ADDXY(t, 1, 0);
+						TileIndex t1 = TILE_ADDXY(t, 0, 1);
 						ResetAirportToNewGRFSpec(t, st, 0x4450414F, 3);
 						if (IsTileType(t1, MP_INDUSTRY) &&
-								GetIndustryGfx(t1) == GFX_OILRIG_3) {
+								GetIndustryGfx(t1) == GFX_OILRIG_1) {
 							/* The internal encoding of oil rigs was changed twice.
 							 * It was 3 (till 2.2) and later 5 (till 5.1).
 							 * Setting it unconditionally does not hurt.
@@ -1577,10 +1628,10 @@
 						uint tmp = GB(_m[t].m4, 0, 4);
 						SB(_m[t].m4, 0, 4, GB(_m[t].m2, 0, 4));
 						SB(_m[t].m2, 0, 4, tmp);
-					} else if (HASBIT(_m[t].m5, 2)) {
+					} else if (HasBit(_m[t].m5, 2)) {
 						/* Split waypoint and depot rail type and remove the subtype. */
-						CLRBIT(_m[t].m5, 2);
-						CLRBIT(_m[t].m5, 6);
+						ClrBit(_m[t].m5, 2);
+						ClrBit(_m[t].m5, 6);
 					}
 					break;
 
@@ -1623,7 +1674,7 @@
 
 				case MP_TUNNELBRIDGE:
 					/* Middle part of "old" bridges */
-					if (old_bridge && IsBridgeTile(t) && HASBIT(_m[t].m5, 6)) break;
+					if (old_bridge && IsBridgeTile(t) && HasBit(_m[t].m5, 6)) break;
 					if ((IsTunnel(t) ? GetTunnelTransportType(t) : (old_bridge ? (TransportType)GB(_m[t].m5, 1, 2) : GetBridgeTransportType(t))) == TRANSPORT_ROAD) {
 						SetRoadTypes(t, ROADTYPES_ROAD);
 					}
@@ -1640,10 +1691,10 @@
 		for (TileIndex t = 0; t < map_size; t++) {
 			if (MayHaveBridgeAbove(t)) ClearBridgeMiddle(t);
 			if (IsBridgeTile(t)) {
-				if (HASBIT(_m[t].m5, 6)) { // middle part
+				if (HasBit(_m[t].m5, 6)) { // middle part
 					Axis axis = (Axis)GB(_m[t].m5, 0, 1);
 
-					if (HASBIT(_m[t].m5, 5)) { // transport route under bridge?
+					if (HasBit(_m[t].m5, 5)) { // transport route under bridge?
 						if (GB(_m[t].m5, 3, 2) == TRANSPORT_RAIL) {
 							MakeRailNormal(
 								t,
@@ -1666,7 +1717,7 @@
 						if (GB(_m[t].m5, 3, 2) == 0) {
 							MakeClear(t, CLEAR_GRASS, 3);
 						} else {
-							MakeCanal(t, GetTileOwner(t));
+							MakeCanal(t, (GetTileOwner(t) == OWNER_WATER) ? OWNER_NONE : GetTileOwner(t));
 						}
 					}
 					SetBridgeMiddle(t, axis);
@@ -1781,7 +1832,7 @@
 			if (wp->deleted == 0) {
 				const StationSpec *statspec = NULL;
 
-				if (HASBIT(_m[wp->xy].m3, 4))
+				if (HasBit(_m[wp->xy].m3, 4))
 					statspec = GetCustomStationSpec(STAT_CLASS_WAYP, _m[wp->xy].m4 + 1);
 
 				if (statspec != NULL) {
@@ -1815,27 +1866,27 @@
 				case MP_RAILWAY:
 					if (HasSignals(t)) {
 						/* convert PBS signals to combo-signals */
-						if (HASBIT(_m[t].m2, 2)) SetSignalType(t, TRACK_X, SIGTYPE_COMBO);
+						if (HasBit(_m[t].m2, 2)) SetSignalType(t, TRACK_X, SIGTYPE_COMBO);
 
 						/* move the signal variant back */
-						SetSignalVariant(t, TRACK_X, HASBIT(_m[t].m2, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC);
-						CLRBIT(_m[t].m2, 3);
+						SetSignalVariant(t, TRACK_X, HasBit(_m[t].m2, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC);
+						ClrBit(_m[t].m2, 3);
 					}
 
 					/* Clear PBS reservation on track */
 					if (!IsTileDepotType(t, TRANSPORT_RAIL)) {
 						SB(_m[t].m4, 4, 4, 0);
 					} else {
-						CLRBIT(_m[t].m3, 6);
+						ClrBit(_m[t].m3, 6);
 					}
 					break;
 
 				case MP_ROAD: /* Clear PBS reservation on crossing */
-					if (IsLevelCrossing(t)) CLRBIT(_m[t].m5, 0);
+					if (IsLevelCrossing(t)) ClrBit(_m[t].m5, 0);
 					break;
 
 				case MP_STATION: /* Clear PBS reservation on station */
-					CLRBIT(_m[t].m3, 6);
+					ClrBit(_m[t].m3, 6);
 					break;
 
 				default: break;
@@ -1879,19 +1930,6 @@
 
 	if (!CheckSavegameVersion(27)) AfterLoadStations();
 
-	{
-		/* Set up the engine count for all players */
-		Player *players[MAX_PLAYERS];
-		const Vehicle *v;
-
-		for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) players[i] = GetPlayer(i);
-
-		FOR_ALL_VEHICLES(v) {
-			if (!IsEngineCountable(v)) continue;
-			players[v->owner]->num_engines[v->engine_type]++;
-		}
-	}
-
 	/* Time starts at 0 instead of 1920.
 	 * Account for this in older games by adding an offset */
 	if (CheckSavegameVersion(31)) {
@@ -1981,12 +2019,12 @@
 				} else {
 					/* The "lift has destination" bit has been moved from
 					 * m5[7] to m7[0]. */
-					SB(_me[t].m7, 0, 1, HASBIT(_m[t].m5, 7));
-					CLRBIT(_m[t].m5, 7);
+					SB(_me[t].m7, 0, 1, HasBit(_m[t].m5, 7));
+					ClrBit(_m[t].m5, 7);
 
 					/* The "lift is moving" bit has been removed, as it does
 					 * the same job as the "lift has destination" bit. */
-					CLRBIT(_m[t].m1, 7);
+					ClrBit(_m[t].m1, 7);
 
 					/* The position of the lift goes from m1[7..0] to m6[7..2],
 					 * making m1 totally free, now. The lift position does not
@@ -2080,9 +2118,9 @@
 			const CargoList::List *packets = v->cargo.Packets();
 			for (CargoList::List::const_iterator it = packets->begin(); it != packets->end(); it++) {
 				CargoPacket *cp = *it;
-				cp->paid_for = HASBIT(v->vehicle_flags, 2);
+				cp->paid_for = HasBit(v->vehicle_flags, 2);
 			}
-			CLRBIT(v->vehicle_flags, 2);
+			ClrBit(v->vehicle_flags, 2);
 			v->cargo.InvalidateCache();
 		}
 	}
@@ -2092,7 +2130,7 @@
 	if (CheckSavegameVersion(46)) {
 		Station *st;
 		FOR_ALL_STATIONS(st) {
-			if (st->IsBuoy() && IsTileOwner(st->xy, OWNER_NONE)) SetTileOwner(st->xy, OWNER_WATER);
+			if (st->IsBuoy() && IsTileOwner(st->xy, OWNER_NONE) && TileHeight(st->xy) == 0) SetTileOwner(st->xy, OWNER_WATER);
 		}
 	}
 
@@ -2144,7 +2182,7 @@
 
 				/* The loading finished flag is *only* set when actually completely
 				 * finished. Because the vehicle is loading, it is not finished. */
-				CLRBIT(v->vehicle_flags, VF_LOADING_FINISHED);
+				ClrBit(v->vehicle_flags, VF_LOADING_FINISHED);
 			}
 		}
 	} else if (CheckSavegameVersion(59)) {
@@ -2179,7 +2217,7 @@
 				SetSignalStates(t, GB(_m[t].m2, 4, 4));
 				SetSignalVariant(t, INVALID_TRACK, GetSignalVariant(t, TRACK_X));
 				SetSignalType(t, INVALID_TRACK, GetSignalType(t, TRACK_X));
-				CLRBIT(_m[t].m2, 7);
+				ClrBit(_m[t].m2, 7);
 			}
 		}
 	}
@@ -2189,7 +2227,7 @@
 		Vehicle *v;
 		FOR_ALL_VEHICLES(v) {
 			if (v->type == VEH_ROAD && (v->u.road.state == 250 || v->u.road.state == 251)) {
-				SETBIT(v->u.road.state, RVS_IS_STOPPING);
+				SetBit(v->u.road.state, RVS_IS_STOPPING);
 			}
 		}
 	}
@@ -2200,16 +2238,16 @@
 		FOR_ALL_INDUSTRIES(i) i->founder = OWNER_NONE;
 	}
 
-	/* Recalculate */
-	Group *g;
-	FOR_ALL_GROUPS(g) {
-		const Vehicle *v;
-		FOR_ALL_VEHICLES(v) {
-			if (!IsEngineCountable(v)) continue;
-
-			if (v->group_id != g->index || v->type != g->vehicle_type || v->owner != g->owner) continue;
-
-			g->num_engines[v->engine_type]++;
+	/* From version 82, old style canals (above sealevel (0), WATER owner) are no longer supported.
+	    Replace the owner for those by OWNER_NONE. */
+	if (CheckSavegameVersion(82)) {
+		for (TileIndex t = 0; t < map_size; t++) {
+			if (IsTileType(t, MP_WATER) &&
+					GetWaterTileType(t) == WATER_TILE_CLEAR &&
+					GetTileOwner(t) == OWNER_WATER &&
+					TileHeight(t) != 0) {
+				SetTileOwner(t, OWNER_NONE);
+			}
 		}
 	}
 
@@ -2218,7 +2256,7 @@
 		FOR_ALL_STATIONS(st) {
 			for (CargoID c = 0; c < NUM_CARGO; c++) {
 				st->goods[c].last_speed = 0;
-				if (st->goods[c].cargo.Count() != 0) SETBIT(st->goods[c].acceptance_pickup, GoodsEntry::PICKUP);
+				if (st->goods[c].cargo.Count() != 0) SetBit(st->goods[c].acceptance_pickup, GoodsEntry::PICKUP);
 			}
 		}
 	}
@@ -2237,14 +2275,20 @@
 		}
 	}
 
-	UpdateAllWaypointSigns();
-	UpdateAllStationVirtCoord();
+	/* Before version 81, the density of grass was always stored as zero, and
+	 * grassy trees were always drawn fully grassy. Furthermore, trees on rough
+	 * land used to have zero density, now they have full density. Therefore,
+	 * make all grassy/rough land trees have a density of 3. */
+	if (CheckSavegameVersion(81)) {
+		for (TileIndex t = 0; t < map_size; t++) {
+			if (GetTileType(t) == MP_TREES) {
+				TreeGround groundType = GetTreeGround(t);
+				if (groundType != TREE_GROUND_SNOW_DESERT) SetTreeGroundDensity(t, groundType, 3);
+			}
+		}
+	}
 
-	/* Setup town coords */
-	AfterLoadTown();
-	UpdateAllSignVirtCoords();
-
-	return true;
+	return InitializeWindowsAndCaches();
 }
 
 /** Reload all NewGRF files during a running game. This is a cut-down
--- a/src/openttd.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/openttd.h	Mon Dec 03 23:39:38 2007 +0000
@@ -69,7 +69,9 @@
 typedef uint16 GroupID;
 typedef uint16 EngineRenewID;
 typedef uint16 DestinationID;
-typedef int64 Money;
+
+typedef OverflowSafeInt<int64, INT64_MAX, INT64_MIN> OverflowSafeInt64;
+typedef OverflowSafeInt64 Money;
 
 /* DestinationID must be at least as large as every these below, because it can
  * be any of them
@@ -88,6 +90,7 @@
 typedef int32 Year;
 typedef int32 Date;
 
+typedef uint32 PlayerFace; ///< player face bits, info see in player_face.h
 
 enum SwitchModes {
 	SM_NONE            =  0,
@@ -184,17 +187,6 @@
 	DO_WAYPOINTS          = 6,
 };
 
-enum {
-	TO_SIGNS,
-	TO_TREES,
-	TO_HOUSES,
-	TO_INDUSTRIES,
-	TO_BUILDINGS,
-	TO_BRIDGES,
-	TO_STRUCTURES,
-	TO_LOADING,
-};
-
 /* Landscape types */
 enum {
 	LT_TEMPERATE  = 0,
@@ -250,10 +242,10 @@
 	Money ship_base;
 	Money build_trees;
 	Money terraform;
-	Money clear_1;
-	Money purchase_land;
-	Money clear_2;
-	Money clear_3;
+	Money clear_grass;
+	Money clear_roughland;
+	Money clear_rocks;
+	Money clear_fields;
 	Money remove_trees;
 	Money remove_rail;
 	Money remove_signals;
@@ -279,25 +271,27 @@
 
 #define GAME_DIFFICULTY_NUM 18
 
+/** Specific type for Game Difficulty to ease changing the type */
+typedef uint16 GDType;
 struct GameDifficulty {
-	int max_no_competitors;
-	int competitor_start_time;
-	int number_towns;
-	int number_industries;
-	int max_loan;
-	int initial_interest;
-	int vehicle_costs;
-	int competitor_speed;
-	int competitor_intelligence; // no longer in use
-	int vehicle_breakdowns;
-	int subsidy_multiplier;
-	int construction_cost;
-	int terrain_type;
-	int quantity_sea_lakes;
-	int economy;
-	int line_reverse_mode;
-	int disasters;
-	int town_council_tolerance; // minimum required town ratings to be allowed to demolish stuff
+	GDType max_no_competitors;
+	GDType competitor_start_time;
+	GDType number_towns;
+	GDType number_industries;
+	GDType max_loan;
+	GDType initial_interest;
+	GDType vehicle_costs;
+	GDType competitor_speed;
+	GDType competitor_intelligence; // no longer in use
+	GDType vehicle_breakdowns;
+	GDType subsidy_multiplier;
+	GDType construction_cost;
+	GDType terrain_type;
+	GDType quantity_sea_lakes;
+	GDType economy;
+	GDType line_reverse_mode;
+	GDType disasters;
+	GDType town_council_tolerance; // minimum required town ratings to be allowed to demolish stuff
 };
 
 enum {
@@ -587,6 +581,8 @@
 	WC_CONFIRM_POPUP_QUERY,
 	WC_TRANSPARENCY_TOOLBAR,
 	WC_VEHICLE_TIMETABLE,
+	WC_BUILD_SIGNAL,
+	WC_COMPANY_PASSWORD_WINDOW,
 };
 
 
--- a/src/order_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/order_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -507,7 +507,7 @@
 			/* NON-stop flag is misused to see if a train is in a station that is
 			 * on his order list or not */
 			if (sel_ord == u->cur_order_index && u->current_order.type == OT_LOADING &&
-					HASBIT(u->current_order.flags, OFB_NON_STOP)) {
+					HasBit(u->current_order.flags, OFB_NON_STOP)) {
 				u->current_order.flags = 0;
 			}
 
@@ -549,7 +549,7 @@
 			v->LeaveStation();
 			/* NON-stop flag is misused to see if a train is in a station that is
 			 * on his order list or not */
-			if (HASBIT(v->current_order.flags, OFB_NON_STOP)) v->current_order.flags = 0;
+			if (HasBit(v->current_order.flags, OFB_NON_STOP)) v->current_order.flags = 0;
 		}
 
 		InvalidateVehicleOrder(v);
@@ -685,18 +685,18 @@
 	if (flags & DC_EXEC) {
 		switch (p2) {
 		case OFB_FULL_LOAD:
-			TOGGLEBIT(order->flags, OFB_FULL_LOAD);
-			if (order->type != OT_GOTO_DEPOT) CLRBIT(order->flags, OFB_UNLOAD);
+			ToggleBit(order->flags, OFB_FULL_LOAD);
+			if (order->type != OT_GOTO_DEPOT) ClrBit(order->flags, OFB_UNLOAD);
 			break;
 		case OFB_UNLOAD:
-			TOGGLEBIT(order->flags, OFB_UNLOAD);
-			CLRBIT(order->flags, OFB_FULL_LOAD);
+			ToggleBit(order->flags, OFB_UNLOAD);
+			ClrBit(order->flags, OFB_FULL_LOAD);
 			break;
 		case OFB_NON_STOP:
-			TOGGLEBIT(order->flags, OFB_NON_STOP);
+			ToggleBit(order->flags, OFB_NON_STOP);
 			break;
 		case OFB_TRANSFER:
-			TOGGLEBIT(order->flags, OFB_TRANSFER);
+			ToggleBit(order->flags, OFB_TRANSFER);
 			break;
 		default: NOT_REACHED();
 		}
@@ -719,8 +719,8 @@
 				 */
 				if (sel_ord == u->cur_order_index &&
 						u->current_order.type != OT_GOTO_DEPOT &&
-						HASBIT(u->current_order.flags, OFB_FULL_LOAD) != HASBIT(order->flags, OFB_FULL_LOAD)) {
-					TOGGLEBIT(u->current_order.flags, OFB_FULL_LOAD);
+						HasBit(u->current_order.flags, OFB_FULL_LOAD) != HasBit(order->flags, OFB_FULL_LOAD)) {
+					ToggleBit(u->current_order.flags, OFB_FULL_LOAD);
 				}
 				InvalidateVehicleOrder(u);
 			}
@@ -902,7 +902,7 @@
 			InvalidateVehicleOrder(u);
 
 			/* If the vehicle already got the current depot set as current order, then update current order as well */
-			if (u->cur_order_index == order_number && HASBIT(u->current_order.flags, OFB_PART_OF_ORDERS)) {
+			if (u->cur_order_index == order_number && HasBit(u->current_order.flags, OFB_PART_OF_ORDERS)) {
 				u->current_order.refit_cargo = cargo;
 				u->current_order.refit_subtype = subtype;
 			}
@@ -984,16 +984,17 @@
 	/* If we had shared orders, recover that */
 	if (bak->clone != INVALID_VEHICLE) {
 		DoCommandP(0, v->index | (bak->clone << 16), 0, NULL, CMD_CLONE_ORDER);
-		return;
-	}
+	} else {
 
-	/* CMD_NO_TEST_IF_IN_NETWORK is used here, because CMD_INSERT_ORDER checks if the
-	 *  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 (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;
+		/* CMD_NO_TEST_IF_IN_NETWORK is used here, because CMD_INSERT_ORDER checks if the
+		 *  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 (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;
+		}
 	}
 
 	/* Restore vehicle order-index and service interval */
--- a/src/order_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/order_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -129,50 +129,50 @@
 
 	if (v->owner == _local_player) {
 		/* skip */
-		SetWindowWidgetDisabledState(w, ORDER_WIDGET_SKIP, v->num_orders <= 1);
+		w->SetWidgetDisabledState(ORDER_WIDGET_SKIP, v->num_orders <= 1);
 
 		/* delete */
-		SetWindowWidgetDisabledState(w, ORDER_WIDGET_DELETE,
+		w->SetWidgetDisabledState(ORDER_WIDGET_DELETE,
 				(uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel);
 
 		/* non-stop only for trains */
-		SetWindowWidgetDisabledState(w, ORDER_WIDGET_NON_STOP,  v->type != VEH_TRAIN || order == NULL);
-		SetWindowWidgetDisabledState(w, ORDER_WIDGET_FULL_LOAD, order == NULL); // full load
-		SetWindowWidgetDisabledState(w, ORDER_WIDGET_UNLOAD,    order == NULL); // unload
-		SetWindowWidgetDisabledState(w, ORDER_WIDGET_TRANSFER,  order == NULL); // transfer
+		w->SetWidgetDisabledState(ORDER_WIDGET_NON_STOP,  v->type != VEH_TRAIN || order == NULL);
+		w->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, order == NULL); // full load
+		w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD,    order == NULL); // unload
+		w->SetWidgetDisabledState(ORDER_WIDGET_TRANSFER,  order == NULL); // transfer
 		/* Disable list of vehicles with the same shared orders if there is no list */
-		SetWindowWidgetDisabledState(w, ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
-		SetWindowWidgetDisabledState(w, ORDER_WIDGET_REFIT,     order == NULL); // Refit
-		HideWindowWidget(w, ORDER_WIDGET_REFIT); // Refit
+		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
+		w->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
+		w->HideWidget(ORDER_WIDGET_REFIT); // Refit
 	} else {
-		DisableWindowWidget(w, ORDER_WIDGET_TRANSFER);
+		w->DisableWidget(ORDER_WIDGET_TRANSFER);
 	}
 
-	ShowWindowWidget(w, ORDER_WIDGET_UNLOAD); // Unload
+	w->ShowWidget(ORDER_WIDGET_UNLOAD); // Unload
 
 	if (order != NULL) {
 		switch (order->type) {
 			case OT_GOTO_STATION: break;
 
 			case OT_GOTO_DEPOT:
-				DisableWindowWidget(w, ORDER_WIDGET_TRANSFER);
+				w->DisableWidget(ORDER_WIDGET_TRANSFER);
 
 				/* Remove unload and replace it with refit */
-				HideWindowWidget(w, ORDER_WIDGET_UNLOAD);
-				ShowWindowWidget(w, ORDER_WIDGET_REFIT);
+				w->HideWidget(ORDER_WIDGET_UNLOAD);
+				w->ShowWidget(ORDER_WIDGET_REFIT);
 				SetDParam(2,STR_SERVICE);
 				break;
 
 			case OT_GOTO_WAYPOINT:
-				DisableWindowWidget(w, ORDER_WIDGET_FULL_LOAD);
-				DisableWindowWidget(w, ORDER_WIDGET_UNLOAD);
-				DisableWindowWidget(w, ORDER_WIDGET_TRANSFER);
+				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
+				w->DisableWidget(ORDER_WIDGET_UNLOAD);
+				w->DisableWidget(ORDER_WIDGET_TRANSFER);
 				break;
 
 			default: // every other orders
-				DisableWindowWidget(w, ORDER_WIDGET_NON_STOP);
-				DisableWindowWidget(w, ORDER_WIDGET_FULL_LOAD);
-				DisableWindowWidget(w, ORDER_WIDGET_UNLOAD);
+				w->DisableWidget(ORDER_WIDGET_NON_STOP);
+				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
+				w->DisableWidget(ORDER_WIDGET_UNLOAD);
 		}
 	}
 
@@ -238,9 +238,8 @@
 				default: break;
 			}
 
-			const byte colour = (i == WP(w,order_d).sel) ? 0xC : 0x10;
 			SetDParam(0, i + 1);
-			DrawString(2, y, str, colour);
+			DrawString(2, y, str, (i == WP(w,order_d).sel) ? TC_WHITE : TC_BLACK);
 
 			y += 10;
 		}
@@ -251,8 +250,7 @@
 
 	if (i - w->vscroll.pos < w->vscroll.cap) {
 		str = shared_orders ? STR_END_OF_SHARED_ORDERS : STR_882A_END_OF_ORDERS;
-		const byte colour = (i == WP(w,order_d).sel) ? 0xC : 0x10;
-		DrawString(2, y, str, colour);
+		DrawString(2, y, str, (i == WP(w,order_d).sel) ? TC_WHITE : TC_BLACK);
 	}
 }
 
@@ -400,10 +398,10 @@
 static void OrderClick_Goto(Window *w, const Vehicle *v)
 {
 	InvalidateWidget(w, ORDER_WIDGET_GOTO);
-	ToggleWidgetLoweredState(w, ORDER_WIDGET_GOTO);
-	if (IsWindowWidgetLowered(w, ORDER_WIDGET_GOTO)) {
+	w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
+	if (w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
 		_place_clicked_vehicle = NULL;
-		SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, 1, w);
+		SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, VHM_RECT, w);
 	} else {
 		ResetObjectToPlace();
 	}
@@ -545,7 +543,7 @@
 			if (_patches.timetabling) {
 				w->widget[ORDER_WIDGET_CAPTION].right -= 61;
 			} else {
-				HideWindowWidget(w, ORDER_WIDGET_TIMETABLE_VIEW);
+				w->HideWidget(ORDER_WIDGET_TIMETABLE_VIEW);
 			}
 
 			break;
@@ -593,7 +591,7 @@
 
 					if (v->owner == _local_player) {
 						/* Activate drag and drop */
-						SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, 4, w);
+						SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, VHM_DRAG, w);
 					}
 				}
 			}
@@ -677,7 +675,7 @@
 			if (e->we.keypress.keycode == _order_keycodes[i]) {
 				e->we.keypress.cont = false;
 				//see if the button is disabled
-				if (!IsWindowWidgetDisabled(w, i + ORDER_WIDGET_SKIP)) _order_button_proc[i](w, v);
+				if (!w->IsWidgetDisabled(i + ORDER_WIDGET_SKIP)) _order_button_proc[i](w, v);
 				break;
 			}
 		}
@@ -701,7 +699,7 @@
 	} break;
 
 	case WE_ABORT_PLACE_OBJ: {
-		RaiseWindowWidget(w, ORDER_WIDGET_GOTO);
+		w->RaiseWidget(ORDER_WIDGET_GOTO);
 		InvalidateWidget( w, ORDER_WIDGET_GOTO);
 	} break;
 
@@ -716,7 +714,7 @@
 		 * the order is copied to the last open window instead of the
 		 * one where GOTO is enabled
 		 */
-		if (v != NULL && IsWindowWidgetLowered(w, ORDER_WIDGET_GOTO)) {
+		if (v != NULL && w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
 			_place_clicked_vehicle = NULL;
 			HandleOrderVehClick(GetVehicle(w->window_number), v, w);
 		}
@@ -731,8 +729,8 @@
 		// unclick all buttons except for the 'goto' button (ORDER_WIDGET_GOTO), which is 'persistent'
 		uint i;
 		for (i = 0; i < w->widget_count; i++) {
-			if (IsWindowWidgetLowered(w, i) && i != ORDER_WIDGET_GOTO) {
-				RaiseWindowWidget(w, i);
+			if (w->IsWidgetLowered(i) && i != ORDER_WIDGET_GOTO) {
+				w->RaiseWidget(i);
 				InvalidateWidget(w, i);
 			}
 		}
--- a/src/os/macosx/macos.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/os/macosx/macos.h	Mon Dec 03 23:39:38 2007 +0000
@@ -27,4 +27,44 @@
 		(__builtin_expect(!(e), 0) ? ShowMacAssertDialog ( __func__, __FILE__, __LINE__, #e ): (void)0 )
 #endif
 
+
+
+/**
+ * Get the major version of Mac OS we are running under. Useful for things like the cocoa driver.
+ * @return major version of the os. This would be 10 in the case of 10.4.11.
+ */
+long GetMacOSVersionMajor();
+
+/**
+ * Get the minor version of Mac OS we are running under. Useful for things like the cocoa driver.
+ * @return minor version of the os. This would be 4 in the case of 10.4.11.
+ */
+long GetMacOSVersionMinor();
+
+/**
+ * Get the bugfix version of Mac OS we are running under. Useful for things like the cocoa driver.
+ * @return bugfix version of the os. This would be 11 in the case of 10.4.11.
+ */
+long GetMacOSVersionBugfix();
+
+/**
+ * Check if we are at least running on the specified version of Mac OS.
+ * @param major major version of the os. This would be 10 in the case of 10.4.11.
+ * @param minor minor version of the os. This would be 4 in the case of 10.4.11.
+ * @param bugfix bugfix version of the os. This would be 11 in the case of 10.4.11.
+ * @return true if the running os is at least what we asked, false otherwise.
+ */
+static inline bool MacOSVersionIsAtLeast(long major, long minor, long bugfix)
+{
+	long maj = GetMacOSVersionMajor();
+	long min = GetMacOSVersionMinor();
+	long bf = GetMacOSVersionBugfix();
+
+	if (maj < major) return false;
+	if (maj == major && min < minor) return false;
+	if (maj == major && min == minor && bf < bugfix) return false;
+
+	return true;
+}
+
 #endif /* MACOS_H */
--- a/src/os/macosx/macos.mm	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/os/macosx/macos.mm	Mon Dec 03 23:39:38 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+#include <AvailabilityMacros.h>
+
 #include <AppKit/AppKit.h>
 
 #include <mach/mach.h>
@@ -168,6 +170,90 @@
 	NSArray* languages = [defs objectForKey:@"AppleLanguages"];
 	NSString* preferredLang = [languages objectAtIndex:0];
 	/* preferredLang is either 2 or 5 characters long ("xx" or "xx_YY"). */
-	strncpy(retbuf, [preferredLang cString], 31);
+
+	/* MacOS 10.3.9 can't handle encoding:NSASCIIStringEncoding
+	 * we will completely disable compiling it for such old targets to avoid a warning */
+#if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_3)
+	/* Note: MAC_OS_X_VERSION_MAX_ALLOWED is the current OSX version/SDK by default */
+	if (MacOSVersionIsAtLeast(10, 4, 0)) {
+		[ preferredLang getCString:retbuf maxLength:32 encoding:NSASCIIStringEncoding ];
+	} else {
+#else
+	/* 10.3.9 needs to start the { too */
+	{
+#endif
+		[ preferredLang getCString:retbuf maxLength:32 ];
+	}
 	return retbuf;
 }
+
+
+/*
+ * This will only give an accurate result for versions before OS X 10.8 since it uses bcd encoding
+ * for the minor and bugfix version numbers and a scheme of representing all numbers from 9 and up
+ * with 9. This means we can't tell OS X 10.9 from 10.9 or 10.11. Please use GetMacOSVersionMajor()
+ * and GetMacOSVersionMinor() instead.
+ */
+static long GetMacOSVersion()
+{
+	static long sysVersion = -1;
+
+	if (sysVersion != -1) return sysVersion;
+
+	if (Gestalt(gestaltSystemVersion, &sysVersion) != noErr) sysVersion = -1;
+	 return sysVersion;
+}
+
+long GetMacOSVersionMajor()
+{
+	static long sysVersion = -1;
+
+	if (sysVersion != -1) return sysVersion;
+
+	sysVersion = GetMacOSVersion();
+	if (sysVersion == -1) return -1;
+
+	if (sysVersion >= 0x1040) {
+		if (Gestalt(gestaltSystemVersionMajor, &sysVersion) != noErr) sysVersion = -1;
+	} else {
+		sysVersion = GB(sysVersion, 12, 4) * 10 + GB(sysVersion,  8, 4);
+	}
+
+	return sysVersion;
+}
+
+long GetMacOSVersionMinor()
+{
+	static long sysVersion = -1;
+
+	if (sysVersion != -1) return sysVersion;
+
+	sysVersion = GetMacOSVersion();
+	if (sysVersion == -1) return -1;
+
+	if (sysVersion >= 0x1040) {
+		if (Gestalt(gestaltSystemVersionMinor, &sysVersion) != noErr) sysVersion = -1;
+	} else {
+		sysVersion = GB(sysVersion,  4, 4);
+	}
+
+	return sysVersion;
+}
+
+long GetMacOSVersionBugfix()
+{
+	static long sysVersion = -1;
+
+	if (sysVersion != -1) return sysVersion;
+
+	sysVersion = GetMacOSVersion();
+	if (sysVersion == -1) return -1;
+
+	if (sysVersion >= 0x1040) {
+		if (Gestalt(gestaltSystemVersionBugFix, &sysVersion) != noErr) sysVersion = -1;
+	} else {
+		sysVersion = GB(sysVersion,  0, 4);
+	}
+
+	return sysVersion;
+}
--- a/src/os/macosx/splash.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/os/macosx/splash.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -8,6 +8,7 @@
 #include "../../functions.h"
 #include "../../gfx.h"
 #include "../../fileio.h"
+#include "../../blitter/factory.hpp"
 
 #include "splash.h"
 
@@ -36,7 +37,7 @@
 	png_colorp palette;
 	int num_palette;
 	png_bytep *row_pointers;
-	uint8 *src, *dst;
+	uint8 *src;
 	uint y;
 	uint xoff, yoff;
 	int i;
@@ -103,32 +104,55 @@
 
 	row_pointers = png_get_rows(png_ptr, info_ptr);
 
-	memset(_screen.dst_ptr, 0xff, _screen.pitch * _screen.height);
-
 	if (width > (uint) _screen.width) width = _screen.width;
 	if (height > (uint) _screen.height) height = _screen.height;
 
 	xoff = (_screen.width - width) / 2;
 	yoff = (_screen.height - height) / 2;
-	for (y = 0; y < height; y++) {
-		src = row_pointers[y];
-		dst = ((uint8 *) _screen.dst_ptr) + (yoff + y) * _screen.pitch + xoff;
-
-		memcpy(dst, src, width);
-	}
 
-	for (i = 0; i < num_palette; i++) {
-		_cur_palette[i].r = palette[i].red;
-		_cur_palette[i].g = palette[i].green;
-		_cur_palette[i].b = palette[i].blue;
-	}
+	switch (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth()) {
+		case 8: {
+				uint8 *dst;
 
-	_cur_palette[0xff].r = 0;
-	_cur_palette[0xff].g = 0;
-	_cur_palette[0xff].b = 0;
+				memset(_screen.dst_ptr, 0xff, _screen.pitch * _screen.height);
 
-	_pal_first_dirty = 0;
-	_pal_count_dirty = 256;
+				for (y = 0; y < height; y++) {
+					src = row_pointers[y];
+					dst = ((uint8 *) _screen.dst_ptr) + (yoff + y) * _screen.pitch + xoff;
+
+					memcpy(dst, src, width);
+				}
+
+				for (i = 0; i < num_palette; i++) {
+					_cur_palette[i].r = palette[i].red;
+					_cur_palette[i].g = palette[i].green;
+					_cur_palette[i].b = palette[i].blue;
+				}
+
+				_cur_palette[0xff].r = 0;
+				_cur_palette[0xff].g = 0;
+				_cur_palette[0xff].b = 0;
+
+				_pal_first_dirty = 0;
+				_pal_count_dirty = 256;
+			}
+			break;
+		case 32: {
+				uint32 *dst;
+				uint x;
+
+				memset(_screen.dst_ptr, 0xff000000, _screen.pitch * _screen.height * 4);
+
+				for (y = 0; y < height; y++) {
+					src = row_pointers[y];
+					dst = ((uint32 *) _screen.dst_ptr) + (yoff + y) * _screen.pitch + xoff;
+
+					for (x = 0; x < width; x++)
+						dst[x] = palette[src[x]].blue | (palette[src[x]].green << 8) | (palette[src[x]].red << 16) | 0xff000000;
+				}
+			}
+			break;
+	}
 
 	png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
 	fclose(f);
--- a/src/os2.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/os2.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -163,7 +163,7 @@
 
 int CDECL main(int argc, char* argv[])
 {
-	_random_seeds[1][1] = _random_seeds[1][0] = _random_seeds[0][1] = _random_seeds[0][0] = time(NULL);
+	SetRandomSeed(time(NULL));
 
 	return ttd_main(argc, argv);
 }
--- a/src/ottdres.rc.in	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/ottdres.rc.in	Mon Dec 03 23:39:38 2007 +0000
@@ -1,4 +1,5 @@
 //Microsoft Developer Studio generated resource script.
+// $Id$
 //
 #define APSTUDIO_READONLY_SYMBOLS
 /////////////////////////////////////////////////////////////////////////////
@@ -65,8 +66,8 @@
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,5,99,0
- PRODUCTVERSION 0,5,99,0
+ FILEVERSION 0,6,0,@@REVISION@@
+ PRODUCTVERSION 0,6,0,@@REVISION@@
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
--- a/src/pathfind.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/pathfind.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -140,7 +140,6 @@
 static void TPFMode2(TrackPathFinder* tpf, TileIndex tile, DiagDirection direction)
 {
 	uint bits;
-	int i;
 	RememberData rd;
 
 	assert(tpf->tracktype == TRANSPORT_WATER);
@@ -160,19 +159,16 @@
 
 	assert(TileX(tile) != MapMaxX() && TileY(tile) != MapMaxY());
 
-	if ( (bits & (bits - 1)) == 0 ) {
-		/* only one direction */
-		i = 0;
-		while (!(bits & 1))
-			i++, bits >>= 1;
-
+	uint i = 0;
+	/* only one direction */
+	if (KillFirstBit(bits) == 0) {
+		i = FindFirstBit(bits);
 		rd = tpf->rd;
 		goto continue_here;
 	}
 	/* several directions */
-	i=0;
 	do {
-		if (!(bits & 1)) continue;
+		i = FindFirstBit(bits);
 		rd = tpf->rd;
 
 		/* Change direction 4 times only */
@@ -184,15 +180,15 @@
 			tpf->rd.pft_var6 = (byte)i;
 		}
 
-continue_here:;
-		tpf->the_dir = (Trackdir)(i + (HASBIT(_otherdir_mask[direction], i) ? 8 : 0));
+continue_here:
+		tpf->the_dir = (Trackdir)(i + (HasBit(_otherdir_mask[direction], i) ? 8 : 0));
 
 		if (!tpf->enum_proc(tile, tpf->userdata, tpf->the_dir, tpf->rd.cur_length, NULL)) {
 			TPFMode2(tpf, tile, _tpf_new_direction[tpf->the_dir]);
 		}
 
 		tpf->rd = rd;
-	} while (++i, bits >>= 1);
+	} while (ClrBit(bits, i) != 0);
 
 }
 
@@ -234,26 +230,6 @@
 	return flotr.tile;
 }
 
-const byte _ffb_64[128] = {
- 0,  0,  1,  0,  2,  0,  1,  0,
- 3,  0,  1,  0,  2,  0,  1,  0,
- 4,  0,  1,  0,  2,  0,  1,  0,
- 3,  0,  1,  0,  2,  0,  1,  0,
- 5,  0,  1,  0,  2,  0,  1,  0,
- 3,  0,  1,  0,  2,  0,  1,  0,
- 4,  0,  1,  0,  2,  0,  1,  0,
- 3,  0,  1,  0,  2,  0,  1,  0,
-
- 0,  0,  0,  2,  0,  4,  4,  6,
- 0,  8,  8, 10,  8, 12, 12, 14,
- 0, 16, 16, 18, 16, 20, 20, 22,
-16, 24, 24, 26, 24, 28, 28, 30,
- 0, 32, 32, 34, 32, 36, 36, 38,
-32, 40, 40, 42, 40, 44, 44, 46,
-32, 48, 48, 50, 48, 52, 52, 54,
-48, 56, 56, 58, 56, 60, 60, 62,
-};
-
 static void TPFMode1(TrackPathFinder* tpf, TileIndex tile, DiagDirection direction);
 
 /** Most code of the "Normal" case of TPF Mode 1; for signals special tricks
@@ -302,15 +278,15 @@
 
 	if ((byte)bits != tpf->var2) {
 		bits &= _tpfmode1_and[direction];
-		bits = bits | (bits >> 8);
+		bits |= bits >> 8;
 	}
 	bits &= 0xBF;
 
 	if (bits != 0) {
-		if (!tpf->disable_tile_hash || (tpf->rd.cur_length <= 64 && (KILL_FIRST_BIT(bits) == 0 || ++tpf->rd.depth <= 7))) {
+		if (!tpf->disable_tile_hash || (tpf->rd.cur_length <= 64 && (KillFirstBit(bits) == 0 || ++tpf->rd.depth <= 7))) {
 			do {
 				int i = FIND_FIRST_BIT(bits);
-				bits = KILL_FIRST_BIT(bits);
+				bits = KillFirstBit(bits);
 
 				tpf->the_dir = (Trackdir)((_otherdir_mask[direction] & (byte)(1 << i)) ? (i + 8) : i);
 				RememberData rd = tpf->rd;
@@ -391,7 +367,7 @@
 
 	do {
 		uint i = FIND_FIRST_BIT(bits);
-		bits = KILL_FIRST_BIT(bits);
+		bits = KillFirstBit(bits);
 
 		tpf->the_dir = (Trackdir)((_otherdir_mask[direction] & (byte)(1 << i)) ? (i + 8) : i);
 		RememberData rd = tpf->rd;
@@ -419,16 +395,16 @@
 	tpf.rd.depth = 0;
 	tpf.rd.pft_var6 = 0;
 
-	tpf.var2 = HASBIT(flags, 15) ? 0x43 : 0xFF; // 0x8000
+	tpf.var2 = HasBit(flags, 15) ? 0x43 : 0xFF; // 0x8000
 
-	tpf.disable_tile_hash = HASBIT(flags, 12);  // 0x1000
-	tpf.hasbit_13         = HASBIT(flags, 13);  // 0x2000
+	tpf.disable_tile_hash = HasBit(flags, 12);  // 0x1000
+	tpf.hasbit_13         = HasBit(flags, 13);  // 0x2000
 
 
 	tpf.tracktype = (TransportType)(flags & 0xFF);
 	tpf.sub_type = sub_type;
 
-	if (HASBIT(flags, 11)) {
+	if (HasBit(flags, 11)) {
 		tpf.rd.pft_var6 = 0xFF;
 		tpf.enum_proc(tile, data, INVALID_TRACKDIR, 0, 0);
 		TPFMode2(&tpf, tile, direction);
@@ -676,8 +652,8 @@
 
 static uint DistanceMoo(TileIndex t0, TileIndex t1)
 {
-	const uint dx = delta(TileX(t0), TileX(t1));
-	const uint dy = delta(TileY(t0), TileY(t1));
+	const uint dx = Delta(TileX(t0), TileX(t1));
+	const uint dy = Delta(TileY(t0), TileY(t1));
 
 	const uint straightTracks = 2 * min(dx, dy); // The number of straight (not full length) tracks
 	/* OPTIMISATION:
@@ -755,7 +731,7 @@
 						/* We are not driving into the tunnel, or it is an invalid tunnel */
 						continue;
 					}
-					if (!HASBIT(tpf->railtypes, GetRailType(tile))) {
+					if (!HasBit(tpf->railtypes, GetRailType(tile))) {
 						bits = TRACK_BIT_NONE;
 						break;
 					}
@@ -803,9 +779,9 @@
 				bits = TrackdirBitsToTrackBits((TrackdirBits)(ts & TRACKDIR_BIT_MASK));
 
 				/* Check that the tile contains exactly one track */
-				if (bits == 0 || KILL_FIRST_BIT(bits) != 0) break;
+				if (bits == 0 || KillFirstBit(bits) != 0) break;
 
-				if (!HASBIT(tpf->railtypes, GetRailType(tile))) {
+				if (!HasBit(tpf->railtypes, GetRailType(tile))) {
 					bits = TRACK_BIT_NONE;
 					break;
 				}
@@ -831,7 +807,7 @@
 			 * bits, not just reachable ones, to prevent infinite loops. */
 			if (bits == TRACK_BIT_NONE || TracksOverlap(allbits)) break;
 
-			if (!HASBIT(tpf->railtypes, GetRailType(tile))) {
+			if (!HasBit(tpf->railtypes, GetRailType(tile))) {
 				bits = TRACK_BIT_NONE;
 				break;
 			}
--- a/src/player.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/player.h	Mon Dec 03 23:39:38 2007 +0000
@@ -8,8 +8,11 @@
 #include "oldpool.h"
 #include "aystar.h"
 #include "rail.h"
+#include "road.h"
 #include "engine.h"
 #include "livery.h"
+#include "genworld.h"
+#include "gfx.h"
 
 struct PlayerEconomyEntry {
 	Money income;
@@ -155,8 +158,6 @@
 	LOAN_INTERVAL_OLD_AI = 50000,
 };
 
-typedef uint32 PlayerFace;
-
 struct Player {
 	uint32 name_2;
 	uint16 name_1;
@@ -238,7 +239,7 @@
 
 static inline Player *GetPlayer(PlayerID i)
 {
-	assert(IS_INSIDE_1D(i, PLAYER_FIRST, lengthof(_players)));
+	assert(IsInsideBS(i, PLAYER_FIRST, lengthof(_players)));
 	return &_players[i];
 }
 
@@ -249,16 +250,38 @@
 
 static inline bool IsValidPlayer(PlayerID pi)
 {
-	return IS_INSIDE_1D(pi, PLAYER_FIRST, MAX_PLAYERS);
+	return IsInsideBS(pi, PLAYER_FIRST, MAX_PLAYERS);
 }
 
 byte GetPlayerRailtypes(PlayerID p);
 byte GetPlayerRoadtypes(PlayerID p);
 
-/** Finds out if a Player has a certain railtype available */
-static inline bool HasRailtypeAvail(const Player *p, RailType Railtype)
+/** Finds out if a Player has a certain railtype available
+ * @param p Player in question
+ * @param Railtype requested RailType
+ * @return true if player has requested RailType available
+ */
+static inline bool HasRailtypeAvail(const Player *p, const RailType Railtype)
 {
-	return HASBIT(p->avail_railtypes, Railtype);
+	return HasBit(p->avail_railtypes, Railtype);
+}
+
+/** Finds out, whether given player has all given RoadTypes available
+ * @param PlayerID ID of player
+ * @param rts RoadTypes to test
+ * @return true if player has all requested RoadTypes available
+ */
+static inline bool HasRoadTypesAvail(const PlayerID p, const RoadTypes rts)
+{
+	RoadTypes avail_roadtypes;
+
+	if (p == OWNER_TOWN || _game_mode == GM_EDITOR || IsGeneratingWorld()) {
+		avail_roadtypes = ROADTYPES_ROAD;
+	} else {
+		if (!IsValidPlayer(p)) return false;
+		avail_roadtypes = (RoadTypes)GetPlayer(p)->avail_roadtypes | ROADTYPES_ROAD; // road is available for always for everybody
+	}
+	return (rts & ~avail_roadtypes) == 0;
 }
 
 static inline bool IsHumanPlayer(PlayerID pi)
@@ -274,7 +297,10 @@
 void DrawPlayerIcon(PlayerID p, int x, int y);
 
 /* Validate functions for rail building */
-static inline bool ValParamRailtype(uint32 rail) { return HASBIT(GetPlayer(_current_player)->avail_railtypes, rail);}
+static inline bool ValParamRailtype(const uint32 rail) { return HasBit(GetPlayer(_current_player)->avail_railtypes, rail);}
+
+/* Validate functions for road building */
+static inline bool ValParamRoadType(const RoadType rt) { return HasRoadTypesAvail(_current_player, RoadTypeToRoadTypes(rt));}
 
 /** Returns the "best" railtype a player can build.
  * As the AI doesn't know what the BEST one is, we have our own priority list
--- a/src/player_face.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/player_face.h	Mon Dec 03 23:39:38 2007 +0000
@@ -59,7 +59,7 @@
 	/* PFV_HAS_MOUSTACHE   */ {  3, 1, {  2,  0,  2,  0 }, {     0,     0,     0,     0 } }, ///< Females do not have a moustache
 	/* PFV_HAS_TIE_EARRING */ {  3, 1, {  0,  2,  0,  2 }, {     0,     0,     0,     0 } }, ///< Draw the earring for females or not. For males the tie is always drawn.
 	/* PFV_HAS_GLASSES     */ {  4, 1, {  2,  2,  2,  2 }, {     0,     0,     0,     0 } }, ///< Whether to draw glasses or not
-	/* PFV_EYE_COLOUR      */ {  5, 2, {  3,  3,  3,  3 }, {     0,     0,     0,     0 } }, ///< Palette modification
+	/* PFV_EYE_COLOUR      */ {  5, 2, {  3,  3,  1,  1 }, {     0,     0,     0,     0 } }, ///< Palette modification
 	/* PFV_CHEEKS          */ {  0, 0, {  1,  1,  1,  1 }, { 0x325, 0x326, 0x390, 0x3B0 } }, ///< Cheeks are only indexed by their gender/ethnicity
 	/* PFV_CHIN            */ {  7, 2, {  4,  1,  2,  2 }, { 0x327, 0x327, 0x391, 0x3B1 } },
 	/* PFV_EYEBROWS        */ {  9, 4, { 12, 16, 11, 16 }, { 0x32B, 0x337, 0x39A, 0x3B8 } },
@@ -105,6 +105,32 @@
 }
 
 /**
+ * Increase/Decrease the player face variable by the given amount.
+ * If the new value greater than the max value for this variable it will be set to 0.
+ * Or is it negativ (< 0) it will be set to max value.
+ *
+ * @param pf     the player face to write the bits to
+ * @param pfv    the player face variable to write the data of
+ * @param ge     the gender and ethnicity of the player face
+ * @param amount the amount which change the value
+ *
+ * @pre 0 <= val < _pf_info[pfv].valid_values[ge]
+ */
+static inline void IncreasePlayerFaceBits(PlayerFace &pf, PlayerFaceVariable pfv, GenderEthnicity ge, int8 amount)
+{
+	int8 val = GetPlayerFaceBits(pf, pfv, ge) + amount; // the new value for the pfv
+
+	/* scales the new value to the correct scope */
+	if (val >= _pf_info[pfv].valid_values[ge]) {
+		val = 0;
+	} else if (val < 0) {
+		val = _pf_info[pfv].valid_values[ge] - 1;
+	}
+
+	SetPlayerFaceBits(pf, pfv, ge, val); // save the new value
+}
+
+/**
  * Checks whether the player bits have a valid range
  * @param pf  the face to extract the bits from
  * @param pfv the face variable to get the data of
@@ -132,6 +158,58 @@
 }
 
 /**
+ * Scales all player face bits to the correct scope
+ *
+ * @param pf the player face to write the bits to
+ */
+static inline void ScaleAllPlayerFaceBits(PlayerFace &pf)
+{
+	IncreasePlayerFaceBits(pf, PFV_ETHNICITY, GE_WM, 0); // scales the ethnicity
+
+	GenderEthnicity ge = (GenderEthnicity)GB(pf, _pf_info[PFV_GEN_ETHN].offset, _pf_info[PFV_GEN_ETHN].length); // gender & ethnicity of the face
+
+	/* Is a male face with moustache. Need to reduce CPU load in the loop. */
+	bool is_moust_male = !HasBit(ge, GENDER_FEMALE) && GetPlayerFaceBits(pf, PFV_HAS_MOUSTACHE, ge) != 0;
+
+	for (PlayerFaceVariable pfv = PFV_EYE_COLOUR; pfv < PFV_END; pfv++) { // scales all other variables
+
+		/* The moustache variable will be scaled only if it is a male face with has a moustache */
+		if (pfv != PFV_MOUSTACHE || is_moust_male) {
+			IncreasePlayerFaceBits(pf, pfv, ge, 0);
+		}
+	}
+}
+
+/**
+ * Make a random new face.
+ * If it is for the advanced player face window then the new face have the same gender
+ * and ethnicity as the old one, else the gender is equal and the ethnicity is random.
+ *
+ * @param pf  the player face to write the bits to
+ * @param ge  the gender and ethnicity of the old player face
+ * @param adv if it for the advanced player face window
+ *
+ * @pre scale 'ge' to a valid gender/ethnicity combination
+ */
+static inline void RandomPlayerFaceBits(PlayerFace &pf, GenderEthnicity ge, bool adv)
+{
+	pf = InteractiveRandom(); // random all player face bits
+
+	/* scale ge: 0 == GE_WM, 1 == GE_WF, 2 == GE_BM, 3 == GE_BF (and maybe in future: ...) */
+	ge = (GenderEthnicity)((uint)ge % GE_END);
+
+	/* set the gender (and ethnicity) for the new player face */
+	if (adv) {
+		SetPlayerFaceBits(pf, PFV_GEN_ETHN, ge, ge);
+	} else {
+		SetPlayerFaceBits(pf, PFV_GENDER, ge, HasBit(ge, GENDER_FEMALE));
+	}
+
+	/* scales all player face bits to the correct scope */
+	ScaleAllPlayerFaceBits(pf);
+}
+
+/**
  * Gets the sprite to draw for the given player face variable
  * @param pf  the face to extract the data from
  * @param pfv the face variable to get the sprite of
@@ -149,5 +227,6 @@
 void DrawPlayerFace(PlayerFace face, int color, int x, int y);
 PlayerFace ConvertFromOldPlayerFace(uint32 face);
 bool IsValidPlayerFace(PlayerFace pf);
+void DrawFaceStringLabel(const Window *w, byte widget_index, StringID str, uint8 val, bool is_bool_widget);
 
 #endif /* PLAYER_FACE_H */
--- a/src/player_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/player_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -25,9 +25,11 @@
 #include "newgrf.h"
 #include "network/network_data.h"
 #include "network/network_client.h"
+#include "network/network_gui.h"
 #include "player_face.h"
 
 static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied);
+static void DoSelectPlayerFace(PlayerID player, bool show_big);
 
 static void DrawPlayerEconomyStats(const Player *p, byte mode)
 {
@@ -38,10 +40,10 @@
 
 	if (!(mode & 1)) { // normal sized economics window (mode&1) is minimized status
 		/* draw categories */
-		DrawStringCenterUnderline(61, 15, STR_700F_EXPENDITURE_INCOME, 0);
+		DrawStringCenterUnderline(61, 15, STR_700F_EXPENDITURE_INCOME, TC_FROMSTRING);
 		for (i = 0; i != 13; i++)
-			DrawString(2, 27 + i * 10, STR_7011_CONSTRUCTION + i, 0);
-		DrawStringRightAligned(111, 27 + 10 * 13 + 2, STR_7020_TOTAL, 0);
+			DrawString(2, 27 + i * 10, STR_7011_CONSTRUCTION + i, TC_FROMSTRING);
+		DrawStringRightAligned(111, 27 + 10 * 13 + 2, STR_7020_TOTAL, TC_FROMSTRING);
 
 		/* draw the price columns */
 		year = _cur_year - 2;
@@ -51,7 +53,7 @@
 		do {
 			if (year >= p->inaugurated_year) {
 				SetDParam(0, year);
-				DrawStringRightAlignedUnderline(x, 15, STR_7010, 0);
+				DrawStringRightAlignedUnderline(x, 15, STR_7010, TC_FROMSTRING);
 				sum = 0;
 				for (i = 0; i != 13; i++) {
 					/* draw one row in the price column */
@@ -62,14 +64,14 @@
 						str = STR_701E;
 						if (cost < 0) { cost = -cost; str++; }
 						SetDParam(0, cost);
-						DrawStringRightAligned(x, 27 + i * 10, str, 0);
+						DrawStringRightAligned(x, 27 + i * 10, str, TC_FROMSTRING);
 					}
 				}
 
 				str = STR_701E;
 				if (sum < 0) { sum = -sum; str++; }
 				SetDParam(0, sum);
-				DrawStringRightAligned(x, 27 + 13 * 10 + 2, str, 0);
+				DrawStringRightAligned(x, 27 + 13 * 10 + 2, str, TC_FROMSTRING);
 
 				GfxFillRect(x - 75, 27 + 10 * 13, x, 27 + 10 * 13, 215);
 				x += 95;
@@ -82,27 +84,27 @@
 
 		/* draw max loan aligned to loan below (y += 10) */
 		SetDParam(0, _economy.max_loan);
-		DrawString(202, y + 10, STR_MAX_LOAN, 0);
+		DrawString(202, y + 10, STR_MAX_LOAN, TC_FROMSTRING);
 	} else {
 		y = 15;
 	}
 
-	DrawString(2, y, STR_7026_BANK_BALANCE, 0);
+	DrawString(2, y, STR_7026_BANK_BALANCE, TC_FROMSTRING);
 	SetDParam(0, p->player_money);
-	DrawStringRightAligned(182, y, STR_7028, 0);
+	DrawStringRightAligned(182, y, STR_7028, TC_FROMSTRING);
 
 	y += 10;
 
-	DrawString(2, y, STR_7027_LOAN, 0);
+	DrawString(2, y, STR_7027_LOAN, TC_FROMSTRING);
 	SetDParam(0, p->current_loan);
-	DrawStringRightAligned(182, y, STR_7028, 0);
+	DrawStringRightAligned(182, y, STR_7028, TC_FROMSTRING);
 
 	y += 12;
 
 	GfxFillRect(182 - 75, y - 2, 182, y - 2, 215);
 
 	SetDParam(0, p->player_money - p->current_loan);
-	DrawStringRightAligned(182, y, STR_7028, 0);
+	DrawStringRightAligned(182, y, STR_7028, TC_FROMSTRING);
 }
 
 static const Widget _player_finances_widgets[] = {
@@ -145,15 +147,15 @@
 			w->height = new_height;
 			SetWindowDirty(w);
 
-			SetWindowWidgetHiddenState(w, 6, player != _local_player);
-			SetWindowWidgetHiddenState(w, 7, player != _local_player);
+			w->SetWidgetHiddenState(6, player != _local_player);
+			w->SetWidgetHiddenState(7, player != _local_player);
 		}
 
 		/* Borrow button only shows when there is any more money to loan */
-		SetWindowWidgetDisabledState(w, 6, p->current_loan == _economy.max_loan);
+		w->SetWidgetDisabledState(6, p->current_loan == _economy.max_loan);
 
 		/* Repay button only shows when there is any more money to repay */
-		SetWindowWidgetDisabledState(w, 7, player != _local_player || p->current_loan == 0);
+		w->SetWidgetDisabledState(7, player != _local_player || p->current_loan == 0);
 
 		SetDParam(0, p->index);
 		SetDParam(1, p->index);
@@ -170,7 +172,7 @@
 			bool stickied = !!(w->flags4 & WF_STICKY);
 			PlayerID player = (PlayerID)w->window_number;
 			DeleteWindow(w);
-			DoShowPlayerFinances(player, !HASBIT(mode, 0), stickied);
+			DoShowPlayerFinances(player, !HasBit(mode, 0), stickied);
 		} break;
 
 		case 6: /* increase loan */
@@ -271,16 +273,16 @@
 	LiveryScheme scheme;
 
 	/* Disallow other player colours for the primary colour */
-	if (HASBIT(WP(w, livery_d).sel, LS_DEFAULT) && widget == 10) {
+	if (HasBit(WP(w, livery_d).sel, LS_DEFAULT) && widget == 10) {
 		const Player *p;
 		FOR_ALL_PLAYERS(p) {
-			if (p->is_active && p->index != _local_player) SETBIT(used_colours, p->player_color);
+			if (p->is_active && p->index != _local_player) SetBit(used_colours, p->player_color);
 		}
 	}
 
 	/* Get the first selected livery to use as the default dropdown item */
 	for (scheme = LS_BEGIN; scheme < LS_END; scheme++) {
-		if (HASBIT(WP(w, livery_d).sel, scheme)) break;
+		if (HasBit(WP(w, livery_d).sel, scheme)) break;
 	}
 	if (scheme == LS_END) scheme = LS_DEFAULT;
 	livery = &GetPlayer((PlayerID)w->window_number)->livery[scheme];
@@ -292,10 +294,10 @@
 {
 	switch (e->event) {
 		case WE_CREATE:
-			LowerWindowWidget(w, WP(w, livery_d).livery_class + 2);
+			w->LowerWidget(WP(w, livery_d).livery_class + 2);
 			if (!_loaded_newgrf_features.has_2CC) {
-				HideWindowWidget(w, 11);
-				HideWindowWidget(w, 12);
+				w->HideWidget(11);
+				w->HideWidget(12);
 			}
 			break;
 
@@ -305,14 +307,14 @@
 			int y = 51;
 
 			/* Disable dropdown controls if no scheme is selected */
-			SetWindowWidgetDisabledState(w,  9, (WP(w, livery_d).sel == 0));
-			SetWindowWidgetDisabledState(w, 10, (WP(w, livery_d).sel == 0));
-			SetWindowWidgetDisabledState(w, 11, (WP(w, livery_d).sel == 0));
-			SetWindowWidgetDisabledState(w, 12, (WP(w, livery_d).sel == 0));
+			w->SetWidgetDisabledState( 9, (WP(w, livery_d).sel == 0));
+			w->SetWidgetDisabledState(10, (WP(w, livery_d).sel == 0));
+			w->SetWidgetDisabledState(11, (WP(w, livery_d).sel == 0));
+			w->SetWidgetDisabledState(12, (WP(w, livery_d).sel == 0));
 
 			if (!(WP(w, livery_d).sel == 0)) {
 				for (scheme = LS_BEGIN; scheme < LS_END; scheme++) {
-					if (HASBIT(WP(w, livery_d).sel, scheme)) break;
+					if (HasBit(WP(w, livery_d).sel, scheme)) break;
 				}
 				if (scheme == LS_END) scheme = LS_DEFAULT;
 			}
@@ -324,20 +326,20 @@
 
 			for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
 				if (livery_class[scheme] == WP(w, livery_d).livery_class) {
-					bool sel = HASBIT(WP(w, livery_d).sel, scheme) != 0;
+					bool sel = HasBit(WP(w, livery_d).sel, scheme) != 0;
 
 					if (scheme != LS_DEFAULT) {
 						DrawSprite(p->livery[scheme].in_use ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, 2, y);
 					}
 
-					DrawString(15, y, STR_LIVERY_DEFAULT + scheme, sel ? 0xC : 0x10);
+					DrawString(15, y, STR_LIVERY_DEFAULT + scheme, sel ? TC_WHITE : TC_BLACK);
 
 					DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOR(p->livery[scheme].colour1), 152, y);
-					DrawString(165, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour1, sel ? 0xC : 2);
+					DrawString(165, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour1, sel ? TC_WHITE : TC_GOLD);
 
 					if (_loaded_newgrf_features.has_2CC) {
 						DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOR(p->livery[scheme].colour2), 277, y);
-						DrawString(290, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour2, sel ? 0xC : 2);
+						DrawString(290, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour2, sel ? TC_WHITE : TC_GOLD);
 					}
 
 					y += 14;
@@ -356,10 +358,10 @@
 				case 6: {
 					LiveryScheme scheme;
 
-					RaiseWindowWidget(w, WP(w, livery_d).livery_class + 2);
+					w->RaiseWidget(WP(w, livery_d).livery_class + 2);
 					WP(w, livery_d).livery_class = (LiveryClass)(e->we.click.widget - 2);
 					WP(w, livery_d).sel = 0;
-					LowerWindowWidget(w, WP(w, livery_d).livery_class + 2);
+					w->LowerWidget(WP(w, livery_d).livery_class + 2);
 
 					/* Select the first item in the list */
 					for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
@@ -401,7 +403,7 @@
 					}
 
 					if (_ctrl_pressed) {
-						TOGGLEBIT(WP(w, livery_d).sel, j);
+						ToggleBit(WP(w, livery_d).sel, j);
 					} else {
 						WP(w, livery_d).sel = 1 << j;
 					}
@@ -416,7 +418,7 @@
 			LiveryScheme scheme;
 
 			for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
-				if (HASBIT(WP(w, livery_d).sel, scheme)) {
+				if (HasBit(WP(w, livery_d).sel, scheme)) {
 					DoCommandP(0, scheme | (e->we.dropdown.button == 10 ? 0 : 256), e->we.dropdown.index, NULL, CMD_SET_PLAYER_COLOR);
 				}
 			}
@@ -489,15 +491,21 @@
 {
 	GenderEthnicity ge = (GenderEthnicity)GetPlayerFaceBits(pf, PFV_GEN_ETHN, GE_WM);
 
-	bool has_moustache   = !HASBIT(ge, GENDER_FEMALE) && GetPlayerFaceBits(pf, PFV_HAS_MOUSTACHE,   ge) != 0;
-	bool has_tie_earring = !HASBIT(ge, GENDER_FEMALE) || GetPlayerFaceBits(pf, PFV_HAS_TIE_EARRING, ge) != 0;
+	bool has_moustache   = !HasBit(ge, GENDER_FEMALE) && GetPlayerFaceBits(pf, PFV_HAS_MOUSTACHE,   ge) != 0;
+	bool has_tie_earring = !HasBit(ge, GENDER_FEMALE) || GetPlayerFaceBits(pf, PFV_HAS_TIE_EARRING, ge) != 0;
 	bool has_glasses     = GetPlayerFaceBits(pf, PFV_HAS_GLASSES, ge) != 0;
 	SpriteID pal;
-	switch (GetPlayerFaceBits(pf, PFV_EYE_COLOUR, ge)) {
-		default: NOT_REACHED();
-		case 0: pal = PALETTE_TO_BROWN; break;
-		case 1: pal = PALETTE_TO_BLUE;  break;
-		case 2: pal = PALETTE_TO_GREEN; break;
+
+	/* Modify eye colour palette only if 2 or more valid values exist */
+	if (_pf_info[PFV_EYE_COLOUR].valid_values[ge] < 2) {
+		pal = PAL_NONE;
+	} else {
+		switch (GetPlayerFaceBits(pf, PFV_EYE_COLOUR, ge)) {
+			default: NOT_REACHED();
+			case 0: pal = PALETTE_TO_BROWN; break;
+			case 1: pal = PALETTE_TO_BLUE;  break;
+			case 2: pal = PALETTE_TO_GREEN; break;
+		}
 	}
 
 	/* Draw the gradient (background) */
@@ -516,60 +524,426 @@
 	}
 }
 
-static void SelectPlayerFaceWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_PAINT: {
-		Player *p;
-		LowerWindowWidget(w, WP(w, facesel_d).gender + 5);
-		DrawWindowWidgets(w);
-		p = GetPlayer((PlayerID)w->window_number);
-		DrawPlayerFace(WP(w, facesel_d).face, p->player_color, 2, 16);
-	} break;
+/**
+ * Names of the widgets. Keep them in the same order as in the widget array.
+ * Do not change the order of the widgets from PFW_WIDGET_HAS_MOUSTACHE_EARRING to PFW_WIDGET_GLASSES_R,
+ * this order is needed for the WE_CLICK event of DrawFaceStringLabel().
+ */
+enum PlayerFaceWindowWidgets {
+	PFW_WIDGET_CLOSEBOX = 0,
+	PFW_WIDGET_CAPTION,
+	PFW_WIDGET_TOGGLE_LARGE_SMALL,
+	PFW_WIDGET_SELECT_FACE,
+	PFW_WIDGET_CANCEL,
+	PFW_WIDGET_ACCEPT,
+	PFW_WIDGET_MALE,
+	PFW_WIDGET_FEMALE,
+	PFW_WIDGET_RANDOM_NEW_FACE,
+	PFW_WIDGET_TOGGLE_LARGE_SMALL_BUTTON,
+	/* from here is the advanced player face selection window */
+	PFW_WIDGET_LOAD,
+	PFW_WIDGET_FACECODE,
+	PFW_WIDGET_SAVE,
+	PFW_WIDGET_ETHNICITY_EUR,
+	PFW_WIDGET_ETHNICITY_AFR,
+	PFW_WIDGET_HAS_MOUSTACHE_EARRING,
+	PFW_WIDGET_HAS_GLASSES,
+	PFW_WIDGET_EYECOLOUR_L,
+	PFW_WIDGET_EYECOLOUR,
+	PFW_WIDGET_EYECOLOUR_R,
+	PFW_WIDGET_CHIN_L,
+	PFW_WIDGET_CHIN,
+	PFW_WIDGET_CHIN_R,
+	PFW_WIDGET_EYEBROWS_L,
+	PFW_WIDGET_EYEBROWS,
+	PFW_WIDGET_EYEBROWS_R,
+	PFW_WIDGET_LIPS_MOUSTACHE_L,
+	PFW_WIDGET_LIPS_MOUSTACHE,
+	PFW_WIDGET_LIPS_MOUSTACHE_R,
+	PFW_WIDGET_NOSE_L,
+	PFW_WIDGET_NOSE,
+	PFW_WIDGET_NOSE_R,
+	PFW_WIDGET_HAIR_L,
+	PFW_WIDGET_HAIR,
+	PFW_WIDGET_HAIR_R,
+	PFW_WIDGET_JACKET_L,
+	PFW_WIDGET_JACKET,
+	PFW_WIDGET_JACKET_R,
+	PFW_WIDGET_COLLAR_L,
+	PFW_WIDGET_COLLAR,
+	PFW_WIDGET_COLLAR_R,
+	PFW_WIDGET_TIE_EARRING_L,
+	PFW_WIDGET_TIE_EARRING,
+	PFW_WIDGET_TIE_EARRING_R,
+	PFW_WIDGET_GLASSES_L,
+	PFW_WIDGET_GLASSES,
+	PFW_WIDGET_GLASSES_R,
+};
 
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-		case 3: DeleteWindow(w); break;
-		case 4: /* ok click */
-			DoCommandP(0, 0, WP(w, facesel_d).face, NULL, CMD_SET_PLAYER_FACE);
-			DeleteWindow(w);
-			break;
-		case 5: /* male click */
-		case 6: /* female click */
-			RaiseWindowWidget(w, WP(w, facesel_d).gender + 5);
-			WP(w, facesel_d).gender = e->we.click.widget - 5;
-			LowerWindowWidget(w, WP(w, facesel_d).gender + 5);
-			SetWindowDirty(w);
-			break;
-		case 7:
-			WP(w, facesel_d).face = ConvertFromOldPlayerFace((WP(w, facesel_d).gender << 31) + GB(InteractiveRandom(), 0, 31));
-			SetWindowDirty(w);
-			break;
+/** Widget description for the normal/simple player face selection dialog */
+static const Widget _select_player_face_widgets[] = {
+{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},              // PFW_WIDGET_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,    14,    11,   174,     0,    13, STR_7043_FACE_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},    // PFW_WIDGET_CAPTION
+{     WWT_IMGBTN,   RESIZE_NONE,    14,   175,   189,     0,    13, SPR_LARGE_SMALL_WINDOW,  STR_FACE_ADVANCED_TIP},              // PFW_WIDGET_TOGGLE_LARGE_SMALL
+{      WWT_PANEL,   RESIZE_NONE,    14,     0,   189,    14,   150, 0x0,                     STR_NULL},                           // PFW_WIDGET_SELECT_FACE
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,    94,   151,   162, STR_012E_CANCEL,         STR_7047_CANCEL_NEW_FACE_SELECTION}, // PFW_WIDGET_CANCEL
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    95,   189,   151,   162, STR_012F_OK,             STR_7048_ACCEPT_NEW_FACE_SELECTION}, // PFW_WIDGET_ACCEPT
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    95,   187,    75,    86, STR_7044_MALE,           STR_7049_SELECT_MALE_FACES},         // PFW_WIDGET_MALE
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    95,   187,    87,    98, STR_7045_FEMALE,         STR_704A_SELECT_FEMALE_FACES},       // PFW_WIDGET_FEMALE
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     2,    93,   137,   148, STR_7046_NEW_FACE,       STR_704B_GENERATE_RANDOM_NEW_FACE},  // PFW_WIDGET_RANDOM_NEW_FACE
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    95,   187,    16,    27, STR_FACE_ADVANCED,       STR_FACE_ADVANCED_TIP},              // PFW_WIDGET_TOGGLE_LARGE_SMALL_BUTTON
+{   WIDGETS_END},
+};
+
+/** Widget description for the advanced player face selection dialog */
+static const Widget _select_player_face_adv_widgets[] = {
+{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},              // PFW_WIDGET_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,    14,    11,   204,     0,    13, STR_7043_FACE_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},    // PFW_WIDGET_CAPTION
+{     WWT_IMGBTN,   RESIZE_NONE,    14,   205,   219,     0,    13, SPR_LARGE_SMALL_WINDOW,  STR_FACE_SIMPLE_TIP},                // PFW_WIDGET_TOGGLE_LARGE_SMALL
+{      WWT_PANEL,   RESIZE_NONE,    14,     0,   219,    14,   207, 0x0,                     STR_NULL},                           // PFW_WIDGET_SELECT_FACE
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,    94,   208,   219, STR_012E_CANCEL,         STR_7047_CANCEL_NEW_FACE_SELECTION}, // PFW_WIDGET_CANCEL
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    95,   219,   208,   219, STR_012F_OK,             STR_7048_ACCEPT_NEW_FACE_SELECTION}, // PFW_WIDGET_ACCEPT
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    96,   156,    32,    43, STR_7044_MALE,           STR_7049_SELECT_MALE_FACES},         // PFW_WIDGET_MALE
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,   157,   217,    32,    43, STR_7045_FEMALE,         STR_704A_SELECT_FEMALE_FACES},       // PFW_WIDGET_FEMALE
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     2,    93,   137,   148, STR_RANDOM,              STR_704B_GENERATE_RANDOM_NEW_FACE},  // PFW_WIDGET_RANDOM_NEW_FACE
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    95,   217,    16,    27, STR_FACE_SIMPLE,         STR_FACE_SIMPLE_TIP},                // PFW_WIDGET_TOGGLE_LARGE_SMALL_BUTTON
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     2,    93,   158,   169, STR_FACE_LOAD,           STR_FACE_LOAD_TIP},                  // PFW_WIDGET_LOAD
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     2,    93,   170,   181, STR_FACE_FACECODE,       STR_FACE_FACECODE_TIP},              // PFW_WIDGET_FACECODE
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     2,    93,   182,   193, STR_FACE_SAVE,           STR_FACE_SAVE_TIP},                  // PFW_WIDGET_SAVE
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    96,   156,    46,    57, STR_FACE_EUROPEAN,       STR_FACE_SELECT_EUROPEAN},           // PFW_WIDGET_ETHNICITY_EUR
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,   157,   217,    46,    57, STR_FACE_AFRICAN,        STR_FACE_SELECT_AFRICAN},            // PFW_WIDGET_ETHNICITY_AFR
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   175,   217,    60,    71, STR_EMPTY,               STR_FACE_MOUSTACHE_EARRING_TIP},     // PFW_WIDGET_HAS_MOUSTACHE_EARRING
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   175,   217,    72,    83, STR_EMPTY,               STR_FACE_GLASSES_TIP},               // PFW_WIDGET_HAS_GLASSES
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,   110,   121, SPR_ARROW_LEFT,          STR_FACE_EYECOLOUR_TIP},             // PFW_WIDGET_EYECOLOUR_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,   110,   121, STR_EMPTY,               STR_FACE_EYECOLOUR_TIP},             // PFW_WIDGET_EYECOLOUR
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,   110,   121, SPR_ARROW_RIGHT,         STR_FACE_EYECOLOUR_TIP},             // PFW_WIDGET_EYECOLOUR_R
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,   158,   169, SPR_ARROW_LEFT,          STR_FACE_CHIN_TIP},                  // PFW_WIDGET_CHIN_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,   158,   169, STR_EMPTY,               STR_FACE_CHIN_TIP},                  // PFW_WIDGET_CHIN
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,   158,   169, SPR_ARROW_RIGHT,         STR_FACE_CHIN_TIP},                  // PFW_WIDGET_CHIN_R
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,    98,   109, SPR_ARROW_LEFT,          STR_FACE_EYEBROWS_TIP},              // PFW_WIDGET_EYEBROWS_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,    98,   109, STR_EMPTY,               STR_FACE_EYEBROWS_TIP},              // PFW_WIDGET_EYEBROWS
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,    98,   109, SPR_ARROW_RIGHT,         STR_FACE_EYEBROWS_TIP},              // PFW_WIDGET_EYEBROWS_R
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,   146,   157, SPR_ARROW_LEFT,          STR_FACE_LIPS_MOUSTACHE_TIP},        // PFW_WIDGET_LIPS_MOUSTACHE_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,   146,   157, STR_EMPTY,               STR_FACE_LIPS_MOUSTACHE_TIP},        // PFW_WIDGET_LIPS_MOUSTACHE
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,   146,   157, SPR_ARROW_RIGHT,         STR_FACE_LIPS_MOUSTACHE_TIP},        // PFW_WIDGET_LIPS_MOUSTACHE_R
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,   134,   145, SPR_ARROW_LEFT,          STR_FACE_NOSE_TIP},                  // PFW_WIDGET_NOSE_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,   134,   145, STR_EMPTY,               STR_FACE_NOSE_TIP},                  // PFW_WIDGET_NOSE
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,   134,   145, SPR_ARROW_RIGHT,         STR_FACE_NOSE_TIP},                  // PFW_WIDGET_NOSE_R
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,    86,    97, SPR_ARROW_LEFT,          STR_FACE_HAIR_TIP},                  // PFW_WIDGET_HAIR_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,    86,    97, STR_EMPTY,               STR_FACE_HAIR_TIP},                  // PFW_WIDGET_HAIR
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,    86,    97, SPR_ARROW_RIGHT,         STR_FACE_HAIR_TIP},                  // PFW_WIDGET_HAIR_R
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,   170,   181, SPR_ARROW_LEFT,          STR_FACE_JACKET_TIP},                // PFW_WIDGET_JACKET_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,   170,   181, STR_EMPTY,               STR_FACE_JACKET_TIP},                // PFW_WIDGET_JACKET
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,   170,   181, SPR_ARROW_RIGHT,         STR_FACE_JACKET_TIP},                // PFW_WIDGET_JACKET_R
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,   182,   193, SPR_ARROW_LEFT,          STR_FACE_COLLAR_TIP},                // PFW_WIDGET_COLLAR_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,   182,   193, STR_EMPTY,               STR_FACE_COLLAR_TIP},                // PFW_WIDGET_COLLAR
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,   182,   193, SPR_ARROW_RIGHT,         STR_FACE_COLLAR_TIP},                // PFW_WIDGET_COLLAR_R
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,   194,   205, SPR_ARROW_LEFT,          STR_FACE_TIE_EARRING_TIP},           // PFW_WIDGET_TIE_EARRING_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,   194,   205, STR_EMPTY,               STR_FACE_TIE_EARRING_TIP},           // PFW_WIDGET_TIE_EARRING
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,   194,   205, SPR_ARROW_RIGHT,         STR_FACE_TIE_EARRING_TIP},           // PFW_WIDGET_TIE_EARRING_R
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    175,  183,   122,   133, SPR_ARROW_LEFT,          STR_FACE_GLASSES_TIP_2},             // PFW_WIDGET_GLASSES_L
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    184,  208,   122,   133, STR_EMPTY,               STR_FACE_GLASSES_TIP_2},             // PFW_WIDGET_GLASSES
+{ WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    209,  217,   122,   133, SPR_ARROW_RIGHT,         STR_FACE_GLASSES_TIP_2},             // PFW_WIDGET_GLASSES_R
+{   WIDGETS_END},
+};
+
+/**
+ * Draw dynamic a label to the left of the button and a value in the button
+ *
+ * @param w              Window on which the widget is located
+ * @param widget_index   index of this widget in the window
+ * @param str            the label which will be draw
+ * @param val            the value which will be draw
+ * @param is_bool_widget is it a bool button
+ */
+void DrawFaceStringLabel(const Window *w, byte widget_index, StringID str, uint8 val, bool is_bool_widget)
+{
+	/* Write the label in gold (0x2) to the left of the button. */
+	DrawStringRightAligned(w->widget[widget_index].left - (is_bool_widget ? 5 : 14), w->widget[widget_index].top + 1, str, TC_GOLD);
+
+	if (!w->IsWidgetDisabled(widget_index)) {
+		if (is_bool_widget) {
+			/* if it a bool button write yes or no */
+			str = (val != 0) ? STR_FACE_YES : STR_FACE_NO;
+		} else {
+			/* else write the value + 1 */
+			SetDParam(0, val + 1);
+			str = STR_JUST_INT;
 		}
-		break;
+
+		/* Draw the value/bool in white (0xC). If the button clicked adds 1px to x and y text coordinates (IsWindowWidgetLowered()). */
+		DrawStringCentered(w->widget[widget_index].left + (w->widget[widget_index].right - w->widget[widget_index].left) / 2 +
+			w->IsWidgetLowered(widget_index), w->widget[widget_index].top + 1 + w->IsWidgetLowered(widget_index), str, TC_WHITE);
 	}
 }
 
-static const Widget _select_player_face_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,    14,    11,   189,     0,    13, STR_7043_FACE_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,    14,     0,   189,    14,   136, 0x0,                     STR_NULL},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,    94,   137,   148, STR_012E_CANCEL,         STR_7047_CANCEL_NEW_FACE_SELECTION},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    95,   189,   137,   148, STR_012F_OK,             STR_7048_ACCEPT_NEW_FACE_SELECTION},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    95,   187,    25,    36, STR_7044_MALE,           STR_7049_SELECT_MALE_FACES},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    95,   187,    37,    48, STR_7045_FEMALE,         STR_704A_SELECT_FEMALE_FACES},
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,    95,   187,    79,    90, STR_7046_NEW_FACE,       STR_704B_GENERATE_RANDOM_NEW_FACE},
-{   WIDGETS_END},
-};
+/**
+ * Player face selection window event definition
+ *
+ * @param w window pointer
+ * @param e event been triggered
+ */
+static void SelectPlayerFaceWndProc(Window *w, WindowEvent *e)
+{
+	PlayerFace *pf = &WP(w, facesel_d).face; // pointer to the player face bits
+	GenderEthnicity ge = (GenderEthnicity)GB(*pf, _pf_info[PFV_GEN_ETHN].offset, _pf_info[PFV_GEN_ETHN].length); // get the gender and ethnicity
+	bool is_female = HasBit(ge, GENDER_FEMALE); // get the gender: 0 == male and 1 == female
+	bool is_moust_male = !is_female && GetPlayerFaceBits(*pf, PFV_HAS_MOUSTACHE, ge) != 0; // is a male face with moustache
 
+	switch (e->event) {
+		case WE_PAINT:
+			/* lower the non-selected gender button */
+			w->SetWidgetLoweredState(PFW_WIDGET_MALE,  !is_female);
+			w->SetWidgetLoweredState(PFW_WIDGET_FEMALE, is_female);
+
+			/* advanced player face selection window */
+			if (WP(w, facesel_d).advanced) {
+				/* lower the non-selected ethnicity button */
+				w->SetWidgetLoweredState(PFW_WIDGET_ETHNICITY_EUR, !HasBit(ge, ETHNICITY_BLACK));
+				w->SetWidgetLoweredState(PFW_WIDGET_ETHNICITY_AFR,  HasBit(ge, ETHNICITY_BLACK));
+
+
+				/* Disable dynamically the widgets which PlayerFaceVariable has less than 2 options
+				* (or in other words you haven't any choice).
+				* If the widgets depend on a HAS-variable and this is false the widgets will be disabled, too. */
+
+				/* Eye colour buttons */
+				w->SetWidgetsDisabledState(_pf_info[PFV_EYE_COLOUR].valid_values[ge] < 2,
+					PFW_WIDGET_EYECOLOUR, PFW_WIDGET_EYECOLOUR_L, PFW_WIDGET_EYECOLOUR_R, WIDGET_LIST_END);
+
+				/* Chin buttons */
+				w->SetWidgetsDisabledState(_pf_info[PFV_CHIN].valid_values[ge] < 2,
+					PFW_WIDGET_CHIN, PFW_WIDGET_CHIN_L, PFW_WIDGET_CHIN_R, WIDGET_LIST_END);
+
+				/* Eyebrows buttons */
+				w->SetWidgetsDisabledState(_pf_info[PFV_EYEBROWS].valid_values[ge] < 2,
+					PFW_WIDGET_EYEBROWS, PFW_WIDGET_EYEBROWS_L, PFW_WIDGET_EYEBROWS_R, WIDGET_LIST_END);
+
+				/* Lips or (if it a male face with a moustache) moustache buttons */
+				w->SetWidgetsDisabledState(_pf_info[is_moust_male ? PFV_MOUSTACHE : PFV_LIPS].valid_values[ge] < 2,
+					PFW_WIDGET_LIPS_MOUSTACHE, PFW_WIDGET_LIPS_MOUSTACHE_L, PFW_WIDGET_LIPS_MOUSTACHE_R, WIDGET_LIST_END);
+
+				/* Nose buttons | male faces with moustache haven't any nose options */
+				w->SetWidgetsDisabledState(_pf_info[PFV_NOSE].valid_values[ge] < 2 || is_moust_male,
+					PFW_WIDGET_NOSE, PFW_WIDGET_NOSE_L, PFW_WIDGET_NOSE_R, WIDGET_LIST_END);
+
+				/* Hair buttons */
+				w->SetWidgetsDisabledState(_pf_info[PFV_HAIR].valid_values[ge] < 2,
+					PFW_WIDGET_HAIR, PFW_WIDGET_HAIR_L, PFW_WIDGET_HAIR_R, WIDGET_LIST_END);
+
+				/* Jacket buttons */
+				w->SetWidgetsDisabledState(_pf_info[PFV_JACKET].valid_values[ge] < 2,
+					PFW_WIDGET_JACKET, PFW_WIDGET_JACKET_L, PFW_WIDGET_JACKET_R, WIDGET_LIST_END);
+
+				/* Collar buttons */
+				w->SetWidgetsDisabledState(_pf_info[PFV_COLLAR].valid_values[ge] < 2,
+					PFW_WIDGET_COLLAR, PFW_WIDGET_COLLAR_L, PFW_WIDGET_COLLAR_R, WIDGET_LIST_END);
+
+				/* Tie/earring buttons | female faces without earring haven't any earring options */
+				w->SetWidgetsDisabledState(_pf_info[PFV_TIE_EARRING].valid_values[ge] < 2 ||
+						(is_female && GetPlayerFaceBits(*pf, PFV_HAS_TIE_EARRING, ge) == 0),
+					PFW_WIDGET_TIE_EARRING, PFW_WIDGET_TIE_EARRING_L, PFW_WIDGET_TIE_EARRING_R, WIDGET_LIST_END);
+
+				/* Glasses buttons | faces without glasses haven't any glasses options */
+				w->SetWidgetsDisabledState(_pf_info[PFV_GLASSES].valid_values[ge] < 2 || GetPlayerFaceBits(*pf, PFV_HAS_GLASSES, ge) == 0,
+					PFW_WIDGET_GLASSES, PFW_WIDGET_GLASSES_L, PFW_WIDGET_GLASSES_R, WIDGET_LIST_END);
+			}
+
+			DrawWindowWidgets(w);
+
+			/* Draw dynamic button value and labels for the advanced player face selection window */
+			if (WP(w, facesel_d).advanced) {
+				if (is_female) {
+					/* Only for female faces */
+					DrawFaceStringLabel(w, PFW_WIDGET_HAS_MOUSTACHE_EARRING, STR_FACE_EARRING,   GetPlayerFaceBits(*pf, PFV_HAS_TIE_EARRING, ge), true );
+					DrawFaceStringLabel(w, PFW_WIDGET_TIE_EARRING,           STR_FACE_EARRING,   GetPlayerFaceBits(*pf, PFV_TIE_EARRING,     ge), false);
+				} else {
+					/* Only for male faces */
+					DrawFaceStringLabel(w, PFW_WIDGET_HAS_MOUSTACHE_EARRING, STR_FACE_MOUSTACHE, GetPlayerFaceBits(*pf, PFV_HAS_MOUSTACHE,   ge), true );
+					DrawFaceStringLabel(w, PFW_WIDGET_TIE_EARRING,           STR_FACE_TIE,       GetPlayerFaceBits(*pf, PFV_TIE_EARRING,     ge), false);
+				}
+				if (is_moust_male) {
+					/* Only for male faces with moustache */
+					DrawFaceStringLabel(w, PFW_WIDGET_LIPS_MOUSTACHE,        STR_FACE_MOUSTACHE, GetPlayerFaceBits(*pf, PFV_MOUSTACHE,       ge), false);
+				} else {
+					/* Only for female faces or male faces without moustache */
+					DrawFaceStringLabel(w, PFW_WIDGET_LIPS_MOUSTACHE,        STR_FACE_LIPS,      GetPlayerFaceBits(*pf, PFV_LIPS,            ge), false);
+				}
+				/* For all faces */
+				DrawFaceStringLabel(w, PFW_WIDGET_HAS_GLASSES,           STR_FACE_GLASSES,     GetPlayerFaceBits(*pf, PFV_HAS_GLASSES,     ge), true );
+				DrawFaceStringLabel(w, PFW_WIDGET_HAIR,                  STR_FACE_HAIR,        GetPlayerFaceBits(*pf, PFV_HAIR,            ge), false);
+				DrawFaceStringLabel(w, PFW_WIDGET_EYEBROWS,              STR_FACE_EYEBROWS,    GetPlayerFaceBits(*pf, PFV_EYEBROWS,        ge), false);
+				DrawFaceStringLabel(w, PFW_WIDGET_EYECOLOUR,             STR_FACE_EYECOLOUR,   GetPlayerFaceBits(*pf, PFV_EYE_COLOUR,      ge), false);
+				DrawFaceStringLabel(w, PFW_WIDGET_GLASSES,               STR_FACE_GLASSES,     GetPlayerFaceBits(*pf, PFV_GLASSES,         ge), false);
+				DrawFaceStringLabel(w, PFW_WIDGET_NOSE,                  STR_FACE_NOSE,        GetPlayerFaceBits(*pf, PFV_NOSE,            ge), false);
+				DrawFaceStringLabel(w, PFW_WIDGET_CHIN,                  STR_FACE_CHIN,        GetPlayerFaceBits(*pf, PFV_CHIN,            ge), false);
+				DrawFaceStringLabel(w, PFW_WIDGET_JACKET,                STR_FACE_JACKET,      GetPlayerFaceBits(*pf, PFV_JACKET,          ge), false);
+				DrawFaceStringLabel(w, PFW_WIDGET_COLLAR,                STR_FACE_COLLAR,      GetPlayerFaceBits(*pf, PFV_COLLAR,          ge), false);
+			}
+
+			/* Draw the player face picture */
+			DrawPlayerFace(*pf, GetPlayer((PlayerID)w->window_number)->player_color, 2, 16);
+			break;
+
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				/* Toggle size, advanced/simple face selection */
+				case PFW_WIDGET_TOGGLE_LARGE_SMALL:
+				case PFW_WIDGET_TOGGLE_LARGE_SMALL_BUTTON:
+					DoCommandP(0, 0, *pf, NULL, CMD_SET_PLAYER_FACE);
+					DeleteWindow(w);
+					DoSelectPlayerFace((PlayerID)w->window_number, !WP(w, facesel_d).advanced);
+					break;
+
+				/* Cancel button */
+				case PFW_WIDGET_CANCEL:
+					DeleteWindow(w);
+					break;
+
+				/* OK button */
+				case PFW_WIDGET_ACCEPT:
+					DoCommandP(0, 0, *pf, NULL, CMD_SET_PLAYER_FACE);
+					DeleteWindow(w);
+					break;
+
+				/* Load button */
+				case PFW_WIDGET_LOAD:
+					*pf = _player_face;
+					ScaleAllPlayerFaceBits(*pf);
+					ShowErrorMessage(INVALID_STRING_ID, STR_FACE_LOAD_DONE, 0, 0);
+					SetWindowDirty(w);
+					break;
+
+				/* 'Player face number' button, view and/or set player face number */
+				case PFW_WIDGET_FACECODE:
+					SetDParam(0, *pf);
+					ShowQueryString(STR_JUST_INT, STR_FACE_FACECODE_CAPTION, 10 + 1, 0, w, CS_NUMERAL);
+					break;
+
+				/* Save button */
+				case PFW_WIDGET_SAVE:
+					_player_face = *pf;
+					ShowErrorMessage(INVALID_STRING_ID, STR_FACE_SAVE_DONE, 0, 0);
+					break;
+
+				/* Toggle gender (male/female) button */
+				case PFW_WIDGET_MALE:
+				case PFW_WIDGET_FEMALE:
+					SetPlayerFaceBits(*pf, PFV_GENDER, ge, e->we.click.widget - PFW_WIDGET_MALE);
+					ScaleAllPlayerFaceBits(*pf);
+					SetWindowDirty(w);
+					break;
+
+				/* Randomize face button */
+				case PFW_WIDGET_RANDOM_NEW_FACE:
+					RandomPlayerFaceBits(*pf, ge, WP(w, facesel_d).advanced);
+					SetWindowDirty(w);
+					break;
+
+				/* Toggle ethnicity (european/african) button */
+				case PFW_WIDGET_ETHNICITY_EUR:
+				case PFW_WIDGET_ETHNICITY_AFR:
+					SetPlayerFaceBits(*pf, PFV_ETHNICITY, ge, e->we.click.widget - PFW_WIDGET_ETHNICITY_EUR);
+					ScaleAllPlayerFaceBits(*pf);
+					SetWindowDirty(w);
+					break;
+
+				default:
+					/* For all buttons from PFW_WIDGET_HAS_MOUSTACHE_EARRING to PFW_WIDGET_GLASSES_R is the same function.
+					* Therefor is this combined function.
+					* First it checks which PlayerFaceVariable will be change and then
+					* a: invert the value for boolean variables
+					* or b: it checks inside of IncreasePlayerFaceBits() if a left (_L) butten is pressed and then decrease else increase the variable */
+					if (WP(w, facesel_d).advanced && e->we.click.widget >= PFW_WIDGET_HAS_MOUSTACHE_EARRING && e->we.click.widget <= PFW_WIDGET_GLASSES_R) {
+						PlayerFaceVariable pfv; // which PlayerFaceVariable shall be edited
+
+						if (e->we.click.widget < PFW_WIDGET_EYECOLOUR_L) { // Bool buttons
+							switch (e->we.click.widget - PFW_WIDGET_HAS_MOUSTACHE_EARRING) {
+								default: NOT_REACHED();
+								case 0: pfv = is_female ? PFV_HAS_TIE_EARRING : PFV_HAS_MOUSTACHE; break; // Has earring/moustache button
+								case 1: pfv = PFV_HAS_GLASSES; break; // Has glasses button
+							}
+							SetPlayerFaceBits(*pf, pfv, ge, !GetPlayerFaceBits(*pf, pfv, ge));
+							ScaleAllPlayerFaceBits(*pf);
+
+						} else { // Value buttons
+							switch ((e->we.click.widget - PFW_WIDGET_EYECOLOUR_L) / 3) {
+								default: NOT_REACHED();
+								case 0: pfv = PFV_EYE_COLOUR; break;  // Eye colour buttons
+								case 1: pfv = PFV_CHIN; break;        // Chin buttons
+								case 2: pfv = PFV_EYEBROWS; break;    // Eyebrows buttons
+								case 3: pfv = is_moust_male ? PFV_MOUSTACHE : PFV_LIPS; break; // Moustache or lips buttons
+								case 4: pfv = PFV_NOSE; break;        // Nose buttons
+								case 5: pfv = PFV_HAIR; break;        // Hair buttons
+								case 6: pfv = PFV_JACKET; break;      // Jacket buttons
+								case 7: pfv = PFV_COLLAR; break;      // Collar buttons
+								case 8: pfv = PFV_TIE_EARRING; break; // Tie/earring buttons
+								case 9: pfv = PFV_GLASSES; break;     // Glasses buttons
+							}
+							/* 0 == left (_L), 1 == middle or 2 == right (_R) - button click */
+							IncreasePlayerFaceBits(*pf, pfv, ge, (((e->we.click.widget - PFW_WIDGET_EYECOLOUR_L) % 3) != 0) ? 1 : -1);
+						}
+
+						SetWindowDirty(w);
+					}
+					break;
+			}
+			break;
+
+		case WE_ON_EDIT_TEXT:
+			/* Set a new player face number */
+			if (!StrEmpty(e->we.edittext.str)) {
+				*pf = strtoul(e->we.edittext.str, NULL, 10);
+				ScaleAllPlayerFaceBits(*pf);
+				ShowErrorMessage(INVALID_STRING_ID, STR_FACE_FACECODE_SET, 0, 0);
+				SetWindowDirty(w);
+			} else {
+				ShowErrorMessage(INVALID_STRING_ID, STR_FACE_FACECODE_ERR, 0, 0);
+			}
+			break;
+	}
+}
+
+/** normal/simple player face selection window description */
 static const WindowDesc _select_player_face_desc = {
-	WDP_AUTO, WDP_AUTO, 190, 149, 190, 149,
+	WDP_AUTO, WDP_AUTO, 190, 163, 190, 163,
 	WC_PLAYER_FACE, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
 	_select_player_face_widgets,
 	SelectPlayerFaceWndProc
 };
 
+/** advanced player face selection window description */
+static const WindowDesc _select_player_face_adv_desc = {
+	WDP_AUTO, WDP_AUTO, 220, 220, 220, 220,
+	WC_PLAYER_FACE, WC_NONE,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
+	_select_player_face_adv_widgets,
+	SelectPlayerFaceWndProc
+};
+
+/**
+ * Open the simple/advanced player face selection window
+ *
+ * @param player the player which face shall be edited
+ * @param adv    simple or advanced player face selection window
+ *
+ * @pre is player a valid player
+ */
+static void DoSelectPlayerFace(PlayerID player, bool adv)
+{
+	if (!IsValidPlayer(player)) return;
+
+	Window *w = AllocateWindowDescFront(adv ? &_select_player_face_adv_desc : &_select_player_face_desc, player); // simple or advanced window
+
+	if (w != NULL) {
+		w->caption_color = w->window_number;
+		WP(w, facesel_d).face = GetPlayer((PlayerID)w->window_number)->face;
+		WP(w, facesel_d).advanced = adv;
+	}
+}
+
+
 /* Names of the widgets. Keep them in the same order as in the widget array */
 enum PlayerCompanyWindowWidgets {
 	PCW_WIDGET_CLOSEBOX = 0,
@@ -602,17 +976,22 @@
 {   WIDGETS_END},
 };
 
+
+/**
+ * Draws text "Vehicles:" and number of all vehicle types, or "(none)"
+ * @param player ID of player to print statistics of
+ */
 static void DrawPlayerVehiclesAmount(PlayerID player)
 {
 	const int x = 110;
-	int y = 72;
+	int y = 63;
 	const Vehicle *v;
 	uint train = 0;
 	uint road  = 0;
 	uint air   = 0;
 	uint ship  = 0;
 
-	DrawString(x, y, STR_7039_VEHICLES, 0);
+	DrawString(x, y, STR_7039_VEHICLES, TC_FROMSTRING);
 
 	FOR_ALL_VEHICLES(v) {
 		if (v->owner == player) {
@@ -627,29 +1006,29 @@
 	}
 
 	if (train + road + air + ship == 0) {
-		DrawString(x + 70, y, STR_7042_NONE, 0);
+		DrawString(x + 70, y, STR_7042_NONE, TC_FROMSTRING);
 	} else {
 		if (train != 0) {
 			SetDParam(0, train);
-			DrawString(x + 70, y, STR_TRAINS, 0);
+			DrawString(x + 70, y, STR_TRAINS, TC_FROMSTRING);
 			y += 10;
 		}
 
 		if (road != 0) {
 			SetDParam(0, road);
-			DrawString(x + 70, y, STR_ROAD_VEHICLES, 0);
+			DrawString(x + 70, y, STR_ROAD_VEHICLES, TC_FROMSTRING);
 			y += 10;
 		}
 
 		if (air != 0) {
 			SetDParam(0, air);
-			DrawString(x + 70, y, STR_AIRCRAFT, 0);
+			DrawString(x + 70, y, STR_AIRCRAFT, TC_FROMSTRING);
 			y += 10;
 		}
 
 		if (ship != 0) {
 			SetDParam(0, ship);
-			DrawString(x + 70, y, STR_SHIPS, 0);
+			DrawString(x + 70, y, STR_SHIPS, TC_FROMSTRING);
 		}
 	}
 }
@@ -662,26 +1041,33 @@
 				 (p->share_owners[3] == owner);
 }
 
+/**
+ * Draws list of all companies with shares
+ * @param p pointer to the Player structure
+ */
 static void DrawCompanyOwnerText(const Player *p)
 {
 	const Player *p2;
-	int num = -1;
+	uint num = 0;
+	const byte height = GetCharacterHeight(FS_NORMAL);
 
 	FOR_ALL_PLAYERS(p2) {
 		uint amt = GetAmountOwnedBy(p, p2->index);
 		if (amt != 0) {
-			num++;
+			SetDParam(0, amt * 25);
+			SetDParam(1, p2->index);
 
-			SetDParam(num * 2 + 0, amt * 25);
-			SetDParam(num * 2 + 1, p2->index);
-
-			if (num != 0) break;
+			DrawString(120, (num++) * height + 116, STR_707D_OWNED_BY, TC_FROMSTRING);
 		}
 	}
-
-	if (num >= 0) DrawString(120, 124, STR_707D_OWNED_BY + num, 0);
 }
 
+/**
+ * Player company window event definition
+ *
+ * @param w window pointer
+ * @param e event been triggered
+ */
 static void PlayerCompanyWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
@@ -689,34 +1075,34 @@
 			const Player *p = GetPlayer((PlayerID)w->window_number);
 			bool local = w->window_number == _local_player;
 
-			SetWindowWidgetHiddenState(w, PCW_WIDGET_NEW_FACE,       !local);
-			SetWindowWidgetHiddenState(w, PCW_WIDGET_COLOR_SCHEME,   !local);
-			SetWindowWidgetHiddenState(w, PCW_WIDGET_PRESIDENT_NAME, !local);
-			SetWindowWidgetHiddenState(w, PCW_WIDGET_COMPANY_NAME,   !local);
+			w->SetWidgetHiddenState(PCW_WIDGET_NEW_FACE,       !local);
+			w->SetWidgetHiddenState(PCW_WIDGET_COLOR_SCHEME,   !local);
+			w->SetWidgetHiddenState(PCW_WIDGET_PRESIDENT_NAME, !local);
+			w->SetWidgetHiddenState(PCW_WIDGET_COMPANY_NAME,   !local);
 			w->widget[PCW_WIDGET_BUILD_VIEW_HQ].data = (local && p->location_of_house == 0) ? STR_706F_BUILD_HQ : STR_7072_VIEW_HQ;
 			if (local && p->location_of_house != 0) w->widget[PCW_WIDGET_BUILD_VIEW_HQ].type = WWT_PUSHTXTBTN; //HQ is already built.
-			SetWindowWidgetDisabledState(w, PCW_WIDGET_BUILD_VIEW_HQ, !local && p->location_of_house == 0);
-			SetWindowWidgetHiddenState(w, PCW_WIDGET_RELOCATE_HQ,      !local || p->location_of_house == 0);
-			SetWindowWidgetHiddenState(w, PCW_WIDGET_BUY_SHARE,        local);
-			SetWindowWidgetHiddenState(w, PCW_WIDGET_SELL_SHARE,       local);
-			SetWindowWidgetHiddenState(w, PCW_WIDGET_COMPANY_PASSWORD, !local || !_networking);
+			w->SetWidgetDisabledState(PCW_WIDGET_BUILD_VIEW_HQ, !local && p->location_of_house == 0);
+			w->SetWidgetHiddenState(PCW_WIDGET_RELOCATE_HQ,      !local || p->location_of_house == 0);
+			w->SetWidgetHiddenState(PCW_WIDGET_BUY_SHARE,        local);
+			w->SetWidgetHiddenState(PCW_WIDGET_SELL_SHARE,       local);
+			w->SetWidgetHiddenState(PCW_WIDGET_COMPANY_PASSWORD, !local || !_networking);
 
 			if (!local) {
 				if (_patches.allow_shares) { // Shares are allowed
 					/* If all shares are owned by someone (none by nobody), disable buy button */
-					SetWindowWidgetDisabledState(w, PCW_WIDGET_BUY_SHARE, GetAmountOwnedBy(p, PLAYER_SPECTATOR) == 0 ||
+					w->SetWidgetDisabledState(PCW_WIDGET_BUY_SHARE, GetAmountOwnedBy(p, PLAYER_SPECTATOR) == 0 ||
 							/* Only 25% left to buy. If the player is human, disable buying it up.. TODO issues! */
 							(GetAmountOwnedBy(p, PLAYER_SPECTATOR) == 1 && !p->is_ai) ||
 							/* Spectators cannot do anything of course */
 							_local_player == PLAYER_SPECTATOR);
 
 					/* If the player doesn't own any shares, disable sell button */
-					SetWindowWidgetDisabledState(w, PCW_WIDGET_SELL_SHARE, (GetAmountOwnedBy(p, _local_player) == 0) ||
+					w->SetWidgetDisabledState(PCW_WIDGET_SELL_SHARE, (GetAmountOwnedBy(p, _local_player) == 0) ||
 							/* Spectators cannot do anything of course */
 							_local_player == PLAYER_SPECTATOR);
 				} else { // Shares are not allowed, disable buy/sell buttons
-					DisableWindowWidget(w, PCW_WIDGET_BUY_SHARE);
-					DisableWindowWidget(w, PCW_WIDGET_SELL_SHARE);
+					w->DisableWidget(PCW_WIDGET_BUY_SHARE);
+					w->DisableWidget(PCW_WIDGET_SELL_SHARE);
 				}
 			}
 
@@ -725,23 +1111,30 @@
 
 			DrawWindowWidgets(w);
 
-			SetDParam(0, p->inaugurated_year);
-			DrawString(110, 25, STR_7038_INAUGURATED, 0);
-
-			DrawPlayerVehiclesAmount((PlayerID)w->window_number);
-
-			DrawString(110, 48, STR_7006_COLOR_SCHEME, 0);
-			/* Draw company-colour bus */
-			DrawSprite(SPR_VEH_BUS_SW_VIEW, PLAYER_SPRITE_COLOR(p->index), 215, 49);
-
+			/* Player face */
 			DrawPlayerFace(p->face, p->player_color, 2, 16);
 
+			/* "xxx (Manager)" */
 			SetDParam(0, p->index);
 			DrawStringMultiCenter(48, 141, STR_7037_PRESIDENT, 94);
 
+			/* "Inaugurated:" */
+			SetDParam(0, p->inaugurated_year);
+			DrawString(110, 23, STR_7038_INAUGURATED, TC_FROMSTRING);
+
+			/* "Colour scheme:" */
+			DrawString(110, 43, STR_7006_COLOR_SCHEME, TC_FROMSTRING);
+			/* Draw company-colour bus */
+			DrawSprite(SPR_VEH_BUS_SW_VIEW, PLAYER_SPRITE_COLOR(p->index), 215, 44);
+
+			/* "Vehicles:" */
+			DrawPlayerVehiclesAmount((PlayerID)w->window_number);
+
+			/* "Company value:" */
 			SetDParam(0, CalculateCompanyValue(p));
-			DrawString(110, 114, STR_7076_COMPANY_VALUE, 0);
+			DrawString(110, 106, STR_7076_COMPANY_VALUE, TC_FROMSTRING);
 
+			/* Shares list */
 			DrawCompanyOwnerText(p);
 
 			break;
@@ -749,15 +1142,7 @@
 
 		case WE_CLICK:
 			switch (e->we.click.widget) {
-				case PCW_WIDGET_NEW_FACE: {
-					Window *wf = AllocateWindowDescFront(&_select_player_face_desc, w->window_number);
-					if (wf != NULL) {
-						wf->caption_color = w->window_number;
-						WP(wf, facesel_d).face = GetPlayer((PlayerID)wf->window_number)->face;
-						WP(wf, facesel_d).gender = 0;
-					}
-					break;
-				}
+				case PCW_WIDGET_NEW_FACE: DoSelectPlayerFace((PlayerID)w->window_number, false); break;
 
 				case PCW_WIDGET_COLOR_SCHEME: {
 					Window *wf = AllocateWindowDescFront(_loaded_newgrf_features.has_2CC ? &_select_player_livery_2cc_desc : &_select_player_livery_desc, w->window_number);
@@ -765,7 +1150,7 @@
 						wf->caption_color = wf->window_number;
 						WP(wf, livery_d).livery_class = LC_OTHER;
 						WP(wf, livery_d).sel = 1;
-						LowerWindowWidget(wf, 2);
+						wf->LowerWidget(2);
 					}
 					break;
 				}
@@ -791,9 +1176,9 @@
 					if (tile == 0) {
 						if ((byte)w->window_number != _local_player)
 							return;
-						SetObjectToPlaceWnd(SPR_CURSOR_HQ, PAL_NONE, 1, w);
+						SetObjectToPlaceWnd(SPR_CURSOR_HQ, PAL_NONE, VHM_RECT, w);
 						SetTileSelectSize(2, 2);
-						LowerWindowWidget(w, PCW_WIDGET_BUILD_VIEW_HQ);
+						w->LowerWidget(PCW_WIDGET_BUILD_VIEW_HQ);
 						InvalidateWidget(w, PCW_WIDGET_BUILD_VIEW_HQ);
 					} else {
 						ScrollMainWindowToTile(tile);
@@ -802,9 +1187,9 @@
 				}
 
 				case PCW_WIDGET_RELOCATE_HQ:
-					SetObjectToPlaceWnd(SPR_CURSOR_HQ, PAL_NONE, 1, w);
+					SetObjectToPlaceWnd(SPR_CURSOR_HQ, PAL_NONE, VHM_RECT, w);
 					SetTileSelectSize(2, 2);
-					LowerWindowWidget(w, PCW_WIDGET_RELOCATE_HQ);
+					w->LowerWidget(PCW_WIDGET_RELOCATE_HQ);
 					InvalidateWidget(w, PCW_WIDGET_RELOCATE_HQ);
 					break;
 
@@ -816,15 +1201,11 @@
 					DoCommandP(0, w->window_number, 0, NULL, CMD_SELL_SHARE_IN_COMPANY | CMD_MSG(STR_707C_CAN_T_SELL_25_SHARE_IN));
 					break;
 
-				#ifdef ENABLE_NETWORK
+#ifdef ENABLE_NETWORK
 				case PCW_WIDGET_COMPANY_PASSWORD:
-					if (w->window_number == _local_player) {
-						WP(w, def_d).byte_1 = 2;
-						ShowQueryString(BindCString(_network_player_info[_local_player].password),
-							STR_SET_COMPANY_PASSWORD, sizeof(_network_player_info[_local_player].password), 250, w, CS_ALPHANUMERAL);
-					}
+					if (w->window_number == _local_player) ShowNetworkCompanyPasswordWindow();
 					break;
-				#endif /* ENABLE_NETWORK */
+#endif /* ENABLE_NETWORK */
 			}
 			break;
 
@@ -846,15 +1227,13 @@
 
 		case WE_DESTROY:
 			DeleteWindowById(WC_PLAYER_FACE, w->window_number);
+			if (w->window_number == _local_player) DeleteWindowById(WC_COMPANY_PASSWORD_WINDOW, 0);
 			break;
 
-		case WE_ON_EDIT_TEXT: {
-			char *b = e->we.edittext.str;
+		case WE_ON_EDIT_TEXT:
+			if (StrEmpty(e->we.edittext.str)) return;
 
-			/* empty string is allowed for password */
-			if (*b == '\0' && WP(w, def_d).byte_1 != 2) return;
-
-			_cmd_text = b;
+			_cmd_text = e->we.edittext.str;
 			switch (WP(w, def_d).byte_1) {
 				case 0: /* Change president name */
 					DoCommandP(0, 0, 0, NULL, CMD_CHANGE_PRESIDENT_NAME | CMD_MSG(STR_700D_CAN_T_CHANGE_PRESIDENT));
@@ -862,15 +1241,8 @@
 				case 1: /* Change company name */
 					DoCommandP(0, 0, 0, NULL, CMD_CHANGE_COMPANY_NAME | CMD_MSG(STR_700C_CAN_T_CHANGE_COMPANY_NAME));
 					break;
-				#ifdef ENABLE_NETWORK
-				case 2: /* Change company password */
-					if (*b == '\0') *b = '*'; // empty password is a '*' because of console argument
-					NetworkChangeCompanyPassword(1, &b);
-					break;
-				#endif /* ENABLE_NETWORK */
 			}
 			break;
-		}
 	}
 }
 
@@ -1025,10 +1397,10 @@
 		/* Draw Highscore peepz */
 		for (i = 0; i < lengthof(_highscore_table[0]); i++) {
 			SetDParam(0, i + 1);
-			DrawString(x + 40, y + 140 + (i * 55), STR_0212, 0x10);
+			DrawString(x + 40, y + 140 + (i * 55), STR_0212, TC_BLACK);
 
 			if (hs[i].company[0] != '\0') {
-				uint16 colour = (WP(w, highscore_d).rank == (int8)i) ? 0x3 : 0x10; // draw new highscore in red
+				TextColour colour = (WP(w, highscore_d).rank == (int8)i) ? TC_RED : TC_BLACK; // draw new highscore in red
 
 				DoDrawString(hs[i].company, x + 71, y + 140 + (i * 55), colour);
 				SetDParam(0, hs[i].title);
--- a/src/players.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/players.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -28,6 +28,7 @@
 #include "window.h"
 #include "player_face.h"
 #include "group.h"
+#include "settings.h"
 
 /**
  * Sets the local player and updates the patch settings that are set on a
@@ -89,12 +90,12 @@
 	PlayerFace pf = 0;
 	GenderEthnicity ge = GE_WM;
 
-	if (HASBIT(face, 31)) SetBitT(ge, GENDER_FEMALE);
-	if (HASBIT(face, 27) && (HASBIT(face, 26) == HASBIT(face, 19))) SetBitT(ge, ETHNICITY_BLACK);
+	if (HasBit(face, 31)) SetBit(ge, GENDER_FEMALE);
+	if (HasBit(face, 27) && (HasBit(face, 26) == HasBit(face, 19))) SetBit(ge, ETHNICITY_BLACK);
 
 	SetPlayerFaceBits(pf, PFV_GEN_ETHN,    ge, ge);
 	SetPlayerFaceBits(pf, PFV_HAS_GLASSES, ge, GB(face, 28, 3) <= 1);
-	SetPlayerFaceBits(pf, PFV_EYE_COLOUR,  ge, clampu(GB(face, 20, 3), 5, 7) - 5);
+	SetPlayerFaceBits(pf, PFV_EYE_COLOUR,  ge, HasBit(ge, ETHNICITY_BLACK) ? 0 : ClampU(GB(face, 20, 3), 5, 7) - 5);
 	SetPlayerFaceBits(pf, PFV_CHIN,        ge, ScalePlayerFaceValue(PFV_CHIN,     ge, GB(face,  4, 2)));
 	SetPlayerFaceBits(pf, PFV_EYEBROWS,    ge, ScalePlayerFaceValue(PFV_EYEBROWS, ge, GB(face,  6, 4)));
 	SetPlayerFaceBits(pf, PFV_HAIR,        ge, ScalePlayerFaceValue(PFV_HAIR,     ge, GB(face, 16, 4)));
@@ -103,14 +104,14 @@
 	SetPlayerFaceBits(pf, PFV_GLASSES,     ge, GB(face, 28, 1));
 
 	uint lips = GB(face, 10, 4);
-	if (!HASBIT(ge, GENDER_FEMALE) && lips < 4) {
+	if (!HasBit(ge, GENDER_FEMALE) && lips < 4) {
 		SetPlayerFaceBits(pf, PFV_HAS_MOUSTACHE, ge, true);
 		SetPlayerFaceBits(pf, PFV_MOUSTACHE,     ge, max(lips, 1U) - 1);
 	} else {
-		if (!HASBIT(ge, GENDER_FEMALE)) {
+		if (!HasBit(ge, GENDER_FEMALE)) {
 			lips = lips * 15 / 16;
 			lips -= 3;
-			if (HASBIT(ge, ETHNICITY_BLACK) && lips > 8) lips = 0;
+			if (HasBit(ge, ETHNICITY_BLACK) && lips > 8) lips = 0;
 		} else {
 			lips = ScalePlayerFaceValue(PFV_LIPS, ge, lips);
 		}
@@ -126,9 +127,9 @@
 	}
 
 	uint tie_earring = GB(face, 24, 4);
-	if (!HASBIT(ge, GENDER_FEMALE) || tie_earring < 3) { // Not all females have an earring
-		if (HASBIT(ge, GENDER_FEMALE)) SetPlayerFaceBits(pf, PFV_HAS_TIE_EARRING, ge, true);
-		SetPlayerFaceBits(pf, PFV_TIE_EARRING, ge, HASBIT(ge, GENDER_FEMALE) ? tie_earring : ScalePlayerFaceValue(PFV_TIE_EARRING, ge, tie_earring / 2));
+	if (!HasBit(ge, GENDER_FEMALE) || tie_earring < 3) { // Not all females have an earring
+		if (HasBit(ge, GENDER_FEMALE)) SetPlayerFaceBits(pf, PFV_HAS_TIE_EARRING, ge, true);
+		SetPlayerFaceBits(pf, PFV_TIE_EARRING, ge, HasBit(ge, GENDER_FEMALE) ? tie_earring : ScalePlayerFaceValue(PFV_TIE_EARRING, ge, tie_earring / 2));
 	}
 
 	return pf;
@@ -145,8 +146,8 @@
 	if (!ArePlayerFaceBitsValid(pf, PFV_GEN_ETHN, GE_WM)) return false;
 
 	GenderEthnicity ge   = (GenderEthnicity)GetPlayerFaceBits(pf, PFV_GEN_ETHN, GE_WM);
-	bool has_moustache   = !HASBIT(ge, GENDER_FEMALE) && GetPlayerFaceBits(pf, PFV_HAS_MOUSTACHE,   ge) != 0;
-	bool has_tie_earring = !HASBIT(ge, GENDER_FEMALE) || GetPlayerFaceBits(pf, PFV_HAS_TIE_EARRING, ge) != 0;
+	bool has_moustache   = !HasBit(ge, GENDER_FEMALE) && GetPlayerFaceBits(pf, PFV_HAS_MOUSTACHE,   ge) != 0;
+	bool has_tie_earring = !HasBit(ge, GENDER_FEMALE) || GetPlayerFaceBits(pf, PFV_HAS_TIE_EARRING, ge) != 0;
 	bool has_glasses     = GetPlayerFaceBits(pf, PFV_HAS_GLASSES, ge) != 0;
 
 	if (!ArePlayerFaceBitsValid(pf, PFV_EYE_COLOUR, ge)) return false;
@@ -196,14 +197,14 @@
 	tmp.AddCost(cost);
 	p->yearly_expenses[0][_yearly_expenses_type] = tmp.GetCost();
 
-	if (HASBIT(1 << EXPENSES_TRAIN_INC    |
+	if (HasBit(1 << EXPENSES_TRAIN_INC    |
 	           1 << EXPENSES_ROADVEH_INC  |
 	           1 << EXPENSES_AIRCRAFT_INC |
 	           1 << EXPENSES_SHIP_INC, _yearly_expenses_type)) {
 		tmp = CommandCost(p->cur_economy.income);
 		tmp.AddCost(-cost.GetCost());
 		p->cur_economy.income = tmp.GetCost();
-	} else if (HASBIT(1 << EXPENSES_TRAIN_RUN    |
+	} else if (HasBit(1 << EXPENSES_TRAIN_RUN    |
 	                  1 << EXPENSES_ROADVEH_RUN  |
 	                  1 << EXPENSES_AIRCRAFT_RUN |
 	                  1 << EXPENSES_SHIP_RUN     |
@@ -298,7 +299,7 @@
 
 	t = ClosestTownFromTile(tile, (uint)-1);
 
-	if (IS_INT_INSIDE(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST+1)) {
+	if (IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST+1)) {
 		str = t->townnametype - SPECSTR_TOWNNAME_START + SPECSTR_PLAYERNAME_START;
 		strp = t->townnameparts;
 
@@ -455,6 +456,12 @@
 	}
 }
 
+/**
+ * Create a new player and sets all player variables default values
+ *
+ * @param is_ai is a ai player?
+ * @return the player struct
+ */
 Player *DoStartupNewPlayer(bool is_ai)
 {
 	Player *p;
@@ -478,14 +485,14 @@
 	p->avail_railtypes = GetPlayerRailtypes(p->index);
 	p->avail_roadtypes = GetPlayerRoadtypes(p->index);
 	p->inaugurated_year = _cur_year;
-	p->face = ConvertFromOldPlayerFace(Random());
+	RandomPlayerFaceBits(p->face, (GenderEthnicity)Random(), false); // create a random player face
 
 	/* Engine renewal settings */
 	p->engine_renew_list = NULL;
 	p->renew_keep_length = false;
-	p->engine_renew = false;
-	p->engine_renew_months = -6;
-	p->engine_renew_money = 100000;
+	p->engine_renew = _patches_newgame.autorenew;
+	p->engine_renew_months = _patches_newgame.autorenew_months;
+	p->engine_renew_money = _patches_newgame.autorenew_money;
 
 	GeneratePresidentName(p);
 
@@ -590,13 +597,13 @@
 		const Engine* e = GetEngine(i);
 		const EngineInfo *ei = EngInfo(i);
 
-		if (e->type == VEH_TRAIN && HASBIT(ei->climates, _opt.landscape) &&
-				(HASBIT(e->player_avail, p) || _date >= e->intro_date + 365)) {
+		if (e->type == VEH_TRAIN && HasBit(ei->climates, _opt.landscape) &&
+				(HasBit(e->player_avail, p) || _date >= e->intro_date + 365)) {
 			const RailVehicleInfo *rvi = RailVehInfo(i);
 
 			if (rvi->railveh_type != RAILVEH_WAGON) {
 				assert(rvi->railtype < RAILTYPE_END);
-				SETBIT(rt, rvi->railtype);
+				SetBit(rt, rvi->railtype);
 			}
 		}
 	}
@@ -613,9 +620,9 @@
 		const Engine* e = GetEngine(i);
 		const EngineInfo *ei = EngInfo(i);
 
-		if (e->type == VEH_ROAD && HASBIT(ei->climates, _opt.landscape) &&
-				(HASBIT(e->player_avail, p) || _date >= e->intro_date + 365)) {
-			SETBIT(rt, HASBIT(ei->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
+		if (e->type == VEH_ROAD && HasBit(ei->climates, _opt.landscape) &&
+				(HasBit(e->player_avail, p) || _date >= e->intro_date + 365)) {
+			SetBit(rt, HasBit(ei->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
 		}
 	}
 
@@ -670,11 +677,11 @@
 	p = GetPlayer(_current_player);
 	switch (GB(p1, 0, 3)) {
 		case 0:
-			if (p->engine_renew == (bool)GB(p2, 0, 1))
+			if (p->engine_renew == HasBit(p2, 0))
 				return CMD_ERROR;
 
 			if (flags & DC_EXEC) {
-				p->engine_renew = (bool)GB(p2, 0, 1);
+				p->engine_renew = HasBit(p2, 0);
 				if (IsLocalPlayer()) {
 					_patches.autorenew = p->engine_renew;
 					InvalidateWindow(WC_GAME_OPTIONS, 0);
@@ -728,7 +735,7 @@
 					return CMD_ERROR;
 
 				/* make sure that the player can actually buy the new engine */
-				if (!HASBIT(GetEngine(new_engine_type)->player_avail, _current_player))
+				if (!HasBit(GetEngine(new_engine_type)->player_avail, _current_player))
 					return CMD_ERROR;
 
 				cost = AddEngineReplacementForPlayer(p, old_engine_type, new_engine_type, id_g, flags);
@@ -743,7 +750,7 @@
 
 		case 4:
 			if (flags & DC_EXEC) {
-				p->engine_renew = (bool)GB(p1, 15, 1);
+				p->engine_renew = HasBit(p1, 15);
 				p->engine_renew_months = (int16)GB(p1, 16, 16);
 				p->engine_renew_money = (uint32)p2;
 
@@ -756,11 +763,11 @@
 			}
 			break;
 		case 5:
-			if (p->renew_keep_length == (bool)GB(p2, 0, 1))
+			if (p->renew_keep_length == HasBit(p2, 0))
 				return CMD_ERROR;
 
 			if (flags & DC_EXEC) {
-				p->renew_keep_length = (bool)GB(p2, 0, 1);
+				p->renew_keep_length = HasBit(p2, 0);
 				if (IsLocalPlayer()) {
 					InvalidateWindow(WC_REPLACE_VEHICLE, VEH_TRAIN);
 				}
@@ -841,6 +848,10 @@
 		if (_local_player != _network_playas && _network_playas == p->index) {
 			assert(_local_player == PLAYER_SPECTATOR);
 			SetLocalPlayer(p->index);
+			if (!StrEmpty(_network_default_company_pass)) {
+				char *password = _network_default_company_pass;
+				NetworkChangeCompanyPassword(1, &password);
+			}
 			MarkWholeScreenDirty();
 		}
 
--- a/src/rail.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/rail.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -103,6 +103,16 @@
 	TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_X_SW, TRACKDIR_Y_NW,
 };
 
+extern const TrackBits _corner_to_trackbits[] = {
+	TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_RIGHT, TRACK_BIT_UPPER,
+};
+
+/* The default multiplier for the cost of building different types of railway
+ * track, which will be divided by 8. Can be changed by newgrf files. */
+const int _default_railtype_cost_multiplier[RAILTYPE_END] = {
+	8, 12, 16, 24,
+};
+int _railtype_cost_multiplier[RAILTYPE_END];
 
 RailType GetTileRailType(TileIndex tile)
 {
--- a/src/rail.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/rail.h	Mon Dec 03 23:39:38 2007 +0000
@@ -8,6 +8,7 @@
 #include "gfx.h"
 #include "direction.h"
 #include "tile.h"
+#include "variables.h"
 
 /**
  * Enumeration for all possible railtypes.
@@ -120,6 +121,19 @@
 	return TrackToTrackBits(AxisToTrack(a));
 }
 
+/**
+ * Returns a single horizontal/vertical trackbit, that is in a specific tile corner.
+ *
+ * @param corner The corner of a tile.
+ * @return The TrackBits of the track in the corner.
+ */
+static inline TrackBits CornerToTrackBits(Corner corner)
+{
+	extern const TrackBits _corner_to_trackbits[];
+	assert(IsValidCorner(corner));
+	return _corner_to_trackbits[corner];
+}
+
 
 /**
  * Enumeration for tracks and directions.
@@ -298,7 +312,7 @@
 {
 	if (*tracks != TRACK_BIT_NONE && *tracks != INVALID_TRACK_BIT) {
 		Track first = (Track)FIND_FIRST_BIT(*tracks);
-		ClrBitT(*tracks, first);
+		ClrBit(*tracks, first);
 		return first;
 	}
 	return INVALID_TRACK;
@@ -322,7 +336,7 @@
 {
 	if (*trackdirs != TRACKDIR_BIT_NONE && *trackdirs != INVALID_TRACKDIR_BIT) {
 		Trackdir first = (Trackdir)FindFirstBit2x64(*trackdirs);
-		ClrBitT(*trackdirs, first);
+		ClrBit(*trackdirs, first);
 		return first;
 	}
 	return INVALID_TRACKDIR;
@@ -356,7 +370,7 @@
  */
 static inline Track TrackBitsToTrack(TrackBits tracks)
 {
-	assert(tracks == INVALID_TRACK_BIT || (tracks != TRACK_BIT_NONE && KILL_FIRST_BIT(tracks & TRACK_BIT_MASK) == 0));
+	assert(tracks == INVALID_TRACK_BIT || (tracks != TRACK_BIT_NONE && KillFirstBit(tracks & TRACK_BIT_MASK) == TRACK_BIT_NONE));
 	return tracks != INVALID_TRACK_BIT ? (Track)FIND_FIRST_BIT(tracks & TRACK_BIT_MASK) : INVALID_TRACK;
 }
 
@@ -745,7 +759,7 @@
  */
 static inline bool IsCompatibleRail(RailType enginetype, RailType tiletype)
 {
-	return HASBIT(GetRailTypeInfo(enginetype)->compatible_railtypes, tiletype);
+	return HasBit(GetRailTypeInfo(enginetype)->compatible_railtypes, tiletype);
 }
 
 /**
@@ -758,7 +772,7 @@
  */
 static inline bool HasPowerOnRail(RailType enginetype, RailType tiletype)
 {
-	return HASBIT(GetRailTypeInfo(enginetype)->powered_railtypes, tiletype);
+	return HasBit(GetRailTypeInfo(enginetype)->powered_railtypes, tiletype);
 }
 
 /**
@@ -771,13 +785,28 @@
 static inline bool TracksOverlap(TrackBits bits)
 {
 	/* With no, or only one track, there is no overlap */
-	if (bits == 0 || KILL_FIRST_BIT(bits) == 0) return false;
+	if (bits == TRACK_BIT_NONE || KillFirstBit(bits) == TRACK_BIT_NONE) return false;
 	/* We know that there are at least two tracks present. When there are more
 	 * than 2 tracks, they will surely overlap. When there are two, they will
 	 * always overlap unless they are lower & upper or right & left. */
 	return bits != TRACK_BIT_HORZ && bits != TRACK_BIT_VERT;
 }
 
+
+extern int _railtype_cost_multiplier[RAILTYPE_END];
+extern const int _default_railtype_cost_multiplier[RAILTYPE_END];
+
+/**
+ * Returns the cost of building the specified railtype.
+ * @param railtype The railtype being built.
+ * @return The cost multiplier.
+ */
+static inline Money RailBuildCost(RailType railtype)
+{
+	assert(railtype < RAILTYPE_END);
+	return (_price.build_rail * _railtype_cost_multiplier[railtype]) >> 3;
+}
+
 void *UpdateTrainPowerProc(Vehicle *v, void *data);
 void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
 void DrawDefaultWaypointSprite(int x, int y, RailType railtype);
@@ -792,6 +821,8 @@
 
 Foundation GetRailFoundation(Slope tileh, TrackBits bits);
 
+void FloodHalftile(TileIndex t);
+
 int32 SettingsDisableElrail(int32 p1); ///< _patches.disable_elrail callback
 
 #endif /* RAIL_H */
--- a/src/rail_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/rail_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -40,6 +40,8 @@
 #include "train.h"
 #include "misc/autoptr.hpp"
 #include "autoslope.h"
+#include "transparency.h"
+#include "water.h"
 
 const byte _track_sloped_sprites[14] = {
 	14, 15, 22, 13,
@@ -150,10 +152,8 @@
 }
 
 
-static const TrackBits _valid_tileh_slopes[][15] = {
-
-/* set of normal ones */
-{
+/** Valid TrackBits on a specific (non-steep)-slope without foundation */
+static const TrackBits _valid_tracks_without_foundation[15] = {
 	TRACK_BIT_ALL,
 	TRACK_BIT_RIGHT,
 	TRACK_BIT_UPPER,
@@ -172,10 +172,10 @@
 	TRACK_BIT_X,
 	TRACK_BIT_UPPER,
 	TRACK_BIT_RIGHT,
-},
-
-/* allowed rail for an evenly raised platform */
-{
+};
+
+/** Valid TrackBits on a specific (non-steep)-slope with leveled foundation */
+static const TrackBits _valid_tracks_on_leveled_foundation[15] = {
 	TRACK_BIT_NONE,
 	TRACK_BIT_LEFT,
 	TRACK_BIT_LOWER,
@@ -194,62 +194,111 @@
 	TRACK_BIT_Y | TRACK_BIT_UPPER | TRACK_BIT_RIGHT,
 	TRACK_BIT_ALL,
 	TRACK_BIT_ALL
-}
 };
 
+/**
+ * Checks if a track combination is valid on a specific slope and returns the needed foundation.
+ *
+ * @param tileh Tile slope.
+ * @param bits  Trackbits.
+ * @return Needed foundation or FOUNDATION_INVALID if track/slope combination is not allowed.
+ */
 Foundation GetRailFoundation(Slope tileh, TrackBits bits)
 {
-	if (!IsSteepSlope(tileh)) {
-		if ((~_valid_tileh_slopes[0][tileh] & bits) == 0) return FOUNDATION_NONE;
-		if ((~_valid_tileh_slopes[1][tileh] & bits) == 0) return FOUNDATION_LEVELED;
-	}
-
-	switch (bits) {
-		default: NOT_REACHED();
-		case TRACK_BIT_X:     return FOUNDATION_INCLINED_X;
-		case TRACK_BIT_Y:     return FOUNDATION_INCLINED_Y;
-		case TRACK_BIT_LEFT:  return (tileh == SLOPE_STEEP_W ? FOUNDATION_STEEP_HIGHER : FOUNDATION_STEEP_LOWER);
-		case TRACK_BIT_LOWER: return (tileh == SLOPE_STEEP_S ? FOUNDATION_STEEP_HIGHER : FOUNDATION_STEEP_LOWER);
-		case TRACK_BIT_RIGHT: return (tileh == SLOPE_STEEP_E ? FOUNDATION_STEEP_HIGHER : FOUNDATION_STEEP_LOWER);
-		case TRACK_BIT_UPPER: return (tileh == SLOPE_STEEP_N ? FOUNDATION_STEEP_HIGHER : FOUNDATION_STEEP_LOWER);
+	if (bits == TRACK_BIT_NONE) return FOUNDATION_NONE;
+
+	if (IsSteepSlope(tileh)) {
+		/* Test for inclined foundations */
+		if (bits == TRACK_BIT_X) return FOUNDATION_INCLINED_X;
+		if (bits == TRACK_BIT_Y) return FOUNDATION_INCLINED_Y;
+
+		/* Get higher track */
+		Corner highest_corner = GetHighestSlopeCorner(tileh);
+		TrackBits higher_track = CornerToTrackBits(highest_corner);
+
+		/* Only higher track? */
+		if (bits == higher_track) return HalftileFoundation(highest_corner);
+
+		/* Overlap with higher track? */
+		if (TracksOverlap(bits | higher_track)) return FOUNDATION_INVALID;
+
+		/* either lower track or both higher and lower track */
+		return ((bits & higher_track) != 0 ? FOUNDATION_STEEP_BOTH : FOUNDATION_STEEP_LOWER);
+	} else {
+		if ((~_valid_tracks_without_foundation[tileh] & bits) == 0) return FOUNDATION_NONE;
+
+		bool valid_on_leveled = ((~_valid_tracks_on_leveled_foundation[tileh] & bits) == 0);
+
+		Corner track_corner;
+		switch (bits) {
+			case TRACK_BIT_LEFT:  track_corner = CORNER_W; break;
+			case TRACK_BIT_LOWER: track_corner = CORNER_S; break;
+			case TRACK_BIT_RIGHT: track_corner = CORNER_E; break;
+			case TRACK_BIT_UPPER: track_corner = CORNER_N; break;
+
+			case TRACK_BIT_HORZ:
+				if (tileh == SLOPE_N) return HalftileFoundation(CORNER_N);
+				if (tileh == SLOPE_S) return HalftileFoundation(CORNER_S);
+				return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID);
+
+			case TRACK_BIT_VERT:
+				if (tileh == SLOPE_W) return HalftileFoundation(CORNER_W);
+				if (tileh == SLOPE_E) return HalftileFoundation(CORNER_E);
+				return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID);
+
+			case TRACK_BIT_X:
+				if (HasSlopeHighestCorner(tileh)) return FOUNDATION_INCLINED_X;
+				return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID);
+
+			case TRACK_BIT_Y:
+				if (HasSlopeHighestCorner(tileh)) return FOUNDATION_INCLINED_Y;
+				return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID);
+
+			default:
+				return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID);
+		}
+		/* Single diagonal track */
+
+		/* Track must be at least valid on leveled foundation */
+		if (!valid_on_leveled) return FOUNDATION_INVALID;
+
+		/* If slope has three raised corners, build leveled foundation */
+		if (HasSlopeHighestCorner(ComplementSlope(tileh))) return FOUNDATION_LEVELED;
+
+		/* If neighboured corners of track_corner are lowered, build halftile foundation */
+		if ((tileh & SlopeWithThreeCornersRaised(OppositeCorner(track_corner))) == SlopeWithOneCornerRaised(track_corner)) return HalftileFoundation(track_corner);
+
+		/* else special anti-zig-zag foundation */
+		return SpecialRailFoundation(track_corner);
 	}
 }
 
 
+/**
+ * Tests if a track can be build on a tile.
+ *
+ * @param tileh Tile slope.
+ * @param rail_bits Tracks to build.
+ * @param existing Tracks already built.
+ * @param tile Tile (used for water test)
+ * @return Error message or cost for foundation building.
+ */
 static CommandCost CheckRailSlope(Slope tileh, TrackBits rail_bits, TrackBits existing, TileIndex tile)
 {
-	if (IsSteepSlope(tileh)) {
-		if (_patches.build_on_slopes && existing == 0) {
-			/* 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;
-
-		/* don't allow building on the lower side of a coast */
-		if (IsTileType(tile, MP_WATER) &&
-				~_valid_tileh_slopes[1][tileh] & rail_bits) {
-			return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER);
-		}
-
-		/* no special foundation */
-		if ((~_valid_tileh_slopes[0][tileh] & rail_bits) == 0) {
-			return CommandCost();
-		} else if (!_patches.build_on_slopes || _is_old_ai_player) {
-			return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
-		}
-
-		if ((~_valid_tileh_slopes[1][tileh] & rail_bits) == 0 || ( // whole tile is leveled up
-					(rail_bits == TRACK_BIT_X || rail_bits == TRACK_BIT_Y) &&
-					(tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)
-				)) { // partly up
-			return CommandCost((existing != 0) ? 0 : _price.terraform);
-		}
+	/* don't allow building on the lower side of a coast */
+	if (IsTileType(tile, MP_WATER) || (IsTileType(tile, MP_RAILWAY) && (GetRailGroundType(tile) == RAIL_GROUND_WATER))) {
+		if (!IsSteepSlope(tileh) && ((~_valid_tracks_on_leveled_foundation[tileh] & (rail_bits | existing)) != 0)) return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER);
 	}
-	return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
+
+	Foundation f_new = GetRailFoundation(tileh, rail_bits | existing);
+
+	/* check track/slope combination */
+	if ((f_new == FOUNDATION_INVALID) ||
+	    ((f_new != FOUNDATION_NONE) && (!_patches.build_on_slopes || _is_old_ai_player))
+	   ) return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
+
+	Foundation f_old = GetRailFoundation(tileh, existing);
+	return CommandCost(f_new != f_old ? _price.terraform : (Money)0);
 }
 
 /* Validate functions for rail building */
@@ -312,7 +361,7 @@
 		case MP_ROAD:
 #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(M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT), tileh)) {
 				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 			}
 #undef M
@@ -358,6 +407,8 @@
 			/* FALLTHROUGH */
 
 		default:
+			bool water_ground = IsTileType(tile, MP_WATER) && !IsSteepSlope(tileh) && HasSlopeHighestCorner(tileh);
+
 			ret = CheckRailSlope(tileh, trackbit, TRACK_BIT_NONE, tile);
 			if (CmdFailed(ret)) return ret;
 			cost.AddCost(ret);
@@ -366,7 +417,15 @@
 			if (CmdFailed(ret)) return ret;
 			cost.AddCost(ret);
 
-			if (flags & DC_EXEC) MakeRailNormal(tile, _current_player, trackbit, railtype);
+			if (water_ground) {
+				cost.AddCost(-_price.clear_water);
+				cost.AddCost(_price.clear_roughland);
+			}
+
+			if (flags & DC_EXEC) {
+				MakeRailNormal(tile, _current_player, trackbit, railtype);
+				if (water_ground) SetRailGroundType(tile, RAIL_GROUND_WATER);
+			}
 			break;
 	}
 
@@ -376,7 +435,7 @@
 		YapfNotifyTrackLayoutChange(tile, track);
 	}
 
-	return cost.AddCost(_price.build_rail);
+	return cost.AddCost(RailBuildCost(railtype));
 }
 
 /** Remove a single piece of track
@@ -432,7 +491,11 @@
 			if (flags & DC_EXEC) {
 				present ^= trackbit;
 				if (present == 0) {
-					DoClearSquare(tile);
+					if (GetRailGroundType(tile) == RAIL_GROUND_WATER) {
+						MakeShore(tile);
+					} else {
+						DoClearSquare(tile);
+					}
 				} else {
 					SetTrackBits(tile, present);
 				}
@@ -464,6 +527,41 @@
 }
 
 
+/**
+ * Called from water_cmd if a non-flat rail-tile gets flooded and should be converted to shore.
+ * The function floods the lower halftile, if the tile has a halftile foundation.
+ *
+ * @param t The tile to flood.
+ */
+void FloodHalftile(TileIndex t)
+{
+	if (GetRailGroundType(t) == RAIL_GROUND_WATER) return;
+
+	Slope tileh = GetTileSlope(t, NULL);
+	TrackBits rail_bits = GetTrackBits(t);
+
+	if (!IsSteepSlope(tileh) && HasSlopeHighestCorner(tileh)) {
+		TrackBits lower_track = CornerToTrackBits(OppositeCorner(GetHighestSlopeCorner(tileh)));
+
+		TrackBits to_remove = lower_track & rail_bits;
+		if (to_remove != 0) {
+			_current_player = OWNER_WATER;
+			if (CmdFailed(DoCommand(t, 0, FIND_FIRST_BIT(to_remove), DC_EXEC, CMD_REMOVE_SINGLE_RAIL))) return; // not yet floodable
+			rail_bits = rail_bits & ~to_remove;
+			if (rail_bits == 0) {
+				MakeShore(t);
+				MarkTileDirtyByTile(t);
+				return;
+			}
+		}
+
+		if (IsNonContinuousFoundation(GetRailFoundation(tileh, rail_bits))) {
+			SetRailGroundType(t, RAIL_GROUND_WATER);
+			MarkTileDirtyByTile(t);
+		}
+	}
+}
+
 static const TileIndexDiffC _trackdelta[] = {
 	{ -1,  0 }, {  0,  1 }, { -1,  0 }, {  0,  1 }, {  1,  0 }, {  0,  1 },
 	{  0,  0 },
@@ -504,8 +602,8 @@
 		(trdy <= 0 && dy > 0) ||
 		(trdy >= 0 && dy < 0)
 	) {
-		if (!HASBIT(*trackdir, 3)) { // first direction is invalid, try the other
-			SetBitT(*trackdir, 3); // reverse the direction
+		if (!HasBit(*trackdir, 3)) { // first direction is invalid, try the other
+			SetBit(*trackdir, 3); // reverse the direction
 			trdx = -trdx;
 			trdy = -trdy;
 		} else { // other direction is invalid too, invalid drag
@@ -539,7 +637,7 @@
 	CommandCost ret, total_cost;
 	Track track = (Track)GB(p2, 4, 3);
 	Trackdir trackdir;
-	byte mode = HASBIT(p2, 7);
+	byte mode = HasBit(p2, 7);
 	RailType railtype = (RailType)GB(p2, 0, 4);
 	TileIndex end_tile;
 
@@ -569,7 +667,7 @@
 		tile += ToTileIndexDiff(_trackdelta[trackdir]);
 
 		/* toggle railbit for the non-diagonal tracks */
-		if (!IsDiagonalTrackdir(trackdir)) ToggleBitT(trackdir, 0);
+		if (!IsDiagonalTrackdir(trackdir)) ToggleBit(trackdir, 0);
 	}
 
 	return (total_cost.GetCost() == 0) ? CMD_ERROR : total_cost;
@@ -588,7 +686,7 @@
  */
 CommandCost CmdBuildRailroadTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	return CmdRailTrackHelper(tile, flags, p1, CLRBIT(p2, 7));
+	return CmdRailTrackHelper(tile, flags, p1, ClrBit(p2, 7));
 }
 
 /** Build rail on a stretch of track.
@@ -604,7 +702,7 @@
  */
 CommandCost CmdRemoveRailroadTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	return CmdRailTrackHelper(tile, flags, p1, SETBIT(p2, 7));
+	return CmdRailTrackHelper(tile, flags, p1, SetBit(p2, 7));
 }
 
 /** Build a train depot
@@ -678,16 +776,20 @@
  * @param flags operation to perform
  * @param p1 various bitstuffed elements
  * - p1 = (bit 0-2) - track-orientation, valid values: 0-5 (Track enum)
- * - p1 = (bit 3)   - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
+ * - p1 = (bit 3)   - 1 = override signal/semaphore, or pre/exit/combo signal or (for bit 7) toggle variant (CTRL-toggle)
  * - p1 = (bit 4)   - 0 = signals, 1 = semaphores
+ * - p1 = (bit 5-6) - type of the signal, for valid values see enum SignalType in rail_map.h
+ * - p1 = (bit 7)   - convert the present signal type and variant
  * @param p2 used for CmdBuildManySignals() to copy direction of first signal
  * TODO: p2 should be replaced by two bits for "along" and "against" the track.
  */
 CommandCost CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Track track = (Track)GB(p1, 0, 3);
-	bool pre_signal = HASBIT(p1, 3);
-	SignalVariant sigvar = (pre_signal ^ HASBIT(p1, 4)) ? SIG_SEMAPHORE : SIG_ELECTRIC;
+	bool ctrl_pressed = HasBit(p1, 3); // was the CTRL button pressed
+	SignalVariant sigvar = (ctrl_pressed ^ HasBit(p1, 4)) ? SIG_SEMAPHORE : SIG_ELECTRIC; // the signal variant of the new signal
+	SignalType sigtype = (SignalType)GB(p1, 5, 2); // the signal type of the new signal
+	bool convert_signal = HasBit(p1, 7); // convert button pressed
 	CommandCost cost;
 
 	if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoTrainOnTrack(tile, track))
@@ -701,18 +803,19 @@
 
 	if (!CheckTileOwnership(tile)) return CMD_ERROR;
 
-	_error_message = STR_1005_NO_SUITABLE_RAILROAD_TRACK;
-
 	{
 		/* See if this is a valid track combination for signals, (ie, no overlap) */
 		TrackBits trackbits = GetTrackBits(tile);
-		if (KILL_FIRST_BIT(trackbits) != 0 && /* More than one track present */
+		if (KillFirstBit(trackbits) != TRACK_BIT_NONE && /* More than one track present */
 				trackbits != TRACK_BIT_HORZ &&
 				trackbits != TRACK_BIT_VERT) {
-			return CMD_ERROR;
+			return_cmd_error(STR_1005_NO_SUITABLE_RAILROAD_TRACK);
 		}
 	}
 
+	/* you can not convert a signal if no signal is on track */
+	if (convert_signal && !HasSignalOnTrack(tile, track)) return CMD_ERROR;
+
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
 	if (!HasSignalOnTrack(tile, track)) {
@@ -722,6 +825,17 @@
 		if (p2 != 0 && sigvar != GetSignalVariant(tile, track)) {
 			/* convert signals <-> semaphores */
 			cost = CommandCost(_price.build_signals + _price.remove_signals);
+
+		} else if (convert_signal) {
+			/* convert button pressed */
+			if (ctrl_pressed || GetSignalVariant(tile, track) != sigvar) {
+				/* convert electric <-> semaphore */
+				cost = CommandCost(_price.build_signals + _price.remove_signals);
+			} else {
+				/* it is free to change signal type: normal-pre-exit-combo */
+				cost = CommandCost();
+			}
+
 		} else {
 			/* it is free to change orientation/pre-exit-combo signals */
 			cost = CommandCost();
@@ -734,7 +848,7 @@
 			SetHasSignals(tile, true);
 			SetSignalStates(tile, 0xF); // all signals are on
 			SetPresentSignals(tile, 0); // no signals built by default
-			SetSignalType(tile, track, SIGTYPE_NORMAL);
+			SetSignalType(tile, track, sigtype);
 			SetSignalVariant(tile, track, sigvar);
 		}
 
@@ -742,15 +856,28 @@
 			if (!HasSignalOnTrack(tile, track)) {
 				/* build new signals */
 				SetPresentSignals(tile, GetPresentSignals(tile) | SignalOnTrack(track));
-				SetSignalType(tile, track, SIGTYPE_NORMAL);
+				SetSignalType(tile, track, sigtype);
 				SetSignalVariant(tile, track, sigvar);
 			} else {
-				if (pre_signal) {
+				if (convert_signal) {
+					/* convert signal button pressed */
+					if (ctrl_pressed) {
+						/* toggle the pressent signal variant: SIG_ELECTRIC <-> SIG_SEMAPHORE */
+						SetSignalVariant(tile, track, (GetSignalVariant(tile, track) == SIG_ELECTRIC) ? SIG_SEMAPHORE : SIG_ELECTRIC);
+
+					} else {
+						/* convert the present signal to the chosen type and variant */
+						SetSignalType(tile, track, sigtype);
+						SetSignalVariant(tile, track, sigvar);
+					}
+
+				} else if (ctrl_pressed) {
 					/* cycle between normal -> pre -> exit -> combo -> ... */
-					SignalType type = GetSignalType(tile, track);
-
-					SetSignalType(tile, track, type == SIGTYPE_COMBO ? SIGTYPE_NORMAL : (SignalType)(type + 1));
+					sigtype = GetSignalType(tile, track);
+
+					SetSignalType(tile, track, sigtype == SIGTYPE_COMBO ? SIGTYPE_NORMAL : (SignalType)(sigtype + 1));
 				} else {
+					/* cycle the signal side: both -> left -> right -> both -> ... */
 					CycleSignalSide(tile, track);
 				}
 			}
@@ -798,7 +925,7 @@
 			if (IsDiagonalTrackdir(trackdir)) {
 				signal_ctr++;
 				/* Ensure signal_ctr even so X and Y pieces get signals */
-				CLRBIT(signal_ctr, 0);
+				ClrBit(signal_ctr, 0);
 			}
 			return true;
 
@@ -849,10 +976,10 @@
 	TileIndex start_tile = tile;
 
 	Track track = (Track)GB(p2, 0, 3);
-	bool mode = HASBIT(p2, 3);
-	bool semaphores = HASBIT(p2, 4);
-	bool remove = HASBIT(p2, 5);
-	bool autofill = HASBIT(p2, 6);
+	bool mode = HasBit(p2, 3);
+	bool semaphores = HasBit(p2, 4);
+	bool remove = HasBit(p2, 5);
+	bool autofill = HasBit(p2, 6);
 	Trackdir trackdir = TrackToTrackdir(track);
 	byte signal_density = GB(p2, 24, 8);
 
@@ -888,8 +1015,8 @@
 	}
 
 	byte signal_dir = 0;
-	if (signals & SignalAlongTrackdir(trackdir))   SETBIT(signal_dir, 0);
-	if (signals & SignalAgainstTrackdir(trackdir)) SETBIT(signal_dir, 1);
+	if (signals & SignalAlongTrackdir(trackdir))   SetBit(signal_dir, 0);
+	if (signals & SignalAgainstTrackdir(trackdir)) SetBit(signal_dir, 1);
 
 	/* signal_ctr         - amount of tiles already processed
 	 * signals_density    - patch setting to put signal on every Nth tile (double space on |, -- tracks)
@@ -909,8 +1036,8 @@
 
 			/* Pick the correct orientation for the track direction */
 			signals = 0;
-			if (HASBIT(signal_dir, 0)) signals |= SignalAlongTrackdir(trackdir);
-			if (HASBIT(signal_dir, 1)) signals |= SignalAgainstTrackdir(trackdir);
+			if (HasBit(signal_dir, 0)) signals |= SignalAlongTrackdir(trackdir);
+			if (HasBit(signal_dir, 1)) signals |= SignalAgainstTrackdir(trackdir);
 
 			ret = DoCommand(tile, p1, signals, flags, remove ? CMD_REMOVE_SIGNALS : CMD_BUILD_SIGNALS);
 
@@ -936,7 +1063,7 @@
 			if (IsDiagonalTrackdir(trackdir)) {
 				signal_ctr++;
 			} else {
-				ToggleBitT(trackdir, 0);
+				ToggleBit(trackdir, 0);
 			}
 		}
 	}
@@ -1024,7 +1151,7 @@
  */
 CommandCost CmdRemoveSignalTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	return CmdSignalTrackHelper(tile, flags, p1, SETBIT(p2, 5)); // bit 5 is remove bit
+	return CmdSignalTrackHelper(tile, flags, p1, SetBit(p2, 5)); // bit 5 is remove bit
 }
 
 typedef CommandCost DoConvertRailProc(TileIndex tile, RailType totype, bool exec);
@@ -1074,7 +1201,7 @@
 		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 	}
 
-	return CommandCost(_price.build_rail / 2);
+	return CommandCost(RailBuildCost(totype) / 2);
 }
 
 extern CommandCost DoConvertStationRail(TileIndex tile, RailType totype, bool exec);
@@ -1197,6 +1324,8 @@
 	switch (GetRailTileType(tile)) {
 		case RAIL_TILE_SIGNALS:
 		case RAIL_TILE_NORMAL: {
+			bool water_ground = (GetRailGroundType(tile) == RAIL_GROUND_WATER);
+
 			TrackBits tracks = GetTrackBits(tile);
 			while (tracks != TRACK_BIT_NONE) {
 				Track track = RemoveFirstTrack(&tracks);
@@ -1204,6 +1333,13 @@
 				if (CmdFailed(ret)) return CMD_ERROR;
 				cost.AddCost(ret);
 			}
+
+			if (water_ground) {
+				/* The track was removed, and left a coast tile. Now also clear the water. */
+				if (flags & DC_EXEC) DoClearSquare(tile);
+				cost.AddCost(_price.clear_water);
+			}
+
 			return cost;
 		}
 
@@ -1220,6 +1356,22 @@
 
 #include "table/track_land.h"
 
+/**
+ * Get surface height in point (x,y)
+ * On tiles with halftile foundations move (x,y) to a save point wrt. track
+ */
+static uint GetSaveSlopeZ(uint x, uint y, Track track)
+{
+	switch (track) {
+		case TRACK_UPPER: x &= ~0xF; y &= ~0xF; break;
+		case TRACK_LOWER: x |=  0xF; y |=  0xF; break;
+		case TRACK_LEFT:  x |=  0xF; y &= ~0xF; break;
+		case TRACK_RIGHT: x &= ~0xF; y |=  0xF; break;
+		default: break;
+	}
+	return GetSlopeZ(x, y);
+}
+
 static void DrawSingleSignal(TileIndex tile, Track track, byte condition, uint image, uint pos)
 {
 	bool side = (_opt.road_side != 0) && _patches.signal_side;
@@ -1254,16 +1406,13 @@
 
 	SpriteID sprite;
 
-	/* _signal_base is set by our NewGRF Action 5 loader. If it is 0 then we
-	 * just draw the standard signals, else we get the offset from _signal_base
-	 * and draw that sprite. All the signal sprites are loaded sequentially. */
-	if (_signal_base == 0 || (GetSignalType(tile, track) == SIGTYPE_NORMAL && GetSignalVariant(tile, track) == SIG_ELECTRIC)) {
+	if (GetSignalType(tile, track) == SIGTYPE_NORMAL && GetSignalVariant(tile, track) == SIG_ELECTRIC) {
 		sprite = SignalBase[side][GetSignalVariant(tile, track)][GetSignalType(tile, track)] + image + condition;
 	} else {
-		sprite = _signal_base + (GetSignalType(tile, track) - 1) * 16 + GetSignalVariant(tile, track) * 64 + image + condition;
+		sprite = SPR_SIGNALS_BASE + (GetSignalType(tile, track) - 1) * 16 + GetSignalVariant(tile, track) * 64 + image + condition;
 	}
 
-	AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, GetSlopeZ(x,y));
+	AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, GetSaveSlopeZ(x, y, track));
 }
 
 static uint32 _drawtile_track_palette;
@@ -1320,6 +1469,7 @@
 {
 	int z = ti->z;
 	if (ti->tileh & SLOPE_W) z += TILE_HEIGHT;
+	if (IsSteepSlope(ti->tileh)) z += TILE_HEIGHT;
 	AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_VERT, _drawtile_track_palette,
 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
 }
@@ -1331,6 +1481,7 @@
 {
 	int z = ti->z;
 	if (ti->tileh & SLOPE_E) z += TILE_HEIGHT;
+	if (IsSteepSlope(ti->tileh)) z += TILE_HEIGHT;
 	AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_VERT, _drawtile_track_palette,
 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
 }
@@ -1342,6 +1493,7 @@
 {
 	int z = ti->z;
 	if (ti->tileh & SLOPE_N) z += TILE_HEIGHT;
+	if (IsSteepSlope(ti->tileh)) z += TILE_HEIGHT;
 	AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_HORZ, _drawtile_track_palette,
 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
 }
@@ -1353,6 +1505,7 @@
 {
 	int z = ti->z;
 	if (ti->tileh & SLOPE_S) z += TILE_HEIGHT;
+	if (IsSteepSlope(ti->tileh)) z += TILE_HEIGHT;
 	AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_HORZ, _drawtile_track_palette,
 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
 }
@@ -1371,6 +1524,15 @@
 		case RAIL_GROUND_FENCE_VERT2:  DrawTrackFence_NS_2(ti);  break;
 		case RAIL_GROUND_FENCE_HORIZ1: DrawTrackFence_WE_1(ti);  break;
 		case RAIL_GROUND_FENCE_HORIZ2: DrawTrackFence_WE_2(ti);  break;
+		case RAIL_GROUND_WATER:
+			switch (GetHalftileSlopeCorner(ti->tileh)) {
+				case CORNER_W: DrawTrackFence_NS_1(ti); break;
+				case CORNER_S: DrawTrackFence_WE_2(ti); break;
+				case CORNER_E: DrawTrackFence_NS_2(ti); break;
+				case CORNER_N: DrawTrackFence_WE_1(ti); break;
+				default: NOT_REACHED();
+			}
+			break;
 		default: break;
 	}
 }
@@ -1384,41 +1546,69 @@
 static void DrawTrackBits(TileInfo* ti, TrackBits track)
 {
 	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
+	RailGroundType rgt = GetRailGroundType(ti->tile);
+	Foundation f = GetRailFoundation(ti->tileh, track);
+	Corner halftile_corner = CORNER_INVALID;
+
+	if (IsNonContinuousFoundation(f)) {
+		/* Save halftile corner */
+		halftile_corner = (f == FOUNDATION_STEEP_BOTH ? GetHighestSlopeCorner(ti->tileh) : GetHalftileFoundationCorner(f));
+		/* Draw lower part first */
+		track &= ~CornerToTrackBits(halftile_corner);
+		f = (f == FOUNDATION_STEEP_BOTH ? FOUNDATION_STEEP_LOWER : FOUNDATION_NONE);
+	}
+
+	DrawFoundation(ti, f);
+	/* DrawFoundation modifies ti */
+
 	SpriteID image;
 	SpriteID pal = PAL_NONE;
 	bool junction = false;
 
 	/* Select the sprite to use. */
-	(image = rti->base_sprites.track_y, track == TRACK_BIT_Y) ||
-	(image++,                           track == TRACK_BIT_X) ||
-	(image++,                           track == TRACK_BIT_UPPER) ||
-	(image++,                           track == TRACK_BIT_LOWER) ||
-	(image++,                           track == TRACK_BIT_RIGHT) ||
-	(image++,                           track == TRACK_BIT_LEFT) ||
-	(image++,                           track == TRACK_BIT_CROSS) ||
-
-	(image = rti->base_sprites.track_ns, track == TRACK_BIT_HORZ) ||
-	(image++,                            track == TRACK_BIT_VERT) ||
-
-	(junction = true, false) ||
-	(image = rti->base_sprites.ground, (track & TRACK_BIT_3WAY_NE) == 0) ||
-	(image++,                          (track & TRACK_BIT_3WAY_SW) == 0) ||
-	(image++,                          (track & TRACK_BIT_3WAY_NW) == 0) ||
-	(image++,                          (track & TRACK_BIT_3WAY_SE) == 0) ||
-	(image++, true);
-
-	if (ti->tileh != SLOPE_FLAT) {
-		DrawFoundation(ti, GetRailFoundation(ti->tileh, track));
-
-		/* DrawFoundation() modifies it.
-		 * Default sloped sprites.. */
-		if (ti->tileh != SLOPE_FLAT) image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y;
-	}
-
-	switch (GetRailGroundType(ti->tile)) {
-		case RAIL_GROUND_BARREN:     pal = PALETTE_TO_BARE_LAND; break;
-		case RAIL_GROUND_ICE_DESERT: image += rti->snow_offset; break;
-		default: break;
+	if (track == 0) {
+		/* Clear ground (only track on halftile foundation) */
+		if (rgt == RAIL_GROUND_WATER) {
+			image = SPR_FLAT_WATER_TILE;
+		} else {
+			switch (rgt) {
+				case RAIL_GROUND_BARREN:     image = SPR_FLAT_BARE_LAND;  break;
+				case RAIL_GROUND_ICE_DESERT: image = SPR_FLAT_SNOWY_TILE; break;
+				default:                     image = SPR_FLAT_GRASS_TILE; break;
+			}
+			image += _tileh_to_sprite[ti->tileh];
+		}
+	} else {
+		if (ti->tileh != SLOPE_FLAT) {
+			/* track on non-flat ground */
+			image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y;
+		} else {
+			/* track on flat ground */
+			(image = rti->base_sprites.track_y, track == TRACK_BIT_Y) ||
+			(image++,                           track == TRACK_BIT_X) ||
+			(image++,                           track == TRACK_BIT_UPPER) ||
+			(image++,                           track == TRACK_BIT_LOWER) ||
+			(image++,                           track == TRACK_BIT_RIGHT) ||
+			(image++,                           track == TRACK_BIT_LEFT) ||
+			(image++,                           track == TRACK_BIT_CROSS) ||
+
+			(image = rti->base_sprites.track_ns, track == TRACK_BIT_HORZ) ||
+			(image++,                            track == TRACK_BIT_VERT) ||
+
+			(junction = true, false) ||
+			(image = rti->base_sprites.ground, (track & TRACK_BIT_3WAY_NE) == 0) ||
+			(image++,                          (track & TRACK_BIT_3WAY_SW) == 0) ||
+			(image++,                          (track & TRACK_BIT_3WAY_NW) == 0) ||
+			(image++,                          (track & TRACK_BIT_3WAY_SE) == 0) ||
+			(image++, true);
+		}
+
+		switch (rgt) {
+			case RAIL_GROUND_BARREN:     pal = PALETTE_TO_BARE_LAND; break;
+			case RAIL_GROUND_ICE_DESERT: image += rti->snow_offset;  break;
+			case RAIL_GROUND_WATER:      NOT_REACHED();
+			default: break;
+		}
 	}
 
 	DrawGroundSprite(image, pal);
@@ -1432,6 +1622,30 @@
 		if (track & TRACK_BIT_LEFT)  DrawGroundSprite(rti->base_sprites.single_w, PAL_NONE);
 		if (track & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e, PAL_NONE);
 	}
+
+	if (IsValidCorner(halftile_corner)) {
+		DrawFoundation(ti, HalftileFoundation(halftile_corner));
+
+		/* Draw higher halftile-overlay: Use the sloped sprites with three corners raised. They probably best fit the lightning. */
+		Slope fake_slope = SlopeWithThreeCornersRaised(OppositeCorner(halftile_corner));
+		image = _track_sloped_sprites[fake_slope - 1] + rti->base_sprites.track_y;
+		pal = PAL_NONE;
+		switch (rgt) {
+			case RAIL_GROUND_BARREN:     pal = PALETTE_TO_BARE_LAND; break;
+			case RAIL_GROUND_ICE_DESERT: image += rti->snow_offset;  break;
+			default: break;
+		}
+
+		static const int INF = 1000; // big number compared to tilesprite size
+		static const SubSprite _halftile_sub_sprite[4] = {
+			{ -INF    , -INF  , 32 - 33, INF     }, // CORNER_W, clip 33 pixels from right
+			{ -INF    ,  0 + 7, INF    , INF     }, // CORNER_S, clip 7 pixels from top
+			{ -31 + 33, -INF  , INF    , INF     }, // CORNER_E, clip 33 pixels from left
+			{ -INF    , -INF  , INF    , 30 - 23 }  // CORNER_N, clip 23 pixels from bottom
+		};
+
+		DrawGroundSprite(image, pal, &(_halftile_sub_sprite[halftile_corner]));
+	}
 }
 
 static void DrawSignals(TileIndex tile, TrackBits rails)
@@ -1478,7 +1692,7 @@
 
 		DrawTrackBits(ti, rails);
 
-		if (HASBIT(_display_opt, DO_FULL_DETAIL)) DrawTrackDetails(ti);
+		if (HasBit(_display_opt, DO_FULL_DETAIL)) DrawTrackDetails(ti);
 
 		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
 
@@ -1518,7 +1732,7 @@
 				const Station* st = ComposeWaypointStation(ti->tile);
 				uint gfx = 2;
 
-				if (HASBIT(statspec->callbackmask, CBM_STATION_SPRITE_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;
 				}
@@ -1533,7 +1747,7 @@
 					relocation = GetCustomStationRelocation(statspec, st, ti->tile);
 
 					image = dts->ground_sprite;
-					if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
+					if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 						image += GetCustomStationGroundRelocation(statspec, st, ti->tile);
 						image += rti->custom_ground_offset;
 					} else {
@@ -1563,13 +1777,13 @@
 			/* Unlike stations, our default waypoint has no variation for
 			 * different railtype, so don't use the railtype offset if
 			 * no relocation is set */
-			if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
+			if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 				image += rti->total_offset;
 			} else {
 				image += relocation;
 			}
 
-			if (!HASBIT(_transparent_opt, TO_BUILDINGS) && HASBIT(image, PALETTE_MODIFIER_COLOR)) {
+			if (!IsTransparencySet(TO_BUILDINGS) && HasBit(image, PALETTE_MODIFIER_COLOR)) {
 				pal = _drawtile_track_palette;
 			} else {
 				pal = dtss->pal;
@@ -1581,7 +1795,7 @@
 					ti->x + dtss->delta_x, ti->y + dtss->delta_y,
 					dtss->size_x, dtss->size_y,
 					dtss->size_z, ti->z + dtss->delta_z,
-					HASBIT(_transparent_opt, TO_BUILDINGS)
+					IsTransparencySet(TO_BUILDINGS)
 				);
 			} else {
 				AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y);
@@ -1601,7 +1815,7 @@
 		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
 		SpriteID image = dtss->image + offset;
 
-		DrawSprite(image, HASBIT(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE, x + pt.x, y + pt.y);
+		DrawSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE, x + pt.x, y + pt.y);
 	}
 }
 
@@ -1917,6 +2131,11 @@
 	RailGroundType old_ground = GetRailGroundType(tile);
 	RailGroundType new_ground;
 
+	if (old_ground == RAIL_GROUND_WATER) {
+		TileLoop_Water(tile);
+		return;
+	}
+
 	switch (_opt.landscape) {
 		case LT_ARCTIC:
 			if (GetTileZ(tile) > GetSnowLine()) {
@@ -2216,26 +2435,29 @@
 	z_old += ApplyFoundationToSlope(GetRailFoundation(tileh_old, rail_bits), &tileh_old);
 	z_new += ApplyFoundationToSlope(GetRailFoundation(tileh_new, rail_bits), &tileh_new);
 
-	Slope track_corner;
+	Corner 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;
+		case TRACK_BIT_LEFT:  track_corner = CORNER_W; break;
+		case TRACK_BIT_LOWER: track_corner = CORNER_S; break;
+		case TRACK_BIT_RIGHT: track_corner = CORNER_E; break;
+		case TRACK_BIT_UPPER: track_corner = CORNER_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;
+	z_old += GetSlopeZInCorner((Slope)(tileh_old & ~SLOPE_HALFTILE_MASK), track_corner);
+	z_new += GetSlopeZInCorner((Slope)(tileh_new & ~SLOPE_HALFTILE_MASK), track_corner);
 	if (z_old != z_new) return CMD_ERROR;
 
+	CommandCost cost = CommandCost(_price.terraform);
 	/* 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;
+	if (tileh_old != tileh_new) {
+		if (GetRailGroundType(tile) == RAIL_GROUND_WATER) cost.AddCost(_price.clear_water);
+		if ((flags & DC_EXEC) != 0) SetRailGroundType(tile, RAIL_GROUND_BARREN);
+	}
+	return  cost;
 }
 
 static CommandCost TerraformTile_Track(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
@@ -2244,6 +2466,7 @@
 	Slope tileh_old = GetTileSlope(tile, &z_old);
 	if (IsPlainRailTile(tile)) {
 		TrackBits rail_bits = GetTrackBits(tile);
+		bool was_water = GetRailGroundType(tile) == RAIL_GROUND_WATER;
 
 		_error_message = STR_1008_MUST_REMOVE_RAILROAD_TRACK;
 
@@ -2251,59 +2474,31 @@
 		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;
+		Corner allowed_corner;
 		switch (rail_bits) {
-			case TRACK_BIT_RIGHT: allowed_corner = SLOPE_W; break;
-			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;
+			case TRACK_BIT_RIGHT: allowed_corner = CORNER_W; break;
+			case TRACK_BIT_UPPER: allowed_corner = CORNER_S; break;
+			case TRACK_BIT_LEFT:  allowed_corner = CORNER_E; break;
+			case TRACK_BIT_LOWER: allowed_corner = CORNER_N; break;
 			default: return autoslope_result;
 		}
 
-		Slope track_corners = ComplementSlope(allowed_corner);
-
 		Foundation f_old = GetRailFoundation(tileh_old, rail_bits);
-		switch (f_old) {
-			case FOUNDATION_NONE:
-				/* Everything is valid, which only changes allowed_corner */
-
-				/* Compute height of track */
-				if (tileh_old == track_corners) z_old += TILE_HEIGHT;
-				if (tileh_new == track_corners) {
-					z_new += TILE_HEIGHT;
-				} else {
-					/* do not build a foundation */
-					if ((tileh_new != SLOPE_FLAT) && (tileh_new != allowed_corner)) return autoslope_result;
-				}
-
-				/* Track height must remain unchanged */
-				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 autoslope_result;
-
-				/* allowed_corner may only be raised -> steep slope */
-				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 autoslope_result;
-				break;
-
-			case FOUNDATION_STEEP_HIGHER:
-				return autoslope_result;
-
-			default: NOT_REACHED();
+
+		/* Do not allow terraforming if allowed_corner is part of anti-zig-zag foundations */
+		if (tileh_old != SLOPE_NS && tileh_old != SLOPE_EW && IsSpecialRailFoundation(f_old)) return autoslope_result;
+
+		/* Everything is valid, which only changes allowed_corner */
+		for (Corner corner = (Corner)0; corner < CORNER_END; corner = (Corner)(corner + 1)) {
+			if (allowed_corner == corner) continue;
+			if (z_old + GetSlopeZInCorner(tileh_old, corner) != z_new + GetSlopeZInCorner(tileh_new, corner)) return autoslope_result;
 		}
 
 		/* Make the ground dirty */
 		if ((flags & DC_EXEC) != 0) SetRailGroundType(tile, RAIL_GROUND_BARREN);
 
-		/* allow terraforming, no extra costs */
-		return CommandCost();
+		/* allow terraforming */
+		return (was_water ? CommandCost(_price.clear_water) : CommandCost());
 	} else {
 		if (_patches.build_on_slopes && AutoslopeEnabled()) {
 			switch (GetRailTileType(tile)) {
--- a/src/rail_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/rail_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -38,6 +38,9 @@
 static DiagDirection _build_depot_direction;
 static byte _waypoint_count = 1;
 static byte _cur_waypoint_type;
+static bool _convert_signal_button; // convert signal button in the signal GUI pressed
+static SignalVariant _cur_signal_variant; // set the signal variant (for signal GUI)
+static SignalType _cur_signal_type; // set the signal type (for signal GUI)
 
 static struct {
 	byte orientation;
@@ -56,6 +59,7 @@
 static void ShowBuildTrainDepotPicker();
 static void ShowBuildWaypointPicker();
 static void ShowStationBuilder();
+static void ShowSignalBuilder();
 
 void CcPlaySound1E(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
@@ -65,7 +69,7 @@
 static void GenericPlaceRail(TileIndex tile, int cmd)
 {
 	DoCommandP(tile, _cur_railtype, cmd, CcPlaySound1E,
-		_remove_button_clicked ?
+		(_remove_button_clicked || _ctrl_pressed) ?
 		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
 	);
@@ -139,10 +143,10 @@
 
 static void PlaceRail_Waypoint(TileIndex tile)
 {
-	if (!_remove_button_clicked) {
+	if (_remove_button_clicked || _ctrl_pressed) {
+		DoCommandP(tile, 0, 0, CcPlaySound1E, CMD_REMOVE_TRAIN_WAYPOINT | CMD_MSG(STR_CANT_REMOVE_TRAIN_WAYPOINT));
+	} else {
 		DoCommandP(tile, _cur_waypoint_type, 0, CcPlaySound1E, CMD_BUILD_TRAIN_WAYPOINT | CMD_MSG(STR_CANT_BUILD_TRAIN_WAYPOINT));
-	} else {
-		DoCommandP(tile, 0, 0, CcPlaySound1E, CMD_REMOVE_TRAIN_WAYPOINT | CMD_MSG(STR_CANT_REMOVE_TRAIN_WAYPOINT));
 	}
 }
 
@@ -170,6 +174,11 @@
 	}
 }
 
+/**
+ * Build a new signal or edit/remove a present signal, use CmdBuildSingleSignal() or CmdRemoveSingleSignal() in rail_cmd.cpp
+ *
+ * @param tile The tile where the signal will build or edit
+ */
 static void GenericPlaceSignals(TileIndex tile)
 {
 	TrackBits trackbits = (TrackBits)GB(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0), 0, 6);
@@ -184,16 +193,21 @@
 
 	Track track = FindFirstTrack(trackbits);
 
-	if (!_remove_button_clicked) {
+	if (_remove_button_clicked) {
+		DoCommandP(tile, track, 0, CcPlaySound1E,
+			CMD_REMOVE_SIGNALS | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM));
+	} else {
+		if (!_patches.enable_signal_gui) _cur_signal_variant = _cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC;
+
+		/* various bitstuffed elements for CmdBuildSingleSignal() */
 		uint32 p1 = track;
 		SB(p1, 3, 1, _ctrl_pressed);
-		SB(p1, 4, 1, _cur_year < _patches.semaphore_build_before);
+		SB(p1, 4, 1, _cur_signal_variant);
+		SB(p1, 5, 2, _patches.enable_signal_gui ? _cur_signal_type : SIGTYPE_NORMAL);
+		SB(p1, 7, 1, _convert_signal_button);
 
-		DoCommandP(tile, p1, 0, CcPlaySound1E,
-			CMD_BUILD_SIGNALS | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE));
-	} else {
-		DoCommandP(tile, track, 0, CcPlaySound1E,
-			CMD_REMOVE_SIGNALS | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM));
+		DoCommandP(tile, p1, 0, CcPlaySound1E, CMD_BUILD_SIGNALS |
+			CMD_MSG(_convert_signal_button ? STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_1010_CAN_T_BUILD_SIGNALS_HERE));
 	}
 }
 
@@ -235,43 +249,45 @@
 
 
 /** Enum referring to the widgets of the build rail toolbar */
-enum {
-	RTW_CAPTION        =  1,
-	RTW_BUILD_NS       =  4,
-	RTW_BUILD_X        =  5,
-	RTW_BUILD_EW       =  6,
-	RTW_BUILD_Y        =  7,
-	RTW_AUTORAIL       =  8,
-	RTW_DEMOLISH       =  9,
-	RTW_BUILD_DEPOT    = 10,
-	RTW_BUILD_WAYPOINT = 11,
-	RTW_BUILD_STATION  = 12,
-	RTW_BUILD_SIGNALS  = 13,
-	RTW_BUILD_BRIDGE   = 14,
-	RTW_BUILD_TUNNEL   = 15,
-	RTW_REMOVE         = 16,
-	RTW_CONVERT_RAIL   = 17
+enum RailToolbarWidgets {
+	RTW_CLOSEBOX = 0,
+	RTW_CAPTION,
+	RTW_STICKY,
+	RTW_SPACER,
+	RTW_BUILD_NS,
+	RTW_BUILD_X,
+	RTW_BUILD_EW,
+	RTW_BUILD_Y,
+	RTW_AUTORAIL,
+	RTW_DEMOLISH,
+	RTW_BUILD_DEPOT,
+	RTW_BUILD_WAYPOINT,
+	RTW_BUILD_STATION,
+	RTW_BUILD_SIGNALS,
+	RTW_BUILD_BRIDGE,
+	RTW_BUILD_TUNNEL,
+	RTW_REMOVE,
+	RTW_CONVERT_RAIL,
 };
 
-
 static void BuildRailClick_N(Window *w)
 {
-	HandlePlacePushButton(w, RTW_BUILD_NS, GetRailTypeInfo(_cur_railtype)->cursor.rail_ns, 1, PlaceRail_N);
+	HandlePlacePushButton(w, RTW_BUILD_NS, GetRailTypeInfo(_cur_railtype)->cursor.rail_ns, VHM_RECT, PlaceRail_N);
 }
 
 static void BuildRailClick_NE(Window *w)
 {
-	HandlePlacePushButton(w, RTW_BUILD_X, GetRailTypeInfo(_cur_railtype)->cursor.rail_swne, 1, PlaceRail_NE);
+	HandlePlacePushButton(w, RTW_BUILD_X, GetRailTypeInfo(_cur_railtype)->cursor.rail_swne, VHM_RECT, PlaceRail_NE);
 }
 
 static void BuildRailClick_E(Window *w)
 {
-	HandlePlacePushButton(w, RTW_BUILD_EW, GetRailTypeInfo(_cur_railtype)->cursor.rail_ew, 1, PlaceRail_E);
+	HandlePlacePushButton(w, RTW_BUILD_EW, GetRailTypeInfo(_cur_railtype)->cursor.rail_ew, VHM_RECT, PlaceRail_E);
 }
 
 static void BuildRailClick_NW(Window *w)
 {
-	HandlePlacePushButton(w, RTW_BUILD_Y, GetRailTypeInfo(_cur_railtype)->cursor.rail_nwse, 1, PlaceRail_NW);
+	HandlePlacePushButton(w, RTW_BUILD_Y, GetRailTypeInfo(_cur_railtype)->cursor.rail_nwse, VHM_RECT, PlaceRail_NW);
 }
 
 static void BuildRailClick_AutoRail(Window *w)
@@ -281,12 +297,12 @@
 
 static void BuildRailClick_Demolish(Window *w)
 {
-	HandlePlacePushButton(w, RTW_DEMOLISH, ANIMCURSOR_DEMOLISH, 1, PlaceProc_DemolishArea);
+	HandlePlacePushButton(w, RTW_DEMOLISH, ANIMCURSOR_DEMOLISH, VHM_RECT, PlaceProc_DemolishArea);
 }
 
 static void BuildRailClick_Depot(Window *w)
 {
-	if (HandlePlacePushButton(w, RTW_BUILD_DEPOT, GetRailTypeInfo(_cur_railtype)->cursor.depot, 1, PlaceRail_Depot)) {
+	if (HandlePlacePushButton(w, RTW_BUILD_DEPOT, GetRailTypeInfo(_cur_railtype)->cursor.depot, VHM_RECT, PlaceRail_Depot)) {
 		ShowBuildTrainDepotPicker();
 	}
 }
@@ -294,7 +310,7 @@
 static void BuildRailClick_Waypoint(Window *w)
 {
 	_waypoint_count = GetNumCustomStations(STAT_CLASS_WAYP);
-	if (HandlePlacePushButton(w, RTW_BUILD_WAYPOINT, SPR_CURSOR_WAYPOINT, 1, PlaceRail_Waypoint) &&
+	if (HandlePlacePushButton(w, RTW_BUILD_WAYPOINT, SPR_CURSOR_WAYPOINT, VHM_RECT, PlaceRail_Waypoint) &&
 			_waypoint_count > 1) {
 		ShowBuildWaypointPicker();
 	}
@@ -302,32 +318,37 @@
 
 static void BuildRailClick_Station(Window *w)
 {
-	if (HandlePlacePushButton(w, RTW_BUILD_STATION, SPR_CURSOR_RAIL_STATION, 1, PlaceRail_Station)) ShowStationBuilder();
+	if (HandlePlacePushButton(w, RTW_BUILD_STATION, SPR_CURSOR_RAIL_STATION, VHM_RECT, PlaceRail_Station)) ShowStationBuilder();
 }
 
+/** The "build signal"-button proc from BuildRailToolbWndProc() (start ShowSignalBuilder() and/or HandleAutoSignalPlacement()) */
 static void BuildRailClick_AutoSignals(Window *w)
 {
-	HandlePlacePushButton(w, RTW_BUILD_SIGNALS, ANIMCURSOR_BUILDSIGNALS, VHM_RECT, PlaceRail_AutoSignals);
+	if (_patches.enable_signal_gui) {
+		if (HandlePlacePushButton(w, RTW_BUILD_SIGNALS, ANIMCURSOR_BUILDSIGNALS, VHM_RECT, PlaceRail_AutoSignals)) ShowSignalBuilder();
+	} else {
+		HandlePlacePushButton(w, RTW_BUILD_SIGNALS, ANIMCURSOR_BUILDSIGNALS, VHM_RECT, PlaceRail_AutoSignals);
+	}
 }
 
 static void BuildRailClick_Bridge(Window *w)
 {
-	HandlePlacePushButton(w, RTW_BUILD_BRIDGE, SPR_CURSOR_BRIDGE, 1, PlaceRail_Bridge);
+	HandlePlacePushButton(w, RTW_BUILD_BRIDGE, SPR_CURSOR_BRIDGE, VHM_RECT, PlaceRail_Bridge);
 }
 
 static void BuildRailClick_Tunnel(Window *w)
 {
-	HandlePlacePushButton(w, RTW_BUILD_TUNNEL, GetRailTypeInfo(_cur_railtype)->cursor.tunnel, 3, PlaceRail_Tunnel);
+	HandlePlacePushButton(w, RTW_BUILD_TUNNEL, GetRailTypeInfo(_cur_railtype)->cursor.tunnel, VHM_SPECIAL, PlaceRail_Tunnel);
 }
 
 static void BuildRailClick_Remove(Window *w)
 {
-	if (IsWindowWidgetDisabled(w, RTW_REMOVE)) return;
+	if (w->IsWidgetDisabled(RTW_REMOVE)) return;
 	SetWindowDirty(w);
 	SndPlayFx(SND_15_BEEP);
 
-	ToggleWidgetLoweredState(w, RTW_REMOVE);
-	_remove_button_clicked = IsWindowWidgetLowered(w, RTW_REMOVE);
+	w->ToggleWidgetLoweredState(RTW_REMOVE);
+	_remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE);
 	SetSelectionRed(_remove_button_clicked);
 
 	// handle station builder
@@ -338,14 +359,14 @@
 
 static void BuildRailClick_Convert(Window *w)
 {
-	HandlePlacePushButton(w, RTW_CONVERT_RAIL, GetRailTypeInfo(_cur_railtype)->cursor.convert, 1, PlaceRail_ConvertRail);
+	HandlePlacePushButton(w, RTW_CONVERT_RAIL, GetRailTypeInfo(_cur_railtype)->cursor.convert, VHM_RECT, PlaceRail_ConvertRail);
 }
 
 
 static void DoRailroadTrack(int mode)
 {
 	DoCommandP(TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), _cur_railtype | (mode << 4), NULL,
-		_remove_button_clicked ?
+		(_remove_button_clicked || _ctrl_pressed) ?
 		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)
 	);
@@ -364,6 +385,12 @@
 	DoRailroadTrack(trackstat);
 }
 
+/**
+ * Build new signals or remove signals or (if only one tile marked) edit a signal.
+ *
+ * If one tile marked abort and use GenericPlaceSignals()
+ * else use CmdBuildSingleSignal() or CmdRemoveSingleSignal() in rail_cmd.cpp to build many signals
+ */
 static void HandleAutoSignalPlacement()
 {
 	TileHighlightData *thd = &_thd;
@@ -433,11 +460,12 @@
 
 static void UpdateRemoveWidgetStatus(Window *w, int clicked_widget)
 {
-	/* If it is the removal button that has been clicked, do nothing,
-	 * as it is up to the other buttons to drive removal status */
-	if (clicked_widget == RTW_REMOVE) return;
-
 	switch (clicked_widget) {
+		case RTW_REMOVE:
+			/* If it is the removal button that has been clicked, do nothing,
+			 * as it is up to the other buttons to drive removal status */
+			return;
+			break;
 		case RTW_BUILD_NS:
 		case RTW_BUILD_X:
 		case RTW_BUILD_EW:
@@ -448,54 +476,60 @@
 		case RTW_BUILD_SIGNALS:
 			/* Removal button is enabled only if the rail/signal/waypoint/station
 			 * button is still lowered.  Once raised, it has to be disabled */
-			SetWindowWidgetDisabledState(w, RTW_REMOVE, !IsWindowWidgetLowered(w, clicked_widget));
+			w->SetWidgetDisabledState(RTW_REMOVE, !w->IsWidgetLowered(clicked_widget));
 			break;
 
 		default:
 			/* When any other buttons than rail/signal/waypoint/station, raise and
-			 * disable the removal button*/
-			DisableWindowWidget(w, RTW_REMOVE);
-			RaiseWindowWidget(w, RTW_REMOVE);
+			 * disable the removal button */
+			w->DisableWidget(RTW_REMOVE);
+			w->RaiseWidget(RTW_REMOVE);
 			break;
 	}
 }
 
+/**
+ * Railway toolbar window event definition
+ *
+ * @param w window pointer
+ * @param e event been triggered
+ */
 static void BuildRailToolbWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: DisableWindowWidget(w, RTW_REMOVE); break;
+	case WE_CREATE: w->DisableWidget(RTW_REMOVE); break;
 
 	case WE_PAINT: DrawWindowWidgets(w); break;
 
 	case WE_CLICK:
-		if (e->we.click.widget >= 4) {
+		if (e->we.click.widget >= RTW_BUILD_NS) {
 			_remove_button_clicked = false;
-			_build_railroad_button_proc[e->we.click.widget - 4](w);
+			_build_railroad_button_proc[e->we.click.widget - RTW_BUILD_NS](w);
 		}
 		UpdateRemoveWidgetStatus(w, e->we.click.widget);
 		break;
 
-	case WE_KEYPRESS: {
-		uint i;
-
-		for (i = 0; i != lengthof(_rail_keycodes); i++) {
+	case WE_KEYPRESS:
+		for (uint8 i = 0; i != lengthof(_rail_keycodes); i++) {
 			if (e->we.keypress.keycode == _rail_keycodes[i]) {
 				e->we.keypress.cont = false;
 				_remove_button_clicked = false;
 				_build_railroad_button_proc[i](w);
-				UpdateRemoveWidgetStatus(w, i + 4);
+				UpdateRemoveWidgetStatus(w, i + RTW_BUILD_NS);
 				break;
 			}
 		}
 		MarkTileDirty(_thd.pos.x, _thd.pos.y); // redraw tile selection
 		break;
-	}
 
 	case WE_PLACE_OBJ:
 		_place_proc(e->we.place.tile);
 		return;
 
 	case WE_PLACE_DRAG: {
+		/* no dragging if you have pressed the convert button */
+		if (_convert_signal_button && w->IsWidgetLowered(RTW_BUILD_SIGNALS)) return;
+
 		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
 		return;
 	}
@@ -511,13 +545,9 @@
 					ShowBuildBridgeWindow(start_tile, end_tile, _cur_railtype);
 					break;
 
-				case DDSP_PLACE_AUTORAIL: {
-					bool old = _remove_button_clicked;
-					if (_ctrl_pressed) _remove_button_clicked = true;
+				case DDSP_PLACE_AUTORAIL:
 					HandleAutodirPlacement();
-					_remove_button_clicked = old;
 					break;
-				}
 
 				case DDSP_BUILD_SIGNALS:
 					HandleAutoSignalPlacement();
@@ -549,13 +579,15 @@
 
 	case WE_ABORT_PLACE_OBJ:
 		RaiseWindowButtons(w);
-		DisableWindowWidget(w, RTW_REMOVE);
+		w->DisableWidget(RTW_REMOVE);
 		InvalidateWidget(w, RTW_REMOVE);
 
+		w = FindWindowById(WC_BUILD_SIGNAL, 0);
+		if (w != NULL) WP(w, def_d).close = true;
 		w = FindWindowById(WC_BUILD_STATION, 0);
-		if (w != NULL) WP(w,def_d).close = true;
+		if (w != NULL) WP(w, def_d).close = true;
 		w = FindWindowById(WC_BUILD_DEPOT, 0);
-		if (w != NULL) WP(w,def_d).close = true;
+		if (w != NULL) WP(w, def_d).close = true;
 		break;
 
 	case WE_PLACE_PRESIZE: {
@@ -571,30 +603,30 @@
 	}
 }
 
-
+/** Widget definition for the rail toolbar */
 static const Widget _build_rail_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                       STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   337,     0,    13, STR_100A_RAILROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   338,   349,     0,    13, 0x0,                            STR_STICKY_BUTTON},
-
-{      WWT_PANEL,   RESIZE_NONE,     7,   110,   113,    14,    35, 0x0,                            STR_NULL},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                       STR_018B_CLOSE_WINDOW},                   // RTW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   337,     0,    13, STR_100A_RAILROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},         // RTW_CAPTION
+{  WWT_STICKYBOX,   RESIZE_NONE,     7,   338,   349,     0,    13, 0x0,                            STR_STICKY_BUTTON},                       // RTW_STICKY
 
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    0,     21,    14,    35, SPR_IMG_RAIL_NS,                STR_1018_BUILD_RAILROAD_TRACK},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_RAIL_NE,                STR_1018_BUILD_RAILROAD_TRACK},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_RAIL_EW,                STR_1018_BUILD_RAILROAD_TRACK},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_RAIL_NW,                STR_1018_BUILD_RAILROAD_TRACK},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_AUTORAIL,               STR_BUILD_AUTORAIL_TIP},
+{      WWT_PANEL,   RESIZE_NONE,     7,   110,   113,    14,    35, 0x0,                            STR_NULL},                                // RTW_SPACER
 
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   114,   135,    14,    35, SPR_IMG_DYNAMITE,               STR_018D_DEMOLISH_BUILDINGS_ETC},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   136,   157,    14,    35, SPR_IMG_DEPOT_RAIL,             STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   158,   179,    14,    35, SPR_IMG_WAYPOINT,               STR_CONVERT_RAIL_TO_WAYPOINT_TIP},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    0,     21,    14,    35, SPR_IMG_RAIL_NS,                STR_1018_BUILD_RAILROAD_TRACK},           // RTW_BUILD_NS
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_RAIL_NE,                STR_1018_BUILD_RAILROAD_TRACK},           // RTW_BUILD_X
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_RAIL_EW,                STR_1018_BUILD_RAILROAD_TRACK},           // RTW_BUILD_EW
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_RAIL_NW,                STR_1018_BUILD_RAILROAD_TRACK},           // RTW_BUILD_Y
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_AUTORAIL,               STR_BUILD_AUTORAIL_TIP},                  // RTW_AUTORAIL
 
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   180,   221,    14,    35, SPR_IMG_RAIL_STATION,           STR_101A_BUILD_RAILROAD_STATION},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   222,   243,    14,    35, SPR_IMG_RAIL_SIGNALS,           STR_101B_BUILD_RAILROAD_SIGNALS},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   244,   285,    14,    35, SPR_IMG_BRIDGE,                 STR_101C_BUILD_RAILROAD_BRIDGE},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   286,   305,    14,    35, SPR_IMG_TUNNEL_RAIL,            STR_101D_BUILD_RAILROAD_TUNNEL},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   306,   327,    14,    35, SPR_IMG_REMOVE,                 STR_101E_TOGGLE_BUILD_REMOVE_FOR},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   328,   349,    14,    35, SPR_IMG_CONVERT_RAIL,           STR_CONVERT_RAIL_TIP},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   114,   135,    14,    35, SPR_IMG_DYNAMITE,               STR_018D_DEMOLISH_BUILDINGS_ETC},         // RTW_DEMOLISH
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   136,   157,    14,    35, SPR_IMG_DEPOT_RAIL,             STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING}, // RTW_BUILD_DEPOT
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   158,   179,    14,    35, SPR_IMG_WAYPOINT,               STR_CONVERT_RAIL_TO_WAYPOINT_TIP},        // RTW_BUILD_WAYPOINT
+
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   180,   221,    14,    35, SPR_IMG_RAIL_STATION,           STR_101A_BUILD_RAILROAD_STATION},         // RTW_BUILD_STATION
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   222,   243,    14,    35, SPR_IMG_RAIL_SIGNALS,           STR_101B_BUILD_RAILROAD_SIGNALS},         // RTW_BUILD_SIGNALS
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   244,   285,    14,    35, SPR_IMG_BRIDGE,                 STR_101C_BUILD_RAILROAD_BRIDGE},          // RTW_BUILD_BRIDGE
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   286,   305,    14,    35, SPR_IMG_TUNNEL_RAIL,            STR_101D_BUILD_RAILROAD_TUNNEL},          // RTW_BUILD_TUNNEL
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   306,   327,    14,    35, SPR_IMG_REMOVE,                 STR_101E_TOGGLE_BUILD_REMOVE_FOR},        // RTW_REMOVE
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   328,   349,    14,    35, SPR_IMG_CONVERT_RAIL,           STR_CONVERT_RAIL_TIP},                    // RTW_CONVERT_RAIL
 
 {   WIDGETS_END},
 };
@@ -644,13 +676,51 @@
 	}
 
 	_remove_button_clicked = false;
-	if (w != NULL && button >= 0) {
+	if (w != NULL && button >= RTW_CLOSEBOX) {
 		_build_railroad_button_proc[button](w);
-		UpdateRemoveWidgetStatus(w, button + 4);
+		UpdateRemoveWidgetStatus(w, button + RTW_BUILD_NS);
 	}
 	if (_patches.link_terraform_toolbar) ShowTerraformToolbar(w);
 }
 
+/** Enum referring to the widgets of the rail stations window */
+enum BuildRailStationWidgets {
+	BRSW_CLOSEBOX = 0,
+	BRSW_CAPTION,
+	BRSW_BACKGROUND,
+
+	BRSW_PLATFORM_DIR_X,
+	BRSW_PLATFORM_DIR_Y,
+
+	BRSW_PLATFORM_NUM_BEGIN = BRSW_PLATFORM_DIR_Y,
+	BRSW_PLATFORM_NUM_1,
+	BRSW_PLATFORM_NUM_2,
+	BRSW_PLATFORM_NUM_3,
+	BRSW_PLATFORM_NUM_4,
+	BRSW_PLATFORM_NUM_5,
+	BRSW_PLATFORM_NUM_6,
+	BRSW_PLATFORM_NUM_7,
+
+	BRSW_PLATFORM_LEN_BEGIN = BRSW_PLATFORM_NUM_7,
+	BRSW_PLATFORM_LEN_1,
+	BRSW_PLATFORM_LEN_2,
+	BRSW_PLATFORM_LEN_3,
+	BRSW_PLATFORM_LEN_4,
+	BRSW_PLATFORM_LEN_5,
+	BRSW_PLATFORM_LEN_6,
+	BRSW_PLATFORM_LEN_7,
+
+	BRSW_PLATFORM_DRAG_N_DROP,
+
+	BRSW_HIGHLIGHT_OFF,
+	BRSW_HIGHLIGHT_ON,
+
+	BRSW_NEWST_DROPDOWN,
+	BRSW_NEWST_DROPDOWN_TEXT,
+	BRSW_NEWST_LIST,
+	BRSW_NEWST_SCROLL
+};
+
 /* TODO: For custom stations, respect their allowed platforms/lengths bitmasks!
  * --pasky */
 
@@ -679,22 +749,22 @@
 {
 	if (statspec == NULL || _railstation.dragdrop) return;
 
-	if (HASBIT(statspec->disallowed_platforms, _railstation.numtracks - 1)) {
-		RaiseWindowWidget(w, _railstation.numtracks + 4);
+	if (HasBit(statspec->disallowed_platforms, _railstation.numtracks - 1)) {
+		w->RaiseWidget(_railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
 		_railstation.numtracks = 1;
-		while (HASBIT(statspec->disallowed_platforms, _railstation.numtracks - 1)) {
+		while (HasBit(statspec->disallowed_platforms, _railstation.numtracks - 1)) {
 			_railstation.numtracks++;
 		}
-		LowerWindowWidget(w, _railstation.numtracks + 4);
+		w->LowerWidget(_railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
 	}
 
-	if (HASBIT(statspec->disallowed_lengths, _railstation.platlength - 1)) {
-		RaiseWindowWidget(w, _railstation.platlength + 11);
+	if (HasBit(statspec->disallowed_lengths, _railstation.platlength - 1)) {
+		w->RaiseWidget(_railstation.platlength + BRSW_PLATFORM_LEN_BEGIN);
 		_railstation.platlength = 1;
-		while (HASBIT(statspec->disallowed_lengths, _railstation.platlength - 1)) {
+		while (HasBit(statspec->disallowed_lengths, _railstation.platlength - 1)) {
 			_railstation.platlength++;
 		}
-		LowerWindowWidget(w, _railstation.platlength + 11);
+		w->LowerWidget(_railstation.platlength + BRSW_PLATFORM_LEN_BEGIN);
 	}
 }
 
@@ -702,26 +772,23 @@
 {
 	switch (e->event) {
 	case WE_CREATE:
-		LowerWindowWidget(w, _railstation.orientation + 3);
+		w->LowerWidget(_railstation.orientation + BRSW_PLATFORM_DIR_X);
 		if (_railstation.dragdrop) {
-			LowerWindowWidget(w, 19);
+			w->LowerWidget(BRSW_PLATFORM_DRAG_N_DROP);
 		} else {
-			LowerWindowWidget(w, _railstation.numtracks + 4);
-			LowerWindowWidget(w, _railstation.platlength + 11);
+			w->LowerWidget(_railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
+			w->LowerWidget(_railstation.platlength + BRSW_PLATFORM_LEN_BEGIN);
 		}
-		SetWindowWidgetLoweredState(w, 20, !_station_show_coverage);
-		SetWindowWidgetLoweredState(w, 21, _station_show_coverage);
+		w->SetWidgetLoweredState(BRSW_HIGHLIGHT_OFF, !_station_show_coverage);
+		w->SetWidgetLoweredState(BRSW_HIGHLIGHT_ON, _station_show_coverage);
 		break;
 
 	case WE_PAINT: {
-		int rad;
-		uint bits;
 		bool newstations = _railstation.newstations;
-		int y_offset;
 		DrawPixelInfo tmp_dpi, *old_dpi;
 		const StationSpec *statspec = newstations ? GetCustomStationSpec(_railstation.station_class, _railstation.station_type) : NULL;
 
-		if (WP(w,def_d).close) return;
+		if (WP(w, def_d).close) return;
 
 		_thd.FSMportLayout = NULL;  // ensure irregular airport support disabled
 		_thd.FSMportMask = NULL;
@@ -736,26 +803,26 @@
 				SetTileSelectSize(x, y);
 		}
 
-		rad = (_patches.modified_catchment) ? CA_TRAIN : 4;
+		int rad = (_patches.modified_catchment) ? CA_TRAIN : 4;
 
 		if (_station_show_coverage)
 			SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
 
-		for (bits = 0; bits < 7; bits++) {
+		for (uint bits = 0; bits < 7; bits++) {
 			bool disable = bits >= _patches.station_spread;
 			if (statspec == NULL) {
-				SetWindowWidgetDisabledState(w, bits +  5, disable);
-				SetWindowWidgetDisabledState(w, bits + 12, disable);
+				w->SetWidgetDisabledState(bits + BRSW_PLATFORM_NUM_1, disable);
+				w->SetWidgetDisabledState(bits + BRSW_PLATFORM_LEN_1, disable);
 			} else {
-				SetWindowWidgetDisabledState(w, bits +  5, HASBIT(statspec->disallowed_platforms, bits) || disable);
-				SetWindowWidgetDisabledState(w, bits + 12, HASBIT(statspec->disallowed_lengths,   bits) || disable);
+				w->SetWidgetDisabledState(bits + BRSW_PLATFORM_NUM_1, HasBit(statspec->disallowed_platforms, bits) || disable);
+				w->SetWidgetDisabledState(bits + BRSW_PLATFORM_LEN_1, HasBit(statspec->disallowed_lengths,   bits) || disable);
 			}
 		}
 
 		SetDParam(0, GetStationClassName(_railstation.station_class));
 		DrawWindowWidgets(w);
 
-		y_offset = newstations ? 90 : 0;
+		int y_offset = newstations ? 90 : 0;
 
 		/* Set up a clipping area for the '/' station preview */
 		if (FillDrawPixelInfo(&tmp_dpi, 7, 26 + y_offset, 66, 48)) {
@@ -777,28 +844,27 @@
 			_cur_dpi = old_dpi;
 		}
 
-		DrawStringCentered(74, 15 + y_offset, STR_3002_ORIENTATION, 0);
-		DrawStringCentered(74, 76 + y_offset, STR_3003_NUMBER_OF_TRACKS, 0);
-		DrawStringCentered(74, 101 + y_offset, STR_3004_PLATFORM_LENGTH, 0);
-		DrawStringCentered(74, 141 + y_offset, STR_3066_COVERAGE_AREA_HIGHLIGHT, 0);
+		DrawStringCentered(74, 15 + y_offset, STR_3002_ORIENTATION, TC_FROMSTRING);
+		DrawStringCentered(74, 76 + y_offset, STR_3003_NUMBER_OF_TRACKS, TC_FROMSTRING);
+		DrawStringCentered(74, 101 + y_offset, STR_3004_PLATFORM_LENGTH, TC_FROMSTRING);
+		DrawStringCentered(74, 141 + y_offset, STR_3066_COVERAGE_AREA_HIGHLIGHT, TC_FROMSTRING);
 
 		DrawStationCoverageAreaText(2, 166 + y_offset, SCT_ALL, rad);
 
 		if (newstations) {
-			uint16 i;
 			uint y = 35;
 
-			for (i = w->vscroll.pos; i < _railstation.station_count && i < (uint)(w->vscroll.pos + w->vscroll.cap); i++) {
+			for (uint16 i = w->vscroll.pos; i < _railstation.station_count && i < (uint)(w->vscroll.pos + w->vscroll.cap); i++) {
 				const StationSpec *statspec = GetCustomStationSpec(_railstation.station_class, i);
 
 				if (statspec != NULL && statspec->name != 0) {
-					if (HASBIT(statspec->callbackmask, CBM_STATION_AVAIL) && GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) {
+					if (HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) {
 						GfxFillRect(8, y - 2, 127, y + 10, (1 << PALETTE_MODIFIER_GREYOUT));
 					}
 
-					DrawStringTruncated(9, y, statspec->name, i == _railstation.station_type ? 12 : 16, 118);
+					DrawStringTruncated(9, y, statspec->name, i == _railstation.station_type ? TC_WHITE : TC_BLACK, 118);
 				} else {
-					DrawStringTruncated(9, y, STR_STAT_CLASS_DFLT, i == _railstation.station_type ? 12 : 16, 118);
+					DrawStringTruncated(9, y, STR_STAT_CLASS_DFLT, i == _railstation.station_type ? TC_WHITE : TC_BLACK, 118);
 				}
 
 				y += 14;
@@ -808,103 +874,125 @@
 
 	case WE_CLICK: {
 		switch (e->we.click.widget) {
-		case 3:
-		case 4:
-			RaiseWindowWidget(w, _railstation.orientation + 3);
-			_railstation.orientation = e->we.click.widget - 3;
-			LowerWindowWidget(w, _railstation.orientation + 3);
+		case BRSW_PLATFORM_DIR_X:
+		case BRSW_PLATFORM_DIR_Y:
+			w->RaiseWidget(_railstation.orientation + BRSW_PLATFORM_DIR_X);
+			_railstation.orientation = e->we.click.widget - BRSW_PLATFORM_DIR_X;
+			w->LowerWidget(_railstation.orientation + BRSW_PLATFORM_DIR_X);
 			SndPlayFx(SND_15_BEEP);
 			SetWindowDirty(w);
 			break;
 
-		case 5:
-		case 6:
-		case 7:
-		case 8:
-		case 9:
-		case 10:
-		case 11: {
-			RaiseWindowWidget(w, _railstation.numtracks + 4);
-			RaiseWindowWidget(w, 19);
+		case BRSW_PLATFORM_NUM_1:
+		case BRSW_PLATFORM_NUM_2:
+		case BRSW_PLATFORM_NUM_3:
+		case BRSW_PLATFORM_NUM_4:
+		case BRSW_PLATFORM_NUM_5:
+		case BRSW_PLATFORM_NUM_6:
+		case BRSW_PLATFORM_NUM_7: {
+			w->RaiseWidget(_railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
+			w->RaiseWidget(BRSW_PLATFORM_DRAG_N_DROP);
 
-			_railstation.numtracks = (e->we.click.widget - 5) + 1;
+			_railstation.numtracks = e->we.click.widget - BRSW_PLATFORM_NUM_BEGIN;
 			_railstation.dragdrop = false;
 
 			const StationSpec *statspec = _railstation.newstations ? GetCustomStationSpec(_railstation.station_class, _railstation.station_type) : NULL;
-			if (statspec != NULL && HASBIT(statspec->disallowed_lengths, _railstation.platlength - 1)) {
+			if (statspec != NULL && HasBit(statspec->disallowed_lengths, _railstation.platlength - 1)) {
 				/* The previously selected number of platforms in invalid */
 				for (uint i = 0; i < 7; i++) {
-					if (!HASBIT(statspec->disallowed_lengths, i)) {
-						RaiseWindowWidget(w, _railstation.platlength + 11);
+					if (!HasBit(statspec->disallowed_lengths, i)) {
+						w->RaiseWidget(_railstation.platlength + BRSW_PLATFORM_LEN_BEGIN);
 						_railstation.platlength = i + 1;
 						break;
 					}
 				}
 			}
 
-			LowerWindowWidget(w, _railstation.platlength + 11);
-			LowerWindowWidget(w, _railstation.numtracks + 4);
+			w->LowerWidget(_railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
+			w->LowerWidget(_railstation.platlength + BRSW_PLATFORM_LEN_BEGIN);
 			SndPlayFx(SND_15_BEEP);
 			SetWindowDirty(w);
 			break;
 		}
 
-		case 12:
-		case 13:
-		case 14:
-		case 15:
-		case 16:
-		case 17:
-		case 18: {
-			RaiseWindowWidget(w, _railstation.platlength + 11);
-			RaiseWindowWidget(w, 19);
+		case BRSW_PLATFORM_LEN_1:
+		case BRSW_PLATFORM_LEN_2:
+		case BRSW_PLATFORM_LEN_3:
+		case BRSW_PLATFORM_LEN_4:
+		case BRSW_PLATFORM_LEN_5:
+		case BRSW_PLATFORM_LEN_6:
+		case BRSW_PLATFORM_LEN_7: {
+			w->RaiseWidget(_railstation.platlength + BRSW_PLATFORM_LEN_BEGIN);
+			w->RaiseWidget(BRSW_PLATFORM_DRAG_N_DROP);
 
-			_railstation.platlength = (e->we.click.widget - 12) + 1;
+			_railstation.platlength = e->we.click.widget - BRSW_PLATFORM_LEN_BEGIN;
 			_railstation.dragdrop = false;
 
 			const StationSpec *statspec = _railstation.newstations ? GetCustomStationSpec(_railstation.station_class, _railstation.station_type) : NULL;
-			if (statspec != NULL && HASBIT(statspec->disallowed_platforms, _railstation.numtracks - 1)) {
+			if (statspec != NULL && HasBit(statspec->disallowed_platforms, _railstation.numtracks - 1)) {
 				/* The previously selected number of tracks in invalid */
 				for (uint i = 0; i < 7; i++) {
-					if (!HASBIT(statspec->disallowed_platforms, i)) {
-						RaiseWindowWidget(w, _railstation.numtracks + 4);
+					if (!HasBit(statspec->disallowed_platforms, i)) {
+						w->RaiseWidget(_railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
 						_railstation.numtracks = i + 1;
 						break;
 					}
 				}
 			}
 
-			LowerWindowWidget(w, _railstation.platlength + 11);
-			LowerWindowWidget(w, _railstation.numtracks + 4);
+			w->LowerWidget(_railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
+			w->LowerWidget(_railstation.platlength + BRSW_PLATFORM_LEN_BEGIN);
 			SndPlayFx(SND_15_BEEP);
 			SetWindowDirty(w);
 			break;
 		}
 
-		case 19:
+		case BRSW_PLATFORM_DRAG_N_DROP: {
 			_railstation.dragdrop ^= true;
-			ToggleWidgetLoweredState(w, 19);
-			SetWindowWidgetLoweredState(w, _railstation.numtracks + 4, !_railstation.dragdrop);
-			SetWindowWidgetLoweredState(w, _railstation.platlength + 11, !_railstation.dragdrop);
+			w->ToggleWidgetLoweredState(BRSW_PLATFORM_DRAG_N_DROP);
+
+			/* get the first allowed length/number of platforms */
+			const StationSpec *statspec = _railstation.newstations ? GetCustomStationSpec(_railstation.station_class, _railstation.station_type) : NULL;
+			if (statspec != NULL && HasBit(statspec->disallowed_lengths, _railstation.platlength - 1)) {
+				for (uint i = 0; i < 7; i++) {
+					if (!HasBit(statspec->disallowed_lengths, i)) {
+						w->RaiseWidget(_railstation.platlength + BRSW_PLATFORM_LEN_BEGIN);
+						_railstation.platlength = i + 1;
+						break;
+					}
+				}
+			}
+			if (statspec != NULL && HasBit(statspec->disallowed_platforms, _railstation.numtracks - 1)) {
+				for (uint i = 0; i < 7; i++) {
+					if (!HasBit(statspec->disallowed_platforms, i)) {
+						w->RaiseWidget(_railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
+						_railstation.numtracks = i + 1;
+						break;
+					}
+				}
+			}
+
+			w->SetWidgetLoweredState(_railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN, !_railstation.dragdrop);
+			w->SetWidgetLoweredState(_railstation.platlength + BRSW_PLATFORM_LEN_BEGIN, !_railstation.dragdrop);
+			SndPlayFx(SND_15_BEEP);
+			SetWindowDirty(w);
+		} break;
+
+		case BRSW_HIGHLIGHT_OFF:
+		case BRSW_HIGHLIGHT_ON:
+			_station_show_coverage = (e->we.click.widget != BRSW_HIGHLIGHT_OFF);
+			w->SetWidgetLoweredState(BRSW_HIGHLIGHT_OFF, !_station_show_coverage);
+			w->SetWidgetLoweredState(BRSW_HIGHLIGHT_ON, _station_show_coverage);
 			SndPlayFx(SND_15_BEEP);
 			SetWindowDirty(w);
 			break;
 
-		case 20:
-		case 21:
-			_station_show_coverage = (e->we.click.widget != 20);
-			SetWindowWidgetLoweredState(w, 20, !_station_show_coverage);
-			SetWindowWidgetLoweredState(w, 21, _station_show_coverage);
-			SndPlayFx(SND_15_BEEP);
-			SetWindowDirty(w);
-			break;
-
-		case 22:
-		case 23:
+		case BRSW_NEWST_DROPDOWN:
+		case BRSW_NEWST_DROPDOWN_TEXT:
 			ShowDropDownMenu(w, BuildStationClassDropdown(), _railstation.station_class, 23, 0, 1 << STAT_CLASS_WAYP);
 			break;
 
-		case 24: {
+		case BRSW_NEWST_LIST: {
 			const StationSpec *statspec;
 			int y = (e->we.click.pt.y - 32) / 14;
 
@@ -915,7 +1003,7 @@
 			/* Check station availability callback */
 			statspec = GetCustomStationSpec(_railstation.station_class, y);
 			if (statspec != NULL &&
-				HASBIT(statspec->callbackmask, CBM_STATION_AVAIL) &&
+				HasBit(statspec->callbackmask, CBM_STATION_AVAIL) &&
 				GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) return;
 
 			_railstation.station_type = y;
@@ -946,7 +1034,7 @@
 		break;
 
 	case WE_MOUSELOOP:
-		if (WP(w,def_d).close) {
+		if (WP(w, def_d).close) {
 			DeleteWindow(w);
 			return;
 		}
@@ -954,72 +1042,74 @@
 		break;
 
 	case WE_DESTROY:
-		if (!WP(w,def_d).close) ResetObjectToPlace();
+		if (!WP(w, def_d).close) ResetObjectToPlace();
 		break;
 	}
 }
 
+/** Widget definition of the standard build rail station window */
 static const Widget _station_builder_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_3000_RAIL_STATION_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,    14,   199, 0x0,                             STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,     7,    72,    26,    73, 0x0,                             STR_304E_SELECT_RAILROAD_STATION},
-{      WWT_PANEL,   RESIZE_NONE,    14,    75,   140,    26,    73, 0x0,                             STR_304E_SELECT_RAILROAD_STATION},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},               // BRSW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_3000_RAIL_STATION_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},     // BRSW_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,    14,   199, 0x0,                             STR_NULL},                            // BRSW_BACKGROUND
+{      WWT_PANEL,   RESIZE_NONE,    14,     7,    72,    26,    73, 0x0,                             STR_304E_SELECT_RAILROAD_STATION},    // BRSW_PLATFORM_DIR_X
+{      WWT_PANEL,   RESIZE_NONE,    14,    75,   140,    26,    73, 0x0,                             STR_304E_SELECT_RAILROAD_STATION},    // BRSW_PLATFORM_DIR_Y
 
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    22,    36,    87,    98, STR_00CB_1,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,    51,    87,    98, STR_00CC_2,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    52,    66,    87,    98, STR_00CD_3,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    67,    81,    87,    98, STR_00CE_4,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    82,    96,    87,    98, STR_00CF_5,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    97,   111,    87,    98, STR_0335_6,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,   112,   126,    87,    98, STR_0336_7,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    22,    36,    87,    98, STR_00CB_1,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_1
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,    51,    87,    98, STR_00CC_2,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_2
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    52,    66,    87,    98, STR_00CD_3,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_3
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    67,    81,    87,    98, STR_00CE_4,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_4
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    82,    96,    87,    98, STR_00CF_5,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_5
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    97,   111,    87,    98, STR_0335_6,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_6
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,   112,   126,    87,    98, STR_0336_7,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_7
 
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    22,    36,   112,   123, STR_00CB_1,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,    51,   112,   123, STR_00CC_2,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    52,    66,   112,   123, STR_00CD_3,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    67,    81,   112,   123, STR_00CE_4,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    82,    96,   112,   123, STR_00CF_5,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    97,   111,   112,   123, STR_0335_6,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,   112,   126,   112,   123, STR_0336_7,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    22,    36,   112,   123, STR_00CB_1,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_1
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,    51,   112,   123, STR_00CC_2,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_2
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    52,    66,   112,   123, STR_00CD_3,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_3
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    67,    81,   112,   123, STR_00CE_4,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_4
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    82,    96,   112,   123, STR_00CF_5,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_5
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    97,   111,   112,   123, STR_0335_6,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_6
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,   112,   126,   112,   123, STR_0336_7,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_7
 
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,   111,   126,   137, STR_DRAG_DROP,                   STR_STATION_DRAG_DROP},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    14,    73,   152,   163, STR_02DB_OFF,                    STR_3065_DON_T_HIGHLIGHT_COVERAGE},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    74,   133,   152,   163, STR_02DA_ON,                     STR_3064_HIGHLIGHT_COVERAGE_AREA},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,   111,   126,   137, STR_DRAG_DROP,                   STR_STATION_DRAG_DROP},               // BRSW_PLATFORM_DRAG_N_DROP
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    14,    73,   152,   163, STR_02DB_OFF,                    STR_3065_DON_T_HIGHLIGHT_COVERAGE},   // BRSW_HIGHLIGHT_OFF
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    74,   133,   152,   163, STR_02DA_ON,                     STR_3064_HIGHLIGHT_COVERAGE_AREA},    // BRSW_HIGHLIGHT_ON
 {   WIDGETS_END},
 };
 
+/** Widget definition of the build NewGRF rail station window */
 static const Widget _newstation_builder_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_3000_RAIL_STATION_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,    14,   289, 0x0,                             STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,     7,    72,   116,   163, 0x0,                             STR_304E_SELECT_RAILROAD_STATION},
-{      WWT_PANEL,   RESIZE_NONE,    14,    75,   140,   116,   163, 0x0,                             STR_304E_SELECT_RAILROAD_STATION},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},               // BRSW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_3000_RAIL_STATION_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},     // BRSW_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,    14,   289, 0x0,                             STR_NULL},                            // BRSW_BACKGROUND
+{      WWT_PANEL,   RESIZE_NONE,    14,     7,    72,   116,   163, 0x0,                             STR_304E_SELECT_RAILROAD_STATION},    // BRSW_PLATFORM_DIR_X
+{      WWT_PANEL,   RESIZE_NONE,    14,    75,   140,   116,   163, 0x0,                             STR_304E_SELECT_RAILROAD_STATION},    // BRSW_PLATFORM_DIR_Y
 
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    22,    36,   177,   188, STR_00CB_1,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,    51,   177,   188, STR_00CC_2,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    52,    66,   177,   188, STR_00CD_3,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    67,    81,   177,   188, STR_00CE_4,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    82,    96,   177,   188, STR_00CF_5,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    97,   111,   177,   188, STR_0335_6,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,   112,   126,   177,   188, STR_0336_7,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    22,    36,   177,   188, STR_00CB_1,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_1
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,    51,   177,   188, STR_00CC_2,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_2
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    52,    66,   177,   188, STR_00CD_3,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_3
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    67,    81,   177,   188, STR_00CE_4,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_4
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    82,    96,   177,   188, STR_00CF_5,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_5
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    97,   111,   177,   188, STR_0335_6,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_6
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,   112,   126,   177,   188, STR_0336_7,                      STR_304F_SELECT_NUMBER_OF_PLATFORMS}, // BRSW_PLATFORM_NUM_7
 
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    22,    36,   202,   213, STR_00CB_1,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,    51,   202,   213, STR_00CC_2,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    52,    66,   202,   213, STR_00CD_3,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    67,    81,   202,   213, STR_00CE_4,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    82,    96,   202,   213, STR_00CF_5,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    97,   111,   202,   213, STR_0335_6,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,   112,   126,   202,   213, STR_0336_7,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    22,    36,   202,   213, STR_00CB_1,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_1
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,    51,   202,   213, STR_00CC_2,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_2
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    52,    66,   202,   213, STR_00CD_3,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_3
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    67,    81,   202,   213, STR_00CE_4,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_4
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    82,    96,   202,   213, STR_00CF_5,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_5
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    97,   111,   202,   213, STR_0335_6,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_6
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,   112,   126,   202,   213, STR_0336_7,                      STR_3050_SELECT_LENGTH_OF_RAILROAD},  // BRSW_PLATFORM_LEN_7
 
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,   111,   216,   227, STR_DRAG_DROP,                   STR_STATION_DRAG_DROP},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    14,    73,   242,   253, STR_02DB_OFF,                    STR_3065_DON_T_HIGHLIGHT_COVERAGE},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    74,   133,   242,   253, STR_02DA_ON,                     STR_3064_HIGHLIGHT_COVERAGE_AREA},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    37,   111,   216,   227, STR_DRAG_DROP,                   STR_STATION_DRAG_DROP},               // BRSW_PLATFORM_DRAG_N_DROP
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    14,    73,   242,   253, STR_02DB_OFF,                    STR_3065_DON_T_HIGHLIGHT_COVERAGE},   // BRSW_HIGHLIGHT_OFF
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    74,   133,   242,   253, STR_02DA_ON,                     STR_3064_HIGHLIGHT_COVERAGE_AREA},    // BRSW_HIGHLIGHT_ON
 
 /* newstations gui additions */
-{      WWT_INSET,   RESIZE_NONE,    14,     7,   140,    17,    28, STR_02BD,                        STR_SELECT_STATION_CLASS_TIP},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,   129,   139,    18,    27, STR_0225,                        STR_SELECT_STATION_CLASS_TIP},
-{     WWT_MATRIX,   RESIZE_NONE,    14,     7,   128,    32,   102, 0x501,                           STR_SELECT_STATION_TYPE_TIP},
-{  WWT_SCROLLBAR,   RESIZE_NONE,    14,   129,   140,    32,   102, 0x0,                             STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{      WWT_INSET,   RESIZE_NONE,    14,     7,   140,    17,    28, STR_02BD,                        STR_SELECT_STATION_CLASS_TIP},        // BRSW_NEWST_DROPDOWN
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,   129,   139,    18,    27, STR_0225,                        STR_SELECT_STATION_CLASS_TIP},        // BRSW_NEWST_DROPDOWN_TEXT
+{     WWT_MATRIX,   RESIZE_NONE,    14,     7,   128,    32,   102, 0x501,                           STR_SELECT_STATION_TYPE_TIP},         // BRSW_NEWST_LIST
+{  WWT_SCROLLBAR,   RESIZE_NONE,    14,   129,   140,    32,   102, 0x0,                             STR_0190_SCROLL_BAR_SCROLLS_LIST},    // BRSW_NEWST_SCROLL
 {   WIDGETS_END},
 };
 
@@ -1052,37 +1142,205 @@
 
 		w->vscroll.count = _railstation.station_count;
 		w->vscroll.cap   = 5;
-		w->vscroll.pos   = clamp(_railstation.station_type - 2, 0, w->vscroll.count - w->vscroll.cap);
+		w->vscroll.pos   = Clamp(_railstation.station_type - 2, 0, w->vscroll.count - w->vscroll.cap);
 	}
 }
 
+/** Enum referring to the widgets of the signal window */
+enum BuildSignalWidgets {
+	BSW_CLOSEBOX = 0,
+	BSW_CAPTION,
+	BSW_SEMAPHORE_NORM,
+	BSW_SEMAPHORE_ENTRY,
+	BSW_SEMAPHORE_EXIT,
+	BSW_SEMAPHORE_COMBO,
+	BSW_ELECTRIC_NORM,
+	BSW_ELECTRIC_ENTRY,
+	BSW_ELECTRIC_EXIT,
+	BSW_ELECTRIC_COMBO,
+	BSW_CONVERT,
+	BSW_DRAG_SIGNALS_DENSITY,
+	BSW_DRAG_SIGNALS_DENSITY_DECREASE,
+	BSW_DRAG_SIGNALS_DENSITY_INCREASE,
+};
+
+/**
+ * Draw dynamic a signal-sprite in a button in the signal GUI
+ * Draw the sprite +1px to the right and down if the button is lowered and change the sprite to sprite + 1 (red to green light)
+ *
+ * @param w            Window on which the widget is located
+ * @param widget_index index of this widget in the window
+ * @param image        the sprite to draw
+ * @param xrel         the relativ x value of the sprite in the grf
+ * @param xsize        the width of the sprite
+ */
+static const void DrawSignalSprite(const Window *w, byte widget_index, SpriteID image, int8 xrel, uint8 xsize)
+{
+	DrawSprite(image + w->IsWidgetLowered(widget_index), PAL_NONE,
+			w->widget[widget_index].left + (w->widget[widget_index].right - w->widget[widget_index].left) / 2 - xrel - xsize / 2 +
+			w->IsWidgetLowered(widget_index), w->widget[widget_index].bottom - 3 + w->IsWidgetLowered(widget_index));
+}
+
+/**
+ * Signal selection window event definition
+ *
+ * @param w window pointer
+ * @param e event been triggered
+ */
+static void SignalBuildWndProc(Window *w, WindowEvent *e)
+{
+	switch (e->event) {
+		case WE_PAINT:
+			w->LowerWidget((_cur_signal_variant == SIG_ELECTRIC ? BSW_ELECTRIC_NORM : BSW_SEMAPHORE_NORM) + _cur_signal_type);
+
+			w->SetWidgetLoweredState(BSW_CONVERT, _convert_signal_button);
+
+			w->SetWidgetDisabledState(BSW_DRAG_SIGNALS_DENSITY_DECREASE, _patches.drag_signals_density == 1);
+			w->SetWidgetDisabledState(BSW_DRAG_SIGNALS_DENSITY_INCREASE, _patches.drag_signals_density == 20);
+
+			DrawWindowWidgets(w);
+
+			/* The 'hardcoded' off sets are needed because they are reused sprites. */
+			DrawSignalSprite(w, BSW_SEMAPHORE_NORM,  SPR_IMG_SIGNAL_SEMAPHORE_NORM,   0, 12); // xsize of sprite + 1 ==  9
+			DrawSignalSprite(w, BSW_SEMAPHORE_ENTRY, SPR_IMG_SIGNAL_SEMAPHORE_ENTRY, -1, 13); // xsize of sprite + 1 == 10
+			DrawSignalSprite(w, BSW_SEMAPHORE_EXIT,  SPR_IMG_SIGNAL_SEMAPHORE_EXIT,   0, 12); // xsize of sprite + 1 ==  9
+			DrawSignalSprite(w, BSW_SEMAPHORE_COMBO, SPR_IMG_SIGNAL_SEMAPHORE_COMBO,  0, 12); // xsize of sprite + 1 ==  9
+			DrawSignalSprite(w, BSW_ELECTRIC_NORM,   SPR_IMG_SIGNAL_ELECTRIC_NORM,   -1,  4);
+			DrawSignalSprite(w, BSW_ELECTRIC_ENTRY,  SPR_IMG_SIGNAL_ELECTRIC_ENTRY,  -2,  6);
+			DrawSignalSprite(w, BSW_ELECTRIC_EXIT,   SPR_IMG_SIGNAL_ELECTRIC_EXIT,   -2,  6);
+			DrawSignalSprite(w, BSW_ELECTRIC_COMBO,  SPR_IMG_SIGNAL_ELECTRIC_COMBO,  -2,  6);
+
+			/* Draw dragging signal density value in the BSW_DRAG_SIGNALS_DENSITY widget */
+			SetDParam(0, _patches.drag_signals_density);
+			DrawStringCentered(w->widget[BSW_DRAG_SIGNALS_DENSITY].left + (w->widget[BSW_DRAG_SIGNALS_DENSITY].right -
+					w->widget[BSW_DRAG_SIGNALS_DENSITY].left) / 2 + 1,
+					w->widget[BSW_DRAG_SIGNALS_DENSITY].top + 2, STR_JUST_INT, TC_ORANGE);
+			break;
+
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case BSW_SEMAPHORE_NORM:
+				case BSW_SEMAPHORE_ENTRY:
+				case BSW_SEMAPHORE_EXIT:
+				case BSW_SEMAPHORE_COMBO:
+				case BSW_ELECTRIC_NORM:
+				case BSW_ELECTRIC_ENTRY:
+				case BSW_ELECTRIC_EXIT:
+				case BSW_ELECTRIC_COMBO:
+					w->RaiseWidget((_cur_signal_variant == SIG_ELECTRIC ? BSW_ELECTRIC_NORM : BSW_SEMAPHORE_NORM) + _cur_signal_type);
+
+					_cur_signal_type = (SignalType)((uint)((e->we.click.widget - BSW_SEMAPHORE_NORM) % (SIGTYPE_COMBO + 1)));
+					_cur_signal_variant = e->we.click.widget >= BSW_ELECTRIC_NORM ? SIG_ELECTRIC : SIG_SEMAPHORE;
+					break;
+
+				case BSW_CONVERT:
+					_convert_signal_button = !_convert_signal_button;
+					break;
+
+				case BSW_DRAG_SIGNALS_DENSITY_DECREASE:
+					if (_patches.drag_signals_density > 1) _patches.drag_signals_density--;
+					break;
+
+				case BSW_DRAG_SIGNALS_DENSITY_INCREASE:
+					if (_patches.drag_signals_density < 20) _patches.drag_signals_density++;
+					break;
+
+				default: break;
+			}
+
+			SetWindowDirty(w);
+			break;
+
+		case WE_MOUSELOOP:
+			if (WP(w, def_d).close) DeleteWindow(w);
+			return;
+
+		case WE_DESTROY:
+			if (!WP(w, def_d).close) ResetObjectToPlace();
+			break;
+		}
+}
+
+/** Widget definition of the build signal window */
+static const Widget _signal_builder_widgets[] = {
+{   WWT_CLOSEBOX,   RESIZE_NONE,  7,   0,  10,   0,  13, STR_00C5,               STR_018B_CLOSE_WINDOW},                 // BSW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,  7,  11, 109,   0,  13, STR_SIGNAL_SELECTION,   STR_018C_WINDOW_TITLE_DRAG_THIS},       // BSW_CAPTION
+
+{      WWT_PANEL,   RESIZE_NONE,  7,   0,  21,  14,  40, STR_NULL,               STR_BUILD_SIGNAL_SEMAPHORE_NORM_TIP},   // BSW_SEMAPHORE_NORM
+{      WWT_PANEL,   RESIZE_NONE,  7,  22,  43,  14,  40, STR_NULL,               STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TIP},  // BSW_SEMAPHORE_ENTRY
+{      WWT_PANEL,   RESIZE_NONE,  7,  44,  65,  14,  40, STR_NULL,               STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TIP},   // BSW_SEMAPHORE_EXIT
+{      WWT_PANEL,   RESIZE_NONE,  7,  66,  87,  14,  40, STR_NULL,               STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TIP},  // BSW_SEMAPHORE_COMBO
+
+{      WWT_PANEL,   RESIZE_NONE,  7,   0,  21,  41,  67, STR_NULL,               STR_BUILD_SIGNAL_ELECTRIC_NORM_TIP},    // BSW_ELECTRIC_NORM
+{      WWT_PANEL,   RESIZE_NONE,  7,  22,  43,  41,  67, STR_NULL,               STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TIP},   // BSW_ELECTRIC_ENTRY
+{      WWT_PANEL,   RESIZE_NONE,  7,  44,  65,  41,  67, STR_NULL,               STR_BUILD_SIGNAL_ELECTRIC_EXIT_TIP},    // BSW_ELECTRIC_EXIT
+{      WWT_PANEL,   RESIZE_NONE,  7,  66,  87,  41,  67, STR_NULL,               STR_BUILD_SIGNAL_ELECTRIC_COMBO_TIP},   // BSW_ELECTRIC_COMBO
+
+{     WWT_IMGBTN,   RESIZE_NONE,  7,  88, 109,  14,  40, SPR_IMG_SIGNAL_CONVERT, STR_SIGNAL_CONVERT_TIP},                // BSW_CONVERT
+{      WWT_PANEL,   RESIZE_NONE,  7,  88, 109,  41,  67, STR_NULL,               STR_DRAG_SIGNALS_DENSITY_TIP},          // BSW_DRAG_SIGNALS_DENSITY
+{ WWT_PUSHIMGBTN,   RESIZE_NONE, 14,  90,  98,  54,  65, SPR_ARROW_LEFT,         STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP}, // BSW_DRAG_SIGNALS_DENSITY_DECREASE
+{ WWT_PUSHIMGBTN,   RESIZE_NONE, 14,  99, 107,  54,  65, SPR_ARROW_RIGHT,        STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP}, // BSW_DRAG_SIGNALS_DENSITY_INCREASE
+
+{   WIDGETS_END},
+};
+
+/** Signal selection window description */
+static const WindowDesc _signal_builder_desc = {
+	WDP_AUTO, WDP_AUTO, 110, 68, 110, 68,
+	WC_BUILD_SIGNAL, WC_BUILD_TOOLBAR,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
+	_signal_builder_widgets,
+	SignalBuildWndProc
+};
+
+/**
+ * Open the signal selection window
+ * @pre reset all signal GUI relevant variables
+ */
+static void ShowSignalBuilder()
+{
+	_convert_signal_button = false;
+	_cur_signal_variant = _cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC;
+	_cur_signal_type = SIGTYPE_NORMAL;
+
+	AllocateWindowDesc(&_signal_builder_desc);
+}
+
+/** Enum referring to the widgets of the build rail depot window */
+enum BuildRailDepotWidgets {
+	BRDW_CLOSEBOX = 0,
+	BRDW_CAPTION,
+	BRDW_BACKGROUND,
+	BRDW_DEPOT_NE,
+	BRDW_DEPOT_SE,
+	BRDW_DEPOT_SW,
+	BRDW_DEPOT_NW,
+};
+
 static void BuildTrainDepotWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: LowerWindowWidget(w, _build_depot_direction + 3); break;
+	case WE_CREATE: w->LowerWidget(_build_depot_direction + BRDW_DEPOT_NE); break;
 
 	case WE_PAINT: {
-		RailType r;
-
 		DrawWindowWidgets(w);
 
-		r = _cur_railtype;
-		DrawTrainDepotSprite(70, 17, 0, r);
-		DrawTrainDepotSprite(70, 69, 1, r);
-		DrawTrainDepotSprite( 2, 69, 2, r);
-		DrawTrainDepotSprite( 2, 17, 3, r);
+		DrawTrainDepotSprite(70, 17, DIAGDIR_NE, _cur_railtype);
+		DrawTrainDepotSprite(70, 69, DIAGDIR_SE, _cur_railtype);
+		DrawTrainDepotSprite( 2, 69, DIAGDIR_SW, _cur_railtype);
+		DrawTrainDepotSprite( 2, 17, DIAGDIR_NW, _cur_railtype);
 		break;
 		}
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
-			case 3:
-			case 4:
-			case 5:
-			case 6:
-				RaiseWindowWidget(w, _build_depot_direction + 3);
-				_build_depot_direction = (DiagDirection)(e->we.click.widget - 3);
-				LowerWindowWidget(w, _build_depot_direction + 3);
+			case BRDW_DEPOT_NE:
+			case BRDW_DEPOT_SE:
+			case BRDW_DEPOT_SW:
+			case BRDW_DEPOT_NW:
+				w->RaiseWidget(_build_depot_direction + BRDW_DEPOT_NE);
+				_build_depot_direction = (DiagDirection)(e->we.click.widget - BRDW_DEPOT_NE);
+				w->LowerWidget(_build_depot_direction + BRDW_DEPOT_NE);
 				SndPlayFx(SND_15_BEEP);
 				SetWindowDirty(w);
 				break;
@@ -1090,23 +1348,24 @@
 		break;
 
 	case WE_MOUSELOOP:
-		if (WP(w,def_d).close) DeleteWindow(w);
+		if (WP(w, def_d).close) DeleteWindow(w);
 		return;
 
 	case WE_DESTROY:
-		if (!WP(w,def_d).close) ResetObjectToPlace();
+		if (!WP(w, def_d).close) ResetObjectToPlace();
 		break;
 	}
 }
 
+/** Widget definition of the build rail depot window */
 static const Widget _build_depot_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   139,     0,    13, STR_1014_TRAIN_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   139,    14,   121, 0x0,                              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                              STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                              STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                              STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                              STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},                     // BRDW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   139,     0,    13, STR_1014_TRAIN_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},           // BRDW_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   139,    14,   121, 0x0,                              STR_NULL},                                  // BRDW_BACKGROUND
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                              STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO}, // BRDW_DEPOT_NE
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                              STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO}, // BRDW_DEPOT_SE
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                              STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO}, // BRDW_DEPOT_SW
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                              STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO}, // BRDW_DEPOT_NW
 {   WIDGETS_END},
 };
 
@@ -1123,6 +1382,18 @@
 	AllocateWindowDesc(&_build_depot_desc);
 }
 
+/** Enum referring to the widgets of the build NewGRF rail waypoint window */
+enum BuildRailWaypointWidgets {
+	BRWW_CLOSEBOX = 0,
+	BRWW_CAPTION,
+	BRWW_BACKGROUND,
+	BRWW_WAYPOINT_1,
+	BRWW_WAYPOINT_2,
+	BRWW_WAYPOINT_3,
+	BRWW_WAYPOINT_4,
+	BRWW_WAYPOINT_5,
+	BRWW_SCROLL,
+};
 
 static void BuildWaypointWndProc(Window *w, WindowEvent *e)
 {
@@ -1131,7 +1402,7 @@
 		uint i;
 
 		for (i = 0; i < w->hscroll.cap; i++) {
-			SetWindowWidgetLoweredState(w, i + 3, (w->hscroll.pos + i) == _cur_waypoint_type);
+			w->SetWidgetLoweredState(i + BRWW_WAYPOINT_1, (w->hscroll.pos + i) == _cur_waypoint_type);
 		}
 
 		DrawWindowWidgets(w);
@@ -1143,7 +1414,7 @@
 				DrawWaypointSprite(2 + i * 68, 25, w->hscroll.pos + i, _cur_railtype);
 
 				if (statspec != NULL &&
-						HASBIT(statspec->callbackmask, CBM_STATION_AVAIL) &&
+						HasBit(statspec->callbackmask, CBM_STATION_AVAIL) &&
 						GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) {
 					GfxFillRect(4 + i * 68, 18, 67 + i * 68, 75, (1 << PALETTE_MODIFIER_GREYOUT));
 				}
@@ -1153,46 +1424,51 @@
 	}
 	case WE_CLICK: {
 		switch (e->we.click.widget) {
-		case 3: case 4: case 5: case 6: case 7: {
-			byte type = e->we.click.widget - 3 + w->hscroll.pos;
+			case BRWW_WAYPOINT_1:
+			case BRWW_WAYPOINT_2:
+			case BRWW_WAYPOINT_3:
+			case BRWW_WAYPOINT_4:
+			case BRWW_WAYPOINT_5: {
+				byte type = e->we.click.widget - BRWW_WAYPOINT_1 + w->hscroll.pos;
 
-			/* Check station availability callback */
-			const StationSpec *statspec = GetCustomStationSpec(STAT_CLASS_WAYP, type);
-			if (statspec != NULL &&
-					HASBIT(statspec->callbackmask, CBM_STATION_AVAIL) &&
-					GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) return;
+				/* Check station availability callback */
+				const StationSpec *statspec = GetCustomStationSpec(STAT_CLASS_WAYP, type);
+				if (statspec != NULL &&
+						HasBit(statspec->callbackmask, CBM_STATION_AVAIL) &&
+						GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) return;
 
-			_cur_waypoint_type = type;
-			SndPlayFx(SND_15_BEEP);
-			SetWindowDirty(w);
-			break;
-		}
+				_cur_waypoint_type = type;
+				SndPlayFx(SND_15_BEEP);
+				SetWindowDirty(w);
+				break;
+			}
 		}
 		break;
 	}
 
 	case WE_MOUSELOOP:
-		if (WP(w,def_d).close) DeleteWindow(w);
+		if (WP(w, def_d).close) DeleteWindow(w);
 		break;
 
 	case WE_DESTROY:
-		if (!WP(w,def_d).close) ResetObjectToPlace();
+		if (!WP(w, def_d).close) ResetObjectToPlace();
 		break;
 	}
 }
 
+/** Widget definition for the build NewGRF rail waypoint window */
 static const Widget _build_waypoint_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,     STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   343,     0,    13, STR_WAYPOINT, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   343,    14,    91, 0x0,          0},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,     STR_018B_CLOSE_WINDOW},            // BRWW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   343,     0,    13, STR_WAYPOINT, STR_018C_WINDOW_TITLE_DRAG_THIS},  // BRWW_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   343,    14,    91, 0x0,          STR_NULL},                         // BRWW_BACKGROUND
 
-{      WWT_PANEL,   RESIZE_NONE,     7,     3,    68,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},
-{      WWT_PANEL,   RESIZE_NONE,     7,    71,   136,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},
-{      WWT_PANEL,   RESIZE_NONE,     7,   139,   204,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},
-{      WWT_PANEL,   RESIZE_NONE,     7,   207,   272,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},
-{      WWT_PANEL,   RESIZE_NONE,     7,   275,   340,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},
+{      WWT_PANEL,   RESIZE_NONE,     7,     3,    68,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},        // BRWW_WAYPOINT_1
+{      WWT_PANEL,   RESIZE_NONE,     7,    71,   136,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},        // BRWW_WAYPOINT_2
+{      WWT_PANEL,   RESIZE_NONE,     7,   139,   204,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},        // BRWW_WAYPOINT_3
+{      WWT_PANEL,   RESIZE_NONE,     7,   207,   272,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},        // BRWW_WAYPOINT_4
+{      WWT_PANEL,   RESIZE_NONE,     7,   275,   340,    17,    76, 0x0,          STR_WAYPOINT_GRAPHICS_TIP},        // BRWW_WAYPOINT_5
 
-{ WWT_HSCROLLBAR,   RESIZE_NONE,    7,     1,   343,     80,    91, 0x0,          STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{ WWT_HSCROLLBAR,   RESIZE_NONE,    7,     1,   343,     80,    91, 0x0,          STR_0190_SCROLL_BAR_SCROLLS_LIST}, // BRWW_SCROLL
 {    WIDGETS_END},
 };
 
@@ -1288,3 +1564,4 @@
 	}
 }
 
+
--- a/src/rail_map.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/rail_map.h	Mon Dec 03 23:39:38 2007 +0000
@@ -140,7 +140,7 @@
  */
 static inline bool HasTrack(TileIndex tile, Track track)
 {
-	return HASBIT(GetTrackBits(tile), track);
+	return HasBit(GetTrackBits(tile), track);
 }
 
 /**
@@ -298,7 +298,7 @@
  */
 static inline SignalState GetSingleSignalState(TileIndex t, byte signalbit)
 {
-	return (SignalState)HASBIT(GetSignalStates(t), signalbit);
+	return (SignalState)HasBit(GetSignalStates(t), signalbit);
 }
 
 /**
@@ -329,7 +329,7 @@
  */
 static inline bool IsSignalPresent(TileIndex t, byte signalbit)
 {
-	return HASBIT(GetPresentSignals(t), signalbit);
+	return HasBit(GetPresentSignals(t), signalbit);
 }
 
 /**
@@ -394,6 +394,7 @@
 	RAIL_GROUND_FENCE_HORIZ1 = 10, ///< Grass with a fence at the southern side
 	RAIL_GROUND_FENCE_HORIZ2 = 11, ///< Grass with a fence at the northern side
 	RAIL_GROUND_ICE_DESERT   = 12, ///< Icy or sandy
+	RAIL_GROUND_WATER        = 13, ///< Grass with a fence and water on the lower halftile
 };
 
 static inline void SetRailGroundType(TileIndex t, RailGroundType rgt)
--- a/src/railtypes.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/railtypes.h	Mon Dec 03 23:39:38 2007 +0000
@@ -73,10 +73,10 @@
 			SPR_BUILD_X_ELRAIL,
 			SPR_BUILD_EW_ELRAIL,
 			SPR_BUILD_Y_ELRAIL,
-			SPR_OPENTTD_BASE + 0,
-			0x50E,
+			SPR_IMG_AUTOELRAIL,
+			SPR_IMG_DEPOT_ELRAIL,
 			SPR_BUILD_TUNNEL_ELRAIL,
-			SPR_IMG_CONVERT_RAIL
+			SPR_IMG_CONVERT_ELRAIL
 		},
 
 		{
@@ -84,10 +84,10 @@
 			SPR_CURSOR_SWNE_ELRAIL,
 			SPR_CURSOR_EW_ELRAIL,
 			SPR_CURSOR_NWSE_ELRAIL,
-			SPR_CURSOR_AUTORAIL,
-			SPR_CURSOR_RAIL_DEPOT,
+			SPR_CURSOR_AUTOELRAIL,
+			SPR_CURSOR_ELRAIL_DEPOT,
 			SPR_CURSOR_TUNNEL_ELRAIL,
-			SPR_CURSOR_CONVERT_RAIL
+			SPR_CURSOR_CONVERT_ELRAIL
 		},
 
 		/* strings */
--- a/src/rev.cpp.in	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/rev.cpp.in	Mon Dec 03 23:39:38 2007 +0000
@@ -1,4 +1,44 @@
+/* $Id$ */
+
+/** @file rev.cpp Autogenerated file with the revision and such of OpenTTD. */
+
+#include "stdafx.h"
+
+/**
+ * The text version of OpenTTD's revision.
+ * This will be either "<major>.<minor>.<build>[-RC<rc>]",
+ * "r<revision number>[M][-<branch>]" or "norev000".
+ *
+ * The major, minor and build are the numbers that describe releases of
+ * OpenTTD (like 0.5.3). "-RC" is used to flag release candidates.
+ *
+ * The revision number is fairly straight forward. The M is to show that
+ * the binary is made from modified source code. The branch shows the
+ * branch the revision is of and will not be there when it is trunk.
+ *
+ * norev000 is for non-releases that are made on systems without
+ * subversion or sources that are not a checkout of subversion.
+ */
 extern const char _openttd_revision[] = "@@VERSION@@";
+
+/**
+ * The NewGRF revision of OTTD:
+ * bits  meaning.
+ * 28-31 major version
+ * 24-27 minor version
+ * 20-23 build
+ *    19 1 if it is a release, 0 if it is not.
+ *  0-18 revision number; 0 for releases and when the revision is unknown.
+ *
+ * The 19th bit is there so the development/betas/alpha, etc. leading to a
+ * final release will always have a lower version number than the released
+ * version, thus making comparisions on specific revisions easy.
+ */
+uint32 _openttd_newgrf_version = 0 << 28 | 6 << 24 | 0 << 20 | 0 << 19 | (@@REVISION@@ & ((1 << 19) - 1));
+
 #ifdef __MORPHOS__
+/**
+ * Variable used by MorphOS to show the version.
+ */
 extern const char morphos_versions_tag[] = "\\0$VER: OpenTTD @@VERSION@@ (@@DATE@@)  OpenTTD Team [MorphOS, PowerPC]";
 #endif
--- a/src/road.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/road.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -42,7 +42,7 @@
 
 					/* 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
+							CountBits(neighbor_rb) == 1; // Neighbor has got only one Roadbit
 
 				} break;
 
--- a/src/road.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/road.h	Mon Dec 03 23:39:38 2007 +0000
@@ -54,7 +54,7 @@
  */
 static inline bool AreValidRoadTypes(RoadTypes rts)
 {
-	return HASBIT(rts, ROADTYPE_ROAD) || HASBIT(rts, ROADTYPE_TRAM);
+	return HasBit(rts, ROADTYPE_ROAD) || HasBit(rts, ROADTYPE_TRAM);
 }
 
 /**
--- a/src/road_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/road_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -33,6 +33,7 @@
 #include "tunnel_map.h"
 #include "misc/autoptr.hpp"
 #include "autoslope.h"
+#include "transparency.h"
 
 #define M(x) (1 << (x))
 /* Level crossings may only be built on these slopes */
@@ -138,7 +139,7 @@
 	RoadBits pieces = Extract<RoadBits, 0>(p1);
 	RoadTypes rts = GetRoadTypes(tile);
 	/* The tile doesn't have the given road type */
-	if (!HASBIT(rts, rt)) return CMD_ERROR;
+	if (!HasBit(rts, rt)) return CMD_ERROR;
 
 	if (!CheckAllowRemoveRoad(tile, pieces, &edge_road, rt)) return CMD_ERROR;
 
@@ -220,7 +221,7 @@
 					MarkTileDirtyByTile(tile);
 				}
 			}
-			return CommandCost(COUNTBITS(c) * _price.remove_road);
+			return CommandCost(CountBits(c) * _price.remove_road);
 		}
 
 		case ROAD_TILE_CROSSING: {
@@ -230,7 +231,7 @@
 
 			/* Don't allow road to be removed from the crossing when there is tram;
 			 * we can't draw the crossing without trambits ;) */
-			if (rt == ROADTYPE_ROAD && HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM) && ((flags & DC_EXEC) || !HASBIT(p1, 6))) return CMD_ERROR;
+			if (rt == ROADTYPE_ROAD && HasBit(GetRoadTypes(tile), ROADTYPE_TRAM) && ((flags & DC_EXEC) || !HasBit(p1, 6))) return CMD_ERROR;
 
 			if (flags & DC_EXEC) {
 				if (rt == ROADTYPE_ROAD) {
@@ -352,7 +353,7 @@
 	/* 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 &&
+			existing == ROAD_NONE && CountBits(*pieces) == 1 &&
 			(_valid_tileh_slopes_road[2][tileh] & *pieces) == ROAD_NONE) {
 		return CommandCost(_price.terraform);
 	}
@@ -366,7 +367,7 @@
 
 	/* foundation is used. Whole tile is leveled up */
 	if ((~_valid_tileh_slopes_road[1][tileh] & road_bits) == ROAD_NONE) {
-		return CommandCost(existing != ROAD_NONE ? 0 : _price.terraform);
+		return CommandCost(existing != ROAD_NONE ? (Money)0 : _price.terraform);
 	}
 
 	/* Force straight roads. */
@@ -404,7 +405,7 @@
 	RoadBits pieces = Extract<RoadBits, 0>(p1);
 
 	RoadType rt = (RoadType)GB(p1, 4, 2);
-	if (!IsValidRoadType(rt)) return CMD_ERROR;
+	if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
 
 	DisallowedRoadDirections toggle_drd = (DisallowedRoadDirections)GB(p1, 6, 2);
 
@@ -418,7 +419,7 @@
 					if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 					all_bits = GetAllRoadBits(tile);
-					if (!HASBIT(GetRoadTypes(tile), rt)) break;
+					if (!HasBit(GetRoadTypes(tile), rt)) break;
 
 					existing = GetRoadBits(tile, rt);
 					RoadBits merged = existing | pieces;
@@ -444,7 +445,7 @@
 				} break;
 
 				case ROAD_TILE_CROSSING:
-					if (HASBIT(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
+					if (HasBit(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
 					all_bits = GetCrossingRoadBits(tile);
 					if (pieces & ComplementRoadBits(all_bits)) goto do_clear;
 					break;
@@ -463,7 +464,7 @@
 			}
 
 			/* Level crossings may only be built on these slopes */
-			if (!HASBIT(VALID_LEVEL_CROSSING_SLOPES, tileh)) {
+			if (!HasBit(VALID_LEVEL_CROSSING_SLOPES, tileh)) {
 				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 			}
 
@@ -495,7 +496,7 @@
 
 		case MP_STATION:
 			if (!IsDriveThroughStopTile(tile)) return CMD_ERROR;
-			if (HASBIT(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
+			if (HasBit(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
 			/* Don't allow "upgrading" the roadstop when vehicles are already driving on it */
 			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 			break;
@@ -503,7 +504,7 @@
 		case MP_TUNNELBRIDGE:
 			if ((IsTunnel(tile) && GetTunnelTransportType(tile) != TRANSPORT_ROAD) ||
 					(IsBridge(tile) && GetBridgeTransportType(tile) != TRANSPORT_ROAD)) return CMD_ERROR;
-			if (HASBIT(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
+			if (HasBit(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
 			/* Don't allow "upgrading" the bridge/tunnel when vehicles are already driving on it */
 			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 			break;
@@ -531,7 +532,7 @@
 		pieces &= ComplementRoadBits(existing);
 	}
 
-	cost.AddCost(COUNTBITS(pieces) * _price.build_road);
+	cost.AddCost(CountBits(pieces) * _price.build_road);
 	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
 		/* Pay for *every* tile of the bridge or tunnel */
 		cost.MultiplyCost(DistanceManhattan(IsTunnel(tile) ? GetOtherTunnelEnd(tile) : GetOtherBridgeEnd(tile), tile));
@@ -605,7 +606,7 @@
 		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 	}
 
-	return CommandCost(_price.build_rail / 2);
+	return CommandCost(RailBuildCost(totype) / 2);
 }
 
 
@@ -635,35 +636,35 @@
 
 	start_tile = p1;
 	RoadType rt = (RoadType)GB(p2, 3, 2);
-	if (!IsValidRoadType(rt)) return CMD_ERROR;
+	if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
 
 	/* Only drag in X or Y direction dictated by the direction variable */
-	if (!HASBIT(p2, 2) && TileY(start_tile) != TileY(end_tile)) return CMD_ERROR; // x-axis
-	if (HASBIT(p2, 2)  && TileX(start_tile) != TileX(end_tile)) return CMD_ERROR; // y-axis
+	if (!HasBit(p2, 2) && TileY(start_tile) != TileY(end_tile)) return CMD_ERROR; // x-axis
+	if (HasBit(p2, 2)  && TileX(start_tile) != TileX(end_tile)) return CMD_ERROR; // y-axis
 
 	/* Swap start and ending tile, also the half-tile drag var (bit 0 and 1) */
-	if (start_tile > end_tile || (start_tile == end_tile && HASBIT(p2, 0))) {
+	if (start_tile > end_tile || (start_tile == end_tile && HasBit(p2, 0))) {
 		TileIndex t = start_tile;
 		start_tile = end_tile;
 		end_tile = t;
-		p2 ^= IS_INT_INSIDE(p2 & 3, 1, 3) ? 3 : 0;
+		p2 ^= IsInsideMM(p2 & 3, 1, 3) ? 3 : 0;
 		drd = DRD_SOUTHBOUND;
 	}
 
 	/* On the X-axis, we have to swap the initial bits, so they
 	 * will be interpreted correctly in the GTTS. Futhermore
 	 * when you just 'click' on one tile to build them. */
-	if (HASBIT(p2, 2) == (start_tile == end_tile && HASBIT(p2, 0) == HASBIT(p2, 1))) 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;
+	if (!HasBit(p2, 5)) drd = DRD_NONE;
 
 	tile = start_tile;
 	/* Start tile is the small number. */
 	for (;;) {
-		RoadBits bits = HASBIT(p2, 2) ? ROAD_Y : ROAD_X;
+		RoadBits bits = HasBit(p2, 2) ? ROAD_Y : ROAD_X;
 
-		if (tile == end_tile && !HASBIT(p2, 1)) bits &= ROAD_NW | ROAD_NE;
-		if (tile == start_tile && HASBIT(p2, 0)) bits &= ROAD_SE | ROAD_SW;
+		if (tile == end_tile && !HasBit(p2, 1)) bits &= ROAD_NW | ROAD_NE;
+		if (tile == start_tile && HasBit(p2, 0)) bits &= ROAD_SE | ROAD_SW;
 
 		ret = DoCommand(tile, drd << 6 | rt << 4 | bits, 0, flags, CMD_BUILD_ROAD);
 		if (CmdFailed(ret)) {
@@ -691,7 +692,7 @@
 
 		if (tile == end_tile) break;
 
-		tile += HASBIT(p2, 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
+		tile += HasBit(p2, 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
 	}
 
 	return !had_success ? CMD_ERROR : cost;
@@ -721,25 +722,25 @@
 	if (!IsValidRoadType(rt)) return CMD_ERROR;
 
 	/* Only drag in X or Y direction dictated by the direction variable */
-	if (!HASBIT(p2, 2) && TileY(start_tile) != TileY(end_tile)) return CMD_ERROR; // x-axis
-	if (HASBIT(p2, 2)  && TileX(start_tile) != TileX(end_tile)) return CMD_ERROR; // y-axis
+	if (!HasBit(p2, 2) && TileY(start_tile) != TileY(end_tile)) return CMD_ERROR; // x-axis
+	if (HasBit(p2, 2)  && TileX(start_tile) != TileX(end_tile)) return CMD_ERROR; // y-axis
 
 	/* Swap start and ending tile, also the half-tile drag var (bit 0 and 1) */
-	if (start_tile > end_tile || (start_tile == end_tile && HASBIT(p2, 0))) {
+	if (start_tile > end_tile || (start_tile == end_tile && HasBit(p2, 0))) {
 		TileIndex t = start_tile;
 		start_tile = end_tile;
 		end_tile = t;
-		p2 ^= IS_INT_INSIDE(p2 & 3, 1, 3) ? 3 : 0;
+		p2 ^= IsInsideMM(p2 & 3, 1, 3) ? 3 : 0;
 	}
 
 	money.AddCost(GetAvailableMoneyForCommand());
 	tile = start_tile;
 	/* Start tile is the small number. */
 	for (;;) {
-		RoadBits bits = HASBIT(p2, 2) ? ROAD_Y : ROAD_X;
+		RoadBits bits = HasBit(p2, 2) ? ROAD_Y : ROAD_X;
 
-		if (tile == end_tile && !HASBIT(p2, 1)) bits &= ROAD_NW | ROAD_NE;
-		if (tile == start_tile && HASBIT(p2, 0)) bits &= ROAD_SE | ROAD_SW;
+		if (tile == end_tile && !HasBit(p2, 1)) bits &= ROAD_NW | ROAD_NE;
+		if (tile == start_tile && HasBit(p2, 0)) bits &= ROAD_SE | ROAD_SW;
 
 		/* try to remove the halves. */
 		if (bits != 0) {
@@ -759,7 +760,7 @@
 
 		if (tile == end_tile) break;
 
-		tile += HASBIT(p2, 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
+		tile += HasBit(p2, 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
 	}
 
 	return (cost.GetCost() == 0) ? CMD_ERROR : cost;
@@ -785,7 +786,7 @@
 	DiagDirection dir = Extract<DiagDirection, 0>(p1);
 	RoadType rt = (RoadType)GB(p1, 2, 2);
 
-	if (!IsValidRoadType(rt)) return CMD_ERROR;
+	if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
 
 	tileh = GetTileSlope(tile, NULL);
 	if (tileh != SLOPE_FLAT && (
@@ -820,7 +821,7 @@
 	if (!CheckTileOwnership(tile) && _current_player != OWNER_WATER)
 		return CMD_ERROR;
 
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
 		DoClearSquare(tile);
@@ -838,14 +839,14 @@
 
 			/* 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 ((COUNTBITS(b) == 1 && GetRoadBits(tile, ROADTYPE_TRAM) == ROAD_NONE) ||
+			if ((CountBits(b) == 1 && GetRoadBits(tile, ROADTYPE_TRAM) == ROAD_NONE) ||
 			    ((flags & DC_AI_BUILDING) && IsTileOwner(tile, OWNER_TOWN)) ||
 			    !(flags & DC_AUTO)
 				) {
 				RoadTypes rts = GetRoadTypes(tile);
 				CommandCost ret;
 				for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) {
-					if (HASBIT(rts, rt)) {
+					if (HasBit(rts, rt)) {
 						CommandCost tmp_ret = DoCommand(tile, rt << 4 | GetRoadBits(tile, rt), 0, flags, CMD_REMOVE_ROAD);
 						if (CmdFailed(tmp_ret)) return tmp_ret;
 						ret.AddCost(tmp_ret);
@@ -865,7 +866,7 @@
 			/* Must iterate over the roadtypes in a reverse manner because
 			 * tram tracks must be removed before the road bits. */
 			for (RoadType rt = ROADTYPE_HWAY; rt >= ROADTYPE_ROAD; rt--) {
-				if (HASBIT(rts, rt)) {
+				if (HasBit(rts, rt)) {
 					CommandCost tmp_ret = DoCommand(tile, 1 << 6 | rt << 4 | GetCrossingRoadBits(tile), 0, flags, CMD_REMOVE_ROAD);
 					if (CmdFailed(tmp_ret)) return tmp_ret;
 					ret.AddCost(tmp_ret);
@@ -906,7 +907,7 @@
 			 * created directly, but the state itself is still perfectly drawable.
 			 * However, as we do not want this to be build directly, we need to check
 			 * for that situation in here. */
-			return (tileh != 0 && HAS_SINGLE_BIT(bits)) ? FOUNDATION_LEVELED : FOUNDATION_NONE;
+			return (tileh != 0 && CountBits(bits) == 1) ? FOUNDATION_LEVELED : FOUNDATION_NONE;
 		}
 		if ((~_valid_tileh_slopes_road[1][tileh] & bits) == 0) return FOUNDATION_LEVELED;
 	}
@@ -946,7 +947,7 @@
 void DrawTramCatenary(TileInfo *ti, RoadBits tram)
 {
 	/* Don't draw the catenary under a low bridge */
-	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !HASBIT(_transparent_opt, TO_BUILDINGS)) {
+	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_BUILDINGS)) {
 		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
 
 		if (height <= GetTileMaxZ(ti->tile) + TILE_HEIGHT) return;
@@ -963,8 +964,8 @@
 		front = SPR_TRAMWAY_BASE + _road_frontwire_sprites_1[tram];
 	}
 
-	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));
+	AddSortableSpriteToDraw(back,  PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, IsTransparencySet(TO_BUILDINGS));
+	AddSortableSpriteToDraw(front, PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, IsTransparencySet(TO_BUILDINGS));
 }
 
 /**
@@ -1052,7 +1053,7 @@
 	if (tram != ROAD_NONE) DrawTramCatenary(ti, tram);
 
 	/* Return if full detail is disabled, or we are zoomed fully out. */
-	if (!HASBIT(_display_opt, DO_FULL_DETAIL) || _cur_dpi->zoom > ZOOM_LVL_DETAIL) return;
+	if (!HasBit(_display_opt, DO_FULL_DETAIL) || _cur_dpi->zoom > ZOOM_LVL_DETAIL) return;
 
 	/* Draw extra details. */
 	for (drts = _road_display_table[roadside][road]; drts->image != 0; drts++) {
@@ -1090,7 +1091,7 @@
 			}
 
 			DrawGroundSprite(image, pal);
-			if (HASBIT(GetRoadTypes(ti->tile), ROADTYPE_TRAM)) {
+			if (HasBit(GetRoadTypes(ti->tile), ROADTYPE_TRAM)) {
 				DrawGroundSprite(SPR_TRAMWAY_OVERLAY + (GetCrossingRoadAxis(ti->tile) ^ 1), pal);
 				DrawTramCatenary(ti, GetCrossingRoadBits(ti->tile));
 			}
@@ -1108,7 +1109,7 @@
 
 			palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile));
 
-			if (HASBIT(GetRoadTypes(ti->tile), ROADTYPE_TRAM)) {
+			if (HasBit(GetRoadTypes(ti->tile), ROADTYPE_TRAM)) {
 				dts =  &_tram_depot[GetRoadDepotDirection(ti->tile)];
 			} else {
 				dts =  &_road_depot[GetRoadDepotDirection(ti->tile)];
@@ -1120,7 +1121,7 @@
 				SpriteID image = dtss->image;
 				SpriteID pal;
 
-				if (!HASBIT(_transparent_opt, TO_BUILDINGS) && HASBIT(image, PALETTE_MODIFIER_COLOR)) {
+				if (!IsTransparencySet(TO_BUILDINGS) && HasBit(image, PALETTE_MODIFIER_COLOR)) {
 					pal = palette;
 				} else {
 					pal = PAL_NONE;
@@ -1131,7 +1132,7 @@
 					ti->x + dtss->delta_x, ti->y + dtss->delta_y,
 					dtss->size_x, dtss->size_y,
 					dtss->size_z, ti->z,
-					HASBIT(_transparent_opt, TO_BUILDINGS)
+					IsTransparencySet(TO_BUILDINGS)
 				);
 			}
 			break;
@@ -1155,7 +1156,7 @@
 		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
 		SpriteID image = dtss->image;
 
-		DrawSprite(image, HASBIT(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE, x + pt.x, y + pt.y);
+		DrawSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE, x + pt.x, y + pt.y);
 	}
 }
 
@@ -1241,8 +1242,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 && COUNTBITS(GetAllRoadBits(tile)) > 1 ) {
-				if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicleOnGround(tile) && CHANCE16(1, 40)) {
+					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);
@@ -1416,7 +1417,7 @@
 	}
 
 	for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) {
-		if (!HASBIT(GetRoadTypes(tile), rt)) continue;
+		if (!HasBit(GetRoadTypes(tile), rt)) continue;
 
 		if (GetRoadOwner(tile, rt) == old_player) {
 			SetRoadOwner(tile, rt, new_player == PLAYER_SPECTATOR ? OWNER_NONE : new_player);
@@ -1439,7 +1440,7 @@
 	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;
+				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:
--- a/src/road_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/road_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -29,8 +29,24 @@
 static void ShowRoadDepotPicker();
 
 static bool _remove_button_clicked;
+static bool _one_way_button_clicked;
 
-static byte _place_road_flag;
+/**
+ * Define the values of the RoadFlags
+ * @see CmdBuildLongRoad
+ */
+enum RoadFlags {
+	RF_NONE             = 0x00,
+	RF_START_HALFROAD_Y = 0x01,    // The start tile in Y-dir should have only a half road
+	RF_END_HALFROAD_Y   = 0x02,    // The end tile in Y-dir should have only a half road
+	RF_DIR_Y            = 0x04,    // The direction is Y-dir
+	RF_DIR_X            = RF_NONE, // Dummy; Dir X is set when RF_DIR_Y is not set
+	RF_START_HALFROAD_X = 0x08,    // The start tile in X-dir should have only a half road
+	RF_END_HALFROAD_X   = 0x10,    // The end tile in X-dir should have only a half road
+};
+DECLARE_ENUM_AS_BIT_SET(RoadFlags);
+
+static RoadFlags _place_road_flag;
 
 static RoadType _cur_roadtype;
 
@@ -42,16 +58,50 @@
 	if (success) SndPlayTileFx(SND_1F_SPLAT, tile);
 }
 
-static void PlaceRoad_NE(TileIndex tile)
+/**
+ * Set the initial flags for the road constuction.
+ * The flags are:
+ * @li The direction is the X-dir
+ * @li The first tile has a partitial RoadBit (true or false)
+ *
+ * @param tile The start tile
+ */
+static void PlaceRoad_X_Dir(TileIndex tile)
 {
-	_place_road_flag = (_tile_fract_coords.y >= 8) + 4;
-	VpStartPlaceSizing(tile, VPM_FIX_X, DDSP_PLACE_ROAD_NE);
+	_place_road_flag = RF_DIR_X;
+	if (_tile_fract_coords.x >= 8) _place_road_flag |= RF_START_HALFROAD_X;
+	VpStartPlaceSizing(tile, VPM_FIX_Y, DDSP_PLACE_ROAD_X_DIR);
 }
 
-static void PlaceRoad_NW(TileIndex tile)
+/**
+ * Set the initial flags for the road constuction.
+ * The flags are:
+ * @li The direction is the Y-dir
+ * @li The first tile has a partitial RoadBit (true or false)
+ *
+ * @param tile The start tile
+ */
+static void PlaceRoad_Y_Dir(TileIndex tile)
 {
-	_place_road_flag = (_tile_fract_coords.x >= 8) + 0;
-	VpStartPlaceSizing(tile, VPM_FIX_Y, DDSP_PLACE_ROAD_NW);
+	_place_road_flag = RF_DIR_Y;
+	if (_tile_fract_coords.y >= 8) _place_road_flag |= RF_START_HALFROAD_Y;
+	VpStartPlaceSizing(tile, VPM_FIX_X, DDSP_PLACE_ROAD_Y_DIR);
+}
+
+/**
+ * Set the initial flags for the road constuction.
+ * The flags are:
+ * @li The direction is not set.
+ * @li The first tile has a partitial RoadBit (true or false)
+ *
+ * @param tile The start tile
+ */
+static void PlaceRoad_AutoRoad(TileIndex tile)
+{
+	_place_road_flag = RF_NONE;
+	if (_tile_fract_coords.x >= 8) _place_road_flag |= RF_START_HALFROAD_X;
+	if (_tile_fract_coords.y >= 8) _place_road_flag |= RF_START_HALFROAD_Y;
+	VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_PLACE_AUTOROAD);
 }
 
 static void PlaceRoad_Bridge(TileIndex tile)
@@ -83,6 +133,7 @@
 
 	SpriteID cursor_nesw;           ///< Cursor for building NE and SW bits
 	SpriteID cursor_nwse;           ///< Cursor for building NW and SE bits
+	SpriteID cursor_autoroad;       ///< Cursor for building autoroad
 };
 
 /** What errors/cursors must be shown for several types of roads */
@@ -98,6 +149,7 @@
 
 		SPR_CURSOR_ROAD_NESW,
 		SPR_CURSOR_ROAD_NWSE,
+		SPR_CURSOR_AUTOROAD,
 	},
 	{
 		STR_1804_CAN_T_BUILD_TRAMWAY_HERE,
@@ -110,6 +162,7 @@
 
 		SPR_CURSOR_TRAMWAY_NESW,
 		SPR_CURSOR_TRAMWAY_NWSE,
+		SPR_CURSOR_AUTOTRAM,
 	},
 };
 
@@ -137,7 +190,7 @@
 		ResetObjectToPlace();
 		BuildRoadOutsideStation(tile, dir);
 		/* For a drive-through road stop build connecting road for other entrance */
-		if (HASBIT(p2, 1)) BuildRoadOutsideStation(tile, ReverseDiagDir(dir));
+		if (HasBit(p2, 1)) BuildRoadOutsideStation(tile, ReverseDiagDir(dir));
 	}
 }
 
@@ -151,7 +204,7 @@
 	uint32 p1 = _road_station_picker_orientation;
 
 	if (p1 >= DIAGDIR_END) {
-		SETBIT(p2, 1); // It's a drive-through stop
+		SetBit(p2, 1); // It's a drive-through stop
 		p1 -= DIAGDIR_END; // Adjust picker result to actual direction
 	}
 	DoCommandP(tile, p1, p2, CcRoadDepot, cmd);
@@ -180,130 +233,242 @@
 	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_DEMOLISH_AREA);
 }
 
-
-enum {
-	RTW_ROAD_X        =  3,
-	RTW_ROAD_Y        =  4,
-	RTW_DEMOLISH      =  5,
-	RTW_DEPOT         =  6,
-	RTW_BUS_STATION   =  7,
-	RTW_TRUCK_STATION =  8,
-	RTW_BUILD_BRIDGE  =  9,
-	RTW_BUILD_TUNNEL  = 10,
-	RTW_REMOVE        = 11
+/** Enum referring to the widgets of the build road toolbar */
+enum RoadToolbarWidgets {
+	RTW_CLOSEBOX = 0,
+	RTW_CAPTION,
+	RTW_STICKY,
+	RTW_ROAD_X,
+	RTW_ROAD_Y,
+	RTW_AUTOROAD,
+	RTW_DEMOLISH,
+	RTW_DEPOT,
+	RTW_BUS_STATION,
+	RTW_TRUCK_STATION,
+	RTW_ONE_WAY,
+	RTW_BUILD_BRIDGE,
+	RTW_BUILD_TUNNEL,
+	RTW_REMOVE,
 };
 
-
 typedef void OnButtonClick(Window *w);
 
-static void BuildRoadClick_NE(Window *w)
+/**
+ * Function that handles the click on the
+ *  X road placement button.
+ *
+ * @param w The current window
+ */
+static void BuildRoadClick_X_Dir(Window *w)
 {
-	HandlePlacePushButton(w, RTW_ROAD_X, _road_type_infos[_cur_roadtype].cursor_nesw, 1, PlaceRoad_NE);
+	HandlePlacePushButton(w, RTW_ROAD_X, _road_type_infos[_cur_roadtype].cursor_nwse, VHM_RECT, PlaceRoad_X_Dir);
 }
 
-static void BuildRoadClick_NW(Window *w)
+/**
+ * Function that handles the click on the
+ *  Y road placement button.
+ *
+ * @param w The current window
+ */
+static void BuildRoadClick_Y_Dir(Window *w)
 {
-	HandlePlacePushButton(w, RTW_ROAD_Y, _road_type_infos[_cur_roadtype].cursor_nwse, 1, PlaceRoad_NW);
+	HandlePlacePushButton(w, RTW_ROAD_Y, _road_type_infos[_cur_roadtype].cursor_nesw, VHM_RECT, PlaceRoad_Y_Dir);
 }
 
+/**
+ * Function that handles the click on the
+ *  autoroad placement button.
+ *
+ * @param w The current window
+ */
+static void BuildRoadClick_AutoRoad(Window *w)
+{
+	HandlePlacePushButton(w, RTW_AUTOROAD, _road_type_infos[_cur_roadtype].cursor_autoroad, VHM_RECT, PlaceRoad_AutoRoad);
+}
 
 static void BuildRoadClick_Demolish(Window *w)
 {
-	HandlePlacePushButton(w, RTW_DEMOLISH, ANIMCURSOR_DEMOLISH, 1, PlaceRoad_DemolishArea);
+	HandlePlacePushButton(w, RTW_DEMOLISH, ANIMCURSOR_DEMOLISH, VHM_RECT, PlaceRoad_DemolishArea);
 }
 
 static void BuildRoadClick_Depot(Window *w)
 {
 	if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
-	if (HandlePlacePushButton(w, RTW_DEPOT, SPR_CURSOR_ROAD_DEPOT, 1, PlaceRoad_Depot)) ShowRoadDepotPicker();
+	if (HandlePlacePushButton(w, RTW_DEPOT, SPR_CURSOR_ROAD_DEPOT, VHM_RECT, PlaceRoad_Depot)) ShowRoadDepotPicker();
 }
 
 static void BuildRoadClick_BusStation(Window *w)
 {
 	if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
-	if (HandlePlacePushButton(w, RTW_BUS_STATION, SPR_CURSOR_BUS_STATION, 1, PlaceRoad_BusStation)) ShowRVStationPicker(RoadStop::BUS);
+	if (HandlePlacePushButton(w, RTW_BUS_STATION, SPR_CURSOR_BUS_STATION, VHM_RECT, PlaceRoad_BusStation)) ShowRVStationPicker(RoadStop::BUS);
 }
 
 static void BuildRoadClick_TruckStation(Window *w)
 {
 	if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
-	if (HandlePlacePushButton(w, RTW_TRUCK_STATION, SPR_CURSOR_TRUCK_STATION, 1, PlaceRoad_TruckStation)) ShowRVStationPicker(RoadStop::TRUCK);
+	if (HandlePlacePushButton(w, RTW_TRUCK_STATION, SPR_CURSOR_TRUCK_STATION, VHM_RECT, PlaceRoad_TruckStation)) ShowRVStationPicker(RoadStop::TRUCK);
+}
+
+/**
+ * Function that handles the click on the
+ *  one way road button.
+ *
+ * @param w The current window
+ */
+static void BuildRoadClick_OneWay(Window *w)
+{
+	if (w->IsWidgetDisabled(RTW_ONE_WAY)) return;
+	SetWindowDirty(w);
+	w->ToggleWidgetLoweredState(RTW_ONE_WAY);
+	SetSelectionRed(false);
 }
 
 static void BuildRoadClick_Bridge(Window *w)
 {
-	HandlePlacePushButton(w, RTW_BUILD_BRIDGE, SPR_CURSOR_BRIDGE, 1, PlaceRoad_Bridge);
+	HandlePlacePushButton(w, RTW_BUILD_BRIDGE, SPR_CURSOR_BRIDGE, VHM_RECT, PlaceRoad_Bridge);
 }
 
 static void BuildRoadClick_Tunnel(Window *w)
 {
-	HandlePlacePushButton(w, RTW_BUILD_TUNNEL, SPR_CURSOR_ROAD_TUNNEL, 3, PlaceRoad_Tunnel);
+	HandlePlacePushButton(w, RTW_BUILD_TUNNEL, SPR_CURSOR_ROAD_TUNNEL, VHM_SPECIAL, PlaceRoad_Tunnel);
 }
 
 static void BuildRoadClick_Remove(Window *w)
 {
-	if (IsWindowWidgetDisabled(w, RTW_REMOVE)) return;
+	if (w->IsWidgetDisabled(RTW_REMOVE)) return;
 	SetWindowDirty(w);
 	SndPlayFx(SND_15_BEEP);
-	ToggleWidgetLoweredState(w, RTW_REMOVE);
-	SetSelectionRed(IsWindowWidgetLowered(w, RTW_REMOVE));
+	w->ToggleWidgetLoweredState(RTW_REMOVE);
+	SetSelectionRed(w->IsWidgetLowered(RTW_REMOVE));
 }
 
-
+/** Array with the handlers of the button-clicks for the road-toolbar */
 static OnButtonClick* const _build_road_button_proc[] = {
-	BuildRoadClick_NE,
-	BuildRoadClick_NW,
+	BuildRoadClick_X_Dir,
+	BuildRoadClick_Y_Dir,
+	BuildRoadClick_AutoRoad,
 	BuildRoadClick_Demolish,
 	BuildRoadClick_Depot,
 	BuildRoadClick_BusStation,
 	BuildRoadClick_TruckStation,
+	BuildRoadClick_OneWay,
 	BuildRoadClick_Bridge,
 	BuildRoadClick_Tunnel,
 	BuildRoadClick_Remove
 };
 
+/** Array with the keycode of the button-clicks for the road-toolbar */
+static const uint16 _road_keycodes[] = {
+	'1',
+	'2',
+	'3',
+	'4',
+	'5',
+	'6',
+	'7',
+	'8',
+	'B',
+	'T',
+	'R',
+};
+
+/**
+ * Update the remove button lowered state of the road toolbar
+ *
+ * @param w The toolbar window
+ * @param clicked_widget The widget which the player clicked just now
+ */
+static void UpdateOptionWidgetStatus(Window *w, int clicked_widget)
+{
+	/* The remove and the one way button state is driven
+	 * by the other buttons so they don't act on themselfs.
+	 * Both are only valid if they are able to apply as options. */
+	switch (clicked_widget) {
+		case RTW_REMOVE:
+			w->RaiseWidget(RTW_ONE_WAY);
+			break;
+		case RTW_ONE_WAY:
+			w->RaiseWidget(RTW_REMOVE);
+			break;
+		case RTW_BUS_STATION:
+		case RTW_TRUCK_STATION:
+			w->DisableWidget(RTW_ONE_WAY);
+			w->SetWidgetDisabledState(RTW_REMOVE, !w->IsWidgetLowered(clicked_widget));
+			break;
+		case RTW_ROAD_X:
+		case RTW_ROAD_Y:
+		case RTW_AUTOROAD:
+			w->SetWidgetsDisabledState(!w->IsWidgetLowered(clicked_widget),
+				RTW_REMOVE,
+				RTW_ONE_WAY,
+				WIDGET_LIST_END);
+			break;
+		default:
+			/* When any other buttons than road/station, raise and
+			 * disable the removal button */
+			w->SetWidgetsDisabledState(true,
+				RTW_REMOVE,
+				RTW_ONE_WAY,
+				WIDGET_LIST_END);
+			w->SetWidgetsLoweredState (false,
+				RTW_REMOVE,
+				RTW_ONE_WAY,
+				WIDGET_LIST_END);
+			break;
+	}
+}
+
 static void BuildRoadToolbWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: DisableWindowWidget(w, RTW_REMOVE); break;
+	case WE_CREATE:
+		w->SetWidgetsDisabledState(true,
+			RTW_REMOVE,
+			RTW_ONE_WAY,
+			WIDGET_LIST_END);
+		break;
 
 	case WE_PAINT:
-		if (IsWindowWidgetLowered(w, RTW_ROAD_X) || IsWindowWidgetLowered(w, RTW_ROAD_Y) || IsWindowWidgetLowered(w, RTW_BUS_STATION) || IsWindowWidgetLowered(w, RTW_TRUCK_STATION)) {
-			EnableWindowWidget(w, RTW_REMOVE);
-		}
-		SetWindowWidgetsDisabledState(w, !CanBuildVehicleInfrastructure(VEH_ROAD), 6, 7, 8, WIDGET_LIST_END);
+		w->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_ROAD),
+			RTW_DEPOT,
+			RTW_BUS_STATION,
+			RTW_TRUCK_STATION,
+			WIDGET_LIST_END);
 		DrawWindowWidgets(w);
 		break;
 
-	case WE_CLICK: {
-		if (e->we.click.widget >= 3) _build_road_button_proc[e->we.click.widget - 3](w);
-	} break;
+	case WE_CLICK:
+		if (e->we.click.widget >= RTW_ROAD_X) {
+			_remove_button_clicked = false;
+			_one_way_button_clicked = false;
+			_build_road_button_proc[e->we.click.widget - RTW_ROAD_X](w);
+		}
+		UpdateOptionWidgetStatus(w, e->we.click.widget);
+		break;
 
 	case WE_KEYPRESS:
-		switch (e->we.keypress.keycode) {
-			case '1': BuildRoadClick_NE(w);           break;
-			case '2': BuildRoadClick_NW(w);           break;
-			case '3': BuildRoadClick_Demolish(w);     break;
-			case '4': BuildRoadClick_Depot(w);        break;
-			case '5': BuildRoadClick_BusStation(w);   break;
-			case '6': BuildRoadClick_TruckStation(w); break;
-			case 'B': BuildRoadClick_Bridge(w);       break;
-			case 'T': BuildRoadClick_Tunnel(w);       break;
-			case 'R': BuildRoadClick_Remove(w);       break;
-			default: return;
+		for (uint8 i = 0; i != lengthof(_road_keycodes); i++) {
+			if (e->we.keypress.keycode == _road_keycodes[i]) {
+				e->we.keypress.cont = false;
+				_remove_button_clicked = false;
+				_one_way_button_clicked = false;
+				_build_road_button_proc[i](w);
+				UpdateOptionWidgetStatus(w, i + RTW_ROAD_X);
+				break;
+			}
 		}
 		MarkTileDirty(_thd.pos.x, _thd.pos.y); // redraw tile selection
-		e->we.keypress.cont = false;
 		break;
 
 	case WE_PLACE_OBJ:
-		_remove_button_clicked = IsWindowWidgetLowered(w, RTW_REMOVE);
+		_remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE);
+		_one_way_button_clicked = w->IsWidgetLowered(RTW_ONE_WAY);
 		_place_proc(e->we.place.tile);
 		break;
 
 	case WE_ABORT_PLACE_OBJ:
 		RaiseWindowButtons(w);
-		DisableWindowWidget(w, RTW_REMOVE);
+		w->DisableWidget(RTW_REMOVE);
 		InvalidateWidget(w, RTW_REMOVE);
 
 		w = FindWindowById(WC_BUS_STATION, 0);
@@ -315,13 +480,38 @@
 		break;
 
 	case WE_PLACE_DRAG:
+		/* Here we update the end tile flags
+		 * of the road placement actions.
+		 * At first we reset the end halfroad
+		 * bits and if needed we set them again. */
 		switch (e->we.place.select_proc) {
-			case DDSP_PLACE_ROAD_NE:
-				_place_road_flag = (_place_road_flag & ~2) | ((e->we.place.pt.y & 8) >> 2);
+			case DDSP_PLACE_ROAD_X_DIR:
+				_place_road_flag &= ~RF_END_HALFROAD_X;
+				if (e->we.place.pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X;
 				break;
 
-			case DDSP_PLACE_ROAD_NW:
-				_place_road_flag = (_place_road_flag & ~2) | ((e->we.place.pt.x & 8) >> 2);
+			case DDSP_PLACE_ROAD_Y_DIR:
+				_place_road_flag &= ~RF_END_HALFROAD_Y;
+				if (e->we.place.pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y;
+				break;
+
+			case DDSP_PLACE_AUTOROAD:
+				_place_road_flag &= ~(RF_END_HALFROAD_Y | RF_END_HALFROAD_X);
+				if (e->we.place.pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y;
+				if (e->we.place.pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X;
+
+				/* For autoroad we need to update the
+				 * direction of the road */
+				if (_thd.size.x > _thd.size.y || (_thd.size.x == _thd.size.y &&
+						( (_tile_fract_coords.x < _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) < 16) ||
+						  (_tile_fract_coords.x > _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) > 16) ))) {
+					/* Set dir = X */
+					_place_road_flag &= ~RF_DIR_Y;
+				} else {
+					/* Set dir = Y */
+					_place_road_flag |= RF_DIR_Y;
+				}
+
 				break;
 		}
 
@@ -343,10 +533,17 @@
 					DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
 					break;
 
-				case DDSP_PLACE_ROAD_NE:
-				case DDSP_PLACE_ROAD_NW:
-					DoCommandP(end_tile, start_tile, _place_road_flag | (_cur_roadtype << 3) | _ctrl_pressed << 5, CcPlaySound1D,
-						_remove_button_clicked ?
+				case DDSP_PLACE_ROAD_X_DIR:
+				case DDSP_PLACE_ROAD_Y_DIR:
+				case DDSP_PLACE_AUTOROAD:
+					/* Flag description:
+					 * Use the first three bits (0x07) if dir == Y
+					 * else use the last 2 bits (X dir has
+					 * not the 3rd bit set) */
+					_place_road_flag = (RoadFlags)((_place_road_flag & RF_DIR_Y) ? (_place_road_flag & 0x07) : (_place_road_flag >> 3));
+
+					DoCommandP(end_tile, start_tile, _place_road_flag | (_cur_roadtype << 3) | (_one_way_button_clicked << 5), CcPlaySound1D,
+						(_ctrl_pressed || _remove_button_clicked) ?
 						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;
@@ -368,51 +565,58 @@
 	}
 }
 
+/** Widget definition of the build road toolbar */
 static const Widget _build_road_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   205,     0,    13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   206,   217,     0,    13, 0x0,                        STR_STICKY_BUTTON},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},             // RTW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   250,     0,    13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},   // RTW_CAPTION
+{  WWT_STICKYBOX,   RESIZE_NONE,     7,   251,   262,     0,    13, 0x0,                        STR_STICKY_BUTTON},                 // RTW_STICKY
 
-{     WWT_IMGBTN,   RESIZE_NONE,     7,     0,    21,    14,    35, SPR_IMG_ROAD_NW,            STR_180B_BUILD_ROAD_SECTION},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_ROAD_NE,            STR_180B_BUILD_ROAD_SECTION},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_ROAD_DEPOT,         STR_180C_BUILD_ROAD_VEHICLE_DEPOT},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_BUS_STATION,        STR_180D_BUILD_BUS_STATION},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   110,   131,    14,    35, SPR_IMG_TRUCK_BAY,          STR_180E_BUILD_TRUCK_LOADING_BAY},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   132,   173,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_ROAD_BRIDGE},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   174,   195,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_ROAD_TUNNEL},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   196,   217,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,     0,    21,    14,    35, SPR_IMG_ROAD_X_DIR,         STR_180B_BUILD_ROAD_SECTION},       // RTW_ROAD_X
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_ROAD_Y_DIR,         STR_180B_BUILD_ROAD_SECTION},       // RTW_ROAD_Y
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_AUTOROAD,           STR_BUILD_AUTOROAD_TIP},            // RTW_AUTOROAD
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},   // RTW_DEMOLISH
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_ROAD_DEPOT,         STR_180C_BUILD_ROAD_VEHICLE_DEPOT}, // RTW_DEPOT
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   110,   131,    14,    35, SPR_IMG_BUS_STATION,        STR_180D_BUILD_BUS_STATION},        // RTW_BUS_STATION
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   132,   153,    14,    35, SPR_IMG_TRUCK_BAY,          STR_180E_BUILD_TRUCK_LOADING_BAY},  // RTW_TRUCK_STATION
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   154,   175,    14,    35, SPR_IMG_ROAD_ONE_WAY,       STR_TOGGLE_ONE_WAY_ROAD},           // RTW_ONE_WAY
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   176,   218,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_ROAD_BRIDGE},        // RTW_BUILD_BRIDGE
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   219,   240,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_ROAD_TUNNEL},        // RTW_BUILD_TUNNEL
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   241,   262,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR},  // RTW_REMOVE
+
 {   WIDGETS_END},
 };
 
 static const WindowDesc _build_road_desc = {
-	WDP_ALIGN_TBR, 22, 218, 36, 218, 36,
+	WDP_ALIGN_TBR, 22, 263, 36, 263, 36,
 	WC_BUILD_TOOLBAR, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_build_road_widgets,
 	BuildRoadToolbWndProc
 };
 
+/** Widget definition of the build tram toolbar */
 static const Widget _build_tramway_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   205,     0,    13, STR_1802_TRAMWAY_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   206,   217,     0,    13, 0x0,                        STR_STICKY_BUTTON},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},                     // RTW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   228,     0,    13, STR_1802_TRAMWAY_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},        // RTW_CAPTION
+{  WWT_STICKYBOX,   RESIZE_NONE,     7,   229,   240,     0,    13, 0x0,                        STR_STICKY_BUTTON},                         // RTW_STICKY
 
-{     WWT_IMGBTN,   RESIZE_NONE,     7,     0,    21,    14,    35, SPR_IMG_TRAMWAY_NW,         STR_180B_BUILD_TRAMWAY_SECTION},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_TRAMWAY_NE,         STR_180B_BUILD_TRAMWAY_SECTION},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_ROAD_DEPOT,         STR_180C_BUILD_TRAM_VEHICLE_DEPOT},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_BUS_STATION,        STR_180D_BUILD_PASSENGER_TRAM_STATION},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   110,   131,    14,    35, SPR_IMG_TRUCK_BAY,          STR_180E_BUILD_CARGO_TRAM_STATION},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,     0,    21,    14,    35, SPR_IMG_TRAMWAY_X_DIR,      STR_180B_BUILD_TRAMWAY_SECTION},            // RTW_ROAD_X
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_TRAMWAY_Y_DIR,      STR_180B_BUILD_TRAMWAY_SECTION},            // RTW_ROAD_Y
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_AUTOTRAM,           STR_BUILD_AUTOTRAM_TIP},                    // RTW_AUTOROAD
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},           // RTW_DEMOLISH
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_ROAD_DEPOT,         STR_180C_BUILD_TRAM_VEHICLE_DEPOT},         // RTW_DEPOT
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   110,   131,    14,    35, SPR_IMG_BUS_STATION,        STR_180D_BUILD_PASSENGER_TRAM_STATION},     // RTW_BUS_STATION
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   132,   153,    14,    35, SPR_IMG_TRUCK_BAY,          STR_180E_BUILD_CARGO_TRAM_STATION},         // RTW_TRUCK_STATION
+{      WWT_EMPTY,   RESIZE_NONE,     0,     0,     0,     0,     0, 0x0,                        STR_NULL},                                  // RTW_ONE_WAY
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   154,   196,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_TRAMWAY_BRIDGE},             // RTW_BUILD_BRIDGE
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   197,   218,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_TRAMWAY_TUNNEL},             // RTW_BUILD_TUNNEL
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   219,   240,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS}, // RTW_REMOVE
 
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   132,   173,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_TRAMWAY_BRIDGE},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   174,   195,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_TRAMWAY_TUNNEL},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   196,   217,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS},
 {   WIDGETS_END},
 };
 
 static const WindowDesc _build_tramway_desc = {
-	WDP_ALIGN_TBR, 22, 218, 36, 218, 36,
+	WDP_ALIGN_TBR, 22, 241, 36, 241, 36,
 	WC_BUILD_TOOLBAR, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_build_tramway_widgets,
@@ -429,25 +633,28 @@
 	if (_patches.link_terraform_toolbar) ShowTerraformToolbar(w);
 }
 
+/** Widget definition of the build road toolbar in the scenario editor */
 static const Widget _build_road_scen_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   139,     0,    13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   140,   151,     0,    13, 0x0,                        STR_STICKY_BUTTON},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},            // RTW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   184,     0,    13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},  // RTW_CAPTION
+{  WWT_STICKYBOX,   RESIZE_NONE,     7,   185,   196,     0,    13, 0x0,                        STR_STICKY_BUTTON},                // RTW_STICKY
 
-{     WWT_IMGBTN,   RESIZE_NONE,     7,     0,    21,    14,    35, SPR_IMG_ROAD_NW,            STR_180B_BUILD_ROAD_SECTION},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_ROAD_NE,            STR_180B_BUILD_ROAD_SECTION},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},
-{      WWT_EMPTY,   RESIZE_NONE,     0,     0,     0,     0,     0, 0x0,                        STR_NULL},
-{      WWT_EMPTY,   RESIZE_NONE,     0,     0,     0,     0,     0, 0x0,                        STR_NULL},
-{      WWT_EMPTY,   RESIZE_NONE,     0,     0,     0,     0,     0, 0x0,                        STR_NULL},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,   107,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_ROAD_BRIDGE},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   108,   129,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_ROAD_TUNNEL},
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   130,   151,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,     0,    21,    14,    35, SPR_IMG_ROAD_X_DIR,         STR_180B_BUILD_ROAD_SECTION},      // RTW_ROAD_X
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_ROAD_Y_DIR,         STR_180B_BUILD_ROAD_SECTION},      // RTW_ROAD_Y
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_AUTOROAD,           STR_BUILD_AUTOROAD_TIP},           // RTW_AUTOROAD
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},  // RTW_DEMOLISH
+{      WWT_EMPTY,   RESIZE_NONE,     0,     0,     0,     0,     0, 0x0,                        STR_NULL},                         // RTW_DEPOT
+{      WWT_EMPTY,   RESIZE_NONE,     0,     0,     0,     0,     0, 0x0,                        STR_NULL},                         // RTW_BUS_STATION
+{      WWT_EMPTY,   RESIZE_NONE,     0,     0,     0,     0,     0, 0x0,                        STR_NULL},                         // RTW_TRUCK_STATION
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_ROAD_ONE_WAY,       STR_TOGGLE_ONE_WAY_ROAD},          // RTW_ONE_WAY
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   110,   152,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_ROAD_BRIDGE},       // RTW_BUILD_BRIDGE
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   153,   174,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_ROAD_TUNNEL},       // RTW_BUILD_TUNNEL
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   175,   196,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR}, // RTW_REMOVE
 {   WIDGETS_END},
 };
 
 static const WindowDesc _build_road_scen_desc = {
-	WDP_AUTO, WDP_AUTO, 152, 36, 152, 36,
+	WDP_AUTO, WDP_AUTO, 197, 36, 197, 36,
 	WC_SCEN_BUILD_ROAD, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_build_road_scen_widgets,
@@ -460,10 +667,21 @@
 	AllocateWindowDescFront(&_build_road_scen_desc, 0);
 }
 
+/** Enum referring to the widgets of the build road depot window */
+enum BuildRoadDepotWidgets {
+	BRDW_CLOSEBOX = 0,
+	BRDW_CAPTION,
+	BRDW_BACKGROUND,
+	BRDW_DEPOT_NE,
+	BRDW_DEPOT_SE,
+	BRDW_DEPOT_SW,
+	BRDW_DEPOT_NW,
+};
+
 static void BuildRoadDepotWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: LowerWindowWidget(w, _road_depot_orientation + 3); break;
+	case WE_CREATE: w->LowerWidget(_road_depot_orientation + BRDW_DEPOT_NE); break;
 
 	case WE_PAINT:
 		DrawWindowWidgets(w);
@@ -474,17 +692,20 @@
 		DrawRoadDepotSprite( 2, 17, DIAGDIR_NW, _cur_roadtype);
 		break;
 
-	case WE_CLICK: {
+	case WE_CLICK:
 		switch (e->we.click.widget) {
-		case 3: case 4: case 5: case 6:
-			RaiseWindowWidget(w, _road_depot_orientation + 3);
-			_road_depot_orientation = (DiagDirection)(e->we.click.widget - 3);
-			LowerWindowWidget(w, _road_depot_orientation + 3);
-			SndPlayFx(SND_15_BEEP);
-			SetWindowDirty(w);
-			break;
+			case BRDW_DEPOT_NW:
+			case BRDW_DEPOT_NE:
+			case BRDW_DEPOT_SW:
+			case BRDW_DEPOT_SE:
+				w->RaiseWidget(_road_depot_orientation + BRDW_DEPOT_NE);
+				_road_depot_orientation = (DiagDirection)(e->we.click.widget - BRDW_DEPOT_NE);
+				w->LowerWidget(_road_depot_orientation + BRDW_DEPOT_NE);
+				SndPlayFx(SND_15_BEEP);
+				SetWindowDirty(w);
+				break;
 		}
-	} break;
+		break;
 
 	case WE_MOUSELOOP:
 		if (WP(w, def_d).close) DeleteWindow(w);
@@ -496,25 +717,27 @@
 	}
 }
 
+/** Widget definition of the build road depot window */
 static const Widget _build_road_depot_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   139,     0,    13, STR_1806_ROAD_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   139,    14,   121, 0x0,                             STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                             STR_1813_SELECT_ROAD_VEHICLE_DEPOT},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                             STR_1813_SELECT_ROAD_VEHICLE_DEPOT},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                             STR_1813_SELECT_ROAD_VEHICLE_DEPOT},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                             STR_1813_SELECT_ROAD_VEHICLE_DEPOT},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},              // BRDW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   139,     0,    13, STR_1806_ROAD_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},    // BRDW_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   139,    14,   121, 0x0,                             STR_NULL},                           // BRDW_BACKGROUND
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                             STR_1813_SELECT_ROAD_VEHICLE_DEPOT}, // BRDW_DEPOT_NE
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                             STR_1813_SELECT_ROAD_VEHICLE_DEPOT}, // BRDW_DEPOT_SE
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                             STR_1813_SELECT_ROAD_VEHICLE_DEPOT}, // BRDW_DEPOT_SW
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                             STR_1813_SELECT_ROAD_VEHICLE_DEPOT}, // BRDW_DEPOT_NW
 {   WIDGETS_END},
 };
 
+/** Widget definition of the build tram depot window */
 static const Widget _build_tram_depot_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   139,     0,    13, STR_1806_TRAM_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   139,    14,   121, 0x0,                             STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},              // BRDW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   139,     0,    13, STR_1806_TRAM_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},    // BRDW_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   139,    14,   121, 0x0,                             STR_NULL},                           // BRDW_BACKGROUND
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT}, // BRDW_DEPOT_NE
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT}, // BRDW_DEPOT_SE
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT}, // BRDW_DEPOT_SW
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT}, // BRDW_DEPOT_NW
 {   WIDGETS_END},
 };
 
@@ -539,6 +762,22 @@
 	AllocateWindowDesc(_cur_roadtype == ROADTYPE_ROAD ? &_build_road_depot_desc : &_build_tram_depot_desc);
 }
 
+/** Enum referring to the widgets of the build road station window */
+enum BuildRoadStationWidgets {
+	BRSW_CLOSEBOX = 0,
+	BRSW_CAPTION,
+	BRSW_BACKGROUND,
+	BRSW_STATION_NE,
+	BRSW_STATION_SE,
+	BRSW_STATION_SW,
+	BRSW_STATION_NW,
+	BRSW_STATION_X,
+	BRSW_STATION_Y,
+	BRSW_LT_OFF,
+	BRSW_LT_ON,
+	BRSW_INFO,
+};
+
 static void RoadStationPickerWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
@@ -547,10 +786,15 @@
 		if (_cur_roadtype == ROADTYPE_TRAM && _road_station_picker_orientation < DIAGDIR_END) {
 			_road_station_picker_orientation = DIAGDIR_END;
 		}
-		SetWindowWidgetsDisabledState(w, _cur_roadtype == ROADTYPE_TRAM, 3, 4, 5, 6, WIDGET_LIST_END);
+		w->SetWidgetsDisabledState(_cur_roadtype == ROADTYPE_TRAM,
+			BRSW_STATION_NE,
+			BRSW_STATION_SE,
+			BRSW_STATION_SW,
+			BRSW_STATION_NW,
+			WIDGET_LIST_END);
 
-		LowerWindowWidget(w, _road_station_picker_orientation + 3);
-		LowerWindowWidget(w, _station_show_coverage + 9);
+		w->LowerWidget(_road_station_picker_orientation + BRSW_STATION_NE);
+		w->LowerWidget(_station_show_coverage + BRSW_LT_OFF);
 		break;
 
 	case WE_PAINT: {
@@ -586,20 +830,27 @@
 
 	case WE_CLICK: {
 		switch (e->we.click.widget) {
-		case 3: case 4: case 5: case 6: case 7: case 8:
-			RaiseWindowWidget(w, _road_station_picker_orientation + 3);
-			_road_station_picker_orientation = (DiagDirection)(e->we.click.widget - 3);
-			LowerWindowWidget(w, _road_station_picker_orientation + 3);
-			SndPlayFx(SND_15_BEEP);
-			SetWindowDirty(w);
-			break;
-		case 9: case 10:
-			RaiseWindowWidget(w, _station_show_coverage + 9);
-			_station_show_coverage = (e->we.click.widget != 9);
-			LowerWindowWidget(w, _station_show_coverage + 9);
-			SndPlayFx(SND_15_BEEP);
-			SetWindowDirty(w);
-			break;
+			case BRSW_STATION_NE:
+			case BRSW_STATION_SE:
+			case BRSW_STATION_SW:
+			case BRSW_STATION_NW:
+			case BRSW_STATION_X:
+			case BRSW_STATION_Y:
+				w->RaiseWidget(_road_station_picker_orientation + BRSW_STATION_NE);
+				_road_station_picker_orientation = (DiagDirection)(e->we.click.widget - BRSW_STATION_NE);
+				w->LowerWidget(_road_station_picker_orientation + BRSW_STATION_NE);
+				SndPlayFx(SND_15_BEEP);
+				SetWindowDirty(w);
+				break;
+
+			case BRSW_LT_OFF:
+			case BRSW_LT_ON:
+				w->RaiseWidget(_station_show_coverage + BRSW_LT_OFF);
+				_station_show_coverage = (e->we.click.widget != BRSW_LT_OFF);
+				w->LowerWidget(_station_show_coverage + BRSW_LT_OFF);
+				SndPlayFx(SND_15_BEEP);
+				SetWindowDirty(w);
+				break;
 		}
 	} break;
 
@@ -618,19 +869,22 @@
 	}
 }
 
+/** Widget definition of the build raod station window */
 static const Widget _rv_station_picker_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   206,     0,    13, STR_NULL,                         STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   206,    14,   176, 0x0,                              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    17,    66, 0x0,                              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    69,   118, 0x0,                              STR_NULL},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    10,    69,   133,   144, STR_02DB_OFF,                     STR_3065_DON_T_HIGHLIGHT_COVERAGE},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    70,   129,   133,   144, STR_02DA_ON,                      STR_3064_HIGHLIGHT_COVERAGE_AREA},
-{      WWT_LABEL,   RESIZE_NONE,     7,     0,   139,   120,   133, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL},
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},             // BRSW_CLOSEBOX
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   206,     0,    13, STR_NULL,                         STR_018C_WINDOW_TITLE_DRAG_THIS},   // BRSW_CAPTION
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   206,    14,   176, 0x0,                              STR_NULL},                          // BRSW_BACKGROUND
+
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                              STR_NULL},                          // BRSW_STATION_NE
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                              STR_NULL},                          // BRSW_STATION_SE
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                              STR_NULL},                          // BRSW_STATION_SW
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                              STR_NULL},                          // BRSW_STATION_NW
+{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    17,    66, 0x0,                              STR_NULL},                          // BRSW_STATION_X
+{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    69,   118, 0x0,                              STR_NULL},                          // BRSW_STATION_Y
+
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    10,    69,   133,   144, STR_02DB_OFF,                     STR_3065_DON_T_HIGHLIGHT_COVERAGE}, // BRSW_LT_OFF
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    70,   129,   133,   144, STR_02DA_ON,                      STR_3064_HIGHLIGHT_COVERAGE_AREA},  // BRSW_LT_ON
+{      WWT_LABEL,   RESIZE_NONE,     7,     0,   139,   120,   133, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL},                          // BRSW_INFO
 {   WIDGETS_END},
 };
 
@@ -648,8 +902,8 @@
 	if (w == NULL) return;
 
 	w->window_class = (rs == RoadStop::BUS) ? WC_BUS_STATION : WC_TRUCK_STATION;
-	w->widget[1].data = _road_type_infos[_cur_roadtype].picker_title[rs];
-	for (uint i = 3; i < 9; i++) w->widget[i].tooltips = _road_type_infos[_cur_roadtype].picker_tooltip[rs];
+	w->widget[BRSW_CAPTION].data = _road_type_infos[_cur_roadtype].picker_title[rs];
+	for (uint i = BRSW_STATION_NE; i < BRSW_LT_OFF; i++) w->widget[i].tooltips = _road_type_infos[_cur_roadtype].picker_tooltip[rs];
 }
 
 void InitializeRoadGui()
--- a/src/road_map.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/road_map.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -16,7 +16,7 @@
 
 RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt)
 {
-	if (!HASBIT(GetRoadTypes(tile), rt)) return ROAD_NONE;
+	if (!HasBit(GetRoadTypes(tile), rt)) return ROAD_NONE;
 
 	switch (GetTileType(tile)) {
 		case MP_ROAD:
@@ -51,7 +51,7 @@
 	uint32 r;
 
 	/* Don't allow local authorities to build roads through road depots or road stops. */
-	if ((IsTileType(tile, MP_ROAD) && IsTileDepotType(tile, TRANSPORT_ROAD)) || (IsTileType(tile, MP_STATION) && !IsDriveThroughStopTile(tile)) || !HASBIT(GetRoadTypes(tile), rt)) {
+	if ((IsTileType(tile, MP_ROAD) && IsTileDepotType(tile, TRANSPORT_ROAD)) || (IsTileType(tile, MP_STATION) && !IsDriveThroughStopTile(tile)) || !HasBit(GetRoadTypes(tile), rt)) {
 		return TRACK_BIT_NONE;
 	}
 
--- a/src/road_map.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/road_map.h	Mon Dec 03 23:39:38 2007 +0000
@@ -194,31 +194,31 @@
 static inline void UnbarCrossing(TileIndex t)
 {
 	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
-	CLRBIT(_m[t].m4, 5);
+	ClrBit(_m[t].m4, 5);
 }
 
 static inline void BarCrossing(TileIndex t)
 {
 	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
-	SETBIT(_m[t].m4, 5);
+	SetBit(_m[t].m4, 5);
 }
 
 static inline bool IsCrossingBarred(TileIndex t)
 {
 	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
-	return HASBIT(_m[t].m4, 5);
+	return HasBit(_m[t].m4, 5);
 }
 
 #define IsOnDesert IsOnSnow
 static inline bool IsOnSnow(TileIndex t)
 {
-	return HASBIT(_m[t].m3, 7);
+	return HasBit(_m[t].m3, 7);
 }
 
 #define ToggleDesert ToggleSnow
 static inline void ToggleSnow(TileIndex t)
 {
-	TOGGLEBIT(_m[t].m3, 7);
+	ToggleBit(_m[t].m3, 7);
 }
 
 
@@ -311,10 +311,10 @@
 	SetTileOwner(t, road);
 	_m[t].m2 = town;
 	_m[t].m3 = 0;
-	_m[t].m4 = (HASBIT(rot, ROADTYPE_TRAM) ? bits : 0) << 4 | (HASBIT(rot, ROADTYPE_ROAD) ? bits : 0);
+	_m[t].m4 = (HasBit(rot, ROADTYPE_TRAM) ? bits : 0) << 4 | (HasBit(rot, ROADTYPE_ROAD) ? bits : 0);
 	_m[t].m5 = ROAD_TILE_NORMAL << 6;
 	SetRoadOwner(t, ROADTYPE_TRAM, tram);
-	SB(_m[t].m6, 2, 4, HASBIT(rot, ROADTYPE_HWAY) ? bits : 0);
+	SB(_m[t].m6, 2, 4, HasBit(rot, ROADTYPE_HWAY) ? bits : 0);
 	_me[t].m7 = rot << 5 | hway;
 }
 
--- a/src/roadveh_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/roadveh_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -129,7 +129,7 @@
 
 	uint16 veh_len = GetVehicleCallback(CBID_VEHICLE_LENGTH, 0, 0, v->engine_type, v);
 	if (veh_len != CALLBACK_FAILED) {
-		length -= clamp(veh_len, 0, 7);
+		length -= Clamp(veh_len, 0, 7);
 	}
 
 	return length;
@@ -177,7 +177,7 @@
 	if (!IsTileDepotType(tile, TRANSPORT_ROAD)) return CMD_ERROR;
 	if (!IsTileOwner(tile, _current_player)) return CMD_ERROR;
 
-	if (HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM) != HASBIT(EngInfo(p1)->misc_flags, EF_ROAD_TRAM)) return_cmd_error(STR_DEPOT_WRONG_DEPOT_TYPE);
+	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, false);
 
@@ -192,7 +192,7 @@
 	v = vl[0];
 
 	/* find the first free roadveh id */
-	unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_ROAD);
+	unit_num = HasBit(p2, 0) ? 0 : GetFreeUnitNumber(VEH_ROAD);
 	if (unit_num > _patches.max_roadveh)
 		return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 
@@ -202,6 +202,7 @@
 
 		const RoadVehicleInfo *rvi = RoadVehInfo(p1);
 
+		v = new (v) RoadVehicle();
 		v->unitnumber = unit_num;
 		v->direction = DiagDirToDir(GetRoadDepotDirection(tile));
 		v->owner = _current_player;
@@ -247,17 +248,16 @@
 		v->date_of_last_service = _date;
 		v->build_year = _cur_year;
 
-		v = new (v) RoadVehicle();
 		v->cur_image = 0xC15;
 		v->random_bits = VehicleRandomBits();
 		SetRoadVehFront(v);
 
-		v->u.road.roadtype = HASBIT(EngInfo(v->engine_type)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD;
+		v->u.road.roadtype = HasBit(EngInfo(v->engine_type)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD;
 		v->u.road.compatible_roadtypes = RoadTypeToRoadTypes(v->u.road.roadtype);
 		v->u.road.cached_veh_length = GetRoadVehLength(v);
 
 		v->vehicle_flags = 0;
-		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
+		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
 
 		v->cargo_cap = GetVehicleProperty(v, 0x0F, rvi->capacity);
 
@@ -359,12 +359,16 @@
 
 	if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
 
+	if (HASBITS(v->vehstatus, VS_CRASHED)) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE);
+
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
 	if (!CheckRoadVehInDepotStopped(v)) {
 		return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE);
 	}
 
+	CommandCost ret(-v->value);
+
 	if (flags & DC_EXEC) {
 		// Invalidate depot
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
@@ -375,7 +379,7 @@
 		delete v;
 	}
 
-	return CommandCost(-v->value);
+	return ret;
 }
 
 struct RoadFindDepotData {
@@ -472,13 +476,13 @@
 
 	/* If the current orders are already goto-depot */
 	if (v->current_order.type == OT_GOTO_DEPOT) {
-		if (!!(p2 & DEPOT_SERVICE) == HASBIT(v->current_order.flags, OFB_HALT_IN_DEPOT)) {
+		if (!!(p2 & DEPOT_SERVICE) == HasBit(v->current_order.flags, OFB_HALT_IN_DEPOT)) {
 			/* We called with a different DEPOT_SERVICE setting.
 			 * 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);
+				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);
 			}
 			return CommandCost();
@@ -488,7 +492,7 @@
 		if (flags & DC_EXEC) {
 			/* If the orders to 'goto depot' are in the orders list (forced servicing),
 			 * then skip to the next order; effectively cancelling this forced service */
-			if (HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS))
+			if (HasBit(v->current_order.flags, OFB_PART_OF_ORDERS))
 				v->cur_order_index++;
 
 			v->current_order.type = OT_DUMMY;
@@ -507,7 +511,7 @@
 		ClearSlot(v);
 		v->current_order.type = OT_GOTO_DEPOT;
 		v->current_order.flags = OF_NON_STOP;
-		if (!(p2 & DEPOT_SERVICE)) SETBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
+		if (!(p2 & DEPOT_SERVICE)) SetBit(v->current_order.flags, OFB_HALT_IN_DEPOT);
 		v->current_order.refit_cargo = CT_INVALID;
 		v->current_order.dest = dep->index;
 		v->dest_tile = dep->xy;
@@ -593,7 +597,7 @@
 	rs->SetEntranceBusy(false);
 
 	/* Free the parking bay */
-	rs->FreeBay(HASBIT(v->u.road.state, RVS_USING_SECOND_BAY));
+	rs->FreeBay(HasBit(v->u.road.state, RVS_USING_SECOND_BAY));
 }
 
 static void DeleteLastRoadVeh(Vehicle *v)
@@ -667,9 +671,9 @@
 
 	return
 		v->type == VEH_TRAIN &&
-		myabs(v->z_pos - u->z_pos) <= 6 &&
-		myabs(v->x_pos - u->x_pos) <= 4 &&
-		myabs(v->y_pos - u->y_pos) <= 4 ?
+		abs(v->z_pos - u->z_pos) <= 6 &&
+		abs(v->x_pos - u->x_pos) <= 4 &&
+		abs(v->y_pos - u->y_pos) <= 4 ?
 			v : NULL;
 }
 
@@ -866,7 +870,7 @@
 	return
 		v->type == VEH_ROAD &&
 		!v->IsInDepot() &&
-		myabs(v->z_pos - rvf->veh->z_pos) < 6 &&
+		abs(v->z_pos - rvf->veh->z_pos) < 6 &&
 		v->direction == rvf->dir &&
 		rvf->veh->First() != v->First() &&
 		(dist_x[v->direction] >= 0 || (x_diff > dist_x[v->direction] && x_diff <= 0)) &&
@@ -880,25 +884,30 @@
 {
 	RoadVehFindData rvf;
 	Vehicle *u;
+	Vehicle *front = v->First();
 
-	if (v->u.road.reverse_ctr != 0) return NULL;
+	if (front->u.road.reverse_ctr != 0) return NULL;
 
 	rvf.x = x;
 	rvf.y = y;
 	rvf.dir = dir;
 	rvf.veh = v;
-	u = (Vehicle*)VehicleFromPosXY(x, y, &rvf, EnumCheckRoadVehClose);
+	if (front->u.road.state == RVSB_WORMHOLE) {
+		u = (Vehicle*)VehicleFromPos(v->tile, &rvf, EnumCheckRoadVehClose);
+	} else {
+		u = (Vehicle*)VehicleFromPosXY(x, y, &rvf, EnumCheckRoadVehClose);
+	}
 
 	/* This code protects a roadvehicle from being blocked for ever
 	 * If more than 1480 / 74 days a road vehicle is blocked, it will
 	 * drive just through it. The ultimate backup-code of TTD.
 	 * It can be disabled. */
 	if (u == NULL) {
-		v->u.road.blocked_ctr = 0;
+		front->u.road.blocked_ctr = 0;
 		return NULL;
 	}
 
-	if (++v->u.road.blocked_ctr > 1480) return NULL;
+	if (++front->u.road.blocked_ctr > 1480) return NULL;
 
 	return u;
 }
@@ -1006,7 +1015,7 @@
 	const OvertakeData* od = (OvertakeData*)data;
 
 	return
-		v->tile == od->tile && v->type == VEH_ROAD && v != od->u && v != od->v ?
+		v->tile == od->tile && v->type == VEH_ROAD && v->First() == v && v != od->u && v != od->v ?
 			v : NULL;
 }
 
@@ -1091,7 +1100,7 @@
 static int PickRandomBit(uint bits)
 {
 	uint i;
-	uint num = RandomRange(COUNTBITS(bits));
+	uint num = RandomRange(CountBits(bits));
 
 	for (i = 0; !(bits & 1) || (int)--num >= 0; bits >>= 1, i++) {}
 	return i;
@@ -1202,7 +1211,7 @@
 	}
 
 	/* Only one track to choose between? */
-	if (!(KillFirstBit2x64(trackdirs))) {
+	if (KillFirstBit(trackdirs) == TRACKDIR_BIT_NONE) {
 		return_track(FindFirstBit2x64(trackdirs));
 	}
 
@@ -1264,25 +1273,24 @@
 		uint best_dist = (uint)-1;
 		uint best_maxlen = (uint)-1;
 		uint bitmask = (uint)trackdirs;
-		for (int i = 0; bitmask != 0; bitmask >>= 1, i++) {
-			if (HASBIT(bitmask, 0)) {
-				if (best_track == INVALID_TRACKDIR) best_track = (Trackdir)i; // in case we don't find the path, just pick a track
-				frd.maxtracklen = (uint)-1;
-				frd.mindist = (uint)-1;
-				FollowTrack(tile, 0x2000 | TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
+		uint i;
+		FOR_EACH_SET_BIT(i, bitmask) {
+			if (best_track == INVALID_TRACKDIR) best_track = (Trackdir)i; // in case we don't find the path, just pick a track
+			frd.maxtracklen = (uint)-1;
+			frd.mindist = (uint)-1;
+			FollowTrack(tile, 0x2000 | TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
 
-				if (frd.mindist < best_dist || (frd.mindist == best_dist && frd.maxtracklen < best_maxlen)) {
-					best_dist = frd.mindist;
-					best_maxlen = frd.maxtracklen;
-					best_track = (Trackdir)i;
-				}
+			if (frd.mindist < best_dist || (frd.mindist == best_dist && frd.maxtracklen < best_maxlen)) {
+				best_dist = frd.mindist;
+				best_maxlen = frd.maxtracklen;
+				best_track = (Trackdir)i;
 			}
 		}
 	}
 
 found_best_track:;
 
-	if (HASBIT(signal, best_track)) return INVALID_TRACKDIR;
+	if (HasBit(signal, best_track)) return INVALID_TRACKDIR;
 
 	return best_track;
 }
@@ -1316,12 +1324,16 @@
 
 	/* Start frames for when a vehicle enters a tile/changes its state.
 	 * The start frame is different for vehicles that turned around or
-	 * are leaving the depot as the do not start at the edge of the tile */
-	RVC_DEFAULT_START_FRAME      = 0,
-	RVC_TURN_AROUND_START_FRAME  = 1,
-	RVC_DEPOT_START_FRAME        = 6,
+	 * are leaving the depot as the do not start at the edge of the tile.
+	 * For trams there are a few different start frames as there are two
+	 * places where trams can turn. */
+	RVC_DEFAULT_START_FRAME                =  0,
+	RVC_TURN_AROUND_START_FRAME            =  1,
+	RVC_DEPOT_START_FRAME                  =  6,
+	RVC_START_FRAME_AFTER_LONG_TRAM        = 22,
+	RVC_TURN_AROUND_START_FRAME_SHORT_TRAM = 16,
 	/* Stop frame for a vehicle in a drive-through stop */
-	RVC_DRIVE_THROUGH_STOP_FRAME = 7
+	RVC_DRIVE_THROUGH_STOP_FRAME           =  7
 };
 
 struct RoadDriveEntry {
@@ -1403,10 +1415,32 @@
 
 		if (diag_dir == INVALID_DIAGDIR) return INVALID_TRACKDIR;
 		dir = DiagdirToDiagTrackdir(diag_dir);
-	} else if (HASBIT(prev_state, RVS_IN_DT_ROAD_STOP)) {
+	} else if (HasBit(prev_state, RVS_IN_DT_ROAD_STOP)) {
 		dir = (Trackdir)(prev_state & RVSB_ROAD_STOP_TRACKDIR_MASK);
 	} else if (prev_state < TRACKDIR_END) {
-		dir = (Trackdir)prev_state;
+		if (already_reversed && prev->tile != tile) {
+			/*
+			 * The vehicle has reversed, but did not go straight back.
+			 * It immediatelly turn onto another tile. This means that
+			 * the roadstate of the previous vehicle cannot be used
+			 * as the direction we have to go with this vehicle.
+			 *
+			 * Next table is build in the following way:
+			 *  - first row for when the vehicle in front went to the northern or
+			 *    western tile, second for southern and eastern.
+			 *  - columns represent the entry direction.
+			 *  - cell values are determined by the Trackdir one has to take from
+			 *    the entry dir (column) to the tile in north or south by only
+			 *    going over the trackdirs used for turning 90 degrees, i.e.
+			 *    TRACKDIR_{UPPER,RIGHT,LOWER,LEFT}_{N,E,S,W}.
+			 */
+			Trackdir reversed_turn_lookup[2][DIAGDIR_END] = {
+				{ TRACKDIR_UPPER_W, TRACKDIR_RIGHT_N, TRACKDIR_LEFT_N,  TRACKDIR_UPPER_E },
+				{ TRACKDIR_RIGHT_S, TRACKDIR_LOWER_W, TRACKDIR_LOWER_E, TRACKDIR_LEFT_S  }};
+			dir = reversed_turn_lookup[prev->tile < tile ? 0 : 1][ReverseDiagDir(entry_dir)];
+		} else {
+			dir = (Trackdir)prev_state;
+		}
 	} else {
 		return INVALID_TRACKDIR;
 	}
@@ -1425,6 +1459,29 @@
 	return dir;
 }
 
+/**
+ * Can a tram track build without destruction on the given tile?
+ * @param t the tile to build on.
+ * @return true when a track track can be build on 't'
+ */
+static bool CanBuildTramTrackOnTile(TileIndex t)
+{
+	switch (GetTileType(t)) {
+		case MP_CLEAR:
+		case MP_TREES:
+			return true;
+
+		case MP_ROAD:
+			return GetRoadTileType(t) == ROAD_TILE_NORMAL;
+
+		case MP_WATER:
+			return IsCoast(t);
+
+		default:
+			return false;
+	}
+}
+
 static bool IndividualRoadVehicleController(Vehicle *v, const Vehicle *prev)
 {
 	Direction new_dir;
@@ -1456,12 +1513,12 @@
 		GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 
 		const Vehicle *u = RoadVehFindCloseTo(v, gp.x, gp.y, v->direction);
-		if (u != NULL && u->cur_speed < v->cur_speed) {
-			v->cur_speed = u->cur_speed;
+		if (u != NULL && u->First()->cur_speed < v->cur_speed) {
+			v->cur_speed = u->First()->cur_speed;
 			return false;
 		}
 
-		if ((IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) && HASBIT(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
+		if ((IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) && HasBit(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
 			/* Vehicle has just entered a bridge or tunnel */
 			v->cur_image = v->GetImage(v->direction);
 			v->UpdateDeltaXY(v->direction);
@@ -1480,7 +1537,7 @@
 	 * For a drive-through road stop use 'straight road' move data.
 	 * In this case v->u.road.state is masked to give the road stop entry direction. */
 	rd = _road_drive_data[v->u.road.roadtype][(
-		(HASBIT(v->u.road.state, RVS_IN_DT_ROAD_STOP) ? v->u.road.state & RVSB_ROAD_STOP_TRACKDIR_MASK : v->u.road.state) +
+		(HasBit(v->u.road.state, RVS_IN_DT_ROAD_STOP) ? v->u.road.state & RVSB_ROAD_STOP_TRACKDIR_MASK : v->u.road.state) +
 		(_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1];
 
 	if (rd.x & RDE_NEXT_TILE) {
@@ -1504,10 +1561,13 @@
 		}
 
 again:
+		uint start_frame = RVC_DEFAULT_START_FRAME;
 		if (IsReversingRoadTrackdir(dir)) {
 			/* Turning around */
 			if (v->u.road.roadtype == ROADTYPE_TRAM) {
-				RoadBits needed; // The road bits the tram needs to be able to turn around
+				/* Determine the road bits the tram needs to be able to turn around
+				 * using the 'big' corner loop. */
+				RoadBits needed;
 				switch (dir) {
 					default: NOT_REACHED();
 					case TRACKDIR_RVREV_NE: needed = ROAD_SW; break;
@@ -1515,8 +1575,36 @@
 					case TRACKDIR_RVREV_SW: needed = ROAD_NE; break;
 					case TRACKDIR_RVREV_NW: needed = ROAD_SE; break;
 				}
-				if (!IsTileType(tile, MP_ROAD) || GetRoadTileType(tile) != ROAD_TILE_NORMAL || HasRoadWorks(tile) || (needed & GetRoadBits(tile, ROADTYPE_TRAM)) == ROAD_NONE) {
-					/* The tram cannot turn here */
+				if ((v->Previous() != NULL && v->Previous()->tile == tile) ||
+						(IsRoadVehFront(v) && IsTileType(tile, MP_ROAD) &&
+							GetRoadTileType(tile) == ROAD_TILE_NORMAL && !HasRoadWorks(tile) &&
+							(needed & GetRoadBits(tile, ROADTYPE_TRAM)) != ROAD_NONE)) {
+					/*
+					 * Taking the 'big' corner for trams only happens when:
+					 * - The previous vehicle in this (articulated) tram chain is
+					 *   already on the 'next' tile, we just follow them regardless of
+					 *   anything. When it is NOT on the 'next' tile, the tram started
+					 *   doing a reversing turn when the piece of tram track on the next
+					 *   tile did not exist yet. Do not use the big tram loop as that is
+					 *   going to cause the tram to split up.
+					 * - Or the front of the tram can drive over the next tile.
+					 */
+				} else if (!IsRoadVehFront(v) || !CanBuildTramTrackOnTile(tile)) {
+					/*
+					 * Taking the 'small' corner for trams only happens when:
+					 * - We are not the from vehicle of an articulated tram.
+					 * - Or when the player cannot build on the next tile.
+					 *
+					 * The 'small' corner means that the vehicle is on the end of a
+					 * tram track and needs to start turning there. To do this properly
+					 * the tram needs to start at an offset in the tram turning 'code'
+					 * for 'big' corners. It furthermore does not go to the next tile,
+					 * so that needs to be fixed too.
+					 */
+					tile = v->tile;
+					start_frame = RVC_TURN_AROUND_START_FRAME_SHORT_TRAM;
+				} else {
+					/* The player can build on the next tile, so wait till (s)he does. */
 					v->cur_speed = 0;
 					return false;
 				}
@@ -1531,14 +1619,20 @@
 		/* Get position data for first frame on the new tile */
 		rdp = _road_drive_data[v->u.road.roadtype][(dir + (_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking];
 
-		x = TileX(tile) * TILE_SIZE + rdp[RVC_DEFAULT_START_FRAME].x;
-		y = TileY(tile) * TILE_SIZE + rdp[RVC_DEFAULT_START_FRAME].y;
+		x = TileX(tile) * TILE_SIZE + rdp[start_frame].x;
+		y = TileY(tile) * TILE_SIZE + rdp[start_frame].y;
 
 		newdir = RoadVehGetSlidingDirection(v, x, y);
-		if (IsRoadVehFront(v) && RoadVehFindCloseTo(v, x, y, newdir) != NULL) return false;
+		if (IsRoadVehFront(v)) {
+			Vehicle *u = RoadVehFindCloseTo(v, x, y, newdir);
+			if (u != NULL) {
+				v->cur_speed = u->First()->cur_speed;
+				return false;
+			}
+		}
 
 		r = VehicleEnterTile(v, tile, x, y);
-		if (HASBIT(r, VETS_CANNOT_ENTER)) {
+		if (HasBit(r, VETS_CANNOT_ENTER)) {
 			if (!IsTileType(tile, MP_TUNNELBRIDGE)) {
 				v->cur_speed = 0;
 				return false;
@@ -1548,8 +1642,8 @@
 			goto again;
 		}
 
-		if (IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) && IsTileType(v->tile, MP_STATION)) {
-			if (IsReversingRoadTrackdir(dir) && IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END)) {
+		if (IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) && IsTileType(v->tile, MP_STATION)) {
+			if (IsReversingRoadTrackdir(dir) && IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END)) {
 				/* New direction is trying to turn vehicle around.
 				 * We can't turn at the exit of a road stop so wait.*/
 				v->cur_speed = 0;
@@ -1560,18 +1654,18 @@
 
 				/* Vehicle is leaving a road stop tile, mark bay as free
 				 * For drive-through stops, only do it if the vehicle stopped here */
-				if (IsStandardRoadStopTile(v->tile) || HASBIT(v->u.road.state, RVS_IS_STOPPING)) {
-					rs->FreeBay(HASBIT(v->u.road.state, RVS_USING_SECOND_BAY));
-					CLRBIT(v->u.road.state, RVS_IS_STOPPING);
+				if (IsStandardRoadStopTile(v->tile) || HasBit(v->u.road.state, RVS_IS_STOPPING)) {
+					rs->FreeBay(HasBit(v->u.road.state, RVS_USING_SECOND_BAY));
+					ClrBit(v->u.road.state, RVS_IS_STOPPING);
 				}
 				if (IsStandardRoadStopTile(v->tile)) rs->SetEntranceBusy(false);
 			}
 		}
 
-		if (!HASBIT(r, VETS_ENTERED_WORMHOLE)) {
+		if (!HasBit(r, VETS_ENTERED_WORMHOLE)) {
 			v->tile = tile;
 			v->u.road.state = (byte)dir;
-			v->u.road.frame = RVC_DEFAULT_START_FRAME;
+			v->u.road.frame = start_frame;
 		}
 		if (newdir != v->direction) {
 			v->direction = newdir;
@@ -1591,11 +1685,34 @@
 		Direction newdir;
 		const RoadDriveEntry *rdp;
 
-		if (IsRoadVehFront(v)) {
-			/* If this is the front engine, look for the right path. */
-			dir = RoadFindPathToDest(v, v->tile, (DiagDirection)(rd.x & 3));
+		uint turn_around_start_frame = RVC_TURN_AROUND_START_FRAME;
+
+		RoadBits tram;
+		if (v->u.road.roadtype == ROADTYPE_TRAM && CountBits(tram = GetAnyRoadBits(v->tile, ROADTYPE_TRAM)) == 1) {
+			/*
+			 * The tram is turning around with one tram 'roadbit'. This means that
+			 * it is using the 'big' corner 'drive data'. However, to support the
+			 * trams to take a small corner, there is a 'turned' marker in the middle
+			 * of the turning 'drive data'. When the tram took the long corner, we
+			 * will still use the 'big' corner drive data, but we advance it one
+			 * frame. We furthermore set the driving direction so the turning is
+			 * going to be properly shown.
+			 */
+			turn_around_start_frame = RVC_START_FRAME_AFTER_LONG_TRAM;
+			switch (tram) {
+				default: NOT_REACHED();
+				case ROAD_SW: dir = TRACKDIR_RVREV_NE; break;
+				case ROAD_NW: dir = TRACKDIR_RVREV_SE; break;
+				case ROAD_NE: dir = TRACKDIR_RVREV_SW; break;
+				case ROAD_SE: dir = TRACKDIR_RVREV_NW; break;
+			}
 		} else {
-			dir = FollowPreviousRoadVehicle(v, prev, v->tile, (DiagDirection)(rd.x & 3), true);
+			if (IsRoadVehFront(v)) {
+				/* If this is the front engine, look for the right path. */
+				dir = RoadFindPathToDest(v, v->tile, (DiagDirection)(rd.x & 3));
+			} else {
+				dir = FollowPreviousRoadVehicle(v, prev, v->tile, (DiagDirection)(rd.x & 3), true);
+			}
 		}
 
 		if (dir == INVALID_TRACKDIR) {
@@ -1605,20 +1722,20 @@
 
 		rdp = _road_drive_data[v->u.road.roadtype][(_opt.road_side << RVS_DRIVE_SIDE) + dir];
 
-		x = TileX(v->tile) * TILE_SIZE + rdp[RVC_TURN_AROUND_START_FRAME].x;
-		y = TileY(v->tile) * TILE_SIZE + rdp[RVC_TURN_AROUND_START_FRAME].y;
+		x = TileX(v->tile) * TILE_SIZE + rdp[turn_around_start_frame].x;
+		y = TileY(v->tile) * TILE_SIZE + rdp[turn_around_start_frame].y;
 
 		newdir = RoadVehGetSlidingDirection(v, x, y);
 		if (IsRoadVehFront(v) && RoadVehFindCloseTo(v, x, y, newdir) != NULL) return false;
 
 		r = VehicleEnterTile(v, v->tile, x, y);
-		if (HASBIT(r, VETS_CANNOT_ENTER)) {
+		if (HasBit(r, VETS_CANNOT_ENTER)) {
 			v->cur_speed = 0;
 			return false;
 		}
 
 		v->u.road.state = dir;
-		v->u.road.frame = RVC_TURN_AROUND_START_FRAME;
+		v->u.road.frame = turn_around_start_frame;
 
 		if (newdir != v->direction) {
 			v->direction = newdir;
@@ -1648,12 +1765,13 @@
 
 	new_dir = RoadVehGetSlidingDirection(v, x, y);
 
-	if (IsRoadVehFront(v) && !IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END)) {
+	if (IsRoadVehFront(v) && !IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END)) {
 		/* Vehicle is not in a road stop.
 		 * Check for another vehicle to overtake */
 		Vehicle* u = RoadVehFindCloseTo(v, x, y, new_dir);
 
 		if (u != NULL) {
+			u = u->First();
 			/* 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;
@@ -1682,9 +1800,9 @@
 	 * and it's the correct type of stop (bus or truck) and the frame equals the stop frame...
 	 * (the station test and stop type test ensure that other vehicles, using the road stop as
 	 * a through route, do not stop) */
-	if (IsRoadVehFront(v) && ((IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END) &&
+	if (IsRoadVehFront(v) && ((IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END) &&
 			_road_veh_data_1[v->u.road.state - RVSB_IN_ROAD_STOP + (_opt.road_side << RVS_DRIVE_SIDE)] == v->u.road.frame) ||
-			(IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) &&
+			(IsInsideMM(v->u.road.state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) &&
 			v->current_order.dest == GetStationIndex(v->tile) &&
 			GetRoadStopType(v->tile) == (IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK) &&
 			v->u.road.frame == RVC_DRIVE_THROUGH_STOP_FRAME))) {
@@ -1707,7 +1825,7 @@
 				if (IsDriveThroughStopTile(next_tile) && (GetRoadStopType(next_tile) == type)) {
 					RoadStop *rs_n = GetRoadStopByTile(next_tile, type);
 
-					if (rs_n->IsFreeBay(HASBIT(v->u.road.state, RVS_USING_SECOND_BAY))) {
+					if (rs_n->IsFreeBay(HasBit(v->u.road.state, RVS_USING_SECOND_BAY))) {
 						/* Bay in next stop along is free - use it */
 						ClearSlot(v);
 						rs_n->num_vehicles++;
@@ -1778,14 +1896,14 @@
 	/* Check tile position conditions - i.e. stop position in depot,
 	 * entry onto bridge or into tunnel */
 	r = VehicleEnterTile(v, v->tile, x, y);
-	if (HASBIT(r, VETS_CANNOT_ENTER)) {
+	if (HasBit(r, VETS_CANNOT_ENTER)) {
 		v->cur_speed = 0;
 		return false;
 	}
 
 	/* Move to next frame unless vehicle arrived at a stop position
 	 * in a depot or entered a tunnel/bridge */
-	if (!HASBIT(r, VETS_ENTERED_WORMHOLE)) v->u.road.frame++;
+	if (!HasBit(r, VETS_ENTERED_WORMHOLE)) v->u.road.frame++;
 
 	v->cur_image = v->GetImage(v->direction);
 	v->UpdateDeltaXY(v->direction);
@@ -1870,7 +1988,7 @@
 
 	if (v->current_order.type == OT_GOTO_DEPOT &&
 			v->current_order.flags & OF_NON_STOP &&
-			!CHANCE16(1, 20)) {
+			!Chance16(1, 20)) {
 		return;
 	}
 
@@ -2007,7 +2125,7 @@
 	CommandCost cost;
 	CargoID new_cid = GB(p2, 0, 8);
 	byte new_subtype = GB(p2, 8, 8);
-	bool only_this = HASBIT(p2, 16);
+	bool only_this = HasBit(p2, 16);
 	uint16 capacity = CALLBACK_FAILED;
 	uint total_capacity = 0;
 
@@ -2030,7 +2148,7 @@
 
 		if (v->cargo_cap == 0) continue;
 
-		if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_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	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/roadveh_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -28,7 +28,7 @@
 	SetDParam(0, v->engine_type);
 	SetDParam(1, v->build_year);
 	SetDParam(2, v->value);
-	DrawString(x, y + y_offset, STR_9011_BUILT_VALUE, 0);
+	DrawString(x, y + y_offset, STR_9011_BUILT_VALUE, TC_FROMSTRING);
 
 	if (RoadVehHasArticPart(v)) {
 		AcceptedCargo max_cargo;
@@ -58,7 +58,7 @@
 		}
 
 		SetDParamStr(0, capacity);
-		DrawStringTruncated(x, y + 10 + y_offset, STR_JUST_STRING, 0, 380 - x);
+		DrawStringTruncated(x, y + 10 + y_offset, STR_JUST_STRING, TC_BLUE, 380 - x);
 
 		for (const Vehicle *u = v; u != NULL; u = u->Next()) {
 			str = STR_8812_EMPTY;
@@ -68,7 +68,7 @@
 				SetDParam(2, u->cargo.Source());
 				str = STR_8813_FROM;
 			}
-			DrawString(x, y + 21 + y_offset, str, 0);
+			DrawString(x, y + 21 + y_offset, str, TC_FROMSTRING);
 
 			y_offset += 11;
 		}
@@ -77,7 +77,7 @@
 	} else {
 		SetDParam(0, v->cargo_type);
 		SetDParam(1, v->cargo_cap);
-		DrawString(x, y + 10 + y_offset, STR_9012_CAPACITY, 0);
+		DrawString(x, y + 10 + y_offset, STR_9012_CAPACITY, TC_FROMSTRING);
 
 		str = STR_8812_EMPTY;
 		if (!v->cargo.Empty()) {
@@ -86,12 +86,12 @@
 			SetDParam(2, v->cargo.Source());
 			str = STR_8813_FROM;
 		}
-		DrawString(x, y + 21 + y_offset, str, 0);
+		DrawString(x, y + 21 + y_offset, str, TC_FROMSTRING);
 	}
 
 	/* Draw Transfer credits text */
 	SetDParam(0, v->cargo.FeederShare());
-	DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, 0);
+	DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING);
 }
 
 
--- a/src/saveload.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/saveload.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -218,13 +218,13 @@
 static uint SlReadSimpleGamma()
 {
 	uint i = SlReadByte();
-	if (HASBIT(i, 7)) {
+	if (HasBit(i, 7)) {
 		i &= ~0x80;
-		if (HASBIT(i, 6)) {
+		if (HasBit(i, 6)) {
 			i &= ~0x40;
-			if (HASBIT(i, 5)) {
+			if (HasBit(i, 5)) {
 				i &= ~0x20;
-				if (HASBIT(i, 4))
+				if (HasBit(i, 4))
 					SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unsupported gamma");
 				i = (i << 8) | SlReadByte();
 			}
--- a/src/saveload.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/saveload.h	Mon Dec 03 23:39:38 2007 +0000
@@ -13,7 +13,7 @@
 
 #define SIZE_MAX ((size_t)-1)
 
-static const uint NEWGRF_AIRPORTS_SAVEGAME = 80;
+static const uint NEWGRF_AIRPORTS_SAVEGAME = 83;
 
 enum SaveOrLoadResult {
 	SL_OK     = 0, ///< completed successfully
--- a/src/screenshot.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/screenshot.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -84,7 +84,7 @@
 	if (f == NULL) return false;
 
 	/* each scanline must be aligned on a 32bit boundary */
-	padw = ALIGN(w, 4);
+	padw = Align(w, 4);
 
 	if (pixelformat == 8) pal_size = sizeof(RgbQuad) * 256;
 
@@ -123,7 +123,7 @@
 	if (pixelformat == 8) if (fwrite(rq, sizeof(rq), 1, f) != 1) return false;
 
 	/* use by default 64k temp memory */
-	maxlines = clamp(65536 / padw, 16, 128);
+	maxlines = Clamp(65536 / padw, 16, 128);
 
 	/* now generate the bitmap bits */
 	void *buff = MallocT<uint8>(padw * maxlines * bpp); // by default generate 128 lines at a time.
@@ -251,7 +251,7 @@
 	}
 
 	/* use by default 64k temp memory */
-	maxlines = clamp(65536 / w, 16, 128);
+	maxlines = Clamp(65536 / w, 16, 128);
 
 	/* now generate the bitmap bits */
 	void *buff = MallocT<uint8>(w * maxlines * bpp); // by default generate 128 lines at a time.
@@ -351,7 +351,7 @@
 	}
 
 	/* use by default 64k temp memory */
-	maxlines = clamp(65536 / w, 16, 128);
+	maxlines = Clamp(65536 / w, 16, 128);
 
 	/* now generate the bitmap bits */
 	uint8 *buff = MallocT<uint8>(w * maxlines); // by default generate 128 lines at a time.
--- a/src/settings.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/settings.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -41,6 +41,7 @@
 #include "genworld.h"
 #include "date.h"
 #include "rail.h"
+#include "train.h"
 #include "helpers.hpp"
 #include "news.h"
 #ifdef WITH_FREETYPE
@@ -48,6 +49,7 @@
 #include "fontcache.h"
 #endif
 #include "spritecache.h"
+#include "transparency.h"
 
 /** The patch values that are used for new games and/or modified in config file */
 Patches _patches_newgame;
@@ -95,7 +97,7 @@
 	uint pos;
 	SettingsMemoryPool *p = *pool;
 
-	size = ALIGN(size, sizeof(void*));
+	size = Align(size, sizeof(void*));
 
 	/* first check if there's memory in the next pool */
 	if (p->next && p->next->pos + size <= p->next->size) {
@@ -433,7 +435,7 @@
 		r = lookup_oneofmany(many, str, s - str);
 		if (r == -1) return (uint32)-1;
 
-		SETBIT(res, r); // value found, set it
+		SetBit(res, r); // value found, set it
 		if (*s == 0) break;
 		str = s + 1;
 	}
@@ -568,7 +570,7 @@
 		start = many;
 		while (*many != 0 && *many != '|') many++; // advance to the next element
 
-		if (HASBIT(x, 0)) { // item found, copy it
+		if (HasBit(x, 0)) { // item found, copy it
 			if (!init) *buf++ = '|';
 			init = false;
 			if (start == many) {
@@ -663,12 +665,12 @@
 			case SLE_VAR_I32: {
 				/* Override the minimum value. No value below sdb->min, except special value 0 */
 				int32 min = ((sdb->flags & SGF_0ISDISABLED) && val <= sdb->min) ? 0 : sdb->min;
-				val = clamp(val, min, sdb->max);
+				val = Clamp(val, min, sdb->max);
 			} break;
 			case SLE_VAR_U32: {
 				/* Override the minimum value. No value below sdb->min, except special value 0 */
 				uint min = ((sdb->flags & SGF_0ISDISABLED) && (uint)val <= (uint)sdb->min) ? 0 : sdb->min;
-				WriteValue(ptr, SLE_VAR_U32, (int64)clampu(val, min, sdb->max));
+				WriteValue(ptr, SLE_VAR_U32, (int64)ClampU(val, min, sdb->max));
 				return;
 			}
 			case SLE_VAR_I64:
@@ -1078,6 +1080,7 @@
 #define MS SGF_MULTISTRING
 #define NO SGF_NETWORK_ONLY
 #define CR SGF_CURRENCY
+#define NN SGF_NO_NETWORK
 
 #include "table/strings.h"
 
@@ -1135,6 +1138,16 @@
 	return 0;
 }
 
+static int32 UpdateConsists(int32 p1)
+{
+	Vehicle *v;
+	FOR_ALL_VEHICLES(v) {
+		/* Update the consist of all trains so the maximum speed is set correctly. */
+		if (v->type == VEH_TRAIN && (IsFrontEngine(v) || IsFreeWagon(v))) TrainConsistChanged(v);
+	}
+	return 0;
+}
+
 /* Check service intervals of vehicles, p1 is value of % or day based servicing */
 static int32 CheckInterval(int32 p1)
 {
@@ -1142,15 +1155,15 @@
 	const Patches *ptc = (_game_mode == GM_MENU) ? &_patches_newgame : &_patches;
 
 	if (p1) {
-		warning = ( (IS_INT_INSIDE(ptc->servint_trains,   5, 90 + 1) || ptc->servint_trains   == 0) &&
-								(IS_INT_INSIDE(ptc->servint_roadveh,  5, 90 + 1) || ptc->servint_roadveh  == 0) &&
-								(IS_INT_INSIDE(ptc->servint_aircraft, 5, 90 + 1) || ptc->servint_aircraft == 0) &&
-								(IS_INT_INSIDE(ptc->servint_ships,    5, 90 + 1) || ptc->servint_ships    == 0) );
+		warning = ( (IsInsideMM(ptc->servint_trains,   5, 90 + 1) || ptc->servint_trains   == 0) &&
+								(IsInsideMM(ptc->servint_roadveh,  5, 90 + 1) || ptc->servint_roadveh  == 0) &&
+								(IsInsideMM(ptc->servint_aircraft, 5, 90 + 1) || ptc->servint_aircraft == 0) &&
+								(IsInsideMM(ptc->servint_ships,    5, 90 + 1) || ptc->servint_ships    == 0) );
 	} else {
-		warning = ( (IS_INT_INSIDE(ptc->servint_trains,   30, 800 + 1) || ptc->servint_trains   == 0) &&
-								(IS_INT_INSIDE(ptc->servint_roadveh,  30, 800 + 1) || ptc->servint_roadveh  == 0) &&
-								(IS_INT_INSIDE(ptc->servint_aircraft, 30, 800 + 1) || ptc->servint_aircraft == 0) &&
-								(IS_INT_INSIDE(ptc->servint_ships,    30, 800 + 1) || ptc->servint_ships    == 0) );
+		warning = ( (IsInsideMM(ptc->servint_trains,   30, 800 + 1) || ptc->servint_trains   == 0) &&
+								(IsInsideMM(ptc->servint_roadveh,  30, 800 + 1) || ptc->servint_roadveh  == 0) &&
+								(IsInsideMM(ptc->servint_aircraft, 30, 800 + 1) || ptc->servint_aircraft == 0) &&
+								(IsInsideMM(ptc->servint_ships,    30, 800 + 1) || ptc->servint_ships    == 0) );
 	}
 
 	if (!warning)
@@ -1263,6 +1276,8 @@
 	 SDTG_BOOL("large_aa",                   S, 0, _freetype.large_aa,    false,    STR_NULL, NULL),
 #endif
 	  SDTG_VAR("sprite_cache_size",SLE_UINT, S, 0, _sprite_cache_size,     4, 1, 64, 0, STR_NULL, NULL),
+	  SDTG_VAR("player_face",    SLE_UINT32, S, 0, _player_face,      0,0,0xFFFFFFFF,0, STR_NULL, NULL),
+	  SDTG_VAR("transparency_options", SLE_UINT8, S, 0, _transparency_opt, 0, 0,0xFF,0, STR_NULL, NULL),
 	  SDTG_END()
 };
 
@@ -1279,6 +1294,7 @@
 	  SDTG_STR("player_name",           SLE_STRB, S, 0, _network_player_name,          NULL,               STR_NULL, NULL),
 	  SDTG_STR("server_password",       SLE_STRB, S, 0, _network_server_password,      NULL,               STR_NULL, NULL),
 	  SDTG_STR("rcon_password",         SLE_STRB, S, 0, _network_rcon_password,        NULL,               STR_NULL, NULL),
+	  SDTG_STR("default_company_pass",  SLE_STRB, S, 0, _network_default_company_pass, NULL,               STR_NULL, NULL),
 	  SDTG_STR("server_name",           SLE_STRB, S, 0, _network_server_name,          NULL,               STR_NULL, NULL),
 	  SDTG_STR("connect_to_ip",         SLE_STRB, S, 0, _network_default_ip,           NULL,               STR_NULL, NULL),
 	  SDTG_STR("network_id",            SLE_STRB, S, 0, _network_unique_id,            NULL,               STR_NULL, NULL),
@@ -1303,8 +1319,8 @@
 	 * XXX - To save file-space and since values are never bigger than about 10? only
 	 * save the first 16 bits in the savegame. Question is why the values are still int32
 	 * and why not byte for example? */
-	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, (SLE_FILE_I16 | SLE_VAR_I32), 0, 0, GameOptions, diff, 17, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 0, 3),
-	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, (SLE_FILE_I16 | SLE_VAR_I32), 0, 0, GameOptions, diff, 18, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 4, SL_MAX_VERSION),
+	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, SLE_UINT16, 0, 0, GameOptions, diff, 17, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 0, 3),
+	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, SLE_UINT16, 0, 0, GameOptions, diff, 18, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 4, SL_MAX_VERSION),
 	    SDT_VAR(GameOptions, diff_level, SLE_UINT8, 0, 0, 0, 0,  3, 0, STR_NULL, NULL),
 	  SDT_OMANY(GameOptions, currency,  SLE_UINT8, N, 0, 0, CUSTOM_CURRENCY_ID, "GBP|USD|EUR|YEN|ATS|BEF|CHF|CZK|DEM|DKK|ESP|FIM|FRF|GRD|HUF|ISK|ITL|NLG|NOK|PLN|ROL|RUR|SIT|SEK|YTL|SKK|BRR|custom", STR_NULL, NULL, NULL),
 	  SDT_OMANY(GameOptions, units,     SLE_UINT8, N, 0, 1,     2, "imperial|metric|si", STR_NULL, NULL, NULL),
@@ -1361,12 +1377,13 @@
 
 	/***************************************************************************/
 	/* Construction section of the GUI-configure patches window */
-	SDT_BOOL(Patches, build_on_slopes,               0, 0,  true,        STR_CONFIG_PATCHES_BUILDONSLOPES,       NULL),
+	SDT_BOOL(Patches, build_on_slopes,               0,NN,  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),
-	SDT_BOOL(Patches, always_small_airport,          0, 0, false,        STR_CONFIG_PATCHES_SMALL_AIRPORTS,      NULL),
+	SDT_BOOL(Patches, longbridges,                   0,NN,  true,        STR_CONFIG_PATCHES_LONGBRIDGES,         NULL),
+	SDT_BOOL(Patches, signal_side,                   N,NN,  true,        STR_CONFIG_PATCHES_SIGNALSIDE,          RedrawScreen),
+	SDT_BOOL(Patches, always_small_airport,          0,NN, false,        STR_CONFIG_PATCHES_SMALL_AIRPORTS,      NULL),
+	SDT_BOOL(Patches, enable_signal_gui,             S, 0, false,        STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI,   NULL),
 	 SDT_VAR(Patches, drag_signals_density,SLE_UINT8,S, 0,  4, 1, 20, 0, STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY,NULL),
 	 SDT_VAR(Patches, semaphore_build_before,SLE_INT32, S, NC, 1975, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE, NULL),
 	SDT_CONDVAR(Patches, town_layout, SLE_UINT8, 59, SL_MAX_VERSION, 0, MS, TL_ORIGINAL, TL_NO_ROADS, NUM_TLS - 1, 1, STR_CONFIG_PATCHES_TOWN_LAYOUT, CheckTownLayout),
@@ -1375,7 +1392,7 @@
 	/* Vehicle section of the GUI-configure patches window */
 	SDT_BOOL(Patches, realistic_acceleration,        0, 0, false,                    STR_CONFIG_PATCHES_REALISTICACCEL,       NULL),
 	SDT_BOOL(Patches, forbid_90_deg,                 0, 0, false,                    STR_CONFIG_PATCHES_FORBID_90_DEG,        NULL),
-	SDT_BOOL(Patches, mammoth_trains,                0, 0,  true,                    STR_CONFIG_PATCHES_MAMMOTHTRAINS,        NULL),
+	SDT_BOOL(Patches, mammoth_trains,                0,NN,  true,                    STR_CONFIG_PATCHES_MAMMOTHTRAINS,        NULL),
 	SDT_BOOL(Patches, gotodepot,                     0, 0,  true,                    STR_CONFIG_PATCHES_GOTODEPOT,            NULL),
 	SDT_BOOL(Patches, roadveh_queue,                 0, 0,  true,                    STR_CONFIG_PATCHES_ROADVEH_QUEUE,        NULL),
 	SDT_BOOL(Patches, new_pathfinding_all,           0, 0, false,                    STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL,  NULL),
@@ -1386,7 +1403,7 @@
 
 	SDT_BOOL(Patches, train_income_warn,             S, 0,  true,                    STR_CONFIG_PATCHES_WARN_INCOME_LESS,     NULL),
 	 SDT_VAR(Patches, order_review_system,SLE_UINT8, S,MS,     2,     0,       2, 0, STR_CONFIG_PATCHES_ORDER_REVIEW,         NULL),
-	SDT_BOOL(Patches, never_expire_vehicles,         0, 0, false,                    STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES,NULL),
+	SDT_BOOL(Patches, never_expire_vehicles,         0,NN, false,                    STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES,NULL),
 	SDT_BOOL(Patches, lost_train_warn,               S, 0,  true,                    STR_CONFIG_PATCHES_WARN_LOST_TRAIN,      NULL),
 	SDT_BOOL(Patches, autorenew,                     S, 0, false,                    STR_CONFIG_PATCHES_AUTORENEW_VEHICLE,    EngineRenewUpdate),
 	 SDT_VAR(Patches, autorenew_months,   SLE_INT16, S, 0,     6,   -12,      12, 0, STR_CONFIG_PATCHES_AUTORENEW_MONTHS,     EngineRenewMonthsUpdate),
@@ -1402,19 +1419,19 @@
 	 SDT_VAR(Patches, servint_ships,     SLE_UINT16, 0,D0,   360,     5,     800, 0, STR_CONFIG_PATCHES_SERVINT_SHIPS,        InValidateDetailsWindow),
 	 SDT_VAR(Patches, servint_aircraft,  SLE_UINT16, 0,D0,   100,     5,     800, 0, STR_CONFIG_PATCHES_SERVINT_AIRCRAFT,     InValidateDetailsWindow),
 	SDT_BOOL(Patches, no_servicing_if_no_breakdowns, 0, 0, false,                    STR_CONFIG_PATCHES_NOSERVICE,            NULL),
-	SDT_BOOL(Patches, wagon_speed_limits,            0, 0,  true,                    STR_CONFIG_PATCHES_WAGONSPEEDLIMITS,     NULL),
-	SDT_CONDBOOL(Patches, disable_elrails, 38, SL_MAX_VERSION, 0, 0, false,          STR_CONFIG_PATCHES_DISABLE_ELRAILS,      SettingsDisableElrail),
-	SDT_CONDVAR(Patches, freight_trains, SLE_UINT8, 39, SL_MAX_VERSION, 0, 0, 1, 1, 255, 1, STR_CONFIG_PATCHES_FREIGHT_TRAINS, NULL),
+	SDT_BOOL(Patches, wagon_speed_limits,            0,NN,  true,                    STR_CONFIG_PATCHES_WAGONSPEEDLIMITS,     UpdateConsists),
+	SDT_CONDBOOL(Patches, disable_elrails, 38, SL_MAX_VERSION, 0, NN, false,         STR_CONFIG_PATCHES_DISABLE_ELRAILS,      SettingsDisableElrail),
+	SDT_CONDVAR(Patches, freight_trains, SLE_UINT8, 39, SL_MAX_VERSION, 0,NN, 1, 1, 255, 1, STR_CONFIG_PATCHES_FREIGHT_TRAINS, NULL),
 	SDT_CONDBOOL(Patches, timetabling,              67, SL_MAX_VERSION, 0, 0, true,  STR_CONFIG_PATCHES_TIMETABLE_ALLOW,      NULL),
 
 	/***************************************************************************/
 	/* Station section of the GUI-configure patches window */
 	SDT_BOOL(Patches, join_stations,           0, 0,  true,        STR_CONFIG_PATCHES_JOINSTATIONS,       NULL),
-	SDT_BOOL(Patches, full_load_any,           0, 0,  true,        STR_CONFIG_PATCHES_FULLLOADANY,        NULL),
-	SDT_BOOL(Patches, improved_load,           0, 0, false,        STR_CONFIG_PATCHES_IMPROVEDLOAD,       NULL),
+	SDT_BOOL(Patches, full_load_any,           0,NN,  true,        STR_CONFIG_PATCHES_FULLLOADANY,        NULL),
+	SDT_BOOL(Patches, improved_load,           0,NN, false,        STR_CONFIG_PATCHES_IMPROVEDLOAD,       NULL),
 	SDT_BOOL(Patches, selectgoods,             0, 0,  true,        STR_CONFIG_PATCHES_SELECTGOODS,        NULL),
 	SDT_BOOL(Patches, new_nonstop,             0, 0, false,        STR_CONFIG_PATCHES_NEW_NONSTOP,        NULL),
-	SDT_BOOL(Patches, nonuniform_stations,     0, 0,  true,        STR_CONFIG_PATCHES_NONUNIFORM_STATIONS,NULL),
+	SDT_BOOL(Patches, nonuniform_stations,     0,NN,  true,        STR_CONFIG_PATCHES_NONUNIFORM_STATIONS,NULL),
 	 SDT_VAR(Patches, station_spread,SLE_UINT8,0, 0, 12, 4, 64, 0, STR_CONFIG_PATCHES_STATION_SPREAD,     InvalidateStationBuildWindow),
 	SDT_BOOL(Patches, serviceathelipad,        0, 0,  true,        STR_CONFIG_PATCHES_SERVICEATHELIPAD,   NULL),
 	SDT_BOOL(Patches, modified_catchment,      0, 0,  true,        STR_CONFIG_PATCHES_CATCHMENT,          NULL),
@@ -1655,9 +1672,9 @@
 
 			if (c->status == GCS_NOT_FOUND) {
 				msg = "not found";
-			} else if (HASBIT(c->flags, GCF_UNSAFE)) {
+			} else if (HasBit(c->flags, GCF_UNSAFE)) {
 				msg = "unsafe for static use";
-			} else if (HASBIT(c->flags, GCF_SYSTEM)) {
+			} else if (HasBit(c->flags, GCF_SYSTEM)) {
 				msg = "system NewGRF";
 			} else {
 				msg = "unknown";
@@ -1669,7 +1686,7 @@
 		}
 
 		/* Mark file as static to avoid saving in savegame. */
-		if (is_static) SETBIT(c->flags, GCF_STATIC);
+		if (is_static) SetBit(c->flags, GCF_STATIC);
 
 		/* Add item to list */
 		*curr = c;
@@ -1789,6 +1806,8 @@
 	if (sd == NULL) return CMD_ERROR;
 	if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to)) return CMD_ERROR;
 
+	if ((sd->desc.flags & SGF_NO_NETWORK) && _networking) return CMD_ERROR;
+
 	if (flags & DC_EXEC) {
 		Patches *patches_ptr = (_game_mode == GM_MENU) ? &_patches_newgame : &_patches;
 		void *var = GetVariableAddress(patches_ptr, &sd->save);
--- a/src/settings.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/settings.h	Mon Dec 03 23:39:38 2007 +0000
@@ -37,7 +37,8 @@
 	SGF_MULTISTRING  = 1 << 2, ///< the value represents a limited number of string-options (internally integer)
 	SGF_NETWORK_ONLY = 1 << 3, ///< this setting only applies to network games
 	SGF_CURRENCY     = 1 << 4, ///< the number represents money, so when reading value multiply by exchange rate
-	SGF_END          = 1 << 5,
+	SGF_NO_NETWORK   = 1 << 5, ///< this setting does not apply to network games; it may not be changed during the game
+	SGF_END          = 1 << 6,
 	/* 3 more possible flags */
 };
 
--- a/src/settings_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/settings_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -140,8 +140,8 @@
 		int i;
 		StringID str = STR_02BE_DEFAULT;
 
-		SetWindowWidgetDisabledState(w, 21, !(_vehicle_design_names & 1));
-		if (!IsWindowWidgetDisabled(w, 21)) str = STR_02BF_CUSTOM;
+		w->SetWidgetDisabledState(21, !(_vehicle_design_names & 1));
+		if (!w->IsWidgetDisabled(21)) str = STR_02BF_CUSTOM;
 		SetDParam(0, str);
 		SetDParam(1, _currency_specs[_opt_ptr->currency].name);
 		SetDParam(2, STR_UNITS_IMPERIAL + _opt_ptr->units);
@@ -152,10 +152,10 @@
 		i = GetCurRes();
 		SetDParam(7, i == _num_resolutions ? STR_RES_OTHER : SPECSTR_RESOLUTION_START + i);
 		SetDParam(8, SPECSTR_SCREENSHOT_START + _cur_screenshot_format);
-		SetWindowWidgetLoweredState(w, 28, _fullscreen);
+		w->SetWidgetLoweredState(28, _fullscreen);
 
 		DrawWindowWidgets(w);
-		DrawString(20, 175, STR_OPTIONS_FULLSCREEN, 0); // fullscreen
+		DrawString(20, 175, STR_OPTIONS_FULLSCREEN, TC_FROMSTRING); // fullscreen
 	} break;
 
 	case WE_CLICK:
@@ -202,7 +202,7 @@
 			ShowDropDownMenu(w, BuildDynamicDropdown(SPECSTR_RESOLUTION_START, _num_resolutions), GetCurRes(), 27, 0, 0);
 			return;
 		case 28: /* Click fullscreen on/off */
-			SetWindowWidgetLoweredState(w, 28, !_fullscreen);
+			w->SetWidgetLoweredState(28, !_fullscreen);
 			ToggleFullScreen(!_fullscreen); // toggle full-screen on/off
 			SetWindowDirty(w);
 			return;
@@ -399,7 +399,7 @@
  * Q: disasters
  * R: area restructuring (0 = permissive, 2 = hostile)
  */
-static const int16 _default_game_diff[3][GAME_DIFFICULTY_NUM] = { /*
+static const GDType _default_game_diff[3][GAME_DIFFICULTY_NUM] = { /*
 	 A, B, C, D,   E, F, G, H, I, J, K, L, M, N, O, P, Q, R*/
 	{2, 2, 1, 4, 300, 2, 0, 2, 0, 1, 2, 0, 1, 0, 0, 0, 0, 0}, ///< easy
 	{4, 1, 1, 3, 150, 3, 1, 3, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1}, ///< medium
@@ -414,7 +414,7 @@
 	gm_opt->diff_level = mode;
 	if (mode != 3) { // not custom
 		for (i = 0; i != GAME_DIFFICULTY_NUM; i++)
-			((int*)&gm_opt->diff)[i] = _default_game_diff[mode][i];
+			((GDType*)&gm_opt->diff)[i] = _default_game_diff[mode][i];
 	}
 }
 
@@ -428,8 +428,8 @@
 		SetDifficultyLevel(_opt_newgame.diff_level, &_opt_newgame);
 	} else {
 		for (uint i = 0; i < GAME_DIFFICULTY_NUM; i++) {
-			int *diff = ((int*)&_opt_newgame.diff) + i;
-			*diff = clamp(*diff, _game_setting_info[i].min, _game_setting_info[i].max);
+			GDType *diff = ((GDType*)&_opt_newgame.diff) + i;
+			*diff = Clamp(*diff, _game_setting_info[i].min, _game_setting_info[i].max);
 			*diff -= *diff % _game_setting_info[i].step;
 		}
 	}
@@ -452,13 +452,13 @@
 	switch (e->event) {
 	case WE_CREATE: // Setup disabled buttons when creating window
 		/* disable all other difficulty buttons during gameplay except for 'custom' */
-		SetWindowWidgetDisabledState(w,  3, _game_mode == GM_NORMAL);
-		SetWindowWidgetDisabledState(w,  4, _game_mode == GM_NORMAL);
-		SetWindowWidgetDisabledState(w,  5, _game_mode == GM_NORMAL);
-		SetWindowWidgetDisabledState(w,  6, _game_mode == GM_NORMAL);
-		SetWindowWidgetDisabledState(w,  7, _game_mode == GM_EDITOR || _networking); // highscore chart in multiplayer
-		SetWindowWidgetDisabledState(w, 10, _networking && !_network_server); // Save-button in multiplayer (and if client)
-		LowerWindowWidget(w, _opt_mod_temp.diff_level + 3);
+		w->SetWidgetDisabledState( 3, _game_mode == GM_NORMAL);
+		w->SetWidgetDisabledState( 4, _game_mode == GM_NORMAL);
+		w->SetWidgetDisabledState( 5, _game_mode == GM_NORMAL);
+		w->SetWidgetDisabledState( 6, _game_mode == GM_NORMAL);
+		w->SetWidgetDisabledState( 7, _game_mode == GM_EDITOR || _networking); // highscore chart in multiplayer
+		w->SetWidgetDisabledState(10, _networking && !_network_server); // Save-button in multiplayer (and if client)
+		w->LowerWidget(_opt_mod_temp.diff_level + 3);
 
 		break;
 	case WE_PAINT: {
@@ -477,22 +477,22 @@
 
 		y = GAMEDIFF_WND_TOP_OFFSET;
 		for (i = 0; i != GAME_DIFFICULTY_NUM; i++) {
-			DrawFrameRect( 5, y,  5 + 8, y + 8, 3, HASBIT(click_a, i) ? FR_LOWERED : FR_NONE);
-			DrawFrameRect(15, y, 15 + 8, y + 8, 3, HASBIT(click_b, i) ? FR_LOWERED : FR_NONE);
-			if (HASBIT(disabled, i) || (_networking && !_network_server)) {
+			DrawFrameRect( 5, y,  5 + 8, y + 8, 3, HasBit(click_a, i) ? FR_LOWERED : FR_NONE);
+			DrawFrameRect(15, y, 15 + 8, y + 8, 3, HasBit(click_b, i) ? FR_LOWERED : FR_NONE);
+			if (HasBit(disabled, i) || (_networking && !_network_server)) {
 				int color = (1 << PALETTE_MODIFIER_GREYOUT) | _colour_gradient[COLOUR_YELLOW][2];
 				GfxFillRect( 6, y + 1,  6 + 8, y + 8, color);
 				GfxFillRect(16, y + 1, 16 + 8, y + 8, color);
 			}
 
-			DrawStringCentered(10, y, STR_6819, 0);
-			DrawStringCentered(20, y, STR_681A, 0);
+			DrawStringCentered(10, y, STR_6819, TC_FROMSTRING);
+			DrawStringCentered(20, y, STR_681A, TC_FROMSTRING);
 
 
-			value = _game_setting_info[i].str + ((int*)&_opt_mod_temp.diff)[i];
+			value = _game_setting_info[i].str + ((GDType*)&_opt_mod_temp.diff)[i];
 			if (i == 4) value *= 1000; // XXX - handle currency option
 			SetDParam(0, value);
-			DrawString(30, y, STR_6805_MAXIMUM_NO_COMPETITORS + i, 0);
+			DrawString(30, y, STR_6805_MAXIMUM_NO_COMPETITORS + i, TC_FROMSTRING);
 
 			y += GAMEDIFF_WND_ROWSIZE + 2; // space items apart a bit
 		}
@@ -511,7 +511,7 @@
 				return;
 
 			x = e->we.click.pt.x - 5;
-			if (!IS_INT_INSIDE(x, 0, 21)) // Button area
+			if (!IsInsideMM(x, 0, 21)) // Button area
 				return;
 
 			y = e->we.click.pt.y - GAMEDIFF_WND_TOP_OFFSET;
@@ -526,48 +526,48 @@
 			/* Clicked disabled button? */
 			dis = (_game_mode == GM_NORMAL) ? DIFF_INGAME_DISABLED_BUTTONS : 0;
 
-			if (HASBIT(dis, btn))
+			if (HasBit(dis, btn))
 				return;
 
 			_difficulty_timeout = 5;
 
-			val = ((int*)&_opt_mod_temp.diff)[btn];
+			val = ((GDType*)&_opt_mod_temp.diff)[btn];
 
 			info = &_game_setting_info[btn]; // get information about the difficulty setting
 			if (x >= 10) {
 				// Increase button clicked
 				val = min(val + info->step, info->max);
-				SETBIT(_difficulty_click_b, btn);
+				SetBit(_difficulty_click_b, btn);
 			} else {
 				// Decrease button clicked
 				val -= info->step;
 				val = max(val,  info->min);
-				SETBIT(_difficulty_click_a, btn);
+				SetBit(_difficulty_click_a, btn);
 			}
 
 			// save value in temporary variable
-			((int*)&_opt_mod_temp.diff)[btn] = val;
-			RaiseWindowWidget(w, _opt_mod_temp.diff_level + 3);
+			((GDType*)&_opt_mod_temp.diff)[btn] = val;
+			w->RaiseWidget(_opt_mod_temp.diff_level + 3);
 			SetDifficultyLevel(3, &_opt_mod_temp); // set difficulty level to custom
-			LowerWindowWidget(w, _opt_mod_temp.diff_level + 3);
+			w->LowerWidget(_opt_mod_temp.diff_level + 3);
 			SetWindowDirty(w);
 		} break;
 		case 3: case 4: case 5: case 6: /* Easy / Medium / Hard / Custom */
 			// temporarily change difficulty level
-			RaiseWindowWidget(w, _opt_mod_temp.diff_level + 3);
+			w->RaiseWidget(_opt_mod_temp.diff_level + 3);
 			SetDifficultyLevel(e->we.click.widget - 3, &_opt_mod_temp);
-			LowerWindowWidget(w, _opt_mod_temp.diff_level + 3);
+			w->LowerWidget(_opt_mod_temp.diff_level + 3);
 			SetWindowDirty(w);
 			break;
 		case 7: /* Highscore Table */
 			ShowHighscoreTable(_opt_mod_temp.diff_level, -1);
 			break;
 		case 10: { /* Save button - save changes */
-			int btn, val;
+			GDType btn, val;
 			for (btn = 0; btn != GAME_DIFFICULTY_NUM; btn++) {
-				val = ((int*)&_opt_mod_temp.diff)[btn];
+				val = ((GDType*)&_opt_mod_temp.diff)[btn];
 				// if setting has changed, change it
-				if (val != ((int*)&_opt_ptr->diff)[btn])
+				if (val != ((GDType*)&_opt_ptr->diff)[btn])
 					DoCommandP(0, btn, val, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
 			}
 			DoCommandP(0, UINT_MAX, _opt_mod_temp.diff_level, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
@@ -669,6 +669,7 @@
 	"longbridges",
 	"signal_side",
 	"always_small_airport",
+	"enable_signal_gui",
 	"drag_signals_density",
 	"oil_refinery_limit",
 	"semaphore_build_before",
@@ -804,7 +805,7 @@
 			}
 			first_time = false;
 		}
-		LowerWindowWidget(w, 4);
+		w->LowerWidget(4);
 	} break;
 
 	case WE_PAINT: {
@@ -827,6 +828,7 @@
 			// We do not allow changes of some items when we are a client in a networkgame
 			if (!(sd->save.conv & SLF_NETWORK_NO) && _networking && !_network_server) editable = false;
 			if ((sdb->flags & SGF_NETWORK_ONLY) && !_networking) editable = false;
+			if ((sdb->flags & SGF_NO_NETWORK) && _networking) editable = false;
 
 			if (sdb->cmd == SDT_BOOLX) {
 				static const int _bool_ctabs[2][2] = {{9, 4}, {7, 6}};
@@ -857,7 +859,7 @@
 					SetDParam(1, value);
 				}
 			}
-			DrawString(30, y, (sdb->str) + disabled, 0);
+			DrawString(30, y, (sdb->str) + disabled, TC_FROMSTRING);
 			y += 11;
 		}
 		break;
@@ -886,8 +888,9 @@
 			sd = page->entries[btn].setting;
 
 			/* return if action is only active in network, or only settable by server */
+			if (!(sd->save.conv & SLF_NETWORK_NO) && _networking && !_network_server) return;
 			if ((sd->desc.flags & SGF_NETWORK_ONLY) && !_networking) return;
-			if (!(sd->save.conv & SLF_NETWORK_NO) && _networking && !_network_server) return;
+			if ((sd->desc.flags & SGF_NO_NETWORK) && _networking) return;
 
 			var = GetVariableAddress(patches_ptr, &sd->save);
 			value = (int32)ReadValue(var, sd->save.conv);
@@ -951,9 +954,9 @@
 			break;
 		}
 		case 4: case 5: case 6: case 7: case 8: case 9:
-			RaiseWindowWidget(w, WP(w, def_d).data_1 + 4);
+			w->RaiseWidget(WP(w, def_d).data_1 + 4);
 			WP(w, def_d).data_1 = e->we.click.widget - 4;
-			LowerWindowWidget(w, WP(w, def_d).data_1 + 4);
+			w->LowerWidget(WP(w, def_d).data_1 + 4);
 			DeleteWindowById(WC_QUERY_STRING, 0);
 			SetWindowDirty(w);
 			break;
@@ -1031,8 +1034,8 @@
 
 	DrawFrameRect(x,      y + 1, x +  9, y + 9, ctab, (state == 1) ? FR_LOWERED : FR_NONE);
 	DrawFrameRect(x + 10, y + 1, x + 19, y + 9, ctab, (state == 2) ? FR_LOWERED : FR_NONE);
-	DrawStringCentered(x +  5, y + 1, STR_6819, 0); // [<]
-	DrawStringCentered(x + 15, y + 1, STR_681A, 0); // [>]
+	DrawStringCentered(x +  5, y + 1, STR_6819, TC_FROMSTRING); // [<]
+	DrawStringCentered(x + 15, y + 1, STR_681A, TC_FROMSTRING); // [>]
 
 	/* Grey out the buttons that aren't clickable */
 	if (!clickable_left)
@@ -1056,37 +1059,37 @@
 			DrawArrowButtons(10, y, 3, GB(clk, 0, 2), true, true);
 			SetDParam(0, 1);
 			SetDParam(1, 1);
-			DrawString(35, y + 1, STR_CURRENCY_EXCHANGE_RATE, 0);
+			DrawString(35, y + 1, STR_CURRENCY_EXCHANGE_RATE, TC_FROMSTRING);
 			y += 12;
 
 			// separator
 			DrawFrameRect(10, y + 1, 29, y + 9, 0, GB(clk, 2, 2) ? FR_LOWERED : FR_NONE);
-			x = DrawString(35, y + 1, STR_CURRENCY_SEPARATOR, 0);
-			DoDrawString(_str_separator, x + 4, y + 1, 6);
+			x = DrawString(35, y + 1, STR_CURRENCY_SEPARATOR, TC_FROMSTRING);
+			DoDrawString(_str_separator, x + 4, y + 1, TC_ORANGE);
 			y += 12;
 
 			// prefix
 			DrawFrameRect(10, y + 1, 29, y + 9, 0, GB(clk, 4, 2) ? FR_LOWERED : FR_NONE);
-			x = DrawString(35, y + 1, STR_CURRENCY_PREFIX, 0);
-			DoDrawString(_custom_currency.prefix, x + 4, y + 1, 6);
+			x = DrawString(35, y + 1, STR_CURRENCY_PREFIX, TC_FROMSTRING);
+			DoDrawString(_custom_currency.prefix, x + 4, y + 1, TC_ORANGE);
 			y += 12;
 
 			// suffix
 			DrawFrameRect(10, y + 1, 29, y + 9, 0, GB(clk, 6, 2) ? FR_LOWERED : FR_NONE);
-			x = DrawString(35, y + 1, STR_CURRENCY_SUFFIX, 0);
-			DoDrawString(_custom_currency.suffix, x + 4, y + 1, 6);
+			x = DrawString(35, y + 1, STR_CURRENCY_SUFFIX, TC_FROMSTRING);
+			DoDrawString(_custom_currency.suffix, x + 4, y + 1, TC_ORANGE);
 			y += 12;
 
 			// switch to euro
 			DrawArrowButtons(10, y, 3, GB(clk, 8, 2), true, true);
 			SetDParam(0, _custom_currency.to_euro);
-			DrawString(35, y + 1, (_custom_currency.to_euro != CF_NOEURO) ? STR_CURRENCY_SWITCH_TO_EURO : STR_CURRENCY_SWITCH_TO_EURO_NEVER, 0);
+			DrawString(35, y + 1, (_custom_currency.to_euro != CF_NOEURO) ? STR_CURRENCY_SWITCH_TO_EURO : STR_CURRENCY_SWITCH_TO_EURO_NEVER, TC_FROMSTRING);
 			y += 12;
 
 			// Preview
 			y += 12;
 			SetDParam(0, 10000);
-			DrawString(35, y + 1, STR_CURRENCY_PREVIEW, 0);
+			DrawString(35, y + 1, STR_CURRENCY_PREVIEW, TC_FROMSTRING);
 			break;
 		}
 
@@ -1099,7 +1102,7 @@
 
 			switch (line) {
 				case 0: // rate
-					if (IS_INT_INSIDE(x, 10, 30)) { // clicked buttons
+					if (IsInsideMM(x, 10, 30)) { // clicked buttons
 						if (x < 20) {
 							if (_custom_currency.rate > 1) _custom_currency.rate--;
 							WP(w,def_d).data_1 = 1 << (line * 2 + 0);
@@ -1116,7 +1119,7 @@
 					break;
 
 				case 1: // separator
-					if (IS_INT_INSIDE(x, 10, 30)) { // clicked button
+					if (IsInsideMM(x, 10, 30)) { // clicked button
 						WP(w,def_d).data_1 = 1 << (line * 2 + 1);
 					}
 					str = BindCString(_str_separator);
@@ -1124,7 +1127,7 @@
 					break;
 
 				case 2: // prefix
-					if (IS_INT_INSIDE(x, 10, 30)) { // clicked button
+					if (IsInsideMM(x, 10, 30)) { // clicked button
 						WP(w,def_d).data_1 = 1 << (line * 2 + 1);
 					}
 					str = BindCString(_custom_currency.prefix);
@@ -1132,7 +1135,7 @@
 					break;
 
 				case 3: // suffix
-					if (IS_INT_INSIDE(x, 10, 30)) { // clicked button
+					if (IsInsideMM(x, 10, 30)) { // clicked button
 						WP(w,def_d).data_1 = 1 << (line * 2 + 1);
 					}
 					str = BindCString(_custom_currency.suffix);
@@ -1140,14 +1143,14 @@
 					break;
 
 				case 4: // to euro
-					if (IS_INT_INSIDE(x, 10, 30)) { // clicked buttons
+					if (IsInsideMM(x, 10, 30)) { // clicked buttons
 						if (x < 20) {
 							_custom_currency.to_euro = (_custom_currency.to_euro <= 2000) ?
 								CF_NOEURO : _custom_currency.to_euro - 1;
 							WP(w,def_d).data_1 = 1 << (line * 2 + 0);
 						} else {
 							_custom_currency.to_euro =
-								clamp(_custom_currency.to_euro + 1, 2000, MAX_YEAR);
+								Clamp(_custom_currency.to_euro + 1, 2000, MAX_YEAR);
 							WP(w,def_d).data_1 = 1 << (line * 2 + 1);
 						}
 					} else { // enter text
@@ -1174,7 +1177,7 @@
 
 				switch (WP(w,def_d).data_2) {
 					case 0: /* Exchange rate */
-						_custom_currency.rate = clamp(atoi(b), 1, 5000);
+						_custom_currency.rate = Clamp(atoi(b), 1, 5000);
 						break;
 
 					case 1: /* Thousands seperator */
--- a/src/ship_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/ship_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -672,7 +672,7 @@
 		} else {
 			/* Not inside depot */
 			r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
-			if (HASBIT(r, VETS_CANNOT_ENTER)) goto reverse_direction;
+			if (HasBit(r, VETS_CANNOT_ENTER)) goto reverse_direction;
 
 			/* A leave station order only needs one tick to get processed, so we can
 			 * always skip ahead. */
@@ -742,9 +742,9 @@
 
 		/* Call the landscape function and tell it that the vehicle entered the tile */
 		r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
-		if (HASBIT(r, VETS_CANNOT_ENTER)) goto reverse_direction;
+		if (HasBit(r, VETS_CANNOT_ENTER)) goto reverse_direction;
 
-		if (!HASBIT(r, VETS_ENTERED_WORMHOLE)) {
+		if (!HasBit(r, VETS_ENTERED_WORMHOLE)) {
 			v->tile = gp.new_tile;
 			v->u.ship.state = TrackToTrackBits(track);
 		}
@@ -823,7 +823,7 @@
 	if (!IsTileOwner(tile, _current_player)) return CMD_ERROR;
 
 	v = new Ship();
-	unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_SHIP);
+	unit_num = HasBit(p2, 0) ? 0 : GetFreeUnitNumber(VEH_SHIP);
 	AutoPtrT<Vehicle> v_auto_delete = v;
 
 	if (v == NULL || unit_num > _patches.max_ships)
@@ -835,6 +835,7 @@
 
 		const ShipVehicleInfo *svi = ShipVehInfo(p1);
 
+		v = new (v) Ship();
 		v->unitnumber = unit_num;
 
 		v->owner = _current_player;
@@ -871,11 +872,10 @@
 		v->date_of_last_service = _date;
 		v->build_year = _cur_year;
 		v->cur_image = 0x0E5E;
-		v = new (v) Ship();
 		v->random_bits = VehicleRandomBits();
 
 		v->vehicle_flags = 0;
-		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
+		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
 
 		v->cargo_cap = GetVehicleProperty(v, 0x0D, svi->capacity);
 
@@ -911,12 +911,16 @@
 
 	if (v->type != VEH_SHIP || !CheckOwnership(v->owner)) return CMD_ERROR;
 
+	if (HASBITS(v->vehstatus, VS_CRASHED)) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE);
+
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
 	if (!v->IsStoppedInDepot()) {
 		return_cmd_error(STR_980B_SHIP_MUST_BE_STOPPED_IN);
 	}
 
+	CommandCost ret(-v->value);
+
 	if (flags & DC_EXEC) {
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 		RebuildVehicleLists();
@@ -926,7 +930,7 @@
 		delete v;
 	}
 
-	return CommandCost(-v->value);
+	return ret;
 }
 
 /** Start/Stop a ship.
@@ -960,6 +964,7 @@
 		}
 
 		v->vehstatus ^= VS_STOPPED;
+		v->cur_speed = 0;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 		InvalidateWindowClasses(WC_SHIPS_LIST);
@@ -999,13 +1004,13 @@
 
 	/* If the current orders are already goto-depot */
 	if (v->current_order.type == OT_GOTO_DEPOT) {
-		if (!!(p2 & DEPOT_SERVICE) == HASBIT(v->current_order.flags, OFB_HALT_IN_DEPOT)) {
+		if (!!(p2 & DEPOT_SERVICE) == HasBit(v->current_order.flags, OFB_HALT_IN_DEPOT)) {
 			/* We called with a different DEPOT_SERVICE setting.
 			 * 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);
+				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);
 			}
 			return CommandCost();
@@ -1015,7 +1020,7 @@
 		if (flags & DC_EXEC) {
 			/* If the orders to 'goto depot' are in the orders list (forced servicing),
 			 * then skip to the next order; effectively cancelling this forced service */
-			if (HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS))
+			if (HasBit(v->current_order.flags, OFB_PART_OF_ORDERS))
 				v->cur_order_index++;
 
 			v->current_order.type = OT_DUMMY;
@@ -1034,7 +1039,7 @@
 		v->dest_tile = dep->xy;
 		v->current_order.type = OT_GOTO_DEPOT;
 		v->current_order.flags = OF_NON_STOP;
-		if (!(p2 & DEPOT_SERVICE)) SETBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
+		if (!(p2 & DEPOT_SERVICE)) SetBit(v->current_order.flags, OFB_HALT_IN_DEPOT);
 		v->current_order.refit_cargo = CT_INVALID;
 		v->current_order.dest = dep->index;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
@@ -1079,7 +1084,7 @@
 	SET_EXPENSES_TYPE(EXPENSES_SHIP_RUN);
 
 	/* Check the refit capacity callback */
-	if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_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	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/ship_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -52,11 +52,11 @@
 	SetDParam(0, v->engine_type);
 	SetDParam(1, v->build_year);
 	SetDParam(2, v->value);
-	DrawString(x, y, STR_9816_BUILT_VALUE, 0);
+	DrawString(x, y, STR_9816_BUILT_VALUE, TC_FROMSTRING);
 
 	SetDParam(0, v->cargo_type);
 	SetDParam(1, v->cargo_cap);
-	DrawString(x, y + 10, STR_9817_CAPACITY, 0);
+	DrawString(x, y + 10, STR_9817_CAPACITY, TC_FROMSTRING);
 
 	StringID str = STR_8812_EMPTY;
 	if (!v->cargo.Empty()) {
@@ -65,9 +65,9 @@
 		SetDParam(2, v->cargo.Source());
 		str = STR_8813_FROM;
 	}
-	DrawString(x, y + 21, str, 0);
+	DrawString(x, y + 21, str, TC_FROMSTRING);
 
 	/* Draw Transfer credits text */
 	SetDParam(0, v->cargo.FeederShare());
-	DrawString(x, y + 33, STR_FEEDER_CARGO_VALUE, 0);
+	DrawString(x, y + 33, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING);
 }
--- a/src/signs_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/signs_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -75,7 +75,7 @@
 
 		/* No signs? */
 		if (w->vscroll.count == 0) {
-			DrawString(2, y, STR_304A_NONE, 0);
+			DrawString(2, y, STR_304A_NONE, TC_FROMSTRING);
 			return;
 		}
 
@@ -90,7 +90,7 @@
 					DrawPlayerIcon(si->owner, 4, y + 1);
 
 				SetDParam(0, si->index);
-				DrawString(22, y, STR_SIGN_NAME, 8);
+				DrawString(22, y, STR_SIGN_NAME, TC_YELLOW);
 				y += 10;
 			}
 		}
@@ -201,7 +201,7 @@
 
 	switch (e->event) {
 		case WE_CREATE:
-			SETBIT(_no_scroll, SCROLL_EDIT);
+			SetBit(_no_scroll, SCROLL_EDIT);
 			break;
 
 		case WE_PAINT:
@@ -276,7 +276,7 @@
 			break;
 
 		case WE_DESTROY:
-			CLRBIT(_no_scroll, SCROLL_EDIT);
+			ClrBit(_no_scroll, SCROLL_EDIT);
 			break;
 	}
 }
@@ -315,9 +315,10 @@
 
 	WP(w, editsign_d).caption = STR_280B_EDIT_SIGN_TEXT;
 	WP(w, editsign_d).afilter = CS_ALPHANUMERAL;
-	LowerWindowWidget(w, QUERY_EDIT_SIGN_WIDGET_TEXT);
+	w->LowerWidget(QUERY_EDIT_SIGN_WIDGET_TEXT);
 
 	UpdateSignEditWindow(w, si);
 }
 
 
+
--- a/src/slope.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/slope.h	Mon Dec 03 23:39:38 2007 +0000
@@ -9,12 +9,32 @@
 #define SLOPE_H
 
 /**
+ * Enumeration of tile corners
+ */
+enum Corner {
+	CORNER_W = 0,
+	CORNER_S = 1,
+	CORNER_E = 2,
+	CORNER_N = 3,
+	CORNER_END,
+	CORNER_INVALID = 0xFF
+};
+
+/**
  * Enumeration for the slope-type.
  *
  * This enumeration use the chars N,E,S,W corresponding the
  * direction north, east, south and west. The top corner of a tile
  * is the north-part of the tile. The whole slope is encoded with
  * 5 bits, 4 bits for each corner and 1 bit for a steep-flag.
+ *
+ * For halftile slopes an extra 3 bits are used to represent this
+ * properly; 1 bit for a halftile-flag and 2 bits to encode which
+ * extra side (corner) is leveled when the slope of the first 5
+ * bits is applied. This means that there can only be one leveled
+ * slope for steep slopes, which is logical because two leveled
+ * slopes would mean that it is not a steep slope as halftile
+ * slopes only span one height level.
  */
 enum Slope {
 	SLOPE_FLAT     = 0x00,                                  ///< a flat tile
@@ -37,18 +57,26 @@
 	SLOPE_STEEP_W  = SLOPE_STEEP | SLOPE_NWS,               ///< a steep slope falling to east (from west)
 	SLOPE_STEEP_S  = SLOPE_STEEP | SLOPE_WSE,               ///< a steep slope falling to north (from south)
 	SLOPE_STEEP_E  = SLOPE_STEEP | SLOPE_SEN,               ///< a steep slope falling to west (from east)
-	SLOPE_STEEP_N  = SLOPE_STEEP | SLOPE_ENW                ///< a steep slope falling to south (from north)
+	SLOPE_STEEP_N  = SLOPE_STEEP | SLOPE_ENW,               ///< a steep slope falling to south (from north)
+
+	SLOPE_HALFTILE = 0x20,                                  ///< one halftile is leveled (non continuous slope)
+	SLOPE_HALFTILE_MASK = 0xE0,                             ///< three bits used for halftile slopes
+	SLOPE_HALFTILE_W = SLOPE_HALFTILE | (CORNER_W << 6),    ///< the west halftile is leveled (non continuous slope)
+	SLOPE_HALFTILE_S = SLOPE_HALFTILE | (CORNER_S << 6),    ///< the south halftile is leveled (non continuous slope)
+	SLOPE_HALFTILE_E = SLOPE_HALFTILE | (CORNER_E << 6),    ///< the east halftile is leveled (non continuous slope)
+	SLOPE_HALFTILE_N = SLOPE_HALFTILE | (CORNER_N << 6),    ///< the north halftile is leveled (non continuous slope)
 };
 
 /**
- * Enumeration of tile corners
+ * Rangecheck for Corner enumeration.
+ *
+ * @param corner A #Corner.
+ * @return true iff corner is in a valid range.
  */
-enum Corner {
-	CORNER_W = 0,
-	CORNER_S = 1,
-	CORNER_E = 2,
-	CORNER_N = 3,
-};
+static inline bool IsValidCorner(Corner corner)
+{
+	return IsInsideMM(corner, 0, CORNER_END);
+}
 
 /**
  * Checks if a slope is steep.
@@ -62,32 +90,57 @@
 }
 
 /**
+ * Checks for non-continuous slope on halftile foundations.
+ *
+ * @param s The given #Slope.
+ * @return True if the slope is non-continuous, else false.
+ */
+static inline bool IsHalftileSlope(Slope s)
+{
+	return (s & SLOPE_HALFTILE) != 0;
+}
+
+/**
  * Return the complement of a slope.
  *
  * This method returns the complement of a slope. The complement of a
  * slope is a slope with raised corner which aren't raised in the given
  * slope.
  *
- * @pre The slope must not be steep.
+ * @pre The slope must neither be steep nor a halftile slope.
  * @param s The #Slope to get the complement.
  * @return a complement Slope of the given slope.
  */
 static inline Slope ComplementSlope(Slope s)
 {
-	assert(!IsSteepSlope(s));
+	assert(!IsSteepSlope(s) && !IsHalftileSlope(s));
 	return (Slope)(0xF ^ s);
 }
 
 /**
+ * Tests if a slope has a highest corner (i.e. one corner raised or a steep slope).
+ *
+ * Note: A halftile slope is ignored.
+ *
+ * @param s The #Slope.
+ * @return  true iff the slope has a highest corner.
+ */
+static inline bool HasSlopeHighestCorner(Slope s)
+{
+	s = (Slope)(s & ~SLOPE_HALFTILE_MASK);
+	return IsSteepSlope(s) || (s == SLOPE_W) || (s == SLOPE_S) || (s == SLOPE_E) || (s == SLOPE_N);
+}
+
+/**
  * Returns the highest corner of a slope (one corner raised or a steep slope).
  *
- * @pre      The slope must be a slope with one corner raised or a steep slope.
+ * @pre      The slope must be a slope with one corner raised or a steep slope. A halftile slope is ignored.
  * @param s  The #Slope.
  * @return   Highest corner.
  */
 static inline Corner GetHighestSlopeCorner(Slope s)
 {
-	switch (s) {
+	switch (s & ~SLOPE_HALFTILE_MASK) {
 		case SLOPE_W:
 		case SLOPE_STEEP_W: return CORNER_W;
 		case SLOPE_S:
@@ -101,6 +154,19 @@
 }
 
 /**
+ * Returns the leveled halftile of a halftile slope.
+ *
+ * @pre     The slope must be a halftile slope.
+ * @param s The #Slope.
+ * @return  The corner of the leveled halftile.
+ */
+static inline Corner GetHalftileSlopeCorner(Slope s)
+{
+	assert(IsHalftileSlope(s));
+	return (Corner)((s >> 6) & 3);
+}
+
+/**
  * Returns the height of the highest corner of a slope relative to TileZ (= minimal height)
  *
  * @param s The #Slope.
@@ -132,7 +198,7 @@
  */
 static inline Slope SlopeWithOneCornerRaised(Corner corner)
 {
-	assert(IS_INT_INSIDE(corner, 0, 4));
+	assert(IsValidCorner(corner));
 	return (Slope)(1 << corner);
 }
 
@@ -147,6 +213,19 @@
 	return ComplementSlope(SlopeWithOneCornerRaised(corner));
 }
 
+/**
+ * Adds a halftile slope to a slope.
+ *
+ * @param s #Slope without a halftile slope.
+ * @param corner The #Corner of the halftile.
+ * @return The #Slope s with the halftile slope added.
+ */
+static inline Slope HalftileSlope(Slope s, Corner corner)
+{
+	assert(IsValidCorner(corner));
+	return (Slope)(s | SLOPE_HALFTILE | (corner << 6));
+}
+
 
 /**
  * Enumeration for Foundations.
@@ -156,8 +235,22 @@
 	FOUNDATION_LEVELED,          ///< The tile is leveled up to a flat slope.
 	FOUNDATION_INCLINED_X,       ///< The tile has an along X-axis inclined foundation.
 	FOUNDATION_INCLINED_Y,       ///< The tile has an along Y-axis inclined foundation.
-	FOUNDATION_STEEP_LOWER,      ///< The tile has a steep slope. The lowerst corner is raised by a foundation to allow building railroad on the lower halftile.
-	FOUNDATION_STEEP_HIGHER,     ///< The tile has a steep slope. Three corners are raised by a foundation to allow building railroad on the higher halftile.
+	FOUNDATION_STEEP_LOWER,      ///< The tile has a steep slope. The lowest corner is raised by a foundation to allow building railroad on the lower halftile.
+
+/* Halftile foundations */
+	FOUNDATION_STEEP_BOTH,       ///< The tile has a steep slope. The lowest corner is raised by a foundation and the upper halftile is leveled.
+	FOUNDATION_HALFTILE_W,       ///< Level west halftile non-continuously.
+	FOUNDATION_HALFTILE_S,       ///< Level south halftile non-continuously.
+	FOUNDATION_HALFTILE_E,       ///< Level east halftile non-continuously.
+	FOUNDATION_HALFTILE_N,       ///< Level north halftile non-continuously.
+
+/* Special anti-zig-zag foundations for single horizontal/vertical track */
+	FOUNDATION_RAIL_W,           ///< Foundation for TRACK_BIT_LEFT, but not a leveled foundation.
+	FOUNDATION_RAIL_S,           ///< Foundation for TRACK_BIT_LOWER, but not a leveled foundation.
+	FOUNDATION_RAIL_E,           ///< Foundation for TRACK_BIT_RIGHT, but not a leveled foundation.
+	FOUNDATION_RAIL_N,           ///< Foundation for TRACK_BIT_UPPER, but not a leveled foundation.
+
+	FOUNDATION_INVALID = 0xFF    ///< Used inside "rail_cmd.cpp" to indicate invalid slope/track combination.
 };
 
 /**
@@ -194,6 +287,54 @@
 }
 
 /**
+ * Tests if a foundation is a non-continuous foundation, i.e. halftile-foundation or FOUNDATION_STEEP_BOTH.
+ *
+ * @param f  The #Foundation.
+ * @return   true iff f is a non-continuous foundation
+ */
+static inline bool IsNonContinuousFoundation(Foundation f)
+{
+	return IsInsideMM(f, FOUNDATION_STEEP_BOTH, FOUNDATION_HALFTILE_N + 1);
+}
+
+/**
+ * Returns the halftile corner of a halftile-foundation
+ *
+ * @pre f != FOUNDATION_STEEP_BOTH
+ *
+ * @param f  The #Foundation.
+ * @return   The #Corner with track.
+ */
+static inline Corner GetHalftileFoundationCorner(Foundation f)
+{
+	assert(IsInsideMM(f, FOUNDATION_HALFTILE_W, FOUNDATION_HALFTILE_N + 1));
+	return (Corner)(f - FOUNDATION_HALFTILE_W);
+}
+
+/**
+ * Tests if a foundation is a special rail foundation for single horizontal/vertical track.
+ *
+ * @param f  The #Foundation.
+ * @return   true iff f is a special rail foundation for single horizontal/vertical track.
+ */
+static inline bool IsSpecialRailFoundation(Foundation f)
+{
+	return IsInsideMM(f, FOUNDATION_RAIL_W, FOUNDATION_RAIL_N + 1);
+}
+
+/**
+ * Returns the track corner of a special rail foundation
+ *
+ * @param f  The #Foundation.
+ * @return   The #Corner with track.
+ */
+static inline Corner GetRailFoundationCorner(Foundation f)
+{
+	assert(IsSpecialRailFoundation(f));
+	return (Corner)(f - FOUNDATION_RAIL_W);
+}
+
+/**
  * Returns the foundation needed to flatten a slope.
  * The returned foundation is either FOUNDATION_NONE if the tile was already flat, or FOUNDATION_LEVELED.
  *
@@ -218,4 +359,28 @@
 	return (axis == AXIS_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y);
 }
 
+/**
+ * Returns the halftile foundation for single horizontal/vertical track.
+ *
+ * @param corner The #Corner with the track.
+ * @return       The wanted #Foundation.
+ */
+static inline Foundation HalftileFoundation(Corner corner)
+{
+	assert(IsValidCorner(corner));
+	return (Foundation)(FOUNDATION_HALFTILE_W + corner);
+}
+
+/**
+ * Returns the special rail foundation for single horizontal/vertical track.
+ *
+ * @param corner The #Corner with the track.
+ * @return       The wanted #Foundation.
+ */
+static inline Foundation SpecialRailFoundation(Corner corner)
+{
+	assert(IsValidCorner(corner));
+	return (Foundation)(FOUNDATION_RAIL_W + corner);
+}
+
 #endif /* SLOPE_H */
--- a/src/smallmap_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/smallmap_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -8,6 +8,7 @@
 #include "bridge_map.h"
 #include "clear_map.h"
 #include "industry_map.h"
+#include "industry.h"
 #include "station_map.h"
 #include "table/strings.h"
 #include "strings.h"
@@ -43,28 +44,37 @@
 {    WWT_IMGBTN,   RESIZE_LRTB,    13,   262,   283,   158,   179, SPR_IMG_SMALLMAP,        STR_SMALLMAP_CENTER},
 {    WWT_IMGBTN,   RESIZE_LRTB,    13,   262,   283,   180,   201, SPR_IMG_TOWN,            STR_0197_TOGGLE_TOWN_NAMES_ON_OFF},
 {     WWT_PANEL,    RESIZE_RTB,    13,     0,   261,   158,   201, 0x0,                     STR_NULL},
+{     WWT_PANEL,   RESIZE_LRTB,    13,   262,   349,   202,   202, 0x0,                     STR_NULL},
 {     WWT_PANEL,    RESIZE_RTB,    13,     0,   337,   202,   213, 0x0,                     STR_NULL},
+{   WWT_TEXTBTN,     RESIZE_TB,    13,     0,    99,   202,   213, STR_MESSAGES_ENABLE_ALL, STR_NULL},
+{   WWT_TEXTBTN,     RESIZE_TB,    13,   100,   201,   202,   213, STR_MESSAGES_DISABLE_ALL,STR_NULL},
 { WWT_RESIZEBOX,   RESIZE_LRTB,    13,   338,   349,   202,   213, 0x0,                     STR_RESIZE_BUTTON},
 {  WIDGETS_END},
 };
 
 static int _smallmap_type;
 static bool _smallmap_show_towns = true;
+/* number of used industries */
+static int _smallmap_industry_count;
+/* number of industries per column*/
+static uint _industries_per_column;
 
 /** Macro for ordinary entry of LegendAndColor */
-#define MK(a,b) {a, b, false, false}
+#define MK(a,b) {a, b, INVALID_INDUSTRYTYPE, true, false, false}
 /** Macro for end of list marker in arrays of LegendAndColor */
-#define MKEND() {0, STR_NULL, true, false}
+#define MKEND() {0, STR_NULL, INVALID_INDUSTRYTYPE, true, true, false}
 /** Macro for break marker in arrays of LegendAndColor.
  * It will have valid data, though */
-#define MS(a,b) {a, b, false, true}
+#define MS(a,b) {a, b, INVALID_INDUSTRYTYPE, true, false, true}
 
 /** Structure for holding relevant data for legends in small map */
 struct LegendAndColour {
 	uint16 colour;     ///< color of the item on the map
 	StringID legend;   ///< string corresponding to the colored item
-	bool end;         ///< this is the end of the list
-	bool col_break;   ///< perform a break and go one collumn further
+	IndustryType type; ///< type of industry
+	bool show_on_map;  ///< for filtering industries, if true is shown on map in color
+	bool end;          ///< this is the end of the list
+	bool col_break;    ///< perform a break and go one collumn further
 };
 
 /** Legend text giving the colours to look for on the minimap */
@@ -136,6 +146,8 @@
 /** Allow room for all industries, plus a terminator entry
  * This is required in order to have the indutry slots all filled up */
 static LegendAndColour _legend_from_industries[NUM_INDUSTRYTYPES+1];
+/* For connecting industry type to position in industries list(small map legend) */
+static uint _industry_to_list_pos[NUM_INDUSTRYTYPES];
 
 /**
  * Fills an array for the industries legends.
@@ -144,6 +156,7 @@
 {
 	const IndustrySpec *indsp;
 	uint j = 0;
+	uint free_slot, diff;
 
 	/* Add each name */
 	for (IndustryType i = 0; i < NUM_INDUSTRYTYPES; i++) {
@@ -151,13 +164,33 @@
 		if (indsp->enabled) {
 			_legend_from_industries[j].legend = indsp->name;
 			_legend_from_industries[j].colour = indsp->map_colour;
-			_legend_from_industries[j].col_break = (j % 6) == 0;  // break is performed on the 7th item
+			_legend_from_industries[j].type = i;
+			_legend_from_industries[j].show_on_map = true;
+			_legend_from_industries[j].col_break = false;
 			_legend_from_industries[j].end = false;
+
+			/* Store widget number for this industry type */
+			_industry_to_list_pos[i] = j;
 			j++;
 		}
 	}
 	/* Terminate the list */
 	_legend_from_industries[j].end = true;
+
+	/* Store number of enabled industries */
+	_smallmap_industry_count = j;
+
+	_industries_per_column = _smallmap_industry_count / 3;
+	free_slot = _smallmap_industry_count % 3;
+
+	/* recalculate column break for first two columns(i) */
+	diff = 0;
+	for (int i = 1; i <= 2; i++) {
+		if (free_slot > 0) diff = diff + 1;
+		_legend_from_industries[i * _industries_per_column + diff].col_break = true;
+		if (free_slot > 0) free_slot--;
+	}
+
 }
 
 static const LegendAndColour * const _legend_table[] = {
@@ -357,7 +390,13 @@
 	TileType t = GetEffectiveTileType(tile);
 
 	if (t == MP_INDUSTRY) {
-		return GetIndustrySpec(GetIndustryByTile(tile)->type)->map_colour * 0x01010101;
+		/* If industry is allowed to be seen, use its color on the map */
+		if (_legend_from_industries[_industry_to_list_pos[GetIndustryByTile(tile)->type]].show_on_map) {
+			return GetIndustrySpec(GetIndustryByTile(tile)->type)->map_colour * 0x01010101;
+		} else {
+			/* otherwise, return the color of the clear tiles, which will make it disappear */
+			return ApplyMask(MKCOLOR(0x54545454), &_smallmap_vehicles_andor[MP_CLEAR]);
+		}
 	}
 
 	return ApplyMask(MKCOLOR(0x54545454), &_smallmap_vehicles_andor[t]);
@@ -499,6 +538,31 @@
 	GfxFillRect(x2 - 3, y, x2,    y2, 69);
 }
 
+enum SmallMapWindowWidgets {
+	SM_WIDGET_MAP = 4,
+	SM_WIDGET_CONTOUR,
+	SM_WIDGET_VEHICLES,
+	SM_WIDGET_INDUSTRIES,
+	SM_WIDGET_ROUTES,
+	SM_WIDGET_VEGETATION,
+	SM_WIDGET_OWNERS,
+	SM_WIDGET_CENTERMAP,
+	SM_WIDGET_TOGGLETOWNNAME,
+	SM_WIDGET_LEGEND,
+	SM_WIDGET_BUTTONSPANEL,
+	SM_WIDGET_BOTTOMPANEL,
+	SM_WIDGET_ENABLEINDUSTRIES,
+	SM_WIDGET_DISABLEINDUSTRIES,
+	SM_WIDGET_RESIZEBOX,
+};
+
+enum SmallMapType {
+	SMT_CONTOUR,
+	SMT_VEHICLES,
+	SMT_INDUSTRY,
+	SMT_OWNER = 5,
+};
+
 /**
  * Draws the small map.
  *
@@ -530,7 +594,7 @@
 	GfxFillRect(dpi->left, dpi->top, dpi->left + dpi->width - 1, dpi->top + dpi->height - 1, 0);
 
 	/* setup owner table */
-	if (type == 5) {
+	if (type == SMT_OWNER) {
 		const Player *p;
 
 		/* fill with some special colors */
@@ -615,7 +679,7 @@
 	}
 
 	/* draw vehicles? */
-	if (type == 0 || type == 1) {
+	if (type == SMT_CONTOUR || type == SMT_VEHICLES) {
 		Vehicle *v;
 		bool skip;
 		byte color;
@@ -633,7 +697,7 @@
 
 				/* Check if y is out of bounds? */
 				y -= dpi->top;
-				if (!IS_INT_INSIDE(y, 0, dpi->height)) continue;
+				if (!IsInsideMM(y, 0, dpi->height)) continue;
 
 				/* Default is to draw both pixels. */
 				skip = false;
@@ -653,7 +717,7 @@
 				}
 
 				/* Calculate pointer to pixel and the color */
-				color = (type == 1) ? _vehicle_type_colors[v->type] : 0xF;
+				color = (type == SMT_VEHICLES) ? _vehicle_type_colors[v->type] : 0xF;
 
 				/* And draw either one or two pixels depending on clipping */
 				blitter->SetPixel(dpi->dst_ptr, x, y, color);
@@ -681,7 +745,7 @@
 					y < dpi->top + dpi->height) {
 				/* And draw it. */
 				SetDParam(0, t->index);
-				DrawString(x, y, STR_2056, 12);
+				DrawString(x, y, STR_2056, TC_WHITE);
 			}
 		}
 	}
@@ -720,42 +784,65 @@
 	ViewPort *vp;
 	vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
 
-	x  = ((vp->virtual_width  - (w->widget[4].right  - w->widget[4].left) * TILE_SIZE) / 2 + vp->virtual_left) / 4;
-	y  = ((vp->virtual_height - (w->widget[4].bottom - w->widget[4].top ) * TILE_SIZE) / 2 + vp->virtual_top ) / 2 - TILE_SIZE * 2;
+	x  = ((vp->virtual_width  - (w->widget[SM_WIDGET_MAP].right  - w->widget[SM_WIDGET_MAP].left) * TILE_SIZE) / 2 + vp->virtual_left) / 4;
+	y  = ((vp->virtual_height - (w->widget[SM_WIDGET_MAP].bottom - w->widget[SM_WIDGET_MAP].top ) * TILE_SIZE) / 2 + vp->virtual_top ) / 2 - TILE_SIZE * 2;
 	WP(w, smallmap_d).scroll_x = (y - x) & ~0xF;
 	WP(w, smallmap_d).scroll_y = (x + y) & ~0xF;
 	SetWindowDirty(w);
 }
 
+enum {
+	BASE_NB_PER_COLUMN = 6,
+};
+
 static void SmallMapWindowProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
 		case WE_PAINT: {
 			const LegendAndColour *tbl;
 			int x, y, y_org;
+			uint diff;
 			DrawPixelInfo new_dpi;
 
+			/* Hide Enable all/Disable all buttons if is not industry type small map*/
+			w->SetWidgetHiddenState(SM_WIDGET_ENABLEINDUSTRIES, _smallmap_type != SMT_INDUSTRY);
+			w->SetWidgetHiddenState(SM_WIDGET_DISABLEINDUSTRIES, _smallmap_type != SMT_INDUSTRY);
+
 			/* draw the window */
 			SetDParam(0, STR_00E5_CONTOURS + _smallmap_type);
 			DrawWindowWidgets(w);
 
 			tbl = _legend_table[_smallmap_type];
 
-			x = 4;
-			y_org = w->height - 44 - 11;
-			y = y_org;
-			for (;;) {
-				GfxFillRect(x,     y + 1, x + 8, y + 5, 0);
-				GfxFillRect(x + 1, y + 2, x + 7, y + 4, tbl->colour);
+			/* difference in window size */
+			diff = (_industries_per_column > BASE_NB_PER_COLUMN) ? ((_industries_per_column - BASE_NB_PER_COLUMN) * BASE_NB_PER_COLUMN) + 1 : 0;
 
-				if (_smallmap_type == 2) {
+			x = 4;
+			y_org = w->height - 44 - 11 - diff;
+			y = y_org;
+
+			for (;;) {
+
+				if (_smallmap_type == SMT_INDUSTRY) {
 					/* Industry name must be formated, since it's not in tiny font in the specs.
-					* So, draw with a parameter and use the STR_7065 string, which is tiny, black */
+					 * So, draw with a parameter and use the STR_SMALLMAP_INDUSTRY string, which is tiny font.*/
 					SetDParam(0, tbl->legend);
-					DrawString(x + 11, y, STR_7065, 0);
+					assert(tbl->type < NUM_INDUSTRYTYPES);
+					SetDParam(1, _industry_counts[tbl->type]);
+					if (!tbl->show_on_map) {
+						/* Simply draw the string, not the black border of the legend color.
+						 * This will enforce the idea of the disabled item */
+						DrawString(x + 11, y, STR_SMALLMAP_INDUSTRY, TC_GREY);
+					} else {
+						DrawString(x + 11, y, STR_SMALLMAP_INDUSTRY, TC_BLACK);
+						GfxFillRect(x, y + 1, x + 8, y + 5, 0); // outer border of the legend color
+					}
 				} else {
-					DrawString(x + 11, y, tbl->legend, 0);
+					/* Anything that is not an industry is using normal process */
+					GfxFillRect(x, y + 1, x + 8, y + 5, 0);
+					DrawString(x + 11, y, tbl->legend, TC_FROMSTRING);
 				}
+				GfxFillRect(x + 1, y + 2, x + 7, y + 4, tbl->colour); // legend color
 
 				tbl += 1;
 				y += 6;
@@ -769,7 +856,7 @@
 				}
 			}
 
-			if (!FillDrawPixelInfo(&new_dpi, 3, 17, w->width - 28 + 22, w->height - 64 - 11))
+			if (!FillDrawPixelInfo(&new_dpi, 3, 17, w->width - 28 + 22, w->height - 64 - 11 - diff))
 				return;
 
 			DrawSmallMap(&new_dpi, w, _smallmap_type, _smallmap_show_towns);
@@ -777,7 +864,7 @@
 
 		case WE_CLICK:
 			switch (e->we.click.widget) {
-				case 4: { // Map window
+				case SM_WIDGET_MAP: { // Map window
 					Window *w2 = FindWindowById(WC_MAIN_WINDOW, 0);
 					Point pt;
 
@@ -798,39 +885,91 @@
 					SetWindowDirty(w);
 				} break;
 
-				case 5:  // Show land contours
-				case 6:  // Show vehicles
-				case 7:  // Show industries
-				case 8:  // Show transport routes
-				case 9:  // Show vegetation
-				case 10: // Show land owners
-					RaiseWindowWidget(w, _smallmap_type + 5);
-					_smallmap_type = e->we.click.widget - 5;
-					LowerWindowWidget(w, _smallmap_type + 5);
+				case SM_WIDGET_CONTOUR:    // Show land contours
+				case SM_WIDGET_VEHICLES:   // Show vehicles
+				case SM_WIDGET_INDUSTRIES: // Show industries
+				case SM_WIDGET_ROUTES:     // Show transport routes
+				case SM_WIDGET_VEGETATION: // Show vegetation
+				case SM_WIDGET_OWNERS:     // Show land owners
+					w->RaiseWidget(_smallmap_type + SM_WIDGET_CONTOUR);
+					_smallmap_type = e->we.click.widget - SM_WIDGET_CONTOUR;
+					w->LowerWidget(_smallmap_type + SM_WIDGET_CONTOUR);
 
 					SetWindowDirty(w);
 					SndPlayFx(SND_15_BEEP);
 					break;
 
-				case 11: // Center the smallmap again
+				case SM_WIDGET_CENTERMAP: // Center the smallmap again
 					SmallMapCenterOnCurrentPos(w);
 
 					SetWindowDirty(w);
 					SndPlayFx(SND_15_BEEP);
 					break;
 
-				case 12: // Toggle town names
-					ToggleWidgetLoweredState(w, 12);
-					_smallmap_show_towns = IsWindowWidgetLowered(w, 12);
+				case SM_WIDGET_TOGGLETOWNNAME: // Toggle town names
+					w->ToggleWidgetLoweredState(SM_WIDGET_TOGGLETOWNNAME);
+					_smallmap_show_towns = w->IsWidgetLowered(SM_WIDGET_TOGGLETOWNNAME);
 
 					SetWindowDirty(w);
 					SndPlayFx(SND_15_BEEP);
 					break;
+
+				case SM_WIDGET_LEGEND: // Legend
+					/* if industry type small map*/
+					if (_smallmap_type == SMT_INDUSTRY) {
+						/* if click on industries label, find right industry type and enable/disable it */
+						Widget *wi = &w->widget[SM_WIDGET_LEGEND]; // label panel
+						uint column = (e->we.click.pt.x - 4) / 123;
+						uint line = (e->we.click.pt.y - wi->top - 2) / 6;
+						uint free = _smallmap_industry_count % 3;
+
+						if (column <= 3) {
+							/* check if click is on industry label*/
+							uint industry_pos = 0;
+							for (uint i = 0; i <= column; i++) {
+								uint diff = (free > 0) ? 1 : 0;
+								uint max_column_lines = _industries_per_column + diff;
+
+								if (i < column) industry_pos = industry_pos + _industries_per_column + diff;
+
+								if (i == column && line <= max_column_lines - 1) {
+									industry_pos = industry_pos + line;
+									_legend_from_industries[industry_pos].show_on_map = !_legend_from_industries[industry_pos].show_on_map;
+								}
+								if( free > 0) free--;
+							}
+						}
+						/* Raise the two buttons "all", as we have done a specific choice */
+						w->RaiseWidget(SM_WIDGET_ENABLEINDUSTRIES);
+						w->RaiseWidget(SM_WIDGET_DISABLEINDUSTRIES);
+						SetWindowDirty(w);
+					}
+					break;
+
+				case SM_WIDGET_ENABLEINDUSTRIES: // Enable all industries
+					for (int i = 0; i != _smallmap_industry_count; i++) {
+						_legend_from_industries[i].show_on_map = true;
+					}
+					/* toggle appeareance indicating the choice */
+					w->LowerWidget(SM_WIDGET_ENABLEINDUSTRIES);
+					w->RaiseWidget(SM_WIDGET_DISABLEINDUSTRIES);
+					SetWindowDirty(w);
+					break;
+
+				case SM_WIDGET_DISABLEINDUSTRIES: // disable all industries
+					for (int i = 0; i != _smallmap_industry_count; i++) {
+						_legend_from_industries[i].show_on_map = false;
+					}
+					/* toggle appeareance indicating the choice */
+					w->RaiseWidget(SM_WIDGET_ENABLEINDUSTRIES);
+					w->LowerWidget(SM_WIDGET_DISABLEINDUSTRIES);
+					SetWindowDirty(w);
+					break;
 				}
 			break;
 
 		case WE_RCLICK:
-			if (e->we.click.widget == 4) {
+			if (e->we.click.widget == SM_WIDGET_MAP) {
 				if (_scrolling_viewport) return;
 				_scrolling_viewport = true;
 				_cursor.delta.x = 0;
@@ -876,8 +1015,8 @@
 				}
 			}
 
-			hx = (w->widget[4].right  - w->widget[4].left) / 2;
-			hy = (w->widget[4].bottom - w->widget[4].top ) / 2;
+			hx = (w->widget[SM_WIDGET_MAP].right  - w->widget[SM_WIDGET_MAP].left) / 2;
+			hy = (w->widget[SM_WIDGET_MAP].bottom - w->widget[SM_WIDGET_MAP].top ) / 2;
 			hvx = hx * -4 + hy * 8;
 			hvy = hx *  4 + hy * 8;
 			if (x < -hvx) {
@@ -921,8 +1060,33 @@
 	w = AllocateWindowDescFront(&_smallmap_desc, 0);
 	if (w == NULL) return;
 
-	LowerWindowWidget(w, _smallmap_type + 5);
-	SetWindowWidgetLoweredState(w, 12, _smallmap_show_towns);
+	/* Resize the window to fit industries list */
+	if (_industries_per_column > BASE_NB_PER_COLUMN) {
+		uint diff = ((_industries_per_column - BASE_NB_PER_COLUMN) * BASE_NB_PER_COLUMN) + 1;
+
+		w->height = w->height + diff;
+
+		Widget *wi = &w->widget[SM_WIDGET_LEGEND]; // label panel
+		wi->bottom = wi->bottom + diff;
+
+		wi = &w->widget[SM_WIDGET_BUTTONSPANEL]; // filler panel under smallmap buttons
+		wi->bottom = wi->bottom + diff - 1;
+
+		/* Change widget position
+		 * - footer panel
+		 * - enable all industry
+		 * - disable all industry
+		 * - resize window button
+		 */
+		for (uint i = SM_WIDGET_BOTTOMPANEL; i <= SM_WIDGET_RESIZEBOX; i++) {
+			wi           = &w->widget[i];
+			wi->top      = wi->top + diff;
+			wi->bottom   = wi->bottom + diff;
+		}
+	}
+
+	w->LowerWidget(_smallmap_type + SMT_OWNER);
+	w->SetWidgetLoweredState(SM_WIDGET_TOGGLETOWNNAME, _smallmap_show_towns);
 
 	SmallMapCenterOnCurrentPos(w);
 }
@@ -951,7 +1115,7 @@
 		/* New viewport start at (zero,zero) */
 		AssignWindowViewport(w, 3, 17, w->widget[4].right - w->widget[4].left - 1, w->widget[4].bottom - w->widget[4].top - 1, 0, ZOOM_LVL_VIEWPORT);
 
-		DisableWindowWidget(w, 5);
+		w->DisableWidget(5);
 		break;
 
 	case WE_PAINT:
--- a/src/sound.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/sound.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -15,11 +15,11 @@
 #include "fileio.h"
 #include "newgrf_sound.h"
 #include "helpers.hpp"
+#include "fios.h"
 
 static uint _file_count;
 static FileEntry *_files;
 
-#define SOUND_SLOT 63
 // Number of levels of panning per side
 #define PANNING_LEVELS 16
 
@@ -148,7 +148,7 @@
 	if (mc == NULL) return;
 	if (!SetBankSource(mc, sound)) return;
 
-	panning = clamp(panning, -PANNING_LEVELS, PANNING_LEVELS);
+	panning = Clamp(panning, -PANNING_LEVELS, PANNING_LEVELS);
 	left_vol = (volume * PANNING_LEVELS) - (volume * panning);
 	right_vol = (volume * PANNING_LEVELS) + (volume * panning);
 	MxSetChannelVolume(mc, left_vol * 128 / PANNING_LEVELS, right_vol * 128 / PANNING_LEVELS);
@@ -209,8 +209,8 @@
 		const ViewPort *vp = (*wz)->viewport;
 
 		if (vp != NULL &&
-				IS_INSIDE_1D(x, vp->virtual_left, vp->virtual_width) &&
-				IS_INSIDE_1D(y, vp->virtual_top, vp->virtual_height)) {
+				IsInsideBS(x, vp->virtual_left, vp->virtual_width) &&
+				IsInsideBS(y, vp->virtual_top, vp->virtual_height)) {
 			int left = (x - vp->virtual_left);
 
 			StartSound(
--- a/src/sound/cocoa_s.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/sound/cocoa_s.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -8,27 +8,20 @@
 
 #ifdef WITH_COCOA
 
+#define MAC_OS_X_VERSION_MIN_REQUIRED    MAC_OS_X_VERSION_10_3
+#include <AvailabilityMacros.h>
+
 #include <AudioUnit/AudioUnit.h>
 
 /* Name conflict */
 #define Rect        OTTDRect
 #define Point       OTTDPoint
 #define WindowClass OTTDWindowClass
-/* Defined in stdbool.h */
-#ifndef __cplusplus
-# ifndef __BEOS__
-#  undef bool
-#  undef false
-#  undef true
-# endif
-#endif
 
 #include "../stdafx.h"
-#include "../openttd.h"
 #include "../debug.h"
 #include "../driver.h"
 #include "../mixer.h"
-#include "../sdl.h"
 
 #include "cocoa_s.h"
 
@@ -41,9 +34,9 @@
 static AudioUnit _outputAudioUnit;
 
 /* The CoreAudio callback */
-static OSStatus audioCallback(void *inRefCon, AudioUnitRenderActionFlags inActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, AudioBuffer *ioData)
+static OSStatus audioCallback(void *inRefCon, AudioUnitRenderActionFlags *inActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData)
 {
-	MxMixSamples(ioData->mData, ioData->mDataByteSize / 4);
+	MxMixSamples(ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize / 4);
 
 	return noErr;
 }
@@ -53,7 +46,7 @@
 {
 	Component comp;
 	ComponentDescription desc;
-	struct AudioUnitInputCallback callback;
+	struct AURenderCallbackStruct callback;
 	AudioStreamBasicDescription requestedDesc;
 
 	/* Setup a AudioStreamBasicDescription with the requested format */
@@ -75,9 +68,9 @@
 
 
 	/* Locate the default output audio unit */
-	desc.componentType = kAudioUnitComponentType;
-	desc.componentSubType = kAudioUnitSubType_Output;
-	desc.componentManufacturer = kAudioUnitID_DefaultOutput;
+	desc.componentType = kAudioUnitType_Output;
+	desc.componentSubType = kAudioUnitSubType_HALOutput;
+	desc.componentManufacturer = kAudioUnitManufacturer_Apple;
 	desc.componentFlags = 0;
 	desc.componentFlagsMask = 0;
 
@@ -103,8 +96,8 @@
 	/* Set the audio callback */
 	callback.inputProc = audioCallback;
 	callback.inputProcRefCon = NULL;
-	if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetInputCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)) != noErr) {
-		return "cocoa_s: Failed to start CoreAudio: AudioUnitSetProperty (kAudioUnitProperty_SetInputCallback)";
+	if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)) != noErr) {
+		return "cocoa_s: Failed to start CoreAudio: AudioUnitSetProperty (kAudioUnitProperty_SetRenderCallback)";
 	}
 
 	/* Finally, start processing of the audio unit */
@@ -119,7 +112,7 @@
 
 void SoundDriver_Cocoa::Stop()
 {
-	struct AudioUnitInputCallback callback;
+	struct AURenderCallbackStruct callback;
 
 	/* stop processing the audio unit */
 	if (AudioOutputUnitStop(_outputAudioUnit) != noErr) {
@@ -130,8 +123,8 @@
 	/* Remove the input callback */
 	callback.inputProc = 0;
 	callback.inputProcRefCon = 0;
-	if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetInputCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)) != noErr) {
-		DEBUG(driver, 0, "cocoa_s: Core_CloseAudio: AudioUnitSetProperty (kAudioUnitProperty_SetInputCallback) failed");
+	if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)) != noErr) {
+		DEBUG(driver, 0, "cocoa_s: Core_CloseAudio: AudioUnitSetProperty (kAudioUnitProperty_SetRenderCallback) failed");
 		return;
 	}
 
--- a/src/spritecache.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/spritecache.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -47,7 +47,7 @@
 {
 	if (index >= _spritecache_items) {
 		/* Add another 1024 items to the 'pool' */
-		uint items = ALIGN(index + 1, 1024);
+		uint items = Align(index + 1, 1024);
 
 		DEBUG(sprite, 4, "Increasing sprite cache to %d items (%d bytes)", items, items * sizeof(*_spritecache));
 
@@ -436,7 +436,7 @@
 
 	/* Align this to an uint32 boundary. This also makes sure that the 2 least
 	 * bits are not used, so we could use those for other things. */
-	mem_req = ALIGN(mem_req, sizeof(uint32));
+	mem_req = Align(mem_req, sizeof(uint32));
 
 	for (;;) {
 		MemBlock* s;
--- a/src/station.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/station.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -439,7 +439,7 @@
 bool RoadStop::IsFreeBay(uint nr) const
 {
 	assert(nr < MAX_BAY_COUNT);
-	return HASBIT(status, nr);
+	return HasBit(status, nr);
 }
 
 /**
@@ -453,9 +453,9 @@
 
 	/* Find the first free bay. If the bit is set, the bay is free. */
 	uint bay_nr = 0;
-	while (!HASBIT(status, bay_nr)) bay_nr++;
+	while (!HasBit(status, bay_nr)) bay_nr++;
 
-	CLRBIT(status, bay_nr);
+	ClrBit(status, bay_nr);
 	return bay_nr;
 }
 
@@ -466,7 +466,7 @@
 void RoadStop::AllocateDriveThroughBay(uint nr)
 {
 	assert(nr < MAX_BAY_COUNT);
-	CLRBIT(status, nr);
+	ClrBit(status, nr);
 }
 
 /**
@@ -476,14 +476,14 @@
 void RoadStop::FreeBay(uint nr)
 {
 	assert(nr < MAX_BAY_COUNT);
-	SETBIT(status, nr);
+	SetBit(status, nr);
 }
 
 
 /** Checks whether the entrance of the road stop is occupied by a vehicle */
 bool RoadStop::IsEntranceBusy() const
 {
-	return HASBIT(status, 7);
+	return HasBit(status, 7);
 }
 
 /** Makes an entrance occupied or free */
--- a/src/station.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/station.h	Mon Dec 03 23:39:38 2007 +0000
@@ -15,6 +15,7 @@
 #include "newgrf_fsmports.h"
 #include "cargopacket.h"
 #include <list>
+#include <set>
 
 struct Station;
 struct RoadStop;
@@ -252,6 +253,11 @@
 
 void ModifyStationRatingAround(TileIndex tile, PlayerID owner, int amount, uint radius);
 
+/** A set of stations (\c const \c Station* ) */
+typedef std::set<Station*> StationSet;
+
+StationSet FindStationsAroundIndustryTile(TileIndex tile, int w, int h);
+
 void ShowStationViewWindow(StationID station);
 void UpdateAllStationVirtCoord();
 
--- a/src/station_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/station_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -44,6 +44,8 @@
 #include "strings.h"
 #include "autoslope.h"
 #include "newgrf_fsmports.h"
+#include "transparency.h"
+#include "water.h"
 
 DEFINE_OLD_POOL_GENERIC(Station, Station)
 DEFINE_OLD_POOL_GENERIC(RoadStop, RoadStop)
@@ -154,8 +156,11 @@
 }
 
 
-/* Calculate the radius of the station. Basicly it is the biggest
- *  radius that is available within the station */
+/** Calculate the radius of the station. Basicly it is the biggest
+ *  radius that is available within the station
+ * @param st Station to query
+ * @return the so calculated radius
+ */
 static uint FindCatchmentRadius(const Station* st)
 {
 	uint ret = CA_NONE;
@@ -285,6 +290,16 @@
 
 #define M(x) ((x) - STR_SV_STNAME)
 
+enum StationNaming {
+	STATIONNAMING_RAIL = 0,
+	STATIONNAMING_ROAD = 0,
+	STATIONNAMING_AIRPORT,
+	STATIONNAMING_OILRIG,
+	STATIONNAMING_DOCK,
+	STATIONNAMING_BUOY,
+	STATIONNAMING_HELIPORT,
+};
+
 static bool GenerateStationName(Station *st, TileIndex tile, int flag)
 {
 	static const uint32 _gen_station_name_bits[] = {
@@ -310,7 +325,7 @@
 				if (str <= 0x20) {
 					if (str == M(STR_SV_STNAME_FOREST))
 						str = M(STR_SV_STNAME_WOODS);
-					CLRBIT(free_names, str);
+					ClrBit(free_names, str);
 				}
 			}
 		}
@@ -324,7 +339,7 @@
 	}
 
 	/* check mine? */
-	if (HASBIT(free_names, M(STR_SV_STNAME_MINES))) {
+	if (HasBit(free_names, M(STR_SV_STNAME_MINES))) {
 		if (CountMapSquareAround(tile, CMSAMine) >= 2) {
 			found = M(STR_SV_STNAME_MINES);
 			goto done;
@@ -334,14 +349,14 @@
 	/* check close enough to town to get central as name? */
 	if (DistanceMax(tile, t->xy) < 8) {
 		found = M(STR_SV_STNAME);
-		if (HASBIT(free_names, M(STR_SV_STNAME))) goto done;
+		if (HasBit(free_names, M(STR_SV_STNAME))) goto done;
 
 		found = M(STR_SV_STNAME_CENTRAL);
-		if (HASBIT(free_names, M(STR_SV_STNAME_CENTRAL))) goto done;
+		if (HasBit(free_names, M(STR_SV_STNAME_CENTRAL))) goto done;
 	}
 
 	/* Check lakeside */
-	if (HASBIT(free_names, M(STR_SV_STNAME_LAKESIDE)) &&
+	if (HasBit(free_names, M(STR_SV_STNAME_LAKESIDE)) &&
 			DistanceFromEdge(tile) < 20 &&
 			CountMapSquareAround(tile, CMSAWater) >= 5) {
 		found = M(STR_SV_STNAME_LAKESIDE);
@@ -349,7 +364,7 @@
 	}
 
 	/* Check woods */
-	if (HASBIT(free_names, M(STR_SV_STNAME_WOODS)) && (
+	if (HasBit(free_names, M(STR_SV_STNAME_WOODS)) && (
 				CountMapSquareAround(tile, CMSATree) >= 8 ||
 				CountMapSquareAround(tile, CMSAForest) >= 2)
 			) {
@@ -364,10 +379,10 @@
 		uint z2 = GetTileZ(t->xy);
 		if (z < z2) {
 			found = M(STR_SV_STNAME_VALLEY);
-			if (HASBIT(free_names, M(STR_SV_STNAME_VALLEY))) goto done;
+			if (HasBit(free_names, M(STR_SV_STNAME_VALLEY))) goto done;
 		} else if (z > z2) {
 			found = M(STR_SV_STNAME_HEIGHTS);
-			if (HASBIT(free_names, M(STR_SV_STNAME_HEIGHTS))) goto done;
+			if (HasBit(free_names, M(STR_SV_STNAME_HEIGHTS))) goto done;
 		}
 	}
 
@@ -414,8 +429,9 @@
 	return best_station;
 }
 
-// Update the virtual coords needed to draw the station sign.
-// st = Station to update for.
+/** Update the virtual coords needed to draw the station sign.
+ * @param st Station to update for.
+ */
 static void UpdateStationVirtCoord(Station *st)
 {
 	Point pt = RemapCoords2(TileX(st->xy) * TILE_SIZE, TileY(st->xy) * TILE_SIZE);
@@ -428,7 +444,7 @@
 	UpdateViewportSignPos(&st->sign, pt.x, pt.y, STR_305C_0);
 }
 
-// Update the virtual coords needed to draw the station sign for all stations.
+/** Update the virtual coords needed to draw the station sign for all stations. */
 void UpdateAllStationVirtCoord()
 {
 	Station* st;
@@ -453,19 +469,23 @@
 	st->MarkDirty();
 }
 
-// Get a mask of the cargo types that the station accepts.
+/** Get a mask of the cargo types that the station accepts.
+ * @param st Station to query
+ * @return the expected mask
+ */
 static uint GetAcceptanceMask(const Station *st)
 {
 	uint mask = 0;
 
 	for (CargoID i = 0; i < NUM_CARGO; i++) {
-		if (HASBIT(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE)) mask |= 1 << i;
+		if (HasBit(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE)) mask |= 1 << i;
 	}
 	return mask;
 }
 
-// Items contains the two cargo names that are to be accepted or rejected.
-// msg is the string id of the message to display.
+/** Items contains the two cargo names that are to be accepted or rejected.
+ * msg is the string id of the message to display.
+ */
 static void ShowRejectOrAcceptNews(const Station *st, uint num_items, CargoID *cargo, StringID msg)
 {
 	for (uint i = 0; i < num_items; i++) {
@@ -476,7 +496,14 @@
 	AddNewsItem(msg, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT | NF_TILE, NT_ACCEPTANCE, 0), st->xy, 0);
 }
 
-// Get a list of the cargo types being produced around the tile.
+/**
+* Get a list of the cargo types being produced around the tile (in a rectangle).
+* @param produced: Destination array of produced cargo
+* @param tile: Center of the search area
+* @param w: Width of the center
+* @param h: Height of the center
+* @param rad: Radius of the search area
+*/
 void GetProductionAroundTiles(AcceptedCargo produced, TileIndex tile,
 	int w, int h, int rad)
 {
@@ -485,8 +512,8 @@
 	int x = TileX(tile);
 	int y = TileY(tile);
 
-	// expand the region by rad tiles on each side
-	// while making sure that we remain inside the board.
+	/* expand the region by rad tiles on each side
+	 * while making sure that we remain inside the board. */
 	int x2 = min(x + w + rad, MapSizeX());
 	int x1 = max(x - rad, 0);
 
@@ -500,7 +527,7 @@
 
 	for (int yc = y1; yc != y2; yc++) {
 		for (int xc = x1; xc != x2; xc++) {
-			if (!(IS_INSIDE_1D(xc, x, w) && IS_INSIDE_1D(yc, y, h))) {
+			if (!(IsInsideBS(xc, x, w) && IsInsideBS(yc, y, h))) {
 				TileIndex tile = TileXY(xc, yc);
 
 				GetProducedCargoProc *gpc = _tile_type_procs[GetTileType(tile)]->get_produced_cargo_proc;
@@ -520,7 +547,14 @@
 	}
 }
 
-// Get a list of the cargo types that are accepted around the tile.
+/**
+* Get a list of the cargo types that are accepted around the tile.
+* @param accepts: Destination array of accepted cargo
+* @param tile: Center of the search area
+* @param w: Width of the center
+* @param h: Height of the center
+* @param rad: Radius of the rectangular search area
+*/
 void GetAcceptanceAroundTiles(AcceptedCargo accepts, TileIndex tile,
 	int w, int h, int rad)
 {
@@ -529,8 +563,8 @@
 	int x = TileX(tile);
 	int y = TileY(tile);
 
-	// expand the region by rad tiles on each side
-	// while making sure that we remain inside the board.
+	/* expand the region by rad tiles on each side
+	 * while making sure that we remain inside the board. */
 	int x2 = min(x + w + rad, MapSizeX());
 	int y2 = min(y + h + rad, MapSizeY());
 	int x1 = max(x - rad, 0);
@@ -573,11 +607,13 @@
 	if (rect->max_y < y) rect->max_y = y;
 }
 
-// Update the acceptance for a station.
-// show_msg controls whether to display a message that acceptance was changed.
+/** Update the acceptance for a station.
+ * @param st Station to update
+ * @param show_msg controls whether to display a message that acceptance was changed.
+ */
 static void UpdateStationAcceptance(Station *st, bool show_msg)
 {
-	// Don't update acceptance for a buoy
+	/* Don't update acceptance for a buoy */
 	if (st->IsBuoy()) return;
 
 	ottd_Rectangle rect;
@@ -589,7 +625,7 @@
 	/* old accepted goods types */
 	uint old_acc = GetAcceptanceMask(st);
 
-	// Put all the tiles that span an area in the table.
+	/* Put all the tiles that span an area in the table. */
 	if (st->train_tile != 0) {
 		MergePoint(&rect, st->train_tile);
 		MergePoint(&rect,
@@ -616,7 +652,7 @@
 		MergePoint(&rect, rs->xy);
 	}
 
-	// And retrieve the acceptance.
+	/* And retrieve the acceptance. */
 	AcceptedCargo accepts;
 	if (rect.max_x >= rect.min_x) {
 		GetAcceptanceAroundTiles(
@@ -630,11 +666,11 @@
 		memset(accepts, 0, sizeof(accepts));
 	}
 
-	// Adjust in case our station only accepts fewer kinds of goods
+	/* Adjust in case our station only accepts fewer kinds of goods */
 	for (CargoID i = 0; i < NUM_CARGO; i++) {
 		uint amt = min(accepts[i], 15);
 
-		// Make sure the station can accept the goods type.
+		/* Make sure the station can accept the goods type. */
 		bool is_passengers = IsCargoInClass(i, CC_PASSENGERS);
 		if ((!is_passengers && !(st->facilities & (byte)~FACIL_BUS_STOP)) ||
 				(is_passengers && !(st->facilities & (byte)~FACIL_TRUCK_STOP)))
@@ -643,12 +679,12 @@
 		SB(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, amt >= 8);
 	}
 
-	// Only show a message in case the acceptance was actually changed.
+	/* Only show a message in case the acceptance was actually changed. */
 	uint new_acc = GetAcceptanceMask(st);
 	if (old_acc == new_acc)
 		return;
 
-	// show a message to report that the acceptance was changed?
+	/* show a message to report that the acceptance was changed? */
 	if (show_msg && st->owner == _local_player && st->facilities) {
 		/* List of accept and reject strings for different number of
 		 * cargo types */
@@ -669,13 +705,13 @@
 
 		/* Test each cargo type to see if its acceptange has changed */
 		for (CargoID i = 0; i < NUM_CARGO; i++) {
-			if (HASBIT(new_acc, i)) {
-				if (!HASBIT(old_acc, i) && num_acc < lengthof(accepts)) {
+			if (HasBit(new_acc, i)) {
+				if (!HasBit(old_acc, i) && num_acc < lengthof(accepts)) {
 					/* New cargo is accepted */
 					accepts[num_acc++] = i;
 				}
 			} else {
-				if (HASBIT(old_acc, i) && num_rej < lengthof(rejects)) {
+				if (HasBit(old_acc, i) && num_rej < lengthof(rejects)) {
 					/* Old cargo is no longer accepted */
 					rejects[num_rej++] = i;
 				}
@@ -687,7 +723,7 @@
 		if (num_rej > 0) ShowRejectOrAcceptNews(st, num_rej, rejects, reject_msg[num_rej - 1]);
 	}
 
-	// redraw the station view since acceptance changed
+	/* redraw the station view since acceptance changed */
 	InvalidateWindowWidget(WC_STATION_VIEW, st->index, 4);
 }
 
@@ -695,17 +731,19 @@
 {
 	const StationRect *r = &st->rect;
 
-	if (r->IsEmpty()) return; // no tiles belong to this station
-
-	// clamp sign coord to be inside the station rect
-	st->xy = TileXY(clampu(TileX(st->xy), r->left, r->right), clampu(TileY(st->xy), r->top, r->bottom));
+	if (r->IsEmpty()) return; /* no tiles belong to this station */
+
+	/* clamp sign coord to be inside the station rect */
+	st->xy = TileXY(ClampU(TileX(st->xy), r->left, r->right), ClampU(TileY(st->xy), r->top, r->bottom));
 	UpdateStationVirtCoordDirty(st);
 }
 
-// This is called right after a station was deleted.
-// It checks if the whole station is free of substations, and if so, the station will be
-// deleted after a little while.
-static void DeleteStationIfEmpty(Station* st)
+/** This is called right after a station was deleted.
+ * It checks if the whole station is free of substations, and if so, the station will be
+ * deleted after a little while.
+ * @param st Station
+ */
+static void DeleteStationIfEmpty(Station *st)
 {
 	if (st->facilities == 0) {
 		st->delete_ctr = 0;
@@ -718,8 +756,16 @@
 
 static CommandCost ClearTile_Station(TileIndex tile, byte flags);
 
-// Tries to clear the given area. Returns the cost in case of success.
-// Or an error code if it failed.
+/** Tries to clear the given area.
+ * @param tile TileIndex to start check
+ * @param w width of search area
+ * @param h height of search area
+ * @param flags operation to perform
+ * @param invalid_dirs prohibited directions
+ * @param station StationID to be queried and returned if available
+ * @param check_clear if clearing tile should be performed (in wich case, cost will be added)
+ * @return the cost in case of success, or an error code if it failed.
+ */
 CommandCost CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint32 invalid_dirs, StationID* station, const FSMportsSpec *fsmportspec, bool check_clear = true)
 {
 	CommandCost cost;
@@ -758,7 +804,7 @@
 
 		int flat_z = z;
 		if (tileh != SLOPE_FLAT) {
-			// need to check so the entrance to the station is not pointing at a slope.
+			/* need to check so the entrance to the station is not pointing at a slope. */
 			if ((invalid_dirs & 1 && !(tileh & SLOPE_NE) && (uint)w_cur == w) ||
 					(invalid_dirs & 2 && !(tileh & SLOPE_SE) && h_cur == 1) ||
 					(invalid_dirs & 4 && !(tileh & SLOPE_SW) && w_cur == 1) ||
@@ -777,9 +823,9 @@
 			}
 		};
 
-		// get corresponding flat level and make sure that all parts of the station have the same level.
+		/* get corresponding flat level and make sure that all parts of the station have the same level. */
 		if (allowed_z == -1) {
-			// first tile
+			/* first tile */
 			allowed_z = flat_z;
 		} else if (do_tile_test && (allowed_z != flat_z)) {
 			/* test here whether build on height permitted. for FSM ports with layout masks, this is not an error
@@ -804,7 +850,7 @@
 					}
 				}
 			} else if (check_clear) {
-				bool water_tile = IsClearWaterTile(tile_cur);
+				bool water_tile = IsWaterTile(tile_cur);
 				CommandCost ret = DoCommand(tile_cur, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 				if (CmdFailed(ret)) return ret;
 				if (!water_tile) cost.AddCost(ret);
@@ -829,32 +875,32 @@
 	uint h = fin[2];
 
 	if (_patches.nonuniform_stations) {
-		// determine new size of train station region..
+		/* determine new size of train station region.. */
 		int x = min(TileX(st->train_tile), TileX(tile));
 		int y = min(TileY(st->train_tile), TileY(tile));
 		curw = max(TileX(st->train_tile) + curw, TileX(tile) + w) - x;
 		curh = max(TileY(st->train_tile) + curh, TileY(tile) + h) - y;
 		tile = TileXY(x, y);
 	} else {
-		// check so the orientation is the same
+		/* check so the orientation is the same */
 		if (GetRailStationAxis(st->train_tile) != axis) {
 			_error_message = STR_306D_NONUNIFORM_STATIONS_DISALLOWED;
 			return false;
 		}
 
-		// check if the new station adjoins the old station in either direction
+		/* check if the new station adjoins the old station in either direction */
 		if (curw == w && st->train_tile == tile + TileDiffXY(0, h)) {
-			// above
+			/* above */
 			curh += h;
 		} else if (curw == w && st->train_tile == tile - TileDiffXY(0, curh)) {
-			// below
+			/* below */
 			tile -= TileDiffXY(0, curh);
 			curh += h;
 		} else if (curh == h && st->train_tile == tile + TileDiffXY(w, 0)) {
-			// to the left
+			/* to the left */
 			curw += w;
 		} else if (curh == h && st->train_tile == tile - TileDiffXY(curw, 0)) {
-			// to the right
+			/* to the right */
 			tile -= TileDiffXY(curw, 0);
 			curw += w;
 		} else {
@@ -862,14 +908,14 @@
 			return false;
 		}
 	}
-	// make sure the final size is not too big.
+	/* make sure the final size is not too big. */
 	if (curw > _patches.station_spread || curh > _patches.station_spread) {
 		_error_message = STR_306C_STATION_TOO_SPREAD_OUT;
 		return false;
 	}
 
-	// now tile contains the new value for st->train_tile
-	// curw, curh contain the new value for width and height
+	/* now tile contains the new value for st->train_tile
+	 * curw, curh contain the new value for width and height */
 	fin[0] = tile;
 	fin[1] = curw;
 	fin[2] = curh;
@@ -957,16 +1003,17 @@
 
 	if (h_org > _patches.station_spread || w_org > _patches.station_spread) return CMD_ERROR;
 
-	// these values are those that will be stored in train_tile and station_platforms
+	/* these values are those that will be stored in train_tile and station_platforms */
 	uint finalvalues[3];
 	finalvalues[0] = tile_org;
 	finalvalues[1] = w_org;
 	finalvalues[2] = h_org;
 
-	// Make sure the area below consists of clear tiles. (OR tiles belonging to a certain rail station)
+	/* Make sure the area below consists of clear tiles. (OR tiles belonging to a certain rail station) */
 	StationID est = INVALID_STATION;
-	// If DC_EXEC is in flag, do not want to pass it to CheckFlatLandBelow, because of a nice bug
-	//  for detail info, see: https://sourceforge.net/tracker/index.php?func=detail&aid=1029064&group_id=103924&atid=636365
+	/* If DC_EXEC is in flag, do not want to pass it to CheckFlatLandBelow, because of a nice bug
+	 * for detail info, see:
+	 * https://sourceforge.net/tracker/index.php?func=detail&aid=1029064&group_id=103924&atid=636365 */
 	ret = CheckFlatLandBelow(tile_org, w_org, h_org, flags & ~DC_EXEC, 5 << axis, _patches.nonuniform_stations ? &est : NULL);
 	if (CmdFailed(ret)) return ret;
 	CommandCost cost(ret.GetCost() + (numtracks * _price.train_station_track + _price.train_station_length) * plat_len);
@@ -976,7 +1023,7 @@
 
 	if (_patches.adjacent_stations) {
 		if (est != INVALID_STATION) {
-			if (HASBIT(p1, 24)) {
+			if (HasBit(p1, 24)) {
 				/* You can't build an adjacent station over the top of one that
 				 * already exists. */
 				return_cmd_error(STR_MUST_REMOVE_RAILWAY_STATION_FIRST);
@@ -989,17 +1036,17 @@
 		} else {
 			/* There's no station here. Don't check the tiles surrounding this
 			 * one if the player wanted to build an adjacent station. */
-			if (HASBIT(p1, 24)) check_surrounding = false;
+			if (HasBit(p1, 24)) check_surrounding = false;
 		}
 	}
 
 	if (check_surrounding) {
-		// Make sure there are no similar stations around us.
+		/* Make sure there are no similar stations around us. */
 		st = GetStationAround(tile_org, w_org, h_org, est);
 		if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
 	}
 
-	// See if there is a deleted station close to us.
+	/* See if there is a deleted station close to us. */
 	if (st == NULL) st = GetClosestStationFromTile(tile_org);
 
 	/* In case of new station if DC_EXEC is NOT set we still need to create the station
@@ -1007,19 +1054,19 @@
 	AutoPtrT<Station> st_auto_delete;
 
 	if (st != NULL) {
-		// Reuse an existing station.
+		/* Reuse an existing station. */
 		if (st->owner != _current_player)
 			return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
 
 		if (st->train_tile != 0) {
-			// check if we want to expanding an already existing station?
+			/* check if we want to expanding an already existing station? */
 			if (_is_old_ai_player || !_patches.join_stations)
 				return_cmd_error(STR_3005_TOO_CLOSE_TO_ANOTHER_RAILROAD);
 			if (!CanExpandRailroadStation(st, finalvalues, axis))
 				return CMD_ERROR;
 		}
 
-		//XXX can't we pack this in the "else" part of the if above?
+		/* XXX can't we pack this in the "else" part of the if above? */
 		if (!st->rect.BeforeAddRect(tile_org, w_org, h_org, StationRect::ADD_TEST)) return CMD_ERROR;
 	} else {
 		/* allocate and initialize new station */
@@ -1030,10 +1077,10 @@
 		st_auto_delete = st;
 
 		st->town = ClosestTownFromTile(tile_org, (uint)-1);
-		if (!GenerateStationName(st, tile_org, 0)) return CMD_ERROR;
+		if (!GenerateStationName(st, tile_org, STATIONNAMING_RAIL)) return CMD_ERROR;
 
 		if (IsValidPlayer(_current_player) && (flags & DC_EXEC) != 0) {
-			SETBIT(st->town->have_ratings, _current_player);
+			SetBit(st->town->have_ratings, _current_player);
 		}
 	}
 
@@ -1049,12 +1096,12 @@
 		/* Perform NewStation checks */
 
 		/* Check if the station size is permitted */
-		if (HASBIT(statspec->disallowed_platforms, numtracks - 1) || HASBIT(statspec->disallowed_lengths, plat_len - 1)) {
+		if (HasBit(statspec->disallowed_platforms, numtracks - 1) || HasBit(statspec->disallowed_lengths, plat_len - 1)) {
 			return CMD_ERROR;
 		}
 
 		/* Check if the station is buildable */
-		if (HASBIT(statspec->callbackmask, CBM_STATION_AVAIL) && GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) {
+		if (HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) {
 			return CMD_ERROR;
 		}
 	}
@@ -1065,9 +1112,9 @@
 		byte numtracks_orig;
 		Track track;
 
-		// Now really clear the land below the station
-		// It should never return CMD_ERROR.. but you never know ;)
-		//  (a bit strange function name for it, but it really does clear the land, when DC_EXEC is in flags)
+		/* Now really clear the land below the station
+		 * It should never return CMD_ERROR.. but you never know ;)
+		 * (a bit strange function name for it, but it really does clear the land, when DC_EXEC is in flags) */
 		ret = CheckFlatLandBelow(tile_org, w_org, h_org, flags, 5 << axis, _patches.nonuniform_stations ? &est : NULL);
 		if (CmdFailed(ret)) return ret;
 
@@ -1099,7 +1146,9 @@
 				if (statspec != NULL) {
 					/* Use a fixed axis for GetPlatformInfo as our platforms / numtracks are always the right way around */
 					uint32 platinfo = GetPlatformInfo(AXIS_X, 0, plat_len, numtracks_orig, plat_len - w, numtracks_orig - numtracks, false);
-					uint16 callback = GetStationCallback(CBID_STATION_TILE_LAYOUT, platinfo, 0, statspec, st, tile);
+
+					/* As the station is not yet completely finished, the station does not yet exist. */
+					uint16 callback = GetStationCallback(CBID_STATION_TILE_LAYOUT, platinfo, 0, statspec, NULL, tile);
 					if (callback != CALLBACK_FAILED && callback < 8) SetStationGfx(tile, (callback & ~1) + axis);
 				}
 
@@ -1130,11 +1179,11 @@
 
 restart:
 
-	// too small?
+	/* too small? */
 	if (w != 0 && h != 0) {
-		// check the left side, x = constant, y changes
+		/* check the left side, x = constant, y changes */
 		for (uint i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(0, i));) {
-			// the left side is unused?
+			/* the left side is unused? */
 			if (++i == h) {
 				tile += TileDiffXY(1, 0);
 				w--;
@@ -1142,18 +1191,18 @@
 			}
 		}
 
-		// check the right side, x = constant, y changes
+		/* check the right side, x = constant, y changes */
 		for (uint i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(w - 1, i));) {
-			// the right side is unused?
+			/* the right side is unused? */
 			if (++i == h) {
 				w--;
 				goto restart;
 			}
 		}
 
-		// check the upper side, y = constant, x changes
+		/* check the upper side, y = constant, x changes */
 		for (uint i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(i, 0));) {
-			// the left side is unused?
+			/* the left side is unused? */
 			if (++i == w) {
 				tile += TileDiffXY(0, 1);
 				h--;
@@ -1161,9 +1210,9 @@
 			}
 		}
 
-		// check the lower side, y = constant, x changes
+		/* check the lower side, y = constant, x changes */
 		for (uint i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(i, h - 1));) {
-			// the left side is unused?
+			/* the left side is unused? */
 			if (++i == w) {
 				h--;
 				goto restart;
@@ -1217,7 +1266,7 @@
 
 		/* Check ownership of station */
 		Station *st = GetStationByTile(tile2);
-		if (_current_player != OWNER_WATER && (!CheckOwnership(st->owner) || !EnsureNoVehicle(tile2))) {
+		if (_current_player != OWNER_WATER && (!CheckOwnership(st->owner) || !EnsureNoVehicleOnGround(tile2))) {
 			continue;
 		}
 
@@ -1234,13 +1283,14 @@
 
 			DeallocateSpecFromStation(st, specindex);
 
-			// now we need to make the "spanned" area of the railway station smaller if we deleted something at the edges.
-			// we also need to adjust train_tile.
+			/* now we need to make the "spanned" area of the railway station smaller
+			 * if we deleted something at the edges.
+			 * we also need to adjust train_tile. */
 			MakeRailwayStationAreaSmaller(st);
 			st->MarkTilesDirty(false);
 			UpdateStationSignCoord(st);
 
-			// if we deleted the whole station, delete the train facility.
+			/* if we deleted the whole station, delete the train facility. */
 			if (st->train_tile == 0) {
 				st->facilities &= ~FACIL_TRAIN;
 				UpdateStationVirtCoordDirty(st);
@@ -1280,7 +1330,7 @@
 		do {
 			// for nonuniform stations, only remove tiles that are actually train station tiles
 			if (st->TileBelongsToRailStation(tile)) {
-				if (!EnsureNoVehicle(tile))
+				if (!EnsureNoVehicleOnGround(tile))
 					return CMD_ERROR;
 				cost.AddCost(_price.remove_rail_station);
 				if (flags & DC_EXEC) {
@@ -1334,7 +1384,7 @@
 		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 	}
 
-	return CommandCost(_price.build_rail / 2);
+	return CommandCost(RailBuildCost(totype) / 2);
 }
 
 /**
@@ -1368,16 +1418,16 @@
  */
 CommandCost CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	bool type = HASBIT(p2, 0);
-	bool is_drive_through = HASBIT(p2, 1);
+	bool type = HasBit(p2, 0);
+	bool is_drive_through = HasBit(p2, 1);
 	bool build_over_road  = is_drive_through && IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_NORMAL;
 	bool town_owned_road  = build_over_road && IsTileOwner(tile, OWNER_TOWN);
 	RoadTypes rts = (RoadTypes)GB(p2, 2, 3);
 
-	if (rts == ROADTYPES_NONE || HASBIT(rts, ROADTYPE_HWAY)) return CMD_ERROR;
+	if (!AreValidRoadTypes(rts) || !HasRoadTypesAvail(_current_player, rts)) return CMD_ERROR;
 
 	/* Trams only have drive through stops */
-	if (!is_drive_through && HASBIT(rts, ROADTYPE_TRAM)) return CMD_ERROR;
+	if (!is_drive_through && HasBit(rts, ROADTYPE_TRAM)) return CMD_ERROR;
 
 	/* Saveguard the parameters */
 	if (!IsValidDiagDirection((DiagDirection)p1)) return CMD_ERROR;
@@ -1401,8 +1451,8 @@
 		if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 		RoadTypes cur_rts = GetRoadTypes(tile);
-		if (GetRoadOwner(tile, ROADTYPE_ROAD) != OWNER_TOWN && HASBIT(cur_rts, ROADTYPE_ROAD) && !CheckOwnership(GetRoadOwner(tile, ROADTYPE_ROAD))) return CMD_ERROR;
-		if (HASBIT(cur_rts, ROADTYPE_TRAM) && !CheckOwnership(GetRoadOwner(tile, ROADTYPE_TRAM))) return CMD_ERROR;
+		if (GetRoadOwner(tile, ROADTYPE_ROAD) != OWNER_TOWN && HasBit(cur_rts, ROADTYPE_ROAD) && !CheckOwnership(GetRoadOwner(tile, ROADTYPE_ROAD))) return CMD_ERROR;
+		if (HasBit(cur_rts, ROADTYPE_TRAM) && !CheckOwnership(GetRoadOwner(tile, ROADTYPE_TRAM))) return CMD_ERROR;
 
 		/* Do not remove roadtypes! */
 		rts |= cur_rts;
@@ -1412,7 +1462,7 @@
 
 	Station *st = NULL;
 
-	if (!_patches.adjacent_stations || !HASBIT(p2, 5)) {
+	if (!_patches.adjacent_stations || !HasBit(p2, 5)) {
 		st = GetStationAround(tile, 1, 1, INVALID_STATION);
 		if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
 	}
@@ -1420,7 +1470,7 @@
 	/* Find a station close to us */
 	if (st == NULL) st = GetClosestStationFromTile(tile);
 
-	//give us a road stop in the list, and check if something went wrong
+	/* give us a road stop in the list, and check if something went wrong */
 	RoadStop *road_stop = new RoadStop(tile);
 	if (road_stop == NULL) {
 		return_cmd_error(type ? STR_3008B_TOO_MANY_TRUCK_STOPS : STR_3008A_TOO_MANY_BUS_STOPS);
@@ -1435,7 +1485,7 @@
 	}
 
 	/* In case of new station if DC_EXEC is NOT set we still need to create the station
-	* to test if everything is OK. In this case we need to delete it before return. */
+	 * to test if everything is OK. In this case we need to delete it before return. */
 	AutoPtrT<Station> st_auto_delete;
 
 	if (st != NULL) {
@@ -1454,10 +1504,10 @@
 
 
 		Town *t = st->town = ClosestTownFromTile(tile, (uint)-1);
-		if (!GenerateStationName(st, tile, 0)) return CMD_ERROR;
+		if (!GenerateStationName(st, tile, STATIONNAMING_ROAD)) return CMD_ERROR;
 
 		if (IsValidPlayer(_current_player) && (flags & DC_EXEC) != 0) {
-			SETBIT(t->have_ratings, _current_player);
+			SetBit(t->have_ratings, _current_player);
 		}
 
 		st->sign.width_1 = 0;
@@ -1466,11 +1516,11 @@
 	cost.AddCost((type) ? _price.build_truck_station : _price.build_bus_station);
 
 	if (flags & DC_EXEC) {
-		// Insert into linked list of RoadStops
+		/* Insert into linked list of RoadStops */
 		RoadStop **currstop = FindRoadStopSpot(type, st);
 		*currstop = road_stop;
 
-		//initialize an empty station
+		/*initialize an empty station */
 		st->AddFacility((type) ? FACIL_TRUCK_STOP : FACIL_BUS_STOP, tile);
 
 		st->rect.BeforeAddTile(tile, StationRect::ADD_TRY);
@@ -1493,7 +1543,12 @@
 	return cost;
 }
 
-// Remove a bus station
+/** Remove a bus station
+ * @param st Station to remove
+ * @param flags operation to perform
+ * @param tile TileIndex been queried
+ * @return cost or failure of operation
+ */
 static CommandCost RemoveRoadStop(Station *st, uint32 flags, TileIndex tile)
 {
 	if (_current_player != OWNER_WATER && !CheckOwnership(st->owner)) {
@@ -1514,18 +1569,18 @@
 
 	assert(cur_stop != NULL);
 
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
 		if (*primary_stop == cur_stop) {
-			// removed the first stop in the list
+			/* removed the first stop in the list */
 			*primary_stop = cur_stop->next;
-			// removed the only stop?
+			/* removed the only stop? */
 			if (*primary_stop == NULL) {
 				st->facilities &= (is_truck ? ~FACIL_TRUCK_STOP : ~FACIL_BUS_STOP);
 			}
 		} else {
-			// tell the predecessor in the list to skip this stop
+			/* tell the predecessor in the list to skip this stop */
 			RoadStop *pred = *primary_stop;
 			while (pred->next != cur_stop) pred = pred->next;
 			pred->next = cur_stop->next;
@@ -1596,7 +1651,7 @@
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
 	/* Check if a valid, buildable airport was chosen for construction */
-	//if (p1 > lengthof(_airport_sections) || !HASBIT(GetValidAirports(), p1)) return CMD_ERROR;
+	//if (p1 > lengthof(_airport_sections) || !HasBit(GetValidAirports(), p1)) return CMD_ERROR;
 
 	if (!(flags & DC_NO_TOWN_RATING) && !CheckIfAuthorityAllows(tile))
 		return CMD_ERROR;
@@ -1631,11 +1686,11 @@
 	byte h = fsmportsspec->size_y[layout_set];
 
 	/* Check if the station is buildable */
-	if (HASBIT(fsmportsspec->callbackmask, CBM_STATION_AVAIL) && GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportsspec, NULL, INVALID_TILE) == 0) {
+	if (HasBit(fsmportsspec->callbackmask, CBM_STATION_AVAIL) && GetFSMportsCallback(CBID_STATION_AVAILABILITY, 0, 0, fsmportsspec, NULL, INVALID_TILE) == 0) {
 		return CMD_ERROR;
 	}
 
-	if (!_patches.adjacent_stations || !HASBIT(p1, 24)) {
+	if (!_patches.adjacent_stations || !HasBit(p1, 24)) {
 		st = GetStationAround(tile, w, h, INVALID_STATION);
 		if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
 	}
@@ -1673,14 +1728,14 @@
 		st->town = t;
 
 		if (IsValidPlayer(_current_player) && (flags & DC_EXEC) != 0) {
-			SETBIT(t->have_ratings, _current_player);
+			SetBit(t->have_ratings, _current_player);
 		}
 
 		st->sign.width_1 = 0;
 
 		/* If only helicopters may use the airport generate a helicopter related (5)
 		 * station name, otherwise generate a normal airport name (1) */
-		if (!GenerateStationName(st, tile, !(fsmportsspec->flags & AirportFTAClass::AIRPLANES) ? 5 : 1)) {
+		if (!GenerateStationName(st, tile, !(fsmportsspec->flags & AirportFTAClass::AIRPLANES) ? STATIONNAMING_HELIPORT : STATIONNAMING_AIRPORT)) {
 			return CMD_ERROR;
 		}
 	}
@@ -1699,14 +1754,14 @@
 			byte mask = *mask_ptr++;
 			if (mask & 0x80) {
 				/* do water tests */
-				if (IsClearWaterTile(tile_cur)) {
+				if (IsWaterTile(tile_cur)) {
 					flags &= ~DC_NO_WATER;
 					st->FSMport_flood_protected = true;
 				} else {
 					_error_message = STR_304B_SITE_UNSUITABLE;
 					return CMD_ERROR;
 				}
-			} else if (IsClearWaterTile(tile_cur)) {
+			} else if (IsWaterTile(tile_cur)) {
 				/* tile should be land, but is water */
 				_error_message = STR_3807_CAN_T_BUILD_ON_WATER;
 				return CMD_ERROR;
@@ -1846,7 +1901,7 @@
 {
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
-	if (!IsClearWaterTile(tile) || tile == 0) return_cmd_error(STR_304B_SITE_UNSUITABLE);
+	if (!IsWaterTile(tile) || tile == 0) return_cmd_error(STR_304B_SITE_UNSUITABLE);
 	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
 
 	/* allocate and initialize new station */
@@ -1859,7 +1914,7 @@
 	st->town = ClosestTownFromTile(tile, (uint)-1);
 	st->sign.width_1 = 0;
 
-	if (!GenerateStationName(st, tile, 4)) return CMD_ERROR;
+	if (!GenerateStationName(st, tile, STATIONNAMING_BUOY)) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
 		st->dock_tile = tile;
@@ -1909,7 +1964,7 @@
 	TileIndex tile = st->dock_tile;
 
 	if (CheckShipsOnBuoy(st))   return_cmd_error(STR_BUOY_IS_IN_USE);
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
 		st->dock_tile = 0;
@@ -1921,12 +1976,7 @@
 		/* We have to set the water tile's state to the same state as before the
 		 * buoy was placed. Otherwise one could plant a buoy on a canal edge,
 		 * remove it and flood the land (if the canal edge is at level 0) */
-		Owner o = GetTileOwner(tile);
-		if (o == OWNER_WATER) {
-			MakeWater(tile);
-		} else {
-			MakeCanal(tile, o);
-		}
+		MakeWaterOrCanalDependingOnSurroundings(tile, GetTileOwner(tile));
 		MarkTileDirtyByTile(tile);
 
 		UpdateStationVirtCoordDirty(st);
@@ -1992,7 +2042,7 @@
 	/* middle */
 	Station *st = NULL;
 
-	if (!_patches.adjacent_stations || !HASBIT(p1, 0)) {
+	if (!_patches.adjacent_stations || !HasBit(p1, 0)) {
 		st = GetStationAround(
 				tile + ToTileIndexDiff(_dock_tileoffs_chkaround[direction]),
 				_dock_w_chk[direction], _dock_h_chk[direction], INVALID_STATION);
@@ -2003,7 +2053,7 @@
 	if (st == NULL) st = GetClosestStationFromTile(tile);
 
 	/* In case of new station if DC_EXEC is NOT set we still need to create the station
-	* to test if everything is OK. In this case we need to delete it before return. */
+	 * to test if everything is OK. In this case we need to delete it before return. */
 	AutoPtrT<Station> st_auto_delete;
 
 	if (st != NULL) {
@@ -2024,12 +2074,12 @@
 		Town *t = st->town = ClosestTownFromTile(tile, (uint)-1);
 
 		if (IsValidPlayer(_current_player) && (flags & DC_EXEC) != 0) {
-			SETBIT(t->have_ratings, _current_player);
+			SetBit(t->have_ratings, _current_player);
 		}
 
 		st->sign.width_1 = 0;
 
-		if (!GenerateStationName(st, tile, 3)) return CMD_ERROR;
+		if (!GenerateStationName(st, tile, STATIONNAMING_DOCK)) return CMD_ERROR;
 	}
 
 	if (flags & DC_EXEC) {
@@ -2057,12 +2107,12 @@
 	TileIndex tile1 = st->dock_tile;
 	TileIndex tile2 = tile1 + TileOffsByDiagDir(GetDockDirection(tile1));
 
-	if (!EnsureNoVehicle(tile1)) return CMD_ERROR;
-	if (!EnsureNoVehicle(tile2)) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile1)) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile2)) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
 		DoClearSquare(tile1);
-		MakeWater(tile2);
+		MakeWaterOrCanalDependingOnSurroundings(tile2, st->owner);
 
 		st->rect.AfterRemoveTile(st, tile1);
 		st->rect.AfterRemoveTile(st, tile2);
@@ -2086,9 +2136,6 @@
 	return &_station_display_datas[st][gfx];
 }
 
-/* For drawing canal edges on buoys */
-extern void DrawCanalWater(TileIndex tile);
-
 static void DrawTile_Station(TileInfo *ti)
 {
 	const DrawTileSprites *t = NULL;
@@ -2113,16 +2160,16 @@
 	if (IsValidPlayer(owner)) {
 		palette = PLAYER_SPRITE_COLOR(owner);
 	} else {
-		// Some stations are not owner by a player, namely oil rigs
+		/* Some stations are not owner by a player, namely oil rigs */
 		palette = PALETTE_TO_GREY;
 	}
 
-	// don't show foundation for docks
+	/* don't show foundation for docks */
 	if (ti->tileh != SLOPE_FLAT && !IsDock(ti->tile))
 		DrawFoundation(ti, FOUNDATION_LEVELED);
 
 	if (IsCustomStationSpecIndex(ti->tile)) {
-		// look for customization
+		/* look for customization */
 		st = GetStationByTile(ti->tile);
 		int specindex = GetCustomStationSpecIndex(ti->tile);
 		FSMport = IsCustomFSMportsSpecIndex(ti->tile);
@@ -2139,7 +2186,7 @@
 
 			relocation = GetCustomStationRelocation(statspec, st, ti->tile);
 
-			if (HASBIT(statspec->callbackmask, CBM_STATION_SPRITE_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);
 			}
@@ -2169,7 +2216,7 @@
 	if (t == NULL || t->seq == NULL) t = &_station_display_datas[GetStationType(ti->tile)][GetStationGfx(ti->tile)];
 
 	SpriteID image = t->ground_sprite;
-	if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
+	if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 		image += (FSMport)? GetCustomFSMportsGroundRelocation(fsmportspec, st, ti->tile) : GetCustomStationGroundRelocation(statspec, st, ti->tile);
 		image += rti->custom_ground_offset;
 	} else {
@@ -2180,31 +2227,31 @@
 	if ((image == 0x0F8D) && (GetTropicZone(ti->tile) == TROPICZONE_DESERT))
 		image = 0x11C6;  // snow tile (arctic) or desert tile (tropical)
 
-	// station_land array has been increased from 82 elements to 114
-	// but this is something else. If AI builds station with 114 it looks all weird
-	DrawGroundSprite(image, HASBIT(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE);
+	/* station_land array has been increased from 82 elements to 114
+	 * but this is something else. If AI builds station with 114 it looks all weird */
+	DrawGroundSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE);
 
 	if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC && IsStationTileElectrifiable(ti->tile)) DrawCatenary(ti);
 
-	if (HASBIT(roadtypes, ROADTYPE_TRAM)) {
+	if (HasBit(roadtypes, ROADTYPE_TRAM)) {
 		Axis axis = GetRoadStopDir(ti->tile) == DIAGDIR_NE ? AXIS_X : AXIS_Y;
-		DrawGroundSprite((HASBIT(roadtypes, ROADTYPE_ROAD) ? SPR_TRAMWAY_OVERLAY : SPR_TRAMWAY_TRAM) + (axis ^ 1), PAL_NONE);
+		DrawGroundSprite((HasBit(roadtypes, ROADTYPE_ROAD) ? SPR_TRAMWAY_OVERLAY : SPR_TRAMWAY_TRAM) + (axis ^ 1), PAL_NONE);
 		DrawTramCatenary(ti, axis == AXIS_X ? ROAD_X : ROAD_Y);
 	}
 
-	if (IsBuoyTile(ti->tile) && (ti->z != 0 || !IsTileOwner(ti->tile, OWNER_WATER))) DrawCanalWater(ti->tile);
+	if (IsCanalBuoyTile(ti->tile)) DrawCanalWater(ti->tile);
 
 	const DrawTileSeqStruct *dtss;
 	foreach_draw_tile_seq(dtss, t->seq) {
 		image = dtss->image;
-		if (relocation == 0 || HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
+		if (relocation == 0 || HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 			image += rti->total_offset;
 		} else {
 			image += relocation;
 		}
 
 		SpriteID pal;
-		if (!HASBIT(_transparent_opt, TO_BUILDINGS) && HASBIT(image, PALETTE_MODIFIER_COLOR)) {
+		if (!IsTransparencySet(TO_BUILDINGS) && HasBit(image, PALETTE_MODIFIER_COLOR)) {
 			pal = palette;
 		} else {
 			pal = dtss->pal;
@@ -2216,10 +2263,10 @@
 				ti->x + dtss->delta_x, ti->y + dtss->delta_y,
 				dtss->size_x, dtss->size_y,
 				dtss->size_z, ti->z + dtss->delta_z,
-				HASBIT(_transparent_opt, TO_BUILDINGS)
+				IsTransparencySet(TO_BUILDINGS)
 			);
 		} else {
-			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, HASBIT(_transparent_opt, TO_BUILDINGS));
+			AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, IsTransparencySet(TO_BUILDINGS));
 		}
 	}
 }
@@ -2231,7 +2278,7 @@
 	const DrawTileSprites *t = &_station_display_datas[st][image];
 
 	SpriteID img = t->ground_sprite;
-	DrawSprite(img + rti->total_offset, HASBIT(img, PALETTE_MODIFIER_COLOR) ? pal : PAL_NONE, x, y);
+	DrawSprite(img + rti->total_offset, HasBit(img, PALETTE_MODIFIER_COLOR) ? pal : PAL_NONE, x, y);
 
 	if (roadtype == ROADTYPE_TRAM) {
 		DrawSprite(SPR_TRAMWAY_TRAM + (t->ground_sprite == SPR_ROAD_PAVED_STRAIGHT_X ? 1 : 0), PAL_NONE, x, y);
@@ -2291,12 +2338,12 @@
 			break;
 
 		case TRANSPORT_WATER:
-			// buoy is coded as a station, it is always on open water
+			/* buoy is coded as a station, it is always on open water */
 			if (IsBuoy(tile)) {
 				TrackBits ts = TRACK_BIT_ALL;
-				// remove tracks that connect NE map edge
+				/* remove tracks that connect NE map edge */
 				if (TileX(tile) == 0) ts &= ~(TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT);
-				// remove tracks that connect NW map edge
+				/* remove tracks that connect NW map edge */
 				if (TileY(tile) == 0) ts &= ~(TRACK_BIT_Y | TRACK_BIT_LEFT | TRACK_BIT_UPPER);
 				return uint32(ts) * 0x101;
 			}
@@ -2318,8 +2365,8 @@
 
 static void TileLoop_Station(TileIndex tile)
 {
-	// FIXME -- GetTileTrackStatus_Station -> animated stationtiles
-	// hardcoded.....not good
+	/* FIXME -- GetTileTrackStatus_Station -> animated stationtiles
+	 * hardcoded.....not good */
 	switch (GetStationType(tile)) {
 		case STATION_AIRPORT:
 			//TODO: animated tiles from newgrf
@@ -2437,14 +2484,14 @@
 					/* Check if the vehicle is stopping at this road stop */
 					if (GetRoadStopType(tile) == (IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK) &&
 							v->current_order.dest == GetStationIndex(tile)) {
-						SETBIT(v->u.road.state, RVS_IS_STOPPING);
+						SetBit(v->u.road.state, RVS_IS_STOPPING);
 						rs->AllocateDriveThroughBay(side);
 					}
 
 					/* Indicate if vehicle is using second bay. */
-					if (side == 1) SETBIT(v->u.road.state, RVS_USING_SECOND_BAY);
+					if (side == 1) SetBit(v->u.road.state, RVS_USING_SECOND_BAY);
 					/* Indicate a drive-through stop */
-					SETBIT(v->u.road.state, RVS_IN_DT_ROAD_STOP);
+					SetBit(v->u.road.state, RVS_IN_DT_ROAD_STOP);
 					return VETSB_CONTINUE;
 				}
 
@@ -2452,7 +2499,7 @@
 				/* Check if station is busy or if there are no free bays or whether it is a articulated vehicle. */
 				if (rs->IsEntranceBusy() || !rs->HasFreeBay() || RoadVehHasArticPart(v)) return VETSB_CANNOT_ENTER;
 
-				SETBIT(v->u.road.state, RVS_IN_ROAD_STOP);
+				SetBit(v->u.road.state, RVS_IN_ROAD_STOP);
 
 				/* Allocate a bay and update the road state */
 				uint bay_nr = rs->AllocateBay();
@@ -2490,12 +2537,12 @@
 		/* Slowly increase the rating back to his original level in the case we
 		 *  didn't deliver cargo yet to this station. This happens when a bribe
 		 *  failed while you didn't moved that cargo yet to a station. */
-		if (!HASBIT(ge->acceptance_pickup, GoodsEntry::PICKUP) && ge->rating < INITIAL_STATION_RATING) {
+		if (!HasBit(ge->acceptance_pickup, GoodsEntry::PICKUP) && ge->rating < INITIAL_STATION_RATING) {
 			ge->rating++;
 		}
 
 		/* Only change the rating if we are moving this cargo */
-		if (HASBIT(ge->acceptance_pickup, GoodsEntry::PICKUP)) {
+		if (HasBit(ge->acceptance_pickup, GoodsEntry::PICKUP)) {
 			byte_inc_sat(&ge->days_since_pickup);
 
 			int rating = 0;
@@ -2514,12 +2561,11 @@
 				(rating += 13, true);
 			}
 
-			if (IsValidPlayer(st->owner) && HASBIT(st->town->statues, st->owner)) rating += 26;
+			if (IsValidPlayer(st->owner) && HasBit(st->town->statues, st->owner)) rating += 26;
 
 			{
 				byte days = ge->days_since_pickup;
-				if (st->last_vehicle_type == VEH_SHIP)
-							days >>= 2;
+				if (st->last_vehicle_type == VEH_SHIP) days >>= 2;
 				(days > 21) ||
 				(rating += 25, days > 12) ||
 				(rating += 25, days > 6) ||
@@ -2538,10 +2584,11 @@
 			{
 				int or_ = ge->rating; // old rating
 
-				// only modify rating in steps of -2, -1, 0, 1 or 2
-				ge->rating = rating = or_ + clamp(clamp(rating, 0, 255) - or_, -2, 2);
-
-				// if rating is <= 64 and more than 200 items waiting, remove some random amount of goods from the station
+				/* only modify rating in steps of -2, -1, 0, 1 or 2 */
+				ge->rating = rating = or_ + Clamp(Clamp(rating, 0, 255) - or_, -2, 2);
+
+				/* if rating is <= 64 and more than 200 items waiting,
+				 * remove some random amount of goods from the station */
 				if (rating <= 64 && waiting >= 200) {
 					int dec = Random() & 0x1F;
 					if (waiting < 400) dec &= 7;
@@ -2549,7 +2596,7 @@
 					waiting_changed = true;
 				}
 
-				// if rating is <= 127 and there are any items waiting, maybe remove some goods.
+				/* if rating is <= 127 and there are any items waiting, maybe remove some goods. */
 				if (rating <= 127 && waiting != 0) {
 					uint32 r = Random();
 					if (rating <= (int)GB(r, 0, 7)) {
@@ -2628,7 +2675,7 @@
 				GoodsEntry* ge = &st->goods[i];
 
 				if (ge->acceptance_pickup != 0) {
-					ge->rating = clamp(ge->rating + amount, 0, 255);
+					ge->rating = Clamp(ge->rating + amount, 0, 255);
 				}
 			}
 		}
@@ -2638,7 +2685,7 @@
 static void UpdateStationWaiting(Station *st, CargoID type, uint amount)
 {
 	st->goods[type].cargo.Append(new CargoPacket(st->index, amount));
-	SETBIT(st->goods[type].acceptance_pickup, GoodsEntry::PICKUP);
+	SetBit(st->goods[type].acceptance_pickup, GoodsEntry::PICKUP);
 
 	InvalidateWindow(WC_STATION_VIEW, st->index);
 	st->MarkTilesDirty(true);
@@ -2691,14 +2738,20 @@
 	return CommandCost();
 }
 
-
-uint MoveGoodsToStation(TileIndex tile, int w, int h, CargoID type, uint amount)
+/**
+* Find all (non-buoy) stations around an industry tile
+*
+* @param tile: Center tile to search from
+* @param w: Width of the center
+* @param h: Height of the center
+*
+* @return: Set of found stations
+*/
+StationSet FindStationsAroundIndustryTile(TileIndex tile, int w, int h)
 {
-	Station* around[8];
-
-	for (uint i = 0; i < lengthof(around); i++) around[i] = NULL;
-
-	int w_prod; //width and height of the "producer" of the cargo
+	StationSet station_set;
+
+	int w_prod; // width and height of the "producer" of the cargo
 	int h_prod;
 	int max_rad;
 	if (_patches.modified_catchment) {
@@ -2721,91 +2774,103 @@
 
 		Station *st = GetStationByTile(cur_tile);
 
-		for (uint i = 0; i != lengthof(around); i++) {
-			if (around[i] == NULL) {
-				if (!st->IsBuoy() &&
-						(st->town->exclusive_counter == 0 || st->town->exclusivity == st->owner) && // check exclusive transport rights
-						st->goods[type].rating != 0 && // when you've got the lowest rating you can get, it's better not to give cargo anymore
-						(!_patches.selectgoods || st->goods[type].last_speed != 0) && // we are servicing the station (or cargo is dumped on all stations)
-						((st->facilities & ~FACIL_BUS_STOP)   != 0 || IsCargoInClass(type, CC_PASSENGERS)) && // if we have other fac. than a bus stop, or the cargo is passengers
-						((st->facilities & ~FACIL_TRUCK_STOP) != 0 || !IsCargoInClass(type, CC_PASSENGERS))) { // if we have other fac. than a cargo bay or the cargo is not passengers
-					if (_patches.modified_catchment) {
-						// min and max coordinates of the producer relative
-						const int x_min_prod = max_rad + 1;
-						const int x_max_prod = max_rad + w_prod;
-						const int y_min_prod = max_rad + 1;
-						const int y_max_prod = max_rad + h_prod;
-
-						int rad = FindCatchmentRadius(st);
-
-						int x_dist = min(w_cur - x_min_prod, x_max_prod - w_cur);
-						if (w_cur < x_min_prod) {
-							x_dist = x_min_prod - w_cur;
-						} else if (w_cur > x_max_prod) {
-							x_dist = w_cur - x_max_prod;
-						}
-
-						int y_dist = min(h_cur - y_min_prod, y_max_prod - h_cur);
-						if (h_cur < y_min_prod) {
-							y_dist = y_min_prod - h_cur;
-						} else if (h_cur > y_max_prod) {
-							y_dist = h_cur - y_max_prod;
-						}
-
-						if (x_dist > rad || y_dist > rad) break;
-					}
-
-					around[i] = st;
-				}
-				break;
-			} else if (around[i] == st) {
-				break;
+		if (st->IsBuoy()) continue; // bouys don't accept cargo
+
+
+		if (_patches.modified_catchment) {
+			/* min and max coordinates of the producer relative */
+			const int x_min_prod = max_rad + 1;
+			const int x_max_prod = max_rad + w_prod;
+			const int y_min_prod = max_rad + 1;
+			const int y_max_prod = max_rad + h_prod;
+
+			int rad = FindCatchmentRadius(st);
+
+			int x_dist = min(w_cur - x_min_prod, x_max_prod - w_cur);
+			if (w_cur < x_min_prod) {
+				x_dist = x_min_prod - w_cur;
+			} else if (w_cur > x_max_prod) {
+				x_dist = w_cur - x_max_prod;
 			}
+
+			if (x_dist > rad) continue;
+
+			int y_dist = min(h_cur - y_min_prod, y_max_prod - h_cur);
+			if (h_cur < y_min_prod) {
+				y_dist = y_min_prod - h_cur;
+			} else if (h_cur > y_max_prod) {
+				y_dist = h_cur - y_max_prod;
+			}
+
+			if (y_dist > rad) continue;
 		}
+
+		/* Insert the station in the set. This will fail if it has
+		 * already been added.
+		 */
+		station_set.insert(st);
+
 	END_TILE_LOOP(cur_tile, w, h, tile - TileDiffXY(max_rad, max_rad))
 
+	return station_set;
+}
+
+uint MoveGoodsToStation(TileIndex tile, int w, int h, CargoID type, uint amount)
+{
+	Station *st1 = NULL;	// Station with best rating
+	Station *st2 = NULL;	// Second best station
+	uint best_rating1 = 0;	// rating of st1
+	uint best_rating2 = 0;	// rating of st2
+
+	StationSet all_stations = FindStationsAroundIndustryTile(tile, w, h);
+	for (StationSet::iterator st_iter = all_stations.begin(); st_iter != all_stations.end(); ++st_iter) {
+		Station *st = *st_iter;
+
+		/* Is the station reserved exclusively for somebody else? */
+		if (st->town->exclusive_counter > 0 && st->town->exclusivity != st->owner) continue;
+
+		if (st->goods[type].rating == 0) continue; // Lowest possible rating, better not to give cargo anymore
+
+		if (_patches.selectgoods && st->goods[type].last_speed == 0) continue; // Selectively servicing stations, and not this one
+
+		if (IsCargoInClass(type, CC_PASSENGERS)) {
+			if (st->facilities == FACIL_TRUCK_STOP) continue; // passengers are never served by just a truck stop
+		} else {
+			if (st->facilities == FACIL_BUS_STOP) continue; // non-passengers are never served by just a bus stop
+		}
+
+		/* This station can be used, add it to st1/st2 */
+		if (st1 == NULL || st->goods[type].rating >= best_rating1) {
+			st2 = st1; best_rating2 = best_rating1; st1 = st; best_rating1 = st->goods[type].rating;
+		} else if (st2 == NULL || st->goods[type].rating >= best_rating2) {
+			st2 = st; best_rating2 = st->goods[type].rating;
+		}
+	}
+
 	/* no stations around at all? */
-	if (around[0] == NULL) return 0;
-
-	if (around[1] == NULL) {
+	if (st1 == NULL) return 0;
+
+	if (st2 == NULL) {
 		/* only one station around */
-		uint moved = (amount * around[0]->goods[type].rating >> 8) + 1;
-		UpdateStationWaiting(around[0], type, moved);
+		uint moved = amount * best_rating1 / 256 + 1;
+		UpdateStationWaiting(st1, type, moved);
 		return moved;
 	}
 
-	/* several stations around, find the two with the highest rating */
-	Station *st1 = NULL;
-	Station *st2 = NULL;
-	uint best_rating  = 0;
-	uint best_rating2 = 0;
-
-	for (uint i = 0; i != lengthof(around) && around[i] != NULL; i++) {
-		if (around[i]->goods[type].rating >= best_rating) {
-			best_rating2 = best_rating;
-			st2 = st1;
-
-			best_rating = around[i]->goods[type].rating;
-			st1 = around[i];
-		} else if (around[i]->goods[type].rating >= best_rating2) {
-			best_rating2 = around[i]->goods[type].rating;
-			st2 = around[i];
-		}
-	}
-
+	/* several stations around, the best two (highest rating) are in st1 and st2 */
 	assert(st1 != NULL);
 	assert(st2 != NULL);
-	assert(best_rating != 0 || best_rating2 != 0);
+	assert(best_rating1 != 0 || best_rating2 != 0);
 
 	/* the 2nd highest one gets a penalty */
 	best_rating2 >>= 1;
 
 	/* amount given to station 1 */
-	uint t = (best_rating * (amount + 1)) / (best_rating + best_rating2);
+	uint t = (best_rating1 * (amount + 1)) / (best_rating1 + best_rating2);
 
 	uint moved = 0;
 	if (t != 0) {
-		moved = t * best_rating / 256 + 1;
+		moved = t * best_rating1 / 256 + 1;
 		amount -= t;
 		UpdateStationWaiting(st1, type, moved);
 	}
@@ -2827,14 +2892,16 @@
 		DEBUG(misc, 0, "Can't allocate station for oilrig at 0x%X, reverting to oilrig only", tile);
 		return;
 	}
-	if (!GenerateStationName(st, tile, 2)) {
-		DEBUG(misc, 0, "Can't allocate station-name for oilrig at 0x%X, reverting to oilrig only", tile);
-		return;
-	}
 
 	st->town = ClosestTownFromTile(tile, (uint)-1);
 	st->sign.width_1 = 0;
 
+	if (!GenerateStationName(st, tile, STATIONNAMING_OILRIG)) {
+		DEBUG(misc, 0, "Can't allocate station-name for oilrig at 0x%X, reverting to oilrig only", tile);
+		delete st;
+		return;
+	}
+
 	MakeOilrig(tile, st->index);
 
 	st->owner = OWNER_NONE;
@@ -2928,8 +2995,8 @@
 		switch (GetStationType(tile)) {
 			case STATION_RAIL:    return_cmd_error(STR_300B_MUST_DEMOLISH_RAILROAD);
 			case STATION_AIRPORT: return_cmd_error(STR_300E_MUST_DEMOLISH_AIRPORT_FIRST);
-			case STATION_TRUCK:   return_cmd_error(HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM) ? STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION : STR_3047_MUST_DEMOLISH_TRUCK_STATION);
-			case STATION_BUS:     return_cmd_error(HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM) ? STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION : STR_3046_MUST_DEMOLISH_BUS_STATION);
+			case STATION_TRUCK:   return_cmd_error(HasBit(GetRoadTypes(tile), ROADTYPE_TRAM) ? STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION : STR_3047_MUST_DEMOLISH_TRUCK_STATION);
+			case STATION_BUS:     return_cmd_error(HasBit(GetRoadTypes(tile), ROADTYPE_TRAM) ? STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION : STR_3046_MUST_DEMOLISH_BUS_STATION);
 			case STATION_BUOY:    return_cmd_error(STR_306A_BUOY_IN_THE_WAY);
 			case STATION_DOCK:    return_cmd_error(STR_304D_MUST_DEMOLISH_DOCK_FIRST);
 			case STATION_OILRIG:
@@ -3082,7 +3149,7 @@
 	    SLE_VAR(Station, trainst_w,                  SLE_UINT8),
 	SLE_CONDVAR(Station, trainst_h,                  SLE_UINT8,                   2, SL_MAX_VERSION),
 
-	// alpha_order was stored here in savegame format 0 - 3
+	/* alpha_order was stored here in savegame format 0 - 3 */
 	SLE_CONDNULL(1, 0, 3),
 
 	    SLE_VAR(Station, string_id,                  SLE_STRINGID),
@@ -3106,7 +3173,7 @@
 	SLE_CONDNULL(2, 0, 25), /* Ex last-vehicle */
 	SLE_CONDVAR(Station, last_vehicle_type,          SLE_UINT8,                  26, SL_MAX_VERSION),
 
-	// Was custom station class and id
+	/* Was custom station class and id */
 	SLE_CONDNULL(2, 3, 25),
 	SLE_CONDVAR(Station, build_date,                 SLE_FILE_U16 | SLE_VAR_I32,  3, 30),
 	SLE_CONDVAR(Station, build_date,                 SLE_INT32,                  31, SL_MAX_VERSION),
@@ -3125,7 +3192,7 @@
 
 	SLE_CONDLST(Station, loading_vehicles,           REF_VEHICLE,                57, SL_MAX_VERSION),
 
-	// reserve extra space in savegame here. (currently 32 bytes)
+	/* reserve extra space in savegame here. (currently 32 bytes) */
 	SLE_CONDNULL(32, 2, SL_MAX_VERSION),
 
 	SLE_END()
@@ -3183,7 +3250,7 @@
 		GoodsEntry *ge = &st->goods[i];
 		SlObject(ge, _goods_desc);
 		if (CheckSavegameVersion(68)) {
-			SB(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, HASBIT(_waiting_acceptance, 15));
+			SB(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, HasBit(_waiting_acceptance, 15));
 			if (GB(_waiting_acceptance, 0, 12) != 0) {
 				/* Don't construct the packet with station here, because that'll fail with old savegames */
 				CargoPacket *cp = new CargoPacket();
@@ -3221,7 +3288,7 @@
 static void Save_STNS()
 {
 	Station *st;
-	// Write the stations
+	/* Write the stations */
 	FOR_ALL_STATIONS(st) {
 		SlSetArrayIndex(st->index);
 		SlAutolength((AutolengthProc*)SaveLoad_STNS, st);
@@ -3236,7 +3303,7 @@
 
 		SaveLoad_STNS(st);
 
-		// this means it's an oldstyle savegame without support for nonuniform stations
+		/* this means it's an oldstyle savegame without support for nonuniform stations */
 		if (st->train_tile != 0 && st->trainst_h == 0) {
 			uint w = GB(st->trainst_w, 4, 4);
 			uint h = GB(st->trainst_w, 0, 4);
--- a/src/station_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/station_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -79,7 +79,7 @@
 		}
 	}
 
-	DrawString(x + 1, y, cs->abbrev, 0x10);
+	DrawString(x + 1, y, cs->abbrev, TC_BLACK);
 
 	/* Draw green/red ratings bar (fits into 14 pixels) */
 	y += 8;
@@ -127,6 +127,9 @@
 	return (_internal_sort_order & 1) ? st2->facilities - st1->facilities : st1->facilities - st2->facilities;
 }
 
+static const uint32 _cargo_filter_max = ~0;
+static uint32 _cargo_filter = _cargo_filter_max;
+
 static int CDECL StationWaitingSorter(const void *a, const void *b)
 {
 	const Station* st1 = *(const Station**)a;
@@ -134,6 +137,7 @@
 	Money sum1 = 0, sum2 = 0;
 
 	for (CargoID j = 0; j < NUM_CARGO; j++) {
+		if (!HasBit(_cargo_filter, j)) continue;
 		if (!st1->goods[j].cargo.Empty()) sum1 += GetTransportedGoodsIncome(st1->goods[j].cargo.Count(), 20, 50, j);
 		if (!st2->goods[j].cargo.Empty()) sum2 += GetTransportedGoodsIncome(st2->goods[j].cargo.Count(), 20, 50, j);
 	}
@@ -157,8 +161,8 @@
 	byte maxr2 = 0;
 
 	for (CargoID j = 0; j < NUM_CARGO; j++) {
-		if (HASBIT(st1->goods[j].acceptance_pickup, GoodsEntry::PICKUP)) maxr1 = max(maxr1, st1->goods[j].rating);
-		if (HASBIT(st2->goods[j].acceptance_pickup, GoodsEntry::PICKUP)) maxr2 = max(maxr2, st2->goods[j].rating);
+		if (HasBit(st1->goods[j].acceptance_pickup, GoodsEntry::PICKUP)) maxr1 = max(maxr1, st1->goods[j].rating);
+		if (HasBit(st2->goods[j].acceptance_pickup, GoodsEntry::PICKUP)) maxr2 = max(maxr2, st2->goods[j].rating);
 	}
 
 	return (_internal_sort_order & 1) ? maxr2 - maxr1 : maxr1 - maxr2;
@@ -227,7 +231,7 @@
 				for (CargoID j = 0; j < NUM_CARGO; j++) {
 					if (!st->goods[j].cargo.Empty()) {
 						num_waiting_cargo++; //count number of waiting cargo
-						if (HASBIT(cargo_filter, j)) {
+						if (HasBit(cargo_filter, j)) {
 							station_sort[n++] = st;
 							break;
 						}
@@ -272,9 +276,6 @@
 	sl->flags &= ~SL_RESORT;
 }
 
-static const uint32 _cargo_filter_max = ~0;
-static uint32 _cargo_filter = _cargo_filter_max;
-
 static void PlayerStationsWndProc(Window *w, WindowEvent *e)
 {
 	const PlayerID owner = (PlayerID)w->window_number;
@@ -289,11 +290,11 @@
 			if (_cargo_filter == _cargo_filter_max) _cargo_filter = _cargo_mask;
 
 			for (uint i = 0; i < 5; i++) {
-				if (HASBIT(facilities, i)) LowerWindowWidget(w, i + STATIONLIST_WIDGET_TRAIN);
+				if (HasBit(facilities, i)) w->LowerWidget(i + STATIONLIST_WIDGET_TRAIN);
 			}
-			SetWindowWidgetLoweredState(w, STATIONLIST_WIDGET_FACILALL, facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK));
-			SetWindowWidgetLoweredState(w, STATIONLIST_WIDGET_CARGOALL, _cargo_filter == _cargo_mask && include_empty);
-			SetWindowWidgetLoweredState(w, STATIONLIST_WIDGET_NOCARGOWAITING, include_empty);
+			w->SetWidgetLoweredState(STATIONLIST_WIDGET_FACILALL, facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK));
+			w->SetWidgetLoweredState(STATIONLIST_WIDGET_CARGOALL, _cargo_filter == _cargo_mask && include_empty);
+			w->SetWidgetLoweredState(STATIONLIST_WIDGET_NOCARGOWAITING, include_empty);
 
 			sl->sort_list = NULL;
 			sl->flags = SL_REBUILD;
@@ -314,9 +315,9 @@
 			DrawWindowWidgets(w);
 
 			/* draw sorting criteria string */
-			DrawString(85, 26, _station_sort_listing[sl->sort_type], 0x10);
+			DrawString(85, 26, _station_sort_listing[sl->sort_type], TC_BLACK);
 			/* draw arrow pointing up/down for ascending/descending sorting */
-			DoDrawString(sl->flags & SL_ORDER ? DOWNARROW : UPARROW, 69, 26, 0x10);
+			DoDrawString(sl->flags & SL_ORDER ? DOWNARROW : UPARROW, 69, 26, TC_BLACK);
 
 			int cg_ofst;
 			int x = 89;
@@ -328,25 +329,25 @@
 				const CargoSpec *cs = GetCargo(c);
 				if (!cs->IsValid()) continue;
 
-				cg_ofst = HASBIT(_cargo_filter, c) ? 2 : 1;
+				cg_ofst = HasBit(_cargo_filter, c) ? 2 : 1;
 				GfxFillRect(x + cg_ofst, y + cg_ofst, x + cg_ofst + 10 , y + cg_ofst + 7, cs->rating_colour);
-				DrawStringCentered(x + 6 + cg_ofst, y + cg_ofst, cs->abbrev, 0x10);
+				DrawStringCentered(x + 6 + cg_ofst, y + cg_ofst, cs->abbrev, TC_BLACK);
 				x += 14;
 				i++;
 			}
 
 			x += 6;
-			cg_ofst = IsWindowWidgetLowered(w, STATIONLIST_WIDGET_NOCARGOWAITING) ? 2 : 1;
-			DrawStringCentered(x + cg_ofst, y + cg_ofst, STR_ABBREV_NONE, 16);
+			cg_ofst = w->IsWidgetLowered(STATIONLIST_WIDGET_NOCARGOWAITING) ? 2 : 1;
+			DrawStringCentered(x + cg_ofst, y + cg_ofst, STR_ABBREV_NONE, TC_BLACK);
 			x += 14;
-			cg_ofst = IsWindowWidgetLowered(w, STATIONLIST_WIDGET_CARGOALL) ? 2 : 1;
-			DrawStringCentered(x + cg_ofst, y + cg_ofst, STR_ABBREV_ALL, 16);
+			cg_ofst = w->IsWidgetLowered(STATIONLIST_WIDGET_CARGOALL) ? 2 : 1;
+			DrawStringCentered(x + cg_ofst, y + cg_ofst, STR_ABBREV_ALL, TC_BLACK);
 
-			cg_ofst = IsWindowWidgetLowered(w, STATIONLIST_WIDGET_FACILALL) ? 2 : 1;
-			DrawString(71 + cg_ofst, y + cg_ofst, STR_ABBREV_ALL, 16);
+			cg_ofst = w->IsWidgetLowered(STATIONLIST_WIDGET_FACILALL) ? 2 : 1;
+			DrawString(71 + cg_ofst, y + cg_ofst, STR_ABBREV_ALL, TC_BLACK);
 
 			if (w->vscroll.count == 0) { // player has no stations
-				DrawString(xb, 40, STR_304A_NONE, 0);
+				DrawString(xb, 40, STR_304A_NONE, TC_FROMSTRING);
 				return;
 			}
 
@@ -362,7 +363,7 @@
 
 				SetDParam(0, st->index);
 				SetDParam(1, st->facilities);
-				x = DrawString(xb, y, STR_3049_0, 0) + 5;
+				x = DrawString(xb, y, STR_3049_0, TC_FROMSTRING) + 5;
 
 				/* show cargo waiting and station ratings */
 				for (CargoID j = 0; j < NUM_CARGO; j++) {
@@ -399,25 +400,26 @@
 				case STATIONLIST_WIDGET_AIRPLANE:
 				case STATIONLIST_WIDGET_SHIP:
 					if (_ctrl_pressed) {
-						TOGGLEBIT(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
-						ToggleWidgetLoweredState(w, e->we.click.widget);
+						ToggleBit(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
+						w->ToggleWidgetLoweredState(e->we.click.widget);
 					} else {
-						for (uint i = 0; facilities != 0; i++, facilities >>= 1) {
-							if (HASBIT(facilities, 0)) RaiseWindowWidget(w, i + STATIONLIST_WIDGET_TRAIN);
+						uint i;
+						FOR_EACH_SET_BIT(i, facilities) {
+							w->RaiseWidget(i + STATIONLIST_WIDGET_TRAIN);
 						}
-						SETBIT(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
-						LowerWindowWidget(w, e->we.click.widget);
+						SetBit(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
+						w->LowerWidget(e->we.click.widget);
 					}
-					SetWindowWidgetLoweredState(w, STATIONLIST_WIDGET_FACILALL, facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK));
+					w->SetWidgetLoweredState(STATIONLIST_WIDGET_FACILALL, facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK));
 					sl->flags |= SL_REBUILD;
 					SetWindowDirty(w);
 					break;
 
 				case STATIONLIST_WIDGET_FACILALL:
 					for (uint i = 0; i < 5; i++) {
-						LowerWindowWidget(w, i + STATIONLIST_WIDGET_TRAIN);
+						w->LowerWidget(i + STATIONLIST_WIDGET_TRAIN);
 					}
-					LowerWindowWidget(w, STATIONLIST_WIDGET_FACILALL);
+					w->LowerWidget(STATIONLIST_WIDGET_FACILALL);
 
 					facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK;
 					sl->flags |= SL_REBUILD;
@@ -428,11 +430,11 @@
 					uint i = 0;
 					for (CargoID c = 0; c < NUM_CARGO; c++) {
 						if (!GetCargo(c)->IsValid()) continue;
-						LowerWindowWidget(w, i + STATIONLIST_WIDGET_CARGOSTART);
+						w->LowerWidget(i + STATIONLIST_WIDGET_CARGOSTART);
 						i++;
 					}
-					LowerWindowWidget(w, STATIONLIST_WIDGET_NOCARGOWAITING);
-					LowerWindowWidget(w, STATIONLIST_WIDGET_CARGOALL);
+					w->LowerWidget(STATIONLIST_WIDGET_NOCARGOWAITING);
+					w->LowerWidget(STATIONLIST_WIDGET_CARGOALL);
 
 					_cargo_filter = _cargo_mask;
 					include_empty = true;
@@ -443,10 +445,10 @@
 
 				case STATIONLIST_WIDGET_SORTBY: /*flip sorting method asc/desc*/
 					sl->flags ^= SL_ORDER; //DESC-flag
-					station_sort.order = GB(sl->flags, 0, 1);
+					station_sort.order = HasBit(sl->flags, 0);
 					sl->flags |= SL_RESORT;
 					w->flags4 |= 5 << WF_TIMEOUT_SHL;
-					LowerWindowWidget(w, STATIONLIST_WIDGET_SORTBY);
+					w->LowerWidget(STATIONLIST_WIDGET_SORTBY);
 					SetWindowDirty(w);
 					break;
 
@@ -458,19 +460,19 @@
 				case STATIONLIST_WIDGET_NOCARGOWAITING:
 					if (_ctrl_pressed) {
 						include_empty = !include_empty;
-						ToggleWidgetLoweredState(w, STATIONLIST_WIDGET_NOCARGOWAITING);
+						w->ToggleWidgetLoweredState(STATIONLIST_WIDGET_NOCARGOWAITING);
 					} else {
 						for (uint i = STATIONLIST_WIDGET_CARGOSTART; i < w->widget_count; i++) {
-							RaiseWindowWidget(w, i);
+							w->RaiseWidget(i);
 						}
 
 						_cargo_filter = 0;
 						include_empty = true;
 
-						LowerWindowWidget(w, STATIONLIST_WIDGET_NOCARGOWAITING);
+						w->LowerWidget(STATIONLIST_WIDGET_NOCARGOWAITING);
 					}
 					sl->flags |= SL_REBUILD;
-					SetWindowWidgetLoweredState(w, STATIONLIST_WIDGET_CARGOALL, _cargo_filter == _cargo_mask && include_empty);
+					w->SetWidgetLoweredState(STATIONLIST_WIDGET_CARGOALL, _cargo_filter == _cargo_mask && include_empty);
 					SetWindowDirty(w);
 					break;
 
@@ -486,22 +488,22 @@
 						}
 
 						if (_ctrl_pressed) {
-							TOGGLEBIT(_cargo_filter, c);
-							ToggleWidgetLoweredState(w, e->we.click.widget);
+							ToggleBit(_cargo_filter, c);
+							w->ToggleWidgetLoweredState(e->we.click.widget);
 						} else {
 							for (uint i = STATIONLIST_WIDGET_CARGOSTART; i < w->widget_count; i++) {
-								RaiseWindowWidget(w, i);
+								w->RaiseWidget(i);
 							}
-							RaiseWindowWidget(w, STATIONLIST_WIDGET_NOCARGOWAITING);
+							w->RaiseWidget(STATIONLIST_WIDGET_NOCARGOWAITING);
 
 							_cargo_filter = 0;
 							include_empty = false;
 
-							SETBIT(_cargo_filter, c);
-							LowerWindowWidget(w, e->we.click.widget);
+							SetBit(_cargo_filter, c);
+							w->LowerWidget(e->we.click.widget);
 						}
 						sl->flags |= SL_REBUILD;
-						SetWindowWidgetLoweredState(w, STATIONLIST_WIDGET_CARGOALL, _cargo_filter == _cargo_mask && include_empty);
+						w->SetWidgetLoweredState(STATIONLIST_WIDGET_CARGOALL, _cargo_filter == _cargo_mask && include_empty);
 						SetWindowDirty(w);
 					}
 					break;
@@ -528,7 +530,7 @@
 			break;
 
 		case WE_TIMEOUT:
-			RaiseWindowWidget(w, STATIONLIST_WIDGET_SORTBY);
+			w->RaiseWidget(STATIONLIST_WIDGET_SORTBY);
 			SetWindowDirty(w);
 			break;
 
@@ -614,7 +616,7 @@
 		wi->data     = 0;
 		wi->tooltips = STR_USE_CTRL_TO_SELECT_MORE;
 
-		if (HASBIT(_cargo_filter, c)) LowerWindowWidget(w, STATIONLIST_WIDGET_CARGOSTART + i);
+		if (HasBit(_cargo_filter, c)) w->LowerWidget(STATIONLIST_WIDGET_CARGOSTART + i);
 		i++;
 	}
 
@@ -709,11 +711,11 @@
 	}
 	SetVScrollCount(w, num);
 
-	SetWindowWidgetDisabledState(w,  9, st->owner != _local_player);
-	SetWindowWidgetDisabledState(w, 10, !(st->facilities & FACIL_TRAIN));
-	SetWindowWidgetDisabledState(w, 11, !(st->facilities & FACIL_TRUCK_STOP) && !(st->facilities & FACIL_BUS_STOP));
-	SetWindowWidgetDisabledState(w, 12, !(st->facilities & FACIL_AIRPORT));
-	SetWindowWidgetDisabledState(w, 13, !(st->facilities & FACIL_DOCK));
+	w->SetWidgetDisabledState( 9, st->owner != _local_player);
+	w->SetWidgetDisabledState(10, !(st->facilities & FACIL_TRAIN));
+	w->SetWidgetDisabledState(11, !(st->facilities & FACIL_TRUCK_STOP) && !(st->facilities & FACIL_BUS_STOP));
+	w->SetWidgetDisabledState(12, !(st->facilities & FACIL_AIRPORT));
+	w->SetWidgetDisabledState(13, !(st->facilities & FACIL_DOCK));
 
 	SetDParam(0, st->index);
 	SetDParam(1, st->facilities);
@@ -729,7 +731,7 @@
 			if (!st->goods[i].cargo.Empty()) str = STR_EMPTY;
 		}
 		SetDParam(0, str);
-		DrawString(x, y, STR_0008_WAITING, 0);
+		DrawString(x, y, STR_0008_WAITING, TC_FROMSTRING);
 		y += 10;
 	}
 
@@ -742,7 +744,7 @@
 				DrawCargoIcons(i, waiting, x, y);
 				SetDParam(1, waiting);
 				SetDParam(0, i);
-				DrawStringRightAligned(x + 234, y, STR_0009, 0);
+				DrawStringRightAligned(x + 234, y, STR_0009, TC_FROMSTRING);
 				y += 10;
 			}
 		} else {
@@ -751,13 +753,13 @@
 				DrawCargoIcons(i, waiting, x, y);
 				SetDParam(1, waiting);
 				SetDParam(0, i);
-				DrawStringRightAligned(x + 234, y, STR_000A_EN_ROUTE_FROM, 0);
+				DrawStringRightAligned(x + 234, y, STR_000A_EN_ROUTE_FROM, TC_FROMSTRING);
 				y += 10;
 			}
 
 			if (pos > -5 && --pos < 0) {
 				SetDParam(0, st->goods[i].cargo.Source());
-				DrawStringRightAligned(x + 234, y, STR_000B, 0);
+				DrawStringRightAligned(x + 234, y, STR_000B, TC_FROMSTRING);
 				y += 10;
 			}
 		}
@@ -771,7 +773,7 @@
 
 		for (CargoID i = 0; i < NUM_CARGO; i++) {
 			if (b >= endof(_userstring) - 5 - 1) break;
-			if (HASBIT(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE)) {
+			if (HasBit(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE)) {
 				if (first) {
 					first = false;
 				} else {
@@ -789,7 +791,7 @@
 		*b = '\0';
 		DrawStringMultiLine(2, 67, STR_SPEC_USERSTRING, 245);
 	} else {
-		DrawString(2, 67, STR_3034_LOCAL_RATING_OF_TRANSPORT, 0);
+		DrawString(2, 67, STR_3034_LOCAL_RATING_OF_TRANSPORT, TC_FROMSTRING);
 
 		y = 77;
 		for (CargoID i = 0; i < NUM_CARGO; i++) {
@@ -797,12 +799,12 @@
 			if (!cs->IsValid()) continue;
 
 			const GoodsEntry *ge = &st->goods[i];
-			if (!HASBIT(ge->acceptance_pickup, GoodsEntry::PICKUP)) continue;
+			if (!HasBit(ge->acceptance_pickup, GoodsEntry::PICKUP)) continue;
 
 			SetDParam(0, cs->name);
 			SetDParam(2, ge->rating * 101 >> 8);
 			SetDParam(1, STR_3035_APPALLING + (ge->rating >> 5));
-			DrawString(8, y, STR_303D, 0);
+			DrawString(8, y, STR_303D, TC_FROMSTRING);
 			y += 10;
 		}
 	}
--- a/src/station_map.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/station_map.h	Mon Dec 03 23:39:38 2007 +0000
@@ -116,7 +116,7 @@
 static inline bool GetStopBuiltOnTownRoad(TileIndex t)
 {
 	assert(IsDriveThroughStopTile(t));
-	return HASBIT(_m[t].m6, 2);
+	return HasBit(_m[t].m6, 2);
 }
 
 
@@ -154,6 +154,15 @@
 	return IsTileType(t, MP_STATION) && IsBuoy(t);
 }
 
+static inline bool IsCanalBuoyTile(TileIndex t)
+{
+	return IsBuoyTile(t) && !IsTileOwner(t, OWNER_WATER);
+}
+
+static inline bool IsSeaBuoyTile(TileIndex t)
+{
+	return IsBuoyTile(t) && IsTileOwner(t, OWNER_WATER);
+}
 
 static inline bool IsHangarTile(TileIndex t)
 {
@@ -164,7 +173,7 @@
 static inline Axis GetRailStationAxis(TileIndex t)
 {
 	assert(IsRailwayStation(t));
-	return HASBIT(GetStationGfx(t), 0) ? AXIS_Y : AXIS_X;
+	return HasBit(GetStationGfx(t), 0) ? AXIS_Y : AXIS_X;
 }
 
 
--- a/src/stdafx.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/stdafx.h	Mon Dec 03 23:39:38 2007 +0000
@@ -8,19 +8,22 @@
 /* It seems that we need to include stdint.h before anything else
  * We need INT64_MAX, which for most systems comes from stdint.h. However, MSVC
  * does not have stdint.h and apparently neither does MorphOS, so define
- * INT64_MAX for them ourselves. */
-#if !defined(_MSC_VER) && !defined( __MORPHOS__)
-# if defined (SUNOS)
-/* SunOS/Solaris does not have stdint.h, but inttypes.h defines everything
- * stdint.h defines and we need. */
-#  include <inttypes.h>
-# else
-#  define __STDC_LIMIT_MACROS
-#  include <stdint.h>
-# endif
+ * INT64_MAX for them ourselves.
+ * Sometimes OSX headers manages to include stdint.h before this but without
+ * __STDC_LIMIT_MACROS so it will be without INT64_*. We need to define those
+ * too if this is the case. */
+#if !defined(_MSC_VER) && !defined( __MORPHOS__) && !defined(_STDINT_H_)
+	#if defined(SUNOS)
+		/* SunOS/Solaris does not have stdint.h, but inttypes.h defines everything
+		 * stdint.h defines and we need. */
+		#include <inttypes.h>
+	# else
+		#define __STDC_LIMIT_MACROS
+		#include <stdint.h>
+	#endif
 #else
-# define INT64_MAX 9223372036854775807LL
-# define INT64_MIN -9223372036854775808LL
+	#define INT64_MAX 9223372036854775807LL
+	#define INT64_MIN (-INT64_MAX - 1)
 #endif
 
 #include <cstdio>
@@ -32,288 +35,284 @@
 /* MacOS X will use an NSAlert to display failed assertaions since they're lost unless running from a terminal
  * strgen always runs from terminal and don't need a window for asserts */
 #if !defined(__APPLE__) || defined(STRGEN)
-# include <cassert>
+	#include <cassert>
 #else
-# include "os/macosx/macos.h"
+	#include "os/macosx/macos.h"
 #endif
 
 #if defined(UNIX) || defined(__MINGW32__)
-# include <sys/types.h>
+	#include <sys/types.h>
 #endif
 
 #if defined(__OS2__)
-# include <types.h>
-# define strcasecmp stricmp
+	#include <types.h>
+	#define strcasecmp stricmp
 #endif
 
 #if defined(PSP)
-# include <psptypes.h>
-# include <pspdebug.h>
-# include <pspthreadman.h>
-#endif /* PSP */
-
-#ifdef __BEOS__
-# include <SupportDefs.h>
-#endif
-
-#ifdef SUNOS
-# include <alloca.h>
+	#include <psptypes.h>
+	#include <pspdebug.h>
+	#include <pspthreadman.h>
 #endif
 
-#ifdef __MORPHOS__
-/* MorphOS defines certain Amiga defines per default, we undefine them
- * here to make the rest of source less messy and more clear what is
- * required for morphos and what for AmigaOS */
-# ifdef amigaos
-#  undef amigaos
-# endif
-# ifdef __amigaos__
-#  undef __amigaos__
-# endif
-# ifdef __AMIGA__
-#  undef __AMIGA__
-# endif
-# ifdef AMIGA
-#  undef AMIGA
-# endif
-# ifdef amiga
-#  undef amiga
-# endif
-/* Act like we already included this file, as it somehow gives linkage problems
- *  (mismatch linkage of C++ and C between this include and unistd.h). */
-#define CLIB_USERGROUP_PROTOS_H
+#if defined(__BEOS__)
+	#include <SupportDefs.h>
+#endif
+
+#if defined(SUNOS)
+	#include <alloca.h>
+#endif
+
+#if defined(__MORPHOS__)
+	/* MorphOS defines certain Amiga defines per default, we undefine them
+	 * here to make the rest of source less messy and more clear what is
+	 * required for morphos and what for AmigaOS */
+	#if defined(amigaos)
+		#undef amigaos
+	#endif
+	#if defined(__amigaos__)
+		#undef __amigaos__
+	# endif
+	#if defined(__AMIGA__)
+		#undef __AMIGA__
+	#endif
+	#if defined(AMIGA)
+		#undef AMIGA
+	#endif
+	#if defined(amiga)
+		#undef amiga
+	#endif
+	/* Act like we already included this file, as it somehow gives linkage problems
+	 *  (mismatch linkage of C++ and C between this include and unistd.h). */
+	#define CLIB_USERGROUP_PROTOS_H
 #endif /* __MORPHOS__ */
 
-#ifdef __APPLE__
-# include "os/macosx/osx_stdafx.h"
-/* Make endian swapping use Apple's macros to increase speed (since it will use hardware swapping if available)
- * Even though they should return uint16 and uint32, we get warnings if we don't cast those (why?) */
-# define BSWAP32(x) ((uint32)Endian32_Swap(x))
-# define BSWAP16(x) ((uint16)Endian16_Swap(x))
+#if defined(__APPLE__)
+	#include "os/macosx/osx_stdafx.h"
+	/* Make endian swapping use Apple's macros to increase speed (since it will use hardware swapping if available)
+	 * Even though they should return uint16 and uint32, we get warnings if we don't cast those (why?) */
+	#define BSWAP32(x) ((uint32)Endian32_Swap(x))
+	#define BSWAP16(x) ((uint16)Endian16_Swap(x))
 #else
-# define BSWAP32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) << 8) & 0xFF0000) | (((x) << 24) & 0xFF000000))
-# define BSWAP16(x) ((x) >> 8 | (x) << 8)
+	#define BSWAP32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) << 8) & 0xFF0000) | (((x) << 24) & 0xFF000000))
+	#define BSWAP16(x) ((x) >> 8 | (x) << 8)
 #endif /* __APPLE__ */
 
 #if defined(PSP)
-/* PSP can only have 10 file-descriptors open at any given time, but this
- *  switch only limits reads via the Fio system. So keep 2 fds free for things
- *  like saving a game. */
-# define LIMITED_FDS 8
-# define printf pspDebugScreenPrintf
+	/* PSP can only have 10 file-descriptors open at any given time, but this
+	 *  switch only limits reads via the Fio system. So keep 2 fds free for things
+	 *  like saving a game. */
+	#define LIMITED_FDS 8
+	#define printf pspDebugScreenPrintf
 #endif /* PSP */
 
 /* by default we use [] var arrays */
 #define VARARRAY_SIZE
 
-
 /* Stuff for GCC */
 #if defined(__GNUC__)
-# define NORETURN __attribute__ ((noreturn))
-# define FORCEINLINE inline
-# define CDECL
-# define __int64 long long
-# define GCC_PACK __attribute__((packed))
+	#define NORETURN __attribute__ ((noreturn))
+	#define FORCEINLINE inline
+	#define CDECL
+	#define __int64 long long
+	#define GCC_PACK __attribute__((packed))
 
-# if (__GNUC__ == 2)
-#  undef VARARRAY_SIZE
-#  define VARARRAY_SIZE 0
-# endif
+	#if (__GNUC__ == 2)
+		#undef VARARRAY_SIZE
+		#define VARARRAY_SIZE 0
+	#endif
 #endif /* __GNUC__ */
 
 #if defined(__WATCOMC__)
-# define NORETURN
-# define FORCEINLINE inline
-# define CDECL
-# define GCC_PACK
-# include <malloc.h>
+	#define NORETURN
+	#define FORCEINLINE inline
+	#define CDECL
+	#define GCC_PACK
+	#include <malloc.h>
 #endif /* __WATCOMC__ */
 
 #if defined(__MINGW32__) || defined(__CYGWIN__)
-# include <malloc.h> // alloca()
+	#include <malloc.h> // alloca()
 #endif
 
 /* Stuff for MSVC */
 #if defined(_MSC_VER)
-# pragma once
-/* Define a win32 target platform, to override defaults of the SDK
- * We need to define NTDDI version for Vista SDK, but win2k is minimum */
-# define NTDDI_VERSION NTDDI_WIN2K // Windows 2000
-# define _WIN32_WINNT 0x0500       // Windows 2000
-
-# define _WIN32_WINDOWS 0x400      // Windows 95
-#if !defined(WINCE)
-# define WINVER 0x0400             // Windows NT 4.0 / Windows 95
-#endif
-# define _WIN32_IE_ 0x0401         // 4.01 (win98 and NT4SP5+)
-
-# define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers
-# pragma warning(disable: 4244)  // 'conversion' conversion from 'type1' to 'type2', possible loss of data
-# pragma warning(disable: 4761)  // integral size mismatch in argument : conversion supplied
-# pragma warning(disable: 4200)  // nonstandard extension used : zero-sized array in struct/union
-
-# if _MSC_VER >= 1400              // MSVC 2005 safety checks
-#  pragma warning(disable: 4996)   // 'strdup' was declared deprecated
-#  define _CRT_SECURE_NO_DEPRECATE // all deprecated 'unsafe string functions
-#  pragma warning(disable: 6308)   // code analyzer: 'realloc' might return null pointer: assigning null pointer to 't_ptr', which is passed as an argument to 'realloc', will cause the original memory block to be leaked
-#  pragma warning(disable: 6011)   // code analyzer: Dereferencing NULL pointer 'pfGetAddrInfo': Lines: 995, 996, 998, 999, 1001
-#  pragma warning(disable: 6326)   // code analyzer: potential comparison of a constant with another constant
-#  pragma warning(disable: 6031)   // code analyzer: Return value ignored: 'ReadFile'
-#  pragma warning(disable: 6255)   // code analyzer: _alloca indicates failure by raising a stack overflow exception. Consider using _malloca instead
-#  pragma warning(disable: 6246)   // code analyzer: Local declaration of 'statspec' hides declaration of the same name in outer scope. For additional information, see previous declaration at ...
-# else /* _MSC_VER >= 1400  ( <1400 for MSVC2003) */
-#  pragma warning(disable: 4288)   // nonstandard extension used : 'y' : loop control variable declared in the for-loop is used outside the for-loop scope; it conflicts with the declaration in the outer scope
-#  pragma warning(disable: 4292)   // compiler limit : terminating debug information emission for enum 'StringIdEnum' with member 'STR_801D_COAL_CAR'
-# endif /* _MSC_VER >= 1400 */
+	#pragma once
+	/* Define a win32 target platform, to override defaults of the SDK
+	 * We need to define NTDDI version for Vista SDK, but win2k is minimum */
+	#define NTDDI_VERSION NTDDI_WIN2K // Windows 2000
+	#define _WIN32_WINNT 0x0500       // Windows 2000
+	#define _WIN32_WINDOWS 0x400      // Windows 95
+	#if !defined(WINCE)
+		#define WINVER 0x0400     // Windows NT 4.0 / Windows 95
+	#endif
+	#define _WIN32_IE_ 0x0401         // 4.01 (win98 and NT4SP5+)
 
-# include <malloc.h> // alloca()
-# define NORETURN __declspec(noreturn)
-# define FORCEINLINE __forceinline
-# define inline _inline
-# if !defined(WINCE)
-#  define CDECL _cdecl
-# endif
-  int CDECL snprintf(char *str, size_t size, const char *format, ...);
-# if _MSC_VER < 1400 || defined(WINCE)
-   int CDECL vsnprintf(char *str, size_t size, const char *format, va_list ap);
-# endif
+	#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers
+	#pragma warning(disable: 4244)  // 'conversion' conversion from 'type1' to 'type2', possible loss of data
+	#pragma warning(disable: 4761)  // integral size mismatch in argument : conversion supplied
+	#pragma warning(disable: 4200)  // nonstandard extension used : zero-sized array in struct/union
 
-# if defined(WIN32) && !defined(_WIN64) && !defined(WIN64)
-#  ifndef _W64
-#   define _W64
-#  endif
-   typedef _W64 int INT_PTR, *PINT_PTR;
-   typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
-# endif /* WIN32 && !_WIN64 && !WIN64 */
-
-# define GCC_PACK
+	#if (_MSC_VER >= 1400)                   // MSVC 2005 safety checks
+		#pragma warning(disable: 4996)   // 'strdup' was declared deprecated
+		#define _CRT_SECURE_NO_DEPRECATE // all deprecated 'unsafe string functions
+		#pragma warning(disable: 6308)   // code analyzer: 'realloc' might return null pointer: assigning null pointer to 't_ptr', which is passed as an argument to 'realloc', will cause the original memory block to be leaked
+		#pragma warning(disable: 6011)   // code analyzer: Dereferencing NULL pointer 'pfGetAddrInfo': Lines: 995, 996, 998, 999, 1001
+		#pragma warning(disable: 6326)   // code analyzer: potential comparison of a constant with another constant
+		#pragma warning(disable: 6031)   // code analyzer: Return value ignored: 'ReadFile'
+		#pragma warning(disable: 6255)   // code analyzer: _alloca indicates failure by raising a stack overflow exception. Consider using _malloca instead
+		#pragma warning(disable: 6246)   // code analyzer: Local declaration of 'statspec' hides declaration of the same name in outer scope. For additional information, see previous declaration at ...
+	#else /* _MSC_VER >= 1400  ( <1400 for MSVC2003) */
+		#pragma warning(disable: 4288)   // nonstandard extension used : 'y' : loop control variable declared in the for-loop is used outside the for-loop scope; it conflicts with the declaration in the outer scope
+		#pragma warning(disable: 4292)   // compiler limit : terminating debug information emission for enum 'StringIdEnum' with member 'STR_801D_COAL_CAR'
+	#endif /* _MSC_VER >= 1400 */
 
-/* This is needed to zlib uses the stdcall calling convention on visual studio */
-# if defined(WITH_ZLIB) || defined(WITH_PNG)
-#  ifndef ZLIB_WINAPI
-#   define ZLIB_WINAPI
-#  endif
-# endif
+	#include <malloc.h> // alloca()
+	#define NORETURN __declspec(noreturn)
+	#define FORCEINLINE __forceinline
+	#define inline _inline
 
-# if defined(WINCE)
-#  define strcasecmp _stricmp
-#  define strncasecmp _strnicmp
-#  undef DEBUG
-# else
-#  define strcasecmp stricmp
-#  define strncasecmp strnicmp
-# endif
+	#if !defined(WINCE)
+		#define CDECL _cdecl
+	#endif
+
+	int CDECL snprintf(char *str, size_t size, const char *format, ...);
+	#if (_MSC_VER < 1400) || defined(WINCE)
+		int CDECL vsnprintf(char *str, size_t size, const char *format, va_list ap);
+	#endif
+
+	#if defined(WIN32) && !defined(_WIN64) && !defined(WIN64)
+		#if !defined(_W64)
+			#define _W64
+		#endif
+
+		typedef _W64 int INT_PTR, *PINT_PTR;
+		typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
+	#endif /* WIN32 && !_WIN64 && !WIN64 */
+
+	#define GCC_PACK
+
+	/* This is needed to zlib uses the stdcall calling convention on visual studio */
+	#if defined(WITH_ZLIB) || defined(WITH_PNG)
+		#if !defined(ZLIB_WINAPI)
+			#define ZLIB_WINAPI
+		#endif
+	#endif
+
+	#if defined(WINCE)
+		#define strcasecmp _stricmp
+		#define strncasecmp _strnicmp
+		#undef DEBUG
+	#else
+		#define strcasecmp stricmp
+		#define strncasecmp strnicmp
+	#endif
 /* suppress: warning C4005: 'offsetof' : macro redefinition (VC8) */
 #endif /* defined(_MSC_VER) */
 
 #if defined(WINCE)
-# define strdup _strdup
+	#define strdup _strdup
 #endif /* WINCE */
 
 /* NOTE: the string returned by these functions is only valid until the next
  * call to the same function and is not thread- or reentrancy-safe */
 #if !defined(STRGEN)
-# if defined(WIN32) || defined(WIN64)
-char *getcwd(char *buf, size_t size);
-#  include <tchar.h>
-/* XXX - WinCE without MSVCRT doesn't support wfopen, so it seems */
-#  if !defined(WINCE)
-#   define fopen(file, mode) _tfopen(OTTD2FS(file), _T(mode))
-#  endif /* WINCE */
+	#if defined(WIN32) || defined(WIN64)
+		char *getcwd(char *buf, size_t size);
+		#include <tchar.h>
 
-   const char *FS2OTTD(const TCHAR *name);
-   const TCHAR *OTTD2FS(const char *name);
-# else
+		/* XXX - WinCE without MSVCRT doesn't support wfopen, so it seems */
+		#if !defined(WINCE)
+			#define fopen(file, mode) _tfopen(OTTD2FS(file), _T(mode))
+		#endif /* WINCE */
 
-#  define fopen(file, mode) fopen(OTTD2FS(file), mode)
-   const char *FS2OTTD(const char *name);
-   const char *OTTD2FS(const char *name);
-# endif /* WIN32 */
+		const char *FS2OTTD(const TCHAR *name);
+		const TCHAR *OTTD2FS(const char *name);
+	#else
+		#define fopen(file, mode) fopen(OTTD2FS(file), mode)
+		const char *FS2OTTD(const char *name);
+		const char *OTTD2FS(const char *name);
+	#endif /* WIN32 */
 #endif /* STRGEN */
 
 /* Windows has always LITTLE_ENDIAN */
 #if defined(WIN32) || defined(__OS2__) || defined(WIN64)
-# define TTD_LITTLE_ENDIAN
+	#define TTD_LITTLE_ENDIAN
 #elif defined(TESTING)
+	/* Do noting  */
 #else
-/* Else include endian[target/host].h, which has the endian-type, autodetected by the Makefile */
-# if defined(STRGEN)
-#  include "endian_host.h"
-# else
-#  include "endian_target.h"
-# endif
+	/* Else include endian[target/host].h, which has the endian-type, autodetected by the Makefile */
+	#if defined(STRGEN)
+		#include "endian_host.h"
+	#else
+		#include "endian_target.h"
+	#endif
 #endif /* WIN32 || __OS2__ || WIN64 */
 
 #if defined(WIN32) || defined(WIN64) || defined(__OS2__) && !defined(__INNOTEK_LIBC__)
-# define PATHSEP "\\"
-# define PATHSEPCHAR '\\'
+	#define PATHSEP "\\"
+	#define PATHSEPCHAR '\\'
 #else
-# define PATHSEP "/"
-# define PATHSEPCHAR '/'
+	#define PATHSEP "/"
+	#define PATHSEPCHAR '/'
 #endif
 
 typedef unsigned char byte;
-#ifndef __BEOS__ /* already defined */
-  typedef unsigned char uint8;
-  typedef unsigned short uint16;
-  typedef unsigned int uint32;
+
+/* This is already defined in unix, but not in QNX Neutrino (6.x)*/
+#if (!defined(UNIX) && !defined(__CYGWIN__) && !defined(__BEOS__) && !defined(__MORPHOS__)) || defined(__QNXNTO__)
+	typedef unsigned int uint;
 #endif
 
-/* This is already defined in unix */
-#if !defined(UNIX) && !defined(__CYGWIN__) && !defined(__BEOS__) && !defined(__MORPHOS__)
-  typedef unsigned int uint;
-#endif
-/* Not defined in QNX Neutrino (6.x) */
-#if defined(__QNXNTO__)
-  typedef unsigned int uint;
+#if !defined(__BEOS__) /* Already defined on BEOS */
+	typedef unsigned char    uint8;
+	typedef   signed char     int8;
+	typedef unsigned short   uint16;
+	typedef   signed short    int16;
+	typedef unsigned int     uint32;
+	typedef   signed int      int32;
+	typedef unsigned __int64 uint64;
+	typedef   signed __int64  int64;
 #endif
 
-#ifndef __BEOS__
-	typedef signed char int8;
-	typedef signed short int16;
-	typedef signed int int32;
-	typedef signed __int64 int64;
-	typedef unsigned __int64 uint64;
-#endif /* !__BEOS__ */
-
 #if defined(ARM) || defined(__arm__) || defined(__alpha__)
-# define OTTD_ALIGNMENT
+	#define OTTD_ALIGNMENT
 #endif
 
 /* Setup alignment and conversion macros */
 #if defined(TTD_BIG_ENDIAN)
-  static inline uint32 TO_LE32(uint32 x) { return BSWAP32(x); }
-  static inline uint16 TO_LE16(uint16 x) { return BSWAP16(x); }
-  static inline uint32 FROM_LE32(uint32 x) { return BSWAP32(x); }
-  static inline uint16 FROM_LE16(uint16 x) { return BSWAP16(x); }
-# define TO_BE32(x)   (x)
-# define TO_BE16(x)   (x)
-# define FROM_BE32(x) (x)
-# define FROM_BE16(x) (x)
-# define TO_LE32X(x)  BSWAP32(x)
-# define TO_BE32X(x)  (x)
+	#define TO_BE32X(x)  (x)
+	#define FROM_BE32(x) (x)
+	#define TO_BE32(x)   (x)
+	#define FROM_BE16(x) (x)
+	#define TO_BE16(x)   (x)
+	#define TO_LE32X(x)  BSWAP32(x)
+	static inline uint32 FROM_LE32(uint32 x) { return BSWAP32(x); }
+	static inline uint32 TO_LE32(uint32 x)   { return BSWAP32(x); }
+	static inline uint16 FROM_LE16(uint16 x) { return BSWAP16(x); }
+	static inline uint16 TO_LE16(uint16 x)   { return BSWAP16(x); }
 #else
-  static inline uint32 TO_BE32(uint32 x) { return BSWAP32(x); }
-  static inline uint16 TO_BE16(uint16 x) { return BSWAP16(x); }
-  static inline uint32 FROM_BE32(uint32 x) { return BSWAP32(x); }
-  static inline uint16 FROM_BE16(uint16 x) { return BSWAP16(x); }
-# define TO_LE32(x)   (x)
-# define TO_LE16(x)   (x)
-# define FROM_LE32(x) (x)
-# define FROM_LE16(x) (x)
-# define TO_LE32X(x)  (x)
-# define TO_BE32X(x)  BSWAP32(x)
+	#define TO_BE32X(x)  BSWAP32(x)
+	static inline uint32 FROM_BE32(uint32 x) { return BSWAP32(x); }
+	static inline uint32 TO_BE32(uint32 x)   { return BSWAP32(x); }
+	static inline uint16 FROM_BE16(uint16 x) { return BSWAP16(x); }
+	static inline uint16 TO_BE16(uint16 x)   { return BSWAP16(x); }
+	#define TO_LE32X(x)  (x)
+	#define FROM_LE32(x) (x)
+	#define TO_LE32(x)   (x)
+	#define FROM_LE16(x) (x)
+	#define TO_LE16(x)   (x)
 #endif /* TTD_BIG_ENDIAN */
 
 #if !defined(WITH_PERSONAL_DIR)
-# define PERSONAL_DIR ""
+	#define PERSONAL_DIR ""
 #endif
 
 /* Compile time assertions */
-#ifdef __OS2__
-# define assert_compile(expr)
+#if defined(__OS2__)
+	#define assert_compile(expr)
 #else
-# define assert_compile(expr) extern "C" void __ct_assert__(int a[1 - 2 * !(expr)])
+	#define assert_compile(expr) extern "C" void __ct_assert__(int a[1 - 2 * !(expr)])
 #endif /* __OS2__ */
 
 assert_compile(sizeof(uint32) == 4);
@@ -325,47 +324,48 @@
 #define lastof(x) (&x[lengthof(x) - 1])
 
 #define cpp_offsetof(s,m)   (((size_t)&reinterpret_cast<const volatile char&>((((s*)(char*)8)->m))) - 8)
-#ifndef offsetof
-# define offsetof(s,m)       cpp_offsetof(s, m)
+#if !defined(offsetof)
+	#define offsetof(s,m) cpp_offsetof(s, m)
 #endif /* offsetof */
 
 
 /* take care of some name clashes on MacOS */
 #if defined(__APPLE__)
-# define GetString OTTD_GetString
-# define DrawString OTTD_DrawString
-# define Random OTTD_Random
-# define CloseConnection OTTD_CloseConnection
+	#define GetString OTTD_GetString
+	#define DrawString OTTD_DrawString
+	#define Random OTTD_Random
+	#define CloseConnection OTTD_CloseConnection
 #endif /* __APPLE */
 
-#ifdef __AMIGA__
-/* it seems AmigaOS already have a Point declared */
-# define Point OTTD_AMIGA_POINT
+#if defined(__AMIGA__)
+	/* it seems AmigaOS already have a Point declared */
+	#define Point OTTD_AMIGA_POINT
 #endif
 
-void
-#ifndef STRGEN
-/* In strgen error is not fatal and returns */
-NORETURN
-#endif /* STRGEN */
-CDECL error(const char *str, ...);
+#if !defined(STRGEN)
+	/* In strgen error is not fatal and returns */
+	void NORETURN CDECL error(const char *str, ...);
+#else
+	void CDECL error(const char *str, ...);
+#endif
+
 #define NOT_REACHED() error("NOT_REACHED triggered at line %i of %s", __LINE__, __FILE__)
 
 #if defined(MORPHOS)
-/* MorphOS doesn't have C++ conformant _stricmp... */
-#define _stricmp stricmp
+	/* MorphOS doesn't have C++ conformant _stricmp... */
+	#define _stricmp stricmp
 #elif defined(OPENBSD)
-/* OpenBSD uses strcasecmp(3) */
-#define _stricmp strcasecmp
+	/* OpenBSD uses strcasecmp(3) */
+	#define _stricmp strcasecmp
 #endif
 
 #if !defined(MORPHOS) && !defined(OPENBSD)
-/* MorphOS & OpenBSD don't know wchars, the rest does :( */
-#define HAS_WCHAR
+	/* MorphOS & OpenBSD don't know wchars, the rest does :( */
+	#define HAS_WCHAR
 #endif /* !defined(MORPHOS) && !defined(OPENBSD) */
 
 #if !defined(MAX_PATH)
-# define MAX_PATH 260
+	#define MAX_PATH 260
 #endif
 
 #endif /* STDAFX_H */
--- a/src/strgen/strgen.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/strgen/strgen.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -221,7 +221,7 @@
 {
 	uint32 c;
 
-	if (!HASBIT(s[0], 7)) {
+	if (!HasBit(s[0], 7)) {
 		/* 1 byte */
 		return 1;
 	} else if (GB(s[0], 5, 3) == 6 && IsUtf8Part(s[1])) {
@@ -1014,7 +1014,6 @@
 	FILE *out;
 	int i;
 	int next = -1;
-	int lastgrp;
 
 	out = fopen("tmp.xxx", "w");
 	if (out == NULL) fatal("can't open tmp.xxx");
@@ -1023,8 +1022,6 @@
 	fprintf(out, "#ifndef TABLE_STRINGS_H\n");
 	fprintf(out, "#define TABLE_STRINGS_H\n");
 
-	lastgrp = 0;
-
 	for (i = 0; i != lengthof(_strings); i++) {
 		if (_strings[i] != NULL) {
 			if (next != i) fprintf(out, "\n");
@@ -1033,6 +1030,8 @@
 		}
 	}
 
+	fprintf(out, "\nstatic const StringID STR_LAST_STRINGID = 0x%X;\n", next - 1);
+
 	fprintf(out,
 		"\nenum {\n"
 		"\tLANGUAGE_PACK_IDENT = 0x474E414C, // Big Endian value for 'LANG' (LE is 0x 4C 41 4E 47)\n"
--- a/src/string.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/string.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -214,7 +214,7 @@
 {
 	assert(c != NULL);
 
-	if (!HASBIT(s[0], 7)) {
+	if (!HasBit(s[0], 7)) {
 		/* Single byte character: 0xxxxxxx */
 		*c = s[0];
 		return 1;
--- a/src/strings.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/strings.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -116,12 +116,12 @@
  */
 static char *GetStringWithArgs(char *buffr, uint string, const int64 *argv, const char* last)
 {
+	if (GB(string, 0, 16) == 0) return GetStringWithArgs(buffr, STR_UNDEFINED, argv, last);
+
 	uint index = GB(string,  0, 11);
 	uint tab   = GB(string, 11,  5);
 	char buff[512];
 
-	if (GB(string, 0, 16) == 0) error("!invalid string id 0 in GetString");
-
 	switch (tab) {
 		case 4:
 			if (index >= 0xC0)
@@ -139,7 +139,7 @@
 
 		case 26:
 			/* Include string within newgrf text (format code 81) */
-			if (HASBIT(index, 10)) {
+			if (HasBit(index, 10)) {
 				StringID string = GetGRFStringID(0, 0xD000 + GB(index, 0, 10));
 				return GetStringWithArgs(buffr, string, argv, last);
 			}
@@ -331,15 +331,15 @@
 
 static char *FormatGenericCurrency(char *buff, const CurrencySpec *spec, Money number, bool compact, const char* last)
 {
-	const char* multiplier = "";
+	/* We are going to make number absolute for printing, so
+	 * keep this piece of data as we need it later on */
+	bool negative = number < 0;
+	const char *multiplier = "";
 	char buf[40];
-	char* p;
+	char *p;
 	int j;
 
-	/* Multiply by exchange rate, but do it safely. */
-	CommandCost cs(number);
-	cs.MultiplyCost(spec->rate);
-	number = cs.GetCost();
+	number *= spec->rate;
 
 	/* convert from negative */
 	if (number < 0) {
@@ -374,7 +374,7 @@
 			*--p = spec->separator;
 			j = 3;
 		}
-		*--p = '0' + number % 10;
+		*--p = '0' + (char)(number % 10);
 	} while ((number /= 10) != 0);
 	buff = strecpy(buff, p, last);
 
@@ -385,7 +385,7 @@
 	 * The only remaining value is 1 (prefix), so everything that is not 0 */
 	if (spec->symbol_pos != 0) buff = strecpy(buff, spec->suffix, last);
 
-	if (cs.GetCost() < 0) {
+	if (negative) {
 		if (buff + Utf8CharLen(SCC_PREVIOUS_COLOUR) > last) return buff;
 		buff += Utf8Encode(buff, SCC_PREVIOUS_COLOUR);
 		*buff = '\0';
@@ -691,7 +691,8 @@
 			}
 
 			case SCC_GENDER_LIST: { // {G 0 Der Die Das}
-				const char* s = GetStringPtr(argv_orig[(byte)*str++]); // contains the string that determines gender.
+				char buffr[512];
+				const char *s = GetStringWithArgs(buffr, argv_orig[(byte)*str++], argv, last); // contains the string that determines gender.
 				int len;
 				int gender = 0;
 				if (s != NULL) {
@@ -1119,20 +1120,20 @@
 	}
 
 	/* town name? */
-	if (IS_INT_INSIDE(ind - 6, 0, SPECSTR_TOWNNAME_LAST-SPECSTR_TOWNNAME_START + 1)) {
+	if (IsInsideMM(ind - 6, 0, SPECSTR_TOWNNAME_LAST-SPECSTR_TOWNNAME_START + 1)) {
 		buff = GetSpecialTownNameString(buff, ind - 6, GetInt32(&argv), last);
 		return strecpy(buff, " Transport", last);
 	}
 
 	/* language name? */
-	if (IS_INT_INSIDE(ind, (SPECSTR_LANGUAGE_START - 0x70E4), (SPECSTR_LANGUAGE_END - 0x70E4) + 1)) {
+	if (IsInsideMM(ind, (SPECSTR_LANGUAGE_START - 0x70E4), (SPECSTR_LANGUAGE_END - 0x70E4) + 1)) {
 		int i = ind - (SPECSTR_LANGUAGE_START - 0x70E4);
 		return strecpy(buff,
 			i == _dynlang.curr ? _langpack->own_name : _dynlang.ent[i].name, last);
 	}
 
 	/* resolution size? */
-	if (IS_INT_INSIDE(ind, (SPECSTR_RESOLUTION_START - 0x70E4), (SPECSTR_RESOLUTION_END - 0x70E4) + 1)) {
+	if (IsInsideMM(ind, (SPECSTR_RESOLUTION_START - 0x70E4), (SPECSTR_RESOLUTION_END - 0x70E4) + 1)) {
 		int i = ind - (SPECSTR_RESOLUTION_START - 0x70E4);
 		buff += snprintf(
 			buff, last - buff + 1, "%dx%d", _resolutions[i][0], _resolutions[i][1]
@@ -1141,7 +1142,7 @@
 	}
 
 	/* screenshot format name? */
-	if (IS_INT_INSIDE(ind, (SPECSTR_SCREENSHOT_START - 0x70E4), (SPECSTR_SCREENSHOT_END - 0x70E4) + 1)) {
+	if (IsInsideMM(ind, (SPECSTR_SCREENSHOT_START - 0x70E4), (SPECSTR_SCREENSHOT_END - 0x70E4) + 1)) {
 		int i = ind - (SPECSTR_SCREENSHOT_START - 0x70E4);
 		return strecpy(buff, GetScreenshotFormatDesc(i), last);
 	}
@@ -1167,7 +1168,7 @@
 		case 0xA02F: return STR_SV_AIRCRAFT_NAME;
 
 		default:
-			if (IS_INT_INSIDE(s, 0x300F, 0x3030)) {
+			if (IsInsideMM(s, 0x300F, 0x3030)) {
 				return s - 0x300F + STR_SV_STNAME;
 			} else {
 				return s;
--- a/src/subsidy_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/subsidy_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -92,9 +92,10 @@
 
 	ConvertDateToYMD(_date, &ymd);
 
+	int width = w->width - 2;
 	y = 15;
 	x = 1;
-	DrawString(x, y, STR_2026_SUBSIDIES_ON_OFFER_FOR, 0);
+	DrawStringTruncated(x, y, STR_2026_SUBSIDIES_ON_OFFER_FOR, TC_FROMSTRING, width);
 	y += 10;
 	num = 0;
 
@@ -103,21 +104,21 @@
 			int x2;
 
 			SetupSubsidyDecodeParam(s, 1);
-			x2 = DrawString(x + 2, y, STR_2027_FROM_TO, 0);
+			x2 = DrawStringTruncated(x + 2, y, STR_2027_FROM_TO, TC_FROMSTRING, width);
 
 			SetDParam(0, _date - ymd.day + 384 - s->age * 32);
-			DrawString(x2, y, STR_2028_BY, 0);
+			DrawStringTruncated(x2, y, STR_2028_BY, TC_FROMSTRING, width - x2);
 			y += 10;
 			num++;
 		}
 	}
 
 	if (num == 0) {
-		DrawString(x + 2, y, STR_202A_NONE, 0);
+		DrawStringTruncated(x + 2, y, STR_202A_NONE, TC_FROMSTRING, width - 2);
 		y += 10;
 	}
 
-	DrawString(x, y + 1, STR_202B_SERVICES_ALREADY_SUBSIDISED, 0);
+	DrawStringTruncated(x, y + 1, STR_202B_SERVICES_ALREADY_SUBSIDISED, TC_FROMSTRING, width);
 	y += 10;
 	num = 0;
 
@@ -130,16 +131,16 @@
 			PlayerID player = GetStation(s->to)->owner;
 			SetDParam(3, player);
 
-			xt = DrawString(x + 2, y, STR_202C_FROM_TO, 0);
+			xt = DrawStringTruncated(x + 2, y, STR_202C_FROM_TO, TC_FROMSTRING, width - 2);
 
 			SetDParam(0, _date - ymd.day + 768 - s->age * 32);
-			DrawString(xt, y, STR_202D_UNTIL, 0);
+			DrawStringTruncated(xt, y, STR_202D_UNTIL, TC_FROMSTRING, width - xt);
 			y += 10;
 			num++;
 		}
 	}
 
-	if (num == 0) DrawString(x + 2, y, STR_202A_NONE, 0);
+	if (num == 0) DrawStringTruncated(x + 2, y, STR_202A_NONE, TC_FROMSTRING, width - 2);
 }
 
 static void SubsidiesListWndProc(Window *w, WindowEvent *e)
@@ -158,15 +159,15 @@
 }
 
 static const Widget _subsidies_list_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE, 13,   0,  10,   0,  13, STR_00C5,           STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE, 13,  11, 617,   0,  13, STR_2025_SUBSIDIES, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{  WWT_STICKYBOX,   RESIZE_NONE, 13, 618, 629,   0,  13, STR_NULL,           STR_STICKY_BUTTON},
-{      WWT_PANEL,   RESIZE_NONE, 13,   0, 629,  14, 126, 0x0,                STR_01FD_CLICK_ON_SERVICE_TO_CENTER},
+{   WWT_CLOSEBOX, RESIZE_NONE,  13,   0,  10,   0,  13, STR_00C5,           STR_018B_CLOSE_WINDOW},
+{    WWT_CAPTION, RESIZE_RIGHT, 13,  11, 307,   0,  13, STR_2025_SUBSIDIES, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{  WWT_STICKYBOX, RESIZE_LR,    13, 308, 319,   0,  13, STR_NULL,           STR_STICKY_BUTTON},
+{      WWT_PANEL, RESIZE_RIGHT, 13,   0, 319,  14, 126, 0x0,                STR_01FD_CLICK_ON_SERVICE_TO_CENTER},
 {   WIDGETS_END},
 };
 
 static const WindowDesc _subsidies_list_desc = {
-	WDP_AUTO, WDP_AUTO, 630, 127, 630, 127,
+	WDP_AUTO, WDP_AUTO, 320, 127, 630, 127,
 	WC_SUBSIDIES_LIST, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_subsidies_list_widgets,
--- a/src/table/build_industry.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/table/build_industry.h	Mon Dec 03 23:39:38 2007 +0000
@@ -1175,7 +1175,7 @@
 
 #define MI(tbl, sndc, snd, d, pc, ai1, ai2, ai3, ai4, ag1, ag2, ag3, ag4, col, \
            c1, c2, c3, proc, p1, r1, p2, r2, m, a1, im1, a2, im2, a3, im3, pr, clim, bev, in, intx, s1, s2, s3) \
-	 {tbl, lengthof(tbl), min(255, d), d, pc, {c1, c2, c3}, proc, {p1, p2}, {r1, r2}, m,            \
+	 {tbl, lengthof(tbl), min(255, d), 0, d, pc, {c1, c2, c3}, proc, {p1, p2}, {r1, r2}, m,            \
 	 {a1, a2, a3}, {{im1, 0}, {im2, 0}, {im3, 0}}, pr, clim, bev, col, in, intx, s1, s2, s3, {ai1, ai2, ai3, ai4}, {ag1, ag2, ag3, ag4}, \
 	 sndc, snd, 0, 0, true, {INVALID_INDUSTRYTYPE, 0, NULL, NULL, INVALID_INDUSTRYTYPE}}
 	/* Format:
@@ -1193,7 +1193,7 @@
 	   1680, 0xB3333333,                       2, 3, 0, 0,    8, 8, 0, 0,        215,
 	   IT_POWER_STATION,  IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_COAL,       15, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TEMPERATE | 1 << LT_ARCTIC,
 	   INDUSTRYBEH_CAN_SUBSIDENCE,
 	   STR_4802_COAL_MINE,                     STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1203,7 +1203,7 @@
 	   240,  0xFFFFFFFF,                       2, 2, 0, 0,    5, 5, 0, 0,        184,
 	   IT_COAL_MINE,      IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_INVALID,     0, CT_INVALID,       0, 5,
-	   CT_COAL,        0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_COAL,      256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_BLACK_HOLE,                1 << LT_TEMPERATE | 1 << LT_ARCTIC,
 	   INDUSTRYBEH_NONE,
 	   STR_4803_POWER_STATION,                 STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1213,7 +1213,7 @@
 	   224,  0xFFFFFFFF,                       2, 0, 0, 0,    5, 0, 0, 0,        194,
 	   IT_FOREST,         IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_GOODS,       0, CT_INVALID,       0, 5,
-	   CT_WOOD,      256, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_WOOD,      256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_PROCESSING,                1 << LT_TEMPERATE,
 	   INDUSTRYBEH_NONE,
 	   STR_4804_SAWMILL,                       STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1223,7 +1223,7 @@
 	   1600, 0xBFFFFFFF,                       3, 4, 0, 0,    5, 5, 0, 0,         86,
 	   IT_SAWMILL,        IT_PAPER_MILL,       IT_INVALID,       CHECK_FOREST,
 	   CT_WOOD,       13, CT_INVALID,       0, 30,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_ORGANIC,                   1 << LT_TEMPERATE | 1 << LT_ARCTIC,
 	   INDUSTRYBEH_NONE,
 	   STR_4805_FOREST,                        STR_482E_NEW_BEING_PLANTED_NEAR,
@@ -1233,7 +1233,7 @@
 	   244,  0xFFFFFFFF,                       2, 2, 2, 0,    4, 4, 4, 0,        191,
 	   IT_OIL_RIG,        IT_INVALID,          IT_INVALID,       CHECK_REFINERY,
 	   CT_GOODS,       0, CT_INVALID,       0, 5,
-	   CT_OIL,       256, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_OIL,       256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_PROCESSING,                1 << LT_TEMPERATE | 1 << LT_ARCTIC | 1 << LT_TROPIC,
 	   INDUSTRYBEH_AIRPLANE_ATTACKS,
 	   STR_4806_OIL_REFINERY,                  STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1263,7 +1263,7 @@
 	   208,  0xFFFFFFFF,                       0, 2, 0, 0,    0, 5, 0, 0,        174,
 	   IT_PAPER_MILL,     IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_GOODS,       0, CT_INVALID,       0, 5,
-	   CT_PAPER,     256, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_PAPER,     256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_PROCESSING,                1 << LT_ARCTIC,
 	   INDUSTRYBEH_NONE,
 	   STR_4809_PRINTING_WORKS,                STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1273,7 +1273,7 @@
 	   215,  0xFFFFFFFF,                       2, 0, 0, 0,    5, 0, 0, 0,         10,
 	   IT_IRON_MINE,      IT_FACTORY,          IT_INVALID,       CHECK_NOTHING,
 	   CT_STEEL,       0, CT_INVALID,       0, 5,
-	   CT_IRON_ORE,  256, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_IRON_ORE,  256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_PROCESSING,                1 << LT_TEMPERATE,
 	   INDUSTRYBEH_NONE,
 	   STR_480A_STEEL_MILL,                    STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1283,7 +1283,7 @@
 	   2000, 0xD9999999,                       2, 4, 0, 0,    9, 9, 0, 0,         48,
 	   IT_FACTORY,        IT_FOOD_PROCESS,     IT_INVALID,       CHECK_FARM,
 	   CT_GRAIN,      10, CT_LIVESTOCK,    10, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_ORGANIC,                   1 << LT_TEMPERATE | 1 << LT_ARCTIC,
 	   INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT,
 	   STR_480B_FARM,                          STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1293,7 +1293,7 @@
 	   1640, 0xB3333333,                       0, 0, 3, 0,    0, 0, 4, 0,         10,
 	   IT_FACTORY_2,      IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_COPPER_ORE, 10, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TROPIC,
 	   INDUSTRYBEH_NONE,
 	   STR_480C_COPPER_ORE_MINE,               STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1303,7 +1303,7 @@
 	   1760, 0x99999999,                       0, 5, 3, 0,    4, 5, 5, 0,        152,
 	   IT_OIL_REFINERY,   IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_OIL,        12, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TEMPERATE | 1 << LT_ARCTIC | 1 << LT_TROPIC,
 	   INDUSTRYBEH_DONT_INCR_PROD | INDUSTRYBEH_BEFORE_1950,
 	   STR_480D_OIL_WELLS,                     STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1315,7 +1315,7 @@
 	   CT_VALUABLES,   6, CT_INVALID,       0, 5,
 	   CT_VALUABLES,   0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_BLACK_HOLE,                1 << LT_TEMPERATE,
-	   INDUSTRYBEH_TOWN1200_MORE | INDUSTRYBEH_ONLY_INTOWN,
+	   INDUSTRYBEH_TOWN1200_MORE,
 	   STR_480E_BANK,                          STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
@@ -1323,7 +1323,7 @@
 	   206,  0xFFFFFFFF,                       0, 2, 2, 0,    0, 3, 4, 0,         55,
 	   IT_FRUIT_PLANTATION, IT_FARM,           IT_FARM_2,        CHECK_NOTHING,
 	   CT_FOOD,        0, CT_INVALID,       0, 5,
-	   CT_FRUIT,     256, CT_MAIZE,       256, CT_INVALID,     0,
+	   CT_FRUIT,     256, CT_MAIZE,       256, CT_INVALID,   256,
 	   INDUSTRYLIFE_PROCESSING,                1 << LT_ARCTIC | 1 << LT_TROPIC,
 	   INDUSTRYBEH_NONE,
 	   STR_480F_FOOD_PROCESSING_PLANT,         STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1333,7 +1333,7 @@
 	   227,  0xFFFFFFFF,                       0, 2, 0, 0,    0, 5, 0, 0,         10,
 	   IT_FOREST,         IT_PRINTING_WORKS,   IT_INVALID,       CHECK_NOTHING,
 	   CT_PAPER,       0, CT_INVALID,       0, 5,
-	   CT_WOOD,      256, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_WOOD,      256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_PROCESSING,                1 << LT_ARCTIC,
 	   INDUSTRYBEH_NONE,
 	   STR_4810_PAPER_MILL,                    STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1343,7 +1343,7 @@
 	   1664, 0x99999999,                       0, 3, 0, 0,    0, 4, 0, 0,        194,
 	   IT_BANK_TROPIC_ARCTIC, IT_INVALID,      IT_INVALID,       CHECK_NOTHING,
 	   CT_GOLD,        7, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_ARCTIC,
 	   INDUSTRYBEH_NONE,
 	   STR_4811_GOLD_MINE,                     STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1353,7 +1353,7 @@
 	   151,  0xA6666666,                       0, 3, 3, 0,    0, 6, 5, 0,         15,
 	   IT_GOLD_MINE,      IT_DIAMOND_MINE,     IT_INVALID,       CHECK_NOTHING,
 	   CT_INVALID,     0, CT_INVALID,       0, 5,
-	   CT_GOLD,        0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_GOLD,      256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_BLACK_HOLE,                1 << LT_ARCTIC | 1 << LT_TROPIC,
 	   INDUSTRYBEH_ONLY_INTOWN,
 	   STR_4812_BANK,                          STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1363,7 +1363,7 @@
 	   1704, 0x99999999,                       0, 0, 3, 0,    0, 0, 4, 0,        184,
 	   IT_BANK_TROPIC_ARCTIC, IT_INVALID,      IT_INVALID,       CHECK_NOTHING,
 	   CT_DIAMONDS,    7, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TROPIC,
 	   INDUSTRYBEH_NONE,
 	   STR_4813_DIAMOND_MINE,                  STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1373,7 +1373,7 @@
 	   1760, 0xB3333333,                       2, 0, 0, 0,    5, 0, 0, 0,         55,
 	   IT_STEEL_MILL,     IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_IRON_ORE,   10, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TEMPERATE,
 	   INDUSTRYBEH_NONE,
 	   STR_4814_IRON_ORE_MINE,                 STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1383,7 +1383,7 @@
 	   1800, 0xBFFFFFFF,                       0, 0, 2, 0,    0, 0, 4, 0,         86,
 	   IT_FOOD_PROCESS,   IT_INVALID,          IT_INVALID,       CHECK_PLANTATION,
 	   CT_FRUIT,      10, CT_INVALID,       0, 15,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_ORGANIC,                   1 << LT_TROPIC,
 	   INDUSTRYBEH_NONE,
 	   STR_4815_FRUIT_PLANTATION,              STR_482E_NEW_BEING_PLANTED_NEAR,
@@ -1393,7 +1393,7 @@
 	   1744, 0xBFFFFFFF,                       0, 0, 3, 0,    0, 0, 4, 0,         39,
 	   IT_FACTORY_2,      IT_INVALID,          IT_INVALID,       CHECK_PLANTATION,
 	   CT_RUBBER,     10, CT_INVALID,       0, 15,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_ORGANIC,                   1 << LT_TROPIC,
 	   INDUSTRYBEH_NONE,
 	   STR_4816_RUBBER_PLANTATION,             STR_482E_NEW_BEING_PLANTED_NEAR,
@@ -1403,7 +1403,7 @@
 	   1592, 0xB3333333,                       0, 0, 3, 0,    0, 0, 4, 0,         37,
 	   IT_WATER_TOWER,    IT_INVALID,          IT_INVALID,       CHECK_WATER,
 	   CT_WATER,      12, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TROPIC,
 	   INDUSTRYBEH_NONE,
 	   STR_4817_WATER_SUPPLY,                  STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1413,7 +1413,7 @@
 	   115,  0xFFFFFFFF,                       0, 0, 4, 0,    0, 0, 8, 0,        208,
 	   IT_WATER_SUPPLY,   IT_INVALID,          IT_INVALID,       CHECK_WATER,
 	   CT_INVALID,     0, CT_INVALID,       0, 5,
-	   CT_WATER,       0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_WATER,     256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_BLACK_HOLE,                1 << LT_TROPIC,
 	   INDUSTRYBEH_ONLY_INTOWN,
 	   STR_4818_WATER_TOWER,                   STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1433,7 +1433,7 @@
 	   2000, 0xD9999999,                       0, 0, 1, 0,    0, 0, 2, 0,         48,
 	   IT_FOOD_PROCESS,   IT_INVALID,          IT_INVALID,       CHECK_PLANTATION,
 	   CT_MAIZE,      11, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_ORGANIC,                   1 << LT_TROPIC,
 	   INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT,
 	   STR_481A_FARM,                          STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1443,7 +1443,7 @@
 	   135,  0xFFFFFFFF,                       0, 0, 0, 0,    0, 0, 0, 0,        194,
 	   IT_FACTORY_2,      IT_INVALID,          IT_INVALID,       CHECK_LUMBERMILL,
 	   CT_WOOD,        0, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_PROCESSING,                1 << LT_TROPIC,
 	   INDUSTRYBEH_CUT_TREES,
 	   STR_481B_LUMBER_MILL,                   STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1453,7 +1453,7 @@
 	   1560, 0xBFFFFFFF,                       0, 0, 0, 3,    0, 0, 0, 5,         48,
 	   IT_CANDY_FACTORY,  IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_COTTON_CANDY, 13, CT_INVALID,    0, 30,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_ORGANIC,                   1 << LT_TOYLAND,
 	   INDUSTRYBEH_NONE,
 	   STR_481C_COTTON_CANDY_FOREST,           STR_482E_NEW_BEING_PLANTED_NEAR,
@@ -1472,8 +1472,8 @@
 	MI(_tile_table_battery_farm,               0, NULL,
 	   1496, 0xB3333333,                       0, 0, 0, 3,    0, 0, 0, 4,         39,
 	   IT_TOY_FACTORY,    IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
-	   CT_BATTERIES,  11, CT_INVALID,      0, 30,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_BATTERIES,  11, CT_INVALID,       0, 30,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_ORGANIC,                   1 << LT_TOYLAND,
 	   INDUSTRYBEH_NONE,
 	   STR_481E_BATTERY_FARM,                  STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1483,7 +1483,7 @@
 	   1544, 0x99999999,                       0, 0, 0, 3,    0, 0, 0, 5,         55,
 	   IT_FIZZY_DRINK_FACTORY, IT_INVALID,     IT_INVALID,       CHECK_NOTHING,
 	   CT_COLA,       12, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TOYLAND,
 	   INDUSTRYBEH_NONE,
 	   STR_481F_COLA_WELLS,                    STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1493,7 +1493,7 @@
 	   133,  0xFFFFFFFF,                       0, 0, 0, 3,    0, 0, 0, 4,        208,
 	   IT_TOY_FACTORY,    IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_INVALID,     0, CT_INVALID,       0, 5,
-	   CT_TOYS,        0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_TOYS,      256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_BLACK_HOLE,                1 << LT_TOYLAND,
 	   INDUSTRYBEH_ONLY_NEARTOWN,
 	   STR_4820_TOY_SHOP,                      STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1503,7 +1503,7 @@
 	   163,  0xFFFFFFFF,                       0, 0, 0, 3,    0, 0, 0, 5,          10,
 	   IT_PLASTIC_FOUNTAINS, IT_BATTERY_FARM,  IT_TOY_SHOP,     CHECK_NOTHING,
 	   CT_TOYS,        0, CT_INVALID,       0, 5,
-	   CT_PLASTIC,   256, CT_BATTERIES,   256, CT_INVALID,     0,
+	   CT_PLASTIC,   256, CT_BATTERIES,   256, CT_INVALID,   256,
 	   INDUSTRYLIFE_PROCESSING,                1 << LT_TOYLAND,
 	   INDUSTRYBEH_NONE,
 	   STR_4821_TOY_FACTORY,                   STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1513,7 +1513,7 @@
 	   1536, 0xA6666666,                       0, 0, 0, 3,    0, 0, 0, 5,         37,
 	   IT_TOY_FACTORY,    IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_PLASTIC,    14, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TOYLAND,
 	   INDUSTRYBEH_NONE,
 	   STR_4822_PLASTIC_FOUNTAINS,             STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1523,7 +1523,7 @@
 	   177,  0xFFFFFFFF,                       0, 0, 0, 3,    0, 0, 0, 4,        184,
 	   IT_COLA_WELLS,     IT_BUBBLE_GENERATOR, IT_INVALID,       CHECK_NOTHING,
 	   CT_FIZZY_DRINKS, 0, CT_INVALID,      0, 5,
-	   CT_COLA,       256, CT_BUBBLES,    256, CT_INVALID,     0,
+	   CT_COLA,       256, CT_BUBBLES,    256, CT_INVALID,   256,
 	   INDUSTRYLIFE_PROCESSING,                1 << LT_TOYLAND,
 	   INDUSTRYBEH_NONE,
 	   STR_4823_FIZZY_DRINK_FACTORY,           STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1533,7 +1533,7 @@
 	   1624, 0xB3333333,                       0, 0, 0, 3,    0, 0, 0, 5,        152,
 	   IT_FIZZY_DRINK_FACTORY, IT_INVALID,     IT_INVALID,       CHECK_BUBBLEGEN,
 	   CT_BUBBLES,    13, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TOYLAND,
 	   INDUSTRYBEH_NONE,
 	   STR_4824_BUBBLE_GENERATOR,              STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1543,7 +1543,7 @@
 	   1704, 0xCCCCCCCC,                       0, 0, 0, 3,    0, 0, 0, 5,        194,
 	   IT_CANDY_FACTORY,  IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_TOFFEE,     10, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TOYLAND,
 	   INDUSTRYBEH_NONE,
 	   STR_4825_TOFFEE_QUARRY,                 STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1553,7 +1553,7 @@
 	   1680, 0xBFFFFFFF,                       0, 0, 0, 2,    0, 0, 0, 4,         15,
 	   IT_CANDY_FACTORY,  IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_SUGAR,      11, CT_INVALID,       0, 5,
-	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   CT_INVALID,   256, CT_INVALID,     256, CT_INVALID,   256,
 	   INDUSTRYLIFE_EXTRACTIVE,                1 << LT_TOYLAND,
 	   INDUSTRYBEH_NONE,
 	   STR_4826_SUGAR_MINE,                    STR_482D_NEW_UNDER_CONSTRUCTION,
@@ -1576,251 +1576,251 @@
 #define MT(ca1, c1, ca2, c2, ca3, c3, sl, a1, a2, a3) {{c1, c2, c3}, {ca1, ca2, ca3}, sl, a1, a2, a3, 0, 0xFFFF, 2, 0, 0, true, {INVALID_INDUSTRYTILE, 0, NULL, NULL, INVALID_INDUSTRYTILE}}
 static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET] = {
 	/* Coal Mine */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, true),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Power Station */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_COAL,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   8, CT_COAL,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Sawmill */
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1, CT_PASSENGERS,   0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   8, CT_WOOD,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Forest Artic, temperate */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,                   17,  INDUSTRYTILE_NOANIM,   false), ///< Chopping forest
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,                   16,   false), ///< Growing forest
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP,                  17, INDUSTRYTILE_NOANIM, false), ///< Chopping forest
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM,                  16, false), ///< Growing forest
 
 	/* Oil refinery */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_OIL,        SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_OIL,          0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
-	/* oil Rig */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PASSENGERS, SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_MAIL,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	/* Oil Rig */
+	MT(0, CT_INVALID,      8, CT_PASSENGERS,   0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_MAIL,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
-	/* Oil Wells artic, temperate */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
+	/* Oil Wells artic, temperate and sub-tropical */
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, true ),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, true ),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, true ),
 
 	/* Farm tropic, arctic and temperate */
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1, CT_PASSENGERS,   0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Factory temperate */
-	MT(8,  CT_GRAIN,        8,  CT_STEEL,     8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_GRAIN,        8,  CT_STEEL,     8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_GRAIN,        8,  CT_STEEL,     8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_GRAIN,        8,  CT_STEEL,     8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8, CT_GRAIN,        8, CT_LIVESTOCK,    8, CT_STEEL,       SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_GRAIN,        8, CT_LIVESTOCK,    8, CT_STEEL,       SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_GRAIN,        8, CT_LIVESTOCK,    8, CT_STEEL,       SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_GRAIN,        8, CT_LIVESTOCK,    8, CT_STEEL,       SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Printing works */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PAPER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PAPER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PAPER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PAPER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      8, CT_PAPER,        0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_PAPER,        0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_PAPER,        0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_PAPER,        0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Copper ore mine */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, true ),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Steel mill */
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1, CT_PASSENGERS,   8, CT_IRON_ORE,     0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   8, CT_IRON_ORE,     0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   8, CT_IRON_ORE,     0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   8, CT_IRON_ORE,     0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   8, CT_IRON_ORE,     0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   8, CT_IRON_ORE,     0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Bank temperate*/
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_VALUABLES,  SLOPE_E,      INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_VALUABLES,  SLOPE_S,      INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1, CT_PASSENGERS,   8, CT_VALUABLES,    0, CT_INVALID,     SLOPE_E,     INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(1, CT_PASSENGERS,   8, CT_VALUABLES,    0, CT_INVALID,     SLOPE_S,     INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Food processing plant, tropic and arctic. CT_MAIZE or CT_WHEAT, CT_LIVESTOCK or CT_FRUIT*/
-	MT(8,  CT_MAIZE,        0,  CT_INVALID,   8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_MAIZE,        0,  CT_INVALID,   8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_MAIZE,        0,  CT_INVALID,   8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_MAIZE,        0,  CT_INVALID,   8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8, CT_MAIZE,        8, CT_LIVESTOCK,    0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_MAIZE,        8, CT_LIVESTOCK,    0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_MAIZE,        8, CT_LIVESTOCK,    0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_MAIZE,        8, CT_LIVESTOCK,    0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Paper mill */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      8, CT_WOOD,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_WOOD,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_WOOD,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_WOOD,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_WOOD,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_WOOD,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_WOOD,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_WOOD,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Gold mine */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, true ),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Bank Sub Arctic */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_GOLD,       SLOPE_E,      INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_GOLD,       SLOPE_S,      INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      8, CT_GOLD,         0, CT_INVALID,     SLOPE_E,     INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_GOLD,         0, CT_INVALID,     SLOPE_S,     INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Diamond mine */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Iron ore Mine */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Fruit plantation */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Rubber plantation */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Water supply */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Water tower */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WATER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      8, CT_WATER,        0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Factory (sub-tropical) */
-	MT(8,  CT_COPPER_ORE,   8,  CT_WOOD,      8,  CT_RUBBER,     SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_COPPER_ORE,   8,  CT_WOOD,      8,  CT_RUBBER,     SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_COPPER_ORE,   8,  CT_WOOD,      8,  CT_RUBBER,     SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_COPPER_ORE,   8,  CT_WOOD,      8,  CT_RUBBER,     SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8, CT_COPPER_ORE,   8, CT_RUBBER,       8, CT_WOOD,        SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_COPPER_ORE,   8, CT_RUBBER,       8, CT_WOOD,        SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_COPPER_ORE,   8, CT_RUBBER,       8, CT_WOOD,        SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_COPPER_ORE,   8, CT_RUBBER,       8, CT_WOOD,        SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Lumber mill */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Candyfloss forest */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,                  130,   INDUSTRYTILE_NOANIM,  false), ///< Chopping candyfloss
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,                   129,  false), ///< Growing candyfloss
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP,                 130, INDUSTRYTILE_NOANIM, false), ///< Chopping candyfloss
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM,                 129, false), ///< Growing candyfloss
 
 	/* Sweet factory */
-	MT(8,  CT_COTTON_CANDY, 8,  CT_TOFFEE,    8,  CT_SUGAR,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_COTTON_CANDY, 8,  CT_TOFFEE,    8,  CT_SUGAR,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_COTTON_CANDY, 8,  CT_TOFFEE,    8,  CT_SUGAR,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_COTTON_CANDY, 8,  CT_TOFFEE,    8,  CT_SUGAR,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8, CT_COTTON_CANDY, 8, CT_TOFFEE,       8, CT_SUGAR,       SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_COTTON_CANDY, 8, CT_TOFFEE,       8, CT_SUGAR,       SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_COTTON_CANDY, 8, CT_TOFFEE,       8, CT_SUGAR,       SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_COTTON_CANDY, 8, CT_TOFFEE,       8, CT_SUGAR,       SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
-	/* Batter farm */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,                  136,   INDUSTRYTILE_NOANIM,  false), ///< Reaping batteries
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,                   135,  false), ///< Growing batteries
+	/* Battery farm */
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP,                 136, INDUSTRYTILE_NOANIM, false), ///< Reaping batteries
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM,                 135, false), ///< Growing batteries
 
 	/* Cola wells */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Toy shop */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_TOYS,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_TOYS,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_TOYS,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_TOYS,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      8, CT_TOYS,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_TOYS,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_TOYS,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      8, CT_TOYS,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Toy factory */
-	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8, CT_BATTERIES,    8, CT_PLASTIC,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_BATTERIES,    8, CT_PLASTIC,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_BATTERIES,    8, CT_PLASTIC,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_BATTERIES,    8, CT_PLASTIC,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_BATTERIES,    8, CT_PLASTIC,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_BATTERIES,    8, CT_PLASTIC,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Plastic Fountain */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Fizzy drink factory */
-	MT(8,  CT_BUBBLES,      0,  CT_INVALID,   8,  CT_COLA,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_BUBBLES,      0,  CT_INVALID,   8,  CT_COLA,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_BUBBLES,      0,  CT_INVALID,   8,  CT_COLA,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(8,  CT_BUBBLES,      0,  CT_INVALID,   8,  CT_COLA,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8, CT_BUBBLES,      8, CT_COLA,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_BUBBLES,      8, CT_COLA,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_BUBBLES,      8, CT_COLA,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(8, CT_BUBBLES,      8, CT_COLA,         0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Bubble generator */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Toffee quarry */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 
 	/* Sugar mine */
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
-	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+	MT(0, CT_INVALID,      0, CT_INVALID,      0, CT_INVALID,     SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
 };
 #undef MT
 
--- a/src/table/cargo_const.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/table/cargo_const.h	Mon Dec 03 23:39:38 2007 +0000
@@ -114,7 +114,7 @@
 		SPR_CARGO_BATTERIES,     CC_PIECE_GOODS ),
 
 	MK( 20, 'SWET', 194,  5, 6144,  8,  40, true,  TE_GOODS,
-		STR_0026_CANDY,          STR_0046_CANDY,          STR_TONS,       STR_QUANTITY_SWEETS,       STR_ABBREV_SWEETS,
+		STR_0026_CANDY,          STR_0046_CANDY,          STR_BAGS,       STR_QUANTITY_SWEETS,       STR_ABBREV_SWEETS,
 		SPR_CARGO_CANDY,         CC_EXPRESS     ),
 
 	MK( 21, 'TOFF', 191, 16, 4778, 14,  60, true,  TE_NONE,
--- a/src/table/files.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/table/files.h	Mon Dec 03 23:39:38 2007 +0000
@@ -26,44 +26,27 @@
 static FileList files_dos = {
 	{
 		{ "TRG1.GRF",      {0x93, 0x11, 0x67, 0x62, 0x80, 0xe5, 0xb1, 0x40, 0x77, 0xa8, 0xee, 0x41, 0xc1, 0xb4, 0x21, 0x92} }, //    0 - 4792 inclusive
-		{ "TRGI.GRF",      {0xda, 0x6a, 0x6c, 0x9d, 0xcc, 0x45, 0x1e, 0xec, 0x88, 0xd7, 0x92, 0x11, 0x43, 0x7b, 0x76, 0xa8} }, // 4793 - 4889 inclusive
-		{ "dosdummy.grf",  {0x07, 0x01, 0xe6, 0xc4, 0x07, 0x6a, 0x5b, 0xc3, 0xf4, 0x9f, 0x01, 0xad, 0x21, 0x6c, 0xa0, 0xc2} }, // 4890 - 4895 inclusive
-		{ NULL, { 0 } }
+		{ "TRGI.GRF",      {0xda, 0x6a, 0x6c, 0x9d, 0xcc, 0x45, 0x1e, 0xec, 0x88, 0xd7, 0x92, 0x11, 0x43, 0x7b, 0x76, 0xa8} }  // 4793 - 4889 inclusive
 	}, {
 		{ "TRGC.GRF",      {0xed, 0x44, 0x66, 0x37, 0xe0, 0x34, 0x10, 0x4c, 0x55, 0x59, 0xb3, 0x2c, 0x18, 0xaf, 0xe7, 0x8d} },
 		{ "TRGH.GRF",      {0xee, 0x66, 0x16, 0xfb, 0x0e, 0x6e, 0xf6, 0xb2, 0x48, 0x92, 0xc5, 0x8c, 0x93, 0xd8, 0x6f, 0xc9} },
 		{ "TRGT.GRF",      {0xfc, 0xde, 0x1d, 0x7e, 0x8a, 0x74, 0x19, 0x7d, 0x72, 0xa6, 0x26, 0x95, 0x88, 0x4b, 0x90, 0x9e} }
-	}
+	},
+	{ "SAMPLE.CAT",    {0x42, 0x2e, 0xa3, 0xdd, 0x07, 0x4d, 0x28, 0x59, 0xbb, 0x51, 0x63, 0x9a, 0x6e, 0x0e, 0x85, 0xda} },
+	{ "CHARS.GRF",     {0x5f, 0x2e, 0xbf, 0x05, 0xb6, 0x12, 0x65, 0x81, 0xd2, 0x10, 0xa9, 0x19, 0x62, 0x41, 0x70, 0x64} },
+	{ "OPENTTDD.GRF",  {0x13, 0xb0, 0x8b, 0xfd, 0x01, 0x16, 0x41, 0x0a, 0x0a, 0x35, 0x97, 0x89, 0xd1, 0x5c, 0x83, 0x2e} }
 };
 
 static FileList files_win = {
 	{
 		{ "TRG1R.GRF",     {0xb0, 0x4c, 0xe5, 0x93, 0xd8, 0xc5, 0x01, 0x6e, 0x07, 0x47, 0x3a, 0x74, 0x3d, 0x7d, 0x33, 0x58} }, //    0 - 4792 inclusive
-		{ "TRGIR.GRF",     {0x0c, 0x24, 0x84, 0xff, 0x6b, 0xe4, 0x9f, 0xc6, 0x3a, 0x83, 0xbe, 0x6a, 0xb5, 0xc3, 0x8f, 0x32} }, // 4793 - 4895 inclusive
-		{ NULL, { 0 } },
-		{ NULL, { 0 } }
+		{ "TRGIR.GRF",     {0x0c, 0x24, 0x84, 0xff, 0x6b, 0xe4, 0x9f, 0xc6, 0x3a, 0x83, 0xbe, 0x6a, 0xb5, 0xc3, 0x8f, 0x32} }  // 4793 - 4895 inclusive
 	}, {
 		{ "TRGCR.GRF",     {0x36, 0x68, 0xf4, 0x10, 0xc7, 0x61, 0xa0, 0x50, 0xb5, 0xe7, 0x09, 0x5a, 0x2b, 0x14, 0x87, 0x9b} },
 		{ "TRGHR.GRF",     {0x06, 0xbf, 0x2b, 0x7a, 0x31, 0x76, 0x6f, 0x04, 0x8b, 0xaa, 0xc2, 0xeb, 0xe4, 0x34, 0x57, 0xb1} },
 		{ "TRGTR.GRF",     {0xde, 0x53, 0x65, 0x05, 0x17, 0xfe, 0x66, 0x1c, 0xea, 0xa3, 0x13, 0x8c, 0x6e, 0xdb, 0x0e, 0xb8} }
-	}
+	},
+	{ "SAMPLE.CAT",    {0x92, 0x12, 0xe8, 0x1e, 0x72, 0xba, 0xdd, 0x4b, 0xbe, 0x1e, 0xae, 0xae, 0x66, 0x45, 0x8e, 0x10} },
+	{ "CHARS.GRF",     {0x5f, 0x2e, 0xbf, 0x05, 0xb6, 0x12, 0x65, 0x81, 0xd2, 0x10, 0xa9, 0x19, 0x62, 0x41, 0x70, 0x64} },
+	{ "OPENTTDW.GRF",  {0x93, 0xb5, 0x07, 0xe7, 0x53, 0xfd, 0x7f, 0x0b, 0x91, 0x40, 0xfe, 0x1f, 0xa2, 0x66, 0xeb, 0xf8} }
 };
-
-static MD5File sample_cat_win = { "SAMPLE.CAT", {0x92, 0x12, 0xe8, 0x1e, 0x72, 0xba, 0xdd, 0x4b, 0xbe, 0x1e, 0xae, 0xae, 0x66, 0x45, 0x8e, 0x10} };
-static MD5File sample_cat_dos = { "SAMPLE.CAT", {0x42, 0x2e, 0xa3, 0xdd, 0x07, 0x4d, 0x28, 0x59, 0xbb, 0x51, 0x63, 0x9a, 0x6e, 0x0e, 0x85, 0xda} };
-
-static MD5File files_openttd[] = {
-	{ "nsignalsw.grf", { 0x65, 0xb9, 0xd7, 0x30, 0x56, 0x06, 0xcc, 0x9e, 0x27, 0x57, 0xc8, 0xe4, 0x9b, 0xb3, 0x66, 0x81 } },
-	{ "2ccmap.grf",    { 0x20, 0x03, 0x32, 0x1a, 0x43, 0x6c, 0xc1, 0x05, 0x80, 0xbd, 0x43, 0xeb, 0xe1, 0xfd, 0x0c, 0x62 } },
-	{ "airports.grf",  { 0x05, 0x4f, 0x81, 0xef, 0x20, 0x55, 0xa4, 0x65, 0x22, 0x7a, 0x09, 0x58, 0xdd, 0x6f, 0x88, 0x75 } },
-	{ "autorail.grf",  { 0xed, 0x44, 0x7f, 0xbb, 0x19, 0x44, 0x48, 0x4c, 0x07, 0x8a, 0xb1, 0xc1, 0x5c, 0x12, 0x3a, 0x60 } },
-	{ "canalsw.grf",   { 0x13, 0x9c, 0x98, 0xcf, 0xb8, 0x7c, 0xd7, 0x1f, 0xca, 0x34, 0xa5, 0x6b, 0x65, 0x31, 0xec, 0x0f } },
-	{ "elrailsw.grf",  { 0x4f, 0xf9, 0xac, 0x79, 0x50, 0x28, 0x9b, 0xe2, 0x15, 0x30, 0xa8, 0x1e, 0xd5, 0xfd, 0xe1, 0xda } },
-	{ "openttd.grf",   { 0x20, 0x64, 0x4a, 0xf6, 0x75, 0x26, 0x5b, 0x92, 0xbb, 0x6f, 0x8d, 0x0e, 0x34, 0x7e, 0xa6, 0xe3 } },
-	{ "trkfoundw.grf", { 0x12, 0x33, 0x3f, 0xa3, 0xd1, 0x86, 0x8b, 0x04, 0x53, 0x18, 0x9c, 0xee, 0xf9, 0x2d, 0xf5, 0x95 } },
-	{ "roadstops.grf", { 0xa1, 0x5b, 0xb3, 0x52, 0x60, 0x12, 0x3c, 0xb7, 0x7b, 0x73, 0x09, 0xc1, 0x1a, 0xb4, 0xd0, 0xb8 } },
-	{ "group.grf",     { 0xe8, 0x52, 0x5f, 0x1c, 0x3e, 0xf9, 0x91, 0x9d, 0x0f, 0x70, 0x8c, 0x8a, 0x21, 0xa4, 0xc7, 0x02 } },
-	{ "tramtrkw.grf",  { 0x83, 0x0a, 0xf4, 0x9f, 0x29, 0x10, 0x48, 0xfd, 0x76, 0xe9, 0xda, 0xac, 0x5d, 0xa2, 0x30, 0x45 } },
-	{ "oneway.grf",    { 0xbb, 0xc6, 0xa3, 0xb2, 0xb3, 0xa0, 0xc9, 0x3c, 0xc9, 0xee, 0x24, 0x7c, 0xb6, 0x51, 0x74, 0x63 } },
-	{ "flags.grf",     { 0xa1, 0xd7, 0x72, 0x75, 0x0e, 0x81, 0x86, 0x0e, 0xc9, 0xcd, 0xc2, 0x57, 0xb2, 0x19, 0xe1, 0x0c } },
-};
--- a/src/table/landscape_sprite.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/table/landscape_sprite.h	Mon Dec 03 23:39:38 2007 +0000
@@ -1,5 +1,10 @@
 /* $Id$ */
 
+enum {
+	SKIP = 0xFFFE,
+	END  = 0xFFFF
+};
+
 static const SpriteID _landscape_spriteindexes_1[] = {
  0xF67,  0xF9F,
  0xAAD,  0xAB0,
@@ -132,36 +137,3 @@
  0x322,  0x322,
 END
 };
-
-
-/* Slope graphics indexes temperate climate
-Skip first 3 sprites and only load the proper set */
-static const SpriteID _slopes_spriteindexes_0[] = {
-	SKIP, 3,
-	SPR_SLOPES_BASE, SPR_SLOPES_BASE + 73,
-	END
-};
-
-/* Slope graphics indexes arctic climate
-Skip first 79 sprites and only load the proper set */
-static const SpriteID _slopes_spriteindexes_1[] = {
-	SKIP, 79,
-	SPR_SLOPES_BASE, SPR_SLOPES_BASE + 73,
-	END
-};
-
-/* Slope graphics indexes tropical climate
-Skip first 155 sprites and only load the proper set */
-static const SpriteID _slopes_spriteindexes_2[] = {
-	SKIP, 155,
-	SPR_SLOPES_BASE, SPR_SLOPES_BASE + 73,
-	END
-};
-
-/* Slope graphics indexes toyland climate
-Skip first 231 sprites and only load the proper set */
-static const SpriteID _slopes_spriteindexes_3[] = {
-	SKIP, 231,
-	SPR_SLOPES_BASE, SPR_SLOPES_BASE + 73,
-	END
-};
--- a/src/table/roadveh.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/table/roadveh.h	Mon Dec 03 23:39:38 2007 +0000
@@ -1099,6 +1099,7 @@
 	{ 0, 7},
 	{ 0, 8},
 	{ 0, 9},
+	{RDE_TURNED | DIAGDIR_SW, 0},
 	{ 1, 9},
 	{ 2, 9},
 	{ 3, 9},
@@ -1138,6 +1139,7 @@
 	{ 0, 7},
 	{ 0, 6},
 	{ 0, 5},
+	{RDE_TURNED | DIAGDIR_SW, 0},
 	{ 1, 5},
 	{ 2, 5},
 	{ 3, 5},
@@ -1177,6 +1179,7 @@
 	{7, 15},
 	{8, 15},
 	{9, 15},
+	{RDE_TURNED | DIAGDIR_NW, 0},
 	{9, 14},
 	{9, 13},
 	{9, 12},
@@ -1216,6 +1219,7 @@
 	{7, 15},
 	{6, 15},
 	{5, 15},
+	{RDE_TURNED | DIAGDIR_NW, 0},
 	{5, 14},
 	{5, 13},
 	{5, 12},
@@ -1255,6 +1259,7 @@
 	{15, 7},
 	{15, 6},
 	{15, 5},
+	{RDE_TURNED | DIAGDIR_SW, 0},
 	{14, 5},
 	{13, 5},
 	{12, 5},
@@ -1293,6 +1298,7 @@
 	{15, 7},
 	{15, 8},
 	{15, 9},
+	{RDE_TURNED | DIAGDIR_NE, 0},
 	{14, 9},
 	{13, 9},
 	{12, 9},
@@ -1332,6 +1338,7 @@
 	{7,  0},
 	{6,  0},
 	{5,  0},
+	{RDE_TURNED | DIAGDIR_SE, 0},
 	{5,  1},
 	{5,  2},
 	{5,  3},
@@ -1370,6 +1377,7 @@
 	{7,  0},
 	{8,  0},
 	{9,  0},
+	{RDE_TURNED | DIAGDIR_SE, 0},
 	{9,  1},
 	{9,  2},
 	{9,  3},
--- a/src/table/sprites.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/table/sprites.h	Mon Dec 03 23:39:38 2007 +0000
@@ -10,9 +10,6 @@
  *
  * @NOTE:
  * ALL SPRITE NUMBERS BELOW 5126 are in the main files
- * SPR_CANALS_BASE is in canalsw.grf
- * SPR_SLOPES_BASE is in trkfoundw.grf
- * SPR_OPENTTD_BASE is in openttd.grf
  *
  * All elements which consist of two elements should
  * have the same name and then suffixes
@@ -46,125 +43,142 @@
 	SPR_ASCII_SPACE_SMALL = 226,
 	SPR_ASCII_SPACE_BIG   = 450,
 
-	/* Extra graphic spritenumbers */
-	OPENTTD_SPRITES_COUNT = 112, // number of gfx-sprites in openttd.grf
-	SPR_SIGNALS_BASE  = 4896,
-	SPR_CANALS_BASE   = SPR_SIGNALS_BASE + 486,
-
-	SPR_SLOPES_BASE                    = SPR_CANALS_BASE + 70,
-	SPR_SLOPES_INCLINED_OFFSET         = 15,
-	SPR_SLOPES_VIRTUAL_BASE            = SPR_SLOPES_BASE - SPR_SLOPES_INCLINED_OFFSET, // The original foundations (see SPR_FOUNDATION_BASE below) are mapped before the additional foundations.
-	SPR_SLOPES_NO_FOUNDATION_NW_OFFSET = 22, // no wall on the NW edge of the tile.
-	SPR_SLOPES_NO_FOUNDATION_NE_OFFSET = 44, // no wall on the NE edge of the tile.
+	SPR_LARGE_SMALL_WINDOW = 682,
 
-	SPR_AUTORAIL_BASE = SPR_SLOPES_BASE + 78,
-	SPR_ELRAIL_BASE   = SPR_AUTORAIL_BASE + 55,
-	SPR_2CCMAP_BASE   = SPR_ELRAIL_BASE + 53,
-	SPR_OPENTTD_BASE  = SPR_2CCMAP_BASE + 256,
-
-	SPR_BLOT = SPR_OPENTTD_BASE + 29, // colored circle (mainly used as vehicle profit marker and for sever compatibility)
+	/* Extra graphic spritenumbers */
+	SPR_OPENTTD_BASE     = 4896,
+	OPENTTD_SPRITE_COUNT = 136,
 
-	SPR_PIN_UP        = SPR_OPENTTD_BASE + 55,   // pin icon
-	SPR_PIN_DOWN      = SPR_OPENTTD_BASE + 56,
-	SPR_BOX_EMPTY     = SPR_OPENTTD_BASE + 59,
-	SPR_BOX_CHECKED   = SPR_OPENTTD_BASE + 60,
-	SPR_WINDOW_RESIZE = SPR_OPENTTD_BASE + 82,   // resize icon
-	SPR_HOUSE_ICON    = SPR_OPENTTD_BASE + 89,
-	// arrow icons pointing in all 4 directions
-	SPR_ARROW_DOWN    = SPR_OPENTTD_BASE + 83,
-	SPR_ARROW_UP      = SPR_OPENTTD_BASE + 84,
-	SPR_ARROW_LEFT    = SPR_OPENTTD_BASE + 85,
-	SPR_ARROW_RIGHT   = SPR_OPENTTD_BASE + 86,
+	/* Halftile-selection sprites */
+	SPR_HALFTILE_SELECTION_FLAT = SPR_OPENTTD_BASE,
+	SPR_HALFTILE_SELECTION_DOWN = SPR_OPENTTD_BASE + 4,
+	SPR_HALFTILE_SELECTION_UP   = SPR_OPENTTD_BASE + 8,
 
-	SPR_LARGE_SMALL_WINDOW = 682,
+	SPR_SQUARE             = SPR_OPENTTD_BASE + 38, // colored square (used for newgrf compatibility)
+	SPR_BLOT               = SPR_OPENTTD_BASE + 39, // colored circle (mainly used as vehicle profit marker and for server compatibility)
+	SPR_LOCK               = SPR_OPENTTD_BASE + 40, // lock icon (for password protected servers)
+	SPR_BOX_EMPTY          = SPR_OPENTTD_BASE + 41,
+	SPR_BOX_CHECKED        = SPR_OPENTTD_BASE + 42,
+	SPR_WARNING_SIGN       = SPR_OPENTTD_BASE + 43, // warning sign (shown if there are any newgrf errors)
+	SPR_WINDOW_RESIZE      = SPR_OPENTTD_BASE + 44, // resize icon
+	/* Arrow icons pointing in all 4 directions */
+	SPR_ARROW_DOWN         = SPR_OPENTTD_BASE + 45,
+	SPR_ARROW_UP           = SPR_OPENTTD_BASE + 46,
+	SPR_ARROW_LEFT         = SPR_OPENTTD_BASE + 47,
+	SPR_ARROW_RIGHT        = SPR_OPENTTD_BASE + 48,
+	SPR_HOUSE_ICON         = SPR_OPENTTD_BASE + 49,
+	SPR_SHARED_ORDERS_ICON = SPR_OPENTTD_BASE + 50,
+	SPR_PIN_UP             = SPR_OPENTTD_BASE + 51,   // pin icon
+	SPR_PIN_DOWN           = SPR_OPENTTD_BASE + 52,
 
 	/* Clone vehicles stuff */
-	SPR_CLONE_TRAIN    = SPR_OPENTTD_BASE + 87,
-	SPR_CLONE_ROADVEH  = SPR_OPENTTD_BASE + 104,
-	SPR_CLONE_SHIP     = SPR_OPENTTD_BASE + 106,
-	SPR_CLONE_AIRCRAFT = SPR_OPENTTD_BASE + 108,
-
-	SPR_SELL_TRAIN        = SPR_OPENTTD_BASE + 91,
-	SPR_SELL_ROADVEH      = SPR_OPENTTD_BASE + 92,
-	SPR_SELL_SHIP         = SPR_OPENTTD_BASE + 93,
-	SPR_SELL_AIRCRAFT     = SPR_OPENTTD_BASE + 94,
-	SPR_SELL_ALL_TRAIN    = SPR_OPENTTD_BASE + 95,
-	SPR_SELL_ALL_ROADVEH  = SPR_OPENTTD_BASE + 96,
-	SPR_SELL_ALL_SHIP     = SPR_OPENTTD_BASE + 97,
-	SPR_SELL_ALL_AIRCRAFT = SPR_OPENTTD_BASE + 98,
-	SPR_REPLACE_TRAIN     = SPR_OPENTTD_BASE + 99,
-	SPR_REPLACE_ROADVEH   = SPR_OPENTTD_BASE + 100,
-	SPR_REPLACE_SHIP      = SPR_OPENTTD_BASE + 101,
-	SPR_REPLACE_AIRCRAFT  = SPR_OPENTTD_BASE + 102,
-	SPR_SELL_CHAIN_TRAIN  = SPR_OPENTTD_BASE + 103,
-
-	SPR_SHARED_ORDERS_ICON = SPR_OPENTTD_BASE + 110,
+	SPR_CLONE_TRAIN    = SPR_OPENTTD_BASE + 106,
+	SPR_CLONE_ROADVEH  = SPR_OPENTTD_BASE + 107,
+	SPR_CLONE_SHIP     = SPR_OPENTTD_BASE + 108,
+	SPR_CLONE_AIRCRAFT = SPR_OPENTTD_BASE + 109,
 
-	SPR_WARNING_SIGN      = SPR_OPENTTD_BASE + 111, // warning sign (shown if there are any newgrf errors)
-
-	/* Network GUI sprites */
-	SPR_SQUARE = SPR_OPENTTD_BASE + 20,     // colored square (used for newgrf compatibility)
-	SPR_LOCK = SPR_OPENTTD_BASE + 19,       // lock icon (for password protected servers)
+	SPR_SELL_TRAIN        = SPR_OPENTTD_BASE +  93,
+	SPR_SELL_ROADVEH      = SPR_OPENTTD_BASE +  94,
+	SPR_SELL_SHIP         = SPR_OPENTTD_BASE +  95,
+	SPR_SELL_AIRCRAFT     = SPR_OPENTTD_BASE +  96,
+	SPR_SELL_ALL_TRAIN    = SPR_OPENTTD_BASE +  97,
+	SPR_SELL_ALL_ROADVEH  = SPR_OPENTTD_BASE +  98,
+	SPR_SELL_ALL_SHIP     = SPR_OPENTTD_BASE +  99,
+	SPR_SELL_ALL_AIRCRAFT = SPR_OPENTTD_BASE + 100,
+	SPR_REPLACE_TRAIN     = SPR_OPENTTD_BASE + 101,
+	SPR_REPLACE_ROADVEH   = SPR_OPENTTD_BASE + 102,
+	SPR_REPLACE_SHIP      = SPR_OPENTTD_BASE + 103,
+	SPR_REPLACE_AIRCRAFT  = SPR_OPENTTD_BASE + 104,
+	SPR_SELL_CHAIN_TRAIN  = SPR_OPENTTD_BASE + 105,
 
-	SPR_AIRPORTX_BASE = SPR_OPENTTD_BASE + OPENTTD_SPRITES_COUNT, // The sprites used for other airport angles
-	SPR_NEWAIRPORT_TARMAC = SPR_AIRPORTX_BASE,
-	SPR_NSRUNWAY1 = SPR_AIRPORTX_BASE + 1,
-	SPR_NSRUNWAY2 = SPR_AIRPORTX_BASE + 2,
-	SPR_NSRUNWAY3 = SPR_AIRPORTX_BASE + 3,
-	SPR_NSRUNWAY4 = SPR_AIRPORTX_BASE + 4,
-	SPR_NSRUNWAY_END = SPR_AIRPORTX_BASE + 5,
-	SPR_NEWHANGAR_S = SPR_AIRPORTX_BASE + 6,
-	SPR_NEWHANGAR_S_WALL = SPR_AIRPORTX_BASE + 7,
-	SPR_NEWHANGAR_W = SPR_AIRPORTX_BASE + 8,
-	SPR_NEWHANGAR_W_WALL = SPR_AIRPORTX_BASE + 9,
-	SPR_NEWHANGAR_N = SPR_AIRPORTX_BASE + 10,
-	SPR_NEWHANGAR_E = SPR_AIRPORTX_BASE + 11,
-	SPR_NEWHELIPAD = SPR_AIRPORTX_BASE + 12,
-	SPR_GRASS_RIGHT = SPR_AIRPORTX_BASE + 13,
-	SPR_GRASS_LEFT = SPR_AIRPORTX_BASE + 14,
+	SPR_GROUP_CREATE_TRAIN         = SPR_OPENTTD_BASE + 114,
+	SPR_GROUP_CREATE_ROADVEH       = SPR_OPENTTD_BASE + 115,
+	SPR_GROUP_CREATE_SHIP          = SPR_OPENTTD_BASE + 116,
+	SPR_GROUP_CREATE_AIRCRAFT      = SPR_OPENTTD_BASE + 117,
+	SPR_GROUP_DELETE_TRAIN         = SPR_OPENTTD_BASE + 118,
+	SPR_GROUP_DELETE_ROADVEH       = SPR_OPENTTD_BASE + 119,
+	SPR_GROUP_DELETE_SHIP          = SPR_OPENTTD_BASE + 120,
+	SPR_GROUP_DELETE_AIRCRAFT      = SPR_OPENTTD_BASE + 121,
+	SPR_GROUP_RENAME_TRAIN         = SPR_OPENTTD_BASE + 122,
+	SPR_GROUP_RENAME_ROADVEH       = SPR_OPENTTD_BASE + 123,
+	SPR_GROUP_RENAME_SHIP          = SPR_OPENTTD_BASE + 124,
+	SPR_GROUP_RENAME_AIRCRAFT      = SPR_OPENTTD_BASE + 125,
+	SPR_GROUP_REPLACE_ON_TRAIN     = SPR_OPENTTD_BASE + 126,
+	SPR_GROUP_REPLACE_ON_ROADVEH   = SPR_OPENTTD_BASE + 127,
+	SPR_GROUP_REPLACE_ON_SHIP      = SPR_OPENTTD_BASE + 128,
+	SPR_GROUP_REPLACE_ON_AIRCRAFT  = SPR_OPENTTD_BASE + 129,
+	SPR_GROUP_REPLACE_OFF_TRAIN    = SPR_OPENTTD_BASE + 130,
+	SPR_GROUP_REPLACE_OFF_ROADVEH  = SPR_OPENTTD_BASE + 131,
+	SPR_GROUP_REPLACE_OFF_SHIP     = SPR_OPENTTD_BASE + 132,
+	SPR_GROUP_REPLACE_OFF_AIRCRAFT = SPR_OPENTTD_BASE + 133,
+
+	SPR_SIGNALS_BASE  = SPR_OPENTTD_BASE + OPENTTD_SPRITE_COUNT,
+	PRESIGNAL_SPRITE_COUNT                   =  48,
+	PRESIGNAL_AND_SEMAPHORE_SPRITE_COUNT     = 112,
+	PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT = 240,
+
+	SPR_CANALS_BASE   = SPR_SIGNALS_BASE + PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT,
+	CANALS_SPRITE_COUNT = 65,
+
+	SPR_SLOPES_BASE              = SPR_CANALS_BASE + CANALS_SPRITE_COUNT,
+	SPR_SLOPES_INCLINED_OFFSET   = 15,
+	SPR_SLOPES_VIRTUAL_BASE      = SPR_SLOPES_BASE - SPR_SLOPES_INCLINED_OFFSET, // The original foundations (see SPR_FOUNDATION_BASE below) are mapped before the additional foundations.
+	SPR_TRKFOUND_BLOCK_SIZE      = 22, // The normal track foundation sprites are organized in blocks of 22.
+	NORMAL_FOUNDATION_SPRITE_COUNT = 74,
+	/* Halftile foundations */
+	SPR_HALFTILE_FOUNDATION_BASE = SPR_SLOPES_BASE + NORMAL_FOUNDATION_SPRITE_COUNT,
+	SPR_HALFTILE_BLOCK_SIZE      = 4,  // The half tile foundation sprites are organized in blocks of 4.
+	NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT = 90,
+
+	SPR_AUTORAIL_BASE = SPR_HALFTILE_FOUNDATION_BASE + NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT,
+	AUTORAIL_SPRITE_COUNT = 55,
+
+	SPR_ELRAIL_BASE   = SPR_AUTORAIL_BASE + AUTORAIL_SPRITE_COUNT,
+	ELRAIL_SPRITE_COUNT = 48,
+
+	SPR_2CCMAP_BASE   = SPR_ELRAIL_BASE + ELRAIL_SPRITE_COUNT,
+	TWOCCMAP_SPRITE_COUNT = 256,
+
+	SPR_AIRPORTX_BASE       = SPR_2CCMAP_BASE + TWOCCMAP_SPRITE_COUNT, // The sprites used for other airport angles
+	SPR_NEWAIRPORT_TARMAC   = SPR_AIRPORTX_BASE,
+	SPR_NSRUNWAY1           = SPR_AIRPORTX_BASE + 1,
+	SPR_NSRUNWAY2           = SPR_AIRPORTX_BASE + 2,
+	SPR_NSRUNWAY3           = SPR_AIRPORTX_BASE + 3,
+	SPR_NSRUNWAY4           = SPR_AIRPORTX_BASE + 4,
+	SPR_NSRUNWAY_END        = SPR_AIRPORTX_BASE + 5,
+	SPR_NEWHANGAR_S         = SPR_AIRPORTX_BASE + 6,
+	SPR_NEWHANGAR_S_WALL    = SPR_AIRPORTX_BASE + 7,
+	SPR_NEWHANGAR_W         = SPR_AIRPORTX_BASE + 8,
+	SPR_NEWHANGAR_W_WALL    = SPR_AIRPORTX_BASE + 9,
+	SPR_NEWHANGAR_N         = SPR_AIRPORTX_BASE + 10,
+	SPR_NEWHANGAR_E         = SPR_AIRPORTX_BASE + 11,
+	SPR_NEWHELIPAD          = SPR_AIRPORTX_BASE + 12,
+	SPR_GRASS_RIGHT         = SPR_AIRPORTX_BASE + 13,
+	SPR_GRASS_LEFT          = SPR_AIRPORTX_BASE + 14,
 	SPR_IMG_ARROW_NE_YELLOW = SPR_AIRPORTX_BASE + 15,
 	SPR_IMG_ARROW_SE_YELLOW = SPR_AIRPORTX_BASE + 16,
 	SPR_IMG_ARROW_SW_YELLOW = SPR_AIRPORTX_BASE + 17,
 	SPR_IMG_ARROW_NW_YELLOW = SPR_AIRPORTX_BASE + 18,
-	SPR_IMG_ARROW_NE_WHITE = SPR_AIRPORTX_BASE + 19,
-	SPR_IMG_ARROW_SE_WHITE = SPR_AIRPORTX_BASE + 20,
-	SPR_IMG_ARROW_SW_WHITE = SPR_AIRPORTX_BASE + 21,
-	SPR_IMG_ARROW_NW_WHITE = SPR_AIRPORTX_BASE + 22,
-	PALETTE_SEL_TILE_GREEN = SPR_AIRPORTX_BASE + 23, // used to recolour the airport placement highlight to green for land/blue for water
-	SPR_ROADSTOP_BASE = SPR_AIRPORTX_BASE + 24, // The sprites used for drive-through road stops
-	SPR_BUS_STOP_DT_Y_W = SPR_ROADSTOP_BASE,
-	SPR_BUS_STOP_DT_Y_E = SPR_ROADSTOP_BASE + 1,
-	SPR_BUS_STOP_DT_X_W = SPR_ROADSTOP_BASE + 2,
-	SPR_BUS_STOP_DT_X_E = SPR_ROADSTOP_BASE + 3,
+	SPR_IMG_ARROW_NE_WHITE  = SPR_AIRPORTX_BASE + 19,
+	SPR_IMG_ARROW_SE_WHITE  = SPR_AIRPORTX_BASE + 20,
+	SPR_IMG_ARROW_SW_WHITE  = SPR_AIRPORTX_BASE + 21,
+	SPR_IMG_ARROW_NW_WHITE  = SPR_AIRPORTX_BASE + 22,
+	PALETTE_SEL_TILE_GREEN  = SPR_AIRPORTX_BASE + 23, // used to recolour the airport placement highlight to green for land/blue for water
+	AIRPORTX_SPRITE_COUNT   = 24,
+
+	SPR_ROADSTOP_BASE     = SPR_AIRPORTX_BASE + AIRPORTX_SPRITE_COUNT, // The sprites used for drive-through road stops
+	SPR_BUS_STOP_DT_Y_W   = SPR_ROADSTOP_BASE,
+	SPR_BUS_STOP_DT_Y_E   = SPR_ROADSTOP_BASE + 1,
+	SPR_BUS_STOP_DT_X_W   = SPR_ROADSTOP_BASE + 2,
+	SPR_BUS_STOP_DT_X_E   = SPR_ROADSTOP_BASE + 3,
 	SPR_TRUCK_STOP_DT_Y_W = SPR_ROADSTOP_BASE + 4,
 	SPR_TRUCK_STOP_DT_Y_E = SPR_ROADSTOP_BASE + 5,
 	SPR_TRUCK_STOP_DT_X_W = SPR_ROADSTOP_BASE + 6,
 	SPR_TRUCK_STOP_DT_X_E = SPR_ROADSTOP_BASE + 7,
-
-	SPR_GROUP_BASE                 = SPR_ROADSTOP_BASE + 8, // The sprites used for the group interface
-	SPR_GROUP_CREATE_TRAIN         = SPR_GROUP_BASE,
-	SPR_GROUP_CREATE_ROADVEH       = SPR_GROUP_BASE + 1,
-	SPR_GROUP_CREATE_SHIP          = SPR_GROUP_BASE + 2,
-	SPR_GROUP_CREATE_AIRCRAFT      = SPR_GROUP_BASE + 3,
-	SPR_GROUP_DELETE_TRAIN         = SPR_GROUP_BASE + 4,
-	SPR_GROUP_DELETE_ROADVEH       = SPR_GROUP_BASE + 5,
-	SPR_GROUP_DELETE_SHIP          = SPR_GROUP_BASE + 6,
-	SPR_GROUP_DELETE_AIRCRAFT      = SPR_GROUP_BASE + 7,
-	SPR_GROUP_RENAME_TRAIN         = SPR_GROUP_BASE + 8,
-	SPR_GROUP_RENAME_ROADVEH       = SPR_GROUP_BASE + 9,
-	SPR_GROUP_RENAME_SHIP          = SPR_GROUP_BASE + 10,
-	SPR_GROUP_RENAME_AIRCRAFT      = SPR_GROUP_BASE + 11,
-	SPR_GROUP_REPLACE_ON_TRAIN     = SPR_GROUP_BASE + 12,
-	SPR_GROUP_REPLACE_ON_ROADVEH   = SPR_GROUP_BASE + 13,
-	SPR_GROUP_REPLACE_ON_SHIP      = SPR_GROUP_BASE + 14,
-	SPR_GROUP_REPLACE_ON_AIRCRAFT  = SPR_GROUP_BASE + 15,
-	SPR_GROUP_REPLACE_OFF_TRAIN    = SPR_GROUP_BASE + 16,
-	SPR_GROUP_REPLACE_OFF_ROADVEH  = SPR_GROUP_BASE + 17,
-	SPR_GROUP_REPLACE_OFF_SHIP     = SPR_GROUP_BASE + 18,
-	SPR_GROUP_REPLACE_OFF_AIRCRAFT = SPR_GROUP_BASE + 19,
+	ROADSTOP_SPRITE_COUNT = 8,
 
 	/* Tramway sprites */
-	SPR_TRAMWAY_BASE                 = SPR_GROUP_BASE + 20,
+	SPR_TRAMWAY_BASE                 = SPR_ROADSTOP_BASE + ROADSTOP_SPRITE_COUNT,
 	SPR_TRAMWAY_OVERLAY              = SPR_TRAMWAY_BASE + 4,
 	SPR_TRAMWAY_TRAM                 = SPR_TRAMWAY_BASE + 27,
 	SPR_TRAMWAY_SLOPED_OFFSET        = 11,
@@ -180,15 +194,22 @@
 	SPR_TRAMWAY_FRONT_WIRES_SLOPED   = SPR_TRAMWAY_BASE + 68,
 	SPR_TRAMWAY_TUNNEL_WIRES         = SPR_TRAMWAY_BASE + 80,
 	SPR_TRAMWAY_BRIDGE               = SPR_TRAMWAY_BASE + 107,
+	TRAMWAY_SPRITE_COUNT = 113,
 
 	/* One way road sprites */
-	SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + 113,
+	SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + TRAMWAY_SPRITE_COUNT,
+	ONEWAY_SPRITE_COUNT = 6,
+
+	/* Flags sprites (in same order as enum NetworkLanguage) */
+	SPR_FLAGS_BASE = SPR_ONEWAY_BASE + ONEWAY_SPRITE_COUNT,
+	FLAGS_SPRITE_COUNT = 29,
 
 	/* 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,
+	SPR_EMPTY_BOUNDING_BOX = SPR_FLAGS_BASE + FLAGS_SPRITE_COUNT,
+	EMPTY_BOUNDING_BOX_SPRITE_COUNT = 1,
 
-	/* Flags sprites (in same order as enum NetworkLanguage) */
-	SPR_FLAGS_BASE = SPR_EMPTY_BOUNDING_BOX + 1,
+	/* From where can we start putting NewGRFs? */
+	SPR_NEWGRFS_BASE = SPR_EMPTY_BOUNDING_BOX + EMPTY_BOUNDING_BOX_SPRITE_COUNT,
 
 	/* Manager face sprites */
 	SPR_GRADIENT = 874, // background gradient behind manager face
@@ -202,11 +223,6 @@
 	/* Shadow cell */
 	SPR_SHADOW_CELL = 1004,
 
-	/* Sliced view shadow cells */
-	/* Maybe we have different ones in the future */
-	SPR_MAX_SLICE = SPR_OPENTTD_BASE + 64,
-	SPR_MIN_SLICE = SPR_OPENTTD_BASE + 64,
-
 	/* Unmovables spritenumbers */
 	SPR_UNMOVABLE_TRANSMITTER   = 2601,
 	SPR_UNMOVABLE_LIGHTHOUSE    = 2602,
@@ -302,10 +318,10 @@
 	SPR_MGLV_TRACK_Y                  = 1175,
 	SPR_MGLV_TRACK_BASE               = 1182,
 	SPR_MGLV_TRACK_N_S                = 1199,
-	SPR_WAYPOINT_X_1            = SPR_OPENTTD_BASE + 15,
-	SPR_WAYPOINT_X_2            = SPR_OPENTTD_BASE + 16,
-	SPR_WAYPOINT_Y_1            = SPR_OPENTTD_BASE + 17,
-	SPR_WAYPOINT_Y_2            = SPR_OPENTTD_BASE + 18,
+	SPR_WAYPOINT_X_1            = SPR_OPENTTD_BASE + 78,
+	SPR_WAYPOINT_X_2            = SPR_OPENTTD_BASE + 79,
+	SPR_WAYPOINT_Y_1            = SPR_OPENTTD_BASE + 80,
+	SPR_WAYPOINT_Y_2            = SPR_OPENTTD_BASE + 81,
 	OFFSET_TILEH_IMPOSSIBLE     = 0,
 	OFFSET_TILEH_1              = 14,
 	OFFSET_TILEH_2              = 15,
@@ -334,55 +350,55 @@
 	/* Wires. First identifier is the direction of the track, second is the required placement of the pylon.
 	 * "short" denotes a wire that requires a pylon on each end. Third identifier is the direction of the slope
 	 * (in positive coordinate direction) */
-	SPR_WIRE_X_SHORT = SPR_ELRAIL_BASE + 3,
-	SPR_WIRE_Y_SHORT = SPR_ELRAIL_BASE + 4,
-	SPR_WIRE_EW_SHORT = SPR_ELRAIL_BASE + 5,
-	SPR_WIRE_NS_SHORT = SPR_ELRAIL_BASE + 6,
-	SPR_WIRE_X_SHORT_DOWN = SPR_ELRAIL_BASE + 7,
-	SPR_WIRE_Y_SHORT_UP = SPR_ELRAIL_BASE + 8,
-	SPR_WIRE_X_SHORT_UP = SPR_ELRAIL_BASE + 9,
-	SPR_WIRE_Y_SHORT_DOWN = SPR_ELRAIL_BASE + 10,
+	SPR_WIRE_X_SHORT      = SPR_ELRAIL_BASE + 0,
+	SPR_WIRE_Y_SHORT      = SPR_ELRAIL_BASE + 1,
+	SPR_WIRE_EW_SHORT     = SPR_ELRAIL_BASE + 2,
+	SPR_WIRE_NS_SHORT     = SPR_ELRAIL_BASE + 3,
+	SPR_WIRE_X_SHORT_DOWN = SPR_ELRAIL_BASE + 4,
+	SPR_WIRE_Y_SHORT_UP   = SPR_ELRAIL_BASE + 5,
+	SPR_WIRE_X_SHORT_UP   = SPR_ELRAIL_BASE + 6,
+	SPR_WIRE_Y_SHORT_DOWN = SPR_ELRAIL_BASE + 7,
 
-	SPR_WIRE_X_SW = SPR_ELRAIL_BASE + 11,
-	SPR_WIRE_Y_SE = SPR_ELRAIL_BASE + 12,
-	SPR_WIRE_EW_E = SPR_ELRAIL_BASE + 13,
-	SPR_WIRE_NS_S = SPR_ELRAIL_BASE + 14,
-	SPR_WIRE_X_SW_DOWN = SPR_ELRAIL_BASE + 15,
-	SPR_WIRE_Y_SE_UP = SPR_ELRAIL_BASE + 16,
-	SPR_WIRE_X_SW_UP = SPR_ELRAIL_BASE + 17,
-	SPR_WIRE_Y_SE_DOWN = SPR_ELRAIL_BASE + 18,
+	SPR_WIRE_X_SW      = SPR_ELRAIL_BASE +  8,
+	SPR_WIRE_Y_SE      = SPR_ELRAIL_BASE +  9,
+	SPR_WIRE_EW_E      = SPR_ELRAIL_BASE + 10,
+	SPR_WIRE_NS_S      = SPR_ELRAIL_BASE + 11,
+	SPR_WIRE_X_SW_DOWN = SPR_ELRAIL_BASE + 12,
+	SPR_WIRE_Y_SE_UP   = SPR_ELRAIL_BASE + 13,
+	SPR_WIRE_X_SW_UP   = SPR_ELRAIL_BASE + 14,
+	SPR_WIRE_Y_SE_DOWN = SPR_ELRAIL_BASE + 15,
 
-	SPR_WIRE_X_NE = SPR_ELRAIL_BASE + 19,
-	SPR_WIRE_Y_NW = SPR_ELRAIL_BASE + 20,
-	SPR_WIRE_EW_W = SPR_ELRAIL_BASE + 21,
-	SPR_WIRE_NS_N = SPR_ELRAIL_BASE + 22,
-	SPR_WIRE_X_NE_DOWN = SPR_ELRAIL_BASE + 23,
-	SPR_WIRE_Y_NW_UP = SPR_ELRAIL_BASE + 24,
-	SPR_WIRE_X_NE_UP = SPR_ELRAIL_BASE + 25,
-	SPR_WIRE_Y_NW_DOWN = SPR_ELRAIL_BASE + 26,
+	SPR_WIRE_X_NE      = SPR_ELRAIL_BASE + 16,
+	SPR_WIRE_Y_NW      = SPR_ELRAIL_BASE + 17,
+	SPR_WIRE_EW_W      = SPR_ELRAIL_BASE + 18,
+	SPR_WIRE_NS_N      = SPR_ELRAIL_BASE + 19,
+	SPR_WIRE_X_NE_DOWN = SPR_ELRAIL_BASE + 20,
+	SPR_WIRE_Y_NW_UP   = SPR_ELRAIL_BASE + 21,
+	SPR_WIRE_X_NE_UP   = SPR_ELRAIL_BASE + 22,
+	SPR_WIRE_Y_NW_DOWN = SPR_ELRAIL_BASE + 23,
 
 	/* Tunnel entries */
-	SPR_WIRE_TUNNEL_NE = SPR_ELRAIL_BASE + 27,
-	SPR_WIRE_TUNNEL_SE = SPR_ELRAIL_BASE + 28,
-	SPR_WIRE_TUNNEL_SW = SPR_ELRAIL_BASE + 29,
-	SPR_WIRE_TUNNEL_NW = SPR_ELRAIL_BASE + 30,
+	SPR_WIRE_TUNNEL_NE = SPR_ELRAIL_BASE + 24,
+	SPR_WIRE_TUNNEL_SE = SPR_ELRAIL_BASE + 25,
+	SPR_WIRE_TUNNEL_SW = SPR_ELRAIL_BASE + 26,
+	SPR_WIRE_TUNNEL_NW = SPR_ELRAIL_BASE + 27,
 
 	/* Depot entries */
-	SPR_WIRE_DEPOT_SW = SPR_ELRAIL_BASE + 27,
-	SPR_WIRE_DEPOT_NW = SPR_ELRAIL_BASE + 28,
-	SPR_WIRE_DEPOT_NE = SPR_ELRAIL_BASE + 29,
-	SPR_WIRE_DEPOT_SE = SPR_ELRAIL_BASE + 30,
+	SPR_WIRE_DEPOT_SW = SPR_ELRAIL_BASE + 24,
+	SPR_WIRE_DEPOT_NW = SPR_ELRAIL_BASE + 25,
+	SPR_WIRE_DEPOT_NE = SPR_ELRAIL_BASE + 26,
+	SPR_WIRE_DEPOT_SE = SPR_ELRAIL_BASE + 27,
 
 
 	/* Pylons, first identifier is the direction of the track, second the placement relative to the track */
-	SPR_PYLON_Y_NE = SPR_ELRAIL_BASE + 31,
-	SPR_PYLON_Y_SW = SPR_ELRAIL_BASE + 32,
-	SPR_PYLON_X_NW = SPR_ELRAIL_BASE + 33,
-	SPR_PYLON_X_SE = SPR_ELRAIL_BASE + 34,
-	SPR_PYLON_EW_N = SPR_ELRAIL_BASE + 35,
-	SPR_PYLON_EW_S = SPR_ELRAIL_BASE + 36,
-	SPR_PYLON_NS_W = SPR_ELRAIL_BASE + 37,
-	SPR_PYLON_NS_E = SPR_ELRAIL_BASE + 38,
+	SPR_PYLON_Y_NE = SPR_ELRAIL_BASE + 28,
+	SPR_PYLON_Y_SW = SPR_ELRAIL_BASE + 29,
+	SPR_PYLON_X_NW = SPR_ELRAIL_BASE + 30,
+	SPR_PYLON_X_SE = SPR_ELRAIL_BASE + 31,
+	SPR_PYLON_EW_N = SPR_ELRAIL_BASE + 32,
+	SPR_PYLON_EW_S = SPR_ELRAIL_BASE + 33,
+	SPR_PYLON_NS_W = SPR_ELRAIL_BASE + 34,
+	SPR_PYLON_NS_E = SPR_ELRAIL_BASE + 35,
 
 	/* sprites for roads */
 	SPR_ROAD_PAVED_STRAIGHT_Y       = 1313,
@@ -449,7 +465,7 @@
 	SPR_AIRPORT_RADAR_A             = 2689,
 	SPR_AIRPORT_RADAR_B             = 2690,
 	SPR_AIRPORT_RADAR_C             = 2691,
-	SPR_AIRPORT_HELIPAD             = SPR_OPENTTD_BASE + 28,
+	SPR_AIRPORT_HELIPAD             = SPR_OPENTTD_BASE + 86,
 	SPR_AIRPORT_HELIDEPOT_OFFICE    = 2095,
 
 	/* Road Stops */
@@ -546,14 +562,14 @@
 
 	/* Shores */
 	SPR_NO_SHORE                = 0,  //used for tileh which have no shore
-	SPR_SHORE_TILEH_4           = 4062,
-	SPR_SHORE_TILEH_1           = 4063,
-	SPR_SHORE_TILEH_2           = 4064,
-	SPR_SHORE_TILEH_8           = 4065,
-	SPR_SHORE_TILEH_6           = 4066,
-	SPR_SHORE_TILEH_12          = 4067,
-	SPR_SHORE_TILEH_3           = 4068,
-	SPR_SHORE_TILEH_9           = 4069,
+	SPR_SHORE_TILEH_4           = 4062, // SLOPE_E
+	SPR_SHORE_TILEH_1           = 4063, // SLOPE_W
+	SPR_SHORE_TILEH_2           = 4064, // SLOPE_S
+	SPR_SHORE_TILEH_8           = 4065, // SLOPE_N
+	SPR_SHORE_TILEH_6           = 4066, // SLOPE_SE
+	SPR_SHORE_TILEH_12          = 4067, // SLOPE_NE
+	SPR_SHORE_TILEH_3           = 4068, // SLOPE_SW
+	SPR_SHORE_TILEH_9           = 4069, // SLOPE_NW
 
 	/* Water-related sprites */
 	SPR_SHIP_DEPOT_SE_FRONT     = 4070,
@@ -563,40 +579,42 @@
 	SPR_SHIP_DEPOT_SE_REAR      = 4074,
 	SPR_SHIP_DEPOT_SW_REAR      = 4075,
 	//here come sloped water sprites
-	SPR_WATER_SLOPE_Y_UP        = SPR_CANALS_BASE + 5, //Water flowing negative Y direction
-	SPR_WATER_SLOPE_X_DOWN      = SPR_CANALS_BASE + 6, //positive X
-	SPR_WATER_SLOPE_X_UP        = SPR_CANALS_BASE + 7, //negative X
-	SPR_WATER_SLOPE_Y_DOWN      = SPR_CANALS_BASE + 8,  //positive Y
+	SPR_WATER_SLOPE_Y_UP        = SPR_CANALS_BASE + 0, //Water flowing negative Y direction
+	SPR_WATER_SLOPE_X_DOWN      = SPR_CANALS_BASE + 1, //positive X
+	SPR_WATER_SLOPE_X_UP        = SPR_CANALS_BASE + 2, //negative X
+	SPR_WATER_SLOPE_Y_DOWN      = SPR_CANALS_BASE + 3,  //positive Y
 	//sprites for the shiplifts
 	//there are 4 kinds of shiplifts, each of them is 3 tiles long.
 	//the four kinds are running in the X and Y direction and
 	//are "lowering" either in the "+" or the "-" direction.
 	//the three tiles are the center tile (where the slope is)
 	//and a bottom and a top tile
-	SPR_SHIPLIFT_Y_UP_CENTER_REAR     = SPR_CANALS_BASE + 9,
-	SPR_SHIPLIFT_X_DOWN_CENTER_REAR   = SPR_CANALS_BASE + 10,
-	SPR_SHIPLIFT_X_UP_CENTER_REAR     = SPR_CANALS_BASE + 11,
-	SPR_SHIPLIFT_Y_DOWN_CENTER_REAR   = SPR_CANALS_BASE + 12,
-	SPR_SHIPLIFT_Y_UP_CENTER_FRONT    = SPR_CANALS_BASE + 13,
-	SPR_SHIPLIFT_X_DOWN_CENTER_FRONT  = SPR_CANALS_BASE + 14,
-	SPR_SHIPLIFT_X_UP_CENTER_FRONT    = SPR_CANALS_BASE + 15,
-	SPR_SHIPLIFT_Y_DOWN_CENTER_FRONT  = SPR_CANALS_BASE + 16,
-	SPR_SHIPLIFT_Y_UP_BOTTOM_REAR     = SPR_CANALS_BASE + 17,
-	SPR_SHIPLIFT_X_DOWN_BOTTOM_REAR   = SPR_CANALS_BASE + 18,
-	SPR_SHIPLIFT_X_UP_BOTTOM_REAR     = SPR_CANALS_BASE + 19,
-	SPR_SHIPLIFT_Y_DOWN_BOTTOM_REAR   = SPR_CANALS_BASE + 20,
-	SPR_SHIPLIFT_Y_UP_BOTTOM_FRONT    = SPR_CANALS_BASE + 21,
-	SPR_SHIPLIFT_X_DOWN_BOTTOM_FRONT  = SPR_CANALS_BASE + 22,
-	SPR_SHIPLIFT_X_UP_BOTTOM_FRONT    = SPR_CANALS_BASE + 23,
-	SPR_SHIPLIFT_Y_DOWN_BOTTOM_FRONT  = SPR_CANALS_BASE + 24,
-	SPR_SHIPLIFT_Y_UP_TOP_REAR        = SPR_CANALS_BASE + 25,
-	SPR_SHIPLIFT_X_DOWN_TOP_REAR      = SPR_CANALS_BASE + 26,
-	SPR_SHIPLIFT_X_UP_TOP_REAR        = SPR_CANALS_BASE + 27,
-	SPR_SHIPLIFT_Y_DOWN_TOP_REAR      = SPR_CANALS_BASE + 28,
-	SPR_SHIPLIFT_Y_UP_TOP_FRONT       = SPR_CANALS_BASE + 29,
-	SPR_SHIPLIFT_X_DOWN_TOP_FRONT     = SPR_CANALS_BASE + 30,
-	SPR_SHIPLIFT_X_UP_TOP_FRONT       = SPR_CANALS_BASE + 31,
-	SPR_SHIPLIFT_Y_DOWN_TOP_FRONT     = SPR_CANALS_BASE + 32,
+	SPR_SHIPLIFT_BASE                 = SPR_CANALS_BASE +  4,
+	SPR_SHIPLIFT_Y_UP_CENTER_REAR     = SPR_CANALS_BASE +  4,
+	SPR_SHIPLIFT_X_DOWN_CENTER_REAR   = SPR_CANALS_BASE +  5,
+	SPR_SHIPLIFT_X_UP_CENTER_REAR     = SPR_CANALS_BASE +  6,
+	SPR_SHIPLIFT_Y_DOWN_CENTER_REAR   = SPR_CANALS_BASE +  7,
+	SPR_SHIPLIFT_Y_UP_CENTER_FRONT    = SPR_CANALS_BASE +  8,
+	SPR_SHIPLIFT_X_DOWN_CENTER_FRONT  = SPR_CANALS_BASE +  9,
+	SPR_SHIPLIFT_X_UP_CENTER_FRONT    = SPR_CANALS_BASE + 10,
+	SPR_SHIPLIFT_Y_DOWN_CENTER_FRONT  = SPR_CANALS_BASE + 11,
+	SPR_SHIPLIFT_Y_UP_BOTTOM_REAR     = SPR_CANALS_BASE + 12,
+	SPR_SHIPLIFT_X_DOWN_BOTTOM_REAR   = SPR_CANALS_BASE + 13,
+	SPR_SHIPLIFT_X_UP_BOTTOM_REAR     = SPR_CANALS_BASE + 14,
+	SPR_SHIPLIFT_Y_DOWN_BOTTOM_REAR   = SPR_CANALS_BASE + 15,
+	SPR_SHIPLIFT_Y_UP_BOTTOM_FRONT    = SPR_CANALS_BASE + 16,
+	SPR_SHIPLIFT_X_DOWN_BOTTOM_FRONT  = SPR_CANALS_BASE + 17,
+	SPR_SHIPLIFT_X_UP_BOTTOM_FRONT    = SPR_CANALS_BASE + 18,
+	SPR_SHIPLIFT_Y_DOWN_BOTTOM_FRONT  = SPR_CANALS_BASE + 19,
+	SPR_SHIPLIFT_Y_UP_TOP_REAR        = SPR_CANALS_BASE + 20,
+	SPR_SHIPLIFT_X_DOWN_TOP_REAR      = SPR_CANALS_BASE + 21,
+	SPR_SHIPLIFT_X_UP_TOP_REAR        = SPR_CANALS_BASE + 22,
+	SPR_SHIPLIFT_Y_DOWN_TOP_REAR      = SPR_CANALS_BASE + 23,
+	SPR_SHIPLIFT_Y_UP_TOP_FRONT       = SPR_CANALS_BASE + 24,
+	SPR_SHIPLIFT_X_DOWN_TOP_FRONT     = SPR_CANALS_BASE + 25,
+	SPR_SHIPLIFT_X_UP_TOP_FRONT       = SPR_CANALS_BASE + 26,
+	SPR_SHIPLIFT_Y_DOWN_TOP_FRONT     = SPR_CANALS_BASE + 27,
+	SPR_CANAL_DIKES_BASE              = SPR_CANALS_BASE + 52,
 
 	/* Sprites for tunnels and bridges */
 	SPR_TUNNEL_ENTRY_REAR_RAIL   = 2365,
@@ -610,7 +628,7 @@
 	SPR_CROSSING_OFF_X_MAGLEV = 1394,
 
 	/* bridge type sprites */
-	SPR_PILLARS_BASE = SPR_OPENTTD_BASE + 30,
+	SPR_PILLARS_BASE = SPR_OPENTTD_BASE + 14,
 
 	/* Wooden bridge (type 0) */
 	SPR_BTWDN_RAIL_Y_REAR       = 2545,
@@ -1009,11 +1027,11 @@
 	SPR_IMG_ROCKS           = 4084,
 	SPR_IMG_LIGHTHOUSE_DESERT = 4085, // XXX - is Desert image on the desert-climate
 	SPR_IMG_TRANSMITTER     = 4086,
-	SPR_IMG_LEVEL_LAND      = SPR_OPENTTD_BASE + 61,
-	SPR_IMG_BUILD_CANAL     = SPR_OPENTTD_BASE + 58,
-	SPR_IMG_BUILD_LOCK      = SPR_CANALS_BASE + 69,
+	SPR_IMG_LEVEL_LAND      = SPR_OPENTTD_BASE + 91,
+	SPR_IMG_BUILD_CANAL     = SPR_OPENTTD_BASE + 88,
+	SPR_IMG_BUILD_LOCK      = SPR_CANALS_BASE + 64,
 	SPR_IMG_PAUSE           = 726,
-	SPR_IMG_FASTFORWARD     = SPR_OPENTTD_BASE + 54,
+	SPR_IMG_FASTFORWARD     = SPR_OPENTTD_BASE + 90,
 	SPR_IMG_SETTINGS        = 751,
 	SPR_IMG_SAVE            = 724,
 	SPR_IMG_SMALLMAP        = 708,
@@ -1049,8 +1067,8 @@
 	/* OPEN TRANSPORT TYCOON in gamescreen */
 	SPR_OTTD_O                = 4842,
 	SPR_OTTD_P                = 4841,
-	SPR_OTTD_E                = SPR_OPENTTD_BASE + 13,
-	SPR_OTTD_D                = SPR_OPENTTD_BASE + 14,
+	SPR_OTTD_E                = SPR_OPENTTD_BASE + 12,
+	SPR_OTTD_D                = SPR_OPENTTD_BASE + 13,
 	SPR_OTTD_N                = 4839,
 	SPR_OTTD_T                = 4836,
 	SPR_OTTD_R                = 4837,
@@ -1199,11 +1217,11 @@
 	SPR_BUBBLE_ABSORB_4 = 4762,
 
 	/* Electrified rail build menu */
-	SPR_BUILD_NS_ELRAIL = SPR_ELRAIL_BASE + 39,
-	SPR_BUILD_X_ELRAIL  = SPR_ELRAIL_BASE + 40,
-	SPR_BUILD_EW_ELRAIL = SPR_ELRAIL_BASE + 41,
-	SPR_BUILD_Y_ELRAIL  = SPR_ELRAIL_BASE + 42,
-	SPR_BUILD_TUNNEL_ELRAIL = SPR_ELRAIL_BASE + 47,
+	SPR_BUILD_NS_ELRAIL = SPR_ELRAIL_BASE + 36,
+	SPR_BUILD_X_ELRAIL  = SPR_ELRAIL_BASE + 37,
+	SPR_BUILD_EW_ELRAIL = SPR_ELRAIL_BASE + 38,
+	SPR_BUILD_Y_ELRAIL  = SPR_ELRAIL_BASE + 39,
+	SPR_BUILD_TUNNEL_ELRAIL = SPR_ELRAIL_BASE + 44,
 
 	/* airport_gui.c */
 	SPR_IMG_AIRPORT       = 744,
@@ -1220,42 +1238,58 @@
 	SPR_IMG_PLAY_MUSIC    = 712,
 
 	/* road_gui.c */
-	SPR_IMG_ROAD_NW       = 1309,
-	SPR_IMG_ROAD_NE       = 1310,
+	SPR_IMG_ROAD_Y_DIR    = 1309,
+	SPR_IMG_ROAD_X_DIR    = 1310,
+	SPR_IMG_AUTOROAD      = SPR_OPENTTD_BASE + 82,
 	SPR_IMG_ROAD_DEPOT    = 1295,
 	SPR_IMG_BUS_STATION   = 749,
 	SPR_IMG_TRUCK_BAY     = 750,
 	SPR_IMG_BRIDGE        = 2594,
 	SPR_IMG_ROAD_TUNNEL   = 2429,
 	SPR_IMG_REMOVE        = 714,
-	SPR_IMG_TRAMWAY_NW    = SPR_TRAMWAY_BASE + 0,
-	SPR_IMG_TRAMWAY_NE    = SPR_TRAMWAY_BASE + 1,
+	SPR_IMG_ROAD_ONE_WAY  = SPR_OPENTTD_BASE + 134,
+	SPR_IMG_TRAMWAY_Y_DIR = SPR_TRAMWAY_BASE + 0,
+	SPR_IMG_TRAMWAY_X_DIR = SPR_TRAMWAY_BASE + 1,
+	SPR_IMG_AUTOTRAM      = SPR_OPENTTD_BASE + 84,
 
 	/* rail_gui.c */
 	SPR_IMG_RAIL_NS    = 1251,
 	SPR_IMG_RAIL_NE    = 1252,
 	SPR_IMG_RAIL_EW    = 1253,
 	SPR_IMG_RAIL_NW    = 1254,
-	SPR_IMG_AUTORAIL   = SPR_OPENTTD_BASE + 0,
-	SPR_IMG_AUTOMONO   = SPR_OPENTTD_BASE + 1,
-	SPR_IMG_AUTOMAGLEV = SPR_OPENTTD_BASE + 2,
+	SPR_IMG_AUTORAIL   = SPR_OPENTTD_BASE + 53,
+	SPR_IMG_AUTOELRAIL = SPR_OPENTTD_BASE + 57,
+	SPR_IMG_AUTOMONO   = SPR_OPENTTD_BASE + 63,
+	SPR_IMG_AUTOMAGLEV = SPR_OPENTTD_BASE + 69,
 
-	SPR_IMG_WAYPOINT = SPR_OPENTTD_BASE + 3,
+	SPR_IMG_WAYPOINT = SPR_OPENTTD_BASE + 76,
 
 	SPR_IMG_DEPOT_RAIL   = 1294,
-	SPR_IMG_DEPOT_MONO   = SPR_OPENTTD_BASE + 9,
-	SPR_IMG_DEPOT_MAGLEV = SPR_OPENTTD_BASE + 10,
+	SPR_IMG_DEPOT_ELRAIL = SPR_OPENTTD_BASE + 61,
+	SPR_IMG_DEPOT_MONO   = SPR_OPENTTD_BASE + 67,
+	SPR_IMG_DEPOT_MAGLEV = SPR_OPENTTD_BASE + 73,
 
 	SPR_IMG_RAIL_STATION = 1298,
 	SPR_IMG_RAIL_SIGNALS = 1291,
 
+	SPR_IMG_SIGNAL_ELECTRIC_NORM   = 1287,
+	SPR_IMG_SIGNAL_ELECTRIC_ENTRY  = SPR_SIGNALS_BASE +  12,
+	SPR_IMG_SIGNAL_ELECTRIC_EXIT   = SPR_SIGNALS_BASE +  28,
+	SPR_IMG_SIGNAL_ELECTRIC_COMBO  = SPR_SIGNALS_BASE +  44,
+	SPR_IMG_SIGNAL_SEMAPHORE_NORM  = SPR_SIGNALS_BASE +  60,
+	SPR_IMG_SIGNAL_SEMAPHORE_ENTRY = SPR_SIGNALS_BASE +  76,
+	SPR_IMG_SIGNAL_SEMAPHORE_EXIT  = SPR_SIGNALS_BASE +  92,
+	SPR_IMG_SIGNAL_SEMAPHORE_COMBO = SPR_SIGNALS_BASE + 108,
+	SPR_IMG_SIGNAL_CONVERT         = SPR_OPENTTD_BASE + 135,
+
 	SPR_IMG_TUNNEL_RAIL   = 2430,
 	SPR_IMG_TUNNEL_MONO   = 2431,
 	SPR_IMG_TUNNEL_MAGLEV = 2432,
 
-	SPR_IMG_CONVERT_RAIL   = SPR_OPENTTD_BASE + 22,
-	SPR_IMG_CONVERT_MONO   = SPR_OPENTTD_BASE + 24,
-	SPR_IMG_CONVERT_MAGLEV = SPR_OPENTTD_BASE + 26,
+	SPR_IMG_CONVERT_RAIL   = SPR_OPENTTD_BASE + 55,
+	SPR_IMG_CONVERT_ELRAIL = SPR_OPENTTD_BASE + 59,
+	SPR_IMG_CONVERT_MONO   = SPR_OPENTTD_BASE + 65,
+	SPR_IMG_CONVERT_MAGLEV = SPR_OPENTTD_BASE + 71,
 
 	/* intro_gui.c, genworld_gui.c */
 	SPR_SELECT_TEMPERATE           = 4882,
@@ -1282,7 +1316,7 @@
 
 	SPR_CURSOR_TREE           = 2010,
 	SPR_CURSOR_BUY_LAND       = 4792,
-	SPR_CURSOR_LEVEL_LAND     = SPR_OPENTTD_BASE + 62,
+	SPR_CURSOR_LEVEL_LAND     = SPR_OPENTTD_BASE + 92,
 
 	SPR_CURSOR_TOWN           = 4080,
 	SPR_CURSOR_INDUSTRY       = 4081,
@@ -1295,8 +1329,8 @@
 
 	/* dock cursors */
 	SPR_CURSOR_DOCK           = 3668,
-	SPR_CURSOR_CANAL          = SPR_OPENTTD_BASE + 8,
-	SPR_CURSOR_LOCK           = SPR_OPENTTD_BASE + 57,
+	SPR_CURSOR_CANAL          = SPR_OPENTTD_BASE + 89,
+	SPR_CURSOR_LOCK           = SPR_OPENTTD_BASE + 87,
 
 	/* shared road & rail cursors */
 	SPR_CURSOR_BRIDGE         = 2593,
@@ -1317,47 +1351,52 @@
 	SPR_CURSOR_EW_MAGLEV      = 1273,
 	SPR_CURSOR_NWSE_MAGLEV    = 1274,
 
-	SPR_CURSOR_NS_ELRAIL      = SPR_ELRAIL_BASE + 43,
-	SPR_CURSOR_SWNE_ELRAIL    = SPR_ELRAIL_BASE + 44,
-	SPR_CURSOR_EW_ELRAIL      = SPR_ELRAIL_BASE + 45,
-	SPR_CURSOR_NWSE_ELRAIL    = SPR_ELRAIL_BASE + 46,
+	SPR_CURSOR_NS_ELRAIL      = SPR_ELRAIL_BASE + 40,
+	SPR_CURSOR_SWNE_ELRAIL    = SPR_ELRAIL_BASE + 41,
+	SPR_CURSOR_EW_ELRAIL      = SPR_ELRAIL_BASE + 42,
+	SPR_CURSOR_NWSE_ELRAIL    = SPR_ELRAIL_BASE + 43,
 
 	SPR_CURSOR_RAIL_STATION   = 1300,
 
 	SPR_CURSOR_TUNNEL_RAIL    = 2434,
-	SPR_CURSOR_TUNNEL_ELRAIL  = SPR_ELRAIL_BASE + 48,
+	SPR_CURSOR_TUNNEL_ELRAIL  = SPR_ELRAIL_BASE + 45,
 	SPR_CURSOR_TUNNEL_MONO    = 2435,
 	SPR_CURSOR_TUNNEL_MAGLEV  = 2436,
 
-	SPR_CURSOR_AUTORAIL       = SPR_OPENTTD_BASE + 4,
-	SPR_CURSOR_AUTOMONO       = SPR_OPENTTD_BASE + 5,
-	SPR_CURSOR_AUTOMAGLEV     = SPR_OPENTTD_BASE + 6,
+	SPR_CURSOR_AUTORAIL       = SPR_OPENTTD_BASE + 54,
+	SPR_CURSOR_AUTOELRAIL     = SPR_OPENTTD_BASE + 58,
+	SPR_CURSOR_AUTOMONO       = SPR_OPENTTD_BASE + 64,
+	SPR_CURSOR_AUTOMAGLEV     = SPR_OPENTTD_BASE + 70,
 
-	SPR_CURSOR_WAYPOINT       = SPR_OPENTTD_BASE + 7,
+	SPR_CURSOR_WAYPOINT       = SPR_OPENTTD_BASE + 77,
 
 	SPR_CURSOR_RAIL_DEPOT     = 1296,
-	SPR_CURSOR_MONO_DEPOT     = SPR_OPENTTD_BASE + 11,
-	SPR_CURSOR_MAGLEV_DEPOT   = SPR_OPENTTD_BASE + 12,
+	SPR_CURSOR_ELRAIL_DEPOT   = SPR_OPENTTD_BASE + 62,
+	SPR_CURSOR_MONO_DEPOT     = SPR_OPENTTD_BASE + 68,
+	SPR_CURSOR_MAGLEV_DEPOT   = SPR_OPENTTD_BASE + 74,
 
-	SPR_CURSOR_CONVERT_RAIL   = SPR_OPENTTD_BASE + 23,
-	SPR_CURSOR_CONVERT_MONO   = SPR_OPENTTD_BASE + 25,
-	SPR_CURSOR_CONVERT_MAGLEV = SPR_OPENTTD_BASE + 27,
+	SPR_CURSOR_CONVERT_RAIL   = SPR_OPENTTD_BASE + 56,
+	SPR_CURSOR_CONVERT_ELRAIL = SPR_OPENTTD_BASE + 60,
+	SPR_CURSOR_CONVERT_MONO   = SPR_OPENTTD_BASE + 66,
+	SPR_CURSOR_CONVERT_MAGLEV = SPR_OPENTTD_BASE + 72,
 
 	/* road cursors */
 	SPR_CURSOR_ROAD_NESW      = 1311,
 	SPR_CURSOR_ROAD_NWSE      = 1312,
+	SPR_CURSOR_AUTOROAD       = SPR_OPENTTD_BASE + 83,
 	SPR_CURSOR_TRAMWAY_NESW   = SPR_TRAMWAY_BASE + 2,
 	SPR_CURSOR_TRAMWAY_NWSE   = SPR_TRAMWAY_BASE + 3,
+	SPR_CURSOR_AUTOTRAM       = SPR_OPENTTD_BASE + 85,
 
 	SPR_CURSOR_ROAD_DEPOT     = 1297,
 	SPR_CURSOR_BUS_STATION    = 2725,
 	SPR_CURSOR_TRUCK_STATION  = 2726,
 	SPR_CURSOR_ROAD_TUNNEL    = 2433,
 
-	SPR_CURSOR_CLONE_TRAIN    = SPR_OPENTTD_BASE +  88,
-	SPR_CURSOR_CLONE_ROADVEH  = SPR_OPENTTD_BASE + 105,
-	SPR_CURSOR_CLONE_SHIP     = SPR_OPENTTD_BASE + 107,
-	SPR_CURSOR_CLONE_AIRPLANE = SPR_OPENTTD_BASE + 109
+	SPR_CURSOR_CLONE_TRAIN    = SPR_OPENTTD_BASE + 110,
+	SPR_CURSOR_CLONE_ROADVEH  = SPR_OPENTTD_BASE + 111,
+	SPR_CURSOR_CLONE_SHIP     = SPR_OPENTTD_BASE + 112,
+	SPR_CURSOR_CLONE_AIRPLANE = SPR_OPENTTD_BASE + 113,
 };
 
 /// Animation macro in table/animcursors.h (_animcursors[])
--- a/src/table/tree_land.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/table/tree_land.h	Mon Dec 03 23:39:38 2007 +0000
@@ -154,42 +154,42 @@
 	{ { 0x794, PAL_NONE }, { 0x794, PAL_NONE }, { 0x75c, PAL_NONE }, { 0x71d, PAL_NONE } }, /* 125 */
 	{ { 0x794, PAL_NONE }, { 0x724, PAL_NONE }, { 0x794, PAL_NONE }, { 0x71d, PAL_NONE } }, /* 126 */
 	{ { 0x794, PAL_NONE }, { 0x794, PAL_NONE }, { 0x771, PAL_NONE }, { 0x78d, PAL_NONE } }, /* 127 */
-	{ { 0x79b, PALETTE_TO_RED }, { 0x79b, PALETTE_TO_PALE_GREEN }, { 0x79b, PALETTE_TO_MAUVE }, { 0x79b, PALETTE_TO_PURPLE } }, /* 128 */
-	{ { 0x79b, PAL_NONE }, { 0x79b, PALETTE_TO_GREY }, { 0x79b, PALETTE_TO_GREEN }, { 0x79b, PALETTE_TO_WHITE } }, /* 129 */
-	{ { 0x79b, PALETTE_TO_GREEN }, { 0x79b, PALETTE_TO_ORANGE }, { 0x79b, PALETTE_TO_PINK }, { 0x79b, PAL_NONE } }, /* 130 */
-	{ { 0x79b, PALETTE_TO_YELLOW }, { 0x79b, PALETTE_TO_RED }, { 0x79b, PALETTE_TO_CREAM }, { 0x79b, PALETTE_TO_RED } }, /* 131 */
-	{ { 0x7a2, PAL_NONE }, { 0x7a2, PALETTE_TO_RED }, { 0x7a2, PALETTE_TO_PINK }, { 0x7a2, PALETTE_TO_PURPLE } }, /* 132 */
-	{ { 0x7a2, PALETTE_TO_MAUVE }, { 0x7a2, PALETTE_TO_GREEN }, { 0x7a2, PALETTE_TO_PINK }, { 0x7a2, PALETTE_TO_GREY } }, /* 133 */
-	{ { 0x7a2, PALETTE_TO_RED }, { 0x7a2, PALETTE_TO_PALE_GREEN }, { 0x7a2, PALETTE_TO_YELLOW }, { 0x7a2, PALETTE_TO_WHITE } }, /* 134 */
-	{ { 0x7a2, PALETTE_TO_ORANGE }, { 0x7a2, PALETTE_TO_MAUVE }, { 0x7a2, PALETTE_TO_CREAM }, { 0x7a2, PALETTE_TO_BROWN } }, /* 135 */
-	{ { 0x7a9, PALETTE_TO_RED }, { 0x7a9, PAL_NONE }, { 0x7a9, PALETTE_TO_ORANGE }, { 0x7a9, PALETTE_TO_GREY } }, /* 136 */
-	{ { 0x7a9, PALETTE_TO_ORANGE }, { 0x7a9, PALETTE_TO_GREEN }, { 0x7a9, PALETTE_TO_PALE_GREEN }, { 0x7a9, PALETTE_TO_MAUVE } }, /* 137 */
-	{ { 0x7a9, PALETTE_TO_PINK }, { 0x7a9, PALETTE_TO_RED }, { 0x7a9, PALETTE_TO_GREEN }, { 0x7a9, PALETTE_TO_BROWN } }, /* 138 */
-	{ { 0x7a9, PALETTE_TO_GREEN }, { 0x7a9, PAL_NONE }, { 0x7a9, PALETTE_TO_RED }, { 0x7a9, PALETTE_TO_CREAM } }, /* 139 */
-	{ { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE } }, /* 140 */
-	{ { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE } }, /* 141 */
-	{ { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE } }, /* 142 */
-	{ { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE }, { 0x7b0, PAL_NONE } }, /* 143 */
-	{ { 0x7b7, PALETTE_TO_PINK }, { 0x7b7, PALETTE_TO_RED }, { 0x7b7, PALETTE_TO_ORANGE }, { 0x7b7, PALETTE_TO_MAUVE } }, /* 144 */
-	{ { 0x7b7, PALETTE_TO_RED }, { 0x7b7, PAL_NONE }, { 0x7b7, PALETTE_TO_GREY }, { 0x7b7, PALETTE_TO_CREAM } }, /* 145 */
-	{ { 0x7b7, PALETTE_TO_GREEN }, { 0x7b7, PALETTE_TO_BROWN }, { 0x7b7, PALETTE_TO_PINK }, { 0x7b7, PALETTE_TO_RED } }, /* 146 */
-	{ { 0x7b7, PAL_NONE }, { 0x7b7, PALETTE_TO_PALE_GREEN }, { 0x7b7, PALETTE_TO_ORANGE }, { 0x7b7, PALETTE_TO_RED } }, /* 147 */
-	{ { 0x7be, PALETTE_TO_RED }, { 0x7be, PALETTE_TO_PINK }, { 0x7be, PALETTE_TO_GREEN }, { 0x7be, PAL_NONE } }, /* 148 */
-	{ { 0x7be, PALETTE_TO_GREEN }, { 0x7be, PALETTE_TO_BROWN }, { 0x7be, PALETTE_TO_PURPLE }, { 0x7be, PALETTE_TO_GREY } }, /* 149 */
-	{ { 0x7be, PALETTE_TO_MAUVE }, { 0x7be, PALETTE_TO_CREAM }, { 0x7be, PALETTE_TO_ORANGE }, { 0x7be, PALETTE_TO_RED } }, /* 150 */
-	{ { 0x7be, PAL_NONE }, { 0x7be, PALETTE_TO_RED }, { 0x7be, PALETTE_TO_PALE_GREEN }, { 0x7be, PALETTE_TO_PINK } }, /* 151 */
-	{ { 0x7c5, PALETTE_TO_YELLOW }, { 0x7c5, PALETTE_TO_RED }, { 0x7c5, PALETTE_TO_WHITE }, { 0x7c5, PALETTE_TO_CREAM } }, /* 152 */
-	{ { 0x7c5, PALETTE_TO_RED }, { 0x7c5, PALETTE_TO_PALE_GREEN }, { 0x7c5, PALETTE_TO_BROWN }, { 0x7c5, PALETTE_TO_YELLOW } }, /* 153 */
-	{ { 0x7c5, PAL_NONE }, { 0x7c5, PALETTE_TO_PURPLE }, { 0x7c5, PALETTE_TO_GREEN }, { 0x7c5, PALETTE_TO_YELLOW } }, /* 154 */
-	{ { 0x7c5, PALETTE_TO_PINK }, { 0x7c5, PALETTE_TO_CREAM }, { 0x7c5, PAL_NONE }, { 0x7c5, PALETTE_TO_GREY } }, /* 155 */
-	{ { 0x7cc, PALETTE_TO_YELLOW }, { 0x7cc, PALETTE_TO_GREY }, { 0x7cc, PALETTE_TO_PURPLE }, { 0x7cc, PALETTE_TO_BROWN } }, /* 156 */
-	{ { 0x7cc, PALETTE_TO_GREEN }, { 0x7cc, PAL_NONE }, { 0x7cc, PALETTE_TO_CREAM }, { 0x7cc, PALETTE_TO_WHITE } }, /* 157 */
-	{ { 0x7cc, PALETTE_TO_RED }, { 0x7cc, PALETTE_TO_PALE_GREEN }, { 0x7cc, PALETTE_TO_MAUVE }, { 0x7cc, PALETTE_TO_RED } }, /* 158 */
-	{ { 0x7cc, PALETTE_TO_PINK }, { 0x7cc, PALETTE_TO_ORANGE }, { 0x7cc, PALETTE_TO_GREEN }, { 0x7cc, PALETTE_TO_YELLOW } }, /* 159 */
-	{ { 0x7d3, PALETTE_TO_RED }, { 0x7d3, PALETTE_TO_PINK }, { 0x7d3, PALETTE_TO_BROWN }, { 0x7d3, PALETTE_TO_WHITE } }, /* 160 */
-	{ { 0x7d3, PALETTE_TO_GREEN }, { 0x7d3, PALETTE_TO_ORANGE }, { 0x7d3, PALETTE_TO_GREY }, { 0x7d3, PALETTE_TO_MAUVE } }, /* 161 */
-	{ { 0x7d3, PALETTE_TO_YELLOW }, { 0x7d3, PALETTE_TO_PALE_GREEN }, { 0x7d3, PAL_NONE }, { 0x7d3, PALETTE_TO_CREAM } }, /* 162 */
-	{ { 0x7d3, PALETTE_TO_GREY }, { 0x7d3, PALETTE_TO_RED }, { 0x7d3, PALETTE_TO_WHITE }, { 0x7d3, PAL_NONE } }, /* 163 */
+	{ { 0x79b, PALETTE_TO_RED },    { 0x79b, PALETTE_TO_PALE_GREEN }, { 0x79b, PALETTE_TO_MAUVE },      { 0x79b, PALETTE_TO_PURPLE } }, /* 128 */
+	{ { 0x79b, PAL_NONE },          { 0x79b, PALETTE_TO_GREY },       { 0x79b, PALETTE_TO_GREEN },      { 0x79b, PALETTE_TO_WHITE } },  /* 129 */
+	{ { 0x79b, PALETTE_TO_GREEN },  { 0x79b, PALETTE_TO_ORANGE },     { 0x79b, PALETTE_TO_PINK },       { 0x79b, PAL_NONE } },          /* 130 */
+	{ { 0x79b, PALETTE_TO_YELLOW }, { 0x79b, PALETTE_TO_RED },        { 0x79b, PALETTE_TO_CREAM },      { 0x79b, PALETTE_TO_RED } },    /* 131 */
+	{ { 0x7a2, PAL_NONE },          { 0x7a2, PALETTE_TO_RED },        { 0x7a2, PALETTE_TO_PINK },       { 0x7a2, PALETTE_TO_PURPLE } }, /* 132 */
+	{ { 0x7a2, PALETTE_TO_MAUVE },  { 0x7a2, PALETTE_TO_GREEN },      { 0x7a2, PALETTE_TO_PINK },       { 0x7a2, PALETTE_TO_GREY } },   /* 133 */
+	{ { 0x7a2, PALETTE_TO_RED },    { 0x7a2, PALETTE_TO_PALE_GREEN }, { 0x7a2, PALETTE_TO_YELLOW },     { 0x7a2, PALETTE_TO_WHITE } },  /* 134 */
+	{ { 0x7a2, PALETTE_TO_ORANGE }, { 0x7a2, PALETTE_TO_MAUVE },      { 0x7a2, PALETTE_TO_CREAM },      { 0x7a2, PALETTE_TO_BROWN } },  /* 135 */
+	{ { 0x7a9, PALETTE_TO_RED },    { 0x7a9, PAL_NONE },              { 0x7a9, PALETTE_TO_ORANGE },     { 0x7a9, PALETTE_TO_GREY } },   /* 136 */
+	{ { 0x7a9, PALETTE_TO_ORANGE }, { 0x7a9, PALETTE_TO_GREEN },      { 0x7a9, PALETTE_TO_PALE_GREEN }, { 0x7a9, PALETTE_TO_MAUVE } },  /* 137 */
+	{ { 0x7a9, PALETTE_TO_PINK },   { 0x7a9, PALETTE_TO_RED },        { 0x7a9, PALETTE_TO_GREEN },      { 0x7a9, PALETTE_TO_BROWN } },  /* 138 */
+	{ { 0x7a9, PALETTE_TO_GREEN },  { 0x7a9, PAL_NONE },              { 0x7a9, PALETTE_TO_RED },        { 0x7a9, PALETTE_TO_CREAM } },  /* 139 */
+	{ { 0x7b0, PAL_NONE },          { 0x7b0, PAL_NONE },              { 0x7b0, PAL_NONE },              { 0x7b0, PAL_NONE } },          /* 140 */
+	{ { 0x7b0, PAL_NONE },          { 0x7b0, PAL_NONE },              { 0x7b0, PAL_NONE },              { 0x7b0, PAL_NONE } },          /* 141 */
+	{ { 0x7b0, PAL_NONE },          { 0x7b0, PAL_NONE },              { 0x7b0, PAL_NONE },              { 0x7b0, PAL_NONE } },          /* 142 */
+	{ { 0x7b0, PAL_NONE },          { 0x7b0, PAL_NONE },              { 0x7b0, PAL_NONE },              { 0x7b0, PAL_NONE } },          /* 143 */
+	{ { 0x7b7, PALETTE_TO_PINK },   { 0x7b7, PALETTE_TO_RED },        { 0x7b7, PALETTE_TO_ORANGE },     { 0x7b7, PALETTE_TO_MAUVE } },  /* 144 */
+	{ { 0x7b7, PALETTE_TO_RED },    { 0x7b7, PAL_NONE },              { 0x7b7, PALETTE_TO_GREY },       { 0x7b7, PALETTE_TO_CREAM } },  /* 145 */
+	{ { 0x7b7, PALETTE_TO_GREEN },  { 0x7b7, PALETTE_TO_BROWN },      { 0x7b7, PALETTE_TO_PINK },       { 0x7b7, PALETTE_TO_RED } },    /* 146 */
+	{ { 0x7b7, PAL_NONE },          { 0x7b7, PALETTE_TO_PALE_GREEN }, { 0x7b7, PALETTE_TO_ORANGE },     { 0x7b7, PALETTE_TO_RED } },    /* 147 */
+	{ { 0x7be, PALETTE_TO_RED },    { 0x7be, PALETTE_TO_PINK },       { 0x7be, PALETTE_TO_GREEN },      { 0x7be, PAL_NONE } },          /* 148 */
+	{ { 0x7be, PALETTE_TO_GREEN },  { 0x7be, PALETTE_TO_BROWN },      { 0x7be, PALETTE_TO_PURPLE },     { 0x7be, PALETTE_TO_GREY } },   /* 149 */
+	{ { 0x7be, PALETTE_TO_MAUVE },  { 0x7be, PALETTE_TO_CREAM },      { 0x7be, PALETTE_TO_ORANGE },     { 0x7be, PALETTE_TO_RED } },    /* 150 */
+	{ { 0x7be, PAL_NONE },          { 0x7be, PALETTE_TO_RED },        { 0x7be, PALETTE_TO_PALE_GREEN }, { 0x7be, PALETTE_TO_PINK } },   /* 151 */
+	{ { 0x7c5, PALETTE_TO_YELLOW }, { 0x7c5, PALETTE_TO_RED },        { 0x7c5, PALETTE_TO_WHITE },      { 0x7c5, PALETTE_TO_CREAM } },  /* 152 */
+	{ { 0x7c5, PALETTE_TO_RED },    { 0x7c5, PALETTE_TO_PALE_GREEN }, { 0x7c5, PALETTE_TO_BROWN },      { 0x7c5, PALETTE_TO_YELLOW } }, /* 153 */
+	{ { 0x7c5, PAL_NONE },          { 0x7c5, PALETTE_TO_PURPLE },     { 0x7c5, PALETTE_TO_GREEN },      { 0x7c5, PALETTE_TO_YELLOW } }, /* 154 */
+	{ { 0x7c5, PALETTE_TO_PINK },   { 0x7c5, PALETTE_TO_CREAM },      { 0x7c5, PAL_NONE },              { 0x7c5, PALETTE_TO_GREY } },   /* 155 */
+	{ { 0x7cc, PALETTE_TO_YELLOW }, { 0x7cc, PALETTE_TO_GREY },       { 0x7cc, PALETTE_TO_PURPLE },     { 0x7cc, PALETTE_TO_BROWN } },  /* 156 */
+	{ { 0x7cc, PALETTE_TO_GREEN },  { 0x7cc, PAL_NONE },              { 0x7cc, PALETTE_TO_CREAM },      { 0x7cc, PALETTE_TO_WHITE } },  /* 157 */
+	{ { 0x7cc, PALETTE_TO_RED },    { 0x7cc, PALETTE_TO_PALE_GREEN }, { 0x7cc, PALETTE_TO_MAUVE },      { 0x7cc, PALETTE_TO_RED } },    /* 158 */
+	{ { 0x7cc, PALETTE_TO_PINK },   { 0x7cc, PALETTE_TO_ORANGE },     { 0x7cc, PALETTE_TO_GREEN },      { 0x7cc, PALETTE_TO_YELLOW } }, /* 159 */
+	{ { 0x7d3, PALETTE_TO_RED },    { 0x7d3, PALETTE_TO_PINK },       { 0x7d3, PALETTE_TO_BROWN },      { 0x7d3, PALETTE_TO_WHITE } },  /* 160 */
+	{ { 0x7d3, PALETTE_TO_GREEN },  { 0x7d3, PALETTE_TO_ORANGE },     { 0x7d3, PALETTE_TO_GREY },       { 0x7d3, PALETTE_TO_MAUVE } },  /* 161 */
+	{ { 0x7d3, PALETTE_TO_YELLOW }, { 0x7d3, PALETTE_TO_PALE_GREEN }, { 0x7d3, PAL_NONE },              { 0x7d3, PALETTE_TO_CREAM } },  /* 162 */
+	{ { 0x7d3, PALETTE_TO_GREY },   { 0x7d3, PALETTE_TO_RED },        { 0x7d3, PALETTE_TO_WHITE },      { 0x7d3, PAL_NONE } },          /* 163 */
 	/* the extra things follow */
 	{ { 0x6e5, PAL_NONE }, { 0x6e5, PAL_NONE }, { 0x6e5, PAL_NONE }, { 0x6e5, PAL_NONE } }, /* 0 */
 	{ { 0x6e5, PAL_NONE }, { 0x6e5, PAL_NONE }, { 0x6fa, PAL_NONE }, { 0x708, PAL_NONE } }, /* 1 */
--- a/src/terraform_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/terraform_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -167,27 +167,27 @@
 
 static void TerraformClick_Lower(Window *w)
 {
-	HandlePlacePushButton(w, 4, ANIMCURSOR_LOWERLAND, 2, PlaceProc_LowerLand);
+	HandlePlacePushButton(w, 4, ANIMCURSOR_LOWERLAND, VHM_POINT, PlaceProc_LowerLand);
 }
 
 static void TerraformClick_Raise(Window *w)
 {
-	HandlePlacePushButton(w, 5, ANIMCURSOR_RAISELAND, 2, PlaceProc_RaiseLand);
+	HandlePlacePushButton(w, 5, ANIMCURSOR_RAISELAND, VHM_POINT, PlaceProc_RaiseLand);
 }
 
 static void TerraformClick_Level(Window *w)
 {
-	HandlePlacePushButton(w, 6, SPR_CURSOR_LEVEL_LAND, 2, PlaceProc_LevelLand);
+	HandlePlacePushButton(w, 6, SPR_CURSOR_LEVEL_LAND, VHM_POINT, PlaceProc_LevelLand);
 }
 
 static void TerraformClick_Dynamite(Window *w)
 {
-	HandlePlacePushButton(w, 7, ANIMCURSOR_DEMOLISH , 1, PlaceProc_DemolishArea);
+	HandlePlacePushButton(w, 7, ANIMCURSOR_DEMOLISH , VHM_RECT, PlaceProc_DemolishArea);
 }
 
 static void TerraformClick_BuyLand(Window *w)
 {
-	HandlePlacePushButton(w, 8, SPR_CURSOR_BUY_LAND, 1, PlaceProc_BuyLand);
+	HandlePlacePushButton(w, 8, SPR_CURSOR_BUY_LAND, VHM_RECT, PlaceProc_BuyLand);
 }
 
 static void TerraformClick_Trees(Window *w)
@@ -198,7 +198,7 @@
 
 static void TerraformClick_PlaceSign(Window *w)
 {
-	HandlePlacePushButton(w, 10, SPR_CURSOR_SIGN, 1, PlaceProc_Sign);
+	HandlePlacePushButton(w, 10, SPR_CURSOR_SIGN, VHM_RECT, PlaceProc_Sign);
 }
 
 static OnButtonClick * const _terraform_button_proc[] = {
--- a/src/texteff.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/texteff.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -20,12 +20,12 @@
 #include "date.h"
 #include "texteff.hpp"
 #include "video/video_driver.hpp"
+#include "transparency.h"
 
 enum {
 	MAX_TEXTMESSAGE_LENGTH = 200,
 	INIT_NUM_TEXT_MESSAGES =  20,
 	MAX_CHAT_MESSAGES      =  10,
-	MAX_ANIMATED_TILES     = 256,
 };
 
 struct TextEffect {
@@ -50,7 +50,6 @@
 /* used for text effects */
 static TextEffect *_text_effect_list = NULL;
 static uint16 _num_text_effects = INIT_NUM_TEXT_MESSAGES;
-TileIndex _animated_tile_list[MAX_ANIMATED_TILES];
 
 /* used for chat window */
 static ChatMessage _chatmsg_list[MAX_CHAT_MESSAGES];
@@ -392,7 +391,7 @@
 						dpi->top  <= te->bottom &&
 						dpi->left + dpi->width  > te->x &&
 						dpi->top  + dpi->height > te->y) {
-					if (te->mode == TE_RISING || (_patches.loading_indicators && !HASBIT(_transparent_opt, TO_LOADING))) {
+					if (te->mode == TE_RISING || (_patches.loading_indicators && !IsTransparencySet(TO_LOADING))) {
 						AddStringToDraw(te->x, te->y, te->string_id, te->params_1, te->params_2);
 					}
 				}
@@ -407,7 +406,7 @@
 						dpi->top  <= te->bottom * 2 - te->y &&
 						dpi->left + dpi->width  > te->x &&
 						dpi->top  + dpi->height > te->y) {
-					if (te->mode == TE_RISING || (_patches.loading_indicators && !HASBIT(_transparent_opt, TO_LOADING))) {
+					if (te->mode == TE_RISING || (_patches.loading_indicators && !IsTransparencySet(TO_LOADING))) {
 						AddStringToDraw(te->x, te->y, (StringID)(te->string_id - 1), te->params_1, te->params_2);
 					}
 				}
@@ -422,62 +421,127 @@
 	}
 }
 
+/** The table/list with animated tiles. */
+TileIndex *_animated_tile_list = NULL;
+/** The number of animated tiles in the current state. */
+uint _animated_tile_count = 0;
+/** The number of slots for animated tiles allocated currently. */
+static uint _animated_tile_allocated = 0;
+
+/**
+ * Removes the given tile from the animated tile table.
+ * @param tile the tile to remove
+ */
 void DeleteAnimatedTile(TileIndex tile)
 {
-	TileIndex *ti;
-
-	for (ti = _animated_tile_list; ti != endof(_animated_tile_list); ti++) {
+	for (TileIndex *ti = _animated_tile_list; ti < _animated_tile_list + _animated_tile_count; ti++) {
 		if (tile == *ti) {
-			/* remove the hole */
-			memmove(ti, ti + 1, (lastof(_animated_tile_list) - ti) * sizeof(*ti));
-			/* and clear last item */
-			*lastof(_animated_tile_list) = 0;
+			/* Remove the hole
+			 * The order of the remaining elements must stay the same, otherwise the animation loop
+			 * may miss a tile; that's why we must use memmove instead of just moving the last element.
+			 */
+			memmove(ti, ti + 1, (_animated_tile_list + _animated_tile_count - (ti + 1)) * sizeof(*ti));
+			_animated_tile_count--;
 			MarkTileDirtyByTile(tile);
 			return;
 		}
 	}
 }
 
-bool AddAnimatedTile(TileIndex tile)
+/**
+ * Add the given tile to the animated tile table (if it does not exist
+ * on that table yet). Also increases the size of the table if necessary.
+ * @param tile the tile to make animated
+ */
+void AddAnimatedTile(TileIndex tile)
 {
-	TileIndex *ti;
+	MarkTileDirtyByTile(tile);
 
-	for (ti = _animated_tile_list; ti != endof(_animated_tile_list); ti++) {
-		if (tile == *ti || *ti == 0) {
-			*ti = tile;
-			MarkTileDirtyByTile(tile);
-			return true;
-		}
+	for (const TileIndex *ti = _animated_tile_list; ti < _animated_tile_list + _animated_tile_count; ti++) {
+		if (tile == *ti) return;
 	}
 
-	return false;
+	/* Table not large enough, so make it larger */
+	if (_animated_tile_count == _animated_tile_allocated) {
+		_animated_tile_allocated *= 2;
+		_animated_tile_list = ReallocT<TileIndex>(_animated_tile_list, _animated_tile_allocated);
+	}
+
+	_animated_tile_list[_animated_tile_count] = tile;
+	_animated_tile_count++;
 }
 
+/**
+ * Animate all tiles in the animated tile list, i.e.\ call AnimateTile on them.
+ */
 void AnimateAnimatedTiles()
 {
-	const TileIndex* ti;
-
-	for (ti = _animated_tile_list; ti != endof(_animated_tile_list) && *ti != 0; ti++) {
-		AnimateTile(*ti);
+	const TileIndex *ti = _animated_tile_list;
+	while (ti < _animated_tile_list + _animated_tile_count) {
+		const TileIndex curr = *ti;
+		AnimateTile(curr);
+		/* During the AnimateTile call, DeleteAnimatedTile could have been called,
+		 * deleting an element we've already processed and pushing the rest one
+		 * slot to the left. We can detect this by checking whether the index
+		 * in the current slot has changed - if it has, an element has been deleted,
+		 * and we should process the current slot again instead of going forward.
+		 * NOTE: this will still break if more than one animated tile is being
+		 *       deleted during the same AnimateTile call, but no code seems to
+		 *       be doing this anyway.
+		 */
+		if (*ti == curr) ++ti;
 	}
 }
 
+/**
+ * Initialize all animated tile variables to some known begin point
+ */
 void InitializeAnimatedTiles()
 {
-	memset(_animated_tile_list, 0, sizeof(_animated_tile_list));
+	_animated_tile_list = ReallocT<TileIndex>(_animated_tile_list, 256);
+	_animated_tile_count = 0;
+	_animated_tile_allocated = 256;
 }
 
-static void SaveLoad_ANIT()
+/**
+ * Save the ANIT chunk.
+ */
+static void Save_ANIT()
 {
-	/* In pre version 6, we has 16bit per tile, now we have 32bit per tile, convert it ;) */
-	if (CheckSavegameVersion(6)) {
-		SlArray(_animated_tile_list, lengthof(_animated_tile_list), SLE_FILE_U16 | SLE_VAR_U32);
-	} else {
-		SlArray(_animated_tile_list, lengthof(_animated_tile_list), SLE_UINT32);
-	}
+	SlSetLength(_animated_tile_count * sizeof(*_animated_tile_list));
+	SlArray(_animated_tile_list, _animated_tile_count, SLE_UINT32);
 }
 
+/**
+ * Load the ANIT chunk; the chunk containing the animated tiles.
+ */
+static void Load_ANIT()
+{
+	/* Before version 80 we did NOT have a variable length animated tile table */
+	if (CheckSavegameVersion(80)) {
+		/* In pre version 6, we has 16bit per tile, now we have 32bit per tile, convert it ;) */
+		SlArray(_animated_tile_list, 256, CheckSavegameVersion(6) ? (SLE_FILE_U16 | SLE_VAR_U32) : SLE_UINT32);
 
+		for (_animated_tile_count = 0; _animated_tile_count < 256; _animated_tile_count++) {
+			if (_animated_tile_list[_animated_tile_count] == 0) break;
+		}
+		return;
+	}
+
+	_animated_tile_count = SlGetFieldLength() / sizeof(*_animated_tile_list);
+
+	/* Determine a nice rounded size for the amount of allocated tiles */
+	_animated_tile_allocated = 256;
+	while (_animated_tile_allocated < _animated_tile_count) _animated_tile_allocated *= 2;
+
+	_animated_tile_list = ReallocT<TileIndex>(_animated_tile_list, _animated_tile_allocated);
+	SlArray(_animated_tile_list, _animated_tile_count, SLE_UINT32);
+}
+
+/**
+ * "Definition" imported by the saveload code to be able to load and save
+ * the animated tile table.
+ */
 extern const ChunkHandler _animated_tile_chunk_handlers[] = {
-	{ 'ANIT', SaveLoad_ANIT, SaveLoad_ANIT, CH_RIFF | CH_LAST},
+	{ 'ANIT', Save_ANIT, Load_ANIT, CH_RIFF | CH_LAST},
 };
--- a/src/tgp.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/tgp.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -540,7 +540,7 @@
 	/* Lower to sea level */
 	for (y = 0; y <= _height_map.size_y; y++) {
 		/* Top right */
-		max_x = myabs((perlin_coast_noise_2D(_height_map.size_y - y, y, 0.9, 53) + 0.25) * 5 + (perlin_coast_noise_2D(y, y, 0.35, 179) + 1) * 12);
+		max_x = abs((perlin_coast_noise_2D(_height_map.size_y - y, y, 0.9, 53) + 0.25) * 5 + (perlin_coast_noise_2D(y, y, 0.35, 179) + 1) * 12);
 		max_x = max((smallest_size * smallest_size / 16) + max_x, (smallest_size * smallest_size / 16) + margin - max_x);
 		if (smallest_size < 8 && max_x > 5) max_x /= 1.5;
 		for (x = 0; x < max_x; x++) {
@@ -548,7 +548,7 @@
 		}
 
 		/* Bottom left */
-		max_x = myabs((perlin_coast_noise_2D(_height_map.size_y - y, y, 0.85, 101) + 0.3) * 6 + (perlin_coast_noise_2D(y, y, 0.45,  67) + 0.75) * 8);
+		max_x = abs((perlin_coast_noise_2D(_height_map.size_y - y, y, 0.85, 101) + 0.3) * 6 + (perlin_coast_noise_2D(y, y, 0.45,  67) + 0.75) * 8);
 		max_x = max((smallest_size * smallest_size / 16) + max_x, (smallest_size * smallest_size / 16) + margin - max_x);
 		if (smallest_size < 8 && max_x > 5) max_x /= 1.5;
 		for (x = _height_map.size_x; x > (_height_map.size_x - 1 - max_x); x--) {
@@ -559,7 +559,7 @@
 	/* Lower to sea level */
 	for (x = 0; x <= _height_map.size_x; x++) {
 		/* Top left */
-		max_y = myabs((perlin_coast_noise_2D(x, _height_map.size_y / 2, 0.9, 167) + 0.4) * 5 + (perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.4, 211) + 0.7) * 9);
+		max_y = abs((perlin_coast_noise_2D(x, _height_map.size_y / 2, 0.9, 167) + 0.4) * 5 + (perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.4, 211) + 0.7) * 9);
 		max_y = max((smallest_size * smallest_size / 16) + max_y, (smallest_size * smallest_size / 16) + margin - max_y);
 		if (smallest_size < 8 && max_y > 5) max_y /= 1.5;
 		for (y = 0; y < max_y; y++) {
@@ -568,7 +568,7 @@
 
 
 		/* Bottom right */
-		max_y = myabs((perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.85, 71) + 0.25) * 6 + (perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.35, 193) + 0.75) * 12);
+		max_y = abs((perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.85, 71) + 0.25) * 6 + (perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.35, 193) + 0.75) * 12);
 		max_y = max((smallest_size * smallest_size / 16) + max_y, (smallest_size * smallest_size / 16) + margin - max_y);
 		if (smallest_size < 8 && max_y > 5) max_y /= 1.5;
 		for (y = _height_map.size_y; y > (_height_map.size_y - 1 - max_y); y--) {
--- a/src/timetable_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/timetable_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -23,7 +23,7 @@
 		order->wait_time = time;
 	}
 
-	if (v->cur_order_index == order_number && HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS)) {
+	if (v->cur_order_index == order_number && HasBit(v->current_order.flags, OFB_PART_OF_ORDERS)) {
 		if (is_journey) {
 			v->current_order.travel_time = time;
 		} else {
@@ -31,7 +31,9 @@
 		}
 	}
 
-	InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
+	for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
+		InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
+	}
 }
 
 /**
@@ -59,7 +61,7 @@
 	Order *order = GetVehicleOrder(v, order_number);
 	if (order == NULL) return CMD_ERROR;
 
-	bool is_journey = HASBIT(p1, 24);
+	bool is_journey = HasBit(p1, 24);
 	if (!is_journey) {
 		if (order->type != OT_GOTO_STATION) return_cmd_error(STR_TIMETABLE_ONLY_WAIT_AT_STATIONS);
 		if (_patches.new_nonstop && (order->flags & OF_NON_STOP)) return_cmd_error(STR_TIMETABLE_NOT_STOPPING_HERE);
@@ -119,8 +121,8 @@
 		if (p2 == 1) {
 			/* Start autofilling the timetable, which clears all the current
 			 * timings and clears the "timetable has started" bit. */
-			SETBIT(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
-			CLRBIT(v->vehicle_flags, VF_TIMETABLE_STARTED);
+			SetBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
+			ClrBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
 
 			for (Order *order = GetVehicleOrder(v, 0); order != NULL; order = order->next) {
 				order->wait_time = 0;
@@ -130,10 +132,14 @@
 			v->current_order.wait_time = 0;
 			v->current_order.travel_time = 0;
 		} else {
-			CLRBIT(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
+			ClrBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
 		}
 	}
 
+	for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
+		InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
+	}
+
 	return CommandCost();
 }
 
@@ -148,14 +154,14 @@
 
 	/* Make sure the timetable only starts when the vehicle reaches the first
  	 * order, not when travelling from the depot to the first station. */
- 	if (v->cur_order_index == 0 && !HASBIT(v->vehicle_flags, VF_TIMETABLE_STARTED)) {
- 		SETBIT(v->vehicle_flags, VF_TIMETABLE_STARTED);
+ 	if (v->cur_order_index == 0 && !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) {
+ 		SetBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
  		return;
  	}
 
-	if (!HASBIT(v->vehicle_flags, VF_TIMETABLE_STARTED)) return;
+	if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) return;
 
- 	if (HASBIT(v->vehicle_flags, VF_AUTOFILL_TIMETABLE)) {
+ 	if (HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE)) {
 		if (timetabled == 0) {
 			/* Round the time taken up to the nearest day, as this will avoid
 			 * confusion for people who are timetabling in days, and can be
@@ -167,7 +173,7 @@
 		} else if (v->cur_order_index == 0) {
 			/* Otherwise if we're at the beginning and it already has a value,
 			 * assume that autofill is finished and turn it off again. */
-			CLRBIT(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
+			ClrBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
 		}
  	}
 
@@ -178,5 +184,7 @@
 
 	v->lateness_counter -= (timetabled - time_taken);
 
-	InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
+	for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
+		InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
+	}
 }
--- a/src/timetable_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/timetable_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -54,29 +54,29 @@
 
 	if (v->owner == _local_player) {
 		if (selected == -1) {
-			DisableWindowWidget(w, 6);
-			DisableWindowWidget(w, 7);
+			w->DisableWidget(6);
+			w->DisableWidget(7);
 		} else if (selected % 2 == 1) {
-			EnableWindowWidget(w, 6);
-			EnableWindowWidget(w, 7);
+			w->EnableWidget(6);
+			w->EnableWidget(7);
 		} else {
 			const Order *order = GetVehicleOrder(v, (selected + 1) / 2);
 			bool disable = order == NULL || order->type != OT_GOTO_STATION || (_patches.new_nonstop && (order->flags & OF_NON_STOP));
 
-			SetWindowWidgetDisabledState(w, 6, disable);
-			SetWindowWidgetDisabledState(w, 7, disable);
+			w->SetWidgetDisabledState(6, disable);
+			w->SetWidgetDisabledState(7, disable);
 		}
 
-		EnableWindowWidget(w, 8);
-		EnableWindowWidget(w, 9);
+		w->EnableWidget(8);
+		w->EnableWidget(9);
 	} else {
-		DisableWindowWidget(w, 6);
-		DisableWindowWidget(w, 7);
-		DisableWindowWidget(w, 8);
-		DisableWindowWidget(w, 9);
+		w->DisableWidget(6);
+		w->DisableWidget(7);
+		w->DisableWidget(8);
+		w->DisableWidget(9);
 	}
 
-	SetWindowWidgetLoweredState(w, 9, HASBIT(v->vehicle_flags, VF_AUTOFILL_TIMETABLE));
+	w->SetWidgetLoweredState(9, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE));
 
 	SetDParam(0, v->index);
 	DrawWindowWidgets(w);
@@ -141,8 +141,7 @@
 				default: break;
 			}
 
-			const byte colour = (i == selected) ? 0xC : 0x10;
-			DrawString(2, y, STR_TIMETABLE_GO_TO, colour);
+			DrawString(2, y, STR_TIMETABLE_GO_TO, (i == selected) ? TC_WHITE : TC_BLACK);
 
 			order_id++;
 
@@ -162,8 +161,7 @@
 				string = STR_TIMETABLE_TRAVEL_FOR;
 			}
 
-			const byte colour = (i == selected) ? 0xC : 0x10;
-			DrawString(12, y, string, colour);
+			DrawString(12, y, string, (i == selected) ? TC_WHITE : TC_BLACK);
 
 			if (final_order) break;
 		}
@@ -186,16 +184,16 @@
 
 		if (total_time != 0) {
 			SetTimetableParams(0, 1, total_time);
-			DrawString(2, y, complete ? STR_TIMETABLE_TOTAL_TIME : STR_TIMETABLE_TOTAL_TIME_INCOMPLETE, 0x10);
+			DrawString(2, y, complete ? STR_TIMETABLE_TOTAL_TIME : STR_TIMETABLE_TOTAL_TIME_INCOMPLETE, TC_BLACK);
 		}
 	}
 	y += 10;
 
 	if (v->lateness_counter == 0 || (!_patches.timetable_in_ticks && v->lateness_counter / DAY_TICKS == 0)) {
-		DrawString(2, y, STR_TIMETABLE_STATUS_ON_TIME, 0x10);
+		DrawString(2, y, STR_TIMETABLE_STATUS_ON_TIME, TC_BLACK);
 	} else {
 		SetTimetableParams(0, 1, abs(v->lateness_counter));
-		DrawString(2, y, v->lateness_counter < 0 ? STR_TIMETABLE_STATUS_EARLY : STR_TIMETABLE_STATUS_LATE, 0x10);
+		DrawString(2, y, v->lateness_counter < 0 ? STR_TIMETABLE_STATUS_EARLY : STR_TIMETABLE_STATUS_LATE, TC_BLACK);
 	}
 }
 
@@ -264,7 +262,7 @@
 					break;
 
 				case 9: /* Autofill the timetable. */
-					DoCommandP(0, v->index, HASBIT(v->vehicle_flags, VF_AUTOFILL_TIMETABLE) ? 0 : 1, NULL, CMD_AUTOFILL_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
+					DoCommandP(0, v->index, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE) ? 0 : 1, NULL, CMD_AUTOFILL_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
 					break;
 			}
 
--- a/src/town.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/town.h	Mon Dec 03 23:39:38 2007 +0000
@@ -207,6 +207,7 @@
 uint32 GetWorldPopulation();
 
 void UpdateTownVirtCoord(Town *t);
+void UpdateAllTownVirtCoords();
 void InitializeTown();
 void ShowTownViewWindow(TownID town);
 void ExpandTown(Town *t);
--- a/src/town_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/town_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -42,6 +42,8 @@
 #include "newgrf_townname.h"
 #include "misc/autoptr.hpp"
 #include "autoslope.h"
+#include "waypoint.h"
+#include "transparency.h"
 
 /* Initialize the town-pool */
 DEFINE_OLD_POOL_GENERIC(Town, Town)
@@ -182,10 +184,10 @@
 			dcts->height,
 			dcts->dz,
 			ti->z,
-			HASBIT(_transparent_opt, TO_HOUSES)
+			IsTransparencySet(TO_HOUSES)
 		);
 
-		if (HASBIT(_transparent_opt, TO_HOUSES)) return;
+		if (IsTransparencySet(TO_HOUSES)) return;
 	}
 
 	{
@@ -309,6 +311,15 @@
 	MarkTownSignDirty(t);
 }
 
+/** Update the virtual coords needed to draw the town sign for all towns. */
+void UpdateAllTownVirtCoords()
+{
+	Town *t;
+	FOR_ALL_TOWNS(t) {
+		UpdateTownVirtCoord(t);
+	}
+}
+
 /**
  * Change the towns population
  * @param t Town which polulation has changed
@@ -354,7 +365,7 @@
 	if (GetHouseConstructionTick(tile) != 0) return;
 
 	/* Check and/or  */
-	if (HASBIT(GetHouseSpecs(GetHouseType(tile))->callback_mask, CBM_HOUSE_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);
 	}
@@ -404,14 +415,14 @@
 	if ((hs->building_flags & BUILDING_IS_ANIMATED) &&
 			house_id < NEW_HOUSE_OFFSET &&
 			!LiftHasDestination(tile) &&
-			CHANCE16(1, 2))
+			Chance16(1, 2))
 		AddAnimatedTile(tile);
 
 	t = GetTownByTile(tile);
 
 	r = Random();
 
-	if (HASBIT(hs->callback_mask, CBM_HOUSE_PRODUCE_CARGO)) {
+	if (HasBit(hs->callback_mask, CBM_HOUSE_PRODUCE_CARGO)) {
 		for (uint i = 0; i < 256; i++) {
 			uint16 callback = GetHouseCallback(CBID_HOUSE_PRODUCE_CARGO, i, r, house_id, t, tile);
 
@@ -465,7 +476,7 @@
 	_current_player = OWNER_TOWN;
 
 	if (hs->building_flags & BUILDING_HAS_1_TILE &&
-			HASBIT(t->flags12, TOWN_IS_FUNDED) &&
+			HasBit(t->flags12, TOWN_IS_FUNDED) &&
 			CanDeleteHouse(tile) &&
 			max(_cur_year - GetHouseConstructionYear(tile), 0) >= hs->minimum_life &&
 			--t->time_until_rebuild == 0) {
@@ -531,7 +542,7 @@
 	}
 
 	/* Check for custom accepted cargo types */
-	if (HASBIT(hs->callback_mask, CBM_HOUSE_ACCEPT_CARGO)) {
+	if (HasBit(hs->callback_mask, CBM_HOUSE_ACCEPT_CARGO)) {
 		uint16 callback = GetHouseCallback(CBID_HOUSE_ACCEPT_CARGO, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 		if (callback != CALLBACK_FAILED) {
 			/* Replace accepted cargo types with translated values from callback */
@@ -542,12 +553,12 @@
 	}
 
 	/* Check for custom cargo acceptance */
-	if (HASBIT(hs->callback_mask, CBM_HOUSE_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);
 			if (accepts[1] != CT_INVALID) ac[accepts[1]] = GB(callback, 4, 4);
-			if (_opt.landscape != LT_TEMPERATE && HASBIT(callback, 12)) {
+			if (_opt.landscape != LT_TEMPERATE && HasBit(callback, 12)) {
 				/* The 'S' bit indicates food instead of goods */
 				ac[CT_FOOD] = GB(callback, 8, 4);
 			} else {
@@ -589,7 +600,7 @@
 
 static void TownTickHandler(Town *t)
 {
-	if (HASBIT(t->flags12, TOWN_IS_FUNDED)) {
+	if (HasBit(t->flags12, TOWN_IS_FUNDED)) {
 		int i = t->grow_counter - 1;
 		if (i < 0) {
 			if (GrowTown(t)) {
@@ -727,20 +738,16 @@
 
 		/* If the tile is not a slope in the right direction, then
 		 * maybe terraform some. */
-		desired_slope = (dir == DIAGDIR_NW || dir == DIAGDIR_SE) ? SLOPE_NE : SLOPE_NW;
+		desired_slope = (dir == DIAGDIR_NW || dir == DIAGDIR_SE) ? SLOPE_NW : SLOPE_NE;
 		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, cur_slope, 0, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
-				} else {
+			if (Chance16(1, 8)) {
+				CommandCost res = CMD_ERROR;
+				if (!_generating_world && Chance16(1, 10)) {
 					/* Note: Do not replace " ^ 0xF" with ComplementSlope(). The slope might be steep. */
-					res = DoCommand(tile, cur_slope ^ 0xF, 1, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
+					res = DoCommand(tile, Chance16(1, 16) ? cur_slope : cur_slope ^ 0xF, 0,
+							DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
 				}
-				if (CmdFailed(res) && CHANCE16I(1, 3, r)) {
+				if (CmdFailed(res) && Chance16(1, 3)) {
 					/* We can consider building on the slope, though. */
 					goto no_slope;
 				}
@@ -809,38 +816,33 @@
 			break;
 	}
 
-	/* 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)) {
-			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_S:
-			case SLOPE_STEEP_E:
-			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));
+	if (rcmd != ROAD_ALL) return rcmd;
+
+	RoadBits rb_template;
+
+	switch (GetTileSlope(tile, NULL)) {
+		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_S:
+		case SLOPE_STEEP_E:
+		case SLOPE_STEEP_N:
+			rb_template = ROAD_NONE;
+			break;
 	}
 
-	return rcmd;
+	/* 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));
 }
 
 /**
@@ -901,38 +903,44 @@
  *
  * @param t The current town
  * @param tile The current tile
- * @param rcmd The RoadBits which are possible on this tile
+ * @param bridge_dir The valid direction in which to grow a bridge
  * @return true if a bridge has been build else false
  */
-static bool GrowTownWithBridge(const Town *t, TileIndex tile, RoadBits rcmd)
+static bool GrowTownWithBridge(const Town *t, TileIndex tile, DiagDirection bridge_dir)
 {
-	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;
+	assert(bridge_dir < DIAGDIR_END);
+
+	const Slope slope = GetTileSlope(tile, NULL);
+	if (slope == SLOPE_FLAT) return false; // no slope, no bridge
+
+	/* Make sure the direction is compatible with the slope.
+	 * If any of the following bits match, the slope is forbidden for
+	 *  that diagdir. This means 5 non-steep slopes, and 3 steep-slopes
+	 *  per diagdir.
+	 * 0 -> 0b1100
+	 * 1 -> 0b0110
+	 * 2 -> 0b0011
+	 * 3 -> 0b1001
+	 * 0xCC is 0b11001100, so we just shift it right with
+	 * the direction to get the forbidden slope mask. */
+	if (HASBITS(slope & 0x0F, 0xCC >> bridge_dir)) return false;
+
+	/* Assure that the bridge is connectable to the start side */
+	if (!(GetTownRoadBits(TileAddByDiagDir(tile, ReverseDiagDir(bridge_dir))) & DiagDirToRoadBits(bridge_dir))) return false;
 
 	/* We are in the right direction */
-	uint32 bridge_length = 0;     // This value stores the length of the possible bridge
+	uint8 bridge_length = 0;     // This value stores the length of the possible bridge
 	TileIndex bridge_tile = tile; // Used to store the other waterside
 
+	int delta = TileOffsByDiagDir(bridge_dir);
+
 	do {
 		if (bridge_length++ >= 11) {
 			/* Max 11 tile long bridges */
 			return false;
 		}
-		bridge_tile = TILE_MASK(bridge_tile + TileOffsByDiagDir(bridge_dir));
-	} while (IsClearWaterTile(bridge_tile));
+		bridge_tile += delta;
+	} while (TileX(bridge_tile) != 0 && TileY(bridge_tile) != 0 && IsWaterTile(bridge_tile) && TileX(bridge_tile) != 0);
 
 	/* no water tiles in between? */
 	if (bridge_length == 1) return false;
@@ -1003,7 +1011,7 @@
 
 				DiagDirection source_dir = ReverseDiagDir(target_dir);
 
-				if (CHANCE16(1, 4)) {
+				if (Chance16(1, 4)) {
 					/* Randomize a new target dir */
 					do target_dir = RandomDiagDir(); while (target_dir == source_dir);
 				}
@@ -1071,7 +1079,7 @@
 		TileIndex house_tile = TileAddByDiagDir(tile, target_dir); // position of a possible house
 
 		/* Don't walk into water. */
-		if (IsClearWaterTile(house_tile)) return;
+		if (IsWaterTile(house_tile)) return;
 
 		switch (_patches.town_layout) {
 			default: NOT_REACHED();
@@ -1097,7 +1105,7 @@
 				 /* Allow a house at the edge. 60% chance or
 				  * always ok if no road allowed. */
 				rcmd = DiagDirToRoadBits(target_dir);
-				allow_house = (!IsRoadAllowedHere(house_tile, target_dir) || CHANCE16(6, 10));
+				allow_house = (!IsRoadAllowedHere(house_tile, target_dir) || Chance16(6, 10));
 				break;
 		}
 
@@ -1105,7 +1113,7 @@
 			/* Build a house, but not if there already is a house there. */
 			if (!IsTileType(house_tile, MP_HOUSE)) {
 				/* Level the land if possible */
-				LevelTownLand(house_tile);
+				if (Chance16(1, 6)) LevelTownLand(house_tile);
 
 				/* And build a house.
 				 * Set result to -1 if we managed to build it. */
@@ -1120,13 +1128,16 @@
 	}
 
 	/* Return if a water tile */
-	if (IsClearWaterTile(tile)) return;
+	if (IsWaterTile(tile)) return;
 
 	/* Make the roads look nicer */
 	rcmd = CleanUpRoadBits(tile, rcmd);
 	if (rcmd == ROAD_NONE) return;
 
-	if (GrowTownWithBridge(t1, tile, rcmd)) return;
+	/* Only use the target direction for bridges to ensure they're connected.
+	 * The target_dir is as computed previously according to town layout, so
+	 * it will match it perfectly. */
+	if (GrowTownWithBridge(t1, tile, target_dir)) return;
 
 	GrowTownWithRoad(t1, tile, rcmd);
 }
@@ -1706,11 +1717,14 @@
 			hs = GetHouseSpecs(house);
 
 			if (_loaded_newgrf_features.has_newhouses) {
-				if (hs->override != 0) hs = GetHouseSpecs(hs->override);
+				if (hs->override != 0) {
+					house = hs->override;
+					hs = GetHouseSpecs(house);
+				}
 
 				if ((hs->extra_flags & BUILDING_IS_HISTORICAL) && !_generating_world) continue;
 
-				if (HASBIT(hs->callback_mask, CBM_HOUSE_ALLOW_CONSTRUCTION)) {
+				if (HasBit(hs->callback_mask, CBM_HOUSE_ALLOW_CONSTRUCTION)) {
 					uint16 callback_res = GetHouseCallback(CBID_HOUSE_ALLOW_CONSTRUCTION, 0, 0, house, t, tile);
 					if (callback_res != CALLBACK_FAILED && callback_res == 0) continue;
 				}
@@ -1720,9 +1734,9 @@
 
 			/* Special houses that there can be only one of. */
 			if (hs->building_flags & BUILDING_IS_CHURCH) {
-				SETBIT(oneof, TOWN_HAS_CHURCH);
+				SetBit(oneof, TOWN_HAS_CHURCH);
 			} else if (hs->building_flags & BUILDING_IS_STADIUM) {
-				SETBIT(oneof, TOWN_HAS_STADIUM);
+				SetBit(oneof, TOWN_HAS_STADIUM);
 			} else {
 				oneof = 0;
 			}
@@ -1773,7 +1787,7 @@
 			uint32 r = Random();
 
 			construction_stage = TOWN_HOUSE_COMPLETED;
-			if (CHANCE16(1, 7)) construction_stage = GB(r, 0, 2);
+			if (Chance16(1, 7)) construction_stage = GB(r, 0, 2);
 
 			if (construction_stage == TOWN_HOUSE_COMPLETED) {
 				ChangePopulation(t, hs->population);
@@ -1844,9 +1858,9 @@
 
 	/* Clear flags for houses that only may exist once/town. */
 	if (hs->building_flags & BUILDING_IS_CHURCH) {
-		CLRBIT(t->flags12, TOWN_HAS_CHURCH);
+		ClrBit(t->flags12, TOWN_HAS_CHURCH);
 	} else if (hs->building_flags & BUILDING_IS_STADIUM) {
-		CLRBIT(t->flags12, TOWN_HAS_STADIUM);
+		ClrBit(t->flags12, TOWN_HAS_STADIUM);
 	}
 
 	/* Do the actual clearing of tiles */
@@ -1899,6 +1913,7 @@
 		UpdateTownVirtCoord(t);
 		_town_sort_dirty = true;
 		UpdateAllStationVirtCoord();
+		UpdateAllWaypointSigns();
 		MarkWholeScreenDirty();
 	} else {
 		DeleteName(str);
@@ -2006,7 +2021,7 @@
 	TileIndex tile = t->xy;
 
 	if (CircularTileSearch(tile, 9, SearchTileForStatue, t->index))
-		SETBIT(t->statues, _current_player); // Once found and built, "inform" the Town
+		SetBit(t->statues, _current_player); // Once found and built, "inform" the Town
 }
 
 static void TownActionFundBuildings(Town* t)
@@ -2014,7 +2029,7 @@
 	/* Build next tick */
 	t->grow_counter = 1;
 	/* If we were not already growing */
-	SETBIT(t->flags12, TOWN_IS_FUNDED);
+	SetBit(t->flags12, TOWN_IS_FUNDED);
 	/* And grow for 3 months */
 	t->fund_buildings_months = 3;
 }
@@ -2092,7 +2107,7 @@
 
 	t = GetTown(p1);
 
-	if (!HASBIT(GetMaskOfTownActions(NULL, _current_player, t), p2)) return CMD_ERROR;
+	if (!HasBit(GetMaskOfTownActions(NULL, _current_player, t), p2)) return CMD_ERROR;
 
 	SET_EXPENSES_TYPE(EXPENSES_OTHER);
 
@@ -2134,7 +2149,7 @@
 		}
 	}
 
-	CLRBIT(t->flags12, TOWN_IS_FUNDED);
+	ClrBit(t->flags12, TOWN_IS_FUNDED);
 	if (_patches.town_growth_rate == 0 && t->fund_buildings_months == 0) return;
 
 	/** Towns are processed every TOWN_GROWTH_FREQUENCY ticks, and this is the
@@ -2149,7 +2164,7 @@
 		t->fund_buildings_months--;
 	} else {
 		m = _grow_count_values[1][min(n, 5)];
-		if (n == 0 && !CHANCE16(1, 12)) return;
+		if (n == 0 && !Chance16(1, 12)) return;
 	}
 
 	if (_opt.landscape == LT_ARCTIC) {
@@ -2171,7 +2186,7 @@
 	if (m <= t->grow_counter)
 		t->grow_counter = m;
 
-	SETBIT(t->flags12, TOWN_IS_FUNDED);
+	SetBit(t->flags12, TOWN_IS_FUNDED);
 }
 
 static void UpdateTownAmounts(Town *t)
@@ -2261,7 +2276,7 @@
 		return;
 	}
 
-	SETBIT(t->have_ratings, _current_player);
+	SetBit(t->have_ratings, _current_player);
 
 	rating = t->ratings[_current_player];
 
@@ -2515,7 +2530,6 @@
 	Town *t;
 	FOR_ALL_TOWNS(t) {
 		UpdateTownRadius(t);
-		UpdateTownVirtCoord(t);
 	}
 	_town_sort_dirty = true;
 }
--- a/src/town_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/town_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -95,7 +95,7 @@
 				continue;
 
 			/* Is the player not able to build a statue ? */
-			if (cur == TACT_BUILD_STATUE && HASBIT(t->statues, pid))
+			if (cur == TACT_BUILD_STATUE && HasBit(t->statues, pid))
 				continue;
 
 			if (avail >= _town_action_costs[i] * ref) {
@@ -109,15 +109,23 @@
 	return buttons;
 }
 
+/**
+ * Get the position of the Nth set bit.
+ *
+ * If there is no Nth bit set return -1
+ *
+ * @param bits The value to search in
+ * @param n The Nth set bit from which we want to know the position
+ * @return The position of the Nth set bit
+ */
 static int GetNthSetBit(uint32 bits, int n)
 {
-	int i = 0;
-
 	if (n >= 0) {
-		do {
-			if (bits & 1 && --n < 0) return i;
-			i++;
-		} while (bits >>= 1);
+		uint i;
+		FOR_EACH_SET_BIT(i, bits) {
+			n--;
+			if (n < 0) return i;
+		}
 	}
 	return -1;
 }
@@ -132,10 +140,10 @@
 
 		SetVScrollCount(w, numact + 1);
 
-		if (WP(w,def_d).data_1 != -1 && !HASBIT(buttons, WP(w,def_d).data_1))
+		if (WP(w,def_d).data_1 != -1 && !HasBit(buttons, WP(w,def_d).data_1))
 			WP(w,def_d).data_1 = -1;
 
-		SetWindowWidgetDisabledState(w, 6, WP(w, def_d).data_1 == -1);
+		w->SetWidgetDisabledState(6, WP(w, def_d).data_1 == -1);
 
 		{
 			int y;
@@ -146,12 +154,12 @@
 			SetDParam(0, w->window_number);
 			DrawWindowWidgets(w);
 
-			DrawString(2, 15, STR_2023_TRANSPORT_COMPANY_RATINGS, 0);
+			DrawString(2, 15, STR_2023_TRANSPORT_COMPANY_RATINGS, TC_FROMSTRING);
 
 			/* Draw list of players */
 			y = 25;
 			FOR_ALL_PLAYERS(p) {
-				if (p->is_active && (HASBIT(t->have_ratings, p->index) || t->exclusivity == p->index)) {
+				if (p->is_active && (HasBit(t->have_ratings, p->index) || t->exclusivity == p->index)) {
 					DrawPlayerIcon(p->index, 2, y);
 
 					SetDParam(0, p->index);
@@ -172,7 +180,7 @@
 						DrawSprite(SPR_BLOT, PALETTE_TO_RED, 18, y);
 					}
 
-					DrawString(28, y, STR_2024, 0);
+					DrawString(28, y, STR_2024, TC_FROMSTRING);
 					y += 10;
 				}
 			}
@@ -184,14 +192,14 @@
 			int pos = w->vscroll.pos;
 
 			if (--pos < 0) {
-				DrawString(2, y, STR_2045_ACTIONS_AVAILABLE, 0);
+				DrawString(2, y, STR_2045_ACTIONS_AVAILABLE, TC_FROMSTRING);
 				y += 10;
 			}
 			for (i = 0; buttons; i++, buttons >>= 1) {
 				if (pos <= -5) break; ///< Draw only the 5 fitting lines
 
 				if ((buttons & 1) && --pos < 0) {
-					DrawString(3, y, STR_2046_SMALL_ADVERTISING_CAMPAIGN + i, 6);
+					DrawString(3, y, STR_2046_SMALL_ADVERTISING_CAMPAIGN + i, TC_ORANGE);
 					y += 10;
 				}
 			}
@@ -216,7 +224,7 @@
 			const Town *t = GetTown(w->window_number);
 			int y = (e->we.click.pt.y - 0x6B) / 10;
 
-			if (!IS_INT_INSIDE(y, 0, 5)) return;
+			if (!IsInsideMM(y, 0, 5)) return;
 
 			y = GetNthSetBit(GetMaskOfTownActions(NULL, _local_player, t), y + w->vscroll.pos - 1);
 			if (y >= 0) {
@@ -265,22 +273,22 @@
 	switch (e->event) {
 	case WE_PAINT:
 		/* disable renaming town in network games if you are not the server */
-		SetWindowWidgetDisabledState(w, 8, _networking && !_network_server);
+		w->SetWidgetDisabledState(8, _networking && !_network_server);
 
 		SetDParam(0, t->index);
 		DrawWindowWidgets(w);
 
 		SetDParam(0, t->population);
 		SetDParam(1, t->num_houses);
-		DrawString(2, 107, STR_2006_POPULATION, 0);
+		DrawString(2, 107, STR_2006_POPULATION, TC_FROMSTRING);
 
 		SetDParam(0, t->act_pass);
 		SetDParam(1, t->max_pass);
-		DrawString(2, 117, STR_200D_PASSENGERS_LAST_MONTH_MAX, 0);
+		DrawString(2, 117, STR_200D_PASSENGERS_LAST_MONTH_MAX, TC_FROMSTRING);
 
 		SetDParam(0, t->act_mail);
 		SetDParam(1, t->max_mail);
-		DrawString(2, 127, STR_200E_MAIL_LAST_MONTH_MAX, 0);
+		DrawString(2, 127, STR_200E_MAIL_LAST_MONTH_MAX, TC_FROMSTRING);
 
 		DrawWindowViewport(w);
 		break;
@@ -466,7 +474,7 @@
 		SetVScrollCount(w, _num_town_sort);
 
 		DrawWindowWidgets(w);
-		DoDrawString(_town_sort_order & 1 ? DOWNARROW : UPARROW, (_town_sort_order <= 1) ? 88 : 187, 15, 0x10);
+		DoDrawString(_town_sort_order & 1 ? DOWNARROW : UPARROW, (_town_sort_order <= 1) ? 88 : 187, 15, TC_BLACK);
 
 		{
 			int n = 0;
@@ -480,14 +488,14 @@
 
 				SetDParam(0, t->index);
 				SetDParam(1, t->population);
-				DrawString(2, y, STR_2057, 0);
+				DrawString(2, y, STR_2057, TC_FROMSTRING);
 
 				y += 10;
 				i++;
 				if (++n == w->vscroll.cap) break; // max number of towns in 1 window
 			}
 			SetDParam(0, GetWorldPopulation());
-			DrawString(3, w->height - 12 + 2, STR_TOWN_POPULATION, 0);
+			DrawString(3, w->height - 12 + 2, STR_TOWN_POPULATION, TC_FROMSTRING);
 		}
 	} break;
 
--- a/src/town_map.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/town_map.h	Mon Dec 03 23:39:38 2007 +0000
@@ -77,7 +77,7 @@
  */
 static inline bool LiftHasDestination(TileIndex t)
 {
-	return HASBIT(_me[t].m7, 0);
+	return HasBit(_me[t].m7, 0);
 }
 
 /**
@@ -88,7 +88,7 @@
  */
 static inline void SetLiftDestination(TileIndex t, byte dest)
 {
-	SETBIT(_me[t].m7, 0);
+	SetBit(_me[t].m7, 0);
 	SB(_me[t].m7, 1, 3, dest);
 }
 
@@ -166,7 +166,7 @@
 static inline bool IsHouseCompleted(TileIndex t)
 {
 	assert(IsTileType(t, MP_HOUSE));
-	return HASBIT(_m[t].m3, 7);
+	return HasBit(_m[t].m3, 7);
 }
 
 /**
@@ -283,7 +283,7 @@
 		/* House is now completed.
 		 * Store the year of construction as well, for newgrf house purpose */
 		SetHouseCompleted(t, true);
-		_m[t].m5 = clamp(_cur_year - ORIGINAL_BASE_YEAR, 0, 0xFF);
+		_m[t].m5 = Clamp(_cur_year - ORIGINAL_BASE_YEAR, 0, 0xFF);
 	}
 }
 
@@ -300,6 +300,19 @@
 }
 
 /**
+ * Set the random bits for this house.
+ * This is required for newgrf house
+ * @param t      the tile of this house
+ * @param random the new random bits
+ * @pre IsTileType(t, MP_HOUSE)
+ */
+static inline void SetHouseRandomBits(TileIndex t, byte random)
+{
+	assert(IsTileType(t, MP_HOUSE));
+	_m[t].m1 = random;
+}
+
+/**
  * Get the random bits for this house.
  * This is required for newgrf house
  * @param t the tile of this house
--- a/src/train.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/train.h	Mon Dec 03 23:39:38 2007 +0000
@@ -32,7 +32,7 @@
 static inline bool IsFrontEngine(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HASBIT(v->subtype, Train_Front);
+	return HasBit(v->subtype, Train_Front);
 }
 
 /** Set front engine state
@@ -41,7 +41,7 @@
 static inline void SetFrontEngine(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SETBIT(v->subtype, Train_Front);
+	SetBit(v->subtype, Train_Front);
 }
 
 /** Remove the front engine state
@@ -50,7 +50,7 @@
 static inline void ClearFrontEngine(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	CLRBIT(v->subtype, Train_Front);
+	ClrBit(v->subtype, Train_Front);
 }
 
 /** Check if a vehicle is an articulated part of an engine
@@ -60,7 +60,7 @@
 static inline bool IsArticulatedPart(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HASBIT(v->subtype, Train_Articulated_Part);
+	return HasBit(v->subtype, Train_Articulated_Part);
 }
 
 /** Set a vehicle to be an articulated part
@@ -69,7 +69,7 @@
 static inline void SetArticulatedPart(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SETBIT(v->subtype, Train_Articulated_Part);
+	SetBit(v->subtype, Train_Articulated_Part);
 }
 
 /** Clear a vehicle from being an articulated part
@@ -78,7 +78,7 @@
 static inline void ClearArticulatedPart(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	CLRBIT(v->subtype, Train_Articulated_Part);
+	ClrBit(v->subtype, Train_Articulated_Part);
 }
 
 /** Check if a vehicle is a wagon
@@ -88,7 +88,7 @@
 static inline bool IsTrainWagon(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HASBIT(v->subtype, Train_Wagon);
+	return HasBit(v->subtype, Train_Wagon);
 }
 
 /** Set a vehicle to be a wagon
@@ -97,7 +97,7 @@
 static inline void SetTrainWagon(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SETBIT(v->subtype, Train_Wagon);
+	SetBit(v->subtype, Train_Wagon);
 }
 
 /** Clear wagon property
@@ -106,7 +106,7 @@
 static inline void ClearTrainWagon(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	CLRBIT(v->subtype, Train_Wagon);
+	ClrBit(v->subtype, Train_Wagon);
 }
 
 /** Check if a vehicle is an engine (can be first in a train)
@@ -116,7 +116,7 @@
 static inline bool IsTrainEngine(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HASBIT(v->subtype, Train_Engine);
+	return HasBit(v->subtype, Train_Engine);
 }
 
 /** Set engine status
@@ -125,7 +125,7 @@
 static inline void SetTrainEngine(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SETBIT(v->subtype, Train_Engine);
+	SetBit(v->subtype, Train_Engine);
 }
 
 /** Clear engine status
@@ -134,7 +134,7 @@
 static inline void ClearTrainEngine(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	CLRBIT(v->subtype, Train_Engine);
+	ClrBit(v->subtype, Train_Engine);
 }
 
 /** Check if a vehicle is a free wagon (got no engine in front of it)
@@ -144,7 +144,7 @@
 static inline bool IsFreeWagon(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HASBIT(v->subtype, Train_Free_Wagon);
+	return HasBit(v->subtype, Train_Free_Wagon);
 }
 
 /** Set if a vehicle is a free wagon
@@ -153,7 +153,7 @@
 static inline void SetFreeWagon(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SETBIT(v->subtype, Train_Free_Wagon);
+	SetBit(v->subtype, Train_Free_Wagon);
 }
 
 /** Clear a vehicle from being a free wagon
@@ -162,7 +162,7 @@
 static inline void ClearFreeWagon(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	CLRBIT(v->subtype, Train_Free_Wagon);
+	ClrBit(v->subtype, Train_Free_Wagon);
 }
 
 /** Check if a vehicle is a multiheaded engine
@@ -172,7 +172,7 @@
 static inline bool IsMultiheaded(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HASBIT(v->subtype, Train_Multiheaded);
+	return HasBit(v->subtype, Train_Multiheaded);
 }
 
 /** Set if a vehicle is a multiheaded engine
@@ -181,7 +181,7 @@
 static inline void SetMultiheaded(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SETBIT(v->subtype, Train_Multiheaded);
+	SetBit(v->subtype, Train_Multiheaded);
 }
 
 /** Clear multiheaded engine property
@@ -190,7 +190,7 @@
 static inline void ClearMultiheaded(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	CLRBIT(v->subtype, Train_Multiheaded);
+	ClrBit(v->subtype, Train_Multiheaded);
 }
 
 /** Check if an engine has an articulated part.
--- a/src/train_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/train_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -41,6 +41,7 @@
 #include "date.h"
 #include "cargotype.h"
 #include "group.h"
+#include "table/sprites.h"
 
 static bool TrainCheckIfLineEnds(Vehicle *v);
 static void TrainController(Vehicle *v, bool update_image);
@@ -89,7 +90,7 @@
 			}
 		}
 
-		if (HASBIT(u->u.rail.flags, VRF_POWEREDWAGON) && (wagon_has_power)) {
+		if (HasBit(u->u.rail.flags, VRF_POWEREDWAGON) && (wagon_has_power)) {
 			total_power += RailVehInfo(u->u.rail.first_engine)->pow_wag_power;
 		}
 	}
@@ -124,7 +125,7 @@
 			vweight += GetVehicleProperty(u, 0x16, RailVehInfo(u->engine_type)->weight);
 
 			/* powered wagons have extra weight added */
-			if (HASBIT(u->u.rail.flags, VRF_POWEREDWAGON))
+			if (HasBit(u->u.rail.flags, VRF_POWEREDWAGON))
 				vweight += RailVehInfo(u->u.rail.first_engine)->pow_wag_weight;
 		}
 
@@ -176,6 +177,9 @@
 		/* Cache wagon override sprite group. NULL is returned if there is none */
 		u->u.rail.cached_override = GetWagonOverrideSpriteSet(u->engine_type, u->cargo_type, u->u.rail.first_engine);
 
+		/* Reset color map */
+		u->colormap = PAL_NONE;
+
 		if (rvi_u->visual_effect != 0) {
 			u->u.rail.cached_vis_effect = rvi_u->visual_effect;
 		} else {
@@ -193,18 +197,18 @@
 
 		if (!IsArticulatedPart(u)) {
 			/* Check powered wagon / visual effect callback */
-			if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_TRAIN_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;
 			}
 
 			if (rvi_v->pow_wag_power != 0 && rvi_u->railveh_type == RAILVEH_WAGON &&
-				UsesWagonOverride(u) && !HASBIT(u->u.rail.cached_vis_effect, 7)) {
+				UsesWagonOverride(u) && !HasBit(u->u.rail.cached_vis_effect, 7)) {
 				/* wagon is powered */
-				SETBIT(u->u.rail.flags, VRF_POWEREDWAGON); // cache 'powered' status
+				SetBit(u->u.rail.flags, VRF_POWEREDWAGON); // cache 'powered' status
 			} else {
-				CLRBIT(u->u.rail.flags, VRF_POWEREDWAGON);
+				ClrBit(u->u.rail.flags, VRF_POWEREDWAGON);
 			}
 
 			/* Do not count powered wagons for the compatible railtypes, as wagons always
@@ -215,7 +219,7 @@
 
 			/* Some electric engines can be allowed to run on normal rail. It happens to all
 			 * existing electric engines when elrails are disabled and then re-enabled */
-			if (HASBIT(u->u.rail.flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL)) {
+			if (HasBit(u->u.rail.flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL)) {
 				u->u.rail.railtype = RAILTYPE_RAIL;
 				u->u.rail.compatible_railtypes |= (1 << RAILTYPE_RAIL);
 			}
@@ -232,13 +236,15 @@
 			u->cargo_cap = GetVehicleProperty(u, 0x14, rvi_u->capacity);
 		}
 
+		u->u.rail.user_def_data = GetVehicleProperty(u, 0x25, rvi_u->user_def_data);
+
 		/* check the vehicle length (callback) */
 		uint16 veh_len = CALLBACK_FAILED;
-		if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_VEHICLE_LENGTH)) {
+		if (HasBit(EngInfo(u->engine_type)->callbackmask, CBM_VEHICLE_LENGTH)) {
 			veh_len = GetVehicleCallback(CBID_VEHICLE_LENGTH, 0, 0, u->engine_type, u);
 		}
 		if (veh_len == CALLBACK_FAILED) veh_len = rvi_u->shorten_factor;
-		veh_len = clamp(veh_len, 0, u->Next() == NULL ? 7 : 5); // the clamp on vehicles not the last in chain is stricter, as too short wagons can break the 'follow next vehicle' code
+		veh_len = Clamp(veh_len, 0, u->Next() == NULL ? 7 : 5); // the clamp on vehicles not the last in chain is stricter, as too short wagons can break the 'follow next vehicle' code
 		u->u.rail.cached_veh_length = 8 - veh_len;
 		v->u.rail.cached_total_length += u->u.rail.cached_veh_length;
 	}
@@ -346,7 +352,7 @@
 		if (curvecount[0] == 1 && curvecount[1] == 1) {
 			max_speed = 0xFFFF;
 		} else if (total > 1) {
-			max_speed = 232 - (13 - clamp(sum, 1, 12)) * (13 - clamp(sum, 1, 12));
+			max_speed = 232 - (13 - Clamp(sum, 1, 12)) * (13 - Clamp(sum, 1, 12));
 		}
 	}
 
@@ -380,9 +386,9 @@
 
 		if (u->u.rail.track == TRACK_BIT_DEPOT) max_speed = min(max_speed, 61);
 
-		if (HASBIT(u->u.rail.flags, VRF_GOINGUP)) {
+		if (HasBit(u->u.rail.flags, VRF_GOINGUP)) {
 			incl += u->u.rail.cached_veh_weight * 60; //3% slope, quite a bit actually
-		} else if (HASBIT(u->u.rail.flags, VRF_GOINGDOWN)) {
+		} else if (HasBit(u->u.rail.flags, VRF_GOINGDOWN)) {
 			incl -= u->u.rail.cached_veh_weight * 60;
 		}
 	}
@@ -449,7 +455,7 @@
 	uint power = v->u.rail.cached_power;
 	uint weight = v->u.rail.cached_weight;
 	assert(weight != 0);
-	v->acceleration = clamp(power / weight * 4, 1, 255);
+	v->acceleration = Clamp(power / weight * 4, 1, 255);
 }
 
 int Train::GetImage(Direction direction) const
@@ -457,7 +463,7 @@
 	int img = this->spritenum;
 	int base;
 
-	if (HASBIT(this->u.rail.flags, VRF_REVERSE_DIRECTION)) direction = ReverseDir(direction);
+	if (HasBit(this->u.rail.flags, VRF_REVERSE_DIRECTION)) direction = ReverseDir(direction);
 
 	if (is_custom_sprite(img)) {
 		base = GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(img)));
@@ -533,12 +539,14 @@
 			Vehicle *w;
 			FOR_ALL_VEHICLES(w) {
 				if (w->type == VEH_TRAIN && w->tile == tile &&
-				    IsFreeWagon(w) && w->engine_type == engine) {
+				    IsFreeWagon(w) && w->engine_type == engine &&
+				    !HASBITS(w->vehstatus, VS_CRASHED)) {          /// do not connect new wagon with crashed/flooded consists
 					u = GetLastVehicleInChain(w);
 					break;
 				}
 			}
 
+			v = new (v) Train();
 			v->engine_type = engine;
 
 			DiagDirection dir = GetRailDepotDirection(tile);
@@ -556,7 +564,6 @@
 			v->u.rail.track = TRACK_BIT_DEPOT;
 			v->vehstatus = VS_HIDDEN | VS_DEFPAL;
 
-			v = new (v) Train();
 			v->subtype = 0;
 			SetTrainWagon(v);
 
@@ -694,7 +701,7 @@
 
 		Vehicle *v = vl[0];
 
-		UnitID unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_TRAIN);
+		UnitID unit_num = HasBit(p2, 0) ? 0 : GetFreeUnitNumber(VEH_TRAIN);
 		if (unit_num > _patches.max_trains)
 			return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 
@@ -703,6 +710,7 @@
 			int x = TileX(tile) * TILE_SIZE + _vehicle_initial_x_fract[dir];
 			int y = TileY(tile) * TILE_SIZE + _vehicle_initial_y_fract[dir];
 
+			v = new (v) Train();
 			v->unitnumber = unit_num;
 			v->direction = DiagDirToDir(dir);
 			v->tile = tile;
@@ -735,12 +743,11 @@
 			v->service_interval = _patches.servint_trains;
 			v->date_of_last_service = _date;
 			v->build_year = _cur_year;
-			v = new (v) Train();
 			v->cur_image = 0xAC2;
 			v->random_bits = VehicleRandomBits();
 
 			v->vehicle_flags = 0;
-			if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
+			if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
 
 			v->group_id = DEFAULT_GROUP;
 
@@ -767,7 +774,7 @@
 			UpdateTrainAcceleration(v);
 			UpdateTrainGroupID(v);
 
-			if (!HASBIT(p2, 1)) { // check if the cars should be added to the new vehicle
+			if (!HasBit(p2, 1)) { // check if the cars should be added to the new vehicle
 				NormalizeTrainVehInDepot(v);
 			}
 
@@ -854,7 +861,7 @@
 	TileIndex tile = src->tile;
 
 	FOR_ALL_VEHICLES(dst) {
-		if (dst->type == VEH_TRAIN && IsFreeWagon(dst) && dst->tile == tile) {
+		if (dst->type == VEH_TRAIN && IsFreeWagon(dst) && dst->tile == tile && !HASBITS(dst->vehstatus, VS_CRASHED)) {
 			/* check so all vehicles in the line have the same engine. */
 			Vehicle *v = dst;
 
@@ -925,6 +932,9 @@
 
 	if (src->type != VEH_TRAIN || !CheckOwnership(src->owner)) return CMD_ERROR;
 
+	/* Do not allow moving crashed vehicles inside the depot, it is likely to cause asserts later */
+	if (HASBITS(src->vehstatus, VS_CRASHED)) return CMD_ERROR;
+
 	/* if nothing is selected as destination, try and find a matching vehicle to drag to. */
 	Vehicle *dst;
 	if (d == INVALID_VEHICLE) {
@@ -933,6 +943,9 @@
 		if (!IsValidVehicleID(d)) return CMD_ERROR;
 		dst = GetVehicle(d);
 		if (dst->type != VEH_TRAIN || !CheckOwnership(dst->owner)) return CMD_ERROR;
+
+		/* Do not allow appending to crashed vehicles, too */
+		if (HASBITS(dst->vehstatus, VS_CRASHED)) return CMD_ERROR;
 	}
 
 	/* if an articulated part is being handled, deal with its parent vehicle */
@@ -959,7 +972,7 @@
 	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();
+	if (HasBit(p2, 0) && src_head == dst_head) return CommandCost();
 
 	{
 		int max_len = _patches.mammoth_trains ? 100 : 9;
@@ -980,7 +993,7 @@
 
 			/* We are moving between rows, so only count the wagons from the source
 			 * row that are being moved. */
-			if (HASBIT(p2, 0)) {
+			if (HasBit(p2, 0)) {
 				const Vehicle *u;
 				for (u = src_head; u != src && u != NULL; u = GetNextVehicle(u))
 					src_len--;
@@ -1036,7 +1049,7 @@
 			}
 		}
 
-		if (HASBIT(p2, 0)) {
+		if (HasBit(p2, 0)) {
 			/* unlink ALL wagons */
 			if (src != src_head) {
 				Vehicle *v = src_head;
@@ -1216,6 +1229,8 @@
 
 	if (v->type != VEH_TRAIN || !CheckOwnership(v->owner)) return CMD_ERROR;
 
+	if (HASBITS(v->vehstatus, VS_CRASHED)) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE);
+
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
 	while (IsArticulatedPart(v)) v = v->Previous();
@@ -1328,7 +1343,7 @@
 				 * up on a new line to be added to the newly built loco. Replace it is.
 				 * Totally braindead cause building a new engine adds all loco-less
 				 * engines to its train anyways */
-				if (p2 == 2 && HASBIT(ori_subtype, Train_Front)) {
+				if (p2 == 2 && HasBit(ori_subtype, Train_Front)) {
 					Vehicle *tmp;
 					for (v = first; v != NULL; v = tmp) {
 						tmp = GetNextVehicle(v);
@@ -1443,21 +1458,21 @@
 	byte flag2 = *swap_flag2;
 
 	/* Clear the flags */
-	CLRBIT(*swap_flag1, VRF_GOINGUP);
-	CLRBIT(*swap_flag1, VRF_GOINGDOWN);
-	CLRBIT(*swap_flag2, VRF_GOINGUP);
-	CLRBIT(*swap_flag2, VRF_GOINGDOWN);
+	ClrBit(*swap_flag1, VRF_GOINGUP);
+	ClrBit(*swap_flag1, VRF_GOINGDOWN);
+	ClrBit(*swap_flag2, VRF_GOINGUP);
+	ClrBit(*swap_flag2, VRF_GOINGDOWN);
 
 	/* Reverse the rail-flags (if needed) */
-	if (HASBIT(flag1, VRF_GOINGUP)) {
-		SETBIT(*swap_flag2, VRF_GOINGDOWN);
-	} else if (HASBIT(flag1, VRF_GOINGDOWN)) {
-		SETBIT(*swap_flag2, VRF_GOINGUP);
+	if (HasBit(flag1, VRF_GOINGUP)) {
+		SetBit(*swap_flag2, VRF_GOINGDOWN);
+	} else if (HasBit(flag1, VRF_GOINGDOWN)) {
+		SetBit(*swap_flag2, VRF_GOINGUP);
 	}
-	if (HASBIT(flag2, VRF_GOINGUP)) {
-		SETBIT(*swap_flag1, VRF_GOINGDOWN);
-	} else if (HASBIT(flag2, VRF_GOINGDOWN)) {
-		SETBIT(*swap_flag1, VRF_GOINGUP);
+	if (HasBit(flag2, VRF_GOINGUP)) {
+		SetBit(*swap_flag1, VRF_GOINGDOWN);
+	} else if (HasBit(flag2, VRF_GOINGDOWN)) {
+		SetBit(*swap_flag1, VRF_GOINGUP);
 	}
 }
 
@@ -1605,7 +1620,7 @@
 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
 	}
 
-	CLRBIT(v->u.rail.flags, VRF_REVERSING);
+	ClrBit(v->u.rail.flags, VRF_REVERSING);
 }
 
 /** Reverse train.
@@ -1625,7 +1640,7 @@
 	if (p2) {
 		/* turn a single unit around */
 
-		if (IsMultiheaded(v) || HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) {
+		if (IsMultiheaded(v) || HasBit(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) {
 			return_cmd_error(STR_ONLY_TURN_SINGLE_UNIT);
 		}
 
@@ -1636,7 +1651,7 @@
 		}
 
 		if (flags & DC_EXEC) {
-			TOGGLEBIT(v->u.rail.flags, VRF_REVERSE_DIRECTION);
+			ToggleBit(v->u.rail.flags, VRF_REVERSE_DIRECTION);
 			InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 			InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
 		}
@@ -1646,7 +1661,7 @@
 
 		if (flags & DC_EXEC) {
 			if (_patches.realistic_acceleration && v->cur_speed != 0) {
-				TOGGLEBIT(v->u.rail.flags, VRF_REVERSING);
+				ToggleBit(v->u.rail.flags, VRF_REVERSING);
 			} else {
 				v->cur_speed = 0;
 				SetLastSpeed(v, 0);
@@ -1690,7 +1705,7 @@
 {
 	CargoID new_cid = GB(p2, 0, 8);
 	byte new_subtype = GB(p2, 8, 8);
-	bool only_this = HASBIT(p2, 16);
+	bool only_this = HasBit(p2, 16);
 
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
@@ -1716,7 +1731,7 @@
 		if (v->cargo_cap != 0) {
 			uint16 amount = CALLBACK_FAILED;
 
-			if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_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;
@@ -1887,13 +1902,13 @@
 	if (v->vehstatus & VS_CRASHED) return CMD_ERROR;
 
 	if (v->current_order.type == OT_GOTO_DEPOT) {
-		if (!!(p2 & DEPOT_SERVICE) == HASBIT(v->current_order.flags, OFB_HALT_IN_DEPOT)) {
+		if (!!(p2 & DEPOT_SERVICE) == HasBit(v->current_order.flags, OFB_HALT_IN_DEPOT)) {
 			/* We called with a different DEPOT_SERVICE setting.
 			 * 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);
+				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);
 			}
 			return CommandCost();
@@ -1901,7 +1916,7 @@
 
 		if (p2 & DEPOT_DONT_CANCEL) return CMD_ERROR; // Requested no cancelation of depot orders
 		if (flags & DC_EXEC) {
-			if (HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS)) {
+			if (HasBit(v->current_order.flags, OFB_PART_OF_ORDERS)) {
 				v->cur_order_index++;
 			}
 
@@ -1925,7 +1940,7 @@
 		v->dest_tile = tfdd.tile;
 		v->current_order.type = OT_GOTO_DEPOT;
 		v->current_order.flags = OF_NON_STOP;
-		if (!(p2 & DEPOT_SERVICE)) SETBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
+		if (!(p2 & DEPOT_SERVICE)) SetBit(v->current_order.flags, OFB_HALT_IN_DEPOT);
 		v->current_order.dest = GetDepotByTile(tfdd.tile)->index;
 		v->current_order.refit_cargo = CT_INVALID;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
@@ -1959,7 +1974,7 @@
 		const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
 		int effect_offset = GB(v->u.rail.cached_vis_effect, 0, 4) - 8;
 		byte effect_type = GB(v->u.rail.cached_vis_effect, 4, 2);
-		bool disable_effect = HASBIT(v->u.rail.cached_vis_effect, 6);
+		bool disable_effect = HasBit(v->u.rail.cached_vis_effect, 6);
 
 		/* no smoke? */
 		if ((rvi->railveh_type == RAILVEH_WAGON && effect_type == 0) ||
@@ -1984,7 +1999,7 @@
 		int x = _vehicle_smoke_pos[v->direction] * effect_offset;
 		int y = _vehicle_smoke_pos[(v->direction + 2) % 8] * effect_offset;
 
-		if (HASBIT(v->u.rail.flags, VRF_REVERSE_DIRECTION)) {
+		if (HasBit(v->u.rail.flags, VRF_REVERSE_DIRECTION)) {
 			x = -x;
 			y = -y;
 		}
@@ -2000,7 +2015,7 @@
 
 		case 1:
 			/* diesel smoke */
-			if (u->cur_speed <= 40 && CHANCE16(15, 128)) {
+			if (u->cur_speed <= 40 && Chance16(15, 128)) {
 				CreateEffectVehicleRel(v, 0, 0, 10, EV_DIESEL_SMOKE);
 				sound = true;
 			}
@@ -2008,7 +2023,7 @@
 
 		case 2:
 			/* blue spark */
-			if (GB(v->tick_counter, 0, 2) == 0 && CHANCE16(1, 45)) {
+			if (GB(v->tick_counter, 0, 2) == 0 && Chance16(1, 45)) {
 				CreateEffectVehicleRel(v, 0, 0, 10, EV_ELECTRIC_SPARK);
 				sound = true;
 			}
@@ -2175,10 +2190,10 @@
 	TIC()
 #endif
 
-	assert((tracks & ~0x3F) == 0);
+	assert((tracks & ~TRACK_BIT_MASK) == 0);
 
 	/* quick return in case only one possible track is available */
-	if (KILL_FIRST_BIT(tracks) == 0) return FindFirstTrack(tracks);
+	if (KillFirstBit(tracks) == TRACK_BIT_NONE) return FindFirstTrack(tracks);
 
 	if (_patches.yapf.rail_use_yapf) {
 		Trackdir trackdir = YapfChooseRailTrack(v, tile, enterdir, tracks, &path_not_found);
@@ -2245,9 +2260,9 @@
 	/* handle "path not found" state */
 	if (path_not_found) {
 		/* PF didn't find the route */
-		if (!HASBIT(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION)) {
+		if (!HasBit(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION)) {
 			/* it is first time the problem occurred, set the "path not found" flag */
-			SETBIT(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION);
+			SetBit(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION);
 			/* and notify user about the event */
 			if (_patches.lost_train_warn && v->owner == _local_player) {
 				SetDParam(0, v->unitnumber);
@@ -2260,9 +2275,9 @@
 		}
 	} else {
 		/* route found, is the train marked with "path not found" flag? */
-		if (HASBIT(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION)) {
+		if (HasBit(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION)) {
 			/* clear the flag as the PF's problem was solved */
-			CLRBIT(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION);
+			ClrBit(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION);
 			/* can we also delete the "News" item somehow? */
 		}
 	}
@@ -2478,7 +2493,7 @@
 {
 	uint accel;
 
-	if (v->vehstatus & VS_STOPPED || HASBIT(v->u.rail.flags, VRF_REVERSING)) {
+	if (v->vehstatus & VS_STOPPED || HasBit(v->u.rail.flags, VRF_REVERSING)) {
 		if (_patches.realistic_acceleration) {
 			accel = GetTrainAcceleration(v, AM_BRAKE) * 2;
 		} else {
@@ -2498,7 +2513,7 @@
 		int tempmax = v->max_speed;
 		if (v->cur_speed > v->max_speed)
 			tempmax = v->cur_speed - (v->cur_speed / 10) - 1;
-		v->cur_speed = spd = clamp(v->cur_speed + ((int)spd >> 8), 0, tempmax);
+		v->cur_speed = spd = Clamp(v->cur_speed + ((int)spd >> 8), 0, tempmax);
 	}
 
 	if (!(v->direction & 1)) spd = spd * 3 >> 2;
@@ -2538,8 +2553,8 @@
 	v->z_pos = GetSlopeZ(v->x_pos, v->y_pos);
 
 	if (new_tile) {
-		CLRBIT(v->u.rail.flags, VRF_GOINGUP);
-		CLRBIT(v->u.rail.flags, VRF_GOINGDOWN);
+		ClrBit(v->u.rail.flags, VRF_GOINGUP);
+		ClrBit(v->u.rail.flags, VRF_GOINGDOWN);
 
 		if (v->u.rail.track == TRACK_BIT_X || v->u.rail.track == TRACK_BIT_Y) {
 			/* Any track that isn't TRACK_BIT_X or TRACK_BIT_Y cannot be sloped.
@@ -2555,7 +2570,7 @@
 			/* For some reason tunnel tiles are always given as sloped :(
 			 * But they are not sloped... */
 			if (middle_z != v->z_pos && !IsTunnelTile(TileVirtXY(v->x_pos, v->y_pos))) {
-				SETBIT(v->u.rail.flags, (middle_z > old_z) ? VRF_GOINGUP : VRF_GOINGDOWN);
+				SetBit(v->u.rail.flags, (middle_z > old_z) ? VRF_GOINGUP : VRF_GOINGDOWN);
 			}
 		}
 	}
@@ -2614,7 +2629,7 @@
 	return
 		IsTileOwner(tile, v->owner) && (
 			!IsFrontEngine(v) ||
-			HASBIT(v->u.rail.compatible_railtypes, GetRailType(tile))
+			HasBit(v->u.rail.compatible_railtypes, GetRailType(tile))
 		);
 }
 
@@ -2711,9 +2726,9 @@
 			v != tcc->v_skip &&
 			v->type == VEH_TRAIN &&
 			v->u.rail.track != TRACK_BIT_DEPOT &&
-			myabs(v->z_pos - tcc->v->z_pos) < 6 &&
-			myabs(v->x_pos - tcc->v->x_pos) < 6 &&
-			myabs(v->y_pos - tcc->v->y_pos) < 6 ) {
+			abs(v->z_pos - tcc->v->z_pos) < 6 &&
+			abs(v->x_pos - tcc->v->x_pos) < 6 &&
+			abs(v->y_pos - tcc->v->y_pos) < 6 ) {
 
 		Vehicle *coll = v->First();
 
@@ -2824,10 +2839,10 @@
 					if (IsFrontEngine(v) && !TrainCheckIfLineEnds(v)) return;
 
 					uint32 r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
-					if (HASBIT(r, VETS_CANNOT_ENTER)) {
+					if (HasBit(r, VETS_CANNOT_ENTER)) {
 						goto invalid_rail;
 					}
-					if (HASBIT(r, VETS_ENTERED_STATION)) {
+					if (HasBit(r, VETS_ENTERED_STATION)) {
 						TrainEnterStation(v, r >> VETS_STATION_ID_OFFSET);
 						return;
 					}
@@ -2927,7 +2942,7 @@
 
 				/* Call the landscape function and tell it that the vehicle entered the tile */
 				uint32 r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
-				if (HASBIT(r, VETS_CANNOT_ENTER)) {
+				if (HasBit(r, VETS_CANNOT_ENTER)) {
 					goto invalid_rail;
 				}
 
@@ -2938,7 +2953,7 @@
 
 				if (IsFrontEngine(v)) v->load_unload_time_rem = 0;
 
-				if (!HASBIT(r, VETS_ENTERED_WORMHOLE)) {
+				if (!HasBit(r, VETS_ENTERED_WORMHOLE)) {
 					v->tile = gp.new_tile;
 
 					if (GetTileRailType(gp.new_tile) != GetTileRailType(gp.old_tile)) {
@@ -2964,7 +2979,7 @@
 					min(v->cur_speed, GetBridge(GetBridgeType(v->tile))->speed);
 			}
 
-			if (!(IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) || !HASBIT(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
+			if (!(IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) || !HasBit(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
 				v->x_pos = gp.x;
 				v->y_pos = gp.y;
 				VehiclePositionChanged(v);
@@ -3099,7 +3114,7 @@
 	}
 
 	uint32 r;
-	if (state <= 200 && CHANCE16R(1, 7, r)) {
+	if (state <= 200 && Chance16R(1, 7, r)) {
 		int index = (r * 10 >> 16);
 
 		Vehicle *u = v;
@@ -3268,7 +3283,7 @@
 		v->breakdown_ctr--;
 	}
 
-	if (HASBIT(v->u.rail.flags, VRF_REVERSING) && v->cur_speed == 0) {
+	if (HasBit(v->u.rail.flags, VRF_REVERSING) && v->cur_speed == 0) {
 		ReverseTrainDirection(v);
 	}
 
@@ -3344,8 +3359,8 @@
 		if (this->type == VEH_TRAIN && IsFrontEngine(this))
 			TrainLocoHandler(this, true);
 	} else if (IsFreeWagon(this) && HASBITS(this->vehstatus, VS_CRASHED)) {
-		/* Delete flooded standalone wagon */
-		if (++this->u.rail.crash_anim_pos >= 4400) delete this;
+		/* Delete flooded standalone wagon chain */
+		if (++this->u.rail.crash_anim_pos >= 4400) DeleteVehicleChain(this);
 	}
 }
 
@@ -3377,7 +3392,7 @@
 
 	if (v->current_order.type == OT_GOTO_DEPOT &&
 			v->current_order.dest != depot->index &&
-			!CHANCE16(3, 16)) {
+			!Chance16(3, 16)) {
 		return;
 	}
 
@@ -3511,19 +3526,19 @@
 	Vehicle *v;
 	FOR_ALL_VEHICLES(v) {
 		if (v->type == VEH_TRAIN) {
-			SETBIT(v->subtype, 7); // indicates that it's the old format and needs to be converted in the next loop
+			SetBit(v->subtype, 7); // indicates that it's the old format and needs to be converted in the next loop
 		}
 	}
 
 	FOR_ALL_VEHICLES(v) {
 		if (v->type == VEH_TRAIN) {
-			if (HASBIT(v->subtype, 7) && ((v->subtype & ~0x80) == 0 || (v->subtype & ~0x80) == 4)) {
+			if (HasBit(v->subtype, 7) && ((v->subtype & ~0x80) == 0 || (v->subtype & ~0x80) == 4)) {
 				Vehicle *u = v;
 
 				BEGIN_ENUM_WAGONS(u) {
 					const RailVehicleInfo *rvi = RailVehInfo(u->engine_type);
 
-					CLRBIT(u->subtype, 7);
+					ClrBit(u->subtype, 7);
 					switch (u->subtype) {
 						case 0: /* TS_Front_Engine */
 							if (rvi->railveh_type == RAILVEH_MULTIHEAD) SetMultiheaded(u);
--- a/src/train_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/train_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -124,7 +124,7 @@
 			SetDParam(3, _patches.freight_trains);
 			str = FreightWagonMult(v->cargo_type) > 1 ? STR_FROM_MULT : STR_8813_FROM;
 		}
-		DrawString(x, y, str, 0);
+		DrawString(x, y, str, TC_FROMSTRING);
 	}
 }
 
@@ -133,12 +133,12 @@
 	if (RailVehInfo(v->engine_type)->railveh_type == RAILVEH_WAGON) {
 		SetDParam(0, v->engine_type);
 		SetDParam(1, v->value);
-		DrawString(x, y, STR_882D_VALUE, 0x10);
+		DrawString(x, y, STR_882D_VALUE, TC_BLACK);
 	} else {
 		SetDParam(0, v->engine_type);
 		SetDParam(1, v->build_year);
 		SetDParam(2, v->value);
-		DrawString(x, y, STR_882C_BUILT_VALUE, 0x10);
+		DrawString(x, y, STR_882C_BUILT_VALUE, TC_BLACK);
 	}
 }
 
@@ -148,7 +148,7 @@
 		SetDParam(0, v->cargo_type);
 		SetDParam(1, v->cargo_cap);
 		SetDParam(2, _patches.freight_trains);
-		DrawString(x, y, FreightWagonMult(v->cargo_type) > 1 ? STR_CAPACITY_MULT : STR_013F_CAPACITY, 0);
+		DrawString(x, y, FreightWagonMult(v->cargo_type) > 1 ? STR_CAPACITY_MULT : STR_013F_CAPACITY, TC_FROMSTRING);
 	}
 }
 
@@ -240,7 +240,7 @@
 		}
 
 		/* draw total cargo tab */
-		DrawString(x, y + 2, STR_013F_TOTAL_CAPACITY_TEXT, 0);
+		DrawString(x, y + 2, STR_013F_TOTAL_CAPACITY_TEXT, TC_FROMSTRING);
 		for (CargoID i = 0; i < NUM_CARGO; i++) {
 			if (max_cargo[i] > 0 && --vscroll_pos < 0 && vscroll_pos > -vscroll_cap) {
 				y += 14;
@@ -249,10 +249,10 @@
 				SetDParam(2, i);            // {SHORTCARGO} #1
 				SetDParam(3, max_cargo[i]); // {SHORTCARGO} #2
 				SetDParam(4, _patches.freight_trains);
-				DrawString(x, y + 2, FreightWagonMult(i) > 1 ? STR_TOTAL_CAPACITY_MULT : STR_013F_TOTAL_CAPACITY, 0);
+				DrawString(x, y + 2, FreightWagonMult(i) > 1 ? STR_TOTAL_CAPACITY_MULT : STR_013F_TOTAL_CAPACITY, TC_FROMSTRING);
 			}
 		}
 		SetDParam(0, v->cargo.FeederShare());
-		DrawString(x, y + 15, STR_FEEDER_CARGO_VALUE, 0);
+		DrawString(x, y + 15, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING);
 	}
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/transparency.h	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,69 @@
+/* $Id$ */
+
+/** @file transparency.h */
+
+#ifndef TRANSPARENCY_H
+#define TRANSPARENCY_H
+
+/**
+ * Transparency option bits: which position in _transparency_opt stands for which transparency.
+ * If you change the order, change the order of the ShowTransparencyToolbar() stuff in transparency_gui.cpp too.
+ * If you add or remove an option don't forget to change the transparency 'hot keys' in main_gui.cpp.
+ * If you add an option and have more then 8, change the typedef TransparencyOptionBits and
+ * the save stuff (e.g. SLE_UINT8 to SLE_UINT16) in settings.cpp .
+ */
+enum TransparencyOption {
+	TO_SIGNS = 0,  ///< signs
+	TO_TREES,      ///< trees
+	TO_HOUSES,     ///< town buildings
+	TO_INDUSTRIES, ///< industries
+	TO_BUILDINGS,  ///< player buildings - depots, stations, HQ, ...
+	TO_BRIDGES,    ///< bridges
+	TO_STRUCTURES, ///< unmovable structures
+	TO_LOADING,    ///< loading indicators
+	TO_END,
+};
+
+typedef byte TransparencyOptionBits; ///< transparency option bits
+extern TransparencyOptionBits _transparency_opt;
+
+/**
+ * Check if the transparency option bit is set
+ * and if we aren't in the game menu (there's never transparency)
+ *
+ * @param to the structure which transparency option is ask for
+ */
+static inline bool IsTransparencySet(TransparencyOption to)
+{
+	return (HasBit(_transparency_opt, to) && _game_mode != GM_MENU);
+}
+
+/**
+ * Toggle the transparency option bit
+ *
+ * @param to the structure which transparency option is toggle
+ */
+static inline void ToggleTransparency(TransparencyOption to)
+{
+	ToggleBit(_transparency_opt, to);
+}
+
+/** Toggle all transparency options (except signs) or restore the stored transparencies */
+static inline void ResetRestoreAllTransparency()
+{
+	/* backup of the original transparencies or if all transparencies false toggle them to true */
+	static TransparencyOptionBits trans_opt = ~0;
+
+	if (_transparency_opt == 0) {
+		/* no structure is transparent, so restore the old transparency if present otherwise set all true */
+		_transparency_opt = trans_opt;
+	} else {
+		/* any structure is transparent, so store current transparency settings and reset it */
+		trans_opt = _transparency_opt;
+		_transparency_opt = 0;
+	}
+
+	MarkWholeScreenDirty();
+}
+
+#endif /* TRANSPARENCY_H */
--- a/src/transparency_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/transparency_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -11,6 +11,9 @@
 #include "gfx.h"
 #include "sound.h"
 #include "variables.h"
+#include "transparency.h"
+
+TransparencyOptionBits _transparency_opt;
 
 enum TransparencyToolbarWidgets{
 	/* Widgets not toggled when pressing the X key */
@@ -27,16 +30,6 @@
 	TTW_WIDGET_END,          ///< End of toggle buttons
 };
 
-/** Toggle the bits of the transparencies variable
- * when clicking on a widget, and play a sound
- * @param widget been clicked.
- */
-static void Transparent_Click(byte widget)
-{
-	TOGGLEBIT(_transparent_opt, widget);
-	SndPlayFx(SND_15_BEEP);
-}
-
 static void TransparencyToolbWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
@@ -44,14 +37,16 @@
 			/* must be sure that the widgets show the transparency variable changes
 			 * also when we use shortcuts */
 			for (uint i = TTW_WIDGET_SIGNS; i < TTW_WIDGET_END; i++) {
-				SetWindowWidgetLoweredState(w, i, HASBIT(_transparent_opt, i - TTW_WIDGET_SIGNS));
+				w->SetWidgetLoweredState(i, IsTransparencySet((TransparencyOption)(i - TTW_WIDGET_SIGNS)));
 			}
 			DrawWindowWidgets(w);
 			break;
 
 		case WE_CLICK:
 			if (e->we.click.widget >= TTW_WIDGET_SIGNS) {
-				Transparent_Click(e->we.click.widget - TTW_WIDGET_SIGNS);
+				/* toggle the bit of the transparencies variable when clicking on a widget, and play a sound */
+				ToggleTransparency((TransparencyOption)(e->we.click.widget - TTW_WIDGET_SIGNS));
+				SndPlayFx(SND_15_BEEP);
 				MarkWholeScreenDirty();
 			}
 			break;
--- a/src/tree_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/tree_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -20,6 +20,7 @@
 #include "sound.h"
 #include "variables.h"
 #include "genworld.h"
+#include "transparency.h"
 
 /**
  * List of tree placer algorithm.
@@ -85,7 +86,7 @@
 			SetTreeGroundDensity(tile, TREE_GROUND_SNOW_DESERT, 3);
 			SetTreeCounter(tile, (TreeGround)GB(r, 24, 3));
 		} else {
-			SetTreeGroundDensity(tile, (TreeGround)GB(r, 28, 1), 0);
+			SetTreeGroundDensity(tile, (TreeGround)GB(r, 28, 1), 3);
 			SetTreeCounter(tile, (TreeGround)GB(r, 24, 4));
 		}
 	}
@@ -108,7 +109,7 @@
 		uint32 r = Random();
 		int x = GB(r, 0, 5) - 16;
 		int y = GB(r, 8, 5) - 16;
-		uint dist = myabs(x) + myabs(y);
+		uint dist = abs(x) + abs(y);
 		TileIndex cur_tile = TILE_MASK(tile + TileDiffXY(x, y));
 
 		if (dist <= 13 &&
@@ -154,7 +155,7 @@
 		TileIndex cur_tile = TILE_MASK(tile + TileDiffXY(x, y));
 
 		/* Keep in range of the existing tree */
-		if (myabs(x) + myabs(y) > 16) continue;
+		if (abs(x) + abs(y) > 16) continue;
 
 		/* Clear tile, no farm-tiles or rocks */
 		if (!IsTileType(cur_tile, MP_CLEAR) ||
@@ -163,7 +164,7 @@
 			continue;
 
 		/* Not too much height difference */
-		if (delta(GetTileZ(cur_tile), height) > 2) continue;
+		if (Delta(GetTileZ(cur_tile), height) > 2) continue;
 
 		/* Place one tree and quit */
 		PlaceTree(cur_tile, r);
@@ -323,8 +324,8 @@
 					}
 
 					switch (GetClearGround(tile)) {
-						case CLEAR_FIELDS: cost.AddCost(_price.clear_3); break;
-						case CLEAR_ROCKS:  cost.AddCost(_price.clear_2); break;
+						case CLEAR_FIELDS: cost.AddCost(_price.clear_fields); break;
+						case CLEAR_ROCKS:  cost.AddCost(_price.clear_rocks); break;
 						default: break;
 					}
 
@@ -346,13 +347,14 @@
 
 						growth = _game_mode == GM_EDITOR ? 3 : 0;
 						switch (GetClearGround(tile)) {
-							case CLEAR_ROUGH: MakeTree(tile, treetype, 0, growth, TREE_GROUND_ROUGH, 0); break;
-							case CLEAR_SNOW:  MakeTree(tile, treetype, 0, growth, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break;
-							default:          MakeTree(tile, treetype, 0, growth, TREE_GROUND_GRASS, 0); break;
+							case CLEAR_ROUGH:  MakeTree(tile, treetype, 0, growth, TREE_GROUND_ROUGH, 3); break;
+							case CLEAR_SNOW:
+							case CLEAR_DESERT: MakeTree(tile, treetype, 0, growth, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break;
+							default:           MakeTree(tile, treetype, 0, growth, TREE_GROUND_GRASS, GetClearDensity(tile)); break;
 						}
 						MarkTileDirtyByTile(tile);
 
-						if (_game_mode == GM_EDITOR && IS_INT_INSIDE(treetype, TREE_RAINFOREST, TREE_CACTUS))
+						if (_game_mode == GM_EDITOR && IsInsideMM(treetype, TREE_RAINFOREST, TREE_CACTUS))
 							SetTropicZone(tile, TROPICZONE_RAINFOREST);
 					}
 					cost.AddCost(_price.build_trees);
@@ -385,7 +387,7 @@
 	byte z;
 
 	switch (GetTreeGround(ti->tile)) {
-		case TREE_GROUND_GRASS: DrawClearLandTile(ti, 3); break;
+		case TREE_GROUND_GRASS: DrawClearLandTile(ti, GetTreeDensity(ti->tile)); break;
 		case TREE_GROUND_ROUGH: DrawHillyLandTile(ti); break;
 		default: DrawGroundSprite(_tree_sprites_1[GetTreeDensity(ti->tile)] + _tileh_to_sprite[ti->tileh], PAL_NONE); break;
 	}
@@ -416,7 +418,7 @@
 		/* different tree styles above one of the grounds */
 		if (GetTreeGround(ti->tile) == TREE_GROUND_SNOW_DESERT &&
 				GetTreeDensity(ti->tile) >= 2 &&
-				IS_INT_INSIDE(index, TREE_SUB_ARCTIC << 2, TREE_RAINFOREST << 2)) {
+				IsInsideMM(index, TREE_SUB_ARCTIC << 2, TREE_RAINFOREST << 2)) {
 			index += 164 - (TREE_SUB_ARCTIC << 2);
 		}
 
@@ -426,7 +428,7 @@
 
 	StartSpriteCombine();
 
-	if (!HASBIT(_transparent_opt, TO_TREES) || !_patches.invisible_trees) {
+	if (!(IsTransparencySet(TO_TREES) && _patches.invisible_trees)) {
 		TreeListEnt te[4];
 		uint i;
 
@@ -459,7 +461,7 @@
 
 			if (tep == NULL) break;
 
-			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);
+			AddSortableSpriteToDraw(tep->image, tep->pal, ti->x + tep->x, ti->y + tep->y, 16 - tep->x, 16 - tep->y, 0x30, z, IsTransparencySet(TO_TREES), -tep->x, -tep->y);
 			tep->image = 0;
 		}
 	}
@@ -492,7 +494,7 @@
 	}
 
 	num = GetTreeCount(tile) + 1;
-	if (IS_INT_INSIDE(GetTreeType(tile), TREE_RAINFOREST, TREE_CACTUS)) num *= 4;
+	if (IsInsideMM(GetTreeType(tile), TREE_RAINFOREST, TREE_CACTUS)) num *= 4;
 
 	if (flags & DC_EXEC) DoClearSquare(tile);
 
@@ -508,12 +510,10 @@
 {
 	TreeType tt = GetTreeType(tile);
 
-	if (IS_INT_INSIDE(tt, TREE_RAINFOREST, TREE_CACTUS)) {
+	if (IsInsideMM(tt, TREE_RAINFOREST, TREE_CACTUS)) {
 		td->str = STR_280F_RAINFOREST;
-	} else if (tt == TREE_CACTUS) {
-		td->str = STR_2810_CACTUS_PLANTS;
 	} else {
-		td->str = STR_280E_TREES;
+		td->str = tt == TREE_CACTUS ? STR_2810_CACTUS_PLANTS : STR_280E_TREES;
 	}
 
 	td->owner = GetTileOwner(tile);
@@ -543,7 +543,7 @@
 			};
 			uint32 r = Random();
 
-			if (CHANCE16I(1, 200, r)) SndPlayTileFx(forest_sounds[GB(r, 16, 2)], tile);
+			if (Chance16I(1, 200, r)) SndPlayTileFx(forest_sounds[GB(r, 16, 2)], tile);
 			break;
 		}
 
@@ -557,7 +557,7 @@
 
 	if (k < 0) {
 		if (GetTreeGround(tile) != TREE_GROUND_SNOW_DESERT) return;
-		SetTreeGroundDensity(tile, TREE_GROUND_GRASS, 0);
+		SetTreeGroundDensity(tile, TREE_GROUND_GRASS, 3);
 	} else {
 		uint density = min((uint)k / TILE_HEIGHT, 3);
 
@@ -567,7 +567,7 @@
 		} else {
 			if (GetTreeDensity(tile) == 3) {
 				uint32 r = Random();
-				if (CHANCE16I(1, 200, r)) {
+				if (Chance16I(1, 200, r)) {
 					SndPlayTileFx((r & 0x80000000) ? SND_39_HEAVY_WIND : SND_34_WIND, tile);
 				}
 			}
@@ -586,6 +586,16 @@
 
 	TileLoopClearHelper(tile);
 
+	uint treeCounter = GetTreeCounter(tile);
+
+	/* Handle growth of grass at every 8th processings, like it's done for grass */
+	if ((treeCounter & 7) == 7 && GetTreeGround(tile) == TREE_GROUND_GRASS) {
+		uint density = GetTreeDensity(tile);
+		if (density < 3) {
+			SetTreeGroundDensity(tile, TREE_GROUND_GRASS, density + 1);
+			MarkTileDirtyByTile(tile);
+		}
+	}
 	if (GetTreeCounter(tile) < 15) {
 		AddTreeCounter(tile, 1);
 		return;
@@ -622,11 +632,12 @@
 						switch (GetClearGround(tile)) {
 							case CLEAR_GRASS:
 								if (GetClearDensity(tile) != 3) return;
-								MakeTree(tile, treetype, 0, 0, TREE_GROUND_GRASS, 0);
+								MakeTree(tile, treetype, 0, 0, TREE_GROUND_GRASS, 3);
 								break;
 
-							case CLEAR_ROUGH: MakeTree(tile, treetype, 0, 0, TREE_GROUND_ROUGH, 0); break;
-							case CLEAR_SNOW:  MakeTree(tile, treetype, 0, 0, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break;
+							case CLEAR_ROUGH: MakeTree(tile, treetype, 0, 0, TREE_GROUND_ROUGH, 3); break;
+							case CLEAR_DESERT: return; // Cacti don't spread
+							case CLEAR_SNOW: MakeTree(tile, treetype, 0, 0, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break;
 							default: return;
 						}
 						break;
@@ -646,9 +657,11 @@
 			} else {
 				/* just one tree, change type into MP_CLEAR */
 				switch (GetTreeGround(tile)) {
-					case TREE_GROUND_GRASS: MakeClear(tile, CLEAR_GRASS, 3); break;
+					case TREE_GROUND_GRASS: MakeClear(tile, CLEAR_GRASS, GetTreeDensity(tile)); break;
 					case TREE_GROUND_ROUGH: MakeClear(tile, CLEAR_ROUGH, 3); break;
-					default: MakeClear(tile, CLEAR_SNOW, GetTreeDensity(tile)); break;
+					default: // snow or desert
+						MakeClear(tile, _opt.landscape == LT_TROPIC ? CLEAR_DESERT : CLEAR_SNOW, GetTreeDensity(tile));
+						break;
 				}
 			}
 			break;
@@ -675,7 +688,7 @@
 			!IsBridgeAbove(tile) &&
 			(ct = GetClearGround(tile), ct == CLEAR_GRASS || ct == CLEAR_ROUGH) &&
 			(tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TREE_INVALID) {
-		MakeTree(tile, tree, 0, 0, ct == CLEAR_ROUGH ? TREE_GROUND_ROUGH : TREE_GROUND_GRASS, 0);
+		MakeTree(tile, tree, 0, 0, ct == CLEAR_ROUGH ? TREE_GROUND_ROUGH : TREE_GROUND_GRASS, GetClearDensity(tile));
 	}
 
 	/* byte underflow */
@@ -689,8 +702,8 @@
 			(ct = GetClearGround(tile), ct == CLEAR_GRASS || ct == CLEAR_ROUGH || ct == CLEAR_SNOW) &&
 			(tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TREE_INVALID) {
 		switch (ct) {
-			case CLEAR_GRASS: MakeTree(tile, tree, 0, 0, TREE_GROUND_GRASS, 0); break;
-			case CLEAR_ROUGH: MakeTree(tile, tree, 0, 0, TREE_GROUND_ROUGH, 0); break;
+			case CLEAR_GRASS: MakeTree(tile, tree, 0, 0, TREE_GROUND_GRASS, GetClearDensity(tile)); break;
+			case CLEAR_ROUGH: MakeTree(tile, tree, 0, 0, TREE_GROUND_ROUGH, 3); break;
 			default: MakeTree(tile, tree, 0, 0, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break;
 		}
 	}
--- a/src/tunnel_map.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/tunnel_map.h	Mon Dec 03 23:39:38 2007 +0000
@@ -20,7 +20,7 @@
 static inline bool IsTunnel(TileIndex t)
 {
 	assert(IsTileType(t, MP_TUNNELBRIDGE));
-	return !HASBIT(_m[t].m5, 7);
+	return !HasBit(_m[t].m5, 7);
 }
 
 
@@ -67,7 +67,7 @@
 static inline bool HasTunnelSnowOrDesert(TileIndex t)
 {
 	assert(IsTunnelTile(t));
-	return HASBIT(_m[t].m4, 7);
+	return HasBit(_m[t].m4, 7);
 }
 
 /**
--- a/src/tunnelbridge_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/tunnelbridge_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -33,6 +33,7 @@
 #include "date.h"
 #include "newgrf_sound.h"
 #include "autoslope.h"
+#include "transparency.h"
 
 #include "table/bridge_land.h"
 
@@ -117,12 +118,12 @@
 	uint32 valid;
 
 	valid = M(SLOPE_FLAT) | (axis == AXIS_X ? M(SLOPE_NE) : M(SLOPE_NW));
-	if (HASBIT(valid, tileh)) return CommandCost();
+	if (HasBit(valid, tileh)) return CommandCost();
 
 	valid =
 		BRIDGE_FULL_LEVELED_FOUNDATION | M(SLOPE_N) | M(SLOPE_STEEP_N) |
 		(axis == AXIS_X ? M(SLOPE_E) | M(SLOPE_STEEP_E) : M(SLOPE_W) | M(SLOPE_STEEP_W));
-	if (HASBIT(valid, tileh)) return CommandCost(_price.terraform);
+	if (HasBit(valid, tileh)) return CommandCost(_price.terraform);
 
 	return CMD_ERROR;
 }
@@ -132,12 +133,12 @@
 	uint32 valid;
 
 	valid = M(SLOPE_FLAT) | (axis == AXIS_X ? M(SLOPE_SW) : M(SLOPE_SE));
-	if (HASBIT(valid, tileh)) return CommandCost();
+	if (HasBit(valid, tileh)) return CommandCost();
 
 	valid =
 		BRIDGE_FULL_LEVELED_FOUNDATION | M(SLOPE_S) | M(SLOPE_STEEP_S) |
 		(axis == AXIS_X ? M(SLOPE_W) | M(SLOPE_STEEP_W) : M(SLOPE_E) | M(SLOPE_STEEP_E));
-	if (HASBIT(valid, tileh)) return CommandCost(_price.terraform);
+	if (HasBit(valid, tileh)) return CommandCost(_price.terraform);
 
 	return CMD_ERROR;
 }
@@ -209,10 +210,10 @@
 	if (p1 >= MapSize()) return CMD_ERROR;
 
 	/* type of bridge */
-	if (HASBIT(p2, 15)) {
+	if (HasBit(p2, 15)) {
 		railtype = INVALID_RAILTYPE; // road bridge
 		roadtypes = (RoadTypes)GB(p2, 8, 3);
-		if (!AreValidRoadTypes(roadtypes)) return CMD_ERROR;
+		if (!AreValidRoadTypes(roadtypes) || !HasRoadTypesAvail(_current_player, roadtypes)) return CMD_ERROR;
 	} else {
 		if (!ValParamRailtype(GB(p2, 8, 8))) return CMD_ERROR;
 		railtype = (RailType)GB(p2, 8, 8);
@@ -243,7 +244,7 @@
 	/* retrieve landscape height and ensure it's on land */
 	tile_start = TileXY(x, y);
 	tile_end = TileXY(sx, sy);
-	if (IsClearWaterTile(tile_start) || IsClearWaterTile(tile_end)) {
+	if (IsWaterTile(tile_start) || IsWaterTile(tile_end)) {
 		return_cmd_error(STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH);
 	}
 
@@ -251,16 +252,15 @@
 	tileh_end = GetTileSlope(tile_end, &z_end);
 
 	if (IsSteepSlope(tileh_start)) z_start += TILE_HEIGHT;
-	if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION, tileh_start)) z_start += TILE_HEIGHT;
+	if (HasBit(BRIDGE_FULL_LEVELED_FOUNDATION, tileh_start)) z_start += TILE_HEIGHT;
 
 	if (IsSteepSlope(tileh_end)) z_end += TILE_HEIGHT;
-	if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION, 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_BRIDGEHEADS_NOT_SAME_HEIGHT);
 
-	/* Towns are not allowed to use bridges on slopes. */
 	allow_on_slopes = (!_is_old_ai_player
-	                   && _current_player != OWNER_TOWN && _patches.build_on_slopes);
+	                   && _patches.build_on_slopes);
 
 	TransportType transport_type = railtype == INVALID_RAILTYPE ? TRANSPORT_ROAD : TRANSPORT_RAIL;
 
@@ -376,7 +376,7 @@
 
 		switch (GetTileType(tile)) {
 			case MP_WATER:
-				if (!EnsureNoVehicle(tile)) return_cmd_error(STR_980E_SHIP_IN_THE_WAY);
+				if (!EnsureNoVehicleOnGround(tile)) return_cmd_error(STR_980E_SHIP_IN_THE_WAY);
 				if (!IsWater(tile) && !IsCoast(tile)) goto not_valid_below;
 				break;
 
@@ -462,10 +462,11 @@
 	CommandCost ret;
 
 	_build_tunnel_endtile = 0;
-	if (!HASBIT(p1, 9)) {
+	if (!HasBit(p1, 9)) {
 		if (!ValParamRailtype(p1)) return CMD_ERROR;
-	} else if (!AreValidRoadTypes((RoadTypes)GB(p1, 0, 3))) {
-		return CMD_ERROR;
+	} else {
+		const RoadTypes rts = (RoadTypes)GB(p1, 0, 3);
+		if (!AreValidRoadTypes(rts) || !HasRoadTypesAvail(_current_player, rts)) return CMD_ERROR;
 	}
 
 	start_tileh = GetTileSlope(start_tile, &start_z);
@@ -773,7 +774,7 @@
 			VehicleFromPos(endtile, &endtile, UpdateTrainPowerProc);
 		}
 
-		return CommandCost((length + 1) * (_price.build_rail >> 1));
+		return CommandCost((length + 1) * (RailBuildCost(totype) / 2));
 	} else if (IsBridge(tile) && GetBridgeTransportType(tile) == TRANSPORT_RAIL) {
 		TileIndex endtile = GetOtherBridgeEnd(tile);
 		byte bridge_height = GetBridgeHeight(tile);
@@ -805,48 +806,66 @@
 			}
 		}
 
-		return CommandCost((DistanceManhattan(tile, endtile) + 1) * (_price.build_rail >> 1));
+		return CommandCost((DistanceManhattan(tile, endtile) + 1) * (RailBuildCost(totype) / 2));
 	} else {
 		return CMD_ERROR;
 	}
 }
 
 
-static void DrawBridgePillars(const PalSpriteID *psid, const TileInfo* ti, Axis axis, uint type, int x, int y, int z)
+/**
+ * Draws the pillars under high bridges.
+ *
+ * @param psid Image and palette of a bridge pillar.
+ * @param ti #TileInfo of current bridge-middle-tile.
+ * @param axis Orientation of bridge.
+ * @param type Bridge type.
+ * @param x Sprite X position of front pillar.
+ * @param y Sprite Y position of front pillar.
+ * @param z_bridge Absolute height of bridge bottom.
+ */
+static void DrawBridgePillars(const PalSpriteID *psid, const TileInfo* ti, Axis axis, uint type, int x, int y, int z_bridge)
 {
 	SpriteID image = psid->sprite;
 	if (image != 0) {
-		bool drawfarpillar = !HASBIT(GetBridgeFlags(type), 0);
-		int back_height, front_height;
-		int i = z;
-		const byte *p;
-
-		static const byte _tileh_bits[4][8] = {
-			{ 2, 1, 8, 4,  16,  2, 0, 9 },
-			{ 1, 8, 4, 2,   2, 16, 9, 0 },
-			{ 4, 8, 1, 2,  16,  2, 0, 9 },
-			{ 2, 4, 8, 1,   2, 16, 9, 0 }
-		};
+		bool drawfarpillar = !HasBit(GetBridgeFlags(type), 0);
 
-		p = _tileh_bits[(image & 1) * 2 + (axis == AXIS_X ? 0 : 1)];
-		front_height = ti->z + (ti->tileh & p[0] ? TILE_HEIGHT : 0);
-		back_height  = ti->z + (ti->tileh & p[1] ? TILE_HEIGHT : 0);
+		/* "side" specifies the side the pillars stand on.
+		 * The length of the pillars is then set to the height of the bridge over the corners of this edge.
+		 *
+		 *                axis==AXIS_X  axis==AXIS_Y
+		 *   side==false      SW            NW
+		 *   side==true       NE            SE
+		 *
+		 * I have no clue, why this was done this way.
+		 */
+		bool side = HasBit(image, 0);
 
-		if (IsSteepSlope(ti->tileh)) {
-			if (!(ti->tileh & p[2])) front_height += TILE_HEIGHT;
-			if (!(ti->tileh & p[3])) back_height  += TILE_HEIGHT;
-		}
+		/* "dir" means the edge the pillars stand on */
+		DiagDirection dir = AxisToDiagDir(axis);
+		if (side != (axis == AXIS_Y)) dir = ReverseDiagDir(dir);
 
-		for (; z >= front_height || z >= back_height; z -= TILE_HEIGHT) {
-			/* HACK set height of the BB of pillars to 1, because the origin of the
-			 * sprites is at the top
-			 */
-			if (z >= front_height) { // front facing pillar
-				AddSortableSpriteToDraw(image, psid->pal, x, y, p[4], p[5], BB_HEIGHT_UNDER_BRIDGE - 5, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, -5);
+		/* Determine ground height under pillars */
+		int front_height = ti->z;
+		int back_height = ti->z;
+		GetSlopeZOnEdge(ti->tileh, dir, &front_height, &back_height);
+
+		/* x and y size of bounding-box of pillars */
+		int w = (axis == AXIS_X ? 16 : 2);
+		int h = (axis == AXIS_X ? 2 : 16);
+		/* sprite position of back facing pillar */
+		int x_back = x - (axis == AXIS_X ? 0 : 9);
+		int y_back = y - (axis == AXIS_X ? 9 : 0);
+
+		for (int cur_z = z_bridge; cur_z >= front_height || cur_z >= back_height; cur_z -= TILE_HEIGHT) {
+			/* Draw front facing pillar */
+			if (cur_z >= front_height) {
+				AddSortableSpriteToDraw(image, psid->pal, x, y, w, h, BB_HEIGHT_UNDER_BRIDGE - 5, cur_z, IsTransparencySet(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], BB_HEIGHT_UNDER_BRIDGE - 5, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, -5);
+			/* Draw back facing pillar, but not the highest part directly under the bridge-floor */
+			if (drawfarpillar && cur_z >= back_height && cur_z < z_bridge - TILE_HEIGHT) {
+				AddSortableSpriteToDraw(image, psid->pal, x_back, y_back, w, h, BB_HEIGHT_UNDER_BRIDGE - 5, cur_z, IsTransparencySet(TO_BRIDGES), 0, 0, -5);
 			}
 		}
 	}
@@ -854,8 +873,8 @@
 
 Foundation GetBridgeFoundation(Slope tileh, Axis axis)
 {
-	if (HASBIT(BRIDGE_NO_FOUNDATION, tileh)) return FOUNDATION_NONE;
-	if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION, tileh)) return FlatteningFoundation(tileh);
+	if (HasBit(BRIDGE_NO_FOUNDATION, tileh)) return FOUNDATION_NONE;
+	if (HasBit(BRIDGE_FULL_LEVELED_FOUNDATION, tileh)) return FlatteningFoundation(tileh);
 	return InclinedFoundation(axis);
 }
 
@@ -880,16 +899,16 @@
 
 	/* 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 + tram_offsets[overlay][offset], PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, z, IsTransparencySet(TO_BRIDGES));
 
-	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset],  PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, 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, IsTransparencySet(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] + 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]);
+	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, IsTransparencySet(TO_BUILDINGS), front_bb_offset_x[offset], front_bb_offset_y[offset]);
 }
 
 /**
@@ -927,7 +946,7 @@
 			{  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)];
+		const int *BB_data = _tunnel_BB[GetTunnelDirection(ti->tile)];
 
 		bool catenary = false;
 
@@ -945,14 +964,14 @@
 			DiagDirection dir = GetTunnelDirection(ti->tile);
 			RoadTypes rts = GetRoadTypes(ti->tile);
 
-			if (HASBIT(rts, ROADTYPE_TRAM)) {
+			if (HasBit(rts, ROADTYPE_TRAM)) {
 				static const SpriteID tunnel_sprites[2][4] = { { 28, 78, 79, 27 }, {  5, 76, 77,  4 } };
 
 				DrawGroundSprite(SPR_TRAMWAY_BASE + tunnel_sprites[rts - ROADTYPES_TRAM][dir], PAL_NONE);
 
 				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);
+				AddSortableSpriteToDraw(SPR_TRAMWAY_TUNNEL_WIRES + dir, PAL_NONE, ti->x, ti->y, BB_data[10], BB_data[11], TILE_HEIGHT, ti->z, IsTransparencySet(TO_BUILDINGS), BB_data[8], BB_data[9], BB_Z_SEPARATOR);
 			}
 		} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
 			DrawCatenary(ti);
@@ -1011,13 +1030,13 @@
 		 * it doesn't disappear behind it
 		 */
 		AddSortableSpriteToDraw(
-			psid->sprite, psid->pal, ti->x, ti->y, 16, 16, ti->tileh == SLOPE_FLAT ? 0 : 8, ti->z, HASBIT(_transparent_opt, TO_BRIDGES)
+			psid->sprite, psid->pal, ti->x, ti->y, 16, 16, ti->tileh == SLOPE_FLAT ? 0 : 8, ti->z, IsTransparencySet(TO_BRIDGES)
 		);
 
 		if (GetBridgeTransportType(ti->tile) == TRANSPORT_ROAD) {
 			RoadTypes rts = GetRoadTypes(ti->tile);
 
-			if (HASBIT(rts, ROADTYPE_TRAM)) {
+			if (HasBit(rts, ROADTYPE_TRAM)) {
 				uint offset = GetBridgeRampDirection(ti->tile);
 				uint z = ti->z;
 				if (ti->tileh != SLOPE_FLAT) {
@@ -1027,7 +1046,7 @@
 					offset += 2;
 				}
 				/* DrawBridgeTramBits() calls EndSpriteCombine() and StartSpriteCombine() */
-				DrawBridgeTramBits(ti->x, ti->y, z, offset, HASBIT(rts, ROADTYPE_ROAD));
+				DrawBridgeTramBits(ti->x, ti->y, z, offset, HasBit(rts, ROADTYPE_ROAD));
 			}
 			EndSpriteCombine();
 		} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
@@ -1139,9 +1158,9 @@
 
 	/* Draw floor and far part of bridge*/
 	if (axis == AXIS_X) {
-		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 1, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, BRIDGE_Z_START);
+		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 1, 0x28, z, IsTransparencySet(TO_BRIDGES), 0, 0, BRIDGE_Z_START);
 	} else {
-		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 1, 16, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, BRIDGE_Z_START);
+		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 1, 16, 0x28, z, IsTransparencySet(TO_BRIDGES), 0, 0, BRIDGE_Z_START);
 	}
 
 	psid++;
@@ -1149,9 +1168,9 @@
 	if (GetBridgeTransportType(rampsouth) == TRANSPORT_ROAD) {
 		RoadTypes rts = GetRoadTypes(rampsouth);
 
-		if (HASBIT(rts, ROADTYPE_TRAM)) {
+		if (HasBit(rts, ROADTYPE_TRAM)) {
 			/* DrawBridgeTramBits() calls EndSpriteCombine() and StartSpriteCombine() */
-			DrawBridgeTramBits(x, y, bridge_z, axis ^ 1, HASBIT(rts, ROADTYPE_ROAD));
+			DrawBridgeTramBits(x, y, bridge_z, axis ^ 1, HasBit(rts, ROADTYPE_ROAD));
 		} else {
 			EndSpriteCombine();
 			StartSpriteCombine();
@@ -1163,10 +1182,10 @@
 	/* 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, 4, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 3, BRIDGE_Z_START);
+		if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 4, 0x28, z, IsTransparencySet(TO_BRIDGES), 0, 3, BRIDGE_Z_START);
 	} else {
 		x += 12;
-		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);
+		if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 4, 16, 0x28, z, IsTransparencySet(TO_BRIDGES), 3, 0, BRIDGE_Z_START);
 	}
 
 	/* Draw TramFront as SpriteCombine */
@@ -1178,8 +1197,8 @@
 		if (psid->sprite != 0) {
 			SpriteID image = psid->sprite;
 			SpriteID pal   = psid->pal;
-			if (HASBIT(_transparent_opt, TO_BRIDGES)) {
-				SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
+			if (IsTransparencySet(TO_BRIDGES)) {
+				SetBit(image, PALETTE_MODIFIER_TRANSPARENT);
 				pal = PALETTE_TO_TRANSPARENT;
 			}
 
@@ -1215,7 +1234,7 @@
 		if (5 <= pos && pos <= 10) {
 			uint delta;
 
-			if (HASBIT(BRIDGE_HORZ_RAMP, tileh)) return z + TILE_HEIGHT;
+			if (HasBit(BRIDGE_HORZ_RAMP, tileh)) return z + TILE_HEIGHT;
 
 			switch (dir) {
 				default: NOT_REACHED();
@@ -1377,7 +1396,7 @@
 {
 	int z = GetSlopeZ(x, y) - v->z_pos;
 
-	if (myabs(z) > 2) return VETSB_CANNOT_ENTER;
+	if (abs(z) > 2) return VETSB_CANNOT_ENTER;
 
 	if (IsTunnel(tile)) {
 		byte fc;
@@ -1466,8 +1485,8 @@
 			}
 			if (v->type == VEH_TRAIN) {
 				v->u.rail.track = TRACK_BIT_WORMHOLE;
-				CLRBIT(v->u.rail.flags, VRF_GOINGUP);
-				CLRBIT(v->u.rail.flags, VRF_GOINGDOWN);
+				ClrBit(v->u.rail.flags, VRF_GOINGUP);
+				ClrBit(v->u.rail.flags, VRF_GOINGDOWN);
 			} else {
 				v->u.road.state = RVSB_WORMHOLE;
 			}
--- a/src/unix.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/unix.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -67,6 +67,10 @@
 	uint32 free = 0;
 
 #ifdef HAS_STATVFS
+# ifdef __APPLE__
+	/* OSX 10.3 lacks statvfs so don't try to use it even though later versions of OSX has it. */
+	if (MacOSVersionIsAtLeast(10, 4, 0))
+# endif
 	{
 		struct statvfs s;
 
@@ -136,8 +140,7 @@
 	}
 #endif
 
-	_random_seeds[1][1] = _random_seeds[1][0] = _random_seeds[0][1] = _random_seeds[0][0] = time(NULL);
-	SeedMT(_random_seeds[0][1]);
+	SetRandomSeed(time(NULL));
 
 	signal(SIGPIPE, SIG_IGN);
 
@@ -230,7 +233,7 @@
 	/* Work around buggy iconv implementation where inbuf is wrongly typed as
 	 * non-const. Correct implementation is at
 	 * http://www.opengroup.org/onlinepubs/007908799/xsh/iconv.html */
-#if defined (__GLIBC__) || defined (__GNU_LIBRARY__)
+#ifdef HAVE_BROKEN_ICONV
 	char *inbuf = (char*)name;
 #else
 	const char *inbuf = name;
--- a/src/unmovable_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/unmovable_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -25,6 +25,7 @@
 #include "genworld.h"
 #include "bridge.h"
 #include "autoslope.h"
+#include "transparency.h"
 
 /** Destroy a HQ.
  * During normal gameplay you can only implicitely destroy a HQ when you are
@@ -75,7 +76,7 @@
 	MarkTileDirtyByTile(tile + TileDiffXY(1, 1));
 }
 
-extern CommandCost CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invalid_dirs, StationID* station, bool check_clear = true);
+extern CommandCost CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invalid_dirs, StationID *station, bool check_clear = true);
 
 /** Build or relocate the HQ. This depends if the HQ is already built or not
  * @param tile tile where the HQ will be built or relocated to
@@ -129,7 +130,7 @@
 			AddSortableSpriteToDraw(
 				dtus->image, PAL_NONE, ti->x | dtus->subcoord_x, ti->y | dtus->subcoord_y,
 				dtus->width, dtus->height, dtus->z_size, ti->z,
-				HASBIT(_transparent_opt, TO_STRUCTURES)
+				IsTransparencySet(TO_STRUCTURES)
 			);
 			break;
 		}
@@ -140,7 +141,7 @@
 
 			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));
+			AddSortableSpriteToDraw(SPR_STATUE_COMPANY, PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), ti->x, ti->y, 16, 16, 25, ti->z, IsTransparencySet(TO_STRUCTURES));
 			break;
 
 		case UNMOVABLE_OWNED_LAND:
@@ -172,7 +173,7 @@
 					ti->x + dtss->delta_x, ti->y + dtss->delta_y,
 					dtss->size_x, dtss->size_y,
 					dtss->size_z, ti->z + dtss->delta_z,
-					HASBIT(_transparent_opt, TO_STRUCTURES)
+					IsTransparencySet(TO_STRUCTURES)
 				);
 			}
 			break;
@@ -217,7 +218,7 @@
 
 	if (IsStatue(tile)) {
 		TownID town = GetStatueTownID(tile);
-		CLRBIT(GetTown(town)->statues, _current_player);
+		ClrBit(GetTown(town)->statues, _current_player);
 		InvalidateWindow(WC_TOWN_AUTHORITY, town);
 	}
 
--- a/src/unmovable_map.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/unmovable_map.h	Mon Dec 03 23:39:38 2007 +0000
@@ -21,7 +21,7 @@
 	UNMOVABLE_HQ_EAST     = 0x82, ///< Offset for the eastern HQ tile
 	UNMOVABLE_HQ_SOUTH    = 0x83, ///< Offset for the southern HQ tile
 
-	/** End of the HQ (rather end + 1 for IS_INT_INSIDE) */
+	/** End of the HQ (rather end + 1 for IsInside) */
 	UNMOVABLE_HQ_END      = UNMOVABLE_HQ_NORTH + HQ_NUM_SIZE * HQ_NUM_TILE
 };
 
@@ -80,7 +80,7 @@
 static inline bool IsCompanyHQ(TileIndex t)
 {
 	assert(IsTileType(t, MP_UNMOVABLE));
-	return IS_INT_INSIDE(GetUnmovableType(t), UNMOVABLE_HQ_NORTH, UNMOVABLE_HQ_END);
+	return IsInsideMM(GetUnmovableType(t), UNMOVABLE_HQ_NORTH, UNMOVABLE_HQ_END);
 }
 
 /**
--- a/src/variables.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/variables.h	Mon Dec 03 23:39:38 2007 +0000
@@ -247,6 +247,8 @@
 
 	bool exclusive_rights;   ///< allow buying exclusive rights
 	bool give_money;         ///< allow giving other players money
+
+	bool enable_signal_gui;  ///< Show the signal GUI when the signal button is pressed
 };
 
 VARDEF Patches _patches;
@@ -290,7 +292,6 @@
 VARDEF int _autosave_ctr;
 
 VARDEF byte _display_opt;
-VARDEF byte _transparent_opt;
 VARDEF int _caret_timer;
 VARDEF uint32 _news_display_opt;
 VARDEF bool _news_ticker_sound;
@@ -300,6 +301,8 @@
 
 VARDEF bool _rightclick_emulate;
 
+VARDEF PlayerFace _player_face; ///< for player face storage in openttd.cfg
+
 /* IN/OUT parameters to commands */
 VARDEF byte _yearly_expenses_type;
 VARDEF TileIndex _terraform_err_tile;
--- a/src/vehicle.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/vehicle.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -117,25 +117,11 @@
 	}
 }
 
-static void *EnsureNoVehicleProc(Vehicle *v, void *data)
-{
-	if (v->tile != *(const TileIndex*)data || v->type == VEH_DISASTER)
-		return NULL;
-
-	_error_message = VehicleInTheWayErrMsg(v);
-	return v;
-}
-
-bool EnsureNoVehicle(TileIndex tile)
-{
-	return VehicleFromPos(tile, &tile, EnsureNoVehicleProc) == NULL;
-}
-
 static void *EnsureNoVehicleProcZ(Vehicle *v, void *data)
 {
 	const TileInfo *ti = (const TileInfo*)data;
 
-	if (v->tile != ti->tile || v->type == VEH_DISASTER) return NULL;
+	if (v->tile != ti->tile || v->type == VEH_DISASTER || (v->type == VEH_AIRCRAFT && v->subtype == AIR_SHADOW)) return NULL;
 	if (v->z_pos > ti->z) return NULL;
 
 	_error_message = VehicleInTheWayErrMsg(v);
@@ -248,7 +234,7 @@
 	FOR_ALL_VEHICLES(v) {
 		switch (v->type) {
 			case VEH_ROAD:
-				v->u.road.roadtype = HASBIT(EngInfo(v->engine_type)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD;
+				v->u.road.roadtype = HasBit(EngInfo(v->engine_type)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD;
 				v->u.road.compatible_roadtypes = RoadTypeToRoadTypes(v->u.road.roadtype);
 				/* FALL THROUGH */
 			case VEH_TRAIN:
@@ -288,6 +274,7 @@
 	this->group_id           = DEFAULT_GROUP;
 	this->fill_percent_te_id = INVALID_TE_ID;
 	this->first              = this;
+	this->colormap           = PAL_NONE;
 }
 
 /**
@@ -471,6 +458,12 @@
 	memset(_new_vehicle_position_hash, 0, sizeof(_new_vehicle_position_hash));
 }
 
+void ResetVehicleColorMap()
+{
+	Vehicle *v;
+	FOR_ALL_VEHICLES(v) { v->colormap = PAL_NONE; }
+}
+
 void InitializeVehicles()
 {
 	_Vehicle_pool.CleanPool();
@@ -543,6 +536,12 @@
 	if ((this->type == VEH_TRAIN && EngineHasArticPart(this)) || (this->type == VEH_ROAD && RoadVehHasArticPart(this))) {
 		delete this->Next();
 	}
+
+	Window *w = FindWindowById(WC_VEHICLE_VIEW, this->index);
+	if (w != NULL && WP(w, vp_d).follow_vehicle == this->index) {
+		ScrollMainWindowTo(this->x_pos, this->y_pos); // lock the main view on the vehicle's last position
+		WP(w, vp_d).follow_vehicle = INVALID_VEHICLE;
+	}
 }
 
 Vehicle::~Vehicle()
@@ -564,13 +563,10 @@
 /**
  * Deletes all vehicles in a chain.
  * @param v The first vehicle in the chain.
- *
- * @warning This function is not valid for any vehicle containing articulated
- * parts.
  */
 void DeleteVehicleChain(Vehicle *v)
 {
-	assert(v->type != VEH_TRAIN && v->type != VEH_ROAD);
+	assert(v->First() == v);
 
 	do {
 		Vehicle *u = v;
@@ -588,7 +584,7 @@
 void VehicleEnteredDepotThisTick(Vehicle *v)
 {
 	/* we need to set v->leave_depot_instantly as we have no control of it's contents at this time */
-	if (HASBIT(v->current_order.flags, OFB_HALT_IN_DEPOT) && !HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS) && v->current_order.type == OT_GOTO_DEPOT) {
+	if (HasBit(v->current_order.flags, OFB_HALT_IN_DEPOT) && !HasBit(v->current_order.flags, OFB_PART_OF_ORDERS) && v->current_order.type == OT_GOTO_DEPOT) {
 		/* we keep the vehicle in the depot since the user ordered it to stay */
 		v->leave_depot_instantly = false;
 	} else {
@@ -656,7 +652,7 @@
  */
 bool CanRefitTo(EngineID engine_type, CargoID cid_to)
 {
-	return HASBIT(EngInfo(engine_type)->refit_mask, cid_to);
+	return HasBit(EngInfo(engine_type)->refit_mask, cid_to);
 }
 
 /** Find the first cargo type that an engine can be refitted to.
@@ -669,7 +665,7 @@
 
 	if (refit_mask != 0) {
 		for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
-			if (HASBIT(refit_mask, cid)) return cid;
+			if (HasBit(refit_mask, cid)) return cid;
 		}
 	}
 
@@ -1268,7 +1264,7 @@
 	}
 
 	if (b->y == 4 && b->x == 1) {
-		if (v->z_pos > 180 || CHANCE16I(1, 96, InteractiveRandom())) {
+		if (v->z_pos > 180 || Chance16I(1, 96, InteractiveRandom())) {
 			v->spritenum = 5;
 			SndPlayVehicleFx(SND_2F_POP, v);
 		}
@@ -1353,8 +1349,8 @@
 
 Vehicle *CreateEffectVehicleAbove(int x, int y, int z, EffectVehicle type)
 {
-	int safe_x = clamp(x, 0, MapMaxX() * TILE_SIZE);
-	int safe_y = clamp(y, 0, MapMaxY() * TILE_SIZE);
+	int safe_x = Clamp(x, 0, MapMaxX() * TILE_SIZE);
+	int safe_y = Clamp(y, 0, MapMaxY() * TILE_SIZE);
 	return CreateEffectVehicle(x, y, GetSlopeZ(safe_x, safe_y) + z, type);
 }
 
@@ -1386,8 +1382,8 @@
 				y >= v->top_coord && y <= v->bottom_coord) {
 
 			dist = max(
-				myabs( ((v->left_coord + v->right_coord)>>1) - x ),
-				myabs( ((v->top_coord + v->bottom_coord)>>1) - y )
+				abs( ((v->left_coord + v->right_coord)>>1) - x ),
+				abs( ((v->top_coord + v->bottom_coord)>>1) - y )
 			);
 
 			if (dist < best_dist) {
@@ -1400,6 +1396,15 @@
 	return found;
 }
 
+void CheckVehicle32Day(Vehicle *v)
+{
+	if ((v->day_counter & 0x1F) != 0) return;
+
+	uint16 callback = GetVehicleCallback(CBID_VEHICLE_32DAY_CALLBACK, 0, 0, v->engine_type, v);
+	if (callback == CALLBACK_FAILED) return;
+	if (HasBit(callback, 0)) TriggerVehicle(v, VEHICLE_TRIGGER_CALLBACK_32); // Trigger vehicle trigger 10
+	if (HasBit(callback, 1)) v->colormap = PAL_NONE;                         // Update colormap via callback 2D
+}
 
 void DecreaseVehicleValue(Vehicle *v)
 {
@@ -1438,7 +1443,7 @@
 
 	/* increase chance of failure */
 	chance = v->breakdown_chance + 1;
-	if (CHANCE16I(1,25,r)) chance += 25;
+	if (Chance16I(1,25,r)) chance += 25;
 	v->breakdown_chance = min(255, chance);
 
 	/* calculate reliability value to use in comparison */
@@ -1515,8 +1520,8 @@
 	uint i;
 	uint stop_command;
 	VehicleType vehicle_type = (VehicleType)GB(p2, 0, 5);
-	bool start_stop = HASBIT(p2, 5);
-	bool vehicle_list_window = HASBIT(p2, 6);
+	bool start_stop = HasBit(p2, 5);
+	bool vehicle_list_window = HasBit(p2, 6);
 
 	switch (vehicle_type) {
 		case VEH_TRAIN:    stop_command = CMD_START_STOP_TRAIN;    break;
@@ -1746,8 +1751,8 @@
 		if (flags & DC_EXEC) {
 			w = GetVehicle(_new_vehicle_id);
 
-			if (v->type == VEH_TRAIN && HASBIT(v->u.rail.flags, VRF_REVERSE_DIRECTION)) {
-				SETBIT(w->u.rail.flags, VRF_REVERSE_DIRECTION);
+			if (v->type == VEH_TRAIN && HasBit(v->u.rail.flags, VRF_REVERSE_DIRECTION)) {
+				SetBit(w->u.rail.flags, VRF_REVERSE_DIRECTION);
 			}
 
 			if (v->type == VEH_TRAIN && !IsFrontEngine(v)) {
@@ -1762,10 +1767,9 @@
 					return result; // return error and the message returned from CMD_MOVE_RAIL_VEHICLE
 				}
 			} else {
-				/* this is a front engine or not a train. It need orders */
+				/* this is a front engine or not a train. */
 				w_front = w;
 				w->service_interval = v->service_interval;
-				DoCommand(0, (v->index << 16) | w->index, p2 & 1 ? CO_SHARE : CO_COPY, flags, CMD_CLONE_ORDER);
 			}
 			w_rear = w; // trains needs to know the last car in the train, so they can add more in next loop
 		}
@@ -1797,7 +1801,7 @@
 			if (flags & DC_EXEC) {
 				assert(w != NULL);
 
-				if (w->cargo_type != v->cargo_type || w->cargo_subtype != v->cargo_type) {
+				if (w->cargo_type != v->cargo_type || w->cargo_subtype != v->cargo_subtype) {
 					cost = DoCommand(0, w->index, v->cargo_type | (v->cargo_subtype << 8) | 1U << 16 , flags, GetCmdRefitVeh(v));
 					if (CmdSucceeded(cost)) total_cost.AddCost(cost);
 				}
@@ -1829,6 +1833,15 @@
 		if ((flags & DC_EXEC) && v->type == VEH_TRAIN) w = GetNextVehicle(w);
 	} while (v->type == VEH_TRAIN && (v = GetNextVehicle(v)) != NULL);
 
+	if (flags & DC_EXEC) {
+		/*
+		 * Set the orders of the vehicle. Cannot do it earlier as we need
+		 * the vehicle refitted before doing this, otherwise the moved
+		 * cargo types might not match (passenger vs non-passenger)
+		 */
+		DoCommand(0, (v_front->index << 16) | w_front->index, p2 & 1 ? CO_SHARE : CO_COPY, flags, CMD_CLONE_ORDER);
+	}
+
 	/* Since we can't estimate the cost of cloning a vehicle accurately we must
 	 * check whether the player has enough money manually. */
 	if (!CheckPlayerHasMoney(total_cost)) {
@@ -2101,7 +2114,7 @@
 		count += v->cargo.Count();
 		max += v->cargo_cap;
 		if (v->cargo_cap != 0) {
-			unloading += HASBIT(v->vehicle_flags, VF_CARGO_UNLOADING) ? 1 : 0;
+			unloading += HasBit(v->vehicle_flags, VF_CARGO_UNLOADING) ? 1 : 0;
 			loading |= (u->current_order.flags & OF_UNLOAD) == 0 && st->goods[v->cargo_type].days_since_pickup != 255;
 			cars++;
 		}
@@ -2188,11 +2201,11 @@
 			}
 		}
 
-		if (HASBIT(t.flags, OFB_PART_OF_ORDERS)) {
+		if (HasBit(t.flags, OFB_PART_OF_ORDERS)) {
 			/* Part of orders */
 			UpdateVehicleTimetable(v, true);
 			v->cur_order_index++;
-		} else if (HASBIT(t.flags, OFB_HALT_IN_DEPOT)) {
+		} else if (HasBit(t.flags, OFB_HALT_IN_DEPOT)) {
 			/* Force depot visit */
 			v->vehstatus |= VS_STOPPED;
 			if (v->owner == _local_player) {
@@ -2504,7 +2517,7 @@
 		/* Can we actually build the vehicle type? */
 		EngineID e;
 		FOR_ALL_ENGINEIDS_OF_TYPE(e, type) {
-			if (HASBIT(GetEngine(e)->player_avail, _local_player)) return true;
+			if (HasBit(GetEngine(e)->player_avail, _local_player)) return true;
 		}
 		return false;
 	}
@@ -2556,7 +2569,7 @@
 								scheme = LS_FREIGHT_WAGON;
 							}
 						} else {
-							bool is_mu = HASBIT(EngInfo(engine_type)->misc_flags, EF_RAIL_IS_MU);
+							bool is_mu = HasBit(EngInfo(engine_type)->misc_flags, EF_RAIL_IS_MU);
 
 							switch (rvi->engclass) {
 								default: NOT_REACHED();
@@ -2577,7 +2590,7 @@
 			case VEH_ROAD: {
 				const RoadVehicleInfo *rvi = RoadVehInfo(engine_type);
 				if (cargo_type == CT_INVALID) cargo_type = rvi->cargo_type;
-				if (HASBIT(EngInfo(engine_type)->misc_flags, EF_ROAD_TRAM)) {
+				if (HasBit(EngInfo(engine_type)->misc_flags, EF_ROAD_TRAM)) {
 					/* Tram */
 					scheme = IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_PASSENGER_TRAM : LS_FREIGHT_TRAM;
 				} else {
@@ -2616,10 +2629,13 @@
 
 static SpriteID GetEngineColourMap(EngineID engine_type, PlayerID player, EngineID parent_engine_type, const Vehicle *v)
 {
-	SpriteID map = PAL_NONE;
+	SpriteID map = (v != NULL) ? v->colormap : PAL_NONE;
+
+	/* Return cached value if any */
+	if (map != PAL_NONE) return map;
 
 	/* Check if we should use the colour map callback */
-	if (HASBIT(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_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... */
@@ -2627,11 +2643,15 @@
 			map = GB(callback, 0, 14);
 			/* If bit 14 is set, then the company colours are applied to the
 			 * map else it's returned as-is. */
-			if (!HASBIT(callback, 14)) return map;
+			if (!HasBit(callback, 14)) {
+				/* Update cache */
+				if (v != NULL) ((Vehicle*)v)->colormap = map;
+				return map;
+			}
 		}
 	}
 
-	bool twocc = HASBIT(EngInfo(engine_type)->misc_flags, EF_USES_2CC);
+	bool twocc = HasBit(EngInfo(engine_type)->misc_flags, EF_USES_2CC);
 
 	if (map == PAL_NONE) map = twocc ? (SpriteID)SPR_2CCMAP_BASE : (SpriteID)PALETTE_RECOLOR_START;
 
@@ -2640,6 +2660,8 @@
 	map += livery->colour1;
 	if (twocc) map += livery->colour2 * 16;
 
+	/* Update cache */
+	if (v != NULL) ((Vehicle*)v)->colormap = map;
 	return map;
 }
 
@@ -3092,7 +3114,7 @@
 			uint wait_time = max(this->current_order.wait_time - this->lateness_counter, 0);
 
 			/* Not the first call for this tick, or still loading */
-			if (mode || !HASBIT(this->vehicle_flags, VF_LOADING_FINISHED) ||
+			if (mode || !HasBit(this->vehicle_flags, VF_LOADING_FINISHED) ||
 					(_patches.timetabling && this->current_order_time < wait_time)) return;
 
 			this->PlayLeaveStationSound();
--- a/src/vehicle.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/vehicle.h	Mon Dec 03 23:39:38 2007 +0000
@@ -137,6 +137,7 @@
 	 * bit     7 = disable powered wagons.
 	 */
 	byte cached_vis_effect;
+	byte user_def_data;
 
 	/* NOSAVE: for wagon override - id of the first engine in train
 	 * 0xffff == not in train */
@@ -342,6 +343,8 @@
 	uint32 current_order_time;     ///< How many ticks have passed since this order started.
 	int32 lateness_counter;        ///< How many ticks late (or early if negative) this vehicle is.
 
+	SpriteID colormap; // NOSAVE: cached color mapping
+
 	union {
 		VehicleRail rail;
 		VehicleAir air;
@@ -590,6 +593,8 @@
 void InitializeTrains();
 byte VehicleRandomBits();
 void ResetVehiclePosHash();
+void ResetVehicleColorMap();
+void CheckVehicle32Day(Vehicle *v);
 
 bool CanRefitTo(EngineID engine_type, CargoID cid_to);
 CargoID FindFirstRefittableCargo(EngineID engine_type);
--- a/src/vehicle_gui.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/vehicle_gui.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -205,10 +205,10 @@
 		/* Loop through all cargos in the refit mask */
 		for (CargoID cid = 0; cid < NUM_CARGO && num_lines < max_lines; cid++) {
 			/* Skip cargo type if it's not listed */
-			if (!HASBIT(cmask, cid)) continue;
+			if (!HasBit(cmask, cid)) continue;
 
 			/* Check the vehicle's callback mask for cargo suffixes */
-			if (HASBIT(callbackmask, CBM_VEHICLE_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;
@@ -288,10 +288,10 @@
 
 	/* Draw the list, and find the selected cargo (by its position in list) */
 	for (i = 0; i < num_lines; i++) {
-		byte colour = 16;
+		TextColour colour = TC_BLACK;
 		if (sel == 0) {
 			selected = &refit[i];
-			colour = 12;
+			colour = TC_WHITE;
 		}
 
 		if (i >= pos && i < pos + rows) {
@@ -346,7 +346,7 @@
 					SetDParam(0, WP(w, refit_d).cargo->cargo);
 					SetDParam(1, _returned_refit_capacity);
 					SetDParam(2, cost.GetCost());
-					DrawString(2, w->widget[5].top + 1, STR_9840_NEW_CAPACITY_COST_OF_REFIT, 0);
+					DrawString(2, w->widget[5].top + 1, STR_9840_NEW_CAPACITY_COST_OF_REFIT, TC_FROMSTRING);
 				}
 			}
 		} break;
@@ -485,7 +485,7 @@
 	char *b = _userstring;
 
 	/* Draw nothing if the engine is not refittable */
-	if (COUNTBITS(cmask) <= 1) return 0;
+	if (CountBits(cmask) <= 1) return 0;
 
 	b = InlineString(b, STR_PURCHASE_INFO_REFITTABLE_TO);
 
@@ -495,7 +495,7 @@
 	} else {
 		/* Check if we are able to refit to more cargo types and unable to. If
 		 * so, invert the cargo types to list those that we can't refit to. */
-		if (COUNTBITS(cmask ^ lmask) < COUNTBITS(cmask)) {
+		if (CountBits(cmask ^ lmask) < CountBits(cmask)) {
 			cmask ^= lmask;
 			b = InlineString(b, STR_PURCHASE_INFO_ALL_BUT);
 		}
@@ -504,7 +504,7 @@
 
 		/* Add each cargo type to the list */
 		for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
-			if (!HASBIT(cmask, cid)) continue;
+			if (!HasBit(cmask, cid)) continue;
 
 			if (!first) b = strecpy(b, ", ", lastof(_userstring));
 			first = false;
@@ -789,10 +789,10 @@
 	/* Hide the widgets that we will not use in this window
 	 * Some windows contains actions only fit for the owner */
 	if (player == _local_player) {
-		HideWindowWidget(w, VLW_WIDGET_OTHER_PLAYER_FILLER);
-		SetWindowWidgetDisabledState(w, VLW_WIDGET_AVAILABLE_VEHICLES, window_type != VLW_STANDARD);
+		w->HideWidget(VLW_WIDGET_OTHER_PLAYER_FILLER);
+		w->SetWidgetDisabledState(VLW_WIDGET_AVAILABLE_VEHICLES, window_type != VLW_STANDARD);
 	} else {
-		SetWindowWidgetsHiddenState(w, true,
+		w->SetWidgetsHiddenState(true,
 			VLW_WIDGET_AVAILABLE_VEHICLES,
 			VLW_WIDGET_MANAGE_VEHICLES,
 			VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
@@ -906,14 +906,14 @@
 	sel = v->cur_order_index;
 
 	FOR_VEHICLE_ORDERS(v, order) {
-		if (sel == 0) DrawString(x - 6, y, STR_SMALL_RIGHT_ARROW, 16);
+		if (sel == 0) DrawString(x - 6, y, STR_SMALL_RIGHT_ARROW, TC_BLACK);
 		sel--;
 
 		if (order->type == OT_GOTO_STATION) {
 			if (v->type == VEH_SHIP && GetStation(order->dest)->IsBuoy()) continue;
 
 			SetDParam(0, order->dest);
-			DrawString(x, y, STR_A036, 0);
+			DrawString(x, y, STR_A036, TC_FROMSTRING);
 
 			y += 6;
 			if (++i == 4) break;
@@ -976,7 +976,7 @@
 		default: NOT_REACHED(); break;
 	}
 
-	SetWindowWidgetsDisabledState(w, vl->l.list_length == 0,
+	w->SetWidgetsDisabledState(vl->l.list_length == 0,
 		VLW_WIDGET_MANAGE_VEHICLES,
 		VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
 		VLW_WIDGET_STOP_ALL,
@@ -986,9 +986,9 @@
 	DrawWindowWidgets(w);
 
 	/* draw sorting criteria string */
-	DrawString(85, 15, _vehicle_sort_listing[vl->l.sort_type], 0x10);
+	DrawString(85, 15, _vehicle_sort_listing[vl->l.sort_type], TC_BLACK);
 	/* draw arrow pointing up/down for ascending/descending sorting */
-	DoDrawString(vl->l.flags & VL_DESC ? DOWNARROW : UPARROW, 69, 15, 0x10);
+	DoDrawString(vl->l.flags & VL_DESC ? DOWNARROW : UPARROW, 69, 15, TC_BLACK);
 
 	max = min(w->vscroll.pos + w->vscroll.cap, vl->l.list_length);
 	for (i = w->vscroll.pos; i < max; ++i) {
@@ -999,7 +999,7 @@
 		SetDParam(1, v->profit_last_year);
 
 		DrawVehicleImage(v, x + 19, y + 6, w->widget[VLW_WIDGET_LIST].right - w->widget[VLW_WIDGET_LIST].left - 20, 0, INVALID_VEHICLE);
-		DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
+		DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, TC_FROMSTRING);
 
 		if ((v->type == VEH_TRAIN    && v->string_id != STR_SV_TRAIN_NAME)   ||
 			(v->type == VEH_ROAD     && v->string_id != STR_SV_ROADVEH_NAME) ||
@@ -1008,7 +1008,7 @@
 
 			/* The vehicle got a name so we will print it */
 			SetDParam(0, v->index);
-			DrawString(x + 19, y, STR_01AB, 0);
+			DrawString(x + 19, y, STR_01AB, TC_FROMSTRING);
 		}
 
 		if (w->resize.step_height == PLY_WND_PRC__SIZE_OF_ROW_BIG) DrawSmallOrderList(v, x + 138, y);
@@ -1020,7 +1020,7 @@
 		}
 
 		SetDParam(0, v->unitnumber);
-		DrawString(x, y + 2, str, 0);
+		DrawString(x, y + 2, str, TC_FROMSTRING);
 
 		DrawVehicleProfitButton(v, x, y + 13);
 
@@ -1415,15 +1415,16 @@
 }
 
 /** Checks whether service interval is enabled for the vehicle. */
-static bool inline IsVehicleServiceIntervalEnabled(const VehicleType vehicle_type)
+static inline bool IsVehicleServiceIntervalEnabled(const VehicleType vehicle_type)
 {
 	switch (vehicle_type) {
+		default: NOT_REACHED();
 		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();
 	}
+	return false; // kill a compiler warning
 }
 
 extern int GetTrainDetailsWndVScroll(VehicleID veh_id, byte det_tab);
@@ -1459,14 +1460,14 @@
 	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);
+	w->SetWidgetDisabledState(VLD_WIDGET_RENAME_VEHICLE, v->owner != _local_player);
 
 	if (v->type == VEH_TRAIN) {
-		DisableWindowWidget(w, det_tab + VLD_WIDGET_DETAILS_CARGO_CARRIED);
+		w->DisableWidget(det_tab + VLD_WIDGET_DETAILS_CARGO_CARRIED);
 		SetVScrollCount(w, GetTrainDetailsWndVScroll(v->index, det_tab));
 	}
 
-	SetWindowWidgetsHiddenState(w, v->type != VEH_TRAIN,
+	w->SetWidgetsHiddenState(v->type != VEH_TRAIN,
 		VLD_WIDGET_SCROLLBAR,
 		VLD_WIDGET_DETAILS_CARGO_CARRIED,
 		VLD_WIDGET_DETAILS_TRAIN_VEHICLES,
@@ -1476,7 +1477,7 @@
 		WIDGET_LIST_END);
 
 	/* Disable service-scroller when interval is set to disabled */
-	SetWindowWidgetsDisabledState(w, !IsVehicleServiceIntervalEnabled(v->type),
+	w->SetWidgetsDisabledState(!IsVehicleServiceIntervalEnabled(v->type),
 		VLD_WIDGET_INCREASE_SERVICING_INTERVAL,
 		VLD_WIDGET_DECREASE_SERVICING_INTERVAL,
 		WIDGET_LIST_END);
@@ -1490,7 +1491,7 @@
 	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);
+	DrawString(2, 15, _vehicle_translation_table[VST_VEHICLE_AGE_RUNNING_COST_YR][v->type], TC_FROMSTRING);
 
 	/* Draw max speed */
 	switch (v->type) {
@@ -1501,14 +1502,14 @@
 			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);
+				STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED, TC_FROMSTRING);
 			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);
+			DrawString(2, 25, _vehicle_translation_table[VST_VEHICLE_MAX_SPEED][v->type], TC_FROMSTRING);
 			break;
 
 		default: NOT_REACHED();
@@ -1517,17 +1518,17 @@
 	/* 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);
+	DrawString(2, 35, _vehicle_translation_table[VST_VEHICLE_PROFIT_THIS_YEAR_LAST_YEAR][v->type], TC_FROMSTRING);
 
 	/* 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);
+	DrawString(2, 45, _vehicle_translation_table[VST_VEHICLE_RELIABILITY_BREAKDOWNS][v->type], TC_FROMSTRING);
 
 	/* 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);
+	DrawString(13, w->height - (v->type != VEH_TRAIN ? 11 : 23), _patches.servint_ispercent ? STR_SERVICING_INTERVAL_PERCENT : STR_883C_SERVICING_INTERVAL_DAYS, TC_FROMSTRING);
 
 	switch (v->type) {
 		case VEH_TRAIN:
@@ -1597,7 +1598,7 @@
 				case VLD_WIDGET_DETAILS_TRAIN_VEHICLES:
 				case VLD_WIDGET_DETAILS_CAPACITY_OF_EACH:
 				case VLD_WIDGET_DETAILS_TOTAL_CARGO:
-					SetWindowWidgetsDisabledState(w, false,
+					w->SetWidgetsDisabledState(false,
 						VLD_WIDGET_DETAILS_CARGO_CARRIED,
 						VLD_WIDGET_DETAILS_TRAIN_VEHICLES,
 						VLD_WIDGET_DETAILS_CAPACITY_OF_EACH,
@@ -1825,7 +1826,7 @@
 			w->widget[VVW_WIDGET_CLONE_VEH].data = SPR_CLONE_ROADVEH;
 			w->widget[VVW_WIDGET_CLONE_VEH].tooltips = STR_CLONE_ROAD_VEHICLE_INFO;
 
-			SetWindowWidgetHiddenState(w, VVW_WIDGET_FORCE_PROCEED, true);
+			w->SetWidgetHiddenState(VVW_WIDGET_FORCE_PROCEED, true);
 			break;
 
 		case VEH_SHIP:
@@ -1847,7 +1848,7 @@
 			w->widget[VVW_WIDGET_CLONE_VEH].data = SPR_CLONE_SHIP;
 			w->widget[VVW_WIDGET_CLONE_VEH].tooltips = STR_CLONE_SHIP_INFO;
 
-			SetWindowWidgetsHiddenState(w, true,
+			w->SetWidgetsHiddenState(true,
 																	VVW_WIDGET_TURN_AROUND,
 																	VVW_WIDGET_FORCE_PROCEED,
 																	WIDGET_LIST_END);
@@ -1872,7 +1873,7 @@
 			w->widget[VVW_WIDGET_CLONE_VEH].data = SPR_CLONE_AIRCRAFT;
 			w->widget[VVW_WIDGET_CLONE_VEH].tooltips = STR_CLONE_AIRCRAFT_INFO;
 
-			SetWindowWidgetsHiddenState(w, true,
+			w->SetWidgetsHiddenState(true,
 																	VVW_WIDGET_TURN_AROUND,
 																	VVW_WIDGET_FORCE_PROCEED,
 																	WIDGET_LIST_END);
@@ -1921,14 +1922,14 @@
 	bool is_localplayer = v->owner == _local_player;
 	bool refitable_and_stopped_in_depot = IsVehicleRefitable(v);
 
-	SetWindowWidgetDisabledState(w, VVW_WIDGET_GOTO_DEPOT, !is_localplayer);
-	SetWindowWidgetDisabledState(w, VVW_WIDGET_REFIT_VEH,
+	w->SetWidgetDisabledState(VVW_WIDGET_GOTO_DEPOT, !is_localplayer);
+	w->SetWidgetDisabledState(VVW_WIDGET_REFIT_VEH,
 															 !refitable_and_stopped_in_depot || !is_localplayer);
-	SetWindowWidgetDisabledState(w, VVW_WIDGET_CLONE_VEH, !is_localplayer);
+	w->SetWidgetDisabledState(VVW_WIDGET_CLONE_VEH, !is_localplayer);
 
 	if (v->type == VEH_TRAIN) {
-		SetWindowWidgetDisabledState(w, VVW_WIDGET_FORCE_PROCEED, !is_localplayer);
-		SetWindowWidgetDisabledState(w, VVW_WIDGET_TURN_AROUND, !is_localplayer);
+		w->SetWidgetDisabledState(VVW_WIDGET_FORCE_PROCEED, !is_localplayer);
+		w->SetWidgetDisabledState(VVW_WIDGET_TURN_AROUND, !is_localplayer);
 
 		/* Cargo refit button is disabled, until we know we can enable it below. */
 
@@ -1937,7 +1938,7 @@
 			for (const Vehicle *u = v; u != NULL; u = u->Next()) {
 				if (EngInfo(u->engine_type)->refit_mask != 0 ||
 						(RailVehInfo(v->engine_type)->railveh_type != RAILVEH_WAGON && v->cargo_cap != 0)) {
-					EnableWindowWidget(w, VVW_WIDGET_REFIT_VEH);
+					w->EnableWidget(VVW_WIDGET_REFIT_VEH);
 					/* We have a refittable carriage, bail out */
 					break;
 				}
@@ -1986,7 +1987,7 @@
 					SetDParam(0, depot->town_index);
 					SetDParam(1, v->GetDisplaySpeed());
 				}
-				if (HASBIT(v->current_order.flags, OFB_HALT_IN_DEPOT) && !HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS)) {
+				if (HasBit(v->current_order.flags, OFB_HALT_IN_DEPOT) && !HasBit(v->current_order.flags, OFB_PART_OF_ORDERS)) {
 					str = _heading_for_depot_strings[v->type] + _patches.vehicle_speed;
 				} else {
 					str = _heading_for_depot_service_strings[v->type] + _patches.vehicle_speed;
@@ -2025,7 +2026,7 @@
 
 	/* draw the flag plus orders */
 	DrawSprite(v->vehstatus & VS_STOPPED ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, 2, w->widget[VVW_WIDGET_START_STOP_VEH].top + 1);
-	DrawStringCenteredTruncated(w->widget[VVW_WIDGET_START_STOP_VEH].left + 8, w->widget[VVW_WIDGET_START_STOP_VEH].right, w->widget[VVW_WIDGET_START_STOP_VEH].top + 1, str, 0);
+	DrawStringCenteredTruncated(w->widget[VVW_WIDGET_START_STOP_VEH].left + 8, w->widget[VVW_WIDGET_START_STOP_VEH].right, w->widget[VVW_WIDGET_START_STOP_VEH].top + 1, str, TC_FROMSTRING);
 	DrawWindowViewport(w);
 }
 
@@ -2086,9 +2087,16 @@
 					DoCommandP(v->tile, v->index, 0, NULL,
 										 _vehicle_command_translation_table[VCT_CMD_START_STOP][v->type]);
 					break;
-				case VVW_WIDGET_CENTER_MAIN_VIEH: /* center main view */
-					ScrollMainWindowTo(v->x_pos, v->y_pos);
-					break;
+				case VVW_WIDGET_CENTER_MAIN_VIEH: {/* center main view */
+					const Window *mainwindow = FindWindowById(WC_MAIN_WINDOW, 0);
+					/* code to allow the main window to 'follow' the vehicle if the ctrl key is pressed */
+					if (_ctrl_pressed && mainwindow->viewport->zoom == ZOOM_LVL_NORMAL) {
+						WP(mainwindow, vp_d).follow_vehicle = v->index;
+					} else {
+						ScrollMainWindowTo(v->x_pos, v->y_pos);
+					}
+				} break;
+
 				case VVW_WIDGET_GOTO_DEPOT: /* goto hangar */
 					DoCommandP(v->tile, v->index, _ctrl_pressed ? DEPOT_SERVICE : 0, NULL,
 						_vehicle_command_translation_table[VCT_CMD_GOTO_DEPOT][v->type]);
@@ -2142,12 +2150,12 @@
 			 * allowed only while in depot and stopped.
 			 * This sytem allows to have two buttons, on top of each other.
 			 * The same system applies to widget VVW_WIDGET_REFIT_VEH and VVW_WIDGET_TURN_AROUND.*/
-			if (veh_stopped != IsWindowWidgetHidden(w, VVW_WIDGET_GOTO_DEPOT) || veh_stopped == IsWindowWidgetHidden(w, VVW_WIDGET_CLONE_VEH)) {
-				SetWindowWidgetHiddenState(w,  VVW_WIDGET_GOTO_DEPOT, veh_stopped);  // send to depot
-				SetWindowWidgetHiddenState(w, VVW_WIDGET_CLONE_VEH, !veh_stopped); // clone
+			if (veh_stopped != w->IsWidgetHidden(VVW_WIDGET_GOTO_DEPOT) || veh_stopped == w->IsWidgetHidden(VVW_WIDGET_CLONE_VEH)) {
+				w->SetWidgetHiddenState( VVW_WIDGET_GOTO_DEPOT, veh_stopped);  // send to depot
+				w->SetWidgetHiddenState(VVW_WIDGET_CLONE_VEH, !veh_stopped); // clone
 				if (v->type == VEH_ROAD || v->type == VEH_TRAIN) {
-					SetWindowWidgetHiddenState(w,  VVW_WIDGET_REFIT_VEH, !veh_stopped); // refit
-					SetWindowWidgetHiddenState(w, VVW_WIDGET_TURN_AROUND, veh_stopped);  // force turn around
+					w->SetWidgetHiddenState( VVW_WIDGET_REFIT_VEH, !veh_stopped); // refit
+					w->SetWidgetHiddenState(VVW_WIDGET_TURN_AROUND, veh_stopped);  // force turn around
 				}
 				SetWindowDirty(w);
 			}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cocoa/cocoa_keys.h	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,127 @@
+/* $Id$ */
+
+#ifndef COCOA_KEYS_H
+#define COCOA_KEYS_H
+
+/* From SDL_QuartzKeys.h */
+/* These are the Macintosh key scancode constants -- from Inside Macintosh */
+
+#define QZ_ESCAPE       0x35
+#define QZ_F1           0x7A
+#define QZ_F2           0x78
+#define QZ_F3           0x63
+#define QZ_F4           0x76
+#define QZ_F5           0x60
+#define QZ_F6           0x61
+#define QZ_F7           0x62
+#define QZ_F8           0x64
+#define QZ_F9           0x65
+#define QZ_F10          0x6D
+#define QZ_F11          0x67
+#define QZ_F12          0x6F
+#define QZ_PRINT        0x69
+#define QZ_SCROLLOCK    0x6B
+#define QZ_PAUSE        0x71
+#define QZ_POWER        0x7F
+#define QZ_BACKQUOTE    0x0A
+#define QZ_BACKQUOTE2   0x32
+#define QZ_1            0x12
+#define QZ_2            0x13
+#define QZ_3            0x14
+#define QZ_4            0x15
+#define QZ_5            0x17
+#define QZ_6            0x16
+#define QZ_7            0x1A
+#define QZ_8            0x1C
+#define QZ_9            0x19
+#define QZ_0            0x1D
+#define QZ_MINUS        0x1B
+#define QZ_EQUALS       0x18
+#define QZ_BACKSPACE    0x33
+#define QZ_INSERT       0x72
+#define QZ_HOME         0x73
+#define QZ_PAGEUP       0x74
+#define QZ_NUMLOCK      0x47
+#define QZ_KP_EQUALS    0x51
+#define QZ_KP_DIVIDE    0x4B
+#define QZ_KP_MULTIPLY  0x43
+#define QZ_TAB          0x30
+#define QZ_q            0x0C
+#define QZ_w            0x0D
+#define QZ_e            0x0E
+#define QZ_r            0x0F
+#define QZ_t            0x11
+#define QZ_y            0x10
+#define QZ_u            0x20
+#define QZ_i            0x22
+#define QZ_o            0x1F
+#define QZ_p            0x23
+#define QZ_LEFTBRACKET  0x21
+#define QZ_RIGHTBRACKET 0x1E
+#define QZ_BACKSLASH    0x2A
+#define QZ_DELETE       0x75
+#define QZ_END          0x77
+#define QZ_PAGEDOWN     0x79
+#define QZ_KP7          0x59
+#define QZ_KP8          0x5B
+#define QZ_KP9          0x5C
+#define QZ_KP_MINUS     0x4E
+#define QZ_CAPSLOCK     0x39
+#define QZ_a            0x00
+#define QZ_s            0x01
+#define QZ_d            0x02
+#define QZ_f            0x03
+#define QZ_g            0x05
+#define QZ_h            0x04
+#define QZ_j            0x26
+#define QZ_k            0x28
+#define QZ_l            0x25
+#define QZ_SEMICOLON    0x29
+#define QZ_QUOTE        0x27
+#define QZ_RETURN       0x24
+#define QZ_KP4          0x56
+#define QZ_KP5          0x57
+#define QZ_KP6          0x58
+#define QZ_KP_PLUS      0x45
+#define QZ_LSHIFT       0x38
+#define QZ_z            0x06
+#define QZ_x            0x07
+#define QZ_c            0x08
+#define QZ_v            0x09
+#define QZ_b            0x0B
+#define QZ_n            0x2D
+#define QZ_m            0x2E
+#define QZ_COMMA        0x2B
+#define QZ_PERIOD       0x2F
+#define QZ_SLASH        0x2C
+#if 1        /* Panther now defines right side keys */
+#define QZ_RSHIFT       0x3C
+#endif
+#define QZ_UP           0x7E
+#define QZ_KP1          0x53
+#define QZ_KP2          0x54
+#define QZ_KP3          0x55
+#define QZ_KP_ENTER     0x4C
+#define QZ_LCTRL        0x3B
+#define QZ_LALT         0x3A
+#define QZ_LMETA        0x37
+#define QZ_SPACE        0x31
+#if 1        /* Panther now defines right side keys */
+#define QZ_RMETA        0x36
+#define QZ_RALT         0x3D
+#define QZ_RCTRL        0x3E
+#endif
+#define QZ_LEFT         0x7B
+#define QZ_DOWN         0x7D
+#define QZ_RIGHT        0x7C
+#define QZ_KP0          0x52
+#define QZ_KP_PERIOD    0x41
+
+/* Wierd, these keys are on my iBook under MacOS X */
+#define QZ_IBOOK_ENTER  0x34
+#define QZ_IBOOK_LEFT   0x3B
+#define QZ_IBOOK_RIGHT  0x3C
+#define QZ_IBOOK_DOWN   0x3D
+#define QZ_IBOOK_UP     0x3E
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cocoa/cocoa_v.h	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,77 @@
+/* $Id$ */
+
+#ifndef VIDEO_COCOA_H
+#define VIDEO_COCOA_H
+
+#include <AvailabilityMacros.h>
+
+#include "../video_driver.hpp"
+
+class VideoDriver_Cocoa: public VideoDriver {
+public:
+	/* virtual */ const char *Start(const char * const *param);
+
+	/* virtual */ void Stop();
+
+	/* virtual */ void MakeDirty(int left, int top, int width, int height);
+
+	/* virtual */ void MainLoop();
+
+	/* virtual */ bool ChangeResolution(int w, int h);
+
+	/* virtual */ void ToggleFullscreen(bool fullscreen);
+};
+
+class FVideoDriver_Cocoa: public VideoDriverFactory<FVideoDriver_Cocoa> {
+public:
+	static const int priority = 10;
+	/* virtual */ const char *GetName() { return "cocoa"; }
+	/* virtual */ const char *GetDescription() { return "Cocoa Video Driver"; }
+	/* virtual */ Driver *CreateInstance() { return new VideoDriver_Cocoa(); }
+};
+
+
+
+class CocoaSubdriver {
+public:
+	virtual ~CocoaSubdriver() {}
+
+	virtual void Draw() = 0;
+	virtual void MakeDirty(int left, int top, int width, int height) = 0;
+	virtual void UpdatePalette(uint first_color, uint num_colors) = 0;
+
+	virtual uint ListModes(OTTDPoint* modes, uint max_modes) = 0;
+
+	virtual bool ChangeResolution(int w, int h) = 0;
+
+	virtual bool IsFullscreen() = 0;
+	virtual int GetWidth() = 0;
+	virtual int GetHeight() = 0;
+	virtual void *GetPixelBuffer() = 0;
+
+	/* Convert local coordinate to window server (CoreGraphics) coordinate */
+	virtual CGPoint PrivateLocalToCG(NSPoint* p) = 0;
+
+	virtual NSPoint GetMouseLocation(NSEvent *event) = 0;
+	virtual bool MouseIsInsideView(NSPoint *pt) = 0;
+
+	virtual bool IsActive() = 0;
+};
+
+extern CocoaSubdriver* _cocoa_subdriver;
+
+CocoaSubdriver *QZ_CreateFullscreenSubdriver(int width, int height, int bpp);
+CocoaSubdriver *QZ_CreateWindowQuickdrawSubdriver(int width, int height, int bpp);
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+CocoaSubdriver *QZ_CreateWindowQuartzSubdriver(int width, int height, int bpp);
+#endif
+
+void QZ_GameSizeChanged();
+
+void QZ_GameLoop();
+
+void QZ_ShowMouse();
+void QZ_HideMouse();
+
+#endif /* VIDEO_COCOA_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cocoa/cocoa_v.mm	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,426 @@
+/* $Id$ */
+
+/******************************************************************************
+ *                             Cocoa video driver                             *
+ * Known things left to do:                                                   *
+ *  Nothing at the moment.                                                    *
+ ******************************************************************************/
+
+#ifdef WITH_COCOA
+
+#define MAC_OS_X_VERSION_MIN_REQUIRED    MAC_OS_X_VERSION_10_3
+#include <AvailabilityMacros.h>
+
+#import <Cocoa/Cocoa.h>
+#import <sys/time.h> /* gettimeofday */
+#import <sys/param.h> /* for MAXPATHLEN */
+#import <unistd.h>
+
+/**
+ * Important notice regarding all modifications!!!!!!!
+ * There are certain limitations because the file is objective C++.
+ * gdb has limitations.
+ * C++ and objective C code can't be joined in all cases (classes stuff).
+ * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information.
+ */
+
+
+/* Portions of CPS.h */
+struct CPSProcessSerNum {
+	UInt32 lo;
+	UInt32 hi;
+};
+
+extern "C" OSErr CPSGetCurrentProcess(CPSProcessSerNum* psn);
+extern "C" OSErr CPSEnableForegroundOperation(CPSProcessSerNum* psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5);
+extern "C" OSErr CPSSetFrontProcess(CPSProcessSerNum* psn);
+
+/* Disables a warning. This is needed since the method exists but has been dropped from the header, supposedly as of 10.4. */
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
+@interface NSApplication(NSAppleMenu)
+- (void)setAppleMenu:(NSMenu *)menu;
+@end
+#endif
+
+
+/* Defined in stdbool.h */
+#ifndef __cplusplus
+# ifndef __BEOS__
+#  undef bool
+#  undef false
+#  undef true
+# endif
+#endif
+
+
+#include "../../stdafx.h"
+#include "../../openttd.h"
+#include "../../debug.h"
+#include "../../variables.h"
+#include "cocoa_v.h"
+#include "../../blitter/factory.hpp"
+#include "../../fileio.h"
+
+#undef Point
+#undef Rect
+
+
+@interface OTTDMain : NSObject
+@end
+
+
+static NSAutoreleasePool *_ottd_autorelease_pool;
+static OTTDMain *_ottd_main;
+static bool _cocoa_video_started = false;
+static bool _cocoa_video_dialog = false;
+
+CocoaSubdriver* _cocoa_subdriver = NULL;
+
+
+
+/* The main class of the application, the application's delegate */
+@implementation OTTDMain
+/* Called when the internal event loop has just started running */
+- (void) applicationDidFinishLaunching: (NSNotification*) note
+{
+	/* Hand off to main application code */
+	QZ_GameLoop();
+
+	/* We're done, thank you for playing */
+	[ NSApp stop:_ottd_main ];
+}
+
+/* Display the in game quit confirmation dialog */
+- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*) sender
+{
+
+	HandleExitGameRequest();
+
+	return NSTerminateCancel; // NSTerminateLater ?
+}
+@end
+
+static void setApplicationMenu()
+{
+	/* warning: this code is very odd */
+	NSMenu *appleMenu;
+	NSMenuItem *menuItem;
+	NSString *title;
+	NSString *appName;
+
+	appName = @"OTTD";
+	appleMenu = [[NSMenu alloc] initWithTitle:appName];
+
+	/* Add menu items */
+	title = [@"About " stringByAppendingString:appName];
+	[appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
+
+	[appleMenu addItem:[NSMenuItem separatorItem]];
+
+	title = [@"Hide " stringByAppendingString:appName];
+	[appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"];
+
+	menuItem = (NSMenuItem*)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
+	[menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
+
+	[appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
+
+	[appleMenu addItem:[NSMenuItem separatorItem]];
+
+	title = [@"Quit " stringByAppendingString:appName];
+	[appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
+
+
+	/* Put menu into the menubar */
+	menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
+	[menuItem setSubmenu:appleMenu];
+	[[NSApp mainMenu] addItem:menuItem];
+
+	/* Tell the application object that this is now the application menu */
+	[NSApp setAppleMenu:appleMenu];
+
+	/* Finally give up our references to the objects */
+	[appleMenu release];
+	[menuItem release];
+}
+
+/* Create a window menu */
+static void setupWindowMenu()
+{
+	NSMenu* windowMenu;
+	NSMenuItem* windowMenuItem;
+	NSMenuItem* menuItem;
+
+	windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
+
+	/* "Minimize" item */
+	menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"];
+	[windowMenu addItem:menuItem];
+	[menuItem release];
+
+	/* Put menu into the menubar */
+	windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""];
+	[windowMenuItem setSubmenu:windowMenu];
+	[[NSApp mainMenu] addItem:windowMenuItem];
+
+	/* Tell the application object that this is now the window menu */
+	[NSApp setWindowsMenu:windowMenu];
+
+	/* Finally give up our references to the objects */
+	[windowMenu release];
+	[windowMenuItem release];
+}
+
+static void setupApplication()
+{
+	CPSProcessSerNum PSN;
+
+	/* Ensure the application object is initialised */
+	[NSApplication sharedApplication];
+
+	/* Tell the dock about us */
+	if (!CPSGetCurrentProcess(&PSN) &&
+			!CPSEnableForegroundOperation(&PSN, 0x03, 0x3C, 0x2C, 0x1103) &&
+			!CPSSetFrontProcess(&PSN)) {
+		[NSApplication sharedApplication];
+	}
+
+	/* Set up the menubar */
+	[NSApp setMainMenu:[[NSMenu alloc] init]];
+	setApplicationMenu();
+	setupWindowMenu();
+
+	/* Create OTTDMain and make it the app delegate */
+	_ottd_main = [[OTTDMain alloc] init];
+	[NSApp setDelegate:_ottd_main];
+}
+
+
+static void QZ_UpdateVideoModes()
+{
+	uint i, count;
+	OTTDPoint modes[32];
+
+	assert(_cocoa_subdriver != NULL);
+
+	count = _cocoa_subdriver->ListModes(modes, lengthof(modes));
+
+	for (i = 0; i < count; i++) {
+		_resolutions[i][0] = modes[i].x;
+		_resolutions[i][1] = modes[i].y;
+	}
+
+	_num_resolutions = count;
+}
+
+
+void QZ_GameSizeChanged()
+{
+	if (_cocoa_subdriver == NULL) return;
+
+	/* Tell the game that the resolution has changed */
+	_screen.width = _cocoa_subdriver->GetWidth();
+	_screen.height = _cocoa_subdriver->GetHeight();
+	_screen.pitch = _cocoa_subdriver->GetWidth();
+	_fullscreen = _cocoa_subdriver->IsFullscreen();
+
+	GameSizeChanged();
+}
+
+
+static CocoaSubdriver *QZ_CreateWindowSubdriver(int width, int height, int bpp)
+{
+	CocoaSubdriver *ret;
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+	if (MacOSVersionIsAtLeast(10, 4, 0)) {
+		ret = QZ_CreateWindowQuartzSubdriver(width, height, bpp);
+		if (ret != NULL) return ret;
+	}
+#endif
+
+	ret = QZ_CreateWindowQuickdrawSubdriver(width, height, bpp);
+	if (ret != NULL) return ret;
+
+	return NULL;
+}
+
+
+static CocoaSubdriver *QZ_CreateSubdriver(int width, int height, int bpp, bool fullscreen, bool fallback)
+{
+	CocoaSubdriver *ret;
+
+	ret = fullscreen ? QZ_CreateFullscreenSubdriver(width, height, bpp) : QZ_CreateWindowSubdriver(width, height, bpp);
+	if (ret != NULL) return ret;
+
+	if (!fallback) return NULL;
+
+	/* Try again in 640x480 windowed */
+	DEBUG(driver, 0, "Setting video mode failed, falling back to 640x480 windowed mode.");
+	ret = QZ_CreateWindowSubdriver(640, 480, bpp);
+	if (ret != NULL) return ret;
+
+#ifdef _DEBUG
+	/* Try fullscreen too when in debug mode */
+	DEBUG(driver, 0, "Setting video mode failed, falling back to 640x480 fullscreen mode.");
+	ret = QZ_CreateFullscreenSubdriver(640, 480, bpp);
+	if (ret != NULL) return ret;
+#endif
+
+	return NULL;
+}
+
+
+static FVideoDriver_Cocoa iFVideoDriver_Cocoa;
+
+void VideoDriver_Cocoa::Stop()
+{
+	if (!_cocoa_video_started) return;
+
+	delete _cocoa_subdriver;
+	_cocoa_subdriver = NULL;
+
+	[_ottd_main release];
+
+	_cocoa_video_started = false;
+}
+
+const char *VideoDriver_Cocoa::Start(const char * const *parm)
+{
+	int width, height, bpp;
+
+	if (!MacOSVersionIsAtLeast(10, 3, 0)) return "The Cocoa video driver requires Mac OS X 10.3 or later.";
+
+	if (_cocoa_video_started) return "Already started";
+	_cocoa_video_started = true;
+
+	setupApplication();
+
+	/* Don't create a window or enter fullscreen if we're just going to show a dialog. */
+	if (_cocoa_video_dialog) return NULL;
+
+	width = _cur_resolution[0];
+	height = _cur_resolution[1];
+	bpp = BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth();
+
+	_cocoa_subdriver = QZ_CreateSubdriver(width, height, bpp, _fullscreen, true);
+	if (_cocoa_subdriver == NULL) {
+		Stop();
+		return "Could not create subdriver";
+	}
+
+	QZ_GameSizeChanged();
+
+	QZ_UpdateVideoModes();
+
+	return NULL;
+}
+
+void VideoDriver_Cocoa::MakeDirty(int left, int top, int width, int height)
+{
+	assert(_cocoa_subdriver != NULL);
+
+	_cocoa_subdriver->MakeDirty(left, top, width, height);
+}
+
+void VideoDriver_Cocoa::MainLoop()
+{
+	/* Start the main event loop */
+	[NSApp run];
+}
+
+bool VideoDriver_Cocoa::ChangeResolution(int w, int h)
+{
+	bool ret;
+
+	assert(_cocoa_subdriver != NULL);
+
+	ret = _cocoa_subdriver->ChangeResolution(w, h);
+
+	QZ_GameSizeChanged();
+
+	QZ_UpdateVideoModes();
+
+	return ret;
+}
+
+void VideoDriver_Cocoa::ToggleFullscreen(bool full_screen)
+{
+	bool oldfs;
+
+	assert(_cocoa_subdriver != NULL);
+
+	oldfs = _cocoa_subdriver->IsFullscreen();
+	if (full_screen != oldfs) {
+		int width  = _cocoa_subdriver->GetWidth();
+		int height = _cocoa_subdriver->GetHeight();
+		int bpp    = BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth();
+
+		delete _cocoa_subdriver;
+		_cocoa_subdriver = NULL;
+
+		_cocoa_subdriver = QZ_CreateSubdriver(width, height, bpp, full_screen, false);
+		if (_cocoa_subdriver == NULL) {
+			_cocoa_subdriver = QZ_CreateSubdriver(width, height, bpp, oldfs, true);
+			if (_cocoa_subdriver == NULL) error("Cocoa: Failed to create subdriver");
+		}
+	}
+
+	QZ_GameSizeChanged();
+
+	QZ_UpdateVideoModes();
+}
+
+
+/* This is needed since sometimes assert is called before the videodriver is initialized */
+void CocoaDialog(const char* title, const char* message, const char* buttonLabel)
+{
+	bool wasstarted;
+
+	_cocoa_video_dialog = true;
+
+	wasstarted = _cocoa_video_started;
+	if (_video_driver == NULL) {
+		setupApplication(); // Setup application before showing dialog
+	} else if (!_cocoa_video_started && _video_driver->Start(NULL) != NULL) {
+		fprintf(stderr, "%s: %s\n", title, message);
+		return;
+	}
+
+	NSRunAlertPanel([NSString stringWithCString: title], [NSString stringWithCString: message], [NSString stringWithCString: buttonLabel], nil, nil);
+
+	if (!wasstarted && _video_driver != NULL) _video_driver->Stop();
+
+	_cocoa_video_dialog = false;
+}
+
+/* This is needed since OS X application bundles do not have a
+ * current directory and the data files are 'somewhere' in the bundle */
+void cocoaSetApplicationBundleDir()
+{
+	char tmp[MAXPATHLEN];
+	CFURLRef url = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
+	if (CFURLGetFileSystemRepresentation(url, true, (unsigned char*)tmp, MAXPATHLEN)) {
+		AppendPathSeparator(tmp, lengthof(tmp));
+		_searchpaths[SP_APPLICATION_BUNDLE_DIR] = strdup(tmp);
+	} else {
+		_searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL;
+	}
+
+	CFRelease(url);
+}
+
+/* These are called from main() to prevent a _NSAutoreleaseNoPool error when
+ * exiting before the cocoa video driver has been loaded
+ */
+void cocoaSetupAutoreleasePool()
+{
+	_ottd_autorelease_pool = [[NSAutoreleasePool alloc] init];
+}
+
+void cocoaReleaseAutoreleasePool()
+{
+	[_ottd_autorelease_pool release];
+}
+
+#endif /* WITH_COCOA */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cocoa/event.mm	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,705 @@
+/* $Id$ */
+
+/******************************************************************************
+ *                             Cocoa video driver                             *
+ * Known things left to do:                                                   *
+ *  Nothing at the moment.                                                    *
+ ******************************************************************************/
+
+#ifdef WITH_COCOA
+
+#define MAC_OS_X_VERSION_MIN_REQUIRED    MAC_OS_X_VERSION_10_3
+#include <AvailabilityMacros.h>
+
+#import <Cocoa/Cocoa.h>
+#import <sys/time.h> /* gettimeofday */
+#import <sys/param.h> /* for MAXPATHLEN */
+#import <unistd.h>
+
+/**
+ * Important notice regarding all modifications!!!!!!!
+ * There are certain limitations because the file is objective C++.
+ * gdb has limitations.
+ * C++ and objective C code can't be joined in all cases (classes stuff).
+ * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information.
+ */
+
+
+/* Defined in stdbool.h */
+#ifndef __cplusplus
+# ifndef __BEOS__
+#  undef bool
+#  undef false
+#  undef true
+# endif
+#endif
+
+
+#include "../../stdafx.h"
+#include "../../openttd.h"
+#include "../../debug.h"
+#include "../../os/macosx/splash.h"
+#include "../../variables.h"
+#include "cocoa_v.h"
+#include "cocoa_keys.h"
+#include "../../blitter/factory.hpp"
+
+#undef Point
+#undef Rect
+
+/* Right Mouse Button Emulation enum */
+enum {
+	RMBE_COMMAND,
+	RMBE_CONTROL,
+	RMBE_OFF,
+};
+
+
+static bool _show_mouse = true;
+static unsigned int _current_mods;
+static bool _tab_is_down;
+static bool _emulating_right_button;
+#ifdef _DEBUG
+static uint32 _tEvent;
+#endif
+
+
+static uint32 GetTick()
+{
+	struct timeval tim;
+
+	gettimeofday(&tim, NULL);
+	return tim.tv_usec / 1000 + tim.tv_sec * 1000;
+}
+
+
+void QZ_ShowMouse()
+{
+	if (!_show_mouse) {
+		[ NSCursor unhide ];
+		_show_mouse = true;
+
+		// Hide the openttd cursor when leaving the window
+		if (_cocoa_subdriver != NULL)
+			UndrawMouseCursor();
+		_cursor.in_window = false;
+	}
+}
+
+void QZ_HideMouse()
+{
+	if (_show_mouse) {
+		/*
+		 * Don't hide the cursor when compiling in debug mode.
+		 * Note: Not hiding the cursor will cause artefacts around it in 8bpp fullscreen mode.
+		 */
+#ifndef _DEBUG
+		[ NSCursor hide ];
+#endif
+		_show_mouse = false;
+
+		// Show the openttd cursor again
+		_cursor.in_window = true;
+	}
+}
+
+static void QZ_WarpCursor(int x, int y)
+{
+	NSPoint p;
+	CGPoint cgp;
+
+	assert(_cocoa_subdriver);
+
+	/* Only allow warping when in foreground */
+	if (![ NSApp isActive ]) return;
+
+	p = NSMakePoint(x, y);
+	cgp = _cocoa_subdriver->PrivateLocalToCG(&p);
+
+	/* this is the magic call that fixes cursor "freezing" after warp */
+	CGSetLocalEventsSuppressionInterval(0.0);
+	/* Do the actual warp */
+	CGWarpMouseCursorPosition(cgp);
+
+	/* Generate the mouse moved event */
+}
+
+
+static void QZ_CheckPaletteAnim()
+{
+	if (_pal_count_dirty != 0) {
+		Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
+
+		switch (blitter->UsePaletteAnimation()) {
+			case Blitter::PALETTE_ANIMATION_VIDEO_BACKEND:
+				_cocoa_subdriver->UpdatePalette(_pal_first_dirty, _pal_count_dirty);
+				break;
+
+			case Blitter::PALETTE_ANIMATION_BLITTER:
+				blitter->PaletteAnimate(_pal_first_dirty, _pal_count_dirty);
+				break;
+
+			case Blitter::PALETTE_ANIMATION_NONE:
+				break;
+
+			default:
+				NOT_REACHED();
+		}
+		_pal_count_dirty = 0;
+	}
+}
+
+
+
+struct VkMapping {
+	unsigned short vk_from;
+	byte map_to;
+};
+
+#define AS(x, z) {x, z}
+
+static const VkMapping _vk_mapping[] = {
+	AS(QZ_BACKQUOTE,  WKC_BACKQUOTE), // key left of '1'
+	AS(QZ_BACKQUOTE2, WKC_BACKQUOTE), // some keyboards have it on another scancode
+
+	/* Pageup stuff + up/down */
+	AS(QZ_PAGEUP,   WKC_PAGEUP),
+	AS(QZ_PAGEDOWN, WKC_PAGEDOWN),
+
+	AS(QZ_UP,    WKC_UP),
+	AS(QZ_DOWN,  WKC_DOWN),
+	AS(QZ_LEFT,  WKC_LEFT),
+	AS(QZ_RIGHT, WKC_RIGHT),
+
+	AS(QZ_HOME, WKC_HOME),
+	AS(QZ_END,  WKC_END),
+
+	AS(QZ_INSERT, WKC_INSERT),
+	AS(QZ_DELETE, WKC_DELETE),
+
+	/* Letters. QZ_[a-z] is not in numerical order so we can't use AM(...) */
+	AS(QZ_a, 'A'),
+	AS(QZ_b, 'B'),
+	AS(QZ_c, 'C'),
+	AS(QZ_d, 'D'),
+	AS(QZ_e, 'E'),
+	AS(QZ_f, 'F'),
+	AS(QZ_g, 'G'),
+	AS(QZ_h, 'H'),
+	AS(QZ_i, 'I'),
+	AS(QZ_j, 'J'),
+	AS(QZ_k, 'K'),
+	AS(QZ_l, 'L'),
+	AS(QZ_m, 'M'),
+	AS(QZ_n, 'N'),
+	AS(QZ_o, 'O'),
+	AS(QZ_p, 'P'),
+	AS(QZ_q, 'Q'),
+	AS(QZ_r, 'R'),
+	AS(QZ_s, 'S'),
+	AS(QZ_t, 'T'),
+	AS(QZ_u, 'U'),
+	AS(QZ_v, 'V'),
+	AS(QZ_w, 'W'),
+	AS(QZ_x, 'X'),
+	AS(QZ_y, 'Y'),
+	AS(QZ_z, 'Z'),
+	/* Same thing for digits */
+	AS(QZ_0, '0'),
+	AS(QZ_1, '1'),
+	AS(QZ_2, '2'),
+	AS(QZ_3, '3'),
+	AS(QZ_4, '4'),
+	AS(QZ_5, '5'),
+	AS(QZ_6, '6'),
+	AS(QZ_7, '7'),
+	AS(QZ_8, '8'),
+	AS(QZ_9, '9'),
+
+	AS(QZ_ESCAPE,    WKC_ESC),
+	AS(QZ_PAUSE,     WKC_PAUSE),
+	AS(QZ_BACKSPACE, WKC_BACKSPACE),
+
+	AS(QZ_SPACE,  WKC_SPACE),
+	AS(QZ_RETURN, WKC_RETURN),
+	AS(QZ_TAB,    WKC_TAB),
+
+	/* Function keys */
+	AS(QZ_F1,  WKC_F1),
+	AS(QZ_F2,  WKC_F2),
+	AS(QZ_F3,  WKC_F3),
+	AS(QZ_F4,  WKC_F4),
+	AS(QZ_F5,  WKC_F5),
+	AS(QZ_F6,  WKC_F6),
+	AS(QZ_F7,  WKC_F7),
+	AS(QZ_F8,  WKC_F8),
+	AS(QZ_F9,  WKC_F9),
+	AS(QZ_F10, WKC_F10),
+	AS(QZ_F11, WKC_F11),
+	AS(QZ_F12, WKC_F12),
+
+	/* Numeric part */
+	AS(QZ_KP0,         WKC_NUM_0),
+	AS(QZ_KP1,         WKC_NUM_1),
+	AS(QZ_KP2,         WKC_NUM_2),
+	AS(QZ_KP3,         WKC_NUM_3),
+	AS(QZ_KP4,         WKC_NUM_4),
+	AS(QZ_KP5,         WKC_NUM_5),
+	AS(QZ_KP6,         WKC_NUM_6),
+	AS(QZ_KP7,         WKC_NUM_7),
+	AS(QZ_KP8,         WKC_NUM_8),
+	AS(QZ_KP9,         WKC_NUM_9),
+	AS(QZ_KP_DIVIDE,   WKC_NUM_DIV),
+	AS(QZ_KP_MULTIPLY, WKC_NUM_MUL),
+	AS(QZ_KP_MINUS,    WKC_NUM_MINUS),
+	AS(QZ_KP_PLUS,     WKC_NUM_PLUS),
+	AS(QZ_KP_ENTER,    WKC_NUM_ENTER),
+	AS(QZ_KP_PERIOD,   WKC_NUM_DECIMAL),
+
+	/* Other non-letter keys */
+	AS(QZ_SLASH,        WKC_SLASH),
+	AS(QZ_SEMICOLON,    WKC_SEMICOLON),
+	AS(QZ_EQUALS,       WKC_EQUALS),
+	AS(QZ_LEFTBRACKET,  WKC_L_BRACKET),
+	AS(QZ_BACKSLASH,    WKC_BACKSLASH),
+	AS(QZ_RIGHTBRACKET, WKC_R_BRACKET),
+
+	AS(QZ_QUOTE,   WKC_SINGLEQUOTE),
+	AS(QZ_COMMA,   WKC_COMMA),
+	AS(QZ_MINUS,   WKC_MINUS),
+	AS(QZ_PERIOD,  WKC_PERIOD)
+};
+
+
+static uint32 QZ_MapKey(unsigned short sym)
+{
+	const VkMapping *map;
+	uint32 key = 0;
+
+	for (map = _vk_mapping; map != endof(_vk_mapping); ++map) {
+		if (sym == map->vk_from) {
+			key = map->map_to;
+			break;
+		}
+	}
+
+	if (_current_mods & NSShiftKeyMask)     key |= WKC_SHIFT;
+	if (_current_mods & NSControlKeyMask)   key |= (_patches.right_mouse_btn_emulation != RMBE_CONTROL ? WKC_CTRL : WKC_META);
+	if (_current_mods & NSAlternateKeyMask) key |= WKC_ALT;
+	if (_current_mods & NSCommandKeyMask)   key |= (_patches.right_mouse_btn_emulation != RMBE_CONTROL ? WKC_META : WKC_CTRL);
+
+	return key << 16;
+}
+
+static void QZ_KeyEvent(unsigned short keycode, unsigned short unicode, BOOL down)
+{
+	switch (keycode) {
+		case QZ_UP:    SB(_dirkeys, 1, 1, down); break;
+		case QZ_DOWN:  SB(_dirkeys, 3, 1, down); break;
+		case QZ_LEFT:  SB(_dirkeys, 0, 1, down); break;
+		case QZ_RIGHT: SB(_dirkeys, 2, 1, down); break;
+
+		case QZ_TAB: _tab_is_down = down; break;
+
+		case QZ_RETURN:
+		case QZ_f:
+			if (down && (_current_mods & NSCommandKeyMask)) {
+				_video_driver->ToggleFullscreen(!_fullscreen);
+			}
+			break;
+	}
+
+	if (down) {
+		uint32 pressed_key = QZ_MapKey(keycode) | unicode;
+		HandleKeypress(pressed_key);
+		DEBUG(driver, 2, "cocoa_v: QZ_KeyEvent: %x (%x), down, mapping: %x", keycode, unicode, pressed_key);
+	} else {
+		DEBUG(driver, 2, "cocoa_v: QZ_KeyEvent: %x (%x), up", keycode, unicode);
+	}
+}
+
+static void QZ_DoUnsidedModifiers(unsigned int newMods)
+{
+	const int mapping[] = { QZ_CAPSLOCK, QZ_LSHIFT, QZ_LCTRL, QZ_LALT, QZ_LMETA };
+
+	int i;
+	unsigned int bit;
+
+	if (_current_mods == newMods) return;
+
+	/* Iterate through the bits, testing each against the current modifiers */
+	for (i = 0, bit = NSAlphaShiftKeyMask; bit <= NSCommandKeyMask; bit <<= 1, ++i) {
+		unsigned int currentMask, newMask;
+
+		currentMask = _current_mods & bit;
+		newMask     = newMods & bit;
+
+		if (currentMask && currentMask != newMask) { /* modifier up event */
+			/* If this was Caps Lock, we need some additional voodoo to make SDL happy (is this needed in ottd?) */
+			if (bit == NSAlphaShiftKeyMask) QZ_KeyEvent(mapping[i], 0, YES);
+			QZ_KeyEvent(mapping[i], 0, NO);
+		} else if (newMask && currentMask != newMask) { /* modifier down event */
+			QZ_KeyEvent(mapping[i], 0, YES);
+			/* If this was Caps Lock, we need some additional voodoo to make SDL happy (is this needed in ottd?) */
+			if (bit == NSAlphaShiftKeyMask) QZ_KeyEvent(mapping[i], 0, NO);
+		}
+	}
+
+	_current_mods = newMods;
+}
+
+static void QZ_MouseMovedEvent(int x, int y)
+{
+	if (_cursor.fix_at) {
+		int dx = x - _cursor.pos.x;
+		int dy = y - _cursor.pos.y;
+
+		if (dx != 0 || dy != 0) {
+			_cursor.delta.x += dx;
+			_cursor.delta.y += dy;
+
+			QZ_WarpCursor(_cursor.pos.x, _cursor.pos.y);
+		}
+	} else {
+		_cursor.delta.x = x - _cursor.pos.x;
+		_cursor.delta.y = y - _cursor.pos.y;
+		_cursor.pos.x = x;
+		_cursor.pos.y = y;
+		_cursor.dirty = true;
+	}
+	HandleMouseEvents();
+}
+
+
+static void QZ_MouseButtonEvent(int button, BOOL down)
+{
+	switch (button) {
+		case 0:
+			if (down) {
+				_left_button_down = true;
+			} else {
+				_left_button_down = false;
+				_left_button_clicked = false;
+			}
+			HandleMouseEvents();
+			break;
+
+		case 1:
+			if (down) {
+				_right_button_down = true;
+				_right_button_clicked = true;
+			} else {
+				_right_button_down = false;
+			}
+			HandleMouseEvents();
+			break;
+	}
+}
+
+
+
+
+static bool QZ_PollEvent()
+{
+	NSEvent *event;
+	NSPoint pt;
+	NSString *chars;
+#ifdef _DEBUG
+	uint32 et0, et;
+#endif
+
+	assert(_cocoa_subdriver != NULL);
+
+#ifdef _DEBUG
+	et0 = GetTick();
+#endif
+	event = [ NSApp nextEventMatchingMask:NSAnyEventMask
+			untilDate: [ NSDate distantPast ]
+			inMode: NSDefaultRunLoopMode dequeue:YES ];
+#ifdef _DEBUG
+	et = GetTick();
+	_tEvent+= et - et0;
+#endif
+
+	if (event == nil) return false;
+	if (!_cocoa_subdriver->IsActive()) {
+		QZ_ShowMouse();
+		[NSApp sendEvent:event];
+		return true;
+	}
+
+	QZ_DoUnsidedModifiers( [ event modifierFlags ] );
+
+	switch ([event type]) {
+		case NSMouseMoved:
+		case NSOtherMouseDragged:
+		case NSLeftMouseDragged:
+			pt = _cocoa_subdriver->GetMouseLocation(event);
+			if (!_cocoa_subdriver->MouseIsInsideView(&pt) &&
+					!_emulating_right_button) {
+				QZ_ShowMouse();
+				[NSApp sendEvent:event];
+				break;
+			}
+
+			QZ_HideMouse();
+			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
+			break;
+
+		case NSRightMouseDragged:
+			pt = _cocoa_subdriver->GetMouseLocation(event);
+			QZ_HideMouse();
+			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
+			break;
+
+		case NSLeftMouseDown:
+		{
+			uint32 keymask = 0;
+			if (_patches.right_mouse_btn_emulation == RMBE_COMMAND) keymask |= NSCommandKeyMask;
+			if (_patches.right_mouse_btn_emulation == RMBE_CONTROL) keymask |= NSControlKeyMask;
+
+			pt = _cocoa_subdriver->GetMouseLocation(event);
+
+			if (!([ event modifierFlags ] & keymask) ||
+					!_cocoa_subdriver->MouseIsInsideView(&pt)) {
+				[NSApp sendEvent:event];
+			}
+
+			if (!_cocoa_subdriver->MouseIsInsideView(&pt)) {
+				QZ_ShowMouse();
+				break;
+			}
+
+			QZ_HideMouse();
+			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
+
+			/* Right mouse button emulation */
+			if ([ event modifierFlags ] & keymask) {
+				_emulating_right_button = true;
+				QZ_MouseButtonEvent(1, YES);
+			} else {
+				QZ_MouseButtonEvent(0, YES);
+			}
+			break;
+		}
+		case NSLeftMouseUp:
+			[NSApp sendEvent:event];
+
+			pt = _cocoa_subdriver->GetMouseLocation(event);
+			if (!_cocoa_subdriver->MouseIsInsideView(&pt)) {
+				QZ_ShowMouse();
+				break;
+			}
+
+			QZ_HideMouse();
+			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
+
+			/* Right mouse button emulation */
+			if (_emulating_right_button) {
+				_emulating_right_button = false;
+				QZ_MouseButtonEvent(1, NO);
+			} else {
+				QZ_MouseButtonEvent(0, NO);
+			}
+			break;
+
+		case NSRightMouseDown:
+			pt = _cocoa_subdriver->GetMouseLocation(event);
+			if (!_cocoa_subdriver->MouseIsInsideView(&pt)) {
+				QZ_ShowMouse();
+				[NSApp sendEvent:event];
+				break;
+			}
+
+			QZ_HideMouse();
+			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
+			QZ_MouseButtonEvent(1, YES);
+			break;
+
+		case NSRightMouseUp:
+			pt = _cocoa_subdriver->GetMouseLocation(event);
+			if (!_cocoa_subdriver->MouseIsInsideView(&pt)) {
+				QZ_ShowMouse();
+				[NSApp sendEvent:event];
+				break;
+			}
+
+			QZ_HideMouse();
+			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
+			QZ_MouseButtonEvent(1, NO);
+			break;
+
+#if 0
+		/* This is not needed since openttd currently only use two buttons */
+		case NSOtherMouseDown:
+			pt = QZ_GetMouseLocation(event);
+			if (!QZ_MouseIsInsideView(&pt)) {
+				QZ_ShowMouse();
+				[NSApp sendEvent:event];
+				break;
+			}
+
+			QZ_HideMouse();
+			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
+			QZ_MouseButtonEvent([ event buttonNumber ], YES);
+			break;
+
+		case NSOtherMouseUp:
+			pt = QZ_GetMouseLocation(event);
+			if (!QZ_MouseIsInsideView(&pt)) {
+				QZ_ShowMouse();
+				[NSApp sendEvent:event];
+				break;
+			}
+
+			QZ_HideMouse();
+			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
+			QZ_MouseButtonEvent([ event buttonNumber ], NO);
+			break;
+#endif
+
+		case NSKeyDown:
+			/* Quit, hide and minimize */
+			switch ([event keyCode]) {
+				case QZ_q:
+				case QZ_h:
+				case QZ_m:
+					if ([ event modifierFlags ] & NSCommandKeyMask) {
+						[NSApp sendEvent:event];
+					}
+					break;
+			}
+
+			chars = [ event characters ];
+			QZ_KeyEvent([event keyCode], [ chars length ] ? [ chars characterAtIndex:0 ] : 0, YES);
+			break;
+
+		case NSKeyUp:
+			/* Quit, hide and minimize */
+			switch ([event keyCode]) {
+				case QZ_q:
+				case QZ_h:
+				case QZ_m:
+					if ([ event modifierFlags ] & NSCommandKeyMask) {
+						[NSApp sendEvent:event];
+					}
+					break;
+			}
+
+			chars = [ event characters ];
+			QZ_KeyEvent([event keyCode], [ chars length ] ? [ chars characterAtIndex:0 ] : 0, NO);
+			break;
+
+		case NSScrollWheel:
+			if ([ event deltaY ] > 0.0) { /* Scroll up */
+				_cursor.wheel--;
+			} else if ([ event deltaY ] < 0.0) { /* Scroll down */
+				_cursor.wheel++;
+			} /* else: deltaY was 0.0 and we don't want to do anything */
+
+			/* Set the scroll count for scrollwheel scrolling */
+			_cursor.h_wheel -= (int)([ event deltaX ]* 5 * _patches.scrollwheel_multiplier);
+			_cursor.v_wheel -= (int)([ event deltaY ]* 5 * _patches.scrollwheel_multiplier);
+			break;
+
+		default:
+			[NSApp sendEvent:event];
+	}
+
+	return true;
+}
+
+
+void QZ_GameLoop()
+{
+	uint32 cur_ticks = GetTick();
+	uint32 last_cur_ticks = cur_ticks;
+	uint32 next_tick = cur_ticks + 30;
+	uint32 pal_tick = 0;
+#ifdef _DEBUG
+	uint32 et0, et, st0, st;
+#endif
+	int i;
+
+#ifdef _DEBUG
+	et0 = GetTick();
+	st = 0;
+#endif
+
+	_screen.dst_ptr = _cocoa_subdriver->GetPixelBuffer();
+	DisplaySplashImage();
+	QZ_CheckPaletteAnim();
+	_cocoa_subdriver->Draw();
+	CSleep(1);
+
+	for (i = 0; i < 2; i++) GameLoop();
+
+	_screen.dst_ptr = _cocoa_subdriver->GetPixelBuffer();
+	UpdateWindows();
+	QZ_CheckPaletteAnim();
+	_cocoa_subdriver->Draw();
+	CSleep(1);
+
+	for (;;) {
+		uint32 prev_cur_ticks = cur_ticks; // to check for wrapping
+		InteractiveRandom(); // randomness
+
+		while (QZ_PollEvent()) {}
+
+		if (_exit_game) break;
+
+#if defined(_DEBUG)
+		if (_current_mods & NSShiftKeyMask)
+#else
+		if (_tab_is_down)
+#endif
+		{
+			if (!_networking && _game_mode != GM_MENU) _fast_forward |= 2;
+		} else if (_fast_forward & 2) {
+			_fast_forward = 0;
+		}
+
+		cur_ticks = GetTick();
+		if (cur_ticks >= next_tick || (_fast_forward && !_pause_game) || cur_ticks < prev_cur_ticks) {
+			_realtime_tick += cur_ticks - last_cur_ticks;
+			last_cur_ticks = cur_ticks;
+			next_tick = cur_ticks + 30;
+
+			_ctrl_pressed = !!(_current_mods & ( _patches.right_mouse_btn_emulation != RMBE_CONTROL ? NSControlKeyMask : NSCommandKeyMask));
+			_shift_pressed = !!(_current_mods & NSShiftKeyMask);
+
+			GameLoop();
+
+			_screen.dst_ptr = _cocoa_subdriver->GetPixelBuffer();
+			UpdateWindows();
+			if (++pal_tick > 4) {
+				QZ_CheckPaletteAnim();
+				pal_tick = 1;
+			}
+			_cocoa_subdriver->Draw();
+		} else {
+#ifdef _DEBUG
+			st0 = GetTick();
+#endif
+			CSleep(1);
+#ifdef _DEBUG
+			st += GetTick() - st0;
+#endif
+			_screen.dst_ptr = _cocoa_subdriver->GetPixelBuffer();
+			DrawChatMessage();
+			DrawMouseCursor();
+			_cocoa_subdriver->Draw();
+		}
+	}
+
+#ifdef _DEBUG
+	et = GetTick();
+
+	DEBUG(driver, 1, "cocoa_v: nextEventMatchingMask took %i ms total", _tEvent);
+	DEBUG(driver, 1, "cocoa_v: game loop took %i ms total (%i ms without sleep)", et - et0, et - et0 - st);
+	DEBUG(driver, 1, "cocoa_v: (nextEventMatchingMask total)/(game loop total) is %f%%", (double)_tEvent / (double)(et - et0) * 100);
+	DEBUG(driver, 1, "cocoa_v: (nextEventMatchingMask total)/(game loop without sleep total) is %f%%", (double)_tEvent / (double)(et - et0 - st) * 100);
+#endif
+}
+
+#endif /* WITH_COCOA */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cocoa/fullscreen.mm	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,611 @@
+/* $Id$ */
+
+/******************************************************************************
+ *                             Cocoa video driver                             *
+ * Known things left to do:                                                   *
+ *  Scale&copy the old pixel buffer to the new one when switching resolution. *
+ ******************************************************************************/
+
+#ifdef WITH_COCOA
+
+#define MAC_OS_X_VERSION_MIN_REQUIRED    MAC_OS_X_VERSION_10_3
+#include <AvailabilityMacros.h>
+
+#import <Cocoa/Cocoa.h>
+#import <sys/time.h> /* gettimeofday */
+#import <sys/param.h> /* for MAXPATHLEN */
+#import <unistd.h>
+
+/**
+ * Important notice regarding all modifications!!!!!!!
+ * There are certain limitations because the file is objective C++.
+ * gdb has limitations.
+ * C++ and objective C code can't be joined in all cases (classes stuff).
+ * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information.
+ */
+
+
+/* From Menus.h (according to Xcode Developer Documentation) */
+extern "C" void ShowMenuBar();
+extern "C" void HideMenuBar();
+
+/* Defined in stdbool.h */
+#ifndef __cplusplus
+# ifndef __BEOS__
+#  undef bool
+#  undef false
+#  undef true
+# endif
+#endif
+
+
+#include "../../stdafx.h"
+#include "../../debug.h"
+#include "../../variables.h"
+#include "cocoa_v.h"
+
+#undef Point
+#undef Rect
+
+
+/* Structure for rez switch gamma fades
+ * We can hide the monitor flicker by setting the gamma tables to 0
+ */
+#define QZ_GAMMA_TABLE_SIZE 256
+
+struct OTTD_QuartzGammaTable {
+	CGGammaValue red[QZ_GAMMA_TABLE_SIZE];
+	CGGammaValue green[QZ_GAMMA_TABLE_SIZE];
+	CGGammaValue blue[QZ_GAMMA_TABLE_SIZE];
+};
+
+/* Add methods to get at private members of NSScreen.
+ * Since there is a bug in Apple's screen switching code that does not update
+ * this variable when switching to fullscreen, we'll set it manually (but only
+ * for the main screen).
+ */
+@interface NSScreen (NSScreenAccess)
+	- (void) setFrame:(NSRect)frame;
+@end
+
+@implementation NSScreen (NSScreenAccess)
+- (void) setFrame:(NSRect)frame;
+{
+	_frame = frame;
+}
+@end
+
+
+class FullscreenSubdriver: public CocoaSubdriver {
+	int                display_width;
+	int                display_height;
+	int                display_depth;
+	int                screen_pitch;
+	void*              screen_buffer;
+	void*              pixel_buffer;
+
+	CGDirectDisplayID  display_id;         /* 0 == main display (only support single display) */
+	CFDictionaryRef    cur_mode;           /* current mode of the display */
+	CFDictionaryRef    save_mode;          /* original mode of the display */
+	CGDirectPaletteRef palette;            /* palette of an 8-bit display */
+
+	#define MAX_DIRTY_RECTS 100
+	Rect dirty_rects[MAX_DIRTY_RECTS];
+	int num_dirty_rects;
+
+
+	/* Gamma functions to try to hide the flash from a rez switch
+	 * Fade the display from normal to black
+	 * Save gamma tables for fade back to normal
+	 */
+	uint32 FadeGammaOut(OTTD_QuartzGammaTable* table)
+	{
+		CGGammaValue redTable[QZ_GAMMA_TABLE_SIZE];
+		CGGammaValue greenTable[QZ_GAMMA_TABLE_SIZE];
+		CGGammaValue blueTable[QZ_GAMMA_TABLE_SIZE];
+		float percent;
+		int j;
+		unsigned int actual;
+
+		if (CGGetDisplayTransferByTable(
+					display_id, QZ_GAMMA_TABLE_SIZE,
+					table->red, table->green, table->blue, &actual
+				) != CGDisplayNoErr ||
+				actual != QZ_GAMMA_TABLE_SIZE) {
+			return 1;
+		}
+
+		memcpy(redTable,   table->red,   sizeof(redTable));
+		memcpy(greenTable, table->green, sizeof(greenTable));
+		memcpy(blueTable,  table->blue,  sizeof(greenTable));
+
+		for (percent = 1.0; percent >= 0.0; percent -= 0.01) {
+			for (j = 0; j < QZ_GAMMA_TABLE_SIZE; j++) {
+				redTable[j]   = redTable[j]   * percent;
+				greenTable[j] = greenTable[j] * percent;
+				blueTable[j]  = blueTable[j]  * percent;
+			}
+
+			if (CGSetDisplayTransferByTable(
+						display_id, QZ_GAMMA_TABLE_SIZE,
+						redTable, greenTable, blueTable
+					) != CGDisplayNoErr) {
+				CGDisplayRestoreColorSyncSettings();
+				return 1;
+			}
+
+			CSleep(10);
+		}
+
+		return 0;
+	}
+
+	/* Fade the display from black to normal
+	 * Restore previously saved gamma values
+	 */
+	uint32 FadeGammaIn(const OTTD_QuartzGammaTable* table)
+	{
+		CGGammaValue redTable[QZ_GAMMA_TABLE_SIZE];
+		CGGammaValue greenTable[QZ_GAMMA_TABLE_SIZE];
+		CGGammaValue blueTable[QZ_GAMMA_TABLE_SIZE];
+		float percent;
+		int j;
+
+		memset(redTable, 0, sizeof(redTable));
+		memset(greenTable, 0, sizeof(greenTable));
+		memset(blueTable, 0, sizeof(greenTable));
+
+		for (percent = 0.0; percent <= 1.0; percent += 0.01) {
+			for (j = 0; j < QZ_GAMMA_TABLE_SIZE; j++) {
+				redTable[j]   = table->red[j]   * percent;
+				greenTable[j] = table->green[j] * percent;
+				blueTable[j]  = table->blue[j]  * percent;
+			}
+
+			if (CGSetDisplayTransferByTable(
+						display_id, QZ_GAMMA_TABLE_SIZE,
+						redTable, greenTable, blueTable
+					) != CGDisplayNoErr) {
+				CGDisplayRestoreColorSyncSettings();
+				return 1;
+			}
+
+			CSleep(10);
+		}
+
+		return 0;
+	}
+
+	/* Wait for the VBL to occur (estimated since we don't have a hardware interrupt) */
+	void WaitForVerticalBlank()
+	{
+		/* The VBL delay is based on Ian Ollmann's RezLib <iano@cco.caltech.edu> */
+		double refreshRate;
+		double linesPerSecond;
+		double target;
+		double position;
+		double adjustment;
+		CFNumberRef refreshRateCFNumber;
+
+		refreshRateCFNumber = (const __CFNumber*)CFDictionaryGetValue(cur_mode, kCGDisplayRefreshRate);
+		if (refreshRateCFNumber == NULL) return;
+
+		if (CFNumberGetValue(refreshRateCFNumber, kCFNumberDoubleType, &refreshRate) == 0)
+			return;
+
+		if (refreshRate == 0) return;
+
+		linesPerSecond = refreshRate * display_height;
+		target = display_height;
+
+		/* Figure out the first delay so we start off about right */
+		position = CGDisplayBeamPosition(display_id);
+		if (position > target) position = 0;
+
+		adjustment = (target - position) / linesPerSecond;
+
+		CSleep((uint32)(adjustment * 1000));
+	}
+
+
+	bool SetVideoMode(int w, int h)
+	{
+		int exact_match;
+		CFNumberRef number;
+		int bpp;
+		int gamma_error;
+		OTTD_QuartzGammaTable gamma_table;
+		NSRect screen_rect;
+		CGError error;
+		NSPoint pt;
+
+		/* Destroy any previous mode */
+		if (pixel_buffer != NULL) {
+			free(pixel_buffer);
+			pixel_buffer = NULL;
+		}
+
+		/* See if requested mode exists */
+		cur_mode = CGDisplayBestModeForParameters(display_id, display_depth, w, h, &exact_match);
+
+		/* If the mode wasn't an exact match, check if it has the right bpp, and update width and height */
+		if (!exact_match) {
+			number = (const __CFNumber*) CFDictionaryGetValue(cur_mode, kCGDisplayBitsPerPixel);
+			CFNumberGetValue(number, kCFNumberSInt32Type, &bpp);
+			if (bpp != display_depth) {
+				DEBUG(driver, 0, "Failed to find display resolution");
+				goto ERR_NO_MATCH;
+			}
+
+			number = (const __CFNumber*)CFDictionaryGetValue(cur_mode, kCGDisplayWidth);
+			CFNumberGetValue(number, kCFNumberSInt32Type, &w);
+
+			number = (const __CFNumber*)CFDictionaryGetValue(cur_mode, kCGDisplayHeight);
+			CFNumberGetValue(number, kCFNumberSInt32Type, &h);
+		}
+
+		/* Fade display to zero gamma */
+		gamma_error = FadeGammaOut(&gamma_table);
+
+		/* Put up the blanking window (a window above all other windows) */
+		error = CGDisplayCapture(display_id);
+
+		if (CGDisplayNoErr != error) {
+			DEBUG(driver, 0, "Failed capturing display");
+			goto ERR_NO_CAPTURE;
+		}
+
+		/* Do the physical switch */
+		if (CGDisplaySwitchToMode(display_id, cur_mode) != CGDisplayNoErr) {
+			DEBUG(driver, 0, "Failed switching display resolution");
+			goto ERR_NO_SWITCH;
+		}
+
+		screen_buffer = CGDisplayBaseAddress(display_id);
+		screen_pitch  = CGDisplayBytesPerRow(display_id);
+
+		display_width = CGDisplayPixelsWide(display_id);
+		display_height = CGDisplayPixelsHigh(display_id);
+
+		/* Setup double-buffer emulation */
+		pixel_buffer = malloc(display_width * display_height * display_depth / 8);
+		if (pixel_buffer == NULL) {
+			DEBUG(driver, 0, "Failed to allocate memory for double buffering");
+			goto ERR_DOUBLEBUF;
+		}
+
+		if (display_depth == 8 && !CGDisplayCanSetPalette(display_id)) {
+			DEBUG(driver, 0, "Not an indexed display mode.");
+			goto ERR_NOT_INDEXED;
+		}
+
+		/* If we don't hide menu bar, it will get events and interrupt the program */
+		HideMenuBar();
+
+		/* Fade the display to original gamma */
+		if (!gamma_error) FadeGammaIn(&gamma_table);
+
+		/* There is a bug in Cocoa where NSScreen doesn't synchronize
+		 * with CGDirectDisplay, so the main screen's frame is wrong.
+		 * As a result, coordinate translation produces incorrect results.
+		 * We can hack around this bug by setting the screen rect ourselves.
+		 * This hack should be removed if/when the bug is fixed.
+		*/
+		screen_rect = NSMakeRect(0, 0, display_width, display_height);
+		[ [ NSScreen mainScreen ] setFrame:screen_rect ];
+
+
+		pt = [ NSEvent mouseLocation ];
+		pt.y = display_height - pt.y;
+		if (MouseIsInsideView(&pt)) QZ_HideMouse();
+
+		UpdatePalette(0, 256);
+
+		return true;
+
+		/* Since the blanking window covers *all* windows (even force quit) correct recovery is crucial */
+ERR_NOT_INDEXED:
+		free(pixel_buffer);
+		pixel_buffer = NULL;
+ERR_DOUBLEBUF:
+		CGDisplaySwitchToMode(display_id, save_mode);
+ERR_NO_SWITCH:
+		CGReleaseAllDisplays();
+ERR_NO_CAPTURE:
+		if (!gamma_error) FadeGammaIn(&gamma_table);
+ERR_NO_MATCH:
+		display_width = 0;
+		display_height = 0;
+
+		return false;
+	}
+
+	void RestoreVideoMode()
+	{
+		/* Release fullscreen resources */
+		OTTD_QuartzGammaTable gamma_table;
+		int gamma_error;
+		NSRect screen_rect;
+
+		gamma_error = FadeGammaOut(&gamma_table);
+
+		/* Restore original screen resolution/bpp */
+		CGDisplaySwitchToMode(display_id, save_mode);
+		CGReleaseAllDisplays();
+		ShowMenuBar();
+		/* Reset the main screen's rectangle
+		 * See comment in SetVideoMode for why we do this
+		 */
+		screen_rect = NSMakeRect(0, 0, CGDisplayPixelsWide(display_id), CGDisplayPixelsHigh(display_id));
+		[ [ NSScreen mainScreen ] setFrame:screen_rect ];
+
+		QZ_ShowMouse();
+
+		/* Destroy the pixel buffer */
+		if (pixel_buffer != NULL) {
+			free(pixel_buffer);
+			pixel_buffer = NULL;
+		}
+
+		if (!gamma_error) FadeGammaIn(&gamma_table);
+
+		display_width = 0;
+		display_height = 0;
+	}
+
+public:
+	FullscreenSubdriver(int bpp)
+	{
+		if (bpp != 8 && bpp != 32) {
+			error("Cocoa: This video driver only supports 8 and 32 bpp blitters.");
+		}
+
+		/* Initialize the video settings; this data persists between mode switches */
+		display_id = kCGDirectMainDisplay;
+		save_mode  = CGDisplayCurrentMode(display_id);
+
+		if (bpp == 8) palette = CGPaletteCreateDefaultColorPalette();
+
+		display_width  = 0;
+		display_height = 0;
+		display_depth  = bpp;
+		pixel_buffer   = NULL;
+
+		num_dirty_rects = MAX_DIRTY_RECTS;
+	}
+
+	virtual ~FullscreenSubdriver()
+	{
+		RestoreVideoMode();
+	}
+
+	virtual void Draw()
+	{
+		const uint8* src   = (uint8*) pixel_buffer;
+		uint8* dst         = (uint8*) screen_buffer;
+		uint pitch         = screen_pitch;
+		uint width         = display_width;
+		uint num_dirty     = num_dirty_rects;
+		uint bytesperpixel = display_depth / 8;
+		uint i;
+
+		/* Check if we need to do anything */
+		if (num_dirty == 0) return;
+
+		if (num_dirty >= MAX_DIRTY_RECTS) {
+			num_dirty = 1;
+			dirty_rects[0].left   = 0;
+			dirty_rects[0].top    = 0;
+			dirty_rects[0].right  = display_width;
+			dirty_rects[0].bottom = display_height;
+		}
+
+		WaitForVerticalBlank();
+		/* Build the region of dirty rectangles */
+		for (i = 0; i < num_dirty; i++) {
+			uint y      = dirty_rects[i].top;
+			uint left   = dirty_rects[i].left;
+			uint length = dirty_rects[i].right - left;
+			uint bottom = dirty_rects[i].bottom;
+
+			for (; y < bottom; y++) {
+				memcpy(dst + y * pitch + left * bytesperpixel, src + y * width * bytesperpixel + left * bytesperpixel, length * bytesperpixel);
+			}
+		}
+
+		num_dirty_rects = 0;
+	}
+
+	virtual void MakeDirty(int left, int top, int width, int height)
+	{
+		if (num_dirty_rects < MAX_DIRTY_RECTS) {
+			dirty_rects[num_dirty_rects].left = left;
+			dirty_rects[num_dirty_rects].top = top;
+			dirty_rects[num_dirty_rects].right = left + width;
+			dirty_rects[num_dirty_rects].bottom = top + height;
+		}
+		num_dirty_rects++;
+	}
+
+	virtual void UpdatePalette(uint first_color, uint num_colors)
+	{
+		CGTableCount  index;
+		CGDeviceColor color;
+
+		if (display_depth != 8)
+			return;
+
+		for (index = first_color; index < first_color+num_colors; index++) {
+			/* Clamp colors between 0.0 and 1.0 */
+			color.red   = _cur_palette[index].r / 255.0;
+			color.blue  = _cur_palette[index].b / 255.0;
+			color.green = _cur_palette[index].g / 255.0;
+
+			CGPaletteSetColorAtIndex(palette, color, index);
+		}
+
+		CGDisplaySetPalette(display_id, palette);
+	}
+
+	virtual uint ListModes(OTTDPoint* modes, uint max_modes)
+	{
+		CFArrayRef mode_list;
+		CFIndex num_modes;
+		CFIndex i;
+		uint count = 0;
+
+		mode_list  = CGDisplayAvailableModes(display_id);
+		num_modes = CFArrayGetCount(mode_list);
+
+		/* Build list of modes with the requested bpp */
+		for (i = 0; i < num_modes && count < max_modes; i++) {
+			CFDictionaryRef onemode;
+			CFNumberRef     number;
+			int bpp;
+			int intvalue;
+			bool hasMode;
+			uint16 width, height;
+
+			onemode = (const __CFDictionary*)CFArrayGetValueAtIndex(mode_list, i);
+			number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayBitsPerPixel);
+			CFNumberGetValue (number, kCFNumberSInt32Type, &bpp);
+
+			if (bpp != display_depth) continue;
+
+			number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayWidth);
+			CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
+			width = (uint16)intvalue;
+
+			number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayHeight);
+			CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
+			height = (uint16)intvalue;
+
+			/* Check if mode is already in the list */
+			{
+				uint i;
+				hasMode = false;
+				for (i = 0; i < count; i++) {
+					if (modes[i].x == width &&  modes[i].y == height) {
+						hasMode = true;
+						break;
+					}
+				}
+			}
+
+			if (hasMode) continue;
+
+			/* Add mode to the list */
+			modes[count].x = width;
+			modes[count].y = height;
+			count++;
+		}
+
+		/* Sort list smallest to largest */
+		{
+			uint i, j;
+			for (i = 0; i < count; i++) {
+				for (j = 0; j < count-1; j++) {
+					if (modes[j].x > modes[j + 1].x || (
+						modes[j].x == modes[j + 1].x &&
+						modes[j].y >  modes[j + 1].y
+						)) {
+						uint tmpw = modes[j].x;
+						uint tmph = modes[j].y;
+
+						modes[j].x = modes[j + 1].x;
+						modes[j].y = modes[j + 1].y;
+
+						modes[j + 1].x = tmpw;
+						modes[j + 1].y = tmph;
+					}
+				}
+			}
+		}
+
+		return count;
+	}
+
+	virtual bool ChangeResolution(int w, int h)
+	{
+		int old_width  = display_width;
+		int old_height = display_height;
+
+		if (SetVideoMode(w, h))
+			return true;
+
+		if (old_width != 0 && old_height != 0)
+			SetVideoMode(old_width, old_height);
+
+		return false;
+	}
+
+	virtual bool IsFullscreen()
+	{
+		return true;
+	}
+
+	virtual int GetWidth()
+	{
+		return display_width;
+	}
+
+	virtual int GetHeight()
+	{
+		return display_height;
+	}
+
+	virtual void *GetPixelBuffer()
+	{
+		return pixel_buffer;
+	}
+
+	/*
+		Convert local coordinate to window server (CoreGraphics) coordinate.
+		In fullscreen mode this just means copying the coords.
+	*/
+	virtual CGPoint PrivateLocalToCG(NSPoint* p)
+	{
+		CGPoint cgp;
+
+		cgp.x = p->x;
+		cgp.y = p->y;
+
+		return cgp;
+	}
+
+	virtual NSPoint GetMouseLocation(NSEvent *event)
+	{
+		NSPoint pt;
+
+		pt = [ NSEvent mouseLocation ];
+		pt.y = display_height - pt.y;
+
+		return pt;
+	}
+
+	virtual bool MouseIsInsideView(NSPoint *pt)
+	{
+		return pt->x >= 0 && pt->y >= 0 && pt->x < display_width && pt->y < display_height;
+	}
+
+	virtual bool IsActive()
+	{
+		return true;
+	}
+};
+
+CocoaSubdriver *QZ_CreateFullscreenSubdriver(int width, int height, int bpp)
+{
+	FullscreenSubdriver *ret;
+
+	ret = new FullscreenSubdriver(bpp);
+
+	if (!ret->ChangeResolution(width, height)) {
+		delete ret;
+		return NULL;
+	}
+
+	return ret;
+}
+
+#endif /* WITH_COCOA */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cocoa/wnd_quartz.mm	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,806 @@
+/* $Id$ */
+
+/******************************************************************************
+ *                             Cocoa video driver                             *
+ * Known things left to do:                                                   *
+ *  List available resolutions.                                               *
+ ******************************************************************************/
+
+#ifdef WITH_COCOA
+
+#include <AvailabilityMacros.h>
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+
+#import <Cocoa/Cocoa.h>
+#import <sys/time.h> /* gettimeofday */
+#import <sys/param.h> /* for MAXPATHLEN */
+#import <unistd.h>
+
+/**
+ * Important notice regarding all modifications!!!!!!!
+ * There are certain limitations because the file is objective C++.
+ * gdb has limitations.
+ * C++ and objective C code can't be joined in all cases (classes stuff).
+ * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information.
+ */
+
+
+/* Defined in stdbool.h */
+#ifndef __cplusplus
+# ifndef __BEOS__
+#  undef bool
+#  undef false
+#  undef true
+# endif
+#endif
+
+
+#include "../../stdafx.h"
+#include "../../debug.h"
+#include "../../variables.h"
+#include "cocoa_v.h"
+
+#undef Point
+#undef Rect
+
+
+class WindowQuartzSubdriver;
+
+
+/* Subclass of NSWindow to fix genie effect and support resize events  */
+@interface OTTD_QuartzWindow : NSWindow {
+	WindowQuartzSubdriver *driver;
+}
+
+- (void)setDriver:(WindowQuartzSubdriver*)drv;
+
+- (void)miniaturize:(id)sender;
+- (void)display;
+- (void)setFrame:(NSRect)frameRect display:(BOOL)flag;
+- (void)appDidHide:(NSNotification*)note;
+- (void)appWillUnhide:(NSNotification*)note;
+- (void)appDidUnhide:(NSNotification*)note;
+- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag;
+@end
+
+/* Delegate for our NSWindow to send ask for quit on close */
+@interface OTTD_QuartzWindowDelegate : NSObject{
+	WindowQuartzSubdriver *driver;
+}
+
+- (void)setDriver:(WindowQuartzSubdriver*)drv;
+
+- (BOOL)windowShouldClose:(id)sender;
+@end
+
+/* Subclass of NSView to fix Quartz rendering */
+@interface OTTD_QuartzView : NSView {
+	WindowQuartzSubdriver *driver;
+}
+
+- (void)setDriver:(WindowQuartzSubdriver*)drv;
+
+- (void)drawRect:(NSRect)rect;
+- (BOOL)isOpaque;
+@end
+
+class WindowQuartzSubdriver: public CocoaSubdriver {
+	int device_width;
+	int device_height;
+
+	int window_width;
+	int window_height;
+
+	int buffer_depth;
+
+	void* pixel_buffer;
+	void* image_buffer;
+
+	OTTD_QuartzWindow *window;
+
+	#define MAX_DIRTY_RECTS 100
+	Rect dirty_rects[MAX_DIRTY_RECTS];
+	int num_dirty_rects;
+
+	uint32 palette[256];
+
+public:
+	bool active;
+	bool setup;
+
+	OTTD_QuartzView* qzview;
+	CGContextRef 	 cgcontext;
+
+private:
+	void GetDeviceInfo();
+
+	bool SetVideoMode(int width, int height);
+
+	/**
+	 * This function copies 8bpp pixels from the screen buffer in 32bpp windowed mode.
+	 *
+	 * @param left The x coord for the left edge of the box to blit.
+	 * @param top The y coord for the top edge of the box to blit.
+	 * @param right The x coord for the right edge of the box to blit.
+	 * @param bottom The y coord for the bottom edge of the box to blit.
+	 */
+	void BlitIndexedToView32(int left, int top, int right, int bottom);
+
+public:
+	WindowQuartzSubdriver(int bpp);
+	virtual ~WindowQuartzSubdriver();
+
+	virtual void Draw();
+	virtual void MakeDirty(int left, int top, int width, int height);
+	virtual void UpdatePalette(uint first_color, uint num_colors);
+
+	virtual uint ListModes(OTTDPoint* modes, uint max_modes);
+
+	virtual bool ChangeResolution(int w, int h);
+
+	virtual bool IsFullscreen() { return false; }
+
+	virtual int GetWidth() { return window_width; }
+	virtual int GetHeight() { return window_height; }
+	virtual void *GetPixelBuffer() { return buffer_depth == 8 ? pixel_buffer : image_buffer; }
+
+	/* Convert local coordinate to window server (CoreGraphics) coordinate */
+	virtual CGPoint PrivateLocalToCG(NSPoint* p);
+
+	virtual NSPoint GetMouseLocation(NSEvent *event);
+	virtual bool MouseIsInsideView(NSPoint *pt);
+
+	virtual bool IsActive() { return active; }
+
+
+	void SetPortAlphaOpaque();
+	bool WindowResized();
+};
+
+
+static CGColorSpaceRef QZ_GetCorrectColorSpace()
+{
+	static CGColorSpaceRef colorSpace = NULL;
+
+	if (colorSpace == NULL)
+	{
+		CMProfileRef sysProfile;
+
+		if (CMGetSystemProfile(&sysProfile) == noErr)
+		{
+			colorSpace = CGColorSpaceCreateWithPlatformColorSpace(sysProfile);
+			CMCloseProfile(sysProfile);
+		}
+
+		assert(colorSpace != NULL);
+	}
+
+	return colorSpace;
+}
+
+
+@implementation OTTD_QuartzWindow
+
+- (void)setDriver:(WindowQuartzSubdriver*)drv
+{
+	driver = drv;
+}
+
+
+/* we override these methods to fix the miniaturize animation/dock icon bug */
+- (void)miniaturize:(id)sender
+{
+	/* make the alpha channel opaque so anim won't have holes in it */
+	driver->SetPortAlphaOpaque ();
+
+	/* window is hidden now */
+	driver->active = false;
+
+	QZ_ShowMouse();
+
+	[ super miniaturize:sender ];
+}
+
+- (void)display
+{
+	/* This method fires just before the window deminaturizes from the Dock.
+	 * We'll save the current visible surface, let the window manager redraw any
+	 * UI elements, and restore the surface. This way, no expose event
+	 * is required, and the deminiaturize works perfectly.
+	 */
+
+	driver->SetPortAlphaOpaque();
+
+	/* save current visible surface */
+	[ self cacheImageInRect:[ driver->qzview frame ] ];
+
+	/* let the window manager redraw controls, border, etc */
+	[ super display ];
+
+	/* restore visible surface */
+	[ self restoreCachedImage ];
+
+	/* window is visible again */
+	driver->active = true;
+}
+
+- (void)setFrame:(NSRect)frameRect display:(BOOL)flag
+{
+	[ super setFrame:frameRect display:flag ];
+
+	/* Don't do anything if the window is currently being created */
+	if (driver->setup) return;
+
+	if (!driver->WindowResized())
+		error("Cocoa: Failed to resize window.");
+}
+
+- (void)appDidHide:(NSNotification*)note
+{
+	driver->active = false;
+}
+
+
+- (void)appWillUnhide:(NSNotification*)note
+{
+	driver->SetPortAlphaOpaque ();
+
+	/* save current visible surface */
+	[ self cacheImageInRect:[ driver->qzview frame ] ];
+}
+
+- (void)appDidUnhide:(NSNotification*)note
+{
+	/* restore cached image, since it may not be current, post expose event too */
+	[ self restoreCachedImage ];
+
+	driver->active = true;
+}
+
+
+- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag
+{
+	/* Make our window subclass receive these application notifications */
+	[ [ NSNotificationCenter defaultCenter ] addObserver:self
+	selector:@selector(appDidHide:) name:NSApplicationDidHideNotification object:NSApp ];
+
+	[ [ NSNotificationCenter defaultCenter ] addObserver:self
+	selector:@selector(appDidUnhide:) name:NSApplicationDidUnhideNotification object:NSApp ];
+
+	[ [ NSNotificationCenter defaultCenter ] addObserver:self
+	selector:@selector(appWillUnhide:) name:NSApplicationWillUnhideNotification object:NSApp ];
+
+	return [ super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag ];
+}
+
+@end
+
+@implementation OTTD_QuartzWindowDelegate
+
+- (void)setDriver:(WindowQuartzSubdriver*)drv
+{
+	driver = drv;
+}
+
+- (BOOL)windowShouldClose:(id)sender
+{
+	HandleExitGameRequest();
+
+	return NO;
+}
+
+- (void)windowDidBecomeKey:(NSNotification*)aNotification
+{
+	driver->active = true;
+}
+
+- (void)windowDidResignKey:(NSNotification*)aNotification
+{
+	driver->active = false;
+}
+
+- (void)windowDidBecomeMain:(NSNotification*)aNotification
+{
+	driver->active = true;
+}
+
+- (void)windowDidResignMain:(NSNotification*)aNotification
+{
+	driver->active = false;
+}
+
+@end
+
+@implementation OTTD_QuartzView
+
+- (void)setDriver:(WindowQuartzSubdriver*)drv
+{
+	driver = drv;
+}
+
+
+- (BOOL)isOpaque
+{
+	return YES;
+}
+
+- (void)drawRect:(NSRect)invalidRect
+{
+	CGImageRef    fullImage;
+	CGImageRef    clippedImage;
+	NSRect        rect;
+	const NSRect* dirtyRects;
+	int           dirtyRectCount;
+	int           n;
+	CGRect        clipRect;
+	CGRect        blitRect;
+	uint32        blitArea       = 0;
+	NSRect        frameRect      = [ self frame ];
+	CGContextRef  viewContext    = (CGContextRef)[ [ NSGraphicsContext currentContext ] graphicsPort ];
+
+	if (driver->cgcontext == NULL) return;
+
+	CGContextSetShouldAntialias(viewContext, FALSE);
+	CGContextSetInterpolationQuality(viewContext, kCGInterpolationNone);
+
+	/* The obtained 'rect' is actually a union of all dirty rects, let's ask for an explicit list of rects instead */
+	[ self getRectsBeingDrawn:&dirtyRects count:&dirtyRectCount ];
+
+	/* We need an Image in order to do blitting, but as we don't touch the context between this call and drawing no copying will actually be done here */
+	fullImage = CGBitmapContextCreateImage(driver->cgcontext);
+
+	/* Calculate total area we are blitting */
+	for (n = 0; n < dirtyRectCount; n++) {
+		blitArea += dirtyRects[n].size.width * dirtyRects[n].size.height;
+ 	}
+
+	/*
+	 * This might be completely stupid, but in my extremely subjective opinion it feels faster
+	 * The point is, if we're blitting less than 50% of the dirty rect union then it's still a good idea to blit each dirty
+	 * rect separately but if we blit more than that, it's just cheaper to blit the entire union in one pass.
+	 * Feel free to remove or find an even better value than 50% ... / blackis
+	 */
+	if (blitArea / (float)(invalidRect.size.width * invalidRect.size.height) > 0.5f) {
+		rect = invalidRect;
+
+		blitRect.origin.x = rect.origin.x;
+		blitRect.origin.y = rect.origin.y;
+		blitRect.size.width = rect.size.width;
+		blitRect.size.height = rect.size.height;
+
+		clipRect.origin.x = rect.origin.x;
+		clipRect.origin.y = frameRect.size.height - rect.origin.y - rect.size.height;
+
+		clipRect.size.width = rect.size.width;
+		clipRect.size.height = rect.size.height;
+
+		/* Blit dirty part of image */
+		clippedImage = CGImageCreateWithImageInRect(fullImage, clipRect);
+		CGContextDrawImage(viewContext, blitRect, clippedImage);
+		CGImageRelease(clippedImage);
+	} else {
+		for (n = 0; n < dirtyRectCount; n++) {
+			rect = dirtyRects[n];
+
+			blitRect.origin.x = rect.origin.x;
+			blitRect.origin.y = rect.origin.y;
+			blitRect.size.width = rect.size.width;
+			blitRect.size.height = rect.size.height;
+
+			clipRect.origin.x = rect.origin.x;
+			clipRect.origin.y = frameRect.size.height - rect.origin.y - rect.size.height;
+
+			clipRect.size.width = rect.size.width;
+			clipRect.size.height = rect.size.height;
+
+			/* Blit dirty part of image */
+			clippedImage = CGImageCreateWithImageInRect(fullImage, clipRect);
+			CGContextDrawImage(viewContext, blitRect, clippedImage);
+			CGImageRelease(clippedImage);
+ 		}
+ 	}
+
+	CGImageRelease(fullImage);
+}
+
+@end
+
+
+extern const char _openttd_revision[];
+
+
+void WindowQuartzSubdriver::GetDeviceInfo()
+{
+	CFDictionaryRef    cur_mode;
+
+	/* Initialize the video settings; this data persists between mode switches */
+	cur_mode = CGDisplayCurrentMode(kCGDirectMainDisplay);
+
+	/* Gather some information that is useful to know about the display */
+	CFNumberGetValue(
+		(const __CFNumber*)CFDictionaryGetValue(cur_mode, kCGDisplayWidth),
+		kCFNumberSInt32Type, &device_width
+	);
+
+	CFNumberGetValue(
+		(const __CFNumber*)CFDictionaryGetValue(cur_mode, kCGDisplayHeight),
+		kCFNumberSInt32Type, &device_height
+	);
+}
+
+bool WindowQuartzSubdriver::SetVideoMode(int width, int height)
+{
+	char caption[50];
+	NSString *nsscaption;
+	unsigned int style;
+	NSRect contentRect;
+	BOOL isCustom = NO;
+	bool ret;
+
+	setup = true;
+
+	GetDeviceInfo();
+
+	if (width > device_width)
+		width = device_width;
+	if (height > device_height)
+		height = device_height;
+
+	contentRect = NSMakeRect(0, 0, width, height);
+
+	/* Check if we should recreate the window */
+	if (window == nil) {
+		OTTD_QuartzWindowDelegate *delegate;
+
+		/* Set the window style */
+		style = NSTitledWindowMask;
+		style |= (NSMiniaturizableWindowMask | NSClosableWindowMask);
+		style |= NSResizableWindowMask;
+
+		/* Manually create a window, avoids having a nib file resource */
+		window = [ [ OTTD_QuartzWindow alloc ]
+						initWithContentRect: contentRect
+						styleMask: style
+						backing: NSBackingStoreBuffered
+						defer: NO ];
+
+		if (window == nil) {
+			DEBUG(driver, 0, "Could not create the Cocoa window.");
+			setup = false;
+			return false;
+		}
+
+		[ window setDriver:this ];
+
+		snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision);
+		nsscaption = [ [ NSString alloc ] initWithCString:caption ];
+		[ window setTitle: nsscaption ];
+		[ window setMiniwindowTitle: nsscaption ];
+		[ nsscaption release ];
+
+		[ window setAcceptsMouseMovedEvents: YES ];
+		[ window setViewsNeedDisplay: NO ];
+
+		[ window useOptimizedDrawing: YES ];
+
+		delegate = [ [ OTTD_QuartzWindowDelegate alloc ] init ];
+		[ delegate setDriver: this ];
+		[ window setDelegate: [ delegate autorelease ] ];
+	} else {
+		/* We already have a window, just change its size */
+		if (!isCustom) {
+			[ window setContentSize: contentRect.size ];
+
+			// Ensure frame height - title bar height >= view height
+			contentRect.size.height = Clamp(height, 0, [ window frame ].size.height - 22 /* 22 is the height of title bar of window*/);
+
+			if (qzview != nil) {
+				height = contentRect.size.height;
+				[ qzview setFrameSize: contentRect.size ];
+			}
+		}
+	}
+
+	window_width = width;
+	window_height = height;
+
+	[ window center ];
+
+	/* Only recreate the view if it doesn't already exist */
+	if (qzview == nil) {
+		qzview = [ [ OTTD_QuartzView alloc ] initWithFrame: contentRect ];
+		if (qzview == nil) {
+			DEBUG(driver, 0, "Could not create the Quickdraw view.");
+			setup = false;
+			return false;
+		}
+
+		[ qzview setDriver: this ];
+
+		[ qzview setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable ];
+		[ window setContentView: qzview ];
+		[ qzview release ];
+		[ window makeKeyAndOrderFront:nil ];
+	}
+
+	ret = WindowResized();
+
+	UpdatePalette(0, 256);
+
+	setup = false;
+
+	return ret;
+}
+
+void WindowQuartzSubdriver::BlitIndexedToView32(int left, int top, int right, int bottom)
+{
+	const uint32* pal   = palette;
+	const uint8*  src   = (uint8*)pixel_buffer;
+	uint32*       dst   = (uint32*)image_buffer;
+	uint          width = window_width;
+	uint          pitch = window_width;
+	int x;
+	int y;
+
+	for (y = top; y < bottom; y++) {
+		for (x = left; x < right; x++) {
+			dst[y * pitch + x] = pal[src[y * width + x]];
+		}
+	}
+}
+
+
+WindowQuartzSubdriver::WindowQuartzSubdriver(int bpp)
+{
+	window_width  = 0;
+	window_height = 0;
+	buffer_depth  = bpp;
+	image_buffer  = NULL;
+	pixel_buffer  = NULL;
+	active        = false;
+	setup         = false;
+
+	window = nil;
+	qzview = nil;
+
+	cgcontext = NULL;
+
+	num_dirty_rects = MAX_DIRTY_RECTS;
+}
+
+WindowQuartzSubdriver::~WindowQuartzSubdriver()
+{
+	QZ_ShowMouse();
+
+	/* Release window mode resources */
+	if (window != nil) [ window close ];
+
+	CGContextRelease(cgcontext);
+
+	free(image_buffer);
+	free(pixel_buffer);
+}
+
+void WindowQuartzSubdriver::Draw()
+{
+	int i;
+	NSRect dirtyrect;
+
+	/* Check if we need to do anything */
+	if (num_dirty_rects == 0 ||
+		[ window isMiniaturized ]) {
+		return;
+	}
+
+	if (num_dirty_rects >= MAX_DIRTY_RECTS) {
+		num_dirty_rects = 1;
+		dirty_rects[0].left = 0;
+		dirty_rects[0].top = 0;
+		dirty_rects[0].right = window_width;
+		dirty_rects[0].bottom = window_height;
+	}
+
+	/* Build the region of dirty rectangles */
+	for (i = 0; i < num_dirty_rects; i++) {
+		/* We only need to blit in indexed mode since in 32bpp mode the game draws directly to the image. */
+		if(buffer_depth == 8) {
+			BlitIndexedToView32(
+				dirty_rects[i].left,
+				dirty_rects[i].top,
+				dirty_rects[i].right,
+				dirty_rects[i].bottom
+			);
+		}
+
+		dirtyrect.origin.x = dirty_rects[i].left;
+		dirtyrect.origin.y = window_height - dirty_rects[i].bottom;
+		dirtyrect.size.width = dirty_rects[i].right - dirty_rects[i].left;
+		dirtyrect.size.height = dirty_rects[i].bottom - dirty_rects[i].top;
+
+		/* drawRect will be automatically called by Mac OS X during next update cycle, and then blitting will occur */
+		[ qzview setNeedsDisplayInRect: dirtyrect ];
+	}
+
+	//DrawResizeIcon();
+
+	num_dirty_rects = 0;
+}
+
+void WindowQuartzSubdriver::MakeDirty(int left, int top, int width, int height)
+{
+	if (num_dirty_rects < MAX_DIRTY_RECTS) {
+		dirty_rects[num_dirty_rects].left = left;
+		dirty_rects[num_dirty_rects].top = top;
+		dirty_rects[num_dirty_rects].right = left + width;
+		dirty_rects[num_dirty_rects].bottom = top + height;
+	}
+	num_dirty_rects++;
+}
+
+void WindowQuartzSubdriver::UpdatePalette(uint first_color, uint num_colors)
+{
+	uint i;
+
+	if (buffer_depth != 8)
+		return;
+
+	for (i = first_color; i < first_color + num_colors; i++) {
+		uint32 clr = 0xff000000;
+		clr |= (uint32)_cur_palette[i].r << 16;
+		clr |= (uint32)_cur_palette[i].g << 8;
+		clr |= (uint32)_cur_palette[i].b;
+		palette[i] = clr;
+	}
+
+	num_dirty_rects = MAX_DIRTY_RECTS;
+}
+
+uint WindowQuartzSubdriver::ListModes(OTTDPoint* modes, uint max_modes)
+{
+	if (max_modes == 0) return 0;
+
+	modes[0].x = window_width;
+	modes[0].y = window_height;
+
+	return 1;
+}
+
+bool WindowQuartzSubdriver::ChangeResolution(int w, int h)
+{
+	int old_width  = window_width;
+	int old_height = window_height;
+
+	if (SetVideoMode(w, h))
+		return true;
+
+	if (old_width != 0 && old_height != 0)
+		SetVideoMode(old_width, old_height);
+
+	return false;
+}
+
+/* Convert local coordinate to window server (CoreGraphics) coordinate */
+CGPoint WindowQuartzSubdriver::PrivateLocalToCG(NSPoint* p)
+{
+	CGPoint cgp;
+
+	p->y = window_height - p->y;
+	*p = [ qzview convertPoint:*p toView: nil ];
+
+	*p = [ window convertBaseToScreen:*p ];
+	p->y = device_height - p->y;
+
+	cgp.x = p->x;
+	cgp.y = p->y;
+
+	return cgp;
+}
+
+NSPoint WindowQuartzSubdriver::GetMouseLocation(NSEvent *event)
+{
+	NSPoint pt;
+
+	pt = [ event locationInWindow ];
+	pt = [ qzview convertPoint:pt fromView:nil ];
+
+	pt.y = window_height - pt.y;
+
+	return pt;
+}
+
+bool WindowQuartzSubdriver::MouseIsInsideView(NSPoint *pt)
+{
+	return [ qzview mouse:*pt inRect:[ qzview bounds ] ];
+}
+
+
+/* This function makes the *game region* of the window 100% opaque.
+ * The genie effect uses the alpha component. Otherwise,
+ * it doesn't seem to matter what value it has.
+ */
+void WindowQuartzSubdriver::SetPortAlphaOpaque()
+{
+	uint32* pixels = (uint32*)image_buffer;
+	uint32  pitch  = window_width;
+	int x, y;
+
+	for (y = 0; y < window_height; y++)
+		for (x = 0; x < window_width; x++) {
+		pixels[y * pitch + x] |= 0xFF000000;
+	}
+}
+
+bool WindowQuartzSubdriver::WindowResized()
+{
+	if (window == nil || qzview == nil) return true;
+
+	NSRect newframe = [ qzview frame ];
+
+	window_width = newframe.size.width;
+	window_height = newframe.size.height;
+
+	/* Create Core Graphics Context */
+	free(image_buffer);
+	image_buffer = (uint32*)malloc(window_width * window_height * 4);
+
+	CGContextRelease(cgcontext);
+	cgcontext = CGBitmapContextCreate(
+		image_buffer,              // data
+		window_width,              // width
+		window_height,             // height
+		8,                         // bits per component
+		window_width * 4,          // bytes per row
+		QZ_GetCorrectColorSpace(), // color space
+		kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host
+	);
+
+	assert(cgcontext != NULL);
+	CGContextSetShouldAntialias(cgcontext, FALSE);
+	CGContextSetAllowsAntialiasing(cgcontext, FALSE);
+	CGContextSetInterpolationQuality(cgcontext, kCGInterpolationNone);
+
+	if (buffer_depth == 8) {
+		free(pixel_buffer);
+		pixel_buffer = malloc(window_width * window_height);
+		if (pixel_buffer == NULL) {
+			DEBUG(driver, 0, "Failed to allocate pixel buffer");
+			return false;
+		}
+	}
+
+	QZ_GameSizeChanged();
+
+	/* Redraw screen */
+	num_dirty_rects = MAX_DIRTY_RECTS;
+
+	return true;
+}
+
+
+CocoaSubdriver *QZ_CreateWindowQuartzSubdriver(int width, int height, int bpp)
+{
+	WindowQuartzSubdriver *ret;
+
+	if (!MacOSVersionIsAtLeast(10, 4, 0)) {
+		DEBUG(driver, 0, "The cocoa quartz subdriver requires Mac OS X 10.4 or later.");
+		return NULL;
+	}
+
+	if (bpp != 8 && bpp != 32) {
+		DEBUG(driver, 0, "The cocoa quartz subdriver only supports 8 and 32 bpp.");
+		return NULL;
+	}
+
+	ret = new WindowQuartzSubdriver(bpp);
+
+	if (!ret->ChangeResolution(width, height)) {
+		delete ret;
+		return NULL;
+	}
+
+	return ret;
+}
+
+#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 */
+#endif /* WITH_COCOA */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cocoa/wnd_quickdraw.mm	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,820 @@
+/* $Id$ */
+
+/******************************************************************************
+ *                             Cocoa video driver                             *
+ * Known things left to do:                                                   *
+ *  List available resolutions.                                               *
+ ******************************************************************************/
+
+#ifdef WITH_COCOA
+
+#define MAC_OS_X_VERSION_MIN_REQUIRED    MAC_OS_X_VERSION_10_3
+#define MAC_OS_X_VERSION_MAX_ALLOWED     MAC_OS_X_VERSION_10_3
+#include <AvailabilityMacros.h>
+
+#import <Cocoa/Cocoa.h>
+#import <sys/time.h> /* gettimeofday */
+#import <sys/param.h> /* for MAXPATHLEN */
+#import <unistd.h>
+
+/**
+ * Important notice regarding all modifications!!!!!!!
+ * There are certain limitations because the file is objective C++.
+ * gdb has limitations.
+ * C++ and objective C code can't be joined in all cases (classes stuff).
+ * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information.
+ */
+
+
+/* Defined in stdbool.h */
+#ifndef __cplusplus
+# ifndef __BEOS__
+#  undef bool
+#  undef false
+#  undef true
+# endif
+#endif
+
+
+#include "../../stdafx.h"
+#include "../../debug.h"
+#include "../../variables.h"
+#include "cocoa_v.h"
+
+#undef Point
+#undef Rect
+
+
+class WindowQuickdrawSubdriver;
+
+
+/* Subclass of NSWindow to fix genie effect and support resize events  */
+@interface OTTD_QuickdrawWindow : NSWindow {
+	WindowQuickdrawSubdriver *driver;
+}
+
+- (void)setDriver:(WindowQuickdrawSubdriver*)drv;
+
+- (void)miniaturize:(id)sender;
+- (void)display;
+- (void)setFrame:(NSRect)frameRect display:(BOOL)flag;
+- (void)appDidHide:(NSNotification*)note;
+- (void)appWillUnhide:(NSNotification*)note;
+- (void)appDidUnhide:(NSNotification*)note;
+- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag;
+@end
+
+/* Delegate for our NSWindow to send ask for quit on close */
+@interface OTTD_QuickdrawWindowDelegate : NSObject{
+	WindowQuickdrawSubdriver *driver;
+}
+
+- (void)setDriver:(WindowQuickdrawSubdriver*)drv;
+
+- (BOOL)windowShouldClose:(id)sender;
+@end
+
+class WindowQuickdrawSubdriver: public CocoaSubdriver {
+	int device_width;
+	int device_height;
+	int device_depth;
+
+	int window_width;
+	int window_height;
+	int window_pitch;
+
+	int buffer_depth;
+
+	void *pixel_buffer;
+	void *window_buffer;
+
+	OTTD_QuickdrawWindow *window;
+
+	#define MAX_DIRTY_RECTS 100
+	Rect dirty_rects[MAX_DIRTY_RECTS];
+	int num_dirty_rects;
+
+	uint16 palette16[256];
+	uint32 palette32[256];
+
+public:
+	bool active;
+	bool setup;
+
+	NSQuickDrawView *qdview;
+
+private:
+	void GetDeviceInfo();
+
+	bool SetVideoMode(int width, int height);
+
+	/**
+	 * This function copies 32bpp pixels from the screen buffer in 16bpp windowed mode.
+	 *
+	 * @param left The x coord for the left edge of the box to blit.
+	 * @param top The y coord for the top edge of the box to blit.
+	 * @param right The x coord for the right edge of the box to blit.
+	 * @param bottom The y coord for the bottom edge of the box to blit.
+	 */
+	void Blit32ToView32(int left, int top, int right, int bottom);
+
+	/**
+	 * This function copies 8bpp pixels from the screen buffer in 32bpp windowed mode.
+	 *
+	 * @param left The x coord for the left edge of the box to blit.
+	 * @param top The y coord for the top edge of the box to blit.
+	 * @param right The x coord for the right edge of the box to blit.
+	 * @param bottom The y coord for the bottom edge of the box to blit.
+	 */
+	void BlitIndexedToView32(int left, int top, int right, int bottom);
+
+	/**
+	 * This function copies 8bpp pixels from the screen buffer in 16bpp windowed mode.
+	 *
+	 * @param left The x coord for the left edge of the box to blit.
+	 * @param top The y coord for the top edge of the box to blit.
+	 * @param right The x coord for the right edge of the box to blit.
+	 * @param bottom The y coord for the bottom edge of the box to blit.
+	 */
+	void BlitIndexedToView16(int left, int top, int right, int bottom);
+
+	inline void BlitToView(int left, int top, int right, int bottom);
+	void DrawResizeIcon();
+
+
+public:
+	WindowQuickdrawSubdriver(int bpp);
+	virtual ~WindowQuickdrawSubdriver();
+
+	virtual void Draw();
+	virtual void MakeDirty(int left, int top, int width, int height);
+	virtual void UpdatePalette(uint first_color, uint num_colors);
+
+	virtual uint ListModes(OTTDPoint* modes, uint max_modes);
+
+	virtual bool ChangeResolution(int w, int h);
+
+	virtual bool IsFullscreen() { return false; }
+
+	virtual int GetWidth() { return window_width; }
+	virtual int GetHeight() { return window_height; }
+	virtual void *GetPixelBuffer() { return pixel_buffer; }
+
+	/* Convert local coordinate to window server (CoreGraphics) coordinate */
+	virtual CGPoint PrivateLocalToCG(NSPoint* p);
+
+	virtual NSPoint GetMouseLocation(NSEvent *event);
+	virtual bool MouseIsInsideView(NSPoint *pt);
+
+	virtual bool IsActive() { return active; }
+
+
+	void SetPortAlphaOpaque();
+	bool WindowResized();
+};
+
+
+@implementation OTTD_QuickdrawWindow
+
+- (void)setDriver:(WindowQuickdrawSubdriver*)drv
+{
+	driver = drv;
+}
+
+
+/* we override these methods to fix the miniaturize animation/dock icon bug */
+- (void)miniaturize:(id)sender
+{
+	/* make the alpha channel opaque so anim won't have holes in it */
+	driver->SetPortAlphaOpaque ();
+
+	/* window is hidden now */
+	driver->active = false;
+
+	QZ_ShowMouse();
+
+	[ super miniaturize:sender ];
+}
+
+- (void)display
+{
+	/* This method fires just before the window deminaturizes from the Dock.
+	 * We'll save the current visible surface, let the window manager redraw any
+	 * UI elements, and restore the surface. This way, no expose event
+	 * is required, and the deminiaturize works perfectly.
+	 */
+
+	driver->SetPortAlphaOpaque();
+
+	/* save current visible surface */
+	[ self cacheImageInRect:[ driver->qdview frame ] ];
+
+	/* let the window manager redraw controls, border, etc */
+	[ super display ];
+
+	/* restore visible surface */
+	[ self restoreCachedImage ];
+
+	/* window is visible again */
+	driver->active = true;
+}
+
+- (void)setFrame:(NSRect)frameRect display:(BOOL)flag
+{
+	[ super setFrame:frameRect display:flag ];
+
+	/* Don't do anything if the window is currently being created */
+	if (driver->setup) return;
+
+	if (!driver->WindowResized())
+		error("Cocoa: Failed to resize window.");
+}
+
+- (void)appDidHide:(NSNotification*)note
+{
+	driver->active = false;
+}
+
+
+- (void)appWillUnhide:(NSNotification*)note
+{
+	driver->SetPortAlphaOpaque ();
+
+	/* save current visible surface */
+	[ self cacheImageInRect:[ driver->qdview frame ] ];
+}
+
+- (void)appDidUnhide:(NSNotification*)note
+{
+	/* restore cached image, since it may not be current, post expose event too */
+	[ self restoreCachedImage ];
+
+	driver->active = true;
+}
+
+
+- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag
+{
+	/* Make our window subclass receive these application notifications */
+	[ [ NSNotificationCenter defaultCenter ] addObserver:self
+	selector:@selector(appDidHide:) name:NSApplicationDidHideNotification object:NSApp ];
+
+	[ [ NSNotificationCenter defaultCenter ] addObserver:self
+	selector:@selector(appDidUnhide:) name:NSApplicationDidUnhideNotification object:NSApp ];
+
+	[ [ NSNotificationCenter defaultCenter ] addObserver:self
+	selector:@selector(appWillUnhide:) name:NSApplicationWillUnhideNotification object:NSApp ];
+
+	return [ super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag ];
+}
+
+@end
+
+@implementation OTTD_QuickdrawWindowDelegate
+- (void)setDriver:(WindowQuickdrawSubdriver*)drv
+{
+	driver = drv;
+}
+
+- (BOOL)windowShouldClose:(id)sender
+{
+	HandleExitGameRequest();
+
+	return NO;
+}
+
+- (void)windowDidBecomeKey:(NSNotification*)aNotification
+{
+	driver->active = true;
+}
+
+- (void)windowDidResignKey:(NSNotification*)aNotification
+{
+	driver->active = false;
+}
+
+- (void)windowDidBecomeMain:(NSNotification*)aNotification
+{
+	driver->active = true;
+}
+
+- (void)windowDidResignMain:(NSNotification*)aNotification
+{
+	driver->active = false;
+}
+
+@end
+
+
+static const int _resize_icon_width  = 16;
+static const int _resize_icon_height = 16;
+
+static bool _resize_icon[] = {
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1,
+	0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
+	0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+	0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
+	0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1,
+	0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
+	0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+	1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0
+};
+
+
+
+extern const char _openttd_revision[];
+
+
+void WindowQuickdrawSubdriver::GetDeviceInfo()
+{
+	CFDictionaryRef    cur_mode;
+
+	/* Initialize the video settings; this data persists between mode switches */
+	cur_mode = CGDisplayCurrentMode(kCGDirectMainDisplay);
+
+	/* Gather some information that is useful to know about the display */
+	CFNumberGetValue(
+		(const __CFNumber*)CFDictionaryGetValue(cur_mode, kCGDisplayBitsPerPixel),
+		kCFNumberSInt32Type, &device_depth
+	);
+
+	CFNumberGetValue(
+		(const __CFNumber*)CFDictionaryGetValue(cur_mode, kCGDisplayWidth),
+		kCFNumberSInt32Type, &device_width
+	);
+
+	CFNumberGetValue(
+		(const __CFNumber*)CFDictionaryGetValue(cur_mode, kCGDisplayHeight),
+		kCFNumberSInt32Type, &device_height
+	);
+}
+
+bool WindowQuickdrawSubdriver::SetVideoMode(int width, int height)
+{
+	char caption[50];
+	NSString *nsscaption;
+	unsigned int style;
+	NSRect contentRect;
+	BOOL isCustom = NO;
+	bool ret;
+
+	setup = true;
+
+	GetDeviceInfo();
+
+	if (buffer_depth > device_depth) {
+		DEBUG(driver, 0, "Cannot use a blitter with a higer screen depth than the display when running in windowed mode.");
+		setup = false;
+		return false;
+	}
+
+	if (width > device_width)
+		width = device_width;
+	if (height > device_height)
+		height = device_height;
+
+	contentRect = NSMakeRect(0, 0, width, height);
+
+	/* Check if we should recreate the window */
+	if (window == nil) {
+		OTTD_QuickdrawWindowDelegate *delegate;
+
+		/* Set the window style */
+		style = NSTitledWindowMask;
+		style |= (NSMiniaturizableWindowMask | NSClosableWindowMask);
+		style |= NSResizableWindowMask;
+
+		/* Manually create a window, avoids having a nib file resource */
+		window = [ [ OTTD_QuickdrawWindow alloc ]
+						initWithContentRect:contentRect
+						styleMask:style
+						backing:NSBackingStoreBuffered
+						defer:NO ];
+
+		if (window == nil) {
+			DEBUG(driver, 0, "Could not create the Cocoa window.");
+			setup = false;
+			return false;
+		}
+
+		[ window setDriver:this ];
+
+		snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision);
+		nsscaption = [ [ NSString alloc ] initWithCString:caption ];
+		[ window setTitle:nsscaption ];
+		[ window setMiniwindowTitle:nsscaption ];
+		[ nsscaption release ];
+
+		[ window setAcceptsMouseMovedEvents:YES ];
+		[ window setViewsNeedDisplay:NO ];
+
+		delegate = [ [ OTTD_QuickdrawWindowDelegate alloc ] init ];
+		[ delegate setDriver:this ];
+		[ window setDelegate: [ delegate autorelease ] ];
+	} else {
+		/* We already have a window, just change its size */
+		if (!isCustom) {
+			[ window setContentSize:contentRect.size ];
+			// Ensure frame height - title bar height >= view height
+			contentRect.size.height = Clamp(height, 0, [ window frame ].size.height - 22 /* 22 is the height of title bar of window*/);
+			height = contentRect.size.height;
+			[ qdview setFrameSize:contentRect.size ];
+		}
+	}
+
+	// Update again
+	window_width = width;
+	window_height = height;
+
+	[ window center ];
+
+	/* Only recreate the view if it doesn't already exist */
+	if (qdview == nil) {
+		qdview = [ [ NSQuickDrawView alloc ] initWithFrame:contentRect ];
+		if (qdview == nil) {
+			DEBUG(driver, 0, "Could not create the Quickdraw view.");
+			setup = false;
+			return false;
+		}
+
+		[ qdview setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable ];
+		[ [ window contentView ] addSubview:qdview ];
+		[ qdview release ];
+		[ window makeKeyAndOrderFront:nil ];
+	}
+
+	ret = WindowResized();
+
+	UpdatePalette(0, 256);
+
+	setup = false;
+
+	return ret;
+}
+
+void WindowQuickdrawSubdriver::Blit32ToView32(int left, int top, int right, int bottom)
+{
+	const uint32* src   = (uint32*)pixel_buffer;
+	uint32*       dst   = (uint32*)window_buffer;
+	uint          width = window_width;
+	uint          pitch = window_pitch / 4;
+	int y;
+
+
+	dst += top * pitch + left;
+	src += top * width + left;
+
+	for (y = top; y < bottom; y++, dst+= pitch, src+= width) {
+		memcpy(dst, src, (right - left) * 4);
+	}
+}
+
+void WindowQuickdrawSubdriver::BlitIndexedToView32(int left, int top, int right, int bottom)
+{
+	const uint32* pal   = palette32;
+	const uint8*  src   = (uint8*)pixel_buffer;
+	uint32*       dst   = (uint32*)window_buffer;
+	uint          width = window_width;
+	uint          pitch = window_pitch / 4;
+	int x;
+	int y;
+
+	for (y = top; y < bottom; y++) {
+		for (x = left; x < right; x++) {
+			dst[y * pitch + x] = pal[src[y * width + x]];
+		}
+	}
+}
+
+void WindowQuickdrawSubdriver::BlitIndexedToView16(int left, int top, int right, int bottom)
+{
+	const uint16* pal   = palette16;
+	const uint8*  src   = (uint8*)pixel_buffer;
+	uint16*       dst   = (uint16*)window_buffer;
+	uint          width = window_width;
+	uint          pitch = window_pitch / 2;
+	int x;
+	int y;
+
+	for (y = top; y < bottom; y++) {
+		for (x = left; x < right; x++) {
+			dst[y * pitch + x] = pal[src[y * width + x]];
+		}
+	}
+}
+
+
+inline void WindowQuickdrawSubdriver::BlitToView(int left, int top, int right, int bottom)
+{
+	switch (device_depth) {
+		case 32:
+			switch(buffer_depth) {
+				case 32:
+					Blit32ToView32(left, top, right, bottom);
+					break;
+				case 8:
+					BlitIndexedToView32(left, top, right, bottom);
+					break;
+			}
+			break;
+		case 16:
+			BlitIndexedToView16(left, top, right, bottom);
+			break;
+	}
+}
+
+void WindowQuickdrawSubdriver::DrawResizeIcon()
+{
+	int xoff = window_width - _resize_icon_width;
+	int yoff = window_height - _resize_icon_height;
+	int x;
+	int y;
+
+	switch (device_depth) {
+		case 32:
+			for (y = 0; y < _resize_icon_height; y++) {
+				uint32* trg = (uint32*)window_buffer + (yoff + y) * window_pitch / 4 + xoff;
+
+				for (x = 0; x < _resize_icon_width; x++, trg++) {
+					if (_resize_icon[y * _resize_icon_width + x]) *trg = 0xff000000;
+				}
+			}
+			break;
+		case 16:
+			for (y = 0; y < _resize_icon_height; y++) {
+				uint16* trg = (uint16*)window_buffer + (yoff + y) * window_pitch / 2 + xoff;
+
+				for (x = 0; x < _resize_icon_width; x++, trg++) {
+					if (_resize_icon[y * _resize_icon_width + x]) *trg = 0x0000;
+				}
+			}
+			break;
+	}
+}
+
+
+WindowQuickdrawSubdriver::WindowQuickdrawSubdriver(int bpp)
+{
+	window_width  = 0;
+	window_height = 0;
+	buffer_depth  = bpp;
+	pixel_buffer  = NULL;
+	active        = false;
+	setup         = false;
+
+	window = nil;
+	qdview = nil;
+
+	num_dirty_rects = MAX_DIRTY_RECTS;
+}
+
+WindowQuickdrawSubdriver::~WindowQuickdrawSubdriver()
+{
+	QZ_ShowMouse();
+
+	/* Release window mode resources */
+	if (window != nil) [ window close ];
+
+	free(pixel_buffer);
+}
+
+void WindowQuickdrawSubdriver::Draw()
+{
+	int i;
+	RgnHandle dirty, temp;
+
+	/* Check if we need to do anything */
+	if (num_dirty_rects == 0 ||
+		[ window isMiniaturized ]) {
+		return;
+	}
+
+	if (num_dirty_rects >= MAX_DIRTY_RECTS) {
+		num_dirty_rects = 1;
+		dirty_rects[0].left = 0;
+		dirty_rects[0].top = 0;
+		dirty_rects[0].right = window_width;
+		dirty_rects[0].bottom = window_height;
+	}
+
+	dirty = NewRgn();
+	temp  = NewRgn();
+
+	SetEmptyRgn(dirty);
+
+	/* Build the region of dirty rectangles */
+	for (i = 0; i < num_dirty_rects; i++) {
+		BlitToView(
+			dirty_rects[i].left,
+			dirty_rects[i].top,
+			dirty_rects[i].right,
+			dirty_rects[i].bottom
+		);
+
+		MacSetRectRgn(
+			temp,
+			dirty_rects[i].left,
+			dirty_rects[i].top,
+			dirty_rects[i].right,
+			dirty_rects[i].bottom
+		);
+		MacUnionRgn(dirty, temp, dirty);
+	}
+
+	DrawResizeIcon();
+
+	/* Flush the dirty region */
+	QDFlushPortBuffer( (OpaqueGrafPtr*) [ qdview qdPort ], dirty);
+	DisposeRgn(dirty);
+	DisposeRgn(temp);
+
+	num_dirty_rects = 0;
+}
+
+void WindowQuickdrawSubdriver::MakeDirty(int left, int top, int width, int height)
+{
+	if (num_dirty_rects < MAX_DIRTY_RECTS) {
+		dirty_rects[num_dirty_rects].left = left;
+		dirty_rects[num_dirty_rects].top = top;
+		dirty_rects[num_dirty_rects].right = left + width;
+		dirty_rects[num_dirty_rects].bottom = top + height;
+	}
+	num_dirty_rects++;
+}
+
+void WindowQuickdrawSubdriver::UpdatePalette(uint first_color, uint num_colors)
+{
+	uint i;
+
+	if (buffer_depth != 8)
+		return;
+
+	switch (device_depth) {
+		case 32:
+			for (i = first_color; i < first_color + num_colors; i++) {
+				uint32 clr32 = 0xff000000;
+				clr32 |= (uint32)_cur_palette[i].r << 16;
+				clr32 |= (uint32)_cur_palette[i].g << 8;
+				clr32 |= (uint32)_cur_palette[i].b;
+				palette32[i] = clr32;
+			}
+			break;
+		case 16:
+			for (i = first_color; i < first_color + num_colors; i++) {
+				uint16 clr16 = 0x0000;
+				clr16 |= (uint16)((_cur_palette[i].r >> 3) & 0x1f) << 10;
+				clr16 |= (uint16)((_cur_palette[i].g >> 3) & 0x1f) << 5;
+				clr16 |= (uint16)((_cur_palette[i].b >> 3) & 0x1f);
+				palette16[i] = clr16;
+			}
+			break;
+	}
+
+	num_dirty_rects = MAX_DIRTY_RECTS;
+}
+
+uint WindowQuickdrawSubdriver::ListModes(OTTDPoint* modes, uint max_modes)
+{
+	if (max_modes == 0) return 0;
+
+	modes[0].x = window_width;
+	modes[0].y = window_height;
+
+	return 1;
+}
+
+bool WindowQuickdrawSubdriver::ChangeResolution(int w, int h)
+{
+	int old_width  = window_width;
+	int old_height = window_height;
+
+	if (SetVideoMode(w, h))
+		return true;
+
+	if (old_width != 0 && old_height != 0)
+		SetVideoMode(old_width, old_height);
+
+	return false;
+}
+
+/* Convert local coordinate to window server (CoreGraphics) coordinate */
+CGPoint WindowQuickdrawSubdriver::PrivateLocalToCG(NSPoint* p)
+{
+	CGPoint cgp;
+
+	*p = [ qdview convertPoint:*p toView: nil ];
+	*p = [ window convertBaseToScreen:*p ];
+	p->y = device_height - p->y;
+
+	cgp.x = p->x;
+	cgp.y = p->y;
+
+	return cgp;
+}
+
+NSPoint WindowQuickdrawSubdriver::GetMouseLocation(NSEvent *event)
+{
+	NSPoint pt;
+
+	pt = [ event locationInWindow ];
+	pt = [ qdview convertPoint:pt fromView:nil ];
+
+	return pt;
+}
+
+bool WindowQuickdrawSubdriver::MouseIsInsideView(NSPoint *pt)
+{
+	return [ qdview mouse:*pt inRect:[ qdview bounds ] ];
+}
+
+
+/* This function makes the *game region* of the window 100% opaque.
+ * The genie effect uses the alpha component. Otherwise,
+ * it doesn't seem to matter what value it has.
+ */
+void WindowQuickdrawSubdriver::SetPortAlphaOpaque()
+{
+	if (device_depth != 32)
+		return;
+
+	uint32* pixels = (uint32*)window_buffer;
+	uint32  pitch  = window_pitch / 4;
+	int x, y;
+
+	for (y = 0; y < window_height; y++)
+		for (x = 0; x < window_width; x++) {
+		pixels[y * pitch + x] |= 0xFF000000;
+	}
+}
+
+bool WindowQuickdrawSubdriver::WindowResized()
+{
+	if (window == nil || qdview == nil) return true;
+
+	NSRect   newframe = [ qdview frame ];
+	CGrafPtr thePort  = (OpaqueGrafPtr*) [ qdview qdPort ];
+	int voff, hoff;
+
+	LockPortBits(thePort);
+	window_buffer = GetPixBaseAddr(GetPortPixMap(thePort));
+	window_pitch = GetPixRowBytes(GetPortPixMap(thePort));
+	UnlockPortBits(thePort);
+
+	/* _cocoa_video_data.realpixels now points to the window's pixels
+	 * We want it to point to the *view's* pixels
+	 */
+	voff = [ window frame ].size.height - newframe.size.height - newframe.origin.y;
+	hoff = [ qdview frame ].origin.x;
+	window_buffer = (uint8*)window_buffer + (voff * window_pitch) + hoff * (device_depth / 8);
+
+	window_width = newframe.size.width;
+	window_height = newframe.size.height;
+
+	free(pixel_buffer);
+	pixel_buffer = malloc(window_width * window_height * buffer_depth / 8);
+	if (pixel_buffer == NULL) {
+		DEBUG(driver, 0, "Failed to allocate pixel buffer");
+		return false;
+	}
+
+	QZ_GameSizeChanged();
+
+	/* Redraw screen */
+	num_dirty_rects = MAX_DIRTY_RECTS;
+
+	return true;
+}
+
+
+CocoaSubdriver *QZ_CreateWindowQuickdrawSubdriver(int width, int height, int bpp)
+{
+	WindowQuickdrawSubdriver *ret;
+
+	if (MacOSVersionIsAtLeast(10, 4, 0)) {
+		DEBUG(driver, 0, "The cocoa quickdraw subdriver is not recommended for Mac OS X 10.4 or later.");
+	}
+
+	if (bpp != 8 && bpp != 32) {
+		DEBUG(driver, 0, "The cocoa quickdraw subdriver only supports 8 and 32 bpp.");
+		return NULL;
+	}
+
+	ret = new WindowQuickdrawSubdriver(bpp);
+
+	if (!ret->ChangeResolution(width, height)) {
+		delete ret;
+		return NULL;
+	}
+
+	return ret;
+}
+
+#endif /* WITH_COCOA */
--- a/src/video/cocoa_keys.h	Sat Oct 06 21:16:00 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-/* $Id$ */
-
-#ifndef COCOA_KEYS_H
-#define COCOA_KEYS_H
-
-/* From SDL_QuartzKeys.h */
-/* These are the Macintosh key scancode constants -- from Inside Macintosh */
-
-#define QZ_ESCAPE       0x35
-#define QZ_F1           0x7A
-#define QZ_F2           0x78
-#define QZ_F3           0x63
-#define QZ_F4           0x76
-#define QZ_F5           0x60
-#define QZ_F6           0x61
-#define QZ_F7           0x62
-#define QZ_F8           0x64
-#define QZ_F9           0x65
-#define QZ_F10          0x6D
-#define QZ_F11          0x67
-#define QZ_F12          0x6F
-#define QZ_PRINT        0x69
-#define QZ_SCROLLOCK    0x6B
-#define QZ_PAUSE        0x71
-#define QZ_POWER        0x7F
-#define QZ_BACKQUOTE    0x0A
-#define QZ_BACKQUOTE2   0x32
-#define QZ_1            0x12
-#define QZ_2            0x13
-#define QZ_3            0x14
-#define QZ_4            0x15
-#define QZ_5            0x17
-#define QZ_6            0x16
-#define QZ_7            0x1A
-#define QZ_8            0x1C
-#define QZ_9            0x19
-#define QZ_0            0x1D
-#define QZ_MINUS        0x1B
-#define QZ_EQUALS       0x18
-#define QZ_BACKSPACE    0x33
-#define QZ_INSERT       0x72
-#define QZ_HOME         0x73
-#define QZ_PAGEUP       0x74
-#define QZ_NUMLOCK      0x47
-#define QZ_KP_EQUALS    0x51
-#define QZ_KP_DIVIDE    0x4B
-#define QZ_KP_MULTIPLY  0x43
-#define QZ_TAB          0x30
-#define QZ_q            0x0C
-#define QZ_w            0x0D
-#define QZ_e            0x0E
-#define QZ_r            0x0F
-#define QZ_t            0x11
-#define QZ_y            0x10
-#define QZ_u            0x20
-#define QZ_i            0x22
-#define QZ_o            0x1F
-#define QZ_p            0x23
-#define QZ_LEFTBRACKET  0x21
-#define QZ_RIGHTBRACKET 0x1E
-#define QZ_BACKSLASH    0x2A
-#define QZ_DELETE       0x75
-#define QZ_END          0x77
-#define QZ_PAGEDOWN     0x79
-#define QZ_KP7          0x59
-#define QZ_KP8          0x5B
-#define QZ_KP9          0x5C
-#define QZ_KP_MINUS     0x4E
-#define QZ_CAPSLOCK     0x39
-#define QZ_a            0x00
-#define QZ_s            0x01
-#define QZ_d            0x02
-#define QZ_f            0x03
-#define QZ_g            0x05
-#define QZ_h            0x04
-#define QZ_j            0x26
-#define QZ_k            0x28
-#define QZ_l            0x25
-#define QZ_SEMICOLON    0x29
-#define QZ_QUOTE        0x27
-#define QZ_RETURN       0x24
-#define QZ_KP4          0x56
-#define QZ_KP5          0x57
-#define QZ_KP6          0x58
-#define QZ_KP_PLUS      0x45
-#define QZ_LSHIFT       0x38
-#define QZ_z            0x06
-#define QZ_x            0x07
-#define QZ_c            0x08
-#define QZ_v            0x09
-#define QZ_b            0x0B
-#define QZ_n            0x2D
-#define QZ_m            0x2E
-#define QZ_COMMA        0x2B
-#define QZ_PERIOD       0x2F
-#define QZ_SLASH        0x2C
-#if 1        /* Panther now defines right side keys */
-#define QZ_RSHIFT       0x3C
-#endif
-#define QZ_UP           0x7E
-#define QZ_KP1          0x53
-#define QZ_KP2          0x54
-#define QZ_KP3          0x55
-#define QZ_KP_ENTER     0x4C
-#define QZ_LCTRL        0x3B
-#define QZ_LALT         0x3A
-#define QZ_LMETA        0x37
-#define QZ_SPACE        0x31
-#if 1        /* Panther now defines right side keys */
-#define QZ_RMETA        0x36
-#define QZ_RALT         0x3D
-#define QZ_RCTRL        0x3E
-#endif
-#define QZ_LEFT         0x7B
-#define QZ_DOWN         0x7D
-#define QZ_RIGHT        0x7C
-#define QZ_KP0          0x52
-#define QZ_KP_PERIOD    0x41
-
-/* Wierd, these keys are on my iBook under MacOS X */
-#define QZ_IBOOK_ENTER  0x34
-#define QZ_IBOOK_LEFT   0x3B
-#define QZ_IBOOK_RIGHT  0x3C
-#define QZ_IBOOK_DOWN   0x3D
-#define QZ_IBOOK_UP     0x3E
-
-#endif
--- a/src/video/cocoa_v.h	Sat Oct 06 21:16:00 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/* $Id$ */
-
-#ifndef VIDEO_COCOA_H
-#define VIDEO_COCOA_H
-
-#include "video_driver.hpp"
-
-class VideoDriver_Cocoa: public VideoDriver {
-public:
-	/* virtual */ const char *Start(const char * const *param);
-
-	/* virtual */ void Stop();
-
-	/* virtual */ void MakeDirty(int left, int top, int width, int height);
-
-	/* virtual */ void MainLoop();
-
-	/* virtual */ bool ChangeResolution(int w, int h);
-
-	/* virtual */ void ToggleFullscreen(bool fullscreen);
-};
-
-class FVideoDriver_Cocoa: public VideoDriverFactory<FVideoDriver_Cocoa> {
-public:
-	static const int priority = 10;
-	/* virtual */ const char *GetName() { return "cocoa"; }
-	/* virtual */ const char *GetDescription() { return "Cocoa Video Driver"; }
-	/* virtual */ Driver *CreateInstance() { return new VideoDriver_Cocoa(); }
-};
-
-#endif /* VIDEO_COCOA_H */
--- a/src/video/cocoa_v.mm	Sat Oct 06 21:16:00 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2124 +0,0 @@
-/* $Id$ */
-
-/******************************************************************************
- *                             Cocoa video driver                             *
- * Known things left to do:                                                   *
- *  Nothing at the moment.                                                    *
- ******************************************************************************/
-
-#ifdef WITH_COCOA
-
-#include <AvailabilityMacros.h>
-#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
-/* On 10.4, we get tons of warnings that the QuickDraw functions are deprecated.
- *  We know that. Don't keep bugging us about that. */
-#	undef AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4
-#	define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4 AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER
-#endif
-
-#import <Cocoa/Cocoa.h>
-#import <sys/time.h> /* gettimeofday */
-#import <sys/param.h> /* for MAXPATHLEN */
-#import <unistd.h>
-
-/**
- * Important notice regarding all modifications!!!!!!!
- * There are certain limitations because the file is objective C++.
- * gdb has limitations.
- * C++ and objective C code can't be joined in all cases (classes stuff).
- * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information.
- */
-
-
-/* Portions of CPS.h */
-struct CPSProcessSerNum {
-	UInt32 lo;
-	UInt32 hi;
-};
-
-extern "C" OSErr CPSGetCurrentProcess(CPSProcessSerNum* psn);
-extern "C" OSErr CPSEnableForegroundOperation(CPSProcessSerNum* psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5);
-extern "C" OSErr CPSSetFrontProcess(CPSProcessSerNum* psn);
-
-/* From Menus.h (according to Xcode Developer Documentation) */
-extern "C" void ShowMenuBar();
-extern "C" void HideMenuBar();
-
-/* Disables a warning. This is needed since the method exists but has been dropped from the header, supposedly as of 10.4. */
-#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
-@interface NSApplication(NSAppleMenu)
-- (void)setAppleMenu:(NSMenu *)menu;
-@end
-#endif
-
-
-/* Defined in ppc/param.h or i386/param.h included from sys/param.h */
-#undef ALIGN
-/* Defined in stdbool.h */
-#ifndef __cplusplus
-# ifndef __BEOS__
-#  undef bool
-#  undef false
-#  undef true
-# endif
-#endif
-
-
-#include "../stdafx.h"
-#include "../openttd.h"
-#include "../debug.h"
-#include "../macros.h"
-#include "../os/macosx/splash.h"
-#include "../variables.h"
-#include "../gfx.h"
-#include "cocoa_v.h"
-#include "cocoa_keys.h"
-#include "../blitter/factory.hpp"
-#include "../fileio.h"
-
-#undef Point
-#undef Rect
-
-/* Right Mouse Button Emulation enum */
-enum {
-	RMBE_COMMAND,
-	RMBE_CONTROL,
-	RMBE_OFF,
-};
-
-
-/* Subclass of NSWindow to fix genie effect and support resize events  */
-@interface OTTD_QuartzWindow : NSWindow
-- (void)miniaturize:(id)sender;
-- (void)display;
-- (void)setFrame:(NSRect)frameRect display:(BOOL)flag;
-- (void)appDidHide:(NSNotification*)note;
-- (void)appWillUnhide:(NSNotification*)note;
-- (void)appDidUnhide:(NSNotification*)note;
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag;
-@end
-
-/* Delegate for our NSWindow to send ask for quit on close */
-@interface OTTD_QuartzWindowDelegate : NSObject
-- (BOOL)windowShouldClose:(id)sender;
-@end
-
-@interface OTTDMain : NSObject
-@end
-
-
-/* Structure for rez switch gamma fades
- * We can hide the monitor flicker by setting the gamma tables to 0
- */
-#define QZ_GAMMA_TABLE_SIZE 256
-
-struct OTTD_QuartzGammaTable {
-	CGGammaValue red[QZ_GAMMA_TABLE_SIZE];
-	CGGammaValue green[QZ_GAMMA_TABLE_SIZE];
-	CGGammaValue blue[QZ_GAMMA_TABLE_SIZE];
-};
-
-/* Add methods to get at private members of NSScreen.
- * Since there is a bug in Apple's screen switching code that does not update
- * this variable when switching to fullscreen, we'll set it manually (but only
- * for the main screen).
- */
-@interface NSScreen (NSScreenAccess)
-	- (void) setFrame:(NSRect)frame;
-@end
-
-@implementation NSScreen (NSScreenAccess)
-- (void) setFrame:(NSRect)frame;
-{
-	_frame = frame;
-}
-@end
-
-
-static void QZ_Draw();
-static void QZ_UnsetVideoMode();
-static void QZ_UpdatePalette(uint start, uint count);
-static void QZ_WarpCursor(int x, int y);
-static void QZ_ShowMouse();
-static void QZ_HideMouse();
-
-
-static NSAutoreleasePool *_ottd_autorelease_pool;
-static OTTDMain *_ottd_main;
-
-
-static struct CocoaVideoData {
-	bool isset;
-	bool issetting;
-
-	CGDirectDisplayID  display_id;         /* 0 == main display (only support single display) */
-	CFDictionaryRef    mode;               /* current mode of the display */
-	CFDictionaryRef    save_mode;          /* original mode of the display */
-	CFArrayRef         mode_list;          /* list of available fullscreen modes */
-	CGDirectPaletteRef palette;            /* palette of an 8-bit display */
-
-	uint32 device_width;
-	uint32 device_height;
-	uint32 device_bpp;
-
-	void *realpixels;
-	uint8 *pixels;
-	uint32 width;
-	uint32 height;
-	uint32 pitch;
-	bool fullscreen;
-
-	unsigned int current_mods;
-	bool tab_is_down;
-	bool emulating_right_button;
-
-	bool cursor_visible;
-	bool active;
-
-#ifdef _DEBUG
-	uint32 tEvent;
-#endif
-
-	OTTD_QuartzWindow *window;
-	NSQuickDrawView *qdview;
-
-#define MAX_DIRTY_RECTS 100
-	Rect dirty_rects[MAX_DIRTY_RECTS];
-	int num_dirty_rects;
-
-	uint16 palette16[256];
-	uint32 palette32[256];
-} _cocoa_video_data;
-
-static bool _cocoa_video_started = false;
-static bool _cocoa_video_dialog = false;
-
-
-
-
-/******************************************************************************
- *                             Game loop and accessories                      *
- ******************************************************************************/
-
-static uint32 GetTick()
-{
-	struct timeval tim;
-
-	gettimeofday(&tim, NULL);
-	return tim.tv_usec / 1000 + tim.tv_sec * 1000;
-}
-
-static void QZ_CheckPaletteAnim()
-{
-	if (_pal_count_dirty != 0) {
-		Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
-
-		switch (blitter->UsePaletteAnimation()) {
-			case Blitter::PALETTE_ANIMATION_VIDEO_BACKEND:
-				QZ_UpdatePalette(_pal_first_dirty, _pal_count_dirty);
-				break;
-
-			case Blitter::PALETTE_ANIMATION_BLITTER:
-				blitter->PaletteAnimate(_pal_first_dirty, _pal_count_dirty);
-				break;
-
-			case Blitter::PALETTE_ANIMATION_NONE:
-				break;
-
-			default:
-				NOT_REACHED();
-		}
-		_pal_count_dirty = 0;
-	}
-}
-
-
-
-struct VkMapping {
-	unsigned short vk_from;
-	byte map_to;
-};
-
-#define AS(x, z) {x, z}
-
-static const VkMapping _vk_mapping[] = {
-	AS(QZ_BACKQUOTE,  WKC_BACKQUOTE), // key left of '1'
-	AS(QZ_BACKQUOTE2, WKC_BACKQUOTE), // some keyboards have it on another scancode
-
-	/* Pageup stuff + up/down */
-	AS(QZ_PAGEUP,   WKC_PAGEUP),
-	AS(QZ_PAGEDOWN, WKC_PAGEDOWN),
-
-	AS(QZ_UP,    WKC_UP),
-	AS(QZ_DOWN,  WKC_DOWN),
-	AS(QZ_LEFT,  WKC_LEFT),
-	AS(QZ_RIGHT, WKC_RIGHT),
-
-	AS(QZ_HOME, WKC_HOME),
-	AS(QZ_END,  WKC_END),
-
-	AS(QZ_INSERT, WKC_INSERT),
-	AS(QZ_DELETE, WKC_DELETE),
-
-	/* Letters. QZ_[a-z] is not in numerical order so we can't use AM(...) */
-	AS(QZ_a, 'A'),
-	AS(QZ_b, 'B'),
-	AS(QZ_c, 'C'),
-	AS(QZ_d, 'D'),
-	AS(QZ_e, 'E'),
-	AS(QZ_f, 'F'),
-	AS(QZ_g, 'G'),
-	AS(QZ_h, 'H'),
-	AS(QZ_i, 'I'),
-	AS(QZ_j, 'J'),
-	AS(QZ_k, 'K'),
-	AS(QZ_l, 'L'),
-	AS(QZ_m, 'M'),
-	AS(QZ_n, 'N'),
-	AS(QZ_o, 'O'),
-	AS(QZ_p, 'P'),
-	AS(QZ_q, 'Q'),
-	AS(QZ_r, 'R'),
-	AS(QZ_s, 'S'),
-	AS(QZ_t, 'T'),
-	AS(QZ_u, 'U'),
-	AS(QZ_v, 'V'),
-	AS(QZ_w, 'W'),
-	AS(QZ_x, 'X'),
-	AS(QZ_y, 'Y'),
-	AS(QZ_z, 'Z'),
-	/* Same thing for digits */
-	AS(QZ_0, '0'),
-	AS(QZ_1, '1'),
-	AS(QZ_2, '2'),
-	AS(QZ_3, '3'),
-	AS(QZ_4, '4'),
-	AS(QZ_5, '5'),
-	AS(QZ_6, '6'),
-	AS(QZ_7, '7'),
-	AS(QZ_8, '8'),
-	AS(QZ_9, '9'),
-
-	AS(QZ_ESCAPE,    WKC_ESC),
-	AS(QZ_PAUSE,     WKC_PAUSE),
-	AS(QZ_BACKSPACE, WKC_BACKSPACE),
-
-	AS(QZ_SPACE,  WKC_SPACE),
-	AS(QZ_RETURN, WKC_RETURN),
-	AS(QZ_TAB,    WKC_TAB),
-
-	/* Function keys */
-	AS(QZ_F1,  WKC_F1),
-	AS(QZ_F2,  WKC_F2),
-	AS(QZ_F3,  WKC_F3),
-	AS(QZ_F4,  WKC_F4),
-	AS(QZ_F5,  WKC_F5),
-	AS(QZ_F6,  WKC_F6),
-	AS(QZ_F7,  WKC_F7),
-	AS(QZ_F8,  WKC_F8),
-	AS(QZ_F9,  WKC_F9),
-	AS(QZ_F10, WKC_F10),
-	AS(QZ_F11, WKC_F11),
-	AS(QZ_F12, WKC_F12),
-
-	/* Numeric part */
-	AS(QZ_KP0,         WKC_NUM_0),
-	AS(QZ_KP1,         WKC_NUM_1),
-	AS(QZ_KP2,         WKC_NUM_2),
-	AS(QZ_KP3,         WKC_NUM_3),
-	AS(QZ_KP4,         WKC_NUM_4),
-	AS(QZ_KP5,         WKC_NUM_5),
-	AS(QZ_KP6,         WKC_NUM_6),
-	AS(QZ_KP7,         WKC_NUM_7),
-	AS(QZ_KP8,         WKC_NUM_8),
-	AS(QZ_KP9,         WKC_NUM_9),
-	AS(QZ_KP_DIVIDE,   WKC_NUM_DIV),
-	AS(QZ_KP_MULTIPLY, WKC_NUM_MUL),
-	AS(QZ_KP_MINUS,    WKC_NUM_MINUS),
-	AS(QZ_KP_PLUS,     WKC_NUM_PLUS),
-	AS(QZ_KP_ENTER,    WKC_NUM_ENTER),
-	AS(QZ_KP_PERIOD,   WKC_NUM_DECIMAL),
-
-	/* Other non-letter keys */
-	AS(QZ_SLASH,        WKC_SLASH),
-	AS(QZ_SEMICOLON,    WKC_SEMICOLON),
-	AS(QZ_EQUALS,       WKC_EQUALS),
-	AS(QZ_LEFTBRACKET,  WKC_L_BRACKET),
-	AS(QZ_BACKSLASH,    WKC_BACKSLASH),
-	AS(QZ_RIGHTBRACKET, WKC_R_BRACKET),
-
-	AS(QZ_QUOTE,   WKC_SINGLEQUOTE),
-	AS(QZ_COMMA,   WKC_COMMA),
-	AS(QZ_MINUS,   WKC_MINUS),
-	AS(QZ_PERIOD,  WKC_PERIOD)
-};
-
-
-static uint32 QZ_MapKey(unsigned short sym)
-{
-	const VkMapping *map;
-	uint32 key = 0;
-
-	for (map = _vk_mapping; map != endof(_vk_mapping); ++map) {
-		if (sym == map->vk_from) {
-			key = map->map_to;
-			break;
-		}
-	}
-
-	if (_cocoa_video_data.current_mods & NSShiftKeyMask)     key |= WKC_SHIFT;
-	if (_cocoa_video_data.current_mods & NSControlKeyMask)   key |= (_patches.right_mouse_btn_emulation != RMBE_CONTROL ? WKC_CTRL : WKC_META);
-	if (_cocoa_video_data.current_mods & NSAlternateKeyMask) key |= WKC_ALT;
-	if (_cocoa_video_data.current_mods & NSCommandKeyMask)   key |= (_patches.right_mouse_btn_emulation != RMBE_CONTROL ? WKC_META : WKC_CTRL);
-
-	return key << 16;
-}
-
-static void QZ_KeyEvent(unsigned short keycode, unsigned short unicode, BOOL down)
-{
-	switch (keycode) {
-		case QZ_UP:    SB(_dirkeys, 1, 1, down); break;
-		case QZ_DOWN:  SB(_dirkeys, 3, 1, down); break;
-		case QZ_LEFT:  SB(_dirkeys, 0, 1, down); break;
-		case QZ_RIGHT: SB(_dirkeys, 2, 1, down); break;
-
-		case QZ_TAB: _cocoa_video_data.tab_is_down = down; break;
-
-		case QZ_RETURN:
-		case QZ_f:
-			if (down && (_cocoa_video_data.current_mods & NSCommandKeyMask)) {
-				_video_driver->ToggleFullscreen(!_fullscreen);
-			}
-			break;
-	}
-
-	if (down) {
-		uint32 pressed_key = QZ_MapKey(keycode) | unicode;
-		HandleKeypress(pressed_key);
-		DEBUG(driver, 2, "cocoa_v: QZ_KeyEvent: %x (%x), down, mapping: %x", keycode, unicode, pressed_key);
-	} else {
-		DEBUG(driver, 2, "cocoa_v: QZ_KeyEvent: %x (%x), up", keycode, unicode);
-	}
-}
-
-static void QZ_DoUnsidedModifiers(unsigned int newMods)
-{
-	const int mapping[] = { QZ_CAPSLOCK, QZ_LSHIFT, QZ_LCTRL, QZ_LALT, QZ_LMETA };
-
-	int i;
-	unsigned int bit;
-
-	if (_cocoa_video_data.current_mods == newMods) return;
-
-	/* Iterate through the bits, testing each against the current modifiers */
-	for (i = 0, bit = NSAlphaShiftKeyMask; bit <= NSCommandKeyMask; bit <<= 1, ++i) {
-		unsigned int currentMask, newMask;
-
-		currentMask = _cocoa_video_data.current_mods & bit;
-		newMask     = newMods & bit;
-
-		if (currentMask && currentMask != newMask) { /* modifier up event */
-			/* If this was Caps Lock, we need some additional voodoo to make SDL happy (is this needed in ottd?) */
-			if (bit == NSAlphaShiftKeyMask) QZ_KeyEvent(mapping[i], 0, YES);
-			QZ_KeyEvent(mapping[i], 0, NO);
-		} else if (newMask && currentMask != newMask) { /* modifier down event */
-			QZ_KeyEvent(mapping[i], 0, YES);
-			/* If this was Caps Lock, we need some additional voodoo to make SDL happy (is this needed in ottd?) */
-			if (bit == NSAlphaShiftKeyMask) QZ_KeyEvent(mapping[i], 0, NO);
-		}
-	}
-
-	_cocoa_video_data.current_mods = newMods;
-}
-
-static void QZ_MouseMovedEvent(int x, int y)
-{
-	if (_cursor.fix_at) {
-		int dx = x - _cursor.pos.x;
-		int dy = y - _cursor.pos.y;
-
-		if (dx != 0 || dy != 0) {
-			_cursor.delta.x += dx;
-			_cursor.delta.y += dy;
-
-			QZ_WarpCursor(_cursor.pos.x, _cursor.pos.y);
-		}
-	} else {
-		_cursor.delta.x = x - _cursor.pos.x;
-		_cursor.delta.y = y - _cursor.pos.y;
-		_cursor.pos.x = x;
-		_cursor.pos.y = y;
-		_cursor.dirty = true;
-	}
-	HandleMouseEvents();
-}
-
-
-static void QZ_MouseButtonEvent(int button, BOOL down)
-{
-	switch (button) {
-		case 0:
-			if (down) {
-				_left_button_down = true;
-			} else {
-				_left_button_down = false;
-				_left_button_clicked = false;
-			}
-			HandleMouseEvents();
-			break;
-
-		case 1:
-			if (down) {
-				_right_button_down = true;
-				_right_button_clicked = true;
-			} else {
-				_right_button_down = false;
-			}
-			HandleMouseEvents();
-			break;
-	}
-}
-
-
-static inline NSPoint QZ_GetMouseLocation(NSEvent *event)
-{
-	NSPoint pt;
-
-	if (_cocoa_video_data.fullscreen) {
-		pt = [ NSEvent mouseLocation ];
-		pt.y = _cocoa_video_data.height - pt.y;
-	} else {
-		pt = [event locationInWindow];
-		pt = [_cocoa_video_data.qdview convertPoint:pt fromView:nil];
-	}
-
-	return pt;
-}
-
-static bool QZ_MouseIsInsideView(NSPoint *pt)
-{
-	if (_cocoa_video_data.fullscreen) {
-		return pt->x >= 0 && pt->y >= 0 && pt->x < _cocoa_video_data.width && pt->y < _cocoa_video_data.height;
-	} else {
-		return [ _cocoa_video_data.qdview mouse:*pt inRect:[ _cocoa_video_data.qdview bounds ] ];
-	}
-}
-
-
-static bool QZ_PollEvent()
-{
-	NSEvent *event;
-	NSPoint pt;
-	NSString *chars;
-#ifdef _DEBUG
-	uint32 et0, et;
-#endif
-
-#ifdef _DEBUG
-	et0 = GetTick();
-#endif
-	event = [ NSApp nextEventMatchingMask:NSAnyEventMask
-			untilDate: [ NSDate distantPast ]
-			inMode: NSDefaultRunLoopMode dequeue:YES ];
-#ifdef _DEBUG
-	et = GetTick();
-	_cocoa_video_data.tEvent+= et - et0;
-#endif
-
-	if (event == nil) return false;
-	if (!_cocoa_video_data.active) {
-		QZ_ShowMouse();
-		[NSApp sendEvent:event];
-		return true;
-	}
-
-	QZ_DoUnsidedModifiers( [ event modifierFlags ] );
-
-	switch ([event type]) {
-		case NSMouseMoved:
-		case NSOtherMouseDragged:
-		case NSRightMouseDragged:
-		case NSLeftMouseDragged:
-			pt = QZ_GetMouseLocation(event);
-			if (!QZ_MouseIsInsideView(&pt) &&
-					!_cocoa_video_data.emulating_right_button) {
-				QZ_ShowMouse();
-				[NSApp sendEvent:event];
-				break;
-			}
-
-			QZ_HideMouse();
-			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
-			break;
-
-		case NSLeftMouseDown:
-		{
-			uint32 keymask = 0;
-			if (_patches.right_mouse_btn_emulation == RMBE_COMMAND) keymask |= NSCommandKeyMask;
-			if (_patches.right_mouse_btn_emulation == RMBE_CONTROL) keymask |= NSControlKeyMask;
-
-			pt = QZ_GetMouseLocation(event);
-
-			if (!([ event modifierFlags ] & keymask) ||
-					!QZ_MouseIsInsideView(&pt)) {
-				[NSApp sendEvent:event];
-			}
-
-			if (!QZ_MouseIsInsideView(&pt)) {
-				QZ_ShowMouse();
-				break;
-			}
-
-			QZ_HideMouse();
-			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
-
-			/* Right mouse button emulation */
-			if ([ event modifierFlags ] & keymask) {
-				_cocoa_video_data.emulating_right_button = true;
-				QZ_MouseButtonEvent(1, YES);
-			} else {
-				QZ_MouseButtonEvent(0, YES);
-			}
-			break;
-		}
-		case NSLeftMouseUp:
-			[NSApp sendEvent:event];
-
-			pt = QZ_GetMouseLocation(event);
-			if (!QZ_MouseIsInsideView(&pt)) {
-				QZ_ShowMouse();
-				break;
-			}
-
-			QZ_HideMouse();
-			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
-
-			/* Right mouse button emulation */
-			if (_cocoa_video_data.emulating_right_button) {
-				_cocoa_video_data.emulating_right_button = false;
-				QZ_MouseButtonEvent(1, NO);
-			} else {
-				QZ_MouseButtonEvent(0, NO);
-			}
-			break;
-
-		case NSRightMouseDown:
-			pt = QZ_GetMouseLocation(event);
-			if (!QZ_MouseIsInsideView(&pt)) {
-				QZ_ShowMouse();
-				[NSApp sendEvent:event];
-				break;
-			}
-
-			QZ_HideMouse();
-			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
-			QZ_MouseButtonEvent(1, YES);
-			break;
-
-		case NSRightMouseUp:
-			pt = QZ_GetMouseLocation(event);
-			if (!QZ_MouseIsInsideView(&pt)) {
-				QZ_ShowMouse();
-				[NSApp sendEvent:event];
-				break;
-			}
-
-			QZ_HideMouse();
-			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
-			QZ_MouseButtonEvent(1, NO);
-			break;
-
-#if 0
-		/* This is not needed since openttd currently only use two buttons */
-		case NSOtherMouseDown:
-			pt = QZ_GetMouseLocation(event);
-			if (!QZ_MouseIsInsideView(&pt)) {
-				QZ_ShowMouse();
-				[NSApp sendEvent:event];
-				break;
-			}
-
-			QZ_HideMouse();
-			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
-			QZ_MouseButtonEvent([ event buttonNumber ], YES);
-			break;
-
-		case NSOtherMouseUp:
-			pt = QZ_GetMouseLocation(event);
-			if (!QZ_MouseIsInsideView(&pt)) {
-				QZ_ShowMouse();
-				[NSApp sendEvent:event];
-				break;
-			}
-
-			QZ_HideMouse();
-			QZ_MouseMovedEvent((int)pt.x, (int)pt.y);
-			QZ_MouseButtonEvent([ event buttonNumber ], NO);
-			break;
-#endif
-
-		case NSKeyDown:
-			/* Quit, hide and minimize */
-			switch ([event keyCode]) {
-				case QZ_q:
-				case QZ_h:
-				case QZ_m:
-					if ([ event modifierFlags ] & NSCommandKeyMask) {
-						[NSApp sendEvent:event];
-					}
-					break;
-			}
-
-			chars = [ event characters ];
-			QZ_KeyEvent([event keyCode], [ chars length ] ? [ chars characterAtIndex:0 ] : 0, YES);
-			break;
-
-		case NSKeyUp:
-			/* Quit, hide and minimize */
-			switch ([event keyCode]) {
-				case QZ_q:
-				case QZ_h:
-				case QZ_m:
-					if ([ event modifierFlags ] & NSCommandKeyMask) {
-						[NSApp sendEvent:event];
-					}
-					break;
-			}
-
-			chars = [ event characters ];
-			QZ_KeyEvent([event keyCode], [ chars length ] ? [ chars characterAtIndex:0 ] : 0, NO);
-			break;
-
-		case NSScrollWheel:
-			if ([ event deltaY ] > 0.0) { /* Scroll up */
-				_cursor.wheel--;
-			} else if ([ event deltaY ] < 0.0) { /* Scroll down */
-				_cursor.wheel++;
-			} /* else: deltaY was 0.0 and we don't want to do anything */
-
-			/* Set the scroll count for scrollwheel scrolling */
-			_cursor.h_wheel -= (int)([ event deltaX ]* 5 * _patches.scrollwheel_multiplier);
-			_cursor.v_wheel -= (int)([ event deltaY ]* 5 * _patches.scrollwheel_multiplier);
-			break;
-
-		default:
-			[NSApp sendEvent:event];
-	}
-
-	return true;
-}
-
-
-static void QZ_GameLoop()
-{
-	uint32 cur_ticks = GetTick();
-	uint32 last_cur_ticks = cur_ticks;
-	uint32 next_tick = cur_ticks + 30;
-	uint32 pal_tick = 0;
-#ifdef _DEBUG
-	uint32 et0, et, st0, st;
-#endif
-	int i;
-
-#ifdef _DEBUG
-	et0 = GetTick();
-	st = 0;
-#endif
-
-	_screen.dst_ptr = _cocoa_video_data.pixels;
-	DisplaySplashImage();
-	QZ_CheckPaletteAnim();
-	QZ_Draw();
-	CSleep(1);
-
-	for (i = 0; i < 2; i++) GameLoop();
-
-	_screen.dst_ptr = _cocoa_video_data.pixels;
-	UpdateWindows();
-	QZ_CheckPaletteAnim();
-	QZ_Draw();
-	CSleep(1);
-
-	for (;;) {
-		uint32 prev_cur_ticks = cur_ticks; // to check for wrapping
-		InteractiveRandom(); // randomness
-
-		while (QZ_PollEvent()) {}
-
-		if (_exit_game) break;
-
-#if defined(_DEBUG)
-		if (_cocoa_video_data.current_mods & NSShiftKeyMask)
-#else
-		if (_cocoa_video_data.tab_is_down)
-#endif
-		{
-			if (!_networking && _game_mode != GM_MENU) _fast_forward |= 2;
-		} else if (_fast_forward & 2) {
-			_fast_forward = 0;
-		}
-
-		cur_ticks = GetTick();
-		if (cur_ticks >= next_tick || (_fast_forward && !_pause_game) || cur_ticks < prev_cur_ticks) {
-			_realtime_tick += cur_ticks - last_cur_ticks;
-			last_cur_ticks = cur_ticks;
-			next_tick = cur_ticks + 30;
-
-			_ctrl_pressed = !!(_cocoa_video_data.current_mods & ( _patches.right_mouse_btn_emulation != RMBE_CONTROL ? NSControlKeyMask : NSCommandKeyMask));
-			_shift_pressed = !!(_cocoa_video_data.current_mods & NSShiftKeyMask);
-
-			GameLoop();
-
-			_screen.dst_ptr = _cocoa_video_data.pixels;
-			UpdateWindows();
-			if (++pal_tick > 4) {
-				QZ_CheckPaletteAnim();
-				pal_tick = 1;
-			}
-			QZ_Draw();
-		} else {
-#ifdef _DEBUG
-			st0 = GetTick();
-#endif
-			CSleep(1);
-#ifdef _DEBUG
-			st += GetTick() - st0;
-#endif
-			_screen.dst_ptr = _cocoa_video_data.pixels;
-			DrawChatMessage();
-			DrawMouseCursor();
-			QZ_Draw();
-		}
-	}
-
-#ifdef _DEBUG
-	et = GetTick();
-
-	DEBUG(driver, 1, "cocoa_v: nextEventMatchingMask took %i ms total", _cocoa_video_data.tEvent);
-	DEBUG(driver, 1, "cocoa_v: game loop took %i ms total (%i ms without sleep)", et - et0, et - et0 - st);
-	DEBUG(driver, 1, "cocoa_v: (nextEventMatchingMask total)/(game loop total) is %f%%", (double)_cocoa_video_data.tEvent / (double)(et - et0) * 100);
-	DEBUG(driver, 1, "cocoa_v: (nextEventMatchingMask total)/(game loop without sleep total) is %f%%", (double)_cocoa_video_data.tEvent / (double)(et - et0 - st) * 100);
-#endif
-}
-
-
-/******************************************************************************
- *                             Windowed mode                                  *
- ******************************************************************************/
-
-/* This function makes the *game region* of the window 100% opaque.
- * The genie effect uses the alpha component. Otherwise,
- * it doesn't seem to matter what value it has.
- */
-static void QZ_SetPortAlphaOpaque()
-{
-	if (_cocoa_video_data.device_bpp == 32) {
-		uint32* pixels = (uint32*)_cocoa_video_data.realpixels;
-		uint32 rowPixels = _cocoa_video_data.pitch / 4;
-		uint32 i;
-		uint32 j;
-
-		for (i = 0; i < _cocoa_video_data.height; i++)
-			for (j = 0; j < _cocoa_video_data.width; j++) {
-			pixels[i * rowPixels + j] |= 0xFF000000;
-		}
-	}
-}
-
-
-@implementation OTTD_QuartzWindow
-
-/* we override these methods to fix the miniaturize animation/dock icon bug */
-- (void)miniaturize:(id)sender
-{
-	/* make the alpha channel opaque so anim won't have holes in it */
-	QZ_SetPortAlphaOpaque ();
-
-	/* window is hidden now */
-	_cocoa_video_data.active = false;
-
-	QZ_ShowMouse();
-
-	[ super miniaturize:sender ];
-}
-
-- (void)display
-{
-	/* This method fires just before the window deminaturizes from the Dock.
-	 * We'll save the current visible surface, let the window manager redraw any
-	 * UI elements, and restore the surface. This way, no expose event
-	 * is required, and the deminiaturize works perfectly.
-	 */
-
-	QZ_SetPortAlphaOpaque();
-
-	/* save current visible surface */
-	[ self cacheImageInRect:[ _cocoa_video_data.qdview frame ] ];
-
-	/* let the window manager redraw controls, border, etc */
-	[ super display ];
-
-	/* restore visible surface */
-	[ self restoreCachedImage ];
-
-	/* window is visible again */
-	_cocoa_video_data.active = true;
-}
-
-- (void)setFrame:(NSRect)frameRect display:(BOOL)flag
-{
-	NSRect newViewFrame;
-	CGrafPtr thePort;
-
-	[ super setFrame:frameRect display:flag ];
-
-	/* Don't do anything if the window is currently beign created */
-	if (_cocoa_video_data.issetting) return;
-
-	if (_cocoa_video_data.window == nil) return;
-
-	newViewFrame = [ _cocoa_video_data.qdview frame ];
-
-	/* Update the pixels and pitch */
-	thePort = (OpaqueGrafPtr*) [ _cocoa_video_data.qdview qdPort ];
-	LockPortBits(thePort);
-
-	_cocoa_video_data.realpixels = GetPixBaseAddr(GetPortPixMap(thePort));
-	_cocoa_video_data.pitch      = GetPixRowBytes(GetPortPixMap(thePort));
-
-	/* _cocoa_video_data.realpixels now points to the window's pixels
-	 * We want it to point to the *view's* pixels
-	 */
-	{
-		int vOffset = [ _cocoa_video_data.window frame ].size.height - newViewFrame.size.height - newViewFrame.origin.y;
-		int hOffset = newViewFrame.origin.x;
-
-		_cocoa_video_data.realpixels = (uint8*)_cocoa_video_data.realpixels + (vOffset * _cocoa_video_data.pitch) + hOffset * (_cocoa_video_data.device_bpp / 8);
-	}
-
-	UnlockPortBits(thePort);
-
-	/* Allocate new buffer */
-	free(_cocoa_video_data.pixels);
-	_cocoa_video_data.pixels = (uint8*)malloc(newViewFrame.size.width * newViewFrame.size.height);
-	assert(_cocoa_video_data.pixels != NULL);
-
-
-	/* Tell the game that the resolution changed */
-	_cocoa_video_data.width = newViewFrame.size.width;
-	_cocoa_video_data.height = newViewFrame.size.height;
-
-	_screen.width = _cocoa_video_data.width;
-	_screen.height = _cocoa_video_data.height;
-	_screen.pitch = _cocoa_video_data.width;
-
-	GameSizeChanged();
-
-	/* Redraw screen */
-	_cocoa_video_data.num_dirty_rects = MAX_DIRTY_RECTS;
-}
-
-- (void)appDidHide:(NSNotification*)note
-{
-	_cocoa_video_data.active = false;
-}
-
-
-- (void)appWillUnhide:(NSNotification*)note
-{
-	QZ_SetPortAlphaOpaque ();
-
-	/* save current visible surface */
-	[ self cacheImageInRect:[ _cocoa_video_data.qdview frame ] ];
-}
-
-- (void)appDidUnhide:(NSNotification*)note
-{
-	/* restore cached image, since it may not be current, post expose event too */
-	[ self restoreCachedImage ];
-
-	_cocoa_video_data.active = true;
-}
-
-
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag
-{
-	/* Make our window subclass receive these application notifications */
-	[ [ NSNotificationCenter defaultCenter ] addObserver:self
-	selector:@selector(appDidHide:) name:NSApplicationDidHideNotification object:NSApp ];
-
-	[ [ NSNotificationCenter defaultCenter ] addObserver:self
-	selector:@selector(appDidUnhide:) name:NSApplicationDidUnhideNotification object:NSApp ];
-
-	[ [ NSNotificationCenter defaultCenter ] addObserver:self
-	selector:@selector(appWillUnhide:) name:NSApplicationWillUnhideNotification object:NSApp ];
-
-	return [ super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag ];
-}
-
-@end
-
-@implementation OTTD_QuartzWindowDelegate
-- (BOOL)windowShouldClose:(id)sender
-{
-	HandleExitGameRequest();
-
-	return NO;
-}
-
-- (void)windowDidBecomeKey:(NSNotification*)aNotification
-{
-	_cocoa_video_data.active = true;
-}
-
-- (void)windowDidResignKey:(NSNotification*)aNotification
-{
-	_cocoa_video_data.active = false;
-}
-
-- (void)windowDidBecomeMain:(NSNotification*)aNotification
-{
-	_cocoa_video_data.active = true;
-}
-
-- (void)windowDidResignMain:(NSNotification*)aNotification
-{
-	_cocoa_video_data.active = false;
-}
-
-@end
-
-
-static void QZ_UpdateWindowPalette(uint start, uint count)
-{
-	uint i;
-
-	switch (_cocoa_video_data.device_bpp) {
-		case 32:
-			for (i = start; i < start + count; i++) {
-				uint32 clr32 = 0xff000000;
-				clr32 |= (uint32)_cur_palette[i].r << 16;
-				clr32 |= (uint32)_cur_palette[i].g << 8;
-				clr32 |= (uint32)_cur_palette[i].b;
-				_cocoa_video_data.palette32[i] = clr32;
-			}
-			break;
-		case 16:
-			for (i = start; i < start + count; i++) {
-				uint16 clr16 = 0x0000;
-				clr16 |= (uint16)((_cur_palette[i].r >> 3) & 0x1f) << 10;
-				clr16 |= (uint16)((_cur_palette[i].g >> 3) & 0x1f) << 5;
-				clr16 |= (uint16)((_cur_palette[i].b >> 3) & 0x1f);
-				_cocoa_video_data.palette16[i] = clr16;
-			}
-			break;
-	}
-
-	_cocoa_video_data.num_dirty_rects = MAX_DIRTY_RECTS;
-}
-
-static inline void QZ_WindowBlitIndexedPixelsToView32(uint left, uint top, uint right, uint bottom)
-{
-	const uint32* pal = _cocoa_video_data.palette32;
-	const uint8* src = _cocoa_video_data.pixels;
-	uint32* dst = (uint32*)_cocoa_video_data.realpixels;
-	uint width = _cocoa_video_data.width;
-	uint pitch = _cocoa_video_data.pitch / 4;
-	uint x;
-	uint y;
-
-	for (y = top; y < bottom; y++) {
-		for (x = left; x < right; x++) {
-			dst[y * pitch + x] = pal[src[y * width + x]];
-		}
-	}
-}
-
-static inline void QZ_WindowBlitIndexedPixelsToView16(uint left, uint top, uint right, uint bottom)
-{
-	const uint16* pal = _cocoa_video_data.palette16;
-	const uint8* src = _cocoa_video_data.pixels;
-	uint16* dst = (uint16*)_cocoa_video_data.realpixels;
-	uint width = _cocoa_video_data.width;
-	uint pitch = _cocoa_video_data.pitch / 2;
-	uint x;
-	uint y;
-
-	for (y = top; y < bottom; y++) {
-		for (x = left; x < right; x++) {
-			dst[y * pitch + x] = pal[src[y * width + x]];
-		}
-	}
-}
-
-static inline void QZ_WindowBlitIndexedPixelsToView(int left, int top, int right, int bottom)
-{
-	switch (_cocoa_video_data.device_bpp) {
-		case 32: QZ_WindowBlitIndexedPixelsToView32(left, top, right, bottom); break;
-		case 16: QZ_WindowBlitIndexedPixelsToView16(left, top, right, bottom); break;
-	}
-}
-
-static bool _resize_icon[] = {
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1,
-	0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
-	0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
-	0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
-	0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1,
-	0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
-	0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
-	1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0
-};
-
-static void QZ_DrawResizeIcon()
-{
-	int xoff = _cocoa_video_data.width - 16;
-	int yoff = _cocoa_video_data.height - 16;
-	int x;
-	int y;
-
-	for (y = 0; y < 16; y++) {
-		uint16* trg16 = (uint16*)_cocoa_video_data.realpixels + (yoff + y) * _cocoa_video_data.pitch / 2 + xoff;
-		uint32* trg32 = (uint32*)_cocoa_video_data.realpixels + (yoff + y) * _cocoa_video_data.pitch / 4 + xoff;
-
-		for (x = 0; x < 16; x++, trg16++, trg32++) {
-			if (!_resize_icon[y * 16 + x]) continue;
-
-			switch (_cocoa_video_data.device_bpp) {
-				case 32: *trg32 = 0xff000000; break;
-				case 16: *trg16 = 0x0000;     break;
-			}
-		}
-	}
-}
-
-static void QZ_DrawWindow()
-{
-	int i;
-	RgnHandle dirty, temp;
-
-	/* Check if we need to do anything */
-	if (_cocoa_video_data.num_dirty_rects == 0 ||
-			[ _cocoa_video_data.window isMiniaturized ]) {
-		return;
-	}
-
-	if (_cocoa_video_data.num_dirty_rects >= MAX_DIRTY_RECTS) {
-		_cocoa_video_data.num_dirty_rects = 1;
-		_cocoa_video_data.dirty_rects[0].left = 0;
-		_cocoa_video_data.dirty_rects[0].top = 0;
-		_cocoa_video_data.dirty_rects[0].right = _cocoa_video_data.width;
-		_cocoa_video_data.dirty_rects[0].bottom = _cocoa_video_data.height;
-	}
-
-	dirty = NewRgn();
-	temp  = NewRgn();
-
-	SetEmptyRgn(dirty);
-
-	/* Build the region of dirty rectangles */
-	for (i = 0; i < _cocoa_video_data.num_dirty_rects; i++) {
-		QZ_WindowBlitIndexedPixelsToView(
-			_cocoa_video_data.dirty_rects[i].left,
-			_cocoa_video_data.dirty_rects[i].top,
-			_cocoa_video_data.dirty_rects[i].right,
-			_cocoa_video_data.dirty_rects[i].bottom
-		);
-
-		MacSetRectRgn(
-			temp,
-			_cocoa_video_data.dirty_rects[i].left,
-			_cocoa_video_data.dirty_rects[i].top,
-			_cocoa_video_data.dirty_rects[i].right,
-			_cocoa_video_data.dirty_rects[i].bottom
-		);
-		MacUnionRgn(dirty, temp, dirty);
-	}
-
-	QZ_DrawResizeIcon();
-
-	/* Flush the dirty region */
-	QDFlushPortBuffer( (OpaqueGrafPtr*) [ _cocoa_video_data.qdview qdPort ], dirty);
-	DisposeRgn(dirty);
-	DisposeRgn(temp);
-
-	_cocoa_video_data.num_dirty_rects = 0;
-}
-
-
-extern const char _openttd_revision[];
-
-static const char* QZ_SetVideoWindowed(uint width, uint height)
-{
-	char caption[50];
-	NSString *nsscaption;
-	unsigned int style;
-	NSRect contentRect;
-	BOOL isCustom = NO;
-
-	if (width > _cocoa_video_data.device_width)
-		width = _cocoa_video_data.device_width;
-	if (height > _cocoa_video_data.device_height)
-		height = _cocoa_video_data.device_height;
-
-	_cocoa_video_data.width = width;
-	_cocoa_video_data.height = height;
-
-	contentRect = NSMakeRect(0, 0, width, height);
-
-	/* Check if we should completely destroy the previous mode
-	 * - If it is fullscreen
-	 */
-	if (_cocoa_video_data.isset && _cocoa_video_data.fullscreen)
-		QZ_UnsetVideoMode();
-
-	/* Check if we should recreate the window */
-	if (_cocoa_video_data.window == nil) {
-		/* Set the window style */
-		style = NSTitledWindowMask;
-		style |= (NSMiniaturizableWindowMask | NSClosableWindowMask);
-		style |= NSResizableWindowMask;
-
-		/* Manually create a window, avoids having a nib file resource */
-		_cocoa_video_data.window = [ [ OTTD_QuartzWindow alloc ]
-										initWithContentRect:contentRect
-										styleMask:style
-										backing:NSBackingStoreBuffered
-										defer:NO ];
-
-		if (_cocoa_video_data.window == nil)
-			return "Could not create the Cocoa window";
-
-		snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision);
-		nsscaption = [ [ NSString alloc ] initWithCString:caption ];
-		[ _cocoa_video_data.window setTitle:nsscaption ];
-		[ _cocoa_video_data.window setMiniwindowTitle:nsscaption ];
-		[ nsscaption release ];
-
-		[ _cocoa_video_data.window setAcceptsMouseMovedEvents:YES ];
-		[ _cocoa_video_data.window setViewsNeedDisplay:NO ];
-
-		[ _cocoa_video_data.window setDelegate: [ [ [ OTTD_QuartzWindowDelegate alloc ] init ] autorelease ] ];
-	} else {
-		/* We already have a window, just change its size */
-		if (!isCustom) {
-			[ _cocoa_video_data.window setContentSize:contentRect.size ];
-			// Ensure frame height - title bar height >= view height
-			contentRect.size.height = clamp(height, 0, [ _cocoa_video_data.window frame ].size.height - 22 /* 22 is the height of title bar of window*/);
-			height = contentRect.size.height;
-			[ _cocoa_video_data.qdview setFrameSize:contentRect.size ];
-		}
-	}
-
-	// Update again
-	_cocoa_video_data.width = width;
-	_cocoa_video_data.height = height;
-
-	[ _cocoa_video_data.window center ];
-
-	/* Only recreate the view if it doesn't already exist */
-	if (_cocoa_video_data.qdview == nil) {
-		_cocoa_video_data.qdview = [ [ NSQuickDrawView alloc ] initWithFrame:contentRect ];
-		[ _cocoa_video_data.qdview setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable ];
-		[ [ _cocoa_video_data.window contentView ] addSubview:_cocoa_video_data.qdview ];
-		[ _cocoa_video_data.qdview release ];
-		[ _cocoa_video_data.window makeKeyAndOrderFront:nil ];
-	}
-
-	CGrafPtr thePort = (OpaqueGrafPtr*) [ _cocoa_video_data.qdview qdPort ];
-
-	LockPortBits(thePort);
-	_cocoa_video_data.realpixels = GetPixBaseAddr(GetPortPixMap(thePort));
-	_cocoa_video_data.pitch = GetPixRowBytes(GetPortPixMap(thePort));
-	UnlockPortBits(thePort);
-
-	/* _cocoa_video_data.realpixels now points to the window's pixels
-	 * We want it to point to the *view's* pixels
-	 */
-	{
-		int vOffset = [ _cocoa_video_data.window frame ].size.height - [ _cocoa_video_data.qdview frame ].size.height - [ _cocoa_video_data.qdview frame ].origin.y;
-		int hOffset = [ _cocoa_video_data.qdview frame ].origin.x;
-
-		_cocoa_video_data.realpixels = (uint8*)_cocoa_video_data.realpixels + (vOffset * _cocoa_video_data.pitch) + hOffset * (_cocoa_video_data.device_bpp / 8);
-	}
-
-	free(_cocoa_video_data.pixels);
-	_cocoa_video_data.pixels = (uint8*)malloc(width * height);
-	if (_cocoa_video_data.pixels == NULL) return "Failed to allocate 8-bit buffer";
-
-	_cocoa_video_data.fullscreen = false;
-
-	return NULL;
-}
-
-
-/******************************************************************************
- *                             Fullscreen mode                                *
- ******************************************************************************/
-
-/* Gamma functions to try to hide the flash from a rez switch
- * Fade the display from normal to black
- * Save gamma tables for fade back to normal
- */
-static uint32 QZ_FadeGammaOut(OTTD_QuartzGammaTable* table)
-{
-	CGGammaValue redTable[QZ_GAMMA_TABLE_SIZE];
-	CGGammaValue greenTable[QZ_GAMMA_TABLE_SIZE];
-	CGGammaValue blueTable[QZ_GAMMA_TABLE_SIZE];
-	float percent;
-	int j;
-	unsigned int actual;
-
-	if (CGGetDisplayTransferByTable(
-				_cocoa_video_data.display_id, QZ_GAMMA_TABLE_SIZE,
-				table->red, table->green, table->blue, &actual
-			) != CGDisplayNoErr ||
-			actual != QZ_GAMMA_TABLE_SIZE) {
-		return 1;
-	}
-
-	memcpy(redTable,   table->red,   sizeof(redTable));
-	memcpy(greenTable, table->green, sizeof(greenTable));
-	memcpy(blueTable,  table->blue,  sizeof(greenTable));
-
-	for (percent = 1.0; percent >= 0.0; percent -= 0.01) {
-		for (j = 0; j < QZ_GAMMA_TABLE_SIZE; j++) {
-			redTable[j]   = redTable[j]   * percent;
-			greenTable[j] = greenTable[j] * percent;
-			blueTable[j]  = blueTable[j]  * percent;
-		}
-
-		if (CGSetDisplayTransferByTable(
-					_cocoa_video_data.display_id, QZ_GAMMA_TABLE_SIZE,
-					redTable, greenTable, blueTable
-				) != CGDisplayNoErr) {
-			CGDisplayRestoreColorSyncSettings();
-			return 1;
-		}
-
-		CSleep(10);
-	}
-
-	return 0;
-}
-
-/* Fade the display from black to normal
- * Restore previously saved gamma values
- */
-static uint32 QZ_FadeGammaIn(const OTTD_QuartzGammaTable* table)
-{
-	CGGammaValue redTable[QZ_GAMMA_TABLE_SIZE];
-	CGGammaValue greenTable[QZ_GAMMA_TABLE_SIZE];
-	CGGammaValue blueTable[QZ_GAMMA_TABLE_SIZE];
-	float percent;
-	int j;
-
-	memset(redTable, 0, sizeof(redTable));
-	memset(greenTable, 0, sizeof(greenTable));
-	memset(blueTable, 0, sizeof(greenTable));
-
-	for (percent = 0.0; percent <= 1.0; percent += 0.01) {
-		for (j = 0; j < QZ_GAMMA_TABLE_SIZE; j++) {
-			redTable[j]   = table->red[j]   * percent;
-			greenTable[j] = table->green[j] * percent;
-			blueTable[j]  = table->blue[j]  * percent;
-		}
-
-		if (CGSetDisplayTransferByTable(
-					_cocoa_video_data.display_id, QZ_GAMMA_TABLE_SIZE,
-					redTable, greenTable, blueTable
-				) != CGDisplayNoErr) {
-			CGDisplayRestoreColorSyncSettings();
-			return 1;
-		}
-
-		CSleep(10);
-	}
-
-	return 0;
-}
-
-static const char* QZ_SetVideoFullScreen(int width, int height)
-{
-	const char* errstr = "QZ_SetVideoFullScreen error";
-	int exact_match;
-	CFNumberRef number;
-	int bpp;
-	int gamma_error;
-	OTTD_QuartzGammaTable gamma_table;
-	NSRect screen_rect;
-	CGError error;
-	NSPoint pt;
-
-	/* Destroy any previous mode */
-	if (_cocoa_video_data.isset) QZ_UnsetVideoMode();
-
-	/* See if requested mode exists */
-	_cocoa_video_data.mode = CGDisplayBestModeForParameters(_cocoa_video_data.display_id, 8, width, height, &exact_match);
-
-	/* If the mode wasn't an exact match, check if it has the right bpp, and update width and height */
-	if (!exact_match) {
-		number = (const __CFNumber*) CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayBitsPerPixel);
-		CFNumberGetValue(number, kCFNumberSInt32Type, &bpp);
-		if (bpp != 8) {
-			errstr = "Failed to find display resolution";
-			goto ERR_NO_MATCH;
-		}
-
-		number = (const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayWidth);
-		CFNumberGetValue(number, kCFNumberSInt32Type, &width);
-
-		number = (const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayHeight);
-		CFNumberGetValue(number, kCFNumberSInt32Type, &height);
-	}
-
-	/* Fade display to zero gamma */
-	gamma_error = QZ_FadeGammaOut(&gamma_table);
-
-	/* Put up the blanking window (a window above all other windows) */
-	error = CGDisplayCapture(_cocoa_video_data.display_id);
-
-	if (CGDisplayNoErr != error) {
-		errstr = "Failed capturing display";
-		goto ERR_NO_CAPTURE;
-	}
-
-	/* Do the physical switch */
-	if (CGDisplaySwitchToMode(_cocoa_video_data.display_id, _cocoa_video_data.mode) != CGDisplayNoErr) {
-		errstr = "Failed switching display resolution";
-		goto ERR_NO_SWITCH;
-	}
-
-	_cocoa_video_data.realpixels = (uint8*)CGDisplayBaseAddress(_cocoa_video_data.display_id);
-	_cocoa_video_data.pitch  = CGDisplayBytesPerRow(_cocoa_video_data.display_id);
-
-	_cocoa_video_data.width = CGDisplayPixelsWide(_cocoa_video_data.display_id);
-	_cocoa_video_data.height = CGDisplayPixelsHigh(_cocoa_video_data.display_id);
-	_cocoa_video_data.fullscreen = true;
-
-	/* Setup double-buffer emulation */
-	_cocoa_video_data.pixels = (uint8*)malloc(width * height);
-	if (_cocoa_video_data.pixels == NULL) {
-		errstr = "Failed to allocate memory for double buffering";
-		goto ERR_DOUBLEBUF;
-	}
-
-	if (!CGDisplayCanSetPalette(_cocoa_video_data.display_id)) {
-		errstr = "Not an indexed display mode.";
-		goto ERR_NOT_INDEXED;
-	}
-
-	/* If we don't hide menu bar, it will get events and interrupt the program */
-	HideMenuBar();
-
-	/* Fade the display to original gamma */
-	if (!gamma_error) QZ_FadeGammaIn(&gamma_table);
-
-	/* There is a bug in Cocoa where NSScreen doesn't synchronize
-	 * with CGDirectDisplay, so the main screen's frame is wrong.
-	 * As a result, coordinate translation produces incorrect results.
-	 * We can hack around this bug by setting the screen rect ourselves.
-	 * This hack should be removed if/when the bug is fixed.
-	 */
-	screen_rect = NSMakeRect(0, 0, width, height);
-	[ [ NSScreen mainScreen ] setFrame:screen_rect ];
-
-	/* we're fullscreen, so flag all input states... */
-	_cocoa_video_data.active = true;
-
-
-	pt = [ NSEvent mouseLocation ];
-	pt.y = CGDisplayPixelsHigh(_cocoa_video_data.display_id) - pt.y;
-	if (QZ_MouseIsInsideView(&pt)) QZ_HideMouse();
-
-	return NULL;
-
-/* Since the blanking window covers *all* windows (even force quit) correct recovery is crucial */
-ERR_NOT_INDEXED:
-	free(_cocoa_video_data.pixels);
-	_cocoa_video_data.pixels = NULL;
-ERR_DOUBLEBUF:
-	CGDisplaySwitchToMode(_cocoa_video_data.display_id, _cocoa_video_data.save_mode);
-ERR_NO_SWITCH:
-	CGReleaseAllDisplays();
-ERR_NO_CAPTURE:
-	if (!gamma_error) QZ_FadeGammaIn(&gamma_table);
-ERR_NO_MATCH:
-	return errstr;
-}
-
-
-static void QZ_UpdateFullscreenPalette(uint first_color, uint num_colors)
-{
-	CGTableCount  index;
-	CGDeviceColor color;
-
-	for (index = first_color; index < first_color+num_colors; index++) {
-		/* Clamp colors between 0.0 and 1.0 */
-		color.red   = _cur_palette[index].r / 255.0;
-		color.blue  = _cur_palette[index].b / 255.0;
-		color.green = _cur_palette[index].g / 255.0;
-
-		CGPaletteSetColorAtIndex(_cocoa_video_data.palette, color, index);
-	}
-
-	CGDisplaySetPalette(_cocoa_video_data.display_id, _cocoa_video_data.palette);
-}
-
-/* Wait for the VBL to occur (estimated since we don't have a hardware interrupt) */
-static void QZ_WaitForVerticalBlank()
-{
-	/* The VBL delay is based on Ian Ollmann's RezLib <iano@cco.caltech.edu> */
-	double refreshRate;
-	double linesPerSecond;
-	double target;
-	double position;
-	double adjustment;
-	CFNumberRef refreshRateCFNumber;
-
-	refreshRateCFNumber = (const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayRefreshRate);
-	if (refreshRateCFNumber == NULL) return;
-
-	if (CFNumberGetValue(refreshRateCFNumber, kCFNumberDoubleType, &refreshRate) == 0)
-		return;
-
-	if (refreshRate == 0) return;
-
-	linesPerSecond = refreshRate * _cocoa_video_data.height;
-	target = _cocoa_video_data.height;
-
-	/* Figure out the first delay so we start off about right */
-	position = CGDisplayBeamPosition(_cocoa_video_data.display_id);
-	if (position > target) position = 0;
-
-	adjustment = (target - position) / linesPerSecond;
-
-	CSleep((uint32)(adjustment * 1000));
-}
-
-
-static void QZ_DrawScreen()
-{
-	const uint8* src = _cocoa_video_data.pixels;
-	uint8* dst       = (uint8*)_cocoa_video_data.realpixels;
-	uint pitch       = _cocoa_video_data.pitch;
-	uint width       = _cocoa_video_data.width;
-	uint num_dirty   = _cocoa_video_data.num_dirty_rects;
-	uint i;
-
-	/* Check if we need to do anything */
-	if (num_dirty == 0) return;
-
-	if (num_dirty >= MAX_DIRTY_RECTS) {
-		num_dirty = 1;
-		_cocoa_video_data.dirty_rects[0].left   = 0;
-		_cocoa_video_data.dirty_rects[0].top    = 0;
-		_cocoa_video_data.dirty_rects[0].right  = _cocoa_video_data.width;
-		_cocoa_video_data.dirty_rects[0].bottom = _cocoa_video_data.height;
-	}
-
-	QZ_WaitForVerticalBlank();
-	/* Build the region of dirty rectangles */
-	for (i = 0; i < num_dirty; i++) {
-		uint y      = _cocoa_video_data.dirty_rects[i].top;
-		uint left   = _cocoa_video_data.dirty_rects[i].left;
-		uint length = _cocoa_video_data.dirty_rects[i].right - left;
-		uint bottom = _cocoa_video_data.dirty_rects[i].bottom;
-
-		for (; y < bottom; y++) {
-			memcpy(dst + y * pitch + left, src + y * width + left, length);
-		}
-	}
-
-	_cocoa_video_data.num_dirty_rects = 0;
-}
-
-
-static int QZ_ListFullscreenModes(OTTDPoint* mode_list, int max_modes)
-{
-	CFIndex num_modes;
-	CFIndex i;
-	int list_size = 0;
-
-	num_modes = CFArrayGetCount(_cocoa_video_data.mode_list);
-
-	/* Build list of modes with the requested bpp */
-	for (i = 0; i < num_modes && list_size < max_modes; i++) {
-		CFDictionaryRef onemode;
-		CFNumberRef     number;
-		int bpp;
-		int intvalue;
-		bool hasMode;
-		uint16 width, height;
-
-		onemode = (const __CFDictionary*)CFArrayGetValueAtIndex(_cocoa_video_data.mode_list, i);
-		number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayBitsPerPixel);
-		CFNumberGetValue (number, kCFNumberSInt32Type, &bpp);
-
-		if (bpp != 8) continue;
-
-		number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayWidth);
-		CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
-		width = (uint16)intvalue;
-
-		number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayHeight);
-		CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
-		height = (uint16)intvalue;
-
-		/* Check if mode is already in the list */
-		{
-			int i;
-			hasMode = false;
-			for (i = 0; i < list_size; i++) {
-				if (mode_list[i].x == width &&  mode_list[i].y == height) {
-					hasMode = true;
-					break;
-				}
-			}
-		}
-
-		if (hasMode) continue;
-
-		/* Add mode to the list */
-		mode_list[list_size].x = width;
-		mode_list[list_size].y = height;
-		list_size++;
-	}
-
-	/* Sort list smallest to largest */
-	{
-		int i, j;
-		for (i = 0; i < list_size; i++) {
-			for (j = 0; j < list_size-1; j++) {
-				if (mode_list[j].x > mode_list[j + 1].x || (
-							mode_list[j].x == mode_list[j + 1].x &&
-							mode_list[j].y >  mode_list[j + 1].y
-						)) {
-					uint tmpw = mode_list[j].x;
-					uint tmph = mode_list[j].y;
-
-					mode_list[j].x = mode_list[j + 1].x;
-					mode_list[j].y = mode_list[j + 1].y;
-
-					mode_list[j + 1].x = tmpw;
-					mode_list[j + 1].y = tmph;
-				}
-			}
-		}
-	}
-
-	return list_size;
-}
-
-
-/******************************************************************************
- *                             Windowed and fullscreen common code            *
- ******************************************************************************/
-
-static void QZ_UpdatePalette(uint start, uint count)
-{
-	if (_cocoa_video_data.fullscreen) {
-		QZ_UpdateFullscreenPalette(start, count);
-	} else {
-		QZ_UpdateWindowPalette(start, count);
-	}
-}
-
-static void QZ_InitPalette()
-{
-	QZ_UpdatePalette(0, 256);
-}
-
-static void QZ_Draw()
-{
-	if (_cocoa_video_data.fullscreen) {
-		QZ_DrawScreen();
-	} else {
-		QZ_DrawWindow();
-	}
-}
-
-
-static const OTTDPoint _default_resolutions[] = {
-	{ 640,  480},
-	{ 800,  600},
-	{1024,  768},
-	{1152,  864},
-	{1280,  800},
-	{1280,  960},
-	{1280, 1024},
-	{1400, 1050},
-	{1600, 1200},
-	{1680, 1050},
-	{1920, 1200}
-};
-
-static void QZ_UpdateVideoModes()
-{
-	uint i, j, count;
-	OTTDPoint modes[32];
-	const OTTDPoint *current_modes;
-
-	if (_cocoa_video_data.fullscreen) {
-		count = QZ_ListFullscreenModes(modes, 32);
-		current_modes = modes;
-	} else {
-		count = lengthof(_default_resolutions);
-		current_modes = _default_resolutions;
-	}
-
-	for (i = 0, j = 0; j < lengthof(_resolutions) && i < count; i++) {
-		if (_cocoa_video_data.fullscreen || (
-					(uint)current_modes[i].x < _cocoa_video_data.device_width &&
-					(uint)current_modes[i].y < _cocoa_video_data.device_height)
-				) {
-			_resolutions[j][0] = current_modes[i].x;
-			_resolutions[j][1] = current_modes[i].y;
-			j++;
-		}
-	}
-
-	_num_resolutions = j;
-}
-
-static void QZ_UnsetVideoMode()
-{
-	if (_cocoa_video_data.fullscreen) {
-		/* Release fullscreen resources */
-		OTTD_QuartzGammaTable gamma_table;
-		int gamma_error;
-		NSRect screen_rect;
-
-		gamma_error = QZ_FadeGammaOut(&gamma_table);
-
-		/* Restore original screen resolution/bpp */
-		CGDisplaySwitchToMode(_cocoa_video_data.display_id, _cocoa_video_data.save_mode);
-		CGReleaseAllDisplays();
-		ShowMenuBar();
-		/* Reset the main screen's rectangle
-		 * See comment in QZ_SetVideoFullscreen for why we do this
-		 */
-		screen_rect = NSMakeRect(0,0,_cocoa_video_data.device_width,_cocoa_video_data.device_height);
-		[ [ NSScreen mainScreen ] setFrame:screen_rect ];
-
-		if (!gamma_error) QZ_FadeGammaIn(&gamma_table);
-	} else {
-		/* Release window mode resources */
-		[ _cocoa_video_data.window close ];
-		_cocoa_video_data.window = nil;
-		_cocoa_video_data.qdview = nil;
-	}
-
-	free(_cocoa_video_data.pixels);
-	_cocoa_video_data.pixels = NULL;
-
-	/* Signal successful teardown */
-	_cocoa_video_data.isset = false;
-
-	QZ_ShowMouse();
-}
-
-
-static const char* QZ_SetVideoMode(uint width, uint height, bool fullscreen)
-{
-	const char *ret;
-
-	_cocoa_video_data.issetting = true;
-	if (fullscreen) {
-		/* Setup full screen video */
-		ret = QZ_SetVideoFullScreen(width, height);
-	} else {
-		/* Setup windowed video */
-		ret = QZ_SetVideoWindowed(width, height);
-	}
-	_cocoa_video_data.issetting = false;
-	if (ret != NULL) return ret;
-
-	/* Signal successful completion (used internally) */
-	_cocoa_video_data.isset = true;
-
-	/* Tell the game that the resolution has changed */
-	_screen.width = _cocoa_video_data.width;
-	_screen.height = _cocoa_video_data.height;
-	_screen.pitch = _cocoa_video_data.width;
-
-	QZ_UpdateVideoModes();
-	GameSizeChanged();
-
-	QZ_InitPalette();
-
-	return NULL;
-}
-
-static const char* QZ_SetVideoModeAndRestoreOnFailure(uint width, uint height, bool fullscreen)
-{
-	bool wasset = _cocoa_video_data.isset;
-	uint32 oldwidth = _cocoa_video_data.width;
-	uint32 oldheight = _cocoa_video_data.height;
-	bool oldfullscreen = _cocoa_video_data.fullscreen;
-	const char *ret;
-
-	ret = QZ_SetVideoMode(width, height, fullscreen);
-	if (ret != NULL && wasset) QZ_SetVideoMode(oldwidth, oldheight, oldfullscreen);
-
-	return ret;
-}
-
-static void QZ_VideoInit()
-{
-	if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() == 0) error("Can't use a blitter that blits 0 bpp for normal visuals");
-
-	memset(&_cocoa_video_data, 0, sizeof(_cocoa_video_data));
-
-	/* Initialize the video settings; this data persists between mode switches */
-	_cocoa_video_data.display_id = kCGDirectMainDisplay;
-	_cocoa_video_data.save_mode  = CGDisplayCurrentMode(_cocoa_video_data.display_id);
-	_cocoa_video_data.mode_list  = CGDisplayAvailableModes(_cocoa_video_data.display_id);
-	_cocoa_video_data.palette    = CGPaletteCreateDefaultColorPalette();
-
-	/* Gather some information that is useful to know about the display */
-	/* Maybe this should be moved to QZ_SetVideoMode, in case this is changed after startup */
-	CFNumberGetValue(
-		(const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.save_mode, kCGDisplayBitsPerPixel),
-		kCFNumberSInt32Type, &_cocoa_video_data.device_bpp
-	);
-
-	CFNumberGetValue(
-		(const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.save_mode, kCGDisplayWidth),
-		kCFNumberSInt32Type, &_cocoa_video_data.device_width
-	);
-
-	CFNumberGetValue(
-		(const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.save_mode, kCGDisplayHeight),
-		kCFNumberSInt32Type, &_cocoa_video_data.device_height
-	);
-
-	_cocoa_video_data.cursor_visible = true;
-
-	/* register for sleep notifications so wake from sleep generates SDL_VIDEOEXPOSE */
-//	QZ_RegisterForSleepNotifications();
-}
-
-
-/* Convert local coordinate to window server (CoreGraphics) coordinate */
-static CGPoint QZ_PrivateLocalToCG(NSPoint* p)
-{
-	CGPoint cgp;
-
-	if (!_cocoa_video_data.fullscreen) {
-		*p = [ _cocoa_video_data.qdview convertPoint:*p toView: nil ];
-		*p = [ _cocoa_video_data.window convertBaseToScreen:*p ];
-		p->y = _cocoa_video_data.device_height - p->y;
-	}
-
-	cgp.x = p->x;
-	cgp.y = p->y;
-
-	return cgp;
-}
-
-static void QZ_WarpCursor(int x, int y)
-{
-	NSPoint p;
-	CGPoint cgp;
-
-	/* Only allow warping when in foreground */
-	if (![ NSApp isActive ]) return;
-
-	p = NSMakePoint(x, y);
-	cgp = QZ_PrivateLocalToCG(&p);
-
-	/* this is the magic call that fixes cursor "freezing" after warp */
-	CGSetLocalEventsSuppressionInterval(0.0);
-	/* Do the actual warp */
-	CGWarpMouseCursorPosition(cgp);
-
-	/* Generate the mouse moved event */
-}
-
-static void QZ_ShowMouse()
-{
-	if (!_cocoa_video_data.cursor_visible) {
-		[ NSCursor unhide ];
-		_cocoa_video_data.cursor_visible = true;
-
-		// Hide the openttd cursor when leaving the window
-		if (_cocoa_video_data.isset)
-			UndrawMouseCursor();
-		_cursor.in_window = false;
-	}
-}
-
-static void QZ_HideMouse()
-{
-	if (_cocoa_video_data.cursor_visible) {
-#ifndef _DEBUG
-		[ NSCursor hide ];
-#endif
-		_cocoa_video_data.cursor_visible = false;
-
-		// Show the openttd cursor again
-		_cursor.in_window = true;
-	}
-}
-
-
-/******************************************************************************
- *                             OS X application creation                      *
- ******************************************************************************/
-
-/* The main class of the application, the application's delegate */
-@implementation OTTDMain
-/* Called when the internal event loop has just started running */
-- (void) applicationDidFinishLaunching: (NSNotification*) note
-{
-	/* Hand off to main application code */
-	QZ_GameLoop();
-
-	/* We're done, thank you for playing */
-	[ NSApp stop:_ottd_main ];
-}
-
-/* Display the in game quit confirmation dialog */
-- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*) sender
-{
-
-	HandleExitGameRequest();
-
-	return NSTerminateCancel; // NSTerminateLater ?
-}
-@end
-
-static void setApplicationMenu()
-{
-	/* warning: this code is very odd */
-	NSMenu *appleMenu;
-	NSMenuItem *menuItem;
-	NSString *title;
-	NSString *appName;
-
-	appName = @"OTTD";
-	appleMenu = [[NSMenu alloc] initWithTitle:appName];
-
-	/* Add menu items */
-	title = [@"About " stringByAppendingString:appName];
-	[appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
-
-	[appleMenu addItem:[NSMenuItem separatorItem]];
-
-	title = [@"Hide " stringByAppendingString:appName];
-	[appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"];
-
-	menuItem = (NSMenuItem*)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
-	[menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
-
-	[appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
-
-	[appleMenu addItem:[NSMenuItem separatorItem]];
-
-	title = [@"Quit " stringByAppendingString:appName];
-	[appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
-
-
-	/* Put menu into the menubar */
-	menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
-	[menuItem setSubmenu:appleMenu];
-	[[NSApp mainMenu] addItem:menuItem];
-
-	/* Tell the application object that this is now the application menu */
-	[NSApp setAppleMenu:appleMenu];
-
-	/* Finally give up our references to the objects */
-	[appleMenu release];
-	[menuItem release];
-}
-
-/* Create a window menu */
-static void setupWindowMenu()
-{
-	NSMenu* windowMenu;
-	NSMenuItem* windowMenuItem;
-	NSMenuItem* menuItem;
-
-	windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
-
-	/* "Minimize" item */
-	menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"];
-	[windowMenu addItem:menuItem];
-	[menuItem release];
-
-	/* Put menu into the menubar */
-	windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""];
-	[windowMenuItem setSubmenu:windowMenu];
-	[[NSApp mainMenu] addItem:windowMenuItem];
-
-	/* Tell the application object that this is now the window menu */
-	[NSApp setWindowsMenu:windowMenu];
-
-	/* Finally give up our references to the objects */
-	[windowMenu release];
-	[windowMenuItem release];
-}
-
-static void setupApplication()
-{
-	CPSProcessSerNum PSN;
-
-	/* Ensure the application object is initialised */
-	[NSApplication sharedApplication];
-
-	/* Tell the dock about us */
-	if (!CPSGetCurrentProcess(&PSN) &&
-			!CPSEnableForegroundOperation(&PSN, 0x03, 0x3C, 0x2C, 0x1103) &&
-			!CPSSetFrontProcess(&PSN)) {
-		[NSApplication sharedApplication];
-	}
-
-	/* Set up the menubar */
-	[NSApp setMainMenu:[[NSMenu alloc] init]];
-	setApplicationMenu();
-	setupWindowMenu();
-
-	/* Create OTTDMain and make it the app delegate */
-	_ottd_main = [[OTTDMain alloc] init];
-	[NSApp setDelegate:_ottd_main];
-}
-
-
-/******************************************************************************
- *                             Video driver interface                         *
- ******************************************************************************/
-
-static FVideoDriver_Cocoa iFVideoDriver_Cocoa;
-
-void VideoDriver_Cocoa::Stop()
-{
-	if (!_cocoa_video_started) return;
-
-	if (_cocoa_video_data.isset) QZ_UnsetVideoMode();
-
-	[_ottd_main release];
-
-	_cocoa_video_started = false;
-}
-
-const char *VideoDriver_Cocoa::Start(const char * const *parm)
-{
-	const char *ret;
-
-	if (_cocoa_video_started) return "Already started";
-	_cocoa_video_started = true;
-
-	memset(&_cocoa_video_data, 0, sizeof(_cocoa_video_data));
-
-	setupApplication();
-
-	/* Don't create a window or enter fullscreen if we're just going to show a dialog. */
-	if (_cocoa_video_dialog) return NULL;
-
-	QZ_VideoInit();
-
-	ret = QZ_SetVideoMode(_cur_resolution[0], _cur_resolution[1], _fullscreen);
-	if (ret != NULL) _video_driver->Stop();
-
-	return ret;
-}
-
-void VideoDriver_Cocoa::MakeDirty(int left, int top, int width, int height)
-{
-	if (_cocoa_video_data.num_dirty_rects < MAX_DIRTY_RECTS) {
-		_cocoa_video_data.dirty_rects[_cocoa_video_data.num_dirty_rects].left = left;
-		_cocoa_video_data.dirty_rects[_cocoa_video_data.num_dirty_rects].top = top;
-		_cocoa_video_data.dirty_rects[_cocoa_video_data.num_dirty_rects].right = left + width;
-		_cocoa_video_data.dirty_rects[_cocoa_video_data.num_dirty_rects].bottom = top + height;
-	}
-	_cocoa_video_data.num_dirty_rects++;
-}
-
-void VideoDriver_Cocoa::MainLoop()
-{
-	/* Start the main event loop */
-	[NSApp run];
-}
-
-bool VideoDriver_Cocoa::ChangeResolution(int w, int h)
-{
-	const char *ret = QZ_SetVideoModeAndRestoreOnFailure((uint)w, (uint)h, _cocoa_video_data.fullscreen);
-	if (ret != NULL) {
-		DEBUG(driver, 0, "cocoa_v: VideoDriver_Cocoa::ChangeResolution failed with message: %s", ret);
-	}
-
-	return ret == NULL;
-}
-
-void VideoDriver_Cocoa::ToggleFullscreen(bool full_screen)
-{
-	const char *ret = QZ_SetVideoModeAndRestoreOnFailure(_cocoa_video_data.width, _cocoa_video_data.height, full_screen);
-	if (ret != NULL) {
-		DEBUG(driver, 0, "cocoa_v: VideoDriver_Cocoa::ToggleFullscreen failed with message: %s", ret);
-	}
-
-	_fullscreen = _cocoa_video_data.fullscreen;
-}
-
-
-/* This is needed since sometimes assert is called before the videodriver is initialized */
-void CocoaDialog(const char* title, const char* message, const char* buttonLabel)
-{
-	bool wasstarted;
-
-	_cocoa_video_dialog = true;
-
-	wasstarted = _cocoa_video_started;
-	if (_video_driver == NULL) {
-		setupApplication(); // Setup application before showing dialog
-	} else if (!_cocoa_video_started && _video_driver->Start(NULL) != NULL) {
-		fprintf(stderr, "%s: %s\n", title, message);
-		return;
-	}
-
-	NSRunAlertPanel([NSString stringWithCString: title], [NSString stringWithCString: message], [NSString stringWithCString: buttonLabel], nil, nil);
-
-	if (!wasstarted && _video_driver != NULL) _video_driver->Stop();
-
-	_cocoa_video_dialog = false;
-}
-
-/* This is needed since OS X application bundles do not have a
- * current directory and the data files are 'somewhere' in the bundle */
-void cocoaSetApplicationBundleDir()
-{
-	char tmp[MAXPATHLEN];
-	CFURLRef url = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
-	if (CFURLGetFileSystemRepresentation(url, true, (unsigned char*)tmp, MAXPATHLEN)) {
-		AppendPathSeparator(tmp, lengthof(tmp));
-		_searchpaths[SP_APPLICATION_BUNDLE_DIR] = strdup(tmp);
-	} else {
-		_searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL;
-	}
-
-	CFRelease(url);
-}
-
-/* These are called from main() to prevent a _NSAutoreleaseNoPool error when
- * exiting before the cocoa video driver has been loaded
- */
-void cocoaSetupAutoreleasePool()
-{
-	_ottd_autorelease_pool = [[NSAutoreleasePool alloc] init];
-}
-
-void cocoaReleaseAutoreleasePool()
-{
-	[_ottd_autorelease_pool release];
-}
-
-#endif /* WITH_COCOA */
--- a/src/video/dedicated_v.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/video/dedicated_v.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -235,7 +235,7 @@
 			if (input_line[i] == '\0')
 				break;
 
-			if (!IS_INT_INSIDE(input_line[i], ' ', 256))
+			if (!IsInsideMM(input_line[i], ' ', 256))
 				input_line[i] = ' ';
 		}
 	}
--- a/src/video/sdl_v.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/video/sdl_v.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -128,8 +128,8 @@
 		for (i = 0; modes[i]; i++) {
 			int w = modes[i]->w;
 			int h = modes[i]->h;
-			if (IS_INT_INSIDE(w, 640, MAX_SCREEN_WIDTH + 1) &&
-					IS_INT_INSIDE(h, 480, MAX_SCREEN_HEIGHT + 1)) {
+			if (IsInsideMM(w, 640, MAX_SCREEN_WIDTH + 1) &&
+					IsInsideMM(h, 480, MAX_SCREEN_HEIGHT + 1)) {
 				int j;
 				for (j = 0; j < n; j++) {
 					if (_resolutions[j][0] == w && _resolutions[j][1] == h) break;
@@ -420,8 +420,8 @@
 			break;
 
 		case SDL_VIDEORESIZE: {
-			int w = clamp(ev.resize.w, 64, MAX_SCREEN_WIDTH);
-			int h = clamp(ev.resize.h, 64, MAX_SCREEN_HEIGHT);
+			int w = Clamp(ev.resize.w, 64, MAX_SCREEN_WIDTH);
+			int h = Clamp(ev.resize.h, 64, MAX_SCREEN_HEIGHT);
 			ChangeResInGame(w, h);
 			break;
 		}
--- a/src/video/win32_v.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/video/win32_v.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -545,8 +545,8 @@
 
 			w = r->right - r->left - (r2.right - r2.left);
 			h = r->bottom - r->top - (r2.bottom - r2.top);
-			w = clamp(w, 64, MAX_SCREEN_WIDTH);
-			h = clamp(h, 64, MAX_SCREEN_HEIGHT);
+			w = Clamp(w, 64, MAX_SCREEN_WIDTH);
+			h = Clamp(h, 64, MAX_SCREEN_HEIGHT);
 			SetRect(&r2, 0, 0, w, h);
 
 			AdjustWindowRect(&r2, GetWindowLong(hwnd, GWL_STYLE), FALSE);
@@ -677,8 +677,8 @@
 	HDC dc;
 	int bpp = BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth();
 
-	w = clamp(w, 64, MAX_SCREEN_WIDTH);
-	h = clamp(h, 64, MAX_SCREEN_HEIGHT);
+	w = Clamp(w, 64, MAX_SCREEN_WIDTH);
+	h = Clamp(h, 64, MAX_SCREEN_HEIGHT);
 
 	if (bpp == 0) error("Can't use a blitter that blits 0 bpp for normal visuals");
 
@@ -686,7 +686,7 @@
 		return false;
 
 	_screen.width = w;
-	_screen.pitch = (bpp == 8) ? ALIGN(w, 4) : w;
+	_screen.pitch = (bpp == 8) ? Align(w, 4) : w;
 	_screen.height = h;
 	bi = (BITMAPINFO*)alloca(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
 	memset(bi, 0, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
@@ -737,8 +737,8 @@
 	 * Doesn't really matter since we don't pass a string anyways, but still
 	 * a letdown */
 	for (i = 0; EnumDisplaySettingsA(NULL, i, &dm) != 0; i++) {
-		if (dm.dmBitsPerPel == BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() && IS_INT_INSIDE(dm.dmPelsWidth, 640, MAX_SCREEN_WIDTH + 1) &&
-				IS_INT_INSIDE(dm.dmPelsHeight, 480, MAX_SCREEN_HEIGHT + 1)) {
+		if (dm.dmBitsPerPel == BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() && IsInsideMM(dm.dmPelsWidth, 640, MAX_SCREEN_WIDTH + 1) &&
+				IsInsideMM(dm.dmPelsHeight, 480, MAX_SCREEN_HEIGHT + 1)) {
 			uint j;
 
 			for (j = 0; j < n; j++) {
--- a/src/viewport.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/viewport.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -27,6 +27,7 @@
 #include "vehicle_gui.h"
 #include "blitter/factory.hpp"
 #include "newgrf_fsmports.h"
+#include "transparency.h"
 
 #define VIEWPORT_DRAW_MEM (65536 * 2)
 
@@ -37,9 +38,6 @@
 static uint32 _active_viewports;    ///< bitmasked variable where each bit signifies if a viewport is in use or not
 assert_compile(lengthof(_viewports) < sizeof(_active_viewports) * 8);
 
-static bool _added_tile_sprite;
-static bool _offset_ground_sprites;
-
 /* The in-game coordiante system looks like this *
  *                                               *
  *                    ^ Z                        *
@@ -113,6 +111,14 @@
 assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(ChildScreenSpriteToDraw));
 assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(ParentSpriteToDraw));
 
+/* Enumeration of multi-part foundations */
+enum FoundationPart {
+	FOUNDATION_PART_NONE     = 0xFF,  ///< Neither foundation nor groundsprite drawn yet.
+	FOUNDATION_PART_NORMAL   = 0,     ///< First part (normal foundation or no foundation)
+	FOUNDATION_PART_HALFTILE = 1,     ///< Second part (halftile foundation)
+	FOUNDATION_PART_END
+};
+
 struct ViewportDrawer {
 	DrawPixelInfo dpi;
 
@@ -129,7 +135,10 @@
 
 	byte combine_sprites;
 
-	int offs_x, offs_y; // used when drawing ground sprites relative
+	ParentSpriteToDraw *foundation[FOUNDATION_PART_END];                   ///< Foundation sprites.
+	FoundationPart foundation_part;                                        ///< Currently active foundation for ground sprite drawing.
+	ChildScreenSpriteToDraw **last_foundation_child[FOUNDATION_PART_END];  ///< Tail of ChildSprite list of the foundations.
+	Point foundation_offset[FOUNDATION_PART_END];                          ///< Pixeloffset for ground sprites on the foundations.
 };
 
 static ViewportDrawer *_cur_vd;
@@ -155,7 +164,7 @@
 
 void DeleteWindowViewport(Window *w)
 {
-	CLRBIT(_active_viewports, w->viewport - _viewports);
+	ClrBit(_active_viewports, w->viewport - _viewports);
 	w->viewport->width = 0;
 	w->viewport = NULL;
 }
@@ -171,7 +180,7 @@
 		assert(vp != endof(_viewports));
 		if (vp->width == 0) break;
 	}
-	SETBIT(_active_viewports, bit);
+	SetBit(_active_viewports, bit);
 
 	vp->left = x + w->left;
 	vp->top = y + w->top;
@@ -288,10 +297,13 @@
 	vp->virtual_left = x;
 	vp->virtual_top = y;
 
-	old_left = UnScaleByZoom(old_left, vp->zoom);
-	old_top = UnScaleByZoom(old_top, vp->zoom);
-	x = UnScaleByZoom(x, vp->zoom);
-	y = UnScaleByZoom(y, vp->zoom);
+	/* viewport is bound to its left top corner, so it must be rounded down (UnScaleByZoomLower)
+	 * else glitch described in FS#1412 will happen (offset by 1 pixel with zoom level > NORMAL)
+	 */
+	old_left = UnScaleByZoomLower(old_left, vp->zoom);
+	old_top = UnScaleByZoomLower(old_top, vp->zoom);
+	x = UnScaleByZoomLower(x, vp->zoom);
+	y = UnScaleByZoomLower(y, vp->zoom);
 
 	old_left -= x;
 	old_top -= y;
@@ -333,8 +345,8 @@
 	ViewPort *vp = w->viewport;
 
 	if (vp != NULL &&
-	    IS_INT_INSIDE(x, vp->left, vp->left + vp->width) &&
-			IS_INT_INSIDE(y, vp->top, vp->top + vp->height))
+	    IsInsideMM(x, vp->left, vp->left + vp->width) &&
+			IsInsideMM(y, vp->top, vp->top + vp->height))
 		return vp;
 
 	return NULL;
@@ -361,14 +373,20 @@
 	/* we need to move variables in to the valid range, as the
 	 * GetTileZoomCenterWindow() function can call here with invalid x and/or y,
 	 * when the user tries to zoom out along the sides of the map */
-	a = clamp(a, 0, (int)(MapMaxX() * TILE_SIZE) - 1);
-	b = clamp(b, 0, (int)(MapMaxY() * TILE_SIZE) - 1);
-
-	z = GetSlopeZ(a,     b    ) / 2;
-	z = GetSlopeZ(a + z, b + z) / 2;
-	z = GetSlopeZ(a + z, b + z) / 2;
-	z = GetSlopeZ(a + z, b + z) / 2;
-	z = GetSlopeZ(a + z, b + z) / 2;
+	a = Clamp(a, 0, (int)(MapMaxX() * TILE_SIZE) - 1);
+	b = Clamp(b, 0, (int)(MapMaxY() * TILE_SIZE) - 1);
+
+	/* (a, b) is the X/Y-world coordinate that belongs to (x,y) if the landscape would be completely flat on height 0.
+	 * Now find the Z-world coordinate by fix point iteration.
+	 * This is a bit tricky because the tile height is non-continuous at foundations.
+	 * The clicked point should be approached from the back, otherwise there are regions that are not clickable.
+	 * (FOUNDATION_HALFTILE_LOWER on SLOPE_STEEP_S hides north halftile completely)
+	 * So give it a z-malus of 4 in the first iterations.
+	 */
+	z = 0;
+	for (int i = 0; i < 5; i++) z = GetSlopeZ(a + max(z, 4u) - 4, b + max(z, 4u) - 4) / 2;
+	for (uint malus = 3; malus > 0; malus--) z = GetSlopeZ(a + max(z, malus) - malus, b + max(z, malus) - malus) / 2;
+	for (int i = 0; i < 5; i++) z = GetSlopeZ(a + z, b + z) / 2;
 
 	pt.x = a + z;
 	pt.y = b + z;
@@ -425,10 +443,10 @@
  * @param widget_zoom_out widget index for window with zoom-out button */
 void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out)
 {
-	SetWindowWidgetDisabledState(w, widget_zoom_in, vp->zoom == ZOOM_LVL_MIN);
+	w->SetWidgetDisabledState(widget_zoom_in, vp->zoom == ZOOM_LVL_MIN);
 	InvalidateWidget(w, widget_zoom_in);
 
-	SetWindowWidgetDisabledState(w, widget_zoom_out, vp->zoom == ZOOM_LVL_MAX);
+	w->SetWidgetDisabledState(widget_zoom_out, vp->zoom == ZOOM_LVL_MAX);
 	InvalidateWidget(w, widget_zoom_out);
 }
 
@@ -470,6 +488,35 @@
 }
 
 /**
+ * Adds a child sprite to the active foundation.
+ *
+ * The pixel offset of the sprite relative to the ParentSprite is the sum of the offset passed to OffsetGroundSprite() and extra_offs_?.
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param sub Only draw a part of the sprite.
+ * @param foundation_part Foundation part.
+ * @param extra_offs_x Pixel X offset for the sprite position.
+ * @param extra_offs_y Pixel Y offset for the sprite position.
+ */
+static void AddChildSpriteToFoundation(SpriteID image, SpriteID pal, const SubSprite *sub, FoundationPart foundation_part, int extra_offs_x, int extra_offs_y)
+{
+	ViewportDrawer *vd = _cur_vd;
+	assert(IsInsideMM(foundation_part, 0, FOUNDATION_PART_END));
+	assert(vd->foundation[foundation_part] != NULL);
+	Point offs = vd->foundation_offset[foundation_part];
+
+	/* Change the active ChildSprite list to the one of the foundation */
+	ChildScreenSpriteToDraw **old_child = vd->last_child;
+	vd->last_child = vd->last_foundation_child[foundation_part];
+
+	AddChildSpriteScreen(image, pal, offs.x + extra_offs_x, offs.y + extra_offs_y, false, sub);
+
+	/* Switch back to last ChildSprite list */
+	vd->last_child = old_child;
+}
+
+/**
  * 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.
  *
@@ -479,21 +526,45 @@
  */
 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, false, sub);
+	ViewportDrawer *vd = _cur_vd;
+	/* Switch to first foundation part, if no foundation was drawn */
+	if (vd->foundation_part == FOUNDATION_PART_NONE) vd->foundation_part = FOUNDATION_PART_NORMAL;
+
+	if (vd->foundation[vd->foundation_part] != NULL) {
+		AddChildSpriteToFoundation(image, pal, sub, vd->foundation_part, 0, 0);
 	} else {
-		_added_tile_sprite = true;
 		DrawGroundSpriteAt(image, pal, _cur_ti->x, _cur_ti->y, _cur_ti->z, sub);
 	}
 }
 
 
+/**
+ * Called when a foundation has been drawn for the current tile.
+ * Successive ground sprites for the current tile will be drawn as child sprites of the "foundation"-ParentSprite, not as TileSprites.
+ *
+ * @param x sprite x-offset (screen coordinates) of ground sprites relative to the "foundation"-ParentSprite.
+ * @param y sprite y-offset (screen coordinates) of ground sprites relative to the "foundation"-ParentSprite.
+ */
 void OffsetGroundSprite(int x, int y)
 {
-	_cur_vd->offs_x = x;
-	_cur_vd->offs_y = y;
-	_offset_ground_sprites = true;
+	ViewportDrawer *vd = _cur_vd;
+	/* Switch to next foundation part */
+	switch (vd->foundation_part) {
+		case FOUNDATION_PART_NONE:
+			vd->foundation_part = FOUNDATION_PART_NORMAL;
+			break;
+		case FOUNDATION_PART_NORMAL:
+			vd->foundation_part = FOUNDATION_PART_HALFTILE;
+			break;
+		default: NOT_REACHED();
+	}
+
+	/* vd->last_child == NULL if foundation sprite was clipped by the viewport bounds */
+	if (vd->last_child != NULL) vd->foundation[vd->foundation_part] = vd->parent_list[-1];
+
+	vd->foundation_offset[vd->foundation_part].x = x;
+	vd->foundation_offset[vd->foundation_part].y = y;
+	vd->last_foundation_child[vd->foundation_part] = vd->last_child;
 }
 
 /**
@@ -557,7 +628,7 @@
 
 	/* make the sprites transparent with the right palette */
 	if (transparent) {
-		SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
+		SetBit(image, PALETTE_MODIFIER_TRANSPARENT);
 		pal = PALETTE_TO_TRANSPARENT;
 	}
 
@@ -669,7 +740,7 @@
 
 	/* make the sprites transparent with the right palette */
 	if (transparent) {
-		SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
+		SetBit(image, PALETTE_MODIFIER_TRANSPARENT);
 		pal = PALETTE_TO_TRANSPARENT;
 	}
 
@@ -684,7 +755,11 @@
 
 	vd->spritelist_mem += sizeof(ChildScreenSpriteToDraw);
 
+	/* Append the sprite to the active ChildSprite list.
+	 * If the active ParentSprite is a foundation, update last_foundation_child as well. */
 	*vd->last_child = cs;
+	if (vd->last_foundation_child[0] == vd->last_child) vd->last_foundation_child[0] = &cs->next;
+	if (vd->last_foundation_child[1] == vd->last_child) vd->last_foundation_child[1] = &cs->next;
 	vd->last_child = &cs->next;
 
 	cs->image = image;
@@ -724,12 +799,26 @@
 }
 
 
-static void DrawSelectionSprite(SpriteID image, SpriteID pal, const TileInfo *ti)
+/**
+ * Draws sprites between ground sprite and everything above.
+ *
+ * The sprite is either drawn as TileSprite or as ChildSprite of the active foundation.
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param ti TileInfo Tile that is being drawn
+ * @param z_offset Z offset relative to the groundsprite. Only used for the sprite position, not for sprite sorting.
+ * @param foundation_part Foundation part the sprite belongs to.
+ */
+static void DrawSelectionSprite(SpriteID image, SpriteID pal, const TileInfo *ti, int z_offset, FoundationPart foundation_part)
 {
-	if (_added_tile_sprite && !(_thd.drawstyle & HT_LINE)) { // draw on real ground
-		DrawGroundSpriteAt(image, pal, ti->x, ti->y, ti->z + 7);
-	} else { // draw on top of foundation
-		AddSortableSpriteToDraw(image, pal, ti->x, ti->y, 0x10, 0x10, 1, ti->z + 7);
+	/* FIXME: This is not totally valid for some autorail highlights, that extent over the edges of the tile. */
+	if (_cur_vd->foundation[foundation_part] == NULL) {
+		/* draw on real ground */
+		DrawGroundSpriteAt(image, pal, ti->x, ti->y, ti->z + z_offset);
+	} else {
+		/* draw on top of foundation */
+		AddChildSpriteToFoundation(image, pal, NULL, foundation_part, 0, -z_offset);
 	}
 }
 
@@ -741,7 +830,23 @@
  */
 static void DrawTileSelectionRect(const TileInfo *ti, SpriteID pal)
 {
-	DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], pal, ti);
+	SpriteID sel;
+	if (IsHalftileSlope(ti->tileh)) {
+		Corner halftile_corner = GetHalftileSlopeCorner(ti->tileh);
+		SpriteID sel2 = SPR_HALFTILE_SELECTION_FLAT + halftile_corner;
+		DrawSelectionSprite(sel2, pal, ti, 7 + TILE_HEIGHT, FOUNDATION_PART_HALFTILE);
+
+		Corner opposite_corner = OppositeCorner(halftile_corner);
+		if (IsSteepSlope(ti->tileh)) {
+			sel = SPR_HALFTILE_SELECTION_DOWN;
+		} else {
+			sel = ((ti->tileh & SlopeWithOneCornerRaised(opposite_corner)) != 0 ? SPR_HALFTILE_SELECTION_UP : SPR_HALFTILE_SELECTION_FLAT);
+		}
+		sel += opposite_corner;
+	} else {
+		sel = SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh];
+	}
+	DrawSelectionSprite(sel, pal, ti, 7, FOUNDATION_PART_NORMAL);
 }
 
 static bool IsPartOfAutoLine(int px, int py)
@@ -788,7 +893,19 @@
 	SpriteID pal;
 	int offset;
 
-	offset = _AutorailTilehSprite[ti->tileh][autorail_type];
+	FoundationPart foundation_part = FOUNDATION_PART_NORMAL;
+	Slope autorail_tileh = (Slope)(ti->tileh & ~SLOPE_HALFTILE_MASK);
+	if (IsHalftileSlope(ti->tileh)) {
+		static const uint _lower_rail[4] = { 5U, 2U, 4U, 3U };
+		Corner halftile_corner = GetHalftileSlopeCorner(ti->tileh);
+		if (autorail_type != _lower_rail[halftile_corner]) {
+			foundation_part = FOUNDATION_PART_HALFTILE;
+			/* Here we draw the highlights of the "three-corners-raised"-slope. That looks ok to me. */
+			autorail_tileh = SlopeWithThreeCornersRaised(OppositeCorner(halftile_corner));
+		}
+	}
+
+	offset = _AutorailTilehSprite[autorail_tileh][autorail_type];
 	if (offset >= 0) {
 		image = SPR_AUTORAIL_BASE + offset;
 		pal = PAL_NONE;
@@ -797,7 +914,7 @@
 		pal = PALETTE_SEL_TILE_RED;
 	}
 
-	DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti);
+	DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti, 7, foundation_part);
 }
 
 /**
@@ -816,8 +933,8 @@
 	if (_thd.drawstyle == 0) return;
 
 	/* Inside the inner area? */
-	if (IS_INSIDE_1D(ti->x, _thd.pos.x, _thd.size.x) &&
-			IS_INSIDE_1D(ti->y, _thd.pos.y, _thd.size.y)) {
+	if (IsInsideBS(ti->x, _thd.pos.x, _thd.size.x) &&
+			IsInsideBS(ti->y, _thd.pos.y, _thd.size.y)) {
 		if (_thd.drawstyle & HT_RECT) {
 			if (_thd.FSMportLayout != NULL) {
 				byte *b = *_thd.FSMportLayout;
@@ -846,18 +963,26 @@
 			}
 		} else if (_thd.drawstyle & HT_POINT) {
 			/* Figure out the Z coordinate for the single dot. */
-			byte z = ti->z;
+			byte z = 0;
+			FoundationPart foundation_part = FOUNDATION_PART_NORMAL;
 			if (ti->tileh & SLOPE_N) {
 				z += TILE_HEIGHT;
-				if (ti->tileh == SLOPE_STEEP_N) z += TILE_HEIGHT;
+				if ((ti->tileh & ~SLOPE_HALFTILE_MASK) == SLOPE_STEEP_N) z += TILE_HEIGHT;
 			}
-			DrawGroundSpriteAt(_cur_dpi->zoom <= ZOOM_LVL_DETAIL ? SPR_DOT : SPR_DOT_SMALL, PAL_NONE, ti->x, ti->y, z);
+			if (IsHalftileSlope(ti->tileh)) {
+				Corner halftile_corner = GetHalftileSlopeCorner(ti->tileh);
+				if ((halftile_corner == CORNER_W) || (halftile_corner == CORNER_E)) z += TILE_HEIGHT;
+				if (halftile_corner != CORNER_S) {
+					foundation_part = FOUNDATION_PART_HALFTILE;
+					if (IsSteepSlope(ti->tileh)) z -= TILE_HEIGHT;
+				}
+			}
+			DrawSelectionSprite(_cur_dpi->zoom <= ZOOM_LVL_DETAIL ? SPR_DOT : SPR_DOT_SMALL, PAL_NONE, ti, z, foundation_part);
 		} else if (_thd.drawstyle & HT_RAIL /*&& _thd.place_mode == VHM_RAIL*/) {
 			/* autorail highlight piece under cursor */
 			uint type = _thd.drawstyle & 0xF;
 			assert(type <= 5);
 			DrawAutorailSelection(ti, _AutorailType[type][0]);
-
 		} else if (IsPartOfAutoLine(ti->x, ti->y)) {
 			/* autorail highlighting long line */
 			int dir = _thd.drawstyle & ~0xF0;
@@ -867,7 +992,7 @@
 				side = 0;
 			} else {
 				TileIndex start = TileVirtXY(_thd.selstart.x, _thd.selstart.y);
-				side = delta(delta(TileX(start), TileX(ti->tile)), delta(TileY(start), TileY(ti->tile)));
+				side = Delta(Delta(TileX(start), TileX(ti->tile)), Delta(TileY(start), TileY(ti->tile)));
 			}
 
 			DrawAutorailSelection(ti, _AutorailType[dir][side]);
@@ -878,8 +1003,8 @@
 	/* Check if it's inside the outer area? */
 	if (_thd.outersize.x &&
 			_thd.size.x < _thd.size.x + _thd.outersize.x &&
-			IS_INSIDE_1D(ti->x, _thd.pos.x + _thd.offs.x, _thd.size.x + _thd.outersize.x) &&
-			IS_INSIDE_1D(ti->y, _thd.pos.y + _thd.offs.y, _thd.size.y + _thd.outersize.y)) {
+			IsInsideBS(ti->x, _thd.pos.x + _thd.offs.x, _thd.size.x + _thd.outersize.x) &&
+			IsInsideBS(ti->y, _thd.pos.y + _thd.offs.y, _thd.size.y + _thd.outersize.y)) {
 		/* Draw a blue rect. */
 		DrawTileSelectionRect(ti, PALETTE_SEL_TILE_BLUE);
 		return;
@@ -938,8 +1063,11 @@
 			y_cur += 0x10;
 			x_cur -= 0x10;
 
-			_added_tile_sprite = false;
-			_offset_ground_sprites = false;
+			vd->foundation_part = FOUNDATION_PART_NONE;
+			vd->foundation[0] = NULL;
+			vd->foundation[1] = NULL;
+			vd->last_foundation_child[0] = NULL;
+			vd->last_foundation_child[1] = NULL;
 
 			_tile_type_procs[tt]->draw_tile_proc(&ti);
 			DrawTileSelection(&ti);
@@ -959,7 +1087,7 @@
 	Town *t;
 	int left, top, right, bottom;
 
-	if (!HASBIT(_display_opt, DO_SHOW_TOWN_NAMES) || _game_mode == GM_MENU)
+	if (!HasBit(_display_opt, DO_SHOW_TOWN_NAMES) || _game_mode == GM_MENU)
 		return;
 
 	left = dpi->left;
@@ -1035,7 +1163,7 @@
 	int left, top, right, bottom;
 	const Station *st;
 
-	if (!HASBIT(_display_opt, DO_SHOW_STATION_NAMES) || _game_mode == GM_MENU)
+	if (!HasBit(_display_opt, DO_SHOW_STATION_NAMES) || _game_mode == GM_MENU)
 		return;
 
 	left = dpi->left;
@@ -1105,7 +1233,7 @@
 	const Sign *si;
 	int left, top, right, bottom;
 
-	if (!HASBIT(_display_opt, DO_SHOW_SIGNS))
+	if (!HasBit(_display_opt, DO_SHOW_SIGNS))
 		return;
 
 	left = dpi->left;
@@ -1148,7 +1276,7 @@
 						top    < si->sign.top + ScaleByZoom(12, dpi->zoom) &&
 						right  > si->sign.left &&
 						left   < si->sign.left + ScaleByZoom(si->sign.width_2, dpi->zoom)) {
-					AddSign(si, STR_2002, si->sign.width_2 | 0x8000);
+					AddSign(si, IsTransparencySet(TO_SIGNS) ? STR_2002_WHITE : STR_2002, si->sign.width_2 | 0x8000);
 				}
 			}
 			break;
@@ -1175,7 +1303,7 @@
 	const Waypoint *wp;
 	int left, top, right, bottom;
 
-	if (!HASBIT(_display_opt, DO_WAYPOINTS))
+	if (!HasBit(_display_opt, DO_WAYPOINTS))
 		return;
 
 	left = dpi->left;
@@ -1384,10 +1512,10 @@
 
 		/* Draw the rectangle if 'tranparent station signs' is off,
 		 * or if we are drawing a general text sign (STR_2806) */
-			if (!HASBIT(_transparent_opt, TO_SIGNS) || ss->string == STR_2806) {
+			if (!IsTransparencySet(TO_SIGNS) || ss->string == STR_2806) {
 				DrawFrameRect(
 					x, y, x + w, bottom, ss->color,
-					HASBIT(_transparent_opt, TO_SIGNS) ? FR_TRANSPARENT : FR_NONE
+					IsTransparencySet(TO_SIGNS) ? FR_TRANSPARENT : FR_NONE
 				);
 			}
 		}
@@ -1396,12 +1524,12 @@
 		SetDParam(1, ss->params[1]);
 		/* if we didn't draw a rectangle, or if transparant building is on,
 		 * draw the text in the color the rectangle would have */
-		if (HASBIT(_transparent_opt, TO_SIGNS) && ss->string != STR_2806 && ss->width != 0) {
+		if (IsTransparencySet(TO_SIGNS) && ss->string != STR_2806 && ss->width != 0) {
 			/* Real colors need the IS_PALETTE_COLOR flag
 			 * otherwise colors from _string_colormap are assumed. */
 			colour = _colour_gradient[ss->color][6] | IS_PALETTE_COLOR;
 		} else {
-			colour = 16;
+			colour = TC_BLACK;
 		}
 		DrawString(
 			UnScaleByZoom(ss->x, zoom), UnScaleByZoom(ss->y, zoom) - (ss->width & 0x8000 ? 2 : 0),
@@ -1546,8 +1674,8 @@
 	int vy =  x + y * 2;
 
 	/* clamp to size of map */
-	vx = clamp(vx, 0, MapMaxX() * TILE_SIZE * 4);
-	vy = clamp(vy, 0, MapMaxY() * TILE_SIZE * 4);
+	vx = Clamp(vx, 0, MapMaxX() * TILE_SIZE * 4);
+	vy = Clamp(vy, 0, MapMaxY() * TILE_SIZE * 4);
 
 	/* Convert map coordinates to viewport coordinates */
 	x = (-vx + vy) / 2;
@@ -1578,8 +1706,8 @@
 			if (_patches.smooth_scroll) {
 				int max_scroll = ScaleByMapSize1D(512);
 				/* Not at our desired positon yet... */
-				WP(w, vp_d).scrollpos_x += clamp(delta_x / 4, -max_scroll, max_scroll);
-				WP(w, vp_d).scrollpos_y += clamp(delta_y / 4, -max_scroll, max_scroll);
+				WP(w, vp_d).scrollpos_x += Clamp(delta_x / 4, -max_scroll, max_scroll);
+				WP(w, vp_d).scrollpos_y += Clamp(delta_y / 4, -max_scroll, max_scroll);
 			} else {
 				WP(w, vp_d).scrollpos_x = WP(w, vp_d).dest_scrollpos_x;
 				WP(w, vp_d).scrollpos_y = WP(w, vp_d).dest_scrollpos_y;
@@ -1651,8 +1779,8 @@
 	uint z = 0;
 	Point pt;
 
-	if (IS_INT_INSIDE(x, 0, MapSizeX() * TILE_SIZE) &&
-			IS_INT_INSIDE(y, 0, MapSizeY() * TILE_SIZE))
+	if (IsInsideMM(x, 0, MapSizeX() * TILE_SIZE) &&
+			IsInsideMM(y, 0, MapSizeY() * TILE_SIZE))
 		z = GetTileZ(TileVirtXY(x, y));
 	pt = RemapCoords(x, y, z);
 
@@ -1715,7 +1843,7 @@
 {
 	const Town *t;
 
-	if (!HASBIT(_display_opt, DO_SHOW_TOWN_NAMES)) return false;
+	if (!HasBit(_display_opt, DO_SHOW_TOWN_NAMES)) return false;
 
 	switch (vp->zoom) {
 		case ZOOM_LVL_NORMAL:
@@ -1773,7 +1901,7 @@
 {
 	const Station *st;
 
-	if (!HASBIT(_display_opt, DO_SHOW_STATION_NAMES)) return false;
+	if (!HasBit(_display_opt, DO_SHOW_STATION_NAMES)) return false;
 
 	switch (vp->zoom) {
 		case ZOOM_LVL_NORMAL:
@@ -1831,7 +1959,7 @@
 {
 	const Sign *si;
 
-	if (!HASBIT(_display_opt, DO_SHOW_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
+	if (!HasBit(_display_opt, DO_SHOW_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
 
 	switch (vp->zoom) {
 		case ZOOM_LVL_NORMAL:
@@ -1889,7 +2017,7 @@
 {
 	const Waypoint *wp;
 
-	if (!HASBIT(_display_opt, DO_WAYPOINTS)) return false;
+	if (!HasBit(_display_opt, DO_WAYPOINTS)) return false;
 
 	switch (vp->zoom) {
 		case ZOOM_LVL_NORMAL:
@@ -2138,8 +2266,8 @@
 		x1 = _thd.selend.x;
 		y1 = _thd.selend.y;
 		if (x1 != -1) {
-			int x2 = _thd.selstart.x;
-			int y2 = _thd.selstart.y;
+			int x2 = _thd.selstart.x & ~0xF;
+			int y2 = _thd.selstart.y & ~0xF;
 			x1 &= ~0xF;
 			y1 &= ~0xF;
 
@@ -2167,6 +2295,10 @@
 					break;
 				case VHM_RAIL:
 					_thd.new_drawstyle = GetAutorailHT(pt.x, pt.y); // draw one highlighted tile
+					break;
+				default:
+					NOT_REACHED();
+					break;
 			}
 			_thd.new_pos.x = x1 & ~0xF;
 			_thd.new_pos.y = y1 & ~0xF;
@@ -2194,7 +2326,7 @@
 }
 
 /** highlighting tiles while only going over them with the mouse */
-void VpStartPlaceSizing(TileIndex tile, byte method, byte process)
+void VpStartPlaceSizing(TileIndex tile, ViewportPlaceMethod method, byte process)
 {
 	_thd.select_method = method;
 	_thd.select_proc   = process;
@@ -2202,6 +2334,17 @@
 	_thd.selstart.x = TileX(tile) * TILE_SIZE;
 	_thd.selend.y = TileY(tile) * TILE_SIZE;
 	_thd.selstart.y = TileY(tile) * TILE_SIZE;
+
+	/* Needed so several things (road, autoroad, bridges, ...) are placed correctly.
+	 * In effect, placement starts from the centre of a tile
+	 */
+	if (method == VPM_X_OR_Y || method == VPM_FIX_X || method == VPM_FIX_Y) {
+		_thd.selend.x += TILE_SIZE / 2;
+		_thd.selend.y += TILE_SIZE / 2;
+		_thd.selstart.x += TILE_SIZE / 2;
+		_thd.selstart.y += TILE_SIZE / 2;
+	}
+
 	if (_thd.place_mode == VHM_RECT) {
 		_thd.place_mode = VHM_SPECIAL;
 		_thd.next_drawstyle = HT_RECT;
@@ -2404,8 +2547,8 @@
 
 	int dx = thd->selstart.x - (thd->selend.x & ~0xF);
 	int dy = thd->selstart.y - (thd->selend.y & ~0xF);
-	w = myabs(dx) + 16;
-	h = myabs(dy) + 16;
+	w = abs(dx) + 16;
+	h = abs(dy) + 16;
 
 	if (TileVirtXY(thd->selstart.x, thd->selstart.y) == TileVirtXY(x, y)) { // check if we're only within one tile
 		if (method == VPM_RAILDIRS) {
@@ -2531,7 +2674,7 @@
  * @param y Y coordinate of end of selection
  * @param method modifies the way tiles are selected. Possible
  * methods are VPM_* in viewport.h */
-void VpSelectTilesWithMethod(int x, int y, int method)
+void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method)
 {
 	int sx, sy;
 	HighLightStyle style;
@@ -2549,6 +2692,7 @@
 		return;
 	}
 
+	/* Needed so level-land is placed correctly */
 	if (_thd.next_drawstyle == HT_POINT) {
 		x += TILE_SIZE / 2;
 		y += TILE_SIZE / 2;
@@ -2559,7 +2703,7 @@
 
 	switch (method) {
 		case VPM_X_OR_Y: /* drag in X or Y direction */
-			if (myabs(sy - y) < myabs(sx - x)) {
+			if (abs(sy - y) < abs(sx - x)) {
 				y = sy;
 				style = HT_DIR_X;
 			} else {
@@ -2600,8 +2744,8 @@
 
 		case VPM_X_AND_Y_LIMITED: { /* drag an X by Y constrained rect area */
 			int limit = (_thd.sizelimit - 1) * TILE_SIZE;
-			x = sx + clamp(x - sx, -limit, limit);
-			y = sy + clamp(y - sy, -limit, limit);
+			x = sx + Clamp(x - sx, -limit, limit);
+			y = sy + Clamp(y - sy, -limit, limit);
 			} /* Fallthrough */
 		case VPM_X_AND_Y: { /* drag an X by Y area */
 			if (_patches.measure_tooltip) {
@@ -2611,8 +2755,8 @@
 
 				TileIndex t0 = TileVirtXY(sx, sy);
 				TileIndex t1 = TileVirtXY(x, y);
-				uint dx = delta(TileX(t0), TileX(t1)) + 1;
-				uint dy = delta(TileY(t0), TileY(t1)) + 1;
+				uint dx = Delta(TileX(t0), TileX(t1)) + 1;
+				uint dy = Delta(TileY(t0), TileY(t1)) + 1;
 				byte index = 0;
 				uint64 params[3];
 
@@ -2699,20 +2843,20 @@
 	return false;
 }
 
-void SetObjectToPlaceWnd(CursorID icon, SpriteID pal, byte mode, Window *w)
+void SetObjectToPlaceWnd(CursorID icon, SpriteID pal, ViewportHighlightMode mode, Window *w)
 {
 	SetObjectToPlace(icon, pal, mode, w->window_class, w->window_number);
 }
 
 #include "table/animcursors.h"
 
-void SetObjectToPlace(CursorID icon, SpriteID pal, byte mode, WindowClass window_class, WindowNumber window_num)
+void SetObjectToPlace(CursorID icon, SpriteID pal, ViewportHighlightMode mode, WindowClass window_class, WindowNumber window_num)
 {
 	Window *w;
 
 	/* undo clicking on button */
-	if (_thd.place_mode != 0) {
-		_thd.place_mode = 0;
+	if (_thd.place_mode != VHM_NONE) {
+		_thd.place_mode = VHM_NONE;
 		w = FindWindowById(_thd.window_class, _thd.window_number);
 		if (w != NULL) CallWindowEventNP(w, WE_ABORT_PLACE_OBJ);
 	}
@@ -2721,8 +2865,8 @@
 
 	_thd.make_square_red = false;
 
-	if (mode == VHM_DRAG) { // mode 4 is for dragdropping trains in the depot window
-		mode = 0;
+	if (mode == VHM_DRAG) { // VHM_DRAG is for dragdropping trains in the depot window
+		mode = VHM_NONE;
 		_special_mouse_mode = WSM_DRAGDROP;
 	} else {
 		_special_mouse_mode = WSM_NONE;
--- a/src/viewport.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/viewport.h	Mon Dec 03 23:39:38 2007 +0000
@@ -74,24 +74,21 @@
 void SetTileSelectSize(int w, int h);
 void SetTileSelectBigSize(int ox, int oy, int sx, int sy);
 
-void VpStartPlaceSizing(TileIndex tile, byte method, byte process);
-void VpSetPresizeRange(uint from, uint to);
-void VpSetPlaceSizingLimit(int limit);
-
 Vehicle *CheckMouseOverVehicle();
 
-enum {
-	VPM_X_OR_Y          = 0,
-	VPM_FIX_X           = 1,
-	VPM_FIX_Y           = 2,
-	VPM_RAILDIRS        = 3,
-	VPM_X_AND_Y         = 4,
-	VPM_X_AND_Y_LIMITED = 5,
-	VPM_SIGNALDIRS      = 6
+/** Viewport place method (type of highlighted area and placed objects) */
+enum ViewportPlaceMethod {
+	VPM_X_OR_Y          = 0, ///< drag in X or Y direction
+	VPM_FIX_X           = 1, ///< drag only in X axis
+	VPM_FIX_Y           = 2, ///< drag only in Y axis
+	VPM_RAILDIRS        = 3, ///< all rail directions
+	VPM_X_AND_Y         = 4, ///< area of land in X and Y directions
+	VPM_X_AND_Y_LIMITED = 5, ///< area of land of limited size
+	VPM_SIGNALDIRS      = 6, ///< similiar to VMP_RAILDIRS, but with different cursor
 };
 
-/* viewport highlight mode (for highlighting tiles below cursor) */
-enum {
+/** Viewport highlight mode (for highlighting tiles below cursor) */
+enum ViewportHighlightMode {
 	VHM_NONE    = 0, ///< default
 	VHM_RECT    = 1, ///< rectangle (stations, depots, ...)
 	VHM_POINT   = 2, ///< point (lower land, raise land, level land, ...)
@@ -100,7 +97,10 @@
 	VHM_RAIL    = 5, ///< rail pieces
 };
 
-void VpSelectTilesWithMethod(int x, int y, int method);
+void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method);
+void VpStartPlaceSizing(TileIndex tile, ViewportPlaceMethod method, byte process);
+void VpSetPresizeRange(uint from, uint to);
+void VpSetPlaceSizingLimit(int limit);
 
 /* highlighting draw styles */
 typedef byte HighLightStyle;
@@ -147,12 +147,12 @@
 	FSMportsLayout *FSMportLayout; ///< used to identify the airport construction data to allow for holes in airport designs
 	FSMportsLayout *FSMportMask;   ///< used to identify the airport construction mask for blue/green water/land colouring of highlight
 
-	byte place_mode;
+	ViewportHighlightMode place_mode;
 	bool make_square_red;
 	WindowClass window_class;
 	WindowNumber window_number;
 
-	byte select_method;
+	ViewportPlaceMethod select_method;
 	byte select_proc;
 
 	TileIndex redsq;
@@ -160,7 +160,7 @@
 
 
 /* common button handler */
-bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, int mode, PlaceProc *placeproc);
+bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, ViewportHighlightMode mode, PlaceProc *placeproc);
 
 VARDEF Point _tile_fract_coords;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/water.h	Mon Dec 03 23:39:38 2007 +0000
@@ -0,0 +1,13 @@
+/* $Id$ */
+
+/** @file water.h Functions related to water (management) */
+
+#ifndef WATER_H
+#define WATER_H
+
+void TileLoop_Water(TileIndex tile);
+void DrawShipDepotSprite(int x, int y, int image);
+void DrawCanalWater(TileIndex tile);
+void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o);
+
+#endif /* WATER_H */
--- a/src/water_cmd.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/water_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -30,21 +30,23 @@
 #include "newgrf.h"
 #include "newgrf_canal.h"
 #include "misc/autoptr.hpp"
+#include "transparency.h"
 
+/** Array for the shore sprites */
 static const SpriteID _water_shore_sprites[] = {
 	0,
-	SPR_SHORE_TILEH_1,
-	SPR_SHORE_TILEH_2,
-	SPR_SHORE_TILEH_3,
-	SPR_SHORE_TILEH_4,
+	SPR_SHORE_TILEH_1,  // SLOPE_W
+	SPR_SHORE_TILEH_2,  // SLOPE_S
+	SPR_SHORE_TILEH_3,  // SLOPE_SW
+	SPR_SHORE_TILEH_4,  // SLOPE_E
 	0,
-	SPR_SHORE_TILEH_6,
+	SPR_SHORE_TILEH_6,  // SLOPE_SE
 	0,
-	SPR_SHORE_TILEH_8,
-	SPR_SHORE_TILEH_9,
+	SPR_SHORE_TILEH_8,  // SLOPE_N
+	SPR_SHORE_TILEH_9,  // SLOPE_NW
 	0,
 	0,
-	SPR_SHORE_TILEH_12,
+	SPR_SHORE_TILEH_12, // SLOPE_NE
 	0,
 	0
 };
@@ -53,6 +55,42 @@
 static Vehicle *FindFloodableVehicleOnTile(TileIndex tile);
 static void FloodVehicle(Vehicle *v);
 
+/**
+ * Makes a tile canal or water depending on the surroundings.
+ * This as for example docks and shipdepots do not store
+ * whether the tile used to be canal or 'normal' water.
+ * @param t the tile to change.
+ * @param o the owner of the new tile.
+ */
+void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o)
+{
+	assert(GetTileSlope(t, NULL) == SLOPE_FLAT);
+
+	/* Non-sealevel -> canal */
+	if (TileHeight(t) != 0) {
+		MakeCanal(t, o);
+		return;
+	}
+
+	bool has_water = false;
+	bool has_canal = false;
+
+	for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
+		TileIndex neighbour = TileAddByDiagDir(t, dir);
+		if (IsTileType(neighbour, MP_WATER)) {
+			has_water |= IsSea(neighbour) || IsCoast(neighbour);
+			has_canal |= IsCanal(neighbour);
+		}
+	}
+	if (has_canal || !has_water) {
+		MakeCanal(t, o);
+	} else {
+		MakeWater(t);
+	}
+	MarkTileDirtyByTile(t);
+}
+
+
 /** Build a ship depot.
  * @param tile tile where ship depot is built
  * @param flags type of operation
@@ -71,7 +109,7 @@
 
 	tile2 = tile + (axis == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
 
-	if (!IsClearWaterTile(tile) || !IsClearWaterTile(tile2))
+	if (!IsWaterTile(tile) || !IsWaterTile(tile2))
 		return_cmd_error(STR_3801_MUST_BE_BUILT_ON_WATER);
 
 	if (IsBridgeAbove(tile) || IsBridgeAbove(tile2)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
@@ -104,11 +142,11 @@
 
 	if (!IsShipDepot(tile)) return CMD_ERROR;
 	if (!CheckTileOwnership(tile)) return CMD_ERROR;
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 	tile2 = GetOtherShipDepotTile(tile);
 
-	if (!EnsureNoVehicle(tile2)) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile2)) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
 		/* Kill the depot, which is registered at the northernmost tile. Use that one */
@@ -171,13 +209,13 @@
 	if (!CheckTileOwnership(tile) && GetTileOwner(tile) != OWNER_NONE) return CMD_ERROR;
 
 	/* make sure no vehicle is on the tile. */
-	if (!EnsureNoVehicle(tile) || !EnsureNoVehicle(tile + delta) || !EnsureNoVehicle(tile - delta))
+	if (!EnsureNoVehicleOnGround(tile) || !EnsureNoVehicleOnGround(tile + delta) || !EnsureNoVehicleOnGround(tile - delta))
 		return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
 		DoClearSquare(tile);
-		DoClearSquare(tile + delta);
-		DoClearSquare(tile - delta);
+		MakeWaterOrCanalDependingOnSurroundings(tile + delta, _current_player);
+		MakeWaterOrCanalDependingOnSurroundings(tile - delta, _current_player);
 	}
 
 	return CommandCost(_price.clear_water * 2);
@@ -238,7 +276,7 @@
 
 	if (p1 >= MapSize()) return CMD_ERROR;
 	/* Outside of the editor you can only build canals, not oceans */
-	if (HASBIT(p2, 0) && _game_mode != GM_EDITOR) return CMD_ERROR;
+	if (HasBit(p2, 0) && _game_mode != GM_EDITOR) return CMD_ERROR;
 
 	x = TileX(tile);
 	y = TileY(tile);
@@ -263,14 +301,14 @@
 		}
 
 		/* can't make water of water! */
-		if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || HASBIT(p2, 0))) continue;
+		if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || HasBit(p2, 0))) continue;
 
 		ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 		if (CmdFailed(ret)) return ret;
 		cost.AddCost(ret);
 
 		if (flags & DC_EXEC) {
-			if (TileHeight(tile) == 0 && HASBIT(p2, 0)) {
+			if (TileHeight(tile) == 0 && HasBit(p2, 0)) {
 				MakeWater(tile);
 			} else {
 				MakeCanal(tile, _current_player);
@@ -296,13 +334,13 @@
 			if (flags & DC_NO_WATER) return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER);
 
 			/* Make sure it's not an edge tile. */
-			if (!IS_INT_INSIDE(TileX(tile), 1, MapMaxX() - 1) ||
-					!IS_INT_INSIDE(TileY(tile), 1, MapMaxY() - 1)) {
+			if (!IsInsideMM(TileX(tile), 1, MapMaxX() - 1) ||
+					!IsInsideMM(TileY(tile), 1, MapMaxY() - 1)) {
 				return_cmd_error(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP);
 			}
 
 			/* Make sure no vehicle is on the tile */
-			if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 			if (GetTileOwner(tile) != OWNER_WATER && GetTileOwner(tile) != OWNER_NONE && !CheckTileOwnership(tile)) return CMD_ERROR;
 
@@ -313,13 +351,13 @@
 			Slope slope = GetTileSlope(tile, NULL);
 
 			/* Make sure no vehicle is on the tile */
-			if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 			if (flags & DC_EXEC) DoClearSquare(tile);
 			if (slope == SLOPE_N || slope == SLOPE_E || slope == SLOPE_S || slope == SLOPE_W) {
 				return CommandCost(_price.clear_water);
 			} else {
-				return CommandCost(_price.purchase_land);
+				return CommandCost(_price.clear_roughland);
 			}
 		}
 
@@ -376,7 +414,7 @@
 
 	/* Test for custom graphics, else use the default */
 	SpriteID dikes_base = GetCanalSprite(CF_DIKES, tile);
-	if (dikes_base == 0) dikes_base = SPR_CANALS_BASE + 57;
+	if (dikes_base == 0) dikes_base = SPR_CANAL_DIKES_BASE;
 
 	/* determine the edges around with water. */
 	wa  = IsWateredTile(TILE_ADDXY(tile, -1,  0)) << 0;
@@ -431,9 +469,9 @@
 	SpriteID locks_base = GetCanalSprite(CF_LOCKS, ti->tile);
 
 	/* If no custom graphics, use defaults */
-	if (water_base == 0) water_base = SPR_CANALS_BASE + 5;
+	if (water_base == 0) water_base = SPR_CANALS_BASE;
 	if (locks_base == 0) {
-		locks_base = SPR_CANALS_BASE + 9;
+		locks_base = SPR_SHIPLIFT_BASE;
 	} else {
 		/* If using custom graphics, ignore the variation on height */
 		base = 0;
@@ -448,7 +486,7 @@
 			ti->x + wdts->delta_x, ti->y + wdts->delta_y,
 			wdts->width, wdts->height,
 			wdts->unk, ti->z + wdts->delta_z,
-			HASBIT(_transparent_opt, TO_BUILDINGS));
+			IsTransparencySet(TO_BUILDINGS));
 	}
 }
 
@@ -457,13 +495,13 @@
 	switch (GetWaterTileType(ti->tile)) {
 		case WATER_TILE_CLEAR:
 			DrawGroundSprite(SPR_FLAT_WATER_TILE, PAL_NONE);
-			if (ti->z != 0 || !IsTileOwner(ti->tile, OWNER_WATER)) DrawCanalWater(ti->tile);
+			if (IsCanal(ti->tile)) DrawCanalWater(ti->tile);
 			DrawBridgeMiddle(ti);
 			break;
 
 		case WATER_TILE_COAST:
 			assert(!IsSteepSlope(ti->tileh));
-			if (_coast_base != 0) {
+			if (_loaded_newgrf_features.has_newwater) {
 				DrawGroundSprite(_coast_base + ti->tileh, PAL_NONE);
 			} else {
 				DrawGroundSprite(_water_shore_sprites[ti->tileh], PAL_NONE);
@@ -517,7 +555,7 @@
 {
 	switch (GetWaterTileType(tile)) {
 		case WATER_TILE_CLEAR:
-			if (TilePixelHeight(tile) == 0 || IsTileOwner(tile, OWNER_WATER)) {
+			if (!IsCanal(tile)) {
 				td->str = STR_3804_WATER;
 			} else {
 				td->str = STR_LANDINFO_CANAL;
@@ -537,6 +575,16 @@
 	/* not used */
 }
 
+/**
+ * Floods neighboured floodable tiles
+ *
+ * @param tile The water source tile that causes the flooding.
+ * @param offs[0] Destination tile to flood.
+ * @param offs[1] First corner of edge between source and dest tile.
+ * @param offs[2] Second corder of edge between source and dest tile.
+ * @param offs[3] Third corner of dest tile.
+ * @param offs[4] Fourth corner of dest tile.
+ */
 static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
 {
 	TileIndex target = TILE_ADD(tile, ToTileIndexDiff(offs[0]));
@@ -545,41 +593,29 @@
 	if (IsTileType(target, MP_WATER)) return;
 
 	/* Ensure sea-level FSMports do not flood */
-	if ((IsTileType(target, MP_STATION)))
-	{
-		if (GetStationByTile(target)->FSMport_flood_protected) return;
-	}
+	if (IsTileType(target, MP_STATION) && GetStationByTile(target)->FSMport_flood_protected) return;
 
+	/* Are both corners of the edge between source and dest on height 0 ? */
 	if (TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[1]))) != 0 ||
 			TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[2]))) != 0) {
 		return;
 	}
 
+	/* Is any corner of the dest tile raised? (First two corners already checked above. */
 	if (TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[3]))) != 0 ||
 			TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[4]))) != 0) {
 		/* make coast.. */
 		switch (GetTileType(target)) {
 			case MP_RAILWAY: {
-				TrackBits tracks;
-				Slope slope;
-
 				if (!IsPlainRailTile(target)) break;
 
-				tracks = GetTrackBits(target);
-				slope = GetTileSlope(target, NULL);
-				if (!(
-							(slope == SLOPE_W && tracks == TRACK_BIT_RIGHT) ||
-							(slope == SLOPE_S && tracks == TRACK_BIT_UPPER) ||
-							(slope == SLOPE_E && tracks == TRACK_BIT_LEFT)  ||
-							(slope == SLOPE_N && tracks == TRACK_BIT_LOWER)
-						)) {
-					break;
-				}
+				FloodHalftile(target);
 
 				Vehicle *v = FindFloodableVehicleOnTile(target);
 				if (v != NULL) FloodVehicle(v);
+
+				break;
 			}
-			/* FALLTHROUGH */
 
 			case MP_CLEAR:
 			case MP_TREES:
@@ -594,11 +630,13 @@
 				break;
 		}
 	} else {
+		/* Flood vehicles */
 		_current_player = OWNER_WATER;
 
 		Vehicle *v = FindFloodableVehicleOnTile(target);
 		if (v != NULL) FloodVehicle(v);
 
+		/* flood flat tile */
 		if (CmdSucceeded(DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
 			MakeWater(target);
 			MarkTileDirtyByTile(target);
@@ -718,7 +756,12 @@
 	}
 }
 
-/** called from tunnelbridge_cmd, and by TileLoop_Industry() */
+/**
+ * Let a water tile floods its diagonal adjoining tiles
+ * called from tunnelbridge_cmd, and by TileLoop_Industry() and TileLoop_Track()
+ *
+ * @param tile the water/shore tile that floods
+ */
 void TileLoop_Water(TileIndex tile)
 {
 	static const TileIndexDiffC _tile_loop_offs_array[][5] = {
@@ -729,34 +772,38 @@
 		{{ 0, -1}, {0, 0}, {1, 0}, { 0, -1}, { 1, -1}}
 	};
 
-	/* Ensure sea-level canals and buoys on canal borders do not flood */
-	if ((IsTileType(tile, MP_WATER) || IsBuoyTile(tile)) && !IsTileOwner(tile, OWNER_WATER)) return;
+	/* Ensure buoys on canal borders do not flood */
+	if (IsCanalBuoyTile(tile)) return;
+	/* Ensure only sea and coast floods, not canals or rivers */
+	if (IsTileType(tile, MP_WATER) && !(IsSea(tile) || IsCoast(tile))) return;
 
-	if (IS_INT_INSIDE(TileX(tile), 1, MapSizeX() - 3 + 1) &&
-			IS_INT_INSIDE(TileY(tile), 1, MapSizeY() - 3 + 1)) {
+	/* floods in all four diagonal directions with the exception of the edges */
+	if (IsInsideMM(TileX(tile), 1, MapSizeX() - 3 + 1) &&
+			IsInsideMM(TileY(tile), 1, MapSizeY() - 3 + 1)) {
 		uint i;
 
 		for (i = 0; i != lengthof(_tile_loop_offs_array); i++) {
 			TileLoopWaterHelper(tile, _tile_loop_offs_array[i]);
 		}
 	}
+
 	/* _current_player can be changed by TileLoopWaterHelper.. reset it back here */
 	_current_player = OWNER_NONE;
 
 	/* edges */
-	if (TileX(tile) == 0 && IS_INT_INSIDE(TileY(tile), 1, MapSizeY() - 3 + 1)) { //NE
+	if (TileX(tile) == 0 && IsInsideMM(TileY(tile), 1, MapSizeY() - 3 + 1)) { //NE
 		TileLoopWaterHelper(tile, _tile_loop_offs_array[2]);
 	}
 
-	if (TileX(tile) == MapSizeX() - 2 && IS_INT_INSIDE(TileY(tile), 1, MapSizeY() - 3 + 1)) { //SW
+	if (TileX(tile) == MapSizeX() - 2 && IsInsideMM(TileY(tile), 1, MapSizeY() - 3 + 1)) { //SW
 		TileLoopWaterHelper(tile, _tile_loop_offs_array[0]);
 	}
 
-	if (TileY(tile) == 0 && IS_INT_INSIDE(TileX(tile), 1, MapSizeX() - 3 + 1)) { //NW
+	if (TileY(tile) == 0 && IsInsideMM(TileX(tile), 1, MapSizeX() - 3 + 1)) { //NW
 		TileLoopWaterHelper(tile, _tile_loop_offs_array[1]);
 	}
 
-	if (TileY(tile) == MapSizeY() - 2 && IS_INT_INSIDE(TileX(tile), 1, MapSizeX() - 3 + 1)) { //SE
+	if (TileY(tile) == MapSizeY() - 2 && IsInsideMM(TileX(tile), 1, MapSizeX() - 3 + 1)) { //SE
 		TileLoopWaterHelper(tile, _tile_loop_offs_array[3]);
 	}
 }
@@ -817,7 +864,7 @@
 static CommandCost TerraformTile_Water(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
 {
 	/* Canals can't be terraformed */
-	if (IsClearWaterTile(tile) && IsCanal(tile)) return_cmd_error(STR_MUST_DEMOLISH_CANAL_FIRST);
+	if (IsWaterTile(tile) && IsCanal(tile)) return_cmd_error(STR_MUST_DEMOLISH_CANAL_FIRST);
 
 	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 }
--- a/src/water_map.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/water_map.h	Mon Dec 03 23:39:38 2007 +0000
@@ -27,19 +27,29 @@
 
 static inline WaterTileType GetWaterTileType(TileIndex t)
 {
+	assert(IsTileType(t, MP_WATER));
+
 	if (_m[t].m5 == 0) return WATER_TILE_CLEAR;
 	if (_m[t].m5 == 1) return WATER_TILE_COAST;
-	if (IS_INT_INSIDE(_m[t].m5, LOCK_MIDDLE, LOCK_END)) return WATER_TILE_LOCK;
+	if (IsInsideMM(_m[t].m5, LOCK_MIDDLE, LOCK_END)) return WATER_TILE_LOCK;
 
-	assert(IS_INT_INSIDE(_m[t].m5, DEPOT_NORTH, DEPOT_END));
+	assert(IsInsideMM(_m[t].m5, DEPOT_NORTH, DEPOT_END));
 	return WATER_TILE_DEPOT;
 }
 
+/** IsWater return true if any type of clear water like ocean, river, canal */
 static inline bool IsWater(TileIndex t)
 {
 	return GetWaterTileType(t) == WATER_TILE_CLEAR;
 }
 
+static inline bool IsSea(TileIndex t)
+{
+	if (GetWaterTileType(t) != WATER_TILE_CLEAR) return false;
+	if (!IsTileOwner(t, OWNER_WATER)) return false; // 'Human' built water = canal, not sea
+	return true;
+}
+
 static inline bool IsCoast(TileIndex t)
 {
 	return GetWaterTileType(t) == WATER_TILE_COAST;
@@ -50,19 +60,19 @@
 	return GetWaterTileType(t) == WATER_TILE_CLEAR && GetTileOwner(t) != OWNER_WATER;
 }
 
-static inline bool IsClearWaterTile(TileIndex t)
+static inline bool IsWaterTile(TileIndex t)
 {
-	return IsTileType(t, MP_WATER) && IsWater(t) && GetTileSlope(t, NULL) == SLOPE_FLAT;
+	return IsTileType(t, MP_WATER) && IsWater(t);
 }
 
 static inline TileIndex GetOtherShipDepotTile(TileIndex t)
 {
-	return t + (HASBIT(_m[t].m5, 0) ? -1 : 1) * (HASBIT(_m[t].m5, 1) ? TileDiffXY(0, 1) : TileDiffXY(1, 0));
+	return t + (HasBit(_m[t].m5, 0) ? -1 : 1) * (HasBit(_m[t].m5, 1) ? TileDiffXY(0, 1) : TileDiffXY(1, 0));
 }
 
 static inline TileIndex IsShipDepot(TileIndex t)
 {
-	return IS_INT_INSIDE(_m[t].m5, DEPOT_NORTH, DEPOT_END);
+	return IsInsideMM(_m[t].m5, DEPOT_NORTH, DEPOT_END);
 }
 
 static inline Axis GetShipDepotAxis(TileIndex t)
@@ -109,6 +119,7 @@
 
 static inline void MakeCanal(TileIndex t, Owner o)
 {
+	assert(o != OWNER_WATER);
 	SetTileType(t, MP_WATER);
 	SetTileOwner(t, o);
 	_m[t].m2 = 0;
--- a/src/waypoint.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/waypoint.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -175,7 +175,7 @@
 	}
 
 	if (!CheckTileOwnership(tile)) return CMD_ERROR;
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 	tileh = GetTileSlope(tile, NULL);
 	if (tileh != SLOPE_FLAT &&
@@ -197,7 +197,20 @@
 		wp->string = STR_NULL;
 		wp->town_cn = 0;
 	} else if (flags & DC_EXEC) {
-		/* move existing (recently deleted) waypoint to the new location */
+		/* Move existing (recently deleted) waypoint to the new location */
+
+		/* First we update the destination for all vehicles that
+		 * have the old waypoint in their orders. */
+		Vehicle *v;
+		FOR_ALL_VEHICLES(v) {
+			if (v->type == VEH_TRAIN &&
+					v->First() == v &&
+					v->current_order.type == OT_GOTO_WAYPOINT &&
+					v->dest_tile == wp->xy) {
+				v->dest_tile = tile;
+			}
+		}
+
 		RedrawWaypointSign(wp);
 		wp->xy = tile;
 	}
@@ -263,7 +276,7 @@
 	if (!IsTileType(tile, MP_RAILWAY) ||
 			!IsRailWaypoint(tile) ||
 			(!CheckTileOwnership(tile) && _current_player != OWNER_WATER) ||
-			!EnsureNoVehicle(tile)) {
+			!EnsureNoVehicleOnGround(tile)) {
 		return CMD_ERROR;
 	}
 
--- a/src/widget.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/widget.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -140,7 +140,7 @@
 		if (wi->type == WWT_EMPTY || wi->type == WWT_FRAME) continue;
 
 		if (x >= wi->left && x <= wi->right && y >= wi->top &&  y <= wi->bottom &&
-				!IsWindowWidgetHidden(w, index)) {
+				!w->IsWidgetHidden(index)) {
 			found_index = index;
 		}
 	}
@@ -184,25 +184,24 @@
 void DrawWindowWidgets(const Window *w)
 {
 	const DrawPixelInfo* dpi = _cur_dpi;
-	Rect r;
-	uint i;
 
-	for (i = 0; i < w->widget_count; i++) {
+	for (uint i = 0; i < w->widget_count; i++) {
 		const Widget *wi = &w->widget[i];
-		bool clicked = IsWindowWidgetLowered(w, i);
+		bool clicked = w->IsWidgetLowered(i);
+		Rect r;
 
-		if (dpi->left > (r.right=/*w->left + */wi->right) ||
-				dpi->left + dpi->width <= (r.left=wi->left/* + w->left*/) ||
-				dpi->top > (r.bottom=/*w->top +*/ wi->bottom) ||
-				dpi->top + dpi->height <= (r.top = /*w->top +*/ wi->top) ||
-				IsWindowWidgetHidden(w, i)) {
+		if (dpi->left > (r.right = wi->right) ||
+				dpi->left + dpi->width <= (r.left = wi->left) ||
+				dpi->top > (r.bottom = wi->bottom) ||
+				dpi->top + dpi->height <= (r.top = wi->top) ||
+				w->IsWidgetHidden(i)) {
 			continue;
 		}
 
 		switch (wi->type & WWT_MASK) {
 		case WWT_IMGBTN:
 		case WWT_IMGBTN_2: {
-			int img = wi->data;
+			SpriteID img = wi->data;
 			assert(img != 0);
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
 
@@ -229,22 +228,22 @@
 
 			if ((wi->type & WWT_MASK) == WWT_TEXTBTN_2 && clicked) str++;
 
-			DrawStringCentered(((r.left + r.right + 1) >> 1) + clicked, ((r.top + r.bottom + 1) >> 1) - 5 + clicked, str, 0);
+			DrawStringCentered(((r.left + r.right + 1) >> 1) + clicked, ((r.top + r.bottom + 1) >> 1) - 5 + clicked, str, TC_FROMSTRING);
 			goto draw_default;
 		}
 
 		case WWT_TEXT: {
-			StringID str = wi->data;
+			const StringID str = wi->data;
 
 			if (str != STR_NULL) DrawStringTruncated(r.left, r.top, str, wi->color, r.right - r.left);
 			break;
 		}
 
 		case WWT_INSET: {
-			StringID str = wi->data;
+			const StringID str = wi->data;
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_LOWERED | FR_DARKENED);
 
-			if (str != STR_NULL) DrawStringTruncated(r.left + 2, r.top + 1, str, 0, r.right - r.left - 10);
+			if (str != STR_NULL) DrawStringTruncated(r.left + 2, r.top + 1, str, TC_FROMSTRING, r.right - r.left - 10);
 			goto draw_default;
 		}
 
@@ -275,7 +274,7 @@
 				GfxFillRect(r.left + 1, x, r.right - 1, x, color);
 			}
 
-			color = _colour_gradient[wi->color&0xF][4];
+			color = _colour_gradient[wi->color & 0xF][4];
 
 			x = r.left - 1;
 			for (ctr = c; ctr > 1; ctr--) {
@@ -286,7 +285,7 @@
 			x = r.top - 1;
 			for (ctr = d; ctr > 1; ctr--) {
 				x += amt2;
-				GfxFillRect(r.left+1, x, r.right-1, x, color);
+				GfxFillRect(r.left + 1, x, r.right - 1, x, color);
 			}
 
 			goto draw_default;
@@ -295,31 +294,32 @@
 		/* vertical scrollbar */
 		case WWT_SCROLLBAR: {
 			Point pt;
-			int c1,c2;
+			int c1, c2;
 
+			assert(wi->data == 0);
 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
 
 			/* draw up/down buttons */
 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_UP);
 			DrawFrameRect(r.left, r.top, r.right, r.top + 9, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
-			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, 0x10);
+			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, TC_BLACK);
 
 			clicked = (((w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_DOWN));
 			DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
-			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, 0x10);
+			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
 
-			c1 = _colour_gradient[wi->color&0xF][3];
-			c2 = _colour_gradient[wi->color&0xF][7];
+			c1 = _colour_gradient[wi->color & 0xF][3];
+			c2 = _colour_gradient[wi->color & 0xF][7];
 
 			/* draw "shaded" background */
-			GfxFillRect(r.left, r.top+10, r.right, r.bottom-10, c2);
-			GfxFillRect(r.left, r.top+10, r.right, r.bottom-10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
+			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
+			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
 
 			/* draw shaded lines */
-			GfxFillRect(r.left+2, r.top+10, r.left+2, r.bottom-10, c1);
-			GfxFillRect(r.left+3, r.top+10, r.left+3, r.bottom-10, c2);
-			GfxFillRect(r.left+7, r.top+10, r.left+7, r.bottom-10, c1);
-			GfxFillRect(r.left+8, r.top+10, r.left+8, r.bottom-10, c2);
+			GfxFillRect(r.left + 2, r.top + 10, r.left + 2, r.bottom - 10, c1);
+			GfxFillRect(r.left + 3, r.top + 10, r.left + 3, r.bottom - 10, c2);
+			GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
+			GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
 
 			pt = HandleScrollbarHittest(&w->vscroll, r.top, r.bottom);
 			DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_MIDDLE ? FR_LOWERED : FR_NONE);
@@ -327,31 +327,32 @@
 		}
 		case WWT_SCROLL2BAR: {
 			Point pt;
-			int c1,c2;
+			int c1, c2;
 
+			assert(wi->data == 0);
 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
 
 			/* draw up/down buttons */
 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_UP | WF_SCROLL2));
 			DrawFrameRect(r.left, r.top, r.right, r.top + 9, wi->color,  (clicked) ? FR_LOWERED : FR_NONE);
-			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, 0x10);
+			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, TC_BLACK);
 
 			clicked = ((w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_DOWN | WF_SCROLL2));
 			DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color,  (clicked) ? FR_LOWERED : FR_NONE);
-			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, 0x10);
+			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
 
-			c1 = _colour_gradient[wi->color&0xF][3];
-			c2 = _colour_gradient[wi->color&0xF][7];
+			c1 = _colour_gradient[wi->color & 0xF][3];
+			c2 = _colour_gradient[wi->color & 0xF][7];
 
 			/* draw "shaded" background */
-			GfxFillRect(r.left, r.top+10, r.right, r.bottom-10, c2);
-			GfxFillRect(r.left, r.top+10, r.right, r.bottom-10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
+			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
+			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
 
 			/* draw shaded lines */
-			GfxFillRect(r.left+2, r.top+10, r.left+2, r.bottom-10, c1);
-			GfxFillRect(r.left+3, r.top+10, r.left+3, r.bottom-10, c2);
-			GfxFillRect(r.left+7, r.top+10, r.left+7, r.bottom-10, c1);
-			GfxFillRect(r.left+8, r.top+10, r.left+8, r.bottom-10, c2);
+			GfxFillRect(r.left + 2, r.top + 10, r.left + 2, r.bottom - 10, c1);
+			GfxFillRect(r.left + 3, r.top + 10, r.left + 3, r.bottom - 10, c2);
+			GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
+			GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
 
 			pt = HandleScrollbarHittest(&w->vscroll2, r.top, r.bottom);
 			DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_MIDDLE | WF_SCROLL2) ? FR_LOWERED : FR_NONE);
@@ -361,8 +362,9 @@
 		/* horizontal scrollbar */
 		case WWT_HSCROLLBAR: {
 			Point pt;
-			int c1,c2;
+			int c1, c2;
 
+			assert(wi->data == 0);
 			assert(r.bottom - r.top == 11); // XXX - to ensure the same sizes are used everywhere!
 
 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL)) == (WF_SCROLL_UP | WF_HSCROLL));
@@ -370,21 +372,21 @@
 			DrawSprite(SPR_ARROW_LEFT, PAL_NONE, r.left + 1 + clicked, r.top + 1 + clicked);
 
 			clicked = ((w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL)) == (WF_SCROLL_DOWN | WF_HSCROLL));
-			DrawFrameRect(r.right-9, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
+			DrawFrameRect(r.right - 9, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
 			DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, r.right - 8 + clicked, r.top + 1 + clicked);
 
-			c1 = _colour_gradient[wi->color&0xF][3];
-			c2 = _colour_gradient[wi->color&0xF][7];
+			c1 = _colour_gradient[wi->color & 0xF][3];
+			c2 = _colour_gradient[wi->color & 0xF][7];
 
 			/* draw "shaded" background */
-			GfxFillRect(r.left+10, r.top, r.right-10, r.bottom, c2);
-			GfxFillRect(r.left+10, r.top, r.right-10, r.bottom, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
+			GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c2);
+			GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
 
 			/* draw shaded lines */
-			GfxFillRect(r.left+10, r.top+2, r.right-10, r.top+2, c1);
-			GfxFillRect(r.left+10, r.top+3, r.right-10, r.top+3, c2);
-			GfxFillRect(r.left+10, r.top+7, r.right-10, r.top+7, c1);
-			GfxFillRect(r.left+10, r.top+8, r.right-10, r.top+8, c2);
+			GfxFillRect(r.left + 10, r.top + 2, r.right - 10, r.top + 2, c1);
+			GfxFillRect(r.left + 10, r.top + 3, r.right - 10, r.top + 3, c2);
+			GfxFillRect(r.left + 10, r.top + 7, r.right - 10, r.top + 7, c1);
+			GfxFillRect(r.left + 10, r.top + 8, r.right - 10, r.top + 8, c2);
 
 			/* draw actual scrollbar */
 			pt = HandleScrollbarHittest(&w->hscroll, r.left, r.right);
@@ -394,37 +396,39 @@
 		}
 
 		case WWT_FRAME: {
-			int c1,c2;
+			const StringID str = wi->data;
+			int c1, c2;
 			int x2 = r.left; // by default the left side is the left side of the widget
 
-			if (wi->data != 0) x2 = DrawString(r.left + 6, r.top, wi->data, 0);
+			if (str != STR_NULL) x2 = DrawString(r.left + 6, r.top, str, TC_FROMSTRING);
 
 			c1 = _colour_gradient[wi->color][3];
 			c2 = _colour_gradient[wi->color][7];
 
-			/*Line from upper left corner to start of text */
-			GfxFillRect(r.left, r.top+4, r.left+4,r.top+4, c1);
-			GfxFillRect(r.left+1, r.top+5, r.left+4,r.top+5, c2);
+			/* Line from upper left corner to start of text */
+			GfxFillRect(r.left, r.top + 4, r.left + 4, r.top + 4, c1);
+			GfxFillRect(r.left + 1, r.top + 5, r.left + 4, r.top + 5, c2);
 
 			/* Line from end of text to upper right corner */
-			GfxFillRect(x2, r.top+4, r.right-1,r.top+4,c1);
-			GfxFillRect(x2, r.top+5, r.right-2,r.top+5,c2);
+			GfxFillRect(x2, r.top + 4, r.right - 1, r.top + 4, c1);
+			GfxFillRect(x2, r.top + 5, r.right - 2, r.top + 5, c2);
 
 			/* Line from upper left corner to bottom left corner */
-			GfxFillRect(r.left, r.top+5, r.left, r.bottom-1, c1);
-			GfxFillRect(r.left+1, r.top+6, r.left+1, r.bottom-2, c2);
+			GfxFillRect(r.left, r.top + 5, r.left, r.bottom - 1, c1);
+			GfxFillRect(r.left + 1, r.top + 6, r.left + 1, r.bottom - 2, c2);
 
 			/*Line from upper right corner to bottom right corner */
-			GfxFillRect(r.right-1, r.top+5, r.right-1, r.bottom-2, c1);
-			GfxFillRect(r.right, r.top+4, r.right, r.bottom-1, c2);
+			GfxFillRect(r.right - 1, r.top + 5, r.right - 1, r.bottom - 2, c1);
+			GfxFillRect(r.right, r.top + 4, r.right, r.bottom - 1, c2);
 
-			GfxFillRect(r.left+1, r.bottom-1, r.right-1, r.bottom-1, c1);
+			GfxFillRect(r.left + 1, r.bottom - 1, r.right - 1, r.bottom - 1, c1);
 			GfxFillRect(r.left, r.bottom, r.right, r.bottom, c2);
 
 			goto draw_default;
 		}
 
 		case WWT_STICKYBOX: {
+			assert(wi->data == 0);
 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
 
 			clicked = !!(w->flags4 & WF_STICKY);
@@ -434,6 +438,7 @@
 		}
 
 		case WWT_RESIZEBOX: {
+			assert(wi->data == 0);
 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
 
 			clicked = !!(w->flags4 & WF_SIZING);
@@ -443,26 +448,29 @@
 		}
 
 		case WWT_CLOSEBOX: {
+			const StringID str = wi->data;
+
+			assert(str == STR_00C5 || str == STR_00C6); // black or silver cross
 			assert(r.right - r.left == 10); // ensure the same sizes are used everywhere
 
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_NONE);
-			DrawString(r.left + 2, r.top + 2, STR_00C5, 0);
+			DrawString(r.left + 2, r.top + 2, str, TC_FROMSTRING);
 			break;
 		}
 
 		case WWT_CAPTION: {
 			assert(r.bottom - r.top == 13); // XXX - to ensure the same sizes are used everywhere!
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_BORDERONLY);
-			DrawFrameRect(r.left+1, r.top+1, r.right-1, r.bottom-1, wi->color, (w->caption_color == 0xFF) ? FR_LOWERED | FR_DARKENED : FR_LOWERED | FR_DARKENED | FR_BORDERONLY);
+			DrawFrameRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, wi->color, (w->caption_color == 0xFF) ? FR_LOWERED | FR_DARKENED : FR_LOWERED | FR_DARKENED | FR_BORDERONLY);
 
 			if (w->caption_color != 0xFF) {
-				GfxFillRect(r.left+2, r.top+2, r.right-2, r.bottom-2, _colour_gradient[_player_colors[w->caption_color]][4]);
+				GfxFillRect(r.left + 2, r.top + 2, r.right - 2, r.bottom - 2, _colour_gradient[_player_colors[w->caption_color]][4]);
 			}
 
-			DrawStringCenteredTruncated(r.left + 2, r.right - 2, r.top+2, wi->data, 0x84);
+			DrawStringCenteredTruncated(r.left + 2, r.right - 2, r.top + 2, wi->data, 0x84);
 draw_default:;
-			if (IsWindowWidgetDisabled(w, i)) {
-				GfxFillRect(r.left+1, r.top+1, r.right-1, r.bottom-1, _colour_gradient[wi->color&0xF][2] | (1 << PALETTE_MODIFIER_GREYOUT));
+			if (w->IsWidgetDisabled(i)) {
+				GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[wi->color & 0xF][2] | (1 << PALETTE_MODIFIER_GREYOUT));
 			}
 		}
 		}
@@ -470,8 +478,7 @@
 
 
 	if (w->flags4 & WF_WHITE_BORDER_MASK) {
-		//DrawFrameRect(w->left, w->top, w->left + w->width-1, w->top+w->height-1, 0xF, 0x10);
-		DrawFrameRect(0, 0, w->width-1, w->height-1, 0xF, FR_BORDERONLY);
+		DrawFrameRect(0, 0, w->width - 1, w->height - 1, 0xF, FR_BORDERONLY);
 	}
 
 }
@@ -496,12 +503,12 @@
 		return - 1;
 
 	item = y / 10;
-	if (item >= WP(w,dropdown_d).num_items || (HASBIT(WP(w,dropdown_d).disabled_state, item) && !HASBIT(WP(w,dropdown_d).hidden_state, item)) || WP(w,dropdown_d).items[item] == 0)
+	if (item >= WP(w,dropdown_d).num_items || (HasBit(WP(w,dropdown_d).disabled_state, item) && !HasBit(WP(w,dropdown_d).hidden_state, item)) || WP(w,dropdown_d).items[item] == 0)
 		return - 1;
 
 	/* Skip hidden items -- +1 for each hidden item before the clicked item. */
 	for (counter = 0; item >= counter; ++counter)
-		if (HASBIT(WP(w,dropdown_d).hidden_state, counter)) item++;
+		if (HasBit(WP(w,dropdown_d).hidden_state, counter)) item++;
 
 	return item;
 }
@@ -525,14 +532,14 @@
 			height = w->widget[0].bottom - 3;
 
 			for (i = 0; WP(w,dropdown_d).items[i] != INVALID_STRING_ID; i++, sel--) {
-				if (HASBIT(WP(w,dropdown_d).hidden_state, i)) continue;
+				if (HasBit(WP(w,dropdown_d).hidden_state, i)) continue;
 
 				if (y >= 0 && y <= height) {
 					if (WP(w,dropdown_d).items[i] != STR_NULL) {
 						if (sel == 0) GfxFillRect(x + 1, y, x + width, y + 9, 0);
-						DrawStringTruncated(x + 2, y, WP(w,dropdown_d).items[i], sel == 0 ? 12 : 16, x + width);
+						DrawStringTruncated(x + 2, y, WP(w,dropdown_d).items[i], sel == 0 ? TC_WHITE : TC_BLACK, x + width);
 
-						if (HASBIT(WP(w,dropdown_d).disabled_state, i)) {
+						if (HasBit(WP(w,dropdown_d).disabled_state, i)) {
 							GfxFillRect(x, y, x + width, y + 9,
 								(1 << PALETTE_MODIFIER_GREYOUT) | _colour_gradient[_dropdown_menu_widgets[0].color][5]
 							);
@@ -595,7 +602,7 @@
 		case WE_DESTROY: {
 			Window *w2 = FindWindowById(WP(w,dropdown_d).parent_wnd_class, WP(w,dropdown_d).parent_wnd_num);
 			if (w2 != NULL) {
-				RaiseWindowWidget(w2, WP(w,dropdown_d).parent_button);
+				w2->RaiseWidget(WP(w,dropdown_d).parent_button);
 				InvalidateWidget(w2, WP(w,dropdown_d).parent_button);
 			}
 		} break;
@@ -608,7 +615,7 @@
 	const Widget *wi;
 	Window *w2;
 	const Window *w3;
-	bool is_dropdown_menu_shown = IsWindowWidgetLowered(w, button);
+	bool is_dropdown_menu_shown = w->IsWidgetLowered(button);
 	int top, height;
 	int screen_top, screen_bottom;
 	bool scroll = false;
@@ -617,7 +624,7 @@
 
 	if (is_dropdown_menu_shown) return;
 
-	LowerWindowWidget(w, button);
+	w->LowerWidget(button);
 
 	InvalidateWidget(w, button);
 
@@ -630,7 +637,7 @@
 		uint j;
 
 		for (j = 0; strings[j] != INVALID_STRING_ID; j++) {
-			if (HASBIT(hidden_mask, j)) i--;
+			if (HasBit(hidden_mask, j)) i--;
 		}
 	}
 
@@ -671,7 +678,7 @@
 	w2->widget[0].right = wi->right - wi[-1].left;
 	w2->widget[0].bottom = height - 1;
 
-	SetWindowWidgetHiddenState(w2, 1, !scroll);
+	w2->SetWidgetHiddenState(1, !scroll);
 
 	if (scroll) {
 		/* We're scrolling, so enable the scroll bar and shrink the list by
--- a/src/win32.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/win32.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -951,7 +951,7 @@
 
 #if !defined(WINCE)
 	/* Check if a win9x user started the win32 version */
-	if (HASBIT(GetVersion(), 31)) error("This version of OpenTTD doesn't run on windows 95/98/ME.\nPlease download the win9x binary and try again.");
+	if (HasBit(GetVersion(), 31)) error("This version of OpenTTD doesn't run on windows 95/98/ME.\nPlease download the win9x binary and try again.");
 #endif
 
 	/* For UNICODE we need to convert the commandline to char* _AND_
@@ -971,9 +971,7 @@
 #endif
 
 	/* setup random seed to something quite random */
-	_random_seeds[1][0] = _random_seeds[0][0] = GetTickCount();
-	_random_seeds[1][1] = _random_seeds[0][1] = _random_seeds[0][0] * 0x1234567;
-	SeedMT(_random_seeds[0][0]);
+	SetRandomSeed(GetTickCount());
 
 	argc = ParseCommandLine(cmdline, argv, lengthof(argv));
 
--- a/src/window.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/window.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -33,7 +33,7 @@
 	va_start(wdg_list, widgets);
 
 	while (widgets != WIDGET_LIST_END) {
-		SetWindowWidgetDisabledState(w, widgets, disab_stat);
+		w->SetWidgetDisabledState(widgets, disab_stat);
 		widgets = va_arg(wdg_list, int);
 	}
 
@@ -47,7 +47,7 @@
 	va_start(wdg_list, widgets);
 
 	while (widgets != WIDGET_LIST_END) {
-		SetWindowWidgetHiddenState(w, widgets, hidden_stat);
+		w->SetWidgetHiddenState(widgets, hidden_stat);
 		widgets = va_arg(wdg_list, int);
 	}
 
@@ -61,7 +61,7 @@
 	va_start(wdg_list, widgets);
 
 	while (widgets != WIDGET_LIST_END) {
-		SetWindowWidgetLoweredState(w, widgets, lowered_stat);
+		w->SetWidgetLoweredState(widgets, lowered_stat);
 		widgets = va_arg(wdg_list, int);
 	}
 
@@ -73,16 +73,80 @@
 	uint i;
 
 	for (i = 0; i < w->widget_count; i++) {
-		if (IsWindowWidgetLowered(w, i)) {
-			RaiseWindowWidget(w, i);
+		if (w->IsWidgetLowered(i)) {
+			w->RaiseWidget(i);
 			InvalidateWidget(w, i);
 		}
 	}
 }
 
+void CDECL Window::SetWidgetsDisabledState(bool disab_stat, int widgets, ...)
+{
+	va_list wdg_list;
+
+	va_start(wdg_list, widgets);
+
+	while (widgets != WIDGET_LIST_END) {
+		SetWidgetDisabledState(widgets, disab_stat);
+		widgets = va_arg(wdg_list, int);
+	}
+
+	va_end(wdg_list);
+}
+
+void CDECL Window::SetWidgetsHiddenState(bool hidden_stat, int widgets, ...)
+{
+	va_list wdg_list;
+
+	va_start(wdg_list, widgets);
+
+	while (widgets != WIDGET_LIST_END) {
+		SetWidgetHiddenState(widgets, hidden_stat);
+		widgets = va_arg(wdg_list, int);
+	}
+
+	va_end(wdg_list);
+}
+
+void CDECL Window::SetWidgetsLoweredState(bool lowered_stat, int widgets, ...)
+{
+	va_list wdg_list;
+
+	va_start(wdg_list, widgets);
+
+	while (widgets != WIDGET_LIST_END) {
+		SetWidgetLoweredState(widgets, lowered_stat);
+		widgets = va_arg(wdg_list, int);
+	}
+
+	va_end(wdg_list);
+}
+
+void Window::RaiseButtons()
+{
+	uint i;
+
+	for (i = 0; i < this->widget_count; i++) {
+		if (IsWidgetLowered(i)) {
+			RaiseWidget(i);
+			InvalidateWidget(i);
+		}
+	}
+}
+
+void Window::InvalidateWidget(byte widget_index)
+{
+	const Widget *wi = &this->widget[widget_index];
+
+	/* Don't redraw the window if the widget is invisible or of no-type */
+	if (wi->type == WWT_EMPTY || IsWidgetHidden(widget_index)) return;
+
+	SetDirtyBlocks(this->left + wi->left, this->top + wi->top, this->left + wi->right + 1, this->top + wi->bottom + 1);
+}
+
 void HandleButtonClick(Window *w, byte widget)
 {
-	LowerWindowWidget(w, widget);
+	w->LowerWidget(widget);
 	w->flags4 |= 5 << WF_TIMEOUT_SHL;
 	InvalidateWidget(w, widget);
 }
@@ -105,7 +169,7 @@
 		if (e.we.click.widget < 0) return; // exit if clicked outside of widgets
 
 		/* don't allow any interaction if the button has been disabled */
-		if (IsWindowWidgetDisabled(w, e.we.click.widget)) return;
+		if (w->IsWidgetDisabled(e.we.click.widget)) return;
 
 		wi = &w->widget[e.we.click.widget];
 
@@ -196,7 +260,7 @@
 			(sb = &w->vscroll2, wi2->type == WWT_SCROLL2BAR) || (sb = &w->vscroll, wi2->type == WWT_SCROLLBAR) ) {
 
 		if (sb->count > sb->cap) {
-			int pos = clamp(sb->pos + wheel, 0, sb->count - sb->cap);
+			int pos = Clamp(sb->pos + wheel, 0, sb->count - sb->cap);
 			if (pos != sb->pos) {
 				sb->pos = pos;
 				SetWindowDirty(w);
@@ -843,23 +907,35 @@
 	}
 }
 
+/**
+ * Set the x and y coordinates of a new window.
+ *
+ * @param *desc         The pointer to the WindowDesc to be created
+ * @param window_number the window number of the new window
+ * @param data          arbitrary data that is send with the WE_CREATE message
+ *
+ * @return see Window pointer of the newly created window
+ */
 static Window *LocalAllocateWindowDesc(const WindowDesc *desc, int window_number, void *data)
 {
 	Point pt;
 	Window *w;
 
 	/* By default position a child window at an offset of 10/10 of its parent.
+	 * With the exception of WC_BUILD_TOOLBAR (build railway/roads/ship docks/airports)
+	 * and WC_SCEN_LAND_GEN (landscaping). Whose child window has an offset of 0/36 of
+	 * its parent. So it's exactly under the parent toolbar and no buttons will be covered.
 	 * However if it falls too extremely outside window positions, reposition
 	 * it to an automatic place */
 	if (desc->parent_cls != 0 /* WC_MAIN_WINDOW */ &&
 			(w = FindWindowById(desc->parent_cls, window_number)) != NULL &&
 			w->left < _screen.width - 20 && w->left > -60 && w->top < _screen.height - 20) {
 
-		pt.x = w->left + 10;
+		pt.x = w->left + ((desc->parent_cls == WC_BUILD_TOOLBAR || desc->parent_cls == WC_SCEN_LAND_GEN) ? 0 : 10);
 		if (pt.x > _screen.width + 10 - desc->default_width) {
 			pt.x = (_screen.width + 10 - desc->default_width) - 20;
 		}
-		pt.y = w->top + 10;
+		pt.y = w->top + ((desc->parent_cls == WC_BUILD_TOOLBAR || desc->parent_cls == WC_SCEN_LAND_GEN) ? 36 : 10);
 	} else {
 		switch (desc->left) {
 			case WDP_ALIGN_TBR: { /* Align the right side with the top toolbar */
@@ -941,7 +1017,7 @@
 
 	for (wz = _last_z_window; wz != _z_windows;) {
 		Window *w = *--wz;
-		if (IS_INSIDE_1D(x, w->left, w->width) && IS_INSIDE_1D(y, w->top, w->height)) {
+		if (IsInsideBS(x, w->left, w->width) && IsInsideBS(y, w->top, w->height)) {
 			return w;
 		}
 	}
@@ -1283,8 +1359,8 @@
 
 			/* Make sure the window doesn't leave the screen
 			 * 13 is the height of the title bar */
-			nx = clamp(nx, 13 - t->right, _screen.width - 13 - t->left);
-			ny = clamp(ny, 0, _screen.height - 13);
+			nx = Clamp(nx, 13 - t->right, _screen.width - 13 - t->left);
+			ny = Clamp(ny, 0, _screen.height - 13);
 
 			/* Make sure the title bar isn't hidden by behind the main tool bar */
 			v = FindWindowById(WC_MAIN_TOOLBAR, 0);
@@ -1460,6 +1536,13 @@
 		return true;
 	}
 
+	if (WP(w, vp_d).follow_vehicle != INVALID_VEHICLE && w == FindWindowById(WC_MAIN_WINDOW, 0)) {
+		/* If the main window is following a vehicle, then first let go of it! */
+		const Vehicle *veh = GetVehicle(WP(w, vp_d).follow_vehicle);
+		ScrollMainWindowTo(veh->x_pos, veh->y_pos, true); /* This also resets follow_vehicle */
+		return true;
+	}
+
 	if (_patches.reverse_scroll) {
 		e.we.scroll.delta.x = -_cursor.delta.x;
 		e.we.scroll.delta.y = -_cursor.delta.y;
@@ -1616,11 +1699,12 @@
 	e.we.keypress.cont = true;
 
 	/* check if we have a query string window open before allowing hotkeys */
-	if (FindWindowById(WC_QUERY_STRING,       0) != NULL ||
-			FindWindowById(WC_SEND_NETWORK_MSG,   0) != NULL ||
-			FindWindowById(WC_GENERATE_LANDSCAPE, 0) != NULL ||
-			FindWindowById(WC_CONSOLE,            0) != NULL ||
-			FindWindowById(WC_SAVELOAD,           0) != NULL) {
+	if (FindWindowById(WC_QUERY_STRING,            0) != NULL ||
+			FindWindowById(WC_SEND_NETWORK_MSG,        0) != NULL ||
+			FindWindowById(WC_GENERATE_LANDSCAPE,      0) != NULL ||
+			FindWindowById(WC_CONSOLE,                 0) != NULL ||
+			FindWindowById(WC_SAVELOAD,                0) != NULL ||
+			FindWindowById(WC_COMPANY_PASSWORD_WINDOW, 0) != NULL) {
 		query_open = true;
 	}
 
@@ -1634,7 +1718,8 @@
 				w->window_class != WC_SEND_NETWORK_MSG &&
 				w->window_class != WC_GENERATE_LANDSCAPE &&
 				w->window_class != WC_CONSOLE &&
-				w->window_class != WC_SAVELOAD) {
+				w->window_class != WC_SAVELOAD &&
+				w->window_class != WC_COMPANY_PASSWORD_WINDOW) {
 			continue;
 		}
 		w->wndproc(w, &e);
@@ -1753,7 +1838,7 @@
 			case MC_DOUBLE_LEFT:
 			case MC_LEFT:
 				DEBUG(misc, 2, "Cursor: 0x%X (%d)", _cursor.sprite, _cursor.sprite);
-				if (_thd.place_mode != 0 &&
+				if (_thd.place_mode != VHM_NONE &&
 						/* query button and place sign button work in pause mode */
 						_cursor.sprite != SPR_CURSOR_QUERY &&
 						_cursor.sprite != SPR_CURSOR_SIGN &&
@@ -1762,7 +1847,7 @@
 					return;
 				}
 
-				if (_thd.place_mode == 0) {
+				if (_thd.place_mode == VHM_NONE) {
 					HandleViewportClicked(vp, x, y);
 				} else {
 					PlaceObject();
@@ -1889,7 +1974,7 @@
 		y /= 10;
 
 		if (y < WP(w, const menu_d).item_count &&
-				!HASBIT(WP(w, const menu_d).disabled_items, y)) {
+				!HasBit(WP(w, const menu_d).disabled_items, y)) {
 			return y;
 		}
 	}
@@ -1911,7 +1996,7 @@
 	const Widget *wi = &w->widget[widget_index];
 
 	/* Don't redraw the window if the widget is invisible or of no-type */
-	if (wi->type == WWT_EMPTY || IsWindowWidgetHidden(w, widget_index)) return;
+	if (wi->type == WWT_EMPTY || w->IsWidgetHidden(widget_index)) return;
 
 	SetDirtyBlocks(w->left + wi->left, w->top + wi->top, w->left + wi->right + 1, w->top + wi->bottom + 1);
 }
@@ -2094,13 +2179,13 @@
 				break;
 
 			case WC_STATUS_BAR:
-				ResizeWindow(w, clamp(neww, 320, 640) - w->width, 0);
+				ResizeWindow(w, Clamp(neww, 320, 640) - w->width, 0);
 				top = newh - w->height;
 				left = (neww - w->width) >> 1;
 				break;
 
 			case WC_SEND_NETWORK_MSG:
-				ResizeWindow(w, clamp(neww, 320, 640) - w->width, 0);
+				ResizeWindow(w, Clamp(neww, 320, 640) - w->width, 0);
 				top = (newh - 26); // 26 = height of status bar + height of chat bar
 				left = (neww - w->width) >> 1;
 				break;
--- a/src/window.h	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/window.h	Mon Dec 03 23:39:38 2007 +0000
@@ -12,6 +12,7 @@
 #include "road.h"
 #include "airport.h"
 #include "vehicle.h"
+#include "viewport.h"
 
 struct WindowEvent;
 
@@ -140,7 +141,7 @@
 			Point pt;
 			TileIndex tile;
 			TileIndex starttile;
-			byte select_method;
+			ViewportPlaceMethod select_method;
 			byte select_proc;
 		} place;
 
@@ -277,6 +278,26 @@
 	WindowMessage message;
 	Window *parent;
 	byte custom[WINDOW_CUSTOM_SIZE];
+
+	void SetWidgetDisabledState(byte widget_index, bool disab_stat);
+	void DisableWidget(byte widget_index);
+	void EnableWidget(byte widget_index);
+	bool IsWidgetDisabled(byte widget_index) const;
+	void SetWidgetHiddenState(byte widget_index, bool hidden_stat);
+	void HideWidget(byte widget_index);
+	void ShowWidget(byte widget_index);
+	bool IsWidgetHidden(byte widget_index) const;
+	void SetWidgetLoweredState(byte widget_index, bool lowered_stat);
+	void ToggleWidgetLoweredState(byte widget_index);
+	void LowerWidget(byte widget_index);
+	void RaiseWidget(byte widget_index);
+	bool IsWidgetLowered(byte widget_index) const;
+
+	void RaiseButtons();
+	void CDECL SetWidgetsDisabledState(bool disab_stat, int widgets, ...);
+	void CDECL SetWidgetsHiddenState(bool hidden_stat, int widgets, ...);
+	void CDECL SetWidgetsLoweredState(bool lowered_stat, int widgets, ...);
+	void InvalidateWidget(byte widget_index);
 };
 
 struct querystr_d {
@@ -390,9 +411,10 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(smallmap_d));
 
+/* player face selection window */
 struct facesel_d {
-	uint32 face;
-	byte gender;
+	PlayerFace face; // player face bits
+	bool advanced;   // advance player face selection window
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(facesel_d));
 
@@ -643,7 +665,7 @@
 static inline bool IsWindowWidgetDisabled(const Window *w, byte widget_index)
 {
 	assert(widget_index < w->widget_count);
-	return HASBIT(w->widget[widget_index].display_flags, WIDG_DISABLED);
+	return HasBit(w->widget[widget_index].display_flags, WIDG_DISABLED);
 }
 
 /**
@@ -689,7 +711,7 @@
 static inline bool IsWindowWidgetHidden(const Window *w, byte widget_index)
 {
 	assert(widget_index < w->widget_count);
-	return HASBIT(w->widget[widget_index].display_flags, WIDG_HIDDEN);
+	return HasBit(w->widget[widget_index].display_flags, WIDG_HIDDEN);
 }
 
 /**
@@ -712,7 +734,7 @@
 static inline void ToggleWidgetLoweredState(Window *w, byte widget_index)
 {
 	assert(widget_index < w->widget_count);
-	TOGGLEBIT(w->widget[widget_index].display_flags, WIDG_LOWERED);
+	ToggleBit(w->widget[widget_index].display_flags, WIDG_LOWERED);
 }
 
 /**
@@ -744,7 +766,7 @@
 static inline bool IsWindowWidgetLowered(const Window *w, byte widget_index)
 {
 	assert(widget_index < w->widget_count);
-	return HASBIT(w->widget[widget_index].display_flags, WIDG_LOWERED);
+	return HasBit(w->widget[widget_index].display_flags, WIDG_LOWERED);
 }
 
 void InitWindowSystem();
@@ -816,4 +838,139 @@
  */
 void ResizeButtons(Window *w, byte left, byte right);
 
+
+/**
+ * Sets the enabled/disabled status of a widget.
+ * By default, widgets are enabled.
+ * On certain conditions, they have to be disabled.
+ * @param widget_index : index of this widget in the window
+ * @param disab_stat : status to use ie: disabled = true, enabled = false
+ */
+inline void Window::SetWidgetDisabledState(byte widget_index, bool disab_stat)
+{
+	assert(widget_index < this->widget_count);
+	SB(this->widget[widget_index].display_flags, WIDG_DISABLED, 1, !!disab_stat);
+}
+
+/**
+ * Sets a widget to disabled.
+ * @param widget_index : index of this widget in the window
+ */
+inline void Window::DisableWidget(byte widget_index)
+{
+	SetWidgetDisabledState(widget_index, true);
+}
+
+/**
+ * Sets a widget to Enabled.
+ * @param widget_index : index of this widget in the window
+ */
+inline void Window::EnableWidget(byte widget_index)
+{
+	SetWidgetDisabledState(widget_index, false);
+}
+
+/**
+ * Gets the enabled/disabled status of a widget.
+ * @param widget_index : index of this widget in the window
+ * @return status of the widget ie: disabled = true, enabled = false
+ */
+inline bool Window::IsWidgetDisabled(byte widget_index) const
+{
+	assert(widget_index < this->widget_count);
+	return HasBit(this->widget[widget_index].display_flags, WIDG_DISABLED);
+}
+
+/**
+ * Sets the hidden/shown status of a widget.
+ * By default, widgets are visible.
+ * On certain conditions, they have to be hidden.
+ * @param widget_index index of this widget in the window
+ * @param hidden_stat status to use ie. hidden = true, visible = false
+ */
+inline void Window::SetWidgetHiddenState(byte widget_index, bool hidden_stat)
+{
+	assert(widget_index < this->widget_count);
+	SB(this->widget[widget_index].display_flags, WIDG_HIDDEN, 1, !!hidden_stat);
+}
+
+/**
+ * Sets a widget hidden.
+ * @param widget_index : index of this widget in the window
+ */
+inline void Window::HideWidget(byte widget_index)
+{
+	SetWidgetHiddenState(widget_index, true);
+}
+
+/**
+ * Sets a widget visible.
+ * @param widget_index : index of this widget in the window
+ */
+inline void Window::ShowWidget(byte widget_index)
+{
+	SetWidgetHiddenState(widget_index, false);
+}
+
+/**
+ * Gets the visibility of a widget.
+ * @param widget_index : index of this widget in the window
+ * @return status of the widget ie: hidden = true, visible = false
+ */
+inline bool Window::IsWidgetHidden(byte widget_index) const
+{
+	assert(widget_index < this->widget_count);
+	return HasBit(this->widget[widget_index].display_flags, WIDG_HIDDEN);
+}
+
+/**
+ * Sets the lowered/raised status of a widget.
+ * @param widget_index : index of this widget in the window
+ * @param lowered_stat : status to use ie: lowered = true, raised = false
+ */
+inline void Window::SetWidgetLoweredState(byte widget_index, bool lowered_stat)
+{
+	assert(widget_index < this->widget_count);
+	SB(this->widget[widget_index].display_flags, WIDG_LOWERED, 1, !!lowered_stat);
+}
+
+/**
+ * Invert the lowered/raised  status of a widget.
+ * @param widget_index : index of this widget in the window
+ */
+inline void Window::ToggleWidgetLoweredState(byte widget_index)
+{
+	assert(widget_index < this->widget_count);
+	ToggleBit(this->widget[widget_index].display_flags, WIDG_LOWERED);
+}
+
+/**
+ * Marks a widget as lowered.
+ * @param widget_index : index of this widget in the window
+ */
+inline void Window::LowerWidget(byte widget_index)
+{
+	SetWidgetLoweredState(widget_index, true);
+}
+
+/**
+ * Marks a widget as raised.
+ * @param widget_index : index of this widget in the window
+ */
+inline void Window::RaiseWidget(byte widget_index)
+{
+	SetWidgetLoweredState(widget_index, false);
+}
+
+/**
+ * Gets the lowered state of a widget.
+ * @param widget_index : index of this widget in the window
+ * @return status of the widget ie: lowered = true, raised= false
+ */
+inline bool Window::IsWidgetLowered(byte widget_index) const
+{
+	assert(widget_index < this->widget_count);
+	return HasBit(this->widget[widget_index].display_flags, WIDG_LOWERED);
+}
+
 #endif /* WINDOW_H */
--- a/src/yapf/follow_track.hpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/yapf/follow_track.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -197,7 +197,7 @@
 		// rail transport is possible only on compatible rail types
 		if (IsRailTT()) {
 			RailType rail_type = GetTileRailType(m_new_tile);
-			if (!HASBIT(m_veh->u.rail.compatible_railtypes, rail_type)) {
+			if (!HasBit(m_veh->u.rail.compatible_railtypes, rail_type)) {
 				// incompatible rail type
 				m_err = EC_RAIL_TYPE;
 				return false;
--- a/src/yapf/yapf_base.hpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/yapf/yapf_base.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -192,8 +192,8 @@
 	/** add multiple nodes - direct children of the given node */
 	FORCEINLINE void AddMultipleNodes(Node* parent, const TrackFollower &tf)
 	{
-		bool is_choice = (KillFirstBit2x64(tf.m_new_td_bits) != 0);
-		for (TrackdirBits rtds = tf.m_new_td_bits; rtds != TRACKDIR_BIT_NONE; rtds = (TrackdirBits)KillFirstBit2x64(rtds)) {
+		bool is_choice = (KillFirstBit(tf.m_new_td_bits) != TRACKDIR_BIT_NONE);
+		for (TrackdirBits rtds = tf.m_new_td_bits; rtds != TRACKDIR_BIT_NONE; rtds = KillFirstBit(rtds)) {
 			Trackdir td = (Trackdir)FindFirstBit2x64(rtds);
 			Node& n = Yapf().CreateNewNode();
 			n.Set(parent, tf.m_new_tile, td, is_choice);
--- a/src/yapf/yapf_common.hpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/yapf/yapf_common.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -32,8 +32,8 @@
 	/// Called when YAPF needs to place origin nodes into open list
 	void PfSetStartupNodes()
 	{
-		bool is_choice = (KillFirstBit2x64(m_orgTrackdirs) != 0);
-		for (TrackdirBits tdb = m_orgTrackdirs; tdb != TRACKDIR_BIT_NONE; tdb = (TrackdirBits)KillFirstBit2x64(tdb)) {
+		bool is_choice = (KillFirstBit(m_orgTrackdirs) != TRACKDIR_BIT_NONE);
+		for (TrackdirBits tdb = m_orgTrackdirs; tdb != TRACKDIR_BIT_NONE; tdb = KillFirstBit(tdb)) {
 			Trackdir td = (Trackdir)FindFirstBit2x64(tdb);
 			Node& n1 = Yapf().CreateNewNode();
 			n1.Set(NULL, m_orgTile, td, is_choice);
--- a/src/yapf/yapf_costrail.hpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/yapf/yapf_costrail.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -387,7 +387,7 @@
 			}
 
 			/* Check if the next tile is not a choice. */
-			if (KillFirstBit2x64(tf_local.m_new_td_bits) != 0) {
+			if (KillFirstBit(tf_local.m_new_td_bits) != TRACKDIR_BIT_NONE) {
 				/* More than one segment will follow. Close this one. */
 				end_segment_reason |= ESRB_CHOICE_FOLLOWS;
 				break;
--- a/src/yapf/yapf_destrail.hpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/yapf/yapf_destrail.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -18,7 +18,7 @@
 
 	bool IsCompatibleRailType(RailType rt)
 	{
-		return HASBIT(m_compatible_railtypes, rt);
+		return HasBit(m_compatible_railtypes, rt);
 	}
 };
 
--- a/src/yapf/yapf_road.cpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/yapf/yapf_road.cpp	Mon Dec 03 23:39:38 2007 +0000
@@ -97,7 +97,7 @@
 			if (!F.Follow(tile, trackdir)) break;
 
 			// if there are more trackdirs available & reachable, we are at the end of segment
-			if (KillFirstBit2x64(F.m_new_td_bits) != 0) break;
+			if (KillFirstBit(F.m_new_td_bits) != TRACKDIR_BIT_NONE) break;
 
 			Trackdir new_td = (Trackdir)FindFirstBit2x64(F.m_new_td_bits);
 
--- a/src/zoom.hpp	Sat Oct 06 21:16:00 2007 +0000
+++ b/src/zoom.hpp	Mon Dec 03 23:39:38 2007 +0000
@@ -32,6 +32,13 @@
 
 extern ZoomLevel _saved_scrollpos_zoom;
 
+/**
+ * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL)
+ * When shifting right, value is rounded up
+ * @param value value to shift
+ * @param zoom  zoom level to shift to
+ * @return shifted value
+ */
 static inline int ScaleByZoom(int value, ZoomLevel zoom)
 {
 	if (zoom == ZOOM_LVL_NORMAL) return value;
@@ -39,6 +46,13 @@
 	return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : (value + (1 << -izoom) - 1) >> -izoom;
 }
 
+/**
+ * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL)
+ * When shifting right, value is rounded up
+ * @param value value to shift
+ * @param zoom  zoom level to shift to
+ * @return shifted value
+ */
 static inline int UnScaleByZoom(int value, ZoomLevel zoom)
 {
 	if (zoom == ZOOM_LVL_NORMAL) return value;
@@ -46,4 +60,30 @@
 	return (zoom > ZOOM_LVL_NORMAL) ? (value + (1 << izoom) - 1) >> izoom : value << -izoom;
 }
 
+/**
+ * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL)
+ * @param value value to shift
+ * @param zoom  zoom level to shift to
+ * @return shifted value
+ */
+static inline int ScaleByZoomLower(int value, ZoomLevel zoom)
+{
+	if (zoom == ZOOM_LVL_NORMAL) return value;
+	int izoom = (int)zoom - (int)ZOOM_LVL_NORMAL;
+	return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : value >> -izoom;
+}
+
+/**
+ * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL)
+ * @param value value to shift
+ * @param zoom  zoom level to shift to
+ * @return shifted value
+ */
+static inline int UnScaleByZoomLower(int value, ZoomLevel zoom)
+{
+	if (zoom == ZOOM_LVL_NORMAL) return value;
+	int izoom = (int)zoom - (int)ZOOM_LVL_NORMAL;
+	return (zoom > ZOOM_LVL_NORMAL) ? value >> izoom : value << -izoom;
+}
+
 #endif /* ZOOM_HPP */