(svn r11503) [NoAI] -Sync: with trunk r11308:11502. noai
authorrubidium
Fri, 23 Nov 2007 16:59:30 +0000
branchnoai
changeset 9722 ebf0ece7d8f6
parent 9721 9a27928bcd5e
child 9723 eee46cb39750
(svn r11503) [NoAI] -Sync: with trunk r11308:11502.
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/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/NoAI/NoAI.cpp
src/ai/api/ai_airport.cpp
src/ai/api/ai_engine.cpp
src/ai/api/ai_road.cpp
src/aircraft_cmd.cpp
src/aircraft_gui.cpp
src/airport.cpp
src/airport_gui.cpp
src/airport_movement.h
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/command.cpp
src/console.cpp
src/console_cmds.cpp
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/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/udp.cpp
src/network/network.h
src/network/network_client.cpp
src/network/network_gui.cpp
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_commons.cpp
src/newgrf_commons.h
src/newgrf_config.cpp
src/newgrf_config.h
src/newgrf_engine.cpp
src/newgrf_engine.h
src/newgrf_gui.cpp
src/newgrf_house.cpp
src/newgrf_house.h
src/newgrf_industries.cpp
src/newgrf_industrytiles.cpp
src/newgrf_industrytiles.h
src/newgrf_sound.cpp
src/newgrf_spritegroup.cpp
src/newgrf_station.cpp
src/newgrf_townname.cpp
src/news.h
src/news_gui.cpp
src/npf.cpp
src/npf.h
src/oldloader.cpp
src/openttd.cpp
src/openttd.h
src/order_cmd.cpp
src/order_gui.cpp
src/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.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/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/squirrel_helper.hpp
src/squirrel_std.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/terraform_gui.cpp
src/texteff.cpp
src/tgp.cpp
src/timetable_cmd.cpp
src/timetable_gui.cpp
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/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/sdl_v.cpp
src/video/win32_v.cpp
src/viewport.cpp
src/viewport.h
src/water_cmd.cpp
src/water_map.h
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	Thu Nov 22 23:01:41 2007 +0000
+++ b/Makefile.in	Fri Nov 23 16:59:30 2007 +0000
@@ -258,8 +258,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/Makefile.src.in	Fri Nov 23 16:59:30 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
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	Thu Nov 22 23:01:41 2007 +0000
+++ b/changelog.txt	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/config.lib	Fri Nov 23 16:59:30 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
@@ -1013,6 +1014,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
@@ -1859,6 +1864,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/docs/landscape.html	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/known-bugs.txt	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/os/debian/changelog	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/os/win32/installer/install.nsi	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/projects/determineversion.vbs	Fri Nov 23 16:59:30 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,55 @@
 			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")
+		Do While oExec.Status = 0 And Err.Number = 0
+			' Wait till command has finished
+		Loop
+		If Err.Number = 0 And oExec.ExitCode = 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/projects/generate	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/projects/langs.vcproj	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/projects/langs_vs80.vcproj	Fri Nov 23 16:59:30 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	Fri Nov 23 16:59:30 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	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/projects/openttd.vcproj	Fri Nov 23 16:59:30 2007 +0000
@@ -198,6 +198,9 @@
 				RelativePath=".\..\src\console_cmds.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\core\random_func.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\currency.cpp">
 			</File>
 			<File
@@ -258,9 +261,6 @@
 				RelativePath=".\..\src\md5.cpp">
 			</File>
 			<File
-				RelativePath=".\..\src\mersenne.cpp">
-			</File>
-			<File
 				RelativePath=".\..\src\minilzo.cpp">
 			</File>
 			<File
@@ -433,6 +433,12 @@
 				RelativePath=".\..\src\console.h">
 			</File>
 			<File
+				RelativePath=".\..\src\core\math_func.hpp">
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.hpp">
+			</File>
+			<File
 				RelativePath=".\..\src\currency.h">
 			</File>
 			<File
@@ -703,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/projects/openttd_vs80.vcproj	Fri Nov 23 16:59:30 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;..\src\3rdparty\squirrel\include"
+				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;..\src\3rdparty\squirrel\include"
-				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,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\random_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\currency.cpp"
 				>
 			</File>
@@ -576,10 +580,6 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\mersenne.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\minilzo.cpp"
 				>
 			</File>
@@ -808,6 +808,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\math_func.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\currency.h"
 				>
 			</File>
@@ -1168,6 +1176,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\transparency.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\transparency_gui.h"
 				>
 			</File>
@@ -2520,6 +2532,14 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
+					Name="Debug|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
 					Name="Release|x64"
 					>
 					<Tool
@@ -2529,14 +2549,6 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="Debug|Win32"
-					ExcludedFromBuild="true"
-					>
-					<Tool
-						Name="VCCustomBuildTool"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
 					Name="Debug|x64"
 					>
 					<Tool
--- a/projects/openttd_vs80.vcproj.in	Thu Nov 22 23:01:41 2007 +0000
+++ b/projects/openttd_vs80.vcproj.in	Fri Nov 23 16:59:30 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;..\src\3rdparty\squirrel\include"
+				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;..\src\3rdparty\squirrel\include"
-				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	Fri Nov 23 16:59:30 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	Fri Nov 23 16:59:30 2007 +0000
@@ -0,0 +1,2114 @@
+<?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\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\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	Fri Nov 23 16:59:30 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	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/readme.txt	Fri Nov 23 16:59:30 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
@@ -103,9 +103,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.
@@ -295,10 +293,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/source.list	Fri Nov 23 16:59:30 2007 +0000
@@ -10,6 +10,7 @@
 command.cpp
 console.cpp
 console_cmds.cpp
+core/random_func.cpp
 currency.cpp
 date.cpp
 debug.cpp
@@ -30,7 +31,6 @@
 landscape.cpp
 map.cpp
 md5.cpp
-mersenne.cpp
 minilzo.cpp
 misc.cpp
 mixer.cpp
@@ -110,6 +110,8 @@
 cargotype.h
 command.h
 console.h
+core/math_func.hpp
+core/random_func.hpp
 currency.h
 date.h
 debug.h
@@ -200,6 +202,7 @@
 timetable.h
 town.h
 train.h
+transparency.h
 transparency_gui.h
 variables.h
 vehicle.h
@@ -597,7 +600,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/NoAI/NoAI.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/ai/NoAI/NoAI.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -2,6 +2,7 @@
 
 /** @file NoAI.cpp a simple C++ AI that will never be an AI */
 
+#include "../../stdafx.h"
 #include "NoAI.hpp"
 
 static FNoAI iFNoAI; ///< Tell the AI-core that we have an AI with which we like to play.
--- a/src/ai/api/ai_airport.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/ai/api/ai_airport.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -25,7 +25,7 @@
 /* static */ bool AIAirport::AiportAvailable(AirportType type)
 {
 	if (type > AT_HELISTATION) return 0;
-	return HASBIT(::GetValidAirports(), type);
+	return HasBit(::GetValidAirports(), type);
 }
 
 /* static */ int32 AIAirport::GetAirportWidth(AirportType type)
--- a/src/ai/api/ai_engine.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/ai/api/ai_engine.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -11,7 +11,7 @@
 
 /* static */ bool AIEngine::IsValidEngine(EngineID engine_id)
 {
-	return ::IsEngineIndex(engine_id) && HASBIT(GetEngine(engine_id)->player_avail, _current_player);
+	return ::IsEngineIndex(engine_id) && HasBit(GetEngine(engine_id)->player_avail, _current_player);
 }
 
 /* static */ char *AIEngine::GetName(EngineID engine_id)
--- a/src/ai/api/ai_road.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/ai/api/ai_road.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -54,7 +54,7 @@
 	DiagDirection dir_1 = (DiagDirection)((::TileX(t1) == ::TileX(t2)) ? (::TileY(t1) < ::TileY(t2) ? 2 : 0) : (::TileX(t1) < ::TileX(t2) ? 1 : 3));
 	DiagDirection dir_2 = ::ReverseDiagDir(dir_1);
 
-	return HASBIT(r1, dir_1) && HASBIT(r2, dir_2);
+	return HasBit(r1, dir_1) && HasBit(r2, dir_2);
 }
 
 int32 AIRoad::GetNeighbourRoadCount(TileIndex tile)
--- a/src/aircraft_cmd.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/aircraft_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -292,7 +292,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);
 
@@ -300,9 +300,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;
@@ -365,7 +365,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);
 			}
 
@@ -419,7 +419,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);
 
@@ -492,13 +492,15 @@
 
 	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.
@@ -534,6 +536,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);
@@ -566,13 +569,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();
@@ -604,7 +607,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);
@@ -648,7 +651,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;
@@ -831,12 +834,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;
 
@@ -1110,7 +1113,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;
@@ -1152,7 +1155,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) :
@@ -1680,7 +1683,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);
@@ -1957,10 +1960,10 @@
 {
 	Station *st = GetStation(v->u.air.targetairport);
 	for (; i < last_terminal; i++) {
-		if (!HASBIT(st->airport_flags, _airport_terminal_flag[i])) {
+		if (!HasBit(st->airport_flags, _airport_terminal_flag[i])) {
 			/* TERMINAL# HELIPAD# */
 			v->u.air.state = _airport_terminal_state[i]; // start moving to that terminal/helipad
-			SETBIT(st->airport_flags, _airport_terminal_flag[i]); // occupy terminal/helipad
+			SetBit(st->airport_flags, _airport_terminal_flag[i]); // occupy terminal/helipad
 			return true;
 		}
 	}
--- a/src/aircraft_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/aircraft_gui.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/airport.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -192,6 +192,7 @@
 
 void UnInitializeAirports()
 {
+	delete DummyAirport;
 	delete CountryAirport;
 	delete CityAirport;
 	delete Heliport;
@@ -487,14 +488,14 @@
 {
 	uint32 mask = 0;
 
-	if (_cur_year <  1960 || _patches.always_small_airport) SETBIT(mask, 0);  // small airport
-	if (_cur_year >= 1955) SETBIT(mask, 1); // city airport
-	if (_cur_year >= 1963) SETBIT(mask, 2); // heliport
-	if (_cur_year >= 1980) SETBIT(mask, 3); // metropolitan airport
-	if (_cur_year >= 1990) SETBIT(mask, 4); // international airport
-	if (_cur_year >= 1983) SETBIT(mask, 5); // commuter airport
-	if (_cur_year >= 1976) SETBIT(mask, 6); // helidepot
-	if (_cur_year >= 2002) SETBIT(mask, 7); // intercontinental airport
-	if (_cur_year >= 1980) SETBIT(mask, 8); // helistation
+	if (_cur_year <  1960 || _patches.always_small_airport) SetBit(mask, 0);  // small airport
+	if (_cur_year >= 1955) SetBit(mask, 1); // city airport
+	if (_cur_year >= 1963) SetBit(mask, 2); // heliport
+	if (_cur_year >= 1980) SetBit(mask, 3); // metropolitan airport
+	if (_cur_year >= 1990) SetBit(mask, 4); // international airport
+	if (_cur_year >= 1983) SetBit(mask, 5); // commuter airport
+	if (_cur_year >= 1976) SetBit(mask, 6); // helidepot
+	if (_cur_year >= 2002) SetBit(mask, 7); // intercontinental airport
+	if (_cur_year >= 1980) SetBit(mask, 8); // helistation
 	return mask;
 }
--- a/src/airport_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/airport_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -51,12 +51,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);
 }
 
 
@@ -160,8 +160,8 @@
 		avail_airports = GetValidAirports();
 
 		RaiseWindowWidget(w, _selected_airport_type + 7);
-		if (!HASBIT(avail_airports, 0) && _selected_airport_type == AT_SMALL) _selected_airport_type = AT_LARGE;
-		if (!HASBIT(avail_airports, 1) && _selected_airport_type == AT_LARGE) _selected_airport_type = AT_SMALL;
+		if (!HasBit(avail_airports, 0) && _selected_airport_type == AT_SMALL) _selected_airport_type = AT_LARGE;
+		if (!HasBit(avail_airports, 1) && _selected_airport_type == AT_LARGE) _selected_airport_type = AT_SMALL;
 		LowerWindowWidget(w, _selected_airport_type + 7);
 
 		/* 'Country Airport' starts at widget 7, and if its bit is set, it is
@@ -170,7 +170,7 @@
 		 * XXX TODO : all airports should be held in arrays, with all relevant data.
 		 * This should be part of newgrf-airports, i suppose
 		 */
-		for (i = 0; i < 9; i++) SetWindowWidgetDisabledState(w, i + 7, !HASBIT(avail_airports, i));
+		for (i = 0; i < 9; i++) SetWindowWidgetDisabledState(w, i + 7, !HasBit(avail_airports, i));
 
 		// select default the coverage area to 'Off' (16)
 		airport = GetAirport(_selected_airport_type);
--- a/src/airport_movement.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/airport_movement.h	Fri Nov 23 16:59:30 2007 +0000
@@ -72,7 +72,7 @@
 	{  145,   54, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 16 Fly to landing position in air
 	{   73,   54, AMED_NOSPDCLAMP | AMED_LAND,     {DIR_N} }, // 17 Going down for land
 	{    3,   54, AMED_NOSPDCLAMP | AMED_BRAKE,    {DIR_N} }, // 18 Just landed, brake until end of runway
-	{   12,   54, 0,                               {DIR_NW} }, // 19 Just landed, turn around and taxi
+	{   12,   54, AMED_SLOWTURN,                   {DIR_NW} }, // 19 Just landed, turn around and taxi
 	{    8,   32, 0,                               {DIR_NW} }, // 20 Taxi from runway to crossing
 	{  -31,  149, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 21 Fly around waiting for a landing spot (north-east)
 	{    1,    6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 22 Fly around waiting for a landing spot (north-west)
--- a/src/articulated_vehicles.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/articulated_vehicles.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/autoreplace_cmd.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/autoreplace_gui.cpp	Fri Nov 23 16:59:30 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)
 		}
 
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/bridge_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -53,7 +53,7 @@
 				SetDParam(0, b->material);
 				DrawSprite(b->sprite, b->pal, 3, 15 + i * 22);
 
-				DrawString(44, 15 + i * 22 , STR_500D, 0);
+				DrawString(44, 15 + i * 22 , STR_500D, TC_FROMSTRING);
 			}
 			break;
 
--- a/src/bridge_map.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/bridge_map.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/bridge_map.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/build_vehicle_gui.cpp	Fri Nov 23 16:59:30 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);
 		}
 	}
 }
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/cargotype.cpp	Fri Nov 23 16:59:30 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/command.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/command.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/console.cpp	Fri Nov 23 16:59:30 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;
 	}
 
--- a/src/console_cmds.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/console_cmds.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -1249,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],
@@ -1423,7 +1423,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/math_func.hpp	Fri Nov 23 16:59:30 2007 +0000
@@ -0,0 +1,229 @@
+/* $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(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 IS_INSIDE_1D(const T x, const int base, const uint size)
+{
+	return (uint)(x - base) < size;
+}
+
+/**
+ * Checks if a byte is in an interval.
+ *
+ * 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
+ */
+template<typename T> static inline bool IS_BYTE_INSIDE(const T x, const byte min, const byte max)
+{
+	return (byte)(x - min) < (max - min);
+}
+
+/**
+ * Checks if an int is in an interval.
+ *
+ * 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
+ */
+template<typename T> static inline bool IS_INT_INSIDE(const T x, const int 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	Fri Nov 23 16:59:30 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	Fri Nov 23 16:59:30 2007 +0000
@@ -0,0 +1,39 @@
+/* $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);
+
+#endif /* RANDOM_FUNC_HPP */
--- a/src/date.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/date.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/depot.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/depot_gui.cpp	Fri Nov 23 16:59:30 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)
@@ -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
 	}
 }
 
@@ -414,7 +414,7 @@
 	int mode = GetVehicleFromDepotWndPt(w, x, y, &v, &gdvp);
 
 	/* share / copy orders */
-	if (_thd.place_mode && mode <= 0) {
+	if (_thd.place_mode != VHM_NONE && mode <= 0) {
 		_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;
--- a/src/disaster_cmd.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/disaster_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -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;
 
@@ -202,7 +202,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);
 
@@ -305,7 +305,7 @@
 	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 */
@@ -400,7 +400,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);
@@ -473,7 +473,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);
@@ -539,7 +539,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;
 
@@ -709,7 +709,7 @@
 		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)) {
@@ -930,7 +930,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 {
@@ -955,7 +955,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/dock_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -79,35 +79,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);
 }
 
 
--- a/src/economy.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/economy.cpp	Fri Nov 23 16:59:30 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);
 	}
 
 	{
@@ -518,7 +545,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);
 
@@ -530,7 +557,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]);
@@ -542,7 +569,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,
@@ -552,7 +579,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(
@@ -611,7 +638,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) {
@@ -710,7 +737,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);
@@ -981,7 +1008,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];
@@ -1151,14 +1178,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
@@ -1199,7 +1226,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)
@@ -1226,7 +1253,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;
 		}
@@ -1248,9 +1275,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);
@@ -1260,6 +1287,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);
 	}
 }
@@ -1342,7 +1370,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. */
@@ -1396,7 +1424,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;
@@ -1407,7 +1435,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;
 		}
 
@@ -1418,7 +1446,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;
@@ -1431,7 +1459,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(
@@ -1448,7 +1476,7 @@
 				}
 				result |= 2;
 
-				SETBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+				SetBit(v->vehicle_flags, VF_CARGO_UNLOADING);
 			}
 		}
 		v->cargo.InvalidateCache();
@@ -1486,7 +1514,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();
@@ -1498,7 +1526,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;
 	}
 
@@ -1522,32 +1550,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 && 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;
 			}
 
@@ -1561,7 +1589,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;
@@ -1592,7 +1620,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;
 			}
 
@@ -1627,9 +1655,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);
 		}
 	}
 
@@ -1637,7 +1665,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();
@@ -1656,7 +1684,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/elrail.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/engine.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/engine_gui.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/fileio.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/fios.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/fios.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/fontcache.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/functions.h	Fri Nov 23 16:59:30 2007 +0000
@@ -6,6 +6,8 @@
 #define FUNCTIONS_H
 
 #include "gfx.h"
+#include "viewport.h"
+#include "core/random_func.hpp"
 
 void UpdateTownMaxPass(Town *t);
 
@@ -31,52 +33,9 @@
 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 */
 void AddAnimatedTile(TileIndex tile);
 void DeleteAnimatedTile(TileIndex tile);
@@ -123,8 +82,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();
 
--- a/src/genworld.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/genworld.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/genworld_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -265,47 +265,47 @@
 
 		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;
@@ -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;
 			}
 
@@ -619,18 +619,18 @@
 		SetWindowWidgetLoweredState(w, 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:
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/gfx.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/gfx.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/gfxinit.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/gfxinit.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/graph_gui.cpp	Fri Nov 23 16:59:30 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.
@@ -70,9 +70,9 @@
 
 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,7 +131,7 @@
 	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];
 
@@ -139,7 +139,7 @@
 					/* 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);
 
@@ -250,7 +250,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)) LowerWindowWidget(w, i);
 			}
 			break;
 
@@ -260,7 +260,7 @@
 			FOR_ALL_PLAYERS(p) {
 				if (p->is_active) continue;
 
-				SETBIT(_legend_excluded_players, p->index);
+				SetBit(_legend_excluded_players, p->index);
 				RaiseWindowWidget(w, p->index + 3);
 			}
 
@@ -273,7 +273,7 @@
 
 				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;
 		}
@@ -281,7 +281,7 @@
 		case WE_CLICK:
 			if (!IS_INT_INSIDE(e->we.click.widget, 3, 11)) return;
 
-			TOGGLEBIT(_legend_excluded_players, e->we.click.widget - 3);
+			ToggleBit(_legend_excluded_players, e->we.click.widget - 3);
 			ToggleWidgetLoweredState(w, e->we.click.widget);
 			SetWindowDirty(w);
 			InvalidateWindow(WC_INCOME_GRAPH, 0);
@@ -334,7 +334,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 +515,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 +582,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++;
 					}
 				}
@@ -738,7 +738,7 @@
 					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,14 +753,14 @@
 
 			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);
+				ToggleBit(_legend_excluded_cargo, e->we.click.widget - 3);
 				ToggleWidgetLoweredState(w, e->we.click.widget);
 				SetWindowDirty(w);
 			}
@@ -816,7 +816,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)) LowerWindowWidget(w, i + 3);
 	}
 
 	SetWindowDirty(w);
@@ -879,7 +879,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);
 			}
 
@@ -999,14 +999,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 +1016,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 +1038,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);
 				}
 			}
 
--- a/src/group_cmd.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/group_cmd.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/group_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -40,7 +40,7 @@
 	const Group *g;
 	uint n = 0;
 
-	if (!(gl->l.flags & VL_REBUILD)) return;
+	if (!(gl->l.flags & VL_REBUILD) || GetGroupArraySize() == 0) return;
 
 	list = MallocT<const Group*>(GetGroupArraySize());
 	if (list == NULL) {
@@ -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},
@@ -328,6 +328,19 @@
 			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 && IsWindowWidgetLowered(w, GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN)) {
+				RaiseWindowWidget(w, 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,
 					GRP_WIDGET_STOP_ALL,
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/gui.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/helpers.hpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/industry.h	Fri Nov 23 16:59:30 2007 +0000
@@ -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) {}
--- a/src/industry_cmd.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/industry_cmd.cpp	Fri Nov 23 16:59:30 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,7 @@
 #include "newgrf_callbacks.h"
 #include "misc/autoptr.hpp"
 #include "autoslope.h"
+#include "transparency.h"
 
 void ShowIndustryViewWindow(int industry);
 void BuildOilRig(TileIndex tile);
@@ -66,7 +68,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 +290,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 +305,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 +346,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 +354,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;
@@ -405,41 +407,34 @@
 {
 	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);
+		}
 	}
 }
 
@@ -649,9 +644,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 +702,8 @@
 	IndustryGfx newgfx;
 	IndustryGfx gfx;
 
+	TriggerIndustryTile(tile, INDTILE_TRIGGER_TILE_LOOP);
+
 	if (!IsIndustryCompleted(tile)) {
 		MakeIndustryTileBigger(tile);
 		return;
@@ -1005,7 +1000,7 @@
 
 	/* 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);
 
 		IndustryBehaviour indbehav = indsp->behaviour;
 		i->produced_cargo_waiting[0] = min(0xffff, i->produced_cargo_waiting[0] + i->production_rate[0]);
@@ -1013,7 +1008,7 @@
 
 		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);
@@ -1023,7 +1018,7 @@
 		}
 		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 +1045,7 @@
 	if (_game_mode == GM_EDITOR) return;
 
 	FOR_ALL_INDUSTRIES(i) {
+		TriggerIndustry(i, INDUSTRY_TRIGGER_INDUSTRY_TICK);
 		StartStopIndustryTileAnimation(i, IAT_INDUSTRY_TICK);
 		ProduceIndustryGoods(i);
 	}
@@ -1229,9 +1225,9 @@
 			IndustryBehaviour ind_behav = GetIndustrySpec(type)->behaviour;
 
 			/* 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->slopes_refused, 5) && (IsWaterTile(cur_tile) == !(ind_behav & INDUSTRYBEH_BUILT_ONWATER))) return false;
 
-			if (HASBIT(its->callback_flags, CBM_INDT_SHAPE_CHECK)) {
+			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 {
@@ -1239,7 +1235,7 @@
 				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;
@@ -1432,8 +1428,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);
 	}
@@ -1442,8 +1441,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;
@@ -1463,12 +1463,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);
@@ -1477,7 +1477,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);
@@ -1513,10 +1513,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);
 
@@ -1545,7 +1551,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;
@@ -1577,7 +1583,7 @@
  * @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)
@@ -1625,7 +1631,7 @@
 	} else {
 		int count = indspec->num_table;
 		const IndustryTileTable * const *itt = indspec->table;
-		int num = RandomRange(count);
+		int num = Clamp(p2, 0, count - 1);
 
 		_error_message = STR_0239_SITE_UNSUITABLE;
 		do {
@@ -1791,11 +1797,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;
@@ -1848,9 +1857,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 +2004,21 @@
 	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;
 
-	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 +2028,9 @@
 				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
 			}
 		}
 	}
@@ -1902,19 +2046,23 @@
 		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 || CHANCE16(1, 3)) mult *= -1;
+
+				if (CHANCE16(1, 22)) {
+					new_prod += mult * (max(((RandomRange(50) + 10) * old_prod) >> 8, 1U));
 				}
 
-				new_prod = clamp(new_prod, 1, 255);
+				/* 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 +2075,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 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
@@ -1984,15 +2124,33 @@
 	}
 
 	if (!suppress_message && str != STR_NULL) {
+		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);
 	}
 }
@@ -2070,12 +2228,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;
 			}
 		}
@@ -2137,6 +2295,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/industry_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -138,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];
@@ -167,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 */
-				DrawStringTruncated(20, y + offset, indsp->name, selected ? 12 : 6, max_width - 25);
+				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);
 			}
@@ -185,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
@@ -230,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];
@@ -278,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;
 			}
@@ -315,7 +307,7 @@
 				_ignore_restrictions = false;
 				_generating_world = false;
 			} else {
-				success = DoCommandP(e->we.place.tile, WP(w, fnd_d).select, 0, NULL, CMD_BUILD_INDUSTRY | CMD_MSG(STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY));
+				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));
 			}
 
 			/* If an industry has been built, just reset the cursor and the system */
@@ -379,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)
@@ -411,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;
 		}
@@ -442,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,
@@ -496,7 +509,7 @@
 		}
 
 		/* 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);
@@ -504,7 +517,7 @@
 					y += 10;
 
 					PrepareTextRefStackUsage(6);
-					DrawString(2, y, message, 0);
+					DrawString(2, y, message, TC_FROMSTRING);
 					StopTextRefStackUsage();
 				}
 			}
@@ -531,10 +544,12 @@
 					/* 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);
@@ -568,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);
 		}
@@ -768,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;
@@ -786,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;
--- a/src/industry_map.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/industry_map.h	Fri Nov 23 16:59:30 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();
 }
 
 /**
--- a/src/landscape.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/landscape.cpp	Fri Nov 23 16:59:30 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;
@@ -207,8 +239,28 @@
 }
 
 /**
+ * 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.
@@ -227,10 +279,14 @@
 		{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 == corners[edge][2]) *z1 += TILE_HEIGHT; // z1 is highest corner of a steep slope
-	if (tileh == corners[edge][3]) *z2 += TILE_HEIGHT; // z2 is highest corner of a steep slope
+	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)
@@ -280,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);
@@ -306,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);
@@ -578,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/landscape.h	Fri Nov 23 16:59:30 2007 +0000
@@ -26,6 +26,7 @@
 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	Fri Nov 23 16:59:30 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                                        :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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/american.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -2000,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!
@@ -2314,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...
 
--- a/src/lang/brazilian_portuguese.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/brazilian_portuguese.txt	Fri Nov 23 16:59:30 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
@@ -1669,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
@@ -1680,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
@@ -2004,9 +2010,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!
@@ -2318,7 +2324,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...
 
@@ -3077,7 +3082,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
@@ -3286,6 +3293,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
--- a/src/lang/bulgarian.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/bulgarian.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -1189,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}Строене
@@ -1665,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}Строене на автогара
@@ -1997,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}!{}Очаква се производстото да се удвои!
@@ -2311,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}Тази компания все още не е достатъчно стара да предлага акции...
 
@@ -3068,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}Добави
@@ -3392,6 +3395,7 @@
 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}Нов номер на лицето е избран.
--- a/src/lang/catalan.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/catalan.txt	Fri Nov 23 16:59:30 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ó de l'indústria controlats pel jugador
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Canvis de producció de l'indústria controlats 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
@@ -1667,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
@@ -1678,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
@@ -2000,9 +2006,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ó!
@@ -2314,7 +2320,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...
 
@@ -3073,7 +3078,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
@@ -3282,6 +3289,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
@@ -3430,7 +3438,7 @@
 STR_FACE_CHIN_TIP                                               :{BLACK}Canvia la barbeta
 STR_FACE_JACKET                                                 :Jaqueta:
 STR_FACE_JACKET_TIP                                             :{BLACK}Canvia la jaqueta
-STR_FACE_COLLAR                                                 :Collaret:
+STR_FACE_COLLAR                                                 :Coll:
 STR_FACE_COLLAR_TIP                                             :{BLACK}Canvia el collaret
 STR_FACE_TIE                                                    :Corbata:
 STR_FACE_EARRING                                                :Arracades:
--- a/src/lang/croatian.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/croatian.txt	Fri Nov 23 16:59:30 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
@@ -1668,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
@@ -2001,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!
@@ -2315,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...
 
@@ -3074,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
@@ -3389,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/czech.txt	Fri Nov 23 16:59:30 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
@@ -1392,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
 
@@ -1724,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
@@ -1735,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
@@ -2057,9 +2064,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!
@@ -2078,6 +2085,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}
@@ -2369,7 +2378,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...
 
@@ -3134,7 +3142,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
@@ -3343,6 +3353,7 @@
 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é
@@ -3449,3 +3460,51 @@
 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
+########
--- a/src/lang/danish.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/danish.txt	Fri Nov 23 16:59:30 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}
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/dutch.txt	Fri Nov 23 16:59:30 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
@@ -1667,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
@@ -1678,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
@@ -2000,9 +2006,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!
@@ -2314,7 +2320,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...
 
@@ -3073,7 +3078,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
@@ -3282,6 +3289,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
--- a/src/lang/english.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/english.txt	Fri Nov 23 16:59:30 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
@@ -1335,7 +1338,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
 
@@ -1667,7 +1670,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
@@ -1678,6 +1683,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
@@ -2000,9 +2006,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!
@@ -2314,7 +2320,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...
 
@@ -3073,7 +3078,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
@@ -3282,6 +3289,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
--- a/src/lang/esperanto.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/esperanto.txt	Fri Nov 23 16:59:30 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!
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/estonian.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -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
@@ -1766,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
@@ -2099,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!
@@ -2120,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}
@@ -2411,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...
 
@@ -2880,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.
@@ -3168,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
@@ -3483,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/finnish.txt	Fri Nov 23 16:59:30 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!
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/french.txt	Fri Nov 23 16:59:30 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
@@ -1336,7 +1339,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
 
@@ -1668,7 +1671,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
@@ -1679,6 +1684,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
@@ -2001,9 +2007,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!
@@ -2315,7 +2321,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...
 
@@ -2400,7 +2405,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
@@ -2430,7 +2435,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
@@ -2462,7 +2467,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
@@ -2536,13 +2541,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
@@ -3074,7 +3079,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
@@ -3283,6 +3290,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
--- a/src/lang/galician.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/galician.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -1835,9 +1835,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!
@@ -2144,7 +2144,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...
 
--- a/src/lang/german.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/german.txt	Fri Nov 23 16:59:30 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}
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/hungarian.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -2103,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!
@@ -2416,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...
 
--- a/src/lang/icelandic.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/icelandic.txt	Fri Nov 23 16:59:30 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!
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/italian.txt	Fri Nov 23 16:59:30 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
@@ -1252,7 +1255,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
 
@@ -1337,7 +1340,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
 
@@ -1669,7 +1672,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
@@ -1680,6 +1685,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
@@ -2002,9 +2008,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!
@@ -2316,7 +2322,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...
 
@@ -3075,7 +3080,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
@@ -3284,6 +3291,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
--- a/src/lang/japanese.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/japanese.txt	Fri Nov 23 16:59:30 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}
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/korean.txt	Fri Nov 23 16:59:30 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}
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/lithuanian.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -1886,9 +1886,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!
@@ -2196,7 +2196,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...
 
--- a/src/lang/norwegian_bokmal.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/norwegian_bokmal.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -1,5 +1,5 @@
 ##name Norwegian
-##ownname Norsk, bokmål
+##ownname Norsk (bokmål)
 ##isocode nb_NO
 ##plural 0
 ##gender masculinum neutrium femininum
@@ -1067,7 +1067,7 @@
 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 folketall i tittel: {ORANGE}{STRING}
@@ -1205,7 +1205,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}
@@ -1320,8 +1320,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
@@ -1668,7 +1668,9 @@
 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
@@ -1741,12 +1743,12 @@
 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}Subsidietilbud har gått ut:{}{}{STRING} fra {STRING} til {STRING} subsidieres ikke lenger.
+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% mer inntekt i løpet av ett år!
+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
@@ -1849,7 +1851,7 @@
 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}
@@ -1994,25 +1996,25 @@
 ############ 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} legger ned!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}{INDUSTRY} legger ned etter leveringsproblemer
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}{INDUSTRY} legger ned grunnet tremangel
+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}{STRING}produksjon 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
@@ -2129,7 +2131,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}
@@ -2157,9 +2159,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
@@ -2174,9 +2176,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
@@ -2297,7 +2299,7 @@
 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
@@ -2308,14 +2310,13 @@
 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...
 
@@ -2715,8 +2716,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
@@ -2757,7 +2758,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
@@ -2811,7 +2812,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
@@ -2887,7 +2888,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...
@@ -2955,7 +2956,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
@@ -3028,7 +3029,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:
@@ -3074,7 +3075,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
@@ -3216,7 +3219,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}
@@ -3261,7 +3264,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
@@ -3328,12 +3331,12 @@
 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}
--- a/src/lang/norwegian_nynorsk.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/norwegian_nynorsk.txt	Fri Nov 23 16:59:30 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}
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/piglatin.txt	Fri Nov 23 16:59:30 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!
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/polish.txt	Fri Nov 23 16:59:30 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!
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/portuguese.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -1985,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!
@@ -2297,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...
 
--- a/src/lang/romanian.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/romanian.txt	Fri Nov 23 16:59:30 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}
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/russian.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -1669,7 +1669,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}Построить автобусную остановку
@@ -2002,9 +2004,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} !{}Добыча увеличена вдвое!
@@ -2327,7 +2329,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}Эта компания еще не может торговать акциями...
 
@@ -3086,6 +3087,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}Добавить
--- a/src/lang/simplified_chinese.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/simplified_chinese.txt	Fri Nov 23 16:59:30 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} 发现新的石油!{}产量即将翻番!
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/slovak.txt	Fri Nov 23 16:59:30 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
@@ -1018,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
@@ -1038,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}
@@ -1083,33 +1086,33 @@
 
 STR_CONFIG_PATCHES_OFF                                          :nie
 STR_CONFIG_PATCHES_ON                                           :áno
-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_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}
@@ -1120,26 +1123,26 @@
 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}Dĺž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
@@ -1157,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}
@@ -1182,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}
@@ -1211,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
@@ -1220,39 +1223,39 @@
 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
 
@@ -1599,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 ...
@@ -1731,7 +1734,9 @@
 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
@@ -1742,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
@@ -2064,9 +2070,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!
@@ -2120,7 +2126,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
@@ -2187,20 +2193,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}
@@ -2219,13 +2225,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
@@ -2378,7 +2384,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 ...
 
@@ -2751,7 +2756,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 - -
@@ -2857,8 +2862,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
@@ -3137,7 +3142,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
@@ -3292,17 +3299,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:
@@ -3326,7 +3333,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
@@ -3346,6 +3353,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
--- a/src/lang/slovenian.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/slovenian.txt	Fri Nov 23 16:59:30 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
@@ -1709,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
@@ -1720,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
@@ -2080,9 +2086,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!
@@ -2394,7 +2400,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 ...
 
@@ -3153,7 +3158,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
@@ -3362,6 +3369,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
--- a/src/lang/spanish.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/spanish.txt	Fri Nov 23 16:59:30 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
@@ -1668,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
@@ -1679,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
@@ -2001,9 +2007,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!
@@ -2315,7 +2321,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...
 
@@ -3074,7 +3079,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
@@ -3283,6 +3290,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
--- a/src/lang/swedish.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/swedish.txt	Fri Nov 23 16:59:30 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
 
@@ -1667,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
@@ -1678,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
@@ -2000,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!
@@ -2314,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....
 
@@ -2666,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
 
@@ -3073,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
@@ -3282,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
--- a/src/lang/traditional_chinese.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/traditional_chinese.txt	Fri Nov 23 16:59:30 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}
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/turkish.txt	Fri Nov 23 16:59:30 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
@@ -1665,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
@@ -1676,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ç
@@ -1998,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!
@@ -2019,6 +2026,7 @@
 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
@@ -2311,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...
 
@@ -3070,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
@@ -3381,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/ukrainian.txt	Fri Nov 23 16:59:30 2007 +0000
@@ -1235,6 +1235,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}
@@ -1791,7 +1793,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}Будувати зупинку
@@ -2161,9 +2165,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}!{}Очікується збільшення виробництва вдвічі!
@@ -2475,7 +2479,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}Ця компанія поки ще не продається...
 
@@ -2600,24 +2603,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                                             :вагон для кульок
@@ -3234,7 +3237,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 до списку
@@ -3559,4 +3564,41 @@
 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	Thu Nov 22 23:01:41 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3091 +0,0 @@
-##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                                                   :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                                                   :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                                                   :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}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}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}Laat vaar
-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}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 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 gestipuleer
-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_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 "" 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                                 :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}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_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_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, laat vaar
-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 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}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 bewaar/laai leer 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}Vertoon voertuie op werfkaart
-STR_0193_SHOW_INDUSTRIES_ON_MAP                                 :{BLACK}Vertoon nywerhede op werfkaart
-STR_0194_SHOW_TRANSPORT_ROUTES_ON                               :{BLACK}Vertoon vervoer roete op werfkaart
-STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Vertoon 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  '  '  ' '  '  '  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}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 voetuig 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_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_CONFIRMATION_TEXT                           :{WHITE}Is jy seker jy wil alle speler-besittend 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 kaart 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}...alleen 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 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}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}Vertoon 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}Wereld 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 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 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 samestelling 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_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}*  *  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_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_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_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 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_AIRCRAFT_AUTORENEW_FAILED                                   :{WHITE}Outohernuwe misluk op vliegtuig {COMMA} (geld perk)
-
-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_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_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_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_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_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 dorpe
-STR_MANY_RANDOM_INDUSTRIES                                      :Baie luraak nywehede
-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_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_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_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Diens pouse is in persente: {ORANGE}{STRING}
-STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Verander produksie
-
-
-############ 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 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 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}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_GRF_MISMATCH                                        :{SILVER}NEWGRF MISPAS
-
-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 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 kaart
-STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Watter kaart 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 kielnte. 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_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_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 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 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 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}:
-STR_NETWORK_CHAT_CLIENT_CAPTION                                 :[Privaat] :
-STR_NETWORK_CHAT_CLIENT                                         :[Privaat] {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_TO_CLIENT                                      :[Privaat] Na {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 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 werfkaart: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAP_Y                                        :{LTBLUE}Y-groote van werfkaart: {ORANGE}{STRING}
-
-
-##### PNG-MAP-Loader
-
-
-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}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}Beraamde Koste: {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_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_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
-
-
-
-##id 0x1800
-STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Moet pad eers verwyder
-STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Pad Konstruksie
-STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Tremweg 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 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_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Bou tremweg gedeelte
-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_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}  max: {ORANGE}{COMMA}
-STR_200E_MAIL_LAST_MONTH_MAX                                    :{BLACK}Pos verlede maand: {ORANGE}{COMMA}{BLACK}  max: {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}Wys 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_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inwy 'n klein plaaslik advertering veldtog, om te lok meer passasiers en cargo tot jou vervoer dienste.{}  Prys: {CURRENCY}
-STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} Inwy 'n medium plaaslik advertering veldtog, om te lok meer passasiers en cargo tot jou vervoer dienste.{}  Prys: {CURRENCY}
-STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inwy 'n groot plaaslik advertering veldtog, om te lok meer passasiers en cargo tot jou vervoer dienste.{}  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 alleen laattoe passasiers en cargo 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 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 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}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}Vraagmotor 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}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                                     :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
-
-
-##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
-
-##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}{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 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_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}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_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                                        :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_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                                                :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_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_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_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 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_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}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_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 rooster voertuig nie...
-
-##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                                    :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 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_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
-
-
-##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_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}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_BUS                                                         :{BLACK}{BUS}
-STR_LORRY                                                       :{BLACK}{LORRY}
-STR_PLANE                                                       :{BLACK}{PLANE}
-
-
-
-
-### 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_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 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
-
-
-
-############ 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}Opwek
-STR_LAND_GENERATOR                                              :{BLACK}Daal genereerder:
-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}Om te verstel oorsprong werfkaart te is nie aanbeveel. Voortgaan met die generasie?
-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_GENERATION_PROGRESS                                         :{BLACK}{NUM} / {NUM}
-STR_CLEARING_TILES                                              :{BLACK}Ru en rotserig area ontwikkeling
-STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Hierdie aksie verander die moeite vlak to gebruiklike
-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}
-
-
-########### String for new airports
-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_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
-
-
-
-##### 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}
-
-
-#### Improved sign GUI
-
-########
-
-STR_FUND_NEW_INDUSTRY                                           :{BLACK}Fonds
-STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Bou
-STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Kies die paslike nywerheid van hierdie lys
--- a/src/lang/unfinished/greek.txt	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/unfinished/greek.txt	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/lang/unfinished/latvian.txt	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/macros.h	Fri Nov 23 16:59:30 2007 +0000
@@ -5,10 +5,12 @@
 #ifndef MACROS_H
 #define MACROS_H
 
+#include "core/math_func.hpp"
+
 /**
  * Fetch n bits from x, started at bit s.
  *
- * This macro can be used to fetch n bits from the value x. The
+ * 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
@@ -21,11 +23,14 @@
  * @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))
+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 macro sets n bits from x which started as bit s to the value of
+ * 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.
@@ -40,7 +45,12 @@
  * @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)))
+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.
  *
@@ -56,187 +66,14 @@
  * @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)
+template<typename T, typename U> static inline T AB(T& x, const uint8 s, const uint8 n, const U i)
 {
-	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;
+	const T mask = (T)(((1U << n) - 1) << s);
+	x = (T)((x & ~mask) | ((x + (i << s)) & mask));
+	return x;
 }
 
 /**
- * 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.
@@ -247,9 +84,9 @@
  * @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)
+template<typename T> static inline bool HasBit(const T x, const uint8 y)
 {
-	return (x & ((T)1 << y)) != 0;
+	return (x & ((T)1U << y)) != 0;
 }
 
 /**
@@ -263,9 +100,9 @@
  * @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)
+template<typename T> static inline T SetBit(T& x, const uint8 y)
 {
-	return x |= (T)1 << y;
+	return x = (T)(x | (T)(1U << y));
 }
 
 /**
@@ -279,9 +116,9 @@
  * @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)
+template<typename T> static inline T ClrBit(T& x, const uint8 y)
 {
-	return x &= ~((T)1 << y);
+	return x = (T)(x & ~((T)1U << y));
 }
 
 /**
@@ -295,9 +132,9 @@
  * @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)
+template<typename T> static inline T ToggleBit(T& x, const uint8 y)
 {
-	return x ^= (T)1 << y;
+	return x = (T)(x ^ (T)(1U << y));
 }
 
 
@@ -350,7 +187,7 @@
  */
 #define IS_CUSTOM_SPRITE(sprite) ((sprite) >= SPR_SIGNALS_BASE)
 
-extern const byte _ffb_64[128];
+extern const byte _ffb_64[64];
 
 /**
  * Returns the first occure of a bit in a 6-bit value (from right).
@@ -365,17 +202,6 @@
 #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
@@ -391,20 +217,10 @@
  */
 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;
+	if ((value & 0xFF) == 0) {
+		return FIND_FIRST_BIT((value >> 8) & 0x3F) + 8;
 	} else {
-		return FIND_FIRST_BIT(GB(value, 0, 6));
+		return FIND_FIRST_BIT(value & 0x3F);
 	}
 }
 
@@ -412,21 +228,15 @@
  * Clear the first bit in an integer.
  *
  * This function returns a value where the first bit (from LSB)
- * is cleared. This function checks, similar to FindFirstBit2x64,
- * the bits at 0x3F3F.
+ * 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
- * @see KILL_FIRST_BIT
- * @see FindFirstBit2x64
  */
-static inline int KillFirstBit2x64(int value)
+template<typename T> static inline T KillFirstBit(T 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);
-	}
+	return value &= (T)(value - 1);
 }
 
 /**
@@ -435,7 +245,7 @@
  * @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)
+template<typename T> static inline uint CountBits(T value)
 {
 	uint num;
 
@@ -452,40 +262,6 @@
 }
 
 /**
- * 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
@@ -496,7 +272,7 @@
  * @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)))
+#define CHANCE16(a, b) CHANCE16I(a, b, Random())
 
 /**
  * Flips a coin with a given probability and saves the randomize-number in a variable.
@@ -504,33 +280,41 @@
  * 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.
  *
+ * 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.
+ *
  * @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)))
+#define CHANCE16R(a, b, r) CHANCE16I(a, b, r = Random())
 
 /**
  * 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.
+ * 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, see CHANCE16
  * @param b The denominator of the fraction, see CHANCE16
- * @param v The given randomize-number
+ * @param r 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)))
+static inline bool CHANCE16I(const uint a, const uint b, const uint32 r)
+{
+	return (uint16)r < (uint16)((65536 * a) / b);
+}
 
 
 #define for_each_bit(_i, _b)            \
 	for (_i = 0; _b != 0; _i++, _b >>= 1) \
 		if (_b & 1)
 
-#define abs myabs
-
 
 static inline uint16 ReadLE16Aligned(const void* x)
 {
@@ -548,17 +332,30 @@
 
 
 /**
- * ROtate x Left/Right by n (must be >= 0)
+ * 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
  */
-#define ROL(x, n) ((x) << (n) | (x) >> (sizeof(x) * 8 - (n)))
-#define ROR(x, n) ((x) >> (n) | (x) << (sizeof(x) * 8 - (n)))
+template<typename T> static inline T ROL(const T x, const uint8 n)
+{
+	return (T)(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
+ * 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
  */
-#define ALIGN(x, n) (((x) + (n) - 1) & ~((n) - 1))
+template<typename T> static inline T ROR(const T x, const uint8 n)
+{
+	return (T)(x >> n | x << (sizeof(x) * 8 - n));
+}
 
 /** return the largest value that can be entered in a variable.
  */
--- a/src/main_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/main_gui.cpp	Fri Nov 23 16:59:30 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,7 +119,7 @@
  * @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;
 
@@ -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;
@@ -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;
@@ -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;
@@ -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[] = {
@@ -1472,7 +1462,7 @@
 	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;
@@ -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;
@@ -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
@@ -2417,3 +2408,4 @@
 
 
 
+
--- a/src/map.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/map.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -218,7 +218,7 @@
 {
 	const uint dx = delta(TileX(t0), TileX(t1));
 	const uint dy = delta(TileY(t0), TileY(t1));
-	return dx > dy ? dx : dy;
+	return max(dx, dy);
 }
 
 
@@ -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	Thu Nov 22 23:01:41 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/misc.cpp	Fri Nov 23 16:59:30 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;
--- a/src/misc_cmd.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/misc_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -113,6 +113,7 @@
 			default:
 				break;
 		}
+		ResetVehicleColorMap();
 		MarkWholeScreenDirty();
 	}
 	return CommandCost();
--- a/src/misc_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/misc_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -60,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);
 	}
 }
 
@@ -199,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);
 	}
 }
 
@@ -223,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",
@@ -265,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;
 		}
@@ -279,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) {
@@ -366,12 +366,12 @@
 		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;
 
@@ -609,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;
@@ -746,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);
 
@@ -1087,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;
 }
@@ -1106,7 +1106,7 @@
 
 	switch (e->event) {
 		case WE_CREATE:
-			SETBIT(_no_scroll, SCROLL_EDIT);
+			SetBit(_no_scroll, SCROLL_EDIT);
 			break;
 
 		case WE_PAINT:
@@ -1162,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;
 		}
 }
@@ -1370,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()
 {
@@ -1401,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()
@@ -1491,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;
@@ -1621,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 */
@@ -1672,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;
@@ -1900,7 +1903,7 @@
 			} break;
 			}
 
-			DrawString(50, y + 1, ce->str, 0);
+			DrawString(50, y + 1, ce->str, TC_FROMSTRING);
 
 			y += 12;
 		}
@@ -1935,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/music/qtmidi.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -27,7 +27,6 @@
 #undef   WindowClass
 
 #include "../stdafx.h"
-#include "../openttd.h"
 #include "qtmidi.h"
 
 /*
@@ -56,48 +55,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 +95,7 @@
 	int fd;
 	int ret;
 	char magic[4];
+	FSRef fsref;
 	FSSpec fsspec;
 	short refnum = 0;
 	short resid  = 0;
@@ -145,9 +121,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/music_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -207,25 +207,25 @@
 		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;
@@ -233,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;
@@ -367,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) {
@@ -375,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/network/core/config.h	Fri Nov 23 16:59:30 2007 +0000
@@ -27,6 +27,7 @@
 
 	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_PLAYERS_LENGTH        =  200, ///< The maximum length for the list of players that controls a company, in bytes including '\0'
--- a/src/network/core/os_abstraction.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/network/core/os_abstraction.h	Fri Nov 23 16:59:30 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/udp.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/network/core/udp.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/network/network.h	Fri Nov 23 16:59:30 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
--- a/src/network/network_client.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/network/network_client.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -340,7 +340,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));
--- a/src/network/network_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/network/network_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -255,14 +255,14 @@
 
 		DrawEditBox(w, &WP(w, network_ql_d).q, 3);
 
-		DrawString(9, 23, STR_NETWORK_CONNECTION, 2);
-		DrawString(w->widget[3].left - 100, 23, STR_NETWORK_PLAYER_NAME, 2);
+		DrawString(9, 23, STR_NETWORK_CONNECTION, TC_GOLD);
+		DrawString(w->widget[3].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 6 - 6: DoDrawString(arrow, w->widget[6].right - 10, 42, TC_BLACK); break;
+			case 7 - 6: DoDrawString(arrow, w->widget[7].right - 10, 42, TC_BLACK); break;
+			case 8 - 6: DoDrawString(arrow, w->widget[8].right - 10, 42, TC_BLACK); break;
 		}
 
 		{ // draw list of games
@@ -282,13 +282,13 @@
 				if (cur_item == sel) GfxFillRect(w->widget[6].left + 1, y - 2, w->widget[8].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[6].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[7].left + 39, y, STR_NETWORK_GENERAL_ONLINE, TC_GOLD);
 
 				// only draw icons if the server is online
 				if (cur_item->online) {
@@ -311,71 +311,71 @@
 		/* Draw the right menu */
 		GfxFillRect(w->widget[15].left + 1, 43, w->widget[15].right - 1, 92, 157);
 		if (sel == NULL) {
-			DrawStringCentered(w->widget[15].left + 115, 58, STR_NETWORK_GAME_INFO, 0);
+			DrawStringCentered(w->widget[15].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[15].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[15].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;
 
-			DrawStringCentered(w->widget[15].left + 115, 48, STR_NETWORK_GAME_INFO, 0);
+			DrawStringCentered(w->widget[15].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[15].left, w->widget[15].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[15].left, w->widget[15].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[15].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
+				DrawStringCentered(w->widget[15].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[15].left + 115, y, STR_NETWORK_PASSWORD, TC_FROMSTRING); // password warning
 			}
 
 			y += 10;
@@ -627,17 +627,17 @@
 		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);
+		DrawString(10, 22, STR_NETWORK_NEW_GAME_NAME, TC_GOLD);
 
-		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);
+		DrawString(10, 43, STR_NETWORK_SELECT_MAP, TC_GOLD);
 
-		if (_network_game_info.use_password) DoDrawString("*", 408, 23, 3);
+		DrawString(280,  63, STR_NETWORK_CONNECTION, TC_GOLD);
+		DrawString(280,  95, STR_NETWORK_NUMBER_OF_CLIENTS, TC_GOLD);
+		DrawString(280, 127, STR_NETWORK_NUMBER_OF_COMPANIES, TC_GOLD);
+		DrawString(280, 159, STR_NETWORK_NUMBER_OF_SPECTATORS, TC_GOLD);
+		DrawString(280, 191, STR_NETWORK_LANGUAGE_SPOKEN, TC_GOLD);
+
+		if (_network_game_info.use_password) DoDrawString("*", 408, 23, TC_RED);
 
 		// draw list of maps
 		pos = w->vscroll.pos;
@@ -647,7 +647,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] );
 			}
@@ -692,9 +692,9 @@
 				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  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;
 				}
 			}
 			_left_button_clicked = false;
@@ -789,9 +789,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 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;
 			}
 		}
 
@@ -896,7 +896,7 @@
 		DrawWindowWidgets(w);
 
 		SetDParamStr(0, gi->server_name);
-		DrawString(10, 22, STR_NETWORK_PREPARE_TO_JOIN, 2);
+		DrawString(10, 22, STR_NETWORK_PREPARE_TO_JOIN, TC_GOLD);
 
 		/* Draw company list */
 		pos = w->vscroll.pos;
@@ -906,7 +906,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,7 +920,7 @@
 
 		/* 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);
+		DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
 		if (nd->company != (byte)-1) {
 			const uint x = 183;
 			const uint trunc_width = w->widget[6].right - x;
@@ -930,31 +930,31 @@
 			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 +962,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,11 +970,11 @@
 			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;
 
@@ -1311,7 +1311,7 @@
 	switch (e->event) {
 	case WE_PAINT: {
 		int i, y, sel;
-		byte colour;
+		TextColour colour;
 		DrawWindowWidgets(w);
 
 		// Draw the actions
@@ -1323,9 +1323,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 +1362,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 +1374,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 +1463,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 +1471,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;
@@ -1686,7 +1686,7 @@
 	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
+		SetBit(_no_scroll, SCROLL_CHAT); // do not scroll the game with the arrow-keys
 		break;
 
 	case WE_PAINT: {
@@ -1701,7 +1701,7 @@
 
 		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);
+		DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, msg, TC_BLACK);
 		DrawEditBox(w, &WP(w, chatquerystr_d), 2);
 	} break;
 
@@ -1738,7 +1738,7 @@
 
 	case WE_DESTROY:
 		SendWindowMessage(WC_NEWS_WINDOW, 0, WE_DESTROY, 0, 0);
-		CLRBIT(_no_scroll, SCROLL_CHAT);
+		ClrBit(_no_scroll, SCROLL_CHAT);
 		break;
 	}
 }
--- a/src/network/network_server.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/network/network_server.cpp	Fri Nov 23 16:59:30 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);
@@ -619,7 +619,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/network/network_udp.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -45,6 +45,9 @@
 #include "newgrf_commons.h"
 #include "newgrf_townname.h"
 #include "newgrf_industries.h"
+#include "table/landscape_sprite.h"
+#include "gfxinit.h"
+#include "fios.h"
 
 /* TTDPatch extended GRF format codec
  * (c) Petr Baudis 2004 (GPL'd)
@@ -58,7 +61,6 @@
 
 static int _skip_sprites; // XXX
 static uint _file_index; // XXX
-SpriteID _signal_base;
 SpriteID _coast_base;
 
 static GRFFile *_cur_grffile;
@@ -246,6 +248,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
@@ -257,7 +270,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);
 
@@ -415,7 +428,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;
@@ -495,6 +508,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;
@@ -528,7 +547,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
@@ -543,12 +562,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;
@@ -602,7 +615,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;
@@ -636,6 +649,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;
@@ -646,7 +666,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
@@ -661,13 +681,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;
@@ -714,7 +727,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;
@@ -746,13 +759,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
@@ -767,13 +787,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;
@@ -863,7 +876,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
@@ -935,9 +948,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) {
@@ -958,18 +971,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);
 						}
 					}
 				}
@@ -1162,12 +1175,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;
@@ -1180,7 +1193,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:
@@ -1333,7 +1346,7 @@
 					continue;
 				}
 
-				_house_mngr.Add(hid + i, override);
+				_house_mngr.Add(hid + i, _cur_grffile->grfid, override);
 			} break;
 
 			case 0x16: // Periodic refresh multiplier
@@ -1357,7 +1370,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
@@ -1392,6 +1405,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;
@@ -1420,11 +1439,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);
@@ -1543,9 +1572,9 @@
 				cs->bitnum = grf_load_byte(&buf);
 				if (cs->IsValid()) {
 					cs->grfid = _cur_grffile->grfid;
-					SETBIT(_cargo_mask, cid + i);
+					SetBit(_cargo_mask, cid + i);
 				} else {
-					CLRBIT(_cargo_mask, cid + i);
+					ClrBit(_cargo_mask, cid + i);
 				}
 				break;
 
@@ -1755,14 +1784,14 @@
 					return false;
 				}
 
-				_industile_mngr.Add(indtid + i, ovrid);
+				_industile_mngr.Add(indtid + i, _cur_grffile->grfid, ovrid);
 			} break;
 
 			case 0x0A: // Tile acceptance
 			case 0x0B:
 			case 0x0C: {
 				uint16 acctp = grf_load_word(&buf);
-				tsp->accepts_cargo[prop - 0x0A] = GetCargoTranslation(GB(acctp, 0, 8), _cur_grffile);
+				tsp->accepts_cargo[prop - 0x0A] = GB(acctp, 0, 8);
 				tsp->acceptance[prop - 0x0A] = GB(acctp, 8, 8);
 			} break;
 
@@ -1868,7 +1897,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)
@@ -1936,7 +1965,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;
 
@@ -1962,13 +1991,13 @@
 
 			case 0x10: // Production cargo types
 				for (byte j = 0; j < 2; j++) {
-					indsp->produced_cargo[j] = GetCargoTranslation(grf_load_byte(&buf), _cur_grffile);
+					indsp->produced_cargo[j] = grf_load_byte(&buf);
 				}
 				break;
 
 			case 0x11: // Acceptance cargo types
 				for (byte j = 0; j < 3; j++) {
-					indsp->accepts_cargo[j] = GetCargoTranslation(grf_load_byte(&buf), _cur_grffile);
+					indsp->accepts_cargo[j] = grf_load_byte(&buf);
 				}
 				grf_load_byte(&buf); // Unnused, eat it up
 				break;
@@ -1988,7 +2017,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
@@ -2058,7 +2087,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
@@ -2074,7 +2103,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 */
@@ -2086,7 +2115,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);
@@ -2173,8 +2202,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);
@@ -2183,51 +2212,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)
 {
@@ -2237,18 +2227,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);
 	}
 }
 
@@ -2345,7 +2344,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);
@@ -2358,7 +2357,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);
@@ -2434,7 +2433,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();
@@ -2483,7 +2482,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);
@@ -2508,11 +2507,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);
@@ -2592,24 +2591,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);
@@ -2622,24 +2621,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) {
@@ -3122,10 +3121,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];
@@ -3221,6 +3220,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)
 {
@@ -3237,42 +3264,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;
 			}
@@ -3280,7 +3312,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;
 			}
@@ -3288,23 +3320,30 @@
 			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) {
+			if (num != AIRPORTX_SPRITE_COUNT) {
 				grfmsg(1, "GraphicsNew: Airport graphics sprite count must be 15, skipping");
 				return;
 			}
@@ -3312,13 +3351,33 @@
 			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);
@@ -3336,6 +3395,8 @@
 		LoadNextSprite(replace == 0 ? _cur_spriteid++ : replace++, _file_index, _nfo_line);
 		_nfo_line++;
 	}
+
+	_skip_sprites = skip_num;
 }
 
 /* Action 0x05 (SKIP) */
@@ -3357,7 +3418,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;
@@ -3365,9 +3426,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;
 		}
 
@@ -3413,6 +3474,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];
@@ -3476,7 +3542,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. */
@@ -3553,7 +3619,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);
@@ -3564,51 +3637,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;
 		}
 	}
 
@@ -3670,7 +3743,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);
@@ -3779,7 +3852,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[] = {
@@ -3805,11 +3879,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);
@@ -3893,7 +3967,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;
@@ -4010,7 +4084,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;
@@ -4248,7 +4322,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;
@@ -4304,9 +4378,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;
@@ -4315,7 +4389,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);
@@ -4356,7 +4430,7 @@
 			byte prob = grf_load_byte(&buf);
 			len--;
 
-			if (HASBIT(prob, 7)) {
+			if (HasBit(prob, 7)) {
 				byte ref_id = grf_load_byte(&buf);
 				len--;
 
@@ -4671,7 +4745,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;
@@ -4828,12 +4902,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) {
@@ -4887,7 +4961,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);
@@ -4984,8 +5058,7 @@
 	_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();
@@ -5112,12 +5185,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 */
@@ -5125,7 +5198,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);
 				}
 			}
 		}
@@ -5134,8 +5207,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 */
@@ -5152,7 +5225,7 @@
 					CargoID cargo = GetCargoIDByLabel(cl[i]);
 					if (cargo == CT_INVALID) continue;
 
-					SETBIT(xor_mask, cargo);
+					SetBit(xor_mask, cargo);
 				}
 			}
 		}
@@ -5250,6 +5323,15 @@
 					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->new_industry_text);
 					if (strid != STR_UNDEFINED) indsp->new_industry_text = strid;
 
+					for (byte j = 0; j < 2; j++) {
+						CargoID c = GetCargoTranslation(indsp->produced_cargo[j], indsp->grf_prop.grffile);
+						indsp->produced_cargo[j] = c;
+					}
+					for (byte j = 0; j < 3; j++) {
+						CargoID c = GetCargoTranslation(indsp->accepts_cargo[j], indsp->grf_prop.grffile);
+						indsp->accepts_cargo[j] = c;
+					}
+
 					_industry_mngr.SetEntitySpec(indsp);
 					_loaded_newgrf_features.has_newindustries = true;
 				}
@@ -5260,6 +5342,10 @@
 			for (int i = 0; i < NUM_INDUSTRYTILES; i++) {
 				IndustryTileSpec *indtsp = file->indtspec[i];
 				if (indtsp != NULL) {
+					for (byte j = 0; j < 3; j++) {
+						CargoID c = GetCargoTranslation(indtsp->accepts_cargo[j], indtsp->grf_prop.grffile);
+						indtsp->accepts_cargo[j] = c;
+					}
 					_industile_mngr.SetEntitySpec(indtsp);
 				}
 			}
@@ -5316,7 +5402,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, },
@@ -5362,7 +5448,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);
@@ -5394,7 +5480,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);
@@ -5504,30 +5599,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++;
 			}
 		}
 	}
@@ -5538,5 +5630,5 @@
 
 bool HasGrfMiscBit(GrfMiscBit bit)
 {
-	return HASBIT(_misc_grf_features, bit);
+	return HasBit(_misc_grf_features, bit);
 }
--- a/src/newgrf.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf.h	Fri Nov 23 16:59:30 2007 +0000
@@ -85,13 +85,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_callbacks.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_cargo.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -104,7 +104,7 @@
 	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);
+		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 */
--- a/src/newgrf_commons.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_commons.cpp	Fri Nov 23 16:59:30 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.grffile == NULL) {
-			/* 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 industry from a grf
-			* 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_commons.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_config.cpp	Fri Nov 23 16:59:30 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);
@@ -138,8 +136,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;
@@ -236,7 +234,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;
@@ -257,7 +255,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));
@@ -524,6 +522,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),
@@ -540,7 +550,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_config.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_engine.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -496,7 +496,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
 		}
@@ -548,7 +548,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]++;
 			}
 
@@ -660,7 +660,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);
 		}
@@ -711,7 +711,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);
@@ -843,11 +843,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;
@@ -858,7 +859,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;
 		}
 	}
@@ -942,7 +946,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;
@@ -971,7 +975,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;
@@ -1011,6 +1015,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;
@@ -1050,6 +1055,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_engine.h	Fri Nov 23 16:59:30 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_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_gui.cpp	Fri Nov 23 16:59:30 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);
+			SetWindowWidgetDisabledState(w, 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++;
@@ -283,6 +282,7 @@
 		/* 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->IsOpenTTDBaseGRF()) DisableWindowWidget(w, SNGRFS_REMOVE);
 	}
 }
 
@@ -358,16 +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);
 					txtoffset = c->error != NULL ? 35 : 25;
-					DoDrawStringTruncated(text, txtoffset, y + 3, WP(w, newgrf_d).sel == c ? 0xC : 0x10, w->width - txtoffset - 10);
+					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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_house.cpp	Fri Nov 23 16:59:30 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, (byte)dtss->delta_x, (byte)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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_house.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_industries.cpp	Fri Nov 23 16:59:30 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);
 }
@@ -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,7 +200,7 @@
 		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)) {
+			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);
 			} else {
 				return 0;
@@ -313,14 +315,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 +339,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)
@@ -478,7 +480,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);
@@ -513,10 +515,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), 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] + DerefIndProd(group->g.indprod.add_output[i], deref), 0, 0xFFFF);
 		}
 
 		int32 again = DerefIndProd(group->g.indprod.again, deref);
@@ -527,3 +529,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_industrytiles.cpp	Fri Nov 23 16:59:30 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, (byte)dtss->delta_x, (byte)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;
 	}
@@ -286,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
@@ -301,8 +304,8 @@
 	byte frame = GetIndustryAnimationState(tile);
 	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;
@@ -359,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);
@@ -382,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_industrytiles.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_sound.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_spritegroup.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_station.cpp	Fri Nov 23 16:59:30 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 */
@@ -451,7 +451,7 @@
 		case 0xF3: return st->bus_stops->status;
 		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 */
@@ -524,7 +524,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) {
@@ -751,7 +751,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;
 	}
@@ -763,7 +763,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 {
@@ -775,7 +775,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;
@@ -810,7 +810,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.
@@ -821,6 +821,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_townname.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/newgrf_townname.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/news.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/news_gui.cpp	Fri Nov 23 16:59:30 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;
@@ -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
@@ -832,11 +843,11 @@
 			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:
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/npf.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/npf.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/oldloader.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -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) {
@@ -605,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();
@@ -1488,7 +1488,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/openttd.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/openttd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -287,8 +287,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()
@@ -328,9 +328,6 @@
 {
 	_game_mode = GM_MENU;
 
-	/* Clear transparency options */
-	_transparent_opt = 0;
-
 	_opt_ptr = &_opt_newgame;
 	ResetGRFConfig(false);
 
@@ -1145,7 +1142,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();
 
@@ -1172,7 +1169,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 */
@@ -1258,8 +1255,6 @@
 bool AfterLoadGame()
 {
 	TileIndex map_size = MapSize();
-	Window *w;
-	ViewPort *vp;
 	Player *p;
 
 	/* in version 2.1 of the savegame, town owner was unified. */
@@ -1343,22 +1338,6 @@
 		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();
@@ -1373,9 +1352,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++) {
@@ -1387,7 +1363,7 @@
 					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
@@ -1546,10 +1522,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;
 
@@ -1592,7 +1568,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);
 					}
@@ -1609,10 +1585,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,
@@ -1750,7 +1726,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) {
@@ -1784,27 +1760,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;
@@ -1950,12 +1926,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
@@ -2049,9 +2025,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();
 		}
 	}
@@ -2061,7 +2037,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);
 		}
 	}
 
@@ -2113,7 +2089,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)) {
@@ -2148,7 +2124,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);
 			}
 		}
 	}
@@ -2158,7 +2134,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);
 			}
 		}
 	}
@@ -2182,25 +2158,12 @@
 		}
 	}
 
-	/* 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]++;
-		}
-	}
-
 	if (CheckSavegameVersion(74)) {
 		Station *st;
 		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);
 			}
 		}
 	}
@@ -2232,6 +2195,38 @@
 		}
 	}
 
+	/* 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();
+
+	/* Recalculate */
+	Group *g;
+	FOR_ALL_GROUPS(g) {
+		const Vehicle *v;
+		FOR_ALL_VEHICLES(v) {
+			if (!IsEngineCountable(v)) continue;
+
+			if (v->group_id != g->index || v->type != g->vehicle_type || v->owner != g->owner) continue;
+
+			g->num_engines[v->engine_type]++;
+		}
+	}
+
 	return true;
 }
 
--- a/src/openttd.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/openttd.h	Fri Nov 23 16:59:30 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
@@ -185,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,
--- a/src/order_cmd.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/order_cmd.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/order_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -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);
 	}
 }
 
@@ -403,7 +401,7 @@
 	ToggleWidgetLoweredState(w, ORDER_WIDGET_GOTO);
 	if (IsWindowWidgetLowered(w, ORDER_WIDGET_GOTO)) {
 		_place_clicked_vehicle = NULL;
-		SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, 1, w);
+		SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, VHM_RECT, w);
 	} else {
 		ResetObjectToPlace();
 	}
@@ -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);
 					}
 				}
 			}
--- a/src/os/macosx/macos.mm	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/os/macosx/macos.mm	Fri Nov 23 16:59:30 2007 +0000
@@ -168,6 +168,6 @@
 	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);
+	[ preferredLang getCString:retbuf maxLength:32 encoding:NSASCIIStringEncoding ];
 	return retbuf;
 }
--- a/src/os/macosx/splash.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/os/macosx/splash.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/os2.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/ottdres.rc.in	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/pathfind.cpp	Fri Nov 23 16:59:30 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,7 +230,7 @@
 	return flotr.tile;
 }
 
-const byte _ffb_64[128] = {
+const byte _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,
@@ -243,15 +239,6 @@
  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);
@@ -302,15 +289,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 +378,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 +406,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);
@@ -755,7 +742,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 +790,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 +818,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/player.h	Fri Nov 23 16:59:30 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;
@@ -121,10 +124,32 @@
 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)
@@ -140,7 +165,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/player_face.h	Fri Nov 23 16:59:30 2007 +0000
@@ -169,7 +169,7 @@
 	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;
+	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
 
@@ -202,7 +202,7 @@
 	if (adv) {
 		SetPlayerFaceBits(pf, PFV_GEN_ETHN, ge, ge);
 	} else {
-		SetPlayerFaceBits(pf, PFV_GENDER, ge, HASBIT(ge, GENDER_FEMALE));
+		SetPlayerFaceBits(pf, PFV_GENDER, ge, HasBit(ge, GENDER_FEMALE));
 	}
 
 	/* scales all player face bits to the correct scope */
--- a/src/player_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/player_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -39,10 +39,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;
@@ -52,7 +52,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 */
@@ -63,14 +63,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;
@@ -83,27 +83,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[] = {
@@ -171,7 +171,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 */
@@ -272,16 +272,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];
@@ -313,7 +313,7 @@
 
 			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;
 			}
@@ -325,20 +325,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;
@@ -402,7 +402,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;
 					}
@@ -417,7 +417,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);
 				}
 			}
@@ -490,8 +490,8 @@
 {
 	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;
 
@@ -658,7 +658,7 @@
 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, 0x2);
+	DrawStringRightAligned(w->widget[widget_index].left - (is_bool_widget ? 5 : 14), w->widget[widget_index].top + 1, str, TC_GOLD);
 
 	if (!IsWindowWidgetDisabled(w, widget_index)) {
 		if (is_bool_widget) {
@@ -672,7 +672,7 @@
 
 		/* 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 +
-			IsWindowWidgetLowered(w, widget_index), w->widget[widget_index].top + 1 + IsWindowWidgetLowered(w, widget_index), str, 0xC);
+			IsWindowWidgetLowered(w, widget_index), w->widget[widget_index].top + 1 + IsWindowWidgetLowered(w, widget_index), str, TC_WHITE);
 	}
 }
 
@@ -686,7 +686,7 @@
 {
 	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_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) {
@@ -698,8 +698,8 @@
 			/* advanced player face selection window */
 			if (WP(w, facesel_d).advanced) {
 				/* lower the non-selected ethnicity button */
-				SetWindowWidgetLoweredState(w, PFW_WIDGET_ETHNICITY_EUR, !HASBIT(ge, ETHNICITY_BLACK));
-				SetWindowWidgetLoweredState(w, PFW_WIDGET_ETHNICITY_AFR,  HASBIT(ge, ETHNICITY_BLACK));
+				SetWindowWidgetLoweredState(w, PFW_WIDGET_ETHNICITY_EUR, !HasBit(ge, ETHNICITY_BLACK));
+				SetWindowWidgetLoweredState(w, PFW_WIDGET_ETHNICITY_AFR,  HasBit(ge, ETHNICITY_BLACK));
 
 
 				/* Disable dynamically the widgets which PlayerFaceVariable has less than 2 options
@@ -975,17 +975,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) {
@@ -1000,29 +1005,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);
 		}
 	}
 }
@@ -1035,24 +1040,25 @@
 				 (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);
 }
 
 /**
@@ -1104,23 +1110,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;
@@ -1162,7 +1175,7 @@
 					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);
 						InvalidateWidget(w, PCW_WIDGET_BUILD_VIEW_HQ);
@@ -1173,7 +1186,7 @@
 				}
 
 				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);
 					InvalidateWidget(w, PCW_WIDGET_RELOCATE_HQ);
@@ -1396,10 +1409,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/players.cpp	Fri Nov 23 16:59:30 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, HASBIT(ge, ETHNICITY_BLACK) ? 0 : 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     |
@@ -489,9 +490,9 @@
 	/* 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);
 
@@ -595,13 +596,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);
 			}
 		}
 	}
@@ -618,9 +619,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);
 		}
 	}
 
@@ -675,11 +676,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);
@@ -733,7 +734,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);
@@ -748,7 +749,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;
 
@@ -761,11 +762,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);
 				}
--- a/src/rail.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/rail.h	Fri Nov 23 16:59:30 2007 +0000
@@ -312,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;
@@ -336,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;
@@ -370,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;
 }
 
@@ -759,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);
 }
 
 /**
@@ -772,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);
 }
 
 /**
@@ -785,7 +785,7 @@
 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. */
@@ -821,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/rail_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -40,6 +40,7 @@
 #include "train.h"
 #include "misc/autoptr.hpp"
 #include "autoslope.h"
+#include "transparency.h"
 
 const byte _track_sloped_sprites[14] = {
 	14, 15, 22, 13,
@@ -215,19 +216,35 @@
 		TrackBits higher_track = CornerToTrackBits(highest_corner);
 
 		/* Only higher track? */
-		if (bits == higher_track) return FOUNDATION_STEEP_HIGHER;
+		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_INVALID : FOUNDATION_STEEP_LOWER);
+		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);
@@ -239,6 +256,19 @@
 			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);
 	}
 }
 
@@ -255,7 +285,7 @@
 static CommandCost CheckRailSlope(Slope tileh, TrackBits rail_bits, TrackBits existing, TileIndex tile)
 {
 	/* don't allow building on the lower side of a coast */
-	if (IsTileType(tile, MP_WATER)) {
+	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);
 	}
 
@@ -267,7 +297,7 @@
 	   ) return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 
 	Foundation f_old = GetRailFoundation(tileh, existing);
-	return CommandCost(f_new != f_old ? _price.terraform : 0);
+	return CommandCost(f_new != f_old ? _price.terraform : (Money)0);
 }
 
 /* Validate functions for rail building */
@@ -330,7 +360,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
@@ -376,6 +406,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);
@@ -384,7 +416,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.purchase_land);
+			}
+
+			if (flags & DC_EXEC) {
+				MakeRailNormal(tile, _current_player, trackbit, railtype);
+				if (water_ground) SetRailGroundType(tile, RAIL_GROUND_WATER);
+			}
 			break;
 	}
 
@@ -450,7 +490,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);
 				}
@@ -482,6 +526,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 },
@@ -522,8 +601,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
@@ -557,7 +636,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;
 
@@ -587,7 +666,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;
@@ -606,7 +685,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.
@@ -622,7 +701,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
@@ -703,8 +782,8 @@
 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 pre_signal = HasBit(p1, 3);
+	SignalVariant sigvar = (pre_signal ^ HasBit(p1, 4)) ? SIG_SEMAPHORE : SIG_ELECTRIC;
 	CommandCost cost;
 
 	if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoTrainOnTrack(tile, track))
@@ -723,7 +802,7 @@
 	{
 		/* 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;
@@ -815,7 +894,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;
 
@@ -866,10 +945,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);
 
@@ -905,8 +984,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)
@@ -926,8 +1005,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);
 
@@ -953,7 +1032,7 @@
 			if (IsDiagonalTrackdir(trackdir)) {
 				signal_ctr++;
 			} else {
-				ToggleBitT(trackdir, 0);
+				ToggleBit(trackdir, 0);
 			}
 		}
 	}
@@ -1041,7 +1120,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);
@@ -1214,6 +1293,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);
@@ -1221,6 +1302,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;
 		}
 
@@ -1237,6 +1325,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;
@@ -1271,16 +1375,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;
@@ -1337,6 +1438,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);
 }
@@ -1348,6 +1450,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);
 }
@@ -1359,6 +1462,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);
 }
@@ -1370,6 +1474,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);
 }
@@ -1388,6 +1493,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;
 	}
 }
@@ -1401,41 +1515,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);
@@ -1449,6 +1591,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)
@@ -1495,7 +1661,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);
 
@@ -1535,7 +1701,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;
 				}
@@ -1550,7 +1716,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 {
@@ -1580,13 +1746,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;
@@ -1598,7 +1764,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);
@@ -1618,7 +1784,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);
 	}
 }
 
@@ -1934,6 +2100,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()) {
@@ -2233,26 +2404,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)
@@ -2261,6 +2435,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;
 
@@ -2268,59 +2443,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/rail_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -258,22 +258,22 @@
 
 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)
@@ -283,12 +283,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();
 	}
 }
@@ -296,7 +296,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();
 	}
@@ -304,7 +304,7 @@
 
 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();
 }
 
 static void BuildRailClick_AutoSignals(Window *w)
@@ -314,12 +314,12 @@
 
 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)
@@ -340,7 +340,7 @@
 
 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);
 }
 
 
@@ -516,8 +516,7 @@
 					if (_ctrl_pressed) _remove_button_clicked = true;
 					HandleAutodirPlacement();
 					_remove_button_clicked = old;
-					break;
-				}
+				} break;
 
 				case DDSP_BUILD_SIGNALS:
 					HandleAutoSignalPlacement();
@@ -540,9 +539,12 @@
 					break;
 
 				case DDSP_PLACE_RAIL_NE:
-				case DDSP_PLACE_RAIL_NW:
+				case DDSP_PLACE_RAIL_NW: {
+					bool old = _remove_button_clicked;
+					if (_ctrl_pressed) _remove_button_clicked = true;
 					DoRailroadTrack(e->we.place.select_proc == DDSP_PLACE_RAIL_NE ? TRACK_X : TRACK_Y);
-					break;
+					_remove_button_clicked = old;
+				} break;
 			}
 		}
 		break;
@@ -717,19 +719,19 @@
 {
 	if (statspec == NULL || _railstation.dragdrop) return;
 
-	if (HASBIT(statspec->disallowed_platforms, _railstation.numtracks - 1)) {
+	if (HasBit(statspec->disallowed_platforms, _railstation.numtracks - 1)) {
 		RaiseWindowWidget(w, _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 + BRSW_PLATFORM_NUM_BEGIN);
 	}
 
-	if (HASBIT(statspec->disallowed_lengths, _railstation.platlength - 1)) {
+	if (HasBit(statspec->disallowed_lengths, _railstation.platlength - 1)) {
 		RaiseWindowWidget(w, _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 + BRSW_PLATFORM_LEN_BEGIN);
@@ -779,8 +781,8 @@
 				SetWindowWidgetDisabledState(w, bits + BRSW_PLATFORM_NUM_1, disable);
 				SetWindowWidgetDisabledState(w, bits + BRSW_PLATFORM_LEN_1, disable);
 			} else {
-				SetWindowWidgetDisabledState(w, bits + BRSW_PLATFORM_NUM_1, HASBIT(statspec->disallowed_platforms, bits) || disable);
-				SetWindowWidgetDisabledState(w, bits + BRSW_PLATFORM_LEN_1, HASBIT(statspec->disallowed_lengths,   bits) || disable);
+				SetWindowWidgetDisabledState(w, bits + BRSW_PLATFORM_NUM_1, HasBit(statspec->disallowed_platforms, bits) || disable);
+				SetWindowWidgetDisabledState(w, bits + BRSW_PLATFORM_LEN_1, HasBit(statspec->disallowed_lengths,   bits) || disable);
 			}
 		}
 
@@ -809,10 +811,10 @@
 			_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);
 
@@ -823,13 +825,13 @@
 				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;
@@ -862,10 +864,10 @@
 			_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)) {
+					if (!HasBit(statspec->disallowed_lengths, i)) {
 						RaiseWindowWidget(w, _railstation.platlength + BRSW_PLATFORM_LEN_BEGIN);
 						_railstation.platlength = i + 1;
 						break;
@@ -894,10 +896,10 @@
 			_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)) {
+					if (!HasBit(statspec->disallowed_platforms, i)) {
 						RaiseWindowWidget(w, _railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
 						_railstation.numtracks = i + 1;
 						break;
@@ -912,14 +914,36 @@
 			break;
 		}
 
-		case BRSW_PLATFORM_DRAG_N_DROP:
+		case BRSW_PLATFORM_DRAG_N_DROP: {
 			_railstation.dragdrop ^= true;
 			ToggleWidgetLoweredState(w, 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)) {
+						RaiseWindowWidget(w, _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)) {
+						RaiseWindowWidget(w, _railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN);
+						_railstation.numtracks = i + 1;
+						break;
+					}
+				}
+			}
+
 			SetWindowWidgetLoweredState(w, _railstation.numtracks + BRSW_PLATFORM_NUM_BEGIN, !_railstation.dragdrop);
 			SetWindowWidgetLoweredState(w, _railstation.platlength + BRSW_PLATFORM_LEN_BEGIN, !_railstation.dragdrop);
 			SndPlayFx(SND_15_BEEP);
 			SetWindowDirty(w);
-			break;
+		} break;
 
 		case BRSW_HIGHLIGHT_OFF:
 		case BRSW_HIGHLIGHT_ON:
@@ -946,7 +970,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;
@@ -1085,7 +1109,7 @@
 
 		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);
 	}
 }
 
@@ -1197,7 +1221,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));
 				}
@@ -1217,7 +1241,7 @@
 				/* Check station availability callback */
 				const StationSpec *statspec = GetCustomStationSpec(STAT_CLASS_WAYP, type);
 				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;
 
 				_cur_waypoint_type = type;
@@ -1347,3 +1371,4 @@
 	}
 }
 
+
--- a/src/rail_map.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/rail_map.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/railtypes.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/rev.cpp.in	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/road.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/road.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/road_cmd.cpp	Fri Nov 23 16:59:30 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 &&
-			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));
@@ -635,14 +636,14 @@
 
 	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;
@@ -653,17 +654,17 @@
 	/* 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,11 +722,11 @@
 	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;
@@ -736,10 +737,10 @@
 	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 && (
@@ -838,13 +839,13 @@
 
 			/* 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) ||
 			    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);
@@ -864,7 +865,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);
@@ -905,7 +906,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;
 	}
@@ -945,7 +946,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;
@@ -962,8 +963,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));
 }
 
 /**
@@ -1051,7 +1052,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++) {
@@ -1089,7 +1090,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));
 			}
@@ -1107,7 +1108,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)];
@@ -1119,7 +1120,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;
@@ -1130,7 +1131,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;
@@ -1154,7 +1155,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);
 	}
 }
 
@@ -1240,7 +1241,7 @@
 			/* 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 ) {
+					GetRoadTileType(tile) == ROAD_TILE_NORMAL && CountBits(GetAllRoadBits(tile)) > 1 ) {
 				if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicleOnGround(tile) && CHANCE16(1, 40)) {
 					StartRoadWorks(tile);
 
@@ -1415,7 +1416,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);
@@ -1438,7 +1439,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/road_gui.cpp	Fri Nov 23 16:59:30 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);
@@ -187,10 +240,12 @@
 	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,
@@ -198,48 +253,84 @@
 
 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 (IsWindowWidgetDisabled(w, RTW_ONE_WAY)) return;
+	SetWindowDirty(w);
+	ToggleWidgetLoweredState(w, 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)
@@ -251,18 +342,22 @@
 	SetSelectionRed(IsWindowWidgetLowered(w, 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',
@@ -270,6 +365,8 @@
 	'4',
 	'5',
 	'6',
+	'7',
+	'8',
 	'B',
 	'T',
 	'R',
@@ -281,28 +378,42 @@
  * @param w The toolbar window
  * @param clicked_widget The widget which the player clicked just now
  */
-static void UpdateRemoveWidgetStatus(Window *w, int clicked_widget)
+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:
-			/* 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;
+			RaiseWindowWidget(w, RTW_ONE_WAY);
+			break;
+		case RTW_ONE_WAY:
+			RaiseWindowWidget(w, RTW_REMOVE);
+			break;
+		case RTW_BUS_STATION:
+		case RTW_TRUCK_STATION:
+			DisableWindowWidget(w, RTW_ONE_WAY);
+			SetWindowWidgetDisabledState(w, RTW_REMOVE, !IsWindowWidgetLowered(w, clicked_widget));
 			break;
 		case RTW_ROAD_X:
 		case RTW_ROAD_Y:
-		case RTW_BUS_STATION:
-		case RTW_TRUCK_STATION:
-			/* Removal button is enabled only if the road/station
-			 * button is still lowered.  Once raised, it has to be disabled */
-			SetWindowWidgetDisabledState(w, RTW_REMOVE, !IsWindowWidgetLowered(w, clicked_widget));
+		case RTW_AUTOROAD:
+			SetWindowWidgetsDisabledState(w, !IsWindowWidgetLowered(w, 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 */
-			DisableWindowWidget(w, RTW_REMOVE);
-			RaiseWindowWidget(w, RTW_REMOVE);
+			SetWindowWidgetsDisabledState(w, true,
+				RTW_REMOVE,
+				RTW_ONE_WAY,
+				WIDGET_LIST_END);
+			SetWindowWidgetsLoweredState (w, false,
+				RTW_REMOVE,
+				RTW_ONE_WAY,
+				WIDGET_LIST_END);
 			break;
 	}
 }
@@ -310,7 +421,12 @@
 static void BuildRoadToolbWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: DisableWindowWidget(w, RTW_REMOVE); break;
+	case WE_CREATE:
+		SetWindowWidgetsDisabledState(w, true,
+			RTW_REMOVE,
+			RTW_ONE_WAY,
+			WIDGET_LIST_END);
+		break;
 
 	case WE_PAINT:
 		SetWindowWidgetsDisabledState(w, !CanBuildVehicleInfrastructure(VEH_ROAD),
@@ -324,9 +440,10 @@
 	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);
 		}
-		UpdateRemoveWidgetStatus(w, e->we.click.widget);
+		UpdateOptionWidgetStatus(w, e->we.click.widget);
 		break;
 
 	case WE_KEYPRESS:
@@ -334,8 +451,9 @@
 			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);
-				UpdateRemoveWidgetStatus(w, i + RTW_ROAD_X);
+				UpdateOptionWidgetStatus(w, i + RTW_ROAD_X);
 				break;
 			}
 		}
@@ -344,6 +462,7 @@
 
 	case WE_PLACE_OBJ:
 		_remove_button_clicked = IsWindowWidgetLowered(w, RTW_REMOVE);
+		_one_way_button_clicked = IsWindowWidgetLowered(w, RTW_ONE_WAY);
 		_place_proc(e->we.place.tile);
 		break;
 
@@ -361,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;
 		}
 
@@ -389,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;
@@ -417,23 +568,26 @@
 /** 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},             // RTW_CLOSEBOX
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   205,     0,    13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},   // RTW_CAPTION
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   206,   217,     0,    13, 0x0,                        STR_STICKY_BUTTON},                 // RTW_STICKY
+{    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},       // RTW_ROAD_X
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_ROAD_NE,            STR_180B_BUILD_ROAD_SECTION},       // RTW_ROAD_Y
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},   // RTW_DEMOLISH
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_ROAD_DEPOT,         STR_180C_BUILD_ROAD_VEHICLE_DEPOT}, // RTW_DEPOT
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_BUS_STATION,        STR_180D_BUILD_BUS_STATION},        // RTW_BUS_STATION
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   110,   131,    14,    35, SPR_IMG_TRUCK_BAY,          STR_180E_BUILD_TRUCK_LOADING_BAY},  // RTW_TRUCK_STATION
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   132,   173,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_ROAD_BRIDGE},        // RTW_BUILD_BRIDGE
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   174,   195,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_ROAD_TUNNEL},        // RTW_BUILD_TUNNEL
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   196,   217,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR},  // RTW_REMOVE
+{     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,
@@ -443,23 +597,26 @@
 /** 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},                     // RTW_CLOSEBOX
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   205,     0,    13, STR_1802_TRAMWAY_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},        // RTW_CAPTION
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   206,   217,     0,    13, 0x0,                        STR_STICKY_BUTTON},                         // RTW_STICKY
+{    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},            // RTW_ROAD_X
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_TRAMWAY_NE,         STR_180B_BUILD_TRAMWAY_SECTION},            // RTW_ROAD_Y
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},           // RTW_DEMOLISH
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_ROAD_DEPOT,         STR_180C_BUILD_TRAM_VEHICLE_DEPOT},         // RTW_DEPOT
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_BUS_STATION,        STR_180D_BUILD_PASSENGER_TRAM_STATION},     // RTW_BUS_STATION
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   110,   131,    14,    35, SPR_IMG_TRUCK_BAY,          STR_180E_BUILD_CARGO_TRAM_STATION},         // RTW_TRUCK_STATION
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   132,   173,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_TRAMWAY_BRIDGE},             // RTW_BUILD_BRIDGE
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   174,   195,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_TRAMWAY_TUNNEL},             // RTW_BUILD_TUNNEL
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   196,   217,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS}, // RTW_REMOVE
+{     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
+
 {   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,
@@ -479,23 +636,25 @@
 /** 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},            // RTW_CLOSEBOX
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   139,     0,    13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},  // RTW_CAPTION
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   140,   151,     0,    13, 0x0,                        STR_STICKY_BUTTON},                // RTW_STICKY
+{    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},      // RTW_ROAD_X
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_ROAD_NE,            STR_180B_BUILD_ROAD_SECTION},      // RTW_ROAD_Y
-{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},  // RTW_DEMOLISH
+{     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,    66,   107,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_ROAD_BRIDGE},       // RTW_BUILD_BRIDGE
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   108,   129,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_ROAD_TUNNEL},       // RTW_BUILD_TUNNEL
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   130,   151,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR}, // RTW_REMOVE
+{     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,
--- a/src/road_map.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/road_map.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/road_map.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/roadveh_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -130,7 +130,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;
@@ -178,7 +178,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);
 
@@ -193,7 +193,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);
 
@@ -203,6 +203,7 @@
 
 		const RoadVehicleInfo *rvi = RoadVehInfo(p1);
 
+		v = new (v) RoadVehicle();
 		v->unitnumber = unit_num;
 		v->direction = DiagDirToDir(GetRoadDepotDirection(tile));
 		v->owner = _current_player;
@@ -248,17 +249,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);
 
@@ -368,6 +368,8 @@
 		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);
@@ -378,7 +380,7 @@
 		delete v;
 	}
 
-	return CommandCost(-v->value);
+	return ret;
 }
 
 struct RoadFindDepotData {
@@ -475,13 +477,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();
@@ -491,7 +493,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;
@@ -510,7 +512,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;
@@ -596,7 +598,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)
@@ -670,9 +672,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;
 }
 
@@ -871,7 +873,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)) &&
@@ -885,25 +887,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;
 }
@@ -1011,7 +1018,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;
 }
 
@@ -1096,7 +1103,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;
@@ -1207,7 +1214,7 @@
 	}
 
 	/* Only one track to choose between? */
-	if (!(KillFirstBit2x64(trackdirs))) {
+	if (KillFirstBit(trackdirs) == TRACKDIR_BIT_NONE) {
 		return_track(FindFirstBit2x64(trackdirs));
 	}
 
@@ -1270,7 +1277,7 @@
 		uint best_maxlen = (uint)-1;
 		uint bitmask = (uint)trackdirs;
 		for (int i = 0; bitmask != 0; bitmask >>= 1, i++) {
-			if (HASBIT(bitmask, 0)) {
+			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;
@@ -1287,7 +1294,7 @@
 
 found_best_track:;
 
-	if (HASBIT(signal, best_track)) return INVALID_TRACKDIR;
+	if (HasBit(signal, best_track)) return INVALID_TRACKDIR;
 
 	return best_track;
 }
@@ -1321,12 +1328,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 {
@@ -1408,10 +1419,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;
 	}
@@ -1430,6 +1463,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;
@@ -1461,12 +1517,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);
@@ -1485,7 +1541,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) {
@@ -1509,10 +1565,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;
@@ -1520,8 +1579,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;
 				}
@@ -1536,14 +1623,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;
@@ -1565,18 +1658,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;
@@ -1596,11 +1689,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 = GetRoadBits(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) {
@@ -1610,20 +1726,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;
@@ -1659,6 +1775,7 @@
 		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;
@@ -1712,7 +1829,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++;
@@ -1783,14 +1900,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);
@@ -2012,7 +2129,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;
 
@@ -2035,7 +2152,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/roadveh_gui.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/saveload.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -29,7 +29,7 @@
 #include "strings.h"
 #include <list>
 
-extern const uint16 SAVEGAME_VERSION = 81;
+extern const uint16 SAVEGAME_VERSION = 82;
 uint16 _sl_version;       ///< the major savegame version identifier
 byte   _sl_minor_version; ///< the minor savegame version, DO NOT USE!
 
@@ -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/screenshot.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/screenshot.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/settings.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -49,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;
@@ -96,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) {
@@ -434,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;
 	}
@@ -569,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) {
@@ -665,12 +666,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:
@@ -1080,6 +1081,7 @@
 #define MS SGF_MULTISTRING
 #define NO SGF_NETWORK_ONLY
 #define CR SGF_CURRENCY
+#define NN SGF_NO_NETWORK
 
 #include "table/strings.h"
 
@@ -1269,6 +1271,7 @@
 #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()
 };
 
@@ -1367,12 +1370,12 @@
 
 	/***************************************************************************/
 	/* 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_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),
@@ -1381,7 +1384,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),
@@ -1392,7 +1395,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),
@@ -1408,19 +1411,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,     UpdateConsists),
-	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),
@@ -1661,9 +1664,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";
@@ -1675,7 +1678,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;
@@ -1795,6 +1798,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/settings.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/settings_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -155,7 +155,7 @@
 		SetWindowWidgetLoweredState(w, 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:
@@ -429,7 +429,7 @@
 	} else {
 		for (uint i = 0; i < GAME_DIFFICULTY_NUM; i++) {
 			GDType *diff = ((GDType*)&_opt_newgame.diff) + i;
-			*diff = clamp(*diff, _game_setting_info[i].min, _game_setting_info[i].max);
+			*diff = Clamp(*diff, _game_setting_info[i].min, _game_setting_info[i].max);
 			*diff -= *diff % _game_setting_info[i].step;
 		}
 	}
@@ -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 + ((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
 		}
@@ -526,7 +526,7 @@
 			/* 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;
@@ -537,12 +537,12 @@
 			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
@@ -826,6 +826,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}};
@@ -856,7 +857,7 @@
 					SetDParam(1, value);
 				}
 			}
-			DrawString(30, y, (sdb->str) + disabled, 0);
+			DrawString(30, y, (sdb->str) + disabled, TC_FROMSTRING);
 			y += 11;
 		}
 		break;
@@ -885,8 +886,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);
@@ -1030,8 +1032,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)
@@ -1055,37 +1057,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;
 		}
 
@@ -1146,7 +1148,7 @@
 							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
@@ -1173,7 +1175,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/ship_cmd.cpp	Fri Nov 23 16:59:30 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);
 
@@ -919,6 +919,8 @@
 		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();
@@ -928,7 +930,7 @@
 		delete v;
 	}
 
-	return CommandCost(-v->value);
+	return ret;
 }
 
 /** Start/Stop a ship.
@@ -962,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);
@@ -1001,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();
@@ -1017,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;
@@ -1036,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);
@@ -1081,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/ship_gui.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/signs_gui.cpp	Fri Nov 23 16:59:30 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;
 	}
 }
@@ -321,3 +321,4 @@
 }
 
 
+
--- a/src/slope.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/slope.h	Fri Nov 23 16:59:30 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,14 @@
 	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)
 
-/**
- * Enumeration of tile corners
- */
-enum Corner {
-	CORNER_W = 0,
-	CORNER_S = 1,
-	CORNER_E = 2,
-	CORNER_N = 3,
-	CORNER_END
+	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)
 };
 
 /**
@@ -74,43 +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:
@@ -124,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.
@@ -170,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.
@@ -179,8 +235,20 @@
 	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.
 };
@@ -219,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 IS_INT_INSIDE(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(IS_INT_INSIDE(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 IS_INT_INSIDE(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.
  *
@@ -243,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/smallmap_gui.cpp	Fri Nov 23 16:59:30 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;
@@ -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*/
+			SetWindowWidgetHiddenState(w, SM_WIDGET_ENABLEINDUSTRIES, _smallmap_type != SMT_INDUSTRY);
+			SetWindowWidgetHiddenState(w, 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
+					RaiseWindowWidget(w, _smallmap_type + SM_WIDGET_CONTOUR);
+					_smallmap_type = e->we.click.widget - SM_WIDGET_CONTOUR;
+					LowerWindowWidget(w, _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
+					ToggleWidgetLoweredState(w, SM_WIDGET_TOGGLETOWNNAME);
+					_smallmap_show_towns = IsWindowWidgetLowered(w, 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 */
+						RaiseWindowWidget(w, SM_WIDGET_ENABLEINDUSTRIES);
+						RaiseWindowWidget(w, 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 */
+					LowerWindowWidget(w, SM_WIDGET_ENABLEINDUSTRIES);
+					RaiseWindowWidget(w, 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 */
+					RaiseWindowWidget(w, SM_WIDGET_ENABLEINDUSTRIES);
+					LowerWindowWidget(w, 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;
+		}
+	}
+
+	LowerWindowWidget(w, _smallmap_type + SMT_OWNER);
+	SetWindowWidgetLoweredState(w, SM_WIDGET_TOGGLETOWNNAME, _smallmap_show_towns);
 
 	SmallMapCenterOnCurrentPos(w);
 }
--- a/src/sound.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/sound.cpp	Fri Nov 23 16:59:30 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);
--- a/src/sound/cocoa_s.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/sound/cocoa_s.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -14,21 +14,11 @@
 #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 +31,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 +43,7 @@
 {
 	Component comp;
 	ComponentDescription desc;
-	struct AudioUnitInputCallback callback;
+	struct AURenderCallbackStruct callback;
 	AudioStreamBasicDescription requestedDesc;
 
 	/* Setup a AudioStreamBasicDescription with the requested format */
@@ -75,9 +65,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 +93,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 +109,7 @@
 
 void SoundDriver_Cocoa::Stop()
 {
-	struct AudioUnitInputCallback callback;
+	struct AURenderCallbackStruct callback;
 
 	/* stop processing the audio unit */
 	if (AudioOutputUnitStop(_outputAudioUnit) != noErr) {
@@ -130,8 +120,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/spritecache.cpp	Fri Nov 23 16:59:30 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/squirrel_helper.hpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/squirrel_helper.hpp	Fri Nov 23 16:59:30 2007 +0000
@@ -60,6 +60,7 @@
 	template <> inline int Return<int16>       (HSQUIRRELVM vm, int16 res)       { sq_pushinteger(vm, res); return 1; }
 	template <> inline int Return<int32>       (HSQUIRRELVM vm, int32 res)       { sq_pushinteger(vm, res); return 1; }
 	template <> inline int Return<int64>       (HSQUIRRELVM vm, int64 res)       { sq_pushinteger(vm, ClampToI32(res)); return 1; }
+	template <> inline int Return<Money>       (HSQUIRRELVM vm, Money res)       { sq_pushinteger(vm, ClampToI32(res)); return 1; }
 	template <> inline int Return<bool>        (HSQUIRRELVM vm, bool res)        { sq_pushbool   (vm, res); return 1; }
 	template <> inline int Return<char *>      (HSQUIRRELVM vm, char *res)       { if (res == NULL) sq_pushnull(vm); else sq_pushstring (vm, OTTD2FS(res), strlen(res)); free(res); return 1; }
 	template <> inline int Return<const char *>(HSQUIRRELVM vm, const char *res) { if (res == NULL) sq_pushnull(vm); else sq_pushstring (vm, OTTD2FS(res), strlen(res)); return 1; }
--- a/src/squirrel_std.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/squirrel_std.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -15,7 +15,7 @@
 	SQInteger tmp;
 
 	sq_getinteger(vm, 2, &tmp);
-	sq_pushinteger(vm, myabs(tmp));
+	sq_pushinteger(vm, ::abs(tmp));
 	return 1;
 }
 
--- a/src/station.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/station.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/station.h	Fri Nov 23 16:59:30 2007 +0000
@@ -14,6 +14,7 @@
 #include "newgrf_station.h"
 #include "cargopacket.h"
 #include <list>
+#include <set>
 
 struct Station;
 struct RoadStop;
@@ -241,6 +242,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/station_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -43,6 +43,7 @@
 #include "cargotype.h"
 #include "strings.h"
 #include "autoslope.h"
+#include "transparency.h"
 
 DEFINE_OLD_POOL_GENERIC(Station, Station)
 DEFINE_OLD_POOL_GENERIC(RoadStop, RoadStop)
@@ -92,8 +93,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;
@@ -223,6 +227,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[] = {
@@ -248,7 +262,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);
 				}
 			}
 		}
@@ -262,7 +276,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;
@@ -272,14 +286,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);
@@ -287,7 +301,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)
 			) {
@@ -302,10 +316,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;
 		}
 	}
 
@@ -352,8 +366,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);
@@ -366,7 +381,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;
@@ -391,19 +406,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++) {
@@ -414,7 +433,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)
 {
@@ -423,8 +449,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);
 
@@ -458,7 +484,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)
 {
@@ -467,8 +500,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);
@@ -511,11 +544,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;
@@ -527,7 +562,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,
@@ -554,7 +589,7 @@
 		MergePoint(&rect, rs->xy);
 	}
 
-	// And retrieve the acceptance.
+	/* And retrieve the acceptance. */
 	AcceptedCargo accepts;
 	if (rect.max_x >= rect.min_x) {
 		GetAcceptanceAroundTiles(
@@ -568,11 +603,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)))
@@ -581,12 +616,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 */
@@ -607,13 +642,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;
 				}
@@ -625,7 +660,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);
 }
 
@@ -633,17 +668,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;
@@ -656,9 +693,17 @@
 
 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.
-CommandCost CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invalid_dirs, StationID* station, bool check_clear = true)
+/** 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, uint invalid_dirs, StationID *station, bool check_clear = true)
 {
 	CommandCost cost;
 	int allowed_z = -1;
@@ -688,7 +733,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) ||
@@ -699,17 +744,17 @@
 			flat_z += TILE_HEIGHT;
 		}
 
-		// 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 (allowed_z != flat_z) {
 			return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 		}
 
-		// if station is set, then we have special handling to allow building on top of already existing stations.
-		// so station points to INVALID_STATION if we can build on any station. or it points to a station if we're only allowed to build
-		// on exactly that station.
+		/* if station is set, then we have special handling to allow building on top of already existing stations.
+		 * so station points to INVALID_STATION if we can build on any station.
+		 * Or it points to a station if we're only allowed to build on exactly that station. */
 		if (station != NULL && IsTileType(tile_cur, MP_STATION)) {
 			if (!IsRailwayStation(tile_cur)) {
 				return ClearTile_Station(tile_cur, DC_AUTO); // get error message
@@ -740,32 +785,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 {
@@ -773,14 +818,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;
@@ -868,16 +913,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);
@@ -887,7 +933,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);
@@ -900,17 +946,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
@@ -918,19 +964,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 (!_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 */
@@ -941,10 +987,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);
 		}
 	}
 
@@ -960,12 +1006,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;
 		}
 	}
@@ -976,9 +1022,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;
 
@@ -1010,7 +1056,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);
 				}
 
@@ -1041,11 +1089,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--;
@@ -1053,18 +1101,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--;
@@ -1072,9 +1120,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;
@@ -1145,13 +1193,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);
@@ -1279,16 +1328,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;
@@ -1312,8 +1361,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;
@@ -1323,7 +1372,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;
 	}
@@ -1331,7 +1380,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);
@@ -1346,7 +1395,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) {
@@ -1365,10 +1414,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;
@@ -1377,11 +1426,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);
@@ -1404,7 +1453,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)) {
@@ -1429,14 +1483,14 @@
 
 	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;
@@ -1486,15 +1540,16 @@
 	return ret;
 }
 
-// FIXME -- need to move to its corresponding Airport variable
-// Country Airfield (small)
+/* FIXME -- need to move to its corresponding Airport variable*/
+
+/* Country Airfield (small) */
 static const byte _airport_sections_country[] = {
 	54, 53, 52, 65,
 	58, 57, 56, 55,
 	64, 63, 63, 62
 };
 
-// City Airport (large)
+/* City Airport (large) */
 static const byte _airport_sections_town[] = {
 	31,  9, 33,  9,  9, 32,
 	27, 36, 29, 34,  8, 10,
@@ -1504,7 +1559,7 @@
 	26, 22, 23, 24, 25, 26
 };
 
-// Metropolitain Airport (large) - 2 runways
+/* Metropolitain Airport (large) - 2 runways */
 static const byte _airport_sections_metropolitan[] = {
 	 31,  9, 33,  9,  9, 32,
 	 27, 36, 29, 34,  8, 10,
@@ -1514,7 +1569,7 @@
 	 26, 23, 23, 23, 23, 26
 };
 
-// International Airport (large) - 2 runways
+/* International Airport (large) - 2 runways */
 static const byte _airport_sections_international[] = {
 	88, 89, 89, 89, 89, 89,  88,
 	51,  8,  8,  8,  8,  8,  32,
@@ -1525,7 +1580,7 @@
 	26, 23, 23, 23, 23, 23,  26
 };
 
-// Intercontinental Airport (vlarge) - 4 runways
+/* Intercontinental Airport (vlarge) - 4 runways */
 static const byte _airport_sections_intercontinental[] = {
 	102, 120,  89,  89,  89,  89,  89,  89, 118,
 	120,  23,  23,  23,  23,  23,  23, 119, 117,
@@ -1541,7 +1596,7 @@
 };
 
 
-// Commuter Airfield (small)
+/* Commuter Airfield (small) */
 static const byte _airport_sections_commuter[] = {
 	85, 30, 115, 115, 32,
 	87, 8,    8,   8, 10,
@@ -1549,18 +1604,18 @@
 	26, 23,  23,  23, 26
 };
 
-// Heliport
+/* Heliport */
 static const byte _airport_sections_heliport[] = {
 	66,
 };
 
-// Helidepot
+/* Helidepot */
 static const byte _airport_sections_helidepot[] = {
 	124, 32,
 	122, 123
 };
 
-// Helistation
+/* Helistation */
 static const byte _airport_sections_helistation[] = {
 	 32, 134, 159, 158,
 	161, 142, 142, 157
@@ -1591,7 +1646,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;
@@ -1622,7 +1677,7 @@
 
 	Station *st = NULL;
 
-	if (!_patches.adjacent_stations || !HASBIT(p2, 0)) {
+	if (!_patches.adjacent_stations || !HasBit(p2, 0)) {
 		st = GetStationAround(tile, w, h, INVALID_STATION);
 		if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
 	}
@@ -1660,14 +1715,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, !(afc->flags & AirportFTAClass::AIRPLANES) ? 5 : 1)) {
+		if (!GenerateStationName(st, tile, !(afc->flags & AirportFTAClass::AIRPLANES) ? STATIONNAMING_HELIPORT : STATIONNAMING_AIRPORT)) {
 			return CMD_ERROR;
 		}
 	}
@@ -1782,7 +1837,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;
@@ -1915,7 +1970,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);
@@ -1926,7 +1981,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) {
@@ -1947,12 +2002,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) {
@@ -2034,16 +2089,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);
 		statspec = st->speclist[GetCustomStationSpecIndex(ti->tile)].spec;
 
@@ -2054,7 +2109,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);
 			}
@@ -2069,22 +2124,22 @@
 	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 += GetCustomStationGroundRelocation(statspec, st, ti->tile);
 		image += rti->custom_ground_offset;
 	} else {
 		image += rti->total_offset;
 	}
 
-	// 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);
 	}
 
@@ -2093,14 +2148,14 @@
 	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;
@@ -2112,10 +2167,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));
 		}
 	}
 }
@@ -2127,7 +2182,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);
@@ -2187,12 +2242,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;
 			}
@@ -2214,8 +2269,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:
 			switch (GetStationGfx(tile)) {
@@ -2331,14 +2386,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;
 				}
 
@@ -2346,7 +2401,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();
@@ -2384,12 +2439,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;
@@ -2408,12 +2463,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) ||
@@ -2432,10 +2486,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;
@@ -2443,7 +2498,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)) {
@@ -2522,7 +2577,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);
 				}
 			}
 		}
@@ -2532,7 +2587,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);
@@ -2585,14 +2640,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) {
@@ -2615,91 +2676,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);
 	}
@@ -2721,14 +2794,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;
@@ -2818,8 +2893,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:
@@ -2964,7 +3039,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),
@@ -2987,7 +3062,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),
@@ -3002,7 +3077,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()
@@ -3053,7 +3128,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();
@@ -3083,7 +3158,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);
@@ -3098,7 +3173,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/station_gui.cpp	Fri Nov 23 16:59:30 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,7 +290,7 @@
 			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)) LowerWindowWidget(w, 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);
@@ -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);
+			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);
+			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);
+			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,13 +400,13 @@
 				case STATIONLIST_WIDGET_AIRPLANE:
 				case STATIONLIST_WIDGET_SHIP:
 					if (_ctrl_pressed) {
-						TOGGLEBIT(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
+						ToggleBit(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
 						ToggleWidgetLoweredState(w, e->we.click.widget);
 					} else {
 						for (uint i = 0; facilities != 0; i++, facilities >>= 1) {
-							if (HASBIT(facilities, 0)) RaiseWindowWidget(w, i + STATIONLIST_WIDGET_TRAIN);
+							if (HasBit(facilities, 0)) RaiseWindowWidget(w, i + STATIONLIST_WIDGET_TRAIN);
 						}
-						SETBIT(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
+						SetBit(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
 						LowerWindowWidget(w, e->we.click.widget);
 					}
 					SetWindowWidgetLoweredState(w, STATIONLIST_WIDGET_FACILALL, facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK));
@@ -443,7 +444,7 @@
 
 				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);
@@ -486,7 +487,7 @@
 						}
 
 						if (_ctrl_pressed) {
-							TOGGLEBIT(_cargo_filter, c);
+							ToggleBit(_cargo_filter, c);
 							ToggleWidgetLoweredState(w, e->we.click.widget);
 						} else {
 							for (uint i = STATIONLIST_WIDGET_CARGOSTART; i < w->widget_count; i++) {
@@ -497,7 +498,7 @@
 							_cargo_filter = 0;
 							include_empty = false;
 
-							SETBIT(_cargo_filter, c);
+							SetBit(_cargo_filter, c);
 							LowerWindowWidget(w, e->we.click.widget);
 						}
 						sl->flags |= SL_REBUILD;
@@ -614,7 +615,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)) LowerWindowWidget(w, STATIONLIST_WIDGET_CARGOSTART + i);
 		i++;
 	}
 
@@ -729,7 +730,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 +743,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 +752,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 +772,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 +790,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 +798,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/station_map.h	Fri Nov 23 16:59:30 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);
 }
 
 
@@ -173,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/stdafx.h	Fri Nov 23 16:59:30 2007 +0000
@@ -8,8 +8,11 @@
 /* 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__)
+ * 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. */
@@ -20,7 +23,7 @@
 # endif
 #else
 # define INT64_MAX 9223372036854775807LL
-# define INT64_MIN -9223372036854775808LL
+# define INT64_MIN (-INT64_MAX - 1)
 #endif
 
 #include <cstdio>
--- a/src/strgen/strgen.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/strgen/strgen.cpp	Fri Nov 23 16:59:30 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])) {
--- a/src/string.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/string.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/strings.cpp	Fri Nov 23 16:59:30 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) {
--- a/src/subsidy_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/subsidy_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -94,7 +94,7 @@
 
 	y = 15;
 	x = 1;
-	DrawString(x, y, STR_2026_SUBSIDIES_ON_OFFER_FOR, 0);
+	DrawString(x, y, STR_2026_SUBSIDIES_ON_OFFER_FOR, TC_FROMSTRING);
 	y += 10;
 	num = 0;
 
@@ -103,21 +103,21 @@
 			int x2;
 
 			SetupSubsidyDecodeParam(s, 1);
-			x2 = DrawString(x + 2, y, STR_2027_FROM_TO, 0);
+			x2 = DrawString(x + 2, y, STR_2027_FROM_TO, TC_FROMSTRING);
 
 			SetDParam(0, _date - ymd.day + 384 - s->age * 32);
-			DrawString(x2, y, STR_2028_BY, 0);
+			DrawString(x2, y, STR_2028_BY, TC_FROMSTRING);
 			y += 10;
 			num++;
 		}
 	}
 
 	if (num == 0) {
-		DrawString(x + 2, y, STR_202A_NONE, 0);
+		DrawString(x + 2, y, STR_202A_NONE, TC_FROMSTRING);
 		y += 10;
 	}
 
-	DrawString(x, y + 1, STR_202B_SERVICES_ALREADY_SUBSIDISED, 0);
+	DrawString(x, y + 1, STR_202B_SERVICES_ALREADY_SUBSIDISED, TC_FROMSTRING);
 	y += 10;
 	num = 0;
 
@@ -130,16 +130,16 @@
 			PlayerID player = GetStation(s->to)->owner;
 			SetDParam(3, player);
 
-			xt = DrawString(x + 2, y, STR_202C_FROM_TO, 0);
+			xt = DrawString(x + 2, y, STR_202C_FROM_TO, TC_FROMSTRING);
 
 			SetDParam(0, _date - ymd.day + 768 - s->age * 32);
-			DrawString(xt, y, STR_202D_UNTIL, 0);
+			DrawString(xt, y, STR_202D_UNTIL, TC_FROMSTRING);
 			y += 10;
 			num++;
 		}
 	}
 
-	if (num == 0) DrawString(x + 2, y, STR_202A_NONE, 0);
+	if (num == 0) DrawString(x + 2, y, STR_202A_NONE, TC_FROMSTRING);
 }
 
 static void SubsidiesListWndProc(Window *w, WindowEvent *e)
--- a/src/table/build_industry.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/table/build_industry.h	Fri Nov 23 16:59:30 2007 +0000
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/table/cargo_const.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/table/files.h	Fri Nov 23 16:59:30 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",  {0x4a, 0x9e, 0x0d, 0x41, 0x9e, 0x66, 0x13, 0x17, 0xb9, 0x61, 0x81, 0xc7, 0xca, 0xef, 0x6b, 0xdc} }
 };
 
 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",  {0xe7, 0xe5, 0x4a, 0x12, 0x5c, 0xec, 0x46, 0x53, 0x1d, 0x37, 0x0a, 0xf4, 0x69, 0xf7, 0x4a, 0x9c} }
 };
-
-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",  { 0xfd, 0xa4, 0x38, 0xd6, 0x9c, 0x81, 0x74, 0xfe, 0xa0, 0x98, 0xa2, 0x14, 0x4b, 0x15, 0xb8, 0x4b } },
-	{ "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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/table/landscape_sprite.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/table/roadveh.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/table/sprites.h	Fri Nov 23 16:59:30 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,117 +43,133 @@
 	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 = 135,
 
-	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_WARNING_SIGN      = SPR_OPENTTD_BASE + 111, // warning sign (shown if there are any newgrf errors)
+	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,
 
-	/* 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_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_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,
+	AIRPORTX_SPRITE_COUNT = 15,
 
-	SPR_ROADSTOP_BASE = SPR_AIRPORTX_BASE + 15, // 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_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,
@@ -172,15 +185,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
@@ -194,11 +214,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,
@@ -294,10 +309,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,
@@ -326,55 +341,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,
@@ -441,7 +456,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 */
@@ -555,40 +570,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,
@@ -602,7 +619,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,
@@ -1001,11 +1018,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,
@@ -1041,8 +1058,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,
@@ -1191,11 +1208,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,
@@ -1212,31 +1229,36 @@
 	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,
@@ -1245,9 +1267,10 @@
 	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,
@@ -1274,7 +1297,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,
@@ -1287,8 +1310,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,
@@ -1309,47 +1332,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/terraform_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/terraform_gui.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/texteff.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -20,6 +20,7 @@
 #include "date.h"
 #include "texteff.hpp"
 #include "video/video_driver.hpp"
+#include "transparency.h"
 
 enum {
 	MAX_TEXTMESSAGE_LENGTH = 200,
@@ -390,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);
 					}
 				}
@@ -405,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);
 					}
 				}
--- a/src/tgp.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/tgp.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/timetable_cmd.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/timetable_gui.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -76,7 +76,7 @@
 		DisableWindowWidget(w, 9);
 	}
 
-	SetWindowWidgetLoweredState(w, 9, HASBIT(v->vehicle_flags, VF_AUTOFILL_TIMETABLE));
+	SetWindowWidgetLoweredState(w, 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_cmd.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/town_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -43,6 +43,7 @@
 #include "misc/autoptr.hpp"
 #include "autoslope.h"
 #include "waypoint.h"
+#include "transparency.h"
 
 /* Initialize the town-pool */
 DEFINE_OLD_POOL_GENERIC(Town, Town)
@@ -183,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;
 	}
 
 	{
@@ -355,7 +356,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);
 	}
@@ -412,7 +413,7 @@
 
 	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);
 
@@ -466,7 +467,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) {
@@ -532,7 +533,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 */
@@ -543,12 +544,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 {
@@ -590,7 +591,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)) {
@@ -728,20 +729,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;
 				}
@@ -810,38 +807,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));
 }
 
 /**
@@ -902,38 +894,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 (IsWaterTile(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;
@@ -1106,7 +1104,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. */
@@ -1127,7 +1125,10 @@
 	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);
 }
@@ -1714,7 +1715,7 @@
 
 				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;
 				}
@@ -1724,9 +1725,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;
 			}
@@ -1848,9 +1849,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 */
@@ -2011,7 +2012,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)
@@ -2019,7 +2020,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;
 }
@@ -2097,7 +2098,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);
 
@@ -2139,7 +2140,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
@@ -2176,7 +2177,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)
@@ -2266,7 +2267,7 @@
 		return;
 	}
 
-	SETBIT(t->have_ratings, _current_player);
+	SetBit(t->have_ratings, _current_player);
 
 	rating = t->ratings[_current_player];
 
--- a/src/town_gui.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/town_gui.cpp	Fri Nov 23 16:59:30 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) {
@@ -132,7 +132,7 @@
 
 		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);
@@ -146,12 +146,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 +172,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 +184,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;
 				}
 			}
@@ -272,15 +272,15 @@
 
 		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 +466,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 +480,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/town_map.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/train.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/train_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -41,6 +41,7 @@
 #include "date.h"
 #include "cargotype.h"
 #include "group.h"
+#include "table/sprites.h"
 #include "ai/ai.h"
 
 static bool TrainCheckIfLineEnds(Vehicle *v);
@@ -90,7 +91,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;
 		}
 	}
@@ -125,7 +126,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;
 		}
 
@@ -177,6 +178,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 {
@@ -194,18 +198,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
@@ -216,7 +220,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);
 			}
@@ -233,13 +237,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;
 	}
@@ -347,7 +353,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));
 		}
 	}
 
@@ -381,9 +387,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;
 		}
 	}
@@ -450,7 +456,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
@@ -458,7 +464,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)));
@@ -541,6 +547,7 @@
 				}
 			}
 
+			v = new (v) Train();
 			v->engine_type = engine;
 
 			DiagDirection dir = GetRailDepotDirection(tile);
@@ -558,7 +565,6 @@
 			v->u.rail.track = TRACK_BIT_DEPOT;
 			v->vehstatus = VS_HIDDEN | VS_DEFPAL;
 
-			v = new (v) Train();
 			v->subtype = 0;
 			SetTrainWagon(v);
 
@@ -696,7 +702,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);
 
@@ -705,6 +711,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;
@@ -737,12 +744,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;
 
@@ -769,7 +775,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);
 			}
 
@@ -967,7 +973,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;
@@ -988,7 +994,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--;
@@ -1044,7 +1050,7 @@
 			}
 		}
 
-		if (HASBIT(p2, 0)) {
+		if (HasBit(p2, 0)) {
 			/* unlink ALL wagons */
 			if (src != src_head) {
 				Vehicle *v = src_head;
@@ -1338,7 +1344,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);
@@ -1453,21 +1459,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);
 	}
 }
 
@@ -1615,7 +1621,7 @@
 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
 	}
 
-	CLRBIT(v->u.rail.flags, VRF_REVERSING);
+	ClrBit(v->u.rail.flags, VRF_REVERSING);
 }
 
 /** Reverse train.
@@ -1635,7 +1641,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);
 		}
 
@@ -1646,7 +1652,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);
 		}
@@ -1656,7 +1662,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);
@@ -1700,7 +1706,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;
 
@@ -1726,7 +1732,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;
@@ -1897,13 +1903,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();
@@ -1911,7 +1917,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++;
 			}
 
@@ -1935,7 +1941,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);
@@ -1969,7 +1975,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) ||
@@ -1994,7 +2000,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;
 		}
@@ -2185,10 +2191,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);
@@ -2255,9 +2261,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);
@@ -2270,9 +2276,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? */
 		}
 	}
@@ -2488,7 +2494,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 {
@@ -2508,7 +2514,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;
@@ -2548,8 +2554,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.
@@ -2565,7 +2571,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);
 			}
 		}
 	}
@@ -2624,7 +2630,7 @@
 	return
 		IsTileOwner(tile, v->owner) && (
 			!IsFrontEngine(v) ||
-			HASBIT(v->u.rail.compatible_railtypes, GetRailType(tile))
+			HasBit(v->u.rail.compatible_railtypes, GetRailType(tile))
 		);
 }
 
@@ -2721,9 +2727,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();
 
@@ -2835,10 +2841,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;
 					}
@@ -2938,7 +2944,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;
 				}
 
@@ -2949,7 +2955,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)) {
@@ -2975,7 +2981,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);
@@ -3279,7 +3285,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);
 	}
 
@@ -3522,19 +3528,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/train_gui.cpp	Fri Nov 23 16:59:30 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	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/transparency_gui.cpp	Fri Nov 23 16:59:30 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));
+				SetWindowWidgetLoweredState(w, 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/tree_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -20,6 +20,7 @@
 #include "sound.h"
 #include "variables.h"
 #include "genworld.h"
+#include "transparency.h"
 
 /**
  * List of tree placer algorithm.
@@ -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) ||
@@ -427,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;
 
@@ -460,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;
 		}
 	}
--- a/src/tunnel_map.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/tunnel_map.h	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/tunnelbridge_cmd.cpp	Fri Nov 23 16:59:30 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);
@@ -251,15 +252,14 @@
 	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 = ( _current_player != OWNER_TOWN && _patches.build_on_slopes);
+	allow_on_slopes = _patches.build_on_slopes;
 
 	TransportType transport_type = railtype == INVALID_RAILTYPE ? TRANSPORT_ROAD : TRANSPORT_RAIL;
 
@@ -461,10 +461,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);
@@ -826,7 +827,7 @@
 {
 	SpriteID image = psid->sprite;
 	if (image != 0) {
-		bool drawfarpillar = !HASBIT(GetBridgeFlags(type), 0);
+		bool drawfarpillar = !HasBit(GetBridgeFlags(type), 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.
@@ -837,7 +838,7 @@
 		 *
 		 * I have no clue, why this was done this way.
 		 */
-		bool side = HASBIT(image, 0);
+		bool side = HasBit(image, 0);
 
 		/* "dir" means the edge the pillars stand on */
 		DiagDirection dir = AxisToDiagDir(axis);
@@ -858,12 +859,12 @@
 		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, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, -5);
+				AddSortableSpriteToDraw(image, psid->pal, x, y, w, h, BB_HEIGHT_UNDER_BRIDGE - 5, cur_z, IsTransparencySet(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, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, -5);
+				AddSortableSpriteToDraw(image, psid->pal, x_back, y_back, w, h, BB_HEIGHT_UNDER_BRIDGE - 5, cur_z, IsTransparencySet(TO_BRIDGES), 0, 0, -5);
 			}
 		}
 	}
@@ -871,8 +872,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);
 }
 
@@ -897,16 +898,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]);
 }
 
 /**
@@ -962,14 +963,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);
@@ -1028,13 +1029,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) {
@@ -1044,7 +1045,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) {
@@ -1156,9 +1157,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++;
@@ -1166,9 +1167,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();
@@ -1180,10 +1181,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 */
@@ -1195,8 +1196,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;
 			}
 
@@ -1232,7 +1233,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();
@@ -1394,7 +1395,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;
@@ -1483,8 +1484,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/unix.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -136,8 +136,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 +229,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/unmovable_cmd.cpp	Fri Nov 23 16:59:30 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/variables.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/variables.h	Fri Nov 23 16:59:30 2007 +0000
@@ -287,7 +287,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;
--- a/src/vehicle.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/vehicle.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -234,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:
@@ -274,6 +274,7 @@
 	this->group_id           = DEFAULT_GROUP;
 	this->fill_percent_te_id = INVALID_TE_ID;
 	this->first              = this;
+	this->colormap           = PAL_NONE;
 }
 
 /**
@@ -457,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();
@@ -529,6 +536,15 @@
 	if ((this->type == VEH_TRAIN && EngineHasArticPart(this)) || (this->type == VEH_ROAD && RoadVehHasArticPart(this))) {
 		delete this->Next();
 	}
+
+	Window **wp;
+	FOR_ALL_WINDOWS(wp) {
+		Window *w = *wp;
+		if (w->viewport != 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()
@@ -571,7 +587,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 {
@@ -639,7 +655,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.
@@ -652,7 +668,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;
 		}
 	}
 
@@ -1336,8 +1352,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);
 }
 
@@ -1369,8 +1385,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) {
@@ -1383,6 +1399,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)
 {
@@ -1498,8 +1523,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;
@@ -1729,8 +1754,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)) {
@@ -1745,10 +1770,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
 		}
@@ -1780,7 +1804,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);
 				}
@@ -1812,6 +1836,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)) {
@@ -2084,7 +2117,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++;
 		}
@@ -2171,11 +2204,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) {
@@ -2487,7 +2520,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;
 	}
@@ -2539,7 +2572,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();
@@ -2560,7 +2593,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 {
@@ -2599,10 +2632,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... */
@@ -2610,11 +2646,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;
 
@@ -2623,6 +2663,8 @@
 	map += livery->colour1;
 	if (twocc) map += livery->colour2 * 16;
 
+	/* Update cache */
+	if (v != NULL) ((Vehicle*)v)->colormap = map;
 	return map;
 }
 
@@ -3073,7 +3115,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/vehicle.h	Fri Nov 23 16:59:30 2007 +0000
@@ -136,6 +136,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 */
@@ -340,6 +341,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;
@@ -588,6 +591,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/vehicle_gui.cpp	Fri Nov 23 16:59:30 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;
@@ -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;
@@ -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);
@@ -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:
@@ -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);
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cocoa/cocoa_keys.h	Fri Nov 23 16:59:30 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	Fri Nov 23 16:59:30 2007 +0000
@@ -0,0 +1,72 @@
+/* $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(); }
+};
+
+
+
+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_CreateWindowQuartzSubdriver(int width, int height, int bpp);
+CocoaSubdriver *QZ_CreateWindowQuickdrawSubdriver(int width, int height, int bpp);
+
+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	Fri Nov 23 16:59:30 2007 +0000
@@ -0,0 +1,421 @@
+/* $Id$ */
+
+/******************************************************************************
+ *                             Cocoa video driver                             *
+ * Known things left to do:                                                   *
+ *  Nothing at the moment.                                                    *
+ ******************************************************************************/
+
+#ifdef WITH_COCOA
+
+#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 "../../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
+
+
+@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)
+{
+	long sysVersion;
+
+	if (Gestalt(gestaltSystemVersion, &sysVersion) == noErr && sysVersion >= 0x1040) {
+		return QZ_CreateWindowQuartzSubdriver(width, height, bpp);
+	}
+
+	return QZ_CreateWindowQuickdrawSubdriver(width, height, bpp);
+}
+
+
+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 (_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	Fri Nov 23 16:59:30 2007 +0000
@@ -0,0 +1,700 @@
+/* $Id$ */
+
+/******************************************************************************
+ *                             Cocoa video driver                             *
+ * Known things left to do:                                                   *
+ *  Nothing at the moment.                                                    *
+ ******************************************************************************/
+
+#ifdef WITH_COCOA
+
+#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 "../../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,
+};
+
+
+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 NSRightMouseDragged:
+		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 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	Fri Nov 23 16:59:30 2007 +0000
@@ -0,0 +1,617 @@
+/* $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
+
+#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 "../../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
+
+
+/* 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	Fri Nov 23 16:59:30 2007 +0000
@@ -0,0 +1,804 @@
+/* $Id$ */
+
+/******************************************************************************
+ *                             Cocoa video driver                             *
+ * Known things left to do:                                                   *
+ *  List available resolutions.                                               *
+ ******************************************************************************/
+
+#ifdef WITH_COCOA
+
+#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 "../../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
+
+
+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 (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 /* WITH_COCOA */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cocoa/wnd_quickdraw.mm	Fri Nov 23 16:59:30 2007 +0000
@@ -0,0 +1,821 @@
+/* $Id$ */
+
+/******************************************************************************
+ *                             Cocoa video driver                             *
+ * Known things left to do:                                                   *
+ *  List available resolutions.                                               *
+ ******************************************************************************/
+
+#ifdef WITH_COCOA
+
+#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 "../../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
+
+
+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 (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	Thu Nov 22 23:01:41 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	Thu Nov 22 23:01:41 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	Thu Nov 22 23:01:41 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/sdl_v.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/video/sdl_v.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/video/win32_v.cpp	Fri Nov 23 16:59:30 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);
--- a/src/viewport.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/viewport.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -26,6 +26,7 @@
 #include "roadveh.h"
 #include "vehicle_gui.h"
 #include "blitter/factory.hpp"
+#include "transparency.h"
 
 #define VIEWPORT_DRAW_MEM (65536 * 2)
 
@@ -109,6 +110,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;
 
@@ -125,9 +134,10 @@
 
 	byte combine_sprites;
 
-	ParentSpriteToDraw *foundation;                      ///< Foundation sprite.
-	ChildScreenSpriteToDraw **last_foundation_child;     ///< Tail of ChildSprite list of active foundation.
-	Point foundation_offset;                             ///< Pixeloffset of ground sprites on the foundation.
+	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;
@@ -153,7 +163,7 @@
 
 void DeleteWindowViewport(Window *w)
 {
-	CLRBIT(_active_viewports, w->viewport - _viewports);
+	ClrBit(_active_viewports, w->viewport - _viewports);
 	w->viewport->width = 0;
 	w->viewport = NULL;
 }
@@ -169,7 +179,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;
@@ -286,10 +296,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;
@@ -359,14 +372,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;
@@ -475,18 +494,20 @@
  * @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, int extra_offs_x, int extra_offs_y)
+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(vd->foundation != NULL);
-	Point offs = vd->foundation_offset;
+	assert(IS_INT_INSIDE(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;
+	vd->last_child = vd->last_foundation_child[foundation_part];
 
 	AddChildSpriteScreen(image, pal, offs.x + extra_offs_x, offs.y + extra_offs_y, false, sub);
 
@@ -505,8 +526,11 @@
 void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub)
 {
 	ViewportDrawer *vd = _cur_vd;
-	if (vd->foundation != NULL) {
-		AddChildSpriteToFoundation(image, pal, sub, 0, 0);
+	/* 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 {
 		DrawGroundSpriteAt(image, pal, _cur_ti->x, _cur_ti->y, _cur_ti->z, sub);
 	}
@@ -523,14 +547,23 @@
 void OffsetGroundSprite(int x, int y)
 {
 	ViewportDrawer *vd = _cur_vd;
-	assert(vd->foundation == NULL);
+	/* 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->parent_list[-1];
-
-	vd->foundation_offset.x = x;
-	vd->foundation_offset.y = y;
-	vd->last_foundation_child = vd->last_child;
+	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;
 }
 
 /**
@@ -594,7 +627,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;
 	}
 
@@ -706,7 +739,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;
 	}
 
@@ -724,7 +757,8 @@
 	/* 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 == vd->last_child) vd->last_foundation_child = &cs->next;
+	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;
@@ -773,16 +807,17 @@
  * @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)
+static void DrawSelectionSprite(SpriteID image, SpriteID pal, const TileInfo *ti, int z_offset, FoundationPart foundation_part)
 {
 	/* FIXME: This is not totally valid for some autorail highlights, that extent over the edges of the tile. */
-	if (_cur_vd->foundation == NULL) {
+	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, 0, -z_offset);
+		AddChildSpriteToFoundation(image, pal, NULL, foundation_part, 0, -z_offset);
 	}
 }
 
@@ -794,7 +829,23 @@
  */
 static void DrawTileSelectionRect(const TileInfo *ti, SpriteID pal)
 {
-	DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], pal, ti, 7);
+	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)
@@ -841,7 +892,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;
@@ -850,7 +913,7 @@
 		pal = PALETTE_SEL_TILE_RED;
 	}
 
-	DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti, 7);
+	DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti, 7, foundation_part);
 }
 
 /**
@@ -876,17 +939,25 @@
 		} else if (_thd.drawstyle & HT_POINT) {
 			/* Figure out the Z coordinate for the single dot. */
 			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;
 			}
-			DrawSelectionSprite(_cur_dpi->zoom <= ZOOM_LVL_DETAIL ? SPR_DOT : SPR_DOT_SMALL, PAL_NONE, ti, 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;
@@ -967,8 +1038,11 @@
 			y_cur += 0x10;
 			x_cur -= 0x10;
 
-			vd->foundation = NULL;
-			vd->last_foundation_child = NULL;
+			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);
@@ -988,7 +1062,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;
@@ -1064,7 +1138,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;
@@ -1134,7 +1208,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;
@@ -1204,7 +1278,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;
@@ -1413,10 +1487,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
 				);
 			}
 		}
@@ -1425,12 +1499,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),
@@ -1575,8 +1649,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;
@@ -1607,8 +1681,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;
@@ -1744,7 +1818,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:
@@ -1802,7 +1876,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:
@@ -1860,7 +1934,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:
@@ -1918,7 +1992,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:
@@ -2167,8 +2241,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;
 
@@ -2196,6 +2270,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;
@@ -2223,7 +2301,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;
@@ -2231,6 +2309,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;
@@ -2433,8 +2522,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) {
@@ -2560,7 +2649,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;
@@ -2578,6 +2667,7 @@
 		return;
 	}
 
+	/* Needed so level-land is placed correctly */
 	if (_thd.next_drawstyle == HT_POINT) {
 		x += TILE_SIZE / 2;
 		y += TILE_SIZE / 2;
@@ -2588,7 +2678,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 {
@@ -2629,8 +2719,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) {
@@ -2728,20 +2818,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);
 	}
@@ -2750,8 +2840,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/viewport.h	Fri Nov 23 16:59:30 2007 +0000
@@ -73,24 +73,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, ...)
@@ -99,7 +96,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;
@@ -143,12 +143,12 @@
 	byte new_drawstyle;  // only used in UpdateTileSelection() to as a buffer to compare if there was a change between old and new
 	byte next_drawstyle; // queued, but not yet drawn style
 
-	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;
@@ -156,7 +156,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;
 
--- a/src/water_cmd.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/water_cmd.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -30,6 +30,7 @@
 #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[] = {
@@ -239,7 +240,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);
@@ -264,14 +265,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);
@@ -377,7 +378,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;
@@ -432,9 +433,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;
@@ -449,7 +450,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));
 	}
 }
 
@@ -464,7 +465,7 @@
 
 		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);
@@ -538,6 +539,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,36 +556,27 @@
 	/* type of this tile mustn't be water already. */
 	if (IsTileType(target, MP_WATER)) 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:
@@ -589,11 +591,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);
@@ -711,7 +715,7 @@
 
 /**
  * Let a water tile floods its diagonal adjoining tiles
- * called from tunnelbridge_cmd, and by TileLoop_Industry()
+ * called from tunnelbridge_cmd, and by TileLoop_Industry() and TileLoop_Track()
  *
  * @param tile the water/shore tile that floods
  */
--- a/src/water_map.h	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/water_map.h	Fri Nov 23 16:59:30 2007 +0000
@@ -67,7 +67,7 @@
 
 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)
--- a/src/widget.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/widget.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -229,7 +229,7 @@
 
 			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;
 		}
 
@@ -244,7 +244,7 @@
 			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;
 		}
 
@@ -302,11 +302,11 @@
 			/* 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];
@@ -334,11 +334,11 @@
 			/* 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];
@@ -397,7 +397,7 @@
 			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 (wi->data != 0) x2 = DrawString(r.left + 6, r.top, wi->data, TC_FROMSTRING);
 
 			c1 = _colour_gradient[wi->color][3];
 			c2 = _colour_gradient[wi->color][7];
@@ -446,7 +446,7 @@
 			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_00C5, TC_FROMSTRING);
 			break;
 		}
 
@@ -496,12 +496,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 +525,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]
 							);
@@ -630,7 +630,7 @@
 		uint j;
 
 		for (j = 0; strings[j] != INVALID_STRING_ID; j++) {
-			if (HASBIT(hidden_mask, j)) i--;
+			if (HasBit(hidden_mask, j)) i--;
 		}
 	}
 
--- a/src/win32.cpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/win32.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/window.cpp	Fri Nov 23 16:59:30 2007 +0000
@@ -196,7 +196,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);
@@ -1295,8 +1295,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);
@@ -1466,6 +1466,12 @@
 
 	w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y);
 
+	if (!(_right_button_down || scrollwheel_scrolling) || w == NULL) {
+		_cursor.fix_at = false;
+		_scrolling_viewport = false;
+		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);
@@ -1473,12 +1479,6 @@
 		return true;
 	}
 
-	if (!(_right_button_down || scrollwheel_scrolling) || w == NULL) {
-		_cursor.fix_at = false;
-		_scrolling_viewport = false;
-		return true;
-	}
-
 	if (_patches.reverse_scroll) {
 		e.we.scroll.delta.x = -_cursor.delta.x;
 		e.we.scroll.delta.y = -_cursor.delta.y;
@@ -1772,7 +1772,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 &&
@@ -1781,7 +1781,7 @@
 					return;
 				}
 
-				if (_thd.place_mode == 0) {
+				if (_thd.place_mode == VHM_NONE) {
 					HandleViewportClicked(vp, x, y);
 				} else {
 					PlaceObject();
@@ -1908,7 +1908,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;
 		}
 	}
@@ -2113,13 +2113,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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/window.h	Fri Nov 23 16:59:30 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;
 
@@ -644,7 +645,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);
 }
 
 /**
@@ -690,7 +691,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);
 }
 
 /**
@@ -713,7 +714,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);
 }
 
 /**
@@ -745,7 +746,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();
--- a/src/yapf/follow_track.hpp	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/yapf/follow_track.hpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/yapf/yapf_base.hpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/yapf/yapf_common.hpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/yapf/yapf_costrail.hpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/yapf/yapf_destrail.hpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/yapf/yapf_road.cpp	Fri Nov 23 16:59:30 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	Thu Nov 22 23:01:41 2007 +0000
+++ b/src/zoom.hpp	Fri Nov 23 16:59:30 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 */