(svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350. NewGRF_ports
authorrichk
Mon, 10 Mar 2008 15:26:39 +0000
branchNewGRF_ports
changeset 6878 7d1ff2f621c7
parent 6877 889301acc299
child 6879 ca19e616b7bb
(svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
Makefile.lang.in
changelog.txt
docs/landscape.html
docs/landscape_grid.html
known-bugs.txt
os/debian/changelog
os/macosx/plistgen.sh
os/win32/installer/install.nsi
projects/determineversion.vbs
projects/generate.vbs
projects/openttd_vs80.vcproj
projects/openttd_vs90.vcproj
projects/strgen_vs80.vcproj
projects/strgen_vs90.vcproj
readme.txt
source.list
src/ai/default/default.cpp
src/ai/trolly/trolly.cpp
src/aircraft_cmd.cpp
src/articulated_vehicles.cpp
src/articulated_vehicles.h
src/autoreplace_cmd.cpp
src/autoreplace_gui.cpp
src/bridge.h
src/bridge_gui.cpp
src/bridge_map.h
src/build_vehicle_gui.cpp
src/cargopacket.cpp
src/cargopacket.h
src/clear_cmd.cpp
src/command.cpp
src/command_type.h
src/console_cmds.cpp
src/core/alloc_func.cpp
src/core/alloc_func.hpp
src/core/math_func.hpp
src/core/random_func.hpp
src/depot.h
src/depot_gui.cpp
src/disaster_cmd.cpp
src/dock_gui.cpp
src/dummy_land.cpp
src/economy.cpp
src/economy_func.h
src/economy_type.h
src/elrail.cpp
src/engine.cpp
src/engine.h
src/engine_gui.cpp
src/fsmport.h
src/gfx.cpp
src/gfx_func.h
src/group.h
src/group_cmd.cpp
src/group_gui.cpp
src/gui.h
src/industry_cmd.cpp
src/landscape.cpp
src/landscape.h
src/lang/afrikaans.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/english_US.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/greek.txt
src/lang/unfinished/latvian.txt
src/main_gui.cpp
src/misc_cmd.cpp
src/misc_gui.cpp
src/newgrf.cpp
src/newgrf.h
src/newgrf_cargo.cpp
src/newgrf_commons.cpp
src/newgrf_commons.h
src/newgrf_config.cpp
src/newgrf_engine.cpp
src/newgrf_fsmports.cpp
src/newgrf_generic.cpp
src/newgrf_generic.h
src/newgrf_gui.cpp
src/newgrf_house.cpp
src/newgrf_industries.cpp
src/newgrf_industrytiles.cpp
src/newgrf_spritegroup.cpp
src/newgrf_spritegroup.h
src/newgrf_station.cpp
src/newgrf_text.cpp
src/newgrf_text.h
src/newgrf_town.cpp
src/npf.cpp
src/npf.h
src/oldloader.cpp
src/openttd.cpp
src/openttd.h
src/order.h
src/order_cmd.cpp
src/order_gui.cpp
src/ottdres.rc.in
src/pathfind.cpp
src/pathfind.h
src/player_base.h
src/player_gui.cpp
src/rail.cpp
src/rail_cmd.cpp
src/rail_gui.cpp
src/rail_map.h
src/road_cmd.cpp
src/road_gui.cpp
src/road_map.cpp
src/road_map.h
src/roadveh.h
src/roadveh_cmd.cpp
src/saveload.cpp
src/saveload.h
src/settings.cpp
src/settings_gui.cpp
src/settings_type.h
src/ship_cmd.cpp
src/signal.cpp
src/sound.cpp
src/sprite.h
src/spritecache.cpp
src/station.h
src/station_cmd.cpp
src/stdafx.h
src/table/bridge_land.h
src/table/engines.h
src/table/road_land.h
src/table/roadveh.h
src/table/roadveh_movement.h
src/table/sprites.h
src/table/station_land.h
src/table/track_land.h
src/table/unmovable_land.h
src/tile_cmd.h
src/tile_map.h
src/timetable_cmd.cpp
src/town_cmd.cpp
src/town_gui.cpp
src/town_map.h
src/track_func.h
src/track_type.h
src/train.h
src/train_cmd.cpp
src/transparency.h
src/transparency_gui.cpp
src/tree_cmd.cpp
src/tunnelbridge_cmd.cpp
src/tunnelbridge_map.h
src/unmovable_cmd.cpp
src/vehicle.cpp
src/vehicle_base.h
src/vehicle_gui.cpp
src/vehicle_type.h
src/video/cocoa/event.mm
src/video/sdl_v.cpp
src/video/win32_v.cpp
src/viewport.cpp
src/water.h
src/water_cmd.cpp
src/water_map.h
src/waypoint.cpp
src/waypoint.h
src/widgets/dropdown.cpp
src/window.cpp
src/window_gui.h
src/yapf/follow_track.cpp
src/yapf/follow_track.hpp
src/yapf/yapf.h
src/yapf/yapf_base.hpp
src/yapf/yapf_common.cpp
src/yapf/yapf_costbase.hpp
src/yapf/yapf_destrail.hpp
src/yapf/yapf_rail.cpp
src/yapf/yapf_road.cpp
src/yapf/yapf_ship.cpp
--- a/Makefile.lang.in	Sun Feb 03 20:34:26 2008 +0000
+++ b/Makefile.lang.in	Mon Mar 10 15:26:39 2008 +0000
@@ -44,13 +44,17 @@
 	$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
 	$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
 
+alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h
+	$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
+	$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
+
 lang/english.txt: $(LANG_DIR)/english.txt
 	$(Q)mkdir -p lang
 	$(Q)cp $(LANG_DIR)/english.txt lang/english.txt
 
-$(STRGEN): string.o strgen.o
+$(STRGEN): alloc_func.o string.o strgen.o
 	$(E) '$(STAGE) Compiling and Linking $@'
-	$(Q)$(CXX_BUILD) string.o strgen.o -o $@
+	$(Q)$(CXX_BUILD) $^ -o $@
 
 table/strings.h: lang/english.txt $(STRGEN)
 	$(E) '$(STAGE) Generating $@'
--- a/changelog.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/changelog.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1,3 +1,168 @@
+0.6.0-beta5 (2008-03-04)
+------------------------------------------------------------------------
+-Feature: Vehicle variable FE bit 8 (r12331) [FS#1812]
+-Feature: Vehicle variable FE bit 5 and 6 (r12330)
+-Feature: Support loading full range of 0xD0xx NewGRF strings which includes 0xD000 to 0xD3FF (r12316)
+-Feature: Ability to change aircraft speed factor, from so called 'realistic' (matching other vehicles) (1/1) to original TTD speed (1/4) (r12293, r12294)
+-Fix: Don't pause/unpause the game when showing load/save windows when the game is paused due to missing GRFs (r12336) [FS#1733]
+-Fix: Disallow building level crossings over one-way roads as this allowed competitors to remove the one-way state (r12329) [FS#1819]
+-Fix: Wrong Y pillar specified for girder with arch bridge (r12328)
+-Fix: Vehicles could be sorted in a wrong order when a vehicle name changed - cached name was not invalidated  (r12324)
+-Fix: Vehicle sorting by name was broken, it was comparing two the same strings (when caching was not used) (r12323) [FS#1821]
+-Fix: Endian issue when saving/loading group owner  (r12322)
+-Change: Update readme about where openttd looks for files (r12321)
+-Fix: Wrong transparency options could be saved after toggling all (r12320) [FS#1817]
+-Fix: Map string IDs that are embedded from other strings (r12317) [FS#1815]
+-Fix: Include prop 25 data for all train parts, not just those that carry cargo (r12314)
+-Fix: YAPF and NTP did not apply penalty for uphill tracks on steep slopes (r12313)
+-Fix: Restore timetable from backupped orders and add group ID to the backup (r12296) [FS#1549]
+-Fix: Do not draw trees nor lamps between tram tracks  (r12290) [FS#1807]
+-Fix: [Win32] Don't create save dir on install (r12269)
+-Fix: Autoreplace did not update vehicle index for timetable window (r12261) [FS#1805]
+-Fix: GetProductionAroundTiles() may fail if only the second production slot exists (r12258)
+-Fix: Removing the Broken FollowTrack_t (pathfinding) fixed related functions (r12252)  [FS#1801]
+-Fix: Town variables 0x9E to 0xAD (company ratings) returned wrong values (r12247)
+-Fix: Proper usage of Clamp() (r12246)
+-Fix: Typo resulting in no players are given the engine preview offer (r12244)
+-Fix: Mac OSX bundle display name should be 'OpenTTD' (r12234) [FS#1798]
+-Fix: [NewGRF] Support using any base price for rail and road vehicles' running cost, show running cost of wagons if available (r12209)
+-Fix: When loading a savegame fails, don't start creating a new game, just go straight back to the intro screen (r12202)
+-Fix: Force AI to build rail or road instead of bridges if possible, so it doesn't build bridges everywhere (r12200)
+-Fix: "Transparent buildings" now only toggles buildings, so show tick when buildings are transparent [FS#1789] (r12198)
+-Fix: Show correct last year profit when the train had negative income  [FS#1788] (r12197)
+-Fix: There can be oil rigs at map borders, do not set water class for them [FS#1787] (r12195)
+-Fix: Clamp various town variables to 16bit prior to returning the value (r12192)
+-Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles (r12191)
+-Fix: YAPF always shows 0ms PF time in debug for debug level 2 [FS#1786] (r12190)
+-Fix: Assert when trying to play tile sound at NW border of map (placing buyos, leveling land) [FS#1784] (r12186)
+-Fix: Wrong operator priority, hopefully harmless (r12185)
+-Fix: Take into account possible loan when AI is deciding which bridge to build, so it won't build wooden bridges everytime (r12184)
+
+0.6.0-beta4 (2008-02-18)
+------------------------------------------------------------------------
+-Feature: Allow buttons to resize in NewGRF settings window (r12172)
+-Feature: Change colour of autorail and autoroad selection when Ctrl is pressed (r12167)
+-Feature: Separate catenary transparency settings from building transparency settings (r12103)
+-Feature: Allow locking individual transparency settings so they will not be changed by pressing 'x' (r12102)
+-Feature: Add some missing VarAction2 variables (r12124)
+-Feature: Make snow appear on rail tiles dependant on track height, not on height of the lowest part of the tile (r12098)
+-Feature[newGRF]: Specify the purchase, rail and road description of a bridge (r12069)
+-Feature[newGRF]: Add support for var 12, Variational Action 2 (r12045)
+-Feature: Allow trees on shore (r12029)
+-Feature: Invisible trees are now separate from the building concept (r12022)
+-Feature: Add support for passenger engine designation for AI-use, NewGRF property 0x08 for trains (r12019)
+-Feature: Show all cargo sources (en-route from) in the station view cargo waiting list instead of just one (r11990)
+-Feature[newGRF]: Resizable industry view window on callback 3A (r11987)
+-Feature[newGRF]: Implement var 8F(random bits) during callback 28 [FS#1697] (r11985)
+-Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size (r11961)
+-Feature: Make use of new sprites added by Action5 type 0D (r11947)
+-Feature: Allow building bridge heads on more slopes (r11937)
+-Feature[newGRF]: Add support for Rivers. Rivers can currently only be placed with-in the scenario editor (r11926,r11938,r11949,r12071)
+-Feature: Generate.vbs script to allow project files generation for users unable to run generate bash script (r12123)
+-Feature: Sort the strings in languages dropdown (r11886)
+-Codechange: Drop MSVC 2003 support (r11979)
+-Fix: Test purchase list loading/loaded sprites instead of unconditionally returning a possibly non-existant sprite (r12180)
+-Fix: Return correct bridge price for AI when DC_QUERY_COST is set [FS#609] (r12171)
+-Fix: When drag&drop mode was cancelled by keyboard input, depot/group window wasn't updated [FS#337] (r12166)
+-Fix: Buffer overflow when drawing scrolling news [FS#1652, FS#1773] (r12165)
+-Fix: If a train is 'stopping' when entering a depot, do not let it leave again [FS#1705] (r12163)
+-Fix: Towns shouldn't build over houses owned by another town [FS#1757] (r12162)
+-Fix: Towns will no longer build houses > 1x1 there where should be road (with 2x2, 3x3 grid town layouts) (r12161)
+-Fix: Remove the arbitrary limit of 64 waypoints per town [FS#1744] (r12160)
+-Fix: Chance16I was now biased towards zero - round to nearest now (r12156)
+-Fix: Adjust aircraft slowing algorithm (r12144)
+-Fix: Callback 0x3D always gets a cargobit in var 0x18, independent of grf version [FS#1766] (r12142)
+-Fix: Do not allow adding tram to rail-road crossing when there is a vehicle on it (r12138)
+-Fix: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown [FS#1769] (r12137)
+-Fix: With mammoth trains disabled, maximum train length was limited to 9 (r12131)
+-Fix: Use tile index 0 for planes in the air, so it cannot have an invalid tile index [FS#1745] (r12109)
+-Fix: X/Y axis swap for station tiles in GetNearbyTile() was wrong way around [FS#1753]( r12108)
+-Fix: Loading older savegames fixes (r12096,r12097)
+-Fix: When a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road [FS#1703] (r12095)
+-Fix: Do not set station owner for buoys when merging company (r12093)
+-Fix: Keep production level within delimited boundaries, while using var result 0D/0E and than multiplying/dividing it [FS#1755] (r12092)
+-Fix: Assert when loading savegame with wrong tiletype at south map borders (r12088)
+-Fix: Check overrides only for industries when mapping newgrf entities to 'real' entities [FS#1747] (r12086)
+-Fix: Update waypoint signs when changing language (r12080)
+-Fix: Use search paths when opening console scripts (r12079)
+-Fix: When reusing a renamed deleted waypoint, keep the new name (r12076)
+-Fix: Make docks at sea flood neighboured tiles (r12072)
+-Fix: Possible deadlock when there are no houses available to build at given tile (r12062)
+-Fix: Houses with zero probability could be built (r12062)
+-Fix: Do not clear tiles when the town won't be able to build any buildings anyway (r12060)
+-Fix: Allow building 2x2 building on slopes if not explicitly forbidden (r12060)
+-Fix: It was possible to build 2x1 and 1x2 buildings on slopes even if it was not allowed (r12060)
+-Fix: Teach NPF where road vehicles and trams can reverse (r12058)
+-Fix: Ships can drive through opponents' ship depots (r12058)
+-Fix: Slowdown train when approaching 90deg turn when 90deg turns are forbidden (r12057)
+-Fix: Enable YAPF to start searching inside a wormhole [FS#1704] (r12056)
+-Fix: Another way to fix AI trying to build road through depots (r12055)
+-Fix: The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early [FS#1737] (r12052)
+-Fix: Random_func broke for desync debug (r12050)
+-Fix: Memset on multibyte array with wrong byte count (r12049)
+-Fix: Crash when centering on a vehicle (aircraft) that is outside of the map [FS#1741] (r12044)
+-Fix: Allow building transmitters and lighthouses on tree tiles [FS#1736] (r12043)
+-Fix: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
+      stored for buoys, docks, locks and depots. All these are now allowed on rivers and removal of them will revert to the
+      original water type [FS#1676] (r12042)
+-Fix: Change ownership of or remove statues when merging/bankrupting companies (r12038)
+-Fix: For station tiles, only get road types for road stops (r12036)
+-Fix: Teach YAPF where trams can reverse, and where not [FS#1702] (r12035)
+-Fix: Do not show train speed as zero after loading paused game (r12033)
+-Fix: When removing a statue, remove town statue flag for the statue owner, not current player (r12032)
+-Fix: Prevent towns from removing or claiming ownership of player owned tiles when growing [FS#1689,FS#1719] (r12031)
+-Fix: In one case trees could spread under bridges (r12024)
+-Fix: Put a better suited text in the quit-dialog [FS#1690] (r12023)
+-Fix: Restore initial intent on the invisible tree while transparent building patch setting [FS#1721] (r12018)
+-Fix: When you have more than 9 network interfaces you'll enter the wonderfull world of overflows (r12017)
+-Fix: Better work on strings in regard to gender [FS#1716] (r12015)
+-Fix: Lighthouses and transmitters were never supposed to be build on a slope (r12014)
+-Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases (r12013)
+-Fix: Enable TownRatingTestMode during cost estimation with 'shift'-key (r12012)
+-Fix: Do not consider one-corner-raised-shores to be watered tiles from all sides [FS#1701] (r12011)
+-Fix: Avoid loading sample.cat if it 'looks' incorrect, and avoid later null pointer dereferences by moving volume lookup deeper [FS#1707] (r12009)
+-Fix: Possible reading from an invalid pointer [FS#1717] (r12005)
+-Fix: When skipping Action 11 or 12, also skip belonging sprites (r12001)
+-Fix: Do entrance-slope-check for every tile of railstations (r11999)
+-Fix: Possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD [FS#1692] (r11998)
+-Fix: Update train statusbar when stopping from zero speed [FS#1706] (r11996)
+-Fix: Resize station/roadstop/dock/airport construction windows if cargo acceptance list is too long (r11993)
+-Fix: When building two rail stations close to each other (with control) so they looked like one long track trains would see them as one (r11992)
+-Fix: Resize autoreplace window to fit purchase information text if it is too large (r11989)
+-Fix: Build system ignored changes to table/control_codes.h which require strgen to be rebuilt (r11986)
+-Fix: Also draw corner shores under rail tracks (r11984)
+-Revert(r8738): Now we have shores in corners. No need to remove them from TTDP games (r11982)
+-Fix: Use unicode glyph mapping to fix up missing/shuffled sprites in original data files instead of shuffling or skipping sprites directly [FS#1698] (r11981)
+-Fix: Industries using results 0D/0E on callback cb29/35 were a bit too eager to close down (r11976)
+-Fix: Shore and sea tiles under bridges were converted to canals in old savegames [FS#1684] (r11974)
+-Fix: Use grass tiles for corner shores, if shores got replaced by ActionA [FS#1683] (r11973)
+-Fix: Old AI shouldn't build fast planes with a small airport in orders(r11972)
+-Fix: MP_ROAD can have railbits too - OPF searching over rail of diffen t owner behind crossing (r11967)
+-Fix: OPF was searching through depots and normal road stops [FS#1403, FS#1506] (r11966)
+-Fix: Tropic zone data was returned incorrectly [FS#1685] (r11964)
+-Fix: NewAI couldn't build any road vehicles when there were any tram grfs loaded (r11958)
+-Fix: Disallow building locks and docks on rapids [FS#1675] (r11956)
+-Fix: Do not allow modifying roadbits when other roadtypes would need different foundation (r11953)
+-Fix: Loading of very old savegames was broken (r11951)
+-Fix: Slope detection of bridge ramps.Helps YAPF and Trolly (r11946)
+-Fix: FileExists() failed for non latin paths (win32) (r11945)
+-Fix: Allow building drive-through road/tram stops at road/tram track that has no owner (r11944)
+-Fix: 'BRIDGE_TOO_LOW_FOR_TERRAIN'-check was wrong for steep slopes (r11936)
+-Fix[autoreplace]: Single to dualhead locomotive replacefailed when player had enough money to replace and refit one but not enough to refit the last one as well [FS#1624] (r11929)
+-Fix[autoreplace]: Autoreplace could refit train engines to the wrong cargo type if the old engine had no cargo capacity and the new one had (r11928)
+-Fix: Loading old, pre savegame version 2, savegames (r11925)
+-Fix: AI was reading wrong tile slope while building road bridge (r11917)
+-Fix: set correctly crossing state after train reversal, train leaving crossing, train crash (r11900)
+-Fix: Segmentation faults/wrong frees due uninitialized memory in the AI [FS#1658] (r11887)
+-Fix: Assert when trying to remove rail from a house or industry tile [FS#1663,FS#1665-6-7-8,FS#1680,FS#1686-7-8 FS#1715 FS#1742 FS#1771 FS#1776](r11883)
+-Fix: Crash in MP in vehicle group window if the currently selected group is deleted by another player (r11878)
+-Fix: Another way to crash competitors' train in a station (r11877)
+-Fix: Automatically sending aircraft to depot for autoreplace/renew is now triggered by the correct conditions (r11875)
+-Fix: EngineHasReplacementForPlayer() didn't look in ALL_GROUP (r11872)
+-Fix: Do not update signals after each tile when building/removing a large block of track/signals/station [FS#1074] (r11871)
+-Fix: Slow down train when approaching tile we can't enter in more cases (r11870)
+-Fix: Do not make crossing red when we can't enter it in any case (r11870)
+
 0.6.0-beta3 (2008-01-16)
 ------------------------------------------------------------------------
 -Feature: Replaced fixed size custom name array. Names are now attached to their object directly and there is no limit to the amount of names (r11822)
--- a/docs/landscape.html	Sun Feb 03 20:34:26 2008 +0000
+++ b/docs/landscape.html	Mon Mar 10 15:26:39 2008 +0000
@@ -280,6 +280,11 @@
         <td nowrap valign=top><tt>D</tt>&nbsp; </td>
         <td align=left>on grass with fence and shore or water on the free halftile</td>
        </tr>
+
+       <tr>
+        <td nowrap valign=top><tt>E</tt>&nbsp; </td>
+        <td align=left>higher part on foundation with snow, lower without snow</td>
+       </tr>
       </table>
      </li>
      <li>m5 bit 7 clear: railway track
@@ -641,6 +646,7 @@
        </li>
       </ul>
      <li>m3 bit 6 : bit 8 of house type (m4), allowing 512 different types.</li>
+     <li>m3 bit 5 : bit 6 of current animation frame (see m6)</li>
      <li>m3 bits 4..0 : triggers activated <a href="#newhouses">(newhouses)</a></li>
      <li>m4 : <a href="landscape_externals.html">town building type</a> (with m3[6] bit)</li>
      <li>m5 : see m3 bit 7</li>
@@ -648,8 +654,7 @@
       <ul>
        <li>If <a href="#newhouses">newhouses</a> is activated
         <ul>
-         <li>bits 7..3 : Current animation frame</li>
-         <li>bit 2 : free</li>
+         <li>bits 7..2 : Current animation frame (bits 5..0); bit 6 in m3</li>
         </ul>
        </li>
        <li>Standard behaviour
@@ -909,7 +914,6 @@
     <ul>
      <li>m1: <a href="#OwnershipInfo">owner</a> (for sea, rivers, and coasts normally <tt>11</tt>)</li>
      <li>m3 bits 1..0 : Water class (sea, canal or river)
-     <li>m4: Owner of the water when ship depot</li>
      <li>m4: Random data for canal or river tiles</li>
      <li>m5: tile type:
       <table>
--- a/docs/landscape_grid.html	Sun Feb 03 20:34:26 2008 +0000
+++ b/docs/landscape_grid.html	Mon Mar 10 15:26:39 2008 +0000
@@ -170,10 +170,10 @@
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX XXXX XXXX</td>
-      <td class="bits">XX<span class="free">O</span><span class="option">~ ~~</span>XX</td>
+      <td class="bits">XXX<span class="option">~ ~~</span>XX</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXX<span class="abuse">X XXXX</span></td>
-      <td class="bits"><span class="abuse">XXXX X</span>XXX</td>
+      <td class="bits"><span class="abuse">XXXX XX</span>XX</td>
       <td class="bits">XXXX <span class="abuse">XXXX</span></td>
     </tr>
     <tr>
@@ -284,7 +284,7 @@
       <td class="bits">-inherit-</td>
       <td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
       <td class="bits"><span class="free">OOOO OO</span>XX</td>
-      <td class="bits">XXXX XXXX</td>
+      <td class="bits"><span class="free">OOOO OOOO</span></td>
       <td class="bits">-inherit-</td>
       <td class="bits">XX<span class="free">OO OO</span>XX</td>
       <td class="bits"><span class="free">OOOO OOOO</span></td>
--- a/known-bugs.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/known-bugs.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -11,18 +11,18 @@
 If the bug report is closed, it has been fixed, which then can be verified
 in the latest SVN version of /trunk.
 
-Bugs for 0.6.0-beta3
+Bugs for 0.6.0-beta5
 ------------------------------------------------------------------------
 URL: http://bugs.openttd.org
 
-- 1624	Autoreplace refit fails -> crash
-- 1549	Timetable + group ID are not backed up with orders
+- 1762	Strange Autoreplace behaviour
+- 1711	Gravel and Clay have no worth
+- 1693	Removing road does not reset owner
 - 1495	Long vehicles block multistop station
 - 1487	Ending_year is never written to
 - 1473	Train not going to available platform
 - 1404	Spinner widget interprets one click as many
 - 1264	Autoreplace for multiple NewGRF DMU sets fails
 - 1140	[OSX] Not smooth moving map with touchpad
-- 1074	Large slowdown when building tracks
 - 1072	Text overflows in several windows
 -  119	Clipping problems with vehicles on slopes
--- a/os/debian/changelog	Sun Feb 03 20:34:26 2008 +0000
+++ b/os/debian/changelog	Mon Mar 10 15:26:39 2008 +0000
@@ -1,8 +1,14 @@
-openttd (0.6~svn) unstable; urgency=low
+openttd (0.6.0~beta5) unstable; urgency=low
 
-  * Unreleased SVN version. Versioned to allow normal upgrades to released versions.
+  * New upstream release.
 
- -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Mon, 26 Feb 2007 21:07:05 +0100
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Mon, 04 Mar 2008 18:06:31 +0100
+
+openttd (0.6.0~beta4-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Mon, 18 Feb 2008 20:09:29 +0100
 
 openttd (0.6.0~beta3-1) unstable; urgency=low
 
--- a/os/macosx/plistgen.sh	Sun Feb 03 20:34:26 2008 +0000
+++ b/os/macosx/plistgen.sh	Mon Mar 10 15:26:39 2008 +0000
@@ -19,7 +19,7 @@
         <key>CFBundleDevelopmentRegion</key>
         <string>English</string>
         <key>CFBundleDisplayName</key>
-        <string>Open Transport Tycoon</string>
+        <string>OpenTTD</string>
         <key>CFBundleExecutable</key>
         <string>openttd</string>
         <key>CFBundleGetInfoString</key>
--- a/os/win32/installer/install.nsi	Sun Feb 03 20:34:26 2008 +0000
+++ b/os/win32/installer/install.nsi	Mon Mar 10 15:26:39 2008 +0000
@@ -1,9 +1,9 @@
 !define APPNAME "OpenTTD"   ; Define application name
 !define APPVERSION "0.6.0"  ; Define application version
-!define INSTALLERVERSION 41 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
+!define INSTALLERVERSION 43 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
 
 !define APPURLLINK "http://www.openttd.org"
-!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}-beta3"
+!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}-beta5"
 !define APPVERSIONINTERNAL "${APPVERSION}.0" ; Needs to be of the format X.X.X.X
 
 !define MUI_ICON "..\..\..\media\openttd.ico"
@@ -97,8 +97,6 @@
 	; Overwrite files by default, but don't complain on failure
 	SetOverwrite try
 
-	; Make savegame folder
-	SetOutPath "$INSTDIR\save"
 	; Define root variable relative to installer
 	!define PATH_ROOT "..\..\..\"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/generate.vbs	Mon Mar 10 15:26:39 2008 +0000
@@ -0,0 +1,183 @@
+Option Explicit
+
+Dim FSO
+Set FSO = CreateObject("Scripting.FileSystemObject")
+
+' 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.vcproj  is for MSVC 2005
+
+Sub safety_check(filename)
+	Dim file, line, regexp, list
+
+	' Define regexp
+	Set regexp = New RegExp
+	regexp.Pattern = "#|ottdres.rc|win32.cpp|win32_v.cpp"
+	regexp.Global = True
+
+	' We use a dictionary to check duplicates
+	Set list = CreateObject("Scripting.Dictionary")
+
+	Set file = FSO.OpenTextFile(filename, 1, 0, 0)
+	While Not file.AtEndOfStream
+		line = Replace(file.ReadLine, Chr(9), "") ' Remove tabs
+		If Len(line) > 0 And Not regexp.Test(line) Then
+			line = FSO.GetFileName(line)
+			if list.Exists(line) Then
+				WScript.Echo " !! ERROR !!" _
+				& vbCrLf & "" _
+				& vbCrLf & "The filename '" & line & "' is already used in this project." _
+				& vbCrLf & "Because MSVC uses one single directory for all object files, it" _
+				& vbCrLf & "cannot handle filenames with the same name inside the same project." _
+				& vbCrLf & "Please rename either one of the file and try generating again." _
+				& vbCrLf & "" _
+				& vbCrLf & " !! ERROR !!"
+				WScript.Quit(1)
+			End If
+			list.Add line, line
+		End If
+	Wend
+	file.Close
+End Sub
+
+Function load_main_data(filename)
+	Dim res, file, line, deep, skip, first_time
+	res = ""
+	' Read the source.list and process it
+	Set file = FSO.OpenTextFile(filename, 1, 0, 0)
+	While Not file.AtEndOfStream
+		line = Replace(file.ReadLine, Chr(9), "") ' Remove tabs
+		If Len(line) > 0 Then
+			Select Case Split(line, " ")(0)
+				Case "#end"
+					If deep = skip Then skip = skip - 1
+					deep = deep - 1
+				Case "#else"
+					If deep = skip Then
+						skip = skip - 1
+					ElseIf deep - 1 = skip Then
+						skip = skip + 1
+					End If
+				Case "#if"
+					line = Replace(line, "#if ", "")
+					If deep = skip And ( _
+						line = "SDL" Or _
+						line = "PNG" Or _
+						line = "WIN32" Or _
+						line = "MSVC" Or _
+						line = "DIRECTMUSIC" Or _
+						line = "NO_THREADS" _
+					) Then skip = skip + 1
+					deep = deep + 1
+				Case "#"
+					if deep = skip Then
+						line = Replace(line, "# ", "")
+						if first_time <> 0 Then
+							res = res & "		</Filter>" & vbCrLf
+						Else
+							first_time = 1
+						End If
+						res = res & _
+						"		<Filter" & vbCrLf & _
+						"			Name=" & Chr(34) & line & Chr(34) & vbCrLf & _
+						"			>" & vbCrLf
+					End If
+				Case Else
+					If deep = skip Then
+						line = Replace(line, "/" ,"\")
+						res = res & _
+						"			<File" & vbCrLf & _
+						"				RelativePath=" & Chr(34) & ".\..\src\" & line & Chr(34) & vbCrLf & _
+						"				>" & vbCrLf & _
+						"			</File>" & vbCrLf
+					End If
+			End Select
+		End If
+	Wend
+	res = res & "		</Filter>"
+	file.Close()
+	load_main_data = res
+End Function
+
+Function load_lang_data(dir)
+	Dim res, folder, file
+	res = ""
+	Set folder = FSO.GetFolder(dir)
+	For Each file In folder.Files
+		file = FSO.GetFileName(file)
+		If FSO.GetExtensionName(file) = "txt" Then
+			file = Left(file, Len(file) - 4)
+			res = res _
+			& vbCrLf & "		<File" _
+			& vbCrLf & "			RelativePath=" & Chr(34) & "..\src\lang\" & file & ".txt" & Chr(34) _
+			& vbCrLf & "			>" _
+			& vbCrLf & "			<FileConfiguration" _
+			& vbCrLf & "				Name=" & Chr(34) & "Debug|Win32" & Chr(34) _
+			& vbCrLf & "				>" _
+			& vbCrLf & "				<Tool" _
+			& vbCrLf & "					Name=" & Chr(34) & "VCCustomBuildTool" & Chr(34) _
+			& vbCrLf & "					Description=" & Chr(34) & "Generating " & file & " language file" & Chr(34) _
+			& vbCrLf & "					CommandLine=" & Chr(34) & "..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;" & Chr(34) _
+			& vbCrLf & "					AdditionalDependencies=" & Chr(34) & Chr(34) _
+			& vbCrLf & "					Outputs=" & Chr(34) & "..\bin\lang\" & file & ".lng" & Chr(34) _
+			& vbCrLf & "				/>" _
+			& vbCrLf & "			</FileConfiguration>" _
+			& vbCrLf & "		</File>"
+		End If
+	Next
+	load_lang_data = res
+End Function
+
+Sub generate(data, dest)
+	Dim srcfile, destfile, line
+	WScript.Echo "Generating " & FSO.GetFileName(dest) & "..."
+	Set srcfile = FSO.OpenTextFile(dest & ".in", 1, 0, 0)
+	Set destfile = FSO.CreateTextFile(dest, -1, 0)
+
+	' Everything above the !!FILES!! marker
+	line = srcfile.ReadLine()
+	While line <> "!!FILES!!"
+		If len(line) > 0 Then destfile.WriteLine(line)
+		line = srcfile.ReadLine()
+	Wend
+
+	' Our generated content
+	destfile.WriteLine(data)
+
+	' Everything below the !!FILES!! marker
+	While Not srcfile.AtEndOfStream
+		line = srcfile.ReadLine()
+		If len(line) > 0 Then destfile.WriteLine(line)
+	Wend
+	srcfile.Close()
+	destfile.Close()
+End Sub
+
+Dim ROOT_DIR
+ROOT_DIR = FSO.GetFolder("..").Path
+If Not FSO.FileExists(ROOT_DIR & "/source.list") Then
+	ROOT_DIR = FSO.GetFolder(".").Path
+End If
+If Not FSO.FileExists(ROOT_DIR & "/source.list") Then
+	WScript.Echo "Can't find source.list, needed in order to make this run." _
+	& vbCrLf & "Please go to either the project dir, or the root dir of a clean SVN checkout."
+	WScript.Quit(1)
+End If
+
+safety_check ROOT_DIR & "/source.list"
+
+Dim openttd
+openttd = load_main_data(ROOT_DIR &"/source.list")
+generate openttd, ROOT_DIR & "/projects/openttd_vs80.vcproj"
+generate openttd, ROOT_DIR & "/projects/openttd_vs90.vcproj"
+
+Dim lang
+lang = load_lang_data(ROOT_DIR & "/src/lang")
+generate lang, ROOT_DIR & "/projects/langs_vs80.vcproj"
+generate lang, ROOT_DIR & "/projects/langs_vs90.vcproj"
--- a/projects/openttd_vs80.vcproj	Sun Feb 03 20:34:26 2008 +0000
+++ b/projects/openttd_vs80.vcproj	Mon Mar 10 15:26:39 2008 +0000
@@ -456,6 +456,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\alloc_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\articulated_vehicles.cpp"
 				>
 			</File>
@@ -468,6 +472,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\bitmath_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\bmp.cpp"
 				>
 			</File>
@@ -496,14 +504,6 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\core\bitmath_func.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\core\random_func.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\currency.cpp"
 				>
 			</File>
@@ -528,6 +528,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\widgets\dropdown.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\economy.cpp"
 				>
 			</File>
@@ -676,6 +680,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\random_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\rev.cpp"
 				>
 			</File>
@@ -760,10 +768,6 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\widgets\dropdown.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\win32.cpp"
 				>
 			</File>
@@ -784,10 +788,30 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\alloc_func.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\articulated_vehicles.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\autoreplace_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\autoslope.h"
 				>
 			</File>
@@ -796,10 +820,26 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\bitmath_func.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\bmp.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\bridge.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\callback_table.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\cargo_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\cargopacket.h"
 				>
 			</File>
@@ -808,7 +848,15 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\command.h"
+				RelativePath=".\..\src\cmd_helper.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\command_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\command_type.h"
 				>
 			</File>
 			<File
@@ -816,23 +864,15 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\core\bitmath_func.hpp"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\core\math_func.hpp"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\core\random_func.hpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\currency.h"
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\date.h"
+				RelativePath=".\..\src\date_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\date_type.h"
 				>
 			</File>
 			<File
@@ -848,7 +888,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\direction.h"
+				RelativePath=".\..\src\direction_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\direction_type.h"
 				>
 			</File>
 			<File
@@ -860,7 +904,23 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\economy.h"
+				RelativePath=".\..\src\widgets\dropdown_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\widgets\dropdown_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\economy_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\economy_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\endian_func.hpp"
 				>
 			</File>
 			<File
@@ -868,6 +928,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\enum_type.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\fileio.h"
 				>
 			</File>
@@ -896,7 +960,15 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\gfx.h"
+				RelativePath=".\..\src\core\geometry_type.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfx_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfx_type.h"
 				>
 			</File>
 			<File
@@ -908,6 +980,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\group_gui.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\gui.h"
 				>
 			</File>
@@ -920,6 +996,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\industry_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\landscape.h"
 				>
 			</File>
@@ -928,7 +1008,7 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\map.h"
+				RelativePath=".\..\src\core\math_func.hpp"
 				>
 			</File>
 			<File
@@ -964,6 +1044,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\network\network_internal.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\network\network_server.h"
 				>
 			</File>
@@ -1004,6 +1088,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_generic.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_house.h"
 				>
 			</File>
@@ -1072,11 +1160,19 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\order.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\overflowsafe_type.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\pathfind.h"
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\player.h"
+				RelativePath=".\..\src\player_base.h"
 				>
 			</File>
 			<File
@@ -1084,6 +1180,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\player_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\player_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\player_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\queue.h"
 				>
 			</File>
@@ -1092,10 +1200,42 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\rail_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\road_cmd.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\road_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_internal.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\roadveh.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\saveload.h"
 				>
 			</File>
@@ -1112,7 +1252,23 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\settings.h"
+				RelativePath=".\..\src\settings_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings_internal.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ship.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signal_func.h"
 				>
 			</File>
 			<File
@@ -1120,15 +1276,19 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\signal_func.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\slope.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\sound.h"
+				RelativePath=".\..\src\slope_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\slope_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound_type.h"
 				>
 			</File>
 			<File
@@ -1152,7 +1312,27 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\string.h"
+				RelativePath=".\..\src\string_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\string_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\strings_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\strings_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\terraform_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\textbuf_gui.h"
 				>
 			</File>
 			<File
@@ -1168,7 +1348,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\tile.h"
+				RelativePath=".\..\src\tile_cmd.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tile_type.h"
 				>
 			</File>
 			<File
@@ -1180,6 +1364,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\town_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\track_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\track_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\train.h"
 				>
 			</File>
@@ -1196,11 +1392,19 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\unmovable.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\variables.h"
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\vehicle.h"
+				RelativePath=".\..\src\vehicle_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle_func.h"
 				>
 			</File>
 			<File
@@ -1208,7 +1412,7 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\viewport.h"
+				RelativePath=".\..\src\vehicle_type.h"
 				>
 			</File>
 			<File
@@ -1228,23 +1432,23 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\window.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\widgets\dropdown.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\widgets\dropdown_type.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\widgets\dropdown_func.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\zoom.hpp"
+				RelativePath=".\..\src\window_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\window_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\window_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\zoom_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\zoom_type.h"
 				>
 			</File>
 		</Filter>
@@ -1544,7 +1748,7 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\table\roadveh.h"
+				RelativePath=".\..\src\table\roadveh_movement.h"
 				>
 			</File>
 			<File
@@ -1768,6 +1972,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_generic.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_house.cpp"
 				>
 			</File>
@@ -1844,6 +2052,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\tile_map.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\town_map.h"
 				>
 			</File>
@@ -1984,10 +2196,6 @@
 			Name="YAPF"
 			>
 			<File
-				RelativePath=".\..\src\yapf\follow_track.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\yapf\follow_track.hpp"
 				>
 			</File>
@@ -2012,10 +2220,6 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\yapf\yapf_common.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\yapf\yapf_common.hpp"
 				>
 			</File>
--- a/projects/openttd_vs90.vcproj	Sun Feb 03 20:34:26 2008 +0000
+++ b/projects/openttd_vs90.vcproj	Mon Mar 10 15:26:39 2008 +0000
@@ -453,6 +453,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\alloc_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\articulated_vehicles.cpp"
 				>
 			</File>
@@ -465,6 +469,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\bitmath_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\bmp.cpp"
 				>
 			</File>
@@ -493,14 +501,6 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\core\bitmath_func.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\core\random_func.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\currency.cpp"
 				>
 			</File>
@@ -525,6 +525,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\widgets\dropdown.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\economy.cpp"
 				>
 			</File>
@@ -665,6 +669,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\random_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\rev.cpp"
 				>
 			</File>
@@ -749,10 +757,6 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\widgets\dropdown.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\win32.cpp"
 				>
 			</File>
@@ -777,10 +781,30 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\alloc_func.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\articulated_vehicles.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\autoreplace_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\autoslope.h"
 				>
 			</File>
@@ -789,10 +813,26 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\bitmath_func.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\bmp.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\bridge.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\callback_table.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\cargo_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\cargopacket.h"
 				>
 			</File>
@@ -801,7 +841,15 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\command.h"
+				RelativePath=".\..\src\cmd_helper.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\command_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\command_type.h"
 				>
 			</File>
 			<File
@@ -809,23 +857,15 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\core\bitmath_func.hpp"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\core\math_func.hpp"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\core\random_func.hpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\currency.h"
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\date.h"
+				RelativePath=".\..\src\date_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\date_type.h"
 				>
 			</File>
 			<File
@@ -841,7 +881,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\direction.h"
+				RelativePath=".\..\src\direction_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\direction_type.h"
 				>
 			</File>
 			<File
@@ -853,7 +897,23 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\economy.h"
+				RelativePath=".\..\src\widgets\dropdown_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\widgets\dropdown_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\economy_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\economy_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\endian_func.hpp"
 				>
 			</File>
 			<File
@@ -861,6 +921,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\core\enum_type.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\fileio.h"
 				>
 			</File>
@@ -881,7 +945,15 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\gfx.h"
+				RelativePath=".\..\src\core\geometry_type.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfx_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfx_type.h"
 				>
 			</File>
 			<File
@@ -893,6 +965,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\group_gui.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\gui.h"
 				>
 			</File>
@@ -905,6 +981,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\industry_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\landscape.h"
 				>
 			</File>
@@ -913,7 +993,7 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\map.h"
+				RelativePath=".\..\src\core\math_func.hpp"
 				>
 			</File>
 			<File
@@ -949,6 +1029,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\network\network_internal.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\network\network_server.h"
 				>
 			</File>
@@ -985,6 +1069,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_generic.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_house.h"
 				>
 			</File>
@@ -1053,11 +1141,19 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\order.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\overflowsafe_type.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\pathfind.h"
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\player.h"
+				RelativePath=".\..\src\player_base.h"
 				>
 			</File>
 			<File
@@ -1065,6 +1161,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\player_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\player_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\player_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\queue.h"
 				>
 			</File>
@@ -1073,10 +1181,42 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\rail_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\core\random_func.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\road_cmd.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\road_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_internal.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\roadveh.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\saveload.h"
 				>
 			</File>
@@ -1093,7 +1233,23 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\settings.h"
+				RelativePath=".\..\src\settings_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings_internal.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ship.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signal_func.h"
 				>
 			</File>
 			<File
@@ -1101,15 +1257,19 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\signal_func.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\slope.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\sound.h"
+				RelativePath=".\..\src\slope_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\slope_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound_type.h"
 				>
 			</File>
 			<File
@@ -1133,7 +1293,27 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\string.h"
+				RelativePath=".\..\src\string_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\string_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\strings_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\strings_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\terraform_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\textbuf_gui.h"
 				>
 			</File>
 			<File
@@ -1149,7 +1329,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\tile.h"
+				RelativePath=".\..\src\tile_cmd.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\tile_type.h"
 				>
 			</File>
 			<File
@@ -1161,6 +1345,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\town_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\track_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\track_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\train.h"
 				>
 			</File>
@@ -1177,11 +1373,19 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\unmovable.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\variables.h"
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\vehicle.h"
+				RelativePath=".\..\src\vehicle_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle_func.h"
 				>
 			</File>
 			<File
@@ -1189,7 +1393,7 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\viewport.h"
+				RelativePath=".\..\src\vehicle_type.h"
 				>
 			</File>
 			<File
@@ -1209,23 +1413,23 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\window.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\widgets\dropdown.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\widgets\dropdown_type.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\widgets\dropdown_func.h"
-				>
-			</File>
-			<File
-				RelativePath=".\..\src\zoom.hpp"
+				RelativePath=".\..\src\window_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\window_gui.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\window_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\zoom_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\zoom_type.h"
 				>
 			</File>
 		</Filter>
@@ -1525,7 +1729,7 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\table\roadveh.h"
+				RelativePath=".\..\src\table\roadveh_movement.h"
 				>
 			</File>
 			<File
@@ -1745,6 +1949,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_generic.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_house.cpp"
 				>
 			</File>
@@ -1821,6 +2029,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\tile_map.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\town_map.h"
 				>
 			</File>
@@ -1961,10 +2173,6 @@
 			Name="YAPF"
 			>
 			<File
-				RelativePath=".\..\src\yapf\follow_track.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\yapf\follow_track.hpp"
 				>
 			</File>
@@ -1989,10 +2197,6 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\yapf\yapf_common.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\..\src\yapf\yapf_common.hpp"
 				>
 			</File>
--- a/projects/strgen_vs80.vcproj	Sun Feb 03 20:34:26 2008 +0000
+++ b/projects/strgen_vs80.vcproj	Mon Mar 10 15:26:39 2008 +0000
@@ -113,6 +113,10 @@
 			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
 			>
 			<File
+				RelativePath="..\src\core\alloc_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath="..\src\strgen\strgen.cpp"
 				>
 			</File>
@@ -122,7 +126,19 @@
 			</File>
 		</Filter>
 		<File
-			RelativePath="..\src\macros.h"
+			RelativePath="..\src\core\alloc_func.hpp"
+			>
+		</File>
+		<File
+			RelativePath="..\src\table\control_codes.h"
+			>
+		</File>
+		<File
+			RelativePath="..\src\debug.h"
+			>
+		</File>
+		<File
+			RelativePath="..\src\core\endian_func.hpp"
 			>
 		</File>
 		<File
--- a/projects/strgen_vs90.vcproj	Sun Feb 03 20:34:26 2008 +0000
+++ b/projects/strgen_vs90.vcproj	Mon Mar 10 15:26:39 2008 +0000
@@ -113,6 +113,10 @@
 			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
 			>
 			<File
+				RelativePath="..\src\core\alloc_func.cpp"
+				>
+			</File>
+			<File
 				RelativePath="..\src\strgen\strgen.cpp"
 				>
 			</File>
@@ -122,7 +126,19 @@
 			</File>
 		</Filter>
 		<File
-			RelativePath="..\src\macros.h"
+			RelativePath="..\src\core\alloc_func.hpp"
+			>
+		</File>
+		<File
+			RelativePath="..\src\table\control_codes.h"
+			>
+		</File>
+		<File
+			RelativePath="..\src\debug.h"
+			>
+		</File>
+		<File
+			RelativePath="..\src\core\endian_func.hpp"
 			>
 		</File>
 		<File
--- a/readme.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/readme.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1,6 +1,6 @@
 OpenTTD README
-Last updated:    2008-01-16
-Release version: 0.6.0-beta3
+Last updated:    2008-03-04
+Release version: 0.6.0-beta5
 ------------------------------------------------------------------------
 
 
@@ -11,6 +11,9 @@
  * 2.1 Reporting Bugs
 3.0) Supported Platforms
 4.0) Running OpenTTD
+ * 4.1 (Required) 3rd party files
+ * 4.2 OpenTTD directories
+ * 4.3 Portable Installations (External Media)
 5.0) OpenTTD features
 6.0) Configuration File
 7.0) Compiling
@@ -83,26 +86,100 @@
 4.0) Running OpenTTD:
 ---- ----------------
 
-Before you run OpenTTD, you need to put the game's datafiles into the data/
-subdirectory. You need the following files from the original version
-of TTD as OpenTTD makes use of the original TTD artwork.
+OpenTTD looks in multiple locations to find the required data files (described
+in section 4.2). Installing any 3rd party files into a "shared" location has
+the advantage that you only need to do this step once, rather than copying the
+data files into all OpenTTD versions you have.
+Savegames, screenshots, etc are saved relative to the config file (openttd.cfg)
+currently being used. This means that if you use a config file in one of the
+shared directories, savegames will reside in the save/ directory next to the
+openttd.cfg file there.
+If you want savegames and screenshots in the directory where the OpenTTD binary
+resides, simply have your config file in that location. But if you remove this
+config file, savegames will still be in this directory (see notes in section 4.2)
+
+4.1) (Required) 3rd party files:
+---- ---------------------------
+
+Before you run OpenTTD, you need to put the game's datafiles into a data/
+directory which can be located in various places addressed in the following
+section.
+As OpenTTD makes use of the original TTD artwork you will need the files listed
+below, which you can find on a Transport Tycoon Deluxe CD-ROM.
+The Windows installer optionally can copy these files from that CD-ROM.
 
 List of the required files:
-sample.cat
-trg1r.grf
-trgcr.grf
-trghr.grf
-trgir.grf
-trgtr.grf
+	- sample.cat
+	- trg1r.grf
+	- trgcr.grf
+	- trghr.grf
+	- trgir.grf
+	- trgtr.grf
 
-(Alternatively you can use the TTD GRF files from the DOS version: TRG1.GRF,
-TRGC.GRF, TRGH.GRF, TRGI.GRF, TRGT.GRF.
+Alternatively you can use the TTD GRF files from the DOS version:
+	- TRG1.GRF
+	- 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.
+If you want the TTD music, copy the gm/ folder from the Windows version
+of TTD to your OpenTTD folder (not your data folder - also explained in
+the following sections).
 
-You can change the data path (which contains savegames as well) in
-Makefile.config by setting DATA_DIR_PREFIX and USE_HOMEDIR.
+Do NOT copy files included with OpenTTD into "shared" directories (explained in
+the following sections) as sooner or later you will run into graphical glitches
+when using other versions of the game.
+
+4.2) OpenTTD directories
+---- -------------------------------
+
+The TTD artwork files listed in the section 4.1 "(Required) 3rd party files"
+can be placed in a few different locations:
+	1. The current working directory (from where you started OpenTTD)
+	2. Your personal directory
+		Windows: C:\Documents and Settings\<username>\My Documents\OpenTTD
+		Mac OSX: ~/Documents/OpenTTD
+		Linux:   ~/.openttd
+	3. The shared directory
+		Windows: C:\Documents and Settings\All Users\Documents\OpenTTD
+		Mac OSX: /Library/Application Support/OpenTTD
+		Linux:   not available
+	4. The binary directory (where the OpenTTD executable is)
+		Windows: C:\Program Files\OpenTTD
+		Linux:   /usr/games
+	5. The installation directory (Linux only)
+		Linux:   /usr/share/games/openttd
+	6. The application bundle (Mac OSX only)
+		It includes the OTTD files (grf+lng) and it will work as long as they aren't touched
+
+Notes:
+	- Linux in the previous list means .deb, but most paths should be similar for others.
+	- The previous search order is also used for newgrfs and openttd.cfg.
+	- If openttd.cfg is not found, then it will be created using the 2, 4, 1, 3, 5 order.
+	- Savegames will be relative to the config file only if there is no save/
+	  directory in paths with higher priority than the config file path, but
+	  autosaves and screenshots will always be relative to the config file.
+
+The prefered setup:
+Place 3rd party files in shared directory (or in personal directory if you don't
+have write access on shared directory) and have your openttd.cfg config file in
+personal directory (where the game will then also place savegames and screenshots).
+
+
+4.3) Portable Installations (External Media):
+---- ----------------------------------------
+
+You can install OpenTTD on external media so you can take it with you, i.e.
+using a USB key, or a USB HDD, etc.
+Create a directory where you shall store the game in (i.e. OpenTTD/).
+Copy the binary (OpenTTD.exe, OpenTTD.app, openttd, etc), data/ and your
+openttd.cfg to this directory.
+You can copy binaries for any operating system into this directory, which will
+allow you to play the game on nearly any computer you can attach the external
+media to.
+As always - additional grf files are stored in the data/ dir (for details,
+again, see section 4.1).
 
 
 5.0) OpenTTD features:
@@ -286,6 +363,7 @@
   Bjarni Corfitzen (Bjarni)      - MacOSX port, coder and vehicles
   Matthijs Kooijman (blathijs)   - Pathfinder-guru, pool rework
   Loïc Guilloux (glx)            - General coding
+  Christoph Elsenhans (frosch)   - General coding
   Jaroslav Mazanec (KUDr)        - YAPG (Yet Another Pathfinder God) ;)
   Jonathan Coome (Maedhros)      - High priest of the newGRF Temple
   Attila Bán (MiHaMiX)           - WebTranslator, Nightlies, Wiki and bugtracker host
--- a/source.list	Sun Feb 03 20:34:26 2008 +0000
+++ b/source.list	Mon Mar 10 15:26:39 2008 +0000
@@ -1,8 +1,10 @@
 # Source Files
 airport.cpp
+core/alloc_func.cpp
 articulated_vehicles.cpp
 autoreplace_cmd.cpp
 aystar.cpp
+core/bitmath_func.cpp
 bmp.cpp
 callback_table.cpp
 cargopacket.cpp
@@ -10,14 +12,13 @@
 command.cpp
 console.cpp
 console_cmds.cpp
-core/bitmath_func.cpp
-core/random_func.cpp
 currency.cpp
 date.cpp
 debug.cpp
 dedicated.cpp
 depot.cpp
 driver.cpp
+widgets/dropdown.cpp
 economy.cpp
 elrail.cpp
 engine.cpp
@@ -60,6 +61,7 @@
 players.cpp
 queue.cpp
 rail.cpp
+core/random_func.cpp
 rev.cpp
 road.cpp
 saveload.cpp
@@ -95,7 +97,6 @@
 viewport.cpp
 waypoint.cpp
 widget.cpp
-widgets/dropdown.cpp
 #if WIN32
 	win32.cpp
 #end
@@ -104,27 +105,42 @@
 # Header Files
 aircraft.h
 airport.h
+core/alloc_func.hpp
 articulated_vehicles.h
+autoreplace_base.h
+autoreplace_func.h
+autoreplace_gui.h
+autoreplace_type.h
 autoslope.h
 aystar.h
+core/bitmath_func.hpp
 bmp.h
+bridge.h
+callback_table.h
+cargo_type.h
 cargopacket.h
 cargotype.h
-command.h
+cmd_helper.h
+command_func.h
+command_type.h
 console.h
-core/bitmath_func.hpp
-core/math_func.hpp
-core/random_func.hpp
 currency.h
-date.h
+date_func.h
+date_type.h
 debug.h
 video/dedicated_v.h
 depot.h
-direction.h
+direction_func.h
+direction_type.h
 music/dmusic.h
 driver.h
-economy.h
+widgets/dropdown_func.h
+widgets/dropdown_type.h
+economy_func.h
+economy_type.h
+core/endian_func.hpp
 engine.h
+core/enum_type.hpp
 fileio.h
 fios.h
 fontcache.h
@@ -132,15 +148,19 @@
 fsmport.h
 functions.h
 genworld.h
-gfx.h
+core/geometry_type.hpp
+gfx_func.h
+gfx_type.h
 gfxinit.h
 group.h
+group_gui.h
 gui.h
 heightmap.h
 industry.h
+industry_type.h
 landscape.h
 livery.h
-map.h
+core/math_func.hpp
 md5.h
 mixer.h
 music.h
@@ -149,6 +169,7 @@
 network/network_data.h
 network/network_gamelist.h
 network/network_gui.h
+network/network_internal.h
 network/network_server.h
 network/network_udp.h
 newgrf.h
@@ -159,6 +180,7 @@
 newgrf_config.h
 newgrf_engine.h
 newgrf_fsmports.h
+newgrf_generic.h
 newgrf_house.h
 newgrf_industries.h
 newgrf_industrytiles.h
@@ -176,50 +198,79 @@
 video/null_v.h
 oldpool.h
 openttd.h
+order.h
+core/overflowsafe_type.hpp
 pathfind.h
-player.h
+player_base.h
 player_face.h
+player_func.h
+player_gui.h
+player_type.h
 queue.h
 rail.h
+rail_gui.h
+rail_type.h
+core/random_func.hpp
 road_cmd.h
+road_func.h
+road_gui.h
+road_internal.h
+road_type.h
+roadveh.h
 saveload.h
 screenshot.h
 sound/sdl_s.h
 video/sdl_v.h
-settings.h
+settings_func.h
+settings_internal.h
+settings_type.h
+ship.h
+signal_func.h
 signs.h
-signal_func.h
-slope.h
-sound.h
+slope_func.h
+slope_type.h
+sound_func.h
+sound_type.h
 sprite.h
 spritecache.h
 station.h
 station_gui.h
 stdafx.h
-string.h
+string_func.h
+string_type.h
+strings_func.h
+strings_type.h
+terraform_gui.h
+textbuf_gui.h
 texteff.hpp
 tgp.h
 thread.h
-tile.h
+tile_cmd.h
+tile_type.h
 timetable.h
 town.h
+town_type.h
+track_func.h
+track_type.h
 train.h
 transparency.h
 transparency_gui.h
 tunnelbridge.h
+unmovable.h
 variables.h
-vehicle.h
+vehicle_base.h
+vehicle_func.h
 vehicle_gui.h
-viewport.h
+vehicle_type.h
 waypoint.h
 music/win32_m.h
 sound/win32_s.h
 video/win32_v.h
-window.h
-widgets/dropdown.h
-widgets/dropdown_type.h
-widgets/dropdown_func.h
-zoom.hpp
+window_func.h
+window_gui.h
+window_type.h
+zoom_func.h
+zoom_type.h
 
 # GUI Source Code
 aircraft_gui.cpp
@@ -297,7 +348,7 @@
 table/namegen.h
 table/palettes.h
 table/road_land.h
-table/roadveh.h
+table/roadveh_movement.h
 table/sprites.h
 table/station_land.h
 ../objs/langs/table/strings.h
@@ -360,6 +411,7 @@
 newgrf_config.cpp
 newgrf_engine.cpp
 newgrf_fsmports.cpp
+newgrf_generic.cpp
 newgrf_house.cpp
 newgrf_industries.cpp
 newgrf_industrytiles.cpp
@@ -380,6 +432,7 @@
 road_map.cpp
 road_map.h
 station_map.h
+tile_map.h
 town_map.h
 tree_map.h
 tunnel_map.cpp
@@ -418,14 +471,12 @@
 network/core/udp.h
 
 # YAPF
-yapf/follow_track.cpp
 yapf/follow_track.hpp
 yapf/nodelist.hpp
 yapf/track_dir.hpp
 yapf/yapf.h
 yapf/yapf.hpp
 yapf/yapf_base.hpp
-yapf/yapf_common.cpp
 yapf/yapf_common.hpp
 yapf/yapf_costbase.hpp
 yapf/yapf_costcache.hpp
--- a/src/ai/default/default.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/ai/default/default.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -69,10 +69,9 @@
 };
 
 
-static TrackBits GetRailTrackStatus(TileIndex tile)
+static inline TrackBits GetRailTrackStatus(TileIndex tile)
 {
-	uint32 r = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0);
-	return (TrackBits)(byte) (r | r >> 8);
+	return TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0));
 }
 
 
@@ -112,8 +111,8 @@
 
 			/* not profitable? */
 			if (v->age >= 730 &&
-					v->profit_last_year < _price.station_value * 5 &&
-					v->profit_this_year < _price.station_value * 5) {
+					v->profit_last_year < _price.station_value * 5 * 256 &&
+					v->profit_this_year < _price.station_value * 5 * 256) {
 				_players_ai[p->index].state_counter = 0;
 				_players_ai[p->index].state = AIS_SELL_VEHICLE;
 				_players_ai[p->index].cur_veh = v;
@@ -1604,7 +1603,7 @@
 
 static bool AiCheckTrackResources(TileIndex tile, const AiDefaultBlockData *p, byte cargo)
 {
-	uint rad = (_patches.modified_catchment) ? CA_TRAIN : 4;
+	uint rad = (_patches.modified_catchment) ? CA_TRAIN : CA_UNMODIFIED;
 
 	for (; p->mode != 4; p++) {
 		AcceptedCargo values;
@@ -1902,7 +1901,7 @@
 	bool flag;
 };
 
-static bool AiEnumFollowTrack(TileIndex tile, AiRailPathFindData *a, int track, uint length, byte *state)
+static bool AiEnumFollowTrack(TileIndex tile, AiRailPathFindData *a, int track, uint length)
 {
 	if (a->flag) return true;
 
@@ -2198,26 +2197,55 @@
 	_players_ai[p->index].cur_tile_a += TileOffsByDiagDir(_players_ai[p->index].cur_dir_a);
 
 	if (arf.best_ptr[0] & 0x80) {
-		int i;
-		int32 bridge_len = GetTunnelBridgeLength(arf.bridge_end_tile, _players_ai[p->index].cur_tile_a);
-
-		/* Figure out which (rail)bridge type to build
-		 * start with best bridge, then go down to worse and worse bridges
-		 * unnecessary to check for worst bridge (i=0), since AI will always build
-		 * that. AI is so fucked up that fixing this small thing will probably not
-		 * solve a thing
-		 */
-		for (i = MAX_BRIDGES - 1; i != 0; i--) {
-			if (CheckBridge_Stuff(i, bridge_len)) {
-				CommandCost cost = DoCommand(arf.bridge_end_tile, _players_ai[p->index].cur_tile_a, i | (_players_ai[p->index].railtype_to_use << 8), DC_AUTO, CMD_BUILD_BRIDGE);
-				if (CmdSucceeded(cost) && cost.GetCost() < (p->player_money >> 5)) break;
+		TileIndex t1 = _players_ai[p->index].cur_tile_a;
+		TileIndex t2 = arf.bridge_end_tile;
+
+		int32 bridge_len = GetTunnelBridgeLength(t1, t2);
+
+		DiagDirection dir = (TileX(t1) == TileX(t2) ? DIAGDIR_SE : DIAGDIR_SW);
+		Track track = AxisToTrack(DiagDirToAxis(dir));
+
+		if (t2 < t1) dir = ReverseDiagDir(dir);
+
+		/* try to build a long rail instead of bridge... */
+		bool fail = false;
+		CommandCost cost;
+		TileIndex t = t1;
+
+		/* try to build one rail on each tile - can't use CMD_BUILD_RAILROAD_TRACK now, it can build one part of track without failing */
+		do {
+			cost = DoCommand(t, _players_ai[p->index].railtype_to_use, track, DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL);
+			/* do not allow building over existing track */
+			if (CmdFailed(cost) || IsTileType(t, MP_RAILWAY)) {
+				fail = true;
+				break;
 			}
+			t += TileOffsByDiagDir(dir);
+		} while (t != t2);
+
+		/* can we build long track? */
+		if (!fail) cost = DoCommand(t1, t2, _players_ai[p->index].railtype_to_use | (track << 4), DC_AUTO | DC_NO_WATER, CMD_BUILD_RAILROAD_TRACK);
+
+		if (!fail && CmdSucceeded(cost) && cost.GetCost() <= p->player_money) {
+			DoCommand(t1, t2, _players_ai[p->index].railtype_to_use | (track << 4), DC_AUTO | DC_NO_WATER | DC_EXEC, CMD_BUILD_RAILROAD_TRACK);
+		} else {
+
+			/* Figure out which (rail)bridge type to build
+			 * start with best bridge, then go down to worse and worse bridges
+			 * unnecessary to check for worst bridge (i=0), since AI will always build that. */
+			int i;
+			for (i = MAX_BRIDGES - 1; i != 0; i--) {
+				if (CheckBridge_Stuff(i, bridge_len)) {
+					CommandCost cost = DoCommand(t1, t2, i | (_players_ai[p->index].railtype_to_use << 8), DC_AUTO, CMD_BUILD_BRIDGE);
+					if (CmdSucceeded(cost) && cost.GetCost() < (p->player_money >> 1) && cost.GetCost() < ((p->player_money + _economy.max_loan - p->current_loan) >> 5)) break;
+				}
+			}
+
+			/* Build it */
+			DoCommand(t1, t2, i | (_players_ai[p->index].railtype_to_use << 8), DC_AUTO | DC_EXEC, CMD_BUILD_BRIDGE);
 		}
 
-		// Build it
-		DoCommand(arf.bridge_end_tile, _players_ai[p->index].cur_tile_a, i | (_players_ai[p->index].railtype_to_use << 8), DC_AUTO | DC_EXEC, CMD_BUILD_BRIDGE);
-
-		_players_ai[p->index].cur_tile_a = arf.bridge_end_tile;
+		_players_ai[p->index].cur_tile_a = t2;
 		_players_ai[p->index].state_counter = 0;
 	} else if (arf.best_ptr[0] & 0x40) {
 		// tunnel
@@ -2639,8 +2667,7 @@
 		_cleared_town = NULL;
 
 		if (p->mode == 2) {
-			if (IsTileType(c, MP_ROAD) &&
-					GetRoadTileType(c) == ROAD_TILE_NORMAL &&
+			if (IsNormalRoadTile(c) &&
 					(GetRoadBits(c, ROADTYPE_ROAD) & p->attr) != 0) {
 				roadflag |= 2;
 
@@ -2682,7 +2709,7 @@
 
 			if (GetTileSlope(c, NULL) != SLOPE_FLAT) return CMD_ERROR;
 
-			if (!IsTileType(c, MP_ROAD) || GetRoadTileType(c) != ROAD_TILE_NORMAL) {
+			if (!IsNormalRoadTile(c)) {
 				ret = DoCommand(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR);
 				if (CmdFailed(ret)) return CMD_ERROR;
 			}
@@ -2850,14 +2877,14 @@
 }
 
 
-static bool AiEnumFollowRoad(TileIndex tile, AiRoadEnum *a, int track, uint length, byte *state)
+static bool AiEnumFollowRoad(TileIndex tile, AiRoadEnum *a, int track, uint length)
 {
 	uint dist = DistanceManhattan(tile, a->dest);
 
 	if (dist <= a->best_dist) {
 		TileIndex tile2 = TILE_MASK(tile + TileOffsByDiagDir(_dir_by_track[track]));
 
-		if (IsTileType(tile2, MP_ROAD) && GetRoadTileType(tile2) == ROAD_TILE_NORMAL) {
+		if (IsNormalRoadTile(tile2)) {
 			a->best_dist = dist;
 			a->best_tile = tile;
 			a->best_track = track;
@@ -2885,7 +2912,7 @@
 	tile = TILE_MASK(_players_ai[p->index].cur_tile_a + TileOffsByDiagDir(dir));
 
 	if (IsRoadStopTile(tile) || IsTileDepotType(tile, TRANSPORT_ROAD)) return false;
-	bits = GetTileTrackStatus(tile, TRANSPORT_ROAD, ROADTYPES_ROAD) & _ai_road_table_and[dir];
+	bits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, ROADTYPES_ROAD)) & _ai_road_table_and[dir];
 	if (bits == 0) return false;
 
 	are.best_dist = (uint)-1;
@@ -3088,26 +3115,36 @@
 	tile = TILE_MASK(_players_ai[p->index].cur_tile_a + TileOffsByDiagDir(_players_ai[p->index].cur_dir_a));
 
 	if (arf.best_ptr[0] & 0x80) {
-		int i;
-		int32 bridge_len;
-		_players_ai[p->index].cur_tile_a = arf.bridge_end_tile;
-		bridge_len = GetTunnelBridgeLength(tile, _players_ai[p->index].cur_tile_a); // tile
-
-		/* Figure out what (road)bridge type to build
-		 * start with best bridge, then go down to worse and worse bridges
-		 * unnecessary to check for worse bridge (i=0), since AI will always build that.
-		 *AI is so fucked up that fixing this small thing will probably not solve a thing
-		 */
-		for (i = 10; i != 0; i--) {
-			if (CheckBridge_Stuff(i, bridge_len)) {
-				CommandCost cost = DoCommand(tile, _players_ai[p->index].cur_tile_a, i + ((0x80 | ROADTYPES_ROAD) << 8), DC_AUTO, CMD_BUILD_BRIDGE);
-				if (CmdSucceeded(cost) && cost.GetCost() < (p->player_money >> 5)) break;
+		TileIndex t1 = tile;
+		TileIndex t2 = arf.bridge_end_tile;
+
+		int32 bridge_len = GetTunnelBridgeLength(t1, t2);
+
+		Axis axis = (TileX(t1) == TileX(t2) ? AXIS_Y : AXIS_X);
+
+		/* try to build a long road instead of bridge - CMD_BUILD_LONG_ROAD has to fail if it couldn't build at least one piece! */
+ 		CommandCost cost = DoCommand(t2, t1, (t2 < t1 ? 1 : 2) | (axis << 2) | (ROADTYPE_ROAD << 3), DC_AUTO | DC_NO_WATER, CMD_BUILD_LONG_ROAD);
+
+		if (CmdSucceeded(cost) && cost.GetCost() <= p->player_money) {
+			DoCommand(t2, t1, (t2 < t1 ? 1 : 2) | (axis << 2) | (ROADTYPE_ROAD << 3), DC_AUTO | DC_EXEC | DC_NO_WATER, CMD_BUILD_LONG_ROAD);
+		} else {
+			int i;
+
+			/* Figure out what (road)bridge type to build
+			 * start with best bridge, then go down to worse and worse bridges
+			 * unnecessary to check for worse bridge (i=0), since AI will always build that */
+			for (i = MAX_BRIDGES - 1; i != 0; i--) {
+				if (CheckBridge_Stuff(i, bridge_len)) {
+					CommandCost cost = DoCommand(t1, t2, i + ((0x80 | ROADTYPES_ROAD) << 8), DC_AUTO, CMD_BUILD_BRIDGE);
+					if (CmdSucceeded(cost) && cost.GetCost() < (p->player_money >> 1) && cost.GetCost() < ((p->player_money + _economy.max_loan - p->current_loan) >> 5)) break;
+				}
 			}
+
+			/* Build it */
+			DoCommand(t1, t2, i + ((0x80 | ROADTYPES_ROAD) << 8), DC_AUTO | DC_EXEC, CMD_BUILD_BRIDGE);
 		}
 
-		// Build it
-		DoCommand(tile, _players_ai[p->index].cur_tile_a, i + ((0x80 | ROADTYPES_ROAD) << 8), DC_AUTO | DC_EXEC, CMD_BUILD_BRIDGE);
-
+		_players_ai[p->index].cur_tile_a = t2;
 		_players_ai[p->index].state_counter = 0;
 	} else if (arf.best_ptr[0] & 0x40) {
 		// tunnel
@@ -3403,7 +3440,7 @@
 
 	uint w = p->size_x[0];
 	uint h = p->size_y[0];
-	uint rad = _patches.modified_catchment ? p->portFSM->catchment : 4;
+	uint rad = _patches.modified_catchment ? p->portFSM->catchment : (uint)CA_UNMODIFIED;
 
 	if (cargo & 0x80) {
 		GetProductionAroundTiles(values, tile, w, h, rad);
@@ -3716,7 +3753,7 @@
 
 		if (IsLevelCrossing(tile)) goto is_rail_crossing;
 
-		if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) {
+		if (IsRoadDepot(tile)) {
 			DiagDirection dir;
 			TileIndex t;
 
--- a/src/ai/trolly/trolly.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/ai/trolly/trolly.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -801,8 +801,7 @@
 		for (j = DIAGDIR_BEGIN; j < DIAGDIR_END; j++) {
 			TileIndex t = tile + TileOffsByDiagDir(j);
 
-			if (IsTileType(t, MP_ROAD) &&
-					GetRoadTileType(t) == ROAD_TILE_DEPOT &&
+			if (IsRoadDepotTile(t) &&
 					IsTileOwner(t, _current_player) &&
 					GetRoadDepotDirection(t) == ReverseDiagDir(j)) {
 				_players_ainew[p->index].depot_tile = t;
@@ -1102,7 +1101,7 @@
 	CommandCost res;
 	assert(_players_ainew[p->index].state == AI_STATE_BUILD_DEPOT);
 
-	if (IsTileType(_players_ainew[p->index].depot_tile, MP_ROAD) && GetRoadTileType(_players_ainew[p->index].depot_tile) == ROAD_TILE_DEPOT) {
+	if (IsRoadDepotTile(_players_ainew[p->index].depot_tile)) {
 		if (IsTileOwner(_players_ainew[p->index].depot_tile, _current_player)) {
 			// The depot is already built
 			_players_ainew[p->index].state = AI_STATE_BUILD_VEHICLE;
@@ -1252,7 +1251,7 @@
 	if (v->age > 360) {
 		// If both years together are not more than AI_MINIMUM_ROUTE_PROFIT,
 		//  it is not worth the line I guess...
-		if (v->profit_last_year + v->profit_this_year < AI_MINIMUM_ROUTE_PROFIT ||
+		if (v->profit_last_year + v->profit_this_year < (Money)256 * AI_MINIMUM_ROUTE_PROFIT ||
 				(v->reliability * 100 >> 16) < 40) {
 			// There is a possibility that the route is fucked up...
 			if (v->cargo.DaysInTransit() > AI_VEHICLE_LOST_DAYS) {
--- a/src/aircraft_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/aircraft_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -98,10 +98,10 @@
 
 /* Recalculates airport moving data based on orientation of airport.
  */
-static AirportMovingData RotateAMDbyOrientation(Vehicle *v, AirportMovingData amd, byte size_x, byte size_y, byte FSM_orientation)
+static AirportMovingData* RotateAMDbyOrientation(Vehicle *v, const FSMPortMovingData* amd, byte size_x, byte size_y, byte FSM_orientation)
 {
-	AirportMovingData new_amd;
-	new_amd = amd;
+	FSMPortMovingData* new_amd;
+	new_amd = copyFSMMovingData(amd);
 
 	switch (FSM_orientation) {
 		case DIR_NE:
@@ -110,26 +110,26 @@
 			/* the small numbers are to realign aircraft with the ground graphics, due to perspective angle being different
 			 * Helis have a slightly different offset. Not sure why.
 			 */
-			new_amd.x = amd.y + ((v->subtype == AIR_HELICOPTER)? 0 : 2);
-			new_amd.y = (size_y * TILE_SIZE) - amd.x  + ((v->subtype == AIR_HELICOPTER)? 0 : -2);
-			new_amd.direction = (Direction)((amd.direction + 2) & 0x07);  // rotate direction "clock" forward 2 ticks
+			new_amd->x = amd->y + ((v->subtype == AIR_HELICOPTER)? 0 : 2);
+			new_amd->y = (size_y * TILE_SIZE) - amd->x  + ((v->subtype == AIR_HELICOPTER)? 0 : -2);
+			new_amd->direction = (Direction)((amd->direction + 2) & 0x07);  // rotate direction "clock" forward 2 ticks
 			break;
 		case DIR_SW:
-			new_amd.x = (size_y * TILE_SIZE) - amd.x + ((v->subtype == AIR_HELICOPTER)? -1 : -2);
-			new_amd.y = (size_x * TILE_SIZE) - amd.y + ((v->subtype == AIR_HELICOPTER)? 0 : -1);
-			new_amd.direction = (Direction)((amd.direction + 4) & 0x07);  // rotate direction "clock" forward 4 ticks
+			new_amd->x = (size_y * TILE_SIZE) - amd->x + ((v->subtype == AIR_HELICOPTER)? -1 : -2);
+			new_amd->y = (size_x * TILE_SIZE) - amd->y + ((v->subtype == AIR_HELICOPTER)? 0 : -1);
+			new_amd->direction = (Direction)((amd->direction + 4) & 0x07);  // rotate direction "clock" forward 4 ticks
 			break;
 		case DIR_NW:
 			// the small numbers are to realign aircraft with the ground graphics, due to perspective angle being different
-			new_amd.x = (size_y * TILE_SIZE) - amd.y + ((v->subtype == AIR_HELICOPTER)? 0 : -2);
-			new_amd.y = amd.x  + ((v->subtype == AIR_HELICOPTER)? 0 : -1);
-			new_amd.direction = (Direction)((amd.direction + 6) & 0x07);  // rotate direction "clock" back 2 ticks (add 6, then mod 8)
+			new_amd->x = (size_y * TILE_SIZE) - amd->y + ((v->subtype == AIR_HELICOPTER)? 0 : -2);
+			new_amd->y = amd->x  + ((v->subtype == AIR_HELICOPTER)? 0 : -1);
+			new_amd->direction = (Direction)((amd->direction + 6) & 0x07);  // rotate direction "clock" back 2 ticks (add 6, then mod 8)
 			break;
 		default:
 			break;
 	}
 
-	return new_amd;
+	return (AirportMovingData*)new_amd;
 }
 
 /** Find the nearest hangar to v
@@ -342,6 +342,8 @@
 		v->tile = tile;
 //		u->tile = 0;
 
+		v->running_ticks = 0;
+
 //		u->delta_x = u->delta_y = 0;
 
 		v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
@@ -431,14 +433,14 @@
 			if (st->airport_tile + ToTileIndexDiff(depots) == tile) {
 //TODO: update this to work with multi tile depots
 				/* adjust all the initial position data by the orientation of the airport */
-				AirportMovingData amd = RotateAMDbyOrientation(v, *apc->MovingData(i), st->fsmportsspeclist[1].spec->size_x[st->FSMport_layout_set],
+				AirportMovingData* amd = RotateAMDbyOrientation(v, apc->MovingData(i), st->fsmportsspeclist[1].spec->size_x[st->FSMport_layout_set],
 											 st->fsmportsspeclist[1].spec->size_y[st->FSMport_layout_set], st->FSMport_orientation);
-				v->x_pos = u->x_pos = TileX(st->airport_tile) * TILE_SIZE + amd.x;
-				v->y_pos = u->y_pos = TileY(st->airport_tile) * TILE_SIZE + amd.y;
-				u->z_pos = GetTileMaxZ(st->airport_tile) + amd.z;
+				v->x_pos = u->x_pos = TileX(st->airport_tile) * TILE_SIZE + amd->x;
+				v->y_pos = u->y_pos = TileY(st->airport_tile) * TILE_SIZE + amd->y;
+				u->z_pos = GetTileMaxZ(st->airport_tile) + amd->z;
 				v->z_pos = u->z_pos + 1;
 				v->u.air.pos = apc->layout[i].position;
-				v->direction = amd.direction;
+				v->direction = amd->direction;
 
 				break;
 			}
@@ -776,11 +778,12 @@
 	AgeVehicle(this);
 	CheckIfAircraftNeedsService(this);
 
-	if (this->vehstatus & VS_STOPPED) return;
+	if (this->running_ticks == 0) return;
 
-	CommandCost cost = CommandCost(EXPENSES_AIRCRAFT_RUN, GetVehicleProperty(this, 0x0E, AircraftVehInfo(this->engine_type)->running_cost) * _price.aircraft_running / 364);
+	CommandCost cost(EXPENSES_AIRCRAFT_RUN, GetVehicleProperty(this, 0x0E, AircraftVehInfo(this->engine_type)->running_cost) * _price.aircraft_running * this->running_ticks / (364 * DAY_TICKS));
 
-	this->profit_this_year -= cost.GetCost() >> 8;
+	this->profit_this_year -= cost.GetCost();
+	this->running_ticks = 0;
 
 	SubtractMoneyFromPlayerFract(this->owner, cost);
 
@@ -901,11 +904,11 @@
 extern FSMDepots GetKeyDepotByTile(TileIndex t);
 extern TileIndex GetKeyDepotTile(TileIndex t);
 
-AirportMovingData GetMovingDataKeyDepotTile(Vehicle *v, TileIndex t)
+AirportMovingData* GetMovingDataKeyDepotTile(Vehicle *v, TileIndex t)
 {
 	Station *st = GetStationByTile(t);
 	const FSMPortMovingData *md = st->fsmportsspeclist[1].spec->portFSM->MovingData(GetKeyDepotByTile(t).FSMposition);
-	AirportMovingData amd = RotateAMDbyOrientation(v, *md, st->fsmportsspeclist[1].spec->size_x[st->FSMport_layout_set],
+	AirportMovingData *amd = RotateAMDbyOrientation(v, md, st->fsmportsspeclist[1].spec->size_x[st->FSMport_layout_set],
 									st->fsmportsspeclist[1].spec->size_y[st->FSMport_layout_set], st->FSMport_orientation);
 	return amd;
 }
@@ -927,11 +930,11 @@
 		u->cur_speed = 0;
 	}
 
-	AirportMovingData md = GetMovingDataKeyDepotTile(v, v->tile);
+	AirportMovingData *md = GetMovingDataKeyDepotTile(v, v->tile);
 	v->u.air.previous_pos = v->u.air.pos = GetKeyDepotByTile(v->tile).FSMposition;
 	v->tile = GetKeyDepotTile(v->tile);
-	SetAircraftPosition(v, (TILE_SIZE * TileX(st->airport_tile)) + md.x, (TILE_SIZE * TileY(st->airport_tile)) + md.y,
-							GetTileMaxZ(st->airport_tile) + md.z + 1);
+	SetAircraftPosition(v, (TILE_SIZE * TileX(st->airport_tile)) + md->x, (TILE_SIZE * TileY(st->airport_tile)) + md->y,
+							GetTileMaxZ(st->airport_tile) + md->z + 1);
 }
 
 static void PlayAircraftSound(const Vehicle* v)
@@ -979,6 +982,10 @@
 	uint spd = v->acceleration * 16;
 	byte t;
 
+	/* Adjust speed limits by plane speed factor to prevent taxiing
+	 * and take-off speeds being too low. */
+	speed_limit *= _patches.plane_speed;
+
 	if (v->u.air.cached_max_speed < speed_limit) {
 		if (v->cur_speed < speed_limit) hard_limit = false;
 		speed_limit = v->u.air.cached_max_speed;
@@ -988,7 +995,15 @@
 
 	v->subspeed = (t=v->subspeed) + (byte)spd;
 
-	if (!hard_limit && v->cur_speed > speed_limit) speed_limit = v->cur_speed - (v->cur_speed / 48);
+	/* Aircraft's current speed is used twice so that very fast planes are
+	 * forced to slow down rapidly in the short distance needed. The magic
+	 * value 16384 was determined to give similar results to the old speed/48
+	 * method at slower speeds. This also results in less reduction at slow
+	 * speeds to that aircraft do not get to taxi speed straight after
+	 * touchdown. */
+	if (!hard_limit && v->cur_speed > speed_limit) {
+		speed_limit = v->cur_speed - max(1, ((v->cur_speed * v->cur_speed) / 16384) / _patches.plane_speed);
+	}
 
 	spd = min(v->cur_speed + (spd >> 8) + (v->subspeed < t), speed_limit);
 
@@ -1002,6 +1017,9 @@
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 	}
 
+	/* Adjust distance moved by plane speed setting */
+	if (_patches.plane_speed > 1) spd /= _patches.plane_speed;
+
 	if (!(v->direction & 1)) spd = spd * 3 / 4;
 
 	spd += v->progress;
@@ -1112,14 +1130,14 @@
 	}
 
 	/* get airport moving data */
-	AirportMovingData amd = RotateAMDbyOrientation(v, *afc->MovingData(v->u.air.pos), st->fsmportsspeclist[1].spec->size_x[st->FSMport_layout_set],
+	AirportMovingData* amd = RotateAMDbyOrientation(v, afc->MovingData(v->u.air.pos), st->fsmportsspeclist[1].spec->size_x[st->FSMport_layout_set],
 								 st->fsmportsspeclist[1].spec->size_y[st->FSMport_layout_set], st->FSMport_orientation);
 
 	int x = TileX(tile) * TILE_SIZE;
 	int y = TileY(tile) * TILE_SIZE;
 
 	/* Helicopter raise */
-	if ((v->subtype == AIR_HELICOPTER) && ((int)((v->z_pos - GetTileMaxZ(st->airport_tile)) - 1) < amd.z)) {
+	if ((v->subtype == AIR_HELICOPTER) && ((int)((v->z_pos - GetTileMaxZ(st->airport_tile)) - 1) < amd->z)) {
 		Vehicle *u = v->Next()->Next();
 
 		/* Make sure the rotors don't rotate too fast */
@@ -1142,51 +1160,53 @@
 	}
 
 	/* Helicopter landing. */
-	if ((v->subtype == AIR_HELICOPTER) && ((int)((v->z_pos - GetTileMaxZ(st->airport_tile)) - 1) > amd.z)) {
-		count = UpdateAircraftSpeed(v);
-		if (count > 0) {
-			if (st->airport_tile == 0) {
-				/* FIXME - AircraftController -> if station no longer exists, do not land
-				 * helicopter will circle until sign disappears, then go to next order
-				 * what to do when it is the only order left, right now it just stays in 1 place */
-				v->u.air.state = FLYING;
-				UpdateAircraftCache(v);
-				AircraftNextAirportPos_and_Order(v);
-				return false;
-			}
+	if ((v->subtype == AIR_HELICOPTER) && ((int)((v->z_pos - GetTileMaxZ(st->airport_tile)) - 1) > amd->z)) {
+		if (st->airport_tile == 0) {
+			/* FIXME - AircraftController -> if station no longer exists, do not land
+			 * helicopter will circle until sign disappears, then go to next order
+			 * what to do when it is the only order left, right now it just stays in 1 place */
+			v->u.air.state = FLYING;
+			UpdateAircraftCache(v);
+			AircraftNextAirportPos_and_Order(v);
+			return false;
+		}
 
-			/* Vehicle is now at the airport. */
-			v->tile = st->airport_tile;
+		/* Vehicle is now at the airport. */
+		v->tile = st->airport_tile;
 
 			/* Find altitude of landing position. */
 			//TODO: airport->delta_z no longer used. need to get actual height of individual tile of layout
 			int z = GetTileMaxZ(v->tile) + 1; // + afc->delta_z;
 
-			if (z == v->z_pos) {
-				Vehicle *u = v->Next()->Next();
+		if (z == v->z_pos) {
+			Vehicle *u = v->Next()->Next();
 
-				/*  Increase speed of rotors. When speed is 80, we've landed. */
-				if (u->cur_speed >= 80) return true;
-				u->cur_speed += 4;
-			} else if (v->z_pos > z) {
-				SetAircraftPosition(v, v->x_pos, v->y_pos, max(v->z_pos - count, z));
-			} else {
-				SetAircraftPosition(v, v->x_pos, v->y_pos, min(v->z_pos + count, z));
+			/*  Increase speed of rotors. When speed is 80, we've landed. */
+			if (u->cur_speed >= 80) return true;
+			u->cur_speed += 4;
+		} else {
+			count = UpdateAircraftSpeed(v);
+			if (count > 0) {
+				if (v->z_pos > z) {
+					SetAircraftPosition(v, v->x_pos, v->y_pos, max(v->z_pos - count, z));
+				} else {
+					SetAircraftPosition(v, v->x_pos, v->y_pos, min(v->z_pos + count, z));
+				}
 			}
 		}
 		return false;
 	}
 
 	/* Get distance from destination pos to current pos. */
-	uint dist = abs(x + amd.x - v->x_pos) +  abs(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;
+	if (!(amd->flag & AMED_EXACTPOS) && dist <= (amd->flag & AMED_SLOWTURN ? 8U : 4U)) return true;
 
 	/* At final pos? */
 	if (dist == 0) {
 		/* Change direction smoothly to final direction. */
-		DirDiff dirdiff = DirDifference(amd.direction, v->direction);
+		DirDiff dirdiff = DirDifference(amd->direction, v->direction);
 		/* if distance is 0, and plane points in right direction, no point in calling
 		 * UpdateAircraftSpeed(). So do it only afterwards */
 		if (dirdiff == DIRDIFF_SAME) {
@@ -1206,10 +1226,10 @@
 	uint speed_limit = SPEED_LIMIT_TAXI;
 	bool hard_limit = true;
 
-	if (amd.flag & AMED_NOSPDCLAMP)   speed_limit = SPEED_LIMIT_NONE;
-	if ((amd.flag & AMED_HOLD) && (v->u.air.previous_pos != v->u.air.pos))      { speed_limit = SPEED_LIMIT_HOLD;     hard_limit = false; }
-	if (amd.flag & AMED_LAND)       { speed_limit = SPEED_LIMIT_APPROACH; hard_limit = false; }
-	if (amd.flag & AMED_BRAKE)      { speed_limit = SPEED_LIMIT_TAXI;     hard_limit = false; }
+	if (amd->flag & AMED_NOSPDCLAMP)   speed_limit = SPEED_LIMIT_NONE;
+	if ((amd->flag & AMED_HOLD) && (v->u.air.previous_pos != v->u.air.pos))      { speed_limit = SPEED_LIMIT_HOLD;     hard_limit = false; }
+	if (amd->flag & AMED_LAND)       { speed_limit = SPEED_LIMIT_APPROACH; hard_limit = false; }
+	if (amd->flag & AMED_BRAKE)      { speed_limit = SPEED_LIMIT_TAXI;     hard_limit = false; }
 
 	count = UpdateAircraftSpeed(v, speed_limit, hard_limit);
 	if (count == 0) return false;
@@ -1220,13 +1240,13 @@
 
 		GetNewVehiclePosResult gp;
 
-		if (dist < 4 || amd.flag & AMED_LAND) {
+		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) :
+			gp.x = (v->x_pos != (x + amd->x)) ?
+					v->x_pos + ((x + amd->x > v->x_pos) ? 1 : -1) :
 					v->x_pos;
-			gp.y = (v->y_pos != (y + amd.y)) ?
-					v->y_pos + ((y + amd.y > v->y_pos) ? 1 : -1) :
+			gp.y = (v->y_pos != (y + amd->y)) ?
+					v->y_pos + ((y + amd->y > v->y_pos) ? 1 : -1) :
 					v->y_pos;
 
 			/* Oilrigs must keep v->tile as st->airport_tile, since the landing pad is in a non-airport tile */
@@ -1235,10 +1255,10 @@
 		} else {
 
 			/* Turn. Do it slowly if in the air. */
-			Direction newdir = GetDirectionTowards(v, x + amd.x, y + amd.y);
+			Direction newdir = GetDirectionTowards(v, x + amd->x, y + amd->y);
 			if (newdir != v->direction) {
 				v->direction = newdir;
-				if (amd.flag & AMED_SLOWTURN) {
+				if (amd->flag & AMED_SLOWTURN) {
 					if (v->load_unload_time_rem == 0) v->load_unload_time_rem = 8;
 				} else {
 					v->cur_speed >>= 1;
@@ -1251,18 +1271,18 @@
 
 		v->tile = gp.new_tile;
 		/* If vehicle is in the air, use tile coordinate 0. */
-		 if (amd.flag & (AMED_TAKEOFF | AMED_SLOWTURN | AMED_LAND)) v->tile = 0;
+		if (amd->flag & (AMED_TAKEOFF | AMED_SLOWTURN | AMED_LAND)) v->tile = 0;
 
 		/* Adjust Z for land or takeoff? */
 		int z = v->z_pos;
 
-		if ((int)v->z_pos < (amd.z + GetTileMaxZ(st->airport_tile))) { //target position is higher, so increase altitude
-			z = min(z + 2, (v->u.air.state == ENDTAKEOFF)? GetAircraftFlyingAltitude(v) : amd.z + GetTileMaxZ(st->airport_tile) );
+		if ((int)v->z_pos < (amd->z + GetTileMaxZ(st->airport_tile))) { //target position is higher, so increase altitude
+			z = min(z + 2, (v->u.air.state == ENDTAKEOFF)? GetAircraftFlyingAltitude(v) : amd->z + GetTileMaxZ(st->airport_tile) );
 		}
 
-		if ((amd.flag & AMED_HOLD) && (z > 150)) z--;
+		if ((amd->flag & AMED_HOLD) && (z > 150)) z--;
 
-		if ((amd.z + GetTileMaxZ(st->airport_tile) + 1) < (int)v->z_pos) { //target position is lower, so decrease altitude
+		if ((amd->z + GetTileMaxZ(st->airport_tile) + 1) < (int)v->z_pos) { //target position is lower, so decrease altitude
 			if (st->airport_tile == 0) {
 				/* Airport has been removed, abort the landing procedure */
 				v->u.air.state = FLYING;
@@ -1273,7 +1293,7 @@
 				continue;
 			}
 
-			int curz = amd.z + GetTileMaxZ(st->airport_tile) + 1;
+			int curz = amd->z + GetTileMaxZ(st->airport_tile) + 1;
 
 			if (curz > z) {
 				z++;
@@ -1286,7 +1306,7 @@
 		}
 
 		/* We've landed. Decrase speed when we're reaching end of runway. */
-		if (amd.flag & AMED_BRAKE) {
+		if (amd->flag & AMED_BRAKE) {
 			int curz = GetSlopeZ(x, y) + 1;
 
 			if (z > curz) {
@@ -1617,7 +1637,7 @@
 		/* There is no autoreplace assigned to this EngineID so we will set it to renew to the same type if needed */
 		new_engine = v->engine_type;
 
-		if(!p->engine_renew || (v->age - v->max_age) < p->engine_renew_months * 30) {
+		if (!v->NeedsAutorenewing(p)) {
 			/* No need to replace the aircraft */
 			return false;
 		}
@@ -2271,6 +2291,8 @@
 {
 	if (!IsNormalAircraft(this)) return;
 
+	if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++;
+
 	if (this->subtype == AIR_HELICOPTER) HelicopterTickHandler(this);
 
 	AgeAircraftCargo(this);
--- a/src/articulated_vehicles.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/articulated_vehicles.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -34,6 +34,42 @@
 	return i - 1;
 }
 
+
+uint16 *GetCapacityOfArticulatedParts(EngineID engine, VehicleType type)
+{
+	static uint16 capacity[NUM_CARGO];
+	memset(capacity, 0, sizeof(capacity));
+
+	if (type == VEH_TRAIN) {
+		const RailVehicleInfo *rvi = RailVehInfo(engine);
+		capacity[rvi->cargo_type] = rvi->capacity;
+		if (rvi->railveh_type == RAILVEH_MULTIHEAD) capacity[rvi->cargo_type] += rvi->capacity;
+	} else if (type == VEH_ROAD) {
+		const RoadVehicleInfo *rvi = RoadVehInfo(engine);
+		capacity[rvi->cargo_type] = rvi->capacity;
+	}
+
+	if (!HasBit(EngInfo(engine)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return capacity;
+
+	for (uint i = 1; i < MAX_UVALUE(EngineID); i++) {
+		uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine, NULL);
+		if (callback == CALLBACK_FAILED || callback == 0xFF) break;
+
+		EngineID artic_engine = GetFirstEngineOfType(type) + GB(callback, 0, 7);
+
+		if (type == VEH_TRAIN) {
+			const RailVehicleInfo *rvi = RailVehInfo(artic_engine);
+			capacity[rvi->cargo_type] += GetEngineProperty(artic_engine, 0x14, rvi->capacity);
+		} else if (type == VEH_ROAD) {
+			const RoadVehicleInfo *rvi = RoadVehInfo(artic_engine);
+			capacity[rvi->cargo_type] += GetEngineProperty(artic_engine, 0x0F, rvi->capacity);
+		}
+	}
+
+	return capacity;
+}
+
+
 void AddArticulatedParts(Vehicle **vl, VehicleType type)
 {
 	const Vehicle *v = vl[0];
--- a/src/articulated_vehicles.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/articulated_vehicles.h	Mon Mar 10 15:26:39 2008 +0000
@@ -8,6 +8,7 @@
 #include "vehicle_type.h"
 
 uint CountArticulatedParts(EngineID engine_type, bool purchase_window);
+uint16 *GetCapacityOfArticulatedParts(EngineID engine, VehicleType type);
 void AddArticulatedParts(Vehicle **vl, VehicleType type);
 
 #endif /* ARTICULATED_VEHICLES_H */
--- a/src/autoreplace_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/autoreplace_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -25,6 +25,7 @@
 
 #include "table/strings.h"
 
+
 /*
  * move the cargo from one engine to another if possible
  */
@@ -139,18 +140,9 @@
 	char *vehicle_name = NULL;
 	CargoID replacement_cargo_type;
 
-	/* If the vehicle belongs to a group, check if the group is protected from the global autoreplace.
-	 *  If not, chek if an global auto replacement is defined */
-	new_engine_type = (IsValidGroupID(old_v->group_id) && GetGroup(old_v->group_id)->replace_protection) ?
-			INVALID_ENGINE :
-			EngineReplacementForPlayer(p, old_v->engine_type, ALL_GROUP);
-
-	/* If we don't set new_egnine_type previously, we try to check if an autoreplacement was defined
-	 *  for the group and the engine_type of the vehicle */
-	if (new_engine_type == INVALID_ENGINE && !IsAllGroupID(old_v->group_id)) {
-		new_engine_type = EngineReplacementForPlayer(p, old_v->engine_type, old_v->group_id);
-	}
-
+	/* Check if there is a autoreplacement set for the vehicle */
+	new_engine_type = EngineReplacementForPlayer(p, old_v->engine_type, old_v->group_id);
+	/* if not, just renew to the same type */
 	if (new_engine_type == INVALID_ENGINE) new_engine_type = old_v->engine_type;
 
 	replacement_cargo_type = GetNewCargoTypeForReplace(old_v, new_engine_type);
@@ -342,25 +334,9 @@
 			}
 
 			// check if the vehicle should be replaced
-			if (!p->engine_renew ||
-					w->age - w->max_age < (p->engine_renew_months * 30) || // replace if engine is too old
+			if (!w->NeedsAutorenewing(p) || // replace if engine is too old
 					w->max_age == 0) { // rail cars got a max age of 0
-				/* If the vehicle belongs to a group, check if the group is protected from the global autoreplace.
-				   If not, chek if an global auto remplacement is defined */
-				if (IsValidGroupID(w->group_id)) {
-					if (!EngineHasReplacementForPlayer(p, w->engine_type, w->group_id) && (
-							GetGroup(w->group_id)->replace_protection ||
-							!EngineHasReplacementForPlayer(p, w->engine_type, ALL_GROUP))) {
-						continue;
-					}
-				} else if (IsDefaultGroupID(w->group_id)) {
-					if (!EngineHasReplacementForPlayer(p, w->engine_type, DEFAULT_GROUP) &&
-							!EngineHasReplacementForPlayer(p, w->engine_type, ALL_GROUP)) {
-						continue;
-					}
-				} else if (!EngineHasReplacementForPlayer(p, w->engine_type, ALL_GROUP)) {
-					continue;
-				}
+				if (!EngineHasReplacementForPlayer(p, w->engine_type, w->group_id)) continue;
 			}
 
 			/* Now replace the vehicle */
--- a/src/autoreplace_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/autoreplace_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -80,7 +80,7 @@
 void InvalidateAutoreplaceWindow(EngineID e, GroupID id_g)
 {
 	Player *p = GetPlayer(_local_player);
-	byte type = GetEngine(e)->type;
+	VehicleType type = GetEngine(e)->type;
 	uint num_engines = GetGroupNumEngines(_local_player, id_g, e);
 
 	if (num_engines == 0 || p->num_engines[e] == 0) {
@@ -175,7 +175,7 @@
 {
 	EngineID e;
 	EngineID selected_engine = INVALID_ENGINE;
-	byte type = w->window_number;
+	VehicleType type = (VehicleType)w->window_number;
 	byte i = draw_left ? 0 : 1;
 
 	EngineList *list = &WP(w, replaceveh_d).list[i];
--- a/src/bridge.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/bridge.h	Mon Mar 10 15:26:39 2008 +0000
@@ -13,30 +13,30 @@
 	MAX_BRIDGES = 13
 };
 
+typedef uint BridgeType;
+
 /** Struct containing information about a single bridge type
  */
-struct Bridge {
-	Year avail_year;     ///< the year where it becomes available
-	byte min_length;     ///< the minimum length (not counting start and end tile)
-	byte max_length;     ///< the maximum length (not counting start and end tile)
-	uint16 price;        ///< the price multiplier
-	uint16 speed;        ///< maximum travel speed
-	SpriteID sprite;     ///< the sprite which is used in the GUI
-	SpriteID pal;        ///< the palette which is used in the GUI
-	StringID material;   ///< the string that contains the bridge description
-	StringID name_rail;  ///< description of the bridge, when built for road
-	StringID name_road;  ///< description of the bridge, when built for road
-	PalSpriteID **sprite_table; ///< table of sprites for drawing the bridge
-	byte flags;          ///< bit 0 set: disable drawing of far pillars.
+struct BridgeSpec {
+	Year avail_year;             ///< the year where it becomes available
+	byte min_length;             ///< the minimum length (not counting start and end tile)
+	byte max_length;             ///< the maximum length (not counting start and end tile)
+	uint16 price;                ///< the price multiplier
+	uint16 speed;                ///< maximum travel speed
+	SpriteID sprite;             ///< the sprite which is used in the GUI
+	SpriteID pal;                ///< the palette which is used in the GUI
+	StringID material;           ///< the string that contains the bridge description
+	StringID transport_name[2];  ///< description of the bridge, when built for road or rail
+	PalSpriteID **sprite_table;  ///< table of sprites for drawing the bridge
+	byte flags;                  ///< bit 0 set: disable drawing of far pillars.
 };
 
-extern const Bridge orig_bridge[MAX_BRIDGES];
-extern Bridge _bridge[MAX_BRIDGES];
+extern BridgeSpec _bridge[MAX_BRIDGES];
 
 Foundation GetBridgeFoundation(Slope tileh, Axis axis);
 bool HasBridgeFlatRamp(Slope tileh, Axis axis);
 
-static inline const Bridge *GetBridge(uint i)
+static inline const BridgeSpec *GetBridgeSpec(BridgeType i)
 {
 	assert(i < lengthof(_bridge));
 	return &_bridge[i];
@@ -44,7 +44,9 @@
 
 void DrawBridgeMiddle(const TileInfo *ti);
 
-bool CheckBridge_Stuff(byte bridge_type, uint bridge_len);
+bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len);
 int CalcBridgeLenCostFactor(int x);
 
+void ResetBridges();
+
 #endif /* BRIDGE_H */
--- a/src/bridge_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/bridge_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -25,8 +25,8 @@
 	uint count;
 	TileIndex start_tile;
 	TileIndex end_tile;
-	uint8 type;
-	uint8 indexes[MAX_BRIDGES];
+	uint32 type; ///< Data type for the bridge. Bit 16,15 = transport type, 14..8 = road/rail pieces, 7..0 = type of bridge
+	BridgeType indexes[MAX_BRIDGES];
 	Money costs[MAX_BRIDGES];
 
 	BridgeData()
@@ -44,7 +44,7 @@
 {
 	DeleteWindow(w);
 	DoCommandP(_bridgedata.end_tile, _bridgedata.start_tile,
-		_bridgedata.indexes[i] | (_bridgedata.type << 8), CcBuildBridge,
+		_bridgedata.type | _bridgedata.indexes[i], CcBuildBridge,
 		CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
 }
 
@@ -79,7 +79,7 @@
 
 			uint y = 15;
 			for (uint i = 0; (i < w->vscroll.cap) && ((i + w->vscroll.pos) < _bridgedata.count); i++) {
-				const Bridge *b = &_bridge[_bridgedata.indexes[i + w->vscroll.pos]];
+				const BridgeSpec *b = GetBridgeSpec(_bridgedata.indexes[i + w->vscroll.pos]);
 
 				SetDParam(2, _bridgedata.costs[i + w->vscroll.pos]);
 				SetDParam(1, b->speed * 10 / 16);
@@ -143,38 +143,18 @@
 	BuildBridgeWndProc
 };
 
-/* Widget definition for the road bridge selection window */
-static const Widget _build_road_bridge_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,  7,   0,  10,   0,  13, STR_00C5,                    STR_018B_CLOSE_WINDOW},            // BBSW_CLOSEBOX
-{    WWT_CAPTION,   RESIZE_NONE,  7,  11, 199,   0,  13, STR_1803_SELECT_ROAD_BRIDGE, STR_018C_WINDOW_TITLE_DRAG_THIS},  // BBSW_CAPTION
-{     WWT_MATRIX, RESIZE_BOTTOM,  7,   0, 187,  14, 101, 0x401,                       STR_101F_BRIDGE_SELECTION_CLICK},  // BBSW_BRIDGE_LIST
-{  WWT_SCROLLBAR, RESIZE_BOTTOM,  7, 188, 199,  14,  89, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST}, // BBSW_SCROLLBAR
-{  WWT_RESIZEBOX,     RESIZE_TB,  7, 188, 199,  90, 101, 0x0,                         STR_RESIZE_BUTTON},                // BBSW_RESIZEBOX
-{   WIDGETS_END},
-};
-
-/* Window definition for the road bridge selection window */
-static const WindowDesc _build_road_bridge_desc = {
-	WDP_AUTO, WDP_AUTO, 200, 102, 200, 102,
-	WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
-	_build_road_bridge_widgets,
-	BuildBridgeWndProc
-};
-
-
-void ShowBuildBridgeWindow(TileIndex start, TileIndex end, byte bridge_type)
+void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte bridge_type)
 {
 	DeleteWindowById(WC_BUILD_BRIDGE, 0);
 
-	_bridgedata.type = bridge_type;
+	_bridgedata.type = (transport_type << 15) | (bridge_type << 8); //prepare the parameter for use only once
 	_bridgedata.start_tile = start;
 	_bridgedata.end_tile = end;
 
 	/* only query bridge building possibility once, result is the same for all bridges!
 	 * returns CMD_ERROR on failure, and price on success */
 	StringID errmsg = INVALID_STRING_ID;
-	CommandCost ret = DoCommand(end, start, (bridge_type << 8), DC_AUTO | DC_QUERY_COST, CMD_BUILD_BRIDGE);
+	CommandCost ret = DoCommand(end, start, _bridgedata.type, DC_AUTO | DC_QUERY_COST, CMD_BUILD_BRIDGE);
 
 	uint8 j = 0;
 	if (CmdFailed(ret)) {
@@ -188,14 +168,14 @@
 		const uint tot_bridgedata_len = CalcBridgeLenCostFactor(bridge_len + 2);
 
 		/* loop for all bridgetypes */
-		for (bridge_type = 0; bridge_type != MAX_BRIDGES; bridge_type++) {
-			if (CheckBridge_Stuff(bridge_type, bridge_len)) {
+		for (BridgeType brd_type = 0; brd_type != MAX_BRIDGES; brd_type++) {
+			if (CheckBridge_Stuff(brd_type, bridge_len)) {
 				/* bridge is accepted, add to list */
-				const Bridge *b = &_bridge[bridge_type];
+				const BridgeSpec *b = GetBridgeSpec(brd_type);
 				/* Add to terraforming & bulldozing costs the cost of the
 				 * bridge itself (not computed with DC_QUERY_COST) */
 				_bridgedata.costs[j] = ret.GetCost() + (((int64)tot_bridgedata_len * _price.build_bridge * b->price) >> 8);
-				_bridgedata.indexes[j] = bridge_type;
+				_bridgedata.indexes[j] = brd_type;
 				j++;
 			}
 		}
@@ -204,7 +184,9 @@
 	}
 
 	if (j != 0) {
-		AllocateWindowDesc((_bridgedata.type & 0x80) ? &_build_road_bridge_desc : &_build_bridge_desc);
+		Window *w = AllocateWindowDesc(&_build_bridge_desc);
+		/* Change the data, or the caption of the gui. Set it to road or rail, accordingly */
+		w->widget[BBSW_CAPTION].data = (transport_type == TRANSPORT_ROAD) ? STR_1803_SELECT_ROAD_BRIDGE : STR_100D_SELECT_RAIL_BRIDGE;
 	} else {
 		ShowErrorMessage(errmsg, STR_5015_CAN_T_BUILD_BRIDGE_HERE, TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE);
 	}
--- a/src/bridge_map.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/bridge_map.h	Mon Mar 10 15:26:39 2008 +0000
@@ -8,6 +8,7 @@
 #include "direction_func.h"
 #include "rail_type.h"
 #include "road_map.h"
+#include "bridge.h"
 
 
 /**
@@ -67,7 +68,7 @@
  * @pre IsBridgeTile(t)
  * @return The bridge type
  */
-static inline uint GetBridgeType(TileIndex t)
+static inline BridgeType GetBridgeType(TileIndex t)
 {
 	assert(IsBridgeTile(t));
 	return GB(_m[t].m2, 4, 4);
@@ -163,7 +164,7 @@
  * @param rt         the road or rail type
  * @note this function should not be called directly.
  */
-static inline void MakeBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, TransportType tt, uint rt)
+static inline void MakeBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, DiagDirection d, TransportType tt, uint rt)
 {
 	SetTileType(t, MP_TUNNELBRIDGE);
 	SetTileOwner(t, o);
@@ -181,7 +182,7 @@
  * @param d          the direction this ramp must be facing
  * @param r          the road type of the bridge
  */
-static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, RoadTypes r)
+static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, DiagDirection d, RoadTypes r)
 {
 	MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD, r);
 }
@@ -194,7 +195,7 @@
  * @param d          the direction this ramp must be facing
  * @param r          the rail type of the bridge
  */
-static inline void MakeRailBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, RailType r)
+static inline void MakeRailBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, DiagDirection d, RailType r)
 {
 	MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_RAIL, r);
 }
--- a/src/build_vehicle_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/build_vehicle_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -81,9 +81,11 @@
 };
 
 /* Setup widget strings to fit the different types of vehicles */
-static void SetupWindowStrings(Window *w, byte type)
+static void SetupWindowStrings(Window *w, VehicleType type)
 {
 	switch (type) {
+		default: NOT_REACHED();
+
 		case VEH_TRAIN:
 			w->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = STR_JUST_STRING;
 			w->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_8843_TRAIN_VEHICLE_SELECTION;
@@ -92,6 +94,7 @@
 			w->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_8820_RENAME;
 			w->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_8845_RENAME_TRAIN_VEHICLE_TYPE;
 			break;
+
 		case VEH_ROAD:
 			w->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = STR_9006_NEW_ROAD_VEHICLES;
 			w->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_9026_ROAD_VEHICLE_SELECTION;
@@ -100,6 +103,7 @@
 			w->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_9034_RENAME;
 			w->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_9035_RENAME_ROAD_VEHICLE_TYPE;
 			break;
+
 		case VEH_SHIP:
 			w->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = STR_9808_NEW_SHIPS;
 			w->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_9825_SHIP_SELECTION_LIST_CLICK;
@@ -108,6 +112,7 @@
 			w->widget[BUILD_VEHICLE_WIDGET_RENAME].data     = STR_9836_RENAME;
 			w->widget[BUILD_VEHICLE_WIDGET_RENAME].tooltips = STR_9837_RENAME_SHIP_TYPE;
 			break;
+
 		case VEH_AIRCRAFT:
 			w->widget[BUILD_VEHICLE_WIDGET_CAPTION].data    = STR_A005_NEW_AIRCRAFT;
 			w->widget[BUILD_VEHICLE_WIDGET_LIST].tooltips   = STR_A025_AIRCRAFT_SELECTION_LIST;
@@ -225,8 +230,8 @@
 	const RailVehicleInfo *rvi_a = RailVehInfo(*(const EngineID*)a);
 	const RailVehicleInfo *rvi_b = RailVehInfo(*(const EngineID*)b);
 
-	Money va = rvi_a->running_cost_base * _price.running_rail[rvi_a->running_cost_class] * (rvi_a->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
-	Money vb = rvi_b->running_cost_base * _price.running_rail[rvi_b->running_cost_class] * (rvi_b->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
+	Money va = rvi_a->running_cost * GetPriceByIndex(rvi_a->running_cost_class) * (rvi_a->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
+	Money vb = rvi_b->running_cost * GetPriceByIndex(rvi_b->running_cost_class) * (rvi_b->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
 	int r = ClampToI32(va - vb);
 
 	return _internal_sort_order ? -r : r;
@@ -243,8 +248,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(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);
+	Money va = (rvi_a->running_cost * GetPriceByIndex(rvi_a->running_cost_class)) / max(1U, (uint)rvi_a->power);
+	Money vb = (rvi_b->running_cost * GetPriceByIndex(rvi_b->running_cost_class)) / max(1U, (uint)rvi_b->power);
 	int r = ClampToI32(vb - va);
 
 	return _internal_sort_order ? -r : r;
@@ -307,9 +312,12 @@
 
 static int CDECL RoadVehEngineRunningCostSorter(const void *a, const void *b)
 {
-	const int va = RoadVehInfo(*(const EngineID*)a)->running_cost;
-	const int vb = RoadVehInfo(*(const EngineID*)b)->running_cost;
-	const int r = va - vb;
+	const RoadVehicleInfo *rvi_a = RoadVehInfo(*(const EngineID*)a);
+	const RoadVehicleInfo *rvi_b = RoadVehInfo(*(const EngineID*)b);
+
+	Money va = rvi_a->running_cost * GetPriceByIndex(rvi_a->running_cost_class);
+	Money vb = rvi_b->running_cost * GetPriceByIndex(rvi_b->running_cost_class);
+	int r = ClampToI32(va - vb);
 
 	if (r == 0) {
 		/* Use EngineID to sort instead since we want consistent sorting */
@@ -525,6 +533,26 @@
 	INVALID_STRING_ID
 }};
 
+static int DrawCargoCapacityInfo(int x, int y, EngineID engine, VehicleType type, bool refittable)
+{
+	uint16 *cap = GetCapacityOfArticulatedParts(engine, type);
+
+	for (uint c = 0; c < NUM_CARGO; c++) {
+		if (cap[c] == 0) continue;
+
+		SetDParam(0, c);
+		SetDParam(1, cap[c]);
+		SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY);
+		DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
+		y += 10;
+
+		/* Only show as refittable once */
+		refittable = false;
+	}
+
+	return y;
+}
+
 /* Draw rail wagon specific details */
 static int DrawRailWagonPurchaseInfo(int x, int y, EngineID engine_number, const RailVehicleInfo *rvi)
 {
@@ -549,6 +577,14 @@
 			y += 10;
 		}
 	}
+
+	/* Running cost */
+	if (rvi->running_cost_class != 0xFF) {
+		SetDParam(0, GetEngineProperty(engine_number, 0x0D, rvi->running_cost) * GetPriceByIndex(rvi->running_cost_class) >> 8);
+		DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, TC_FROMSTRING);
+		y += 10;
+	}
+
 	return y;
 }
 
@@ -578,9 +614,11 @@
 	}
 
 	/* 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, TC_FROMSTRING);
-	y += 10;
+	if (rvi->running_cost_class != 0xFF) {
+		SetDParam(0, (GetEngineProperty(engine_number, 0x0D, rvi->running_cost) * GetPriceByIndex(rvi->running_cost_class) >> 8) << multihead);
+		DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, TC_FROMSTRING);
+		y += 10;
+	}
 
 	/* Powered wagons power - Powered wagons extra weight */
 	if (rvi->pow_wag_power != 0) {
@@ -605,18 +643,12 @@
 	y += 10;
 
 	/* Running cost */
-	SetDParam(0, rvi->running_cost * _price.roadveh_running >> 8);
+	SetDParam(0, rvi->running_cost * GetPriceByIndex(rvi->running_cost_class) >> 8);
 	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, TC_FROMSTRING);
-	y += 10;
-
-	return y;
+	return DrawCargoCapacityInfo(x, y, engine_number, VEH_ROAD, refittable);
 }
 
 /* Draw ship specific details */
@@ -707,20 +739,18 @@
 			}
 
 			/* Cargo type + capacity, or N/A */
-			if (rvi->capacity == 0) {
+			int new_y = DrawCargoCapacityInfo(x, y, engine_number, VEH_TRAIN, refitable);
+
+			if (new_y == y) {
 				SetDParam(0, CT_INVALID);
 				SetDParam(2, STR_EMPTY);
+				DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
+				y += 10;
 			} else {
-				int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
-
-				SetDParam(0, rvi->cargo_type);
-				SetDParam(1, (capacity * (CountArticulatedParts(engine_number, true) + 1)) << multihead);
-				SetDParam(2, refitable ? STR_9842_REFITTABLE : STR_EMPTY);
+				y = new_y;
 			}
-			DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
-			y += 10;
+			break;
 		}
-			break;
 		case VEH_ROAD:
 			y = DrawRoadVehPurchaseInfo(x, y, engine_number, RoadVehInfo(engine_number));
 			refitable = true;
@@ -890,7 +920,7 @@
 	EngList_Sort(&bv->eng_list, _sorter[bv->vehicle_type][bv->sort_criteria]);
 }
 
-static void DrawVehicleEngine(byte type, int x, int y, EngineID engine, SpriteID pal)
+static void DrawVehicleEngine(VehicleType type, int x, int y, EngineID engine, SpriteID pal)
 {
 	switch (type) {
 		case VEH_TRAIN:    DrawTrainEngine(   x, y, engine, pal); break;
--- a/src/cargopacket.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/cargopacket.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -37,7 +37,7 @@
 	this->count = 0;
 }
 
-bool CargoPacket::SameSource(CargoPacket *cp)
+bool CargoPacket::SameSource(const CargoPacket *cp) const
 {
 	return this->source_xy == cp->source_xy && this->days_in_transit == cp->days_in_transit && this->paid_for == cp->paid_for;
 }
--- a/src/cargopacket.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/cargopacket.h	Mon Mar 10 15:26:39 2008 +0000
@@ -53,7 +53,7 @@
 	 * @param cp the cargo packet to compare to
 	 * @return true if and only if days_in_transit and source_xy are equal
 	 */
-	bool SameSource(CargoPacket *cp);
+	bool SameSource(const CargoPacket *cp) const;
 };
 
 /**
--- a/src/clear_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/clear_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -315,7 +315,7 @@
 	/* not used */
 }
 
-static uint32 GetTileTrackStatus_Clear(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Clear(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
 	return 0;
 }
--- a/src/command.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/command.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -209,160 +209,145 @@
  * as the value from the CMD_* enums.
  */
 static const Command _command_proc_table[] = {
-	{CmdBuildRailroadTrack,           CMD_AUTO}, /*   0, CMD_BUILD_RAILROAD_TRACK */
-	{CmdRemoveRailroadTrack,          CMD_AUTO}, /*   1, CMD_REMOVE_RAILROAD_TRACK */
-	{CmdBuildSingleRail,              CMD_AUTO}, /*   2, CMD_BUILD_SINGLE_RAIL */
-	{CmdRemoveSingleRail,             CMD_AUTO}, /*   3, CMD_REMOVE_SINGLE_RAIL */
-	{CmdLandscapeClear,                      0}, /*   4, CMD_LANDSCAPE_CLEAR */
-	{CmdBuildBridge,                  CMD_AUTO}, /*   5, CMD_BUILD_BRIDGE */
-	{CmdBuildRailroadStation,         CMD_AUTO}, /*   6, CMD_BUILD_RAILROAD_STATION */
-	{CmdBuildTrainDepot,              CMD_AUTO}, /*   7, CMD_BUILD_TRAIN_DEPOT */
-	{CmdBuildSingleSignal,            CMD_AUTO}, /*   8, CMD_BUILD_SIGNALS */
-	{CmdRemoveSingleSignal,           CMD_AUTO}, /*   9, CMD_REMOVE_SIGNALS */
-	{CmdTerraformLand,                CMD_AUTO}, /*  10, CMD_TERRAFORM_LAND */
-	{CmdPurchaseLandArea,             CMD_AUTO}, /*  11, CMD_PURCHASE_LAND_AREA */
-	{CmdSellLandArea,                        0}, /*  12, CMD_SELL_LAND_AREA */
-	{CmdBuildTunnel,                  CMD_AUTO}, /*  13, CMD_BUILD_TUNNEL */
-	{CmdRemoveFromRailroadStation,           0}, /*  14, CMD_REMOVE_FROM_RAILROAD_STATION */
-	{CmdConvertRail,                         0}, /*  15, CMD_CONVERT_RAILD */
-	{CmdBuildTrainWaypoint,                  0}, /*  16, CMD_BUILD_TRAIN_WAYPOINT */
-	{CmdRenameWaypoint,                      0}, /*  17, CMD_RENAME_WAYPOINT */
-	{CmdRemoveTrainWaypoint,                 0}, /*  18, CMD_REMOVE_TRAIN_WAYPOINT */
-	{NULL,                                   0}, /*  19, unused */
-	{NULL,                                   0}, /*  20, unused */
-	{CmdBuildRoadStop,                CMD_AUTO}, /*  21, CMD_BUILD_ROAD_STOP */
-	{CmdRemoveRoadStop,                      0}, /*  22, CMD_REMOVE_ROAD_STOP */
-	{CmdBuildLongRoad,                CMD_AUTO}, /*  23, CMD_BUILD_LONG_ROAD */
-	{CmdRemoveLongRoad,               CMD_AUTO}, /*  24, CMD_REMOVE_LONG_ROAD */
-	{CmdBuildRoad,                           0}, /*  25, CMD_BUILD_ROAD */
-	{CmdRemoveRoad,                          0}, /*  26, CMD_REMOVE_ROAD */
-	{CmdBuildRoadDepot,               CMD_AUTO}, /*  27, CMD_BUILD_ROAD_DEPOT */
-	{NULL,                                   0}, /*  28, unused */
-	{CmdBuildAirport,                 CMD_AUTO}, /*  29, CMD_BUILD_AIRPORT */
-	{CmdBuildDock,                    CMD_AUTO}, /*  30, CMD_BUILD_DOCK */
-	{CmdBuildShipDepot,               CMD_AUTO}, /*  31, CMD_BUILD_SHIP_DEPOT */
-	{CmdBuildBuoy,                    CMD_AUTO}, /*  32, CMD_BUILD_BUOY */
-	{CmdPlantTree,                    CMD_AUTO}, /*  33, CMD_PLANT_TREE */
-	{CmdBuildRailVehicle,                    0}, /*  34, CMD_BUILD_RAIL_VEHICLE */
-	{CmdMoveRailVehicle,                     0}, /*  35, CMD_MOVE_RAIL_VEHICLE */
-	{CmdStartStopTrain,                      0}, /*  36, CMD_START_STOP_TRAIN */
-	{NULL,                                   0}, /*  37, unused */
-	{CmdSellRailWagon,                       0}, /*  38, CMD_SELL_RAIL_WAGON */
-	{CmdSendTrainToDepot,                    0}, /*  39, CMD_SEND_TRAIN_TO_DEPOT */
-	{CmdForceTrainProceed,                   0}, /*  40, CMD_FORCE_TRAIN_PROCEED */
-	{CmdReverseTrainDirection,               0}, /*  41, CMD_REVERSE_TRAIN_DIRECTION */
-
-	{CmdModifyOrder,                         0}, /*  42, CMD_MODIFY_ORDER */
-	{CmdSkipToOrder,                         0}, /*  43, CMD_SKIP_TO_ORDER */
-	{CmdDeleteOrder,                         0}, /*  44, CMD_DELETE_ORDER */
-	{CmdInsertOrder,                         0}, /*  45, CMD_INSERT_ORDER */
-
-	{CmdChangeServiceInt,                    0}, /*  46, CMD_CHANGE_SERVICE_INT */
-
-	{CmdBuildIndustry,                       0}, /*  47, CMD_BUILD_INDUSTRY */
-	{CmdBuildCompanyHQ,               CMD_AUTO}, /*  48, CMD_BUILD_COMPANY_HQ */
-	{CmdSetPlayerFace,                       0}, /*  49, CMD_SET_PLAYER_FACE */
-	{CmdSetPlayerColor,                      0}, /*  50, CMD_SET_PLAYER_COLOR */
-
-	{CmdIncreaseLoan,                        0}, /*  51, CMD_INCREASE_LOAN */
-	{CmdDecreaseLoan,                        0}, /*  52, CMD_DECREASE_LOAN */
-
-	{CmdWantEnginePreview,                   0}, /*  53, CMD_WANT_ENGINE_PREVIEW */
-
-	{CmdNameVehicle,                         0}, /*  54, CMD_NAME_VEHICLE */
-	{CmdRenameEngine,                        0}, /*  55, CMD_RENAME_ENGINE */
-
-	{CmdChangeCompanyName,                   0}, /*  56, CMD_CHANGE_COMPANY_NAME */
-	{CmdChangePresidentName,                 0}, /*  57, CMD_CHANGE_PRESIDENT_NAME */
-
-	{CmdRenameStation,                       0}, /*  58, CMD_RENAME_STATION */
-
-	{CmdSellAircraft,                        0}, /*  59, CMD_SELL_AIRCRAFT */
-	{CmdStartStopAircraft,                   0}, /*  60, CMD_START_STOP_AIRCRAFT */
-
-	{CmdBuildAircraft,                       0}, /*  61, CMD_BUILD_AIRCRAFT */
-	{CmdSendAircraftToHangar,                0}, /*  62, CMD_SEND_AIRCRAFT_TO_HANGAR */
-	{NULL,                                   0}, /*  63, unused */
-	{CmdRefitAircraft,                       0}, /*  64, CMD_REFIT_AIRCRAFT */
+	{CmdBuildRailroadTrack,           CMD_AUTO}, /* CMD_BUILD_RAILROAD_TRACK */
+	{CmdRemoveRailroadTrack,          CMD_AUTO}, /* CMD_REMOVE_RAILROAD_TRACK */
+	{CmdBuildSingleRail,              CMD_AUTO}, /* CMD_BUILD_SINGLE_RAIL */
+	{CmdRemoveSingleRail,             CMD_AUTO}, /* CMD_REMOVE_SINGLE_RAIL */
+	{CmdLandscapeClear,                      0}, /* CMD_LANDSCAPE_CLEAR */
+	{CmdBuildBridge,                  CMD_AUTO}, /* CMD_BUILD_BRIDGE */
+	{CmdBuildRailroadStation,         CMD_AUTO}, /* CMD_BUILD_RAILROAD_STATION */
+	{CmdBuildTrainDepot,              CMD_AUTO}, /* CMD_BUILD_TRAIN_DEPOT */
+	{CmdBuildSingleSignal,            CMD_AUTO}, /* CMD_BUILD_SIGNALS */
+	{CmdRemoveSingleSignal,           CMD_AUTO}, /* CMD_REMOVE_SIGNALS */
+	{CmdTerraformLand,                CMD_AUTO}, /* CMD_TERRAFORM_LAND */
+	{CmdPurchaseLandArea,             CMD_AUTO}, /* CMD_PURCHASE_LAND_AREA */
+	{CmdSellLandArea,                        0}, /* CMD_SELL_LAND_AREA */
+	{CmdBuildTunnel,                  CMD_AUTO}, /* CMD_BUILD_TUNNEL */
+	{CmdRemoveFromRailroadStation,           0}, /* CMD_REMOVE_FROM_RAILROAD_STATION */
+	{CmdConvertRail,                         0}, /* CMD_CONVERT_RAILD */
+	{CmdBuildTrainWaypoint,                  0}, /* CMD_BUILD_TRAIN_WAYPOINT */
+	{CmdRenameWaypoint,                      0}, /* CMD_RENAME_WAYPOINT */
+	{CmdRemoveTrainWaypoint,                 0}, /* CMD_REMOVE_TRAIN_WAYPOINT */
 
-	{CmdPlaceSign,                           0}, /*  65, CMD_PLACE_SIGN */
-	{CmdRenameSign,                          0}, /*  66, CMD_RENAME_SIGN */
-
-	{CmdBuildRoadVeh,                        0}, /*  67, CMD_BUILD_ROAD_VEH */
-	{CmdStartStopRoadVeh,                    0}, /*  68, CMD_START_STOP_ROADVEH */
-	{CmdSellRoadVeh,                         0}, /*  69, CMD_SELL_ROAD_VEH */
-	{CmdSendRoadVehToDepot,                  0}, /*  70, CMD_SEND_ROADVEH_TO_DEPOT */
-	{CmdTurnRoadVeh,                         0}, /*  71, CMD_TURN_ROADVEH */
-	{CmdRefitRoadVeh,                        0}, /*  72, CMD_REFIT_ROAD_VEH */
-
-	{CmdPause,                      CMD_SERVER}, /*  73, CMD_PAUSE */
-
-	{CmdBuyShareInCompany,                   0}, /*  74, CMD_BUY_SHARE_IN_COMPANY */
-	{CmdSellShareInCompany,                  0}, /*  75, CMD_SELL_SHARE_IN_COMPANY */
-	{CmdBuyCompany,                          0}, /*  76, CMD_BUY_COMANY */
-
-	{CmdBuildTown,                 CMD_OFFLINE}, /*  77, CMD_BUILD_TOWN */
-	{NULL,                                   0}, /*  78, unused */
-	{NULL,                                   0}, /*  79, unused */
-	{CmdRenameTown,                 CMD_SERVER}, /*  80, CMD_RENAME_TOWN */
-	{CmdDoTownAction,                        0}, /*  81, CMD_DO_TOWN_ACTION */
-
-	{CmdSetRoadDriveSide,           CMD_SERVER}, /*  82, CMD_SET_ROAD_DRIVE_SIDE */
-	{NULL,                                   0}, /*  83, unused */
-	{NULL,                                   0}, /*  84, unused */
-	{CmdChangeDifficultyLevel,      CMD_SERVER}, /*  85, CMD_CHANGE_DIFFICULTY_LEVEL */
-
-	{CmdStartStopShip,                       0}, /*  86, CMD_START_STOP_SHIP */
-	{CmdSellShip,                            0}, /*  87, CMD_SELL_SHIP */
-	{CmdBuildShip,                           0}, /*  88, CMD_BUILD_SHIP */
-	{CmdSendShipToDepot,                     0}, /*  89, CMD_SEND_SHIP_TO_DEPOT */
-	{NULL,                                   0}, /*  90, unused */
-	{CmdRefitShip,                           0}, /*  91, CMD_REFIT_SHIP */
+	{CmdBuildRoadStop,                CMD_AUTO}, /* CMD_BUILD_ROAD_STOP */
+	{CmdRemoveRoadStop,                      0}, /* CMD_REMOVE_ROAD_STOP */
+	{CmdBuildLongRoad,                CMD_AUTO}, /* CMD_BUILD_LONG_ROAD */
+	{CmdRemoveLongRoad,               CMD_AUTO}, /* CMD_REMOVE_LONG_ROAD */
+	{CmdBuildRoad,                           0}, /* CMD_BUILD_ROAD */
+	{CmdRemoveRoad,                          0}, /* CMD_REMOVE_ROAD */
+	{CmdBuildRoadDepot,               CMD_AUTO}, /* CMD_BUILD_ROAD_DEPOT */
 
-	{NULL,                                   0}, /*  92, unused */
-	{NULL,                                   0}, /*  93, unused */
-	{NULL,                                   0}, /*  94, unused */
-	{NULL,                                   0}, /*  95, unused */
-	{NULL,                                   0}, /*  96, unused */
-	{NULL,                                   0}, /*  97, unused */
-
-	{CmdOrderRefit,                          0}, /*  98, CMD_ORDER_REFIT */
-	{CmdCloneOrder,                          0}, /*  99, CMD_CLONE_ORDER */
-
-	{CmdClearArea,                           0}, /* 100, CMD_CLEAR_AREA */
-	{NULL,                                   0}, /* 101, unused */
-
-	{CmdMoneyCheat,                CMD_OFFLINE}, /* 102, CMD_MONEY_CHEAT */
-	{CmdBuildCanal,                   CMD_AUTO}, /* 103, CMD_BUILD_CANAL */
-	{CmdPlayerCtrl,                          0}, /* 104, CMD_PLAYER_CTRL */
-
-	{CmdLevelLand,                    CMD_AUTO}, /* 105, CMD_LEVEL_LAND */
+	{CmdBuildAirport,                 CMD_AUTO}, /* CMD_BUILD_AIRPORT */
+	{CmdBuildDock,                    CMD_AUTO}, /* CMD_BUILD_DOCK */
+	{CmdBuildShipDepot,               CMD_AUTO}, /* CMD_BUILD_SHIP_DEPOT */
+	{CmdBuildBuoy,                    CMD_AUTO}, /* CMD_BUILD_BUOY */
+	{CmdPlantTree,                    CMD_AUTO}, /* CMD_PLANT_TREE */
+	{CmdBuildRailVehicle,                    0}, /* CMD_BUILD_RAIL_VEHICLE */
+	{CmdMoveRailVehicle,                     0}, /* CMD_MOVE_RAIL_VEHICLE */
+	{CmdStartStopTrain,                      0}, /* CMD_START_STOP_TRAIN */
 
-	{CmdRefitRailVehicle,                    0}, /* 106, CMD_REFIT_RAIL_VEHICLE */
-	{CmdRestoreOrderIndex,                   0}, /* 107, CMD_RESTORE_ORDER_INDEX */
-	{CmdBuildLock,                    CMD_AUTO}, /* 108, CMD_BUILD_LOCK */
-	{NULL,                                   0}, /* 109, unused */
-	{CmdBuildSignalTrack,             CMD_AUTO}, /* 110, CMD_BUILD_SIGNAL_TRACK */
-	{CmdRemoveSignalTrack,            CMD_AUTO}, /* 111, CMD_REMOVE_SIGNAL_TRACK */
-	{NULL,                                   0}, /* 112, unused */
-	{CmdGiveMoney,                           0}, /* 113, CMD_GIVE_MONEY */
-	{CmdChangePatchSetting,         CMD_SERVER}, /* 114, CMD_CHANGE_PATCH_SETTING */
-	{CmdSetAutoReplace,                      0}, /* 115, CMD_SET_AUTOREPLACE */
-	{CmdCloneVehicle,                        0}, /* 116, CMD_CLONE_VEHICLE */
-	{CmdMassStartStopVehicle,                0}, /* 117, CMD_MASS_START_STOP */
-	{CmdDepotSellAllVehicles,                0}, /* 118, CMD_DEPOT_SELL_ALL_VEHICLES */
-	{CmdDepotMassAutoReplace,                0}, /* 119, CMD_DEPOT_MASS_AUTOREPLACE */
-	{CmdCreateGroup,                         0}, /* 120, CMD_CREATE_GROUP */
-	{CmdDeleteGroup,                         0}, /* 121, CMD_DELETE_GROUP */
-	{CmdRenameGroup,                         0}, /* 122, CMD_RENAME_GROUP */
-	{CmdAddVehicleGroup,                     0}, /* 123, CMD_ADD_VEHICLE_GROUP */
-	{CmdAddSharedVehicleGroup,               0}, /* 124, CMD_ADD_SHARE_VEHICLE_GROUP */
-	{CmdRemoveAllVehiclesGroup,              0}, /* 125, CMD_REMOVE_ALL_VEHICLES_GROUP */
-	{CmdSetGroupReplaceProtection,           0}, /* 126, CMD_SET_GROUP_REPLACE_PROTECTION */
-	{CmdMoveOrder,                           0}, /* 127, CMD_MOVE_ORDER */
-	{CmdChangeTimetable,                     0}, /* 128, CMD_CHANGE_TIMETABLE */
-	{CmdSetVehicleOnTime,                    0}, /* 129, CMD_SET_VEHICLE_ON_TIME */
-	{CmdAutofillTimetable,                   0}, /* 130, CMD_AUTOFILL_TIMETABLE */
+	{CmdSellRailWagon,                       0}, /* CMD_SELL_RAIL_WAGON */
+	{CmdSendTrainToDepot,                    0}, /* CMD_SEND_TRAIN_TO_DEPOT */
+	{CmdForceTrainProceed,                   0}, /* CMD_FORCE_TRAIN_PROCEED */
+	{CmdReverseTrainDirection,               0}, /* CMD_REVERSE_TRAIN_DIRECTION */
+
+	{CmdModifyOrder,                         0}, /* CMD_MODIFY_ORDER */
+	{CmdSkipToOrder,                         0}, /* CMD_SKIP_TO_ORDER */
+	{CmdDeleteOrder,                         0}, /* CMD_DELETE_ORDER */
+	{CmdInsertOrder,                         0}, /* CMD_INSERT_ORDER */
+
+	{CmdChangeServiceInt,                    0}, /* CMD_CHANGE_SERVICE_INT */
+
+	{CmdBuildIndustry,                       0}, /* CMD_BUILD_INDUSTRY */
+	{CmdBuildCompanyHQ,               CMD_AUTO}, /* CMD_BUILD_COMPANY_HQ */
+	{CmdSetPlayerFace,                       0}, /* CMD_SET_PLAYER_FACE */
+	{CmdSetPlayerColor,                      0}, /* CMD_SET_PLAYER_COLOR */
+
+	{CmdIncreaseLoan,                        0}, /* CMD_INCREASE_LOAN */
+	{CmdDecreaseLoan,                        0}, /* CMD_DECREASE_LOAN */
+
+	{CmdWantEnginePreview,                   0}, /* CMD_WANT_ENGINE_PREVIEW */
+
+	{CmdNameVehicle,                         0}, /* CMD_NAME_VEHICLE */
+	{CmdRenameEngine,                        0}, /* CMD_RENAME_ENGINE */
+
+	{CmdChangeCompanyName,                   0}, /* CMD_CHANGE_COMPANY_NAME */
+	{CmdChangePresidentName,                 0}, /* CMD_CHANGE_PRESIDENT_NAME */
+
+	{CmdRenameStation,                       0}, /* CMD_RENAME_STATION */
+
+	{CmdSellAircraft,                        0}, /* CMD_SELL_AIRCRAFT */
+	{CmdStartStopAircraft,                   0}, /* CMD_START_STOP_AIRCRAFT */
+
+	{CmdBuildAircraft,                       0}, /* CMD_BUILD_AIRCRAFT */
+	{CmdSendAircraftToHangar,                0}, /* CMD_SEND_AIRCRAFT_TO_HANGAR */
+	{CmdRefitAircraft,                       0}, /* CMD_REFIT_AIRCRAFT */
+
+	{CmdPlaceSign,                           0}, /* CMD_PLACE_SIGN */
+	{CmdRenameSign,                          0}, /* CMD_RENAME_SIGN */
+
+	{CmdBuildRoadVeh,                        0}, /* CMD_BUILD_ROAD_VEH */
+	{CmdStartStopRoadVeh,                    0}, /* CMD_START_STOP_ROADVEH */
+	{CmdSellRoadVeh,                         0}, /* CMD_SELL_ROAD_VEH */
+	{CmdSendRoadVehToDepot,                  0}, /* CMD_SEND_ROADVEH_TO_DEPOT */
+	{CmdTurnRoadVeh,                         0}, /* CMD_TURN_ROADVEH */
+	{CmdRefitRoadVeh,                        0}, /* CMD_REFIT_ROAD_VEH */
+
+	{CmdPause,                      CMD_SERVER}, /* CMD_PAUSE */
+
+	{CmdBuyShareInCompany,                   0}, /* CMD_BUY_SHARE_IN_COMPANY */
+	{CmdSellShareInCompany,                  0}, /* CMD_SELL_SHARE_IN_COMPANY */
+	{CmdBuyCompany,                          0}, /* CMD_BUY_COMANY */
+
+	{CmdBuildTown,                 CMD_OFFLINE}, /* CMD_BUILD_TOWN */
+	{CmdRenameTown,                 CMD_SERVER}, /* CMD_RENAME_TOWN */
+	{CmdDoTownAction,                        0}, /* CMD_DO_TOWN_ACTION */
+
+	{CmdSetRoadDriveSide,           CMD_SERVER}, /* CMD_SET_ROAD_DRIVE_SIDE */
+	{CmdChangeDifficultyLevel,      CMD_SERVER}, /* CMD_CHANGE_DIFFICULTY_LEVEL */
+
+	{CmdStartStopShip,                       0}, /* CMD_START_STOP_SHIP */
+	{CmdSellShip,                            0}, /* CMD_SELL_SHIP */
+	{CmdBuildShip,                           0}, /* CMD_BUILD_SHIP */
+	{CmdSendShipToDepot,                     0}, /* CMD_SEND_SHIP_TO_DEPOT */
+	{CmdRefitShip,                           0}, /* CMD_REFIT_SHIP */
+
+	{CmdOrderRefit,                          0}, /* CMD_ORDER_REFIT */
+	{CmdCloneOrder,                          0}, /* CMD_CLONE_ORDER */
+
+	{CmdClearArea,                           0}, /* CMD_CLEAR_AREA */
+
+	{CmdMoneyCheat,                CMD_OFFLINE}, /* CMD_MONEY_CHEAT */
+	{CmdBuildCanal,                   CMD_AUTO}, /* CMD_BUILD_CANAL */
+	{CmdPlayerCtrl,                          0}, /* CMD_PLAYER_CTRL */
+
+	{CmdLevelLand,                    CMD_AUTO}, /* CMD_LEVEL_LAND */
+
+	{CmdRefitRailVehicle,                    0}, /* CMD_REFIT_RAIL_VEHICLE */
+	{CmdRestoreOrderIndex,                   0}, /* CMD_RESTORE_ORDER_INDEX */
+	{CmdBuildLock,                    CMD_AUTO}, /* CMD_BUILD_LOCK */
+
+	{CmdBuildSignalTrack,             CMD_AUTO}, /* CMD_BUILD_SIGNAL_TRACK */
+	{CmdRemoveSignalTrack,            CMD_AUTO}, /* CMD_REMOVE_SIGNAL_TRACK */
+
+	{CmdGiveMoney,                           0}, /* CMD_GIVE_MONEY */
+	{CmdChangePatchSetting,         CMD_SERVER}, /* CMD_CHANGE_PATCH_SETTING */
+	{CmdSetAutoReplace,                      0}, /* CMD_SET_AUTOREPLACE */
+	{CmdCloneVehicle,                        0}, /* CMD_CLONE_VEHICLE */
+	{CmdMassStartStopVehicle,                0}, /* CMD_MASS_START_STOP */
+	{CmdDepotSellAllVehicles,                0}, /* CMD_DEPOT_SELL_ALL_VEHICLES */
+	{CmdDepotMassAutoReplace,                0}, /* CMD_DEPOT_MASS_AUTOREPLACE */
+	{CmdCreateGroup,                         0}, /* CMD_CREATE_GROUP */
+	{CmdDeleteGroup,                         0}, /* CMD_DELETE_GROUP */
+	{CmdRenameGroup,                         0}, /* CMD_RENAME_GROUP */
+	{CmdAddVehicleGroup,                     0}, /* CMD_ADD_VEHICLE_GROUP */
+	{CmdAddSharedVehicleGroup,               0}, /* CMD_ADD_SHARE_VEHICLE_GROUP */
+	{CmdRemoveAllVehiclesGroup,              0}, /* CMD_REMOVE_ALL_VEHICLES_GROUP */
+	{CmdSetGroupReplaceProtection,           0}, /* CMD_SET_GROUP_REPLACE_PROTECTION */
+	{CmdMoveOrder,                           0}, /* CMD_MOVE_ORDER */
+	{CmdChangeTimetable,                     0}, /* CMD_CHANGE_TIMETABLE */
+	{CmdSetVehicleOnTime,                    0}, /* CMD_SET_VEHICLE_ON_TIME */
+	{CmdAutofillTimetable,                   0}, /* CMD_AUTOFILL_TIMETABLE */
 };
 
 /*!
@@ -414,7 +399,7 @@
 	CommandProc *proc;
 
 	/* Do not even think about executing out-of-bounds tile-commands */
-	if (tile >= MapSize() || IsTileType(tile, MP_VOID)) {
+	if (!IsValidTile(tile)) {
 		_cmd_text = NULL;
 		return CMD_ERROR;
 	}
@@ -426,7 +411,7 @@
 	_docommand_recursive++;
 
 	/* only execute the test call if it's toplevel, or we're not execing. */
-	if (_docommand_recursive == 1 || !(flags & DC_EXEC) || (flags & DC_FORCETEST) ) {
+	if (_docommand_recursive == 1 || !(flags & DC_EXEC) ) {
 		SetTownRatingTestMode(true);
 		res = proc(tile, flags & ~DC_EXEC, p1, p2);
 		SetTownRatingTestMode(false);
@@ -437,6 +422,7 @@
 
 		if (_docommand_recursive == 1 &&
 				!(flags & DC_QUERY_COST) &&
+				!(flags & DC_BANKRUPT) &&
 				res.GetCost() != 0 &&
 				!CheckPlayerHasMoney(res)) {
 			goto error;
@@ -461,7 +447,7 @@
 	}
 
 	/* if toplevel, subtract the money. */
-	if (--_docommand_recursive == 0) {
+	if (--_docommand_recursive == 0 && !(flags & DC_BANKRUPT)) {
 		SubtractMoneyFromPlayer(res);
 		/* XXX - Old AI hack which doesn't use DoCommandDP; update last build coord of player */
 		if (tile != 0 && IsValidPlayer(_current_player)) {
@@ -513,7 +499,7 @@
 	int y = TileY(tile) * TILE_SIZE;
 
 	/* Do not even think about executing out-of-bounds tile-commands */
-	if (tile >= MapSize() || IsTileType(tile, MP_VOID)) {
+	if (!IsValidTile(tile)) {
 		_cmd_text = NULL;
 		return false;
 	}
--- a/src/command_type.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/command_type.h	Mon Mar 10 15:26:39 2008 +0000
@@ -106,156 +106,156 @@
  * @see _command_proc_table
  */
 enum {
-	CMD_BUILD_RAILROAD_TRACK         =   0, ///< build a rail track
-	CMD_REMOVE_RAILROAD_TRACK        =   1, ///< remove a rail track
-	CMD_BUILD_SINGLE_RAIL            =   2, ///< build a single rail track
-	CMD_REMOVE_SINGLE_RAIL           =   3, ///< remove a single rail track
-	CMD_LANDSCAPE_CLEAR              =   4, ///< demolish a tile
-	CMD_BUILD_BRIDGE                 =   5, ///< build a bridge
-	CMD_BUILD_RAILROAD_STATION       =   6, ///< build a railroad station
-	CMD_BUILD_TRAIN_DEPOT            =   7, ///< build a train depot
-	CMD_BUILD_SIGNALS                =   8, ///< build a signal
-	CMD_REMOVE_SIGNALS               =   9, ///< remove a signal
-	CMD_TERRAFORM_LAND               =  10, ///< terraform a tile
-	CMD_PURCHASE_LAND_AREA           =  11, ///< purchase a tile
-	CMD_SELL_LAND_AREA               =  12, ///< sell a bought tile before
-	CMD_BUILD_TUNNEL                 =  13, ///< build a tunnel
-
-	CMD_REMOVE_FROM_RAILROAD_STATION =  14, ///< remove a tile station
-	CMD_CONVERT_RAIL                 =  15, ///< convert a rail type
-
-	CMD_BUILD_TRAIN_WAYPOINT         =  16, ///< build a waypoint
-	CMD_RENAME_WAYPOINT              =  17, ///< rename a waypoint
-	CMD_REMOVE_TRAIN_WAYPOINT        =  18, ///< remove a waypoint
-
-	CMD_BUILD_ROAD_STOP              =  21, ///< build a road stop
-	CMD_REMOVE_ROAD_STOP             =  22, ///< remove a road stop
-	CMD_BUILD_LONG_ROAD              =  23, ///< build a complete road (not a "half" one)
-	CMD_REMOVE_LONG_ROAD             =  24, ///< remove a complete road (not a "half" one)
-	CMD_BUILD_ROAD                   =  25, ///< build a "half" road
-	CMD_REMOVE_ROAD                  =  26, ///< remove a "half" road
-	CMD_BUILD_ROAD_DEPOT             =  27, ///< build a road depot
-
-	CMD_BUILD_AIRPORT                =  29, ///< build an airport
-
-	CMD_BUILD_DOCK                   =  30, ///< build a dock
-
-	CMD_BUILD_SHIP_DEPOT             =  31, ///< build a ship depot
-	CMD_BUILD_BUOY                   =  32, ///< build a buoy
-
-	CMD_PLANT_TREE                   =  33, ///< plant a tree
-
-	CMD_BUILD_RAIL_VEHICLE           =  34, ///< build a rail vehicle
-	CMD_MOVE_RAIL_VEHICLE            =  35, ///< move a rail vehicle (in the depot)
-
-	CMD_START_STOP_TRAIN             =  36, ///< start or stop a train
-
-	CMD_SELL_RAIL_WAGON              =  38, ///< sell a rail wagon
-
-	CMD_SEND_TRAIN_TO_DEPOT          =  39, ///< send a train to a depot
-	CMD_FORCE_TRAIN_PROCEED          =  40, ///< proceed a train to pass a red signal
-	CMD_REVERSE_TRAIN_DIRECTION      =  41, ///< turn a train around
-
-	CMD_MODIFY_ORDER                 =  42, ///< modify an order (like set full-load)
-	CMD_SKIP_TO_ORDER                =  43, ///< skip an order to the next of specific one
-	CMD_DELETE_ORDER                 =  44, ///< delete an order
-	CMD_INSERT_ORDER                 =  45, ///< insert a new order
-
-	CMD_CHANGE_SERVICE_INT           =  46, ///< change the server interval of a vehicle
-
-	CMD_BUILD_INDUSTRY               =  47, ///< build a new industry
-
-	CMD_BUILD_COMPANY_HQ             =  48, ///< build the company headquarter
-	CMD_SET_PLAYER_FACE              =  49, ///< set the face of the player/company
-	CMD_SET_PLAYER_COLOR             =  50, ///< set the color of the player/company
-
-	CMD_INCREASE_LOAN                =  51, ///< increase the loan from the bank
-	CMD_DECREASE_LOAN                =  52, ///< decrease the loan from the bank
-
-	CMD_WANT_ENGINE_PREVIEW          =  53, ///< confirm the preview of an engine
-
-	CMD_NAME_VEHICLE                 =  54, ///< rename a whole vehicle
-	CMD_RENAME_ENGINE                =  55, ///< rename a engine (in the engine list)
-	CMD_CHANGE_COMPANY_NAME          =  56, ///< change the company name
-	CMD_CHANGE_PRESIDENT_NAME        =  57, ///< change the president name
-	CMD_RENAME_STATION               =  58, ///< rename a station
+	CMD_BUILD_RAILROAD_TRACK,         ///< build a rail track
+	CMD_REMOVE_RAILROAD_TRACK,        ///< remove a rail track
+	CMD_BUILD_SINGLE_RAIL,            ///< build a single rail track
+	CMD_REMOVE_SINGLE_RAIL,           ///< remove a single rail track
+	CMD_LANDSCAPE_CLEAR,              ///< demolish a tile
+	CMD_BUILD_BRIDGE,                 ///< build a bridge
+	CMD_BUILD_RAILROAD_STATION,       ///< build a railroad station
+	CMD_BUILD_TRAIN_DEPOT,            ///< build a train depot
+	CMD_BUILD_SIGNALS,                ///< build a signal
+	CMD_REMOVE_SIGNALS,               ///< remove a signal
+	CMD_TERRAFORM_LAND,               ///< terraform a tile
+	CMD_PURCHASE_LAND_AREA,           ///< purchase a tile
+	CMD_SELL_LAND_AREA,               ///< sell a bought tile before
+	CMD_BUILD_TUNNEL,                 ///< build a tunnel
 
-	CMD_SELL_AIRCRAFT                =  59, ///< sell an aircraft
-	CMD_START_STOP_AIRCRAFT          =  60, ///< start/stop an aircraft
-	CMD_BUILD_AIRCRAFT               =  61, ///< build an aircraft
-	CMD_SEND_AIRCRAFT_TO_HANGAR      =  62, ///< send an aircraft to a hanger
-	CMD_REFIT_AIRCRAFT               =  64, ///< refit the cargo space of an aircraft
-
-	CMD_PLACE_SIGN                   =  65, ///< place a sign
-	CMD_RENAME_SIGN                  =  66, ///< rename a sign
-
-	CMD_BUILD_ROAD_VEH               =  67, ///< build a road vehicle
-	CMD_START_STOP_ROADVEH           =  68, ///< start/stop a road vehicle
-	CMD_SELL_ROAD_VEH                =  69, ///< sell a road vehicle
-	CMD_SEND_ROADVEH_TO_DEPOT        =  70, ///< send a road vehicle to the depot
-	CMD_TURN_ROADVEH                 =  71, ///< turn a road vehicle around
-	CMD_REFIT_ROAD_VEH               =  72, ///< refit the cargo space of a road vehicle
-
-	CMD_PAUSE                        =  73, ///< pause the game
-
-	CMD_BUY_SHARE_IN_COMPANY         =  74, ///< buy a share from a company
-	CMD_SELL_SHARE_IN_COMPANY        =  75, ///< sell a share from a company
-	CMD_BUY_COMPANY                  =  76, ///< buy a company which is bankrupt
-
-	CMD_BUILD_TOWN                   =  77, ///< build a town
-
-	CMD_RENAME_TOWN                  =  80, ///< rename a town
-	CMD_DO_TOWN_ACTION               =  81, ///< do a action from the town detail window (like advertises or bribe)
-
-	CMD_SET_ROAD_DRIVE_SIDE          =  82, ///< set the side where the road vehicles drive
-
-	CMD_CHANGE_DIFFICULTY_LEVEL      =  85, ///< change the difficult of a game (each setting for it own)
-
-	CMD_START_STOP_SHIP              =  86, ///< start/stop a ship
-	CMD_SELL_SHIP                    =  87, ///< sell a ship
-	CMD_BUILD_SHIP                   =  88, ///< build a new ship
-	CMD_SEND_SHIP_TO_DEPOT           =  89, ///< send a ship to a depot
-	CMD_REFIT_SHIP                   =  91, ///< refit the cargo space of a ship
+	CMD_REMOVE_FROM_RAILROAD_STATION, ///< remove a tile station
+	CMD_CONVERT_RAIL,                 ///< convert a rail type
 
-	CMD_ORDER_REFIT                  =  98, ///< change the refit informaction of an order (for "goto depot" )
-	CMD_CLONE_ORDER                  =  99, ///< clone (and share) an order
-	CMD_CLEAR_AREA                   = 100, ///< clear an area
-
-	CMD_MONEY_CHEAT                  = 102, ///< do the money cheat
-	CMD_BUILD_CANAL                  = 103, ///< build a canal
-
-	CMD_PLAYER_CTRL                  = 104, ///< used in multiplayer to create a new player etc.
-	CMD_LEVEL_LAND                   = 105, ///< level land
-
-	CMD_REFIT_RAIL_VEHICLE           = 106, ///< refit the cargo space of a train
-	CMD_RESTORE_ORDER_INDEX          = 107, ///< restore vehicle order-index and service interval
-	CMD_BUILD_LOCK                   = 108, ///< build a lock
-
-	CMD_BUILD_SIGNAL_TRACK           = 110, ///< add signals along a track (by dragging)
-	CMD_REMOVE_SIGNAL_TRACK          = 111, ///< remove signals along a track (by dragging)
+	CMD_BUILD_TRAIN_WAYPOINT,         ///< build a waypoint
+	CMD_RENAME_WAYPOINT,              ///< rename a waypoint
+	CMD_REMOVE_TRAIN_WAYPOINT,        ///< remove a waypoint
 
-	CMD_GIVE_MONEY                   = 113, ///< give money to an other player
-	CMD_CHANGE_PATCH_SETTING         = 114, ///< change a patch setting
-
-	CMD_SET_AUTOREPLACE              = 115, ///< set an autoreplace entry
-
-	CMD_CLONE_VEHICLE                = 116, ///< clone a vehicle
-	CMD_MASS_START_STOP              = 117, ///< start/stop all vehicles (in a depot)
-	CMD_DEPOT_SELL_ALL_VEHICLES      = 118, ///< sell all vehicles which are in a given depot
-	CMD_DEPOT_MASS_AUTOREPLACE       = 119, ///< force the autoreplace to take action in a given depot
+	CMD_BUILD_ROAD_STOP,              ///< build a road stop
+	CMD_REMOVE_ROAD_STOP,             ///< remove a road stop
+	CMD_BUILD_LONG_ROAD,              ///< build a complete road (not a "half" one)
+	CMD_REMOVE_LONG_ROAD,             ///< remove a complete road (not a "half" one)
+	CMD_BUILD_ROAD,                   ///< build a "half" road
+	CMD_REMOVE_ROAD,                  ///< remove a "half" road
+	CMD_BUILD_ROAD_DEPOT,             ///< build a road depot
 
-	CMD_CREATE_GROUP                 = 120, ///< create a new group
-	CMD_DELETE_GROUP                 = 121, ///< delete a group
-	CMD_RENAME_GROUP                 = 122, ///< rename a group
-	CMD_ADD_VEHICLE_GROUP            = 123, ///< add a vehicle to a group
-	CMD_ADD_SHARED_VEHICLE_GROUP     = 124, ///< add all other shared vehicles to a group which are missing
-	CMD_REMOVE_ALL_VEHICLES_GROUP    = 125, ///< remove all vehicles from a group
-	CMD_SET_GROUP_REPLACE_PROTECTION = 126, ///< set the autoreplace-protection for a group
+	CMD_BUILD_AIRPORT,                ///< build an airport
 
-	CMD_MOVE_ORDER                   = 127, ///< move an order
-	CMD_CHANGE_TIMETABLE             = 128, ///< change the timetable for a vehicle
-	CMD_SET_VEHICLE_ON_TIME          = 129, ///< set the vehicle on time feature (timetable)
-	CMD_AUTOFILL_TIMETABLE           = 130, ///< autofill the timetable
+	CMD_BUILD_DOCK,                   ///< build a dock
+
+	CMD_BUILD_SHIP_DEPOT,             ///< build a ship depot
+	CMD_BUILD_BUOY,                   ///< build a buoy
+
+	CMD_PLANT_TREE,                   ///< plant a tree
+
+	CMD_BUILD_RAIL_VEHICLE,           ///< build a rail vehicle
+	CMD_MOVE_RAIL_VEHICLE,            ///< move a rail vehicle (in the depot)
+
+	CMD_START_STOP_TRAIN,             ///< start or stop a train
+
+	CMD_SELL_RAIL_WAGON,              ///< sell a rail wagon
+
+	CMD_SEND_TRAIN_TO_DEPOT,          ///< send a train to a depot
+	CMD_FORCE_TRAIN_PROCEED,          ///< proceed a train to pass a red signal
+	CMD_REVERSE_TRAIN_DIRECTION,      ///< turn a train around
+
+	CMD_MODIFY_ORDER,                 ///< modify an order (like set full-load)
+	CMD_SKIP_TO_ORDER,                ///< skip an order to the next of specific one
+	CMD_DELETE_ORDER,                 ///< delete an order
+	CMD_INSERT_ORDER,                 ///< insert a new order
+
+	CMD_CHANGE_SERVICE_INT,           ///< change the server interval of a vehicle
+
+	CMD_BUILD_INDUSTRY,               ///< build a new industry
+
+	CMD_BUILD_COMPANY_HQ,             ///< build the company headquarter
+	CMD_SET_PLAYER_FACE,              ///< set the face of the player/company
+	CMD_SET_PLAYER_COLOR,             ///< set the color of the player/company
+
+	CMD_INCREASE_LOAN,                ///< increase the loan from the bank
+	CMD_DECREASE_LOAN,                ///< decrease the loan from the bank
+
+	CMD_WANT_ENGINE_PREVIEW,          ///< confirm the preview of an engine
+
+	CMD_NAME_VEHICLE,                 ///< rename a whole vehicle
+	CMD_RENAME_ENGINE,                ///< rename a engine (in the engine list)
+	CMD_CHANGE_COMPANY_NAME,          ///< change the company name
+	CMD_CHANGE_PRESIDENT_NAME,        ///< change the president name
+	CMD_RENAME_STATION,               ///< rename a station
+
+	CMD_SELL_AIRCRAFT,                ///< sell an aircraft
+	CMD_START_STOP_AIRCRAFT,          ///< start/stop an aircraft
+	CMD_BUILD_AIRCRAFT,               ///< build an aircraft
+	CMD_SEND_AIRCRAFT_TO_HANGAR,      ///< send an aircraft to a hanger
+	CMD_REFIT_AIRCRAFT,               ///< refit the cargo space of an aircraft
+
+	CMD_PLACE_SIGN,                   ///< place a sign
+	CMD_RENAME_SIGN,                  ///< rename a sign
+
+	CMD_BUILD_ROAD_VEH,               ///< build a road vehicle
+	CMD_START_STOP_ROADVEH,           ///< start/stop a road vehicle
+	CMD_SELL_ROAD_VEH,                ///< sell a road vehicle
+	CMD_SEND_ROADVEH_TO_DEPOT,        ///< send a road vehicle to the depot
+	CMD_TURN_ROADVEH,                 ///< turn a road vehicle around
+	CMD_REFIT_ROAD_VEH,               ///< refit the cargo space of a road vehicle
+
+	CMD_PAUSE,                        ///< pause the game
+
+	CMD_BUY_SHARE_IN_COMPANY,         ///< buy a share from a company
+	CMD_SELL_SHARE_IN_COMPANY,        ///< sell a share from a company
+	CMD_BUY_COMPANY,                  ///< buy a company which is bankrupt
+
+	CMD_BUILD_TOWN,                   ///< build a town
+
+	CMD_RENAME_TOWN,                  ///< rename a town
+	CMD_DO_TOWN_ACTION,               ///< do a action from the town detail window (like advertises or bribe)
+
+	CMD_SET_ROAD_DRIVE_SIDE,          ///< set the side where the road vehicles drive
+
+	CMD_CHANGE_DIFFICULTY_LEVEL,      ///< change the difficult of a game (each setting for it own)
+
+	CMD_START_STOP_SHIP,              ///< start/stop a ship
+	CMD_SELL_SHIP,                    ///< sell a ship
+	CMD_BUILD_SHIP,                   ///< build a new ship
+	CMD_SEND_SHIP_TO_DEPOT,           ///< send a ship to a depot
+	CMD_REFIT_SHIP,                   ///< refit the cargo space of a ship
+
+	CMD_ORDER_REFIT,                  ///< change the refit informaction of an order (for "goto depot" )
+	CMD_CLONE_ORDER,                  ///< clone (and share) an order
+	CMD_CLEAR_AREA,                   ///< clear an area
+
+	CMD_MONEY_CHEAT,                  ///< do the money cheat
+	CMD_BUILD_CANAL,                  ///< build a canal
+
+	CMD_PLAYER_CTRL,                  ///< used in multiplayer to create a new player etc.
+	CMD_LEVEL_LAND,                   ///< level land
+
+	CMD_REFIT_RAIL_VEHICLE,           ///< refit the cargo space of a train
+	CMD_RESTORE_ORDER_INDEX,          ///< restore vehicle order-index and service interval
+	CMD_BUILD_LOCK,                   ///< build a lock
+
+	CMD_BUILD_SIGNAL_TRACK,           ///< add signals along a track (by dragging)
+	CMD_REMOVE_SIGNAL_TRACK,          ///< remove signals along a track (by dragging)
+
+	CMD_GIVE_MONEY,                   ///< give money to an other player
+	CMD_CHANGE_PATCH_SETTING,         ///< change a patch setting
+
+	CMD_SET_AUTOREPLACE,              ///< set an autoreplace entry
+
+	CMD_CLONE_VEHICLE,                ///< clone a vehicle
+	CMD_MASS_START_STOP,              ///< start/stop all vehicles (in a depot)
+	CMD_DEPOT_SELL_ALL_VEHICLES,      ///< sell all vehicles which are in a given depot
+	CMD_DEPOT_MASS_AUTOREPLACE,       ///< force the autoreplace to take action in a given depot
+
+	CMD_CREATE_GROUP,                 ///< create a new group
+	CMD_DELETE_GROUP,                 ///< delete a group
+	CMD_RENAME_GROUP,                 ///< rename a group
+	CMD_ADD_VEHICLE_GROUP,            ///< add a vehicle to a group
+	CMD_ADD_SHARED_VEHICLE_GROUP,     ///< add all other shared vehicles to a group which are missing
+	CMD_REMOVE_ALL_VEHICLES_GROUP,    ///< remove all vehicles from a group
+	CMD_SET_GROUP_REPLACE_PROTECTION, ///< set the autoreplace-protection for a group
+
+	CMD_MOVE_ORDER,                   ///< move an order
+	CMD_CHANGE_TIMETABLE,             ///< change the timetable for a vehicle
+	CMD_SET_VEHICLE_ON_TIME,          ///< set the vehicle on time feature (timetable)
+	CMD_AUTOFILL_TIMETABLE,           ///< autofill the timetable
 };
 
 /**
@@ -271,7 +271,7 @@
 	DC_NO_RAIL_OVERLAP = 0x10, ///< don't allow overlap of rails (used in buildrail)
 	DC_AI_BUILDING     = 0x20, ///< special building rules for AI
 	DC_NO_TOWN_RATING  = 0x40, ///< town rating does not disallow you from building
-	DC_FORCETEST       = 0x80, ///< force test too.
+	DC_BANKRUPT        = 0x80, ///< company bankrupts, skip money check, skip vehicle on tile check in some cases
 };
 
 /**
--- a/src/console_cmds.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/console_cmds.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -810,7 +810,7 @@
 
 	if (argc < 2) return false;
 
-	_script_file = fopen(argv[1], "r");
+	_script_file = FioFOpenFile(argv[1], "r", BASE_DIR);
 
 	if (_script_file == NULL) {
 		if (argc == 2 || atoi(argv[2]) != 0) IConsoleError("script file not found");
@@ -834,7 +834,7 @@
 		IConsoleError("Encountered errror while trying to read from script file");
 
 	_script_running = false;
-	fclose(_script_file);
+	FioFCloseFile(_script_file);
 	return true;
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/alloc_func.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -0,0 +1,24 @@
+/* $Id$ */
+
+/** @file alloc_func.cpp functions to 'handle' memory allocation errors */
+
+#include "../stdafx.h"
+#include "alloc_func.hpp"
+
+/**
+ * Function to exit with an error message after malloc() or calloc() have failed
+ * @param size number of bytes we tried to allocate
+ */
+void MallocError(size_t size)
+{
+	error("Out of memory. Cannot allocate %i bytes", size);
+}
+
+/**
+ * Function to exit with an error message after realloc() have failed
+ * @param size number of bytes we tried to allocate
+ */
+void ReallocError(size_t size)
+{
+	error("Out of memory. Cannot reallocate %i bytes", size);
+}
--- a/src/core/alloc_func.hpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/core/alloc_func.hpp	Mon Mar 10 15:26:39 2008 +0000
@@ -6,6 +6,15 @@
 #define ALLOC_FUNC_HPP
 
 /**
+ * Functions to exit badly with an error message.
+ * It has to be linked so the error messages are not
+ * duplicated in each object file making the final
+ * binary needlessly large.
+ */
+void MallocError(size_t size);
+void ReallocError(size_t size);
+
+/**
  * Simplified allocation function that allocates the specified number of
  * elements of the given type. It also explicitly casts it to the requested
  * type.
@@ -25,7 +34,7 @@
 	if (num_elements == 0) return NULL;
 
 	T *t_ptr = (T*)malloc(num_elements * sizeof(T));
-	if (t_ptr == NULL) error("Out of memory. Cannot allocate %i bytes", num_elements * sizeof(T));
+	if (t_ptr == NULL) MallocError(num_elements * sizeof(T));
 	return t_ptr;
 }
 
@@ -49,7 +58,7 @@
 	if (num_elements == 0) return NULL;
 
 	T *t_ptr = (T*)calloc(num_elements, sizeof(T));
-	if (t_ptr == NULL) error("Out of memory. Cannot allocate %i bytes", num_elements * sizeof(T));
+	if (t_ptr == NULL) MallocError(num_elements * sizeof(T));
 	return t_ptr;
 }
 
@@ -77,7 +86,7 @@
 	}
 
 	t_ptr = (T*)realloc(t_ptr, num_elements * sizeof(T));
-	if (t_ptr == NULL) error("Out of memory. Cannot reallocate %i bytes", num_elements * sizeof(T));
+	if (t_ptr == NULL) ReallocError(num_elements * sizeof(T));
 	return t_ptr;
 }
 
--- a/src/core/math_func.hpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/core/math_func.hpp	Mon Mar 10 15:26:39 2008 +0000
@@ -169,6 +169,18 @@
 }
 
 /**
+ * Reduce an usigned 64-bit int to an unsigned 16-bit one
+ *
+ * @param a The 64-bit value to clamp
+ * @return The 64-bit value reduced to a 16-bit value
+ * @see ClampU(uint, uint, uint)
+ */
+static inline uint16 ClampToU16(const uint64 a)
+{
+	return min(a, 0xFFFF);
+}
+
+/**
  * Returns the (absolute) difference between two (scalar) variables
  *
  * @param a The first scalar
--- a/src/core/random_func.hpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/core/random_func.hpp	Mon Mar 10 15:26:39 2008 +0000
@@ -88,7 +88,7 @@
 static inline bool Chance16I(const uint a, const uint b, const uint32 r)
 {
 	assert(b != 0);
-	return (uint16)r < (uint16)((a << 16) / b);
+	return (uint16)r < (uint16)(((a << 16) + b / 2) / b);
 }
 
 /**
--- a/src/depot.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/depot.h	Mon Mar 10 15:26:39 2008 +0000
@@ -45,7 +45,7 @@
 			return IsTileType(tile, MP_RAILWAY) && GetRailTileType(tile)  == RAIL_TILE_DEPOT;
 
 		case TRANSPORT_ROAD:
-			return IsTileType(tile, MP_ROAD)    && GetRoadTileType(tile)  == ROAD_TILE_DEPOT;
+			return IsRoadDepotTile(tile);
 
 		case TRANSPORT_WATER:
 			return IsTileType(tile, MP_WATER)   && GetWaterTileType(tile) == WATER_TILE_DEPOT;
@@ -64,7 +64,7 @@
 static inline bool IsDepotTile(TileIndex tile)
 {
 	switch (GetTileType(tile)) {
-		case MP_ROAD:    return GetRoadTileType(tile)  == ROAD_TILE_DEPOT;
+		case MP_ROAD:    return IsRoadDepot(tile);
 		case MP_WATER:   return GetWaterTileType(tile) == WATER_TILE_DEPOT;
 		case MP_RAILWAY: return GetRailTileType(tile)  == RAIL_TILE_DEPOT;
 		case MP_STATION: return IsHangar(tile);
--- a/src/depot_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/depot_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -519,9 +519,11 @@
  * Only use this if it's the same widget, that's used for more than one vehicle type and it needs different text/sprites
  * Vehicle specific text/sprites, that's in a widget, that's only shown for one vehicle type (like sell whole train) is set in the widget array
  */
-static void SetupStringsForDepotWindow(Window *w, byte type)
+static void SetupStringsForDepotWindow(Window *w, VehicleType type)
 {
 	switch (type) {
+		default: NOT_REACHED();
+
 		case VEH_TRAIN:
 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_8800_TRAIN_DEPOT;
 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_TRAIN_TIP;
@@ -858,8 +860,13 @@
 		} break;
 
 		case WE_ABORT_PLACE_OBJ: {
+			/* abort clone */
 			w->RaiseWidget(DEPOT_WIDGET_CLONE);
 			w->InvalidateWidget(DEPOT_WIDGET_CLONE);
+
+			/* abort drag & drop */
+			WP(w, depot_d).sel = INVALID_VEHICLE;
+			w->InvalidateWidget(DEPOT_WIDGET_MATRIX);
 		} break;
 
 			/* check if a vehicle in a depot was clicked.. */
--- a/src/disaster_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/disaster_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -719,9 +719,8 @@
 
 	tile = v->tile + TileOffsByDiagDir(DirToDiagDir(v->direction));
 	if (IsValidTile(tile)) {
-		TrackdirBits r = (TrackdirBits)GetTileTrackStatus(tile, TRANSPORT_WATER, 0);
-
-		if (TrackdirBitsToTrackBits(r) == TRACK_BIT_ALL && !Chance16(1, 90)) {
+		TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0));
+		if (trackbits == TRACK_BIT_ALL && !Chance16(1, 90)) {
 			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 			SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 			return;
--- a/src/dock_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/dock_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -243,7 +243,7 @@
 	case WE_CREATE: w->LowerWidget(_station_show_coverage + 3); break;
 
 	case WE_PAINT: {
-		int rad = (_patches.modified_catchment) ? CA_DOCK : 4;
+		int rad = (_patches.modified_catchment) ? CA_DOCK : CA_UNMODIFIED;
 
 		if (WP(w, def_d).close) return;
 		DrawWindowWidgets(w);
--- a/src/dummy_land.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/dummy_land.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -64,7 +64,7 @@
 	/* not used */
 }
 
-static uint32 GetTileTrackStatus_Dummy(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Dummy(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
 	return 0;
 }
--- a/src/economy.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/economy.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -163,16 +163,16 @@
 				num++;
 				if (v->age > 730) {
 					/* Find the vehicle with the lowest amount of profit */
-					if (min_profit_first == true) {
+					if (min_profit_first || min_profit > v->profit_last_year) {
 						min_profit = v->profit_last_year;
 						min_profit_first = false;
-					} else if (min_profit > v->profit_last_year) {
-						min_profit = v->profit_last_year;
 					}
 				}
 			}
 		}
 
+		min_profit >>= 8; // remove the fract part
+
 		_score_part[owner][SCORE_VEHICLES] = num;
 		/* Don't allow negative min_profit to show */
 		if (min_profit > 0)
@@ -846,9 +846,9 @@
 	     55, ///< remove_dock
 	   1600, ///< remove_house
 	     40, ///< remove_road
-	   5600, ///< running_rail[0] railroad
-	   5200, ///< running_rail[1] monorail
-	   4800, ///< running_rail[2] maglev
+	   5600, ///< running_rail[0] steam
+	   5200, ///< running_rail[1] diesel
+	   4800, ///< running_rail[2] electric
 	   9600, ///< aircraft_running
 	   1600, ///< roadveh_running
 	   5600, ///< ship_running
@@ -914,6 +914,15 @@
 	_economy.fluct = GB(Random(), 0, 8) + 168;
 }
 
+
+Money GetPriceByIndex(uint8 index)
+{
+	if (index > NUM_PRICES) return 0;
+
+	return ((Money*)&_price)[index];
+}
+
+
 Pair SetupSubsidyDecodeParam(const Subsidy* s, bool mode)
 {
 	TileIndex tile;
@@ -1505,7 +1514,7 @@
 						cp->days_in_transit,
 						v->cargo_type);
 
-					front_v->profit_this_year += profit;
+					front_v->profit_this_year += profit << 8;
 					virtual_profit   += profit; // accumulate transfer profits for whole vehicle
 					cp->feeder_share += profit; // account for the (virtual) profit already made for the cargo packet
 					cp->paid_for      = true;   // record that the cargo has been paid for to eliminate double counting
@@ -1523,7 +1532,7 @@
 	}
 
 	if (route_profit != 0) {
-		front_v->profit_this_year += vehicle_profit;
+		front_v->profit_this_year += vehicle_profit << 8;
 		SubtractMoneyFromPlayer(CommandCost(front_v->GetExpenseType(true), -route_profit));
 
 		if (IsLocalPlayer() && !PlayVehicleSound(front_v, VSE_LOAD_UNLOAD)) {
--- a/src/economy_func.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/economy_func.h	Mon Mar 10 15:26:39 2008 +0000
@@ -41,4 +41,6 @@
 void VehiclePayment(Vehicle *front_v);
 void LoadUnloadStation(Station *st);
 
+Money GetPriceByIndex(uint8 index);
+
 #endif /* ECONOMY_FUNC_H */
--- a/src/economy_type.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/economy_type.h	Mon Mar 10 15:26:39 2008 +0000
@@ -112,18 +112,19 @@
 
 enum ExpensesType {
 	EXPENSES_CONSTRUCTION =  0,
-	EXPENSES_NEW_VEHICLES =  1,
-	EXPENSES_TRAIN_RUN    =  2,
-	EXPENSES_ROADVEH_RUN  =  3,
-	EXPENSES_AIRCRAFT_RUN =  4,
-	EXPENSES_SHIP_RUN     =  5,
-	EXPENSES_PROPERTY     =  6,
-	EXPENSES_TRAIN_INC    =  7,
-	EXPENSES_ROADVEH_INC  =  8,
-	EXPENSES_AIRCRAFT_INC =  9,
-	EXPENSES_SHIP_INC     = 10,
-	EXPENSES_LOAN_INT     = 11,
-	EXPENSES_OTHER        = 12,
+	EXPENSES_NEW_VEHICLES,
+	EXPENSES_TRAIN_RUN,
+	EXPENSES_ROADVEH_RUN,
+	EXPENSES_AIRCRAFT_RUN,
+	EXPENSES_SHIP_RUN,
+	EXPENSES_PROPERTY,
+	EXPENSES_TRAIN_INC,
+	EXPENSES_ROADVEH_INC,
+	EXPENSES_AIRCRAFT_INC,
+	EXPENSES_SHIP_INC,
+	EXPENSES_LOAN_INT,
+	EXPENSES_OTHER,
+	EXPENSES_END,
 	INVALID_EXPENSES      = 0xFF,
 };
 
--- a/src/elrail.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/elrail.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -103,7 +103,7 @@
 			return AxisToTrackBits(DiagDirToAxis(GetTunnelBridgeDirection(t)));
 
 		case MP_ROAD:
-			if (GetRoadTileType(t) != ROAD_TILE_CROSSING) return TRACK_BIT_NONE;
+			if (!IsLevelCrossing(t)) return TRACK_BIT_NONE;
 			if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
 			return GetCrossingRailBits(t);
 
@@ -189,7 +189,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,
-		IsTransparencySet(TO_BUILDINGS),
+		IsTransparencySet(TO_CATENARY),
 		BB_data[0] - sss->x_offset, BB_data[1] - sss->y_offset, BB_Z_SEPARATOR - sss->z_offset
 	);
 }
@@ -336,7 +336,7 @@
 
 					AddSortableSpriteToDraw(pylon_sprites[temp], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE,
 							GetPCPElevation(ti->tile, i),
-							IsTransparencySet(TO_BUILDINGS), -1, -1);
+							IsTransparencySet(TO_CATENARY), -1, -1);
 					break; /* We already have drawn a pylon, bail out */
 				}
 			}
@@ -344,7 +344,7 @@
 	}
 
 	/* Don't draw a wire under a low bridge */
-	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_BUILDINGS)) {
+	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_CATENARY)) {
 		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
 
 		if (height <= GetTileMaxZ(ti->tile) + TILE_HEIGHT) return;
@@ -371,7 +371,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,
-				IsTransparencySet(TO_BUILDINGS));
+				IsTransparencySet(TO_CATENARY));
 		}
 	}
 }
@@ -404,7 +404,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,
-		IsTransparencySet(TO_BUILDINGS)
+		IsTransparencySet(TO_CATENARY)
 	);
 
 	/* Finished with wires, draw pylons */
@@ -415,7 +415,7 @@
 		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, IsTransparencySet(TO_BUILDINGS), -1, -1);
+		AddSortableSpriteToDraw(pylon_sprites[PPPpos], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, height, IsTransparencySet(TO_CATENARY), -1, -1);
 	}
 
 	/* need a pylon on the southern end of the bridge */
@@ -425,7 +425,7 @@
 		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, IsTransparencySet(TO_BUILDINGS), -1, -1);
+		AddSortableSpriteToDraw(pylon_sprites[PPPpos], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, height, IsTransparencySet(TO_CATENARY), -1, -1);
 	}
 }
 
@@ -451,7 +451,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,
-					IsTransparencySet(TO_BUILDINGS)
+					IsTransparencySet(TO_CATENARY)
 				);
 				return;
 			}
--- a/src/engine.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/engine.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -91,8 +91,9 @@
 
 	/* Check for early retirement */
 	if (e->player_avail != 0 && !_patches.never_expire_vehicles) {
-		uint retire_early = EngInfo(e - _engines)->retire_early;
-		if (retire_early > 0 && age >= e->duration_phase_1 + e->duration_phase_2 - retire_early * 12) {
+		int retire_early = EngInfo(e - _engines)->retire_early;
+		uint retire_early_max_age = max(0, e->duration_phase_1 + e->duration_phase_2 - retire_early * 12);
+		if (retire_early != 0 && age >= retire_early_max_age) {
 			/* Early retirement is enabled and we're past the date... */
 			e->player_avail = 0;
 			AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type);
@@ -190,13 +191,13 @@
 		SetBit(p->avail_roadtypes, HasBit(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
 	}
 
-	e->preview_player = INVALID_PLAYER;
+	e->preview_player_rank = 0xFF;
 	if (player == _local_player) {
 		AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type);
 	}
 }
 
-static PlayerID GetBestPlayer(PlayerID pp)
+static PlayerID GetBestPlayer(uint8 pp)
 {
 	const Player *p;
 	int32 best_hist;
@@ -217,7 +218,7 @@
 		if (best_player == PLAYER_SPECTATOR) return PLAYER_SPECTATOR;
 
 		SetBit(mask, best_player);
-	} while (pp--, pp != 0);
+	} while (--pp != 0);
 
 	return best_player;
 }
@@ -233,16 +234,16 @@
 
 		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) {
 			if (e->flags & ENGINE_OFFER_WINDOW_OPEN) {
-				if (e->preview_player != 0xFF && !--e->preview_wait) {
+				if (e->preview_player_rank != 0xFF && !--e->preview_wait) {
 					e->flags &= ~ENGINE_OFFER_WINDOW_OPEN;
 					DeleteWindowById(WC_ENGINE_PREVIEW, i);
-					e->preview_player++;
+					e->preview_player_rank++;
 				}
-			} else if (e->preview_player != 0xFF) {
-				PlayerID best_player = GetBestPlayer(e->preview_player);
+			} else if (e->preview_player_rank != 0xFF) {
+				PlayerID best_player = GetBestPlayer(e->preview_player_rank);
 
 				if (best_player == PLAYER_SPECTATOR) {
-					e->preview_player = INVALID_PLAYER;
+					e->preview_player_rank = 0xFF;
 					continue;
 				}
 
@@ -272,7 +273,7 @@
 
 	if (!IsEngineIndex(p1)) return CMD_ERROR;
 	e = GetEngine(p1);
-	if (GetBestPlayer(e->preview_player) != _current_player) return CMD_ERROR;
+	if (GetBestPlayer(e->preview_player_rank) != _current_player) return CMD_ERROR;
 
 	if (flags & DC_EXEC) AcceptEnginePreview(p1, _current_player);
 
@@ -360,7 +361,7 @@
 
 				/* Do not introduce new rail wagons */
 				if (!IsWagon(e - _engines))
-					e->preview_player = (PlayerID)1; // Give to the player with the highest rating.
+					e->preview_player_rank = 1; // Give to the player with the highest rating.
 			}
 		}
 	}
@@ -403,22 +404,19 @@
 }
 
 
-/*
- * returns true if an engine is valid, of the specified type, and buildable by
- * the given player, false otherwise
- *
- * engine = index of the engine to check
- * type   = the type the engine should be of (VEH_xxx)
- * player = index of the player
+/** Check if an engine is buildable.
+ * @param engine index of the engine to check.
+ * @param type   the type the engine should be.
+ * @param player index of the player.
+ * @return True if an engine is valid, of the specified type, and buildable by
+ *              the given player.
  */
-bool IsEngineBuildable(EngineID engine, byte type, PlayerID player)
+bool IsEngineBuildable(EngineID engine, VehicleType type, PlayerID player)
 {
-	const Engine *e;
-
 	/* check if it's an engine that is in the engine array */
 	if (!IsEngineIndex(engine)) return false;
 
-	e = GetEngine(engine);
+	const Engine *e = GetEngine(engine);
 
 	/* check if it's an engine of specified type */
 	if (e->type != type) return false;
@@ -615,7 +613,7 @@
 
 	    SLE_VAR(Engine, lifelength,          SLE_UINT8),
 	    SLE_VAR(Engine, flags,               SLE_UINT8),
-	    SLE_VAR(Engine, preview_player,      SLE_UINT8),
+	    SLE_VAR(Engine, preview_player_rank, SLE_UINT8),
 	    SLE_VAR(Engine, preview_wait,        SLE_UINT8),
 	SLE_CONDNULL(1, 0, 44),
 	    SLE_VAR(Engine, player_avail,        SLE_UINT8),
--- a/src/engine.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/engine.h	Mon Mar 10 15:26:39 2008 +0000
@@ -36,7 +36,7 @@
 	uint16 max_speed;
 	uint16 power;
 	uint16 weight;
-	byte running_cost_base;
+	byte running_cost;
 	byte running_cost_class;
 	EngineClass engclass;           ///< Class of engine for this vehicle
 	byte capacity;
@@ -91,6 +91,7 @@
 	byte image_index;
 	byte base_cost;
 	byte running_cost;
+	byte running_cost_class;
 	SoundFxByte sfx;
 	byte max_speed;
 	byte capacity;
@@ -111,7 +112,7 @@
 	byte refit_cost;
 	byte misc_flags;
 	byte callbackmask;
-	byte retire_early; ///< Number of years early to retire vehicle
+	int8 retire_early;  ///< Number of years early to retire vehicle
 	StringID string_id; ///< Default name of engine
 };
 
@@ -125,7 +126,7 @@
 	uint16 duration_phase_1, duration_phase_2, duration_phase_3;
 	byte lifelength;
 	byte flags;
-	PlayerByte preview_player;
+	uint8 preview_player_rank;
 	byte preview_wait;
 	byte player_avail;
 	VehicleType type; ///< type, ie VEH_ROAD, VEH_TRAIN, etc.
@@ -169,7 +170,7 @@
 void LoadCustomEngineNames();
 void DeleteCustomEngineNames();
 
-bool IsEngineBuildable(EngineID engine, byte type, PlayerID player);
+bool IsEngineBuildable(EngineID engine, VehicleType type, PlayerID player);
 CargoID GetEngineCargoType(EngineID engine);
 
 enum {
@@ -186,14 +187,14 @@
 	ROAD_ENGINES_INDEX      = NUM_TRAIN_ENGINES,
 };
 
-static inline EngineID GetFirstEngineOfType(byte type)
+static inline EngineID GetFirstEngineOfType(VehicleType type)
 {
 	const EngineID start[] = {0, ROAD_ENGINES_INDEX, SHIP_ENGINES_INDEX, AIRCRAFT_ENGINES_INDEX};
 
 	return start[type];
 }
 
-static inline EngineID GetLastEngineOfType(byte type)
+static inline EngineID GetLastEngineOfType(VehicleType type)
 {
 	const EngineID end[] = {
 		NUM_TRAIN_ENGINES,
--- a/src/engine_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/engine_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -126,7 +126,7 @@
 	SetDParam(3, rvi->power << multihead);
 	SetDParam(1, rvi->weight << multihead);
 
-	SetDParam(4, rvi->running_cost_base * _price.running_rail[rvi->running_cost_class] >> 8 << multihead);
+	SetDParam(4, rvi->running_cost * GetPriceByIndex(rvi->running_cost_class) >> 8 << multihead);
 
 	if (rvi->capacity != 0) {
 		SetDParam(5, rvi->cargo_type);
@@ -155,7 +155,7 @@
 
 	SetDParam(0, (_price.roadveh_base >> 3) * rvi->base_cost >> 5);
 	SetDParam(1, rvi->max_speed * 10 / 32);
-	SetDParam(2, rvi->running_cost * _price.roadveh_running >> 8);
+	SetDParam(2, rvi->running_cost * GetPriceByIndex(rvi->running_cost_class) >> 8);
 	SetDParam(3, rvi->cargo_type);
 	SetDParam(4, rvi->capacity);
 
--- a/src/fsmport.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/fsmport.h	Mon Mar 10 15:26:39 2008 +0000
@@ -19,6 +19,18 @@
 	byte block;  //block number for this specific location
 };
 
+static FSMPortMovingData* copyFSMMovingData(const FSMPortMovingData *md) {
+	FSMPortMovingData* new_md = new FSMPortMovingData;
+	new_md->x = md->x;
+	new_md->y = md->y;
+	new_md->z = md->z;
+	new_md->direction = md->direction;
+	new_md->flag = md->flag;
+	new_md->state = md->state;
+	new_md->block = md->block;
+	return new_md;
+}
+
 struct FSMCommand {
 	FSMCommand *next;         ///< Possible extra movement choices from this position
 	FSMblockmap reserveblock; ///< The blocks to reserve at this state
--- a/src/gfx.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/gfx.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -37,7 +37,7 @@
 bool _exit_game;
 bool _networking;         ///< are we in networking mode?
 byte _game_mode;
-byte _pause_game;
+int8 _pause_game;
 int _pal_first_dirty;
 int _pal_count_dirty;
 
--- a/src/gfx_func.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/gfx_func.h	Mon Mar 10 15:26:39 2008 +0000
@@ -65,6 +65,7 @@
 extern Colour _cur_palette[256];
 
 void HandleKeypress(uint32 key);
+void HandleCtrlChanged();
 void HandleMouseEvents();
 void CSleep(int milliseconds);
 void UpdateWindows();
--- a/src/group.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/group.h	Mon Mar 10 15:26:39 2008 +0000
@@ -12,7 +12,7 @@
 
 enum {
 	ALL_GROUP     = 0xFFFD,
-	DEFAULT_GROUP = 0xFFFE,
+	DEFAULT_GROUP = 0xFFFE, ///< ungrouped vehicles are in this group.
 	INVALID_GROUP = 0xFFFF,
 };
 
@@ -23,7 +23,7 @@
 	char *name;                             ///< Group Name
 
 	uint16 num_vehicle;                     ///< Number of vehicles wich belong to the group
-	PlayerID owner;                         ///< Group Owner
+	PlayerByte owner;                       ///< Group Owner
 	VehicleTypeByte vehicle_type;           ///< Vehicle type of the group
 
 	bool replace_protection;                ///< If set to true, the global autoreplace have no effect on the group
--- a/src/group_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/group_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -134,6 +134,9 @@
 			if (v->group_id == g->index && v->type == g->vehicle_type) v->group_id = DEFAULT_GROUP;
 		}
 
+		/* Update backupped orders if needed */
+		if (_backup_orders_data.group == g->index) _backup_orders_data.group = DEFAULT_GROUP;
+
 		/* If we set an autoreplace for the group we delete, remove it. */
 		if (_current_player < MAX_PLAYERS) {
 			Player *p;
--- a/src/group_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/group_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -483,8 +483,8 @@
 
 				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);
+				SetDParam(0, v->GetDisplayProfitThisYear());
+				SetDParam(1, v->GetDisplayProfitLastYear());
 				DrawString(x + 19, y2 + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, TC_FROMSTRING);
 
 				if (IsValidGroupID(v->group_id)) {
@@ -761,6 +761,13 @@
 				SetWindowDirty(w);
 			}
 			break;
+
+		case WE_ABORT_PLACE_OBJ: // called when new object to place is selected from keyboard
+			/* abort drag & drop */
+			gv->vehicle_sel = INVALID_VEHICLE;
+			w->InvalidateWidget(GRP_WIDGET_LIST_VEHICLE);
+			break;
+
 	}
 }
 
--- a/src/gui.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/gui.h	Mon Mar 10 15:26:39 2008 +0000
@@ -106,7 +106,7 @@
 extern const TextColour _fios_colors[];
 
 /* bridge_gui.cpp */
-void ShowBuildBridgeWindow(TileIndex start, TileIndex end, byte type);
+void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte bridge_type);
 
 void ShowBuildIndustryWindow();
 void ShowMusicWindow();
--- a/src/industry_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/industry_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -815,7 +815,7 @@
 	ShowIndustryViewWindow(GetIndustryIndex(tile));
 }
 
-static uint32 GetTileTrackStatus_Industry(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Industry(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
 	return 0;
 }
@@ -1415,6 +1415,16 @@
 	return true;
 }
 
+/** Production level maximum, minimum and default values.
+ * It is not a value been really used in order to change, but rather an indicator
+ * of how the industry is behaving. */
+enum ProductionLevels {
+	PRODLEVEL_CLOSURE = 0x00,  ///< signal set to actually close the industry
+	PRODLEVEL_MINIMUM = 0x04,  ///< below this level, the industry is set to be closing
+	PRODLEVEL_DEFAULT = 0x10,  ///< default level set when the industry is created
+	PRODLEVEL_MAXIMUM = 0x80,  ///< the industry is running at full speed
+};
+
 static void DoCreateNewIndustry(Industry *i, TileIndex tile, int type, const IndustryTileTable *it, byte layout, const Town *t, Owner owner)
 {
 	const IndustrySpec *indspec = GetIndustrySpec(type);
@@ -1503,7 +1513,7 @@
 
 	if (!_generating_world) i->last_month_production[0] = i->last_month_production[1] = 0;
 
-	i->prod_level = 0x10;
+	i->prod_level = PRODLEVEL_DEFAULT;
 
 	do {
 		TileIndex cur_tile = tile + ToTileIndexDiff(it->ti);
@@ -2009,7 +2019,6 @@
  */
 static void ChangeIndustryProduction(Industry *i, bool monthly)
 {
-	extern StringID MapGRFStringID(uint32 grfid, StringID str);
 	StringID str = STR_NULL;
 	bool closeit = false;
 	const IndustrySpec *indspec = GetIndustrySpec(i->type);
@@ -2126,8 +2135,8 @@
 	}
 
 	/* Increase if needed */
-	while (mul-- != 0 && i->prod_level < 0x80) {
-		i->prod_level <<= 1;
+	while (mul-- != 0 && i->prod_level < PRODLEVEL_MAXIMUM) {
+		i->prod_level = min(i->prod_level * 2, PRODLEVEL_MAXIMUM);
 		i->production_rate[0] = min(i->production_rate[0] * 2, 0xFF);
 		i->production_rate[1] = min(i->production_rate[1] * 2, 0xFF);
 		if (str == STR_NULL) str = indspec->production_up_text;
@@ -2135,28 +2144,28 @@
 
 	/* Decrease if needed */
 	while (div-- != 0 && !closeit) {
-		if (i->prod_level == 4) {
+		if (i->prod_level == PRODLEVEL_MINIMUM) {
 			closeit = true;
 		} else {
-			i->prod_level >>= 1;
-			i->production_rate[0] = (i->production_rate[0] + 1) >> 1;
-			i->production_rate[1] = (i->production_rate[1] + 1) >> 1;
+			i->prod_level = max(i->prod_level / 2, (int)PRODLEVEL_MINIMUM); // typecast to int required to please MSVC
+			i->production_rate[0] = (i->production_rate[0] + 1) / 2;
+			i->production_rate[1] = (i->production_rate[1] + 1) / 2;
 			if (str == STR_NULL) str = indspec->production_down_text;
 		}
 	}
 
 	/* Increase or Decreasing the production level if needed */
 	if (increment != 0) {
-		if (increment < 0 && i->prod_level == 4) {
+		if (increment < 0 && i->prod_level == PRODLEVEL_MINIMUM) {
 			closeit = true;
 		} else {
-			i->prod_level = ClampU(i->prod_level + increment, 4, 0x80);
+			i->prod_level = ClampU(i->prod_level + increment, PRODLEVEL_MINIMUM, PRODLEVEL_MAXIMUM);
 		}
 	}
 
 	/* Close if needed and allowed */
 	if (closeit && !CheckIndustryCloseDownProtection(i->type)) {
-		i->prod_level = 0;
+		i->prod_level = PRODLEVEL_CLOSURE;
 		str = indspec->closure_text;
 	}
 
@@ -2200,7 +2209,7 @@
 
 	FOR_ALL_INDUSTRIES(i) {
 		UpdateIndustryStatistics(i);
-		if (i->prod_level == 0) {
+		if (i->prod_level == PRODLEVEL_CLOSURE) {
 			delete i;
 		} else {
 			ChangeIndustryProduction(i, true);
--- a/src/landscape.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/landscape.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -437,9 +437,18 @@
 	MarkTileDirtyByTile(tile);
 }
 
-uint32 GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode)
+/** Returns information about trackdirs and signal states.
+ * If there is any trackbit at 'side', return all trackdirbits.
+ * For TRANSPORT_ROAD, return no trackbits if there is no roadbit (of given subtype) at given side.
+ * @param tile tile to get info about
+ * @param mode transport type
+ * @param sub_mode for TRANSPORT_ROAD, roadtypes to check
+ * @param side side we are entering from, INVALID_DIAGDIR to return all trackbits
+ * @return trackdirbits and other info depending on 'mode'
+ */
+TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
-	return _tile_type_procs[GetTileType(tile)]->get_tile_track_status_proc(tile, mode, sub_mode);
+	return _tile_type_procs[GetTileType(tile)]->get_tile_track_status_proc(tile, mode, sub_mode, side);
 }
 
 void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player)
@@ -910,8 +919,3 @@
 		TileY(a) + (GB(r, 8, 8) * rn * 2 >> 8) - rn
 	));
 }
-
-bool IsValidTile(TileIndex tile)
-{
-	return (tile < MapSizeX() * MapMaxY() && TileX(tile) != MapMaxX());
-}
--- a/src/landscape.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/landscape.h	Mon Mar 10 15:26:39 2008 +0000
@@ -26,8 +26,6 @@
 byte HighestSnowLine(void);
 void ClearSnowLine(void);
 
-bool IsValidTile(TileIndex tile);
-
 uint GetPartialZ(int x, int y, Slope corners);
 uint GetSlopeZ(int x, int y);
 void GetSlopeZOnEdge(Slope tileh, DiagDirection edge, int *z1, int *z2);
--- a/src/lang/afrikaans.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/afrikaans.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1043,7 +1043,6 @@
 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}
@@ -1197,9 +1196,6 @@
 
 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
--- a/src/lang/brazilian_portuguese.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/brazilian_portuguese.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -214,7 +214,7 @@
 STR_00F4_500M                                                   :{BLACK}{TINYFONT}500m
 STR_00F5_TRAINS                                                 :{BLACK}{TINYFONT}Trens
 STR_00F6_ROAD_VEHICLES                                          :{BLACK}{TINYFONT}Automóveis
-STR_00F7_SHIPS                                                  :{BLACK}{TINYFONT}Navios
+STR_00F7_SHIPS                                                  :{BLACK}{TINYFONT}Embarcação
 STR_00F8_AIRCRAFT                                               :{BLACK}{TINYFONT}Aeronaves
 STR_00F9_TRANSPORT_ROUTES                                       :{BLACK}{TINYFONT}Rotas de Transporte
 STR_00FA_COAL_MINE                                              :{BLACK}{TINYFONT}Mina de Carvão
@@ -372,7 +372,7 @@
 STR_SORT_BY_DATE                                                :{BLACK}Data
 STR_SORT_BY_NUMBER                                              :Número
 STR_SORT_BY_PROFIT_LAST_YEAR                                    :Lucros do último ano
-STR_SORT_BY_PROFIT_THIS_YEAR                                    :Lucros deste ano
+STR_SORT_BY_PROFIT_THIS_YEAR                                    :Lucro anual
 STR_SORT_BY_AGE                                                 :Idade
 STR_SORT_BY_RELIABILITY                                         :Confiabilidade
 STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE                        :Capacidade total por tipo de carga
@@ -467,7 +467,7 @@
 STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Exibir vegetação no mapa
 STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}Exibir propriedades no mapa
 STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Alternar exibir/ocultar nomes das cidades no mapa
-STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}Lucro deste ano: {CURRENCY} (ano passado: {CURRENCY})
+STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}Lucro anual: {CURRENCY} (último ano: {CURRENCY})
 
 ############ range for service numbers starts
 STR_AGE                                                         :{COMMA} ano{P "" s} ({COMMA})
@@ -894,7 +894,7 @@
 STR_TOWNNAME_AUSTRIAN                                           :Austríaco
 STR_TOWNNAME_ROMANIAN                                           :Romeno
 STR_TOWNNAME_CZECH                                              :Checo
-STR_TOWNNAME_SWISS                                              :Suiça
+STR_TOWNNAME_SWISS                                              :Suiço
 STR_TOWNNAME_DANISH                                             :Dinamarquês
 STR_TOWNNAME_TURKISH                                            :Turco
 STR_TOWNNAME_ITALIAN                                            :Italiano
@@ -911,7 +911,7 @@
 STR_CURR_CZK                                                    :Coroa Checa (CZK)
 STR_CURR_DEM                                                    :Marco Alemão (DEM)
 STR_CURR_DKK                                                    :Coroa Dinamarquesa (DKK)
-STR_CURR_ESP                                                    :Peseta (ESP)
+STR_CURR_ESP                                                    :Peso (ESP)
 STR_CURR_FIM                                                    :Marco Finlandês (FIM)
 STR_CURR_FRF                                                    :Franco (FRF)
 STR_CURR_GRD                                                    :Dracma Grego (GRD)
@@ -926,7 +926,7 @@
 STR_CURR_SIT                                                    :Tolar Eslovênio (SIT)
 STR_CURR_SEK                                                    :Coroa Sueca (SEK)
 STR_CURR_YTL                                                    :Lira Turca (YTL)
-STR_CURR_SKK                                                    :Koruna Eslovaca (SKK)
+STR_CURR_SKK                                                    :Coroa Eslovaca (SKK)
 STR_CURR_BRR                                                    :Real Brasileiro (BRL)
 
 STR_CURR_CUSTOM                                                 :Personalizado...
@@ -963,8 +963,8 @@
 STR_MONTH_NOV                                                   :Novembro
 STR_MONTH_DEC                                                   :Dezembro
 
-STR_HEADING_FOR_STATION                                         :{LTBLUE}Dirigindo-se para {STATION}
-STR_HEADING_FOR_STATION_VEL                                     :{LTBLUE}Dirigindo-se para {STATION}, {VELOCITY}
+STR_HEADING_FOR_STATION                                         :{LTBLUE}Indo para {STATION}
+STR_HEADING_FOR_STATION_VEL                                     :{LTBLUE}Indo para {STATION}, {VELOCITY}
 STR_NO_ORDERS                                                   :{LTBLUE}Sem ordens
 STR_NO_ORDERS_VEL                                               :{LTBLUE}Sem ordens, {VELOCITY}
 
@@ -1049,9 +1049,8 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Deslocar janela quando o cursor está na borda do mapa: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Permitir o suborno da autoridade local: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Permtir compra de direitos exclusivos de transporte: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permitir o envio de dinheiro a outras companhias: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permitir o envio de dinheiro a outras empresas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novo busca de caminho global (NPF, sobrepõe NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de peso para trens simulando trens pesados: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permitir estações drive-through em ruas locais: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permitir construção de estações adjacentes: {ORANGE}{STRING}
@@ -1116,12 +1115,12 @@
 STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Pausar automaticamente ao inicar um novo jogo: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Usar a lista avançada de veículos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Desligado
-STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Própria Compania
-STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Todas as companias
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Própria empresa
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Todas as empresas
 STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Usar indicadores de carga: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Desligado
-STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Própria Compania
-STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Todas as Companias
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Própria empresa
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Todas as empresas
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Ativar plano de horário para veículos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Exibir plano de horário em tiques ao invés de dias: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Tipo padrão de ferrovia (ao criar ou carregar um jogo): {ORANGE}{STRING}
@@ -1163,7 +1162,7 @@
 STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}Data de início: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ENDING_YEAR                                  :{LTBLUE}Terminar jogo em: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}Ativar economia regular (alterações menores)
-STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permite comprar ações de outras companhias
+STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permite comprar ações de outras empresas
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Ao arrastar colocar sinais a cada: {ORANGE}{STRING} quadrado(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automaticamente constroi semáforos anteriores: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI                            :{LTBLUE}Ativar interface de sinais: {ORANGE}{STRING}
@@ -1206,9 +1205,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Alterar valor
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Alguns ou todos os intervalo(s) de serviço predefinidos abaixo são incompatíveis com o valor escolhido! São válidos 5-90% e 30-800 dias
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Usar YAPF para embarcações: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Usar YAPF para automóveis: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Usar YAPF para trens: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Pathfinder para trens: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Não recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Pathfinder para automóveis: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Não recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Pathfinder para embarcações: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Não recomendado)
 
 STR_TEMPERATE_LANDSCAPE                                         :terreno temperado
 STR_SUB_ARCTIC_LANDSCAPE                                        :terreno subártico
@@ -1228,8 +1237,8 @@
 STR_CHEAT_CHANGE_DATE                                           :{LTBLUE}Alterar data: {ORANGE} {DATE_SHORT}
 STR_CHEAT_SETUP_PROD                                            :{LTBLUE}Ativar modificação de valores de produção: {ORANGE}{STRING}
 
-STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}Dirigindo-se para {WAYPOINT}
-STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Dirigindo-se para {WAYPOINT}, {VELOCITY}
+STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}Indo para {WAYPOINT}
+STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Indo para {WAYPOINT}, {VELOCITY}
 
 STR_GO_TO_WAYPOINT                                              :Ir via {WAYPOINT}
 STR_GO_NON_STOP_TO_WAYPOINT                                     :Ir sem parar via {WAYPOINT}
@@ -1399,10 +1408,10 @@
 STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} cliente{P "" s}
 STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Máximo de clientes:
 STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Escolha o número máximo de clientes. Não é necessário estarem todos preenchidos
-STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} compan{P ia ias}
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} empresa{P "" s}
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Máximo de empresas:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Limita o servidor para uma certa quantia de empresas
-STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} espectator{P "" es}
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} espectador{P "" es}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Max espectadores:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Limita o servidor para um certa quantia de espectadores
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Idioma falado:
@@ -1751,7 +1760,7 @@
 STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsídio concedido a {COMPANY}!{}{} Transporte de {STRING} de {STATION} para {STATION} receberá 50% extra durante um ano!
 STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsídio concedido a {COMPANY}!{}{} Transporte de {STRING} de {STATION} para {STATION} receberá em dobro durante um ano!
 STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsídio concedido a {COMPANY}!{}{} Transporte de {STRING} de {STATION} para {STATION} receberá o triplo durante um ano!
-STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsídio concedido a {COMPANY}!{}{}Transporte de {STRING} de {STATION} para {STATION} receberá o quadruplo durante um ano!
+STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subsídio concedido a {COMPANY}!{}{} Transporte de {STRING} de {STATION} para {STATION} receberá o quadruplo durante um ano!
 STR_2035_LOCAL_AUTHORITY_REFUSES                                :{WHITE}a autoridade local de {TOWN} não permite que outro aeroporto seja construído nesta cidade
 STR_2036_COTTAGES                                               :Casas de campo
 STR_2037_HOUSES                                                 :Casas
@@ -1790,7 +1799,7 @@
 STR_2057                                                        :{ORANGE}{TOWN}{BLACK} ({COMMA})
 STR_2058_UNDER_CONSTRUCTION                                     :{STRING} (em construção)
 STR_2059_IGLOO                                                  :Iglú
-STR_205A_TEPEES                                                 :Tepees
+STR_205A_TEPEES                                                 :Ocas
 STR_205B_TEAPOT_HOUSE                                           :Casa-bule
 STR_205C_PIGGY_BANK                                             :Mealheiro
 
@@ -2002,8 +2011,8 @@
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produção no mês passado:
 STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportado)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centralizar visualização na localização da indústria
-STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nova {STRING} em construção em {TOWN}!
-STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nova {STRING} sendo plantada em {TOWN}!
+STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nov{G o a} {STRING} em construção em {TOWN}!
+STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nov{G o a} {STRING} sendo plantada em {TOWN}!
 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
@@ -2247,7 +2256,7 @@
 STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Alterar nome do presidente
 STR_7033_CHANGE_THE_COMPANY_NAME                                :{BLACK}Alterar nome da empresa
 STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Clique no novo esquema de cor
-STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Aumentar empréstimo
+STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Pedir empréstimo
 STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Pagar parte do empréstimo
 STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Presidente)
 STR_7038_INAUGURATED                                            :{GOLD}Inaugurado: {WHITE}{NUM}
@@ -2572,12 +2581,12 @@
 STR_80CE_MPS_PASSENGER_FERRY                                    :Barco de Passageiros MPS
 STR_80CF_FFP_PASSENGER_FERRY                                    :Barco de Passageiros FFP
 STR_80D0_BAKEWELL_300_HOVERCRAFT                                :Hovercraft Bakewell 300
-STR_80D1_CHUGGER_CHUG_PASSENGER                                 :Barco de Passageiros Chugger-Chug
-STR_80D2_SHIVERSHAKE_PASSENGER_FERRY                            :Barco de Passageiros Shivershake
-STR_80D3_YATE_CARGO_SHIP                                        :Navio de Bens Yate
-STR_80D4_BAKEWELL_CARGO_SHIP                                    :Navio de Bens Bakewell
-STR_80D5_MIGHTYMOVER_CARGO_SHIP                                 :Navio de Bens Mightymover
-STR_80D6_POWERNAUT_CARGO_SHIP                                   :Navio de Bens Powernaut
+STR_80D1_CHUGGER_CHUG_PASSENGER                                 :Navio de Passageiros Chugger-Chug
+STR_80D2_SHIVERSHAKE_PASSENGER_FERRY                            :Navio de Passageiros Shivershake
+STR_80D3_YATE_CARGO_SHIP                                        :Cargueiro Yate
+STR_80D4_BAKEWELL_CARGO_SHIP                                    :Cargueiro Bakewell
+STR_80D5_MIGHTYMOVER_CARGO_SHIP                                 :Cargueiro Mightymover
+STR_80D6_POWERNAUT_CARGO_SHIP                                   :Cargueiro Powernaut
 STR_80D7_SAMPSON_U52                                            :Sampson U52
 STR_80D8_COLEMAN_COUNT                                          :Coleman Count
 STR_80D9_FFP_DART                                               :FFP Dart
@@ -2659,8 +2668,8 @@
 STR_TIMETABLE_DAYS                                              :{COMMA} dia{P "" s}
 STR_TIMETABLE_TICKS                                             :{COMMA} tique{P "" s}
 
-STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Dirigindo-se ao depósito de {TOWN}
-STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Dirigindo-se ao depósito de {TOWN}, {VELOCITY}
+STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Indo para o depósito de {TOWN}
+STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Indo para o depósito de {TOWN}, {VELOCITY}
 STR_HEADING_FOR_TRAIN_DEPOT_SERVICE                             :{LTBLUE}Manutenção no depósito de {TOWN}
 STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL                         :{LTBLUE}Manutenção no depósito de {TOWN}, {VELOCITY}
 
@@ -2768,7 +2777,7 @@
 STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}Idade: {LTBLUE}{STRING}{BLACK}   Custo de circulação: {LTBLUE}{CURRENCY}/ano
 STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}Peso: {LTBLUE}{WEIGHT_S}  {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Velocidade Máx.: {LTBLUE}{VELOCITY}
 STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}Peso: {LTBLUE}{WEIGHT_S} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Velocidade: {LTBLUE}{VELOCITY} {BLACK}Manutenção.: {LTBLUE}{FORCE}
-STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Lucros deste ano: {LTBLUE}{CURRENCY}  (último ano: {CURRENCY})
+STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Lucro anual: {LTBLUE}{CURRENCY}  (último ano: {CURRENCY})
 STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}Confiabilidade: {LTBLUE}{COMMA}%  {BLACK}Quebras desde a última manutenção: {LTBLUE}{COMMA}
 STR_8861_STOPPED                                                :{RED}Parado
 STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}Impossível fazer o trem passar o sinal de perigo...
@@ -2792,9 +2801,9 @@
 STR_TRAIN_NO_POWER                                              :{RED}Sem força
 STR_TRAIN_START_NO_CATENARY                                     :Essa linha não tem energia, portanto o trem não parte
 
-STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Novo {STRING} agora disponível!
+STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Nov{G o a} {STRING} agora disponível!
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
-STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Novo {STRING} agora disponível!  -  {ENGINE}
+STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nov{G o a} {STRING} agora disponível!  -  {ENGINE}
 
 STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Impossível vender veículo destruído...
 STR_CAN_T_REFIT_DESTROYED_VEHICLE                               :{WHITE}Impossível adptar veículo destruído...
@@ -2823,7 +2832,7 @@
 STR_900C_DETAILS                                                :{WHITE}{VEHICLE} (Detalhes)
 STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}Idade: {LTBLUE}{STRING}{BLACK}   Custo de circulação: {LTBLUE}{CURRENCY}/ano
 STR_900E_MAX_SPEED                                              :{BLACK}Velocidade Máx.: {LTBLUE}{VELOCITY}
-STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Lucros deste ano: {LTBLUE}{CURRENCY}  (último ano: {CURRENCY})
+STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Lucro anual: {LTBLUE}{CURRENCY}  (último ano: {CURRENCY})
 STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Confiabilidade: {LTBLUE}{COMMA}%  {BLACK}Quebras desde a última manutenção: {LTBLUE}{COMMA}
 STR_9011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
 STR_9012_CAPACITY                                               :{BLACK}Capacidade: {LTBLUE}{CARGO}
@@ -2831,8 +2840,8 @@
 STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}Impossível vender automóvel...
 STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}Impossível iniciar/parar automóvel...
 STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}Automóvel {COMMA} está aguardando na garagem
-STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Dirigindo-se à garagem de {TOWN}
-STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Dirigindo-se à garagem de {TOWN}, {VELOCITY}
+STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Indo para a garagem de {TOWN}
+STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Indo para a garagem de {TOWN}, {VELOCITY}
 STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Manutenção na garagem de {TOWN}
 STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}Manutenção na garagem de {TOWN}, {VELOCITY}
 STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT                            :{WHITE}Impossível enviar o veículo para a garagem...
@@ -2899,15 +2908,15 @@
 STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (Detalhes)
 STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}Idade: {LTBLUE}{STRING}{BLACK}   Custo de circulação: {LTBLUE}{CURRENCY}/ano
 STR_9813_MAX_SPEED                                              :{BLACK}Velocidade Máx.: {LTBLUE}{VELOCITY}
-STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Lucros deste ano: {LTBLUE}{CURRENCY}  (último ano: {CURRENCY})
+STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Lucro anual: {LTBLUE}{CURRENCY}  (último ano: {CURRENCY})
 STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}Confiabilidade: {LTBLUE}{COMMA}%  {BLACK}Quebras desde a última manutenção: {LTBLUE}{COMMA}
 STR_9816_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
 STR_9817_CAPACITY                                               :{BLACK}Capacidade: {LTBLUE}{CARGO}
 STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}Impossível iniciar/parar embarcação...
 STR_9819_CAN_T_SEND_SHIP_TO_DEPOT                               :{WHITE}Impossível enviar embarcação para o depósito...
 STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Incapaz de encontrar depósito local
-STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Dirigindo-se ao depósito naval de {TOWN}
-STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Dirigindo-se ao depósito naval {TOWN}, {VELOCITY}
+STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Indo para o depósito naval de {TOWN}
+STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Indo para o depósito naval {TOWN}, {VELOCITY}
 STR_HEADING_FOR_SHIP_DEPOT_SERVICE                              :{LTBLUE}Manutenção no depósito naval de {TOWN}
 STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL                          :{LTBLUE}Manutenção no depósito naval de {TOWN}, {VELOCITY}
 STR_981C_SHIP_IS_WAITING_IN_DEPOT                               :{WHITE}Embarcação {COMMA} está aguardando no depósito naval
@@ -2967,12 +2976,12 @@
 STR_A00C_DETAILS                                                :{WHITE}{VEHICLE} (Detalhes)
 STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}Idade: {LTBLUE}{STRING}{BLACK}   Custo de circulação: {LTBLUE}{CURRENCY}/ano
 STR_A00E_MAX_SPEED                                              :{BLACK}Velocidade Máx.: {LTBLUE}{VELOCITY}
-STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Lucros deste ano: {LTBLUE}{CURRENCY}  (último ano: {CURRENCY})
+STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Lucro anual: {LTBLUE}{CURRENCY}  (último ano: {CURRENCY})
 STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Confiabilidade: {LTBLUE}{COMMA}%  {BLACK}Quebras desde a última manutenção: {LTBLUE}{COMMA}
 STR_A011_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
 STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Impossível enviar aeronave para o hangar...
-STR_HEADING_FOR_HANGAR                                          :{ORANGE}Dirigindo-se ao hangar de {STATION}
-STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}Dirigindo-se ao hangar de {STATION}, {VELOCITY}
+STR_HEADING_FOR_HANGAR                                          :{ORANGE}Indo para o hangar de {STATION}
+STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}Indo para o hangar de {STATION}, {VELOCITY}
 STR_HEADING_FOR_HANGAR_SERVICE                                  :{LTBLUE}Manutenção no Hangar de {STATION}
 STR_HEADING_FOR_HANGAR_SERVICE_VEL                              :{LTBLUE}Manutenção no Hangar de {STATION}, {VELOCITY}
 STR_A014_AIRCRAFT_IS_WAITING_IN                                 :{WHITE}Aeronave {COMMA} está aguardando no hangar
@@ -3030,7 +3039,7 @@
 STR_B002_OIL_REFINERY_EXPLOSION                                 :{BLACK}{BIGFONT}Explosão na refinaria de petróleo em {TOWN}!
 STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS                        :{BLACK}{BIGFONT}Fábrica destruída em circunstâncias suspeitas em {TOWN}!
 STR_B004_UFO_LANDS_NEAR                                         :{BLACK}{BIGFONT}OVNI pousa próximo a {TOWN}!
-STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Afundamento de mina de carvão deixa um rasto de destruição em {TOWN}!
+STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Afundamento da mina de carvão deixa um rasto de destruição em {TOWN}!
 STR_B006_FLOOD_VEHICLE_DESTROYED                                :{BLACK}{BIGFONT}Inundações!{}Pelo menos {COMMA} perdidos ou mortos após terríveis inundações!
 
 STR_BRIBE_FAILED                                                :{WHITE}A sua tentativa de suborno foi
@@ -3172,7 +3181,7 @@
 STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - {COMMA} Tre{P m ns}
 STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - {COMMA} Automóve{P l is}
 STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA} Embarcaç{P ão ões}
-STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} Aeronave
+STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} Aeronave{P "" s}
 
 STR_REPLACE_VEHICLES_WHITE                                      :{WHITE}Substituir {STRING}
 STR_REPLACE_VEHICLES_START                                      :{BLACK}Iniciar Substituição
@@ -3348,6 +3357,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Alternar transparência para construções como estações, depósitos, pontos de controle e eletrificação da ferrovia
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Alternar transparência para pontes
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Alternar transparência para estruturas como faróis e antenas, talvez no futuro para efeitos visuais
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Alternar transparência para catenária. CTRL+click para travar.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Altera transparência para os indicadores de carga
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
@@ -3362,20 +3372,20 @@
 STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
 STR_GROUP_ALL_TRAINS                                            :Todos os trens
 STR_GROUP_ALL_ROADS                                             :Todos os automóveis
-STR_GROUP_ALL_SHIPS                                             :Todos os navios
+STR_GROUP_ALL_SHIPS                                             :Todas as embarcações
 STR_GROUP_ALL_AIRCRAFTS                                         :Todas as aeronaves
 STR_GROUP_DEFAULT_TRAINS                                        :Trens sem grupo
 STR_GROUP_DEFAULT_ROADS                                         :Automóveis sem grupo
-STR_GROUP_DEFAULT_SHIPS                                         :Navios sem grupo
+STR_GROUP_DEFAULT_SHIPS                                         :Embarcações sem grupo
 STR_GROUP_DEFAULT_AIRCRAFTS                                     :Aeronaves sem grupo
 STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
 STR_GROUP_ADD_SHARED_VEHICLE                                    :Adicionar veículos compartilhados
 STR_GROUP_REMOVE_ALL_VEHICLES                                   :Remover todos os veículos
 
-STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Trem{P "" s}
-STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Automóvel{P "" s}
-STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Navio{P "" s}
-STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Aeronave
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Tre{P m ns}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Automóve{P l is}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Embarcaç{P ão ões}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Aeronave{P "" s}
 STR_GROUP_RENAME_CAPTION                                        :{BLACK}Renomear um grupo
 STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Substituir Veículos de "{GROUP}"
 
--- a/src/lang/bulgarian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/bulgarian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1051,7 +1051,6 @@
 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Преминаване през спирки на градски пътища: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Позвалявай допрени гари: {ORANGE}{STRING}
@@ -1206,9 +1205,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Промяна стойноста на настройка
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Някои от стойностите за интервал(и) на сервиз са несъвместими с избраните настройки! 5-90% и 30-800 са валидни стойности
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}YAPF за кораби: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}YAPF за автомобили: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}YAPF за влакове: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Пътенамирач за влакове: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Не е препоръчано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Препоръчано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Пътенамирач за пътни превозни средства: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Оригинал {RED}(Не е препоръчано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Препоръчано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Пътенамирач за кораби: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Оригинал {BLUE}(Препоръчано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Не е препоръчано)
 
 STR_TEMPERATE_LANDSCAPE                                         :умерен климат
 STR_SUB_ARCTIC_LANDSCAPE                                        :Арктичен климат
--- a/src/lang/catalan.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/catalan.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1049,7 +1049,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Permet comprar els drets del transport en exclusiva: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permet enviar diners a altres companyies: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estacions no uniformes: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nova cerca de rutes global (NPF, anul·la NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de pes per contenidor per simular trens pesats: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permet situar parades en carreteres que són propietat del poble: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permet construir estacions annexes: {ORANGE}{STRING}
@@ -1204,9 +1203,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Canvia el valor de l'adjustament
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Alguns o tots els intervals de manteniment següents són incompatibles amb el valor triat! 5-90% i 30-800 dies són els vàlids
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Utilitza YAPF pels vaixells: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Utilitza YAPF pels automòvils: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Utilitza YAPF pels trens: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Cerca de rutes per trens: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(No recomanat)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Recomanat)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Cerca de rutes per vehicles: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(No recomanat)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Recomanat)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Cerca de rutes per vaixells: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Recomanat)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Not recomanat)
 
 STR_TEMPERATE_LANDSCAPE                                         :paisatge temperat
 STR_SUB_ARCTIC_LANDSCAPE                                        :paisatge subàrtic
@@ -3344,6 +3353,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Activa/Desactiva transparència dels edificis com ara estacions, cotxeres, punts de trobada i catenàries
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Activa/Desactiva transparència dels ponts
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Activa/Desactiva transparència de les estructures com ara fars i antenes
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Commuta la transparència de la catenària. CTRL+clic per bloquejar.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Activa/Desactiva la transparència pels indicadors de carregament
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/croatian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/croatian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1049,7 +1049,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Dopusti kupovinu ekskluzivnih prijevoznih prava: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Dopusti slanje novca drugim tvrtkama: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Neujednačene stanice: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novo globalno pronalaženje puteva (NPF, isključuje NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Težinski množitelj za teret za simulaciju teških vlakova: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Dopusti prolazne stanice na cestama u vlasti grada: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Dopusti izgradnju pridruženih stanica: {ORANGE}{STRING}
@@ -1204,9 +1203,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Promijeni vrijednost postavke
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Neki ili svi od zadanih servisnih intervala ispod nisu kompatibilni s odabranim postavkama! Valjane vrijednosti su 5-90% ili 30-800 dana.
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Koristi YAPF za brodove: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Koristi YAPF za cestovna vozila: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Koristi YAPF za vlakove: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Blagi krajolik
 STR_SUB_ARCTIC_LANDSCAPE                                        :Pod-arktički krajolik
--- a/src/lang/czech.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/czech.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1107,7 +1107,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Umožnit kupování výhradních přepravních práv: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Umožnit zasílání peněz ostatním společnostem: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Nejednolité stanice: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nový globální algoritmus hledání cesty (NPF, nahradí NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Pro simulaci těžkých vlaků vynásobit hmotnost nákladu: {ORANGE}{STRING}x
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Povolit průjezdné zastávky na silnicích vlastněných obcemi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Povolit stavění přilehlých stanic: {ORANGE}{STRING}
@@ -1262,9 +1261,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Změnit hodnotu nastavení
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Některé nebo všechny základní intervaly servisů níže nesouhlasí s vybraným nastavením! 5-90 % nebo 30-800 dní jsou platné hodnoty
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Používat YAPF ("opět další pathfinder") pro lodě: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Používat YAPF pro silniční vozidla: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Používat YAPF pro vlaky: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Hledač cesty pro vlaky: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(nedoporučuje se)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(doporučený)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Hledač cesty pro silniční vozidla: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :původní {RED}(nedoporučuje se)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(doporučený)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Hledač cesty pro lodě: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :původní {BLUE}(doporučený)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(nedoporučuje se)
 
 STR_TEMPERATE_LANDSCAPE                                         :krajina mírného pásma
 STR_SUB_ARCTIC_LANDSCAPE                                        :subarktická krajina
@@ -3401,14 +3410,15 @@
 STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}... silnice je otočena jiným směrem
 
 STR_TRANSPARENCY_TOOLB                                          :{WHITE}Nastavení průhlednosti
-STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Změna průhlednosti jmen stanic
-STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Změna průhlednosti stromů
-STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Změna průhlednosti domů
-STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Změna průhlednosti továren
-STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Změna průhlednosti postavitelných objektů, jako stanic, kontrolních bodů a vedení
-STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Změna průhlednosti mostů
-STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Změna průhlednosti staveb jako majáků, vysílačů a doplňků (v budoucnosti)
-STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Přepnout průhlednost pro ukazatele naložení
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Změna průhlednosti jmen stanic. Nastavení se zamkne CTRL+kliknutím.
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Změna průhlednosti stromů. Nastavení se zamkne CTRL+kliknutím.
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Změna průhlednosti domů. Nastavení se zamkne CTRL+kliknutím.
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Změna průhlednosti továren. Nastavení se zamkne CTRL+kliknutím.
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Změna průhlednosti postavitelných objektů, jako stanic, dep a kontrolních bodů. Nastavení se zamkne CTRL+kliknutím.
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Změna průhlednosti mostů. Nastavení se zamkne CTRL+kliknutím.
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Změna průhlednosti staveb jako majáků, vysílačů a doplňků (v budoucnosti). Nastavení se zamkne CTRL+kliknutím.
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Změna průhlednosti elektrifikace. Nastavení se zamkne CTRL+kliknutím.
+STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Přepnout průhlednost pro ukazatele naložení. Nastavení se zamkne CTRL+kliknutím.
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
 STR_PERCENT_UP                                                  :{WHITE}{NUM}%{UPARROW}
--- a/src/lang/danish.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/danish.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1049,7 +1049,6 @@
 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillad gennemkørsels-stop på veje ejet af en by: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Tillad bygning af tilstødende stationer: {ORANGE}{STRING}
@@ -1204,9 +1203,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Skift indstillingsværdi
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Nogle eller alle standard service intervaller nedenunder er uforenelige med den valgte opsætning! 5-90% og 30-800 dage er gyldige
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Brug YAPF for skibe: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Brug YAPF for busser: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Brug YAPF for tog: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Tempereret klima
 STR_SUB_ARCTIC_LANDSCAPE                                        :Arktisk klima
--- a/src/lang/dutch.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/dutch.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1049,7 +1049,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Kopen van exclusieve transportrechten toestaan: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Geld geven aan andere bedrijven toestaan: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Vrij gevormde stations: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nieuwe globale routeplanner (NPF, voorkeur over NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Gewichtsverhouding voor vracht om zware treinen te simuleren: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Laat toe dat doorrij wegstops worden geplaatst op door stad beheerde wegen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Bouwen van aangrenzende stations toestaan: {ORANGE}{STRING}
@@ -1204,9 +1203,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Verander waarde
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Sommige of alle van de standaard reparatie interval(len) hier onder zijn ongeldig met gekozen instelling! 5-90% en 30-800 dagen zijn geldig
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Gebruik YAPF voor schepen: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Gebruik YAPF voor wegvoertuigen: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Gebruik YAPF voor treinen: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Routezoeker voor treinen: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Niet aanbevolen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Aanbevolen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Routezoeker voor voertuigen: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Niet aanbevolen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Routezoeker voor schepen: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Aanbevolen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Niet aanbevolen)
 
 STR_TEMPERATE_LANDSCAPE                                         :gematigd landschap
 STR_SUB_ARCTIC_LANDSCAPE                                        :subarctisch landschap
@@ -3344,6 +3353,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Wissel doorzichtigheid voor gebouwen zoals stations, depots, waypoints en bovenleiding
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Wissel doorzichtigheid voor bruggen
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Wissel doorzichtigheid voor structuren zoals vuurtoren en antennes, in de toekomst misschien voor eyecandy
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Doorzichtigheid voor bovenleiding. CTRL+klik voor onthouden.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Schakel tussen doorzichtigheid voor laad indicatoren
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/english.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/english.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1049,8 +1049,8 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Allow buying exclusive transport rights: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Allow sending money to other companies: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Nonuniform stations: {ORANGE}{STRING1}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}New global pathfinding (NPF, overrides NTP): {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Weight multiplier for freight to simulate heavy trains: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Plane speed factor: {ORANGE}1 / {STRING1}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Allow drive-through road stops on town owned roads: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Allow building adjacent stations: {ORANGE}{STRING}
 
@@ -1204,9 +1204,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Change setting value
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Some or all of the default service interval(s) below are incompatible with the chosen setting! 5-90% and 30-800 days are valid
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Use YAPF for ships: {ORANGE}{STRING1}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Use YAPF for roadvehs: {ORANGE}{STRING1}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Use YAPF for trains: {ORANGE}{STRING1}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Pathfinder for trains: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Not recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Pathfinder for road vehicles: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Not recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Pathfinder for ships: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Not recommended)
 
 STR_TEMPERATE_LANDSCAPE                                         :Temperate landscape
 STR_SUB_ARCTIC_LANDSCAPE                                        :Sub-arctic landscape
@@ -1602,6 +1612,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}No suitable railway track
 STR_1007_ALREADY_BUILT                                          :{WHITE}...already built
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Must remove railway track first
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Road is one way or blocked
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Railway Construction
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Electrified Railway Construction
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Monorail Construction
@@ -3337,14 +3348,15 @@
 STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...road facing in the wrong direction
 
 STR_TRANSPARENCY_TOOLB                                          :{WHITE}Transparency Options
-STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Toggle transparency for station signs
-STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Toggle transparency for trees
-STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Toggle transparency for houses
-STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Toggle transparency for industries
-STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Toggle transparency for buildables like stations, depots, waypoints and catenary
-STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Toggle transparency for bridges
-STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Toggle transparency for structures like lighthouses and antennas, maybe in future for eyecandy
-STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Toggle transparency for loading indicators
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Toggle transparency for station signs. CTRL+click to lock.
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Toggle transparency for trees. CTRL+click to lock.
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Toggle transparency for houses. CTRL+click to lock.
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Toggle transparency for industries. CTRL+click to lock.
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Toggle transparency for buildables like stations, depots and waypoints. CTRL+click to lock.
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Toggle transparency for bridges. CTRL+click to lock.
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Toggle transparency for structures like lighthouses and antennas. CTRL+click to lock.
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Toggle transparency for catenary. CTRL+click to lock.
+STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Toggle transparency for loading indicators. CTRL+click to lock.
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
 STR_PERCENT_UP                                                  :{WHITE}{NUM}%{UPARROW}
--- a/src/lang/english_US.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/english_US.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1046,7 +1046,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Allow buying exclusive transport rights: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Allow sending money to other companies: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Nonuniform stations: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}New global pathfinding (NPF, overrides NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Weight multiplier for freight to simulate heavy trains: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Allow drive-through road stops on town owned roads: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Allow building adjacent stations: {ORANGE}{STRING}
@@ -1201,9 +1200,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Change setting value
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Some or all of the default service interval(s) below are incompatible with chosen setting! 5-90% and 30-800 days are valid
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Use YAPF for ships: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Use YAPF for roadvehs: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Use YAPF for trains: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Temperate landscape
 STR_SUB_ARCTIC_LANDSCAPE                                        :Sub-arctic landscape
--- a/src/lang/esperanto.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/esperanto.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1036,7 +1036,6 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Ŝovu fenestron se la muso estas ĉe la rando: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Permesu subaĉeti la lokajn estrojn: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Nekonformaj stacioj: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nova ĝenerala vojtrovado (NPF, superas NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Pezpliigo pro ŝarĝo por imiti pezajn trajnojn: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permesu trairaj bushaltejoj sur vojoj urboposedataj: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permesu konstrui staciojn apude: {ORANGE}{STRING}
@@ -1163,9 +1162,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Ŝanĝu agord-valoron
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Iuj aŭ ĉiuj defaŭltaj prizorgintervaloj ne validas laŭ la agordoj! 5-90% kaj 30-800 tagoj validas
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Uzu YAPF por ŝipoj: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Uzu YAPF por vojveturiloj: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Uzu YAPF por trajnoj: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Modera landaspekto
 STR_SUB_ARCTIC_LANDSCAPE                                        :Arktikeca landaspekto
--- a/src/lang/estonian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/estonian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -754,7 +754,7 @@
 STR_0247_STEEL_MILL                                             :{BLACK}Terasetööstus
 STR_0248_FARM                                                   :{BLACK}Talu
 STR_0249_IRON_ORE_MINE                                          :{BLACK}Rauamaagikaevandus
-STR_024A_OIL_WELLS                                              :{BLACK}Naftapuurauk
+STR_024A_OIL_WELLS                                              :{BLACK}Naftapuuraugud
 STR_024B_BANK                                                   :{BLACK}Pank
 STR_024C_PAPER_MILL                                             :{BLACK}Paberitehas
 STR_024D_FOOD_PROCESSING_PLANT                                  :{BLACK}Toidutöötlustehas
@@ -1144,12 +1144,11 @@
 STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Aasta lõpus näidatakse rahavoogude aruannet: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}TTDPatchiga ühilduv 'mittepeatumine': {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Mootorsõidukite järjekorrad (koos mahueffektidega): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Kursori ekraani serva viimisel keritakse vaadet: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Kursoriga ekraaniserva puudutamisel keritakse vaadet: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Luba kohalikule omavalitsusele altkäemaksu maksmine: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Luba eksklusiivseid veoõiguseid osta: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Luba teistele ettevõtetele raha saata: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Luba suvalise kujuga jaamad: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Uus trassi otsimise algoritm(NPF asendab NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Raskete rongide simuleerimiseks kasutatav raskuse korrutaja: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Luba läbisõidupeatused linnateedel: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Luba jaamu lähestikku ehitada: {ORANGE}{STRING}
@@ -1263,7 +1262,7 @@
 STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}Luba sujuv majandus (väiksemad muutused)
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Luba teiste ettevõtete aktsiate ostmine
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Venitades rajatavate signaalide paigutustihedus: {ORANGE}{STRING} ühik(ut)
-STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Ehita ise semaforid enne: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Semafore ehitatakse enne: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI                            :{LTBLUE}Näita signalisatsiooni GUI-d: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Stsenaariumiredaktor ei tunnista "ilma teedeta" linnaplaneeringut
@@ -1304,9 +1303,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Muuda seadete väärtusi
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Mõni või kõik vaikimisi hooldusperioodid on kõlbmatud! Lubatud on 5-90% või 30-800 päeva
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Kasuta YAPF'i laevadel: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Kasuta YAPF'i autodel: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Kasuta YAPF'i rongidel: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Rongide rajaleidja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(ebasoovitatav)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(soovitatav)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Maanteesõidukite rajaleidja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Algne {RED}(ebasoovitatav)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(soovitatav)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Laevade rajaleidja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Algne {BLUE}(soovitatav)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(ebasoovitatav)
 
 STR_TEMPERATE_LANDSCAPE                                         :Parasvöötme maastik
 STR_SUB_ARCTIC_LANDSCAPE                                        :Arktiline maastik
@@ -3444,6 +3453,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Vaheta läbipaistvust ehitistel nagu: jaamad, depood, vahepunktid ja elektriliinid
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Vaheta sildade läbipaistvust
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Vaheta läbipaistvust rajatistel, nagu: majakad, antennid ja võimalik, et tulevikus ka silmailu
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Õhuliinide läbipaistvuse vahetamine. CTRL-klahvi toel klõpsamine lukustab.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Vaheta laadimisnäidikute läbipaistvust
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/finnish.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/finnish.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1039,7 +1039,6 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Vieritä ikkunaa, kun hiiri osuu reunaan: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Salli viranomaisten lahjominen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Epäyhtenäiset asemat: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Uusi globaali tienhakualgor. (NPF, korvaa NTP:n): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Kerroin rahdin painolle raskaiden junien simuilointiin: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Läpiajettavat pysäkit kaupungin teille: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Vierekkäiset asemat: {ORANGE}{STRING}
@@ -1192,9 +1191,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Muuta asetusarvo
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Osa allaolevista oletushuoltoväleistä ei ole yhteensopivia valitun asetuksen kanssa! 5-90{NBSP}% ja 30-800 päivää ovat oikein.
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Käytä uutta reitinetsijää (YAPF) laivoille: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Käytä uutta reitinetsijää (YAPF) autoille: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Käytä uutta reitinetsijää (YAPF) junille: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :lauhkea maasto
 STR_SUB_ARCTIC_LANDSCAPE                                        :pohjoinen maasto
--- a/src/lang/french.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/french.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1050,7 +1050,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Autoriser l'achat des droits de transports exclusifs: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Autoriser l'envoi d'argent aux autres compagnies: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Gares non uniformes: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nouvelle recherche de chemin global (NPF, écrase NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplier le poid pour les trains fret (simule des trains lourds): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Autoriser les arrêts de bus sur les routes des municipalités: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Autoriser la construction de stations adjacentes: {ORANGE}{STRING}
@@ -1205,9 +1204,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Changer valeur du paramètre
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Un ou plusieurs intervalles de service par défaut ci-dessous sont incompatibles avec le paramètre choisi! 5-90% et 30-800 jours sont valides
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Utiliser YAPF pour les navires: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Utiliser YAPF pour les véhicules routiers: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Utiliser YAPF pour les trains: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Recherche de chemin des trains: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Non recommandé)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Recommandé)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Recherche de chemin des véhicules routiers: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Not recommandé)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Recommandé)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Recherche de chemin des navires: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Recommandé)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Not recommandé)
 
 STR_TEMPERATE_LANDSCAPE                                         :environnement 'Tempéré'
 STR_SUB_ARCTIC_LANDSCAPE                                        :environnement 'Arctique'
@@ -1295,8 +1304,8 @@
 STR_FAST_FORWARD                                                :{BLACK}Avance rapide du jeu
 STR_MESSAGE_HISTORY                                             :{WHITE}Historique des Messages
 STR_MESSAGE_HISTORY_TIP                                         :{BLACK}Liste des messages récents
-STR_MESSAGES_DISABLE_ALL                                        :{BLACK}Tous sommaires
-STR_MESSAGES_ENABLE_ALL                                         :{BLACK}Tous complets
+STR_MESSAGES_DISABLE_ALL                                        :{BLACK}Désactiver tout
+STR_MESSAGES_ENABLE_ALL                                         :{BLACK}Activer tout
 
 STR_CONSTRUCT_COAL_MINE_TIP                                     :{BLACK}Construire une mine de charbon
 STR_CONSTRUCT_FOREST_TIP                                        :{BLACK}Planter une forêt
@@ -2682,11 +2691,11 @@
 
 STR_881F_BUILD_VEHICLE                                          :{BLACK}Construire
 STR_CLONE_ROAD_VEHICLE                                          :{BLACK}Copier Véhicule
-STR_CLONE_ROAD_VEHICLE_INFO                                     :{BLACK}Effectuer la copie d'un véhicule routier. Ctrl-clic partagera les ordres
-STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Effectuer la copie d'un véhicule routier. Cliquer ici puis sur un véhicule routier dans ou hors d'un dépôt. Ctrl-clic partagera les ordres
+STR_CLONE_ROAD_VEHICLE_INFO                                     :{BLACK}Effectuer la copie d'un véhicule routier. Ctrl-clic pour partager les ordres
+STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Effectuer la copie d'un véhicule routier. Cliquer ici puis sur un véhicule routier dans ou hors d'un dépôt. Ctrl-clic pour partager les ordres
 STR_CLONE_TRAIN                                                 :{BLACK}Copier Train
-STR_CLONE_TRAIN_INFO                                            :{BLACK}Effectuer la copie d'un train et ses wagons. Ctrl-clic partagera les ordres
-STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Effectuer la copie d'un train et ses wagons. Cliquer ici puis sur un train dans ou hors d'un dépôt. Ctrl-clic partagera les ordres
+STR_CLONE_TRAIN_INFO                                            :{BLACK}Effectuer la copie d'un train et ses wagons. Ctrl-clic pour partager les ordres
+STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Effectuer la copie d'un train et ses wagons. Cliquer ici puis sur un train dans ou hors d'un dépôt. Ctrl-clic pour partager les ordres
 STR_8820_RENAME                                                 :{BLACK}Renommer
 STR_8823_SKIP                                                   :{BLACK}Suivant
 STR_8824_DELETE                                                 :{BLACK}Supprimer
@@ -2695,7 +2704,7 @@
 STR_8827_FULL_LOAD                                              :{BLACK}Charger
 STR_8828_UNLOAD                                                 :{BLACK}Décharger
 STR_REFIT                                                       :{BLACK}Réaménager
-STR_REFIT_TIP                                                   :{BLACK}Choisir pour quelle cargaison réaménager pour cet ordre. Ctrl-clic  pour retirer l'instruction de réaménagement
+STR_REFIT_TIP                                                   :{BLACK}Choisir pour quelle cargaison réaménager pour cet ordre. Ctrl-clic pour retirer l'instruction de réaménagement
 STR_REFIT_ORDER                                                 :(Réaménager pour {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Horaire
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Basculer vers la vue horaire
@@ -2748,7 +2757,7 @@
 STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES                         :{BLACK}Afficher des informations sur les wagons
 STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Afficher la capacité de chaque wagon
 STR_SHOW_TOTAL_CARGO                                            :{BLACK}Afficher la capacité totale du train, par type de cargaison
-STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Liste des ordres - Cliquer sur un ordre pour le sélectionner.  Cliquer avec Ctrl déplace la vue sur la station
+STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Liste des ordres - Cliquer sur un ordre pour le sélectionner. Ctrl-clic pour déplacer la vue sur la station
 STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}Sauter l'ordre courant, et enchaîner sur le suivant. Ctrl-clic pour sauter l'ordre sélectionné
 STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}Supprime l'ordre sélectionné
 STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Transformer l'ordre sélectionné en Sans-Arrêt
@@ -2886,8 +2895,8 @@
 STR_9808_NEW_SHIPS                                              :{WHITE}Nouveaux navires
 STR_9809_BUILD_SHIP                                             :{BLACK}Construire navire
 STR_CLONE_SHIP                                                  :{BLACK}Copier Navire
-STR_CLONE_SHIP_INFO                                             :{BLACK}Effectuer la copie d'un navire. Ctrl-clic partagera les ordres
-STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Effectuer la copie d'un navire. Cliquer ici puis sur un navire dans ou hors d'un dépôt. Ctrl-clic partagera les ordres
+STR_CLONE_SHIP_INFO                                             :{BLACK}Effectuer la copie d'un navire. Ctrl-clic pour partager les ordres
+STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Effectuer la copie d'un navire. Cliquer ici puis sur un navire dans ou hors d'un dépôt. Ctrl-clic pour partager les ordres
 STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Le navire doit être arrêté au dépôt
 STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Impossible de vendre navire...
 STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Impossible de construire navire...
@@ -2953,8 +2962,8 @@
 STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}Hangar à {STATION}
 STR_A003_NEW_AIRCRAFT                                           :{BLACK}Nouvel aéronef
 STR_CLONE_AIRCRAFT                                              :{BLACK}Copier aéronef
-STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Effectuer une copie de l'aéronef. Ctrl-clic partagera les ordres
-STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}Effectuer la copie d'un aéronef. Cliquer ici puis sur un aéronef dans ou hors d'un hangar. Ctrl-clic partagera les ordres
+STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Effectuer une copie de l'aéronef. Ctrl-clic pour partager les ordres
+STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}Effectuer la copie d'un aéronef. Cliquer ici puis sur un aéronef dans ou hors d'un hangar. Ctrl-clic pour partager les ordres
 STR_A005_NEW_AIRCRAFT                                           :{WHITE}Nouvel Aéronef
 STR_A006_BUILD_AIRCRAFT                                         :{BLACK}Construire aéronef
 STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}Impossible de construire l'aéronef...
@@ -3338,14 +3347,15 @@
 STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...mauvaise orientation de la route
 
 STR_TRANSPARENCY_TOOLB                                          :{WHITE}Options de transparence
-STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Transparence des noms de station
-STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Transparence des arbres
-STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Transparence des maisons
-STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Transparence des industries
-STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Transparence des éléments constructibles tels que stations, dépôts, points de contrôle et caténaire
-STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Transparence des ponts
-STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Transparence des structures telles que phares et antennes
-STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Basculer la transparence pour les indicateurs de chargement
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Transparence des noms de station. Ctrl-clic pour vérouiller.
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Transparence des arbres. Ctrl-clic pour vérouiller.
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Transparence des maisons. Ctrl-clic pour vérouiller.
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Transparence des industries. Ctrl-clic pour vérouiller.
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Transparence des éléments constructibles tels que stations, dépôts, points de contrôle et caténaire. Ctrl-clic pour vérouiller.
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Transparence des ponts. Ctrl-clic pour vérouiller.
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Transparence des structures telles que phares et antennes. Ctrl-clic pour vérouiller.
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Transparence des caténaires. Ctrl-clic pour vérouiller.
+STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Transparence pour les indicateurs de chargement. Ctrl-clic pour vérouiller.
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
 STR_PERCENT_UP                                                  :{WHITE}{NUM}%{UPARROW}
--- a/src/lang/galician.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/galician.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1010,7 +1010,6 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Desplaza-la fiestra cando o ratón esté no borde: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Permiti-la chantaxe as autoridades locales: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estacións non uniformes: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nova búsqueda de ruta global (NPF, invalida NTP): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Permitir sempre aeroportos pequenos: {ORANGE}{STRING}
 
@@ -1102,9 +1101,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Cambia-lo valor
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}¡Algún ou tódolos intervalo(s) de servicio por defecto son incompatibles coa opción elixida! 5-90% e 30-800 días son válidos
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Usar YAPF para barcos: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Usar YAPF para vehículos de estrada: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Usar YAPF para os trens: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :escenario templado
 STR_SUB_ARCTIC_LANDSCAPE                                        :escenario sub-ártico
--- a/src/lang/german.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/german.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1049,7 +1049,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Erlaube den Erwerb exklusiver Transportrechte: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Erlaube es, anderen Firmen 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Bushaltestellen an städtischen Straßen erlauben: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Bau angrenzender Stationen erlauben: {ORANGE}{STRING}
@@ -1204,9 +1203,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Einstellungswert ändern
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Einige oder alle dieser Standardwartungsintervalle sind inkompatibel mit den gewählten Einstellungen! 5-90% und 30-800 Tage sind gültig.
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}BenutzeYAPF für Schiffe: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Benutze YAPF für Fahrzeuge: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Benutze YAPF für Züge: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Gemäßigt
 STR_SUB_ARCTIC_LANDSCAPE                                        :Subarktisch
--- a/src/lang/hungarian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/hungarian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1114,7 +1114,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Lehessen exkluzív szállítási jogot venni: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Lehessen más vállalatoknak pénzt küldeni: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Különböző vágánytípusok engedélyezése egy állomáson: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Új útvonalkereső (NPF, felülbírálja az NTP-t): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Tömegszorzó tehervonatoknak (szimulációs célból): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Áthajtható állomások engedélyezése városi utakra: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Érintkező állomások építésének engedélyezése: {ORANGE}{STRING}
@@ -1269,9 +1268,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Válassz beállítási értéket
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}A lenti alap szervíz intervallum beállítások némelyike/mindegyike inkompatibilis a választott beállítással! Csak 5-90% és 30-800 napig elfogadható.
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}YAPF használata hajóknál: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}YAPF használata közutakon: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}YAPF használata vonatokhoz: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Útvonalkereső vonatokhoz: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Ellenjavallt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Ajánlott)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Útvonalkereső közúti járművekhez: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Eredeti {RED}(Ellenjavallt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Ajánlott)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Útvonalkereső hajókhoz: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Eredeti {BLUE}(Ajánlott)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Ellenjavallt)
 
 STR_TEMPERATE_LANDSCAPE                                         :mérsékelt táj
 STR_SUB_ARCTIC_LANDSCAPE                                        :sarkköri táj
@@ -3446,6 +3455,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Átkapcsolni az építhető elemekre (állomások, depók, útipontok és felsővezeték)
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Átkapcsolni a hidakra
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Átkapcsolni egyéb épületekre, mint világítótorony és antennák (esetleg egyéb jövőbeni díszek)
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Átlátszóság kapcsolása a vezetékekhez, CTRL+click a zároláshoz.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Átlátszó betöltésjelző kapcsolása (ki/be)
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/icelandic.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/icelandic.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1029,7 +1029,6 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Færa sjónarhorn þegar músin nálgast brún gluggans: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Leyfilegt að múta bæjaryfirvöldum: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Órétthyrndar lestarstöðvar leyfðar: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nýtt alhliða leiðsögukerfi (NPF, yfirtekur NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Margfalda þyngd farms til að líkja eftir þyngri lestum: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Leyfa strætóstöðvar á gangstéttum bæja: {ORANGE}{STRING}
 
@@ -1131,9 +1130,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Breyta gildi stillingar
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Einhver eða öll bil milli skoðana hér fyrir neðan eru ósamhæfanleg við valdar stillingar! 5-90% og 30-800 dagar er leyfilegt
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Nota YAPF fyrir skip: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Nota YAPF fyrir bifreiðar: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Nota YAPF fyrir lestir: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Temprað landslag
 STR_SUB_ARCTIC_LANDSCAPE                                        :Heimskautalandslag
--- a/src/lang/italian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/italian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1051,7 +1051,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Consenti l'acquisto dell'esclusiva sui trasporti: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Consenti l'invio di denaro ad altre compagnie: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Stazioni non uniformi: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nuovo pathfinding globale (NPF, sovrascrive NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Moltiplicatore di peso per simulare treni merci pesanti: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Consenti fermate passanti sulle strade delle città: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Consenti la costruzione di stazioni adiacenti: {ORANGE}{STRING}
@@ -1206,9 +1205,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Cambia impostazione
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Alcuni degli intervalli sottostanti sono incompatibili con l'impostazione scelta! Valori ammessi: 5-90% e 30-800 giorni
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Usa YAPF per le navi: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Usa YAPF per gli automezzi: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Usa YAPF per i treni: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Pathfinder per i treni: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(non raccomandato)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(raccomandato)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Pathfinder per gli automezzi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Originale {RED}(non raccomandato)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(raccomandato)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Pathfinder per le navi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Originale {BLUE}(raccomandato)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(non raccomandato)
 
 STR_TEMPERATE_LANDSCAPE                                         :Paesaggio 'temperato'
 STR_SUB_ARCTIC_LANDSCAPE                                        :Paesaggio 'sub-artico'
@@ -3339,14 +3348,15 @@
 STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...strada rivolta nella direzione sbagliata
 
 STR_TRANSPARENCY_TOOLB                                          :{WHITE}Opzioni trasparenza
-STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Attiva/disattiva la trasparenza dei nomi delle stazioni
-STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Attiva/disattiva la trasparenza degli alberi
-STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Attiva/disattiva la trasparenza degli edifici
-STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Attiva/disattiva la trasparenza delle industrie
-STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Attiva/disattiva la trasparenza delle strutture edificabili come stazioni, depositi, waypoint e catenarie
-STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Attiva/disattiva la trasparenza dei ponti
-STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Attiva/disattiva la trasparenza di strutture come fari, antenne e altri futuri oggetti decorativi
-STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Attiva/disattiva la trasparenza degli indicatori di caricamento
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Attiva/disattiva la trasparenza dei nomi delle stazioni. CTRL+clic per bloccare.
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Attiva/disattiva la trasparenza degli alberi. CTRL+clic per bloccare.
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Attiva/disattiva la trasparenza degli edifici. CTRL+clic per bloccare.
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Attiva/disattiva la trasparenza delle industrie. CTRL+clic per bloccare.
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Attiva/disattiva la trasparenza delle strutture edificabili come stazioni, depositi e waypoint. CTRL+clic per bloccare.
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Attiva/disattiva la trasparenza dei ponti. CTRL+clic per bloccare.
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Attiva/disattiva la trasparenza di strutture come fari e antenne. CTRL+clic per bloccare.
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Attiva/disattiva la trasparenza delle catenarie. CTRL+clic per bloccare.
+STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Attiva/disattiva la trasparenza degli indicatori di caricamento. CTRL+clic per bloccare.
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
 STR_PERCENT_UP                                                  :{WHITE}{NUM}%{UPARROW}
--- a/src/lang/japanese.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/japanese.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1049,7 +1049,6 @@
 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}町有道路上に通過点の建設を許容:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}隣接した駅の建設を許容:{ORANGE}{STRING}
@@ -1204,9 +1203,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}設定を変更します
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}以下のデフォルトの修理間隔は選択した設定に対応していません!5〜90%もしくは30〜800日が使用できます。
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}船舶にYAPFを使用:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}道路車両にYAPFを使用:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}列車にYAPFを使用:{ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}電車の経路処理アルゴリズム:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP{RED}(すすめない)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF{BLUE}(おすすめ)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}道路車両の経路処理アルゴリズム:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :本来{RED}(すすめない)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF{BLUE}(おすすめ)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}船舶の経路処理アルゴリズム:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :本来{BLUE}(おすすめ)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF{RED}(すすめない)
 
 STR_TEMPERATE_LANDSCAPE                                         :温帯国
 STR_SUB_ARCTIC_LANDSCAPE                                        :亜寒帯国
@@ -3344,6 +3353,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}交通社所有の建物などの透明性を入/切
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}橋の透明性を入/切
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}灯台、送信機などの透明性を入/切
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}懸垂索の透明度を入/切します。CTRL+クリックすると、ロックします。
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}積み降ろしの表示の透明性を切り替え
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/korean.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/korean.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -16,6 +16,7 @@
 STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}평지가 필요합니다!
 STR_0008_WAITING                                                :{BLACK}대기: {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
+STR_EN_ROUTE_FROM                                               :{YELLOW}({1:STATION}에서 온 {0:SHORTCARGO})
 STR_000C_ACCEPTS                                                :{BLACK}받음: {WHITE}
 STR_000D_ACCEPTS                                                :{BLACK}받음: {GOLD}
 STR_000E                                                        :
@@ -1049,7 +1050,6 @@
 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}마을이 소유중인 도로를 통과하는 버스 정류장 건설 허용: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}정거장 근처에 건물 짓기 허용: {ORANGE}{STRING}
@@ -1204,9 +1204,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}설정값 변경
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}아래 기본 점검간격의 일부 혹은 전체가 선택된 설정과 맞지 않습니다. 5-90%와 30-800일이 사용 가능합니다.
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}선박에 YAPF 사용 : {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}자동차에 YAPF 사용 : {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}열차에 YAPF 사용 : {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}열차용 경로탐색: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(비추천)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(추천)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}차량을 위한 경로탐색: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :오리지널 {RED}(비추천)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(추천)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}선박을 위한 경로탐색: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :오리지널 {BLUE}(추천)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(비추천)
 
 STR_TEMPERATE_LANDSCAPE                                         :온대 기후
 STR_SUB_ARCTIC_LANDSCAPE                                        :냉대 기후
@@ -3344,6 +3354,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}정거장, 차량기지, 웨이포인트, 연결고리와 같은 건설 가능한 것들에 대한 투명 전환
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}다리 투명 전환
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}등대와 안테나와 같은 구조물 투명 전환
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}케이블 보이기/숨기기. 고정하려면 CTRL+클릭하세요.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}적재 정도 투명 전환
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/lithuanian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/lithuanian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1068,7 +1068,6 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Slinkti vaizdą pelei esant prie krašto: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Leisti papirkinėti miesto valdžią: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Nestandartines stoteles: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Globalus kelio radimo algoritmas (NPF, panaikina NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Krovinių svorio daugiklis skirtas imituoti prikrautus traukinius: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Visada leisti statyti mazus oro uotus: {ORANGE}{STRING}
@@ -1173,9 +1172,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Keisti reiksmes
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Klaidingai nurodytas remonto intervalas. Intervalas dienomis: 30-800 d., procentais: 5-90%.
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Naudoti YAPF laivams: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Naudoti YAPF masinoms: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Naudoti YAPF traukiniams: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Normalus klimatas
 STR_SUB_ARCTIC_LANDSCAPE                                        :Sub-arktinis klimatas
--- a/src/lang/norwegian_bokmal.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/norwegian_bokmal.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1048,7 +1048,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Tillat kjøp av eksklusive transportrettigheter: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Tillat pengeoverføring til andre firmaer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Uensartede stasjoner: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ny global rutesøking (NGR, overstyrer NTK): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Vektmultiplikator for frakt til å simulere tunge tog: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillat gjennomkjøring av stoppesteder på veier som er eid av byene: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Tillat bygging av nærliggende stasjoner: {ORANGE}{STRING}
@@ -1203,9 +1202,6 @@
 
 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{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}
 
 STR_TEMPERATE_LANDSCAPE                                         :Temperert landskap
 STR_SUB_ARCTIC_LANDSCAPE                                        :subarktisk landskap
--- a/src/lang/norwegian_nynorsk.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/norwegian_nynorsk.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1047,7 +1047,6 @@
 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillat å køyre gjennom stoppestadar på vegar som byane eig: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Tillat å byggje stasjonar inntil andre: {ORANGE}{STRING}
@@ -1202,9 +1201,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Endre innstillingsverdi
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Nokon eller alle standard-vedlikehaldsintervalla under er ikkje kompatible med valde innstillingar! 5-90 % og 30-800 dagar er gyldige
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Skip skal nytte YAPF: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Køyretøy skal nytte YAPF: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Tog skal nytte YAPF: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Temperert landskap
 STR_SUB_ARCTIC_LANDSCAPE                                        :subarktisk landskap
--- a/src/lang/piglatin.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/piglatin.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1039,7 +1039,6 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Anpay indowway enwhay ousemay isway atway ethay edgeway: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Allowway ibingbray ofway ethay ocallay authorityway: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Onuniformnay ationsstay: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ewnay obalglay athfindingpay (NPFay, overridesway NTPay): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Eightway ultipliermay orfay eightfray otay imulatesay eavyhay ainstray: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Allowway ivedray-oughthray oadray opsstay onway owntay ownedway oadsray: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Allowway uildingbay adjacentway ationsstay: {ORANGE}{STRING}
@@ -1192,9 +1191,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Angechay ettingsay aluevay
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Omesay orway allway ofway ethay efaultday ervicesay intervalway(say) elowbay areway incompatibleway ithway ethay osenchay ettingsay! 5-90% andway 30-800 aysday areway alidvay
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Useway YAPFay orfay ipsshay: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Useway YAPFay orfay oadvehsray: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Useway YAPFay orfay ainstray: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Emperatetay andscapelay
 STR_SUB_ARCTIC_LANDSCAPE                                        :Ubsay-arcticway andscapelay
--- a/src/lang/polish.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/polish.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1133,7 +1133,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Pozwól na kupno wyłączności transportowej: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Pozwól na wysyłanie pieniędzy do innych firm:: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Niejednolite stacje: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nowe szukanie drogi (NPF, zastępuje NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Mnożnik wagi dla symulacji ciężkich pociągów towarowych: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Pozwól na budowę przystanków typu ro-ro na drogach miejskich: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Pozwól na budowę stacji przyległych do stacji przeciwnika (z CTRL): {ORANGE}{STRING}
@@ -1288,9 +1287,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Zmiana wartości
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Niektóre lub wszystkie domyślne okresy między serwisowania są sprzeczne z wybranymi! 5-90% i 30-800 dni są poprawne
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Używaj YAPF dla statków: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Używaj YAPF dla samochodów: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Używaj YAPF dla pociągów: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Krajobraz umiarkowany
 STR_SUB_ARCTIC_LANDSCAPE                                        :Krajobraz arktyczny
--- a/src/lang/portuguese.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/portuguese.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -15,6 +15,7 @@
 STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}É necessário terreno plano
 STR_0008_WAITING                                                :{BLACK}Em espera: {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
+STR_EN_ROUTE_FROM                                               :{YELLOW}({SHORTCARGO} em rota de {STATION})
 STR_000C_ACCEPTS                                                :{BLACK}Aceita: {WHITE}
 STR_000D_ACCEPTS                                                :{BLACK}Aceita: {GOLD}
 STR_000E                                                        :
@@ -724,6 +725,7 @@
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Colocar transmissor
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Definir área de deserto.{}Manter a tecla CTRL pressionada para remover
 STR_CREATE_LAKE                                                 :{BLACK}Definir área de água.{}Construir um canal com a tecla CTRL numa área que não seja a do mar, senão inundar-se-iam as zonas circundantes
+STR_CREATE_RIVER                                                :{BLACK}Colocar rios.
 STR_0290_DELETE                                                 :{BLACK}Apagar
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Apagar completamente esta cidade
 STR_0292_SAVE_SCENARIO                                          :Guardar cenário
@@ -1047,7 +1049,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Permitir comprar exclusivo dos direitos de transportes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permitir enviar dinheiro para outras empresas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nova procura de caminho global (NPF, substitui NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de peso para simular comboios pesados: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permitir estações de passagem em estradas das cidades: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permitir construção de estações adjacentes: {ORANGE}{STRING}
@@ -1202,9 +1203,7 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Alterar valor
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Alguns ou todos os intervalo(s) de serviço predefinidos abaixo são incompatíveis com o valor escolhido! São válidos 5-90% e 30-800 dias
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Usar YAPF para navios: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Usar YAPF para veículos de estrada: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Usar YAPF para comboios: {ORANGE}{STRING}
+
 
 STR_TEMPERATE_LANDSCAPE                                         :Terreno temperado
 STR_SUB_ARCTIC_LANDSCAPE                                        :terreno subárctico
--- a/src/lang/romanian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/romanian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1047,7 +1047,6 @@
 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permite semafoare in intersectiile drumurilor din proprietatea orasului: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permite construirea de statii adiacente: {ORANGE}{STRING}
@@ -1202,9 +1201,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Schimbã valoarea setãrii
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Unele sau toate din intervalurile de service alese sunt incompatibile cu setarea aleasa! Valorile valide sunt cuprinse intre 5-90% si 30-800 zile
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Foloseste YAPF pentru nave: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Foloseste YAPF pentru autoveh: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Foloseste YAPF pentru trenuri: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :peisajul temperat
 STR_SUB_ARCTIC_LANDSCAPE                                        :peisajul sub-arctic
--- a/src/lang/russian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/russian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1051,7 +1051,6 @@
 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Позволять строить остановки на городских дорогах: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Разрешить строительство смежных станций: {ORANGE}{STRING}
@@ -1206,9 +1205,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Изменить значение
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Некоторые интервалы не совместимы с выбранной установкой. Допускаются значения 5-90% или 30-800 дней
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Алгоритм навигации YAPF для кораблей: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Алгоритм навигации YAPF для автотранспорта: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Алгоритм навигации YAPF для поездов: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Умеренный ландшафт
 STR_SUB_ARCTIC_LANDSCAPE                                        :Субарктический ландшафт
--- a/src/lang/simplified_chinese.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/simplified_chinese.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1035,7 +1035,6 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}当鼠标移动到屏幕边缘时移动屏幕:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}允许贿赂地方政府:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}允许异形站台:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}新的全局路径搜索 (NPF,替换 NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}根据装载货物的数量模拟超重列车:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}允许在城镇所有的道路上穿过禁行标志 {ORANGE}{STRING}
 
@@ -1153,9 +1152,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}改变设置值
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}下面一个或多个保养周期的值设置不对,应当在 0%-90% 或 30-800 天之内。
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}在船只上应用 YAPF:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}在汽车上应用 YAPF:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}在火车上应用 YAPE:{ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :温带景观
 STR_SUB_ARCTIC_LANDSCAPE                                        :寒带景观
--- a/src/lang/slovak.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/slovak.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1113,7 +1113,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Povolit zakúpenie exkluzívnych dopravných práv: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Umožnit posielanie penazí ostatným spolocnostiam: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Roznorode stanice: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novy globalny algoritmus hladania cesty (NPF namiesto NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Váhový násobok pre nákladné vlaky: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Povolit prejazdné zastávky na mestských cestách: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Povolit stavbu oddelených staníc: {ORANGE}{STRING}
@@ -1268,9 +1267,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Zmenit hodnotu nastavenia
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Niektore alebo vsetky implicitne servisne intervaly su nekompatibilne s vybranym nastavenim. 5-90% a 30-800 dni su platne.
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Pouzit YAPF pre lode: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Pouzit YAPF pre vozidla: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Pouzit YAPF pre vlaky: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Algoritmus hladania cesty pre vlaky: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(neodporúca sa)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(odporúca sa)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Algoritmus hladania cesty pre automobily: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :pôvodný {RED}(neodporúca sa)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(odporúca sa)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Algoritmus hladania cesty pre lode: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :pôvodný {BLUE}(odporúca sa)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(neodporúca sa)
 
 STR_TEMPERATE_LANDSCAPE                                         :krajina mierneho pasma
 STR_SUB_ARCTIC_LANDSCAPE                                        :subarkticka krajina
@@ -3408,6 +3417,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Prepnút priehladnost staníc, garáží, tratí, ...
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Prepnút priehladnost mostov
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Prepnút priehladnost objektov ako sú majáky a antény
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Prepnút priehladnost pre trakcné vedenie. CTRL+klik pre uzamknutie.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Prepnút priehladnost pre ukazovatele nakladania a vykladania
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/slovenian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/slovenian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -16,6 +16,7 @@
 STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Potrebno je ravno zemljišče
 STR_0008_WAITING                                                :{BLACK}Čaka: {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
+STR_EN_ROUTE_FROM                                               :{YELLOW}({SHORTCARGO} na poti iz {STATION})
 STR_000C_ACCEPTS                                                :{BLACK}Sprejema: {WHITE}
 STR_000D_ACCEPTS                                                :{BLACK}Sprejema: {GOLD}
 STR_000E                                                        :
@@ -1090,7 +1091,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Dovoli nakup ekskluzivnih prevoznih dovoljenj: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Dovoli pošiljanje denarja drugim podjetjem: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Neenake postaje: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novo skupno iskanje poti (NPF, prevlada NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Koeficient teže tovora za simulacijo težkih vlakov: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Dovoli prehodne postaje na cestah v lasti mest: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Dovoli gradnjo združljivih postaj: {ORANGE}{STRING}
@@ -1245,9 +1245,7 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Spremeni vrednost
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Nekatera ali vsa privzeta obdobja servisiranja spodaj niso združljiva z izborom! 5-90% in 30-800 dni je veljavno
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Uporabi YAPF za ladje: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Uporabi YAPF za cestna vozila: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Uporabi YAPF za vlake: {ORANGE}{STRING}
+
 
 STR_TEMPERATE_LANDSCAPE                                         :Zmerno podnebje
 STR_SUB_ARCTIC_LANDSCAPE                                        :Sub arktično podnebje
--- a/src/lang/spanish.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/spanish.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1050,7 +1050,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Permitir comprar derechos de transporte exclusivos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permitir enviar dinero a otras empresas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estaciones no uniformes: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nuevo sistema de busq. de rutas global (NPF, anula a NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Carga el multiplicador de peso para simular trenes pesados: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permite conducir en paradas sobre carreteras de ciudades: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permitir construcción en estaciones contiguas : {ORANGE}{STRING}
@@ -1205,9 +1204,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Cambiar valor de la opción
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Alguno o todos los intervalos de servicio por defecto mostrados son incompatibles con la configuración elegida! 5-90% y 30-800 días son válidos
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Usar YAPF para barcos: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Usar YAPF para vehículos de carretera: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Usar YAPF para trenes: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Pathfinder para trenes: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(No recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Pathfinder para vehículos de carretera: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(No recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Pathfinder para barcos: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(No recomendado)
 
 STR_TEMPERATE_LANDSCAPE                                         :Paisaje templado
 STR_SUB_ARCTIC_LANDSCAPE                                        :Paisaje sub-ártico
@@ -3345,6 +3354,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Activar transparencias para construcciones como estaciones, depósitos, puntos de paso, etc.
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Activar transparencias para puentes
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Activar transparencias para estructuras como faros, antenas, etc.
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Activar transparencia para la catenaria. CTRL+click para bloquear.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Ajustar transparencia para los indicadores de carga
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/swedish.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/swedish.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -15,6 +15,7 @@
 STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Platt mark krävs
 STR_0008_WAITING                                                :{BLACK}Väntar: {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
+STR_EN_ROUTE_FROM                                               :{YELLOW}({SHORTCARGO} på väg från {STATION})
 STR_000C_ACCEPTS                                                :{BLACK}Accepterar: {WHITE}
 STR_000D_ACCEPTS                                                :{BLACK}Accepterar: {GOLD}
 STR_000E                                                        :
@@ -1048,7 +1049,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Tillåt köp av exklusiva transporträttigheter: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Tillåt skicka pengar till andra företag: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Icke-rektangulära stationer: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ny globalt sätt att hitta rutt (NPF, åsidosätter NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Godsfaktor för att simulera tunga tåg: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillåt genomfarts-stop på stadsägda vägar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Tillåt byggande av närliggande stationer: {ORANGE}{STRING}
@@ -1203,9 +1203,7 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Ändra inställningsvärde
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Några eller alla av standard serviceintervalls-inställningarna är felaktiga! (5-90% och 30-800 dagar är giltiga inställningar)
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Använd YAPF för skepp: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Använd YAPF för fordon: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Använd YAPF för tåg: {ORANGE}{STRING}
+
 
 STR_TEMPERATE_LANDSCAPE                                         :Tempererat landskap
 STR_SUB_ARCTIC_LANDSCAPE                                        :Sub-arktiskt landskap
--- a/src/lang/traditional_chinese.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/traditional_chinese.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1043,7 +1043,6 @@
 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}可在鎮內興建路邊車站:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}容許興建相鄰車站: {ORANGE}{STRING}
@@ -1198,9 +1197,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}改變設定值
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}以下預設檢修期與揀選項目不相容! 合法設定為 5-90% 或 30-800 日
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}船隻使用新的尋路系統(YAPF):{ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}車輛使用新的尋路系統(YAPF):{ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}列車使用新的尋路系統:{ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :溫帶
 STR_SUB_ARCTIC_LANDSCAPE                                        :亞北極帶
--- a/src/lang/turkish.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/turkish.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1045,7 +1045,6 @@
 STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Şehrin ulaşım haklarını satın alma izinli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Diğer şirketlere para gönderme izinli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Özel istasyonlar: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Yeni evrensel yol bulma (NPF, NTP üzerinde): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Ağır yük trenleri için ağırlık çarpanı: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Şehiriçi yollara durak yapmak izinli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Bitişik istasyonlar izinli: {ORANGE}{STRING}
@@ -1200,9 +1199,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Ayar değerini değiştir
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Bazi servis gecikmeleri aralık dışında: %5-%90 veya 30-800 gün arasında olmalı
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Gemiler için YAPF kullan: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Arabalar için YAPF kullan: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Trenler için YAPF kullan: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Ilıman iklim
 STR_SUB_ARCTIC_LANDSCAPE                                        :Soğuk iklim
--- a/src/lang/ukrainian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/ukrainian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -82,7 +82,6 @@
 STR_0022_WHEAT.r                                                :пшениці
 STR_0022_WHEAT.z                                                :пшеницю
 STR_0023_RUBBER                                                 :каучук
-STR_0023_RUBBER.r                                               :каучука
 STR_0023_RUBBER.z                                               :каучук
 STR_0024_SUGAR                                                  :цукор
 STR_0024_SUGAR.r                                                :цукру
@@ -273,7 +272,7 @@
 STR_ABBREV_PLASTIC                                              :{TINYFONT}ПЛ
 STR_ABBREV_FIZZY_DRINKS                                         :{TINYFONT}ГЗ
 STR_ABBREV_NONE                                                 :{TINYFONT}Ні
-STR_ABBREV_ALL                                                  :{TINYFONT}Все!!!
+STR_ABBREV_ALL                                                  :{TINYFONT}Все
 STR_00AE                                                        :{WHITE}{DATE_SHORT}
 STR_00AF                                                        :{WHITE}{DATE_LONG}
 STR_00B0_MAP                                                    :{WHITE}Карта - {STRING}
@@ -350,8 +349,8 @@
 STR_0100_FACTORY                                                :{BLACK}{TINYFONT}Фабрика
 STR_0101_PRINTING_WORKS                                         :{BLACK}{TINYFONT}Друкарня
 STR_0102_OIL_WELLS                                              :{BLACK}{TINYFONT}Нафтова свердловина
-STR_0103_IRON_ORE_MINE                                          :{BLACK}{TINYFONT}Залізнорудна шахта
-STR_0104_STEEL_MILL                                             :{BLACK}{TINYFONT}Сталеварний завод
+STR_0103_IRON_ORE_MINE                                          :{BLACK}{TINYFONT}Залізорудна шахта
+STR_0104_STEEL_MILL                                             :{BLACK}{TINYFONT}Сталеливарний завод
 STR_0105_BANK                                                   :{BLACK}{TINYFONT}Банк
 STR_0106_PAPER_MILL                                             :{BLACK}{TINYFONT}Паперова фабрика
 STR_0107_GOLD_MINE                                              :{BLACK}{TINYFONT}Золоторудна шахта
@@ -462,13 +461,13 @@
 STR_UNITS_VOLUME_LONG_SI                                        :{COMMA} м³
 
 STR_UNITS_FORCE_IMPERIAL                                        :{COMMA}x10³ lbf
-STR_UNITS_FORCE_METRIC                                          :{COMMA} ton force
-STR_UNITS_FORCE_SI                                              :{COMMA} kN
+STR_UNITS_FORCE_METRIC                                          :{COMMA} тон-сил
+STR_UNITS_FORCE_SI                                              :{COMMA} кН
 
 ############ range for menu starts
 STR_0154_OPERATING_PROFIT_GRAPH                                 :Операційний прибуток
 STR_0155_INCOME_GRAPH                                           :Графік доходів
-STR_0156_DELIVERED_CARGO_GRAPH                                  :Доставлення вантажів
+STR_0156_DELIVERED_CARGO_GRAPH                                  :Доставка вантажів
 STR_0157_PERFORMANCE_HISTORY_GRAPH                              :Графік продуктивності
 STR_0158_COMPANY_VALUE_GRAPH                                    :Вартість компанії
 STR_0159_CARGO_PAYMENT_RATES                                    :Вартість перевезень
@@ -488,7 +487,7 @@
 STR_SORT_BY                                                     :{BLACK}Сортувати
 
 STR_SORT_BY_POPULATION                                          :{BLACK}за населенням
-STR_SORT_BY_PRODUCTION                                          :{BLACK}за виробництвом
+STR_SORT_BY_PRODUCTION                                          :{BLACK}за продуктивністю
 STR_SORT_BY_TYPE                                                :{BLACK}за типом
 STR_SORT_BY_TRANSPORTED                                         :{BLACK}за перевезенням
 STR_SORT_BY_NAME                                                :{BLACK}за назвою
@@ -576,7 +575,7 @@
 STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}Не можна змінити інтервал обслуговування...
 STR_018B_CLOSE_WINDOW                                           :{BLACK}Закрити вікно
 STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}Заголовок вікна - потягніть для переміщення вікна
-STR_STICKY_BUTTON                                               :{BLACK}Закріпити вікно
+STR_STICKY_BUTTON                                               :{BLACK}Закріпити вікно - воно не буде закриватися командою "Закрити всі вікна"
 STR_RESIZE_BUTTON                                               :{BLACK}Натисніть і тягніть для зміни розміру вікна
 STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}Натисніть для переходу до поточного каталогу збереження/завантаження
 STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Зруйнувати будинки, дороги і т.п.
@@ -695,8 +694,8 @@
 STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1                          :{BLACK}Очистити програму (тільки для Набору 1 або Набору 2)
 STR_01F9_SAVE_MUSIC_SETTINGS                                    :{BLACK}Зберегти налаштування музики
 STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Виберіть доріжку, щоб додати до програми (тільки для Набору 1 або Набору 2)
-STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Клікніть мишою на назві мелодії для її видалення зі списку (лише Набір1 та Набір2)
-STR_01FB_TOGGLE_PROGRAM_SHUFFLE                                 :{BLACK}Вкл/викл випадкову програму
+STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Клікніть на мелодії для її видалення зі списку (лише Набір1 та Набір2)
+STR_01FB_TOGGLE_PROGRAM_SHUFFLE                                 :{BLACK}Вкл./відкл. випадкову програму
 STR_01FC_SHOW_MUSIC_TRACK_SELECTION                             :{BLACK}Показує вікно вибору музичної програми
 STR_01FD_CLICK_ON_SERVICE_TO_CENTER                             :{BLACK}Натисніть для показу в центрі екрану
 STR_01FE_DIFFICULTY                                             :{BLACK}Складність ({STRING})
@@ -711,17 +710,17 @@
 STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Прибуття першого транспорту на станцію конкурента
 STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Нещасні випадки/стихійні лиха
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Інформація компанії
-STR_NEWS_OPEN_CLOSE                                             :{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_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}Зміни в попиті на перевезення
 STR_020E_SUBSIDIES                                              :{YELLOW}Субсидії
 STR_020F_GENERAL_INFORMATION                                    :{YELLOW}Загальна інформація
-STR_MESSAGES_ALL                                                :{YELLOW}Відображати повідомлення /Коротко/Повно/Викл
+STR_MESSAGES_ALL                                                :{YELLOW}Відображати повідомлення: відкл. / коротко / повно
 STR_MESSAGE_SOUND                                               :{YELLOW}Звукове сповіщення для підсумкових новин
 STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO                       :{WHITE}...дуже далеко від попереднього пункту призначення
 STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}Кращі компанії, що досягли {NUM}{}(рівень {STRING})
@@ -777,7 +776,7 @@
 STR_0244_OIL_REFINERY                                           :{BLACK}{G=m}Нафтопереробний завод
 STR_0245_OIL_RIG                                                :{BLACK}{G=f}Нафтова платформа
 STR_0246_FACTORY                                                :{BLACK}{G=f}Фабрика
-STR_0247_STEEL_MILL                                             :{BLACK}{G=m}Сталеварний завод
+STR_0247_STEEL_MILL                                             :{BLACK}{G=m}Сталеливарний завод
 STR_0248_FARM                                                   :{BLACK}{G=f}Ферма
 STR_0249_IRON_ORE_MINE                                          :{BLACK}{G=f}Залізорудна шахта
 STR_024A_OIL_WELLS                                              :{BLACK}{G=f}Нафтова свердловина
@@ -811,12 +810,12 @@
 STR_0266_CONSTRUCT_OIL_REFINERY                                 :{BLACK}Будувати нафтопереробний завод
 STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY                             :{BLACK}Будувати нафтову платформу (тільки біля краю карти)
 STR_0268_CONSTRUCT_FACTORY                                      :{BLACK}Будувати фабрику
-STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}Будуватисталеварний завод
+STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}Будувати сталеливарний завод
 STR_026A_CONSTRUCT_FARM                                         :{BLACK}Будувати ферму
 STR_026B_CONSTRUCT_IRON_ORE_MINE                                :{BLACK}Будувати залізорудну шахту
 STR_026C_CONSTRUCT_OIL_WELLS                                    :{BLACK}Будувати нафтову свердловину
 STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Будувати банк (тільки у містах з населенням більше 1200)
-STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}Будувати паперову фабоику
+STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}Будувати паперову фабрику
 STR_026F_CONSTRUCT_FOOD_PROCESSING                              :{BLACK}Будувати продуктовий завод
 STR_0270_CONSTRUCT_PRINTING_WORKS                               :{BLACK}Будувати друкарню
 STR_0271_CONSTRUCT_GOLD_MINE                                    :{BLACK}Будувати золоторудну шахту
@@ -866,7 +865,7 @@
 STR_029A_PLAY_SCENARIO                                          :{BLACK}Грати за сценарієм
 STR_PLAY_HEIGHTMAP                                              :{BLACK}Грати з карти висот
 STR_PLAY_HEIGHTMAP_HINT                                         :{BLACK}Почати нову гру, використавши карту висот за ландшафт
-STR_QUIT_SCENARIO_QUERY                                         :{YELLOW}Ви дійсно бажаєти вийти зі сценарію?
+STR_QUIT_SCENARIO_QUERY                                         :{YELLOW}Ви дійсно бажаєте вийти зі сценарію?
 STR_029C_QUIT_EDITOR                                            :{WHITE}Вихід з редактору
 STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...можливо будувати лише у містах з населенням не менш 1200
 STR_029E_MOVE_THE_STARTING_DATE                                 :{BLACK}Перенести початкову дату на 1 рік назад
@@ -963,8 +962,8 @@
 STR_02FE_CREATE_A_CUSTOMIZED_GAME                               :{BLACK}Створити свій сценарій
 STR_02FF_SELECT_SINGLE_PLAYER_GAME                              :{BLACK}Грати одному
 STR_0300_SELECT_MULTIPLAYER_GAME                                :{BLACK}Грати з 2-8 гравцями
-STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Показати налашування гри
-STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Показати налашування складності
+STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Показати налаштування гри
+STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Показати налаштування складності
 STR_0303_START_A_NEW_GAME_USING                                 :{BLACK}Почати нову гру, використовуючи сценарій
 STR_0304_QUIT                                                   :{BLACK}Вихід
 STR_0305_QUIT_OPENTTD                                           :{BLACK}покинути 'OpenTTD'
@@ -995,21 +994,21 @@
 STR_0329_PURCHASE_LAND_FOR_FUTURE                               :{BLACK}Купити ділянку для використання у майбутньому
 STR_032F_AUTOSAVE                                               :{RED}Автозбереження
 STR_SAVING_GAME                                                 :{RED}*  *  ЗБЕРЕЖЕННЯ ГРИ  *  *
-STR_SAVE_STILL_IN_PROGRESS                                      :{WHITE}Збереження...,{}зачекайте поки завершиться!
+STR_SAVE_STILL_IN_PROGRESS                                      :{WHITE}Збереження...{}зачекайте, доки завершиться!
 STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Вибрати програму 'Дорожні теми'
 
 STR_6                                                           :{BLACK}6
 STR_7                                                           :{BLACK}7
 
 ############ start of townname region
-STR_TOWNNAME_ORIGINAL_ENGLISH                                   :Англійські(Оригінальні)
+STR_TOWNNAME_ORIGINAL_ENGLISH                                   :Англійські (оригінальні)
 STR_TOWNNAME_FRENCH                                             :Французькі
 STR_TOWNNAME_GERMAN                                             :Німецькі
-STR_TOWNNAME_ADDITIONAL_ENGLISH                                 :Англійські(Додаткові)
-STR_TOWNNAME_LATIN_AMERICAN                                     :Латино-Американські
+STR_TOWNNAME_ADDITIONAL_ENGLISH                                 :Англійські (додаткові)
+STR_TOWNNAME_LATIN_AMERICAN                                     :Латиноамериканські
 STR_TOWNNAME_SILLY                                              :Кумедні
 STR_TOWNNAME_SWEDISH                                            :Шведські
-STR_TOWNNAME_DUTCH                                              :Голандські
+STR_TOWNNAME_DUTCH                                              :Голландські
 STR_TOWNNAME_FINNISH                                            :Фінські
 STR_TOWNNAME_POLISH                                             :Польські
 STR_TOWNNAME_SLOVAKISH                                          :Словацькі
@@ -1022,7 +1021,7 @@
 STR_TOWNNAME_DANISH                                             :Датські
 STR_TOWNNAME_TURKISH                                            :Турецькі
 STR_TOWNNAME_ITALIAN                                            :Італійські
-STR_TOWNNAME_CATALAN                                            :Каталанські
+STR_TOWNNAME_CATALAN                                            :Каталонські
 ############ end of townname region
 
 STR_CURR_GBP                                                    :Фунт (£)
@@ -1039,14 +1038,14 @@
 STR_CURR_FIM                                                    :Фінська марка (FIM)
 STR_CURR_FRF                                                    :Франк (FRF)
 STR_CURR_GRD                                                    :Грецька драхма (GRD)
-STR_CURR_HUF                                                    :Угорський форінт (HUF)
+STR_CURR_HUF                                                    :Угорський форинт (HUF)
 STR_CURR_ISK                                                    :Ісландська крона (ISK)
 STR_CURR_ITL                                                    :Італійська ліра (ITL)
-STR_CURR_NLG                                                    :Голандський гульден (NLG)
+STR_CURR_NLG                                                    :Голландський гульден (NLG)
 STR_CURR_NOK                                                    :Норвезька крона (NOK)
 STR_CURR_PLN                                                    :Польський злотий (PLN)
 STR_CURR_ROL                                                    :Румунський лей (ROL)
-STR_CURR_RUR                                                    :Російський рубль (RUR)
+STR_CURR_RUR                                                    :Російський рубель (RUR)
 STR_CURR_SIT                                                    :Словенський талер (SIT)
 STR_CURR_SEK                                                    :Шведська крона (SEK)
 STR_CURR_YTL                                                    :Турецька ліра (YTL)
@@ -1175,7 +1174,6 @@
 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}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Дозволити безпересадкові зупинки на муніципальних дорогах: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Дозволити будувати суміжні станції: {ORANGE}{STRING}
@@ -1255,7 +1253,7 @@
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV                     :Магнітна подушка
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :Перша з доступних
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Остання з доступних
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :Найчастіш використовувана
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :Найчастіше використовувана
 
 STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Показувати засоби будівництва, коли нема відповідного транспорту: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Макс. поїздів у гравця: {ORANGE}{STRING}
@@ -1330,9 +1328,19 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Змініть значення
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Одне чи декілька значень інтервалів несумісні за даних умов! Дозволено 5-90% та 30-800 днів
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Використовувати YAPF для кораблів: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Використовувати YAPF для авто: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Використовувати YAPF для поїздів: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Шукач шляху для поїздів: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(не рекомендовано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(рекомендовано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Шукач шляху для автомобілів: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Оригінальний {RED}(не рекомендовано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(рекомендовано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Шукач шляху для кораблів: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Оригінальний {BLUE}(рекомендовано)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(не рекомендовано)
 
 STR_TEMPERATE_LANDSCAPE                                         :Помірний ландшафт
 STR_SUB_ARCTIC_LANDSCAPE                                        :Субарктичний ландшафт
@@ -1492,7 +1500,7 @@
 STR_ORANGE                                                      :{ORANGE}{STRING}
 STR_NETWORK_CLIENTS                                             :{SILVER}Клієнт:  {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
 STR_NETWORK_LANGUAGE                                            :{SILVER}Мова:  {WHITE}{STRING}
-STR_NETWORK_TILESET                                             :{SILVER}Шаблонt:  {WHITE}{STRING}
+STR_NETWORK_TILESET                                             :{SILVER}Шаблон:  {WHITE}{STRING}
 STR_NETWORK_MAP_SIZE                                            :{SILVER}Розмір карти:  {WHITE}{COMMA}x{COMMA}
 STR_NETWORK_SERVER_VERSION                                      :{SILVER}Версія серверу:  {WHITE}{STRING}
 STR_NETWORK_SERVER_ADDRESS                                      :{SILVER}Адреса серверу:  {WHITE}{STRING} : {NUM}
@@ -1501,7 +1509,7 @@
 STR_NETWORK_PASSWORD                                            :{SILVER}Захищено паролем!
 STR_NETWORK_SERVER_OFFLINE                                      :{SILVER}Сервер відключений
 STR_NETWORK_SERVER_FULL                                         :{SILVER}Сервер зайнятий
-STR_NETWORK_VERSION_MISMATCH                                    :{SILVER}Версія не сумісна
+STR_NETWORK_VERSION_MISMATCH                                    :{SILVER}Версія не співпадає
 STR_NETWORK_GRF_MISMATCH                                        :{SILVER}NEWGRF ПОМИЛКА
 
 STR_NETWORK_JOIN_GAME                                           :{BLACK}Приєднатися
@@ -1527,7 +1535,7 @@
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Максимум компаній:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Обмежує кількість компаній на сервері
 STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} споглядач{P "" а ів}
-STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Максмум глядачів:
+STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Максимум глядачів:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Обмежує кількість глядачів на сервері
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Мова:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Інші гравці будуть знати якою мовою спілкуються на сервері
@@ -1547,7 +1555,7 @@
 STR_NETWORK_LANG_CHINESE                                        :Китайська
 STR_NETWORK_LANG_CZECH                                          :Чеська
 STR_NETWORK_LANG_DANISH                                         :Датська
-STR_NETWORK_LANG_DUTCH                                          :Німецька
+STR_NETWORK_LANG_DUTCH                                          :Голландська
 STR_NETWORK_LANG_ESPERANTO                                      :Есперанто
 STR_NETWORK_LANG_FINNISH                                        :Фінська
 STR_NETWORK_LANG_HUNGARIAN                                      :Угорська
@@ -1557,7 +1565,7 @@
 STR_NETWORK_LANG_KOREAN                                         :Корейська
 STR_NETWORK_LANG_LITHUANIAN                                     :Литовська
 STR_NETWORK_LANG_NORWEGIAN                                      :Норвезька
-STR_NETWORK_LANG_POLISH                                         :Польськая
+STR_NETWORK_LANG_POLISH                                         :Польська
 STR_NETWORK_LANG_PORTUGUESE                                     :Португальська
 STR_NETWORK_LANG_ROMANIAN                                       :Румунська
 STR_NETWORK_LANG_RUSSIAN                                        :Російська
@@ -1569,7 +1577,7 @@
 STR_NETWORK_LANG_UKRAINIAN                                      :Українська
 ############ End of leave-in-this-order
 
-STR_NETWORK_GAME_LOBBY                                          :{WHITE}Multiplayer game lobby
+STR_NETWORK_GAME_LOBBY                                          :{WHITE}Мережева гра - кімната
 
 STR_NETWORK_PREPARE_TO_JOIN                                     :{BLACK}Підготовка до з'єднання:   {ORANGE}{STRING}
 STR_NETWORK_COMPANY_LIST_TIP                                    :{BLACK}Список всіх компаній присутніх у цій грі. Ви можете як приєднатись до компанії так і створити нову, якщо є вільне місце
@@ -1618,18 +1626,18 @@
 STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION                       :{WHITE}Компанія захищена паролем. Введіть пароль
 STR_NETWORK_CLIENT_LIST                                         :{WHITE}Список клієнтів
 
-STR_NETWORK_ERR_NOTAVAILABLE                                    :{WHITE} Не знайдено мережевого пристрою або закомпільовано без ENABLE_NETWORK
+STR_NETWORK_ERR_NOTAVAILABLE                                    :{WHITE} Не знайдено мережевого пристрою або скомпільовано без ENABLE_NETWORK
 STR_NETWORK_ERR_NOSERVER                                        :{WHITE} Не знайдено жодної мережної гри
-STR_NETWORK_ERR_NOCONNECTION                                    :{WHITE} Сервер не відповідає на запит
+STR_NETWORK_ERR_NOCONNECTION                                    :{WHITE} Сервер не відповів на запит
 STR_NETWORK_ERR_NEWGRF_MISMATCH                                 :{WHITE} Не можна з'єднатись внаслідок неспівпадання NewGRF
 STR_NETWORK_ERR_DESYNC                                          :{WHITE} Помилка синхронізації з мережною грою
 STR_NETWORK_ERR_LOSTCONNECTION                                  :{WHITE} З'єднання втрачено
 STR_NETWORK_ERR_SAVEGAMEERROR                                   :{WHITE} Неможливо завантажити гру
 STR_NETWORK_ERR_SERVER_START                                    :{WHITE} Неможливо створити сервер
 STR_NETWORK_ERR_CLIENT_START                                    :{WHITE} Неможливо з'єднатися
-STR_NETWORK_ERR_TIMEOUT                                         :{WHITE} Таймаут з'єднання #{NUM}
+STR_NETWORK_ERR_TIMEOUT                                         :{WHITE} Тайм-аут з'єднання #{NUM}
 STR_NETWORK_ERR_SERVER_ERROR                                    :{WHITE} Помилка протоколу - з'єднання розірвано
-STR_NETWORK_ERR_WRONG_REVISION                                  :{WHITE} Версія кліента не співпадає з версією сервера
+STR_NETWORK_ERR_WRONG_REVISION                                  :{WHITE} Версія клієнта не співпадає з версією сервера
 STR_NETWORK_ERR_WRONG_PASSWORD                                  :{WHITE} Пароль невірний
 STR_NETWORK_ERR_SERVER_FULL                                     :{WHITE} Сервер переповнений
 STR_NETWORK_ERR_SERVER_BANNED                                   :{WHITE} Вас відключено від цього серверу
@@ -1697,7 +1705,7 @@
 STR_PNGMAP_ERR_IMAGE_TYPE                                       :{WHITE}...неможливо конвертувати. треба 8 чи 24-bit PNG формат.
 STR_PNGMAP_ERR_MISC                                             :{WHITE}...Помилка. (можливо зіпсований файл)
 
-STR_BMPMAP_ERROR                                                :{WHITE}Не можу завантажити лашдшафт з BMP...
+STR_BMPMAP_ERROR                                                :{WHITE}Не можу завантажити ландшафт з BMP...
 STR_BMPMAP_ERR_IMAGE_TYPE                                       :{WHITE}...неможливо перетворити тип зображення
 
 ##id 0x0800
@@ -1749,7 +1757,7 @@
 STR_101A_BUILD_RAILROAD_STATION                                 :{BLACK}Будувати станцію
 STR_101B_BUILD_RAILROAD_SIGNALS                                 :{BLACK}Будувати сигнал
 STR_101C_BUILD_RAILROAD_BRIDGE                                  :{BLACK}Будувати міст
-STR_101D_BUILD_RAILROAD_TUNNEL                                  :{BLACK}Будувати туннель
+STR_101D_BUILD_RAILROAD_TUNNEL                                  :{BLACK}Будувати тунель
 STR_101E_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Будувати/демонтувати колію або сигнали
 STR_101F_BRIDGE_SELECTION_CLICK                                 :{BLACK}Вибір мосту - натисніть на міст, який бажаєте збудувати
 STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO                       :{BLACK}Вибір орієнтації депо
@@ -1762,7 +1770,7 @@
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Колія з комбо-сигналами
 STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Залізнична колія зі звичайним та пре-сигналами
 STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Залізнична колія зі звичайним та вихід-сигналами
-STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Колія з нормальними і комбо-сигналами
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Колія зі звичайним і комбо-сигналами
 STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Залізнична колія з пре- та вихід-сигналами
 STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Колія з пре- і комбо-сигналами
 STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Колія з вихідними і комбо-сигналами
@@ -1775,7 +1783,7 @@
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Дорога ремонтується
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Будівництво дороги
 STR_WHITE_TRAMWAY_CONSTRUCTION                                  :{WHITE}Будівництво трамвайної колії
-STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Виберіть дорожний міст
+STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Виберіть дорожній міст
 STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... односторонні дороги не можуть перетинатись
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Неможливо тут побудувати дорогу ...
 STR_CAN_T_BUILD_TRAMWAY_HERE                                    :{WHITE}Тут не можна побудувати трамвайну колію...
@@ -1816,7 +1824,7 @@
 STR_1817_ROAD_VEHICLE_DEPOT                                     :Автомобільне депо
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Залізничний переїзд
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Не можна знести автобусну станцію...
-STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Не можна знести грузову станцію...
+STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Не можна знести вантажну станцію...
 STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Не можна знести пасажирську трамвайну станцію...
 STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Не можна знести вантажну трамвайну станцію...
 
@@ -1967,14 +1975,14 @@
 STR_3034_LOCAL_RATING_OF_TRANSPORT                              :{BLACK}Місцевий рейтинг транспортної компанії:
 
 ############ range for rating starts
-STR_3035_APPALLING                                              :Жахливо
-STR_3036_VERY_POOR                                              :Дуже погано
-STR_3037_POOR                                                   :Погано
-STR_3038_MEDIOCRE                                               :Середньо
-STR_3039_GOOD                                                   :Добре
-STR_303A_VERY_GOOD                                              :Дуже добре
-STR_303B_EXCELLENT                                              :Відмінно
-STR_303C_OUTSTANDING                                            :Найкраще
+STR_3035_APPALLING                                              :жахливо
+STR_3036_VERY_POOR                                              :дуже погано
+STR_3037_POOR                                                   :погано
+STR_3038_MEDIOCRE                                               :середньо
+STR_3039_GOOD                                                   :добре
+STR_303A_VERY_GOOD                                              :дуже добре
+STR_303B_EXCELLENT                                              :відмінно
+STR_303C_OUTSTANDING                                            :найкраще
 ############ range for rating ends
 
 STR_303D                                                        :{WHITE}{STRING}: {YELLOW}{STRING} ({COMMA}%)
@@ -2025,10 +2033,10 @@
 STR_306A_BUOY_IN_THE_WAY                                        :{WHITE}...бакен на шляху
 STR_306C_STATION_TOO_SPREAD_OUT                                 :{WHITE}...станція занадто велика
 STR_NONUNIFORM_STATIONS_DISALLOWED                              :{WHITE}...неоднорідні станції відключені
-STR_USE_CTRL_TO_SELECT_MORE                                     :{BLACK}Утримуйте CTRL для вибору більш ніж одного пункту
+STR_USE_CTRL_TO_SELECT_MORE                                     :{BLACK}Утримуйте CTRL для вибору декількох пунктів
 
 STR_UNDEFINED                                                   :(невизначено)
-STR_STAT_CLASS_DFLT                                             :Default station
+STR_STAT_CLASS_DFLT                                             :Звичайна станція
 STR_STAT_CLASS_WAYP                                             :Пункт
 
 ##id 0x3800
@@ -2170,7 +2178,7 @@
 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_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Знайдені нові поклади вугілля на {INDUSTRY}!{}Очікується збільшення виробництва вдвічі!
 STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Знайдені нові нафтові запаси на {INDUSTRY}!{}Очікується збільшення виробництва вдвічі!
 STR_4838_IMPROVED_FARMING_METHODS                               :{BLACK}{BIGFONT}Удосконалені сільськогосподарські методи на {INDUSTRY} збільшили виробництво вдвічі!
 STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}{INDUSTRY} виробництво впало на 50%
@@ -2190,7 +2198,7 @@
 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_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Невідповідне місце для початку тунелю
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
 STR_500E_SUSPENSION_STEEL                                       :Підвісний сталевий
 STR_500F_GIRDER_STEEL                                           :Балочний сталевий
@@ -2225,7 +2233,7 @@
 STR_5802_LIGHTHOUSE                                             :Маяк
 STR_5803_COMPANY_HEADQUARTERS                                   :Головний офіс компанії
 STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...на шляху Головний офіс
-STR_5805_COMPANY_OWNED_LAND                                     :Ця ділянка - власніcть компанії
+STR_5805_COMPANY_OWNED_LAND                                     :Ця ділянка - власність компанії
 STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Неможливо купити цю ділянку ...
 STR_5807_YOU_ALREADY_OWN_IT                                     :{WHITE}...це вже ваша власність!
 
@@ -2292,7 +2300,7 @@
 STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Кількість конкурентів: {ORANGE}{COMMA}
 STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}Конкуренти починають через: {ORANGE}{STRING}
 STR_6807_NO_OF_TOWNS                                            :{LTBLUE}Кількість міст: {ORANGE}{STRING}
-STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}Кількість промисловостей: {ORANGE}{STRING}
+STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}Кількість підприємств: {ORANGE}{STRING}
 STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}Початковий кредит: {ORANGE}{CURRENCY}
 STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}Відсотки за кредит: {ORANGE}{COMMA}%
 STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Транспортні витрати: {ORANGE}{STRING}
@@ -2370,15 +2378,15 @@
 STR_7010                                                        :{WHITE}{NUM}
 STR_7011_CONSTRUCTION                                           :{GOLD}Будівництво
 STR_7012_NEW_VEHICLES                                           :{GOLD}Нова техніка
-STR_7013_TRAIN_RUNNING_COSTS                                    :{GOLD}Поїзди:  витрати
-STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Авто:    витрати
-STR_7015_AIRCRAFT_RUNNING_COSTS                                 :{GOLD}Літаки:  витрати
-STR_7016_SHIP_RUNNING_COSTS                                     :{GOLD}Кораблі: витрати
+STR_7013_TRAIN_RUNNING_COSTS                                    :{GOLD}Витрати, поїзди
+STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Витрати, автомобілі
+STR_7015_AIRCRAFT_RUNNING_COSTS                                 :{GOLD}Витрати, літаки
+STR_7016_SHIP_RUNNING_COSTS                                     :{GOLD}Витрати, кораблі
 STR_7017_PROPERTY_MAINTENANCE                                   :{GOLD}Утримання власності
-STR_7018_TRAIN_INCOME                                           :{GOLD}Поїзди: дохід
-STR_7019_ROAD_VEHICLES_INCOME                                   :{GOLD}Авто: дохід
-STR_701A_AIRCRAFT_INCOME                                        :{GOLD}Літаки: дохід
-STR_701B_SHIP_INCOME                                            :{GOLD}Кораблі: дохід
+STR_7018_TRAIN_INCOME                                           :{GOLD}Дохід, поїзди
+STR_7019_ROAD_VEHICLES_INCOME                                   :{GOLD}Дохід, автомобілі
+STR_701A_AIRCRAFT_INCOME                                        :{GOLD}Дохід, літаки
+STR_701B_SHIP_INCOME                                            :{GOLD}Дохід, кораблі
 STR_701C_LOAN_INTEREST                                          :{GOLD}Відсотки за кредит
 STR_701D_OTHER                                                  :{GOLD}Інше
 STR_701E                                                        :{BLACK}-{CURRENCY}
@@ -2406,7 +2414,7 @@
 STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Зміна імені керівника
 STR_7033_CHANGE_THE_COMPANY_NAME                                :{BLACK}Зміна назви компанії
 STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Натисніть на колір, який вам до вподоби
-STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Збільшити розмір кредиту
+STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Взяти кредит
 STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Виплатити частину кредиту
 STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Керівник)
 STR_7038_INAUGURATED                                            :{GOLD}Засновано у: {WHITE}{NUM} році
@@ -2430,13 +2438,13 @@
 STR_704E_KEY_TO_COMPANY_GRAPHS                                  :{WHITE}Ключ до графіків компанії
 STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY                           :{BLACK}Натисніть для вкл/викл окремого графіку компанії
 STR_7050_UNITS_OF_CARGO_DELIVERED                               :{WHITE}Доставка одиниці вантажу
-STR_7051_COMPANY_PERFORMANCE_RATINGS                            :{WHITE}Рейтинг продуктивності компанії(найбільший рейтинг=1000)
+STR_7051_COMPANY_PERFORMANCE_RATINGS                            :{WHITE}Рейтинг продуктивності компанії (найбільший рейтинг=1000)
 STR_7052_COMPANY_VALUES                                         :{WHITE}Вартість компанії
 STR_7053_COMPANY_LEAGUE_TABLE                                   :{WHITE}Таблиця компаній
 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}Компанія у скруті!
-STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT}{COMPANY} буде продано або оголошено банкрутом, якщо найблищим часом не зросте її продуктивність!
+STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT}{COMPANY} буде продано або оголошено банкрутом, якщо найближчим часом не зросте продуктивність!
 STR_7058_PRESIDENT                                              :{BLACK}{PLAYERNAME}{}(Керівник)
 STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Компанії об'єдналися!
 STR_705A_HAS_BEEN_SOLD_TO_FOR                                   :{BLACK}{BIGFONT}{COMPANY} була викуплена {COMPANY} за {CURRENCY}!
@@ -2586,7 +2594,7 @@
 STR_803D_LIVESTOCK_VAN                                          :вантажівка для тварин
 STR_803E_GOODS_VAN                                              :вантажівка для товарів
 STR_803F_GRAIN_HOPPER                                           :вагон для зерна
-STR_8040_WOOD_TRUCK                                             :лісовіз
+STR_8040_WOOD_TRUCK                                             :лісовоз
 STR_8041_IRON_ORE_HOPPER                                        :вагон для залізної руди
 STR_8042_STEEL_TRUCK                                            :вантажівка для сталі
 STR_8043_ARMORED_VAN                                            :броньоване авто
@@ -2618,7 +2626,7 @@
 STR_805D_LIVESTOCK_VAN                                          :вагон для худоби
 STR_805E_GOODS_VAN                                              :товарний вагон
 STR_805F_GRAIN_HOPPER                                           :вагон для зерна
-STR_8060_WOOD_TRUCK                                             :лісовіз
+STR_8060_WOOD_TRUCK                                             :лісовоз
 STR_8061_IRON_ORE_HOPPER                                        :вагон для залізної руди
 STR_8062_STEEL_TRUCK                                            :платформа для сталі
 STR_8063_ARMORED_VAN                                            :броньований вагон
@@ -2825,7 +2833,7 @@
 
 STR_INVALID_ORDER                                               :{RED} (Невірний наказ)
 
-STR_UNKNOWN_DESTINATION                                         :невідомий напрям
+STR_UNKNOWN_DESTINATION                                         :невідоме місце призначення
 STR_8812_EMPTY                                                  :{LTBLUE}порожній
 STR_8813_FROM                                                   :{LTBLUE}{CARGO} з {STATION}
 STR_FROM_MULT                                                   :{LTBLUE}{CARGO} з {STATION} (x{NUM})
@@ -2837,7 +2845,7 @@
 STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} поїзд{P "" и ів}
 
 STR_881C_NEW_RAIL_VEHICLES                                      :{WHITE}Новий залізничний транспорт
-STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Нові елекричні потяги
+STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Новий електрозалізничний транспорт
 STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Новий монорельсовий транспорт
 STR_881E_NEW_MAGLEV_VEHICLES                                    :{WHITE}Новий транспорт на магнітній подушці
 STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}Потяги
@@ -2849,7 +2857,7 @@
 STR_CLONE_TRAIN                                                 :{BLACK}Клонувати
 STR_CLONE_TRAIN_INFO                                            :{BLACK}Будувати копію поїзда з усіма вагонами. Утримуйте CTRL для спільного завдання
 STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Будувати копію поїзда з усіма вагонами. Натисніть на цю кнопку і потім на поїзд в депо або ззовні. Утримуйте CTRL для спільного завдання
-STR_8820_RENAME                                                 :{BLACK}Ім'я
+STR_8820_RENAME                                                 :{BLACK}Назва
 STR_8823_SKIP                                                   :{BLACK}Пропуск
 STR_8824_DELETE                                                 :{BLACK}Видалити
 STR_8825_NON_STOP                                               :{BLACK}Беззупн
@@ -2881,14 +2889,14 @@
 STR_CAN_T_SKIP_ORDER                                            :{WHITE}Не можна пропустити цей наказ...
 STR_CAN_T_SKIP_TO_ORDER                                         :{WHITE}Не можна перейти до цього наказу...
 STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Неможливо перемістити транспорт...
-STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}задній потяг зажди слідує  follow its front counterpart!!!
+STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}задній потяг буде завжди йти за переднім
 STR_8838_N_A                                                    :немає{SKIP}
 STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Не можна продати поїзд...
 STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Неможливо знайти маршрут до місцевого депо
 STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Не можна зупинити/стартувати поїзд...
 STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Інтервал техогляду: {LTBLUE}{COMMA} днів{BLACK}   Останній техогляд: {LTBLUE}{DATE_LONG}
 STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Інтервал техогляду: {LTBLUE}{COMMA}%{BLACK}   Останній техогляд: {LTBLUE}{DATE_LONG}
-STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Поїзди - клікніть на поїзді для детальної інформаціїї
+STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Поїзди - клікніть на поїзді для детальної інформації
 STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Будувати поїзд (потрібне залізничне депо)
 STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Поїзди - клікніть на поїзді для інформації, перетягніть для додавання/вилучення
 STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}Будувати новий поїзд
@@ -2899,7 +2907,7 @@
 STR_8845_RENAME_TRAIN_VEHICLE_TYPE                              :{BLACK}Перейменуйте тип транспорту
 STR_8846_CURRENT_TRAIN_ACTION_CLICK                             :{BLACK}Діяльність поїзда - клікніть тут для його запуску/зупинення
 STR_8847_SHOW_TRAIN_S_ORDERS                                    :{BLACK}Показати маршрут поїзда
-STR_8848_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Показати поїзд в центрі головноuj екрану
+STR_8848_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Показати поїзд в центрі головного екрану
 STR_8849_SEND_TRAIN_TO_DEPOT                                    :{BLACK}Направити поїзд у депо
 STR_884A_FORCE_TRAIN_TO_PROCEED                                 :{BLACK}Ігнорувати червоне світло семафору!
 STR_884B_REVERSE_DIRECTION_OF_TRAIN                             :{BLACK}Розвернути поїзд
@@ -2921,7 +2929,7 @@
 STR_TIMETABLE_WAIT_TIME_TOOLTIP                                 :{BLACK}Змінити час, впродовж якого має виконуватись наказ
 STR_TIMETABLE_CLEAR_TIME_TOOLTIP                                :{BLACK}Очистити час для виділеного наказу
 STR_TIMETABLE_RESET_LATENESS_TOOLTIP                            :{BLACK}Очистити лічильник запізнення, щоб транспорт встигнув
-STR_SERVICE_HINT                                                :{BLACK}Пропустити це завдання поки обслуговування потрібне!!!
+STR_SERVICE_HINT                                                :{BLACK}Пропустити це завдання, доки не буде потрібне обслуговування
 STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Ціна: {CURRENCY} Вага: {WEIGHT_S}{}Швидкість: {VELOCITY}{}Потужність: {POWER}{}Вартість експлуатації: {CURRENCY}/рік{}Місткість: {CARGO}
 STR_885C_BROKEN_DOWN                                            :{RED}Зламався
 STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}Вік: {LTBLUE}{STRING}{BLACK}   Транспортні витрати: {LTBLUE}{CURRENCY}/рік
@@ -2948,7 +2956,7 @@
 STR_TRAIN_STOPPING                                              :{RED}Зупиняється
 STR_TRAIN_STOPPING_VEL                                          :{RED}Зупиняється, {VELOCITY}
 STR_INCOMPATIBLE_RAIL_TYPES                                     :Залізничні колій несумісні
-STR_TRAIN_NO_POWER                                              :{RED}Неелектрифіковано
+STR_TRAIN_NO_POWER                                              :{RED}Не електрифіковано
 STR_TRAIN_START_NO_CATENARY                                     :Нема електрики, поїзд стоїть
 
 STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Став доступним новий {STRING}!
@@ -2968,7 +2976,7 @@
 STR_TIMETABLE_TOTAL_TIME                                        :Цей розклад займе ще {STRING}
 STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :Цей розклад займе якнайменше {STRING} (не все за розкладом)
 STR_TIMETABLE_AUTOFILL                                          :{BLACK}Автозаповнення
-STR_TIMETABLE_AUTOFILL_TOOLTIP                                  :{BLACK}Автоматично заповнювати розклад згiдно з даними першої подорожі
+STR_TIMETABLE_AUTOFILL_TOOLTIP                                  :{BLACK}Автоматично заповнювати розклад згiдно даних першої подорожі
 
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}На шляху авто
@@ -2990,10 +2998,10 @@
 STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}Неможливо продати авто...
 STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}Неможливо зупинити авто...
 STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}Авто {COMMA} чекає в депо
-STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Прямує до {TOWN} депо
-STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Прямує до {TOWN} депо, {VELOCITY}
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Техогляд в  {TOWN} дорожне депо
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}Техогляд в  {TOWN} дорожне депо, {VELOCITY}
+STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Прямує до {TOWN} дорожного депо
+STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Прямує до {TOWN} дорожного депо, {VELOCITY}
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Техогляд в  {TOWN} дорожному депо
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}Техогляд в  {TOWN} дорожному депо, {VELOCITY}
 STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT                            :{WHITE}Неможливо направити авто в депо...
 STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Неможливо знайти місцеве депо
 STR_901A_ROAD_VEHICLES_CLICK_ON                                 :{BLACK}Авто - натисніть на авто для інформації
@@ -3042,7 +3050,7 @@
 STR_9800_DOCK_CONSTRUCTION                                      :Будувати порт
 STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}Будівництво порту
 STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Неможливо будувати порт тут...
-STR_9803_SHIP_DEPOT                                             :{WHITE}{TOWN} Корабельне депо
+STR_9803_SHIP_DEPOT                                             :{WHITE}{TOWN} Док
 STR_9804_NEW_SHIPS                                              :{BLACK}Нові кораблі
 STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} кораб{P ель лі лів}
 STR_9808_NEW_SHIPS                                              :{WHITE}Нові кораблі
@@ -3050,13 +3058,13 @@
 STR_CLONE_SHIP                                                  :{BLACK}Клонувати
 STR_CLONE_SHIP_INFO                                             :{BLACK}Будувати копію корабля. Утримуйте CTRL для спільного завдання
 STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Будувати копію корабля. Натисніть на цю кнопку, і потім на корабель в депо або ззовні. Утримуйте CTRL для спільного завдання
-STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Корабль має бути в депо
+STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Корабль має стояти в доці
 STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Неможливо продати корабель...
 STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Неможливо будувати корабель...
 STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Корабель на шляху
 STR_980F                                                        :{WHITE}{VEHICLE}
 STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (Деталі)
-STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}Вік: {LTBLUE}{STRING}{BLACK}   Траспортні витрати: {LTBLUE}{CURRENCY}/рік
+STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}Вік: {LTBLUE}{STRING}{BLACK}   Транспортні витрати: {LTBLUE}{CURRENCY}/рік
 STR_9813_MAX_SPEED                                              :{BLACK}Макс. швидкість: {LTBLUE}{VELOCITY}
 STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Прибуток цього року: {LTBLUE}{CURRENCY}  (минулого року: {CURRENCY})
 STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}Надійність: {LTBLUE}{COMMA}%  {BLACK}Поломок після останнього техогляду: {LTBLUE}{COMMA}
@@ -3065,10 +3073,10 @@
 STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}Неможливо зупинити корабель...
 STR_9819_CAN_T_SEND_SHIP_TO_DEPOT                               :{WHITE}Неможливо направити корабель в депо...
 STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Неможливо знайти місцеве депо
-STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Прямує до {TOWN} депо
-STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Прямує до {TOWN} депо, {VELOCITY}
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE                              :{LTBLUE}Техогляд в {TOWN} корабельне депо
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL                          :{LTBLUE}Техогляд в {TOWN} корабельне депо, {VELOCITY}
+STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Прямує до {TOWN} корабельного депо
+STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Прямує до {TOWN} корабельного депо, {VELOCITY}
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE                              :{LTBLUE}Техогляд в {TOWN} корабельному депо
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL                          :{LTBLUE}Техогляд в {TOWN} корабельному депо, {VELOCITY}
 STR_981C_SHIP_IS_WAITING_IN_DEPOT                               :{WHITE}Корабель {COMMA} чекає в депо
 STR_981D_BUILD_SHIP_DOCK                                        :{BLACK}Будувати док
 STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING                          :{BLACK}Будувати корабельне депо
@@ -3112,7 +3120,7 @@
 ##id 0xA000
 STR_A000_AIRPORTS                                               :{WHITE}Аеропорти
 STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}Неможливо будувати аеропорт тут...
-STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}{STATION} Ангар
+STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}{STATION} ангар
 STR_A003_NEW_AIRCRAFT                                           :{BLACK}Новий літак
 STR_CLONE_AIRCRAFT                                              :{BLACK}Клонувати
 STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Будувати копію літака. Утримуйте CTRL для спільного завдання
@@ -3132,7 +3140,7 @@
 STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Неможливо направити літак до ангару...
 STR_HEADING_FOR_HANGAR                                          :{ORANGE}Летить до {STATION} ангару
 STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}Летить до {STATION} ангару, {VELOCITY}
-STR_HEADING_FOR_HANGAR_SERVICE                                  :{LTBLUE}Техогляд в {STATION} депо
+STR_HEADING_FOR_HANGAR_SERVICE                                  :{LTBLUE}Техогляд в {STATION} ангарі
 STR_HEADING_FOR_HANGAR_SERVICE_VEL                              :{LTBLUE}Техогляд в {STATION} ангарі, {VELOCITY}
 STR_A014_AIRCRAFT_IS_WAITING_IN                                 :{WHITE}Літак {COMMA} чекає в ангарі
 STR_A015_AIRCRAFT_IN_THE_WAY                                    :{WHITE}Літак на шляху
@@ -3185,14 +3193,14 @@
 
 ##id 0xB000
 STR_B000_ZEPPELIN_DISASTER_AT                                   :{BLACK}{BIGFONT}Дирижабль впав на {STATION}!
-STR_B001_ROAD_VEHICLE_DESTROYED                                 :{BLACK}{BIGFONT}Аварія!'НЛО' зіткнулось з авто!
+STR_B001_ROAD_VEHICLE_DESTROYED                                 :{BLACK}{BIGFONT}Автомобіль знищений внаслідок зіткнення з НЛО!
 STR_B002_OIL_REFINERY_EXPLOSION                                 :{BLACK}{BIGFONT}Вибухнув нафтопереробний завод біля міста {TOWN}!
 STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS                        :{BLACK}{BIGFONT}За невідомих обставин зруйновано фабрику біля міста {TOWN}!
-STR_B004_UFO_LANDS_NEAR                                         :{BLACK}{BIGFONT}'НЛО' приземлилось біля міста {TOWN}!
-STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Обвал на вугільній шахті призвів до зсуву грунту біля міста {TOWN}!
+STR_B004_UFO_LANDS_NEAR                                         :{BLACK}{BIGFONT}НЛО приземлилось біля міста {TOWN}!
+STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Зсув ґрунту внаслідок обвалу на вугільній шахті біля міста {TOWN}!
 STR_B006_FLOOD_VEHICLE_DESTROYED                                :{BLACK}{BIGFONT}Повінь!{}Щонайменше {COMMA} зникло безвісти та загинуло!
 
-STR_BRIBE_FAILED                                                :{WHITE}Ваша спроба дати хабаря була
+STR_BRIBE_FAILED                                                :{WHITE}Ваша спроба дати хабара була
 STR_BRIBE_FAILED_2                                              :{WHITE}викрита місцевим слідчим
 STR_BUILD_DATE                                                  :{BLACK}Рік випуску: {LTBLUE}{DATE_LONG}
 
@@ -3220,7 +3228,7 @@
 STR_PERFORMANCE_DETAIL_MIN_INCOME_TIP                           :{BLACK}Найменший місячний прибуток за останні 12 кварталів
 STR_PERFORMANCE_DETAIL_MAX_INCOME_TIP                           :{BLACK}Найбільший місячний прибуток за останні 12 кварталів
 STR_PERFORMANCE_DETAIL_DELIVERED_TIP                            :{BLACK}Кількість одиниць вантажу, доставлених за останні 4 квартали
-STR_PERFORMANCE_DETAIL_CARGO_TIP                                :{BLACK}Кількість видів вантажу, доствлених за останній квартал
+STR_PERFORMANCE_DETAIL_CARGO_TIP                                :{BLACK}Кількість видів вантажу, доставлених за останній квартал
 STR_PERFORMANCE_DETAIL_MONEY_TIP                                :{BLACK}Сума коштів на рахунку компанії
 STR_PERFORMANCE_DETAIL_LOAN_TIP                                 :{BLACK}Сума кредиту, що надано компанії
 STR_PERFORMANCE_DETAIL_TOTAL_TIP                                :{BLACK}Загальна кількість балів
@@ -3232,7 +3240,7 @@
 STR_NEWGRF_TIP                                                  :{BLACK}Список усіх ваших установок нової графіки. Виберіть для налаштування
 STR_NEWGRF_NO_FILES_INSTALLED                                   :{BLACK}Відсутні файли нової графіки! Прочитайте інструкцію по встановленню нової графіки
 STR_NEWGRF_FILENAME                                             :{BLACK}Ім'я файлу: {SILVER}{STRING}
-STR_NEWGRF_GRF_ID                                               :{BLACK}ID графіки: {SILVER}{STRING}
+STR_NEWGRF_GRF_ID                                               :{BLACK}GRF ID: {SILVER}{STRING}
 STR_NEWGRF_MD5SUM                                               :{BLACK}MD5сума: {SILVER}{STRING}
 STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}Ви хочете зробити зміни у вже запущеній грі; це може привести до зависання OpenTTD.{}Ви впевнені що хочете зробити це?
 
@@ -3241,7 +3249,7 @@
 STR_NEWGRF_ERROR_MSG_ERROR                                      :{RED}Помилка: {SILVER}{STRING}
 STR_NEWGRF_ERROR_MSG_FATAL                                      :{RED}Збій: {SILVER}{STRING}
 STR_NEWGRF_ERROR_VERSION_NUMBER                                 :{STRING} не буде працювати з версією TTDPatch, вказаною OpenTTD.
-STR_NEWGRF_ERROR_DOS_OR_WINDOWS                                 :{STRING} для {STRING} вірсії TTD.
+STR_NEWGRF_ERROR_DOS_OR_WINDOWS                                 :{STRING} для {STRING}-версії TTD.
 STR_NEWGRF_ERROR_UNSET_SWITCH                                   :{STRING} розроблено для {STRING}
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Помилковий параметр для {STRING}: параметр {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} має бути завантажений до {STRING}.
@@ -3258,17 +3266,17 @@
 STR_NEWGRF_MOVEUP_TIP                                           :{BLACK}Перемістити вибрані файли вверх по списку
 STR_NEWGRF_MOVEDOWN                                             :{BLACK}Нижче
 STR_NEWGRF_MOVEDOWN_TIP                                         :{BLACK}Перемістити вибрані файли вниз по списку
-STR_NEWGRF_FILE_TIP                                             :{BLACK}Список встановлених NewGRF файлів. Кслікніть на файлі щоб змінити його параметри
+STR_NEWGRF_FILE_TIP                                             :{BLACK}Список встановлених NewGRF файлів. Клікніть на файлі, щоб змінити його параметри
 STR_NEWGRF_PARAMETER                                            :{BLACK}Параметри: {SILVER}{STRING}
-STR_NEWGRF_PARAMETER_QUERY                                      :{BLACK}ВведітьNewGRF параметри
+STR_NEWGRF_PARAMETER_QUERY                                      :{BLACK}Введіть параметри NewGRF
 STR_NEWGRF_NO_INFO                                              :{BLACK}Немає доступної інформації
 
 STR_NEWGRF_ADD_CAPTION                                          :{WHITE}Доступні NewGRF файли
 STR_NEWGRF_ADD_FILE                                             :{BLACK}Додати файл
 STR_NEWGRF_ADD_FILE_TIP                                         :{BLACK}Додати вибраний NewGRF файл до Вашої конфігурації
-STR_NEWGRF_RESCAN_FILES                                         :{BLACK}Переглянути файли
+STR_NEWGRF_RESCAN_FILES                                         :{BLACK}Пересканувати файли
 STR_NEWGRF_RESCAN_FILES_TIP                                     :{BLACK}Оновити список доступних NewGRF файлів
-STR_NEWGRF_DUPLICATE_GRFID                                      :{WHITE}Не можу додати файл: дублювання GRF ID
+STR_NEWGRF_DUPLICATE_GRFID                                      :{WHITE}Не можу додати файл: однакові GRF ID
 
 STR_NEWGRF_NOT_FOUND                                            :{RED}Таких файлів не знайдено
 STR_NEWGRF_DISABLED                                             :{RED}Вимкнено
@@ -3326,12 +3334,12 @@
 STR_DEPOT_AUTOREPLACE_TRAIN_TIP                                 :{BLACK}Оновити всі поїзди в депо
 STR_DEPOT_AUTOREPLACE_ROADVEH_TIP                               :{BLACK}Оновити всі автомобілі в депо
 STR_DEPOT_AUTOREPLACE_SHIP_TIP                                  :{BLACK}Оновити всі кораблі в депо
-STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP                              :{BLACK}Оновити всі літаки в депо
+STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP                              :{BLACK}Оновити всі літаки в ангарі
 
-STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - {COMMA} Поїзд{P "" и ів}
-STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - {COMMA} Авто {P "" "" ""}
-STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA} Кораб{P ель лі лів}
-STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} Аеропорт
+STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - {COMMA} поїзд{P "" и ів}
+STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - {COMMA} автомобіл{P ь і ів}
+STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA} кораб{P ель лі лів}
+STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} літак {P "" и ів}
 
 STR_REPLACE_VEHICLES_WHITE                                      :{WHITE}Оновити {STRING}
 STR_REPLACE_VEHICLES_START                                      :{BLACK}Почати оновлення
@@ -3340,13 +3348,13 @@
 STR_NOT_REPLACING_VEHICLE_SELECTED                              :{BLACK}Не вибрано машину
 STR_REPLACE_HELP_LEFT_ARRAY                                     :{BLACK}Виберіть транспорт для оновлення
 STR_REPLACE_HELP_RIGHT_ARRAY                                    :{BLACK}Виберіть новий транспорт, яким ви бажаєте замінити старий
-STR_REPLACE_HELP_STOP_BUTTON                                    :{BLACK}Натисніть для припинення процесу оновлення потягів що вибрані ліворуч
-STR_REPLACE_HELP_START_BUTTON                                   :{BLACK}Натисніть для запуску оновлення потягів, що вибрані праворуч на потяги що вибрані праворуч
+STR_REPLACE_HELP_STOP_BUTTON                                    :{BLACK}Натисніть для припинення процесу оновлення потягів, що вибрані ліворуч
+STR_REPLACE_HELP_START_BUTTON                                   :{BLACK}Натисніть для запуску оновлення потягів, що вибрані праворуч, на потяги, що вибрані праворуч
 STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}Виберіть тип колії, для якої Ви хочете оновити потяг
-STR_REPLACE_HELP_REPLACE_INFO_TAB                               :{BLACK}Показує на який потяг буде замінено потяг, зображелий ліворуч
+STR_REPLACE_HELP_REPLACE_INFO_TAB                               :{BLACK}Показує, яким потягом буде замінено потяг, вибраний ліворуч
 STR_REPLACE_HELP                                                :{BLACK}Це дозволить Вам оновити одні види потягів іншими, коли потяг прибуде в депо
-STR_REPLACE_REMOVE_WAGON                                        :{BLACK}Продаж вагонів!!!: {ORANGE}{SKIP}{STRING}
-STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Дозволити автооновленню видаляти вагони зберігаючи довжину потягу(починаючи спереду), якщо оновлення робить поїзд довшим.
+STR_REPLACE_REMOVE_WAGON                                        :{BLACK}Продаж вагонів: {ORANGE}{SKIP}{STRING}
+STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Дозволити автооновленню видаляти вагони, зберігаючи довжину потягу (починаючи спереду), якщо оновлення робить поїзд довшим.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Оновлення: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} ЕКСПЕРИМЕНТАЛЬНО {}Переключення між вікнами заміни потягів та вагонів.{}Автозаміна потягів відбудеться лише в тому випадку, якщо співпаде тип вантажу що перевозиться. Ця перевірка проводиться для кожного вагону під час автозаміни.
 STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Поїзд недоступний
@@ -3436,7 +3444,7 @@
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Розміри дуже великі. Продовжити генерацію?
 STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Попередження про схему міста
 STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Схема міста "не треба більше доріг" небажана. Продовжити генерацію?
-STR_HEIGHTMAP_NAME                                              :{BLACK}Ім'я рельєфа:
+STR_HEIGHTMAP_NAME                                              :{BLACK}Назва рельєфу:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Розмір: {ORANGE}{NUM} x {NUM}
 STR_GENERATION_WORLD                                            :{WHITE}Генерація світу...
 STR_GENERATION_ABORT                                            :{BLACK}Перервати
@@ -3502,12 +3510,13 @@
 STR_TRANSPARENCY_TOOLB                                          :{WHITE}Опції прозорості
 STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Переключити прозорість для знаків станцій
 STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Переключити прозорість для дерев
-STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Переключити прозорість для будинків
-STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Переключити прозорість для промисловості
-STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Переключити прозорість для споруд, таких як станції, депо, ЛЕП тощо
-STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Переключити прозорість для мостів
-STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Переключити прозорість для споруд, таких як маяки та антенни (може, потім)
-STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Змінити прозорість індикаторів завантаження
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Переключити прозорість для будинків. CTRL+click - запам'ятати
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Переключити прозорість для промисловості. CTRL+click - запам'ятати
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Переключити прозорість для споруд, таких як станції, депо тощо. CTRL+click - запам'ятати
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Переключити прозорість для мостів. CTRL+click - запам'ятати
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Переключити прозорість для споруд, таких як маяки та антени. CTRL+click - запам'ятати
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Переключити прозорість для ЛЕП. CTRL+click - запам'ятати
+STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Змінити прозорість індикаторів завантаження. CTRL+click - запам'ятати
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
 STR_PERCENT_UP                                                  :{WHITE}{NUM}%{UPARROW}
@@ -3558,7 +3567,7 @@
 STR_SIGN_NAME                                                   :{SIGN}
 STR_VEHICLE_NAME                                                :{VEHICLE}
 
-STR_NAME_MUST_BE_UNIQUE                                         :{WHITE}Ім'я має бути унікальним
+STR_NAME_MUST_BE_UNIQUE                                         :{WHITE}Назва має бути унікальною
 
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Наступне позначення
@@ -3621,7 +3630,7 @@
 
 ############ signal GUI
 STR_SIGNAL_SELECTION                                            :{WHITE}Вибір сигналів
-STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE                           :{WHITE}Не можна сконвертувати сигнали тут...
+STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE                           :{WHITE}Не можна конвертувати сигнали тут...
 STR_BUILD_SIGNAL_SEMAPHORE_NORM_TIP                             :{BLACK}Звичайний сигнал (семафор){}Сигнали необхідні для того, щоб уникнути зіткнень поїздів на залізницях, де більше одного поїзда.
 STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TIP                            :{BLACK}Вхідний сигнал (семафор){}Зелений, доки є один або більше зелених вихідних сигналів з наступної секції колії. Якщо нема - червоний.
 STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TIP                             :{BLACK}Вихідний сигнал (семафор){}Поводиться, як звичайний сигнал, але необхідний для нормальної роботи вхідного або комбінованого сигналів.
--- a/src/lang/unfinished/greek.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/unfinished/greek.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1030,7 +1030,6 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Μετακίνηση παραθύρου όταν είναι το ποντίκι στην άκρη: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Επιτρέπεται η δωροδοκία της τοπικής αρχής: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ανομοιόμορφοι σταθμοί: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Νέο παγκόσμιο σύστημα εύρεσης μονοπατιού (NPF, αγνοεί το NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Πολλαπλασιαστής βάρους σε φορία για εξομοίωση βαρέων τρένων: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Επιτρέπεται η κίνηση μέσω των στάσεων σε δρόμους πόλεων : {ORANGE}{STRING}
 
@@ -1137,9 +1136,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Αλλαγή τιμής ρύθμισης
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Κάποια ή όλα τα προεπιλεγμένα διαστήματα επισκευών παρακάτω δεν είναι συμβατά με την επιλεγμένη ρύθμιση! 5-90% και 30-800 μέρες είναι τα αποδεκτά
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Χρησιμοποίηση YAPF για τα πλοία: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Χρησιμοποίηση YAPF για τα οχήματα: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Χρησιμοποίηση YAPF για τα τρένα: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Συγκρατημένο τοπίο
 STR_SUB_ARCTIC_LANDSCAPE                                        :Πολικό τοπίο
--- a/src/lang/unfinished/latvian.txt	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/lang/unfinished/latvian.txt	Mon Mar 10 15:26:39 2008 +0000
@@ -1024,7 +1024,6 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Bi'di't logu kad pele ir ta' mala': {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Atl'aut viete'jo varas iesta'z'u piekukul'os'anu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ne-uniformas stacijas: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Jauna' globa'la' cel'u kars'rutiza'cija (NPF, aizsta'j NTP): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Vienme'r atl'aut mazas lidostas: {ORANGE}{STRING}
 
@@ -1114,9 +1113,6 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Mainīt iestatījuma vērtību
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Daži vai visi apkalpošanas intervāli ir nesavietojami ar izvēlētajiem iestatījumiem! Der 5-90% un 30-800 dienas
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Izmantot YAPF kuģiem: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Izmantot YAPF autotransportam: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Izmantot YAPF vilcieniem: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Mērenais klimats
 STR_SUB_ARCTIC_LANDSCAPE                                        :Subarktiskais klimats
--- a/src/main_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/main_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -977,8 +977,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);
+	if (IsTransparencySet(TO_HOUSES))                SetBit(x, 12);
+	if (IsTransparencySet(TO_SIGNS))                 SetBit(x, 13);
 	WP(w, menu_d).checked_items = x;
 }
 
@@ -1668,7 +1668,7 @@
 {
 	char buf[512];
 	StringID str;
-	const char *s;
+	const char *s, *last;
 	char *d;
 	DrawPixelInfo tmp_dpi, *old_dpi;
 	int x;
@@ -1685,19 +1685,22 @@
 
 	s = buf;
 	d = buffer;
+	last = lastof(buffer);
 
 	for (;;) {
 		WChar c = Utf8Consume(&s);
 		if (c == 0) {
-			*d = '\0';
 			break;
-		} else if (*s == 0x0D) {
+		} else if (c == 0x0D) {
+			if (d + 4 >= last) break;
 			d[0] = d[1] = d[2] = d[3] = ' ';
 			d += 4;
 		} else if (IsPrintable(c)) {
+			if (d + Utf8CharLen(c) >= last) break;
 			d += Utf8Encode(d, c);
 		}
 	}
+	*d = '\0';
 
 	if (!FillDrawPixelInfo(&tmp_dpi, 141, 1, width, 11)) return true;
 
@@ -1914,6 +1917,7 @@
 			case '6' | WKC_CTRL:
 			case '7' | WKC_CTRL:
 			case '8' | WKC_CTRL:
+			case '9' | WKC_CTRL:
 				/* Transparency toggle hot keys */
 				ToggleTransparency((TransparencyOption)(e->we.keypress.keycode - ('1' | WKC_CTRL)));
 				MarkWholeScreenDirty();
--- a/src/misc_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/misc_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -314,11 +314,11 @@
 		_pause_game += (p1 == 0) ? -1 : 1;
 
 		switch (_pause_game) {
-			case (byte)-4:
-			case (byte)-1:
+			case -4:
+			case -1:
 				_pause_game = 0;
 				break;
-			case (byte)-3:
+			case -3:
 				ShowQuery(
 					STR_NEWGRF_UNPAUSE_WARNING_TITLE,
 					STR_NEWGRF_UNPAUSE_WARNING,
--- a/src/misc_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/misc_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -219,6 +219,7 @@
 	"  Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles",
 	"  Matthijs Kooijman (blathijs) - Pathfinder-guru, pool rework",
 	"  Loïc Guilloux (glx) - General coding",
+	"  Christoph Elsenhans (frosch) - General coding",
 	"  Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;)",
 	"  Jonathan Coome (Maedhros) - High priest of the newGRF Temple",
 	"  Attila Bán (MiHaMiX) - WebTranslator, Nightlies, Wiki and bugtracker host",
@@ -1633,7 +1634,7 @@
 	case WE_DESTROY:
 		/* pause is only used in single-player, non-editor mode, non menu mode */
 		if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) {
-			DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
+			if (_pause_game >= 0) DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
 		}
 		FiosFreeSavegameList();
 		ClrBit(_no_scroll, SCROLL_SAVE);
@@ -1725,7 +1726,7 @@
 	/* pause is only used in single-player, non-editor mode, non-menu mode. It
 	 * will be unpaused in the WE_DESTROY event handler. */
 	if (_game_mode != GM_MENU && !_networking && _game_mode != GM_EDITOR) {
-		DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
+		if (_pause_game >= 0) DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
 	}
 
 	BuildFileList();
--- a/src/newgrf.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -94,24 +94,6 @@
 static GrfDataType _grf_data_type;
 
 
-enum grfspec_feature {
-	GSF_TRAIN,
-	GSF_ROAD,
-	GSF_SHIP,
-	GSF_AIRCRAFT,
-	GSF_STATION,
-	GSF_CANAL,
-	GSF_BRIDGE,
-	GSF_TOWNHOUSE,
-	GSF_GLOBALVAR,
-	GSF_INDUSTRYTILES,
-	GSF_INDUSTRIES,
-	GSF_CARGOS,
-	GSF_SOUNDFX,
-	GSF_FSMPORTS,
-};
-
-
 typedef void (*SpecialSpriteHandler)(byte *buf, int len);
 
 static const uint _vehcounts[4] = {
@@ -140,7 +122,7 @@
 static uint32 _grm_engines[TOTAL_NUM_ENGINES];
 
 /* Contains the GRF ID of the owner of a cargo if it has been reserved */
-static uint32 _grm_cargos[NUM_CARGO];
+static uint32 _grm_cargos[NUM_CARGO * 2];
 
 /** DEBUG() function dedicated to newGRF debugging messages
  * Function is essentialy the same as DEBUG(grf, severity, ...) with the
@@ -264,13 +246,24 @@
 		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
 	 * grfid in which they are declared */
-	if (GB(str, 8, 8) == 0xD0 || GB(str, 8, 8) == 0xDC) {
-		return GetGRFStringID(grfid, str);
-	}
+	switch (GB(str, 8, 8)) {
+		case 0xD0: case 0xD1: case 0xD2: case 0xD3:
+		case 0xDC:
+			return GetGRFStringID(grfid, str);
+
+		case 0xD4: case 0xD5: case 0xD6: case 0xD7:
+			/* Strings embedded via 0x81 have 0x400 added to them (no real
+			 * explanation why...) */
+			return GetGRFStringID(grfid, str - 0x400);
+
+		default: break;
+	}
+
 #define TEXID_TO_STRINGID(begin, end, stringid) if (str >= begin && str <= end) return str + (stringid - begin)
 	/* We have some changes in our cargo strings, resulting in some missing. */
 	TEXID_TO_STRINGID(0x000E, 0x002D, STR_000E);
@@ -309,6 +302,26 @@
 	return colour;
 }
 
+/** Map the colour modifiers of TTDPatch to those that Open is using.
+ * @param grf_sprite pointer to the structure been modified
+ */
+static void MapSpriteMappingRecolour(PalSpriteID *grf_sprite)
+{
+	if (HasBit(grf_sprite->pal, 14)) {
+		ClrBit(grf_sprite->pal, 14);
+		SetBit(grf_sprite->sprite, SPRITE_MODIFIER_OPAQUE);
+	}
+
+	if (HasBit(grf_sprite->sprite, 14)) {
+		ClrBit(grf_sprite->sprite, 14);
+		SetBit(grf_sprite->sprite, PALETTE_MODIFIER_TRANSPARENT);
+	}
+
+	if (HasBit(grf_sprite->sprite, 15)) {
+		ClrBit(grf_sprite->sprite, 15);
+		SetBit(grf_sprite->sprite, PALETTE_MODIFIER_COLOR);
+	}
+}
 
 typedef bool (*VCI_Handler)(uint engine, int numinfo, int prop, byte **buf, int len);
 
@@ -377,20 +390,22 @@
 
 				if (rvi->railveh_type == RAILVEH_MULTIHEAD) runcostfact /= 2;
 
-				rvi->running_cost_base = runcostfact;
+				rvi->running_cost = runcostfact;
 			} break;
 
 			case 0x0E: { // Running cost base
 				uint32 base = grf_load_dword(&buf);
 
-				switch (base) {
-					case 0x4C30: rvi->running_cost_class = 0; break;
-					case 0x4C36: rvi->running_cost_class = 1; break;
-					case 0x4C3C: rvi->running_cost_class = 2; break;
-					case 0: break; // Used by wagons
-					default:
-						grfmsg(1, "RailVehicleChangeInfo: Unsupported running cost base 0x%04X, ignoring", base);
-						break;
+				/* These magic numbers are used in GRFs to specify the base cost:
+				 * http://wiki.ttdpatch.net/tiki-index.php?page=BaseCosts
+				 */
+				if (base == 0) {
+					rvi->running_cost_class = 0xFF;
+				} else if (base < 0x4B34 || base > 0x4C54 || (base - 0x4B34) % 6 != 0) {
+					grfmsg(1, "RailVehicleChangeInfo: Unsupported running cost base 0x%04X, ignoring", base);
+				} else {
+					/* Convert the magic number to an index into the price data */
+					rvi->running_cost_class = (base - 0x4B34) / 6;
 				}
 			} break;
 
@@ -411,14 +426,14 @@
 					if (rvi->railveh_type != RAILVEH_MULTIHEAD) {
 						// adjust power and running cost if needed
 						rvi->power /= 2;
-						rvi->running_cost_base /= 2;
+						rvi->running_cost /= 2;
 					}
 					rvi->railveh_type = RAILVEH_MULTIHEAD;
 				} else {
 					if (rvi->railveh_type == RAILVEH_MULTIHEAD) {
 						// adjust power and running cost if needed
 						rvi->power *= 2;
-						rvi->running_cost_base *= 2;
+						rvi->running_cost *= 2;
 					}
 					rvi->railveh_type = rvi->power == 0 ?
 						RAILVEH_WAGON : RAILVEH_SINGLEHEAD;
@@ -594,12 +609,23 @@
 				rvi->running_cost = grf_load_byte(&buf);
 				break;
 
-			case 0x0A: // Running cost base
-				/** @todo : I have no idea. --pasky
-				 * I THINK it is used for overriding the base cost of all road vehicle (_price.roadveh_base) --belugas */
-				grf_load_dword(&buf);
-				ret = true;
-				break;
+			case 0x0A: { // Running cost base
+				uint32 base= grf_load_dword(&buf);
+
+				/* These magic numbers are used in GRFs to specify the base cost:
+				 * http://wiki.ttdpatch.net/tiki-index.php?page=BaseCosts
+				 */
+				if (base == 0) {
+					rvi->running_cost_class = 0xFF;
+				} else if (base < 0x4B34 || base > 0x4C54 || (base - 0x4B34) % 6 != 0) {
+					grfmsg(1, "RailVehicleChangeInfo: Unsupported running cost base 0x%04X, ignoring", base);
+				} else {
+					/* Convert the magic number to an index into the price data */
+					rvi->running_cost_class = (base - 0x4B34) / 6;
+				}
+
+				break;
+			}
 
 			case 0x0E: { // Sprite ID
 				uint8 spriteid = grf_load_byte(&buf);
@@ -954,25 +980,15 @@
 					uint seq_count = 0;
 
 					dts->seq = NULL;
-					dts->ground_sprite = grf_load_word(&buf);
-					dts->ground_pal = grf_load_word(&buf);
-					if (dts->ground_sprite == 0) continue;
-					if (HasBit(dts->ground_pal, 15)) {
-						ClrBit(dts->ground_pal, 15);
-						SetBit(dts->ground_sprite, SPRITE_MODIFIER_USE_OFFSET);
+					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, 14)) {
-						ClrBit(dts->ground_pal, 14);
-						SetBit(dts->ground_sprite, SPRITE_MODIFIER_OPAQUE);
-					}
-					if (HasBit(dts->ground_sprite, 15)) {
-						ClrBit(dts->ground_sprite, 15);
-						SetBit(dts->ground_sprite, PALETTE_MODIFIER_COLOR);
-					}
-					if (HasBit(dts->ground_sprite, 14)) {
-						ClrBit(dts->ground_sprite, 14);
-						SetBit(dts->ground_sprite, PALETTE_MODIFIER_TRANSPARENT);
-					}
+
+					MapSpriteMappingRecolour(&dts->ground);
 
 					while (buf < *bufp + len) {
 						DrawTileSeqStruct *dtss;
@@ -988,27 +1004,16 @@
 						dtss->size_x = grf_load_byte(&buf);
 						dtss->size_y = grf_load_byte(&buf);
 						dtss->size_z = grf_load_byte(&buf);
-						dtss->image = grf_load_word(&buf);
-						dtss->pal = grf_load_word(&buf);
+						dtss->image.sprite = grf_load_word(&buf);
+						dtss->image.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, 14)) {
-							ClrBit(dtss->pal, 14);
-							SetBit(dtss->image, SPRITE_MODIFIER_OPAQUE);
+						if (HasBit(dtss->image.pal, 15)) {
+							ClrBit(dtss->image.pal, 15);
+							SetBit(dtss->image.sprite, SPRITE_MODIFIER_USE_OFFSET);
 						}
 
-						if (HasBit(dtss->image, 15)) {
-							ClrBit(dtss->image, 15);
-							SetBit(dtss->image, PALETTE_MODIFIER_COLOR);
-						}
-						if (HasBit(dtss->image, 14)) {
-							ClrBit(dtss->image, 14);
-							SetBit(dtss->image, PALETTE_MODIFIER_TRANSPARENT);
-						}
+						MapSpriteMappingRecolour(&dtss->image);
 					}
 				}
 				break;
@@ -1185,7 +1190,7 @@
 	}
 
 	for (int i = 0; i < numinfo; i++) {
-		Bridge *bridge = &_bridge[brid + i];
+		BridgeSpec *bridge = &_bridge[brid + i];
 
 		switch (prop) {
 			case 0x08: // Year of availability
@@ -1232,15 +1237,10 @@
 						SpriteID image = grf_load_word(&buf);
 						SpriteID pal   = grf_load_word(&buf);
 
-						if (HasBit(pal, 15)) {
-							SetBit(image, PALETTE_MODIFIER_TRANSPARENT);
-						}
-
-						/* Clear old color modifer bit */
-						ClrBit(image, 15);
-
 						bridge->sprite_table[tableid][sprite].sprite = image;
 						bridge->sprite_table[tableid][sprite].pal    = pal;
+
+						MapSpriteMappingRecolour(&bridge->sprite_table[tableid][sprite]);
 					}
 				}
 			} break;
@@ -1253,6 +1253,17 @@
 				bridge->avail_year = Clamp(grf_load_dword(&buf), MIN_YEAR, MAX_YEAR);
 				break;
 
+			case 0x10: { // purchase string
+				StringID newone = GetGRFStringID(_cur_grffile->grfid, grf_load_word(&buf));
+				if (newone != STR_UNDEFINED) bridge->material = newone;
+				} break;
+
+			case 0x11: // description of bridge with rails or roads
+			case 0x12: {
+				StringID newone = GetGRFStringID(_cur_grffile->grfid, grf_load_word(&buf));
+				if (newone != STR_UNDEFINED) bridge->transport_name[prop - 0x11] = newone;
+				} break;
+
 			default:
 				ret = true;
 				break;
@@ -1496,21 +1507,11 @@
 				}
 			} 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 0x09: // Cargo translation table
+				/* This is loaded during the reservation stage, so just skip it here. */
+				/* Each entry is 4 bytes. */
+				buf += 4;
+				break;
 
 			case 0x0A: { // Currency display names
 				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
@@ -2135,7 +2136,7 @@
 				break;
 
 			case 0x24: // name for nearby station
-				indsp->station_name = GRFMappedStringID(grf_load_dword(&buf), _cur_grffile->grfid);
+				indsp->station_name = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
 				break;
 
 			default:
@@ -2225,12 +2226,12 @@
 					uint seq_count = 0;
 
 					dts->seq = NULL;
-					dts->ground_sprite = grf_load_word(&buf);
-					dts->ground_pal = grf_load_word(&buf);
-					if (dts->ground_sprite == 0) continue;
-					if (HasBit(dts->ground_pal, 15)) {
-						ClrBit(dts->ground_pal, 15);
-						SetBit(dts->ground_sprite, SPRITE_MODIFIER_USE_OFFSET);
+					dts->ground.sprite = grf_load_word(&buf);
+					dts->ground.pal = grf_load_word(&buf);
+					if (dts->ground.sprite == 0) continue;
+					if (HasBit(dts->ground.pal, 15)) {
+						ClrBit(dts->ground.pal, 15);
+						SetBit(dts->ground.sprite, SPRITE_MODIFIER_USE_OFFSET);
 					}
 
 					while (buf < *bufp + len) {
@@ -2247,22 +2248,27 @@
 						dtss->size_x = grf_load_byte(&buf);
 						dtss->size_y = grf_load_byte(&buf);
 						dtss->size_z = grf_load_byte(&buf);
-						dtss->image = grf_load_word(&buf);
-						dtss->pal = grf_load_word(&buf);
+						dtss->image.sprite = grf_load_word(&buf);
+						dtss->image.pal = grf_load_word(&buf);
 
 						/* Remap flags as ours collide */
-						if (HasBit(dtss->pal, 15)) {
-							ClrBit(dtss->pal, 15);
-							SetBit(dtss->image, SPRITE_MODIFIER_USE_OFFSET);
+						if (HasBit(dtss->image.pal, 15)) {
+							ClrBit(dtss->image.pal, 15);
+							SetBit(dtss->image.sprite, SPRITE_MODIFIER_USE_OFFSET);
 						}
 
-						if (HasBit(dtss->image, 15)) {
-							ClrBit(dtss->image, 15);
-							SetBit(dtss->image, PALETTE_MODIFIER_COLOR);
+						if (HasBit(dtss->image.pal, 14)) {
+							ClrBit(dtss->image.pal, 14);
+							SetBit(dtss->image.sprite, SPRITE_MODIFIER_OPAQUE);
 						}
-						if (HasBit(dtss->image, 14)) {
-							ClrBit(dtss->image, 14);
-							SetBit(dtss->image, PALETTE_MODIFIER_TRANSPARENT);
+
+						if (HasBit(dtss->image.sprite, 15)) {
+							ClrBit(dtss->image.sprite, 15);
+							SetBit(dtss->image.sprite, PALETTE_MODIFIER_COLOR);
+						}
+						if (HasBit(dtss->image.sprite, 14)) {
+							ClrBit(dtss->image.sprite, 14);
+							SetBit(dtss->image.sprite, PALETTE_MODIFIER_TRANSPARENT);
 						}
 					}
 				}
@@ -2510,7 +2516,7 @@
 		/* GSF_CANAL */        CanalChangeInfo,
 		/* GSF_BRIDGE */       BridgeChangeInfo,
 		/* GSF_TOWNHOUSE */    TownHouseChangeInfo,
-		/* GSF_GLOBALVAR */    NULL, /* Global variables are handled during reservation */
+		/* GSF_GLOBALVAR */    GlobalVarChangeInfo,
 		/* GSF_INDUSTRYTILES */IndustrytilesChangeInfo,
 		/* GSF_INDUSTRIES */   IndustriesChangeInfo,
 		/* GSF_CARGOS */       NULL, /* Cargo is handled during reservation */
@@ -2631,7 +2637,7 @@
 {
 	byte *bufend = buf + len;
 
-	if (!check_length(len, 6, "InitChangeInfo")) return;
+	if (!check_length(len, 6, "ReserveChangeInfo")) return;
 	buf++;
 	uint8 feature  = grf_load_byte(&buf);
 
@@ -2651,7 +2657,23 @@
 				ignoring = CargoChangeInfo(index, numinfo, prop, &buf, bufend - buf);
 				break;
 			case GSF_GLOBALVAR:
-				ignoring = GlobalVarChangeInfo(index, numinfo, prop, &buf, bufend - buf);
+				switch (prop) {
+					case 0x09: // Cargo Translation Table
+						if (index != 0) {
+							grfmsg(1, "ReserveChangeInfo: 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;
 		}
 
@@ -2997,27 +3019,18 @@
 					group->g.layout.dts = CallocT<DrawTileSprites>(1);
 
 					/* Groundsprite */
-					group->g.layout.dts->ground_sprite = grf_load_word(&buf);
-					group->g.layout.dts->ground_pal    = grf_load_word(&buf);
+					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, 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, 15)) {
+					MapSpriteMappingRecolour(&group->g.layout.dts->ground);
+
+					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);
+						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);
 					}
 
 					group->g.layout.dts->seq = CallocT<DrawTileSeqStruct>(num_sprites + 1);
@@ -3025,29 +3038,19 @@
 					for (i = 0; i < num_sprites; i++) {
 						DrawTileSeqStruct *seq = (DrawTileSeqStruct*)&group->g.layout.dts->seq[i];
 
-						seq->image = grf_load_word(&buf);
-						seq->pal   = grf_load_word(&buf);
+						seq->image.sprite = grf_load_word(&buf);
+						seq->image.pal   = grf_load_word(&buf);
 						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, 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, 15)) {
+						MapSpriteMappingRecolour(&seq->image);
+
+						if (HasBit(seq->image.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);
+							SpriteID sprite = _cur_grffile->spriteset_start + GB(seq->image.sprite, 0, 14) * sprites;
+							SB(seq->image.sprite, 0, SPRITE_WIDTH, sprite);
+							ClrBit(seq->image.pal, 15);
 						}
 
 						if (type > 0) {
@@ -3481,6 +3484,11 @@
 	 * W cid           cargo ID (sprite group ID) for this type of cargo
 	 * W def-cid       default cargo ID (sprite group ID) */
 
+	if (_cur_grffile->spritegroups == 0) {
+		grfmsg(1, "FeatureMapSpriteGroup: No sprite groups to work on! Skipping");
+		return;
+	}
+
 	if (!check_length(len, 6, "FeatureMapSpriteGroup")) return;
 
 	uint8 feature = buf[1];
@@ -3491,7 +3499,12 @@
 
 	/* If idcount is zero, this is a feature callback */
 	if (idcount == 0) {
-		grfmsg(2, "FeatureMapSpriteGroup: Feature callbacks not implemented yet");
+		byte *bp = &buf[4];
+		uint16 groupid = grf_load_word(&bp);
+
+		grfmsg(6, "FeatureMapSpriteGroup: Adding generic feature callback for feature %d", feature);
+
+		AddGenericCallback(feature, _cur_grffile, _cur_grffile->spritegroups[groupid]);
 		return;
 	}
 
@@ -3501,11 +3514,6 @@
 	grfmsg(6, "FeatureMapSpriteGroup: Feature %d, %d ids, %d cids, wagon override %d",
 			feature, idcount, cidcount, wagover);
 
-	if (_cur_grffile->spritegroups == 0) {
-		grfmsg(1, "FeatureMapSpriteGroup: No sprite groups to work on! Skipping");
-		return;
-	}
-
 	switch (feature) {
 		case GSF_TRAIN:
 		case GSF_ROAD:
@@ -3671,6 +3679,9 @@
 						break;
 
 					case 0xD0:
+					case 0xD1:
+					case 0xD2:
+					case 0xD3:
 					case 0xDC:
 						AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
 						break;
@@ -3857,15 +3868,131 @@
 	grfmsg(3, "SkipAct5: Skipping %d sprites", _skip_sprites);
 }
 
-static uint32 GetParamVal(byte param, uint32 *cond_val)
+/**
+ * Reads a variable common to VarAction2 and Action7/9/D.
+ *
+ * Returns VarAction2 variable 'param' resp. Action7/9/D variable '0x80 + param'.
+ * If a variable is not accessible from all four actions, it is handled in the action specific functions.
+ *
+ * @param param variable number (as for VarAction2, for Action7/9/D you have to subtract 0x80 first).
+ * @param value returns the value of the variable.
+ * @return true iff the variable is known and the value is returned in 'value'.
+ */
+bool GetGlobalVariable(byte param, uint32 *value)
 {
 	switch (param) {
-		case 0x81: // current 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;
-
+		case 0x00: // current date
+			*value = max(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0);
+			return true;
+
+		case 0x01: // current year
+			*value = Clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
+			return true;
+
+		case 0x02: // current month
+			*value = _cur_month;
+			return true;
+
+		case 0x03: // current climate, 0=temp, 1=arctic, 2=trop, 3=toyland
+			*value = _opt.landscape;
+			return true;
+
+		case 0x06: // road traffic side, bit 4 clear=left, set=right
+			*value = _opt.road_side << 4;
+			return true;
+
+		case 0x09: // date fraction
+			*value = _date_fract;
+			return true;
+
+		case 0x0A: // animation counter
+			*value = _tick_counter;
+			return true;
+
+		case 0x0B: { // TTDPatch version
+			uint major    = 2;
+			uint minor    = 6;
+			uint revision = 1; // special case: 2.0.1 is 2.0.10
+			uint build    = 1382;
+			*value = (major << 24) | (minor << 20) | (revision << 16) | build;
+			return true;
+		}
+
+		case 0x0D: // TTD Version, 00=DOS, 01=Windows
+			*value = !_use_dos_palette;
+			return true;
+
+		case 0x0E: // Y-offset for train sprites
+			*value = _traininfo_vehicle_pitch;
+			return true;
+
+		case 0x0F: // Rail track type cost factors
+			*value = 0;
+			SB(*value, 0, 8, _railtype_cost_multiplier[0]); // normal rail
+			if (_patches.disable_elrails) {
+				/* skip elrail multiplier - disabled */
+				SB(*value, 8, 8, _railtype_cost_multiplier[2]); // monorail
+			} else {
+				SB(*value, 8, 8, _railtype_cost_multiplier[1]); // electified railway
+				/* Skip monorail multiplier - no space in result */
+			}
+			SB(*value, 16, 8, _railtype_cost_multiplier[3]); // maglev
+			return true;
+
+		case 0x11: // current rail tool type
+			*value = 0;
+			return true;
+
+		case 0x12: // Game mode
+			*value = _game_mode;
+			return true;
+
+		/* case 0x13: // Tile refresh offset to left    not implemented */
+		/* case 0x14: // Tile refresh offset to right   not implemented */
+		/* case 0x15: // Tile refresh offset upwards    not implemented */
+		/* case 0x16: // Tile refresh offset downwards  not implemented */
+		/* case 0x17: // temperate snow line            not implemented */
+
+		case 0x1A: // Always -1
+			*value = UINT_MAX;
+			return true;
+
+		case 0x1B: // Display options
+			*value = GB(_display_opt, 0, 6);
+			return true;
+
+		case 0x1D: // TTD Platform, 00=TTDPatch, 01=OpenTTD
+			*value = 1;
+			return true;
+
+		case 0x1E: // Miscellaneous GRF features
+			*value = _misc_grf_features;
+			return true;
+
+		/* case 0x1F: // locale dependent settings not implemented */
+
+		case 0x20: // snow line height
+			*value = _opt.landscape == LT_ARCTIC ? GetSnowLine() : 0xFF;
+			return true;
+
+		case 0x21: { // OpenTTD version
+			extern uint32 _openttd_newgrf_version;
+			*value = _openttd_newgrf_version;
+			return true;
+		}
+
+		default: return false;
+	}
+}
+
+static uint32 GetParamVal(byte param, uint32 *cond_val)
+{
+	/* First handle variable common with VarAction2 */
+	uint32 value;
+	if (GetGlobalVariable(param - 0x80, &value)) return value;
+
+	/* Non-common variable */
+	switch (param) {
 		case 0x84: { // GRF loading stage
 			uint32 res = 0;
 
@@ -3885,42 +4012,10 @@
 				return param_val;
 			}
 
-		case 0x86: // road traffic side, bit 4 clear=left, set=right
-			return _opt.road_side << 4;
-
 		case 0x88: // GRF ID check
 			return 0;
 
-		case 0x8B: { // TTDPatch version
-			uint major    = 2;
-			uint minor    = 6;
-			uint revision = 1; // special case: 2.0.1 is 2.0.10
-			uint build    = 1382;
-			return (major << 24) | (minor << 20) | (revision << 16) | build;
-		}
-
-		case 0x8D: // TTD Version, 00=DOS, 01=Windows
-			return !_use_dos_palette;
-
-		case 0x8E: // Y-offset for train sprites
-			return _traininfo_vehicle_pitch;
-
-		case 0x92: // Game mode
-			return _game_mode;
-
-		case 0x9A: // Always -1
-			return UINT_MAX;
-
-		case 0x9D: // TTD Platform, 00=TTDPatch, 01=OpenTTD
-			return 1;
-
-		case 0x9E: // Miscellaneous GRF features
-			return _misc_grf_features;
-
-		case 0xA1: { // OpenTTD version
-			extern uint32 _openttd_newgrf_version;
-			return _openttd_newgrf_version;
-		}
+		/* case 0x99: Global ID offest not implemented */
 
 		default:
 			/* GRF Parameter */
@@ -4190,12 +4285,12 @@
 
 	len -= 6;
 	const char *name = grf_load_string(&buf, len);
-	_cur_grfconfig->name = TranslateTTDPatchCodes(name);
+	_cur_grfconfig->name = TranslateTTDPatchCodes(grfid, name);
 
 	len -= strlen(name) + 1;
 	if (len > 0) {
 		const char *info = grf_load_string(&buf, len);
-		_cur_grfconfig->info = TranslateTTDPatchCodes(info);
+		_cur_grfconfig->info = TranslateTTDPatchCodes(grfid, info);
 	}
 
 	/* GLS_INFOSCAN only looks for the action 8, so we can skip the rest of the file */
@@ -4365,7 +4460,7 @@
 		const char *message = grf_load_string(&buf, len);
 		len -= (strlen(message) + 1);
 
-		error->custom_message = TranslateTTDPatchCodes(message);
+		error->custom_message = TranslateTTDPatchCodes(_cur_grffile->grfid, message);
 	} else {
 		error->message = msgstr[message_id];
 	}
@@ -4374,7 +4469,7 @@
 		const char *data = grf_load_string(&buf, len);
 		len -= (strlen(data) + 1);
 
-		error->data = TranslateTTDPatchCodes(data);
+		error->data = TranslateTTDPatchCodes(_cur_grffile->grfid, data);
 	}
 
 	/* Only two parameter numbers can be used in the string. */
@@ -4436,8 +4531,18 @@
 		/* empty wagon speed increase */
 		case 0x0F: return 0;
 
-		/* plane speed factor */
-		case 0x10: return 4;
+		/* plane speed factor; our patch option is reversed from TTDPatch's,
+		 * the following is good for 1x, 2x and 4x (most common?) and...
+		 * well not really for 3x. */
+		case 0x10:
+			switch (_patches.plane_speed) {
+				default:
+				case 4: return 1;
+				case 3: return 2;
+				case 2: return 2;
+				case 1: return 4;
+			}
+
 
 		/* 2CC colormap base sprite */
 		case 0x11: return SPR_2CCMAP_BASE;
@@ -4774,6 +4879,10 @@
 			_traininfo_vehicle_width = HasGrfMiscBit(GMB_TRAIN_WIDTH_32_PIXELS) ? 32 : 29;
 			break;
 
+		case 0x9F: // locale-dependent settings
+			grfmsg(7, "ParamSet: Skipping unimplemented target 0x%02X", target);
+			break;
+
 		default:
 			if (target < 0x80) {
 				_cur_grffile->param[target] = res;
@@ -4875,7 +4984,7 @@
 			if (!check_length(len, 1, "FeatureTownName: style name")) return;
 			const char *name = grf_load_string(&buf, len);
 			len -= strlen(name) + 1;
-			grfmsg(6, "FeatureTownName: lang 0x%X -> '%s'", lang, TranslateTTDPatchCodes(name));
+			grfmsg(6, "FeatureTownName: lang 0x%X -> '%s'", lang, TranslateTTDPatchCodes(grfid, name));
 
 			townname->name[nb_gen] = AddGRFString(grfid, id, lang, new_scheme, name, STR_UNDEFINED);
 
@@ -4928,7 +5037,7 @@
 			} else {
 				const char *text = grf_load_string(&buf, len);
 				len -= strlen(text) + 1;
-				townname->partlist[id][i].parts[j].data.text = TranslateTTDPatchCodes(text);
+				townname->partlist[id][i].parts[j].data.text = TranslateTTDPatchCodes(grfid, text);
 				grfmsg(6, "FeatureTownName: part %d, text %d, '%s' (with probability %d)", i, j, townname->partlist[id][i].parts[j].data.text, prob);
 			}
 			townname->partlist[id][i].parts[j].prob = prob;
@@ -5507,15 +5616,8 @@
 	/* Copy/reset original engine info data */
 	SetupEngines();
 
-	/* Copy/reset original bridge info data
-	 * First, free sprite table data */
-	for (uint i = 0; i < MAX_BRIDGES; i++) {
-		if (_bridge[i].sprite_table != NULL) {
-			for (uint j = 0; j < 7; j++) free(_bridge[i].sprite_table[j]);
-			free(_bridge[i].sprite_table);
-		}
-	}
-	memcpy(&_bridge, &orig_bridge, sizeof(_bridge));
+	/* Copy/reset original bridge info data */
+	ResetBridges();
 
 	/* Reset refit/cargo class data */
 	memset(&cargo_allowed, 0, sizeof(cargo_allowed));
@@ -5530,6 +5632,9 @@
 	UnloadCustomEngineSprites();
 	ResetEngineListOrder();
 
+	/* Reset generic feature callback lists */
+	ResetGenericCallbacks();
+
 	/* Reset price base data */
 	ResetPriceBaseMultipliers();
 
@@ -6181,6 +6286,12 @@
 	 * 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++) {
+		/* Set activated grfs back to will-be-activated between reservation- and activation-stage.
+		 * This ensures that action7/9 conditions 0x06 - 0x0A work correctly. */
+		for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
+			if (c->status == GCS_ACTIVATED) c->status = GCS_INITIALISED;
+		}
+
 		uint slot = file_index;
 
 		_cur_stage = stage;
--- a/src/newgrf.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf.h	Mon Mar 10 15:26:39 2008 +0000
@@ -33,6 +33,24 @@
 	GMB_CATENARY_ON_3RD_TRACK  = 5, // Unsupported.
 };
 
+enum GrfSpecFeature {
+	GSF_TRAIN,
+	GSF_ROAD,
+	GSF_SHIP,
+	GSF_AIRCRAFT,
+	GSF_STATION,
+	GSF_CANAL,
+	GSF_BRIDGE,
+	GSF_TOWNHOUSE,
+	GSF_GLOBALVAR,
+	GSF_INDUSTRYTILES,
+	GSF_INDUSTRIES,
+	GSF_CARGOS,
+	GSF_SOUNDFX,
+	GSF_FSMPORTS,
+	GSF_END,
+};
+
 struct GRFLabel {
 	byte label;
 	uint32 nfo_line;
@@ -111,5 +129,8 @@
 void CDECL grfmsg(int severity, const char *str, ...);
 
 bool HasGrfMiscBit(GrfMiscBit bit);
+bool GetGlobalVariable(byte param, uint32 *value);
+
+StringID MapGRFStringID(uint32 grfid, StringID str);
 
 #endif /* NEWGRF_H */
--- a/src/newgrf_cargo.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_cargo.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -115,9 +115,7 @@
 
 uint8 GetReverseCargoTranslation(CargoID cargo, const GRFFile *grffile)
 {
-	/* Pre-version 7 uses the 'climate dependent' ID, i.e. cargo is the cargo ID */
-	if (grffile->grf_version < 7) return cargo;
-
+	/* Note: All grf versions use CargoBit here. Pre-version 7 do NOT use the 'climate dependent' ID. */
 	const CargoSpec *cs = GetCargo(cargo);
 
 	/* If the GRF contains a translation table (and the cargo is in the table)
--- a/src/newgrf_commons.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_commons.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -91,11 +91,6 @@
 		}
 	}
 
-	/* 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;
 }
 
@@ -169,6 +164,24 @@
 	}
 }
 
+/** Return the ID (if ever available) of a previously inserted entity.
+ * @param grf_local_id ID of this enity withing the grfID
+ * @param grfid ID of the grf file
+ * @return the ID of the candidate, of the Invalid flag item ID
+ */
+uint16 IndustryOverrideManager::GetID(uint8 grf_local_id, uint32 grfid)
+{
+	uint16 id = OverrideManagerBase::GetID(grf_local_id, grfid);
+	if (id != invalid_ID) return id;
+
+	/* No mapping found, try the overrides */
+	for (id = 0; id < max_offset; id++) {
+		if (entity_overrides[id] == grf_local_id && grfid_overrides[id] == grfid) return id;
+	}
+
+	return invalid_ID;
+}
+
 /** Method to find an entity ID and to mark it as reserved for the Industry to be included.
  * @param grf_local_id ID used by the grf file for pre-installation work (equivalent of TTDPatch's setid
  * @param grfid ID of the current grf file
@@ -281,7 +294,7 @@
 	if (y >= 8) y -= 16;
 
 	/* Swap width and height depending on axis for railway stations */
-	if (IsRailwayStationTile(tile) && GetRailStationAxis(tile) == AXIS_X) Swap(x, y);
+	if (IsRailwayStationTile(tile) && GetRailStationAxis(tile) == AXIS_Y) Swap(x, y);
 
 	/* Make sure we never roam outside of the map */
 	return TILE_MASK(tile + TileDiffXY(x, y));
--- a/src/newgrf_commons.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_commons.h	Mon Mar 10 15:26:39 2008 +0000
@@ -49,7 +49,7 @@
 	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
 
 	uint16 GetSubstituteID(byte entity_id);
-	uint16 GetID(uint8 grf_local_id, uint32 grfid);
+	virtual uint16 GetID(uint8 grf_local_id, uint32 grfid);
 
 	inline uint16 GetMaxMapping() { return max_new_entities; }
 	inline uint16 GetMaxOffset() { return max_offset; }
@@ -72,6 +72,7 @@
 			OverrideManagerBase(offset, maximum, invalid) {}
 
 	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
+	virtual uint16 GetID(uint8 grf_local_id, uint32 grfid);
 	void SetEntitySpec(IndustrySpec *inds);
 };
 
--- a/src/newgrf_config.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_config.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -303,7 +303,7 @@
 			_all_grfs = c;
 		} else {
 			/* Insert file into list at a position determined by its
-				* name, so the list is sorted as we go along */
+			 * name, so the list is sorted as we go along */
 			GRFConfig **pd, *d;
 			bool stop = false;
 			for (pd = &_all_grfs; (d = *pd) != NULL; pd = &d->next) {
@@ -311,8 +311,11 @@
 				/* Because there can be multiple grfs with the same name, make sure we checked all grfs with the same name,
 				 *  before inserting the entry. So insert a new grf at the end of all grfs with the same name, instead of
 				 *  just after the first with the same name. Avoids doubles in the list. */
-				if (strcasecmp(c->name, d->name) <= 0) stop = true;
-				else if (stop) break;
+				if (strcasecmp(c->name, d->name) <= 0) {
+					stop = true;
+				} else if (stop) {
+					break;
+				}
 			}
 			if (added) {
 				c->next = d;
@@ -325,7 +328,7 @@
 
 	if (!added) {
 		/* File couldn't be opened, or is either not a NewGRF or is a
-			* 'system' NewGRF or it's already known, so forget about it. */
+		 * 'system' NewGRF or it's already known, so forget about it. */
 		free(c->filename);
 		free(c->name);
 		free(c->info);
--- a/src/newgrf_engine.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_engine.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -23,6 +23,8 @@
 #include "vehicle_func.h"
 #include "core/random_func.hpp"
 #include "direction_func.h"
+#include "rail_map.h"
+#include "rail.h"
 
 
 int _traininfo_vehicle_pitch = 0;
@@ -502,12 +504,13 @@
 			memset(common_subtypes, 0, sizeof(common_subtypes));
 
 			for (u = v; u != NULL; u = u->Next()) {
+				if (v->type == VEH_TRAIN) user_def_data |= u->u.rail.user_def_data;
+
 				/* Skip empty engines */
 				if (u->cargo_cap == 0) continue;
 
 				cargo_classes |= GetCargo(u->cargo_type)->classes;
 				common_cargos[u->cargo_type]++;
-				if (v->type == VEH_TRAIN) user_def_data |= u->u.rail.user_def_data;
 				common_subtypes[u->cargo_subtype]++;
 			}
 
@@ -607,12 +610,17 @@
 		case 0xFF: {
 			uint16 modflags = 0;
 
-			/* @todo: There are some other bits that should be implemented:
-			 *   bit 5: Whether the rail vehicle is powered or not (mostly useful for wagons).
-			 *   bit 6: This is an electrically powered rail vehicle which is running on normal rail.
-			 *   bit 8: (Maybe?) Toggled whenever the train reverses.
-			 */
+			if (v->type == VEH_TRAIN) {
+				const Vehicle *u = IsTrainWagon(v) && HasBit(v->vehicle_flags, VRF_POWEREDWAGON) ? v->First() : v;
+				RailType railtype = GetRailType(v->tile);
+				bool powered = IsTrainEngine(v) || (IsTrainWagon(v) && HasBit(v->vehicle_flags, VRF_POWEREDWAGON));
+				bool has_power = powered && HasPowerOnRail(u->u.rail.railtype, railtype);
+				bool is_electric = powered && u->u.rail.railtype == RAILTYPE_ELECTRIC;
 
+				if (has_power) SetBit(modflags, 5);
+				if (is_electric && !has_power) SetBit(modflags, 6);
+				if (HasBit(v->u.rail.flags, VRF_TOGGLE_REVERSE)) SetBit(modflags, 8);
+			}
 			if (HasBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE)) SetBit(modflags, 10);
 
 			return variable == 0xFE ? modflags : GB(modflags, 8, 8);
@@ -678,14 +686,14 @@
 		case 0x4F: return GB(v->reliability, 8, 8);
 		case 0x50: return v->reliability_spd_dec;
 		case 0x51: return GB(v->reliability_spd_dec, 8, 8);
-		case 0x52: return ClampToI32(v->profit_this_year);
-		case 0x53: return GB(ClampToI32(v->profit_this_year),  8, 24);
-		case 0x54: return GB(ClampToI32(v->profit_this_year), 16, 16);
-		case 0x55: return GB(ClampToI32(v->profit_this_year), 24,  8);
-		case 0x56: return ClampToI32(v->profit_last_year);
-		case 0x57: return GB(ClampToI32(v->profit_last_year),  8, 24);
-		case 0x58: return GB(ClampToI32(v->profit_last_year), 16, 16);
-		case 0x59: return GB(ClampToI32(v->profit_last_year), 24,  8);
+		case 0x52: return ClampToI32(v->GetDisplayProfitThisYear());
+		case 0x53: return GB(ClampToI32(v->GetDisplayProfitThisYear()),  8, 24);
+		case 0x54: return GB(ClampToI32(v->GetDisplayProfitThisYear()), 16, 16);
+		case 0x55: return GB(ClampToI32(v->GetDisplayProfitThisYear()), 24,  8);
+		case 0x56: return ClampToI32(v->GetDisplayProfitLastYear());
+		case 0x57: return GB(ClampToI32(v->GetDisplayProfitLastYear()),  8, 24);
+		case 0x58: return GB(ClampToI32(v->GetDisplayProfitLastYear()), 16, 16);
+		case 0x59: return GB(ClampToI32(v->GetDisplayProfitLastYear()), 24,  8);
 		case 0x5A: return v->Next() == NULL ? INVALID_VEHICLE : v->Next()->index;
 		case 0x5C: return ClampToI32(v->value);
 		case 0x5D: return GB(ClampToI32(v->value),  8, 24);
@@ -749,7 +757,11 @@
 	uint totalsets;
 	uint set;
 
-	if (v == NULL) return group->g.real.loading[0];
+	if (v == NULL) {
+		if (group->g.real.num_loading > 0) return group->g.real.loading[0];
+		if (group->g.real.num_loaded  > 0) return group->g.real.loaded[0];
+		return NULL;
+	}
 
 	bool in_motion = v->First()->current_order.type != OT_LOADING;
 
--- a/src/newgrf_fsmports.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_fsmports.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -629,13 +629,13 @@
 
 	sprites = &fsmportsspec->renderdata[tile];
 
-	image = sprites->ground_sprite;
+	image = sprites->ground.sprite;
 	image += relocation;
 	DrawSprite(image, PAL_NONE, x, y);
 
 	foreach_draw_tile_seq(seq, sprites->seq) {
 		Point pt;
-		image = seq->image;
+		image = seq->image.sprite;
 		image += relocation;
 
 		if ((byte)seq->delta_z != 0x80) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_generic.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -0,0 +1,179 @@
+/* $Id$ */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "variables.h"
+#include "landscape.h"
+#include "debug.h"
+#include "newgrf.h"
+#include "newgrf_callbacks.h"
+#include "newgrf_commons.h"
+#include "newgrf_spritegroup.h"
+#include "newgrf_generic.h"
+#include "tile_map.h"
+#include <list>
+
+
+struct GenericCallback {
+	const GRFFile *file;
+	const SpriteGroup *group;
+
+	GenericCallback(const GRFFile *file, const SpriteGroup *group) :
+		file(file),
+		group(group)
+	{ }
+};
+
+typedef std::list<GenericCallback> GenericCallbackList;
+
+static GenericCallbackList _gcl[GSF_END];
+
+
+/**
+ * Reset all generic feature callback sprite groups.
+ */
+void ResetGenericCallbacks()
+{
+	for (uint8 feature = 0; feature < lengthof(_gcl); feature++) {
+		_gcl[feature].clear();
+	}
+}
+
+
+/**
+ * Add a generic feature callback sprite group to the appropriate feature list.
+ * @param feature
+ * @param file
+ * @param group
+ */
+void AddGenericCallback(uint8 feature, const GRFFile *file, const SpriteGroup *group)
+{
+	if (feature >= lengthof(_gcl)) {
+		grfmsg(5, "AddGenericCallback: Unsupported feature 0x%02X", feature);
+		return;
+	}
+
+	/* Generic feature callbacks are evaluated in reverse (i.e. the last group
+	 * to be added is evaluated first, etc) thus we push the group to the
+	 * beginning of the list so a standard iterator will do the right thing. */
+	_gcl[feature].push_front(GenericCallback(file, group));
+}
+
+
+static uint32 GenericCallbackGetRandomBits(const ResolverObject *object)
+{
+	return 0;
+}
+
+
+static uint32 GenericCallbackGetTriggers(const ResolverObject *object)
+{
+	return 0;
+}
+
+
+static void GenericCallbackSetTriggers(const ResolverObject *object, int triggers)
+{
+	return;
+}
+
+
+static uint32 GenericCallbackGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
+{
+	switch (variable) {
+		case 0x40: return object->u.generic.cargo_type;
+
+		case 0x80: return object->u.generic.cargo_type;
+		case 0x81: return object->u.generic.cargo_type;
+		case 0x82: return object->u.generic.default_selection;
+		case 0x83: return object->u.generic.src_industry;
+		case 0x84: return object->u.generic.dst_industry;
+		case 0x85: return object->u.generic.distance;
+		case 0x86: return object->u.generic.event;
+		case 0x87: return object->u.generic.count;
+		case 0x88: return object->u.generic.station_size;
+
+		default: break;
+	}
+
+	DEBUG(grf, 1, "Unhandled generic feature property 0x%02X", variable);
+
+	*available = false;
+	return 0;
+}
+
+
+static const SpriteGroup *GenericCallbackResolveReal(const ResolverObject *object, const SpriteGroup *group)
+{
+	if (group->g.real.num_loaded == 0) return NULL;
+
+	return group->g.real.loaded[0];
+}
+
+
+static inline void NewGenericResolver(ResolverObject *res)
+{
+	res->GetRandomBits = &GenericCallbackGetRandomBits;
+	res->GetTriggers   = &GenericCallbackGetTriggers;
+	res->SetTriggers   = &GenericCallbackSetTriggers;
+	res->GetVariable   = &GenericCallbackGetVariable;
+	res->ResolveReal   = &GenericCallbackResolveReal;
+
+	res->callback        = CBID_NO_CALLBACK;
+	res->callback_param1 = 0;
+	res->callback_param2 = 0;
+	res->last_value      = 0;
+	res->trigger         = 0;
+	res->reseed          = 0;
+}
+
+
+/** Follow a generic feature callback list and return the first successful
+ * answer
+ * @param feature GRF Feature of callback
+ * @param object  pre-populated resolver object
+ * @param file    address of GRFFile object if file reference is needed, NULL is valid
+ * @return callback value if successful or CALLBACK_FAILED
+ */
+static uint16 GetGenericCallbackResult(uint8 feature, ResolverObject *object, const GRFFile **file)
+{
+	assert(feature < lengthof(_gcl));
+
+	/* Test each feature callback sprite group. */
+	for (GenericCallbackList::const_iterator it = _gcl[feature].begin(); it != _gcl[feature].end(); ++it) {
+		const SpriteGroup *group = it->group;
+		group = Resolve(group, object);
+		if (group == NULL || group->type != SGT_CALLBACK) continue;
+
+		/* Return NewGRF file if necessary */
+		if (file != NULL) *file = it->file;
+
+		return group->g.callback.result;
+	}
+
+	/* No callback returned a valid result, so we've failed. */
+	return CALLBACK_FAILED;
+}
+
+
+/**
+ * 'Execute' an AI purchase selection callback
+ */
+uint16 GetAiPurchaseCallbackResult(uint8 feature, CargoID cargo_type, uint8 default_selection, IndustryType src_industry, IndustryType dst_industry, uint8 distance, AIConstructionEvent event, uint8 count, uint8 station_size, const GRFFile **file)
+{
+	ResolverObject object;
+
+	NewGenericResolver(&object);
+
+	object.callback = CBID_GENERIC_AI_PURCHASE_SELECTION;
+	object.u.generic.cargo_type        = cargo_type;
+	object.u.generic.default_selection = default_selection;
+	object.u.generic.src_industry      = src_industry;
+	object.u.generic.dst_industry      = dst_industry;
+	object.u.generic.distance          = distance;
+	object.u.generic.event             = event;
+	object.u.generic.count             = count;
+	object.u.generic.station_size      = station_size;
+
+	return GetGenericCallbackResult(feature, &object, file);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_generic.h	Mon Mar 10 15:26:39 2008 +0000
@@ -0,0 +1,35 @@
+/* $Id$ */
+
+#ifndef NEWGRF_GENERIC_H
+#define NEWGRF_GENERIC_H
+
+enum AIConstructionEvent {
+	AICE_TRAIN_CHECK_RAIL_ENGINE     = 0x00, ///< Check if we should build an engine
+	AICE_TRAIN_CHECK_ELRAIL_ENGINE   = 0x01,
+	AICE_TRAIN_CHECK_MONORAIL_ENGINE = 0x02,
+	AICE_TRAIN_CHECK_MAGLEV_ENGINE   = 0x03,
+	AICE_TRAIN_GET_RAIL_WAGON        = 0x08,
+	AICE_TRAIN_GET_ELRAIL_WAGON      = 0x09,
+	AICE_TRAIN_GET_MONORAIL_WAGON    = 0x0A,
+	AICE_TRAIN_GET_MAGLEV_WAGON      = 0x0B,
+	AICE_TRAIN_GET_RAILTYPE          = 0x0F,
+
+	AICE_ROAD_CHECK_ENGINE           = 0x00, ///< Check if we should build an engine
+	AICE_ROAD_GET_FIRST_ENGINE       = 0x01, ///< Unused, we check all
+	AICE_ROAD_GET_NUMBER_ENGINES     = 0x02, ///< Unused, we check all
+
+	AICE_SHIP_CHECK_ENGINE           = 0x00, ///< Check if we should build an engine
+	AICE_SHIP_GET_FIRST_ENGINE       = 0x01, ///< Unused, we check all
+	AICE_SHIP_GET_NUMBER_ENGINES     = 0x02, ///< Unused, we check all
+
+	AICE_AIRCRAFT_CHECK_ENGINE       = 0x00, ///< Check if we should build an engine
+
+	AICE_STATION_GET_STATION_ID      = 0x00, ///< Get a station ID to build
+};
+
+void ResetGenericCallbacks();
+void AddGenericCallback(uint8 feature, const struct GRFFile *file, const struct SpriteGroup *group);
+
+uint16 GetAiPurchaseCallbackResult(uint8 feature, CargoID cargo_type, uint8 default_selection, IndustryType src_industry, IndustryType dst_industry, uint8 distance, AIConstructionEvent event, uint8 count, uint8 station_size, const struct GRFFile **file);
+
+#endif /* NEWGRF_GENERIC_H */
--- a/src/newgrf_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -281,7 +281,7 @@
 {
 	bool disable_all = WP(w, newgrf_d).sel == NULL || !WP(w, newgrf_d).editable;
 
-	w->SetWidgetDisabledState(3, !WP(w, newgrf_d).editable);
+	w->SetWidgetDisabledState(SNGRFS_ADD, !WP(w, newgrf_d).editable);
 	w->SetWidgetsDisabledState(disable_all,
 		SNGRFS_REMOVE,
 		SNGRFS_MOVE_UP,
@@ -530,6 +530,10 @@
 			break;
 
 		case WE_RESIZE:
+			if (e->we.sizing.diff.x != 0) {
+				ResizeButtons(w, SNGRFS_ADD, SNGRFS_MOVE_DOWN);
+				ResizeButtons(w, SNGRFS_SET_PARAMETERS, SNGRFS_APPLY_CHANGES);
+			}
 			w->vscroll.cap += e->we.sizing.diff.y / 14;
 			w->widget[SNGRFS_FILE_LIST].data = (w->vscroll.cap << 8) + 1;
 			SetupNewGRFWindow(w);
@@ -545,7 +549,7 @@
 { WWT_PUSHTXTBTN,  RESIZE_NONE,  3,  10,  79,  16,  27, STR_NEWGRF_ADD,              STR_NEWGRF_ADD_TIP },               // SNGRFS_ADD
 { WWT_PUSHTXTBTN,  RESIZE_NONE,  3,  80, 149,  16,  27, STR_NEWGRF_REMOVE,           STR_NEWGRF_REMOVE_TIP },            // SNGRFS_REMOVE
 { WWT_PUSHTXTBTN,  RESIZE_NONE,  3, 150, 219,  16,  27, STR_NEWGRF_MOVEUP,           STR_NEWGRF_MOVEUP_TIP },            // SNGRFS_MOVE_UP
-{ WWT_PUSHTXTBTN,  RESIZE_NONE,  3, 220, 289,  16,  27, STR_NEWGRF_MOVEDOWN,         STR_NEWGRF_MOVEDOWN_TIP },          // SNGRFS_MOVE_DOWN
+{ WWT_PUSHTXTBTN, RESIZE_RIGHT,  3, 220, 289,  16,  27, STR_NEWGRF_MOVEDOWN,         STR_NEWGRF_MOVEDOWN_TIP },          // SNGRFS_MOVE_DOWN
 {     WWT_MATRIX,    RESIZE_RB, 10,   0, 287,  30,  99, 0x501,                       STR_NEWGRF_FILE_TIP },              // SNGRFS_FILE_LIST
 {  WWT_SCROLLBAR,   RESIZE_LRB, 10, 288, 299,  30,  99, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST }, // SNGRFS_SCROLLBAR
 {      WWT_PANEL,   RESIZE_RTB, 10,   0, 299, 100, 212, STR_NULL,                    STR_NULL },                         // SNGRFS_NEWGRF_INFO
--- a/src/newgrf_house.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_house.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -289,18 +289,18 @@
 	const DrawTileSprites *dts = group->g.layout.dts;
 	const DrawTileSeqStruct *dtss;
 
-	SpriteID image = dts->ground_sprite;
-	SpriteID pal   = dts->ground_pal;
+	SpriteID image = dts->ground.sprite;
+	SpriteID pal   = dts->ground.pal;
 
 	if (IS_CUSTOM_SPRITE(image)) image += stage;
 
 	if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
 
 	foreach_draw_tile_seq(dtss, dts->seq) {
-		if (GB(dtss->image, 0, SPRITE_WIDTH) == 0) continue;
+		if (GB(dtss->image.sprite, 0, SPRITE_WIDTH) == 0) continue;
 
-		image = dtss->image;
-		pal   = dtss->pal;
+		image = dtss->image.sprite;
+		pal   = dtss->image.pal;
 
 		if (IS_CUSTOM_SPRITE(image)) image += stage;
 
--- a/src/newgrf_industries.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_industries.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -352,14 +352,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 - ORIGINAL_BASE_YEAR, 255);
+		case 0xA9: return Clamp(industry->last_prod_year - ORIGINAL_BASE_YEAR, 0, 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(industry->construction_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 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(industry->last_cargo_accepted_at - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Date last cargo accepted since 1920 (in days)
 	}
 
 	DEBUG(grf, 1, "Unhandled industry property 0x%X", variable);
--- a/src/newgrf_industrytiles.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_industrytiles.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -177,18 +177,18 @@
 	const DrawTileSprites *dts = group->g.layout.dts;
 	const DrawTileSeqStruct *dtss;
 
-	SpriteID image = dts->ground_sprite;
-	SpriteID pal   = dts->ground_pal;
+	SpriteID image = dts->ground.sprite;
+	SpriteID pal   = dts->ground.pal;
 
 	if (IS_CUSTOM_SPRITE(image)) image += stage;
 
 	if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
 
 	foreach_draw_tile_seq(dtss, dts->seq) {
-		if (GB(dtss->image, 0, SPRITE_WIDTH) == 0) continue;
+		if (GB(dtss->image.sprite, 0, SPRITE_WIDTH) == 0) continue;
 
-		image = dtss->image;
-		pal   = dtss->pal;
+		image = dtss->image.sprite;
+		pal   = dtss->image.pal;
 
 		if (IS_CUSTOM_SPRITE(image)) image += stage;
 
--- a/src/newgrf_spritegroup.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_spritegroup.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -7,6 +7,7 @@
 #include "variables.h"
 #include "landscape.h"
 #include "oldpool.h"
+#include "newgrf.h"
 #include "newgrf_callbacks.h"
 #include "newgrf_spritegroup.h"
 #include "sprite.h"
@@ -81,23 +82,16 @@
 
 static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
 {
-	/* Return common variables */
+	/* First handle variables common with Action7/9/D */
+	uint32 value;
+	if (GetGlobalVariable(variable, &value)) return value;
+
+	/* Non-common variable */
 	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 0x02: return _cur_month;
-		case 0x03: return _opt.landscape;
-		case 0x09: return _date_fract;
-		case 0x0A: return _tick_counter;
 		case 0x0C: return object->callback;
 		case 0x10: return object->callback_param1;
-		case 0x11: return 0;
-		case 0x12: return _game_mode;
 		case 0x18: return object->callback_param2;
-		case 0x1A: return UINT_MAX;
-		case 0x1B: return GB(_display_opt, 0, 6);
 		case 0x1C: return object->last_value;
-		case 0x20: return _opt.landscape == LT_ARCTIC ? GetSnowLine() : 0xFF;
 
 		case 0x7D: return _temp_store.Get(parameter);
 
--- a/src/newgrf_spritegroup.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_spritegroup.h	Mon Mar 10 15:26:39 2008 +0000
@@ -10,6 +10,7 @@
 #include "newgrf_storage.h"
 #include "core/bitmath_func.hpp"
 #include "gfx_type.h"
+#include "newgrf_generic.h"
 
 /**
  * Gets the value of a so-called newgrf "register".
@@ -237,6 +238,16 @@
 		struct {
 			const struct CargoSpec *cs;
 		} cargo;
+		struct {
+			CargoID cargo_type;
+			uint8 default_selection;
+			IndustryType src_industry;
+			IndustryType dst_industry;
+			uint8 distance;
+			AIConstructionEvent event;
+			uint8 count;
+			uint8 station_size;
+		} generic;
 	} u;
 
 	uint32 (*GetRandomBits)(const struct ResolverObject*);
--- a/src/newgrf_station.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_station.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -291,13 +291,13 @@
 	uint i;
 
 	for (i = 0; i < lengthof(x_dir); i++, dir++, diagdir++) {
-		uint32 ts = GetTileTrackStatus(tile + TileOffsByDir(*dir), TRANSPORT_RAIL, 0);
-		if (ts != 0) {
+		TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile + TileOffsByDir(*dir), TRANSPORT_RAIL, 0));
+		if (trackbits != TRACK_BIT_NONE) {
 			/* If there is any track on the tile, set the bit in the second byte */
 			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 (trackbits & DiagdirReachesTracks(*diagdir)) SetBit(res, i);
 		}
 	}
 
@@ -773,7 +773,7 @@
 		sprites = &statspec->renderdata[(tile < statspec->tiles) ? tile + axis : (uint)axis];
 	}
 
-	image = sprites->ground_sprite;
+	image = sprites->ground.sprite;
 	if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 		image += GetCustomStationGroundRelocation(statspec, NULL, INVALID_TILE);
 		image += rti->custom_ground_offset;
@@ -785,7 +785,7 @@
 
 	foreach_draw_tile_seq(seq, sprites->seq) {
 		Point pt;
-		image = seq->image;
+		image = seq->image.sprite;
 		if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 			image += rti->total_offset;
 		} else {
--- a/src/newgrf_text.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_text.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -192,7 +192,7 @@
 static byte _currentLangID = GRFLX_ENGLISH;  ///< by default, english is used.
 
 
-char *TranslateTTDPatchCodes(const char *str)
+char *TranslateTTDPatchCodes(uint32 grfid, const char *str)
 {
 	char *tmp = MallocT<char>(strlen(str) * 10 + 1); // Allocate space to allow for expansion
 	char *d = tmp;
@@ -241,7 +241,7 @@
 				string  = *str++;
 				string |= *str++ << 8;
 				d += Utf8Encode(d, SCC_STRING_ID);
-				d += Utf8Encode(d, string);
+				d += Utf8Encode(d, MapGRFStringID(grfid, string));
 				break;
 			}
 			case 0x82:
@@ -345,7 +345,7 @@
 	/* Too many strings allocated, return empty */
 	if (id == lengthof(_grf_text)) return STR_EMPTY;
 
-	translatedtext = TranslateTTDPatchCodes(text_to_add);
+	translatedtext = TranslateTTDPatchCodes(grfid, text_to_add);
 
 	GRFText *newtext = GRFText::New(langid_to_add, translatedtext);
 
--- a/src/newgrf_text.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_text.h	Mon Mar 10 15:26:39 2008 +0000
@@ -11,7 +11,7 @@
 const char *GetGRFStringPtr(uint16 stringid);
 void CleanUpStrings();
 void SetCurrentGrfLangID(const char *iso_name);
-char *TranslateTTDPatchCodes(const char *str);
+char *TranslateTTDPatchCodes(uint32 grfid, const char *str);
 
 bool CheckGrfLangID(byte lang_id, byte grf_version);
 
--- a/src/newgrf_town.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/newgrf_town.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -7,6 +7,7 @@
 #include "settings_type.h"
 #include "debug.h"
 #include "core/bitmath_func.hpp"
+#include "core/math_func.hpp"
 #include "town.h"
 
 /** This function implements the town variables that newGRF defines.
@@ -30,8 +31,8 @@
 		/* Town properties */
 		case 0x80: return t->xy;
 		case 0x81: return GB(t->xy, 8, 8);
-		case 0x82: return t->population;
-		case 0x83: return GB(t->population, 8, 8);
+		case 0x82: return ClampToU16(t->population);
+		case 0x83: return GB(ClampToU16(t->population), 8, 8);
 		case 0x8A: return t->grow_counter;
 		case 0x92: return t->flags12;  // In original game, 0x92 and 0x93 are really one word. Since flags12 is a byte, this is to adjust
 		case 0x93: return 0;
@@ -46,33 +47,41 @@
 		case 0x9C: return t->radius[4];
 		case 0x9D: return GB(t->radius[4], 8, 8);
 		case 0x9E: return t->ratings[0];
-		case 0x9F: return t->ratings[1];
-		case 0xA0: return t->ratings[2];
-		case 0xA1: return t->ratings[3];
-		case 0xA2: return t->ratings[4];
-		case 0xA3: return t->ratings[5];
-		case 0xA4: return t->ratings[6];
-		case 0xA5: return t->ratings[7];
+		case 0x9F: return GB(t->ratings[0], 8, 8);
+		case 0xA0: return t->ratings[1];
+		case 0xA1: return GB(t->ratings[1], 8, 8);
+		case 0xA2: return t->ratings[2];
+		case 0xA3: return GB(t->ratings[2], 8, 8);
+		case 0xA4: return t->ratings[3];
+		case 0xA5: return GB(t->ratings[3], 8, 8);
+		case 0xA6: return t->ratings[4];
+		case 0xA7: return GB(t->ratings[4], 8, 8);
+		case 0xA8: return t->ratings[5];
+		case 0xA9: return GB(t->ratings[5], 8, 8);
+		case 0xAA: return t->ratings[6];
+		case 0xAB: return GB(t->ratings[6], 8, 8);
+		case 0xAC: return t->ratings[7];
+		case 0xAD: return GB(t->ratings[7], 8, 8);
 		case 0xAE: return t->have_ratings;
 		case 0xB2: return t->statues;
 		case 0xB6: return t->num_houses;
 		case 0xB9: return t->growth_rate;
-		case 0xBA: return t->new_max_pass;
-		case 0xBB: return GB(t->new_max_pass, 8, 8);
-		case 0xBC: return t->new_max_mail;
-		case 0xBD: return GB(t->new_max_mail, 8, 8);
-		case 0xBE: return t->new_act_pass;
-		case 0xBF: return GB(t->new_act_pass, 8, 8);
-		case 0xC0: return t->new_act_mail;
-		case 0xC1: return GB(t->new_act_mail, 8, 8);
-		case 0xC2: return t->max_pass;
-		case 0xC3: return GB(t->max_pass, 8, 8);
-		case 0xC4: return t->max_mail;
-		case 0xC5: return GB(t->max_mail, 8, 8);
-		case 0xC6: return t->act_pass;
-		case 0xC7: return GB(t->act_pass, 8, 8);
-		case 0xC8: return t->act_mail;
-		case 0xC9: return GB(t->act_mail, 8, 8);
+		case 0xBA: return ClampToU16(t->new_max_pass);
+		case 0xBB: return GB(ClampToU16(t->new_max_pass), 8, 8);
+		case 0xBC: return ClampToU16(t->new_max_mail);
+		case 0xBD: return GB(ClampToU16(t->new_max_mail), 8, 8);
+		case 0xBE: return ClampToU16(t->new_act_pass);
+		case 0xBF: return GB(ClampToU16(t->new_act_pass), 8, 8);
+		case 0xC0: return ClampToU16(t->new_act_mail);
+		case 0xC1: return GB(ClampToU16(t->new_act_mail), 8, 8);
+		case 0xC2: return ClampToU16(t->max_pass);
+		case 0xC3: return GB(ClampToU16(t->max_pass), 8, 8);
+		case 0xC4: return ClampToU16(t->max_mail);
+		case 0xC5: return GB(ClampToU16(t->max_mail), 8, 8);
+		case 0xC6: return ClampToU16(t->act_pass);
+		case 0xC7: return GB(ClampToU16(t->act_pass), 8, 8);
+		case 0xC8: return ClampToU16(t->act_mail);
+		case 0xC9: return GB(ClampToU16(t->act_mail), 8, 8);
 		case 0xCA: return t->pct_pass_transported;
 		case 0xCB: return t->pct_mail_transported;
 		case 0xCC: return t->new_act_food;
--- a/src/npf.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/npf.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -457,18 +457,17 @@
  * Finds out if a given player's vehicles are allowed to enter a given tile.
  * @param owner    The owner of the vehicle.
  * @param tile     The tile that is about to be entered.
- * @param enterdir The direction from which the vehicle wants to enter the tile.
+ * @param enterdir The direction in which the vehicle wants to enter the tile.
  * @return         true if the vehicle can enter the tile.
  * @todo           This function should be used in other places than just NPF,
  *                 maybe moved to another file too.
  */
-static bool VehicleMayEnterTile(Owner owner, TileIndex tile, DiagDirection enterdir)
+static bool CanEnterTileOwnerCheck(Owner owner, TileIndex tile, DiagDirection enterdir)
 {
 	if (IsTileType(tile, MP_RAILWAY) ||           /* Rail tile (also rail depot) */
 			IsRailwayStationTile(tile) ||               /* Rail station tile */
 			IsTileDepotType(tile, TRANSPORT_ROAD) ||  /* Road depot tile */
-			IsStandardRoadStopTile(tile) || /* Road station tile (but not drive-through stops) */
-			IsTileDepotType(tile, TRANSPORT_WATER)) { /* Water depot tile */
+			IsStandardRoadStopTile(tile)) { /* Road station tile (but not drive-through stops) */
 		return IsTileOwner(tile, owner); /* You need to own these tiles entirely to use them */
 	}
 
@@ -510,6 +509,137 @@
 	}
 }
 
+/** Tests if a tile is a road tile with a single tramtrack (tram can reverse) */
+static DiagDirection GetSingleTramBit(TileIndex tile)
+{
+	if (IsNormalRoadTile(tile)) {
+		RoadBits rb = GetRoadBits(tile, ROADTYPE_TRAM);
+		switch (rb) {
+			case ROAD_NW: return DIAGDIR_NW;
+			case ROAD_SW: return DIAGDIR_SW;
+			case ROAD_SE: return DIAGDIR_SE;
+			case ROAD_NE: return DIAGDIR_NE;
+			default: break;
+		}
+	}
+	return INVALID_DIAGDIR;
+}
+
+/**
+ * Tests if a tile can be entered or left only from one side.
+ *
+ * Depots, non-drive-through roadstops, and tiles with single trambits are tested.
+ *
+ * @param tile The tile of interest.
+ * @param type The transporttype of the vehicle.
+ * @param subtype For TRANSPORT_ROAD the compatible RoadTypes of the vehicle.
+ * @return The single entry/exit-direction of the tile, or INVALID_DIAGDIR if there are more or less directions
+ */
+static DiagDirection GetTileSingleEntry(TileIndex tile, TransportType type, uint subtype)
+{
+	if (type != TRANSPORT_WATER && IsTileDepotType(tile, type)) return GetDepotDirection(tile, type);
+
+	if (type == TRANSPORT_ROAD) {
+		if (IsStandardRoadStopTile(tile)) return GetRoadStopDir(tile);
+		if (HasBit(subtype, ROADTYPE_TRAM)) return GetSingleTramBit(tile);
+	}
+
+	return INVALID_DIAGDIR;
+}
+
+/**
+ * Tests if a vehicle must reverse on a tile.
+ *
+ * @param tile The tile of interest.
+ * @param dir The direction in which the vehicle drives on a tile.
+ * @param type The transporttype of the vehicle.
+ * @param subtype For TRANSPORT_ROAD the compatible RoadTypes of the vehicle.
+ * @return true iff the vehicle must reverse on the tile.
+ */
+static inline bool ForceReverse(TileIndex tile, DiagDirection dir, TransportType type, uint subtype)
+{
+	DiagDirection single_entry = GetTileSingleEntry(tile, type, subtype);
+	return single_entry != INVALID_DIAGDIR && single_entry != dir;
+}
+
+/**
+ * Tests if a vehicle can enter a tile.
+ *
+ * @param tile The tile of interest.
+ * @param dir The direction in which the vehicle drives onto a tile.
+ * @param type The transporttype of the vehicle.
+ * @param subtype For TRANSPORT_ROAD the compatible RoadTypes of the vehicle.
+ * @param railtypes For TRANSPORT_RAIL the compatible RailTypes of the vehicle.
+ * @param owner The owner of the vehicle.
+ * @return true iff the vehicle can enter the tile.
+ */
+static bool CanEnterTile(TileIndex tile, DiagDirection dir, TransportType type, uint subtype, RailTypes railtypes, Owner owner)
+{
+	/* Check tunnel entries and bridge ramps */
+	if (IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeDirection(tile) != dir) return false;
+
+	/* Test ownership */
+	if (!CanEnterTileOwnerCheck(owner, tile, dir)) return false;
+
+	/* check correct rail type (mono, maglev, etc) */
+	if (type == TRANSPORT_RAIL) {
+		RailType rail_type = GetTileRailType(tile);
+		if (!HasBit(railtypes, rail_type)) return false;
+	}
+
+	/* Depots, standard roadstops and single tram bits can only be entered from one direction */
+	DiagDirection single_entry = GetTileSingleEntry(tile, type, subtype);
+	if (single_entry != INVALID_DIAGDIR && single_entry != ReverseDiagDir(dir)) return false;
+
+	return true;
+}
+
+/**
+ * Returns the driveable Trackdirs on a tile.
+ *
+ * One-way-roads are taken into account. Signals are not tested.
+ *
+ * @param dst_tile The tile of interest.
+ * @param src_trackdir The direction the vehicle is currently moving.
+ * @param type The transporttype of the vehicle.
+ * @param subtype For TRANSPORT_ROAD the compatible RoadTypes of the vehicle.
+ * @return The Trackdirs the vehicle can continue moving on.
+ */
+static TrackdirBits GetDriveableTrackdirBits(TileIndex dst_tile, Trackdir src_trackdir, TransportType type, uint subtype)
+{
+	TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(dst_tile, type, subtype));
+
+	if (trackdirbits == 0 && type == TRANSPORT_ROAD && HasBit(subtype, ROADTYPE_TRAM)) {
+		/* GetTileTrackStatus() returns 0 for single tram bits.
+		 * As we cannot change it there (easily) without breaking something, change it here */
+		switch (GetSingleTramBit(dst_tile)) {
+			case DIAGDIR_NE:
+			case DIAGDIR_SW:
+				trackdirbits = TRACKDIR_BIT_X_NE | TRACKDIR_BIT_X_SW;
+				break;
+
+			case DIAGDIR_NW:
+			case DIAGDIR_SE:
+				trackdirbits = TRACKDIR_BIT_Y_NW | TRACKDIR_BIT_Y_SE;
+				break;
+
+			default: break;
+		}
+	}
+
+	DEBUG(npf, 4, "Next node: (%d, %d) [%d], possible trackdirs: 0x%X", TileX(dst_tile), TileY(dst_tile), dst_tile, trackdirbits);
+
+	/* Select only trackdirs we can reach from our current trackdir */
+	trackdirbits &= TrackdirReachesTrackdirs(src_trackdir);
+
+	/* Filter out trackdirs that would make 90 deg turns for trains */
+	if (_patches.forbid_90_deg && (type == TRANSPORT_RAIL || type == TRANSPORT_WATER)) trackdirbits &= ~TrackdirCrossesTrackdirs(src_trackdir);
+
+	DEBUG(npf, 6, "After filtering: (%d, %d), possible trackdirs: 0x%X", TileX(dst_tile), TileY(dst_tile), trackdirbits);
+
+	return trackdirbits;
+}
+
 
 /* Will just follow the results of GetTileTrackStatus concerning where we can
  * go and where not. Uses AyStar.user_data[NPF_TYPE] as the transport type and
@@ -519,120 +649,71 @@
  * copy AyStarNode.user_data[NPF_NODE_FLAGS] from the parent */
 static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
 {
+	/* We leave src_tile on track src_trackdir in direction src_exitdir */
 	Trackdir src_trackdir = (Trackdir)current->path.node.direction;
 	TileIndex src_tile = current->path.node.tile;
 	DiagDirection src_exitdir = TrackdirToExitdir(src_trackdir);
-	TileIndex dst_tile = INVALID_TILE;
-	int i;
-	uint32 ts;
-	TrackdirBits trackdirbits;
+
+	/* Is src_tile valid, and can be used?
+	 * When choosing track on a junction src_tile is the tile neighboured to the junction wrt. exitdir.
+	 * But we must not check the validity of this move, as src_tile is totally unrelated to the move, if a roadvehicle reversed on a junction. */
+	bool ignore_src_tile = (current->path.parent == NULL && NPFGetFlag(&current->path.node, NPF_FLAG_IGNORE_START_TILE));
+
+	/* Information about the vehicle: TransportType (road/rail/water) and SubType (compatible rail/road types) */
 	TransportType type = (TransportType)aystar->user_data[NPF_TYPE];
 	uint subtype = aystar->user_data[NPF_SUB_TYPE];
-	bool override_dst_check = false;
+
 	/* Initialize to 0, so we can jump out (return) somewhere an have no neighbours */
 	aystar->num_neighbours = 0;
 	DEBUG(npf, 4, "Expanding: (%d, %d, %d) [%d]", TileX(src_tile), TileY(src_tile), src_trackdir, src_tile);
 
+	/* We want to determine the tile we arrive, and which choices we have there */
+	TileIndex dst_tile;
+	TrackdirBits trackdirbits;
+
 	/* Find dest tile */
-	if (IsTileType(src_tile, MP_TUNNELBRIDGE) && GetTunnelBridgeDirection(src_tile) == src_exitdir) {
-		/* This is a tunnel/bridge. We know this tunnel/bridge is our type,
-		 * otherwise we wouldn't have got here. It is also facing us,
-		 * so we should skip it's body */
+	if (ignore_src_tile) {
+		/* Do not perform any checks that involve src_tile */
+		dst_tile = src_tile + TileOffsByDiagDir(src_exitdir);
+		trackdirbits = GetDriveableTrackdirBits(dst_tile, src_trackdir, type, subtype);
+	} else if (IsTileType(src_tile, MP_TUNNELBRIDGE) && GetTunnelBridgeDirection(src_tile) == src_exitdir) {
+		/* We drive through the wormhole and arrive on the other side */
 		dst_tile = GetOtherTunnelBridgeEnd(src_tile);
-		override_dst_check = true;
-	} else if (type != TRANSPORT_WATER && (IsStandardRoadStopTile(src_tile) || IsTileDepotType(src_tile, type))) {
-		/* This is a road station (non drive-through) or a train or road depot. We can enter and exit
-		 * those from one side only. Trackdirs don't support that (yet), so we'll
-		 * do this here. */
+		trackdirbits = TrackdirToTrackdirBits(src_trackdir);
+	} else if (ForceReverse(src_tile, src_exitdir, type, subtype)) {
+		/* We can only reverse on this tile */
+		dst_tile = src_tile;
+		src_trackdir = ReverseTrackdir(src_trackdir);
+		trackdirbits = TrackdirToTrackdirBits(src_trackdir);
+	} else {
+		/* We leave src_tile in src_exitdir and reach dst_tile */
+		dst_tile = AddTileIndexDiffCWrap(src_tile, TileIndexDiffCByDiagDir(src_exitdir));
 
-		DiagDirection exitdir;
-		/* Find out the exit direction first */
-		if (IsRoadStopTile(src_tile)) {
-			exitdir = GetRoadStopDir(src_tile);
-		} else { // Train or road depot
-			exitdir = GetDepotDirection(src_tile, type);
+		if (dst_tile != INVALID_TILE && !CanEnterTile(dst_tile, src_exitdir, type, subtype, (RailTypes)aystar->user_data[NPF_RAILTYPES], (Owner)aystar->user_data[NPF_OWNER])) dst_tile = INVALID_TILE;
+
+		if (dst_tile == INVALID_TILE) {
+			/* We cannot enter the next tile. Road vehicles can reverse, others reach dead end */
+			if (type != TRANSPORT_ROAD || HasBit(subtype, ROADTYPE_TRAM)) return;
+
+			dst_tile = src_tile;
+			src_trackdir = ReverseTrackdir(src_trackdir);
 		}
 
-		/* Let's see if were headed the right way into the depot */
-		if (src_trackdir == DiagdirToDiagTrackdir(ReverseDiagDir(exitdir))) {
-			/* We are headed inwards. We cannot go through the back of the depot.
-			 * For rail, we can now reverse. Reversing for road vehicles is never
-			 * useful, since you cannot take paths you couldn't take before
-			 * reversing (as with rail). */
-			if (type == TRANSPORT_RAIL) {
-				/* We can only reverse here, so we'll not consider this direction, but
-				 * jump ahead to the reverse direction.  It would be nicer to return
-				 * one neighbour here (the reverse trackdir of the one we are
-				 * considering now) and then considering that one to return the tracks
-				 * outside of the depot. But, because the code layout is cleaner this
-				 * way, we will just pretend we are reversed already */
-				src_trackdir = ReverseTrackdir(src_trackdir);
-				dst_tile = AddTileIndexDiffCWrap(src_tile, TileIndexDiffCByDiagDir(exitdir));
-			} else {
-				dst_tile = INVALID_TILE; /* Road vehicle heading inwards: dead end */
-			}
-		} else {
-			dst_tile = AddTileIndexDiffCWrap(src_tile, TileIndexDiffCByDiagDir(exitdir));
+		trackdirbits = GetDriveableTrackdirBits(dst_tile, src_trackdir, type, subtype);
+
+		if (trackdirbits == 0) {
+			/* We cannot enter the next tile. Road vehicles can reverse, others reach dead end */
+			if (type != TRANSPORT_ROAD || HasBit(subtype, ROADTYPE_TRAM)) return;
+
+			dst_tile = src_tile;
+			src_trackdir = ReverseTrackdir(src_trackdir);
+
+			trackdirbits = GetDriveableTrackdirBits(dst_tile, src_trackdir, type, subtype);
 		}
-	} else {
-		/* This a normal tile, a bridge, a tunnel exit, etc. */
-		dst_tile = AddTileIndexDiffCWrap(src_tile, TileIndexDiffCByDiagDir(TrackdirToExitdir(src_trackdir)));
-	}
-	if (dst_tile == INVALID_TILE) {
-		/* We reached the border of the map */
-		/* TODO Nicer control flow for this */
-		return;
-	}
-
-	/* I can't enter a tunnel entry/exit tile from a tile above the tunnel. Note
-	 * that I can enter the tunnel from a tile below the tunnel entrance. This
-	 * solves the problem of vehicles wanting to drive off a tunnel entrance */
-	if (!override_dst_check && IsTileType(dst_tile, MP_TUNNELBRIDGE) &&
-			GetTunnelBridgeDirection(dst_tile) != src_exitdir) {
-		return;
 	}
 
-	/* 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))
-			return;
-	}
-
-	/* Check the owner of the tile */
-	if (!VehicleMayEnterTile((Owner)aystar->user_data[NPF_OWNER], dst_tile, TrackdirToExitdir(src_trackdir))) {
-		return;
-	}
-
-	/* Determine available tracks */
-	if (type != TRANSPORT_WATER && (IsStandardRoadStopTile(dst_tile) || IsTileDepotType(dst_tile, type))){
-		/* Road stations and road and train depots return 0 on GTTS, so we have to do this by hand... */
-		DiagDirection exitdir;
-		if (IsRoadStopTile(dst_tile)) {
-			exitdir = GetRoadStopDir(dst_tile);
-		} else { // Road or train depot
-			exitdir = GetDepotDirection(dst_tile, type);
-		}
-		/* Find the trackdirs that are available for a depot or station with this
-		 * orientation. They are only "inwards", since we are reaching this tile
-		 * from some other tile. This prevents vehicles driving into depots from
-		 * the back */
-		ts = TrackdirToTrackdirBits(DiagdirToDiagTrackdir(ReverseDiagDir(exitdir)));
-	} else {
-		ts = GetTileTrackStatus(dst_tile, type, subtype);
-	}
-	trackdirbits = (TrackdirBits)(ts & TRACKDIR_BIT_MASK); /* Filter out signal status and the unused bits */
-
-	DEBUG(npf, 4, "Next node: (%d, %d) [%d], possible trackdirs: 0x%X", TileX(dst_tile), TileY(dst_tile), dst_tile, trackdirbits);
-	/* Select only trackdirs we can reach from our current trackdir */
-	trackdirbits &= TrackdirReachesTrackdirs(src_trackdir);
-	if (_patches.forbid_90_deg && (type == TRANSPORT_RAIL || type == TRANSPORT_WATER)) /* Filter out trackdirs that would make 90 deg turns for trains */
-		trackdirbits &= ~TrackdirCrossesTrackdirs(src_trackdir);
-
-	DEBUG(npf, 6, "After filtering: (%d, %d), possible trackdirs: 0x%X", TileX(dst_tile), TileY(dst_tile), trackdirbits);
-
-	i = 0;
 	/* Enumerate possible track */
+	uint i = 0;
 	while (trackdirbits != 0) {
 		Trackdir dst_trackdir = RemoveFirstTrackdir(&trackdirbits);
 		DEBUG(npf, 5, "Expanded into trackdir: %d, remaining trackdirs: 0x%X", dst_trackdir, trackdirbits);
@@ -667,7 +748,7 @@
  * multiple targets that are spread around, we should perform a breadth first
  * search by specifiying CalcZero as our heuristic.
  */
-static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start2, NPFFindStationOrTileData* target, AyStar_EndNodeCheck target_proc, AyStar_CalculateH heuristic_proc, TransportType type, uint sub_type, Owner owner, RailTypes railtypes, uint reverse_penalty)
+static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, bool ignore_start_tile1, AyStarNode* start2, bool ignore_start_tile2, NPFFindStationOrTileData* target, AyStar_EndNodeCheck target_proc, AyStar_CalculateH heuristic_proc, TransportType type, uint sub_type, Owner owner, RailTypes railtypes, uint reverse_penalty)
 {
 	int r;
 	NPFFoundTargetData result;
@@ -687,10 +768,12 @@
 	/* Initialize Start Node(s) */
 	start1->user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR;
 	start1->user_data[NPF_NODE_FLAGS] = 0;
+	NPFSetFlag(start1, NPF_FLAG_IGNORE_START_TILE, ignore_start_tile1);
 	_npf_aystar.addstart(&_npf_aystar, start1, 0);
 	if (start2) {
 		start2->user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR;
 		start2->user_data[NPF_NODE_FLAGS] = 0;
+		NPFSetFlag(start2, NPF_FLAG_IGNORE_START_TILE, ignore_start_tile2);
 		NPFSetFlag(start2, NPF_FLAG_REVERSE, true);
 		_npf_aystar.addstart(&_npf_aystar, start2, reverse_penalty);
 	}
@@ -726,7 +809,7 @@
 	return result;
 }
 
-NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
+NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, bool ignore_start_tile1, TileIndex tile2, Trackdir trackdir2, bool ignore_start_tile2, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
 {
 	AyStarNode start1;
 	AyStarNode start2;
@@ -740,15 +823,15 @@
 	start2.direction = trackdir2;
 	start2.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR;
 
-	return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), target, NPFFindStationOrTile, NPFCalcStationOrTileHeuristic, type, sub_type, owner, railtypes, 0);
+	return NPFRouteInternal(&start1, ignore_start_tile1, (IsValidTile(tile2) ? &start2 : NULL), ignore_start_tile2, target, NPFFindStationOrTile, NPFCalcStationOrTileHeuristic, type, sub_type, owner, railtypes, 0);
 }
 
-NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
+NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
 {
-	return NPFRouteToStationOrTileTwoWay(tile, trackdir, INVALID_TILE, INVALID_TRACKDIR, target, type, sub_type, owner, railtypes);
+	return NPFRouteToStationOrTileTwoWay(tile, trackdir, ignore_start_tile, INVALID_TILE, INVALID_TRACKDIR, false, target, type, sub_type, owner, railtypes);
 }
 
-NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, uint sub_type, Owner owner, RailTypes railtypes, uint reverse_penalty)
+NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, bool ignore_start_tile1, TileIndex tile2, Trackdir trackdir2, bool ignore_start_tile2, TransportType type, uint sub_type, Owner owner, RailTypes railtypes, uint reverse_penalty)
 {
 	AyStarNode start1;
 	AyStarNode start2;
@@ -764,15 +847,15 @@
 
 	/* perform a breadth first search. Target is NULL,
 	 * since we are just looking for any depot...*/
-	return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), NULL, NPFFindDepot, NPFCalcZero, type, sub_type, owner, railtypes, reverse_penalty);
+	return NPFRouteInternal(&start1, ignore_start_tile1, (IsValidTile(tile2) ? &start2 : NULL), ignore_start_tile2, NULL, NPFFindDepot, NPFCalcZero, type, sub_type, owner, railtypes, reverse_penalty);
 }
 
-NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
+NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
 {
-	return NPFRouteToDepotBreadthFirstTwoWay(tile, trackdir, INVALID_TILE, INVALID_TRACKDIR, type, sub_type, owner, railtypes, 0);
+	return NPFRouteToDepotBreadthFirstTwoWay(tile, trackdir, ignore_start_tile, INVALID_TILE, INVALID_TRACKDIR, false, type, sub_type, owner, railtypes, 0);
 }
 
-NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
+NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
 {
 	/* Okay, what we're gonna do. First, we look at all depots, calculate
 	 * the manhatten distance to get to each depot. We then sort them by
@@ -847,6 +930,7 @@
 		 * return a not found then */
 		start.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR;
 		start.user_data[NPF_NODE_FLAGS] = 0;
+		NPFSetFlag(&start, NPF_FLAG_IGNORE_START_TILE, ignore_start_tile);
 		_npf_aystar.addstart(&_npf_aystar, &start, 0);
 
 		/* Initialize result */
--- a/src/npf.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/npf.h	Mon Mar 10 15:26:39 2008 +0000
@@ -60,9 +60,10 @@
 
 /* Flags for AyStarNode.userdata[NPF_NODE_FLAGS]. Use NPFGetBit() and NPFGetBit() to use them. */
 enum NPFNodeFlag {
-	NPF_FLAG_SEEN_SIGNAL,     ///< Used to mark that a signal was seen on the way, for rail only
-	NPF_FLAG_REVERSE,         ///< Used to mark that this node was reached from the second start node, if applicable
-	NPF_FLAG_LAST_SIGNAL_RED, ///< Used to mark that the last signal on this path was red
+	NPF_FLAG_SEEN_SIGNAL,       ///< Used to mark that a signal was seen on the way, for rail only
+	NPF_FLAG_REVERSE,           ///< Used to mark that this node was reached from the second start node, if applicable
+	NPF_FLAG_LAST_SIGNAL_RED,   ///< Used to mark that the last signal on this path was red
+	NPF_FLAG_IGNORE_START_TILE, ///< Used to mark that the start tile is invalid, and searching should start from the second tile on
 };
 
 /* Meant to be stored in AyStar.userpath */
@@ -78,28 +79,28 @@
 /* Will search from the given tile and direction, for a route to the given
  * station for the given transport type. See the declaration of
  * NPFFoundTargetData above for the meaning of the result. */
-NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes);
+NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes);
 
 /* Will search as above, but with two start nodes, the second being the
  * reverse. Look at the NPF_FLAG_REVERSE flag in the result node to see which
  * direction was taken (NPFGetBit(result.node, NPF_FLAG_REVERSE)) */
-NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes);
+NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, bool ignore_start_tile1, TileIndex tile2, Trackdir trackdir2, bool ignore_start_tile2, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes);
 
 /* Will search a route to the closest depot. */
 
 /* Search using breadth first. Good for little track choice and inaccurate
  * heuristic, such as railway/road.*/
-NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, uint sub_type, Owner owner, RailTypes railtypes);
+NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, TransportType type, uint sub_type, Owner owner, RailTypes railtypes);
 /* Same as above but with two start nodes, the second being the reverse. Call
  * NPFGetBit(result.node, NPF_FLAG_REVERSE) to see from which node the path
  * orginated. All pathfs from the second node will have the given
  * reverse_penalty applied (NPF_TILE_LENGTH is the equivalent of one full
  * tile).
  */
-NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, uint sub_type, Owner owner, RailTypes railtypes, uint reverse_penalty);
+NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, bool ignore_start_tile1, TileIndex tile2, Trackdir trackdir2, bool ignore_start_tile2, TransportType type, uint sub_type, Owner owner, RailTypes railtypes, uint reverse_penalty);
 /* Search by trying each depot in order of Manhattan Distance. Good for lots
  * of choices and accurate heuristics, such as water. */
-NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, TransportType type, uint sub_type, Owner owner, RailTypes railtypes);
+NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, TransportType type, uint sub_type, Owner owner, RailTypes railtypes);
 
 void NPFFillWithOrderData(NPFFindStationOrTileData* fstd, Vehicle* v);
 
--- a/src/oldloader.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/oldloader.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -1289,7 +1289,7 @@
 
 	OCL_SVAR(  OC_UINT8, Engine, lifelength ),
 	OCL_SVAR(  OC_UINT8, Engine, flags ),
-	OCL_SVAR(  OC_UINT8, Engine, preview_player ),
+	OCL_SVAR(  OC_UINT8, Engine, preview_player_rank ),
 	OCL_SVAR(  OC_UINT8, Engine, preview_wait ),
 
 	OCL_NULL( 2 ), ///< Junk
--- a/src/openttd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/openttd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -811,9 +811,9 @@
 
 		case SL_REINIT:
 			switch (ogm) {
+				default:
 				case GM_MENU:   LoadIntroGame();      break;
 				case GM_EDITOR: MakeNewEditorWorld(); break;
-				default:        MakeNewGame(false);   break;
 			}
 			return false;
 
@@ -1422,7 +1422,7 @@
 
 	switch (gcf_res) {
 		case GLC_COMPATIBLE: _switch_mode_errorstr = STR_NEWGRF_COMPATIBLE_LOAD_WARNING; break;
-		case GLC_NOT_FOUND: _switch_mode_errorstr = STR_NEWGRF_DISABLED_WARNING; _pause_game = (byte)-1; break;
+		case GLC_NOT_FOUND: _switch_mode_errorstr = STR_NEWGRF_DISABLED_WARNING; _pause_game = -1; break;
 		default: break;
 	}
 
@@ -1462,8 +1462,11 @@
 	 * if a player does exist, rather then checking name_1 */
 	if (CheckSavegameVersionOldStyle(4, 1)) CheckIsPlayerActive();
 
-	/* the void tiles on the southern border used to belong to a wrong class (pre 4.3). */
-	if (CheckSavegameVersionOldStyle(4, 3)) UpdateVoidTiles();
+	/* The void tiles on the southern border used to belong to a wrong class (pre 4.3).
+	 * This problem appears in savegame version 21 too, see r3455. But after loading the
+	 * savegame and saving again, the buggy map array could be converted to new savegame
+	 * version. It didn't show up before r12070. */
+	if (CheckSavegameVersion(87)) UpdateVoidTiles();
 
 	/* If Load Scenario / New (Scenario) Game is used,
 	 *  a player does not exist yet. So create one here.
@@ -2382,9 +2385,16 @@
 				if (_m[t].m5 == 2) {
 					MakeRiver(t, Random());
 				} else {
-					Owner o = GetTileOwner(t);
-					if (IsWater(t) && o != OWNER_WATER) {
-						MakeCanal(t, o, Random());
+					if (IsWater(t)) {
+						Owner o = GetTileOwner(t);
+						if (o == OWNER_WATER) {
+							MakeWater(t);
+						} else {
+							MakeCanal(t, o, Random());
+						}
+					} else if (IsShipDepot(t)) {
+						Owner o = (Owner)_m[t].m4; // Original water owner
+						SetWaterClass(t, o == OWNER_WATER ? WATER_CLASS_SEA : WATER_CLASS_CANAL);
 					}
 				}
 			}
@@ -2396,11 +2406,89 @@
 		for (TileIndex t = 0; t < map_size; t++) {
 			if (GetTileSlope(t, NULL) != SLOPE_FLAT) continue;
 
-			if (IsTileType(t, MP_WATER) && (GetWaterTileType(t) == WATER_TILE_LOCK || IsShipDepot(t))) SetWaterClassDependingOnSurroundings(t);
+			if (IsTileType(t, MP_WATER) && IsLock(t)) SetWaterClassDependingOnSurroundings(t);
 			if (IsTileType(t, MP_STATION) && (IsDock(t) || IsBuoy(t))) SetWaterClassDependingOnSurroundings(t);
 		}
 	}
 
+	if (CheckSavegameVersion(87)) {
+		for (TileIndex t = 0; t < map_size; t++) {
+			/* skip oil rigs at borders! */
+			if ((IsTileType(t, MP_WATER) || IsBuoyTile(t)) &&
+					(TileX(t) == 0 || TileY(t) == 0 || TileX(t) == MapMaxX() - 1 || TileY(t) == MapMaxY() - 1)) {
+				/* Some version 86 savegames have wrong water class at map borders (under buoy, or after removing buoy).
+				 * This conversion has to be done before buoys with invalid owner are removed. */
+				SetWaterClass(t, WATER_CLASS_SEA);
+			}
+
+			if (IsBuoyTile(t) || IsDriveThroughStopTile(t) || IsTileType(t, MP_WATER)) {
+				Owner o = GetTileOwner(t);
+				if (IsValidPlayer(o) && !GetPlayer(o)->is_active) {
+					_current_player = o;
+					ChangeTileOwner(t, o, PLAYER_SPECTATOR);
+				}
+				if (IsBuoyTile(t)) {
+					/* reset buoy owner to OWNER_NONE in the station struct
+					 * (even if it is owned by active player) */
+					GetStationByTile(t)->owner = OWNER_NONE;
+				}
+			} else if (IsTileType(t, MP_ROAD)) {
+				/* works for all RoadTileType */
+				for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) {
+					/* update even non-existing road types to update tile owner too */
+					Owner o = GetRoadOwner(t, rt);
+					if (IsValidPlayer(o) && !GetPlayer(o)->is_active) SetRoadOwner(t, rt, OWNER_NONE);
+				}
+				if (IsLevelCrossing(t)) {
+					Owner o = GetTileOwner(t);
+					if (!GetPlayer(o)->is_active) {
+						/* remove leftover rail piece from crossing (from very old savegames) */
+						_current_player = o;
+						DoCommand(t, 0, GetCrossingRailTrack(t), DC_EXEC | DC_BANKRUPT, CMD_REMOVE_SINGLE_RAIL);
+					}
+				}
+			}
+		}
+
+		/* Convert old PF settings to new */
+		if (_patches.yapf.rail_use_yapf) {
+			_patches.pathfinder_for_trains = VPF_YAPF;
+		} else {
+			_patches.pathfinder_for_trains = (_patches.new_pathfinding_all ? VPF_NPF : VPF_NTP);
+		}
+
+		if (_patches.yapf.road_use_yapf) {
+			_patches.pathfinder_for_roadvehs = VPF_YAPF;
+		} else {
+			_patches.pathfinder_for_roadvehs = (_patches.new_pathfinding_all ? VPF_NPF : VPF_OPF);
+		}
+
+		if (_patches.yapf.ship_use_yapf) {
+			_patches.pathfinder_for_ships = VPF_YAPF;
+		} else {
+			_patches.pathfinder_for_ships = (_patches.new_pathfinding_all ? VPF_NPF : VPF_OPF);
+		}
+	}
+
+	if (CheckSavegameVersion(88)) {
+		/* Profits are now with 8 bit fract */
+		Vehicle *v;
+		FOR_ALL_VEHICLES(v) {
+			v->profit_this_year <<= 8;
+			v->profit_last_year <<= 8;
+			v->running_ticks = 0;
+		}
+	}
+
+	if (CheckSavegameVersion(91)) {
+		/* Increase HouseAnimationFrame from 5 to 7 bits */
+		for (TileIndex t = 0; t < map_size; t++) {
+			if (IsTileType(t, MP_HOUSE) && GetHouseType(t) >= NEW_HOUSE_OFFSET) {
+				SetHouseAnimationFrame(t, GB(_m[t].m6, 3, 5));
+			}
+		}
+	}
+
 	return InitializeWindowsAndCaches();
 }
 
--- a/src/openttd.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/openttd.h	Mon Mar 10 15:26:39 2008 +0000
@@ -156,6 +156,6 @@
 
 extern byte _game_mode;
 extern bool _exit_game;
-extern byte _pause_game;
+extern int8 _pause_game;
 
 #endif /* OPENTTD_H */
--- a/src/order.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/order.h	Mon Mar 10 15:26:39 2008 +0000
@@ -126,6 +126,7 @@
 
 	VehicleID clone;
 	VehicleOrderID orderindex;
+	GroupID group;
 	Order *order;
 	uint16 service_interval;
 	char *name;
--- a/src/order_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/order_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -328,10 +328,8 @@
 
 	if (!HasOrderPoolFree(1)) return_cmd_error(STR_8831_NO_MORE_SPACE_FOR_ORDERS);
 
-	if (v->type == VEH_SHIP &&
-			IsHumanPlayer(v->owner) &&
-			!_patches.new_pathfinding_all) {
-		// Make sure the new destination is not too far away from the previous
+	if (v->type == VEH_SHIP && IsHumanPlayer(v->owner) && _patches.pathfinder_for_ships != VPF_NPF) {
+		/* Make sure the new destination is not too far away from the previous */
 		const Order *prev = NULL;
 		uint n = 0;
 
@@ -935,6 +933,7 @@
 
 	/* Save general info */
 	bak->orderindex       = v->cur_order_index;
+	bak->group            = v->group_id;
 	bak->service_interval = v->service_interval;
 	if (v->name != NULL) bak->name = strdup(v->name);
 
@@ -994,13 +993,24 @@
 		 *  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))
+					CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK)) {
 				break;
+			}
+
+			/* Copy timetable if enabled */
+			if (_patches.timetabling && !DoCommandP(0, v->index | (i << 16) | (1 << 25),
+					bak->order[i].wait_time << 16 | bak->order[i].travel_time, NULL,
+					CMD_CHANGE_TIMETABLE | CMD_NO_TEST_IF_IN_NETWORK)) {
+				break;
+			}
 		}
 	}
 
 	/* Restore vehicle order-index and service interval */
 	DoCommandP(0, v->index, bak->orderindex | (bak->service_interval << 16) , NULL, CMD_RESTORE_ORDER_INDEX);
+
+	/* Restore vehicle group */
+	DoCommandP(0, bak->group, v->index, NULL, CMD_ADD_VEHICLE_GROUP);
 }
 
 /** Restore the current order-index of a vehicle and sets service-interval.
--- a/src/order_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/order_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -281,7 +281,7 @@
 			break;
 
 		case MP_ROAD:
-			if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) {
+			if (IsRoadDepot(tile) && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) {
 				order.type = OT_GOTO_DEPOT;
 				order.flags = OFB_PART_OF_ORDERS;
 				order.dest = GetDepotByTile(tile)->index;
--- a/src/ottdres.rc.in	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/ottdres.rc.in	Mon Mar 10 15:26:39 2008 +0000
@@ -13,7 +13,7 @@
 #ifdef MSVC
 #include "winres.h"
 #else
-#include "afxres.h"
+#define IDC_STATIC              (-1)     // all static controls
 #endif
 
 /////////////////////////////////////////////////////////////////////////////
--- a/src/pathfind.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/pathfind.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -140,7 +140,6 @@
 
 static void TPFMode2(TrackPathFinder* tpf, TileIndex tile, DiagDirection direction)
 {
-	uint bits;
 	RememberData rd;
 
 	assert(tpf->tracktype == TRANSPORT_WATER);
@@ -153,43 +152,35 @@
 	if (++tpf->rd.cur_length > 50)
 		return;
 
-	bits = GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type);
-	bits = (byte)((bits | (bits >> 8)) & _bits_mask[direction]);
-	if (bits == 0)
-		return;
+	TrackStatus ts = GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type);
+	TrackBits bits = (TrackBits)(TrackStatusToTrackBits(ts) & _bits_mask[direction]);
+	if (bits == TRACK_BIT_NONE) return;
 
 	assert(TileX(tile) != MapMaxX() && TileY(tile) != MapMaxY());
 
-	uint i = 0;
-	/* only one direction */
-	if (KillFirstBit(bits) == 0) {
-		i = FindFirstBit(bits);
-		rd = tpf->rd;
-		goto continue_here;
-	}
-	/* several directions */
+	bool only_one_track = true;
 	do {
-		i = FindFirstBit(bits);
+		Track track = RemoveFirstTrack(&bits);
+		if (bits != TRACK_BIT_NONE) only_one_track = false;
 		rd = tpf->rd;
 
 		/* Change direction 4 times only */
-		if ((byte)i != tpf->rd.pft_var6) {
+		if (!only_one_track && track != tpf->rd.last_choosen_track) {
 			if (++tpf->rd.depth > 4) {
 				tpf->rd = rd;
 				return;
 			}
-			tpf->rd.pft_var6 = (byte)i;
+			tpf->rd.last_choosen_track = track;
 		}
 
-continue_here:
-		tpf->the_dir = (Trackdir)(i + (HasBit(_otherdir_mask[direction], i) ? 8 : 0));
+		tpf->the_dir = (Trackdir)(track + (HasBit(_otherdir_mask[direction], track) ? 8 : 0));
 
-		if (!tpf->enum_proc(tile, tpf->userdata, tpf->the_dir, tpf->rd.cur_length, NULL)) {
+		if (!tpf->enum_proc(tile, tpf->userdata, tpf->the_dir, tpf->rd.cur_length)) {
 			TPFMode2(tpf, tile, _tpf_new_direction[tpf->the_dir]);
 		}
 
 		tpf->rd = rd;
-	} while (ClrBit(bits, i) != 0);
+	} while (bits != TRACK_BIT_NONE);
 
 }
 
@@ -261,11 +252,11 @@
 		}
 	}
 
-	uint32 bits = GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type);
+	uint32 bits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type));
 
 	/* Check in case of rail if the owner is the same */
 	if (tpf->tracktype == TRANSPORT_RAIL) {
-		if (bits != 0 && GetTileTrackStatus(tile_org, TRANSPORT_RAIL, 0) != 0) {
+		if (bits != 0 && TrackStatusToTrackdirBits(GetTileTrackStatus(tile_org, TRANSPORT_RAIL, 0)) != TRACKDIR_BIT_NONE) {
 			if (GetTileOwner(tile_org) != GetTileOwner(tile)) return;
 		}
 	}
@@ -287,8 +278,9 @@
 				tpf->the_dir = (Trackdir)((_otherdir_mask[direction] & (byte)(1 << i)) ? (i + 8) : i);
 				RememberData rd = tpf->rd;
 
-				if (TPFSetTileBit(tpf, tile, tpf->the_dir) &&
-						!tpf->enum_proc(tile, tpf->userdata, tpf->the_dir, tpf->rd.cur_length, &tpf->rd.pft_var6) ) {
+				/* make sure we are not leaving from invalid side */
+				if (TPFSetTileBit(tpf, tile, tpf->the_dir) && CanAccessTileInDir(tile, TrackdirToExitdir(tpf->the_dir), tpf->tracktype) &&
+						!tpf->enum_proc(tile, tpf->userdata, tpf->the_dir, tpf->rd.cur_length) ) {
 					TPFMode1(tpf, tile, _tpf_new_direction[tpf->the_dir]);
 				}
 				tpf->rd = rd;
@@ -311,7 +303,7 @@
 
 	tpf.rd.cur_length = 0;
 	tpf.rd.depth = 0;
-	tpf.rd.pft_var6 = 0;
+	tpf.rd.last_choosen_track = INVALID_TRACK;
 
 	tpf.var2 = HasBit(flags, 15) ? 0x43 : 0xFF; // 0x8000
 
@@ -322,8 +314,7 @@
 	tpf.sub_type = sub_type;
 
 	if (HasBit(flags, 11)) {
-		tpf.rd.pft_var6 = 0xFF;
-		tpf.enum_proc(tile, data, INVALID_TRACKDIR, 0, 0);
+		tpf.enum_proc(tile, data, INVALID_TRACKDIR, 0);
 		TPFMode2(&tpf, tile, direction);
 	} else {
 		/* clear the hash_heads */
@@ -549,24 +540,6 @@
 }
 
 
-static const uint16 _is_upwards_slope[15] = {
-	0,                                           ///< no tileh
-	(1 << TRACKDIR_X_SW) | (1 << TRACKDIR_Y_NW), ///< 1
-	(1 << TRACKDIR_X_SW) | (1 << TRACKDIR_Y_SE), ///< 2
-	(1 << TRACKDIR_X_SW),                        ///< 3
-	(1 << TRACKDIR_X_NE) | (1 << TRACKDIR_Y_SE), ///< 4
-	0,                                           ///< 5
-	(1 << TRACKDIR_Y_SE),                        ///< 6
-	0,                                           ///< 7
-	(1 << TRACKDIR_X_NE) | (1 << TRACKDIR_Y_NW), ///< 8,
-	(1 << TRACKDIR_Y_NW),                        ///< 9
-	0,                                           ///< 10
-	0,                                           ///< 11,
-	(1 << TRACKDIR_X_NE),                        ///< 12
-	0,                                           ///< 13
-	0,                                           ///< 14
-};
-
 static uint DistanceMoo(TileIndex t0, TileIndex t1)
 {
 	const uint dx = Delta(TileX(t0), TileX(t1));
@@ -638,37 +611,22 @@
 		/* If the tile is the entry tile of a tunnel, and we're not going out of the tunnel,
 		 *   need to find the exit of the tunnel. */
 		if (IsTileType(tile, MP_TUNNELBRIDGE)) {
-			if (IsTunnel(tile)) {
-				if (GetTunnelBridgeDirection(tile) != ReverseDiagDir(direction)) {
-					/* We are not just driving out of the tunnel */
-					if (GetTunnelBridgeDirection(tile) != direction ||
-							GetTunnelBridgeTransportType(tile) != tpf->tracktype) {
-						/* We are not driving into the tunnel, or it is an invalid tunnel */
-						continue;
-					}
-					if (!HasBit(tpf->railtypes, GetRailType(tile))) {
-						bits = TRACK_BIT_NONE;
-						break;
-					}
+			if (GetTunnelBridgeDirection(tile) != ReverseDiagDir(direction)) {
+				/* We are not just driving out of the tunnel/bridge */
+				if (GetTunnelBridgeDirection(tile) != direction ||
+						GetTunnelBridgeTransportType(tile) != tpf->tracktype) {
+					/* We are not driving into the tunnel/bridge, or it is an invalid tunnel/bridge */
+					continue;
+				}
+				if (!HasBit(tpf->railtypes, GetRailType(tile))) {
+					bits = TRACK_BIT_NONE;
+					break;
+				}
 
-					TileIndex endtile = GetOtherTunnelEnd(tile);
-					si.cur_length += DIAG_FACTOR * (GetTunnelBridgeLength(tile, endtile) + 1);
-					tile = endtile;
-					/* tile now points to the exit tile of the tunnel */
-				}
-			} else { // IsBridge(tile)
-				TileIndex tile_end;
-				if (GetTunnelBridgeDirection(tile) != ReverseDiagDir(direction)) {
-					/* We are not just leaving the bridge */
-					if (GetTunnelBridgeDirection(tile) != direction ||
-							GetTunnelBridgeTransportType(tile) != tpf->tracktype) {
-						/* Not entering the bridge or not compatible */
-						continue;
-					}
-				}
-				tile_end = GetOtherBridgeEnd(tile);
-				si.cur_length += DIAG_FACTOR * (GetTunnelBridgeLength(tile, tile_end) + 1);
-				tile = tile_end;
+				TileIndex endtile = GetOtherTunnelBridgeEnd(tile);
+				si.cur_length += DIAG_FACTOR * (GetTunnelBridgeLength(tile, endtile) + 1);
+				tile = endtile;
+				/* tile now points to the exit tile of the tunnel/bridge */
 			}
 		}
 
@@ -691,8 +649,8 @@
 			if (!IsTileType(tile, MP_RAILWAY) || !IsPlainRailTile(tile)) {
 				/* We found a tile which is not a normal railway tile.
 				 * Determine which tracks that exist on this tile. */
-				uint32 ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & _tpfmode1_and[direction];
-				bits = TrackdirBitsToTrackBits((TrackdirBits)(ts & TRACKDIR_BIT_MASK));
+				TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & _tpfmode1_and[direction];
+				bits = TrackStatusToTrackBits(ts);
 
 				/* Check that the tile contains exactly one track */
 				if (bits == 0 || KillFirstBit(bits) != 0) break;
@@ -736,9 +694,8 @@
 
 			si.cur_length += _length_of_track[track];
 
-			/* Check if this rail is an upwards slope. If it is, then add a penalty.
-			 * Small optimization here.. if (track&7)>1 then it can't be a slope so we avoid calling GetTileSlope */
-			if ((track & 7) <= 1 && (_is_upwards_slope[GetTileSlope(tile, NULL)] & (1 << track)) ) {
+			/* Check if this rail is an upwards slope. If it is, then add a penalty. */
+			if (IsDiagonalTrackdir(track) && IsUphillTrackdir(GetTileSlope(tile, NULL), track)) {
 				// upwards slope. add some penalty.
 				si.cur_length += 4 * DIAG_FACTOR;
 			}
--- a/src/pathfind.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/pathfind.h	Mon Mar 10 15:26:39 2008 +0000
@@ -16,7 +16,7 @@
 //supported on all archs)
 
 struct TrackPathFinder;
-typedef bool TPFEnumProc(TileIndex tile, void *data, Trackdir trackdir, uint length, byte *state);
+typedef bool TPFEnumProc(TileIndex tile, void *data, Trackdir trackdir, uint length);
 typedef void TPFAfterProc(TrackPathFinder *tpf);
 
 typedef bool NTPEnumProc(TileIndex tile, void *data, int track, uint length);
@@ -40,7 +40,7 @@
 struct RememberData {
 	uint16 cur_length;
 	byte depth;
-	byte pft_var6;
+	Track last_choosen_track;
 };
 
 struct TrackPathFinder {
--- a/src/player_base.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/player_base.h	Mon Mar 10 15:26:39 2008 +0000
@@ -62,7 +62,7 @@
 	bool is_active;
 	bool is_ai;
 
-	Money yearly_expenses[3][13];
+	Money yearly_expenses[3][EXPENSES_END];
 	PlayerEconomyEntry cur_economy;
 	PlayerEconomyEntry old_economy[24];
 	EngineRenewList engine_renew_list; ///< Defined later
--- a/src/player_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/player_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -46,7 +46,7 @@
 static void DrawPlayerEconomyStats(const Player *p, byte mode)
 {
 	int x, y, i, j, year;
-	const Money (*tbl)[13];
+	const Money (*tbl)[EXPENSES_END];
 	Money sum, cost;
 	StringID str;
 
--- a/src/rail.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/rail.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -113,6 +113,40 @@
 	TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_RIGHT, TRACK_BIT_UPPER,
 };
 
+extern const TrackdirBits _uphill_trackdirs[] = {
+	TRACKDIR_BIT_NONE                    , ///<  0 SLOPE_FLAT
+	TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///<  1 SLOPE_W   -> inclined for diagonal track
+	TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///<  2 SLOPE_S   -> inclined for diagonal track
+	TRACKDIR_BIT_X_SW                    , ///<  3 SLOPE_SW
+	TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///<  4 SLOPE_E   -> inclined for diagonal track
+	TRACKDIR_BIT_NONE                    , ///<  5 SLOPE_EW
+	TRACKDIR_BIT_Y_SE                    , ///<  6 SLOPE_SE
+	TRACKDIR_BIT_NONE                    , ///<  7 SLOPE_WSE -> leveled
+	TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///<  8 SLOPE_N   -> inclined for diagonal track
+	TRACKDIR_BIT_Y_NW                    , ///<  9 SLOPE_NW
+	TRACKDIR_BIT_NONE                    , ///< 10 SLOPE_NS
+	TRACKDIR_BIT_NONE                    , ///< 11 SLOPE_NWS -> leveled
+	TRACKDIR_BIT_X_NE                    , ///< 12 SLOPE_NE
+	TRACKDIR_BIT_NONE                    , ///< 13 SLOPE_ENW -> leveled
+	TRACKDIR_BIT_NONE                    , ///< 14 SLOPE_SEN -> leveled
+	TRACKDIR_BIT_NONE                    , ///< 15 invalid
+	TRACKDIR_BIT_NONE                    , ///< 16 invalid
+	TRACKDIR_BIT_NONE                    , ///< 17 invalid
+	TRACKDIR_BIT_NONE                    , ///< 18 invalid
+	TRACKDIR_BIT_NONE                    , ///< 19 invalid
+	TRACKDIR_BIT_NONE                    , ///< 20 invalid
+	TRACKDIR_BIT_NONE                    , ///< 21 invalid
+	TRACKDIR_BIT_NONE                    , ///< 22 invalid
+	TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///< 23 SLOPE_STEEP_S -> inclined for diagonal track
+	TRACKDIR_BIT_NONE                    , ///< 24 invalid
+	TRACKDIR_BIT_NONE                    , ///< 25 invalid
+	TRACKDIR_BIT_NONE                    , ///< 26 invalid
+	TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///< 27 SLOPE_STEEP_W -> inclined for diagonal track
+	TRACKDIR_BIT_NONE                    , ///< 28 invalid
+	TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///< 29 SLOPE_STEEP_N -> inclined for diagonal track
+	TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///< 30 SLOPE_STEEP_E -> inclined for diagonal track
+};
+
 /* The default multiplier for the cost of building different types of railway
  * track, which will be divided by 8. Can be changed by newgrf files. */
 const int _default_railtype_cost_multiplier[RAILTYPE_END] = {
--- a/src/rail_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/rail_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -45,6 +45,7 @@
 #include "table/sprites.h"
 #include "table/strings.h"
 #include "table/railtypes.h"
+#include "table/track_land.h"
 
 const byte _track_sloped_sprites[14] = {
 	14, 15, 22, 13,
@@ -356,9 +357,11 @@
 
 			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
-			if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
+			if (IsNormalRoad(tile)) {
 				if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
 
+				if (GetDisallowedRoadDirections(tile) != DRD_NONE) return_cmd_error(STR_ERR_CROSSING_ON_ONEWAY_ROAD);
+
 				RoadTypes roadtypes = GetRoadTypes(tile);
 				RoadBits road = GetRoadBits(tile, ROADTYPE_ROAD);
 				RoadBits tram = GetRoadBits(tile, ROADTYPE_TRAM);
@@ -366,7 +369,7 @@
 					default: break;
 					case ROADTYPES_TRAM:
 						/* Tram crossings must always have road. */
-						SetRoadOwner(tile, ROADTYPE_ROAD, _current_player);
+						if (flags & DC_EXEC) SetRoadOwner(tile, ROADTYPE_ROAD, _current_player);
 						roadtypes |= ROADTYPES_ROAD;
 						break;
 
@@ -455,7 +458,7 @@
 			if (!IsLevelCrossing(tile) ||
 					GetCrossingRailBits(tile) != trackbit ||
 					(_current_player != OWNER_WATER && !CheckTileOwnership(tile)) ||
-					!EnsureNoVehicleOnGround(tile)) {
+					(!(flags & DC_BANKRUPT) && !EnsureNoVehicleOnGround(tile))) {
 				return CMD_ERROR;
 			}
 
@@ -910,8 +913,7 @@
 	if (tile == INVALID_TILE) return false;
 
 	/* Check for track bits on the new tile */
-	uint32 ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0);
-	TrackdirBits trackdirbits = (TrackdirBits)(ts & TRACKDIR_BIT_MASK);
+	TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0));
 
 	if (TracksOverlap(TrackdirBitsToTrackBits(trackdirbits))) return false;
 	trackdirbits &= TrackdirReachesTrackdirs(trackdir);
@@ -1312,7 +1314,7 @@
 
 				default: // MP_STATION, MP_ROAD
 					if (flags & DC_EXEC) {
-						Track track = (tt == MP_STATION) ? GetRailStationTrack(tile) : AxisToTrack(OtherAxis(GetCrossingRoadAxis(tile)));
+						Track track = ((tt == MP_STATION) ? GetRailStationTrack(tile) : GetCrossingRailTrack(tile));
 						YapfNotifyTrackLayoutChange(tile, track);
 					}
 
@@ -1398,8 +1400,6 @@
 	}
 }
 
-#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
@@ -1433,27 +1433,20 @@
 		}
 	};
 
-	static const SpriteID SignalBase[2][2][4] = {
-		{    /* Signals on left side */
-			{  0x4FB, 0x1323, 0x1333, 0x1343}, /* light signals */
-			{ 0x1353, 0x1363, 0x1373, 0x1383}  /* semaphores    */
-		}, { /* Signals on right side */
-			{  0x4FB, 0x1323, 0x1333, 0x1343}, /* light signals */
-			{ 0x1446, 0x1456, 0x1466, 0x1476}  /* semaphores    */
-		/*         |       |       |       |     */
-		/*    normal,  entry,   exit,  combo     */
-		}
-	};
-
 	uint x = TileX(tile) * TILE_SIZE + SignalPositions[side][pos].x;
 	uint y = TileY(tile) * TILE_SIZE + SignalPositions[side][pos].y;
 
 	SpriteID sprite;
 
-	if (GetSignalType(tile, track) == SIGTYPE_NORMAL && GetSignalVariant(tile, track) == SIG_ELECTRIC) {
-		sprite = SignalBase[side][GetSignalVariant(tile, track)][GetSignalType(tile, track)] + image + condition;
+	SignalType type       = GetSignalType(tile, track);
+	SignalVariant variant = GetSignalVariant(tile, track);
+
+	if (type == SIGTYPE_NORMAL && variant == SIG_ELECTRIC) {
+		/* Normal electric signals are picked from original sprites. */
+		sprite = SPR_ORIGINAL_SIGNALS_BASE + image + condition;
 	} else {
-		sprite = SPR_SIGNALS_BASE + (GetSignalType(tile, track) - 1) * 16 + GetSignalVariant(tile, track) * 64 + image + condition;
+		/* All other signals are picked from add on sprites. */
+		sprite = SPR_SIGNALS_BASE + (type - 1) * 16 + variant * 64 + image + condition;
 	}
 
 	AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, GetSaveSlopeZ(x, y, track));
@@ -1698,42 +1691,59 @@
 		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;
+			case RAIL_GROUND_ICE_DESERT:
+			case RAIL_GROUND_HALF_SNOW:  image += rti->snow_offset;  break; // higher part has snow in this case too
 			default: break;
 		}
 		DrawGroundSprite(image, pal, &(_halftile_sub_sprite[halftile_corner]));
 	}
 }
 
+/** Enums holding the offsets from base signal sprite,
+ * according to the side it is representing.
+ * The addtion of 2 per enum is necessary in order to "jump" over the
+ * green state sprite, all signal sprites being in pair,
+ * starting with the off-red state */
+enum {
+	SIGNAL_TO_SOUTHWEST =  0,
+	SIGNAL_TO_NORTHEAST =  2,
+	SIGNAL_TO_SOUTHEAST =  4,
+	SIGNAL_TO_NORTHWEST =  6,
+	SIGNAL_TO_EAST      =  8,
+	SIGNAL_TO_WEST      = 10,
+	SIGNAL_TO_SOUTH     = 12,
+	SIGNAL_TO_NORTH     = 14,
+};
+
 static void DrawSignals(TileIndex tile, TrackBits rails)
 {
-#define MAYBE_DRAW_SIGNAL(x,y,z,t) if (IsSignalPresent(tile, x)) DrawSingleSignal(tile, t, GetSingleSignalState(tile, x), y - 0x4FB, z)
+#define MAYBE_DRAW_SIGNAL(x,y,z,t) if (IsSignalPresent(tile, x)) DrawSingleSignal(tile, t, GetSingleSignalState(tile, x), y, z)
 
 	if (!(rails & TRACK_BIT_Y)) {
 		if (!(rails & TRACK_BIT_X)) {
 			if (rails & TRACK_BIT_LEFT) {
-				MAYBE_DRAW_SIGNAL(2, 0x509, 0, TRACK_LEFT);
-				MAYBE_DRAW_SIGNAL(3, 0x507, 1, TRACK_LEFT);
+				MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_NORTH, 0, TRACK_LEFT);
+				MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_SOUTH, 1, TRACK_LEFT);
 			}
 			if (rails & TRACK_BIT_RIGHT) {
-				MAYBE_DRAW_SIGNAL(0, 0x509, 2, TRACK_RIGHT);
-				MAYBE_DRAW_SIGNAL(1, 0x507, 3, TRACK_RIGHT);
+				MAYBE_DRAW_SIGNAL(0, SIGNAL_TO_NORTH, 2, TRACK_RIGHT);
+				MAYBE_DRAW_SIGNAL(1, SIGNAL_TO_SOUTH, 3, TRACK_RIGHT);
 			}
 			if (rails & TRACK_BIT_UPPER) {
-				MAYBE_DRAW_SIGNAL(3, 0x505, 4, TRACK_UPPER);
-				MAYBE_DRAW_SIGNAL(2, 0x503, 5, TRACK_UPPER);
+				MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_WEST, 4, TRACK_UPPER);
+				MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_EAST, 5, TRACK_UPPER);
 			}
 			if (rails & TRACK_BIT_LOWER) {
-				MAYBE_DRAW_SIGNAL(1, 0x505, 6, TRACK_LOWER);
-				MAYBE_DRAW_SIGNAL(0, 0x503, 7, TRACK_LOWER);
+				MAYBE_DRAW_SIGNAL(1, SIGNAL_TO_WEST, 6, TRACK_LOWER);
+				MAYBE_DRAW_SIGNAL(0, SIGNAL_TO_EAST, 7, TRACK_LOWER);
 			}
 		} else {
-			MAYBE_DRAW_SIGNAL(3, 0x4FB, 8, TRACK_X);
-			MAYBE_DRAW_SIGNAL(2, 0x4FD, 9, TRACK_X);
+			MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_SOUTHWEST, 8, TRACK_X);
+			MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_NORTHEAST, 9, TRACK_X);
 		}
 	} else {
-		MAYBE_DRAW_SIGNAL(3, 0x4FF, 10, TRACK_Y);
-		MAYBE_DRAW_SIGNAL(2, 0x501, 11, TRACK_Y);
+		MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_SOUTHEAST, 10, TRACK_Y);
+		MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_NORTHWEST, 11, TRACK_Y);
 	}
 }
 
@@ -1767,7 +1777,7 @@
 
 			relocation = rti->total_offset;
 
-			image = dts->ground_sprite;
+			image = dts->ground.sprite;
 			if (image != SPR_FLAT_GRASS_TILE) image += rti->total_offset;
 
 			/* adjust ground tile for desert
@@ -1803,7 +1813,7 @@
 				if (dts != NULL && dts->seq != NULL) {
 					relocation = GetCustomStationRelocation(statspec, st, ti->tile);
 
-					image = dts->ground_sprite;
+					image = dts->ground.sprite;
 					if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 						image += GetCustomStationGroundRelocation(statspec, st, ti->tile);
 						image += rti->custom_ground_offset;
@@ -1818,7 +1828,7 @@
 				/* There is no custom layout, fall back to the default graphics */
 				dts = &_waypoint_gfx_table[GetWaypointAxis(ti->tile)];
 				relocation = 0;
-				image = dts->ground_sprite + rti->total_offset;
+				image = dts->ground.sprite + rti->total_offset;
 				if (IsSnowRailGround(ti->tile)) image += rti->snow_offset;
 			}
 		}
@@ -1828,7 +1838,7 @@
 		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
 
 		foreach_draw_tile_seq(dtss, dts->seq) {
-			SpriteID image = dtss->image;
+			SpriteID image = dtss->image.sprite;
 			SpriteID pal;
 
 			/* Unlike stations, our default waypoint has no variation for
@@ -1843,7 +1853,7 @@
 			if (!(!HasBit(image, SPRITE_MODIFIER_OPAQUE) && IsTransparencySet(TO_BUILDINGS)) && HasBit(image, PALETTE_MODIFIER_COLOR)) {
 				pal = _drawtile_track_palette;
 			} else {
-				pal = dtss->pal;
+				pal = dtss->image.pal;
 			}
 
 			if ((byte)dtss->delta_z != 0x80) {
@@ -1868,9 +1878,9 @@
 	SpriteID palette = PLAYER_SPRITE_COLOR(_local_player);
 
 	DrawSprite(ground, PAL_NONE, x, y);
-	for (; dtss->image != 0; dtss++) {
+	for (; dtss->image.sprite != 0; dtss++) {
 		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
-		SpriteID image = dtss->image + offset;
+		SpriteID image = dtss->image.sprite + offset;
 
 		DrawSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE, x + pt.x, y + pt.y);
 	}
@@ -1879,7 +1889,7 @@
 void DrawTrainDepotSprite(int x, int y, int dir, RailType railtype)
 {
 	const DrawTileSprites* dts = &_depot_gfx_table[dir];
-	SpriteID image = dts->ground_sprite;
+	SpriteID image = dts->ground.sprite;
 	uint32 offset = GetRailTypeInfo(railtype)->total_offset;
 
 	if (image != SPR_FLAT_GRASS_TILE) image += offset;
@@ -1891,7 +1901,7 @@
 	uint32 offset = GetRailTypeInfo(railtype)->total_offset;
 	const DrawTileSprites* dts = &_waypoint_gfx_table[AXIS_X];
 
-	DrawTileSequence(x, y, dts->ground_sprite + offset, dts->seq, 0);
+	DrawTileSequence(x, y, dts->ground.sprite + offset, dts->seq, 0);
 }
 
 static uint GetSlopeZ_Track(TileIndex tile, uint x, uint y)
@@ -1934,12 +1944,62 @@
 	}
 
 	switch (_opt.landscape) {
-		case LT_ARCTIC:
-			if (GetTileZ(tile) > GetSnowLine()) {
-				new_ground = RAIL_GROUND_ICE_DESERT;
+		case LT_ARCTIC: {
+			uint z;
+			Slope slope = GetTileSlope(tile, &z);
+			bool half = false;
+
+			/* for non-flat track, use lower part of track
+			 * in other cases, use the highest part with track */
+			if (IsPlainRailTile(tile)) {
+				TrackBits track = GetTrackBits(tile);
+				Foundation f = GetRailFoundation(slope, track);
+
+				switch (f) {
+					case FOUNDATION_NONE:
+						/* no foundation - is the track on the upper side of three corners raised tile? */
+						if (IsSlopeWithThreeCornersRaised(slope)) z += TILE_HEIGHT;
+						break;
+
+					case FOUNDATION_INCLINED_X:
+					case FOUNDATION_INCLINED_Y:
+						/* sloped track - is it on a steep slope? */
+						if (IsSteepSlope(slope)) z += TILE_HEIGHT;
+						break;
+
+					case FOUNDATION_STEEP_LOWER:
+						/* only lower part of steep slope */
+						z += TILE_HEIGHT;
+						break;
+
+					default:
+						/* if it is a steep slope, then there is a track on higher part */
+						if (IsSteepSlope(slope)) z += TILE_HEIGHT;
+						z += TILE_HEIGHT;
+						break;
+				}
+
+				half = IsInsideMM(f, FOUNDATION_STEEP_BOTH, FOUNDATION_HALFTILE_N + 1);
+			} else {
+				/* is the depot on a non-flat tile? */
+				if (slope != SLOPE_FLAT) z += TILE_HEIGHT;
+			}
+
+			/* 'z' is now the lowest part of the highest track bit -
+			 * for sloped track, it is 'z' of lower part
+			 * for two track bits, it is 'z' of higher track bit
+			 * For non-continuous foundations (and STEEP_BOTH), 'half' is set */
+			if (z > GetSnowLine()) {
+				if (half && z - GetSnowLine() == TILE_HEIGHT) {
+					/* track on non-continuous foundation, lower part is not under snow */
+					new_ground = RAIL_GROUND_HALF_SNOW;
+				} else {
+					new_ground = RAIL_GROUND_ICE_DESERT;
+				}
 				goto set_ground;
 			}
 			break;
+			}
 
 		case LT_TROPIC:
 			if (GetTropicZone(tile) == TROPICZONE_DESERT) {
@@ -2040,20 +2100,21 @@
 }
 
 
-static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
 	if (mode != TRANSPORT_RAIL) return 0;
 
+	TrackBits trackbits = TRACK_BIT_NONE;
+	TrackdirBits red_signals = TRACKDIR_BIT_NONE;
+
 	switch (GetRailTileType(tile)) {
 		default: NOT_REACHED();
-		case RAIL_TILE_NORMAL: {
-			TrackBits rails = GetTrackBits(tile);
-			uint32 ret = rails * 0x101;
-			return (rails == TRACK_BIT_CROSS) ? ret | 0x40 : ret;
-		}
+		case RAIL_TILE_NORMAL:
+			trackbits = GetTrackBits(tile);
+			break;
 
 		case RAIL_TILE_SIGNALS: {
-			uint32 ret = GetTrackBits(tile) * 0x101;
+			trackbits = GetTrackBits(tile);
 			byte a = GetPresentSignals(tile);
 			uint b = GetSignalStates(tile);
 
@@ -2066,17 +2127,29 @@
 			if ((a & 0xC) == 0) b |= 0xC;
 			if ((a & 0x3) == 0) b |= 0x3;
 
-			if ((b & 0x8) == 0) ret |= 0x10070000;
-			if ((b & 0x4) == 0) ret |= 0x07100000;
-			if ((b & 0x2) == 0) ret |= 0x20080000;
-			if ((b & 0x1) == 0) ret |= 0x08200000;
+			if ((b & 0x8) == 0) red_signals |= (TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_UPPER_E);
+			if ((b & 0x4) == 0) red_signals |= (TRACKDIR_BIT_LEFT_S | TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW | TRACKDIR_BIT_UPPER_W);
+			if ((b & 0x2) == 0) red_signals |= (TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_LOWER_E);
+			if ((b & 0x1) == 0) red_signals |= (TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LOWER_W);
 
-			return ret;
+			break;
 		}
 
-		case RAIL_TILE_DEPOT:    return AxisToTrackBits(DiagDirToAxis(GetRailDepotDirection(tile))) * 0x101;
-		case RAIL_TILE_WAYPOINT: return GetRailWaypointBits(tile) * 0x101;
+		case RAIL_TILE_DEPOT: {
+			DiagDirection dir = GetRailDepotDirection(tile);
+
+			if (side != INVALID_DIAGDIR && side != dir) break;
+
+			trackbits = AxisToTrackBits(DiagDirToAxis(dir));
+			break;
+		}
+
+		case RAIL_TILE_WAYPOINT:
+			trackbits = GetRailWaypointBits(tile);
+			break;
 	}
+
+	return CombineTrackStatus(TrackBitsToTrackdirBits(trackbits), red_signals);
 }
 
 static void ClickTile_Track(TileIndex tile)
@@ -2146,7 +2219,7 @@
 	if (new_player != PLAYER_SPECTATOR) {
 		SetTileOwner(tile, new_player);
 	} else {
-		DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
+		DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR);
 	}
 }
 
--- a/src/rail_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/rail_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -76,7 +76,7 @@
 static void GenericPlaceRail(TileIndex tile, int cmd)
 {
 	DoCommandP(tile, _cur_railtype, cmd, CcPlaySound1E,
-		(_remove_button_clicked || _ctrl_pressed) ?
+		_remove_button_clicked ?
 		CMD_REMOVE_SINGLE_RAIL | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) | CMD_NO_WATER :
 		CMD_BUILD_SINGLE_RAIL | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK) | CMD_NO_WATER
 	);
@@ -150,7 +150,7 @@
 
 static void PlaceRail_Waypoint(TileIndex tile)
 {
-	if (_remove_button_clicked || _ctrl_pressed) {
+	if (_remove_button_clicked) {
 		DoCommandP(tile, 0, 0, CcPlaySound1E, CMD_REMOVE_TRAIN_WAYPOINT | CMD_MSG(STR_CANT_REMOVE_TRAIN_WAYPOINT));
 	} else {
 		DoCommandP(tile, _cur_waypoint_type, 0, CcPlaySound1E, CMD_BUILD_TRAIN_WAYPOINT | CMD_MSG(STR_CANT_BUILD_TRAIN_WAYPOINT));
@@ -169,7 +169,8 @@
 static void PlaceRail_Station(TileIndex tile)
 {
 	if (_remove_button_clicked) {
-		VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_REMOVE_STATION);
+		VpStartPlaceSizing(tile, VPM_X_AND_Y_LIMITED, DDSP_REMOVE_STATION);
+		VpSetPlaceSizingLimit(-1);
 	} else if (_railstation.dragdrop) {
 		VpStartPlaceSizing(tile, VPM_X_AND_Y_LIMITED, DDSP_BUILD_STATION);
 		VpSetPlaceSizingLimit(_patches.station_spread);
@@ -188,7 +189,7 @@
  */
 static void GenericPlaceSignals(TileIndex tile)
 {
-	TrackBits trackbits = (TrackBits)GB(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0), 0, 6);
+	TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0));
 
 	if (trackbits & TRACK_BIT_VERT) { // N-S direction
 		trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT;
@@ -277,6 +278,38 @@
 	RTW_CONVERT_RAIL,
 };
 
+
+/** Toogles state of the Remove button of Build rail toolbar
+ * @param w window the button belongs to
+ */
+static void ToggleRailButton_Remove(Window *w)
+{
+	w->ToggleWidgetLoweredState(RTW_REMOVE);
+	w->InvalidateWidget(RTW_REMOVE);
+	_remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE);
+	SetSelectionRed(_remove_button_clicked);
+}
+
+/** Updates the Remove button because of Ctrl state change
+ * @param w window the button belongs to
+ * @return true iff the remove buton was changed
+ */
+static bool RailToolbar_CtrlChanged(Window *w)
+{
+	if (w->IsWidgetDisabled(RTW_REMOVE)) return false;
+
+	/* allow ctrl to switch remove mode only for these widgets */
+	for (uint i = RTW_BUILD_NS; i <= RTW_BUILD_STATION; i++) {
+		if ((i <= RTW_AUTORAIL || i >= RTW_BUILD_WAYPOINT) && w->IsWidgetLowered(i)) {
+			ToggleRailButton_Remove(w);
+			return true;
+		}
+	}
+
+	return false;
+}
+
+
 static void BuildRailClick_N(Window *w)
 {
 	HandlePlacePushButton(w, RTW_BUILD_NS, GetRailTypeInfo(_cur_railtype)->cursor.rail_ns, VHM_RECT, PlaceRail_N);
@@ -351,16 +384,29 @@
 static void BuildRailClick_Remove(Window *w)
 {
 	if (w->IsWidgetDisabled(RTW_REMOVE)) return;
-	SetWindowDirty(w);
+	ToggleRailButton_Remove(w);
 	SndPlayFx(SND_15_BEEP);
 
-	w->ToggleWidgetLoweredState(RTW_REMOVE);
-	_remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE);
-	SetSelectionRed(_remove_button_clicked);
-
-	// handle station builder
-	if (_remove_button_clicked) {
-		SetTileSelectSize(1, 1);
+	/* handle station builder */
+	if (w->IsWidgetLowered(RTW_BUILD_STATION)) {
+		if (_remove_button_clicked) {
+			/* starting drag & drop remove */
+			if (!_railstation.dragdrop) {
+				SetTileSelectSize(1, 1);
+			} else {
+				VpSetPlaceSizingLimit(-1);
+			}
+		} else {
+			/* starting station build mode */
+			if (!_railstation.dragdrop) {
+				int x = _railstation.numtracks;
+				int y = _railstation.platlength;
+				if (_railstation.orientation == 0) Swap(x, y);
+				SetTileSelectSize(x, y);
+			} else {
+				VpSetPlaceSizingLimit(_patches.station_spread);
+			}
+		}
 	}
 }
 
@@ -373,7 +419,7 @@
 static void DoRailroadTrack(int mode)
 {
 	DoCommandP(TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), _cur_railtype | (mode << 4), NULL,
-		(_remove_button_clicked || _ctrl_pressed) ?
+		_remove_button_clicked ?
 		CMD_REMOVE_RAILROAD_TRACK | CMD_NO_WATER | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) :
 		CMD_BUILD_RAILROAD_TRACK  | CMD_NO_WATER | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK)
 	);
@@ -514,6 +560,7 @@
 			_build_railroad_button_proc[e->we.click.widget - RTW_BUILD_NS](w);
 		}
 		UpdateRemoveWidgetStatus(w, e->we.click.widget);
+		if (_ctrl_pressed) RailToolbar_CtrlChanged(w);
 		break;
 
 	case WE_KEYPRESS:
@@ -523,6 +570,7 @@
 				_remove_button_clicked = false;
 				_build_railroad_button_proc[i](w);
 				UpdateRemoveWidgetStatus(w, i + RTW_BUILD_NS);
+				if (_ctrl_pressed) RailToolbar_CtrlChanged(w);
 				break;
 			}
 		}
@@ -549,7 +597,7 @@
 			switch (e->we.place.select_proc) {
 				case DDSP_BUILD_BRIDGE:
 					ResetObjectToPlace();
-					ShowBuildBridgeWindow(start_tile, end_tile, _cur_railtype);
+					ShowBuildBridgeWindow(start_tile, end_tile, TRANSPORT_RAIL, _cur_railtype);
 					break;
 
 				case DDSP_PLACE_AUTORAIL:
@@ -564,15 +612,16 @@
 					GUIPlaceProcDragXY(e);
 					break;
 
-				case DDSP_REMOVE_STATION:
-					DoCommandP(end_tile, start_tile, 0, CcPlaySound1E, CMD_REMOVE_FROM_RAILROAD_STATION | CMD_MSG(STR_CANT_REMOVE_PART_OF_STATION));
-					break;
-
 				case DDSP_CONVERT_RAIL:
 					DoCommandP(end_tile, start_tile, _cur_railtype, CcPlaySound10, CMD_CONVERT_RAIL | CMD_MSG(STR_CANT_CONVERT_RAIL));
 					break;
 
+				case DDSP_REMOVE_STATION:
 				case DDSP_BUILD_STATION:
+					if (_remove_button_clicked) {
+						DoCommandP(end_tile, start_tile, 0, CcPlaySound1E, CMD_REMOVE_FROM_RAILROAD_STATION | CMD_MSG(STR_CANT_REMOVE_PART_OF_STATION));
+						break;
+					}
 					HandleStationPlacement(start_tile, end_tile);
 					break;
 
@@ -607,6 +656,11 @@
 	case WE_DESTROY:
 		if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0);
 		break;
+
+	case WE_CTRL_CHANGED:
+		/* do not toggle Remove button by Ctrl when placing station */
+		if (!w->IsWidgetLowered(RTW_BUILD_STATION) && RailToolbar_CtrlChanged(w)) e->we.ctrl.cont = false;
+		break;
 	}
 }
 
@@ -821,7 +875,7 @@
 				SetTileSelectSize(x, y);
 		}
 
-		int rad = (_patches.modified_catchment) ? CA_TRAIN : 4;
+		int rad = (_patches.modified_catchment) ? CA_TRAIN : CA_UNMODIFIED;
 
 		if (_station_show_coverage)
 			SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
@@ -1582,3 +1636,4 @@
 }
 
 
+
--- a/src/rail_map.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/rail_map.h	Mon Mar 10 15:26:39 2008 +0000
@@ -103,9 +103,9 @@
 }
 
 /**
- * Sets the track bits of the given tile
- * @param t the tile to set the track bits of
- * @param r the new track bits for the tile
+ * Sets the rail type of the given tile
+ * @param t the tile to set the rail type of
+ * @param r the new rail type for the tile
  */
 static inline void SetRailType(TileIndex t, RailType r)
 {
@@ -114,9 +114,9 @@
 
 
 /**
- * Gets the rail type of the given tile
- * @param t the tile to get the rail type from
- * @return the rail type of the tile
+ * Gets the track bits of the given tile
+ * @param t the tile to get the track bits from
+ * @return the track bits of the tile
  */
 static inline TrackBits GetTrackBits(TileIndex tile)
 {
@@ -409,6 +409,7 @@
 	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 shore or water on the free halftile
+	RAIL_GROUND_HALF_SNOW    = 14, ///< Snow only on higher part of slope (steep or one corner raised)
 };
 
 static inline void SetRailGroundType(TileIndex t, RailGroundType rgt)
--- a/src/road_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/road_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -225,7 +225,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 || crossing_check)) return CMD_ERROR;
+			if (rt == ROADTYPE_ROAD && HasTileRoadType(tile, ROADTYPE_TRAM) && (flags & DC_EXEC || crossing_check)) return CMD_ERROR;
 
 			if (rt == ROADTYPE_ROAD) {
 				ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
@@ -426,10 +426,9 @@
 			switch (GetRoadTileType(tile)) {
 				case ROAD_TILE_NORMAL: {
 					if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
-					if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 					all_bits = GetAllRoadBits(tile);
-					if (!HasBit(GetRoadTypes(tile), rt)) break;
+					if (!HasTileRoadType(tile, rt)) break;
 
 					existing = GetRoadBits(tile, rt);
 					RoadBits merged = existing | pieces;
@@ -443,6 +442,8 @@
 						if (toggle_drd != DRD_NONE && rt != ROADTYPE_TRAM && GetRoadOwner(tile, ROADTYPE_ROAD) == _current_player) {
 							if (crossing) return_cmd_error(STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION);
 
+							if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+
 							/* Ignore half built tiles */
 							if (flags & DC_EXEC && rt != ROADTYPE_TRAM && (existing == ROAD_X || existing == ROAD_Y)) {
 								SetDisallowedRoadDirections(tile, GetDisallowedRoadDirections(tile) ^ toggle_drd);
@@ -455,7 +456,7 @@
 				} break;
 
 				case ROAD_TILE_CROSSING:
-					if (HasBit(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
+					if (HasTileRoadType(tile, rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
 					all_bits = GetCrossingRoadBits(tile);
 					if (pieces & ComplementRoadBits(all_bits)) goto do_clear;
 					break;
@@ -507,14 +508,12 @@
 
 		case MP_STATION:
 			if (!IsDriveThroughStopTile(tile)) return CMD_ERROR;
-			if (HasBit(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
-			/* Don't allow adding roadtype to the roadstop when vehicles are already driving on it */
-			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+			if (HasTileRoadType(tile, rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
 			break;
 
 		case MP_TUNNELBRIDGE:
 			if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) return CMD_ERROR;
-			if (HasBit(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
+			if (HasTileRoadType(tile, rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
 			/* Don't allow adding roadtype to the bridge/tunnel when vehicles are already driving on it */
 			if (GetVehicleTunnelBridge(tile, GetOtherTunnelBridgeEnd(tile)) != NULL) return CMD_ERROR;
 			break;
@@ -542,7 +541,7 @@
 		pieces &= ComplementRoadBits(existing);
 
 		/* Check if new road bits will have the same foundation as other existing road types */
-		if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
+		if (IsNormalRoad(tile)) {
 			Slope slope = GetTileSlope(tile, NULL);
 			Foundation found_new = GetRoadFoundation(slope, pieces | existing);
 
@@ -559,6 +558,8 @@
 		}
 	}
 
+	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+
 	cost.AddCost(CountBits(pieces) * _price.build_road);
 	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
 		/* Pay for *every* tile of the bridge or tunnel */
@@ -602,7 +603,7 @@
 				break;
 		}
 
-		if (rt != ROADTYPE_TRAM && IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
+		if (rt != ROADTYPE_TRAM && IsNormalRoadTile(tile)) {
 			existing |= pieces;
 			SetDisallowedRoadDirections(tile, (existing == ROAD_X || existing == ROAD_Y) ?
 					GetDisallowedRoadDirections(tile) ^ toggle_drd : DRD_NONE);
@@ -633,6 +634,8 @@
 	bool had_success = false;
 	DisallowedRoadDirections drd = DRD_NORTHBOUND;
 
+	_error_message = INVALID_STRING_ID;
+
 	if (p1 >= MapSize()) return CMD_ERROR;
 
 	start_tile = p1;
@@ -670,7 +673,6 @@
 		ret = DoCommand(tile, drd << 6 | rt << 4 | bits, 0, flags, CMD_BUILD_ROAD);
 		if (CmdFailed(ret)) {
 			if (_error_message != STR_1007_ALREADY_BUILT) return CMD_ERROR;
-			_error_message = INVALID_STRING_ID;
 		} else {
 			had_success = true;
 			/* Only pay for the upgrade on one side of the bridges and tunnels */
@@ -945,7 +947,7 @@
 void DrawTramCatenary(TileInfo *ti, RoadBits tram)
 {
 	/* Don't draw the catenary under a low bridge */
-	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_BUILDINGS)) {
+	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_CATENARY)) {
 		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
 
 		if (height <= GetTileMaxZ(ti->tile) + TILE_HEIGHT) return;
@@ -962,8 +964,8 @@
 		front = SPR_TRAMWAY_BASE + _road_frontwire_sprites_1[tram];
 	}
 
-	AddSortableSpriteToDraw(back,  PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, IsTransparencySet(TO_BUILDINGS));
-	AddSortableSpriteToDraw(front, PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, IsTransparencySet(TO_BUILDINGS));
+	AddSortableSpriteToDraw(back,  PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, IsTransparencySet(TO_CATENARY));
+	AddSortableSpriteToDraw(front, PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, IsTransparencySet(TO_CATENARY));
 }
 
 /**
@@ -1053,8 +1055,21 @@
 	/* 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;
 
+	/* Do not draw details (street lights, trees) under low bridge */
+	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && (roadside == ROADSIDE_TREES || roadside == ROADSIDE_STREET_LIGHTS)) {
+		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
+		uint minz = GetTileMaxZ(ti->tile) + 2 * TILE_HEIGHT;
+
+		if (roadside == ROADSIDE_TREES) minz += TILE_HEIGHT;
+
+		if (height < minz) return;
+	}
+
+	/* If there are no road bits, return, as there is nothing left to do */
+	if (CountBits(road) < 2) return;
+
 	/* Draw extra details. */
-	for (drts = _road_display_table[roadside][road]; drts->image != 0; drts++) {
+	for (drts = _road_display_table[roadside][road | tram]; drts->image != 0; drts++) {
 		DrawRoadDetail(drts->image, ti, drts->subcoord_x, drts->subcoord_y, 0x10);
 	}
 }
@@ -1089,7 +1104,7 @@
 			}
 
 			DrawGroundSprite(image, pal);
-			if (HasBit(GetRoadTypes(ti->tile), ROADTYPE_TRAM)) {
+			if (HasTileRoadType(ti->tile, ROADTYPE_TRAM)) {
 				DrawGroundSprite(SPR_TRAMWAY_OVERLAY + (GetCrossingRoadAxis(ti->tile) ^ 1), pal);
 				DrawTramCatenary(ti, GetCrossingRoadBits(ti->tile));
 			}
@@ -1107,16 +1122,16 @@
 
 			palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile));
 
-			if (HasBit(GetRoadTypes(ti->tile), ROADTYPE_TRAM)) {
+			if (HasTileRoadType(ti->tile, ROADTYPE_TRAM)) {
 				dts =  &_tram_depot[GetRoadDepotDirection(ti->tile)];
 			} else {
 				dts =  &_road_depot[GetRoadDepotDirection(ti->tile)];
 			}
 
-			DrawGroundSprite(dts->ground_sprite, PAL_NONE);
+			DrawGroundSprite(dts->ground.sprite, PAL_NONE);
 
-			for (dtss = dts->seq; dtss->image != 0; dtss++) {
-				SpriteID image = dtss->image;
+			for (dtss = dts->seq; dtss->image.sprite != 0; dtss++) {
+				SpriteID image = dtss->image.sprite;
 				SpriteID pal;
 
 				if (!IsTransparencySet(TO_BUILDINGS) && HasBit(image, PALETTE_MODIFIER_COLOR)) {
@@ -1148,11 +1163,11 @@
 	x += 33;
 	y += 17;
 
-	DrawSprite(dts->ground_sprite, PAL_NONE, x, y);
+	DrawSprite(dts->ground.sprite, PAL_NONE, x, y);
 
-	for (dtss = dts->seq; dtss->image != 0; dtss++) {
+	for (dtss = dts->seq; dtss->image.sprite != 0; dtss++) {
 		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
-		SpriteID image = dtss->image;
+		SpriteID image = dtss->image.sprite;
 
 		DrawSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE, x + pt.x, y + pt.y);
 	}
@@ -1164,7 +1179,7 @@
 	Slope tileh = GetTileSlope(tile, &z);
 
 	if (tileh == SLOPE_FLAT) return z;
-	if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
+	if (IsNormalRoad(tile)) {
 		Foundation f = GetRoadFoundation(tileh, GetAllRoadBits(tile));
 		z += ApplyFoundationToSlope(f, &tileh);
 		return z + GetPartialZ(x & 0xF, y & 0xF, tileh);
@@ -1175,7 +1190,7 @@
 
 static Foundation GetFoundation_Road(TileIndex tile, Slope tileh)
 {
-	if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
+	if (IsNormalRoad(tile)) {
 		return GetRoadFoundation(tileh, GetAllRoadBits(tile));
 	} else {
 		return FlatteningFoundation(tileh);
@@ -1228,7 +1243,7 @@
 			break;
 	}
 
-	if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) return;
+	if (IsRoadDepot(tile)) return;
 
 	const Town* t = ClosestTownFromTile(tile, (uint)-1);
 	if (!HasRoadWorks(tile)) {
@@ -1240,7 +1255,7 @@
 			/* Show an animation to indicate road work */
 			if (t->road_build_months != 0 &&
 					(DistanceManhattan(t->xy, tile) < 8 || grp != HZB_TOWN_EDGE) &&
-					GetRoadTileType(tile) == ROAD_TILE_NORMAL && CountBits(GetAllRoadBits(tile)) > 1 ) {
+					IsNormalRoad(tile) && CountBits(GetAllRoadBits(tile)) > 1 ) {
 				if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicleOnGround(tile) && Chance16(1, 40)) {
 					StartRoadWorks(tile);
 
@@ -1296,47 +1311,64 @@
 
 static void ClickTile_Road(TileIndex tile)
 {
-	if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) ShowDepotWindow(tile, VEH_ROAD);
+	if (IsRoadDepot(tile)) ShowDepotWindow(tile, VEH_ROAD);
 }
 
+/* Converts RoadBits to TrackBits */
 static const byte _road_trackbits[16] = {
 	0x0, 0x0, 0x0, 0x10, 0x0, 0x2, 0x8, 0x1A, 0x0, 0x4, 0x1, 0x15, 0x20, 0x26, 0x29, 0x3F,
 };
 
-static uint32 GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
-
+	TrackdirBits trackdirbits = TRACKDIR_BIT_NONE;
+	TrackdirBits red_signals = TRACKDIR_BIT_NONE; // crossing barred
 	switch (mode) {
 		case TRANSPORT_RAIL:
-			if (!IsLevelCrossing(tile)) return 0;
-			return GetCrossingRailBits(tile) * 0x101;
+			if (IsLevelCrossing(tile)) trackdirbits = TrackBitsToTrackdirBits(GetCrossingRailBits(tile));
+			break;
 
 		case TRANSPORT_ROAD:
-			if ((GetRoadTypes(tile) & sub_mode) == 0) return 0;
+			if ((GetRoadTypes(tile) & sub_mode) == 0) break;
 			switch (GetRoadTileType(tile)) {
 				case ROAD_TILE_NORMAL: {
-					RoadType rt = (RoadType)FindFirstBit(sub_mode);
 					const uint drd_to_multiplier[DRD_END] = { 0x101, 0x100, 0x1, 0x0 };
+					RoadType rt = (RoadType)FindFirstBit(sub_mode);
+					RoadBits bits = GetRoadBits(tile, rt);
+
+					/* no roadbit at this side of tile, return 0 */
+					if (side != INVALID_DIAGDIR && (DiagDirToRoadBits(side) & bits) == 0) break;
+
 					uint multiplier = drd_to_multiplier[rt == ROADTYPE_TRAM ? DRD_NONE : GetDisallowedRoadDirections(tile)];
-					return HasRoadWorks(tile) ? 0 : _road_trackbits[GetRoadBits(tile, rt)] * multiplier;
+					if (!HasRoadWorks(tile)) trackdirbits = (TrackdirBits)(_road_trackbits[bits] * multiplier);
+					break;
 				}
 
 				case ROAD_TILE_CROSSING: {
-					uint32 r = AxisToTrackBits(GetCrossingRoadAxis(tile)) * 0x101;
+					Axis axis = GetCrossingRoadAxis(tile);
 
-					if (IsCrossingBarred(tile)) r *= 0x10001;
-					return r;
+					if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) break;
+
+					trackdirbits = TrackBitsToTrackdirBits(AxisToTrackBits(axis));
+					if (IsCrossingBarred(tile)) red_signals = trackdirbits;
+					break;
 				}
 
 				default:
-				case ROAD_TILE_DEPOT:
-					return AxisToTrackBits(DiagDirToAxis(GetRoadDepotDirection(tile))) * 0x101;
+				case ROAD_TILE_DEPOT: {
+					DiagDirection dir = GetRoadDepotDirection(tile);
+
+					if (side != INVALID_DIAGDIR && side != dir) break;
+
+					trackdirbits = TrackBitsToTrackdirBits(AxisToTrackBits(DiagDirToAxis(dir)));
+					break;
+				}
 			}
 			break;
 
 		default: break;
 	}
-	return 0;
+	return CombineTrackStatus(trackdirbits, red_signals);
 }
 
 static const StringID _road_tile_strings[] = {
@@ -1401,10 +1433,10 @@
 
 static void ChangeTileOwner_Road(TileIndex tile, PlayerID old_player, PlayerID new_player)
 {
-	if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) {
+	if (IsRoadDepot(tile)) {
 		if (GetTileOwner(tile) == old_player) {
 			if (new_player == PLAYER_SPECTATOR) {
-				DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
+				DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR);
 			} else {
 				SetTileOwner(tile, new_player);
 			}
@@ -1413,7 +1445,8 @@
 	}
 
 	for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) {
-		if (!HasBit(GetRoadTypes(tile), rt)) continue;
+		/* ROADTYPE_ROAD denotes the tile owner, so update it too */
+		if (rt != ROADTYPE_ROAD && !HasTileRoadType(tile, rt)) continue;
 
 		if (GetRoadOwner(tile, rt) == old_player) {
 			SetRoadOwner(tile, rt, new_player == PLAYER_SPECTATOR ? OWNER_NONE : new_player);
@@ -1423,7 +1456,7 @@
 	if (IsLevelCrossing(tile)) {
 		if (GetTileOwner(tile) == old_player) {
 			if (new_player == PLAYER_SPECTATOR) {
-				MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypes(tile), GetTownIndex(tile), GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM), GetRoadOwner(tile, ROADTYPE_HWAY));
+				DoCommand(tile, 0, GetCrossingRailTrack(tile), DC_EXEC | DC_BANKRUPT, CMD_REMOVE_SINGLE_RAIL);
 			} else {
 				SetTileOwner(tile, new_player);
 			}
--- a/src/road_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/road_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -177,7 +177,7 @@
 {
 	tile += TileOffsByDiagDir(direction);
 	// if there is a roadpiece just outside of the station entrance, build a connecting route
-	if (IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
+	if (IsNormalRoadTile(tile)) {
 		if (GetRoadBits(tile, _cur_roadtype) != ROAD_NONE) {
 			DoCommandP(tile, _cur_roadtype << 4 | DiagDirToRoadBits(ReverseDiagDir(direction)), 0, NULL, CMD_BUILD_ROAD);
 		}
@@ -255,6 +255,38 @@
 
 typedef void OnButtonClick(Window *w);
 
+
+/** Toogles state of the Remove button of Build road toolbar
+ * @param w window the button belongs to
+ */
+static void ToggleRoadButton_Remove(Window *w)
+{
+	w->ToggleWidgetLoweredState(RTW_REMOVE);
+	w->InvalidateWidget(RTW_REMOVE);
+	_remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE);
+	SetSelectionRed(_remove_button_clicked);
+}
+
+/** Updates the Remove button because of Ctrl state change
+ * @param w window the button belongs to
+ * @return true iff the remove buton was changed
+ */
+static bool RoadToolbar_CtrlChanged(Window *w)
+{
+	if (w->IsWidgetDisabled(RTW_REMOVE)) return false;
+
+	/* allow ctrl to switch remove mode only for these widgets */
+	for (uint i = RTW_ROAD_X; i <= RTW_AUTOROAD; i++) {
+		if (w->IsWidgetLowered(i)) {
+			ToggleRoadButton_Remove(w);
+			return true;
+		}
+	}
+
+	return false;
+}
+
+
 /**
  * Function that handles the click on the
  *  X road placement button.
@@ -338,10 +370,8 @@
 static void BuildRoadClick_Remove(Window *w)
 {
 	if (w->IsWidgetDisabled(RTW_REMOVE)) return;
-	SetWindowDirty(w);
+	ToggleRoadButton_Remove(w);
 	SndPlayFx(SND_15_BEEP);
-	w->ToggleWidgetLoweredState(RTW_REMOVE);
-	SetSelectionRed(w->IsWidgetLowered(RTW_REMOVE));
 }
 
 /** Array with the handlers of the button-clicks for the road-toolbar */
@@ -446,6 +476,7 @@
 			_build_road_button_proc[e->we.click.widget - RTW_ROAD_X](w);
 		}
 		UpdateOptionWidgetStatus(w, e->we.click.widget);
+		if (_ctrl_pressed) RoadToolbar_CtrlChanged(w);
 		break;
 
 	case WE_KEYPRESS:
@@ -456,6 +487,7 @@
 				_one_way_button_clicked = false;
 				_build_road_button_proc[i](w);
 				UpdateOptionWidgetStatus(w, i + RTW_ROAD_X);
+				if (_ctrl_pressed) RoadToolbar_CtrlChanged(w);
 				break;
 			}
 		}
@@ -532,7 +564,7 @@
 			switch (e->we.place.select_proc) {
 				case DDSP_BUILD_BRIDGE:
 					ResetObjectToPlace();
-					ShowBuildBridgeWindow(start_tile, end_tile, 0x80 | RoadTypeToRoadTypes(_cur_roadtype));
+					ShowBuildBridgeWindow(start_tile, end_tile, TRANSPORT_ROAD, RoadTypeToRoadTypes(_cur_roadtype));
 					break;
 
 				case DDSP_DEMOLISH_AREA:
@@ -568,6 +600,10 @@
 	case WE_DESTROY:
 		if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0);
 		break;
+
+	case WE_CTRL_CHANGED:
+		if (RoadToolbar_CtrlChanged(w)) e->we.ctrl.cont = false;
+		break;
 	}
 }
 
@@ -812,7 +848,7 @@
 		_thd.FSMportMask = NULL;
 
 		if (_station_show_coverage) {
-			int rad = _patches.modified_catchment ? CA_TRUCK /* = CA_BUS */ : 4;
+			int rad = _patches.modified_catchment ? CA_TRUCK /* = CA_BUS */ : CA_UNMODIFIED;
 			SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
 		} else {
 			SetTileSelectSize(1, 1);
--- a/src/road_map.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/road_map.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -16,7 +16,7 @@
 
 RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt)
 {
-	if (!HasBit(GetRoadTypes(tile), rt)) return ROAD_NONE;
+	if (!HasTileRoadType(tile, rt)) return ROAD_NONE;
 
 	switch (GetTileType(tile)) {
 		case MP_ROAD:
@@ -43,14 +43,10 @@
 
 TrackBits GetAnyRoadTrackBits(TileIndex tile, RoadType rt)
 {
-	uint32 r;
-
 	/* Don't allow local authorities to build roads through road depots or road stops. */
-	if ((IsTileType(tile, MP_ROAD) && IsTileDepotType(tile, TRANSPORT_ROAD)) || (IsTileType(tile, MP_STATION) && !IsDriveThroughStopTile(tile)) || !HasBit(GetRoadTypes(tile), rt)) {
+	if (IsRoadDepotTile(tile) || (IsTileType(tile, MP_STATION) && !IsDriveThroughStopTile(tile)) || !HasTileRoadType(tile, rt)) {
 		return TRACK_BIT_NONE;
 	}
 
-	r = GetTileTrackStatus(tile, TRANSPORT_ROAD, RoadTypeToRoadTypes(rt));
-
-	return (TrackBits)(byte)(r | (r >> 8));
+	return TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, RoadTypeToRoadTypes(rt)));
 }
--- a/src/road_map.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/road_map.h	Mon Mar 10 15:26:39 2008 +0000
@@ -19,11 +19,21 @@
 };
 
 static inline RoadTileType GetRoadTileType(TileIndex t)
-	{
+{
 	assert(IsTileType(t, MP_ROAD));
 	return (RoadTileType)GB(_m[t].m5, 6, 2);
 }
 
+static inline bool IsNormalRoad(TileIndex t)
+{
+	return GetRoadTileType(t) == ROAD_TILE_NORMAL;
+}
+
+static inline bool IsNormalRoadTile(TileIndex t)
+{
+	return IsTileType(t, MP_ROAD) && IsNormalRoad(t);
+}
+
 static inline bool IsLevelCrossing(TileIndex t)
 {
 	return GetRoadTileType(t) == ROAD_TILE_CROSSING;
@@ -34,9 +44,19 @@
 	return IsTileType(t, MP_ROAD) && IsLevelCrossing(t);
 }
 
+static inline bool IsRoadDepot(TileIndex t)
+{
+	return GetRoadTileType(t) == ROAD_TILE_DEPOT;
+}
+
+static inline bool IsRoadDepotTile(TileIndex t)
+{
+	return IsTileType(t, MP_ROAD) && IsRoadDepot(t);
+}
+
 static inline RoadBits GetRoadBits(TileIndex t, RoadType rt)
 {
-	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
+	assert(IsNormalRoad(t));
 	switch (rt) {
 		default: NOT_REACHED();
 		case ROADTYPE_ROAD: return (RoadBits)GB(_m[t].m4, 0, 4);
@@ -52,7 +72,7 @@
 
 static inline void SetRoadBits(TileIndex t, RoadBits r, RoadType rt)
 {
-	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL); // XXX incomplete
+	assert(IsNormalRoad(t)); // XXX incomplete
 	switch (rt) {
 		default: NOT_REACHED();
 		case ROADTYPE_ROAD: SB(_m[t].m4, 0, 4, r); break;
@@ -80,6 +100,11 @@
 	}
 }
 
+static inline bool HasTileRoadType(TileIndex t, RoadType rt)
+{
+	return HasBit(GetRoadTypes(t), rt);
+}
+
 static inline Owner GetRoadOwner(TileIndex t, RoadType rt)
 {
 	if (!IsTileType(t, MP_ROAD)) return GetTileOwner(t);
@@ -159,7 +184,7 @@
  */
 static inline DisallowedRoadDirections GetDisallowedRoadDirections(TileIndex t)
 {
-	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
+	assert(IsNormalRoad(t));
 	return (DisallowedRoadDirections)GB(_m[t].m5, 4, 2);
 }
 
@@ -170,36 +195,47 @@
  */
 static inline void SetDisallowedRoadDirections(TileIndex t, DisallowedRoadDirections drd)
 {
-	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
+	assert(IsNormalRoad(t));
 	assert(drd < DRD_END);
 	SB(_m[t].m5, 4, 2, drd);
 }
 
 static inline Axis GetCrossingRoadAxis(TileIndex t)
 {
-	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
+	assert(IsLevelCrossing(t));
 	return (Axis)GB(_m[t].m4, 6, 1);
 }
 
+static inline Axis GetCrossingRailAxis(TileIndex t)
+{
+	assert(IsLevelCrossing(t));
+	return OtherAxis((Axis)GetCrossingRoadAxis(t));
+}
+
 static inline RoadBits GetCrossingRoadBits(TileIndex tile)
 {
 	return GetCrossingRoadAxis(tile) == AXIS_X ? ROAD_X : ROAD_Y;
 }
 
+static inline Track GetCrossingRailTrack(TileIndex tile)
+{
+	return AxisToTrack(GetCrossingRailAxis(tile));
+}
+
 static inline TrackBits GetCrossingRailBits(TileIndex tile)
 {
-	return AxisToTrackBits(OtherAxis(GetCrossingRoadAxis(tile)));
+	return AxisToTrackBits(GetCrossingRailAxis(tile));
 }
 
 static inline bool IsCrossingBarred(TileIndex t)
 {
-	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
+	assert(IsLevelCrossing(t));
 	return HasBit(_m[t].m4, 5);
 }
 
 static inline void SetCrossingBarred(TileIndex t, bool barred)
 {
-	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
+	assert(IsLevelCrossing(t));
 	SB(_m[t].m4, 5, 1, barred);
 }
 
@@ -280,7 +316,7 @@
 
 static inline DiagDirection GetRoadDepotDirection(TileIndex t)
 {
-	assert(GetRoadTileType(t) == ROAD_TILE_DEPOT);
+	assert(IsRoadDepot(t));
 	return (DiagDirection)GB(_m[t].m5, 0, 2);
 }
 
--- a/src/roadveh.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/roadveh.h	Mon Mar 10 15:26:39 2008 +0000
@@ -72,7 +72,7 @@
 	int GetImage(Direction direction) const;
 	int GetDisplaySpeed() const { return this->cur_speed * 10 / 32; }
 	int GetDisplayMaxSpeed() const { return this->max_speed * 10 / 32; }
-	Money GetRunningCost() const { return RoadVehInfo(this->engine_type)->running_cost * _price.roadveh_running; }
+	Money GetRunningCost() const { return RoadVehInfo(this->engine_type)->running_cost * GetPriceByIndex(RoadVehInfo(this->engine_type)->running_cost_class); }
 	bool IsInDepot() const { return this->u.road.state == RVSB_IN_DEPOT; }
 	void Tick();
 	void OnNewDay();
--- a/src/roadveh_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/roadveh_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -182,7 +182,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 (HasTileRoadType(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);
 
@@ -219,6 +219,8 @@
 		v->y_pos = y;
 		v->z_pos = GetSlopeZ(x, y);
 
+		v->running_ticks = 0;
+
 		v->u.road.state = RVSB_IN_DEPOT;
 		v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
 
@@ -396,14 +398,13 @@
 	DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE, INVALID_DIAGDIR, INVALID_DIAGDIR
 };
 
-static bool EnumRoadSignalFindDepot(TileIndex tile, void* data, Trackdir trackdir, uint length, byte* state)
+static bool EnumRoadSignalFindDepot(TileIndex tile, void* data, Trackdir trackdir, uint length)
 {
 	RoadFindDepotData* rfdd = (RoadFindDepotData*)data;
 
 	tile += TileOffsByDiagDir(_road_pf_directions[trackdir]);
 
-	if (IsTileType(tile, MP_ROAD) &&
-			GetRoadTileType(tile) == ROAD_TILE_DEPOT &&
+	if (IsRoadDepotTile(tile) &&
 			IsTileOwner(tile, rfdd->owner) &&
 			length < rfdd->best_length) {
 		rfdd->best_length = length;
@@ -414,38 +415,36 @@
 
 static const Depot* FindClosestRoadDepot(const Vehicle* v)
 {
-	TileIndex tile = v->tile;
-
-	if (_patches.yapf.road_use_yapf) {
-		Depot* ret = YapfFindNearestRoadDepot(v);
-		return ret;
-	} else if (_patches.new_pathfinding_all) {
-		NPFFoundTargetData ftd;
-		/* See where we are now */
-		Trackdir trackdir = GetVehicleTrackdir(v);
+	switch (_patches.pathfinder_for_roadvehs) {
+		case VPF_YAPF: /* YAPF */
+			return YapfFindNearestRoadDepot(v);
 
-		ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, v->tile, ReverseTrackdir(trackdir), TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPES, 0);
-		if (ftd.best_bird_dist == 0) {
-			return GetDepotByTile(ftd.node.tile); /* Target found */
-		} else {
-			return NULL; /* Target not found */
-		}
-		/* We do not search in two directions here, why should we? We can't reverse right now can we? */
-	} else {
-		RoadFindDepotData rfdd;
+		case VPF_NPF: { /* NPF */
+			/* See where we are now */
+			Trackdir trackdir = GetVehicleTrackdir(v);
 
-		rfdd.owner = v->owner;
-		rfdd.best_length = (uint)-1;
+			NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, v->tile, ReverseTrackdir(trackdir), false, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPES, 0);
 
-		/* search in all directions */
-		for (DiagDirection i = DIAGDIR_BEGIN; i != DIAGDIR_END; i++) {
-			FollowTrack(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, i, EnumRoadSignalFindDepot, NULL, &rfdd);
-		}
+			if (ftd.best_bird_dist == 0) return GetDepotByTile(ftd.node.tile); /* Target found */
+		} break;
 
-		if (rfdd.best_length == (uint)-1) return NULL;
+		default:
+		case VPF_OPF: { /* OPF */
+			RoadFindDepotData rfdd;
 
-		return GetDepotByTile(rfdd.tile);
+			rfdd.owner = v->owner;
+			rfdd.best_length = UINT_MAX;
+
+			/* search in all directions */
+			for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) {
+				FollowTrack(v->tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, d, EnumRoadSignalFindDepot, NULL, &rfdd);
+			}
+
+			if (rfdd.best_length != UINT_MAX) return GetDepotByTile(rfdd.tile);
+		} break;
 	}
+
+	return NULL; /* Target not found */
 }
 
 /** Send a road vehicle to the depot.
@@ -550,7 +549,7 @@
 		return CMD_ERROR;
 	}
 
-	if (IsTileType(v->tile, MP_ROAD) && GetRoadTileType(v->tile) == ROAD_TILE_NORMAL && GetDisallowedRoadDirections(v->tile) != DRD_NONE) return CMD_ERROR;
+	if (IsNormalRoadTile(v->tile) && GetDisallowedRoadDirections(v->tile) != DRD_NONE) return CMD_ERROR;
 
 	if (IsTileType(v->tile, MP_TUNNELBRIDGE) && DirToDiagDir(v->direction) == GetTunnelBridgeDirection(v->tile)) return CMD_ERROR;
 
@@ -956,7 +955,7 @@
 	/* Clamp */
 	spd = min(spd, v->max_speed);
 	if (v->u.road.state == RVSB_WORMHOLE && !(v->vehstatus & VS_HIDDEN)) {
-		spd = min(spd, GetBridge(GetBridgeType(v->tile))->speed * 2);
+		spd = min(spd, GetBridgeSpec(GetBridgeType(v->tile))->speed * 2);
 	}
 
 	/* updates statusbar only if speed have changed to save CPU time */
@@ -1009,10 +1008,10 @@
 	const Vehicle* u;
 	const Vehicle* v;
 	TileIndex tile;
-	uint16 tilebits;
+	Trackdir trackdir;
 };
 
-static void* EnumFindVehToOvertake(Vehicle* v, void* data)
+static void* EnumFindVehBlockingOvertake(Vehicle* v, void* data)
 {
 	const OvertakeData* od = (OvertakeData*)data;
 
@@ -1021,22 +1020,29 @@
 			v : NULL;
 }
 
-static bool FindRoadVehToOvertake(OvertakeData *od)
+/**
+ * Check if overtaking is possible on a piece of track
+ *
+ * @param od Information about the tile and the involved vehicles
+ * @return true if we have to abort overtaking
+ */
+static bool CheckRoadBlockedForOvertaking(OvertakeData *od)
 {
-	uint32 bits;
+	TrackStatus ts = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes);
+	TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts);
+	TrackdirBits red_signals = TrackStatusToRedSignals(ts); // barred level crossing
+	TrackBits trackbits = TrackdirBitsToTrackBits(trackdirbits);
 
-	bits = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes);
-	bits |= bits >> 8;
+	/* Track does not continue along overtaking direction || track has junction || levelcrossing is barred */
+	if (!HasBit(trackdirbits, od->trackdir) || (trackbits & ~TRACK_BIT_CROSS) || (red_signals != TRACKDIR_BIT_NONE)) return true;
 
-	if (!(od->tilebits & bits) || (bits & 0x3C3C) || (bits & 0x3F3F0000))
-		return true;
-	return VehicleFromPos(od->tile, od, EnumFindVehToOvertake) != NULL;
+	/* Are there more vehicles on the tile except the two vehicles involved in overtaking */
+	return VehicleFromPos(od->tile, od, EnumFindVehBlockingOvertake) != NULL;
 }
 
 static void RoadVehCheckOvertake(Vehicle *v, Vehicle *u)
 {
 	OvertakeData od;
-	uint16 tt;
 
 	od.v = v;
 	od.u = u;
@@ -1056,32 +1062,31 @@
 	/* For now, articulated road vehicles can't overtake anything. */
 	if (RoadVehHasArticPart(v)) return;
 
+	/* Vehicles are not driving in same direction || direction is not a diagonal direction */
 	if (v->direction != u->direction || !(v->direction & 1)) return;
 
 	/* Check if vehicle is in a road stop, depot, tunnel or bridge or not on a straight road */
 	if (v->u.road.state >= RVSB_IN_ROAD_STOP || !IsStraightRoadTrackdir((Trackdir)(v->u.road.state & RVSB_TRACKDIR_MASK))) return;
 
-	tt = GetTileTrackStatus(v->tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
-	tt |= tt >> 8;
-	tt &= 0x3F;
+	od.trackdir = DiagdirToDiagTrackdir(DirToDiagDir(v->direction));
 
-	if ((tt & 3) == 0) return;
-	if ((tt & 0x3C) != 0) return;
-
-	if (tt == 3) tt = (v->direction & 2) ? 2 : 1;
-	od.tilebits = tt;
-
+	/* Are the current and the next tile suitable for overtaking?
+	 *  - Does the track continue along od.trackdir
+	 *  - No junctions
+	 *  - No barred levelcrossing
+	 *  - No other vehicles in the way
+	 */
 	od.tile = v->tile;
-	if (FindRoadVehToOvertake(&od)) return;
+	if (CheckRoadBlockedForOvertaking(&od)) return;
 
 	od.tile = v->tile + TileOffsByDiagDir(DirToDiagDir(v->direction));
-	if (FindRoadVehToOvertake(&od)) return;
+	if (CheckRoadBlockedForOvertaking(&od)) return;
 
 	if (od.u->cur_speed == 0 || od.u->vehstatus& VS_STOPPED) {
 		v->u.road.overtaking_ctr = 0x11;
 		v->u.road.overtaking = 0x10;
 	} else {
-//		if (FindRoadVehToOvertake(&od)) return;
+//		if (CheckRoadBlockedForOvertaking(&od)) return;
 		v->u.road.overtaking_ctr = 0;
 		v->u.road.overtaking = 0x10;
 	}
@@ -1114,7 +1119,7 @@
 	uint mindist;
 };
 
-static bool EnumRoadTrackFindDist(TileIndex tile, void* data, Trackdir trackdir, uint length, byte* state)
+static bool EnumRoadTrackFindDist(TileIndex tile, void* data, Trackdir trackdir, uint length)
 {
 	FindRoadToChooseData* frd = (FindRoadToChooseData*)data;
 	uint dist = DistanceManhattan(tile, frd->dest);
@@ -1128,11 +1133,11 @@
 	return false;
 }
 
-static inline NPFFoundTargetData PerfNPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
+static inline NPFFoundTargetData PerfNPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes)
 {
 
 	void* perf = NpfBeginInterval();
-	NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, target, type, sub_type, owner, railtypes);
+	NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, ignore_start_tile, target, type, sub_type, owner, railtypes);
 	int t = NpfEndInterval(perf);
 	DEBUG(yapf, 4, "[NPFR] %d us - %d rounds - %d open - %d closed -- ", t, 0, _aystar_stats_open_size, _aystar_stats_closed_size);
 	return ret;
@@ -1154,12 +1159,12 @@
 	FindRoadToChooseData frd;
 	Trackdir best_track;
 
-	uint32 r = GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
-	TrackdirBits signal    = (TrackdirBits)GB(r, 16, 16);
-	TrackdirBits trackdirs = (TrackdirBits)GB(r,  0, 16);
+	TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
+	TrackdirBits red_signals = TrackStatusToRedSignals(ts); // crossing
+	TrackdirBits trackdirs = TrackStatusToTrackdirBits(ts);
 
 	if (IsTileType(tile, MP_ROAD)) {
-		if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && (!IsTileOwner(tile, v->owner) || GetRoadDepotDirection(tile) == enterdir || (GetRoadTypes(tile) & v->u.road.compatible_roadtypes) == 0)) {
+		if (IsRoadDepot(tile) && (!IsTileOwner(tile, v->owner) || GetRoadDepotDirection(tile) == enterdir || (GetRoadTypes(tile) & v->u.road.compatible_roadtypes) == 0)) {
 			/* Road depot owned by another player or with the wrong orientation */
 			trackdirs = TRACKDIR_BIT_NONE;
 		}
@@ -1217,106 +1222,110 @@
 		return_track(FindFirstBit2x64(trackdirs));
 	}
 
-	if (_patches.yapf.road_use_yapf) {
-		Trackdir trackdir = YapfChooseRoadTrack(v, tile, enterdir);
-		if (trackdir != INVALID_TRACKDIR) return_track(trackdir);
-		return_track(PickRandomBit(trackdirs));
-	} else if (_patches.new_pathfinding_all) {
-		NPFFindStationOrTileData fstd;
-		NPFFoundTargetData ftd;
-		Trackdir trackdir;
-
-		NPFFillWithOrderData(&fstd, v);
-		trackdir = DiagdirToDiagTrackdir(enterdir);
-		//debug("Finding path. Enterdir: %d, Trackdir: %d", enterdir, trackdir);
+	switch (_patches.pathfinder_for_roadvehs) {
+		case VPF_YAPF: { /* YAPF */
+			Trackdir trackdir = YapfChooseRoadTrack(v, tile, enterdir);
+			if (trackdir != INVALID_TRACKDIR) return_track(trackdir);
+			return_track(PickRandomBit(trackdirs));
+		} break;
 
-		ftd = PerfNPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, &fstd, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPES);
-		if (ftd.best_trackdir == INVALID_TRACKDIR) {
-			/* We are already at our target. Just do something
-			 * @todo: maybe display error?
-			 * @todo: go straight ahead if possible? */
-			return_track(FindFirstBit2x64(trackdirs));
-		} else {
-			/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
-			the direction we need to take to get there, if ftd.best_bird_dist is not 0,
-			we did not find our target, but ftd.best_trackdir contains the direction leading
-			to the tile closest to our target. */
-			return_track(ftd.best_trackdir);
-		}
-	} else {
-		DiagDirection dir;
+		case VPF_NPF: { /* NPF */
+			NPFFindStationOrTileData fstd;
 
-		if (IsTileType(desttile, MP_ROAD)) {
-			if (GetRoadTileType(desttile) == ROAD_TILE_DEPOT) {
-				dir = GetRoadDepotDirection(desttile);
-				goto do_it;
+			NPFFillWithOrderData(&fstd, v);
+			Trackdir trackdir = DiagdirToDiagTrackdir(enterdir);
+			//debug("Finding path. Enterdir: %d, Trackdir: %d", enterdir, trackdir);
+
+			NPFFoundTargetData ftd = PerfNPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, true, &fstd, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPES);
+			if (ftd.best_trackdir == INVALID_TRACKDIR) {
+				/* We are already at our target. Just do something
+				 * @todo: maybe display error?
+				 * @todo: go straight ahead if possible? */
+				return_track(FindFirstBit2x64(trackdirs));
+			} else {
+				/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
+				 * the direction we need to take to get there, if ftd.best_bird_dist is not 0,
+				 * we did not find our target, but ftd.best_trackdir contains the direction leading
+				 * to the tile closest to our target. */
+				return_track(ftd.best_trackdir);
 			}
-		} else if (IsTileType(desttile, MP_STATION)) {
-			/* For drive-through stops we can head for the actual station tile */
-			if (IsStandardRoadStopTile(desttile)) {
-				dir = GetRoadStopDir(desttile);
+		} break;
+
+		default:
+		case VPF_OPF: { /* OPF */
+			DiagDirection dir;
+
+			if (IsTileType(desttile, MP_ROAD)) {
+				if (IsRoadDepot(desttile)) {
+					dir = GetRoadDepotDirection(desttile);
+					goto do_it;
+				}
+			} else if (IsTileType(desttile, MP_STATION)) {
+				/* For drive-through stops we can head for the actual station tile */
+				if (IsStandardRoadStopTile(desttile)) {
+					dir = GetRoadStopDir(desttile);
 do_it:;
-				/* When we are heading for a depot or station, we just
-				 * pretend we are heading for the tile in front, we'll
-				 * see from there */
-				desttile += TileOffsByDiagDir(dir);
-				if (desttile == tile && trackdirs & _road_exit_dir_to_incoming_trackdirs[dir]) {
-					/* If we are already in front of the
-					 * station/depot and we can get in from here,
-					 * we enter */
-					return_track(FindFirstBit2x64(trackdirs & _road_exit_dir_to_incoming_trackdirs[dir]));
+					/* When we are heading for a depot or station, we just
+					 * pretend we are heading for the tile in front, we'll
+					 * see from there */
+					desttile += TileOffsByDiagDir(dir);
+					if (desttile == tile && trackdirs & _road_exit_dir_to_incoming_trackdirs[dir]) {
+						/* If we are already in front of the
+						 * station/depot and we can get in from here,
+						 * we enter */
+						return_track(FindFirstBit2x64(trackdirs & _road_exit_dir_to_incoming_trackdirs[dir]));
+					}
 				}
 			}
-		}
-		/* Do some pathfinding */
-		frd.dest = desttile;
+			/* Do some pathfinding */
+			frd.dest = desttile;
 
-		best_track = INVALID_TRACKDIR;
-		uint best_dist = (uint)-1;
-		uint best_maxlen = (uint)-1;
-		uint bitmask = (uint)trackdirs;
-		uint i;
-		FOR_EACH_SET_BIT(i, bitmask) {
-			if (best_track == INVALID_TRACKDIR) best_track = (Trackdir)i; // in case we don't find the path, just pick a track
-			frd.maxtracklen = (uint)-1;
-			frd.mindist = (uint)-1;
-			FollowTrack(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
+			best_track = INVALID_TRACKDIR;
+			uint best_dist = UINT_MAX;
+			uint best_maxlen = UINT_MAX;
+			uint bitmask = (uint)trackdirs;
+			uint i;
+			FOR_EACH_SET_BIT(i, bitmask) {
+				if (best_track == INVALID_TRACKDIR) best_track = (Trackdir)i; // in case we don't find the path, just pick a track
+				frd.maxtracklen = UINT_MAX;
+				frd.mindist = UINT_MAX;
+				FollowTrack(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
 
-			if (frd.mindist < best_dist || (frd.mindist == best_dist && frd.maxtracklen < best_maxlen)) {
-				best_dist = frd.mindist;
-				best_maxlen = frd.maxtracklen;
-				best_track = (Trackdir)i;
+				if (frd.mindist < best_dist || (frd.mindist == best_dist && frd.maxtracklen < best_maxlen)) {
+					best_dist = frd.mindist;
+					best_maxlen = frd.maxtracklen;
+					best_track = (Trackdir)i;
+				}
 			}
-		}
+		} break;
 	}
 
 found_best_track:;
 
-	if (HasBit(signal, best_track)) return INVALID_TRACKDIR;
+	if (HasBit(red_signals, best_track)) return INVALID_TRACKDIR;
 
 	return best_track;
 }
 
 static uint RoadFindPathToStop(const Vehicle *v, TileIndex tile)
 {
-	uint dist;
-	if (_patches.yapf.road_use_yapf) {
+	if (_patches.pathfinder_for_roadvehs == VPF_YAPF) {
 		/* use YAPF */
-		dist = YapfRoadVehDistanceToTile(v, tile);
-	} else {
-		/* use NPF */
-		NPFFindStationOrTileData fstd;
-		Trackdir trackdir = GetVehicleTrackdir(v);
-		assert(trackdir != INVALID_TRACKDIR);
+		return YapfRoadVehDistanceToTile(v, tile);
+	}
 
-		fstd.dest_coords = tile;
-		fstd.station_index = INVALID_STATION; // indicates that the destination is a tile, not a station
+	/* use NPF */
+	Trackdir trackdir = GetVehicleTrackdir(v);
+	assert(trackdir != INVALID_TRACKDIR);
 
-		dist = NPFRouteToStationOrTile(v->tile, trackdir, &fstd, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPES).best_path_dist;
-		/* change units from NPF_TILE_LENGTH to # of tiles */
-		if (dist != UINT_MAX)
-			dist = (dist + NPF_TILE_LENGTH - 1) / NPF_TILE_LENGTH;
-	}
+	NPFFindStationOrTileData fstd;
+	fstd.dest_coords = tile;
+	fstd.station_index = INVALID_STATION; // indicates that the destination is a tile, not a station
+
+	uint dist = NPFRouteToStationOrTile(v->tile, trackdir, false, &fstd, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPES).best_path_dist;
+	/* change units from NPF_TILE_LENGTH to # of tiles */
+	if (dist != UINT_MAX) dist = (dist + NPF_TILE_LENGTH - 1) / NPF_TILE_LENGTH;
+
 	return dist;
 }
 
@@ -1342,7 +1351,7 @@
 	byte x, y;
 };
 
-#include "table/roadveh.h"
+#include "table/roadveh_movement.h"
 
 static const byte _road_veh_data_1[] = {
 	20, 20, 16, 16, 0, 0, 0, 0,
@@ -1409,7 +1418,7 @@
 
 		if (IsTileType(tile, MP_TUNNELBRIDGE)) {
 			diag_dir = GetTunnelBridgeDirection(tile);
-		} else if (IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_DEPOT) {
+		} else if (IsRoadDepotTile(tile)) {
 			diag_dir = ReverseDiagDir(GetRoadDepotDirection(tile));
 		}
 
@@ -1578,8 +1587,7 @@
 					case TRACKDIR_RVREV_NW: needed = ROAD_SE; break;
 				}
 				if ((v->Previous() != NULL && v->Previous()->tile == tile) ||
-						(IsRoadVehFront(v) && IsTileType(tile, MP_ROAD) &&
-							GetRoadTileType(tile) == ROAD_TILE_NORMAL && !HasRoadWorks(tile) &&
+						(IsRoadVehFront(v) && IsNormalRoadTile(tile) && !HasRoadWorks(tile) &&
 							(needed & GetRoadBits(tile, ROADTYPE_TRAM)) != ROAD_NONE)) {
 					/*
 					 * Taking the 'big' corner for trams only happens when:
@@ -1610,7 +1618,7 @@
 					v->cur_speed = 0;
 					return false;
 				}
-			} else if (IsTileType(v->tile, MP_ROAD) && GetRoadTileType(v->tile) == ROAD_TILE_NORMAL && GetDisallowedRoadDirections(v->tile) != DRD_NONE) {
+			} else if (IsNormalRoadTile(v->tile) && GetDisallowedRoadDirections(v->tile) != DRD_NONE) {
 				v->cur_speed = 0;
 				return false;
 			} else {
@@ -1753,9 +1761,7 @@
 	/* This vehicle is not in a wormhole and it hasn't entered a new tile. If
 	 * it's on a depot tile, check if it's time to activate the next vehicle in
 	 * the chain yet. */
-	if (v->Next() != NULL &&
-			IsTileType(v->tile, MP_ROAD) && GetRoadTileType(v->tile) == ROAD_TILE_DEPOT) {
-
+	if (v->Next() != NULL && IsRoadDepotTile(v->tile)) {
 		if (v->u.road.frame == v->u.road.cached_veh_length + RVC_DEPOT_START_FRAME) {
 			RoadVehLeaveDepot(v->Next(), false);
 		}
@@ -1964,7 +1970,10 @@
 {
 	AgeRoadVehCargo(this);
 
-	if (IsRoadVehFront(this)) RoadVehController(this);
+	if (IsRoadVehFront(this)) {
+		if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++;
+		RoadVehController(this);
+	}
 }
 
 static void CheckIfRoadVehNeedsService(Vehicle *v)
@@ -2006,8 +2015,6 @@
 
 void RoadVehicle::OnNewDay()
 {
-	CommandCost cost(EXPENSES_ROADVEH_RUN);
-
 	if (!IsRoadVehFront(this)) return;
 
 	if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this);
@@ -2025,10 +2032,8 @@
 		ClearSlot(this);
 	}
 
-	if (this->vehstatus & VS_STOPPED) return;
-
 	/* update destination */
-	if (this->current_order.type == OT_GOTO_STATION && this->u.road.slot == NULL && !(this->vehstatus & VS_CRASHED)) {
+	if (!(this->vehstatus & VS_STOPPED) && this->current_order.type == OT_GOTO_STATION && this->u.road.slot == NULL && !(this->vehstatus & VS_CRASHED)) {
 		Station *st = GetStation(this->current_order.dest);
 		RoadStop *rs = st->GetPrimaryRoadStop(this);
 		RoadStop *best = NULL;
@@ -2086,9 +2091,13 @@
 		}
 	}
 
-	cost = CommandCost(EXPENSES_ROADVEH_RUN, RoadVehInfo(this->engine_type)->running_cost * _price.roadveh_running / 364);
+	if (this->running_ticks == 0) return;
 
-	this->profit_this_year -= cost.GetCost() >> 8;
+	const RoadVehicleInfo *rvi = RoadVehInfo(this->engine_type);
+	CommandCost cost(EXPENSES_ROADVEH_RUN, rvi->running_cost * GetPriceByIndex(rvi->running_cost_class) * this->running_ticks / (364 * DAY_TICKS));
+
+	this->profit_this_year -= cost.GetCost();
+	this->running_ticks = 0;
 
 	SubtractMoneyFromPlayerFract(this->owner, cost);
 
--- a/src/saveload.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/saveload.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -1329,64 +1329,56 @@
 {
 	/* After version 4.3 REF_VEHICLE_OLD is saved as REF_VEHICLE,
 	 * and should be loaded like that */
-	if (rt == REF_VEHICLE_OLD && !CheckSavegameVersionOldStyle(4, 4))
+	if (rt == REF_VEHICLE_OLD && !CheckSavegameVersionOldStyle(4, 4)) {
 		rt = REF_VEHICLE;
+	}
 
 	/* No need to look up NULL pointers, just return immediately */
-	if (rt != REF_VEHICLE_OLD && index == 0)
+	if (rt != REF_VEHICLE_OLD && index == 0) {
 		return NULL;
+	}
 
 	index--; // correct for the NULL index
 
 	switch (rt) {
-		case REF_ORDER: {
-			if (!_Order_pool.AddBlockIfNeeded(index))
-				error("Orders: failed loading savegame: too many orders");
-			return GetOrder(index);
-		}
-		case REF_VEHICLE: {
-			if (!_Vehicle_pool.AddBlockIfNeeded(index))
-				error("Vehicles: failed loading savegame: too many vehicles");
-			return GetVehicle(index);
-		}
-		case REF_STATION: {
-			if (!_Station_pool.AddBlockIfNeeded(index))
-				error("Stations: failed loading savegame: too many stations");
-			return GetStation(index);
-		}
-		case REF_TOWN: {
-			if (!_Town_pool.AddBlockIfNeeded(index))
-				error("Towns: failed loading savegame: too many towns");
-			return GetTown(index);
-		}
-		case REF_ROADSTOPS: {
-			if (!_RoadStop_pool.AddBlockIfNeeded(index))
-				error("RoadStops: failed loading savegame: too many RoadStops");
-			return GetRoadStop(index);
-		}
-		case REF_ENGINE_RENEWS: {
-			if (!_EngineRenew_pool.AddBlockIfNeeded(index))
-				error("EngineRenews: failed loading savegame: too many EngineRenews");
-			return GetEngineRenew(index);
-		}
-		case REF_CARGO_PACKET: {
-			if (!_CargoPacket_pool.AddBlockIfNeeded(index))
-				error("CargoPackets: failed loading savegame: too many Cargo packets");
-			return GetCargoPacket(index);
-		}
+		case REF_ORDER:
+			if (_Order_pool.AddBlockIfNeeded(index)) return GetOrder(index);
+			error("Orders: failed loading savegame: too many orders");
 
-		case REF_VEHICLE_OLD: {
+		case REF_VEHICLE:
+			if (_Vehicle_pool.AddBlockIfNeeded(index)) return GetVehicle(index);
+			error("Vehicles: failed loading savegame: too many vehicles");
+
+		case REF_STATION:
+			if (_Station_pool.AddBlockIfNeeded(index)) return GetStation(index);
+			error("Stations: failed loading savegame: too many stations");
+
+		case REF_TOWN:
+			if (_Town_pool.AddBlockIfNeeded(index)) return GetTown(index);
+			error("Towns: failed loading savegame: too many towns");
+
+		case REF_ROADSTOPS:
+			if (_RoadStop_pool.AddBlockIfNeeded(index)) return GetRoadStop(index);
+			error("RoadStops: failed loading savegame: too many RoadStops");
+
+		case REF_ENGINE_RENEWS:
+			if (_EngineRenew_pool.AddBlockIfNeeded(index)) return GetEngineRenew(index);
+			error("EngineRenews: failed loading savegame: too many EngineRenews");
+
+		case REF_CARGO_PACKET:
+			if (_CargoPacket_pool.AddBlockIfNeeded(index)) return GetCargoPacket(index);
+			error("CargoPackets: failed loading savegame: too many Cargo packets");
+
+		case REF_VEHICLE_OLD:
 			/* Old vehicles were saved differently:
 			 * invalid vehicle was 0xFFFF,
 			 * and the index was not - 1.. correct for this */
 			index++;
-			if (index == INVALID_VEHICLE)
-				return NULL;
+			if (index == INVALID_VEHICLE) return NULL;
 
-			if (!_Vehicle_pool.AddBlockIfNeeded(index))
-				error("Vehicles: failed loading savegame: too many vehicles");
-			return GetVehicle(index);
-		}
+			if (_Vehicle_pool.AddBlockIfNeeded(index)) return GetVehicle(index);
+			error("Vehicles: failed loading savegame: too many vehicles");
+
 		default: NOT_REACHED();
 	}
 
--- a/src/saveload.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/saveload.h	Mon Mar 10 15:26:39 2008 +0000
@@ -13,7 +13,7 @@
 
 #define SIZE_MAX ((size_t)-1)
 
-static const uint NEWGRF_AIRPORTS_SAVEGAME = 87;
+static const uint NEWGRF_AIRPORTS_SAVEGAME = 92;
 
 enum SaveOrLoadResult {
 	SL_OK     = 0, ///< completed successfully
--- a/src/settings.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/settings.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -1282,7 +1282,8 @@
 #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_VAR("transparency_options", SLE_UINT, S, 0, _transparency_opt,  0,0,0x1FF,0, STR_NULL, NULL),
+	  SDTG_VAR("transparency_locks", SLE_UINT, S, 0, _transparency_lock,   0,0,0x1FF,0, STR_NULL, NULL),
 	  SDTG_END()
 };
 
@@ -1399,11 +1400,15 @@
 	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),
 
-	SDT_CONDBOOL(Patches, yapf.ship_use_yapf,      28, SL_MAX_VERSION, 0, 0, false,  STR_CONFIG_PATCHES_YAPF_SHIPS,      NULL),
-	SDT_CONDBOOL(Patches, yapf.road_use_yapf,      28, SL_MAX_VERSION, 0, 0,  true,  STR_CONFIG_PATCHES_YAPF_ROAD,       NULL),
-	SDT_CONDBOOL(Patches, yapf.rail_use_yapf,      28, SL_MAX_VERSION, 0, 0,  true,  STR_CONFIG_PATCHES_YAPF_RAIL,       NULL),
+	SDT_CONDBOOL(Patches, new_pathfinding_all, 0,86, 0, 0, false,                    STR_NULL,                                NULL),
+	SDT_CONDBOOL(Patches, yapf.ship_use_yapf, 28,86, 0, 0, false,                    STR_NULL,                                NULL),
+	SDT_CONDBOOL(Patches, yapf.road_use_yapf, 28,86, 0, 0,  true,                    STR_NULL,                                NULL),
+	SDT_CONDBOOL(Patches, yapf.rail_use_yapf, 28,86, 0, 0,  true,                    STR_NULL,                                NULL),
+
+	SDT_CONDVAR(Patches, pathfinder_for_trains,   SLE_UINT8, 87, SL_MAX_VERSION, 0, MS, 2, 0, 2, 1, STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS,  NULL),
+	SDT_CONDVAR(Patches, pathfinder_for_roadvehs, SLE_UINT8, 87, SL_MAX_VERSION, 0, MS, 2, 0, 2, 1, STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH, NULL),
+	SDT_CONDVAR(Patches, pathfinder_for_ships,    SLE_UINT8, 87, SL_MAX_VERSION, 0, MS, 0, 0, 2, 1, STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS,   NULL),
 
 	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),
@@ -1427,6 +1432,7 @@
 	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),
+	SDT_CONDVAR(Patches, plane_speed,    SLE_UINT8, 90, SL_MAX_VERSION, 0, 0, 4, 1,   4, 0, STR_CONFIG_PATCHES_PLANE_SPEED,   NULL),
 
 	/***************************************************************************/
 	/* Station section of the GUI-configure patches window */
--- a/src/settings_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/settings_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -24,6 +24,7 @@
 #include "core/alloc_func.hpp"
 #include "string_func.h"
 #include "gfx_func.h"
+#include "waypoint.h"
 #include "widgets/dropdown_type.h"
 #include "widgets/dropdown_func.h"
 
@@ -301,6 +302,7 @@
 					ReadLanguagePack(e->we.dropdown.index);
 					CheckForMissingGlyphsInLoadedLanguagePack();
 					UpdateAllStationVirtCoord();
+					UpdateAllWaypointSigns();
 					MarkWholeScreenDirty();
 					break;
 
@@ -555,7 +557,7 @@
 				value = ((GDType*)&_opt_mod_temp.diff)[i];
 
 				DrawArrowButtons(5, y, 3,
-						(diffic_d->clicked_button == i) ? 1 << diffic_d->clicked_increase : 0,
+						(diffic_d->clicked_button == i) ? 1 + !!diffic_d->clicked_increase : 0,
 						!(HasBit(disabled, i) || gsd->min == value),
 						!(HasBit(disabled, i) || gsd->max == value));
 
@@ -793,10 +795,9 @@
 	"mammoth_trains",
 	"gotodepot",
 	"roadveh_queue",
-	"new_pathfinding_all",
-	"yapf.ship_use_yapf",
-	"yapf.road_use_yapf",
-	"yapf.rail_use_yapf",
+	"pathfinder_for_trains",
+	"pathfinder_for_roadvehs",
+	"pathfinder_for_ships",
 	"train_income_warn",
 	"order_review_system",
 	"never_expire_vehicles",
@@ -817,6 +818,7 @@
 	"wagon_speed_limits",
 	"disable_elrails",
 	"freight_trains",
+	"plane_speed",
 	"timetabling",
 };
 
@@ -859,6 +861,7 @@
 static void PatchesSelectionWndProc(Window *w, WindowEvent *e)
 {
 	static Patches *patches_ptr;
+	static int patches_max = 0;
 
 	switch (e->event) {
 		case WE_CREATE: {
@@ -872,6 +875,8 @@
 				for (page = &_patches_page[0]; page != endof(_patches_page); page++) {
 					uint i;
 
+					if (patches_max < page->num) patches_max = page->num;
+
 					page->entries = MallocT<PatchEntry>(page->num);
 					for (i = 0; i != page->num; i++) {
 						uint index;
@@ -884,6 +889,13 @@
 				}
 				first_time = false;
 			}
+
+			/* Resize the window to fit the largest patch tab */
+			ResizeWindowForWidget(w, PATCHSEL_OPTIONSPANEL, 0, patches_max * 11);
+
+			/* Recentre the window for the new size */
+			w->top = w->top - (patches_max * 11) / 2;
+
 			w->LowerWidget(4);
 		} break;
 
@@ -1070,7 +1082,7 @@
 {   WWT_CLOSEBOX,   RESIZE_NONE,    10,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},
 {    WWT_CAPTION,   RESIZE_NONE,    10,    11,   369,     0,    13, STR_CONFIG_PATCHES_CAPTION,      STR_018C_WINDOW_TITLE_DRAG_THIS},
 {      WWT_PANEL,   RESIZE_NONE,    10,     0,   369,    14,    41, 0x0,                             STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    10,     0,   369,    42,   380, 0x0,                             STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,    10,     0,   369,    42,    50, 0x0,                             STR_NULL},
 
 {    WWT_TEXTBTN,   RESIZE_NONE,     3,    10,    96,    16,    27, STR_CONFIG_PATCHES_GUI,          STR_NULL},
 {    WWT_TEXTBTN,   RESIZE_NONE,     3,    97,   183,    16,    27, STR_CONFIG_PATCHES_CONSTRUCTION, STR_NULL},
@@ -1082,7 +1094,7 @@
 };
 
 static const WindowDesc _patches_selection_desc = {
-	WDP_CENTER, WDP_CENTER, 370, 381, 370, 381,
+	WDP_CENTER, WDP_CENTER, 370, 51, 370, 51,
 	WC_GAME_OPTIONS, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
 	_patches_selection_widgets,
--- a/src/settings_type.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/settings_type.h	Mon Mar 10 15:26:39 2008 +0000
@@ -126,6 +126,12 @@
 	uint16 servint_aircraft;            ///< service interval for aircraft
 	uint16 servint_ships;               ///< service interval for ships
 
+	uint8 pathfinder_for_trains;        ///< the pathfinder to use for trains
+	uint8 pathfinder_for_roadvehs;      ///< the pathfinder to use for roadvehicles
+	uint8 pathfinder_for_ships;         ///< the pathfinder to use for ships
+
+	uint8 plane_speed;                  ///< divisor for speed of aircraft
+
 	bool autorenew;
 	int16 autorenew_months;
 	int32 autorenew_money;
--- a/src/ship_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/ship_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -50,10 +50,9 @@
 	TRACK_BIT_Y | TRACK_BIT_LOWER | TRACK_BIT_RIGHT, // 0x2A, // DIAGDIR_NW
 };
 
-static TrackBits GetTileShipTrackStatus(TileIndex tile)
+static inline TrackBits GetTileShipTrackStatus(TileIndex tile)
 {
-	uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER, 0);
-	return TrackdirBitsToTrackBits((TrackdirBits)(TRACKDIR_BIT_MASK & (r | r >> 8)));
+	return TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0));
 }
 
 void DrawShipEngine(int x, int y, EngineID engine, SpriteID pal)
@@ -113,34 +112,32 @@
 
 static const Depot* FindClosestShipDepot(const Vehicle* v)
 {
+	if (_patches.pathfinder_for_ships == VPF_NPF) { /* NPF is used */
+		Trackdir trackdir = GetVehicleTrackdir(v);
+		NPFFoundTargetData ftd = NPFRouteToDepotTrialError(v->tile, trackdir, false, TRANSPORT_WATER, 0, v->owner, INVALID_RAILTYPES);
+
+		if (ftd.best_bird_dist == 0) return GetDepotByTile(ftd.node.tile); /* Found target */
+
+		return NULL; /* Did not find target */
+	}
+
+	/* OPF or YAPF - find the closest depot */
+
 	const Depot* depot;
 	const Depot* best_depot = NULL;
-	uint dist;
-	uint best_dist = (uint)-1;
-	TileIndex tile;
-	TileIndex tile2 = v->tile;
+	uint best_dist = UINT_MAX;
 
-	if (_patches.new_pathfinding_all) {
-		NPFFoundTargetData ftd;
-		Trackdir trackdir = GetVehicleTrackdir(v);
-		ftd = NPFRouteToDepotTrialError(v->tile, trackdir, TRANSPORT_WATER, 0, v->owner, INVALID_RAILTYPES);
-		if (ftd.best_bird_dist == 0) {
-			best_depot = GetDepotByTile(ftd.node.tile); /* Found target */
-		} else {
-			best_depot = NULL; /* Did not find target */
-		}
-	} else {
-		FOR_ALL_DEPOTS(depot) {
-			tile = depot->xy;
-			if (IsTileDepotType(tile, TRANSPORT_WATER) && IsTileOwner(tile, v->owner)) {
-				dist = DistanceManhattan(tile, tile2);
-				if (dist < best_dist) {
-					best_dist = dist;
-					best_depot = depot;
-				}
+	FOR_ALL_DEPOTS(depot) {
+		TileIndex tile = depot->xy;
+		if (IsTileDepotType(tile, TRANSPORT_WATER) && IsTileOwner(tile, v->owner)) {
+			uint dist = DistanceManhattan(tile, v->tile);
+			if (dist < best_dist) {
+				best_dist = dist;
+				best_depot = depot;
 			}
 		}
 	}
+
 	return best_depot;
 }
 
@@ -172,8 +169,6 @@
 
 void Ship::OnNewDay()
 {
-	CommandCost cost(EXPENSES_SHIP_RUN);
-
 	if ((++this->day_counter & 7) == 0)
 		DecreaseVehicleValue(this);
 
@@ -183,10 +178,12 @@
 
 	CheckOrders(this);
 
-	if (this->vehstatus & VS_STOPPED) return;
+	if (this->running_ticks == 0) return;
 
-	cost.AddCost(GetVehicleProperty(this, 0x0F, ShipVehInfo(this->engine_type)->running_cost) * _price.ship_running / 364);
-	this->profit_this_year -= cost.GetCost() >> 8;
+	CommandCost cost(EXPENSES_SHIP_RUN, GetVehicleProperty(this, 0x0F, ShipVehInfo(this->engine_type)->running_cost) * _price.ship_running * this->running_ticks / (364 * DAY_TICKS));
+
+	this->profit_this_year -= cost.GetCost();
+	this->running_ticks = 0;
 
 	SubtractMoneyFromPlayerFract(this->owner, cost);
 
@@ -430,7 +427,7 @@
 	uint best_length;
 };
 
-static bool ShipTrackFollower(TileIndex tile, PathFindShip *pfs, int track, uint length, byte *state)
+static bool ShipTrackFollower(TileIndex tile, PathFindShip *pfs, int track, uint length)
 {
 	/* Found dest? */
 	if (tile == pfs->dest_coords) {
@@ -510,11 +507,11 @@
 	return best_bird_dist;
 }
 
-static inline NPFFoundTargetData PerfNPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypes railtypes)
+static inline NPFFoundTargetData PerfNPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypes railtypes)
 {
 
 	void* perf = NpfBeginInterval();
-	NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, target, type, 0, owner, railtypes);
+	NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, ignore_start_tile, target, type, 0, owner, railtypes);
 	int t = NpfEndInterval(perf);
 	DEBUG(yapf, 4, "[NPFW] %d us - %d rounds - %d open - %d closed -- ", t, 0, _aystar_stats_open_size, _aystar_stats_closed_size);
 	return ret;
@@ -525,53 +522,52 @@
  * direction in which we are entering the tile */
 static Track ChooseShipTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks)
 {
-	assert(enterdir >= 0 && enterdir <= 3);
+	assert(IsValidDiagDirection(enterdir));
 
-	if (_patches.yapf.ship_use_yapf) {
-		Trackdir trackdir = YapfChooseShipTrack(v, tile, enterdir, tracks);
-		return (trackdir != INVALID_TRACKDIR) ? TrackdirToTrack(trackdir) : INVALID_TRACK;
-	} else if (_patches.new_pathfinding_all) {
-		NPFFindStationOrTileData fstd;
-		NPFFoundTargetData ftd;
-		TileIndex src_tile = TILE_ADD(tile, TileOffsByDiagDir(ReverseDiagDir(enterdir)));
-		Trackdir trackdir = GetVehicleTrackdir(v);
-		assert(trackdir != INVALID_TRACKDIR); // Check that we are not in a depot
+	switch (_patches.pathfinder_for_ships) {
+		case VPF_YAPF: { /* YAPF */
+			Trackdir trackdir = YapfChooseShipTrack(v, tile, enterdir, tracks);
+			if (trackdir != INVALID_TRACKDIR) return TrackdirToTrack(trackdir);
+		} break;
 
-		NPFFillWithOrderData(&fstd, v);
+		case VPF_NPF: { /* NPF */
+			NPFFindStationOrTileData fstd;
+			Trackdir trackdir = GetVehicleTrackdir(v);
+			assert(trackdir != INVALID_TRACKDIR); // Check that we are not in a depot
 
-		ftd = PerfNPFRouteToStationOrTile(src_tile, trackdir, &fstd, TRANSPORT_WATER, v->owner, INVALID_RAILTYPES);
+			NPFFillWithOrderData(&fstd, v);
 
-		if (ftd.best_trackdir != 0xff) {
+			NPFFoundTargetData ftd = PerfNPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, true, &fstd, TRANSPORT_WATER, v->owner, INVALID_RAILTYPES);
+
 			/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
-			the direction we need to take to get there, if ftd.best_bird_dist is not 0,
-			we did not find our target, but ftd.best_trackdir contains the direction leading
-			to the tile closest to our target. */
-			return TrackdirToTrack(ftd.best_trackdir); /* TODO: Wrapper function? */
-		} else {
-			return INVALID_TRACK; /* Already at target, reverse? */
-		}
-	} else {
-		uint tot_dist, dist;
-		Track track;
-		TileIndex tile2;
+			 * the direction we need to take to get there, if ftd.best_bird_dist is not 0,
+			 * we did not find our target, but ftd.best_trackdir contains the direction leading
+			 * to the tile closest to our target. */
+			if (ftd.best_trackdir != 0xff) return TrackdirToTrack(ftd.best_trackdir); /* TODO: Wrapper function? */
+		} break;
 
-		tile2 = TILE_ADD(tile, -TileOffsByDiagDir(enterdir));
-		tot_dist = (uint)-1;
+		default:
+		case VPF_OPF: { /* OPF */
+			TileIndex tile2 = TILE_ADD(tile, -TileOffsByDiagDir(enterdir));
+			Track track;
 
-		/* Let's find out how far it would be if we would reverse first */
-		TrackBits b = GetTileShipTrackStatus(tile2) & _ship_sometracks[ReverseDiagDir(enterdir)] & v->u.ship.state;
-		if (b != 0) {
-			dist = FindShipTrack(v, tile2, ReverseDiagDir(enterdir), b, tile, &track);
-			if (dist != (uint)-1)
-				tot_dist = dist + 1;
-		}
-		/* And if we would not reverse? */
-		dist = FindShipTrack(v, tile, enterdir, tracks, 0, &track);
-		if (dist > tot_dist)
-			/* We could better reverse */
-			return INVALID_TRACK;
-		return track;
+			/* Let's find out how far it would be if we would reverse first */
+			TrackBits b = GetTileShipTrackStatus(tile2) & _ship_sometracks[ReverseDiagDir(enterdir)] & v->u.ship.state;
+
+			uint distr = UINT_MAX; // distance if we reversed
+			if (b != 0) {
+				distr = FindShipTrack(v, tile2, ReverseDiagDir(enterdir), b, tile, &track);
+				if (distr != UINT_MAX) distr++; // penalty for reversing
+			}
+
+			/* And if we would not reverse? */
+			uint dist = FindShipTrack(v, tile, enterdir, tracks, 0, &track);
+
+			if (dist <= distr) return track;
+		} break;
 	}
+
+	return INVALID_TRACK; /* We could better reverse */
 }
 
 static const Direction _new_vehicle_direction_table[] = {
@@ -595,10 +591,9 @@
 	return _new_vehicle_direction_table[offs];
 }
 
-static TrackBits GetAvailShipTracks(TileIndex tile, int dir)
+static inline TrackBits GetAvailShipTracks(TileIndex tile, int dir)
 {
-	uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER, 0);
-	return (TrackBits)((r | r >> 8) & _ship_sometracks[dir]);
+	return GetTileShipTrackStatus(tile) & _ship_sometracks[dir];
 }
 
 static const byte _ship_subcoord[4][6][3] = {
@@ -784,6 +779,8 @@
 
 void Ship::Tick()
 {
+	if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++;
+
 	AgeShipCargo(this);
 	ShipController(this);
 }
@@ -846,6 +843,8 @@
 		v->y_pos = y;
 		v->z_pos = GetSlopeZ(x, y);
 
+		v->running_ticks = 0;
+
 		v->UpdateDeltaXY(v->direction);
 		v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
 
--- a/src/signal.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/signal.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -506,7 +506,7 @@
 				/* FALLTHROUGH */
 			case MP_STATION:
 			case MP_ROAD:
-				if ((TrackBits)(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) {
+				if ((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) {
  					/* only add to set when there is some 'interesting' track */
 					_tbdset.Add(tile, dir);
 					_tbdset.Add(tile + TileOffsByDiagDir(dir), ReverseDiagDir(dir));
@@ -517,7 +517,7 @@
 				/* jump to next tile */
 				tile = tile + TileOffsByDiagDir(dir);
 				dir = ReverseDiagDir(dir);
-				if ((TrackBits)(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) {
+				if ((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) {
 					_tbdset.Add(tile, dir);
 					break;
 				}
--- a/src/sound.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/sound.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -209,7 +209,7 @@
 	}
 }
 
-static void SndPlayScreenCoordFx(SoundFx sound, int x, int y)
+static void SndPlayScreenCoordFx(SoundFx sound, int left, int right, int top, int bottom)
 {
 	Window* const *wz;
 
@@ -219,13 +219,15 @@
 		const ViewPort *vp = (*wz)->viewport;
 
 		if (vp != NULL &&
-				IsInsideBS(x, vp->virtual_left, vp->virtual_width) &&
-				IsInsideBS(y, vp->virtual_top, vp->virtual_height)) {
-			int left = (x - vp->virtual_left);
+				left < vp->virtual_left + vp->virtual_width && right > vp->virtual_left &&
+				top < vp->virtual_top + vp->virtual_height && bottom > vp->virtual_top) {
+			int screen_x = (left + right) / 2 - vp->virtual_left;
+			int width = (vp->virtual_width == 0 ? 1 : vp->virtual_width);
+			int panning = (screen_x * PANNING_LEVELS * 2) / width - PANNING_LEVELS;
 
 			StartSound(
 				sound,
-				left / max(1, vp->virtual_width / ((PANNING_LEVELS << 1) + 1)) - PANNING_LEVELS,
+				panning,
 				(msf.effect_vol * _vol_factor_by_zoom[vp->zoom - ZOOM_LVL_BEGIN]) / 256
 			);
 			return;
@@ -238,16 +240,19 @@
 {
 	/* emits sound from center of the tile */
 	int x = TileX(tile) * TILE_SIZE + TILE_SIZE / 2;
-	int y = TileY(tile) * TILE_SIZE + TILE_SIZE / 2;
-	Point pt = RemapCoords(x, y, GetSlopeZ(x, y));
-	SndPlayScreenCoordFx(sound, pt.x, pt.y);
+	int y = TileY(tile) * TILE_SIZE - TILE_SIZE / 2;
+	uint z = (y < 0 ? 0 : GetSlopeZ(x, y));
+	Point pt = RemapCoords(x, y, z);
+	y += 2 * TILE_SIZE;
+	Point pt2 = RemapCoords(x, y, GetSlopeZ(x, y));
+	SndPlayScreenCoordFx(sound, pt.x, pt2.x, pt.y, pt2.y);
 }
 
 void SndPlayVehicleFx(SoundFx sound, const Vehicle *v)
 {
 	SndPlayScreenCoordFx(sound,
-		(v->left_coord + v->right_coord) / 2,
-		(v->top_coord + v->bottom_coord) / 2
+		v->left_coord, v->right_coord,
+		v->top_coord, v->top_coord
 	);
 }
 
--- a/src/sprite.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/sprite.h	Mon Mar 10 15:26:39 2008 +0000
@@ -30,13 +30,11 @@
 	byte size_x;
 	byte size_y;
 	byte size_z;
-	SpriteID image;
-	SpriteID pal;
+	PalSpriteID image;
 };
 
 struct DrawTileSprites {
-	SpriteID ground_sprite;
-	SpriteID ground_pal;
+	PalSpriteID ground;
 	const DrawTileSeqStruct *seq;
 };
 
--- a/src/spritecache.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/spritecache.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -284,8 +284,9 @@
 	uint32 tot_size = 0;
 	MemBlock* s;
 
-	for (s = _spritecache_ptr; s->size != 0; s = NextBlock(s))
+	for (s = _spritecache_ptr; s->size != 0; s = NextBlock(s)) {
 		if (!(s->size & S_FREE_MASK)) tot_size += s->size;
+	}
 
 	return tot_size;
 }
@@ -454,6 +455,7 @@
 
 	/* Load the sprite, if it is not loaded, yet */
 	if (p == NULL) p = ReadSprite(sc, sprite, real_sprite);
+
 	return p;
 }
 
--- a/src/station.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/station.h	Mon Mar 10 15:26:39 2008 +0000
@@ -250,6 +250,8 @@
 	CA_TRAIN           =  4,
 	CA_DOCK            =  5,
 
+	CA_UNMODIFIED      =  4, ///< Used when _patches.modified_catchment is false
+
 	MAX_CATCHMENT      = 10, ///< Airports have a catchment up to this number.
 };
 
--- a/src/station_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/station_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -536,11 +536,8 @@
 					CargoID cargos[2] = { CT_INVALID, CT_INVALID };
 
 					gpc(tile, cargos);
-					if (cargos[0] != CT_INVALID) {
-						produced[cargos[0]]++;
-						if (cargos[1] != CT_INVALID) {
-							produced[cargos[1]]++;
-						}
+					for (uint i = 0; i < lengthof(cargos); ++i) {
+						if (cargos[i] != CT_INVALID) produced[cargos[i]]++;
 					}
 				}
 			}
@@ -661,7 +658,7 @@
 			TileXY(rect.min_x, rect.min_y),
 			rect.max_x - rect.min_x + 1,
 			rect.max_y - rect.min_y + 1,
-			_patches.modified_catchment ? FindCatchmentRadius(st) : 4
+			_patches.modified_catchment ? FindCatchmentRadius(st) : (uint)CA_UNMODIFIED
 		);
 	} else {
 		memset(accepts, 0, sizeof(accepts));
@@ -1422,7 +1419,7 @@
 {
 	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 build_over_road  = is_drive_through && IsNormalRoadTile(tile);
 	bool town_owned_road  = build_over_road && IsTileOwner(tile, OWNER_TOWN);
 	RoadTypes rts = (RoadTypes)GB(p2, 2, 3);
 
@@ -1445,7 +1442,6 @@
 	/* Not allowed to build over this road */
 	if (build_over_road) {
 		if (IsTileOwner(tile, OWNER_TOWN) && !_patches.road_stop_on_town_road) return_cmd_error(STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD);
-		if (GetRoadTileType(tile) != ROAD_TILE_NORMAL) return CMD_ERROR;
 
 		RoadTypes cur_rts = GetRoadTypes(tile);
 
@@ -1554,6 +1550,15 @@
 	return cost;
 }
 
+
+static void *ClearRoadStopStatusEnum(Vehicle *v, void *)
+{
+	if (v->type == VEH_ROAD) ClrBit(v->u.road.state, RVS_IN_DT_ROAD_STOP);
+
+	return NULL;
+}
+
+
 /** Remove a bus station
  * @param st Station to remove
  * @param flags operation to perform
@@ -1580,7 +1585,13 @@
 
 	assert(cur_stop != NULL);
 
-	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+	/* don't do the check for drive-through road stops when company bankrupts */
+	if (IsDriveThroughStopTile(tile) && (flags & DC_BANKRUPT)) {
+		/* remove the 'going through road stop' status from all vehicles on that tile */
+		if (flags & DC_EXEC) VehicleFromPos(tile, NULL, &ClearRoadStopStatusEnum);
+	} else {
+		if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+	}
 
 	if (flags & DC_EXEC) {
 		if (*primary_stop == cur_stop) {
@@ -1982,7 +1993,8 @@
 	TileIndex tile = st->dock_tile;
 
 	if (HasStationInUse(st->index, INVALID_PLAYER)) return_cmd_error(STR_BUOY_IS_IN_USE);
-	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+	/* remove the buoy if there is a ship on tile when company goes bankrupt... */
+	if (!(flags & DC_BANKRUPT) && !EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
 		st->dock_tile = 0;
@@ -2240,12 +2252,34 @@
 
 	if (t == NULL || t->seq == NULL) t = &_station_display_datas[GetStationType(ti->tile)][GetStationGfx(ti->tile)];
 
-	SpriteID image = t->ground_sprite;
+
+	if (IsBuoy(ti->tile) || IsDock(ti->tile)) {
+		if (ti->tileh == SLOPE_FLAT) {
+			DrawWaterClassGround(ti);
+		} else {
+			assert(IsDock(ti->tile));
+			TileIndex water_tile = ti->tile + TileOffsByDiagDir(GetDockDirection(ti->tile));
+			WaterClass wc = GetWaterClass(water_tile);
+			if (wc == WATER_CLASS_SEA) {
+				DrawShoreTile(ti->tileh);
+			} else {
+				DrawClearLandTile(ti, 3);
+			}
+		}
+	}
+	SpriteID image = t->ground.sprite;
 	if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 		image += (FSMport)? GetCustomFSMportsGroundRelocation(fsmportspec, st, ti->tile) : GetCustomStationGroundRelocation(statspec, st, ti->tile);
 		image += custom_ground_offset;
 	} else {
-		image += total_offset;
+		SpriteID image = t->ground.sprite;
+		if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
+			image += GetCustomStationGroundRelocation(statspec, st, ti->tile);
+			image += custom_ground_offset;
+		} else {
+			image += total_offset;
+		}
+		DrawGroundSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE);
 	}
 
 	// if ground tile 0x0F8D, but tile is desert/snow, then choose desert/snow graphic
@@ -2264,18 +2298,9 @@
 		DrawTramCatenary(ti, axis == AXIS_X ? ROAD_X : ROAD_Y);
 	}
 
-	if (IsBuoy(ti->tile)) {
-		/* Draw appropriate water edges */
-		switch (GetWaterClass(ti->tile)) {
-			case WATER_CLASS_SEA: break;
-			case WATER_CLASS_CANAL: DrawCanalWater(ti->tile, false); break;
-			case WATER_CLASS_RIVER: DrawRiverWater(ti, false); break;
-		}
-	}
-
 	const DrawTileSeqStruct *dtss;
 	foreach_draw_tile_seq(dtss, t->seq) {
-		image = dtss->image;
+		SpriteID image = dtss->image.sprite;
 		if (relocation == 0 || HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
 			image += total_offset;
 		} else {
@@ -2286,7 +2311,7 @@
 		if (!(!HasBit(image, SPRITE_MODIFIER_OPAQUE) && IsTransparencySet(TO_BUILDINGS)) && HasBit(image, PALETTE_MODIFIER_COLOR)) {
 			pal = palette;
 		} else {
-			pal = dtss->pal;
+			pal = dtss->image.pal;
 		}
 
 		if ((byte)dtss->delta_z != 0x80) {
@@ -2314,17 +2339,17 @@
 		total_offset = rti->total_offset;
 	}
 
-	SpriteID img = t->ground_sprite;
+	SpriteID img = t->ground.sprite;
 	DrawSprite(img + 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);
+		DrawSprite(SPR_TRAMWAY_TRAM + (t->ground.sprite == SPR_ROAD_PAVED_STRAIGHT_X ? 1 : 0), PAL_NONE, x, y);
 	}
 
 	const DrawTileSeqStruct *dtss;
 	foreach_draw_tile_seq(dtss, t->seq) {
 		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
-		DrawSprite(dtss->image + total_offset, pal, x + pt.x, y + pt.y);
+		DrawSprite(dtss->image.sprite + total_offset, pal, x + pt.x, y + pt.y);
 	}
 }
 
@@ -2365,30 +2390,38 @@
 }
 
 
-static uint32 GetTileTrackStatus_Station(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Station(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
+	TrackBits trackbits = TRACK_BIT_NONE;
+
 	switch (mode) {
 		case TRANSPORT_RAIL:
 			if (IsRailwayStation(tile) && !IsStationTileBlocked(tile)) {
-				return TrackToTrackBits(GetRailStationTrack(tile)) * 0x101;
+				trackbits = TrackToTrackBits(GetRailStationTrack(tile));
 			}
 			break;
 
 		case TRANSPORT_WATER:
 			/* buoy is coded as a station, it is always on open water */
 			if (IsBuoy(tile)) {
-				TrackBits ts = TRACK_BIT_ALL;
+				trackbits = TRACK_BIT_ALL;
 				/* remove tracks that connect NE map edge */
-				if (TileX(tile) == 0) ts &= ~(TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT);
+				if (TileX(tile) == 0) trackbits &= ~(TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT);
 				/* 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;
+				if (TileY(tile) == 0) trackbits &= ~(TRACK_BIT_Y | TRACK_BIT_LEFT | TRACK_BIT_UPPER);
 			}
 			break;
 
 		case TRANSPORT_ROAD:
-			if ((GetRoadTypes(tile) & sub_mode) != 0 && IsRoadStopTile(tile)) {
-				return AxisToTrackBits(DiagDirToAxis(GetRoadStopDir(tile))) * 0x101;
+			if ((GetRoadTypes(tile) & sub_mode) != 0 && IsRoadStop(tile)) {
+				DiagDirection dir = GetRoadStopDir(tile);
+				Axis axis = DiagDirToAxis(dir);
+
+				if (side != INVALID_DIAGDIR) {
+					if (axis != DiagDirToAxis(side) || (IsStandardRoadStopTile(tile) && dir != side)) break;
+				}
+
+				trackbits = AxisToTrackBits(axis);
 			}
 			break;
 
@@ -2396,7 +2429,7 @@
 			break;
 	}
 
-	return 0;
+	return CombineTrackStatus(TrackBitsToTrackdirBits(trackbits), TRACKDIR_BIT_NONE);
 }
 
 
@@ -2419,6 +2452,9 @@
 			//}
 			break;
 
+		case STATION_DOCK:
+			if (GetTileSlope(tile, NULL) != SLOPE_FLAT) break; // only handle water part
+		/* FALL THROUGH */
 		case STATION_OILRIG: //(station part)
 		case STATION_BUOY:
 			TileLoop_Water(tile);
@@ -2796,7 +2832,7 @@
 		h_prod = 0;
 		w += 8;
 		h += 8;
-		max_rad = 4;
+		max_rad = CA_UNMODIFIED;
 	}
 
 	BEGIN_TILE_LOOP(cur_tile, w, h, tile - TileDiffXY(max_rad, max_rad))
@@ -2990,15 +3026,22 @@
 		Station* st = GetStationByTile(tile);
 
 		SetTileOwner(tile, new_player);
-		st->owner = new_player;
+		if (!IsBuoy(tile)) st->owner = new_player; // do not set st->owner for buoys
 		RebuildStationLists();
 		InvalidateWindowClasses(WC_STATION_LIST);
 	} else {
-		if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile)) {
-			/* For a drive-through stop on a town-owned road remove the stop and replace the road */
-			DoCommand(tile, 0, (GetStationType(tile) == STATION_TRUCK) ? RoadStop::TRUCK : RoadStop::BUS, DC_EXEC, CMD_REMOVE_ROAD_STOP);
+		if (IsDriveThroughStopTile(tile)) {
+			/* Remove the drive-through road stop */
+			DoCommand(tile, 0, (GetStationType(tile) == STATION_TRUCK) ? RoadStop::TRUCK : RoadStop::BUS, DC_EXEC | DC_BANKRUPT, CMD_REMOVE_ROAD_STOP);
+			assert(IsTileType(tile, MP_ROAD));
+			/* Change owner of tile and all roadtypes */
+			ChangeTileOwner(tile, old_player, new_player);
 		} else {
-			DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
+			DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR);
+			/* Set tile owner of water under (now removed) buoy and dock to OWNER_NONE.
+			 * Update owner of buoy if it was not removed (was in orders).
+			 * Do not update when owned by OWNER_WATER (sea and rivers). */
+			if ((IsTileType(tile, MP_WATER) || IsBuoyTile(tile)) && IsTileOwner(tile, old_player)) SetTileOwner(tile, OWNER_NONE);
 		}
 	}
 }
@@ -3026,8 +3069,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_MUST_DEMOLISH_CARGO_TRAM_STATION : STR_3047_MUST_DEMOLISH_TRUCK_STATION);
-			case STATION_BUS:     return_cmd_error(HasBit(GetRoadTypes(tile), ROADTYPE_TRAM) ? STR_MUST_DEMOLISH_PASSENGER_TRAM_STATION : STR_3046_MUST_DEMOLISH_BUS_STATION);
+			case STATION_TRUCK:   return_cmd_error(HasTileRoadType(tile, ROADTYPE_TRAM) ? STR_MUST_DEMOLISH_CARGO_TRAM_STATION : STR_3047_MUST_DEMOLISH_TRUCK_STATION);
+			case STATION_BUS:     return_cmd_error(HasTileRoadType(tile, ROADTYPE_TRAM) ? STR_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:
--- a/src/stdafx.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/stdafx.h	Mon Mar 10 15:26:39 2008 +0000
@@ -279,6 +279,8 @@
 	#define assert_compile(expr) extern "C" void __ct_assert__(int a[1 - 2 * !(expr)])
 #endif /* __OS2__ */
 
+/* Check if the types have the bitsizes like we are using them */
+assert_compile(sizeof(uint64) == 8);
 assert_compile(sizeof(uint32) == 4);
 assert_compile(sizeof(uint16) == 2);
 assert_compile(sizeof(uint8)  == 1);
--- a/src/table/bridge_land.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/table/bridge_land.h	Mon Mar 10 15:26:39 2008 +0000
@@ -23,27 +23,10 @@
  * </ul>
  */
 
-static const PalSpriteID _bridge_sprite_table_2_0[] = {
-	{  0x9C3, PAL_NONE }, {  0x9C7, PAL_NONE }, {  0x9C9, PAL_NONE }, {    0x0, PAL_NONE },
-	{  0x9C4, PAL_NONE }, {  0x9C8, PAL_NONE }, {  0x9CA, PAL_NONE }, {    0x0, PAL_NONE },
-	{  0x9C5, PAL_NONE }, {  0x9C7, PAL_NONE }, {  0x9C9, PAL_NONE }, {    0x0, PAL_NONE },
-	{  0x9C6, PAL_NONE }, {  0x9C8, PAL_NONE }, {  0x9CA, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x10E4, PAL_NONE }, {  0x9C7, PAL_NONE }, {  0x9C9, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x10E5, PAL_NONE }, {  0x9C8, PAL_NONE }, {  0x9CA, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x110C, PAL_NONE }, {  0x9C7, PAL_NONE }, {  0x9C9, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x110D, PAL_NONE }, {  0x9C8, PAL_NONE }, {  0x9CA, PAL_NONE }, {    0x0, PAL_NONE },
-};
-
-static const PalSpriteID _bridge_sprite_table_2_1[] = {
-	{  0x986, PAL_NONE }, {  0x988, PAL_NONE }, {  0x985, PAL_NONE }, {  0x987, PAL_NONE },
-	{  0x98A, PAL_NONE }, {  0x98C, PAL_NONE }, {  0x989, PAL_NONE }, {  0x98B, PAL_NONE },
-	{  0x98E, PALETTE_TO_STRUCT_WHITE }, {  0x990, PALETTE_TO_STRUCT_WHITE }, {  0x98D, PALETTE_TO_STRUCT_WHITE }, {  0x98F, PALETTE_TO_STRUCT_WHITE },
-	{  0x992, PALETTE_TO_STRUCT_WHITE }, {  0x994, PALETTE_TO_STRUCT_WHITE }, {  0x991, PALETTE_TO_STRUCT_WHITE }, {  0x993, PALETTE_TO_STRUCT_WHITE },
-	{ 0x10E7, PALETTE_TO_STRUCT_WHITE }, { 0x10E9, PALETTE_TO_STRUCT_WHITE }, { 0x10E6, PALETTE_TO_STRUCT_WHITE }, { 0x10E8, PALETTE_TO_STRUCT_WHITE },
-	{ 0x10EB, PALETTE_TO_STRUCT_WHITE }, { 0x10ED, PALETTE_TO_STRUCT_WHITE }, { 0x10EA, PALETTE_TO_STRUCT_WHITE }, { 0x10EC, PALETTE_TO_STRUCT_WHITE },
-	{ 0x110F, PALETTE_TO_STRUCT_WHITE }, { 0x1111, PALETTE_TO_STRUCT_WHITE }, { 0x110E, PALETTE_TO_STRUCT_WHITE }, { 0x1110, PALETTE_TO_STRUCT_WHITE },
-	{ 0x1113, PALETTE_TO_STRUCT_WHITE }, { 0x1115, PALETTE_TO_STRUCT_WHITE }, { 0x1112, PALETTE_TO_STRUCT_WHITE }, { 0x1114, PALETTE_TO_STRUCT_WHITE },
-};
+# define MN(a) {a, PAL_NONE}
+# define MR(a) {a, PALETTE_TO_STRUCT_RED}
+# define MW(a) {a, PALETTE_TO_STRUCT_WHITE}
+# define MC(a) {a, PALETTE_TO_STRUCT_CONCRETE}
 
 static const PalSpriteID _bridge_sprite_table_4_0[] = {
 	{  0x9A9, PAL_NONE }, {  0x99F, PAL_NONE }, {  0x9B1, PAL_NONE }, {    0x0, PAL_NONE },
@@ -199,94 +182,6 @@
 	{ 0x1113, PALETTE_TO_STRUCT_YELLOW }, { 0x1115, PALETTE_TO_STRUCT_YELLOW }, { 0x1112, PALETTE_TO_STRUCT_YELLOW }, { 0x1114, PALETTE_TO_STRUCT_YELLOW },
 };
 
-static const PalSpriteID _bridge_sprite_table_3_0[] = {
-	{  0x9A9, PALETTE_TO_STRUCT_CONCRETE }, { 0x99F, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B1, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x9A5, PALETTE_TO_STRUCT_CONCRETE }, { 0x997, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AD, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x99D, PALETTE_TO_STRUCT_CONCRETE }, { 0x99F, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B1, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x995, PALETTE_TO_STRUCT_CONCRETE }, { 0x997, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AD, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10F2, PALETTE_TO_STRUCT_CONCRETE }, { 0x99F, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B1, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10EE, PALETTE_TO_STRUCT_CONCRETE }, { 0x997, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AD, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x111A, PALETTE_TO_STRUCT_CONCRETE }, { 0x99F, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B1, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x1116, PALETTE_TO_STRUCT_CONCRETE }, { 0x997, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AD, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-};
-
-static const PalSpriteID _bridge_sprite_table_3_1[] = {
-	{  0x9AA, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A0, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B2, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x9A6, PALETTE_TO_STRUCT_CONCRETE }, { 0x998, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AE, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x99E, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A0, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B2, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x996, PALETTE_TO_STRUCT_CONCRETE }, { 0x998, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AE, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10F3, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A0, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B2, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10EF, PALETTE_TO_STRUCT_CONCRETE }, { 0x998, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AE, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x111B, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A0, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B2, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x1117, PALETTE_TO_STRUCT_CONCRETE }, { 0x998, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AE, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-};
-
-static const PalSpriteID _bridge_sprite_table_3_2[] = {
-	{  0x9AC, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A4, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B4, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x9A8, PALETTE_TO_STRUCT_CONCRETE }, { 0x99C, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B0, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x9A2, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A4, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B4, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x99A, PALETTE_TO_STRUCT_CONCRETE }, { 0x99C, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B0, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10F5, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A4, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B4, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10F1, PALETTE_TO_STRUCT_CONCRETE }, { 0x99C, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B0, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x111D, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A4, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B4, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x1119, PALETTE_TO_STRUCT_CONCRETE }, { 0x99C, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B0, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-};
-
-static const PalSpriteID _bridge_sprite_table_3_3[] = {
-	{  0x9AB, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A3, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B3, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x9A7, PALETTE_TO_STRUCT_CONCRETE }, { 0x99B, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AF, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x9A1, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A3, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B3, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x999, PALETTE_TO_STRUCT_CONCRETE }, { 0x99B, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AF, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10F4, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A3, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B3, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10F0, PALETTE_TO_STRUCT_CONCRETE }, { 0x99B, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AF, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x111C, PALETTE_TO_STRUCT_CONCRETE }, { 0x9A3, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B3, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x1118, PALETTE_TO_STRUCT_CONCRETE }, { 0x99B, PALETTE_TO_STRUCT_CONCRETE }, { 0x9AF, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-};
-
-static const PalSpriteID _bridge_sprite_table_3_4[] = {
-	{  0x9B6, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BA, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BC, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x9B5, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B9, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BB, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x9B8, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BA, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BC, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{  0x9B7, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B9, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BB, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10F7, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BA, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BC, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x10F6, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B9, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BB, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x111F, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BA, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BC, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-	{ 0x111E, PALETTE_TO_STRUCT_CONCRETE }, { 0x9B9, PALETTE_TO_STRUCT_CONCRETE }, { 0x9BB, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE },
-};
-
-static const PalSpriteID _bridge_sprite_table_3_5[] = {
-	{  0x9BD, PALETTE_TO_STRUCT_CONCRETE }, { 0x9C1, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE }, {      0x0, PAL_NONE },
-	{  0x9BE, PALETTE_TO_STRUCT_CONCRETE }, { 0x9C2, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE }, {      0x0, PAL_NONE },
-	{  0x9BF, PALETTE_TO_STRUCT_CONCRETE }, { 0x9C1, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE }, {      0x0, PAL_NONE },
-	{  0x9C0, PALETTE_TO_STRUCT_CONCRETE }, { 0x9C2, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE }, {      0x0, PAL_NONE },
-	{ 0x10F8, PALETTE_TO_STRUCT_CONCRETE }, { 0x9C1, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE }, {      0x0, PAL_NONE },
-	{ 0x10F9, PALETTE_TO_STRUCT_CONCRETE }, { 0x9C2, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE }, {      0x0, PAL_NONE },
-	{ 0x1120, PALETTE_TO_STRUCT_CONCRETE }, { 0x9C1, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE }, {      0x0, PAL_NONE },
-	{ 0x1121, PALETTE_TO_STRUCT_CONCRETE }, { 0x9C2, PALETTE_TO_STRUCT_CONCRETE }, {       0x0, PAL_NONE }, {      0x0, PAL_NONE },
-};
-
-static const PalSpriteID _bridge_sprite_table_3_6[] = {
-	{  0x986, PAL_NONE }, {  0x988, PAL_NONE }, {  0x985, PAL_NONE }, {  0x987, PAL_NONE },
-	{  0x98A, PAL_NONE }, {  0x98C, PAL_NONE }, {  0x989, PAL_NONE }, {  0x98B, PAL_NONE },
-	{  0x98E, PALETTE_TO_STRUCT_CONCRETE }, {  0x990, PALETTE_TO_STRUCT_CONCRETE }, {  0x98D, PALETTE_TO_STRUCT_CONCRETE }, {  0x98F, PALETTE_TO_STRUCT_CONCRETE },
-	{  0x992, PALETTE_TO_STRUCT_CONCRETE }, {  0x994, PALETTE_TO_STRUCT_CONCRETE }, {  0x991, PALETTE_TO_STRUCT_CONCRETE }, {  0x993, PALETTE_TO_STRUCT_CONCRETE },
-	{ 0x10E7, PALETTE_TO_STRUCT_CONCRETE }, { 0x10E9, PALETTE_TO_STRUCT_CONCRETE }, { 0x10E6, PALETTE_TO_STRUCT_CONCRETE }, { 0x10E8, PALETTE_TO_STRUCT_CONCRETE },
-	{ 0x10EB, PALETTE_TO_STRUCT_CONCRETE }, { 0x10ED, PALETTE_TO_STRUCT_CONCRETE }, { 0x10EA, PALETTE_TO_STRUCT_CONCRETE }, { 0x10EC, PALETTE_TO_STRUCT_CONCRETE },
-	{ 0x110F, PALETTE_TO_STRUCT_CONCRETE }, { 0x1111, PALETTE_TO_STRUCT_CONCRETE }, { 0x110E, PALETTE_TO_STRUCT_CONCRETE }, { 0x1110, PALETTE_TO_STRUCT_CONCRETE },
-	{ 0x1113, PALETTE_TO_STRUCT_CONCRETE }, { 0x1115, PALETTE_TO_STRUCT_CONCRETE }, { 0x1112, PALETTE_TO_STRUCT_CONCRETE }, { 0x1114, PALETTE_TO_STRUCT_CONCRETE },
-};
-
-static const PalSpriteID _bridge_sprite_table_1_1[] = {
-	{  0x986, PAL_NONE }, {  0x988, PAL_NONE }, {  0x985, PAL_NONE }, {  0x987, PAL_NONE },
-	{  0x98A, PAL_NONE }, {  0x98C, PAL_NONE }, {  0x989, PAL_NONE }, {  0x98B, PAL_NONE },
-	{  0x98E, PALETTE_TO_STRUCT_RED }, {  0x990, PALETTE_TO_STRUCT_RED }, {  0x98D, PALETTE_TO_STRUCT_RED }, {  0x98F, PALETTE_TO_STRUCT_RED },
-	{  0x992, PALETTE_TO_STRUCT_RED }, {  0x994, PALETTE_TO_STRUCT_RED }, {  0x991, PALETTE_TO_STRUCT_RED }, {  0x993, PALETTE_TO_STRUCT_RED },
-	{ 0x10E7, PALETTE_TO_STRUCT_RED }, { 0x10E9, PALETTE_TO_STRUCT_RED }, { 0x10E6, PALETTE_TO_STRUCT_RED }, { 0x10E8, PALETTE_TO_STRUCT_RED },
-	{ 0x10EB, PALETTE_TO_STRUCT_RED }, { 0x10ED, PALETTE_TO_STRUCT_RED }, { 0x10EA, PALETTE_TO_STRUCT_RED }, { 0x10EC, PALETTE_TO_STRUCT_RED },
-	{ 0x110F, PALETTE_TO_STRUCT_RED }, { 0x1111, PALETTE_TO_STRUCT_RED }, { 0x110E, PALETTE_TO_STRUCT_RED }, { 0x1110, PALETTE_TO_STRUCT_RED },
-	{ 0x1113, PALETTE_TO_STRUCT_RED }, { 0x1115, PALETTE_TO_STRUCT_RED }, { 0x1112, PALETTE_TO_STRUCT_RED }, { 0x1114, PALETTE_TO_STRUCT_RED },
-};
-
 static const PalSpriteID _bridge_sprite_table_6_0[] = {
 	{  0x9CD, PAL_NONE }, {  0x9D9, PAL_NONE }, {    0x0, PAL_NONE }, {    0x0, PAL_NONE },
 	{  0x9CE, PAL_NONE }, {  0x9DA, PAL_NONE }, {    0x0, PAL_NONE }, {    0x0, PAL_NONE },
@@ -419,37 +314,147 @@
 	{ 0x1113, PALETTE_TO_STRUCT_RED }, { 0x1115, PALETTE_TO_STRUCT_RED }, { 0x1112, PALETTE_TO_STRUCT_RED }, { 0x1114, PALETTE_TO_STRUCT_RED },
 };
 
-static const PalSpriteID _bridge_sprite_table_0_0[] = {
-	{  0x9F2, PAL_NONE }, {  0x9F6, PAL_NONE }, {  0x9F8, PAL_NONE }, {    0x0, PAL_NONE },
-	{  0x9F1, PAL_NONE }, {  0x9F5, PAL_NONE }, {  0x9F7, PAL_NONE }, {    0x0, PAL_NONE },
-	{  0x9F4, PAL_NONE }, {  0x9F6, PAL_NONE }, {  0x9F8, PAL_NONE }, {    0x0, PAL_NONE },
-	{  0x9F3, PAL_NONE }, {  0x9F5, PAL_NONE }, {  0x9F7, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x1109, PAL_NONE }, {  0x9F6, PAL_NONE }, {  0x9F8, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x1108, PAL_NONE }, {  0x9F5, PAL_NONE }, {  0x9F7, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x1131, PAL_NONE }, {  0x9F6, PAL_NONE }, {  0x9F8, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x1130, PAL_NONE }, {  0x9F5, PAL_NONE }, {  0x9F7, PAL_NONE }, {    0x0, PAL_NONE },
+static const PalSpriteID _bridge_sprite_table_wood_middle[] = {
+	MN( SPR_BTWDN_RAIL_X_REAR ),        MN( SPR_BTWDN_X_FRONT ),          MN( SPR_BTWDN_X_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTWDN_RAIL_Y_REAR ),        MN( SPR_BTWDN_Y_FRONT ),          MN( SPR_BTWDN_Y_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTWDN_ROAD_X_REAR ),        MN( SPR_BTWDN_X_FRONT ),          MN( SPR_BTWDN_X_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTWDN_ROAD_Y_REAR ),        MN( SPR_BTWDN_Y_FRONT ),          MN( SPR_BTWDN_Y_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTWDN_MONO_X_REAR ),        MN( SPR_BTWDN_X_FRONT ),          MN( SPR_BTWDN_X_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTWDN_MONO_Y_REAR ),        MN( SPR_BTWDN_Y_FRONT ),          MN( SPR_BTWDN_Y_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTWDN_MGLV_X_REAR ),        MN( SPR_BTWDN_X_FRONT ),          MN( SPR_BTWDN_X_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTWDN_MGLV_Y_REAR ),        MN( SPR_BTWDN_Y_FRONT ),          MN( SPR_BTWDN_Y_PILLAR ),          MN( 0x0 ),
 };
 
-static const PalSpriteID _bridge_sprite_table_0_1[] = {
-	{  0x9EE, PAL_NONE }, {  0x9ED, PAL_NONE }, {  0x9F0, PAL_NONE }, {  0x9EF, PAL_NONE },
-	{  0x9EA, PAL_NONE }, {  0x9E9, PAL_NONE }, {  0x9EB, PAL_NONE }, {  0x9EC, PAL_NONE },
-	{  0x9E6, PAL_NONE }, {  0x9E5, PAL_NONE }, {  0x9E8, PAL_NONE }, {  0x9E7, PAL_NONE },
-	{  0x9E2, PAL_NONE }, {  0x9E1, PAL_NONE }, {  0x9E3, PAL_NONE }, {  0x9E4, PAL_NONE },
-	{ 0x1105, PAL_NONE }, { 0x1104, PAL_NONE }, { 0x1107, PAL_NONE }, { 0x1106, PAL_NONE },
-	{ 0x1101, PAL_NONE }, { 0x1100, PAL_NONE }, { 0x1102, PAL_NONE }, { 0x1103, PAL_NONE },
-	{ 0x112D, PAL_NONE }, { 0x112C, PAL_NONE }, { 0x112F, PAL_NONE }, { 0x112E, PAL_NONE },
-	{ 0x1129, PAL_NONE }, { 0x1128, PAL_NONE }, { 0x112A, PAL_NONE }, { 0x112B, PAL_NONE },
+static const PalSpriteID _bridge_sprite_table_wood_heads[] = {
+	MN( SPR_BTWDN_RAIL_X_SLOPE_UP  ),   MN( SPR_BTWDN_RAIL_Y_SLOPE_UP  ), MN( SPR_BTWDN_RAIL_X_SLOPE_DOWN ), MN( SPR_BTWDN_RAIL_Y_SLOPE_DOWN ),
+	MN( SPR_BTWDN_RAIL_RAMP_X_DOWN ),   MN( SPR_BTWDN_RAIL_RAMP_Y_DOWN ), MN( SPR_BTWDN_RAIL_RAMP_X_UP    ), MN( SPR_BTWDN_RAIL_RAMP_Y_UP    ),
+	MN( SPR_BTWDN_ROAD_X_SLOPE_UP  ),   MN( SPR_BTWDN_ROAD_Y_SLOPE_UP  ), MN( SPR_BTWDN_ROAD_X_SLOPE_DOWN ), MN( SPR_BTWDN_ROAD_Y_SLOPE_DOWN ),
+	MN( SPR_BTWDN_ROAD_RAMP_X_DOWN ),   MN( SPR_BTWDN_ROAD_RAMP_Y_DOWN ), MN( SPR_BTWDN_ROAD_RAMP_X_UP    ), MN( SPR_BTWDN_ROAD_RAMP_Y_UP    ),
+	MN( SPR_BTWDN_MONO_X_SLOPE_UP  ),   MN( SPR_BTWDN_MONO_Y_SLOPE_UP  ), MN( SPR_BTWDN_MONO_X_SLOPE_DOWN ), MN( SPR_BTWDN_MONO_Y_SLOPE_DOWN ),
+	MN( SPR_BTWDN_MONO_RAMP_X_DOWN ),   MN( SPR_BTWDN_MONO_RAMP_Y_DOWN ), MN( SPR_BTWDN_MONO_RAMP_X_UP    ), MN( SPR_BTWDN_MONO_RAMP_Y_UP    ),
+	MN( SPR_BTWDN_MGLV_X_SLOPE_UP  ),   MN( SPR_BTWDN_MGLV_Y_SLOPE_UP  ), MN( SPR_BTWDN_MGLV_X_SLOPE_DOWN ), MN( SPR_BTWDN_MGLV_Y_SLOPE_DOWN ),
+	MN( SPR_BTWDN_MGLV_RAMP_X_DOWN ),   MN( SPR_BTWDN_MGLV_RAMP_Y_DOWN ), MN( SPR_BTWDN_MGLV_RAMP_X_UP    ), MN( SPR_BTWDN_MGLV_RAMP_Y_UP    ),
 };
 
-static const PalSpriteID _bridge_sprite_table_1_0[] = {
-	{  0x9BD, PALETTE_TO_STRUCT_RED }, { 0x9C1, PALETTE_TO_STRUCT_RED }, {     0x9C9, PAL_NONE }, {    0x0, PAL_NONE },
-	{  0x9BE, PALETTE_TO_STRUCT_RED }, { 0x9C2, PALETTE_TO_STRUCT_RED }, {     0x9CA, PAL_NONE }, {    0x0, PAL_NONE },
-	{  0x9BF, PALETTE_TO_STRUCT_RED }, { 0x9C1, PALETTE_TO_STRUCT_RED }, {     0x9C9, PAL_NONE }, {    0x0, PAL_NONE },
-	{  0x9C0, PALETTE_TO_STRUCT_RED }, { 0x9C2, PALETTE_TO_STRUCT_RED }, {     0x9CA, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x10F8, PALETTE_TO_STRUCT_RED }, { 0x9C1, PALETTE_TO_STRUCT_RED }, {     0x9C9, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x10F9, PALETTE_TO_STRUCT_RED }, { 0x9C2, PALETTE_TO_STRUCT_RED }, {     0x9CA, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x1120, PALETTE_TO_STRUCT_RED }, { 0x9C1, PALETTE_TO_STRUCT_RED }, {     0x9C9, PAL_NONE }, {    0x0, PAL_NONE },
-	{ 0x1121, PALETTE_TO_STRUCT_RED }, { 0x9C2, PALETTE_TO_STRUCT_RED }, {     0x9CA, PAL_NONE }, {    0x0, PAL_NONE },
+static const PalSpriteID _bridge_sprite_table_concrete_middle[] = {
+	MR( SPR_BTCON_RAIL_X ),             MR( SPR_BTCON_X_FRONT ),          MN( SPR_BTCON_X_PILLAR ),          MN( 0x0 ),
+	MR( SPR_BTCON_RAIL_Y ),             MR( SPR_BTCON_Y_FRONT ),          MN( SPR_BTCON_Y_PILLAR ),          MN( 0x0 ),
+	MR( SPR_BTCON_ROAD_X ),             MR( SPR_BTCON_X_FRONT ),          MN( SPR_BTCON_X_PILLAR ),          MN( 0x0 ),
+	MR( SPR_BTCON_ROAD_Y ),             MR( SPR_BTCON_Y_FRONT ),          MN( SPR_BTCON_Y_PILLAR ),          MN( 0x0 ),
+	MR( SPR_BTCON_MONO_X ),             MR( SPR_BTCON_X_FRONT ),          MN( SPR_BTCON_X_PILLAR ),          MN( 0x0 ),
+	MR( SPR_BTCON_MONO_Y ),             MR( SPR_BTCON_Y_FRONT ),          MN( SPR_BTCON_Y_PILLAR ),          MN( 0x0 ),
+	MR( SPR_BTCON_MGLV_X ),             MR( SPR_BTCON_X_FRONT ),          MN( SPR_BTCON_X_PILLAR ),          MN( 0x0 ),
+	MR( SPR_BTCON_MGLV_Y ),             MR( SPR_BTCON_Y_FRONT ),          MN( SPR_BTCON_Y_PILLAR ),          MN( 0x0 ),
+};
+
+static const PalSpriteID _bridge_sprite_table_concrete_heads[] = {
+	MN( SPR_BTGEN_RAIL_X_SLOPE_UP  ),   MN( SPR_BTGEN_RAIL_Y_SLOPE_UP  ), MN( SPR_BTGEN_RAIL_X_SLOPE_DOWN ), MN( SPR_BTGEN_RAIL_Y_SLOPE_DOWN ),
+	MN( SPR_BTGEN_RAIL_RAMP_X_DOWN ),   MN( SPR_BTGEN_RAIL_RAMP_Y_DOWN ), MN( SPR_BTGEN_RAIL_RAMP_X_UP    ), MN( SPR_BTGEN_RAIL_RAMP_Y_UP    ),
+	MR( SPR_BTGEN_ROAD_X_SLOPE_UP  ),   MR( SPR_BTGEN_ROAD_Y_SLOPE_UP  ), MR( SPR_BTGEN_ROAD_X_SLOPE_DOWN ), MR( SPR_BTGEN_ROAD_Y_SLOPE_DOWN ),
+	MR( SPR_BTGEN_ROAD_RAMP_X_DOWN ),   MR( SPR_BTGEN_ROAD_RAMP_Y_DOWN ), MR( SPR_BTGEN_ROAD_RAMP_X_UP    ), MR( SPR_BTGEN_ROAD_RAMP_Y_UP    ),
+	MR( SPR_BTGEN_MONO_X_SLOPE_UP  ),   MR( SPR_BTGEN_MONO_Y_SLOPE_UP  ), MR( SPR_BTGEN_MONO_X_SLOPE_DOWN ), MR( SPR_BTGEN_MONO_Y_SLOPE_DOWN ),
+	MR( SPR_BTGEN_MONO_RAMP_X_DOWN ),   MR( SPR_BTGEN_MONO_RAMP_Y_DOWN ), MR( SPR_BTGEN_MONO_RAMP_X_UP    ), MR( SPR_BTGEN_MONO_RAMP_Y_UP    ),
+	MR( SPR_BTGEN_MGLV_X_SLOPE_UP  ),   MR( SPR_BTGEN_MGLV_Y_SLOPE_UP  ), MR( SPR_BTGEN_MGLV_X_SLOPE_DOWN ), MR( SPR_BTGEN_MGLV_Y_SLOPE_DOWN ),
+	MR( SPR_BTGEN_MGLV_RAMP_X_DOWN ),   MR( SPR_BTGEN_MGLV_RAMP_Y_DOWN ), MR( SPR_BTGEN_MGLV_RAMP_X_UP    ), MR( SPR_BTGEN_MGLV_RAMP_Y_UP    ),
+};
+
+static const PalSpriteID _bridge_sprite_table_archgirder_middle[] = {
+	MN( SPR_BTSGA_RAIL_X_REAR ),        MN( SPR_BTSGA_X_FRONT ),          MN( SPR_BTSGA_X_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTSGA_RAIL_Y_REAR ),        MN( SPR_BTSGA_Y_FRONT ),          MN( SPR_BTSGA_Y_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTSGA_ROAD_X_REAR ),        MN( SPR_BTSGA_X_FRONT ),          MN( SPR_BTSGA_X_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTSGA_ROAD_Y_REAR ),        MN( SPR_BTSGA_Y_FRONT ),          MN( SPR_BTSGA_Y_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTSGA_MONO_X_REAR ),        MN( SPR_BTSGA_X_FRONT ),          MN( SPR_BTSGA_X_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTSGA_MONO_Y_REAR ),        MN( SPR_BTSGA_Y_FRONT ),          MN( SPR_BTSGA_Y_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTSGA_MGLV_X_REAR ),        MN( SPR_BTSGA_X_FRONT ),          MN( SPR_BTSGA_X_PILLAR ),          MN( 0x0 ),
+	MN( SPR_BTSGA_MGLV_Y_REAR ),        MN( SPR_BTSGA_Y_FRONT ),          MN( SPR_BTSGA_Y_PILLAR ),          MN( 0x0 ),
+};
+
+static const PalSpriteID _bridge_sprite_table_archgirder_heads[] = {
+	MN( SPR_BTGEN_RAIL_X_SLOPE_UP  ),   MN( SPR_BTGEN_RAIL_Y_SLOPE_UP  ), MN( SPR_BTGEN_RAIL_X_SLOPE_DOWN ), MN( SPR_BTGEN_RAIL_Y_SLOPE_DOWN ),
+	MN( SPR_BTGEN_RAIL_RAMP_X_DOWN ),   MN( SPR_BTGEN_RAIL_RAMP_Y_DOWN ), MN( SPR_BTGEN_RAIL_RAMP_X_UP    ), MN( SPR_BTGEN_RAIL_RAMP_Y_UP    ),
+	MW( SPR_BTGEN_ROAD_X_SLOPE_UP  ),   MW( SPR_BTGEN_ROAD_Y_SLOPE_UP  ), MW( SPR_BTGEN_ROAD_X_SLOPE_DOWN ), MW( SPR_BTGEN_ROAD_Y_SLOPE_DOWN ),
+	MW( SPR_BTGEN_ROAD_RAMP_X_DOWN ),   MW( SPR_BTGEN_ROAD_RAMP_Y_DOWN ), MW( SPR_BTGEN_ROAD_RAMP_X_UP    ), MW( SPR_BTGEN_ROAD_RAMP_Y_UP    ),
+	MW( SPR_BTGEN_MONO_X_SLOPE_UP  ),   MW( SPR_BTGEN_MONO_Y_SLOPE_UP  ), MW( SPR_BTGEN_MONO_X_SLOPE_DOWN ), MW( SPR_BTGEN_MONO_Y_SLOPE_DOWN ),
+	MW( SPR_BTGEN_MONO_RAMP_X_DOWN ),   MW( SPR_BTGEN_MONO_RAMP_Y_DOWN ), MW( SPR_BTGEN_MONO_RAMP_X_UP    ), MW( SPR_BTGEN_MONO_RAMP_Y_UP    ),
+	MW( SPR_BTGEN_MGLV_X_SLOPE_UP  ),   MW( SPR_BTGEN_MGLV_Y_SLOPE_UP  ), MW( SPR_BTGEN_MGLV_X_SLOPE_DOWN ), MW( SPR_BTGEN_MGLV_Y_SLOPE_DOWN ),
+	MW( SPR_BTGEN_MGLV_RAMP_X_DOWN ),   MW( SPR_BTGEN_MGLV_RAMP_Y_DOWN ), MW( SPR_BTGEN_MGLV_RAMP_X_UP    ), MW( SPR_BTGEN_MGLV_RAMP_Y_UP    ),
+};
+
+static const PalSpriteID _bridge_sprite_table_concrete_suspended_A[] = {
+	MC( SPR_BTSUS_RAIL_X_REAR_TILE_A ), MC( SPR_BTSUS_X_FRONT_TILE_A ),   MC( SPR_BTSUS_X_PILLAR_TILE_A ),   MN( 0x0 ),
+	MC( SPR_BTSUS_RAIL_Y_REAR_TILE_A ), MC( SPR_BTSUS_Y_FRONT_TILE_A ),   MC( SPR_BTSUS_Y_PILLAR_TILE_A ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_X_REAR_TILE_A ), MC( SPR_BTSUS_X_FRONT_TILE_A ),   MC( SPR_BTSUS_X_PILLAR_TILE_A ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_Y_REAR_TILE_A ), MC( SPR_BTSUS_Y_FRONT_TILE_A ),   MC( SPR_BTSUS_Y_PILLAR_TILE_A ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_X_REAR_TILE_A ), MC( SPR_BTSUS_X_FRONT_TILE_A ),   MC( SPR_BTSUS_X_PILLAR_TILE_A ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_Y_REAR_TILE_A ), MC( SPR_BTSUS_Y_FRONT_TILE_A ),   MC( SPR_BTSUS_Y_PILLAR_TILE_A ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_X_REAR_TILE_A ), MC( SPR_BTSUS_X_FRONT_TILE_A ),   MC( SPR_BTSUS_X_PILLAR_TILE_A ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_Y_REAR_TILE_A ), MC( SPR_BTSUS_Y_FRONT_TILE_A ),   MC( SPR_BTSUS_Y_PILLAR_TILE_A ),   MN( 0x0 ),
+};
+
+static const PalSpriteID _bridge_sprite_table_concrete_suspended_B[] = {
+	MC( SPR_BTSUS_RAIL_X_REAR_TILE_B ), MC( SPR_BTSUS_X_FRONT_TILE_B ),   MC( SPR_BTSUS_X_PILLAR_TILE_B ),   MN( 0x0 ),
+	MC( SPR_BTSUS_RAIL_Y_REAR_TILE_B ), MC( SPR_BTSUS_Y_FRONT_TILE_B ),   MC( SPR_BTSUS_Y_PILLAR_TILE_B ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_X_REAR_TILE_B ), MC( SPR_BTSUS_X_FRONT_TILE_B ),   MC( SPR_BTSUS_X_PILLAR_TILE_B ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_Y_REAR_TILE_B ), MC( SPR_BTSUS_Y_FRONT_TILE_B ),   MC( SPR_BTSUS_Y_PILLAR_TILE_B ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_X_REAR_TILE_B ), MC( SPR_BTSUS_X_FRONT_TILE_B ),   MC( SPR_BTSUS_X_PILLAR_TILE_B ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_Y_REAR_TILE_B ), MC( SPR_BTSUS_Y_FRONT_TILE_B ),   MC( SPR_BTSUS_Y_PILLAR_TILE_B ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_X_REAR_TILE_B ), MC( SPR_BTSUS_X_FRONT_TILE_B ),   MC( SPR_BTSUS_X_PILLAR_TILE_B ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_Y_REAR_TILE_B ), MC( SPR_BTSUS_Y_FRONT_TILE_B ),   MC( SPR_BTSUS_Y_PILLAR_TILE_B ),   MN( 0x0 ),
+};
+
+static const PalSpriteID _bridge_sprite_table_concrete_suspended_C[] = {
+	MC( SPR_BTSUS_RAIL_X_REAR_TILE_C ), MC( SPR_BTSUS_X_FRONT_TILE_C ),   MC( SPR_BTSUS_X_PILLAR_TILE_C ),   MN( 0x0 ),
+	MC( SPR_BTSUS_RAIL_Y_REAR_TILE_C ), MC( SPR_BTSUS_Y_FRONT_TILE_C ),   MC( SPR_BTSUS_Y_PILLAR_TILE_C ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_X_REAR_TILE_C ), MC( SPR_BTSUS_X_FRONT_TILE_C ),   MC( SPR_BTSUS_X_PILLAR_TILE_C ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_Y_REAR_TILE_C ), MC( SPR_BTSUS_Y_FRONT_TILE_C ),   MC( SPR_BTSUS_Y_PILLAR_TILE_C ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_X_REAR_TILE_C ), MC( SPR_BTSUS_X_FRONT_TILE_C ),   MC( SPR_BTSUS_X_PILLAR_TILE_C ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_Y_REAR_TILE_C ), MC( SPR_BTSUS_Y_FRONT_TILE_C ),   MC( SPR_BTSUS_Y_PILLAR_TILE_C ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_X_REAR_TILE_C ), MC( SPR_BTSUS_X_FRONT_TILE_C ),   MC( SPR_BTSUS_X_PILLAR_TILE_C ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_Y_REAR_TILE_C ), MC( SPR_BTSUS_Y_FRONT_TILE_C ),   MC( SPR_BTSUS_Y_PILLAR_TILE_C ),   MN( 0x0 ),
+};
+
+static const PalSpriteID _bridge_sprite_table_concrete_suspended_D[] = {
+	MC( SPR_BTSUS_RAIL_X_REAR_TILE_D ), MC( SPR_BTSUS_X_FRONT_TILE_D ),   MC( SPR_BTSUS_X_PILLAR_TILE_D ),   MN( 0x0 ),
+	MC( SPR_BTSUS_RAIL_Y_REAR_TILE_D ), MC( SPR_BTSUS_Y_FRONT_TILE_D ),   MC( SPR_BTSUS_Y_PILLAR_TILE_D ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_X_REAR_TILE_D ), MC( SPR_BTSUS_X_FRONT_TILE_D ),   MC( SPR_BTSUS_X_PILLAR_TILE_D ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_Y_REAR_TILE_D ), MC( SPR_BTSUS_Y_FRONT_TILE_D ),   MC( SPR_BTSUS_Y_PILLAR_TILE_D ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_X_REAR_TILE_D ), MC( SPR_BTSUS_X_FRONT_TILE_D ),   MC( SPR_BTSUS_X_PILLAR_TILE_D ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_Y_REAR_TILE_D ), MC( SPR_BTSUS_Y_FRONT_TILE_D ),   MC( SPR_BTSUS_Y_PILLAR_TILE_D ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_X_REAR_TILE_D ), MC( SPR_BTSUS_X_FRONT_TILE_D ),   MC( SPR_BTSUS_X_PILLAR_TILE_D ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_Y_REAR_TILE_D ), MC( SPR_BTSUS_Y_FRONT_TILE_D ),   MC( SPR_BTSUS_Y_PILLAR_TILE_D ),   MN( 0x0 ),
+};
+
+static const PalSpriteID _bridge_sprite_table_concrete_suspended_E[] = {
+	MC( SPR_BTSUS_RAIL_X_REAR_TILE_E ), MC( SPR_BTSUS_X_FRONT_TILE_E ),   MC( SPR_BTSUS_X_PILLAR_TILE_E ),   MN( 0x0 ),
+	MC( SPR_BTSUS_RAIL_Y_REAR_TILE_E ), MC( SPR_BTSUS_Y_FRONT_TILE_E ),   MC( SPR_BTSUS_Y_PILLAR_TILE_E ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_X_REAR_TILE_E ), MC( SPR_BTSUS_X_FRONT_TILE_E ),   MC( SPR_BTSUS_X_PILLAR_TILE_E ),   MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_Y_REAR_TILE_E ), MC( SPR_BTSUS_Y_FRONT_TILE_E ),   MC( SPR_BTSUS_Y_PILLAR_TILE_E ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_X_REAR_TILE_E ), MC( SPR_BTSUS_X_FRONT_TILE_E ),   MC( SPR_BTSUS_X_PILLAR_TILE_E ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_Y_REAR_TILE_E ), MC( SPR_BTSUS_Y_FRONT_TILE_E ),   MC( SPR_BTSUS_Y_PILLAR_TILE_E ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_X_REAR_TILE_E ), MC( SPR_BTSUS_X_FRONT_TILE_E ),   MC( SPR_BTSUS_X_PILLAR_TILE_E ),   MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_Y_REAR_TILE_E ), MC( SPR_BTSUS_Y_FRONT_TILE_E ),   MC( SPR_BTSUS_Y_PILLAR_TILE_E ),   MN( 0x0 ),
+};
+
+static const PalSpriteID _bridge_sprite_table_concrete_suspended_F[] = {
+	MC( SPR_BTSUS_RAIL_X_REAR_TILE_F ), MC( SPR_BTSUS_X_FRONT ),          MN( 0x0 ),                         MN( 0x0 ),
+	MC( SPR_BTSUS_RAIL_Y_REAR_TILE_F ), MC( SPR_BTSUS_Y_FRONT ),          MN( 0x0 ),                         MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_X_REAR_TILE_F ), MC( SPR_BTSUS_X_FRONT ),          MN( 0x0 ),                         MN( 0x0 ),
+	MC( SPR_BTSUS_ROAD_Y_REAR_TILE_F ), MC( SPR_BTSUS_Y_FRONT ),          MN( 0x0 ),                         MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_X_REAR_TILE_F ), MC( SPR_BTSUS_X_FRONT ),          MN( 0x0 ),                         MN( 0x0 ),
+	MC( SPR_BTSUS_MONO_Y_REAR_TILE_F ), MC( SPR_BTSUS_Y_FRONT ),          MN( 0x0 ),                         MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_X_REAR_TILE_F ), MC( SPR_BTSUS_X_FRONT ),          MN( 0x0 ),                         MN( 0x0 ),
+	MC( SPR_BTSUS_MGLV_Y_REAR_TILE_F ), MC( SPR_BTSUS_Y_FRONT ),          MN( 0x0 ),                         MN( 0x0 ),
+};
+
+static const PalSpriteID _bridge_sprite_table_concrete_suspended_heads[] = {
+	MN( SPR_BTGEN_RAIL_X_SLOPE_UP  ),   MN( SPR_BTGEN_RAIL_Y_SLOPE_UP  ), MN( SPR_BTGEN_RAIL_X_SLOPE_DOWN ), MN( SPR_BTGEN_RAIL_Y_SLOPE_DOWN ),
+	MN( SPR_BTGEN_RAIL_RAMP_X_DOWN ),   MN( SPR_BTGEN_RAIL_RAMP_Y_DOWN ), MN( SPR_BTGEN_RAIL_RAMP_X_UP    ), MN( SPR_BTGEN_RAIL_RAMP_Y_UP    ),
+	MC( SPR_BTGEN_ROAD_X_SLOPE_UP  ),   MC( SPR_BTGEN_ROAD_Y_SLOPE_UP  ), MC( SPR_BTGEN_ROAD_X_SLOPE_DOWN ), MC( SPR_BTGEN_ROAD_Y_SLOPE_DOWN ),
+	MC( SPR_BTGEN_ROAD_RAMP_X_DOWN ),   MC( SPR_BTGEN_ROAD_RAMP_Y_DOWN ), MC( SPR_BTGEN_ROAD_RAMP_X_UP    ), MC( SPR_BTGEN_ROAD_RAMP_Y_UP    ),
+	MC( SPR_BTGEN_MONO_X_SLOPE_UP  ),   MC( SPR_BTGEN_MONO_Y_SLOPE_UP  ), MC( SPR_BTGEN_MONO_X_SLOPE_DOWN ), MC( SPR_BTGEN_MONO_Y_SLOPE_DOWN ),
+	MC( SPR_BTGEN_MONO_RAMP_X_DOWN ),   MC( SPR_BTGEN_MONO_RAMP_Y_DOWN ), MC( SPR_BTGEN_MONO_RAMP_X_UP    ), MC( SPR_BTGEN_MONO_RAMP_Y_UP    ),
+	MC( SPR_BTGEN_MGLV_X_SLOPE_UP  ),   MC( SPR_BTGEN_MGLV_Y_SLOPE_UP  ), MC( SPR_BTGEN_MGLV_X_SLOPE_DOWN ), MC( SPR_BTGEN_MGLV_Y_SLOPE_DOWN ),
+	MC( SPR_BTGEN_MGLV_RAMP_X_DOWN ),   MC( SPR_BTGEN_MGLV_RAMP_Y_DOWN ), MC( SPR_BTGEN_MGLV_RAMP_X_UP    ), MC( SPR_BTGEN_MGLV_RAMP_Y_UP    ),
 };
 
 static const PalSpriteID _bridge_sprite_table_9_0[] = {
@@ -497,79 +502,79 @@
 };
 
 static const PalSpriteID _bridge_sprite_table_11_0[] = {
-    {  0xA0B, PALETTE_TO_STRUCT_YELLOW }, {     0xA01, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA0C, PALETTE_TO_STRUCT_YELLOW }, {     0xA02, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA11, PALETTE_TO_STRUCT_YELLOW }, {     0xA01, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA12, PALETTE_TO_STRUCT_YELLOW }, {     0xA02, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA17, PALETTE_TO_STRUCT_YELLOW }, {     0xA01, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA18, PALETTE_TO_STRUCT_YELLOW }, {     0xA02, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA1D, PALETTE_TO_STRUCT_YELLOW }, {     0xA01, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA1E, PALETTE_TO_STRUCT_YELLOW }, {     0xA02, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA0B, PALETTE_TO_STRUCT_YELLOW }, {     0xA01, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA0C, PALETTE_TO_STRUCT_YELLOW }, {     0xA02, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA11, PALETTE_TO_STRUCT_YELLOW }, {     0xA01, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA12, PALETTE_TO_STRUCT_YELLOW }, {     0xA02, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA17, PALETTE_TO_STRUCT_YELLOW }, {     0xA01, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA18, PALETTE_TO_STRUCT_YELLOW }, {     0xA02, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA1D, PALETTE_TO_STRUCT_YELLOW }, {     0xA01, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA1E, PALETTE_TO_STRUCT_YELLOW }, {     0xA02, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
 };
 
 static const PalSpriteID _bridge_sprite_table_11_1[] = {
-    {  0xA09, PALETTE_TO_STRUCT_YELLOW }, {     0x9FF, PALETTE_TO_STRUCT_YELLOW }, {     0xA05, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA0E, PALETTE_TO_STRUCT_YELLOW }, {     0xA04, PALETTE_TO_STRUCT_YELLOW }, {     0xA08, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA0F, PALETTE_TO_STRUCT_YELLOW }, {     0x9FF, PALETTE_TO_STRUCT_YELLOW }, {     0xA05, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA14, PALETTE_TO_STRUCT_YELLOW }, {     0xA04, PALETTE_TO_STRUCT_YELLOW }, {     0xA08, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA15, PALETTE_TO_STRUCT_YELLOW }, {     0x9FF, PALETTE_TO_STRUCT_YELLOW }, {     0xA05, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA1A, PALETTE_TO_STRUCT_YELLOW }, {     0xA04, PALETTE_TO_STRUCT_YELLOW }, {     0xA08, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA1B, PALETTE_TO_STRUCT_YELLOW }, {     0x9FF, PALETTE_TO_STRUCT_YELLOW }, {     0xA05, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA20, PALETTE_TO_STRUCT_YELLOW }, {     0xA04, PALETTE_TO_STRUCT_YELLOW }, {     0xA08, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA09, PALETTE_TO_STRUCT_YELLOW }, {     0x9FF, PALETTE_TO_STRUCT_YELLOW }, {     0xA05, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA0E, PALETTE_TO_STRUCT_YELLOW }, {     0xA04, PALETTE_TO_STRUCT_YELLOW }, {     0xA08, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA0F, PALETTE_TO_STRUCT_YELLOW }, {     0x9FF, PALETTE_TO_STRUCT_YELLOW }, {     0xA05, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA14, PALETTE_TO_STRUCT_YELLOW }, {     0xA04, PALETTE_TO_STRUCT_YELLOW }, {     0xA08, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA15, PALETTE_TO_STRUCT_YELLOW }, {     0x9FF, PALETTE_TO_STRUCT_YELLOW }, {     0xA05, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA1A, PALETTE_TO_STRUCT_YELLOW }, {     0xA04, PALETTE_TO_STRUCT_YELLOW }, {     0xA08, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA1B, PALETTE_TO_STRUCT_YELLOW }, {     0x9FF, PALETTE_TO_STRUCT_YELLOW }, {     0xA05, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA20, PALETTE_TO_STRUCT_YELLOW }, {     0xA04, PALETTE_TO_STRUCT_YELLOW }, {     0xA08, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
 };
 
 static const PalSpriteID _bridge_sprite_table_11_2[] = {
-    {  0xA0A, PALETTE_TO_STRUCT_YELLOW }, {     0xA00, PALETTE_TO_STRUCT_YELLOW }, {     0xA06, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA0D, PALETTE_TO_STRUCT_YELLOW }, {     0xA03, PALETTE_TO_STRUCT_YELLOW }, {     0xA07, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA10, PALETTE_TO_STRUCT_YELLOW }, {     0xA00, PALETTE_TO_STRUCT_YELLOW }, {     0xA06, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA13, PALETTE_TO_STRUCT_YELLOW }, {     0xA03, PALETTE_TO_STRUCT_YELLOW }, {     0xA07, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA16, PALETTE_TO_STRUCT_YELLOW }, {     0xA00, PALETTE_TO_STRUCT_YELLOW }, {     0xA06, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA19, PALETTE_TO_STRUCT_YELLOW }, {     0xA03, PALETTE_TO_STRUCT_YELLOW }, {     0xA07, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA1C, PALETTE_TO_STRUCT_YELLOW }, {     0xA00, PALETTE_TO_STRUCT_YELLOW }, {     0xA06, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
-    {  0xA1F, PALETTE_TO_STRUCT_YELLOW }, {     0xA03, PALETTE_TO_STRUCT_YELLOW }, {     0xA07, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA0A, PALETTE_TO_STRUCT_YELLOW }, {     0xA00, PALETTE_TO_STRUCT_YELLOW }, {     0xA06, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA0D, PALETTE_TO_STRUCT_YELLOW }, {     0xA03, PALETTE_TO_STRUCT_YELLOW }, {     0xA07, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA10, PALETTE_TO_STRUCT_YELLOW }, {     0xA00, PALETTE_TO_STRUCT_YELLOW }, {     0xA06, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA13, PALETTE_TO_STRUCT_YELLOW }, {     0xA03, PALETTE_TO_STRUCT_YELLOW }, {     0xA07, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA16, PALETTE_TO_STRUCT_YELLOW }, {     0xA00, PALETTE_TO_STRUCT_YELLOW }, {     0xA06, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA19, PALETTE_TO_STRUCT_YELLOW }, {     0xA03, PALETTE_TO_STRUCT_YELLOW }, {     0xA07, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA1C, PALETTE_TO_STRUCT_YELLOW }, {     0xA00, PALETTE_TO_STRUCT_YELLOW }, {     0xA06, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
+	{  0xA1F, PALETTE_TO_STRUCT_YELLOW }, {     0xA03, PALETTE_TO_STRUCT_YELLOW }, {     0xA07, PALETTE_TO_STRUCT_YELLOW }, {       0x0, PAL_NONE },
 };
 
 static const PalSpriteID _bridge_sprite_table_12_0[] = {
-    {  0xA0B, PALETTE_TO_STRUCT_GREY }, {     0xA01, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA0C, PALETTE_TO_STRUCT_GREY }, {     0xA02, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA11, PALETTE_TO_STRUCT_GREY }, {     0xA01, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA12, PALETTE_TO_STRUCT_GREY }, {     0xA02, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA17, PALETTE_TO_STRUCT_GREY }, {     0xA01, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA18, PALETTE_TO_STRUCT_GREY }, {     0xA02, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA1D, PALETTE_TO_STRUCT_GREY }, {     0xA01, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
-    {  0xA1E, PALETTE_TO_STRUCT_GREY }, {     0xA02, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA0B, PALETTE_TO_STRUCT_GREY }, {     0xA01, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA0C, PALETTE_TO_STRUCT_GREY }, {     0xA02, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA11, PALETTE_TO_STRUCT_GREY }, {     0xA01, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA12, PALETTE_TO_STRUCT_GREY }, {     0xA02, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA17, PALETTE_TO_STRUCT_GREY }, {     0xA01, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA18, PALETTE_TO_STRUCT_GREY }, {     0xA02, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA1D, PALETTE_TO_STRUCT_GREY }, {     0xA01, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
+	{  0xA1E, PALETTE_TO_STRUCT_GREY }, {     0xA02, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE }, {    0x0, PAL_NONE },
 };
 
 static const PalSpriteID _bridge_sprite_table_12_1[] = {
-    {  0xA09, PALETTE_TO_STRUCT_GREY }, {     0x9FF, PALETTE_TO_STRUCT_GREY }, {     0xA05, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA0E, PALETTE_TO_STRUCT_GREY }, {     0xA04, PALETTE_TO_STRUCT_GREY }, {     0xA08, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA0F, PALETTE_TO_STRUCT_GREY }, {     0x9FF, PALETTE_TO_STRUCT_GREY }, {     0xA05, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA14, PALETTE_TO_STRUCT_GREY }, {     0xA04, PALETTE_TO_STRUCT_GREY }, {     0xA08, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA15, PALETTE_TO_STRUCT_GREY }, {     0x9FF, PALETTE_TO_STRUCT_GREY }, {     0xA05, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA1A, PALETTE_TO_STRUCT_GREY }, {     0xA04, PALETTE_TO_STRUCT_GREY }, {     0xA08, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA1B, PALETTE_TO_STRUCT_GREY }, {     0x9FF, PALETTE_TO_STRUCT_GREY }, {     0xA05, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA20, PALETTE_TO_STRUCT_GREY }, {     0xA04, PALETTE_TO_STRUCT_GREY }, {     0xA08, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA09, PALETTE_TO_STRUCT_GREY }, {     0x9FF, PALETTE_TO_STRUCT_GREY }, {     0xA05, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA0E, PALETTE_TO_STRUCT_GREY }, {     0xA04, PALETTE_TO_STRUCT_GREY }, {     0xA08, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA0F, PALETTE_TO_STRUCT_GREY }, {     0x9FF, PALETTE_TO_STRUCT_GREY }, {     0xA05, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA14, PALETTE_TO_STRUCT_GREY }, {     0xA04, PALETTE_TO_STRUCT_GREY }, {     0xA08, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA15, PALETTE_TO_STRUCT_GREY }, {     0x9FF, PALETTE_TO_STRUCT_GREY }, {     0xA05, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA1A, PALETTE_TO_STRUCT_GREY }, {     0xA04, PALETTE_TO_STRUCT_GREY }, {     0xA08, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA1B, PALETTE_TO_STRUCT_GREY }, {     0x9FF, PALETTE_TO_STRUCT_GREY }, {     0xA05, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA20, PALETTE_TO_STRUCT_GREY }, {     0xA04, PALETTE_TO_STRUCT_GREY }, {     0xA08, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
 };
 
 static const PalSpriteID _bridge_sprite_table_12_2[] = {
-    {  0xA0A, PALETTE_TO_STRUCT_GREY }, {     0xA00, PALETTE_TO_STRUCT_GREY }, {     0xA06, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA0D, PALETTE_TO_STRUCT_GREY }, {     0xA03, PALETTE_TO_STRUCT_GREY }, {     0xA07, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA10, PALETTE_TO_STRUCT_GREY }, {     0xA00, PALETTE_TO_STRUCT_GREY }, {     0xA06, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA13, PALETTE_TO_STRUCT_GREY }, {     0xA03, PALETTE_TO_STRUCT_GREY }, {     0xA07, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA16, PALETTE_TO_STRUCT_GREY }, {     0xA00, PALETTE_TO_STRUCT_GREY }, {     0xA06, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA19, PALETTE_TO_STRUCT_GREY }, {     0xA03, PALETTE_TO_STRUCT_GREY }, {     0xA07, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA1C, PALETTE_TO_STRUCT_GREY }, {     0xA00, PALETTE_TO_STRUCT_GREY }, {     0xA06, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
-    {  0xA1F, PALETTE_TO_STRUCT_GREY }, {     0xA03, PALETTE_TO_STRUCT_GREY }, {     0xA07, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA0A, PALETTE_TO_STRUCT_GREY }, {     0xA00, PALETTE_TO_STRUCT_GREY }, {     0xA06, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA0D, PALETTE_TO_STRUCT_GREY }, {     0xA03, PALETTE_TO_STRUCT_GREY }, {     0xA07, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA10, PALETTE_TO_STRUCT_GREY }, {     0xA00, PALETTE_TO_STRUCT_GREY }, {     0xA06, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA13, PALETTE_TO_STRUCT_GREY }, {     0xA03, PALETTE_TO_STRUCT_GREY }, {     0xA07, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA16, PALETTE_TO_STRUCT_GREY }, {     0xA00, PALETTE_TO_STRUCT_GREY }, {     0xA06, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA19, PALETTE_TO_STRUCT_GREY }, {     0xA03, PALETTE_TO_STRUCT_GREY }, {     0xA07, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA1C, PALETTE_TO_STRUCT_GREY }, {     0xA00, PALETTE_TO_STRUCT_GREY }, {     0xA06, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
+	{  0xA1F, PALETTE_TO_STRUCT_GREY }, {     0xA03, PALETTE_TO_STRUCT_GREY }, {     0xA07, PALETTE_TO_STRUCT_GREY }, {       0x0, PAL_NONE },
 };
 
-static const PalSpriteID * const _bridge_sprite_table_2[] = {
-	_bridge_sprite_table_2_0,
-	_bridge_sprite_table_2_0,
-	_bridge_sprite_table_2_0,
-	_bridge_sprite_table_2_0,
-	_bridge_sprite_table_2_0,
-	_bridge_sprite_table_2_0,
-	_bridge_sprite_table_2_1,
+static const PalSpriteID * const _bridge_sprite_table_archgirder[] = {
+	_bridge_sprite_table_archgirder_middle,
+	_bridge_sprite_table_archgirder_middle,
+	_bridge_sprite_table_archgirder_middle,
+	_bridge_sprite_table_archgirder_middle,
+	_bridge_sprite_table_archgirder_middle,
+	_bridge_sprite_table_archgirder_middle,
+	_bridge_sprite_table_archgirder_heads,
 };
 
 static const PalSpriteID * const _bridge_sprite_table_4[] = {
@@ -592,14 +597,14 @@
 	_bridge_sprite_table_5_6,
 };
 
-static const PalSpriteID * const _bridge_sprite_table_3[] = {
-	_bridge_sprite_table_3_0,
-	_bridge_sprite_table_3_1,
-	_bridge_sprite_table_3_2,
-	_bridge_sprite_table_3_3,
-	_bridge_sprite_table_3_4,
-	_bridge_sprite_table_3_5,
-	_bridge_sprite_table_3_6,
+static const PalSpriteID * const _bridge_sprite_table_concrete_suspended[] = {
+	_bridge_sprite_table_concrete_suspended_A,
+	_bridge_sprite_table_concrete_suspended_B,
+	_bridge_sprite_table_concrete_suspended_C,
+	_bridge_sprite_table_concrete_suspended_D,
+	_bridge_sprite_table_concrete_suspended_E,
+	_bridge_sprite_table_concrete_suspended_F,
+	_bridge_sprite_table_concrete_suspended_heads,
 };
 
 static const PalSpriteID * const _bridge_sprite_table_6[] = {
@@ -632,24 +637,24 @@
 	_bridge_sprite_table_8_3,
 };
 
-static const PalSpriteID * const _bridge_sprite_table_0[] = {
-	_bridge_sprite_table_0_0,
-	_bridge_sprite_table_0_0,
-	_bridge_sprite_table_0_0,
-	_bridge_sprite_table_0_0,
-	_bridge_sprite_table_0_0,
-	_bridge_sprite_table_0_0,
-	_bridge_sprite_table_0_1,
+static const PalSpriteID * const _bridge_sprite_table_wood[] = {
+	_bridge_sprite_table_wood_middle,
+	_bridge_sprite_table_wood_middle,
+	_bridge_sprite_table_wood_middle,
+	_bridge_sprite_table_wood_middle,
+	_bridge_sprite_table_wood_middle,
+	_bridge_sprite_table_wood_middle,
+	_bridge_sprite_table_wood_heads,
 };
 
-static const PalSpriteID * const _bridge_sprite_table_1[] = {
-	_bridge_sprite_table_1_0,
-	_bridge_sprite_table_1_0,
-	_bridge_sprite_table_1_0,
-	_bridge_sprite_table_1_0,
-	_bridge_sprite_table_1_0,
-	_bridge_sprite_table_1_0,
-	_bridge_sprite_table_1_1,
+static const PalSpriteID * const _bridge_sprite_table_concrete[] = {
+	_bridge_sprite_table_concrete_middle,
+	_bridge_sprite_table_concrete_middle,
+	_bridge_sprite_table_concrete_middle,
+	_bridge_sprite_table_concrete_middle,
+	_bridge_sprite_table_concrete_middle,
+	_bridge_sprite_table_concrete_middle,
+	_bridge_sprite_table_concrete_heads,
 };
 
 static const PalSpriteID * const _bridge_sprite_table_9[] = {
@@ -689,14 +694,14 @@
 	_bridge_sprite_table_12_2,
 	_bridge_sprite_table_12_2,
 	_bridge_sprite_table_12_2,
-	_bridge_sprite_table_3_6,
+	_bridge_sprite_table_concrete_suspended_heads,
 };
 
 static const PalSpriteID * const * const _bridge_sprite_table[MAX_BRIDGES] = {
-	_bridge_sprite_table_0,
-	_bridge_sprite_table_1,
-	_bridge_sprite_table_2,
-	_bridge_sprite_table_3,
+	_bridge_sprite_table_wood,
+	_bridge_sprite_table_concrete,
+	_bridge_sprite_table_archgirder,
+	_bridge_sprite_table_concrete_suspended,
 	_bridge_sprite_table_4,
 	_bridge_sprite_table_5,
 	_bridge_sprite_table_6,
@@ -707,3 +712,75 @@
 	_bridge_sprite_table_11,
 	_bridge_sprite_table_12
 };
+
+/** Describes the data that defines each bridge in the game
+ * @param y   year of availablity
+ * @param mnl minimum length
+ * @param mxl maximum length
+ * @param p   price
+ * @param mxs maximum speed allowed
+ * @param spr sprite to use in purchase GUI
+ * @param plt palette for the sprite in purchase GUI
+ * @param dsc description of the bridge in purchase GUI
+ * @param nrl description of the rail bridge in query tool
+ * @param nrd description of the road bridge in query tool
+ */
+#define MBR(y, mnl, mxl, p, mxs, spr, plt, dsc, nrl, nrd) \
+	{y, mnl, mxl, p, mxs, spr, plt, dsc, { nrl, nrd }, NULL, 0}
+
+const BridgeSpec _orig_bridge[] = {
+/*
+	       year of availablity
+	       |  minimum length
+	       |  |   maximum length
+	       |  |   |    price
+	       |  |   |    |    maximum speed
+	       |  |   |    |    |  sprite to use in GUI
+	       |  |   |    |    |  |      palette in GUI
+	   string with description        name on rail                             name on road
+	   |                              |                                        | */
+	MBR(   0, 0, 16,  80,  32, 0xA24, PAL_NONE,
+	   STR_5012_WOODEN,               STR_501F_WOODEN_RAIL_BRIDGE,             STR_5025_WOODEN_ROAD_BRIDGE),
+
+	MBR(   0, 0,  2, 112,  48, 0xA26, PALETTE_TO_STRUCT_RED,
+	   STR_5013_CONCRETE,             STR_5020_CONCRETE_RAIL_BRIDGE,           STR_5026_CONCRETE_ROAD_BRIDGE),
+
+	MBR(1930, 0,  5, 144,  64, 0xA25, PAL_NONE,
+	   STR_500F_GIRDER_STEEL,         STR_501C_STEEL_GIRDER_RAIL_BRIDGE,       STR_5022_STEEL_GIRDER_ROAD_BRIDGE),
+
+	MBR(   0, 2, 10, 168,  80, 0xA22, PALETTE_TO_STRUCT_CONCRETE,
+	   STR_5011_SUSPENSION_CONCRETE,  STR_501E_REINFORCED_CONCRETE_SUSPENSION, STR_5024_REINFORCED_CONCRETE_SUSPENSION),
+
+	MBR(1930, 3, 16, 185,  96, 0xA22, PAL_NONE,
+	   STR_500E_SUSPENSION_STEEL,     STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE,   STR_5021_STEEL_SUSPENSION_ROAD_BRIDGE),
+
+	MBR(1930, 3, 16, 192, 112, 0xA22, PALETTE_TO_STRUCT_YELLOW,
+	   STR_500E_SUSPENSION_STEEL,     STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE,   STR_5021_STEEL_SUSPENSION_ROAD_BRIDGE),
+
+	MBR(1930, 3,  7, 224, 160, 0xA23, PAL_NONE,
+	   STR_5010_CANTILEVER_STEEL,     STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE,   STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE),
+
+	MBR(1930, 3,  8, 232, 208, 0xA23, PALETTE_TO_STRUCT_BROWN,
+	   STR_5010_CANTILEVER_STEEL,     STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE,   STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE),
+
+	MBR(1930, 3,  9, 248, 240, 0xA23, PALETTE_TO_STRUCT_RED,
+	   STR_5010_CANTILEVER_STEEL,     STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE,   STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE),
+
+	MBR(1930, 0,  2, 240, 256, 0xA27, PAL_NONE,
+	   STR_500F_GIRDER_STEEL,         STR_501C_STEEL_GIRDER_RAIL_BRIDGE,       STR_5022_STEEL_GIRDER_ROAD_BRIDGE),
+
+	MBR(1995, 2, 16, 255, 320, 0xA28, PAL_NONE,
+	   STR_5014_TUBULAR_STEEL,        STR_5027_TUBULAR_RAIL_BRIDGE,            STR_5028_TUBULAR_ROAD_BRIDGE),
+
+	MBR(2005, 2, 32, 380, 512, 0xA28, PALETTE_TO_STRUCT_YELLOW,
+	   STR_5014_TUBULAR_STEEL,        STR_5027_TUBULAR_RAIL_BRIDGE,            STR_5028_TUBULAR_ROAD_BRIDGE),
+
+	MBR(2010, 2, 32, 510, 608, 0xA28, PALETTE_TO_STRUCT_GREY,
+	   STR_BRIDGE_TUBULAR_SILICON,    STR_5027_TUBULAR_RAIL_BRIDGE,            STR_5028_TUBULAR_ROAD_BRIDGE)
+};
+
+#undef MBR
+#undef MN
+#undef MR
+#undef MW
+#undef MC
--- a/src/table/engines.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/table/engines.h	Mon Mar 10 15:26:39 2008 +0000
@@ -7,6 +7,14 @@
  *  This file contains all the data for vehicles
  */
 
+enum {
+	RC_W = 0xFF, ///< Running cost price index (out of range) of wagons
+	RC_S = 0x2A, ///< Running cost price index of steam
+	RC_D = 0x2B, ///< Running cost price index of diesel
+	RC_E = 0x2C, ///< Running cost price index of electric
+	RC_R = 0x2E, ///< Running cost price index of road vehicles
+};
+
 /** Writes the properties of a train or road vehicle into the EngineInfo struct.
  * @see EngineInfo
  * @param a Introduction date
@@ -336,7 +344,7 @@
  * @param d max_speed (kph)
  * @param e power (hp)
  * @param f weight
- * @param g running_cost_base
+ * @param g running_cost
  * @param h running_cost_class
  * @param i capacity
  * @param j cargo_type
@@ -363,127 +371,127 @@
 #define L RAILTYPE_MAGLEV
 
 const RailVehicleInfo _orig_rail_vehicle_info[NUM_TRAIN_ENGINES] = {
-	//   image_index  max_speed (kph)      running_cost_base           ai_rank
-	//   |  flags     |        power (hp)  |  running_cost_class       |  railtype
-	//   |  |    base_cost     |    weight |  |   capacity             |  |
-	//   |  |    |    |        |    |      |  |   |  cargo_type        |  |  engclass
-	//   |  |    |    |        |    |      |  |   |  |                 |  |  |
-	RVI( 2, G,   7,  64,     300,  47,    50, S,  0, 0              ,  1, R, S), //   0
-	RVI(19, G,   8,  80,     600,  65,    65, D,  0, 0              ,  4, R, D), //   1
-	RVI( 2, G,  10,  72,     400,  85,    90, S,  0, 0              ,  7, R, S), //   2
-	RVI( 0, G,  15,  96,     900, 130,   130, S,  0, 0              , 19, R, S), //   3
-	RVI( 1, G,  19, 112,    1000, 140,   145, S,  0, 0              , 20, R, S), //   4
-	RVI(12, G,  16, 120,    1400,  95,   125, D,  0, 0              , 30, R, D), //   5
-	RVI(14, G,  20, 152,    2000, 120,   135, D,  0, 0              , 31, R, D), //   6
-	RVI( 3, G,  14,  88,    1100, 145,   130, S,  0, 0              , 19, R, S), //   7
-	RVI( 0, G,  13, 112,    1000, 131,   120, S,  0, 0              , 20, R, S), //   8
-	RVI( 1, G,  19, 128,    1200, 162,   140, S,  0, 0              , 21, R, S), //   9
-	RVI( 0, G,  22, 144,    1600, 170,   130, S,  0, 0              , 22, R, S), //  10
-	RVI( 8, M,  11, 112,   600/2,32/2,  85/2, D, 38, CT_PASSENGERS  , 10, R, D), //  11
-	RVI(10, M,  14, 120,   700/2,38/2,  70/2, D, 40, CT_PASSENGERS  , 11, R, D), //  12
-	RVI( 4, G,  15, 128,    1250,  72,    95, D,  0, 0              , 30, R, D), //  13
-	RVI( 5, G,  17, 144,    1750, 101,   120, D,  0, 0              , 31, R, D), //  14
-	RVI( 4, G,  18, 160,    2580, 112,   140, D,  0, 0              , 32, R, D), //  15
-	RVI(14, G,  23,  96,    4000, 150,   135, D,  0, 0              , 33, R, D), //  16
-	RVI(12, G,  16, 112,    2400, 120,   105, D,  0, 0              , 34, R, D), //  17
-	RVI(13, G,  30, 112,    6600, 207,   155, D,  0, 0              , 35, R, D), //  18
-	RVI(15, G,  18, 104,    1500, 110,   105, D,  0, 0              , 29, R, D), //  19
-	RVI(16, M,  35, 160,  3500/2,95/2, 205/2, D,  0, 0              , 45, R, D), //  20
-	RVI(18, G,  21, 104,    2200, 120,   145, D,  0, 0              , 32, R, D), //  21
-	RVI( 6, M,  20, 200,  4500/2,70/2, 190/2, D,  4, CT_MAIL        , 50, R, D), //  22
-	RVI(20, G,  26, 160,    3600,  84,   180, E,  0, 0              , 40, C, E), //  23
-	RVI(20, G,  30, 176,    5000,  82,   205, E,  0, 0              , 41, C, E), //  24
-	RVI(21, M,  40, 240,  7000/2,90/2, 240/2, E,  0, 0              , 51, C, E), //  25
-	RVI(23, M,  43, 264,  8000/2,95/2, 250/2, E,  0, 0              , 52, C, E), //  26
-	RVI(33, W, 247,   0,       0,  25,     0, 0, 40, CT_PASSENGERS  ,  0, R, A), //  27
-	RVI(35, W, 228,   0,       0,  21,     0, 0, 30, CT_MAIL        ,  0, R, A), //  28
-	RVI(34, W, 176,   0,       0,  18,     0, 0, 30, CT_COAL        ,  0, R, A), //  29
-	RVI(36, W, 200,   0,       0,  24,     0, 0, 30, CT_OIL         ,  0, R, A), //  30
-	RVI(37, W, 192,   0,       0,  20,     0, 0, 25, CT_LIVESTOCK   ,  0, R, A), //  31
-	RVI(38, W, 190,   0,       0,  21,     0, 0, 25, CT_GOODS       ,  0, R, A), //  32
-	RVI(39, W, 182,   0,       0,  19,     0, 0, 30, CT_GRAIN       ,  0, R, A), //  33
-	RVI(40, W, 181,   0,       0,  16,     0, 0, 30, CT_WOOD        ,  0, R, A), //  34
-	RVI(41, W, 179,   0,       0,  19,     0, 0, 30, CT_IRON_ORE    ,  0, R, A), //  35
-	RVI(42, W, 196,   0,       0,  18,     0, 0, 20, CT_STEEL       ,  0, R, A), //  36
-	RVI(43, W, 255,   0,       0,  30,     0, 0, 20, CT_VALUABLES   ,  0, R, A), //  37
-	RVI(44, W, 191,   0,       0,  22,     0, 0, 25, CT_FOOD        ,  0, R, A), //  38
-	RVI(45, W, 196,   0,       0,  18,     0, 0, 20, CT_PAPER       ,  0, R, A), //  39
-	RVI(46, W, 179,   0,       0,  19,     0, 0, 30, CT_COPPER_ORE  ,  0, R, A), //  40
-	RVI(47, W, 199,   0,       0,  25,     0, 0, 25, CT_WATER       ,  0, R, A), //  41
-	RVI(48, W, 182,   0,       0,  18,     0, 0, 25, CT_FRUIT       ,  0, R, A), //  42
-	RVI(49, W, 185,   0,       0,  19,     0, 0, 21, CT_RUBBER      ,  0, R, A), //  43
-	RVI(50, W, 176,   0,       0,  19,     0, 0, 30, CT_SUGAR       ,  0, R, A), //  44
-	RVI(51, W, 178,   0,       0,  20,     0, 0, 30, CT_COTTON_CANDY,  0, R, A), //  45
-	RVI(52, W, 192,   0,       0,  20,     0, 0, 30, CT_TOFFEE      ,  0, R, A), //  46
-	RVI(53, W, 190,   0,       0,  21,     0, 0, 20, CT_BUBBLES     ,  0, R, A), //  47
-	RVI(54, W, 182,   0,       0,  24,     0, 0, 25, CT_COLA        ,  0, R, A), //  48
-	RVI(55, W, 181,   0,       0,  21,     0, 0, 25, CT_CANDY       ,  0, R, A), //  49
-	RVI(56, W, 183,   0,       0,  21,     0, 0, 20, CT_TOYS        ,  0, R, A), //  50
-	RVI(57, W, 196,   0,       0,  18,     0, 0, 22, CT_BATTERIES   ,  0, R, A), //  51
-	RVI(58, W, 193,   0,       0,  18,     0, 0, 25, CT_FIZZY_DRINKS,  0, R, A), //  52
-	RVI(59, W, 191,   0,       0,  18,     0, 0, 30, CT_PLASTIC     ,  0, R, A), //  53
-	RVI(25, G,  52, 304,    9000,  95,   230, E,  0, 0              , 60, O, N), //  54
-	RVI(26, M,  60, 336, 10000/2,85/2, 240/2, E, 25, CT_PASSENGERS  , 62, O, N), //  55
-	RVI(26, G,  53, 320,    5000,  95,   230, E,  0, 0              , 63, O, N), //  56
-	RVI(60, W, 247,   0,       0,  25,     0, 0, 45, CT_PASSENGERS  ,  0, O, A), //  57
-	RVI(62, W, 228,   0,       0,  21,     0, 0, 35, CT_MAIL        ,  0, O, A), //  58
-	RVI(61, W, 176,   0,       0,  18,     0, 0, 35, CT_COAL        ,  0, O, A), //  59
-	RVI(63, W, 200,   0,       0,  24,     0, 0, 35, CT_OIL         ,  0, O, A), //  60
-	RVI(64, W, 192,   0,       0,  20,     0, 0, 30, CT_LIVESTOCK   ,  0, O, A), //  61
-	RVI(65, W, 190,   0,       0,  21,     0, 0, 30, CT_GOODS       ,  0, O, A), //  62
-	RVI(66, W, 182,   0,       0,  19,     0, 0, 35, CT_GRAIN       ,  0, O, A), //  63
-	RVI(67, W, 181,   0,       0,  16,     0, 0, 35, CT_WOOD        ,  0, O, A), //  64
-	RVI(68, W, 179,   0,       0,  19,     0, 0, 35, CT_IRON_ORE    ,  0, O, A), //  65
-	RVI(69, W, 196,   0,       0,  18,     0, 0, 25, CT_STEEL       ,  0, O, A), //  66
-	RVI(70, W, 255,   0,       0,  30,     0, 0, 25, CT_VALUABLES   ,  0, O, A), //  67
-	RVI(71, W, 191,   0,       0,  22,     0, 0, 30, CT_FOOD        ,  0, O, A), //  68
-	RVI(72, W, 196,   0,       0,  18,     0, 0, 25, CT_PAPER       ,  0, O, A), //  69
-	RVI(73, W, 179,   0,       0,  19,     0, 0, 35, CT_COPPER_ORE  ,  0, O, A), //  70
-	RVI(47, W, 199,   0,       0,  25,     0, 0, 30, CT_WATER       ,  0, O, A), //  71
-	RVI(48, W, 182,   0,       0,  18,     0, 0, 30, CT_FRUIT       ,  0, O, A), //  72
-	RVI(49, W, 185,   0,       0,  19,     0, 0, 26, CT_RUBBER      ,  0, O, A), //  73
-	RVI(50, W, 176,   0,       0,  19,     0, 0, 35, CT_SUGAR       ,  0, O, A), //  74
-	RVI(51, W, 178,   0,       0,  20,     0, 0, 35, CT_COTTON_CANDY,  0, O, A), //  75
-	RVI(52, W, 192,   0,       0,  20,     0, 0, 35, CT_TOFFEE      ,  0, O, A), //  76
-	RVI(53, W, 190,   0,       0,  21,     0, 0, 25, CT_BUBBLES     ,  0, O, A), //  77
-	RVI(54, W, 182,   0,       0,  24,     0, 0, 30, CT_COLA        ,  0, O, A), //  78
-	RVI(55, W, 181,   0,       0,  21,     0, 0, 30, CT_CANDY       ,  0, O, A), //  79
-	RVI(56, W, 183,   0,       0,  21,     0, 0, 25, CT_TOYS        ,  0, O, A), //  80
-	RVI(57, W, 196,   0,       0,  18,     0, 0, 27, CT_BATTERIES   ,  0, O, A), //  81
-	RVI(58, W, 193,   0,       0,  18,     0, 0, 30, CT_FIZZY_DRINKS,  0, O, A), //  82
-	RVI(59, W, 191,   0,       0,  18,     0, 0, 35, CT_PLASTIC     ,  0, O, A), //  83
-	RVI(28, G,  70, 400,   10000, 105,   250, E,  0, 0              , 70, L, V), //  84
-	RVI(29, G,  74, 448,   12000, 120,   253, E,  0, 0              , 71, L, V), //  85
-	RVI(30, G,  82, 480,   15000, 130,   254, E,  0, 0              , 72, L, V), //  86
-	RVI(31, M,  95, 640, 20000/2,150/2,255/2, E,  0, 0              , 73, L, V), //  87
-	RVI(28, G,  70, 480,   10000, 120,   250, E,  0, 0              , 74, L, V), //  88
-	RVI(60, W, 247,   0,       0,  25,     0, 0, 47, CT_PASSENGERS  ,  0, L, A), //  89
-	RVI(62, W, 228,   0,       0,  21,     0, 0, 37, CT_MAIL        ,  0, L, A), //  90
-	RVI(61, W, 176,   0,       0,  18,     0, 0, 37, CT_COAL        ,  0, L, A), //  91
-	RVI(63, W, 200,   0,       0,  24,     0, 0, 37, CT_OIL         ,  0, L, A), //  92
-	RVI(64, W, 192,   0,       0,  20,     0, 0, 32, CT_LIVESTOCK   ,  0, L, A), //  93
-	RVI(65, W, 190,   0,       0,  21,     0, 0, 32, CT_GOODS       ,  0, L, A), //  94
-	RVI(66, W, 182,   0,       0,  19,     0, 0, 37, CT_GRAIN       ,  0, L, A), //  95
-	RVI(67, W, 181,   0,       0,  16,     0, 0, 37, CT_WOOD        ,  0, L, A), //  96
-	RVI(68, W, 179,   0,       0,  19,     0, 0, 37, CT_IRON_ORE    ,  0, L, A), //  97
-	RVI(69, W, 196,   0,       0,  18,     0, 0, 27, CT_STEEL       ,  0, L, A), //  98
-	RVI(70, W, 255,   0,       0,  30,     0, 0, 27, CT_VALUABLES   ,  0, L, A), //  99
-	RVI(71, W, 191,   0,       0,  22,     0, 0, 32, CT_FOOD        ,  0, L, A), // 100
-	RVI(72, W, 196,   0,       0,  18,     0, 0, 27, CT_PAPER       ,  0, L, A), // 101
-	RVI(73, W, 179,   0,       0,  19,     0, 0, 37, CT_COPPER_ORE  ,  0, L, A), // 102
-	RVI(47, W, 199,   0,       0,  25,     0, 0, 32, CT_WATER       ,  0, L, A), // 103
-	RVI(48, W, 182,   0,       0,  18,     0, 0, 32, CT_FRUIT       ,  0, L, A), // 104
-	RVI(49, W, 185,   0,       0,  19,     0, 0, 28, CT_RUBBER      ,  0, L, A), // 105
-	RVI(50, W, 176,   0,       0,  19,     0, 0, 37, CT_SUGAR       ,  0, L, A), // 106
-	RVI(51, W, 178,   0,       0,  20,     0, 0, 37, CT_COTTON_CANDY,  0, L, A), // 107
-	RVI(52, W, 192,   0,       0,  20,     0, 0, 37, CT_TOFFEE      ,  0, L, A), // 108
-	RVI(53, W, 190,   0,       0,  21,     0, 0, 27, CT_BUBBLES     ,  0, L, A), // 109
-	RVI(54, W, 182,   0,       0,  24,     0, 0, 32, CT_COLA        ,  0, L, A), // 110
-	RVI(55, W, 181,   0,       0,  21,     0, 0, 32, CT_CANDY       ,  0, L, A), // 111
-	RVI(56, W, 183,   0,       0,  21,     0, 0, 27, CT_TOYS        ,  0, L, A), // 112
-	RVI(57, W, 196,   0,       0,  18,     0, 0, 29, CT_BATTERIES   ,  0, L, A), // 113
-	RVI(58, W, 193,   0,       0,  18,     0, 0, 32, CT_FIZZY_DRINKS,  0, L, A), // 114
-	RVI(59, W, 191,   0,       0,  18,     0, 0, 37, CT_PLASTIC     ,  0, L, A), // 115
+	//   image_index  max_speed (kph)      running_cost                   ai_rank
+	//   |  flags     |        power (hp)  |  running_cost_class          |  railtype
+	//   |  |    base_cost     |    weight |  |      capacity             |  |
+	//   |  |    |    |        |    |      |  |      |  cargo_type        |  |  engclass
+	//   |  |    |    |        |    |      |  |      |  |                 |  |  |
+	RVI( 2, G,   7,  64,     300,  47,    50, RC_S,  0, 0              ,  1, R, S), //   0
+	RVI(19, G,   8,  80,     600,  65,    65, RC_D,  0, 0              ,  4, R, D), //   1
+	RVI( 2, G,  10,  72,     400,  85,    90, RC_S,  0, 0              ,  7, R, S), //   2
+	RVI( 0, G,  15,  96,     900, 130,   130, RC_S,  0, 0              , 19, R, S), //   3
+	RVI( 1, G,  19, 112,    1000, 140,   145, RC_S,  0, 0              , 20, R, S), //   4
+	RVI(12, G,  16, 120,    1400,  95,   125, RC_D,  0, 0              , 30, R, D), //   5
+	RVI(14, G,  20, 152,    2000, 120,   135, RC_D,  0, 0              , 31, R, D), //   6
+	RVI( 3, G,  14,  88,    1100, 145,   130, RC_S,  0, 0              , 19, R, S), //   7
+	RVI( 0, G,  13, 112,    1000, 131,   120, RC_S,  0, 0              , 20, R, S), //   8
+	RVI( 1, G,  19, 128,    1200, 162,   140, RC_S,  0, 0              , 21, R, S), //   9
+	RVI( 0, G,  22, 144,    1600, 170,   130, RC_S,  0, 0              , 22, R, S), //  10
+	RVI( 8, M,  11, 112,   600/2,32/2,  85/2, RC_D, 38, CT_PASSENGERS  , 10, R, D), //  11
+	RVI(10, M,  14, 120,   700/2,38/2,  70/2, RC_D, 40, CT_PASSENGERS  , 11, R, D), //  12
+	RVI( 4, G,  15, 128,    1250,  72,    95, RC_D,  0, 0              , 30, R, D), //  13
+	RVI( 5, G,  17, 144,    1750, 101,   120, RC_D,  0, 0              , 31, R, D), //  14
+	RVI( 4, G,  18, 160,    2580, 112,   140, RC_D,  0, 0              , 32, R, D), //  15
+	RVI(14, G,  23,  96,    4000, 150,   135, RC_D,  0, 0              , 33, R, D), //  16
+	RVI(12, G,  16, 112,    2400, 120,   105, RC_D,  0, 0              , 34, R, D), //  17
+	RVI(13, G,  30, 112,    6600, 207,   155, RC_D,  0, 0              , 35, R, D), //  18
+	RVI(15, G,  18, 104,    1500, 110,   105, RC_D,  0, 0              , 29, R, D), //  19
+	RVI(16, M,  35, 160,  3500/2,95/2, 205/2, RC_D,  0, 0              , 45, R, D), //  20
+	RVI(18, G,  21, 104,    2200, 120,   145, RC_D,  0, 0              , 32, R, D), //  21
+	RVI( 6, M,  20, 200,  4500/2,70/2, 190/2, RC_D,  4, CT_MAIL        , 50, R, D), //  22
+	RVI(20, G,  26, 160,    3600,  84,   180, RC_E,  0, 0              , 40, C, E), //  23
+	RVI(20, G,  30, 176,    5000,  82,   205, RC_E,  0, 0              , 41, C, E), //  24
+	RVI(21, M,  40, 240,  7000/2,90/2, 240/2, RC_E,  0, 0              , 51, C, E), //  25
+	RVI(23, M,  43, 264,  8000/2,95/2, 250/2, RC_E,  0, 0              , 52, C, E), //  26
+	RVI(33, W, 247,   0,       0,  25,     0, RC_W, 40, CT_PASSENGERS  ,  0, R, A), //  27
+	RVI(35, W, 228,   0,       0,  21,     0, RC_W, 30, CT_MAIL        ,  0, R, A), //  28
+	RVI(34, W, 176,   0,       0,  18,     0, RC_W, 30, CT_COAL        ,  0, R, A), //  29
+	RVI(36, W, 200,   0,       0,  24,     0, RC_W, 30, CT_OIL         ,  0, R, A), //  30
+	RVI(37, W, 192,   0,       0,  20,     0, RC_W, 25, CT_LIVESTOCK   ,  0, R, A), //  31
+	RVI(38, W, 190,   0,       0,  21,     0, RC_W, 25, CT_GOODS       ,  0, R, A), //  32
+	RVI(39, W, 182,   0,       0,  19,     0, RC_W, 30, CT_GRAIN       ,  0, R, A), //  33
+	RVI(40, W, 181,   0,       0,  16,     0, RC_W, 30, CT_WOOD        ,  0, R, A), //  34
+	RVI(41, W, 179,   0,       0,  19,     0, RC_W, 30, CT_IRON_ORE    ,  0, R, A), //  35
+	RVI(42, W, 196,   0,       0,  18,     0, RC_W, 20, CT_STEEL       ,  0, R, A), //  36
+	RVI(43, W, 255,   0,       0,  30,     0, RC_W, 20, CT_VALUABLES   ,  0, R, A), //  37
+	RVI(44, W, 191,   0,       0,  22,     0, RC_W, 25, CT_FOOD        ,  0, R, A), //  38
+	RVI(45, W, 196,   0,       0,  18,     0, RC_W, 20, CT_PAPER       ,  0, R, A), //  39
+	RVI(46, W, 179,   0,       0,  19,     0, RC_W, 30, CT_COPPER_ORE  ,  0, R, A), //  40
+	RVI(47, W, 199,   0,       0,  25,     0, RC_W, 25, CT_WATER       ,  0, R, A), //  41
+	RVI(48, W, 182,   0,       0,  18,     0, RC_W, 25, CT_FRUIT       ,  0, R, A), //  42
+	RVI(49, W, 185,   0,       0,  19,     0, RC_W, 21, CT_RUBBER      ,  0, R, A), //  43
+	RVI(50, W, 176,   0,       0,  19,     0, RC_W, 30, CT_SUGAR       ,  0, R, A), //  44
+	RVI(51, W, 178,   0,       0,  20,     0, RC_W, 30, CT_COTTON_CANDY,  0, R, A), //  45
+	RVI(52, W, 192,   0,       0,  20,     0, RC_W, 30, CT_TOFFEE      ,  0, R, A), //  46
+	RVI(53, W, 190,   0,       0,  21,     0, RC_W, 20, CT_BUBBLES     ,  0, R, A), //  47
+	RVI(54, W, 182,   0,       0,  24,     0, RC_W, 25, CT_COLA        ,  0, R, A), //  48
+	RVI(55, W, 181,   0,       0,  21,     0, RC_W, 25, CT_CANDY       ,  0, R, A), //  49
+	RVI(56, W, 183,   0,       0,  21,     0, RC_W, 20, CT_TOYS        ,  0, R, A), //  50
+	RVI(57, W, 196,   0,       0,  18,     0, RC_W, 22, CT_BATTERIES   ,  0, R, A), //  51
+	RVI(58, W, 193,   0,       0,  18,     0, RC_W, 25, CT_FIZZY_DRINKS,  0, R, A), //  52
+	RVI(59, W, 191,   0,       0,  18,     0, RC_W, 30, CT_PLASTIC     ,  0, R, A), //  53
+	RVI(25, G,  52, 304,    9000,  95,   230, RC_E,  0, 0              , 60, O, N), //  54
+	RVI(26, M,  60, 336, 10000/2,85/2, 240/2, RC_E, 25, CT_PASSENGERS  , 62, O, N), //  55
+	RVI(26, G,  53, 320,    5000,  95,   230, RC_E,  0, 0              , 63, O, N), //  56
+	RVI(60, W, 247,   0,       0,  25,     0, RC_W, 45, CT_PASSENGERS  ,  0, O, A), //  57
+	RVI(62, W, 228,   0,       0,  21,     0, RC_W, 35, CT_MAIL        ,  0, O, A), //  58
+	RVI(61, W, 176,   0,       0,  18,     0, RC_W, 35, CT_COAL        ,  0, O, A), //  59
+	RVI(63, W, 200,   0,       0,  24,     0, RC_W, 35, CT_OIL         ,  0, O, A), //  60
+	RVI(64, W, 192,   0,       0,  20,     0, RC_W, 30, CT_LIVESTOCK   ,  0, O, A), //  61
+	RVI(65, W, 190,   0,       0,  21,     0, RC_W, 30, CT_GOODS       ,  0, O, A), //  62
+	RVI(66, W, 182,   0,       0,  19,     0, RC_W, 35, CT_GRAIN       ,  0, O, A), //  63
+	RVI(67, W, 181,   0,       0,  16,     0, RC_W, 35, CT_WOOD        ,  0, O, A), //  64
+	RVI(68, W, 179,   0,       0,  19,     0, RC_W, 35, CT_IRON_ORE    ,  0, O, A), //  65
+	RVI(69, W, 196,   0,       0,  18,     0, RC_W, 25, CT_STEEL       ,  0, O, A), //  66
+	RVI(70, W, 255,   0,       0,  30,     0, RC_W, 25, CT_VALUABLES   ,  0, O, A), //  67
+	RVI(71, W, 191,   0,       0,  22,     0, RC_W, 30, CT_FOOD        ,  0, O, A), //  68
+	RVI(72, W, 196,   0,       0,  18,     0, RC_W, 25, CT_PAPER       ,  0, O, A), //  69
+	RVI(73, W, 179,   0,       0,  19,     0, RC_W, 35, CT_COPPER_ORE  ,  0, O, A), //  70
+	RVI(47, W, 199,   0,       0,  25,     0, RC_W, 30, CT_WATER       ,  0, O, A), //  71
+	RVI(48, W, 182,   0,       0,  18,     0, RC_W, 30, CT_FRUIT       ,  0, O, A), //  72
+	RVI(49, W, 185,   0,       0,  19,     0, RC_W, 26, CT_RUBBER      ,  0, O, A), //  73
+	RVI(50, W, 176,   0,       0,  19,     0, RC_W, 35, CT_SUGAR       ,  0, O, A), //  74
+	RVI(51, W, 178,   0,       0,  20,     0, RC_W, 35, CT_COTTON_CANDY,  0, O, A), //  75
+	RVI(52, W, 192,   0,       0,  20,     0, RC_W, 35, CT_TOFFEE      ,  0, O, A), //  76
+	RVI(53, W, 190,   0,       0,  21,     0, RC_W, 25, CT_BUBBLES     ,  0, O, A), //  77
+	RVI(54, W, 182,   0,       0,  24,     0, RC_W, 30, CT_COLA        ,  0, O, A), //  78
+	RVI(55, W, 181,   0,       0,  21,     0, RC_W, 30, CT_CANDY       ,  0, O, A), //  79
+	RVI(56, W, 183,   0,       0,  21,     0, RC_W, 25, CT_TOYS        ,  0, O, A), //  80
+	RVI(57, W, 196,   0,       0,  18,     0, RC_W, 27, CT_BATTERIES   ,  0, O, A), //  81
+	RVI(58, W, 193,   0,       0,  18,     0, RC_W, 30, CT_FIZZY_DRINKS,  0, O, A), //  82
+	RVI(59, W, 191,   0,       0,  18,     0, RC_W, 35, CT_PLASTIC     ,  0, O, A), //  83
+	RVI(28, G,  70, 400,   10000, 105,   250, RC_E,  0, 0              , 70, L, V), //  84
+	RVI(29, G,  74, 448,   12000, 120,   253, RC_E,  0, 0              , 71, L, V), //  85
+	RVI(30, G,  82, 480,   15000, 130,   254, RC_E,  0, 0              , 72, L, V), //  86
+	RVI(31, M,  95, 640, 20000/2,150/2,255/2, RC_E,  0, 0              , 73, L, V), //  87
+	RVI(28, G,  70, 480,   10000, 120,   250, RC_E,  0, 0              , 74, L, V), //  88
+	RVI(60, W, 247,   0,       0,  25,     0, RC_W, 47, CT_PASSENGERS  ,  0, L, A), //  89
+	RVI(62, W, 228,   0,       0,  21,     0, RC_W, 37, CT_MAIL        ,  0, L, A), //  90
+	RVI(61, W, 176,   0,       0,  18,     0, RC_W, 37, CT_COAL        ,  0, L, A), //  91
+	RVI(63, W, 200,   0,       0,  24,     0, RC_W, 37, CT_OIL         ,  0, L, A), //  92
+	RVI(64, W, 192,   0,       0,  20,     0, RC_W, 32, CT_LIVESTOCK   ,  0, L, A), //  93
+	RVI(65, W, 190,   0,       0,  21,     0, RC_W, 32, CT_GOODS       ,  0, L, A), //  94
+	RVI(66, W, 182,   0,       0,  19,     0, RC_W, 37, CT_GRAIN       ,  0, L, A), //  95
+	RVI(67, W, 181,   0,       0,  16,     0, RC_W, 37, CT_WOOD        ,  0, L, A), //  96
+	RVI(68, W, 179,   0,       0,  19,     0, RC_W, 37, CT_IRON_ORE    ,  0, L, A), //  97
+	RVI(69, W, 196,   0,       0,  18,     0, RC_W, 27, CT_STEEL       ,  0, L, A), //  98
+	RVI(70, W, 255,   0,       0,  30,     0, RC_W, 27, CT_VALUABLES   ,  0, L, A), //  99
+	RVI(71, W, 191,   0,       0,  22,     0, RC_W, 32, CT_FOOD        ,  0, L, A), // 100
+	RVI(72, W, 196,   0,       0,  18,     0, RC_W, 27, CT_PAPER       ,  0, L, A), // 101
+	RVI(73, W, 179,   0,       0,  19,     0, RC_W, 37, CT_COPPER_ORE  ,  0, L, A), // 102
+	RVI(47, W, 199,   0,       0,  25,     0, RC_W, 32, CT_WATER       ,  0, L, A), // 103
+	RVI(48, W, 182,   0,       0,  18,     0, RC_W, 32, CT_FRUIT       ,  0, L, A), // 104
+	RVI(49, W, 185,   0,       0,  19,     0, RC_W, 28, CT_RUBBER      ,  0, L, A), // 105
+	RVI(50, W, 176,   0,       0,  19,     0, RC_W, 37, CT_SUGAR       ,  0, L, A), // 106
+	RVI(51, W, 178,   0,       0,  20,     0, RC_W, 37, CT_COTTON_CANDY,  0, L, A), // 107
+	RVI(52, W, 192,   0,       0,  20,     0, RC_W, 37, CT_TOFFEE      ,  0, L, A), // 108
+	RVI(53, W, 190,   0,       0,  21,     0, RC_W, 27, CT_BUBBLES     ,  0, L, A), // 109
+	RVI(54, W, 182,   0,       0,  24,     0, RC_W, 32, CT_COLA        ,  0, L, A), // 110
+	RVI(55, W, 181,   0,       0,  21,     0, RC_W, 32, CT_CANDY       ,  0, L, A), // 111
+	RVI(56, W, 183,   0,       0,  21,     0, RC_W, 27, CT_TOYS        ,  0, L, A), // 112
+	RVI(57, W, 196,   0,       0,  18,     0, RC_W, 29, CT_BATTERIES   ,  0, L, A), // 113
+	RVI(58, W, 193,   0,       0,  18,     0, RC_W, 32, CT_FIZZY_DRINKS,  0, L, A), // 114
+	RVI(59, W, 191,   0,       0,  18,     0, RC_W, 37, CT_PLASTIC     ,  0, L, A), // 115
 };
 #undef L
 #undef O
@@ -609,7 +617,7 @@
  * @param f capacity
  * @param g cargo_type
  */
-#define ROV(a, b, c, d, e, f, g) { a, b, c, {d}, e, f, g }
+#define ROV(a, b, c, d, e, f, g) { a, b, c, RC_R, {d}, e, f, g }
 const RoadVehicleInfo _orig_road_vehicle_info[NUM_ROAD_ENGINES] = {
 	//    image_index       sfx                                 max_speed
 	//    |    base_cost    |                                   |   capacity
--- a/src/table/road_land.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/table/road_land.h	Mon Mar 10 15:26:39 2008 +0000
@@ -1,7 +1,7 @@
 /* $Id$ */
 
-#define TILE_SEQ_LINE(img, pal, dx, dy, sx, sy) { dx, dy, 0, sx, sy, 20, img, pal },
-#define TILE_SEQ_END() { 0, 0, 0, 0, 0, 0, 0, 0 }
+#define TILE_SEQ_LINE(img, pal, dx, dy, sx, sy) { dx, dy, 0, sx, sy, 20, {img, pal} },
+#define TILE_SEQ_END() { 0, 0, 0, 0, 0, 0, {0, 0} }
 
 static const DrawTileSeqStruct _road_depot_NE[] = {
 	TILE_SEQ_LINE(0x584 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 15, 16, 1)
@@ -26,10 +26,10 @@
 };
 
 static const DrawTileSprites _road_depot[] = {
-	{ 0xA4A, PAL_NONE, _road_depot_NE },
-	{ 0xA4A, PAL_NONE, _road_depot_SE },
-	{ 0xA4A, PAL_NONE, _road_depot_SW },
-	{ 0xA4A, PAL_NONE, _road_depot_NW }
+	{ {0xA4A, PAL_NONE}, _road_depot_NE },
+	{ {0xA4A, PAL_NONE}, _road_depot_SE },
+	{ {0xA4A, PAL_NONE}, _road_depot_SW },
+	{ {0xA4A, PAL_NONE}, _road_depot_NW }
 };
 
 static const DrawTileSeqStruct _tram_depot_NE[] = {
@@ -55,13 +55,12 @@
 };
 
 static const DrawTileSprites _tram_depot[] = {
-	{ 0xA4A, PAL_NONE, _tram_depot_NE },
-	{ 0xA4A, PAL_NONE, _tram_depot_SE },
-	{ 0xA4A, PAL_NONE, _tram_depot_SW },
-	{ 0xA4A, PAL_NONE, _tram_depot_NW }
+	{ {0xA4A, PAL_NONE}, _tram_depot_NE },
+	{ {0xA4A, PAL_NONE}, _tram_depot_SE },
+	{ {0xA4A, PAL_NONE}, _tram_depot_SW },
+	{ {0xA4A, PAL_NONE}, _tram_depot_NW }
 };
 
-#undef TILE_SEQ_BEGIN
 #undef TILE_SEQ_LINE
 #undef TILE_SEQ_END
 
--- a/src/table/roadveh.h	Sun Feb 03 20:34:26 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1470 +0,0 @@
-/* $Id$ */
-
-/** @file table/roadveh.h Data about how a road vehicle must drive on a tile */
-
-static const RoadDriveEntry _roadveh_drive_data_0[] = {
-	{15, 5},
-	{14, 5},
-	{13, 5},
-	{12, 5},
-	{11, 5},
-	{10, 5},
-	{ 9, 5},
-	{ 8, 5},
-	{ 7, 5},
-	{ 6, 5},
-	{ 5, 5},
-	{ 4, 5},
-	{ 3, 5},
-	{ 2, 5},
-	{ 1, 5},
-	{ 0, 5},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_1[] = {
-	{5,  0},
-	{5,  1},
-	{5,  2},
-	{5,  3},
-	{5,  4},
-	{5,  5},
-	{5,  6},
-	{5,  7},
-	{5,  8},
-	{5,  9},
-	{5, 10},
-	{5, 11},
-	{5, 12},
-	{5, 13},
-	{5, 14},
-	{5, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_2[] = {
-	{5, 0},
-	{5, 1},
-	{5, 2},
-	{4, 3},
-	{3, 4},
-	{2, 5},
-	{1, 5},
-	{0, 5},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_3[] = {
-	{15,  5},
-	{14,  5},
-	{13,  5},
-	{12,  5},
-	{11,  5},
-	{10,  5},
-	{ 9,  6},
-	{ 8,  7},
-	{ 7,  8},
-	{ 6,  9},
-	{ 5, 10},
-	{ 5, 11},
-	{ 5, 12},
-	{ 5, 13},
-	{ 5, 14},
-	{ 5, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_4[] = {
-	{ 5, 0},
-	{ 5, 1},
-	{ 5, 2},
-	{ 5, 3},
-	{ 5, 4},
-	{ 5, 5},
-	{ 6, 6},
-	{ 7, 7},
-	{ 8, 8},
-	{ 9, 9},
-	{10, 9},
-	{11, 9},
-	{12, 9},
-	{13, 9},
-	{14, 9},
-	{15, 9},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_5[] = {
-	{0,  9},
-	{1,  9},
-	{2,  9},
-	{3, 10},
-	{4, 11},
-	{5, 12},
-	{5, 13},
-	{5, 14},
-	{5, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_6[] = {
-	{0, 6},
-	{0, 7},
-	{0, 8},
-	{0, 9},
-	{RDE_TURNED | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_7[] = {
-	{6, 15},
-	{7, 15},
-	{8, 15},
-	{9, 15},
-	{RDE_TURNED | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_8[] = {
-	{ 0, 9},
-	{ 1, 9},
-	{ 2, 9},
-	{ 3, 9},
-	{ 4, 9},
-	{ 5, 9},
-	{ 6, 9},
-	{ 7, 9},
-	{ 8, 9},
-	{ 9, 9},
-	{10, 9},
-	{11, 9},
-	{12, 9},
-	{13, 9},
-	{14, 9},
-	{15, 9},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_9[] = {
-	{9, 15},
-	{9, 14},
-	{9, 13},
-	{9, 12},
-	{9, 11},
-	{9, 10},
-	{9,  9},
-	{9,  8},
-	{9,  7},
-	{9,  6},
-	{9,  5},
-	{9,  4},
-	{9,  3},
-	{9,  2},
-	{9,  1},
-	{9,  0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_10[] = {
-	{0, 9},
-	{1, 9},
-	{2, 9},
-	{3, 9},
-	{4, 9},
-	{5, 9},
-	{6, 8},
-	{7, 7},
-	{8, 6},
-	{9, 5},
-	{9, 4},
-	{9, 3},
-	{9, 2},
-	{9, 1},
-	{9, 0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_11[] = {
-	{ 9, 15},
-	{ 9, 14},
-	{ 9, 13},
-	{10, 12},
-	{11, 11},
-	{12, 10},
-	{13,  9},
-	{14,  9},
-	{15,  9},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_12[] = {
-	{15, 5},
-	{14, 5},
-	{13, 5},
-	{12, 4},
-	{11, 3},
-	{10, 2},
-	{ 9, 1},
-	{ 9, 0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_13[] = {
-	{9, 15},
-	{9, 14},
-	{9, 13},
-	{9, 12},
-	{9, 11},
-	{9, 10},
-	{8,  9},
-	{7,  8},
-	{6,  7},
-	{5,  6},
-	{4,  5},
-	{3,  5},
-	{2,  5},
-	{1,  5},
-	{0,  5},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_14[] = {
-	{15, 8},
-	{15, 7},
-	{15, 6},
-	{15, 5},
-	{RDE_TURNED | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_15[] = {
-	{8, 0},
-	{7, 0},
-	{6, 0},
-	{5, 0},
-	{RDE_TURNED | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_16[] = {
-	{15, 9},
-	{14, 9},
-	{13, 9},
-	{12, 9},
-	{11, 9},
-	{10, 9},
-	{ 9, 9},
-	{ 8, 9},
-	{ 7, 9},
-	{ 6, 9},
-	{ 5, 9},
-	{ 4, 9},
-	{ 3, 9},
-	{ 2, 9},
-	{ 1, 9},
-	{ 0, 9},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_17[] = {
-	{9,  0},
-	{9,  1},
-	{9,  2},
-	{9,  3},
-	{9,  4},
-	{9,  5},
-	{9,  6},
-	{9,  7},
-	{9,  8},
-	{9,  9},
-	{9, 10},
-	{9, 11},
-	{9, 12},
-	{9, 13},
-	{9, 14},
-	{9, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_18[] = {
-	{9, 0},
-	{9, 1},
-	{9, 2},
-	{9, 3},
-	{9, 4},
-	{9, 5},
-	{8, 6},
-	{7, 7},
-	{6, 8},
-	{5, 9},
-	{4, 9},
-	{3, 9},
-	{2, 9},
-	{1, 9},
-	{0, 9},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_19[] = {
-	{15,  9},
-	{14,  9},
-	{13,  9},
-	{12, 10},
-	{11, 11},
-	{10, 12},
-	{ 9, 13},
-	{ 9, 14},
-	{ 9, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_20[] = {
-	{ 9, 0},
-	{ 9, 1},
-	{10, 2},
-	{11, 3},
-	{12, 4},
-	{13, 5},
-	{14, 5},
-	{15, 5},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_21[] = {
-	{0,  5},
-	{1,  5},
-	{2,  5},
-	{3,  5},
-	{4,  5},
-	{5,  6},
-	{6,  7},
-	{7,  8},
-	{8,  9},
-	{9, 10},
-	{9, 11},
-	{9, 12},
-	{9, 13},
-	{9, 14},
-	{9, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_22[] = {
-	{0, 8},
-	{0, 7},
-	{0, 6},
-	{0, 5},
-	{RDE_TURNED | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_23[] = {
-	{8, 15},
-	{7, 15},
-	{6, 15},
-	{5, 15},
-	{RDE_TURNED | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_24[] = {
-	{ 0, 5},
-	{ 1, 5},
-	{ 2, 5},
-	{ 3, 5},
-	{ 4, 5},
-	{ 5, 5},
-	{ 6, 5},
-	{ 7, 5},
-	{ 8, 5},
-	{ 9, 5},
-	{10, 5},
-	{11, 5},
-	{12, 5},
-	{13, 5},
-	{14, 5},
-	{15, 5},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_25[] = {
-	{5, 15},
-	{5, 14},
-	{5, 13},
-	{5, 12},
-	{5, 11},
-	{5, 10},
-	{5,  9},
-	{5,  8},
-	{5,  7},
-	{5,  6},
-	{5,  5},
-	{5,  4},
-	{5,  3},
-	{5,  2},
-	{5,  1},
-	{5,  0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_26[] = {
-	{0, 5},
-	{1, 5},
-	{2, 5},
-	{3, 4},
-	{4, 3},
-	{5, 2},
-	{5, 1},
-	{5, 0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_27[] = {
-	{ 5, 15},
-	{ 5, 14},
-	{ 5, 13},
-	{ 5, 12},
-	{ 5, 11},
-	{ 5, 10},
-	{ 6,  9},
-	{ 7,  8},
-	{ 8,  7},
-	{ 9,  6},
-	{10,  5},
-	{11,  5},
-	{12,  5},
-	{13,  5},
-	{14,  5},
-	{15,  5},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_28[] = {
-	{15, 9},
-	{14, 9},
-	{13, 9},
-	{12, 9},
-	{11, 9},
-	{10, 9},
-	{ 9, 9},
-	{ 8, 8},
-	{ 7, 7},
-	{ 6, 6},
-	{ 5, 5},
-	{ 5, 4},
-	{ 5, 3},
-	{ 5, 2},
-	{ 5, 1},
-	{ 5, 0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_29[] = {
-	{5, 15},
-	{5, 14},
-	{5, 13},
-	{5, 12},
-	{4, 11},
-	{3, 10},
-	{2,  9},
-	{1,  9},
-	{0,  9},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_30[] = {
-	{15, 6},
-	{15, 7},
-	{15, 8},
-	{15, 9},
-	{RDE_TURNED | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_31[] = {
-	{6, 0},
-	{7, 0},
-	{8, 0},
-	{9, 0},
-	{RDE_TURNED | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_32[] = {
-	{15,  5},
-	{14,  5},
-	{13,  6},
-	{13,  7},
-	{13,  8},
-	{13,  9},
-	{13, 10},
-	{13, 11},
-	{12, 12},
-	{11, 12},
-	{10, 12},
-	{ 9, 12},
-	{ 8, 12},
-	{ 7, 12},
-	{ 6, 12},
-	{ 5, 11},
-	{ 5, 10},
-	{ 5,  9},
-	{ 5,  8},
-	{ 5,  7},
-	{ 5,  6},
-	{ 5,  7},
-	{ 5,  8},
-	{ 5,  9},
-	{ 5, 10},
-	{ 5, 11},
-	{ 6, 12},
-	{ 7, 12},
-	{ 8, 12},
-	{ 9, 12},
-	{10, 12},
-	{11, 12},
-	{12, 12},
-	{13, 11},
-	{13, 10},
-	{14,  9},
-	{15,  9},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_33[] = {
-	{ 5,  0},
-	{ 5,  1},
-	{ 6,  2},
-	{ 7,  2},
-	{ 8,  2},
-	{ 9,  2},
-	{10,  2},
-	{11,  2},
-	{12,  3},
-	{12,  4},
-	{12,  5},
-	{12,  6},
-	{12,  7},
-	{12,  8},
-	{12,  9},
-	{11, 10},
-	{10, 10},
-	{ 9, 10},
-	{ 8, 10},
-	{ 7, 10},
-	{ 6, 10},
-	{ 7, 10},
-	{ 8, 10},
-	{ 9, 10},
-	{10, 10},
-	{11, 10},
-	{12,  9},
-	{12,  8},
-	{12,  7},
-	{12,  6},
-	{12,  5},
-	{12,  4},
-	{12,  3},
-	{11,  2},
-	{10,  2},
-	{ 9,  1},
-	{ 9,  0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_34[] = {
-	{15,  5},
-	{14,  5},
-	{13,  6},
-	{13,  7},
-	{13,  8},
-	{13,  9},
-	{13, 10},
-	{13, 11},
-	{12, 12},
-	{11, 12},
-	{10, 12},
-	{ 9, 11},
-	{ 9, 10},
-	{ 9,  9},
-	{ 9,  8},
-	{ 9,  7},
-	{ 9,  6},
-	{ 9,  7},
-	{ 9,  8},
-	{ 9,  9},
-	{ 9, 10},
-	{ 9, 11},
-	{10, 12},
-	{11, 12},
-	{12, 12},
-	{13, 11},
-	{13, 10},
-	{14,  9},
-	{15,  9},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_35[] = {
-	{ 5, 0},
-	{ 5, 1},
-	{ 6, 2},
-	{ 7, 2},
-	{ 8, 2},
-	{ 9, 2},
-	{10, 2},
-	{11, 2},
-	{12, 3},
-	{12, 4},
-	{12, 5},
-	{11, 6},
-	{10, 6},
-	{ 9, 6},
-	{ 8, 6},
-	{ 7, 6},
-	{ 6, 6},
-	{ 7, 6},
-	{ 8, 6},
-	{ 9, 6},
-	{10, 6},
-	{11, 6},
-	{12, 5},
-	{12, 4},
-	{12, 3},
-	{11, 2},
-	{10, 2},
-	{ 9, 1},
-	{ 9, 0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_40[] = {
-	{ 0, 9},
-	{ 1, 9},
-	{ 2, 8},
-	{ 2, 7},
-	{ 2, 6},
-	{ 2, 5},
-	{ 2, 4},
-	{ 3, 3},
-	{ 4, 3},
-	{ 5, 3},
-	{ 6, 3},
-	{ 7, 3},
-	{ 8, 3},
-	{ 9, 3},
-	{10, 4},
-	{10, 5},
-	{10, 6},
-	{10, 7},
-	{10, 8},
-	{10, 9},
-	{10, 8},
-	{10, 7},
-	{10, 6},
-	{10, 5},
-	{10, 4},
-	{ 9, 3},
-	{ 8, 3},
-	{ 7, 3},
-	{ 6, 3},
-	{ 5, 3},
-	{ 4, 3},
-	{ 3, 3},
-	{ 2, 4},
-	{ 1, 5},
-	{ 0, 5},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_41[] = {
-	{9, 15},
-	{9, 14},
-	{8, 13},
-	{7, 13},
-	{6, 13},
-	{5, 13},
-	{4, 13},
-	{3, 12},
-	{3, 11},
-	{3, 10},
-	{3,  9},
-	{3,  8},
-	{3,  7},
-	{3,  6},
-	{4,  5},
-	{5,  5},
-	{6,  5},
-	{7,  5},
-	{8,  5},
-	{9,  5},
-	{8,  5},
-	{7,  5},
-	{6,  5},
-	{5,  5},
-	{4,  5},
-	{3,  6},
-	{3,  7},
-	{3,  8},
-	{3,  9},
-	{3, 10},
-	{3, 11},
-	{3, 12},
-	{4, 13},
-	{5, 14},
-	{5, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_42[] = {
-	{0, 9},
-	{1, 9},
-	{2, 8},
-	{2, 7},
-	{2, 6},
-	{2, 5},
-	{2, 4},
-	{3, 3},
-	{4, 3},
-	{5, 3},
-	{6, 4},
-	{6, 5},
-	{6, 6},
-	{6, 7},
-	{6, 8},
-	{6, 9},
-	{6, 8},
-	{6, 7},
-	{6, 6},
-	{6, 5},
-	{6, 4},
-	{5, 3},
-	{4, 3},
-	{3, 3},
-	{2, 4},
-	{1, 5},
-	{0, 5},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_43[] = {
-	{9, 15},
-	{9, 14},
-	{8, 13},
-	{7, 13},
-	{6, 13},
-	{5, 13},
-	{4, 13},
-	{3, 12},
-	{3, 11},
-	{3, 10},
-	{4,  9},
-	{5,  9},
-	{6,  9},
-	{7,  9},
-	{8,  9},
-	{9,  9},
-	{8,  9},
-	{7,  9},
-	{6,  9},
-	{5,  9},
-	{4,  9},
-	{3, 10},
-	{3, 11},
-	{3, 12},
-	{4, 13},
-	{5, 14},
-	{5, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_48[] = {
-	{15,  9},
-	{14,  9},
-	{13, 10},
-	{13, 11},
-	{12, 12},
-	{11, 12},
-	{10, 12},
-	{ 9, 12},
-	{ 8, 12},
-	{ 7, 12},
-	{ 6, 12},
-	{ 5, 11},
-	{ 5, 10},
-	{ 5,  9},
-	{ 5,  8},
-	{ 5,  7},
-	{ 5,  6},
-	{ 5,  7},
-	{ 5,  8},
-	{ 5,  9},
-	{ 5, 10},
-	{ 5, 11},
-	{ 6, 12},
-	{ 7, 12},
-	{ 8, 12},
-	{ 9, 12},
-	{10, 12},
-	{11, 12},
-	{12, 12},
-	{13, 11},
-	{13, 10},
-	{13,  9},
-	{13,  8},
-	{13,  7},
-	{13,  6},
-	{14,  5},
-	{15,  5},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_49[] = {
-	{ 9,  0},
-	{ 9,  1},
-	{10,  2},
-	{11,  2},
-	{12,  3},
-	{12,  4},
-	{12,  5},
-	{12,  6},
-	{12,  7},
-	{12,  8},
-	{12,  9},
-	{11, 10},
-	{10, 10},
-	{ 9, 10},
-	{ 8, 10},
-	{ 7, 10},
-	{ 6, 10},
-	{ 7, 10},
-	{ 8, 10},
-	{ 9, 10},
-	{10, 10},
-	{11, 10},
-	{12,  9},
-	{12,  8},
-	{12,  7},
-	{12,  6},
-	{12,  5},
-	{12,  4},
-	{12,  3},
-	{11,  2},
-	{10,  2},
-	{ 9,  2},
-	{ 8,  2},
-	{ 7,  2},
-	{ 6,  2},
-	{ 5,  1},
-	{ 5,  0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_50[] = {
-	{15,  9},
-	{14,  9},
-	{13, 10},
-	{13, 11},
-	{12, 12},
-	{11, 12},
-	{10, 12},
-	{ 9, 11},
-	{ 9, 10},
-	{ 9,  9},
-	{ 9,  8},
-	{ 9,  7},
-	{ 9,  6},
-	{ 9,  7},
-	{ 9,  8},
-	{ 9,  9},
-	{ 9, 10},
-	{ 9, 11},
-	{10, 12},
-	{11, 12},
-	{12, 12},
-	{13, 11},
-	{13, 10},
-	{13,  9},
-	{13,  8},
-	{13,  7},
-	{13,  6},
-	{14,  5},
-	{15,  5},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_51[] = {
-	{ 9, 0},
-	{ 9, 1},
-	{10, 2},
-	{11, 2},
-	{12, 3},
-	{12, 4},
-	{12, 5},
-	{11, 6},
-	{10, 6},
-	{ 9, 6},
-	{ 8, 6},
-	{ 7, 6},
-	{ 6, 6},
-	{ 7, 6},
-	{ 8, 6},
-	{ 9, 6},
-	{10, 6},
-	{11, 6},
-	{12, 5},
-	{12, 4},
-	{12, 3},
-	{11, 2},
-	{10, 2},
-	{ 9, 2},
-	{ 8, 2},
-	{ 7, 2},
-	{ 6, 2},
-	{ 5, 1},
-	{ 5, 0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_56[] = {
-	{ 0, 5},
-	{ 1, 5},
-	{ 2, 4},
-	{ 3, 3},
-	{ 4, 3},
-	{ 5, 3},
-	{ 6, 3},
-	{ 7, 3},
-	{ 8, 3},
-	{ 9, 3},
-	{10, 4},
-	{10, 5},
-	{10, 6},
-	{10, 7},
-	{10, 8},
-	{10, 9},
-	{10, 8},
-	{10, 7},
-	{10, 6},
-	{10, 5},
-	{10, 4},
-	{ 9, 3},
-	{ 8, 3},
-	{ 7, 3},
-	{ 6, 3},
-	{ 5, 3},
-	{ 4, 3},
-	{ 3, 3},
-	{ 2, 4},
-	{ 2, 5},
-	{ 2, 6},
-	{ 2, 7},
-	{ 2, 8},
-	{ 1, 9},
-	{ 0, 9},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_57[] = {
-	{5, 15},
-	{5, 14},
-	{4, 13},
-	{3, 12},
-	{3, 11},
-	{3, 10},
-	{3,  9},
-	{3,  8},
-	{3,  7},
-	{3,  6},
-	{4,  5},
-	{5,  5},
-	{6,  5},
-	{7,  5},
-	{8,  5},
-	{9,  5},
-	{8,  5},
-	{7,  5},
-	{6,  5},
-	{5,  5},
-	{4,  5},
-	{3,  6},
-	{3,  7},
-	{3,  8},
-	{3,  9},
-	{3, 10},
-	{3, 11},
-	{3, 12},
-	{4, 13},
-	{5, 13},
-	{6, 13},
-	{7, 13},
-	{8, 13},
-	{9, 14},
-	{9, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_58[] = {
-	{0, 5},
-	{1, 5},
-	{2, 4},
-	{3, 3},
-	{4, 3},
-	{5, 3},
-	{6, 4},
-	{6, 5},
-	{6, 6},
-	{6, 7},
-	{6, 8},
-	{6, 9},
-	{6, 8},
-	{6, 7},
-	{6, 6},
-	{6, 5},
-	{6, 4},
-	{5, 3},
-	{4, 3},
-	{3, 3},
-	{2, 4},
-	{2, 5},
-	{2, 6},
-	{2, 7},
-	{2, 8},
-	{1, 9},
-	{0, 9},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_drive_data_59[] = {
-	{5, 15},
-	{5, 14},
-	{4, 13},
-	{3, 12},
-	{3, 11},
-	{3, 10},
-	{4,  9},
-	{5,  9},
-	{6,  9},
-	{7,  9},
-	{8,  9},
-	{9,  9},
-	{8,  9},
-	{7,  9},
-	{6,  9},
-	{5,  9},
-	{4,  9},
-	{3, 10},
-	{3, 11},
-	{3, 12},
-	{4, 13},
-	{5, 13},
-	{6, 13},
-	{7, 13},
-	{8, 13},
-	{9, 14},
-	{9, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-
-static const RoadDriveEntry * const _road_road_drive_data[] = {
-	_roadveh_drive_data_0,
-	_roadveh_drive_data_1,
-	_roadveh_drive_data_2,
-	_roadveh_drive_data_3,
-	_roadveh_drive_data_4,
-	_roadveh_drive_data_5,
-	_roadveh_drive_data_6,
-	_roadveh_drive_data_7,
-	_roadveh_drive_data_8,
-	_roadveh_drive_data_9,
-	_roadveh_drive_data_10,
-	_roadveh_drive_data_11,
-	_roadveh_drive_data_12,
-	_roadveh_drive_data_13,
-	_roadveh_drive_data_14,
-	_roadveh_drive_data_15,
-	_roadveh_drive_data_16,
-	_roadveh_drive_data_17,
-	_roadveh_drive_data_18,
-	_roadveh_drive_data_19,
-	_roadveh_drive_data_20,
-	_roadveh_drive_data_21,
-	_roadveh_drive_data_22,
-	_roadveh_drive_data_23,
-	_roadveh_drive_data_24,
-	_roadveh_drive_data_25,
-	_roadveh_drive_data_26,
-	_roadveh_drive_data_27,
-	_roadveh_drive_data_28,
-	_roadveh_drive_data_29,
-	_roadveh_drive_data_30,
-	_roadveh_drive_data_31,
-	_roadveh_drive_data_32,
-	_roadveh_drive_data_33,
-	_roadveh_drive_data_34,
-	_roadveh_drive_data_35,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	_roadveh_drive_data_40,
-	_roadveh_drive_data_41,
-	_roadveh_drive_data_42,
-	_roadveh_drive_data_43,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	_roadveh_drive_data_48,
-	_roadveh_drive_data_49,
-	_roadveh_drive_data_50,
-	_roadveh_drive_data_51,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	_roadveh_drive_data_56,
-	_roadveh_drive_data_57,
-	_roadveh_drive_data_58,
-	_roadveh_drive_data_59,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-};
-
-static const RoadDriveEntry _roadveh_tram_turn_ne_0[] = {
-	{15, 5},
-	{14, 5},
-	{13, 5},
-	{12, 5},
-	{11, 5},
-	{10, 5},
-	{ 9, 5},
-	{ 8, 5},
-	{ 7, 5},
-	{ 6, 5},
-	{ 5, 5},
-	{ 4, 5},
-	{ 3, 5},
-	{ 2, 5},
-	{ 1, 5},
-	{ 0, 5},
-	{ 0, 6},
-	{ 0, 7},
-	{ 0, 8},
-	{ 0, 9},
-	{RDE_TURNED | DIAGDIR_SW, 0},
-	{ 1, 9},
-	{ 2, 9},
-	{ 3, 9},
-	{ 4, 9},
-	{ 5, 9},
-	{ 6, 9},
-	{ 7, 9},
-	{ 8, 9},
-	{ 9, 9},
-	{10, 9},
-	{11, 9},
-	{12, 9},
-	{13, 9},
-	{14, 9},
-	{15, 9},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-
-static const RoadDriveEntry _roadveh_tram_turn_ne_1[] = {
-	{15, 9},
-	{14, 9},
-	{13, 9},
-	{12, 9},
-	{11, 9},
-	{10, 9},
-	{ 9, 9},
-	{ 8, 9},
-	{ 7, 9},
-	{ 6, 9},
-	{ 5, 9},
-	{ 4, 9},
-	{ 3, 9},
-	{ 2, 9},
-	{ 1, 9},
-	{ 0, 9},
-	{ 0, 8},
-	{ 0, 7},
-	{ 0, 6},
-	{ 0, 5},
-	{RDE_TURNED | DIAGDIR_SW, 0},
-	{ 1, 5},
-	{ 2, 5},
-	{ 3, 5},
-	{ 4, 5},
-	{ 5, 5},
-	{ 6, 5},
-	{ 7, 5},
-	{ 8, 5},
-	{ 9, 5},
-	{10, 5},
-	{11, 5},
-	{12, 5},
-	{13, 5},
-	{14, 5},
-	{15, 5},
-	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
-};
-
-static const RoadDriveEntry _roadveh_tram_turn_se_0[] = {
-	{5,  0},
-	{5,  1},
-	{5,  2},
-	{5,  3},
-	{5,  4},
-	{5,  5},
-	{5,  6},
-	{5,  7},
-	{5,  8},
-	{5,  9},
-	{5, 10},
-	{5, 11},
-	{5, 12},
-	{5, 13},
-	{5, 14},
-	{5, 15},
-	{6, 15},
-	{7, 15},
-	{8, 15},
-	{9, 15},
-	{RDE_TURNED | DIAGDIR_NW, 0},
-	{9, 14},
-	{9, 13},
-	{9, 12},
-	{9, 11},
-	{9, 10},
-	{9,  9},
-	{9,  8},
-	{9,  7},
-	{9,  6},
-	{9,  5},
-	{9,  4},
-	{9,  3},
-	{9,  2},
-	{9,  1},
-	{9,  0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-
-static const RoadDriveEntry _roadveh_tram_turn_se_1[] = {
-	{9,  0},
-	{9,  1},
-	{9,  2},
-	{9,  3},
-	{9,  4},
-	{9,  5},
-	{9,  6},
-	{9,  7},
-	{9,  8},
-	{9,  9},
-	{9, 10},
-	{9, 11},
-	{9, 12},
-	{9, 13},
-	{9, 14},
-	{9, 15},
-	{8, 15},
-	{7, 15},
-	{6, 15},
-	{5, 15},
-	{RDE_TURNED | DIAGDIR_NW, 0},
-	{5, 14},
-	{5, 13},
-	{5, 12},
-	{5, 11},
-	{5, 10},
-	{5,  9},
-	{5,  8},
-	{5,  7},
-	{5,  6},
-	{5,  5},
-	{5,  4},
-	{5,  3},
-	{5,  2},
-	{5,  1},
-	{5,  0},
-	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
-};
-
-static const RoadDriveEntry _roadveh_tram_turn_sw_0[] = {
-	{ 0, 9},
-	{ 1, 9},
-	{ 2, 9},
-	{ 3, 9},
-	{ 4, 9},
-	{ 5, 9},
-	{ 6, 9},
-	{ 7, 9},
-	{ 8, 9},
-	{ 9, 9},
-	{10, 9},
-	{11, 9},
-	{12, 9},
-	{13, 9},
-	{14, 9},
-	{15, 9},
-	{15, 8},
-	{15, 7},
-	{15, 6},
-	{15, 5},
-	{RDE_TURNED | DIAGDIR_SW, 0},
-	{14, 5},
-	{13, 5},
-	{12, 5},
-	{11, 5},
-	{10, 5},
-	{ 9, 5},
-	{ 8, 5},
-	{ 7, 5},
-	{ 6, 5},
-	{ 5, 5},
-	{ 4, 5},
-	{ 3, 5},
-	{ 2, 5},
-	{ 1, 5},
-	{ 0, 5},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-static const RoadDriveEntry _roadveh_tram_turn_sw_1[] = {
-	{ 0, 5},
-	{ 1, 5},
-	{ 2, 5},
-	{ 3, 5},
-	{ 4, 5},
-	{ 5, 5},
-	{ 6, 5},
-	{ 7, 5},
-	{ 8, 5},
-	{ 9, 5},
-	{10, 5},
-	{11, 5},
-	{12, 5},
-	{13, 5},
-	{14, 5},
-	{15, 5},
-	{15, 6},
-	{15, 7},
-	{15, 8},
-	{15, 9},
-	{RDE_TURNED | DIAGDIR_NE, 0},
-	{14, 9},
-	{13, 9},
-	{12, 9},
-	{11, 9},
-	{10, 9},
-	{ 9, 9},
-	{ 8, 9},
-	{ 7, 9},
-	{ 6, 9},
-	{ 5, 9},
-	{ 4, 9},
-	{ 3, 9},
-	{ 2, 9},
-	{ 1, 9},
-	{ 0, 9},
-	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
-};
-
-static const RoadDriveEntry _roadveh_tram_turn_nw_0[] = {
-	{9, 15},
-	{9, 14},
-	{9, 13},
-	{9, 12},
-	{9, 11},
-	{9, 10},
-	{9,  9},
-	{9,  8},
-	{9,  7},
-	{9,  6},
-	{9,  5},
-	{9,  4},
-	{9,  3},
-	{9,  2},
-	{9,  1},
-	{9,  0},
-	{8,  0},
-	{7,  0},
-	{6,  0},
-	{5,  0},
-	{RDE_TURNED | DIAGDIR_SE, 0},
-	{5,  1},
-	{5,  2},
-	{5,  3},
-	{5,  4},
-	{5,  5},
-	{5,  6},
-	{5,  7},
-	{5,  8},
-	{5,  9},
-	{5, 10},
-	{5, 11},
-	{5, 12},
-	{5, 13},
-	{5, 14},
-	{5, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-static const RoadDriveEntry _roadveh_tram_turn_nw_1[] = {
-	{5, 15},
-	{5, 14},
-	{5, 13},
-	{5, 12},
-	{5, 11},
-	{5, 10},
-	{5,  9},
-	{5,  8},
-	{5,  7},
-	{5,  6},
-	{5,  5},
-	{5,  4},
-	{5,  3},
-	{5,  2},
-	{5,  1},
-	{5,  0},
-	{6,  0},
-	{7,  0},
-	{8,  0},
-	{9,  0},
-	{RDE_TURNED | DIAGDIR_SE, 0},
-	{9,  1},
-	{9,  2},
-	{9,  3},
-	{9,  4},
-	{9,  5},
-	{9,  6},
-	{9,  7},
-	{9,  8},
-	{9,  9},
-	{9, 10},
-	{9, 11},
-	{9, 12},
-	{9, 13},
-	{9, 14},
-	{9, 15},
-	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
-};
-
-static const RoadDriveEntry * const _road_tram_drive_data[] = {
-	_roadveh_drive_data_0,
-	_roadveh_drive_data_1,
-	_roadveh_drive_data_2,
-	_roadveh_drive_data_3,
-	_roadveh_drive_data_4,
-	_roadveh_drive_data_5,
-	_roadveh_tram_turn_ne_0,
-	_roadveh_tram_turn_se_0,
-	_roadveh_drive_data_8,
-	_roadveh_drive_data_9,
-	_roadveh_drive_data_10,
-	_roadveh_drive_data_11,
-	_roadveh_drive_data_12,
-	_roadveh_drive_data_13,
-	_roadveh_tram_turn_sw_0,
-	_roadveh_tram_turn_nw_0,
-	_roadveh_drive_data_16,
-	_roadveh_drive_data_17,
-	_roadveh_drive_data_18,
-	_roadveh_drive_data_19,
-	_roadveh_drive_data_20,
-	_roadveh_drive_data_21,
-	_roadveh_tram_turn_ne_1,
-	_roadveh_tram_turn_se_1,
-	_roadveh_drive_data_24,
-	_roadveh_drive_data_25,
-	_roadveh_drive_data_26,
-	_roadveh_drive_data_27,
-	_roadveh_drive_data_28,
-	_roadveh_drive_data_29,
-	_roadveh_tram_turn_sw_1,
-	_roadveh_tram_turn_nw_1,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-};
-
-static const RoadDriveEntry * const * const _road_drive_data[2] = {
-	_road_road_drive_data,
-	_road_tram_drive_data,
-};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/table/roadveh_movement.h	Mon Mar 10 15:26:39 2008 +0000
@@ -0,0 +1,1470 @@
+/* $Id$ */
+
+/** @file table/roadveh_movement.h Data about how a road vehicle must drive on a tile */
+
+static const RoadDriveEntry _roadveh_drive_data_0[] = {
+	{15, 5},
+	{14, 5},
+	{13, 5},
+	{12, 5},
+	{11, 5},
+	{10, 5},
+	{ 9, 5},
+	{ 8, 5},
+	{ 7, 5},
+	{ 6, 5},
+	{ 5, 5},
+	{ 4, 5},
+	{ 3, 5},
+	{ 2, 5},
+	{ 1, 5},
+	{ 0, 5},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_1[] = {
+	{5,  0},
+	{5,  1},
+	{5,  2},
+	{5,  3},
+	{5,  4},
+	{5,  5},
+	{5,  6},
+	{5,  7},
+	{5,  8},
+	{5,  9},
+	{5, 10},
+	{5, 11},
+	{5, 12},
+	{5, 13},
+	{5, 14},
+	{5, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_2[] = {
+	{5, 0},
+	{5, 1},
+	{5, 2},
+	{4, 3},
+	{3, 4},
+	{2, 5},
+	{1, 5},
+	{0, 5},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_3[] = {
+	{15,  5},
+	{14,  5},
+	{13,  5},
+	{12,  5},
+	{11,  5},
+	{10,  5},
+	{ 9,  6},
+	{ 8,  7},
+	{ 7,  8},
+	{ 6,  9},
+	{ 5, 10},
+	{ 5, 11},
+	{ 5, 12},
+	{ 5, 13},
+	{ 5, 14},
+	{ 5, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_4[] = {
+	{ 5, 0},
+	{ 5, 1},
+	{ 5, 2},
+	{ 5, 3},
+	{ 5, 4},
+	{ 5, 5},
+	{ 6, 6},
+	{ 7, 7},
+	{ 8, 8},
+	{ 9, 9},
+	{10, 9},
+	{11, 9},
+	{12, 9},
+	{13, 9},
+	{14, 9},
+	{15, 9},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_5[] = {
+	{0,  9},
+	{1,  9},
+	{2,  9},
+	{3, 10},
+	{4, 11},
+	{5, 12},
+	{5, 13},
+	{5, 14},
+	{5, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_6[] = {
+	{0, 6},
+	{0, 7},
+	{0, 8},
+	{0, 9},
+	{RDE_TURNED | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_7[] = {
+	{6, 15},
+	{7, 15},
+	{8, 15},
+	{9, 15},
+	{RDE_TURNED | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_8[] = {
+	{ 0, 9},
+	{ 1, 9},
+	{ 2, 9},
+	{ 3, 9},
+	{ 4, 9},
+	{ 5, 9},
+	{ 6, 9},
+	{ 7, 9},
+	{ 8, 9},
+	{ 9, 9},
+	{10, 9},
+	{11, 9},
+	{12, 9},
+	{13, 9},
+	{14, 9},
+	{15, 9},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_9[] = {
+	{9, 15},
+	{9, 14},
+	{9, 13},
+	{9, 12},
+	{9, 11},
+	{9, 10},
+	{9,  9},
+	{9,  8},
+	{9,  7},
+	{9,  6},
+	{9,  5},
+	{9,  4},
+	{9,  3},
+	{9,  2},
+	{9,  1},
+	{9,  0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_10[] = {
+	{0, 9},
+	{1, 9},
+	{2, 9},
+	{3, 9},
+	{4, 9},
+	{5, 9},
+	{6, 8},
+	{7, 7},
+	{8, 6},
+	{9, 5},
+	{9, 4},
+	{9, 3},
+	{9, 2},
+	{9, 1},
+	{9, 0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_11[] = {
+	{ 9, 15},
+	{ 9, 14},
+	{ 9, 13},
+	{10, 12},
+	{11, 11},
+	{12, 10},
+	{13,  9},
+	{14,  9},
+	{15,  9},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_12[] = {
+	{15, 5},
+	{14, 5},
+	{13, 5},
+	{12, 4},
+	{11, 3},
+	{10, 2},
+	{ 9, 1},
+	{ 9, 0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_13[] = {
+	{9, 15},
+	{9, 14},
+	{9, 13},
+	{9, 12},
+	{9, 11},
+	{9, 10},
+	{8,  9},
+	{7,  8},
+	{6,  7},
+	{5,  6},
+	{4,  5},
+	{3,  5},
+	{2,  5},
+	{1,  5},
+	{0,  5},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_14[] = {
+	{15, 8},
+	{15, 7},
+	{15, 6},
+	{15, 5},
+	{RDE_TURNED | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_15[] = {
+	{8, 0},
+	{7, 0},
+	{6, 0},
+	{5, 0},
+	{RDE_TURNED | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_16[] = {
+	{15, 9},
+	{14, 9},
+	{13, 9},
+	{12, 9},
+	{11, 9},
+	{10, 9},
+	{ 9, 9},
+	{ 8, 9},
+	{ 7, 9},
+	{ 6, 9},
+	{ 5, 9},
+	{ 4, 9},
+	{ 3, 9},
+	{ 2, 9},
+	{ 1, 9},
+	{ 0, 9},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_17[] = {
+	{9,  0},
+	{9,  1},
+	{9,  2},
+	{9,  3},
+	{9,  4},
+	{9,  5},
+	{9,  6},
+	{9,  7},
+	{9,  8},
+	{9,  9},
+	{9, 10},
+	{9, 11},
+	{9, 12},
+	{9, 13},
+	{9, 14},
+	{9, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_18[] = {
+	{9, 0},
+	{9, 1},
+	{9, 2},
+	{9, 3},
+	{9, 4},
+	{9, 5},
+	{8, 6},
+	{7, 7},
+	{6, 8},
+	{5, 9},
+	{4, 9},
+	{3, 9},
+	{2, 9},
+	{1, 9},
+	{0, 9},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_19[] = {
+	{15,  9},
+	{14,  9},
+	{13,  9},
+	{12, 10},
+	{11, 11},
+	{10, 12},
+	{ 9, 13},
+	{ 9, 14},
+	{ 9, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_20[] = {
+	{ 9, 0},
+	{ 9, 1},
+	{10, 2},
+	{11, 3},
+	{12, 4},
+	{13, 5},
+	{14, 5},
+	{15, 5},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_21[] = {
+	{0,  5},
+	{1,  5},
+	{2,  5},
+	{3,  5},
+	{4,  5},
+	{5,  6},
+	{6,  7},
+	{7,  8},
+	{8,  9},
+	{9, 10},
+	{9, 11},
+	{9, 12},
+	{9, 13},
+	{9, 14},
+	{9, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_22[] = {
+	{0, 8},
+	{0, 7},
+	{0, 6},
+	{0, 5},
+	{RDE_TURNED | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_23[] = {
+	{8, 15},
+	{7, 15},
+	{6, 15},
+	{5, 15},
+	{RDE_TURNED | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_24[] = {
+	{ 0, 5},
+	{ 1, 5},
+	{ 2, 5},
+	{ 3, 5},
+	{ 4, 5},
+	{ 5, 5},
+	{ 6, 5},
+	{ 7, 5},
+	{ 8, 5},
+	{ 9, 5},
+	{10, 5},
+	{11, 5},
+	{12, 5},
+	{13, 5},
+	{14, 5},
+	{15, 5},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_25[] = {
+	{5, 15},
+	{5, 14},
+	{5, 13},
+	{5, 12},
+	{5, 11},
+	{5, 10},
+	{5,  9},
+	{5,  8},
+	{5,  7},
+	{5,  6},
+	{5,  5},
+	{5,  4},
+	{5,  3},
+	{5,  2},
+	{5,  1},
+	{5,  0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_26[] = {
+	{0, 5},
+	{1, 5},
+	{2, 5},
+	{3, 4},
+	{4, 3},
+	{5, 2},
+	{5, 1},
+	{5, 0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_27[] = {
+	{ 5, 15},
+	{ 5, 14},
+	{ 5, 13},
+	{ 5, 12},
+	{ 5, 11},
+	{ 5, 10},
+	{ 6,  9},
+	{ 7,  8},
+	{ 8,  7},
+	{ 9,  6},
+	{10,  5},
+	{11,  5},
+	{12,  5},
+	{13,  5},
+	{14,  5},
+	{15,  5},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_28[] = {
+	{15, 9},
+	{14, 9},
+	{13, 9},
+	{12, 9},
+	{11, 9},
+	{10, 9},
+	{ 9, 9},
+	{ 8, 8},
+	{ 7, 7},
+	{ 6, 6},
+	{ 5, 5},
+	{ 5, 4},
+	{ 5, 3},
+	{ 5, 2},
+	{ 5, 1},
+	{ 5, 0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_29[] = {
+	{5, 15},
+	{5, 14},
+	{5, 13},
+	{5, 12},
+	{4, 11},
+	{3, 10},
+	{2,  9},
+	{1,  9},
+	{0,  9},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_30[] = {
+	{15, 6},
+	{15, 7},
+	{15, 8},
+	{15, 9},
+	{RDE_TURNED | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_31[] = {
+	{6, 0},
+	{7, 0},
+	{8, 0},
+	{9, 0},
+	{RDE_TURNED | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_32[] = {
+	{15,  5},
+	{14,  5},
+	{13,  6},
+	{13,  7},
+	{13,  8},
+	{13,  9},
+	{13, 10},
+	{13, 11},
+	{12, 12},
+	{11, 12},
+	{10, 12},
+	{ 9, 12},
+	{ 8, 12},
+	{ 7, 12},
+	{ 6, 12},
+	{ 5, 11},
+	{ 5, 10},
+	{ 5,  9},
+	{ 5,  8},
+	{ 5,  7},
+	{ 5,  6},
+	{ 5,  7},
+	{ 5,  8},
+	{ 5,  9},
+	{ 5, 10},
+	{ 5, 11},
+	{ 6, 12},
+	{ 7, 12},
+	{ 8, 12},
+	{ 9, 12},
+	{10, 12},
+	{11, 12},
+	{12, 12},
+	{13, 11},
+	{13, 10},
+	{14,  9},
+	{15,  9},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_33[] = {
+	{ 5,  0},
+	{ 5,  1},
+	{ 6,  2},
+	{ 7,  2},
+	{ 8,  2},
+	{ 9,  2},
+	{10,  2},
+	{11,  2},
+	{12,  3},
+	{12,  4},
+	{12,  5},
+	{12,  6},
+	{12,  7},
+	{12,  8},
+	{12,  9},
+	{11, 10},
+	{10, 10},
+	{ 9, 10},
+	{ 8, 10},
+	{ 7, 10},
+	{ 6, 10},
+	{ 7, 10},
+	{ 8, 10},
+	{ 9, 10},
+	{10, 10},
+	{11, 10},
+	{12,  9},
+	{12,  8},
+	{12,  7},
+	{12,  6},
+	{12,  5},
+	{12,  4},
+	{12,  3},
+	{11,  2},
+	{10,  2},
+	{ 9,  1},
+	{ 9,  0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_34[] = {
+	{15,  5},
+	{14,  5},
+	{13,  6},
+	{13,  7},
+	{13,  8},
+	{13,  9},
+	{13, 10},
+	{13, 11},
+	{12, 12},
+	{11, 12},
+	{10, 12},
+	{ 9, 11},
+	{ 9, 10},
+	{ 9,  9},
+	{ 9,  8},
+	{ 9,  7},
+	{ 9,  6},
+	{ 9,  7},
+	{ 9,  8},
+	{ 9,  9},
+	{ 9, 10},
+	{ 9, 11},
+	{10, 12},
+	{11, 12},
+	{12, 12},
+	{13, 11},
+	{13, 10},
+	{14,  9},
+	{15,  9},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_35[] = {
+	{ 5, 0},
+	{ 5, 1},
+	{ 6, 2},
+	{ 7, 2},
+	{ 8, 2},
+	{ 9, 2},
+	{10, 2},
+	{11, 2},
+	{12, 3},
+	{12, 4},
+	{12, 5},
+	{11, 6},
+	{10, 6},
+	{ 9, 6},
+	{ 8, 6},
+	{ 7, 6},
+	{ 6, 6},
+	{ 7, 6},
+	{ 8, 6},
+	{ 9, 6},
+	{10, 6},
+	{11, 6},
+	{12, 5},
+	{12, 4},
+	{12, 3},
+	{11, 2},
+	{10, 2},
+	{ 9, 1},
+	{ 9, 0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_40[] = {
+	{ 0, 9},
+	{ 1, 9},
+	{ 2, 8},
+	{ 2, 7},
+	{ 2, 6},
+	{ 2, 5},
+	{ 2, 4},
+	{ 3, 3},
+	{ 4, 3},
+	{ 5, 3},
+	{ 6, 3},
+	{ 7, 3},
+	{ 8, 3},
+	{ 9, 3},
+	{10, 4},
+	{10, 5},
+	{10, 6},
+	{10, 7},
+	{10, 8},
+	{10, 9},
+	{10, 8},
+	{10, 7},
+	{10, 6},
+	{10, 5},
+	{10, 4},
+	{ 9, 3},
+	{ 8, 3},
+	{ 7, 3},
+	{ 6, 3},
+	{ 5, 3},
+	{ 4, 3},
+	{ 3, 3},
+	{ 2, 4},
+	{ 1, 5},
+	{ 0, 5},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_41[] = {
+	{9, 15},
+	{9, 14},
+	{8, 13},
+	{7, 13},
+	{6, 13},
+	{5, 13},
+	{4, 13},
+	{3, 12},
+	{3, 11},
+	{3, 10},
+	{3,  9},
+	{3,  8},
+	{3,  7},
+	{3,  6},
+	{4,  5},
+	{5,  5},
+	{6,  5},
+	{7,  5},
+	{8,  5},
+	{9,  5},
+	{8,  5},
+	{7,  5},
+	{6,  5},
+	{5,  5},
+	{4,  5},
+	{3,  6},
+	{3,  7},
+	{3,  8},
+	{3,  9},
+	{3, 10},
+	{3, 11},
+	{3, 12},
+	{4, 13},
+	{5, 14},
+	{5, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_42[] = {
+	{0, 9},
+	{1, 9},
+	{2, 8},
+	{2, 7},
+	{2, 6},
+	{2, 5},
+	{2, 4},
+	{3, 3},
+	{4, 3},
+	{5, 3},
+	{6, 4},
+	{6, 5},
+	{6, 6},
+	{6, 7},
+	{6, 8},
+	{6, 9},
+	{6, 8},
+	{6, 7},
+	{6, 6},
+	{6, 5},
+	{6, 4},
+	{5, 3},
+	{4, 3},
+	{3, 3},
+	{2, 4},
+	{1, 5},
+	{0, 5},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_43[] = {
+	{9, 15},
+	{9, 14},
+	{8, 13},
+	{7, 13},
+	{6, 13},
+	{5, 13},
+	{4, 13},
+	{3, 12},
+	{3, 11},
+	{3, 10},
+	{4,  9},
+	{5,  9},
+	{6,  9},
+	{7,  9},
+	{8,  9},
+	{9,  9},
+	{8,  9},
+	{7,  9},
+	{6,  9},
+	{5,  9},
+	{4,  9},
+	{3, 10},
+	{3, 11},
+	{3, 12},
+	{4, 13},
+	{5, 14},
+	{5, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_48[] = {
+	{15,  9},
+	{14,  9},
+	{13, 10},
+	{13, 11},
+	{12, 12},
+	{11, 12},
+	{10, 12},
+	{ 9, 12},
+	{ 8, 12},
+	{ 7, 12},
+	{ 6, 12},
+	{ 5, 11},
+	{ 5, 10},
+	{ 5,  9},
+	{ 5,  8},
+	{ 5,  7},
+	{ 5,  6},
+	{ 5,  7},
+	{ 5,  8},
+	{ 5,  9},
+	{ 5, 10},
+	{ 5, 11},
+	{ 6, 12},
+	{ 7, 12},
+	{ 8, 12},
+	{ 9, 12},
+	{10, 12},
+	{11, 12},
+	{12, 12},
+	{13, 11},
+	{13, 10},
+	{13,  9},
+	{13,  8},
+	{13,  7},
+	{13,  6},
+	{14,  5},
+	{15,  5},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_49[] = {
+	{ 9,  0},
+	{ 9,  1},
+	{10,  2},
+	{11,  2},
+	{12,  3},
+	{12,  4},
+	{12,  5},
+	{12,  6},
+	{12,  7},
+	{12,  8},
+	{12,  9},
+	{11, 10},
+	{10, 10},
+	{ 9, 10},
+	{ 8, 10},
+	{ 7, 10},
+	{ 6, 10},
+	{ 7, 10},
+	{ 8, 10},
+	{ 9, 10},
+	{10, 10},
+	{11, 10},
+	{12,  9},
+	{12,  8},
+	{12,  7},
+	{12,  6},
+	{12,  5},
+	{12,  4},
+	{12,  3},
+	{11,  2},
+	{10,  2},
+	{ 9,  2},
+	{ 8,  2},
+	{ 7,  2},
+	{ 6,  2},
+	{ 5,  1},
+	{ 5,  0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_50[] = {
+	{15,  9},
+	{14,  9},
+	{13, 10},
+	{13, 11},
+	{12, 12},
+	{11, 12},
+	{10, 12},
+	{ 9, 11},
+	{ 9, 10},
+	{ 9,  9},
+	{ 9,  8},
+	{ 9,  7},
+	{ 9,  6},
+	{ 9,  7},
+	{ 9,  8},
+	{ 9,  9},
+	{ 9, 10},
+	{ 9, 11},
+	{10, 12},
+	{11, 12},
+	{12, 12},
+	{13, 11},
+	{13, 10},
+	{13,  9},
+	{13,  8},
+	{13,  7},
+	{13,  6},
+	{14,  5},
+	{15,  5},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_51[] = {
+	{ 9, 0},
+	{ 9, 1},
+	{10, 2},
+	{11, 2},
+	{12, 3},
+	{12, 4},
+	{12, 5},
+	{11, 6},
+	{10, 6},
+	{ 9, 6},
+	{ 8, 6},
+	{ 7, 6},
+	{ 6, 6},
+	{ 7, 6},
+	{ 8, 6},
+	{ 9, 6},
+	{10, 6},
+	{11, 6},
+	{12, 5},
+	{12, 4},
+	{12, 3},
+	{11, 2},
+	{10, 2},
+	{ 9, 2},
+	{ 8, 2},
+	{ 7, 2},
+	{ 6, 2},
+	{ 5, 1},
+	{ 5, 0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_56[] = {
+	{ 0, 5},
+	{ 1, 5},
+	{ 2, 4},
+	{ 3, 3},
+	{ 4, 3},
+	{ 5, 3},
+	{ 6, 3},
+	{ 7, 3},
+	{ 8, 3},
+	{ 9, 3},
+	{10, 4},
+	{10, 5},
+	{10, 6},
+	{10, 7},
+	{10, 8},
+	{10, 9},
+	{10, 8},
+	{10, 7},
+	{10, 6},
+	{10, 5},
+	{10, 4},
+	{ 9, 3},
+	{ 8, 3},
+	{ 7, 3},
+	{ 6, 3},
+	{ 5, 3},
+	{ 4, 3},
+	{ 3, 3},
+	{ 2, 4},
+	{ 2, 5},
+	{ 2, 6},
+	{ 2, 7},
+	{ 2, 8},
+	{ 1, 9},
+	{ 0, 9},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_57[] = {
+	{5, 15},
+	{5, 14},
+	{4, 13},
+	{3, 12},
+	{3, 11},
+	{3, 10},
+	{3,  9},
+	{3,  8},
+	{3,  7},
+	{3,  6},
+	{4,  5},
+	{5,  5},
+	{6,  5},
+	{7,  5},
+	{8,  5},
+	{9,  5},
+	{8,  5},
+	{7,  5},
+	{6,  5},
+	{5,  5},
+	{4,  5},
+	{3,  6},
+	{3,  7},
+	{3,  8},
+	{3,  9},
+	{3, 10},
+	{3, 11},
+	{3, 12},
+	{4, 13},
+	{5, 13},
+	{6, 13},
+	{7, 13},
+	{8, 13},
+	{9, 14},
+	{9, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_58[] = {
+	{0, 5},
+	{1, 5},
+	{2, 4},
+	{3, 3},
+	{4, 3},
+	{5, 3},
+	{6, 4},
+	{6, 5},
+	{6, 6},
+	{6, 7},
+	{6, 8},
+	{6, 9},
+	{6, 8},
+	{6, 7},
+	{6, 6},
+	{6, 5},
+	{6, 4},
+	{5, 3},
+	{4, 3},
+	{3, 3},
+	{2, 4},
+	{2, 5},
+	{2, 6},
+	{2, 7},
+	{2, 8},
+	{1, 9},
+	{0, 9},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_drive_data_59[] = {
+	{5, 15},
+	{5, 14},
+	{4, 13},
+	{3, 12},
+	{3, 11},
+	{3, 10},
+	{4,  9},
+	{5,  9},
+	{6,  9},
+	{7,  9},
+	{8,  9},
+	{9,  9},
+	{8,  9},
+	{7,  9},
+	{6,  9},
+	{5,  9},
+	{4,  9},
+	{3, 10},
+	{3, 11},
+	{3, 12},
+	{4, 13},
+	{5, 13},
+	{6, 13},
+	{7, 13},
+	{8, 13},
+	{9, 14},
+	{9, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+
+static const RoadDriveEntry * const _road_road_drive_data[] = {
+	_roadveh_drive_data_0,
+	_roadveh_drive_data_1,
+	_roadveh_drive_data_2,
+	_roadveh_drive_data_3,
+	_roadveh_drive_data_4,
+	_roadveh_drive_data_5,
+	_roadveh_drive_data_6,
+	_roadveh_drive_data_7,
+	_roadveh_drive_data_8,
+	_roadveh_drive_data_9,
+	_roadveh_drive_data_10,
+	_roadveh_drive_data_11,
+	_roadveh_drive_data_12,
+	_roadveh_drive_data_13,
+	_roadveh_drive_data_14,
+	_roadveh_drive_data_15,
+	_roadveh_drive_data_16,
+	_roadveh_drive_data_17,
+	_roadveh_drive_data_18,
+	_roadveh_drive_data_19,
+	_roadveh_drive_data_20,
+	_roadveh_drive_data_21,
+	_roadveh_drive_data_22,
+	_roadveh_drive_data_23,
+	_roadveh_drive_data_24,
+	_roadveh_drive_data_25,
+	_roadveh_drive_data_26,
+	_roadveh_drive_data_27,
+	_roadveh_drive_data_28,
+	_roadveh_drive_data_29,
+	_roadveh_drive_data_30,
+	_roadveh_drive_data_31,
+	_roadveh_drive_data_32,
+	_roadveh_drive_data_33,
+	_roadveh_drive_data_34,
+	_roadveh_drive_data_35,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	_roadveh_drive_data_40,
+	_roadveh_drive_data_41,
+	_roadveh_drive_data_42,
+	_roadveh_drive_data_43,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	_roadveh_drive_data_48,
+	_roadveh_drive_data_49,
+	_roadveh_drive_data_50,
+	_roadveh_drive_data_51,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	_roadveh_drive_data_56,
+	_roadveh_drive_data_57,
+	_roadveh_drive_data_58,
+	_roadveh_drive_data_59,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_ne_0[] = {
+	{15, 5},
+	{14, 5},
+	{13, 5},
+	{12, 5},
+	{11, 5},
+	{10, 5},
+	{ 9, 5},
+	{ 8, 5},
+	{ 7, 5},
+	{ 6, 5},
+	{ 5, 5},
+	{ 4, 5},
+	{ 3, 5},
+	{ 2, 5},
+	{ 1, 5},
+	{ 0, 5},
+	{ 0, 6},
+	{ 0, 7},
+	{ 0, 8},
+	{ 0, 9},
+	{RDE_TURNED | DIAGDIR_SW, 0},
+	{ 1, 9},
+	{ 2, 9},
+	{ 3, 9},
+	{ 4, 9},
+	{ 5, 9},
+	{ 6, 9},
+	{ 7, 9},
+	{ 8, 9},
+	{ 9, 9},
+	{10, 9},
+	{11, 9},
+	{12, 9},
+	{13, 9},
+	{14, 9},
+	{15, 9},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_ne_1[] = {
+	{15, 9},
+	{14, 9},
+	{13, 9},
+	{12, 9},
+	{11, 9},
+	{10, 9},
+	{ 9, 9},
+	{ 8, 9},
+	{ 7, 9},
+	{ 6, 9},
+	{ 5, 9},
+	{ 4, 9},
+	{ 3, 9},
+	{ 2, 9},
+	{ 1, 9},
+	{ 0, 9},
+	{ 0, 8},
+	{ 0, 7},
+	{ 0, 6},
+	{ 0, 5},
+	{RDE_TURNED | DIAGDIR_SW, 0},
+	{ 1, 5},
+	{ 2, 5},
+	{ 3, 5},
+	{ 4, 5},
+	{ 5, 5},
+	{ 6, 5},
+	{ 7, 5},
+	{ 8, 5},
+	{ 9, 5},
+	{10, 5},
+	{11, 5},
+	{12, 5},
+	{13, 5},
+	{14, 5},
+	{15, 5},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_se_0[] = {
+	{5,  0},
+	{5,  1},
+	{5,  2},
+	{5,  3},
+	{5,  4},
+	{5,  5},
+	{5,  6},
+	{5,  7},
+	{5,  8},
+	{5,  9},
+	{5, 10},
+	{5, 11},
+	{5, 12},
+	{5, 13},
+	{5, 14},
+	{5, 15},
+	{6, 15},
+	{7, 15},
+	{8, 15},
+	{9, 15},
+	{RDE_TURNED | DIAGDIR_NW, 0},
+	{9, 14},
+	{9, 13},
+	{9, 12},
+	{9, 11},
+	{9, 10},
+	{9,  9},
+	{9,  8},
+	{9,  7},
+	{9,  6},
+	{9,  5},
+	{9,  4},
+	{9,  3},
+	{9,  2},
+	{9,  1},
+	{9,  0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_se_1[] = {
+	{9,  0},
+	{9,  1},
+	{9,  2},
+	{9,  3},
+	{9,  4},
+	{9,  5},
+	{9,  6},
+	{9,  7},
+	{9,  8},
+	{9,  9},
+	{9, 10},
+	{9, 11},
+	{9, 12},
+	{9, 13},
+	{9, 14},
+	{9, 15},
+	{8, 15},
+	{7, 15},
+	{6, 15},
+	{5, 15},
+	{RDE_TURNED | DIAGDIR_NW, 0},
+	{5, 14},
+	{5, 13},
+	{5, 12},
+	{5, 11},
+	{5, 10},
+	{5,  9},
+	{5,  8},
+	{5,  7},
+	{5,  6},
+	{5,  5},
+	{5,  4},
+	{5,  3},
+	{5,  2},
+	{5,  1},
+	{5,  0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_sw_0[] = {
+	{ 0, 9},
+	{ 1, 9},
+	{ 2, 9},
+	{ 3, 9},
+	{ 4, 9},
+	{ 5, 9},
+	{ 6, 9},
+	{ 7, 9},
+	{ 8, 9},
+	{ 9, 9},
+	{10, 9},
+	{11, 9},
+	{12, 9},
+	{13, 9},
+	{14, 9},
+	{15, 9},
+	{15, 8},
+	{15, 7},
+	{15, 6},
+	{15, 5},
+	{RDE_TURNED | DIAGDIR_SW, 0},
+	{14, 5},
+	{13, 5},
+	{12, 5},
+	{11, 5},
+	{10, 5},
+	{ 9, 5},
+	{ 8, 5},
+	{ 7, 5},
+	{ 6, 5},
+	{ 5, 5},
+	{ 4, 5},
+	{ 3, 5},
+	{ 2, 5},
+	{ 1, 5},
+	{ 0, 5},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_tram_turn_sw_1[] = {
+	{ 0, 5},
+	{ 1, 5},
+	{ 2, 5},
+	{ 3, 5},
+	{ 4, 5},
+	{ 5, 5},
+	{ 6, 5},
+	{ 7, 5},
+	{ 8, 5},
+	{ 9, 5},
+	{10, 5},
+	{11, 5},
+	{12, 5},
+	{13, 5},
+	{14, 5},
+	{15, 5},
+	{15, 6},
+	{15, 7},
+	{15, 8},
+	{15, 9},
+	{RDE_TURNED | DIAGDIR_NE, 0},
+	{14, 9},
+	{13, 9},
+	{12, 9},
+	{11, 9},
+	{10, 9},
+	{ 9, 9},
+	{ 8, 9},
+	{ 7, 9},
+	{ 6, 9},
+	{ 5, 9},
+	{ 4, 9},
+	{ 3, 9},
+	{ 2, 9},
+	{ 1, 9},
+	{ 0, 9},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_nw_0[] = {
+	{9, 15},
+	{9, 14},
+	{9, 13},
+	{9, 12},
+	{9, 11},
+	{9, 10},
+	{9,  9},
+	{9,  8},
+	{9,  7},
+	{9,  6},
+	{9,  5},
+	{9,  4},
+	{9,  3},
+	{9,  2},
+	{9,  1},
+	{9,  0},
+	{8,  0},
+	{7,  0},
+	{6,  0},
+	{5,  0},
+	{RDE_TURNED | DIAGDIR_SE, 0},
+	{5,  1},
+	{5,  2},
+	{5,  3},
+	{5,  4},
+	{5,  5},
+	{5,  6},
+	{5,  7},
+	{5,  8},
+	{5,  9},
+	{5, 10},
+	{5, 11},
+	{5, 12},
+	{5, 13},
+	{5, 14},
+	{5, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_tram_turn_nw_1[] = {
+	{5, 15},
+	{5, 14},
+	{5, 13},
+	{5, 12},
+	{5, 11},
+	{5, 10},
+	{5,  9},
+	{5,  8},
+	{5,  7},
+	{5,  6},
+	{5,  5},
+	{5,  4},
+	{5,  3},
+	{5,  2},
+	{5,  1},
+	{5,  0},
+	{6,  0},
+	{7,  0},
+	{8,  0},
+	{9,  0},
+	{RDE_TURNED | DIAGDIR_SE, 0},
+	{9,  1},
+	{9,  2},
+	{9,  3},
+	{9,  4},
+	{9,  5},
+	{9,  6},
+	{9,  7},
+	{9,  8},
+	{9,  9},
+	{9, 10},
+	{9, 11},
+	{9, 12},
+	{9, 13},
+	{9, 14},
+	{9, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+
+static const RoadDriveEntry * const _road_tram_drive_data[] = {
+	_roadveh_drive_data_0,
+	_roadveh_drive_data_1,
+	_roadveh_drive_data_2,
+	_roadveh_drive_data_3,
+	_roadveh_drive_data_4,
+	_roadveh_drive_data_5,
+	_roadveh_tram_turn_ne_0,
+	_roadveh_tram_turn_se_0,
+	_roadveh_drive_data_8,
+	_roadveh_drive_data_9,
+	_roadveh_drive_data_10,
+	_roadveh_drive_data_11,
+	_roadveh_drive_data_12,
+	_roadveh_drive_data_13,
+	_roadveh_tram_turn_sw_0,
+	_roadveh_tram_turn_nw_0,
+	_roadveh_drive_data_16,
+	_roadveh_drive_data_17,
+	_roadveh_drive_data_18,
+	_roadveh_drive_data_19,
+	_roadveh_drive_data_20,
+	_roadveh_drive_data_21,
+	_roadveh_tram_turn_ne_1,
+	_roadveh_tram_turn_se_1,
+	_roadveh_drive_data_24,
+	_roadveh_drive_data_25,
+	_roadveh_drive_data_26,
+	_roadveh_drive_data_27,
+	_roadveh_drive_data_28,
+	_roadveh_drive_data_29,
+	_roadveh_tram_turn_sw_1,
+	_roadveh_tram_turn_nw_1,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+};
+
+static const RoadDriveEntry * const * const _road_drive_data[2] = {
+	_road_road_drive_data,
+	_road_tram_drive_data,
+};
--- a/src/table/sprites.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/table/sprites.h	Mon Mar 10 15:26:39 2008 +0000
@@ -272,6 +272,8 @@
 	SPR_MONO_SNOW_OFFSET        = 26,
 	SPR_MGLV_SNOW_OFFSET        = 26,
 
+	SPR_ORIGINAL_SIGNALS_BASE   = 1275,
+
 	SPR_RAIL_SINGLE_Y           = 1005,
 	SPR_RAIL_SINGLE_X           = 1006,
 	SPR_RAIL_SINGLE_NORTH       = 1007,
@@ -684,7 +686,7 @@
 	SPR_BTSGA_X_FRONT           = 2503,
 	SPR_BTSGA_Y_FRONT           = 2504,
 	SPR_BTSGA_X_PILLAR          = 2505,
-	SPR_BTSGA_Y_PILLAR          = 2606,
+	SPR_BTSGA_Y_PILLAR          = 2506,
 	SPR_BTSGA_MONO_X_REAR       = 4324,
 	SPR_BTSGA_MONO_Y_REAR       = 4325,
 	SPR_BTSGA_MGLV_X_REAR       = 4364,
@@ -716,8 +718,8 @@
 	SPR_BTSUS_ROAD_X_REAR_TILE_B  = 2462,
 	SPR_BTSUS_X_FRONT_TILE_A      = 2463,
 	SPR_BTSUS_X_FRONT_TILE_B      = 2464,
-	SPR_BTSUS_ROAD_X_TILE_D       = 2465,
-	SPR_BTSUS_ROAD_X_TILE_C       = 2466,
+	SPR_BTSUS_ROAD_X_REAR_TILE_D  = 2465,
+	SPR_BTSUS_ROAD_X_REAR_TILE_C  = 2466,
 	SPR_BTSUS_X_FRONT_TILE_D      = 2467,
 	SPR_BTSUS_X_FRONT_TILE_C      = 2468,
 	SPR_BTSUS_RAIL_Y_REAR_TILE_A  = 2469,
--- a/src/table/station_land.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/table/station_land.h	Mon Mar 10 15:26:39 2008 +0000
@@ -1,426 +1,428 @@
 /* $Id$ */
 
-#define TILE_SEQ_END()	{ (byte)0x80, 0, 0, 0, 0, 0, 0, 0 }
+#define TILE_SEQ_LINE(dx, dy, dz, sx, sy, sz, img) { dx, dy, dz, sx, sy, sz, {img, PAL_NONE} },
+#define TILE_SEQ_LINE_PAL(dx, dy, dz, sx, sy, sz, img, pal) { dx, dy, dz, sx, sy, sz, {img, pal} },
+#define TILE_SEQ_END() { (byte)0x80, 0, 0, 0, 0, 0, {0, 0} }
 
 static const DrawTileSeqStruct _station_display_nothing[] = {
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_0[] = {
-	{  0,  0,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_REAR  | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_FRONT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_REAR  | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_FRONT | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_1[] = {
-	{  0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_REAR  | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_FRONT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_REAR  | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_FRONT | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_2[] = {
-	{  0,  0,  0, 16,  5,  2, SPR_RAIL_PLATFORM_BUILDING_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_FRONT    | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0, 16,  5,  2, SPR_RAIL_PLATFORM_BUILDING_X | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_FRONT    | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_3[] = {
-	{  0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_BUILDING_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_FRONT    | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_BUILDING_Y | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_FRONT    | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_4[] = {
-	{  0,  0,  0, 16,  5,  7, SPR_RAIL_PLATFORM_PILLARS_X_REAR | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_FRONT        | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_X_TILE_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_X_TILE_A     | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
+	TILE_SEQ_LINE( 0,  0,  0, 16,  5,  7, SPR_RAIL_PLATFORM_PILLARS_X_REAR | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_FRONT        | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_X_TILE_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE_PAL( 0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_X_TILE_A     | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_5[] = {
-	{  0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_PILLARS_Y_REAR | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_FRONT        | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_Y_TILE_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_Y_TILE_A     | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
+	TILE_SEQ_LINE( 0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_PILLARS_Y_REAR | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_FRONT        | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_Y_TILE_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE_PAL( 0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_Y_TILE_A     | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_6[] = {
-	{  0,  0,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_REAR          | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_PILLARS_X_FRONT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_X_TILE_B  | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_X_TILE_B      | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
+	TILE_SEQ_LINE( 0,  0,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_REAR          | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_PILLARS_X_FRONT | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_X_TILE_B  | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE_PAL( 0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_X_TILE_B      | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_7[] = {
-	{  0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_REAR          | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_PILLARS_Y_FRONT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_Y_TILE_B  | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_Y_TILE_B      | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
+	TILE_SEQ_LINE( 0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_REAR          | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_PILLARS_Y_FRONT | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_Y_TILE_B  | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE_PAL( 0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_Y_TILE_B      | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_9[] = {
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences north
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences north
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_10[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences west
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences west
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_21[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_22[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_23[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_24[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_25[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_26[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_27[] = {
-	{  2,  0,  0, 11, 16, 40, SPR_AIRPORT_TERMINAL_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 2,  0,  0, 11, 16, 40, SPR_AIRPORT_TERMINAL_A | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_28[] = {
-	{  3,  3,  0, 10, 10, 60, SPR_AIRPORT_TOWER | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 3,  3,  0, 10, 10, 60, SPR_AIRPORT_TOWER | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_29[] = {
-	{  0,  1,  0, 14, 14, 30, SPR_AIRPORT_CONCOURSE | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  1,  0, 14, 14, 30, SPR_AIRPORT_CONCOURSE | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_30[] = {
-	{  3,  3,  0, 10, 11, 35, SPR_AIRPORT_TERMINAL_B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 3,  3,  0, 10, 11, 35, SPR_AIRPORT_TERMINAL_B | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_31[] = {
-	{  0,  3,  0, 16, 11, 40, SPR_AIRPORT_TERMINAL_C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  3,  0, 16, 11, 40, SPR_AIRPORT_TERMINAL_C | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_32[] = {
-	{ 14,  0,  0,  2, 16, 28, SPR_AIRPORT_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0,  2, 16, 28, SPR_AIRPORT_HANGAR_REAR, PAL_NONE },
+	TILE_SEQ_LINE(14,  0,  0,  2, 16, 28, SPR_AIRPORT_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0,  2, 16, 28, SPR_AIRPORT_HANGAR_REAR)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_33[] = {
-	{  7, 11,  0,  3,  3, 14, SPR_AIRPORT_JETWAY_1, PAL_NONE },
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7, 11,  0,  3,  3, 14, SPR_AIRPORT_JETWAY_1)
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_34[] = {
-	{  2,  7,  0,  3,  3, 14, SPR_AIRPORT_JETWAY_2, PAL_NONE },
+	TILE_SEQ_LINE( 2,  7,  0,  3,  3, 14, SPR_AIRPORT_JETWAY_2)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_35[] = {
-	{  3,  2,  0,  3,  3, 14, SPR_AIRPORT_JETWAY_3, PAL_NONE },
+	TILE_SEQ_LINE( 3,  2,  0,  3,  3, 14, SPR_AIRPORT_JETWAY_3)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_36[] = {
-	{  0,  8,  0, 14,  3, 14, SPR_AIRPORT_PASSENGER_TUNNEL, PAL_NONE },
+	TILE_SEQ_LINE( 0,  8,  0, 14,  3, 14, SPR_AIRPORT_PASSENGER_TUNNEL)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_38[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_39[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_1, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_1)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_40[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_2, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_2)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_41[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_3, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_3)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_42[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_4, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_4)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_43[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_5, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_5)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_44[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_6, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_6)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_45[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_7, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_7)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_46[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_8, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_8)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_47[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_9, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_9)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_48[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_A, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_A)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_49[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_B, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_B)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_50[] = {
-	{  7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_C, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_C)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_51[] = {
-	{  7,  7,  0,  2,  2, 70, SPR_UNMOVABLE_TRANSMITTER, PAL_NONE },
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2, 70, SPR_UNMOVABLE_TRANSMITTER)
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_54[] = {
-	{  0,  0,  0, 15, 15, 30, SPR_AIRFIELD_TERM_C_BUILD | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0, 15, 15, 30, SPR_AIRFIELD_TERM_C_BUILD | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_55[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_58[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  4, 11,  0,  1,  1, 20, SPR_AIRFIELD_WIND_1 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 4, 11,  0,  1,  1, 20, SPR_AIRFIELD_WIND_1 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_59[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  4, 11,  0,  1,  1, 20, SPR_AIRFIELD_WIND_2 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 4, 11,  0,  1,  1, 20, SPR_AIRFIELD_WIND_2 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_60[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  4, 11,  0,  1,  1, 20, SPR_AIRFIELD_WIND_3 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 4, 11,  0,  1,  1, 20, SPR_AIRFIELD_WIND_3 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_61[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  4, 11,  0,  1,  1, 20, SPR_AIRFIELD_WIND_4 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 4, 11,  0,  1,  1, 20, SPR_AIRFIELD_WIND_4 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_62[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_63[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_64[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_65[] = {
-	{ 14,  0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_REAR, PAL_NONE },
+	TILE_SEQ_LINE(14,  0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_REAR)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_66[] = {
-	{  0,  0,  0, 16, 16, 60, SPR_HELIPORT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0, 16, 16, 60, SPR_HELIPORT | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_67[] = {
-	{  0, 15,  0, 13,  1, 10, SPR_TRUCK_STOP_NE_BUILD_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 13,  0,  0,  3, 16, 10, SPR_TRUCK_STOP_NE_BUILD_B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  2,  0,  0, 11,  1, 10, SPR_TRUCK_STOP_NE_BUILD_C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0, 15,  0, 13,  1, 10, SPR_TRUCK_STOP_NE_BUILD_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(13,  0,  0,  3, 16, 10, SPR_TRUCK_STOP_NE_BUILD_B | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 2,  0,  0, 11,  1, 10, SPR_TRUCK_STOP_NE_BUILD_C | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_68[] = {
-	{ 15,  3,  0,  1, 13, 10, SPR_TRUCK_STOP_SE_BUILD_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0, 16,  3, 10, SPR_TRUCK_STOP_SE_BUILD_B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  3,  0,  1, 11, 10, SPR_TRUCK_STOP_SE_BUILD_C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(15,  3,  0,  1, 13, 10, SPR_TRUCK_STOP_SE_BUILD_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0, 16,  3, 10, SPR_TRUCK_STOP_SE_BUILD_B | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  3,  0,  1, 11, 10, SPR_TRUCK_STOP_SE_BUILD_C | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_69[] = {
-	{  3,  0,  0, 13,  1, 10, SPR_TRUCK_STOP_SW_BUILD_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0,  3, 16, 10, SPR_TRUCK_STOP_SW_BUILD_B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  3, 15,  0, 11,  1, 10, SPR_TRUCK_STOP_SW_BUILD_C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 3,  0,  0, 13,  1, 10, SPR_TRUCK_STOP_SW_BUILD_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0,  3, 16, 10, SPR_TRUCK_STOP_SW_BUILD_B | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 3, 15,  0, 11,  1, 10, SPR_TRUCK_STOP_SW_BUILD_C | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_70[] = {
-	{  0,  0,  0,  1, 13, 10, SPR_TRUCK_STOP_NW_BUILD_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 13,  0, 16,  3, 10, SPR_TRUCK_STOP_NW_BUILD_B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 15,  2,  0,  1, 11, 10, SPR_TRUCK_STOP_NW_BUILD_C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  1, 13, 10, SPR_TRUCK_STOP_NW_BUILD_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 13,  0, 16,  3, 10, SPR_TRUCK_STOP_NW_BUILD_B | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(15,  2,  0,  1, 11, 10, SPR_TRUCK_STOP_NW_BUILD_C | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_71[] = {
-	{  2,  0,  0, 11,  1, 10, SPR_BUS_STOP_NE_BUILD_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 13,  0,  0,  3, 16, 10, SPR_BUS_STOP_NE_BUILD_B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 13,  0, 13,  3, 10, SPR_BUS_STOP_NE_BUILD_C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 2,  0,  0, 11,  1, 10, SPR_BUS_STOP_NE_BUILD_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(13,  0,  0,  3, 16, 10, SPR_BUS_STOP_NE_BUILD_B | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 13,  0, 13,  3, 10, SPR_BUS_STOP_NE_BUILD_C | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_72[] = {
-	{  0,  3,  0,  1, 11, 10, SPR_BUS_STOP_SE_BUILD_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0, 16,  3, 10, SPR_BUS_STOP_SE_BUILD_B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 13,  3,  0,  3, 13, 10, SPR_BUS_STOP_SE_BUILD_C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  3,  0,  1, 11, 10, SPR_BUS_STOP_SE_BUILD_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0, 16,  3, 10, SPR_BUS_STOP_SE_BUILD_B | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(13,  3,  0,  3, 13, 10, SPR_BUS_STOP_SE_BUILD_C | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_73[] = {
-	{  3, 15,  0, 11,  1, 10, SPR_BUS_STOP_SW_BUILD_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0,  3, 16, 10, SPR_BUS_STOP_SW_BUILD_B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  3,  0,  0, 13,  3, 10, SPR_BUS_STOP_SW_BUILD_C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 3, 15,  0, 11,  1, 10, SPR_BUS_STOP_SW_BUILD_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0,  3, 16, 10, SPR_BUS_STOP_SW_BUILD_B | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 3,  0,  0, 13,  3, 10, SPR_BUS_STOP_SW_BUILD_C | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_74[] = {
-	{ 15,  2,  0,  1, 11, 10, SPR_BUS_STOP_NW_BUILD_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 13,  0, 16,  3, 10, SPR_BUS_STOP_NW_BUILD_B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0,  3, 13, 10, SPR_BUS_STOP_NW_BUILD_C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(15,  2,  0,  1, 11, 10, SPR_BUS_STOP_NW_BUILD_A | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 13,  0, 16,  3, 10, SPR_BUS_STOP_NW_BUILD_B | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0,  3, 13, 10, SPR_BUS_STOP_NW_BUILD_C | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_76[] = {
-	{  0,  4,  0, 16,  8,  8, SPR_DOCK_SLOPE_NE, PAL_NONE },
+	TILE_SEQ_LINE( 0,  4,  0, 16,  8,  8, SPR_DOCK_SLOPE_NE)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_77[] = {
-	{  4,  0,  0,  8, 16,  8, SPR_DOCK_SLOPE_SE, PAL_NONE },
+	TILE_SEQ_LINE( 4,  0,  0,  8, 16,  8, SPR_DOCK_SLOPE_SE)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_78[] = {
-	{  0,  4,  0, 16,  8,  8, SPR_DOCK_SLOPE_SW, PAL_NONE },
+	TILE_SEQ_LINE( 0,  4,  0, 16,  8,  8, SPR_DOCK_SLOPE_SW)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_79[] = {
-	{  4,  0,  0,  8, 16,  8, SPR_DOCK_SLOPE_NW, PAL_NONE },
+	TILE_SEQ_LINE( 4,  0,  0,  8, 16,  8, SPR_DOCK_SLOPE_NW)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_80[] = {
-	{  0,  4,  0, 16,  8,  8, SPR_DOCK_FLAT_X, PAL_NONE },
+	TILE_SEQ_LINE( 0,  4,  0, 16,  8,  8, SPR_DOCK_FLAT_X)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _station_display_datas_81[] = {
-	{  4,  0,  0,  8, 16,  8, SPR_DOCK_FLAT_Y, PAL_NONE },
+	TILE_SEQ_LINE( 4,  0,  0,  8, 16,  8, SPR_DOCK_FLAT_Y)
 	TILE_SEQ_END()
 };
 
 /* Buoy, which will _always_ drown under the ship */
 static const DrawTileSeqStruct _station_display_datas_82[] = {
-	{  4,  -1,  0,  0,  0,  0, SPR_IMG_BOUY, PAL_NONE },
+	TILE_SEQ_LINE( 4,  -1,  0,  0,  0,  0, SPR_IMG_BOUY)
 	TILE_SEQ_END()
 };
 
 // control tower with concrete underground and no fence
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_085[] = {
-	{  3,  3,  0, 10, 10, 60, SPR_AIRPORT_TOWER | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },  // control tower
+	TILE_SEQ_LINE( 3,  3,  0, 10, 10, 60, SPR_AIRPORT_TOWER | (1 << PALETTE_MODIFIER_COLOR))  // control tower
 	TILE_SEQ_END()
 };
 
 // new airportdepot, facing west
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_086[] = {
-	{ 14, 0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_REAR, PAL_NONE },
+	TILE_SEQ_LINE(14, 0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_REAR)
 	TILE_SEQ_END()
 };
 
 // asphalt tile with fences in north
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_087[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // end of runway
 static const DrawTileSeqStruct _station_display_datas_088[] = {
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences
 	TILE_SEQ_END()
 };
 
 // runway tiles
 static const DrawTileSeqStruct _station_display_datas_089[] = {
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences
 	TILE_SEQ_END()
 };
 
@@ -428,85 +430,85 @@
 // concrete underground
 //BEGIN
 static const DrawTileSeqStruct _station_display_datas_090[] = {
-	{  7, 7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_1, PAL_NONE },   // turning radar
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },  //fences
+	TILE_SEQ_LINE( 7, 7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_1)   // turning radar
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))  //fences
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_091[] = {
-	{  7, 7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_2, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 7, 7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_2)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_092[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_3, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_3)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_093[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_4, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_4)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_094[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_5, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_5)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_095[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_6, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_6)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_096[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_7, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_7)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_097[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_8, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_8)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_098[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_9, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_9)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_099[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_A, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_A)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0100[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_B, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_B)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0101[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_C, PAL_NONE },
-	{ 15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_C)
+	TILE_SEQ_LINE(15, 0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 //END
@@ -515,85 +517,85 @@
 // concrete underground
 //BEGIN
 static const DrawTileSeqStruct _station_display_datas_0102[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_1, PAL_NONE },   // turning radar
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_1)   // turning radar
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0103[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_2, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_2)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0104[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_3, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_3)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0105[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_4, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_4)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0106[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_5, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_5)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0107[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_6, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_6)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0108[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_7, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_7)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0109[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_8, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_8)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0110[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_9, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_9)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0111[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_A, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_A)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0112[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_B, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_B)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0113[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_C, PAL_NONE },
-	{ 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_C)
+	TILE_SEQ_LINE(0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 //END
@@ -601,223 +603,223 @@
 // helipad for international airport
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0114[] = {
-	{ 10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences bottom
+	TILE_SEQ_LINE(10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences bottom
 	TILE_SEQ_END()
 };
 
 // helipad for commuter airport
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0115[] = {
-	{ 10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD, PAL_NONE },
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences left
+	TILE_SEQ_LINE(10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD)
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences left
 	TILE_SEQ_END()
 };
 
 // helipad for continental airport
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0116[] = {
-	{ 10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD, PAL_NONE },
+	TILE_SEQ_LINE(10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD)
 	TILE_SEQ_END()
 };
 
 // asphalt tile with fences in north and south
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0117[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // runway tiles with 2 corner fences
 static const DrawTileSeqStruct _station_display_datas_0118[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences west
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences north
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences west
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences north
 	TILE_SEQ_END()
 };
 
 // runway tiles with 2 corner fences
 static const DrawTileSeqStruct _station_display_datas_0119[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences west
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences west
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // runway tiles with 2 corner fences
 static const DrawTileSeqStruct _station_display_datas_0120[] = {
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences north
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences north
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
 	TILE_SEQ_END()
 };
 
 // runway tiles with 2 corner fences
 static const DrawTileSeqStruct _station_display_datas_0121[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // ======== new 2x2 helidepot ========
 // helipad tiles with 2 corner fences top+right
 static const DrawTileSeqStruct _station_display_datas_0122[] = {
-	{ 10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD, PAL_NONE },
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE(10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD)
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // tarmac tiles with 2 corner fences bottom+right
 static const DrawTileSeqStruct _station_display_datas_0123[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences north
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences north
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // helidepot office with concrete underground and no fence
 // concrete underground, fences top + left
 static const DrawTileSeqStruct _station_display_datas_0124[] = {
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences left
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
-	{  3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },  // helidepot office
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences left
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
+	TILE_SEQ_LINE( 3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR))  // helidepot office
 	TILE_SEQ_END()
 };
 
 // N/S runway plain
 static const DrawTileSeqStruct _station_display_datas_0125[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
 	TILE_SEQ_END()
 };
 
 // N/S runway end
 static const DrawTileSeqStruct _station_display_datas_0126[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
 	TILE_SEQ_END()
 };
 
 // N/S runway plain
 static const DrawTileSeqStruct _station_display_datas_0127[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences bottom
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences bottom
 	TILE_SEQ_END()
 };
 
 // N/S runway end
 static const DrawTileSeqStruct _station_display_datas_0128[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences bottom
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences bottom
 	TILE_SEQ_END()
 };
 
 // West facing hangar
 static const DrawTileSeqStruct _station_display_datas_0129[] = {
-	{ 14,  0,  0,  2, 16, 28, SPR_NEWHANGAR_W | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0,  2, 16, 28, SPR_NEWHANGAR_W_WALL, PAL_NONE },
+	TILE_SEQ_LINE(14,  0,  0,  2, 16, 28, SPR_NEWHANGAR_W | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0,  2, 16, 28, SPR_NEWHANGAR_W_WALL)
 	TILE_SEQ_END()
 };
 
 // North facing hangar
 static const DrawTileSeqStruct _station_display_datas_0130[] = {
-	{ 14,  0,  0,  2, 16, 28, SPR_NEWHANGAR_N | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(14,  0,  0,  2, 16, 28, SPR_NEWHANGAR_N | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // East facing hangar
 static const DrawTileSeqStruct _station_display_datas_0131[] = {
-	{ 14,  0,  0,  2, 16, 28, SPR_NEWHANGAR_E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(14,  0,  0,  2, 16, 28, SPR_NEWHANGAR_E | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // helipad for district airport NS
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0132[] = {
-	{ 10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences bottom
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences right
+	TILE_SEQ_LINE(10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences bottom
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences right
 	TILE_SEQ_END()
 };
 
 // helipad for district airport NS
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0133[] = {
-	{ 10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE(10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // helidepot office with concrete underground and fence north
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0134[] = {
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences north
-	{  3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },  // helidepot office
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences north
+	TILE_SEQ_LINE( 3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR))  // helidepot office
 	TILE_SEQ_END()
 };
 
 // helidepot office with concrete underground and fence east
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0135[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
-	{  3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },  // helidepot office
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
+	TILE_SEQ_LINE( 3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR))  // helidepot office
 	TILE_SEQ_END()
 };
 
 // helidepot office with concrete underground and fence west
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0136[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences west
-	{  3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },  // helidepot office
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences west
+	TILE_SEQ_LINE( 3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR))  // helidepot office
 	TILE_SEQ_END()
 };
 
 // helidepot office with concrete underground and fence south
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0137[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
-	{  3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },  // helidepot office
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
+	TILE_SEQ_LINE( 3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR))  // helidepot office
 	TILE_SEQ_END()
 };
 
 // terminal with fence to east
 static const DrawTileSeqStruct _station_display_datas_0138[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
 	TILE_SEQ_END()
 };
 
 // terminal with fence to south
 static const DrawTileSeqStruct _station_display_datas_0139[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // terminal with fence to north
 static const DrawTileSeqStruct _station_display_datas_0140[] = {
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences west
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences west
 	TILE_SEQ_END()
 };
 
 // concrete with fence to east
 static const DrawTileSeqStruct _station_display_datas_0141[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
 	TILE_SEQ_END()
 };
 
 // concrete with fence to south
 static const DrawTileSeqStruct _station_display_datas_0142[] = {
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // helipad for district airport EW
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0143[] = {
-	{ 10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences west
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences north
+	TILE_SEQ_LINE(10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences west
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences north
 	TILE_SEQ_END()
 };
 
 // helipad for district airport EW
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0144[] = {
-	{ 10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences west
+	TILE_SEQ_LINE(10,  6,  0,  0,  0,  0, SPR_AIRPORT_HELIPAD)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences west
 	TILE_SEQ_END()
 };
 
@@ -825,85 +827,85 @@
 // concrete underground
 //BEGIN
 static const DrawTileSeqStruct _station_display_datas_0145[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_1, PAL_NONE },   // turning radar
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_1)   // turning radar
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0146[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_2, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_2)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0147[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_3, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_3)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0148[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_4, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_4)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0149[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_5, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_5)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0150[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_6, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_6)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0151[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_7, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_7)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0152[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_8, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_8)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0153[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_9, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_9)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0154[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_A, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_A)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0155[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_B, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_B)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0156[] = {
-	{ 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_C, PAL_NONE },
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 7,  7,  0,  2,  2,  8, SPR_AIRPORT_RADAR_C)
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 //END
@@ -911,275 +913,283 @@
 // helipad for helistation
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0157[] = {
-	{  0,  1,  2,  0,  0,  0, SPR_NEWHELIPAD, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences west
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 0,  1,  2,  0,  0,  0, SPR_NEWHELIPAD)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences west
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // helipad for helistation
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0158[] = {
-	{  0,  1,  2,  0,  0,  0, SPR_NEWHELIPAD, PAL_NONE },
-	{ 15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences west
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences north
+	TILE_SEQ_LINE( 0,  1,  2,  0,  0,  0, SPR_NEWHELIPAD)
+	TILE_SEQ_LINE(15,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences west
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences north
 	TILE_SEQ_END()
 };
 
 // helipad for helistation
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0159[] = {
-	{  0,  1,  2,  0,  0,  0, SPR_NEWHELIPAD, PAL_NONE },
-	{  0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences north
+	TILE_SEQ_LINE( 0,  1,  2,  0,  0,  0, SPR_NEWHELIPAD)
+	TILE_SEQ_LINE( 0,  0,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences north
 	TILE_SEQ_END()
 };
 
 // helidepot office with concrete underground - no fence
 static const DrawTileSeqStruct _station_display_datas_0160[] = {
-	{  3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },  // helidepot office
+	TILE_SEQ_LINE( 3,  3,  0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | (1 << PALETTE_MODIFIER_COLOR))  // helidepot office
 	TILE_SEQ_END()
 };
 
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_0161[] = {
-	{  0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences east
-	{  0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE }, // fences south
+	TILE_SEQ_LINE( 0,  0,  0,  1, 16,  6, SPR_AIRPORT_FENCE_Y | (1 << PALETTE_MODIFIER_COLOR)) // fences east
+	TILE_SEQ_LINE( 0, 15,  0, 16,  1,  6, SPR_AIRPORT_FENCE_X | (1 << PALETTE_MODIFIER_COLOR)) // fences south
 	TILE_SEQ_END()
 };
 
 // half grass half SPR_AIRPORT_APRON
 static const DrawTileSeqStruct _station_display_datas_0162[] = {
-	{ 0,  0,  0,  0,  0,  0, SPR_GRASS_LEFT, PAL_NONE },
+	TILE_SEQ_LINE(0,  0,  0,  0,  0,  0, SPR_GRASS_LEFT)
 	TILE_SEQ_END()
 };
 
 // half grass half SPR_AIRPORT_APRON
 static const DrawTileSeqStruct _station_display_datas_0163[] = {
-	{ 0,  0,  0,  0,  0,  0, SPR_GRASS_RIGHT, PAL_NONE },
+	TILE_SEQ_LINE(0,  0,  0,  0,  0,  0, SPR_GRASS_RIGHT)
 	TILE_SEQ_END()
 };
 
 // drive-through truck stop X
 static const DrawTileSeqStruct _station_display_datas_0168[] = {
-	{  0,  0,  0,  16,  3, 16, SPR_TRUCK_STOP_DT_X_W | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 13,  0,  16,  3, 16, SPR_TRUCK_STOP_DT_X_E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  16,  3, 16, SPR_TRUCK_STOP_DT_X_W | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 13,  0,  16,  3, 16, SPR_TRUCK_STOP_DT_X_E | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // drive-through truck stop Y
 static const DrawTileSeqStruct _station_display_datas_0169[] = {
-	{ 13,  0,  0,  3, 16, 16, SPR_TRUCK_STOP_DT_Y_W | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0,  3, 16, 16, SPR_TRUCK_STOP_DT_Y_E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(13,  0,  0,  3, 16, 16, SPR_TRUCK_STOP_DT_Y_W | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0,  3, 16, 16, SPR_TRUCK_STOP_DT_Y_E | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // drive-through bus stop X
 static const DrawTileSeqStruct _station_display_datas_0170[] = {
-	{  0,  0,  0,  16,  3, 16, SPR_BUS_STOP_DT_X_W | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0, 13,  0,  16,  3, 16, SPR_BUS_STOP_DT_X_E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE( 0,  0,  0,  16,  3, 16, SPR_BUS_STOP_DT_X_W | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0, 13,  0,  16,  3, 16, SPR_BUS_STOP_DT_X_E | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 // drive-through bus stop Y
 static const DrawTileSeqStruct _station_display_datas_0171[] = {
-	{ 13,  0,  0,  3,  16, 16, SPR_BUS_STOP_DT_Y_W | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,  0,  3,  16, 16, SPR_BUS_STOP_DT_Y_E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(13,  0,  0,  3,  16, 16, SPR_BUS_STOP_DT_Y_W | (1 << PALETTE_MODIFIER_COLOR))
+	TILE_SEQ_LINE( 0,  0,  0,  3,  16, 16, SPR_BUS_STOP_DT_Y_E | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
+#undef TILE_SEQ_END
+#undef TILE_SEQ_LINE
+#undef TILE_SEQ_LINE_PAL
+
+#define TILE_SPRITE_LINE(img, dtss) { {img, PAL_NONE}, dtss },
+
 static const DrawTileSprites _station_display_datas_rail[] = {
-	{ SPR_RAIL_TRACK_X,               PAL_NONE, _station_display_datas_0 },
-	{ SPR_RAIL_TRACK_Y,               PAL_NONE, _station_display_datas_1 },
-	{ SPR_RAIL_TRACK_X,               PAL_NONE, _station_display_datas_2 },
-	{ SPR_RAIL_TRACK_Y,               PAL_NONE, _station_display_datas_3 },
-	{ SPR_RAIL_TRACK_X,               PAL_NONE, _station_display_datas_4 },
-	{ SPR_RAIL_TRACK_Y,               PAL_NONE, _station_display_datas_5 },
-	{ SPR_RAIL_TRACK_X,               PAL_NONE, _station_display_datas_6 },
-	{ SPR_RAIL_TRACK_Y,               PAL_NONE, _station_display_datas_7 },
+	TILE_SPRITE_LINE(SPR_RAIL_TRACK_X,               _station_display_datas_0)
+	TILE_SPRITE_LINE(SPR_RAIL_TRACK_Y,               _station_display_datas_1)
+	TILE_SPRITE_LINE(SPR_RAIL_TRACK_X,               _station_display_datas_2)
+	TILE_SPRITE_LINE(SPR_RAIL_TRACK_Y,               _station_display_datas_3)
+	TILE_SPRITE_LINE(SPR_RAIL_TRACK_X,               _station_display_datas_4)
+	TILE_SPRITE_LINE(SPR_RAIL_TRACK_Y,               _station_display_datas_5)
+	TILE_SPRITE_LINE(SPR_RAIL_TRACK_X,               _station_display_datas_6)
+	TILE_SPRITE_LINE(SPR_RAIL_TRACK_Y,               _station_display_datas_7)
 };
 
 static const DrawTileSprites _station_display_datas_airport[] = {
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_9 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_10 },
-	{ SPR_AIRPORT_AIRCRAFT_STAND,     PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_NS_WEST,    PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_EW_SOUTH,   PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_XING_SOUTH, PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_XING_WEST,  PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_NS_CTR,     PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_XING_EAST,  PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_NS_EAST,    PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_EW_NORTH,   PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_EW_CTR,     PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_TAXIWAY_EW_NORTH,   PAL_NONE, _station_display_datas_21 },
-	{ SPR_AIRPORT_RUNWAY_EXIT_A,      PAL_NONE, _station_display_datas_22 },
-	{ SPR_AIRPORT_RUNWAY_EXIT_B,      PAL_NONE, _station_display_datas_23 },
-	{ SPR_AIRPORT_RUNWAY_EXIT_C,      PAL_NONE, _station_display_datas_24 },
-	{ SPR_AIRPORT_RUNWAY_EXIT_D,      PAL_NONE, _station_display_datas_25 },
-	{ SPR_AIRPORT_RUNWAY_END,         PAL_NONE, _station_display_datas_26 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_27 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_28 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_29 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_30 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_31 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_32 },
-	{ SPR_AIRPORT_AIRCRAFT_STAND,     PAL_NONE, _station_display_datas_33 },
-	{ SPR_AIRPORT_AIRCRAFT_STAND,     PAL_NONE, _station_display_datas_34 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_35 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_36 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_nothing },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_38 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_39 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_40 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_41 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_42 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_43 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_44 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_45 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_46 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_47 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_48 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_49 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_50 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_51 },
-	{ SPR_AIRFIELD_TERM_A,            PAL_NONE, _station_display_nothing },
-	{ SPR_AIRFIELD_TERM_B,            PAL_NONE, _station_display_nothing },
-	{ SPR_AIRFIELD_TERM_C_GROUND | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _station_display_datas_54 },
-	{ SPR_AIRFIELD_APRON_A,           PAL_NONE, _station_display_datas_55 },
-	{ SPR_AIRFIELD_APRON_B,           PAL_NONE, _station_display_nothing },
-	{ SPR_AIRFIELD_APRON_C,           PAL_NONE, _station_display_nothing },
-	{ SPR_AIRFIELD_APRON_D,           PAL_NONE, _station_display_datas_58 },
-	{ SPR_AIRFIELD_APRON_D,           PAL_NONE, _station_display_datas_59 },
-	{ SPR_AIRFIELD_APRON_D,           PAL_NONE, _station_display_datas_60 },
-	{ SPR_AIRFIELD_APRON_D,           PAL_NONE, _station_display_datas_61 },
-	{ SPR_AIRFIELD_RUNWAY_NEAR_END,   PAL_NONE, _station_display_datas_62 },
-	{ SPR_AIRFIELD_RUNWAY_MIDDLE,     PAL_NONE, _station_display_datas_63 },
-	{ SPR_AIRFIELD_RUNWAY_FAR_END,    PAL_NONE, _station_display_datas_64 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_65 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_66 },
-	{ SPR_AIRPORT_RUNWAY_END,         PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_RUNWAY_EXIT_B,      PAL_NONE, _station_display_nothing },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_085 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_086 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_087 },
-	{ SPR_AIRPORT_RUNWAY_END,         PAL_NONE, _station_display_datas_088 },
-	{ SPR_AIRPORT_RUNWAY_EXIT_B,      PAL_NONE, _station_display_datas_089 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_090 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_091 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_092 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_093 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_094 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_095 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_096 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_097 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_098 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_099 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0100 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0101 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0102 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0103 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0104 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0105 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0106 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0107 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0108 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0109 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0110 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0111 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0112 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0113 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0114 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0115 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0116 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0117 },
-	{ SPR_AIRPORT_RUNWAY_END,         PAL_NONE, _station_display_datas_0118 },
-	{ SPR_AIRPORT_RUNWAY_END,         PAL_NONE, _station_display_datas_0119 },
-	{ SPR_AIRPORT_RUNWAY_END,         PAL_NONE, _station_display_datas_0120 },
-	{ SPR_AIRPORT_RUNWAY_END,         PAL_NONE, _station_display_datas_0121 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0122 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0123 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0124 },
-	{ SPR_NSRUNWAY1,                  PAL_NONE, _station_display_datas_0125 },
-	{ SPR_NSRUNWAY_END,               PAL_NONE, _station_display_datas_0126 },
-	{ SPR_NSRUNWAY1,                  PAL_NONE, _station_display_datas_0127 },
-	{ SPR_NSRUNWAY_END,               PAL_NONE, _station_display_datas_0128 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0129 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0130 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0131 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0132 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0133 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0134 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0135 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0136 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0137 },
-	{ SPR_AIRPORT_AIRCRAFT_STAND,     PAL_NONE, _station_display_datas_0138 },
-	{ SPR_AIRPORT_AIRCRAFT_STAND,     PAL_NONE, _station_display_datas_0139 },
-	{ SPR_AIRPORT_AIRCRAFT_STAND,     PAL_NONE, _station_display_datas_0140 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0141 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0142 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0143 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0144 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0145 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0146 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0147 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0148 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0149 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0150 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0151 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0152 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0153 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0154 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0155 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0156 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0157 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0158 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0159 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0160 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0161 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0162 },
-	{ SPR_AIRPORT_APRON,              PAL_NONE, _station_display_datas_0163 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_58 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_59 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_60 },
-	{ SPR_FLAT_GRASS_TILE,            PAL_NONE, _station_display_datas_61 },
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_9)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_10)
+	TILE_SPRITE_LINE(SPR_AIRPORT_AIRCRAFT_STAND,     _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_NS_WEST,    _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_EW_SOUTH,   _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_XING_SOUTH, _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_XING_WEST,  _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_NS_CTR,     _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_XING_EAST,  _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_NS_EAST,    _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_EW_NORTH,   _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_EW_CTR,     _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_TAXIWAY_EW_NORTH,   _station_display_datas_21)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_EXIT_A,      _station_display_datas_22)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_EXIT_B,      _station_display_datas_23)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_EXIT_C,      _station_display_datas_24)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_EXIT_D,      _station_display_datas_25)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_END,         _station_display_datas_26)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_27)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_28)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_29)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_30)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_31)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_32)
+	TILE_SPRITE_LINE(SPR_AIRPORT_AIRCRAFT_STAND,     _station_display_datas_33)
+	TILE_SPRITE_LINE(SPR_AIRPORT_AIRCRAFT_STAND,     _station_display_datas_34)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_35)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_36)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_38)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_39)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_40)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_41)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_42)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_43)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_44)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_45)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_46)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_47)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_48)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_49)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_50)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_51)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_TERM_A,            _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_TERM_B,            _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_TERM_C_GROUND | (1 << PALETTE_MODIFIER_COLOR), _station_display_datas_54)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_APRON_A,           _station_display_datas_55)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_APRON_B,           _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_APRON_C,           _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_APRON_D,           _station_display_datas_58)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_APRON_D,           _station_display_datas_59)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_APRON_D,           _station_display_datas_60)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_APRON_D,           _station_display_datas_61)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_RUNWAY_NEAR_END,   _station_display_datas_62)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_RUNWAY_MIDDLE,     _station_display_datas_63)
+	TILE_SPRITE_LINE(SPR_AIRFIELD_RUNWAY_FAR_END,    _station_display_datas_64)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_65)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_66)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_END,         _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_EXIT_B,      _station_display_nothing)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_085)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_086)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_087)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_END,         _station_display_datas_088)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_EXIT_B,      _station_display_datas_089)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_090)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_091)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_092)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_093)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_094)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_095)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_096)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_097)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_098)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_099)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0100)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0101)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0102)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0103)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0104)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0105)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0106)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0107)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0108)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0109)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0110)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0111)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0112)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0113)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0114)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0115)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0116)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0117)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_END,         _station_display_datas_0118)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_END,         _station_display_datas_0119)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_END,         _station_display_datas_0120)
+	TILE_SPRITE_LINE(SPR_AIRPORT_RUNWAY_END,         _station_display_datas_0121)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0122)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0123)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0124)
+	TILE_SPRITE_LINE(SPR_NSRUNWAY1,                  _station_display_datas_0125)
+	TILE_SPRITE_LINE(SPR_NSRUNWAY_END,               _station_display_datas_0126)
+	TILE_SPRITE_LINE(SPR_NSRUNWAY1,                  _station_display_datas_0127)
+	TILE_SPRITE_LINE(SPR_NSRUNWAY_END,               _station_display_datas_0128)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0129)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0130)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0131)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0132)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0133)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0134)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0135)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0136)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0137)
+	TILE_SPRITE_LINE(SPR_AIRPORT_AIRCRAFT_STAND,     _station_display_datas_0138)
+	TILE_SPRITE_LINE(SPR_AIRPORT_AIRCRAFT_STAND,     _station_display_datas_0139)
+	TILE_SPRITE_LINE(SPR_AIRPORT_AIRCRAFT_STAND,     _station_display_datas_0140)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0141)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0142)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0143)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0144)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0145)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0146)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0147)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0148)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0149)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0150)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0151)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0152)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0153)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0154)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0155)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0156)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0157)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0158)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0159)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0160)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0161)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0162)
+	TILE_SPRITE_LINE(SPR_AIRPORT_APRON,              _station_display_datas_0163)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_58)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_59)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_60)
+	TILE_SPRITE_LINE(SPR_FLAT_GRASS_TILE,            _station_display_datas_61)
 };
 
 static const DrawTileSprites _station_display_datas_truck[] = {
-	{ SPR_TRUCK_STOP_NE_GROUND | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _station_display_datas_67 },
-	{ SPR_TRUCK_STOP_SE_GROUND | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _station_display_datas_68 },
-	{ SPR_TRUCK_STOP_SW_GROUND | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _station_display_datas_69 },
-	{ SPR_TRUCK_STOP_NW_GROUND | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _station_display_datas_70 },
-	{ SPR_ROAD_PAVED_STRAIGHT_X,      PAL_NONE, _station_display_datas_0168 },
-	{ SPR_ROAD_PAVED_STRAIGHT_Y,      PAL_NONE, _station_display_datas_0169 },
+	TILE_SPRITE_LINE(SPR_TRUCK_STOP_NE_GROUND | (1 << PALETTE_MODIFIER_COLOR), _station_display_datas_67)
+	TILE_SPRITE_LINE(SPR_TRUCK_STOP_SE_GROUND | (1 << PALETTE_MODIFIER_COLOR), _station_display_datas_68)
+	TILE_SPRITE_LINE(SPR_TRUCK_STOP_SW_GROUND | (1 << PALETTE_MODIFIER_COLOR), _station_display_datas_69)
+	TILE_SPRITE_LINE(SPR_TRUCK_STOP_NW_GROUND | (1 << PALETTE_MODIFIER_COLOR), _station_display_datas_70)
+	TILE_SPRITE_LINE(SPR_ROAD_PAVED_STRAIGHT_X,      _station_display_datas_0168)
+	TILE_SPRITE_LINE(SPR_ROAD_PAVED_STRAIGHT_Y,      _station_display_datas_0169)
 };
 
 static const DrawTileSprites _station_display_datas_bus[] = {
-	{ SPR_BUS_STOP_NE_GROUND   | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _station_display_datas_71 },
-	{ SPR_BUS_STOP_SE_GROUND   | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _station_display_datas_72 },
-	{ SPR_BUS_STOP_SW_GROUND   | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _station_display_datas_73 },
-	{ SPR_BUS_STOP_NW_GROUND   | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _station_display_datas_74 },
-	{ SPR_ROAD_PAVED_STRAIGHT_X,      PAL_NONE, _station_display_datas_0170 },
-	{ SPR_ROAD_PAVED_STRAIGHT_Y,      PAL_NONE, _station_display_datas_0171 }
+	TILE_SPRITE_LINE(SPR_BUS_STOP_NE_GROUND   | (1 << PALETTE_MODIFIER_COLOR), _station_display_datas_71)
+	TILE_SPRITE_LINE(SPR_BUS_STOP_SE_GROUND   | (1 << PALETTE_MODIFIER_COLOR), _station_display_datas_72)
+	TILE_SPRITE_LINE(SPR_BUS_STOP_SW_GROUND   | (1 << PALETTE_MODIFIER_COLOR), _station_display_datas_73)
+	TILE_SPRITE_LINE(SPR_BUS_STOP_NW_GROUND   | (1 << PALETTE_MODIFIER_COLOR), _station_display_datas_74)
+	TILE_SPRITE_LINE(SPR_ROAD_PAVED_STRAIGHT_X,      _station_display_datas_0170)
+	TILE_SPRITE_LINE(SPR_ROAD_PAVED_STRAIGHT_Y,      _station_display_datas_0171)
 };
 
 static const DrawTileSprites _station_display_datas_oilrig[] = {
-	{ SPR_FLAT_WATER_TILE,            PAL_NONE, _station_display_nothing },
+	TILE_SPRITE_LINE(SPR_FLAT_WATER_TILE,            _station_display_nothing)
 };
 
 static const DrawTileSprites _station_display_datas_dock[] = {
-	{ SPR_SHORE_BASE + SLOPE_SW,      PAL_NONE, _station_display_datas_76 },
-	{ SPR_SHORE_BASE + SLOPE_NW,      PAL_NONE, _station_display_datas_77 },
-	{ SPR_SHORE_BASE + SLOPE_NE,      PAL_NONE, _station_display_datas_78 },
-	{ SPR_SHORE_BASE + SLOPE_SE,      PAL_NONE, _station_display_datas_79 },
-	{ SPR_FLAT_WATER_TILE,            PAL_NONE, _station_display_datas_80 },
-	{ SPR_FLAT_WATER_TILE,            PAL_NONE, _station_display_datas_81 },
+	TILE_SPRITE_LINE(SPR_SHORE_BASE + SLOPE_SW,      _station_display_datas_76)
+	TILE_SPRITE_LINE(SPR_SHORE_BASE + SLOPE_NW,      _station_display_datas_77)
+	TILE_SPRITE_LINE(SPR_SHORE_BASE + SLOPE_NE,      _station_display_datas_78)
+	TILE_SPRITE_LINE(SPR_SHORE_BASE + SLOPE_SE,      _station_display_datas_79)
+	TILE_SPRITE_LINE(SPR_FLAT_WATER_TILE,            _station_display_datas_80)
+	TILE_SPRITE_LINE(SPR_FLAT_WATER_TILE,            _station_display_datas_81)
 };
 
 static const DrawTileSprites _station_display_datas_buoy[] = {
-	{ SPR_FLAT_WATER_TILE,            PAL_NONE, _station_display_datas_82 },
+	TILE_SPRITE_LINE(SPR_FLAT_WATER_TILE,            _station_display_datas_82)
 };
 
+#undef TILE_SPRITE_LINE
+
 static const DrawTileSprites *_station_display_datas[] = {
 	_station_display_datas_rail,
 	_station_display_datas_airport,
--- a/src/table/track_land.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/table/track_land.h	Mon Mar 10 15:26:39 2008 +0000
@@ -1,7 +1,7 @@
 /* $Id$ */
 
-#define TILE_SEQ_LINE(img, dx, dy, sx, sy) { dx, dy, 0, sx, sy, 23, img, PAL_NONE },
-#define TILE_SEQ_END() { (byte)0x80, 0, 0, 0, 0, 0, 0, 0 }
+#define TILE_SEQ_LINE(img, dx, dy, sx, sy) { dx, dy, 0, sx, sy, 23, {img, PAL_NONE} },
+#define TILE_SEQ_END() { (byte)0x80, 0, 0, 0, 0, 0, {0, 0} }
 
 
 static const DrawTileSeqStruct _depot_gfx_NE[] = {
@@ -27,10 +27,10 @@
 };
 
 static const DrawTileSprites _depot_gfx_table[] = {
-	{ SPR_FLAT_GRASS_TILE, PAL_NONE, _depot_gfx_NE },
-	{ SPR_RAIL_TRACK_Y,    PAL_NONE, _depot_gfx_SE },
-	{ SPR_RAIL_TRACK_X,    PAL_NONE, _depot_gfx_SW },
-	{ SPR_FLAT_GRASS_TILE, PAL_NONE, _depot_gfx_NW }
+	{ {SPR_FLAT_GRASS_TILE, PAL_NONE}, _depot_gfx_NE },
+	{ {SPR_RAIL_TRACK_Y,    PAL_NONE}, _depot_gfx_SE },
+	{ {SPR_RAIL_TRACK_X,    PAL_NONE}, _depot_gfx_SW },
+	{ {SPR_FLAT_GRASS_TILE, PAL_NONE}, _depot_gfx_NW }
 };
 
 
@@ -47,6 +47,10 @@
 };
 
 static const DrawTileSprites _waypoint_gfx_table[] = {
-	{ SPR_RAIL_TRACK_X, PAL_NONE, _waypoint_gfx_X },
-	{ SPR_RAIL_TRACK_Y, PAL_NONE, _waypoint_gfx_Y }
+	{ {SPR_RAIL_TRACK_X, PAL_NONE}, _waypoint_gfx_X },
+	{ {SPR_RAIL_TRACK_Y, PAL_NONE}, _waypoint_gfx_Y }
 };
+
+#undef TILE_SEQ_LINE
+#undef TILE_SEQ_END
+
--- a/src/table/unmovable_land.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/table/unmovable_land.h	Mon Mar 10 15:26:39 2008 +0000
@@ -1,91 +1,89 @@
 /* $Id$ */
 
-struct DrawTileUnmovableStruct {
-	uint16 image;
-	byte subcoord_x;
-	byte subcoord_y;
-	byte width;
-	byte height;
-	byte z_size;
-	byte unused;
+
+static const DrawTileSeqStruct _draw_tile_transmitterlighthouse_data[] = {
+	{   7,  7,  0,  2,  2, 70, {SPR_UNMOVABLE_TRANSMITTER, PAL_NONE}},
+	{   4,  4,  0,  7,  7, 61, {SPR_UNMOVABLE_LIGHTHOUSE, PAL_NONE}},
 };
 
-#define TILE_SEQ_END() { (byte)0x80, 0, 0, 0, 0, 0, 0, 0 }
-
-static const DrawTileUnmovableStruct _draw_tile_unmovable_data[] = {
-	{0xA29, 7, 7, 2, 2, 70, 0},
-	{0xA2A, 4, 4, 7, 7, 61, 0},
-};
-
+#define TILE_SEQ_LINE(sz, img) { 0, 0, 0, 16, 16, sz, {img, PAL_NONE} },
+#define TILE_SEQ_END() { (byte)0x80, 0, 0, 0, 0, 0, {0, 0} }
 
 static const DrawTileSeqStruct _unmovable_display_nothing[] = {
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _unmovable_display_datas_8[] = {
-	{   0,  0,  0, 16, 16, 20, 0xA34 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(20, 0xA34 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _unmovable_display_datas_9[] = {
-	{   0,  0,  0, 16, 16, 20, 0xA36 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(20, 0xA36 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _unmovable_display_datas_10[] = {
-	{   0,  0,  0, 16, 16, 20, 0xA38 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(20, 0xA38 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _unmovable_display_datas_12[] = {
-	{   0,  0,  0, 16, 16, 50, 0xA3B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(50, 0xA3B | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _unmovable_display_datas_13[] = {
-	{   0,  0,  0, 16, 16, 50, 0xA3D | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(50, 0xA3D | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _unmovable_display_datas_14[] = {
-	{   0,  0,  0, 16, 16, 50, 0xA3F | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(50, 0xA3F | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _unmovable_display_datas_16[] = {
-	{   0,  0,  0, 16, 16, 60, 0xA42 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(60, 0xA42 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _unmovable_display_datas_17[] = {
-	{   0,  0,  0, 16, 16, 60, 0xA44 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(60, 0xA44 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _unmovable_display_datas_18[] = {
-	{   0,  0,  0, 16, 16, 60, 0xA46 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+	TILE_SEQ_LINE(60, 0xA46 | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
+#undef TILE_SEQ_LINE
+#undef TILE_SEQ_END
+
+#define TILE_SPRITE_LINE(img, dtss) { {img | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE}, dtss },
+
 static const DrawTileSprites _unmovable_display_datas[] = {
-	{ 0xA2B | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA2C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA2D | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA2E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA2F | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA30 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA31 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA32 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA33 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_datas_8 },
-	{ 0xA35 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_datas_9 },
-	{ 0xA37 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_datas_10 },
-	{ 0xA39 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA3A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_datas_12 },
-	{ 0xA3C | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_datas_13 },
-	{ 0xA3E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_datas_14 },
-	{ 0xA40 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
-	{ 0xA41 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_datas_16 },
-	{ 0xA43 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_datas_17 },
-	{ 0xA45 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_datas_18 },
-	{ 0xA47 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, _unmovable_display_nothing },
+	TILE_SPRITE_LINE(0xA2B, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA2C, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA2D, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA2E, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA2F, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA30, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA31, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA32, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA33, _unmovable_display_datas_8)
+	TILE_SPRITE_LINE(0xA35, _unmovable_display_datas_9)
+	TILE_SPRITE_LINE(0xA37, _unmovable_display_datas_10)
+	TILE_SPRITE_LINE(0xA39, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA3A, _unmovable_display_datas_12)
+	TILE_SPRITE_LINE(0xA3C, _unmovable_display_datas_13)
+	TILE_SPRITE_LINE(0xA3E, _unmovable_display_datas_14)
+	TILE_SPRITE_LINE(0xA40, _unmovable_display_nothing)
+	TILE_SPRITE_LINE(0xA41, _unmovable_display_datas_16)
+	TILE_SPRITE_LINE(0xA43, _unmovable_display_datas_17)
+	TILE_SPRITE_LINE(0xA45, _unmovable_display_datas_18)
+	TILE_SPRITE_LINE(0xA47, _unmovable_display_nothing)
 };
+
+#undef TILE_SPRITE_LINE
--- a/src/tile_cmd.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/tile_cmd.h	Mon Mar 10 15:26:39 2008 +0000
@@ -13,6 +13,8 @@
 #include "strings_type.h"
 #include "date_type.h"
 #include "player_type.h"
+#include "direction_type.h"
+#include "track_type.h"
 
 /** The returned bits of VehicleEnterTile. */
 enum VehicleEnterTileStatus {
@@ -59,29 +61,17 @@
 
 /**
  * GetTileTrackStatusProcs return a value that contains the possible tracks
- * that can be taken on a given tile by a given transport. The return value is
- * composed as follows: 0xaabbccdd. ccdd and aabb are bitmasks of trackdirs,
- * where bit n corresponds to trackdir n. ccdd are the trackdirs that are
- * present in the tile (1==present, 0==not present), aabb is the signal
- * status, if applicable (0==green/no signal, 1==red, note that this is
- * reversed from map3/2[tile] for railway signals).
+ * that can be taken on a given tile by a given transport.
+ * The return value contains the existing trackdirs and signal states.
  *
- * The result (let's call it ts) is often used as follows:
- * tracks = (byte)(ts | ts >>8)
- * This effectively converts the present part of the result (ccdd) to a
- * track bitmask, which disregards directions. Normally, this is the same as just
- * doing (byte)ts I think, although I am not really sure
+ * see track_func.h for usage of TrackStatus.
  *
- * A trackdir is combination of a track and a dir, where the lower three bits
- * are a track, the fourth bit is the direction. these give 12 (or 14)
- * possible options: 0-5 and 8-13, so we need 14 bits for a trackdir bitmask
- * above.
  * @param tile     the tile to get the track status from
  * @param mode     the mode of transportation
  * @param sub_mode used to differentiate between different kinds within the mode
- * @return the above mentions track status information
+ * @return the track status information
  */
-typedef uint32 GetTileTrackStatusProc(TileIndex tile, TransportType mode, uint sub_mode);
+typedef TrackStatus GetTileTrackStatusProc(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side);
 typedef void GetProducedCargoProc(TileIndex tile, CargoID *b);
 typedef void ClickTileProc(TileIndex tile);
 typedef void AnimateTileProc(TileIndex tile);
@@ -126,7 +116,7 @@
 
 extern const TileTypeProcs * const _tile_type_procs[16];
 
-uint32 GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode);
+TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side = INVALID_DIAGDIR);
 void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac);
 void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player);
 void AnimateTile(TileIndex tile);
--- a/src/tile_map.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/tile_map.h	Mon Mar 10 15:26:39 2008 +0000
@@ -107,6 +107,17 @@
 }
 
 /**
+ * Checks if a tile is valid
+ *
+ * @param tile The tile to check
+ * @return True if the tile is on the map and not one of MP_VOID.
+ */
+static inline bool IsValidTile(TileIndex tile)
+{
+	return tile < MapSize() && !IsTileType(tile, MP_VOID);
+}
+
+/**
  * Returns the owner of a tile
  *
  * This function returns the owner of a tile. This cannot used
@@ -115,14 +126,13 @@
  *
  * @param tile The tile to check
  * @return The owner of the tile
- * @pre tile < MapSize()
- * @pre The type of the tile must not be MP_HOUSE, MP_VOID and MP_INDUSTRY
+ * @pre IsValidTile(tile)
+ * @pre The type of the tile must not be MP_HOUSE and MP_INDUSTRY
  */
 static inline Owner GetTileOwner(TileIndex tile)
 {
-	assert(tile < MapSize());
+	assert(IsValidTile(tile));
 	assert(!IsTileType(tile, MP_HOUSE));
-	assert(!IsTileType(tile, MP_VOID));
 	assert(!IsTileType(tile, MP_INDUSTRY));
 
 	return (Owner)_m[tile].m1;
@@ -136,14 +146,13 @@
  *
  * @param tile The tile to change the owner status.
  * @param owner The new owner.
- * @pre tile < MapSize()
- * @pre The type of the tile must not be MP_HOUSE, MP_VOID and MP_INDUSTRY
+ * @pre IsValidTile(tile)
+ * @pre The type of the tile must not be MP_HOUSE and MP_INDUSTRY
  */
 static inline void SetTileOwner(TileIndex tile, Owner owner)
 {
-	assert(tile < MapSize());
+	assert(IsValidTile(tile));
 	assert(!IsTileType(tile, MP_HOUSE));
-	assert(!IsTileType(tile, MP_VOID));
 	assert(!IsTileType(tile, MP_INDUSTRY));
 
 	_m[tile].m1 = owner;
@@ -165,7 +174,7 @@
  * Set the tropic zone
  * @param tile the tile to set the zone of
  * @param type the new type
- * @pre assert(tile < MapSize());
+ * @pre tile < MapSize()
  */
 static inline void SetTropicZone(TileIndex tile, TropicZone type)
 {
@@ -176,7 +185,7 @@
 /**
  * Get the tropic zone
  * @param tile the tile to get the zone of
- * @pre assert(tile < MapSize());
+ * @pre tile < MapSize()
  * @return the zone type
  */
 static inline TropicZone GetTropicZone(TileIndex tile)
--- a/src/timetable_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/timetable_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -46,7 +46,11 @@
  * - p1 = (bit 16-23) - Order index to modify.
  * - p1 = (bit    24) - Whether to change the waiting time or the travelling
  *                      time.
+ * - p1 = (bit    25) - Whether p2 contains waiting and travelling time.
  * @param p2 The amount of time to wait.
+ * - p2 = (bit  0-15) - Waiting or travelling time as specified by p1 bit 24 if p1 bit 25 is not set,
+ *                      Travelling time if p1 bit 25 is set.
+ * - p2 = (bit 16-31) - Waiting time if p1 bit 25 is set
  */
 CommandCost CmdChangeTimetable(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -62,14 +66,16 @@
 	Order *order = GetVehicleOrder(v, order_number);
 	if (order == NULL) return CMD_ERROR;
 
-	bool is_journey = HasBit(p1, 24);
+	bool packed_time = HasBit(p1, 25);
+	bool is_journey = HasBit(p1, 24) || packed_time;
 	if (!is_journey) {
 		if (order->type != OT_GOTO_STATION) return_cmd_error(STR_TIMETABLE_ONLY_WAIT_AT_STATIONS);
 		if (_patches.new_nonstop && (order->flags & OFB_NON_STOP)) return_cmd_error(STR_TIMETABLE_NOT_STOPPING_HERE);
 	}
 
 	if (flags & DC_EXEC) {
-		ChangeTimetable(v, order_number, p2, is_journey);
+		ChangeTimetable(v, order_number, GB(p2, 0, 16), is_journey);
+		if (packed_time) ChangeTimetable(v, order_number, GB(p2, 16, 16), false);
 	}
 
 	return CommandCost();
--- a/src/town_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/town_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -117,7 +117,6 @@
 };
 
 static bool BuildTownHouse(Town *t, TileIndex tile);
-static void DoBuildTownHouse(Town *t, TileIndex tile);
 
 static void TownDrawHouseLift(const TileInfo *ti)
 {
@@ -493,7 +492,7 @@
 		ClearTownHouse(t, tile);
 
 		/* Rebuild with another house? */
-		if (GB(r, 24, 8) >= 12) DoBuildTownHouse(t, tile);
+		if (GB(r, 24, 8) >= 12) BuildTownHouse(t, tile);
 	}
 
 	_current_player = OWNER_NONE;
@@ -593,7 +592,7 @@
 	td->owner = OWNER_TOWN;
 }
 
-static uint32 GetTileTrackStatus_Town(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Town(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
 	/* not used */
 	return 0;
@@ -1586,29 +1585,6 @@
 	return true;
 }
 
-static bool CheckBuildHouseMode(TileIndex tile, Slope tileh, int mode)
-{
-	int b;
-	Slope slope;
-
-	static const Slope _masks[8] = {
-		SLOPE_NE,  SLOPE_SW,  SLOPE_NW,  SLOPE_SE,
-		SLOPE_SW,  SLOPE_NE,  SLOPE_SE,  SLOPE_NW,
-	};
-
-	slope = GetTileSlope(tile, NULL);
-	if (IsSteepSlope(slope)) return false;
-
-	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return false;
-
-	b = 0;
-	if ((slope != SLOPE_FLAT && ~slope & _masks[mode])) b = ~b;
-	if ((tileh != SLOPE_FLAT && ~tileh & _masks[mode + 4])) b = ~b;
-	if (b)
-		return false;
-
-	return CmdSucceeded(DoCommand(tile, 0, 0, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_LANDSCAPE_CLEAR));
-}
 
 /** Returns the bit corresponding to the town zone of the specified tile
  * @param t Town on which radius is to be found
@@ -1631,155 +1607,347 @@
 	return smallest;
 }
 
-static bool CheckFree2x2Area(TileIndex tile)
+/**
+ * Clears tile and builds a house or house part.
+ * @param t tile index
+ * @param tid Town index
+ * @param counter of construction step
+ * @param stage of construction (used for drawing)
+ * @param type of house. Index into house specs array
+ * @param random_bits required for newgrf houses
+ * @pre house can be built here
+ */
+static inline void ClearMakeHouseTile(TileIndex tile, TownID tid, byte counter, byte stage, HouseID type, byte random_bits)
 {
-	int i;
-
-	static const TileIndexDiffC _tile_add[] = {
-		{0    , 0    },
-		{0 - 0, 1 - 0},
-		{1 - 0, 0 - 1},
-		{1 - 1, 1 - 0}
-	};
-
-	for (i = 0; i != 4; i++) {
-		tile += ToTileIndexDiff(_tile_add[i]);
-
-		if (GetTileSlope(tile, NULL) != SLOPE_FLAT) return false;
-
-		if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return false;
-
-		if (CmdFailed(DoCommand(tile, 0, 0, DC_EXEC | DC_AUTO | DC_NO_WATER | DC_FORCETEST, CMD_LANDSCAPE_CLEAR)))
-			return false;
+	#if !defined(NDEBUG) || defined(WITH_ASSERT)
+		CommandCost cc =
+	#endif /* !defined(NDEBUG) || defined(WITH_ASSERT) */
+
+	DoCommand(tile, 0, 0, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_LANDSCAPE_CLEAR);
+
+	assert(CmdSucceeded(cc));
+
+	MakeHouseTile(tile, tid, counter, stage, type, random_bits);
+}
+
+
+/**
+ * Write house information into the map. For houses > 1 tile, all tiles are marked.
+ * @param t tile index
+ * @param tid Town index
+ * @param counter of construction step
+ * @param stage of construction (used for drawing)
+ * @param type of house. Index into house specs array
+ * @param random_bits required for newgrf houses
+ * @pre house can be built here
+ */
+static void MakeTownHouse(TileIndex t, TownID tid, byte counter, byte stage, HouseID type, byte random_bits)
+{
+	BuildingFlags size = GetHouseSpecs(type)->building_flags;
+
+	ClearMakeHouseTile(t, tid, counter, stage, type, random_bits);
+	if (size & BUILDING_2_TILES_Y)   ClearMakeHouseTile(t + TileDiffXY(0, 1), tid, counter, stage, ++type, random_bits);
+	if (size & BUILDING_2_TILES_X)   ClearMakeHouseTile(t + TileDiffXY(1, 0), tid, counter, stage, ++type, random_bits);
+	if (size & BUILDING_HAS_4_TILES) ClearMakeHouseTile(t + TileDiffXY(1, 1), tid, counter, stage, ++type, random_bits);
+}
+
+
+/**
+ * Checks if a house can be built here. Important is slope, bridge above
+ * and ability to clear the land.
+ * @param tile tile to check
+ * @param town town that is checking
+ * @param noslope are slopes (foundations) allowed?
+ * @return true iff house can be built here
+ */
+static inline bool CanBuildHouseHere(TileIndex tile, TownID town, bool noslope)
+{
+	/* cannot build on these slopes... */
+	Slope slope = GetTileSlope(tile, NULL);
+	if ((noslope && slope != SLOPE_FLAT) || IsSteepSlope(slope)) return false;
+
+	/* building under a bridge? */
+	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return false;
+
+	/* do not try to build over house owned by another town */
+	if (IsTileType(tile, MP_HOUSE) && GetTownIndex(tile) != town) return false;
+
+	/* can we clear the land? */
+	return CmdSucceeded(DoCommand(tile, 0, 0, DC_AUTO | DC_NO_WATER, CMD_LANDSCAPE_CLEAR));
+}
+
+
+/**
+ * Checks if a house can be built at this tile, must have the same max z as parameter.
+ * @param tile tile to check
+ * @param town town that is checking
+ * @param z max z of this tile so more parts of a house are at the same height (with foundation)
+ * @param noslope are slopes (foundations) allowed?
+ * @return true iff house can be built here
+ * @see CanBuildHouseHere()
+ */
+static inline bool CheckBuildHouseSameZ(TileIndex tile, TownID town, uint z, bool noslope)
+{
+	if (!CanBuildHouseHere(tile, town, noslope)) return false;
+
+	/* if building on slopes is allowed, there will be flattening foundation (to tile max z) */
+	if (GetTileMaxZ(tile) != z) return false;
+
+	return true;
+}
+
+
+/**
+ * Checks if a house of size 2x2 can be built at this tile
+ * @param tile tile, N corner
+ * @param town town that is checking
+ * @param z maximum tile z so all tile have the same max z
+ * @param noslope are slopes (foundations) allowed?
+ * @return true iff house can be built
+ * @see CheckBuildHouseSameZ()
+ */
+static bool CheckFree2x2Area(TileIndex tile, TownID town, uint z, bool noslope)
+{
+	/* we need to check this tile too because we can be at different tile now */
+	if (!CheckBuildHouseSameZ(tile, town, z, noslope)) return false;
+
+	for (DiagDirection d = DIAGDIR_SE; d < DIAGDIR_END; d++) {
+		tile += TileOffsByDiagDir(d);
+		if (!CheckBuildHouseSameZ(tile, town, z, noslope)) return false;
 	}
 
 	return true;
 }
 
-static void DoBuildTownHouse(Town *t, TileIndex tile)
+
+/**
+ * Checks if current town layout allows building here
+ * @param t town
+ * @param tile tile to check
+ * @return true iff town layout allows building here
+ * @note see layouts
+ */
+static inline bool TownLayoutAllowsHouseHere(Town *t, TileIndex tile)
 {
-	int i;
-	uint bitmask;
-	HouseID house;
-	Slope slope;
+	TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile);
+
+	switch (_patches.town_layout) {
+		case TL_2X2_GRID:
+			if ((grid_pos.x % 3) == 0 || (grid_pos.y % 3) == 0) return false;
+			break;
+
+		case TL_3X3_GRID:
+			if ((grid_pos.x % 4) == 0 || (grid_pos.y % 4) == 0) return false;
+			break;
+
+		default:
+			break;
+	}
+
+	return true;
+}
+
+
+/**
+ * Checks if current town layout allows 2x2 building here
+ * @param t town
+ * @param tile tile to check
+ * @return true iff town layout allows 2x2 building here
+ * @note see layouts
+ */
+static inline bool TownLayoutAllows2x2HouseHere(Town *t, TileIndex tile)
+{
+	/* MapSize() is sure dividable by both MapSizeX() and MapSizeY(),
+	 * so to do only one memory access, use MapSize() */
+	uint dx = MapSize() + TileX(t->xy) - TileX(tile);
+	uint dy = MapSize() + TileY(t->xy) - TileY(tile);
+
+	switch (_patches.town_layout) {
+		case TL_2X2_GRID:
+			if ((dx % 3) != 0 || (dy % 3) != 0) return false;
+			break;
+
+		case TL_3X3_GRID:
+			if ((dx % 4) < 2 || (dy % 4) < 2) return false;
+			break;
+
+		default:
+			break;
+	}
+
+	return true;
+}
+
+
+/**
+ * Checks if 1x2 or 2x1 building is allowed here, also takes into account current town layout
+ * Also, tests both building positions that occupy this tile
+ * @param tile tile where the building should be built
+ * @param t town
+ * @param maxz all tiles should have the same height
+ * @param noslope are slopes forbidden?
+ * @param second diagdir from first tile to second tile
+ **/
+static bool CheckTownBuild2House(TileIndex *tile, Town *t, uint maxz, bool noslope, DiagDirection second)
+{
+	/* 'tile' is already checked in BuildTownHouse() - CanBuildHouseHere() and slope test */
+
+	TileIndex tile2 = *tile + TileOffsByDiagDir(second);
+	if (TownLayoutAllowsHouseHere(t, tile2) && CheckBuildHouseSameZ(tile2, t->index, maxz, noslope)) return true;
+
+	tile2 = *tile + TileOffsByDiagDir(ReverseDiagDir(second));
+	if (TownLayoutAllowsHouseHere(t, tile2) && CheckBuildHouseSameZ(tile2, t->index, maxz, noslope)) {
+		*tile = tile2;
+		return true;
+	}
+
+	return false;
+}
+
+
+/**
+ * Checks if 2x2 building is allowed here, also takes into account current town layout
+ * Also, tests all four building positions that occupy this tile
+ * @param tile tile where the building should be built
+ * @param t town
+ * @param maxz all tiles should have the same height
+ * @param noslope are slopes forbidden?
+ **/
+static bool CheckTownBuild2x2House(TileIndex *tile, Town *t, uint maxz, bool noslope)
+{
+	TileIndex tile2 = *tile;
+
+	for (DiagDirection d = DIAGDIR_SE;;d++) { // 'd' goes through DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_END
+		if (TownLayoutAllows2x2HouseHere(t, tile2) && CheckFree2x2Area(tile2, t->index, maxz, noslope)) {
+			*tile = tile2;
+			return true;
+		}
+		if (d == DIAGDIR_END) break;
+		tile2 += TileOffsByDiagDir(ReverseDiagDir(d)); // go clockwise
+	}
+
+	return false;
+}
+
+
+/**
+ * Tries to build a house at this tile
+ * @param t town the house will belong to
+ * @param tile where the house will be built
+ * @return false iff no house can be built at this tile
+ */
+static bool BuildTownHouse(Town *t, TileIndex tile)
+{
+	/* forbidden building here by town layout */
+	if (!TownLayoutAllowsHouseHere(t, tile)) return false;
+
+	/* no house allowed at all, bail out */
+	if (!CanBuildHouseHere(tile, t->index, false)) return false;
+
 	uint z;
-	uint oneof = 0;
-	HouseSpec *hs;
-
-	/* Above snow? */
-	slope = GetTileSlope(tile, &z);
+	Slope slope = GetTileSlope(tile, &z);
 
 	/* Get the town zone type of the current tile, as well as the climate.
 	 * This will allow to easily compare with the specs of the new house to build */
-	{
-		HouseZonesBits rad = GetTownRadiusGroup(t, tile);
-
-		int land = _opt.landscape;
-		if (land == LT_ARCTIC && z >= _opt.snow_line) land = -1;
-
-		bitmask = (1 << rad) + (1 << (land + 12));
-	}
+	HouseZonesBits rad = GetTownRadiusGroup(t, tile);
+
+	/* Above snow? */
+	int land = _opt.landscape;
+	if (land == LT_ARCTIC && z >= _opt.snow_line) land = -1;
+
+	uint bitmask = (1 << rad) + (1 << (land + 12));
 
 	/* bits 0-4 are used
 	 * bits 11-15 are used
 	 * bits 5-10 are not used. */
-	{
-		HouseID houses[HOUSE_MAX];
-		int num = 0;
-		uint cumulative_probs[HOUSE_MAX];
-		uint probability_max = 0;
-
-		/* Generate a list of all possible houses that can be built. */
-		for (i = 0; i < HOUSE_MAX; i++) {
-			hs = GetHouseSpecs(i);
-			/* Verify that the candidate house spec matches the current tile status */
-			if ((~hs->building_availability & bitmask) == 0 && hs->enabled) {
-				if (_loaded_newgrf_features.has_newhouses) {
-					probability_max += hs->probability;
-					cumulative_probs[num] = probability_max;
-				}
-				houses[num++] = (HouseID)i;
+	HouseID houses[HOUSE_MAX];
+	uint num = 0;
+	uint probs[HOUSE_MAX];
+	uint probability_max = 0;
+
+	/* Generate a list of all possible houses that can be built. */
+	for (uint i = 0; i < HOUSE_MAX; i++) {
+		HouseSpec *hs = GetHouseSpecs(i);
+		/* Verify that the candidate house spec matches the current tile status */
+		if ((~hs->building_availability & bitmask) == 0 && hs->enabled) {
+			/* Without NewHouses, all houses have probability '1' */
+			uint cur_prob = (_loaded_newgrf_features.has_newhouses ? hs->probability : 1);
+			probability_max += cur_prob;
+			probs[num] = cur_prob;
+			houses[num++] = (HouseID)i;
+		}
+	}
+
+	uint maxz = GetTileMaxZ(tile);
+
+	while (probability_max > 0) {
+		uint r = RandomRange(probability_max);
+		uint i;
+		for (i = 0; i < num; i++) {
+			if (probs[i] > r) break;
+			r -= probs[i];
+		}
+
+		HouseID house = houses[i];
+		probability_max -= probs[i];
+
+		/* remove tested house from the set */
+		num--;
+		houses[i] = houses[num];
+		probs[i] = probs[num];
+
+		HouseSpec *hs = GetHouseSpecs(house);
+
+		if (_loaded_newgrf_features.has_newhouses) {
+			if (hs->override != 0) {
+				house = hs->override;
+				hs = GetHouseSpecs(house);
+			}
+
+			if ((hs->extra_flags & BUILDING_IS_HISTORICAL) && !_generating_world) continue;
+
+			if (HasBit(hs->callback_mask, CBM_HOUSE_ALLOW_CONSTRUCTION)) {
+				uint16 callback_res = GetHouseCallback(CBID_HOUSE_ALLOW_CONSTRUCTION, 0, 0, house, t, tile);
+				if (callback_res != CALLBACK_FAILED && callback_res == 0) continue;
 			}
 		}
 
-		for (;;) {
-			if (_loaded_newgrf_features.has_newhouses) {
-				uint r = RandomRange(probability_max);
-				for (i = 0; i < num; i++) if (cumulative_probs[i] >= r) break;
-
-				house = houses[i];
-			} else {
-				house = houses[RandomRange(num)];
-			}
-
-			hs = GetHouseSpecs(house);
-
-			if (_loaded_newgrf_features.has_newhouses) {
-				if (hs->override != 0) {
-					house = hs->override;
-					hs = GetHouseSpecs(house);
-				}
-
-				if ((hs->extra_flags & BUILDING_IS_HISTORICAL) && !_generating_world) continue;
-
-				if (HasBit(hs->callback_mask, CBM_HOUSE_ALLOW_CONSTRUCTION)) {
-					uint16 callback_res = GetHouseCallback(CBID_HOUSE_ALLOW_CONSTRUCTION, 0, 0, house, t, tile);
-					if (callback_res != CALLBACK_FAILED && callback_res == 0) continue;
-				}
-			}
-
-			if (_cur_year < hs->min_date || _cur_year > hs->max_date) continue;
-
-			/* Special houses that there can be only one of. */
-			if (hs->building_flags & BUILDING_IS_CHURCH) {
-				SetBit(oneof, TOWN_HAS_CHURCH);
-			} else if (hs->building_flags & BUILDING_IS_STADIUM) {
-				SetBit(oneof, TOWN_HAS_STADIUM);
-			} else {
-				oneof = 0;
-			}
-
-			if (HASBITS(t->flags12 , oneof)) continue;
-
-			/* Make sure there is no slope? */
-			if (hs->building_flags & TILE_NOT_SLOPED && slope != SLOPE_FLAT) continue;
-
-			if (hs->building_flags & TILE_SIZE_2x2) {
-				if (CheckFree2x2Area(tile) ||
-						CheckFree2x2Area(tile += TileDiffXY(-1,  0)) ||
-						CheckFree2x2Area(tile += TileDiffXY( 0, -1)) ||
-						CheckFree2x2Area(tile += TileDiffXY( 1,  0))) {
-					break;
-				}
-				tile += TileDiffXY(0, 1);
-			} else if (hs->building_flags & TILE_SIZE_2x1) {
-				if (CheckBuildHouseMode(tile + TileDiffXY(1, 0), slope, 0)) break;
-
-				if (CheckBuildHouseMode(tile + TileDiffXY(-1, 0), slope, 1)) {
-					tile += TileDiffXY(-1, 0);
-					break;
-				}
-			} else if (hs->building_flags & TILE_SIZE_1x2) {
-				if (CheckBuildHouseMode(tile + TileDiffXY(0, 1), slope, 2)) break;
-
-				if (CheckBuildHouseMode(tile + TileDiffXY(0, -1), slope, 3)) {
-					tile += TileDiffXY(0, -1);
-					break;
-				}
-			} else {
-				break;
-			}
+		if (_cur_year < hs->min_date || _cur_year > hs->max_date) continue;
+
+		/* Special houses that there can be only one of. */
+		uint oneof = 0;
+
+		if (hs->building_flags & BUILDING_IS_CHURCH) {
+			SetBit(oneof, TOWN_HAS_CHURCH);
+		} else if (hs->building_flags & BUILDING_IS_STADIUM) {
+			SetBit(oneof, TOWN_HAS_STADIUM);
 		}
-	}
-
-	t->num_houses++;
-	IncreaseBuildingCount(t, house);
-
-	/* Special houses that there can be only one of. */
-	t->flags12 |= oneof;
-
-	{
-		byte construction_counter = 0, construction_stage = 0;
+
+		if (HASBITS(t->flags12 , oneof)) continue;
+
+		/* Make sure there is no slope? */
+		bool noslope = (hs->building_flags & TILE_NOT_SLOPED) != 0;
+		if (noslope && slope != SLOPE_FLAT) continue;
+
+		if (hs->building_flags & TILE_SIZE_2x2) {
+			if (!CheckTownBuild2x2House(&tile, t, maxz, noslope)) continue;
+		} else if (hs->building_flags & TILE_SIZE_2x1) {
+			if (!CheckTownBuild2House(&tile, t, maxz, noslope, DIAGDIR_SW)) continue;
+		} else if (hs->building_flags & TILE_SIZE_1x2) {
+			if (!CheckTownBuild2House(&tile, t, maxz, noslope, DIAGDIR_SE)) continue;
+		} else {
+			/* 1x1 house checks are already done */
+		}
+
+		/* build the house */
+		t->num_houses++;
+		IncreaseBuildingCount(t, house);
+
+		/* Special houses that there can be only one of. */
+		t->flags12 |= oneof;
+
+		byte construction_counter = 0;
+		byte construction_stage = 0;
 
 		if (_generating_world) {
 			uint32 r = Random();
@@ -1793,22 +1961,13 @@
 				construction_counter = GB(r, 2, 2);
 			}
 		}
+
 		MakeTownHouse(tile, t->index, construction_counter, construction_stage, house, Random());
+
+		return true;
 	}
-}
-
-static bool BuildTownHouse(Town *t, TileIndex tile)
-{
-	CommandCost r;
-
-	if (IsSteepSlope(GetTileSlope(tile, NULL))) return false;
-	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return false;
-
-	r = DoCommand(tile, 0, 0, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_LANDSCAPE_CLEAR);
-	if (CmdFailed(r)) return false;
-
-	DoBuildTownHouse(t, tile);
-	return true;
+
+	return false;
 }
 
 
--- a/src/town_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/town_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -225,25 +225,24 @@
 	case WE_DOUBLE_CLICK:
 	case WE_CLICK:
 		switch (e->we.click.widget) {
-		case TWA_COMMAND_LIST: {
-			const Town *t = GetTown(w->window_number);
-			int y = (e->we.click.pt.y - 0x6B) / 10;
-
-			if (!IsInsideMM(y, 0, 5)) return;
+			case TWA_COMMAND_LIST: {
+				const Town *t = GetTown(w->window_number);
+				int y = (e->we.click.pt.y - 0x6B) / 10;
 
-			y = GetNthSetBit(GetMaskOfTownActions(NULL, _local_player, t), y + w->vscroll.pos - 1);
-			if (y >= 0) {
-				WP(w, def_d).data_1 = y;
-				SetWindowDirty(w);
+				if (!IsInsideMM(y, 0, 5)) return;
+
+				y = GetNthSetBit(GetMaskOfTownActions(NULL, _local_player, t), y + w->vscroll.pos - 1);
+				if (y >= 0) {
+					WP(w, def_d).data_1 = y;
+					SetWindowDirty(w);
+				}
+				/* Fall through to clicking in case we are double-clicked */
+				if (e->event != WE_DOUBLE_CLICK || y < 0) break;
 			}
-			/* Fall through to clicking in case we are double-clicked */
-			if (e->event != WE_DOUBLE_CLICK || y < 0) break;
-		}
 
-		case TWA_EXECUTE: {
-			DoCommandP(GetTown(w->window_number)->xy, w->window_number, WP(w, def_d).data_1, NULL, CMD_DO_TOWN_ACTION | CMD_MSG(STR_00B4_CAN_T_DO_THIS));
-			break;
-		}
+			case TWA_EXECUTE:
+				DoCommandP(GetTown(w->window_number)->xy, w->window_number, WP(w, def_d).data_1, NULL, CMD_DO_TOWN_ACTION | CMD_MSG(STR_00B4_CAN_T_DO_THIS));
+				break;
 		}
 		break;
 
@@ -320,8 +319,7 @@
 			case 10: /* delete town */
 				delete t;
 				break;
-		}
-		break;
+		} break;
 
 	case WE_ON_EDIT_TEXT:
 		if (e->we.edittext.str[0] != '\0') {
@@ -394,6 +392,11 @@
 	}
 }
 
+enum TownDirectoryWidget {
+	TDW_SORTNAME = 3,
+	TDW_SORTPOPULATION,
+	TDW_CENTERTOWN,
+};
 static const Widget _town_directory_widgets[] = {
 {   WWT_CLOSEBOX,   RESIZE_NONE,    13,     0,    10,     0,    13, STR_00C5,               STR_018B_CLOSE_WINDOW},
 {    WWT_CAPTION,   RESIZE_NONE,    13,    11,   195,     0,    13, STR_2000_TOWNS,         STR_018C_WINDOW_TITLE_DRAG_THIS},
@@ -478,7 +481,7 @@
 		SetVScrollCount(w, _num_town_sort);
 
 		DrawWindowWidgets(w);
-		DrawSortButtonState(w, (_town_sort_order <= 1) ? 3 : 4, _town_sort_order & 1 ? SBS_DOWN : SBS_UP);
+		DrawSortButtonState(w, (_town_sort_order <= 1) ? TDW_SORTNAME : TDW_SORTPOPULATION, _town_sort_order & 1 ? SBS_DOWN : SBS_UP);
 
 		{
 			int n = 0;
@@ -505,34 +508,33 @@
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
-		case 3: { /* Sort by Name ascending/descending */
-			_town_sort_order = (_town_sort_order == 0) ? 1 : 0;
-			_town_sort_dirty = true;
-			SetWindowDirty(w);
-		} break;
-
-		case 4: { /* Sort by Population ascending/descending */
-			_town_sort_order = (_town_sort_order == 2) ? 3 : 2;
-			_town_sort_dirty = true;
-			SetWindowDirty(w);
-		} break;
+			case TDW_SORTNAME: { /* Sort by Name ascending/descending */
+				_town_sort_order = (_town_sort_order == 0) ? 1 : 0;
+				_town_sort_dirty = true;
+				SetWindowDirty(w);
+			} break;
 
-		case 5: { /* Click on Town Matrix */
-			const Town* t;
-
-			uint16 id_v = (e->we.click.pt.y - 28) / 10;
-
-			if (id_v >= w->vscroll.cap) return; // click out of bounds
+			case TDW_SORTPOPULATION: { /* Sort by Population ascending/descending */
+				_town_sort_order = (_town_sort_order == 2) ? 3 : 2;
+				_town_sort_dirty = true;
+				SetWindowDirty(w);
+			} break;
 
-			id_v += w->vscroll.pos;
-
-			if (id_v >= _num_town_sort) return; // click out of town bounds
+			case TDW_CENTERTOWN: { /* Click on Town Matrix */
+				const Town* t;
 
-			t = _town_sort[id_v];
-			assert(t->xy);
-			ScrollMainWindowToTile(t->xy);
-			break;
-		}
+				uint16 id_v = (e->we.click.pt.y - 28) / 10;
+
+				if (id_v >= w->vscroll.cap) return; // click out of bounds
+
+				id_v += w->vscroll.pos;
+
+				if (id_v >= _num_town_sort) return; // click out of town bounds
+
+				t = _town_sort[id_v];
+				assert(t->xy);
+				ScrollMainWindowToTile(t->xy);
+			} break;
 		}
 		break;
 
--- a/src/town_map.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/town_map.h	Mon Mar 10 15:26:39 2008 +0000
@@ -145,7 +145,7 @@
 static inline byte GetHouseAnimationFrame(TileIndex t)
 {
 	assert(IsTileType(t, MP_HOUSE));
-	return GB(_m[t].m6, 3, 5);
+	return GB(_m[t].m6, 2, 6) | (GB(_m[t].m3, 5, 1) << 6);
 }
 
 /**
@@ -157,7 +157,8 @@
 static inline void SetHouseAnimationFrame(TileIndex t, byte frame)
 {
 	assert(IsTileType(t, MP_HOUSE));
-	SB(_m[t].m6, 3, 5, frame);
+	SB(_m[t].m6, 2, 6, GB(frame, 0, 6));
+	SB(_m[t].m3, 5, 1, GB(frame, 6, 1));
 }
 
 /**
@@ -211,26 +212,6 @@
 }
 
 /**
- * Helper function for MakeHouseTile.
- * It is called  for each tile of a multi-tile house.
- * Parametes are the same.
- * @param t tile index
- * @param tid Town index
- * @param counter of construction step
- * @param stage of construction (used for drawing)
- * @param type of house.  Index into house specs array
- * @param random_bits required for newgrf houses
- */
-static inline void MakeTownHouse(TileIndex t, TownID tid, byte counter, byte stage, HouseID type, byte random_bits)
-{
-	BuildingFlags size = GetHouseSpecs(type)->building_flags;
-	MakeHouseTile(t, tid, counter, stage, type, random_bits);
-	if (size & BUILDING_2_TILES_Y)   MakeHouseTile(t + TileDiffXY(0, 1), tid, counter, stage, ++type, random_bits);
-	if (size & BUILDING_2_TILES_X)   MakeHouseTile(t + TileDiffXY(1, 0), tid, counter, stage, ++type, random_bits);
-	if (size & BUILDING_HAS_4_TILES) MakeHouseTile(t + TileDiffXY(1, 1), tid, counter, stage, ++type, random_bits);
-}
-
-/**
  * House Construction Scheme.
  *  Construction counter, for buildings under construction. Incremented on every
  *  periodic tile processing.
--- a/src/track_func.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/track_func.h	Mon Mar 10 15:26:39 2008 +0000
@@ -274,6 +274,64 @@
 }
 
 /**
+ * Converts TrackBits to TrackdirBits while allowing both directions.
+ *
+ * @param bits The TrackBits
+ * @return The TrackDirBits containing of bits in both directions.
+ */
+static inline TrackdirBits TrackBitsToTrackdirBits(TrackBits bits)
+{
+	return (TrackdirBits)(bits * 0x101);
+}
+
+/**
+ * Returns the present-trackdir-information of a TrackStatus.
+ *
+ * @param ts The TrackStatus returned by GetTileTrackStatus()
+ * @return the present trackdirs
+ */
+static inline TrackdirBits TrackStatusToTrackdirBits(TrackStatus ts)
+{
+	return (TrackdirBits)(ts & TRACKDIR_BIT_MASK);
+}
+
+/**
+ * Returns the present-track-information of a TrackStatus.
+ *
+ * @param ts The TrackStatus returned by GetTileTrackStatus()
+ * @return the present tracks
+ */
+static inline TrackBits TrackStatusToTrackBits(TrackStatus ts)
+{
+	return TrackdirBitsToTrackBits(TrackStatusToTrackdirBits(ts));
+}
+
+/**
+ * Returns the red-signal-information of a TrackStatus.
+ *
+ * Note: The result may contain red signals for non-present tracks.
+ *
+ * @param ts The TrackStatus returned by GetTileTrackStatus()
+ * @return the The trackdirs that are blocked by red-signals
+ */
+static inline TrackdirBits TrackStatusToRedSignals(TrackStatus ts)
+{
+	return (TrackdirBits)((ts >> 16) & TRACKDIR_BIT_MASK);
+}
+
+/**
+ * Builds a TrackStatus
+ *
+ * @param trackdirbits present trackdirs
+ * @param red_signals red signals
+ * @return the TrackStatus representing the given information
+ */
+static inline TrackStatus CombineTrackStatus(TrackdirBits trackdirbits, TrackdirBits red_signals)
+{
+	return (TrackStatus)(trackdirbits | (red_signals << 16));
+}
+
+/**
  * Maps a trackdir to the trackdir that you will end up on if you go straight
  * ahead.
  *
@@ -516,4 +574,20 @@
 	return (dir & 0x06) == 0;
 }
 
+/**
+ * Checks whether a trackdir on a specific slope is going uphill.
+ *
+ * Valid for rail and road tracks.
+ * Valid for tile-slopes (under foundation) and foundation-slopes (on foundation).
+ *
+ * @param slope The slope of the tile.
+ * @param dir The trackdir of interest.
+ * @return true iff the track goes upwards.
+ */
+static inline bool IsUphillTrackdir(Slope slope, Trackdir dir)
+{
+	extern const TrackdirBits _uphill_trackdirs[];
+	return HasBit(_uphill_trackdirs[RemoveHalftileSlope(slope)], dir);
+}
+
 #endif /* TRACK_FUNC_H */
--- a/src/track_type.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/track_type.h	Mon Mar 10 15:26:39 2008 +0000
@@ -124,4 +124,6 @@
 typedef TinyEnumT<TrackdirBits> TrackdirBitsShort;
 DECLARE_ENUM_AS_BIT_SET(TrackdirBits);
 
+typedef uint32 TrackStatus;
+
 #endif /* TRACK_TYPE_H */
--- a/src/train.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/train.h	Mon Mar 10 15:26:39 2008 +0000
@@ -17,12 +17,12 @@
  */
 
 enum TrainSubtype {
-	Train_Front             = 0, ///< Leading engine of a train
-	Train_Articulated_Part  = 1, ///< Articulated part of an engine
-	Train_Wagon             = 2, ///< Wagon
-	Train_Engine            = 3, ///< Engine, that can be front engines, but might be placed behind another engine
-	Train_Free_Wagon        = 4, ///< First in a wagon chain (in depot)
-	Train_Multiheaded       = 5, ///< Engine is a multiheaded
+	TS_FRONT             = 0, ///< Leading engine of a train
+	TS_ARTICULATED_PART  = 1, ///< Articulated part of an engine
+	TS_WAGON             = 2, ///< Wagon
+	TS_ENGINE            = 3, ///< Engine, that can be front engines, but might be placed behind another engine
+	TS_FREE_WAGON        = 4, ///< First in a wagon chain (in depot)
+	TS_MULTIHEADED       = 5, ///< Engine is a multiheaded
 };
 
 
@@ -33,7 +33,7 @@
 static inline bool IsFrontEngine(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HasBit(v->subtype, Train_Front);
+	return HasBit(v->subtype, TS_FRONT);
 }
 
 /** Set front engine state
@@ -42,7 +42,7 @@
 static inline void SetFrontEngine(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SetBit(v->subtype, Train_Front);
+	SetBit(v->subtype, TS_FRONT);
 }
 
 /** Remove the front engine state
@@ -51,7 +51,7 @@
 static inline void ClearFrontEngine(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	ClrBit(v->subtype, Train_Front);
+	ClrBit(v->subtype, TS_FRONT);
 }
 
 /** Check if a vehicle is an articulated part of an engine
@@ -61,7 +61,7 @@
 static inline bool IsArticulatedPart(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HasBit(v->subtype, Train_Articulated_Part);
+	return HasBit(v->subtype, TS_ARTICULATED_PART);
 }
 
 /** Set a vehicle to be an articulated part
@@ -70,7 +70,7 @@
 static inline void SetArticulatedPart(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SetBit(v->subtype, Train_Articulated_Part);
+	SetBit(v->subtype, TS_ARTICULATED_PART);
 }
 
 /** Clear a vehicle from being an articulated part
@@ -79,7 +79,7 @@
 static inline void ClearArticulatedPart(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	ClrBit(v->subtype, Train_Articulated_Part);
+	ClrBit(v->subtype, TS_ARTICULATED_PART);
 }
 
 /** Check if a vehicle is a wagon
@@ -89,7 +89,7 @@
 static inline bool IsTrainWagon(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HasBit(v->subtype, Train_Wagon);
+	return HasBit(v->subtype, TS_WAGON);
 }
 
 /** Set a vehicle to be a wagon
@@ -98,7 +98,7 @@
 static inline void SetTrainWagon(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SetBit(v->subtype, Train_Wagon);
+	SetBit(v->subtype, TS_WAGON);
 }
 
 /** Clear wagon property
@@ -107,7 +107,7 @@
 static inline void ClearTrainWagon(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	ClrBit(v->subtype, Train_Wagon);
+	ClrBit(v->subtype, TS_WAGON);
 }
 
 /** Check if a vehicle is an engine (can be first in a train)
@@ -117,7 +117,7 @@
 static inline bool IsTrainEngine(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HasBit(v->subtype, Train_Engine);
+	return HasBit(v->subtype, TS_ENGINE);
 }
 
 /** Set engine status
@@ -126,7 +126,7 @@
 static inline void SetTrainEngine(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SetBit(v->subtype, Train_Engine);
+	SetBit(v->subtype, TS_ENGINE);
 }
 
 /** Clear engine status
@@ -135,7 +135,7 @@
 static inline void ClearTrainEngine(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	ClrBit(v->subtype, Train_Engine);
+	ClrBit(v->subtype, TS_ENGINE);
 }
 
 /** Check if a vehicle is a free wagon (got no engine in front of it)
@@ -145,7 +145,7 @@
 static inline bool IsFreeWagon(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HasBit(v->subtype, Train_Free_Wagon);
+	return HasBit(v->subtype, TS_FREE_WAGON);
 }
 
 /** Set if a vehicle is a free wagon
@@ -154,7 +154,7 @@
 static inline void SetFreeWagon(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SetBit(v->subtype, Train_Free_Wagon);
+	SetBit(v->subtype, TS_FREE_WAGON);
 }
 
 /** Clear a vehicle from being a free wagon
@@ -163,7 +163,7 @@
 static inline void ClearFreeWagon(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	ClrBit(v->subtype, Train_Free_Wagon);
+	ClrBit(v->subtype, TS_FREE_WAGON);
 }
 
 /** Check if a vehicle is a multiheaded engine
@@ -173,7 +173,7 @@
 static inline bool IsMultiheaded(const Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	return HasBit(v->subtype, Train_Multiheaded);
+	return HasBit(v->subtype, TS_MULTIHEADED);
 }
 
 /** Set if a vehicle is a multiheaded engine
@@ -182,7 +182,7 @@
 static inline void SetMultiheaded(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	SetBit(v->subtype, Train_Multiheaded);
+	SetBit(v->subtype, TS_MULTIHEADED);
 }
 
 /** Clear multiheaded engine property
@@ -191,7 +191,7 @@
 static inline void ClearMultiheaded(Vehicle *v)
 {
 	assert(v->type == VEH_TRAIN);
-	ClrBit(v->subtype, Train_Multiheaded);
+	ClrBit(v->subtype, TS_MULTIHEADED);
 }
 
 /** Check if an engine has an articulated part.
--- a/src/train_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/train_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -735,6 +735,7 @@
 			v->x_pos = x;
 			v->y_pos = y;
 			v->z_pos = GetSlopeZ(x, y);
+			v->running_ticks = 0;
 			v->u.rail.track = TRACK_BIT_DEPOT;
 			v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
 			v->spritenum = rvi->image_index;
@@ -993,7 +994,7 @@
 	if (HasBit(p2, 0) && src_head == dst_head) return CommandCost();
 
 	{
-		int max_len = _patches.mammoth_trains ? 100 : 9;
+		int max_len = _patches.mammoth_trains ? 100 : 10;
 
 		/* check if all vehicles in the source train are stopped inside a depot. */
 		int src_len = CheckTrainStoppedInDepot(src_head);
@@ -1444,7 +1445,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, TS_FRONT)) {
 					Vehicle *tmp;
 					for (v = first; v != NULL; v = tmp) {
 						tmp = GetNextVehicle(v);
@@ -1543,7 +1544,7 @@
 	EndVehicleMove(v);
 }
 
-static void SetLastSpeed(Vehicle* v, int spd)
+static inline void SetLastSpeed(Vehicle* v, int spd)
 {
 	int old = v->u.rail.last_speed;
 	if (spd != old) {
@@ -1666,7 +1667,7 @@
 {
 	assert(IsLevelCrossingTile(tile));
 
-	DiagDirection dir = AxisToDiagDir(OtherAxis(GetCrossingRoadAxis(tile)));
+	DiagDirection dir = AxisToDiagDir(GetCrossingRailAxis(tile));
 	TileIndex tile_from = tile + TileOffsByDiagDir(dir);
 
 	Vehicle *v = (Vehicle *)VehicleFromPos(tile_from, &tile, &TrainApproachingCrossingEnum);
@@ -1785,11 +1786,17 @@
 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
 	}
 
-	/* update all images */
-	for (Vehicle *u = v; u != NULL; u = u->Next()) { u->cur_image = u->GetImage(u->direction); }
+	/* set reversed flag on all parts */
+	for (Vehicle *u = v; u != NULL; u = u->Next()) ToggleBit(u->u.rail.flags, VRF_TOGGLE_REVERSE);
 
 	ClrBit(v->u.rail.flags, VRF_REVERSING);
 
+	/* recalculate cached data */
+	TrainConsistChanged(v);
+
+	/* update all images */
+	for (Vehicle *u = v; u != NULL; u = u->Next()) u->cur_image = u->GetImage(u->direction);
+
 	/* update crossing we were approaching */
 	if (crossing != INVALID_TILE) UpdateLevelCrossing(crossing);
 
@@ -2000,7 +2007,7 @@
 
 	TrainFindDepotData tfdd;
 	tfdd.owner = v->owner;
-	tfdd.best_length = (uint)-1;
+	tfdd.best_length = UINT_MAX;
 	tfdd.reverse = false;
 
 	TileIndex tile = v->tile;
@@ -2010,36 +2017,43 @@
 		return tfdd;
 	}
 
-	if (_patches.yapf.rail_use_yapf) {
-		bool found = YapfFindNearestRailDepotTwoWay(v, max_distance, NPF_INFINITE_PENALTY, &tfdd.tile, &tfdd.reverse);
-		tfdd.best_length = found ? max_distance / 2 : -1; // some fake distance or NOT_FOUND
-	} else if (_patches.new_pathfinding_all) {
-		Vehicle* last = GetLastVehicleInChain(v);
-		Trackdir trackdir = GetVehicleTrackdir(v);
-		Trackdir trackdir_rev = ReverseTrackdir(GetVehicleTrackdir(last));
-
-		assert(trackdir != INVALID_TRACKDIR);
-		NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, last->tile, trackdir_rev, TRANSPORT_RAIL, 0, v->owner, v->u.rail.compatible_railtypes, NPF_INFINITE_PENALTY);
-		if (ftd.best_bird_dist == 0) {
-			/* Found target */
-			tfdd.tile = ftd.node.tile;
-			/* Our caller expects a number of tiles, so we just approximate that
-			 * number by this. It might not be completely what we want, but it will
-			 * work for now :-) We can possibly change this when the old pathfinder
-			 * is removed. */
-			tfdd.best_length = ftd.best_path_dist / NPF_TILE_LENGTH;
-			if (NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE)) tfdd.reverse = true;
-		}
-	} else {
-		/* search in the forward direction first. */
-		DiagDirection i = TrainExitDir(v->direction, v->u.rail.track);
-		NewTrainPathfind(tile, 0, v->u.rail.compatible_railtypes, i, (NTPEnumProc*)NtpCallbFindDepot, &tfdd);
-		if (tfdd.best_length == (uint)-1){
-			tfdd.reverse = true;
-			/* search in backwards direction */
-			i = TrainExitDir(ReverseDir(v->direction), v->u.rail.track);
+	switch (_patches.pathfinder_for_trains) {
+		case VPF_YAPF: { /* YAPF */
+			bool found = YapfFindNearestRailDepotTwoWay(v, max_distance, NPF_INFINITE_PENALTY, &tfdd.tile, &tfdd.reverse);
+			tfdd.best_length = found ? max_distance / 2 : UINT_MAX; // some fake distance or NOT_FOUND
+		} break;
+
+		case VPF_NPF: { /* NPF */
+			Vehicle* last = GetLastVehicleInChain(v);
+			Trackdir trackdir = GetVehicleTrackdir(v);
+			Trackdir trackdir_rev = ReverseTrackdir(GetVehicleTrackdir(last));
+
+			assert(trackdir != INVALID_TRACKDIR);
+			NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, last->tile, trackdir_rev, false, TRANSPORT_RAIL, 0, v->owner, v->u.rail.compatible_railtypes, NPF_INFINITE_PENALTY);
+			if (ftd.best_bird_dist == 0) {
+				/* Found target */
+				tfdd.tile = ftd.node.tile;
+				/* Our caller expects a number of tiles, so we just approximate that
+				* number by this. It might not be completely what we want, but it will
+				* work for now :-) We can possibly change this when the old pathfinder
+				* is removed. */
+				tfdd.best_length = ftd.best_path_dist / NPF_TILE_LENGTH;
+				if (NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE)) tfdd.reverse = true;
+			}
+		} break;
+
+		default:
+		case VPF_NTP: { /* NTP */
+			/* search in the forward direction first. */
+			DiagDirection i = TrainExitDir(v->direction, v->u.rail.track);
 			NewTrainPathfind(tile, 0, v->u.rail.compatible_railtypes, i, (NTPEnumProc*)NtpCallbFindDepot, &tfdd);
-		}
+			if (tfdd.best_length == UINT_MAX){
+				tfdd.reverse = true;
+				/* search in backwards direction */
+				i = TrainExitDir(ReverseDir(v->direction), v->u.rail.track);
+				NewTrainPathfind(tile, 0, v->u.rail.compatible_railtypes, i, (NTPEnumProc*)NtpCallbFindDepot, &tfdd);
+			}
+		} break;
 	}
 
 	return tfdd;
@@ -2202,7 +2216,7 @@
 	if (sound) PlayVehicleSound(u, VSE_TRAIN_EFFECT);
 }
 
-static void TrainPlayLeaveStationSound(const Vehicle* v)
+void Train::PlayLeaveStationSound() const
 {
 	static const SoundFx sfx[] = {
 		SND_04_TRAIN,
@@ -2212,15 +2226,10 @@
 		SND_41_MAGLEV
 	};
 
-	if (PlayVehicleSound(v, VSE_START)) return;
-
-	EngineID engtype = v->engine_type;
-	SndPlayVehicleFx(sfx[RailVehInfo(engtype)->engclass], v);
-}
-
-void Train::PlayLeaveStationSound() const
-{
-	TrainPlayLeaveStationSound(this);
+	if (PlayVehicleSound(this, VSE_START)) return;
+
+	EngineID engtype = this->engine_type;
+	SndPlayVehicleFx(sfx[RailVehInfo(engtype)->engclass], this);
 }
 
 static bool CheckTrainStayInDepot(Vehicle *v)
@@ -2253,7 +2262,7 @@
 
 	VehicleServiceInDepot(v);
 	InvalidateWindowClasses(WC_TRAINS_LIST);
-	TrainPlayLeaveStationSound(v);
+	v->PlayLeaveStationSound();
 
 	v->u.rail.track = TRACK_BIT_X;
 	if (v->direction & 2) v->u.rail.track = TRACK_BIT_Y;
@@ -2363,68 +2372,76 @@
 	/* quick return in case only one possible track is available */
 	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);
-		if (trackdir != INVALID_TRACKDIR) {
-			best_track = TrackdirToTrack(trackdir);
-		} else {
-			best_track = FindFirstTrack(tracks);
-		}
-	} else if (_patches.new_pathfinding_all) { /* Use a new pathfinding for everything */
-		void* perf = NpfBeginInterval();
-
-		NPFFindStationOrTileData fstd;
-		NPFFillWithOrderData(&fstd, v);
-		/* The enterdir for the new tile, is the exitdir for the old tile */
-		Trackdir trackdir = GetVehicleTrackdir(v);
-		assert(trackdir != 0xff);
-
-		NPFFoundTargetData ftd = NPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, &fstd, TRANSPORT_RAIL, 0, v->owner, v->u.rail.compatible_railtypes);
-
-		if (ftd.best_trackdir == 0xff) {
-			/* We are already at our target. Just do something
-			 * @todo maybe display error?
-			 * @todo: go straight ahead if possible? */
-			best_track = FindFirstTrack(tracks);
-		} else {
-			/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
-			the direction we need to take to get there, if ftd.best_bird_dist is not 0,
-			we did not find our target, but ftd.best_trackdir contains the direction leading
-			to the tile closest to our target. */
-			if (ftd.best_bird_dist != 0) path_not_found = true;
-			/* Discard enterdir information, making it a normal track */
-			best_track = TrackdirToTrack(ftd.best_trackdir);
-		}
-
-		int time = NpfEndInterval(perf);
-		DEBUG(yapf, 4, "[NPFT] %d us - %d rounds - %d open - %d closed -- ", time, 0, _aystar_stats_open_size, _aystar_stats_closed_size);
-	} else {
-		void* perf = NpfBeginInterval();
-
-		TrainTrackFollowerData fd;
-		FillWithStationData(&fd, v);
-
-		/* New train pathfinding */
-		fd.best_bird_dist = (uint)-1;
-		fd.best_track_dist = (uint)-1;
-		fd.best_track = INVALID_TRACKDIR;
-
-		NewTrainPathfind(tile - TileOffsByDiagDir(enterdir), v->dest_tile,
-			v->u.rail.compatible_railtypes, enterdir, (NTPEnumProc*)NtpCallbFindStation, &fd);
-
-		/* check whether the path was found or only 'guessed' */
-		if (fd.best_bird_dist != 0) path_not_found = true;
-
-		if (fd.best_track == 0xff) {
-			/* blaha */
-			best_track = FindFirstTrack(tracks);
-		} else {
-			best_track = TrackdirToTrack(fd.best_track);
-		}
-
-		int time = NpfEndInterval(perf);
-		DEBUG(yapf, 4, "[NTPT] %d us - %d rounds - %d open - %d closed -- ", time, 0, 0, 0);
+	switch (_patches.pathfinder_for_trains) {
+		case VPF_YAPF: { /* YAPF */
+			Trackdir trackdir = YapfChooseRailTrack(v, tile, enterdir, tracks, &path_not_found);
+			if (trackdir != INVALID_TRACKDIR) {
+				best_track = TrackdirToTrack(trackdir);
+			} else {
+				best_track = FindFirstTrack(tracks);
+			}
+		} break;
+
+		case VPF_NPF: { /* NPF */
+			void *perf = NpfBeginInterval();
+
+			NPFFindStationOrTileData fstd;
+			NPFFillWithOrderData(&fstd, v);
+			/* The enterdir for the new tile, is the exitdir for the old tile */
+			Trackdir trackdir = GetVehicleTrackdir(v);
+			assert(trackdir != INVALID_TRACKDIR);
+
+			NPFFoundTargetData ftd = NPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, true, &fstd, TRANSPORT_RAIL, 0, v->owner, v->u.rail.compatible_railtypes);
+
+			if (ftd.best_trackdir == INVALID_TRACKDIR) {
+				/* We are already at our target. Just do something
+				 * @todo maybe display error?
+				 * @todo: go straight ahead if possible? */
+				best_track = FindFirstTrack(tracks);
+			} else {
+				/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
+				 * the direction we need to take to get there, if ftd.best_bird_dist is not 0,
+				 * we did not find our target, but ftd.best_trackdir contains the direction leading
+				 * to the tile closest to our target. */
+				if (ftd.best_bird_dist != 0) path_not_found = true;
+				/* Discard enterdir information, making it a normal track */
+				best_track = TrackdirToTrack(ftd.best_trackdir);
+			}
+
+			int time = NpfEndInterval(perf);
+			DEBUG(yapf, 4, "[NPFT] %d us - %d rounds - %d open - %d closed -- ", time, 0, _aystar_stats_open_size, _aystar_stats_closed_size);
+		} break;
+
+		default:
+		case VPF_NTP: { /* NTP */
+			void *perf = NpfBeginInterval();
+
+			TrainTrackFollowerData fd;
+			FillWithStationData(&fd, v);
+
+			/* New train pathfinding */
+			fd.best_bird_dist = UINT_MAX;
+			fd.best_track_dist = UINT_MAX;
+			fd.best_track = INVALID_TRACKDIR;
+
+			NewTrainPathfind(tile - TileOffsByDiagDir(enterdir), v->dest_tile,
+				v->u.rail.compatible_railtypes, enterdir, (NTPEnumProc*)NtpCallbFindStation, &fd);
+
+			/* check whether the path was found or only 'guessed' */
+			if (fd.best_bird_dist != 0) path_not_found = true;
+
+			if (fd.best_track == INVALID_TRACKDIR) {
+				/* blaha */
+				best_track = FindFirstTrack(tracks);
+			} else {
+				best_track = TrackdirToTrack(fd.best_track);
+			}
+
+			int time = NpfEndInterval(perf);
+			DEBUG(yapf, 4, "[NTPT] %d us - %d rounds - %d open - %d closed -- ", time, 0, 0, 0);
+		} break;
 	}
+
 	/* handle "path not found" state */
 	if (path_not_found) {
 		/* PF didn't find the route */
@@ -2474,81 +2491,87 @@
 
 	int i = _search_directions[FIND_FIRST_BIT(v->u.rail.track)][DirToDiagDir(v->direction)];
 
-	if (_patches.yapf.rail_use_yapf) {
-		reverse_best = YapfCheckReverseTrain(v);
-	} else if (_patches.new_pathfinding_all) { /* Use a new pathfinding for everything */
-		NPFFindStationOrTileData fstd;
-		NPFFoundTargetData ftd;
-		Trackdir trackdir, trackdir_rev;
-		Vehicle* last = GetLastVehicleInChain(v);
-
-		NPFFillWithOrderData(&fstd, v);
-
-		trackdir = GetVehicleTrackdir(v);
-		trackdir_rev = ReverseTrackdir(GetVehicleTrackdir(last));
-		assert(trackdir != 0xff);
-		assert(trackdir_rev != 0xff);
-
-		ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, last->tile, trackdir_rev, &fstd, TRANSPORT_RAIL, 0, v->owner, v->u.rail.compatible_railtypes);
-		if (ftd.best_bird_dist != 0) {
-			/* We didn't find anything, just keep on going straight ahead */
-			reverse_best = false;
-		} else {
-			if (NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE)) {
-				reverse_best = true;
+	switch (_patches.pathfinder_for_trains) {
+		case VPF_YAPF: { /* YAPF */
+			reverse_best = YapfCheckReverseTrain(v);
+		} break;
+
+		case VPF_NPF: { /* NPF */
+			NPFFindStationOrTileData fstd;
+			NPFFoundTargetData ftd;
+			Vehicle* last = GetLastVehicleInChain(v);
+
+			NPFFillWithOrderData(&fstd, v);
+
+			Trackdir trackdir = GetVehicleTrackdir(v);
+			Trackdir trackdir_rev = ReverseTrackdir(GetVehicleTrackdir(last));
+			assert(trackdir != INVALID_TRACKDIR);
+			assert(trackdir_rev != INVALID_TRACKDIR);
+
+			ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, false, last->tile, trackdir_rev, false, &fstd, TRANSPORT_RAIL, 0, v->owner, v->u.rail.compatible_railtypes);
+			if (ftd.best_bird_dist != 0) {
+				/* We didn't find anything, just keep on going straight ahead */
+				reverse_best = false;
 			} else {
-				reverse_best = false;
+				if (NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE)) {
+					reverse_best = true;
+				} else {
+					reverse_best = false;
+				}
 			}
-		}
-	} else {
-		int best_track = -1;
-		uint reverse = 0;
-		uint best_bird_dist  = 0;
-		uint best_track_dist = 0;
-
-		for (;;) {
-			fd.best_bird_dist = (uint)-1;
-			fd.best_track_dist = (uint)-1;
-
-			NewTrainPathfind(v->tile, v->dest_tile, v->u.rail.compatible_railtypes, (DiagDirection)(reverse ^ i), (NTPEnumProc*)NtpCallbFindStation, &fd);
-
-			if (best_track != -1) {
-				if (best_bird_dist != 0) {
-					if (fd.best_bird_dist != 0) {
-						/* neither reached the destination, pick the one with the smallest bird dist */
-						if (fd.best_bird_dist > best_bird_dist) goto bad;
-						if (fd.best_bird_dist < best_bird_dist) goto good;
+		} break;
+
+		default:
+		case VPF_NTP: { /* NTP */
+			int best_track = -1;
+			uint reverse = 0;
+			uint best_bird_dist  = 0;
+			uint best_track_dist = 0;
+
+			for (;;) {
+				fd.best_bird_dist = UINT_MAX;
+				fd.best_track_dist = UINT_MAX;
+
+				NewTrainPathfind(v->tile, v->dest_tile, v->u.rail.compatible_railtypes, (DiagDirection)(reverse ^ i), (NTPEnumProc*)NtpCallbFindStation, &fd);
+
+				if (best_track != -1) {
+					if (best_bird_dist != 0) {
+						if (fd.best_bird_dist != 0) {
+							/* neither reached the destination, pick the one with the smallest bird dist */
+							if (fd.best_bird_dist > best_bird_dist) goto bad;
+							if (fd.best_bird_dist < best_bird_dist) goto good;
+						} else {
+							/* we found the destination for the first time */
+							goto good;
+						}
 					} else {
-						/* we found the destination for the first time */
-						goto good;
+						if (fd.best_bird_dist != 0) {
+							/* didn't find destination, but we've found the destination previously */
+							goto bad;
+						} else {
+							/* both old & new reached the destination, compare track length */
+							if (fd.best_track_dist > best_track_dist) goto bad;
+							if (fd.best_track_dist < best_track_dist) goto good;
+						}
 					}
-				} else {
-					if (fd.best_bird_dist != 0) {
-						/* didn't find destination, but we've found the destination previously */
-						goto bad;
-					} else {
-						/* both old & new reached the destination, compare track length */
-						if (fd.best_track_dist > best_track_dist) goto bad;
-						if (fd.best_track_dist < best_track_dist) goto good;
-					}
+
+					/* if we reach this position, there's two paths of equal value so far.
+					 * pick one randomly. */
+					int r = GB(Random(), 0, 8);
+					if (_pick_track_table[i] == (v->direction & 3)) r += 80;
+					if (_pick_track_table[best_track] == (v->direction & 3)) r -= 80;
+					if (r <= 127) goto bad;
 				}
-
-				/* if we reach this position, there's two paths of equal value so far.
-				 * pick one randomly. */
-				int r = GB(Random(), 0, 8);
-				if (_pick_track_table[i] == (v->direction & 3)) r += 80;
-				if (_pick_track_table[best_track] == (v->direction & 3)) r -= 80;
-				if (r <= 127) goto bad;
+good:;
+				best_track = i;
+				best_bird_dist = fd.best_bird_dist;
+				best_track_dist = fd.best_track_dist;
+				reverse_best = reverse;
+bad:;
+				if (reverse != 0) break;
+				reverse = 2;
 			}
-good:;
-			best_track = i;
-			best_bird_dist = fd.best_bird_dist;
-			best_track_dist = fd.best_track_dist;
-			reverse_best = reverse;
-bad:;
-			if (reverse != 0) break;
-			reverse = 2;
-		}
+		} break;
 	}
 
 	return reverse_best != 0;
@@ -2754,7 +2777,7 @@
 	DIR_E , DIR_SE, DIR_S
 };
 
-static Direction GetNewVehicleDirectionByTile(TileIndex new_tile, TileIndex old_tile)
+static inline Direction GetNewVehicleDirectionByTile(TileIndex new_tile, TileIndex old_tile)
 {
 	uint offs = (TileY(new_tile) - TileY(old_tile) + 1) * 4 +
 							TileX(new_tile) - TileX(old_tile) + 1;
@@ -2762,7 +2785,7 @@
 	return _new_vehicle_direction_table[offs];
 }
 
-static int GetDirectionToVehicle(const Vehicle *v, int x, int y)
+static inline int GetDirectionToVehicle(const Vehicle *v, int x, int y)
 {
 	byte offs;
 
@@ -2785,7 +2808,7 @@
 }
 
 /* Check if the vehicle is compatible with the specified tile */
-static bool CheckCompatibleRail(const Vehicle *v, TileIndex tile)
+static inline bool CheckCompatibleRail(const Vehicle *v, TileIndex tile)
 {
 	return
 		IsTileOwner(tile, v->owner) && (
@@ -2809,7 +2832,7 @@
 };
 
 /** Modify the speed of the vehicle due to a turn */
-static void AffectSpeedByDirChange(Vehicle* v, Direction new_dir)
+static inline void AffectSpeedByDirChange(Vehicle* v, Direction new_dir)
 {
 	if (_patches.realistic_acceleration) return;
 
@@ -2821,7 +2844,7 @@
 }
 
 /** Modify the speed of the vehicle due to a change in altitude */
-static void AffectSpeedByZChange(Vehicle *v, byte old_z)
+static inline void AffectSpeedByZChange(Vehicle *v, byte old_z)
 {
 	if (old_z == v->z_pos || _patches.realistic_acceleration) return;
 
@@ -3023,14 +3046,12 @@
 
 				/* Get the status of the tracks in the new tile and mask
 				 * away the bits that aren't reachable. */
-				uint32 ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL, 0) & _reachable_tracks[enterdir];
-
-				/* Combine the from & to directions.
-				 * Now, the lower byte contains the track status, and the byte at bit 16 contains
-				 * the signal status. */
-				uint32 tracks = ts | (ts >> 8);
-				TrackBits bits = (TrackBits)(tracks & TRACK_BIT_MASK);
-				if ((_patches.new_pathfinding_all || _patches.yapf.rail_use_yapf) && _patches.forbid_90_deg && prev == NULL) {
+				TrackStatus ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL, 0, ReverseDiagDir(enterdir)) & _reachable_tracks[enterdir];
+				TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts);
+				TrackBits red_signals = TrackdirBitsToTrackBits(TrackStatusToRedSignals(ts));
+
+				TrackBits bits = TrackdirBitsToTrackBits(trackdirbits);
+				if (_patches.pathfinder_for_trains != VPF_NTP && _patches.forbid_90_deg && prev == NULL) {
 					/* We allow wagons to make 90 deg turns, because forbid_90_deg
 					 * can be switched on halfway a turn */
 					bits &= ~TrackCrossesTracks(FindFirstTrack(v->u.rail.track));
@@ -3047,14 +3068,12 @@
 					/* Currently the locomotive is active. Determine which one of the
 					 * available tracks to choose */
 					chosen_track = TrackToTrackBits(ChooseTrainTrack(v, gp.new_tile, enterdir, bits));
-					assert(chosen_track & tracks);
+					assert(chosen_track & bits);
 
 					/* Check if it's a red signal and that force proceed is not clicked. */
-					if ((tracks >> 16) & chosen_track && v->u.rail.force_proceed == 0) {
-						/* In front of a red signal
-						 * find the first set bit in ts. need to do it in 2 steps, since
-						 * FIND_FIRST_BIT only handles 6 bits at a time. */
-						Trackdir i = FindFirstTrackdir((TrackdirBits)(uint16)ts);
+					if (red_signals & chosen_track && v->u.rail.force_proceed == 0) {
+						/* In front of a red signal */
+						Trackdir i = FindFirstTrackdir(trackdirbits);
 
 						if (!HasSignalOnTrackdir(gp.new_tile, ReverseTrackdir(i))) {
 							v->cur_speed = 0;
@@ -3132,7 +3151,7 @@
 			 * - for bridges, only the middle part - without the bridge heads */
 			if (!(v->vehstatus & VS_HIDDEN)) {
 				v->cur_speed =
-					min(v->cur_speed, GetBridge(GetBridgeType(v->tile))->speed);
+					min(v->cur_speed, GetBridgeSpec(GetBridgeType(v->tile))->speed);
 			}
 
 			if (!IsTileType(gp.new_tile, MP_TUNNELBRIDGE) || !HasBit(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
@@ -3420,9 +3439,9 @@
 	DiagDirection dir = TrainExitDir(v->direction, v->u.rail.track);
 	TileIndex tile = v->tile + TileOffsByDiagDir(dir);
 
-	/* not a crossing || wrong axis || wrong railtype || wrong owner */
+	/* not a crossing || wrong axis || unusable rail (wrong type or owner) */
 	if (!IsLevelCrossingTile(tile) || DiagDirToAxis(dir) == GetCrossingRoadAxis(tile) ||
-			!CheckCompatibleRail(v, tile) || GetTileOwner(tile) != v->owner) {
+			!CheckCompatibleRail(v, tile)) {
 		return INVALID_TILE;
 	}
 
@@ -3458,20 +3477,25 @@
 	TileIndex tile = v->tile + TileOffsByDiagDir(dir);
 
 	/* Determine the track status on the next tile */
-	uint32 ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & _reachable_tracks[dir];
+	TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir)) & _reachable_tracks[dir];
+	TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts);
+	TrackdirBits red_signals = TrackStatusToRedSignals(ts);
 
 	/* We are sure the train is not entering a depot, it is detected above */
 
-	/* no suitable trackbits at all || wrong railtype || not our track ||
-	 *   tunnel/bridge from opposite side || depot from opposite side */
-	if (GB(ts, 0, 16) == 0 || !CheckCompatibleRail(v, tile) || GetTileOwner(tile) != v->owner ||
-			(IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeDirection(tile) != dir) ||
-			(IsTileDepotType(tile, TRANSPORT_RAIL) && GetRailDepotDirection(tile) == dir) ) {
+	/* mask unreachable track bits if we are forbidden to do 90deg turns */
+	TrackBits bits = TrackdirBitsToTrackBits(trackdirbits);
+	if (_patches.pathfinder_for_trains != VPF_NTP && _patches.forbid_90_deg) {
+		bits &= ~TrackCrossesTracks(FindFirstTrack(v->u.rail.track));
+	}
+
+	/* no suitable trackbits at all || unusable rail (wrong type or owner) */
+	if (bits == TRACK_BIT_NONE || !CheckCompatibleRail(v, tile)) {
 		return TrainApproachingLineEnd(v, false);
 	}
 
 	/* approaching red signal */
-	if ((ts & (ts >> 16)) != 0) return TrainApproachingLineEnd(v, true);
+	if ((trackdirbits & red_signals) != 0) return TrainApproachingLineEnd(v, true);
 
 	/* approaching a rail/road crossing? then make it red */
 	if (IsLevelCrossingTile(tile)) MaybeBarCrossingWithSound(tile);
@@ -3556,10 +3580,10 @@
 	do {
 		const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
 
-		byte cost_factor = GetVehicleProperty(v, 0x0D, rvi->running_cost_base);
+		byte cost_factor = GetVehicleProperty(v, 0x0D, rvi->running_cost);
 		if (cost_factor == 0) continue;
 
-		cost += cost_factor * _price.running_rail[rvi->running_cost_class];
+		cost += cost_factor * GetPriceByIndex(rvi->running_cost_class);
 	} while ((v = GetNextVehicle(v)) != NULL);
 
 	return cost;
@@ -3573,6 +3597,7 @@
 	this->tick_counter++;
 
 	if (IsFrontEngine(this)) {
+		if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++;
 		this->current_order_time++;
 
 		TrainLocoHandler(this, false);
@@ -3643,11 +3668,12 @@
 			if (tile != 0) this->dest_tile = tile;
 		}
 
-		if ((this->vehstatus & VS_STOPPED) == 0) {
+		if (this->running_ticks != 0) {
 			/* running costs */
-			CommandCost cost(EXPENSES_TRAIN_RUN, this->GetRunningCost() / 364);
-
-			this->profit_this_year -= cost.GetCost() >> 8;
+			CommandCost cost(EXPENSES_TRAIN_RUN, this->GetRunningCost() * this->running_ticks / (364 * DAY_TICKS));
+
+			this->profit_this_year -= cost.GetCost();
+			this->running_ticks = 0;
 
 			SubtractMoneyFromPlayerFract(this->owner, cost);
 
@@ -3667,8 +3693,8 @@
 	FOR_ALL_VEHICLES(v) {
 		if (v->type == VEH_TRAIN && IsFrontEngine(v)) {
 			/* show warning if train is not generating enough income last 2 years (corresponds to a red icon in the vehicle list) */
-			if (_patches.train_income_warn && v->owner == _local_player && v->age >= 730 && v->profit_this_year < 0) {
-				SetDParam(1, v->profit_this_year);
+			if (_patches.train_income_warn && v->owner == _local_player && v->age >= 730 && v->GetDisplayProfitThisYear() < 0) {
+				SetDParam(1, v->GetDisplayProfitThisYear());
 				SetDParam(0, v->unitnumber);
 				AddNewsItem(
 					STR_TRAIN_IS_UNPROFITABLE,
--- a/src/transparency.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/transparency.h	Mon Mar 10 15:26:39 2008 +0000
@@ -11,8 +11,6 @@
  * 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
@@ -22,12 +20,14 @@
 	TO_BUILDINGS,  ///< player buildings - depots, stations, HQ, ...
 	TO_BRIDGES,    ///< bridges
 	TO_STRUCTURES, ///< unmovable structures
+	TO_CATENARY,   ///< catenary
 	TO_LOADING,    ///< loading indicators
 	TO_END,
 };
 
-typedef byte TransparencyOptionBits; ///< transparency option bits
+typedef uint TransparencyOptionBits; ///< transparency option bits
 extern TransparencyOptionBits _transparency_opt;
+extern TransparencyOptionBits _transparency_lock;
 
 /**
  * Check if the transparency option bit is set
@@ -43,26 +43,33 @@
 /**
  * Toggle the transparency option bit
  *
- * @param to the structure which transparency option is toggle
+ * @param to the transparency option to be toggled
  */
 static inline void ToggleTransparency(TransparencyOption to)
 {
 	ToggleBit(_transparency_opt, to);
 }
 
-/** Toggle all transparency options (except signs) or restore the stored transparencies */
+/**
+ * Toggle the transparency lock bit
+ *
+ * @param to the transparency option to be locked or unlocked
+ */
+static inline void ToggleTransparencyLock(TransparencyOption to)
+{
+	ToggleBit(_transparency_lock, to);
+}
+
+/** Set or clear all non-locked transparency options */
 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;
+	/* if none of the non-locked options are set */
+	if ((_transparency_opt & ~_transparency_lock) == 0) {
+		/* set all non-locked options */
+		_transparency_opt |= GB(~_transparency_lock, 0, TO_END);
 	} else {
-		/* any structure is transparent, so store current transparency settings and reset it */
-		trans_opt = _transparency_opt;
-		_transparency_opt = 0;
+		/* clear all non-locked options */
+		_transparency_opt &= _transparency_lock;
 	}
 
 	MarkWholeScreenDirty();
--- a/src/transparency_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/transparency_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -12,19 +12,18 @@
 #include "table/strings.h"
 
 TransparencyOptionBits _transparency_opt;
+TransparencyOptionBits _transparency_lock;
 
 enum TransparencyToolbarWidgets{
-	/* Widgets not toggled when pressing the X key */
 	TTW_WIDGET_SIGNS = 3,    ///< Make signs background transparent
-
-	/* Widgets toggled when pressing the X key */
 	TTW_WIDGET_TREES,        ///< Make trees transparent
 	TTW_WIDGET_HOUSES,       ///< Make houses transparent
 	TTW_WIDGET_INDUSTRIES,   ///< Make Industries transparent
 	TTW_WIDGET_BUILDINGS,    ///< Make player buildings and structures transparent
 	TTW_WIDGET_BRIDGES,      ///< Make bridges transparent
 	TTW_WIDGET_STRUCTURES,   ///< Make unmovable structures transparent
-	TTW_WIDGET_LOADING,      ///< Make loading indicators transperent
+	TTW_WIDGET_CATENARY,     ///< Make catenary transparent
+	TTW_WIDGET_LOADING,      ///< Make loading indicators transparent
 	TTW_WIDGET_END,          ///< End of toggle buttons
 };
 
@@ -39,14 +38,23 @@
 			}
 
 			DrawWindowWidgets(w);
+			for (uint i = TO_SIGNS; i < TO_END; i++) {
+				if (HasBit(_transparency_lock, i)) DrawSprite(SPR_LOCK, PAL_NONE, w->widget[TTW_WIDGET_SIGNS + i].left + 1, w->widget[TTW_WIDGET_SIGNS + i].top + 1);
+			}
 			break;
 
 		case WE_CLICK:
-			if (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();
+			if (e->we.click.widget >= TTW_WIDGET_SIGNS && e->we.click.widget < TTW_WIDGET_END) {
+				if (_ctrl_pressed) {
+					/* toggle the bit of the transparencies lock variable */
+					ToggleTransparencyLock((TransparencyOption)(e->we.click.widget - TTW_WIDGET_SIGNS));
+					SetWindowDirty(w);
+				} else {
+					/* toggle the bit of the transparencies variable and play a sound */
+					ToggleTransparency((TransparencyOption)(e->we.click.widget - TTW_WIDGET_SIGNS));
+					SndPlayFx(SND_15_BEEP);
+					MarkWholeScreenDirty();
+				}
 			}
 			break;
 	}
@@ -54,11 +62,11 @@
 
 static const Widget _transparency_widgets[] = {
 { WWT_CLOSEBOX,   RESIZE_NONE,  7,   0,  10,   0,  13, STR_00C5,                 STR_018B_CLOSE_WINDOW},
-{  WWT_CAPTION,   RESIZE_NONE,  7,  11, 184,   0,  13, STR_TRANSPARENCY_TOOLB,   STR_018C_WINDOW_TITLE_DRAG_THIS},
-{WWT_STICKYBOX,   RESIZE_NONE,  7, 185, 196,   0,  13, STR_NULL,                 STR_STICKY_BUTTON},
+{  WWT_CAPTION,   RESIZE_NONE,  7,  11, 206,   0,  13, STR_TRANSPARENCY_TOOLB,   STR_018C_WINDOW_TITLE_DRAG_THIS},
+{WWT_STICKYBOX,   RESIZE_NONE,  7, 207, 218,   0,  13, STR_NULL,                 STR_STICKY_BUTTON},
 
 /* transparency widgets:
- * transparent signs, trees, houses, industries, player's buildings, bridges, unmovable structures and loading indicators */
+ * transparent signs, trees, houses, industries, player's buildings, bridges, unmovable structures, catenary and loading indicators */
 {   WWT_IMGBTN,   RESIZE_NONE,  7,   0,  21,  14,  35, SPR_IMG_SIGN,         STR_TRANSPARENT_SIGNS_DESC},
 {   WWT_IMGBTN,   RESIZE_NONE,  7,  22,  43,  14,  35, SPR_IMG_PLANTTREES,   STR_TRANSPARENT_TREES_DESC},
 {   WWT_IMGBTN,   RESIZE_NONE,  7,  44,  65,  14,  35, SPR_IMG_TOWN,         STR_TRANSPARENT_HOUSES_DESC},
@@ -66,13 +74,14 @@
 {   WWT_IMGBTN,   RESIZE_NONE,  7,  88, 109,  14,  35, SPR_IMG_COMPANY_LIST, STR_TRANSPARENT_BUILDINGS_DESC},
 {   WWT_IMGBTN,   RESIZE_NONE,  7, 110, 152,  14,  35, SPR_IMG_BRIDGE,       STR_TRANSPARENT_BRIDGES_DESC},
 {   WWT_IMGBTN,   RESIZE_NONE,  7, 153, 174,  14,  35, SPR_IMG_TRANSMITTER,  STR_TRANSPARENT_STRUCTURES_DESC},
-{   WWT_IMGBTN,   RESIZE_NONE,  7, 175, 196,  14,  35, SPR_IMG_TRAINLIST,    STR_TRANSPARENT_LOADING_DESC},
+{   WWT_IMGBTN,   RESIZE_NONE,  7, 175, 196,  14,  35, SPR_BUILD_X_ELRAIL,   STR_TRANSPARENT_CATENARY_DESC},
+{   WWT_IMGBTN,   RESIZE_NONE,  7, 197, 218,  14,  35, SPR_IMG_TRAINLIST,    STR_TRANSPARENT_LOADING_DESC},
 
 {   WIDGETS_END},
 };
 
 static const WindowDesc _transparency_desc = {
-	WDP_ALIGN_TBR, 58+36, 197, 36, 197, 36,
+	WDP_ALIGN_TBR, 58+36, 219, 36, 219, 36,
 	WC_TRANSPARENCY_TOOLBAR, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_transparency_widgets,
--- a/src/tree_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/tree_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -435,10 +435,6 @@
 
 static void DrawTile_Trees(TileInfo *ti)
 {
-	const PalSpriteID *s;
-	const TreePos* d;
-	byte z;
-
 	switch (GetTreeGround(ti->tile)) {
 		case TREE_GROUND_SHORE: DrawShoreTile(ti->tileh); break;
 		case TREE_GROUND_GRASS: DrawClearLandTile(ti, GetTreeDensity(ti->tile)); break;
@@ -448,77 +444,70 @@
 
 	DrawClearLandFence(ti);
 
-	z = ti->z;
-	if (ti->tileh != SLOPE_FLAT) {
-		z += 4;
-		if (IsSteepSlope(ti->tileh)) z += 4;
+	/* Do not draw trees when the invisible trees patch and transparency tree are set */
+	if (IsTransparencySet(TO_TREES) && _patches.invisible_trees) return;
+
+	uint16 tmp = ti->x;
+
+	tmp = ROR(tmp, 2);
+	tmp -= ti->y;
+	tmp = ROR(tmp, 3);
+	tmp -= ti->x;
+	tmp = ROR(tmp, 1);
+	tmp += ti->y;
+
+	uint index = GB(tmp, 6, 2) + (GetTreeType(ti->tile) << 2);
+
+	/* different tree styles above one of the grounds */
+	if (GetTreeGround(ti->tile) == TREE_GROUND_SNOW_DESERT &&
+			GetTreeDensity(ti->tile) >= 2 &&
+			IsInsideMM(index, TREE_SUB_ARCTIC << 2, TREE_RAINFOREST << 2)) {
+		index += 164 - (TREE_SUB_ARCTIC << 2);
 	}
 
-	{
-		uint16 tmp = ti->x;
-		uint index;
-
-		tmp = ROR(tmp, 2);
-		tmp -= ti->y;
-		tmp = ROR(tmp, 3);
-		tmp -= ti->x;
-		tmp = ROR(tmp, 1);
-		tmp += ti->y;
-
-		d = _tree_layout_xy[GB(tmp, 4, 2)];
+	assert(index < lengthof(_tree_layout_sprite));
 
-		index = GB(tmp, 6, 2) + (GetTreeType(ti->tile) << 2);
+	const PalSpriteID *s = _tree_layout_sprite[index];
+	const TreePos *d = _tree_layout_xy[GB(tmp, 4, 2)];
 
-		/* different tree styles above one of the grounds */
-		if (GetTreeGround(ti->tile) == TREE_GROUND_SNOW_DESERT &&
-				GetTreeDensity(ti->tile) >= 2 &&
-				IsInsideMM(index, TREE_SUB_ARCTIC << 2, TREE_RAINFOREST << 2)) {
-			index += 164 - (TREE_SUB_ARCTIC << 2);
-		}
-
-		assert(index < lengthof(_tree_layout_sprite));
-		s = _tree_layout_sprite[index];
-	}
-
+	/* combine trees into one sprite object */
 	StartSpriteCombine();
 
-	/* Do not draw trees when the invisible trees patch and transparency tree are set */
-	if (!(IsTransparencySet(TO_TREES) && _patches.invisible_trees)) {
-		TreeListEnt te[4];
-		uint i;
-
-		/* put the trees to draw in a list */
-		i = GetTreeCount(ti->tile) + 1;
-		do {
-			SpriteID image = s[0].sprite + (--i == 0 ? GetTreeGrowth(ti->tile) : 3);
-			SpriteID pal = s[0].pal;
+	TreeListEnt te[4];
 
-			te[i].image = image;
-			te[i].pal   = pal;
-			te[i].x = d->x;
-			te[i].y = d->y;
-			s++;
-			d++;
-		} while (i);
-
-		/* draw them in a sorted way */
-		for (;;) {
-			byte min = 0xFF;
-			TreeListEnt *tep = NULL;
+	/* put the trees to draw in a list */
+	uint trees = GetTreeCount(ti->tile) + 1;
 
-			i = GetTreeCount(ti->tile) + 1;
-			do {
-				if (te[--i].image != 0 && te[i].x + te[i].y < min) {
-					min = te[i].x + te[i].y;
-					tep = &te[i];
-				}
-			} while (i);
+	for (uint i = 0; i < trees; i++) {
+		SpriteID image = s[0].sprite + (i == trees - 1 ? GetTreeGrowth(ti->tile) : 3);
+		SpriteID pal = s[0].pal;
 
-			if (tep == NULL) break;
+		te[i].image = image;
+		te[i].pal   = pal;
+		te[i].x = d->x;
+		te[i].y = d->y;
+		s++;
+		d++;
+	}
 
-			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;
+	/* draw them in a sorted way */
+	byte z = ti->z + GetSlopeMaxZ(ti->tileh) / 2;
+
+	for (; trees > 0; trees--) {
+		uint min = te[0].x + te[0].y;
+		uint mi = 0;
+
+		for (uint i = 1; i < trees; i++) {
+			if ((uint)(te[i].x + te[i].y) < min) {
+				min = te[i].x + te[i].y;
+				mi = i;
+			}
 		}
+
+		AddSortableSpriteToDraw(te[mi].image, te[mi].pal, ti->x + te[mi].x, ti->y + te[mi].y, 16 - te[mi].x, 16 - te[mi].y, 0x30, z, IsTransparencySet(TO_TREES), -te[mi].x, -te[mi].y);
+
+		/* replace the removed one with the last one */
+		te[mi] = te[trees - 1];
 	}
 
 	EndSpriteCombine();
@@ -758,7 +747,7 @@
 	/* not used */
 }
 
-static uint32 GetTileTrackStatus_Trees(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Trees(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
 	return 0;
 }
--- a/src/tunnelbridge_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/tunnelbridge_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -33,82 +33,30 @@
 #include "sound_func.h"
 #include "signal_func.h"
 #include "tunnelbridge.h"
+#include "player_base.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
 #include "table/bridge_land.h"
 
-
-/** Describes the data that defines each bridge in the game
- * @param y   year of availablity
- * @param mnl minimum length
- * @param mxl maximum length
- * @param p   price
- * @param mxs maximum speed allowed
- * @param spr sprite to use in purchase GUI
- * @param plt palette for the sprite in purchase GUI
- * @param dsc description of the bridge in purchase GUI
- * @param nrl description of the rail bridge in query tool
- * @param nrd description of the road bridge in query tool
- */
-#define MB(y, mnl, mxl, p, mxs, spr, plt, dsc, nrl, nrd) \
-	{y, mnl, mxl, p, mxs, spr, plt, dsc, nrl, nrd, NULL, 0}
-
-const Bridge orig_bridge[] = {
-/*
-	       year of availablity
-	       |  minimum length
-	       |  |   maximum length
-	       |  |   |    price
-	       |  |   |    |    maximum speed
-	       |  |   |    |    |  sprite to use in GUI
-	       |  |   |    |    |  |      palette in GUI
-	   string with description        name on rail                             name on road
-	   |                              |                                        | */
-	MB(    0, 0, 16,  80,  32, 0xA24, PAL_NONE,
-	   STR_5012_WOODEN,               STR_501F_WOODEN_RAIL_BRIDGE,             STR_5025_WOODEN_ROAD_BRIDGE),
-
-	MB(    0, 0,  2, 112,  48, 0xA26, PALETTE_TO_STRUCT_RED,
-	   STR_5013_CONCRETE,             STR_5020_CONCRETE_RAIL_BRIDGE,           STR_5026_CONCRETE_ROAD_BRIDGE),
+BridgeSpec _bridge[MAX_BRIDGES];
 
-	MB( 1930, 0,  5, 144,  64, 0xA25, PAL_NONE,
-	   STR_500F_GIRDER_STEEL,         STR_501C_STEEL_GIRDER_RAIL_BRIDGE,       STR_5022_STEEL_GIRDER_ROAD_BRIDGE),
-
-	MB(    0, 2, 10, 168,  80, 0xA22, PALETTE_TO_STRUCT_CONCRETE,
-	   STR_5011_SUSPENSION_CONCRETE,  STR_501E_REINFORCED_CONCRETE_SUSPENSION, STR_5024_REINFORCED_CONCRETE_SUSPENSION),
-
-	MB( 1930, 3, 16, 185,  96, 0xA22, PAL_NONE,
-	   STR_500E_SUSPENSION_STEEL,     STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE,   STR_5021_STEEL_SUSPENSION_ROAD_BRIDGE),
-
-	MB( 1930, 3, 16, 192, 112, 0xA22, PALETTE_TO_STRUCT_YELLOW,
-	   STR_500E_SUSPENSION_STEEL,     STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE,   STR_5021_STEEL_SUSPENSION_ROAD_BRIDGE),
-
-	MB( 1930, 3,  7, 224, 160, 0xA23, PAL_NONE,
-	   STR_5010_CANTILEVER_STEEL,     STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE,   STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE),
-
-	MB( 1930, 3,  8, 232, 208, 0xA23, PALETTE_TO_STRUCT_BROWN,
-	   STR_5010_CANTILEVER_STEEL,     STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE,   STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE),
+/** Reset the data been eventually changed by the grf loaded. */
+void ResetBridges()
+{
+	/* First, free sprite table data */
+	for (BridgeType i = 0; i < MAX_BRIDGES; i++) {
+		if (_bridge[i].sprite_table != NULL) {
+			for (uint j = 0; j < 7; j++) free(_bridge[i].sprite_table[j]);
+			free(_bridge[i].sprite_table);
+		}
+	}
 
-	MB( 1930, 3,  9, 248, 240, 0xA23, PALETTE_TO_STRUCT_RED,
-	   STR_5010_CANTILEVER_STEEL,     STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE,   STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE),
-
-	MB( 1930, 0,  2, 240, 256, 0xA27, PAL_NONE,
-	   STR_500F_GIRDER_STEEL,         STR_501C_STEEL_GIRDER_RAIL_BRIDGE,       STR_5022_STEEL_GIRDER_ROAD_BRIDGE),
-
-	MB( 1995, 2, 16, 255, 320, 0xA28, PAL_NONE,
-	   STR_5014_TUBULAR_STEEL,        STR_5027_TUBULAR_RAIL_BRIDGE,            STR_5028_TUBULAR_ROAD_BRIDGE),
-
-	MB( 2005, 2, 32, 380, 512, 0xA28, PALETTE_TO_STRUCT_YELLOW,
-	   STR_5014_TUBULAR_STEEL,        STR_5027_TUBULAR_RAIL_BRIDGE,            STR_5028_TUBULAR_ROAD_BRIDGE),
-
-	MB( 2010, 2, 32, 510, 608, 0xA28, PALETTE_TO_STRUCT_GREY,
-	   STR_BRIDGE_TUBULAR_SILICON,    STR_5027_TUBULAR_RAIL_BRIDGE,            STR_5028_TUBULAR_ROAD_BRIDGE)
-};
-
-#undef MB
-
-Bridge _bridge[MAX_BRIDGES];
-
+	/* Then, wipe out current bidges */
+	memset(&_bridge, 0, sizeof(_bridge));
+	/* And finally, reinstall default data */
+	memcpy(&_bridge, &_orig_bridge, sizeof(_orig_bridge));
+}
 
 /** calculate the price factor for building a long bridge.
  * basically the cost delta is 1,1, 1, 2,2, 3,3,3, 4,4,4,4, 5,5,5,5,5, 6,6,6,6,6,6,  7,7,7,7,7,7,7,  8,8,8,8,8,8,8,8,
@@ -152,7 +100,7 @@
 
 static inline const PalSpriteID *GetBridgeSpriteTable(int index, byte table)
 {
-	const Bridge *bridge = &_bridge[index];
+	const BridgeSpec *bridge = GetBridgeSpec(index);
 	assert(table < 7);
 	if (bridge->sprite_table == NULL || bridge->sprite_table[table] == NULL) {
 		return _bridge_sprite_table[index][table];
@@ -161,8 +109,6 @@
 	}
 }
 
-static inline byte GetBridgeFlags(int index) { return _bridge[index].flags;}
-
 
 /**
  * Determines the foundation for the north bridge head, and tests if the resulting slope is valid.
@@ -206,9 +152,9 @@
 	return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
 }
 
-bool CheckBridge_Stuff(byte bridge_type, uint bridge_len)
+bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len)
 {
-	const Bridge *b = &_bridge[bridge_type];
+	const BridgeSpec *b = GetBridgeSpec(bridge_type);
 	uint max; // max possible length of a bridge (with patch 100)
 
 	if (bridge_type >= MAX_BRIDGES) return false;
@@ -231,9 +177,9 @@
  */
 CommandCost CmdBuildBridge(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	uint bridge_type;
-	RailType railtype;
-	RoadTypes roadtypes;
+	BridgeType bridge_type;
+	RailType railtype = INVALID_RAILTYPE;
+	RoadTypes roadtypes = ROADTYPES_NONE;
 	uint x;
 	uint y;
 	uint sx;
@@ -251,22 +197,32 @@
 	CommandCost cost(EXPENSES_CONSTRUCTION);
 	CommandCost ret;
 	bool replace_bridge = false;
-	uint replaced_bridge_type;
+	BridgeType replaced_bridge_type;
+	TransportType transport_type;
 
 	/* unpack parameters */
 	bridge_type = GB(p2, 0, 8);
 
 	if (p1 >= MapSize()) return CMD_ERROR;
 
+	transport_type = (TransportType)GB(p2, 15, 2);
+
 	/* type of bridge */
-	if (HasBit(p2, 15)) {
-		railtype = INVALID_RAILTYPE; // road bridge
-		roadtypes = (RoadTypes)GB(p2, 8, 3);
-		if (!AreValidRoadTypes(roadtypes) || !HasRoadTypesAvail(_current_player, roadtypes)) return CMD_ERROR;
-	} else {
-		if (!ValParamRailtype((RailType)GB(p2, 8, 8))) return CMD_ERROR;
-		railtype = (RailType)GB(p2, 8, 8);
-		roadtypes = ROADTYPES_NONE;
+	switch (transport_type) {
+		case TRANSPORT_ROAD:
+			roadtypes = (RoadTypes)GB(p2, 8, 3);
+			if (!AreValidRoadTypes(roadtypes) || !HasRoadTypesAvail(_current_player, roadtypes)) return CMD_ERROR;
+			break;
+
+		case TRANSPORT_RAIL:
+			railtype = (RailType)GB(p2, 8, 8);
+			if (!ValParamRailtype(railtype)) return CMD_ERROR;
+			break;
+
+		default:
+			/* For now, only TRANSPORT_RAIL and TRANSPORT_ROAD are allowed.
+			 * But let not this stops us for preparing the future */
+			return CMD_ERROR;
 	}
 
 	x = TileX(end_tile);
@@ -301,12 +257,10 @@
 	tileh_end = GetTileSlope(tile_end, &z_end);
 
 	CommandCost terraform_cost_north = CheckBridgeSlopeNorth(direction, &tileh_start, &z_start);
-	CommandCost terraform_cost_south = CheckBridgeSlopeSouth(direction, &tileh_end, &z_end);
+	CommandCost terraform_cost_south = CheckBridgeSlopeSouth(direction, &tileh_end,   &z_end);
 
 	if (z_start != z_end) return_cmd_error(STR_BRIDGEHEADS_NOT_SAME_HEIGHT);
 
-	TransportType transport_type = railtype == INVALID_RAILTYPE ? TRANSPORT_ROAD : TRANSPORT_RAIL;
-
 	if (IsBridgeTile(tile_start) && IsBridgeTile(tile_end) &&
 			GetOtherBridgeEnd(tile_start) == tile_end &&
 			GetTunnelBridgeTransportType(tile_start) == transport_type) {
@@ -319,7 +273,7 @@
 
 		/* Do not replace town bridges with lower speed bridges. */
 		if (!(flags & DC_QUERY_COST) && IsTileOwner(tile_start, OWNER_TOWN) &&
-				_bridge[bridge_type].speed < _bridge[GetBridgeType(tile_start)].speed) {
+				GetBridgeSpec(bridge_type)->speed < GetBridgeSpec(GetBridgeType(tile_start))->speed) {
 			Town *t = ClosestTownFromTile(tile_start, UINT_MAX);
 
 			if (t == NULL) {
@@ -395,12 +349,20 @@
 		DiagDirection dir = AxisToDiagDir(direction);
 		Owner owner = (replace_bridge && IsTileOwner(tile_start, OWNER_TOWN)) ? OWNER_TOWN : _current_player;
 
-		if (railtype != INVALID_RAILTYPE) {
-			MakeRailBridgeRamp(tile_start, owner, bridge_type, dir, railtype);
-			MakeRailBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), railtype);
-		} else {
-			MakeRoadBridgeRamp(tile_start, owner, bridge_type, dir, roadtypes);
-			MakeRoadBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), roadtypes);
+		switch (transport_type) {
+			case TRANSPORT_RAIL:
+				MakeRailBridgeRamp(tile_start, owner, bridge_type, dir,                 railtype);
+				MakeRailBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), railtype);
+				break;
+
+			case TRANSPORT_ROAD:
+				MakeRoadBridgeRamp(tile_start, owner, bridge_type, dir,                 roadtypes);
+				MakeRoadBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), roadtypes);
+				break;
+
+			default:
+				NOT_REACHED();
+				break;
 		}
 		MarkTileDirtyByTile(tile_start);
 		MarkTileDirtyByTile(tile_end);
@@ -426,7 +388,7 @@
 				break;
 
 			case MP_ROAD:
-				if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) goto not_valid_below;
+				if (IsRoadDepot(tile)) goto not_valid_below;
 				break;
 
 			case MP_TUNNELBRIDGE:
@@ -458,7 +420,7 @@
 		}
 	}
 
-	if (flags & DC_EXEC && railtype != INVALID_RAILTYPE) {
+	if (flags & DC_EXEC && transport_type == TRANSPORT_RAIL) {
 		Track track = AxisToTrack(direction);
 		AddSideToSignalBuffer(tile_start, INVALID_DIAGDIR, _current_player);
 		YapfNotifyTrackLayoutChange(tile_start, track);
@@ -468,15 +430,13 @@
 	 * It's unnecessary to execute this command every time for every bridge. So it is done only
 	 * and cost is computed in "bridge_gui.c". For AI, Towns this has to be of course calculated
 	 */
-	if (!(flags & DC_QUERY_COST)) {
-		const Bridge *b = &_bridge[bridge_type];
-
+	if (!(flags & DC_QUERY_COST) || (IsValidPlayer(_current_player) && GetPlayer(_current_player)->is_ai)) {
 		bridge_len += 2; // begin and end tiles/ramps
 
 		if (IsValidPlayer(_current_player) && !_is_old_ai_player)
 			bridge_len = CalcBridgeLenCostFactor(bridge_len);
 
-		cost.AddCost((int64)bridge_len * _price.build_bridge * b->price >> 8);
+		cost.AddCost((int64)bridge_len * _price.build_bridge * GetBridgeSpec(bridge_type)->price >> 8);
 	}
 
 	return cost;
@@ -496,13 +456,14 @@
 	DiagDirection direction;
 	Slope start_tileh;
 	Slope end_tileh;
+	TransportType transport_type = (TransportType)GB(p1, 9, 1);
 	uint start_z;
 	uint end_z;
 	CommandCost cost(EXPENSES_CONSTRUCTION);
 	CommandCost ret;
 
 	_build_tunnel_endtile = 0;
-	if (!HasBit(p1, 9)) {
+	if (transport_type == TRANSPORT_RAIL) {
 		if (!ValParamRailtype((RailType)p1)) return CMD_ERROR;
 	} else {
 		const RoadTypes rts = (RoadTypes)GB(p1, 0, 3);
@@ -585,7 +546,7 @@
 	cost.AddCost(ret);
 
 	if (flags & DC_EXEC) {
-		if (GB(p1, 9, 1) == TRANSPORT_RAIL) {
+		if (transport_type == TRANSPORT_RAIL) {
 			MakeRailTunnel(start_tile, _current_player, direction,                 (RailType)GB(p1, 0, 4));
 			MakeRailTunnel(end_tile,   _current_player, ReverseDiagDir(direction), (RailType)GB(p1, 0, 4));
 			AddSideToSignalBuffer(start_tile, INVALID_DIAGDIR, _current_player);
@@ -651,11 +612,11 @@
 			DoClearSquare(endtile);
 
 			/* cannot use INVALID_DIAGDIR for signal update because the tunnel doesn't exist anymore */
-			AddSideToSignalBuffer(tile, ReverseDiagDir(dir), owner);
-			AddSideToSignalBuffer(endtile, dir, owner);
+			AddSideToSignalBuffer(tile,    ReverseDiagDir(dir), owner);
+			AddSideToSignalBuffer(endtile, dir,                 owner);
 
 			Track track = AxisToTrack(DiagDirToAxis(dir));
-			YapfNotifyTrackLayoutChange(tile, track);
+			YapfNotifyTrackLayoutChange(tile,    track);
 			YapfNotifyTrackLayoutChange(endtile, track);
 		} else {
 			DoClearSquare(tile);
@@ -703,21 +664,27 @@
 		/* read this value before actual removal of bridge */
 		bool rail = GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL;
 		Owner owner = GetTileOwner(tile);
+		uint height = GetBridgeHeight(tile);
 
 		DoClearSquare(tile);
 		DoClearSquare(endtile);
 		for (TileIndex c = tile + delta; c != endtile; c += delta) {
+			/* do not let trees appear from 'nowhere' after removing bridge */
+			if (IsNormalRoadTile(c) && GetRoadside(c) == ROADSIDE_TREES) {
+				uint minz = GetTileMaxZ(c) + 3 * TILE_HEIGHT;
+				if (height < minz) SetRoadside(c, ROADSIDE_PAVED);
+			}
 			ClearBridgeMiddle(c);
 			MarkTileDirtyByTile(c);
 		}
 
 		if (rail) {
 			/* cannot use INVALID_DIAGDIR for signal update because the bridge doesn't exist anymore */
-			AddSideToSignalBuffer(tile, ReverseDiagDir(direction), owner);
-			AddSideToSignalBuffer(endtile, direction, owner);
+			AddSideToSignalBuffer(tile,    ReverseDiagDir(direction), owner);
+			AddSideToSignalBuffer(endtile, direction,                 owner);
 
 			Track track = AxisToTrack(DiagDirToAxis(direction));
-			YapfNotifyTrackLayoutChange(tile, track);
+			YapfNotifyTrackLayoutChange(tile,    track);
 			YapfNotifyTrackLayoutChange(endtile, track);
 		}
 	}
@@ -749,11 +716,11 @@
  * @param y Sprite Y position of front pillar.
  * @param z_bridge Absolute height of bridge bottom.
  */
-static void DrawBridgePillars(const PalSpriteID *psid, const TileInfo* ti, Axis axis, uint type, int x, int y, int z_bridge)
+static void DrawBridgePillars(const PalSpriteID *psid, const TileInfo* ti, Axis axis, BridgeType type, int x, int y, int z_bridge)
 {
 	SpriteID image = psid->sprite;
 	if (image != 0) {
-		bool drawfarpillar = !HasBit(GetBridgeFlags(type), 0);
+		bool drawfarpillar = !HasBit(GetBridgeSpec(type)->flags, 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.
@@ -819,14 +786,14 @@
 	 * 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, IsTransparencySet(TO_BRIDGES));
 
-	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset],  PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, z, IsTransparencySet(TO_BUILDINGS));
+	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset],  PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, z, IsTransparencySet(TO_CATENARY));
 
 	/* 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, IsTransparencySet(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_CATENARY), front_bb_offset_x[offset], front_bb_offset_y[offset]);
 }
 
 /**
@@ -845,6 +812,8 @@
 static void DrawTile_TunnelBridge(TileInfo *ti)
 {
 	SpriteID image;
+	TransportType transport_type = GetTunnelBridgeTransportType(ti->tile);
+	DiagDirection tunnelbridge_direction = GetTunnelBridgeDirection(ti->tile);
 
 	if (IsTunnel(ti->tile)) {
 		/* Front view of tunnel bounding boxes:
@@ -864,11 +833,11 @@
 			{  1,  0, -15, -14,  0, 15, 16,  1, 0, 1, 16, 15 }, // SW
 			{  0,  1, -14, -15, 15,  0,  1, 16, 1, 0, 15, 16 }, // NW
 		};
-		const int *BB_data = _tunnel_BB[GetTunnelBridgeDirection(ti->tile)];
+		const int *BB_data = _tunnel_BB[tunnelbridge_direction];
 
 		bool catenary = false;
 
-		if (GetTunnelBridgeTransportType(ti->tile) == TRANSPORT_RAIL) {
+		if (transport_type == TRANSPORT_RAIL) {
 			image = GetRailTypeInfo(GetRailType(ti->tile))->base_sprites.tunnel;
 		} else {
 			image = SPR_TUNNEL_ENTRY_REAR_ROAD;
@@ -876,20 +845,19 @@
 
 		if (HasTunnelBridgeSnowOrDesert(ti->tile)) image += 32;
 
-		image += GetTunnelBridgeDirection(ti->tile) * 2;
+		image += tunnelbridge_direction * 2;
 		DrawGroundSprite(image, PAL_NONE);
-		if (GetTunnelBridgeTransportType(ti->tile) == TRANSPORT_ROAD) {
-			DiagDirection dir = GetTunnelBridgeDirection(ti->tile);
+		if (transport_type == TRANSPORT_ROAD) {
 			RoadTypes rts = GetRoadTypes(ti->tile);
 
 			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);
+				DrawGroundSprite(SPR_TRAMWAY_BASE + tunnel_sprites[rts - ROADTYPES_TRAM][tunnelbridge_direction], 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, IsTransparencySet(TO_BUILDINGS), BB_data[8], BB_data[9], BB_Z_SEPARATOR);
+				AddSortableSpriteToDraw(SPR_TRAMWAY_TUNNEL_WIRES + tunnelbridge_direction, PAL_NONE, ti->x, ti->y, BB_data[10], BB_data[11], TILE_HEIGHT, ti->z, IsTransparencySet(TO_CATENARY), BB_data[8], BB_data[9], BB_Z_SEPARATOR);
 			}
 		} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
 			DrawCatenary(ti);
@@ -913,7 +881,7 @@
 		int base_offset;
 		bool ice = HasTunnelBridgeSnowOrDesert(ti->tile);
 
-		if (GetTunnelBridgeTransportType(ti->tile) == TRANSPORT_RAIL) {
+		if (transport_type == TRANSPORT_RAIL) {
 			base_offset = GetRailTypeInfo(GetRailType(ti->tile))->bridge_offset;
 			assert(base_offset != 8); // This one is used for roads
 		} else {
@@ -923,10 +891,10 @@
 		/* as the lower 3 bits are used for other stuff, make sure they are clear */
 		assert( (base_offset & 0x07) == 0x00);
 
-		DrawFoundation(ti, GetBridgeFoundation(ti->tileh, DiagDirToAxis(GetTunnelBridgeDirection(ti->tile))));
+		DrawFoundation(ti, GetBridgeFoundation(ti->tileh, DiagDirToAxis(tunnelbridge_direction)));
 
 		/* HACK Wizardry to convert the bridge ramp direction into a sprite offset */
-		base_offset += (6 - GetTunnelBridgeDirection(ti->tile)) % 4;
+		base_offset += (6 - tunnelbridge_direction) % 4;
 
 		if (ti->tileh == SLOPE_FLAT) base_offset += 4; // sloped bridge head
 
@@ -942,7 +910,7 @@
 		/* draw ramp */
 
 		/* Draw Trambits as SpriteCombine */
-		if (GetTunnelBridgeTransportType(ti->tile) == TRANSPORT_ROAD) StartSpriteCombine();
+		if (transport_type == TRANSPORT_ROAD) StartSpriteCombine();
 
 		/* HACK set the height of the BB of a sloped ramp to 1 so a vehicle on
 		 * it doesn't disappear behind it
@@ -951,11 +919,11 @@
 			psid->sprite, psid->pal, ti->x, ti->y, 16, 16, ti->tileh == SLOPE_FLAT ? 0 : 8, ti->z, IsTransparencySet(TO_BRIDGES)
 		);
 
-		if (GetTunnelBridgeTransportType(ti->tile) == TRANSPORT_ROAD) {
+		if (transport_type == TRANSPORT_ROAD) {
 			RoadTypes rts = GetRoadTypes(ti->tile);
 
 			if (HasBit(rts, ROADTYPE_TRAM)) {
-				uint offset = GetTunnelBridgeDirection(ti->tile);
+				uint offset = tunnelbridge_direction;
 				uint z = ti->z;
 				if (ti->tileh != SLOPE_FLAT) {
 					offset = (offset + 1) & 1;
@@ -1033,9 +1001,10 @@
 	uint base_offset;
 	TileIndex rampnorth;
 	TileIndex rampsouth;
+	TransportType transport_type;
 	Axis axis;
 	uint piece;
-	uint type;
+	BridgeType type;
 	int x;
 	int y;
 	uint z;
@@ -1044,6 +1013,7 @@
 
 	rampnorth = GetNorthernBridgeEnd(ti->tile);
 	rampsouth = GetSouthernBridgeEnd(ti->tile);
+	transport_type = GetTunnelBridgeTransportType(rampsouth);
 
 	axis = GetBridgeAxis(ti->tile);
 	piece = CalcBridgePiece(
@@ -1052,7 +1022,7 @@
 	);
 	type = GetBridgeType(rampsouth);
 
-	if (GetTunnelBridgeTransportType(rampsouth) == TRANSPORT_RAIL) {
+	if (transport_type == TRANSPORT_RAIL) {
 		base_offset = GetRailTypeInfo(GetRailType(rampsouth))->bridge_offset;
 	} else {
 		base_offset = 8;
@@ -1070,7 +1040,7 @@
 	AddSortableSpriteToDraw(SPR_EMPTY_BOUNDING_BOX, PAL_NONE, x, y, 16, 16, 1, bridge_z - TILE_HEIGHT + BB_Z_SEPARATOR);
 
 	/* Draw Trambits as SpriteCombine */
-	if (GetTunnelBridgeTransportType(rampsouth) == TRANSPORT_ROAD) StartSpriteCombine();
+	if (transport_type == TRANSPORT_ROAD) StartSpriteCombine();
 
 	/* Draw floor and far part of bridge*/
 	if (axis == AXIS_X) {
@@ -1081,7 +1051,7 @@
 
 	psid++;
 
-	if (GetTunnelBridgeTransportType(rampsouth) == TRANSPORT_ROAD) {
+	if (transport_type == TRANSPORT_ROAD) {
 		RoadTypes rts = GetRoadTypes(rampsouth);
 
 		if (HasBit(rts, ROADTYPE_TRAM)) {
@@ -1105,7 +1075,7 @@
 	}
 
 	/* Draw TramFront as SpriteCombine */
-	if (GetTunnelBridgeTransportType(rampsouth) == TRANSPORT_ROAD) EndSpriteCombine();
+	if (transport_type == TRANSPORT_ROAD) EndSpriteCombine();
 
 	psid++;
 	if (ti->z + 5 == z) {
@@ -1183,8 +1153,7 @@
 		td->str = (GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL) ?
 			STR_5017_RAILROAD_TUNNEL : STR_5018_ROAD_TUNNEL;
 	} else { //so it must be a bridge
-		int brtype = GetBridgeType(tile);
-		td->str = GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL ? _bridge[brtype].name_rail : _bridge[brtype].name_road;
+		td->str = GetBridgeSpec(GetBridgeType(tile))->transport_name[GetTunnelBridgeTransportType(tile)];
 	}
 	td->owner = GetTileOwner(tile);
 }
@@ -1224,11 +1193,14 @@
 }
 
 
-static uint32 GetTileTrackStatus_TunnelBridge(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_TunnelBridge(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
-	if (GetTunnelBridgeTransportType(tile) != mode) return 0;
-	if (GetTunnelBridgeTransportType(tile) == TRANSPORT_ROAD && (GetRoadTypes(tile) & sub_mode) == 0) return 0;
-	return AxisToTrackBits(DiagDirToAxis(GetTunnelBridgeDirection(tile))) * 0x101;
+	TransportType transport_type = GetTunnelBridgeTransportType(tile);
+	if (transport_type != mode || (transport_type == TRANSPORT_ROAD && (GetRoadTypes(tile) & sub_mode) == 0)) return 0;
+
+	DiagDirection dir = GetTunnelBridgeDirection(tile);
+	if (side != INVALID_DIAGDIR && side != ReverseDiagDir(dir)) return 0;
+	return CombineTrackStatus(TrackBitsToTrackdirBits(AxisToTrackBits(DiagDirToAxis(dir))), TRACKDIR_BIT_NONE);
 }
 
 static void ChangeTileOwner_TunnelBridge(TileIndex tile, PlayerID old_player, PlayerID new_player)
@@ -1238,7 +1210,7 @@
 	if (new_player != PLAYER_SPECTATOR) {
 		SetTileOwner(tile, new_player);
 	} else {
-		if (CmdFailed(DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
+		if (CmdFailed(DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR))) {
 			/* When clearing the bridge/tunnel failed there are still vehicles on/in
 			 * the bridge/tunnel. As all *our* vehicles are already removed, they
 			 * must be of another owner. Therefor this must be a road bridge/tunnel.
@@ -1271,16 +1243,15 @@
 	int z = GetSlopeZ(x, y) - v->z_pos;
 
 	if (abs(z) > 2) return VETSB_CANNOT_ENTER;
+	const DiagDirection dir = GetTunnelBridgeDirection(tile);
 
 	if (IsTunnel(tile)) {
 		byte fc;
-		DiagDirection dir;
 		DiagDirection vdir;
 
 		if (v->type == VEH_TRAIN) {
 			fc = (x & 0xF) + (y << 4);
 
-			dir = GetTunnelBridgeDirection(tile);
 			vdir = DirToDiagDir(v->direction);
 
 			if (v->u.rail.track != TRACK_BIT_WORMHOLE && dir == vdir) {
@@ -1308,7 +1279,6 @@
 			}
 		} else if (v->type == VEH_ROAD) {
 			fc = (x & 0xF) + (y << 4);
-			dir = GetTunnelBridgeDirection(tile);
 			vdir = DirToDiagDir(v->direction);
 
 			/* Enter tunnel? */
@@ -1338,17 +1308,15 @@
 			}
 		}
 	} else { // IsBridge(tile)
-		DiagDirection dir;
 
 		if (v->IsPrimaryVehicle()) {
 			/* modify speed of vehicle */
-			uint16 spd = _bridge[GetBridgeType(tile)].speed;
+			uint16 spd = GetBridgeSpec(GetBridgeType(tile))->speed;
 
 			if (v->type == VEH_ROAD) spd *= 2;
 			if (v->cur_speed > spd) v->cur_speed = spd;
 		}
 
-		dir = GetTunnelBridgeDirection(tile);
 		if (DirToDiagDir(v->direction) == dir) {
 			switch (dir) {
 				default: NOT_REACHED();
--- a/src/tunnelbridge_map.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/tunnelbridge_map.h	Mon Mar 10 15:26:39 2008 +0000
@@ -13,7 +13,9 @@
 
 
 /**
- * Tunnel: Get the direction facing out of the tunnel
+ * Get the direction pointing to the other end.
+ *
+ * Tunnel: Get the direction facing into the tunnel
  * Bridge: Get the direction pointing onto the bridge
  * @param t The tile to analyze
  * @pre IsTileType(t, MP_TUNNELBRIDGE)
--- a/src/unmovable_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/unmovable_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -167,16 +167,14 @@
 	switch (GetUnmovableType(ti->tile)) {
 		case UNMOVABLE_TRANSMITTER:
 		case UNMOVABLE_LIGHTHOUSE: {
-			const DrawTileUnmovableStruct* dtus;
+			const DrawTileSeqStruct* dtu = &_draw_tile_transmitterlighthouse_data[GetUnmovableType(ti->tile)];
 
 			if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED);
 			DrawClearLandTile(ti, 2);
 
-			dtus = &_draw_tile_unmovable_data[GetUnmovableType(ti->tile)];
-
 			AddSortableSpriteToDraw(
-				dtus->image, PAL_NONE, ti->x | dtus->subcoord_x, ti->y | dtus->subcoord_y,
-				dtus->width, dtus->height, dtus->z_size, ti->z,
+				dtu->image.sprite, PAL_NONE, ti->x | dtu->delta_x, ti->y | dtu->delta_y,
+				dtu->size_x, dtu->size_y, dtu->size_z, ti->z,
 				IsTransparencySet(TO_STRUCTURES)
 			);
 			break;
@@ -212,11 +210,11 @@
 			palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile));
 
 			t = &_unmovable_display_datas[GetCompanyHQSection(ti->tile)];
-			DrawGroundSprite(t->ground_sprite, palette);
+			DrawGroundSprite(t->ground.sprite, palette);
 
 			foreach_draw_tile_seq(dtss, t->seq) {
 				AddSortableSpriteToDraw(
-					dtss->image, palette,
+					dtss->image.sprite, palette,
 					ti->x + dtss->delta_x, ti->y + dtss->delta_y,
 					dtss->size_x, dtss->size_y,
 					dtss->size_z, ti->z + dtss->delta_z,
@@ -350,7 +348,7 @@
 }
 
 
-static uint32 GetTileTrackStatus_Unmovable(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Unmovable(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
 	return 0;
 }
--- a/src/vehicle.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/vehicle.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -93,6 +93,24 @@
 /* Initialize the vehicle-pool */
 DEFINE_OLD_POOL_GENERIC(Vehicle, Vehicle)
 
+/** Function to tell if a vehicle needs to be autorenewed
+ * @param *p The vehicle owner
+ * @return true if the vehicle is old enough for replacement
+ */
+bool Vehicle::NeedsAutorenewing(const Player *p) const
+{
+	/* We can always generate the Player pointer when we have the vehicle.
+	 * However this takes time and since the Player pointer is often present
+	 * when this function is called then it's faster to pass the pointer as an
+	 * argument rather than finding it again. */
+	assert(p == GetPlayer(this->owner));
+
+	if (!p->engine_renew) return false;
+	if (this->age - this->max_age < (p->engine_renew_months * 30)) return false;
+
+	return true;
+}
+
 void VehicleServiceInDepot(Vehicle *v)
 {
 	v->date_of_last_service = _date;
@@ -613,8 +631,10 @@
  */
 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, OF_HALT_IN_DEPOT) && !HasBit(v->current_order.flags, OF_PART_OF_ORDERS) && v->current_order.type == OT_GOTO_DEPOT) {
+	/* We need to set v->leave_depot_instantly as we have no control of it's contents at this time.
+	 * Vehicle should stop in the depot if it was in 'stopping' state - train intered depot while slowing down. */
+	if ((HasBit(v->current_order.flags, OF_HALT_IN_DEPOT) && !HasBit(v->current_order.flags, OF_PART_OF_ORDERS) && v->current_order.type == OT_GOTO_DEPOT) ||
+			(v->vehstatus & VS_STOPPED)) {
 		/* we keep the vehicle in the depot since the user ordered it to stay */
 		v->leave_depot_instantly = false;
 	} else {
@@ -2179,6 +2199,9 @@
 			if (!IsFrontEngine(v)) v = v->First();
 			UpdateSignalsOnSegment(v->tile, INVALID_DIAGDIR, v->owner);
 			v->load_unload_time_rem = 0;
+			/* Reset reversed flag */
+			for (Vehicle *u = v; u != NULL; u = u->Next()) ClrBit(u->u.rail.flags, VRF_TOGGLE_REVERSE);
+			TrainConsistChanged(v);
 			break;
 
 		case VEH_ROAD:
@@ -2797,6 +2820,7 @@
 
 	    SLE_VAR(Vehicle, day_counter,          SLE_UINT8),
 	    SLE_VAR(Vehicle, tick_counter,         SLE_UINT8),
+	SLE_CONDVAR(Vehicle, running_ticks,        SLE_UINT8,                   88, SL_MAX_VERSION),
 
 	    SLE_VAR(Vehicle, cur_order_index,      SLE_UINT8),
 	    SLE_VAR(Vehicle, num_orders,           SLE_UINT8),
@@ -2853,11 +2877,11 @@
 	 SLE_CONDVAR(Vehicle, value,                SLE_FILE_I32 | SLE_VAR_I64, 0, 64),
 	 SLE_CONDVAR(Vehicle, value,                SLE_INT64,                 65, SL_MAX_VERSION),
 
-	    SLE_VAR(Vehicle, random_bits,          SLE_UINT8),
-	    SLE_VAR(Vehicle, waiting_triggers,     SLE_UINT8),
-
-	    SLE_REF(Vehicle, next_shared,          REF_VEHICLE),
-	    SLE_REF(Vehicle, prev_shared,          REF_VEHICLE),
+	 SLE_CONDVAR(Vehicle, random_bits,          SLE_UINT8,                 2, SL_MAX_VERSION),
+	 SLE_CONDVAR(Vehicle, waiting_triggers,     SLE_UINT8,                 2, SL_MAX_VERSION),
+
+	 SLE_CONDREF(Vehicle, next_shared,        REF_VEHICLE,                 2, SL_MAX_VERSION),
+	 SLE_CONDREF(Vehicle, prev_shared,        REF_VEHICLE,                 2, SL_MAX_VERSION),
 
 	SLE_CONDVAR(Vehicle, group_id,             SLE_UINT16,                60, SL_MAX_VERSION),
 
--- a/src/vehicle_base.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/vehicle_base.h	Mon Mar 10 15:26:39 2008 +0000
@@ -119,7 +119,7 @@
 	const struct SpriteGroup *cached_override;
 };
 
-enum {
+enum VehicleRailFlags {
 	VRF_REVERSING         = 0,
 
 	/* used to calculate if train is going up or down */
@@ -137,6 +137,9 @@
 
 	/* used to mark that electric train engine is allowed to run on normal rail */
 	VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL = 6,
+
+	/* used for vehicle var 0xFE bit 8 (toggled each time the train is reversed) */
+	VRF_TOGGLE_REVERSE = 7,
 };
 
 struct VehicleAir {
@@ -251,8 +254,9 @@
 	CargoList cargo;         ///< The cargo this vehicle is carrying
 
 
-	byte day_counter;        // increased by one for each day
-	byte tick_counter;       // increased by one for each tick
+	byte day_counter;        ///< Increased by one for each day
+	byte tick_counter;       ///< Increased by one for each tick
+	byte running_ticks;      ///< Number of ticks this vehicle was not stopped this day
 
 	/* Begin Order-stuff */
 	Order current_order;     ///< The current order (+ status, like: loading)
@@ -293,8 +297,8 @@
 	uint16 load_unload_time_rem;
 	byte vehicle_flags;         // Used for gradual loading and other miscellaneous things (@see VehicleFlags enum)
 
-	Money profit_this_year;
-	Money profit_last_year;
+	Money profit_this_year;        ///< Profit this year << 8, low 8 bits are fract
+	Money profit_last_year;        ///< Profit last year << 8, low 8 bits are fract
 	Money value;
 
 	GroupID group_id;              ///< Index of group Pool array
@@ -439,6 +443,18 @@
 	Money GetDisplayRunningCost() const { return (this->GetRunningCost() >> 8); }
 
 	/**
+	 * Gets the profit vehicle had this year. It can be sent into SetDParam for string processing.
+	 * @return the vehicle's profit this year
+	 */
+	Money GetDisplayProfitThisYear() const { return (this->profit_this_year >> 8); }
+
+	/**
+	 * Gets the profit vehicle had last year. It can be sent into SetDParam for string processing.
+	 * @return the vehicle's profit last year
+	 */
+	Money GetDisplayProfitLastYear() const { return (this->profit_last_year >> 8); }
+
+	/**
 	 * Set the next vehicle of this vehicle.
 	 * @param next the next vehicle. NULL removes the next vehicle.
 	 */
@@ -470,6 +486,8 @@
 	 * @return true if there are other vehicles sharing the same order
 	 */
 	inline bool IsOrderListShared() const { return this->next_shared != NULL || this->prev_shared != NULL; };
+
+	bool NeedsAutorenewing(const Player *p) const;
 };
 
 /**
--- a/src/vehicle_gui.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/vehicle_gui.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -145,10 +145,17 @@
 	vl->l.flags |= VL_RESORT;
 }
 
+/* cached values for VehicleNameSorter to spare many GetString() calls */
+static const Vehicle *_last_vehicle[2] = { NULL, NULL };
+static char           _last_name[2][64] = { "", "" };
+
 void SortVehicleList(vehiclelist_d *vl)
 {
 	if (!(vl->l.flags & VL_RESORT)) return;
 
+	/* invalidate cached values for name sorter - vehicle names could change */
+	_last_vehicle[0] = _last_vehicle[1] = NULL;
+
 	_internal_sort_order = (vl->l.flags & VL_DESC) != 0;
 	qsort((void*)vl->sort_list, vl->l.list_length, sizeof(vl->sort_list[0]),
 		_vehicle_sorter[vl->l.sort_type]);
@@ -171,9 +178,9 @@
 	/* draw profit-based colored icons */
 	if (v->age <= 365 * 2) {
 		pal = PALETTE_TO_GREY;
-	} else if (v->profit_last_year < 0) {
+	} else if (v->GetDisplayProfitLastYear() < 0) {
 		pal = PALETTE_TO_RED;
-	} else if (v->profit_last_year < 10000) {
+	} else if (v->GetDisplayProfitLastYear() < 10000) {
 		pal = PALETTE_TO_YELLOW;
 	} else {
 		pal = PALETTE_TO_GREEN;
@@ -546,26 +553,23 @@
 
 static int CDECL VehicleNameSorter(const void *a, const void *b)
 {
-	static const Vehicle *last_vehicle[2] = { NULL, NULL };
-	static char           last_name[2][64] = { "", "" };
-
 	const Vehicle* va = *(const Vehicle**)a;
 	const Vehicle* vb = *(const Vehicle**)b;
 	int r;
 
-	if (va != last_vehicle[0]) {
-		last_vehicle[0] = va;
+	if (va != _last_vehicle[0]) {
+		_last_vehicle[0] = va;
 		SetDParam(0, va->index);
-		GetString(last_name[0], STR_VEHICLE_NAME, lastof(last_name[0]));
+		GetString(_last_name[0], STR_VEHICLE_NAME, lastof(_last_name[0]));
 	}
 
-	if (vb != last_vehicle[1]) {
-		last_vehicle[1] = vb;
-		SetDParam(1, vb->index);
-		GetString(last_name[1], STR_VEHICLE_NAME, lastof(last_name[1]));
+	if (vb != _last_vehicle[1]) {
+		_last_vehicle[1] = vb;
+		SetDParam(0, vb->index);
+		GetString(_last_name[1], STR_VEHICLE_NAME, lastof(_last_name[1]));
 	}
 
-	r = strcmp(last_name[0], last_name[1]); // sort by name
+	r = strcmp(_last_name[0], _last_name[1]); // sort by name
 
 	VEHICLEUNITNUMBERSORTER(r, va, vb);
 
@@ -587,7 +591,7 @@
 {
 	const Vehicle* va = *(const Vehicle**)a;
 	const Vehicle* vb = *(const Vehicle**)b;
-	int r = ClampToI32(va->profit_this_year - vb->profit_this_year);
+	int r = ClampToI32(va->GetDisplayProfitThisYear() - vb->GetDisplayProfitThisYear());
 
 	VEHICLEUNITNUMBERSORTER(r, va, vb);
 
@@ -598,7 +602,7 @@
 {
 	const Vehicle* va = *(const Vehicle**)a;
 	const Vehicle* vb = *(const Vehicle**)b;
-	int r = ClampToI32(va->profit_last_year - vb->profit_last_year);
+	int r = ClampToI32(va->GetDisplayProfitLastYear() - vb->GetDisplayProfitLastYear());
 
 	VEHICLEUNITNUMBERSORTER(r, va, vb);
 
@@ -644,22 +648,10 @@
 {
 	const Vehicle* va = *(const Vehicle**)a;
 	const Vehicle* vb = *(const Vehicle**)b;
-	int max_speed_a = 0xFFFF, max_speed_b = 0xFFFF;
 	int r;
-	const Vehicle *ua = va, *ub = vb;
 
 	if (va->type == VEH_TRAIN && vb->type == VEH_TRAIN) {
-		do {
-			if (RailVehInfo(ua->engine_type)->max_speed != 0)
-				max_speed_a = min(max_speed_a, RailVehInfo(ua->engine_type)->max_speed);
-		} while ((ua = ua->Next()) != NULL);
-
-		do {
-			if (RailVehInfo(ub->engine_type)->max_speed != 0)
-				max_speed_b = min(max_speed_b, RailVehInfo(ub->engine_type)->max_speed);
-		} while ((ub = ub->Next()) != NULL);
-
-		r = max_speed_a - max_speed_b;
+		r = va->u.rail.cached_max_speed - vb->u.rail.cached_max_speed;
 	} else {
 		r = va->max_speed - vb->max_speed;
 	}
@@ -735,6 +727,12 @@
 			w->window_number = to_v->index;
 			SetWindowDirty(w);
 		}
+
+		w = FindWindowById(WC_VEHICLE_TIMETABLE, from_v->index);
+		if (w != NULL) {
+			w->window_number = to_v->index;
+			SetWindowDirty(w);
+		}
 	}
 }
 
@@ -995,8 +993,8 @@
 		const Vehicle *v = vl->sort_list[i];
 		StringID str;
 
-		SetDParam(0, v->profit_this_year);
-		SetDParam(1, v->profit_last_year);
+		SetDParam(0, v->GetDisplayProfitThisYear());
+		SetDParam(1, v->GetDisplayProfitLastYear());
 
 		DrawVehicleImage(v, x + 19, y + 6, INVALID_VEHICLE, w->widget[VLW_WIDGET_LIST].right - w->widget[VLW_WIDGET_LIST].left - 20, 0);
 		DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, TC_FROMSTRING);
@@ -1512,8 +1510,8 @@
 	}
 
 	/* Draw profit */
-	SetDParam(0, v->profit_this_year);
-	SetDParam(1, v->profit_last_year);
+	SetDParam(0, v->GetDisplayProfitThisYear());
+	SetDParam(1, v->GetDisplayProfitLastYear());
 	DrawString(2, 35, _vehicle_translation_table[VST_VEHICLE_PROFIT_THIS_YEAR_LAST_YEAR][v->type], TC_FROMSTRING);
 
 	/* Draw breakdown & reliability */
--- a/src/vehicle_type.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/vehicle_type.h	Mon Mar 10 15:26:39 2008 +0000
@@ -52,4 +52,12 @@
 	EV_BUBBLE          = 9
 };
 
+/** Pathfinding option states */
+enum {
+	VPF_OPF  = 0, ///< The Original PathFinder
+	VPF_NTP  = 0, ///< New Train Pathfinder, replacing OPF for trains
+	VPF_NPF  = 1, ///< New PathFinder
+	VPF_YAPF = 2, ///< Yet Another PathFinder
+};
+
 #endif /* VEHICLE_TYPE_H */
--- a/src/video/cocoa/event.mm	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/video/cocoa/event.mm	Mon Mar 10 15:26:39 2008 +0000
@@ -668,9 +668,13 @@
 			last_cur_ticks = cur_ticks;
 			next_tick = cur_ticks + 30;
 
+			bool old_ctrl_pressed = _ctrl_pressed;
+
 			_ctrl_pressed = !!(_current_mods & ( _patches.right_mouse_btn_emulation != RMBE_CONTROL ? NSControlKeyMask : NSCommandKeyMask));
 			_shift_pressed = !!(_current_mods & NSShiftKeyMask);
 
+			if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged();
+
 			GameLoop();
 
 			_screen.dst_ptr = _cocoa_subdriver->GetPixelBuffer();
--- a/src/video/sdl_v.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/video/sdl_v.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -490,6 +490,8 @@
 			last_cur_ticks = cur_ticks;
 			next_tick = cur_ticks + 30;
 
+			bool old_ctrl_pressed = _ctrl_pressed;
+
 			_ctrl_pressed  = !!(mod & KMOD_CTRL);
 			_shift_pressed = !!(mod & KMOD_SHIFT);
 
@@ -499,6 +501,9 @@
 				(keys[SDLK_UP]    ? 2 : 0) |
 				(keys[SDLK_RIGHT] ? 4 : 0) |
 				(keys[SDLK_DOWN]  ? 8 : 0);
+
+			if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged();
+
 			GameLoop();
 
 			_screen.dst_ptr = _sdl_screen->pixels;
--- a/src/video/win32_v.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/video/win32_v.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -856,6 +856,9 @@
 			_realtime_tick += cur_ticks - last_cur_ticks;
 			last_cur_ticks = cur_ticks;
 			next_tick = cur_ticks + 30;
+
+			bool old_ctrl_pressed = _ctrl_pressed;
+
 			_ctrl_pressed = _wnd.has_focus && GetAsyncKeyState(VK_CONTROL)<0;
 			_shift_pressed = _wnd.has_focus && GetAsyncKeyState(VK_SHIFT)<0;
 
@@ -870,6 +873,8 @@
 				_dirkeys = 0;
 			}
 
+			if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged();
+
 			GameLoop();
 			_cursor.delta.x = _cursor.delta.y = 0;
 
--- a/src/viewport.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/viewport.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -362,7 +362,7 @@
 	ViewPort *vp = w->viewport;
 
 	if (vp != NULL &&
-	    IsInsideMM(x, vp->left, vp->left + vp->width) &&
+			IsInsideMM(x, vp->left, vp->left + vp->width) &&
 			IsInsideMM(y, vp->top, vp->top + vp->height))
 		return vp;
 
@@ -690,6 +690,7 @@
 		top  = ps->top  = (pt.y += spr->y_offs);
 		bottom          = (pt.y +  spr->height);
 	}
+
 	if (_draw_bounding_boxes && (image != SPR_EMPTY_BOUNDING_BOX)) {
 		/* Compute maximal extents of sprite and it's bounding box */
 		left   = min(left  , RemapCoords(x + w          , y + bb_offset_y, z + bb_offset_z).x);
@@ -697,9 +698,10 @@
 		top    = min(top   , RemapCoords(x + bb_offset_x, y + bb_offset_y, z + dz         ).y);
 		bottom = max(bottom, RemapCoords(x + w          , y + h          , z + bb_offset_z).y + 1);
 	}
+
 	/* Do not add the sprite to the viewport, if it is outside */
 	if (left   >= vd->dpi.left + vd->dpi.width ||
-	    right  <= vd->dpi.left ||
+	    right  <= vd->dpi.left                 ||
 	    top    >= vd->dpi.top + vd->dpi.height ||
 	    bottom <= vd->dpi.top) {
 		return;
@@ -1617,6 +1619,7 @@
 
 	ViewportSortParentSprites(parent_list);
 	ViewportDrawParentSprites(parent_list);
+
 	if (_draw_bounding_boxes) ViewportDrawBoundingBoxes(parent_list);
 
 	if (vd.first_string != NULL) ViewportDrawStrings(&vd.dpi, vd.first_string);
@@ -1731,6 +1734,7 @@
 		}
 
 		ClampViewportToMap(vp, WP(w, vp_d).scrollpos_x, WP(w, vp_d).scrollpos_y);
+
 		SetViewportPosition(w, WP(w, vp_d).scrollpos_x, WP(w, vp_d).scrollpos_y);
 	}
 }
@@ -2868,9 +2872,8 @@
 {
 	Window *w;
 
-	/* undo clicking on button */
-	if (_thd.place_mode != VHM_NONE) {
-		_thd.place_mode = VHM_NONE;
+	/* undo clicking on button and drag & drop */
+	if (_thd.place_mode != VHM_NONE || _special_mouse_mode == WSM_DRAGDROP) {
 		w = FindWindowById(_thd.window_class, _thd.window_number);
 		if (w != NULL) CallWindowEventNP(w, WE_ABORT_PLACE_OBJ);
 	}
--- a/src/water.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/water.h	Mon Mar 10 15:26:39 2008 +0000
@@ -11,8 +11,7 @@
 void ConvertGroundTilesIntoWaterTiles();
 
 void DrawShipDepotSprite(int x, int y, int image);
-void DrawCanalWater(TileIndex tile, bool draw_base);
-void DrawRiverWater(const struct TileInfo *ti, bool draw_base);
+void DrawWaterClassGround(const struct TileInfo *ti);
 void DrawShoreTile(Slope tileh);
 
 void MakeWaterKeepingClass(TileIndex tile, Owner o);
--- a/src/water_cmd.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/water_cmd.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -96,6 +96,9 @@
 
 /**
  * Makes a tile canal or water depending on the surroundings.
+ *
+ * Must only be used for converting old savegames. Use WaterClass now.
+ *
  * This as for example docks and shipdepots do not store
  * whether the tile used to be canal or 'normal' water.
  * @param t the tile to change.
@@ -108,6 +111,12 @@
 	/* Mark tile dirty in all cases */
 	MarkTileDirtyByTile(t);
 
+	if (TileX(t) == 0 || TileY(t) == 0 || TileX(t) == MapMaxX() - 1 || TileY(t) == MapMaxY() - 1) {
+		/* tiles at map borders are always WATER_CLASS_SEA */
+		SetWaterClass(t, WATER_CLASS_SEA);
+		return;
+	}
+
 	bool has_water = false;
 	bool has_canal = false;
 	bool has_river = false;
@@ -116,9 +125,17 @@
 		TileIndex neighbour = TileAddByDiagDir(t, dir);
 		switch (GetTileType(neighbour)) {
 			case MP_WATER:
-				has_water |= IsSea(neighbour) || IsCoast(neighbour) || (IsShipDepot(neighbour) && GetShipDepotWaterOwner(neighbour) == OWNER_WATER);
-				has_canal |= IsCanal(neighbour) || (IsShipDepot(neighbour) && GetShipDepotWaterOwner(neighbour) != OWNER_WATER);
-				has_river |= IsRiver(neighbour);
+				/* clear water and shipdepots have already a WaterClass associated */
+				if (IsCoast(neighbour)) {
+					has_water = true;
+				} else if (!IsLock(neighbour)) {
+					switch (GetWaterClass(neighbour)) {
+						case WATER_CLASS_SEA:   has_water = true; break;
+						case WATER_CLASS_CANAL: has_canal = true; break;
+						case WATER_CLASS_RIVER: has_river = true; break;
+						default: NOT_REACHED();
+					}
+				}
 				break;
 
 			case MP_RAILWAY:
@@ -174,8 +191,6 @@
 
 	WaterClass wc1 = GetWaterClass(tile);
 	WaterClass wc2 = GetWaterClass(tile2);
-	Owner o1 = GetTileOwner(tile);
-	Owner o2 = GetTileOwner(tile2);
 	ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 	if (CmdFailed(ret)) return CMD_ERROR;
 	ret = DoCommand(tile2, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
@@ -188,8 +203,8 @@
 	if (flags & DC_EXEC) {
 		depot->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
 
-		MakeShipDepot(tile,  _current_player, DEPOT_NORTH, axis, wc1, o1);
-		MakeShipDepot(tile2, _current_player, DEPOT_SOUTH, axis, wc2, o2);
+		MakeShipDepot(tile,  _current_player, DEPOT_NORTH, axis, wc1);
+		MakeShipDepot(tile2, _current_player, DEPOT_SOUTH, axis, wc2);
 		MarkTileDirtyByTile(tile);
 		MarkTileDirtyByTile(tile2);
 		d_auto_delete.Detach();
@@ -211,22 +226,22 @@
 
 static CommandCost RemoveShipDepot(TileIndex tile, uint32 flags)
 {
-	TileIndex tile2;
-
 	if (!IsShipDepot(tile)) return CMD_ERROR;
 	if (!CheckTileOwnership(tile)) return CMD_ERROR;
-	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
-	tile2 = GetOtherShipDepotTile(tile);
+	TileIndex tile2 = GetOtherShipDepotTile(tile);
 
-	if (!EnsureNoVehicleOnGround(tile2)) return CMD_ERROR;
+	/* do not check for ship on tile when company goes bankrupt */
+	if (!(flags & DC_BANKRUPT)) {
+		if (!EnsureNoVehicleOnGround(tile) || !EnsureNoVehicleOnGround(tile2)) return CMD_ERROR;
+	}
 
 	if (flags & DC_EXEC) {
 		/* Kill the depot, which is registered at the northernmost tile. Use that one */
 		delete GetDepotByTile(tile2 < tile ? tile2 : tile);
 
-		MakeWaterKeepingClass(tile,  GetShipDepotWaterOwner(tile));
-		MakeWaterKeepingClass(tile2, GetShipDepotWaterOwner(tile2));
+		MakeWaterKeepingClass(tile,  GetTileOwner(tile));
+		MakeWaterKeepingClass(tile2, GetTileOwner(tile2));
 		MarkTileDirtyByTile(tile);
 		MarkTileDirtyByTile(tile2);
 	}
@@ -533,15 +548,15 @@
 }
 
 /** Draw a plain sea water tile with no edges */
-void DrawSeaWater(TileIndex tile)
+static void DrawSeaWater(TileIndex tile)
 {
 	DrawGroundSprite(SPR_FLAT_WATER_TILE, PAL_NONE);
 }
 
 /** draw a canal styled water tile with dikes around */
-void DrawCanalWater(TileIndex tile, bool draw_base)
+static void DrawCanalWater(TileIndex tile)
 {
-	if (draw_base) DrawGroundSprite(SPR_FLAT_WATER_TILE, PAL_NONE);
+	DrawGroundSprite(SPR_FLAT_WATER_TILE, PAL_NONE);
 
 	/* Test for custom graphics, else use the default */
 	SpriteID dikes_base = GetCanalSprite(CF_DIKES, tile);
@@ -559,7 +574,7 @@
 #include "table/water_land.h"
 
 static void DrawWaterStuff(const TileInfo *ti, const WaterDrawTileStruct *wdts,
-	SpriteID palette, uint base
+	SpriteID palette, uint base, bool draw_ground
 )
 {
 	SpriteID image;
@@ -577,7 +592,7 @@
 
 	image = wdts++->image;
 	if (image < 4) image += water_base;
-	DrawGroundSprite(image, PAL_NONE);
+	if (draw_ground) DrawGroundSprite(image, PAL_NONE);
 
 	for (; wdts->delta_x != 0x80; wdts++) {
 		AddSortableSpriteToDraw(wdts->image + base + ((wdts->image < 24) ? locks_base : 0), palette,
@@ -588,7 +603,7 @@
 	}
 }
 
-void DrawRiverWater(const TileInfo *ti, bool draw_base)
+static void DrawRiverWater(const TileInfo *ti)
 {
 	SpriteID image = SPR_FLAT_WATER_TILE;
 	SpriteID edges_base = GetCanalSprite(CF_RIVER_EDGE, ti->tile);
@@ -614,7 +629,7 @@
 		}
 	}
 
-	if (draw_base) DrawGroundSprite(image, PAL_NONE);
+	DrawGroundSprite(image, PAL_NONE);
 
 	/* Draw river edges if available. */
 	if (edges_base > 48) DrawWaterEdges(edges_base, ti->tile);
@@ -637,15 +652,19 @@
 	DrawGroundSprite(SPR_SHORE_BASE + tileh_to_shoresprite[tileh], PAL_NONE);
 }
 
+void DrawWaterClassGround(const TileInfo *ti) {
+	switch (GetWaterClass(ti->tile)) {
+		case WATER_CLASS_SEA:   DrawSeaWater(ti->tile); break;
+		case WATER_CLASS_CANAL: DrawCanalWater(ti->tile); break;
+		case WATER_CLASS_RIVER: DrawRiverWater(ti); break;
+	}
+}
+
 static void DrawTile_Water(TileInfo *ti)
 {
 	switch (GetWaterTileType(ti->tile)) {
 		case WATER_TILE_CLEAR:
-			switch (GetWaterClass(ti->tile)) {
-				case WATER_CLASS_SEA:   DrawSeaWater(ti->tile); break;
-				case WATER_CLASS_CANAL: DrawCanalWater(ti->tile, true); break;
-				case WATER_CLASS_RIVER: DrawRiverWater(ti, true); break;
-			}
+			DrawWaterClassGround(ti);
 			DrawBridgeMiddle(ti);
 			break;
 
@@ -656,11 +675,12 @@
 
 		case WATER_TILE_LOCK: {
 			const WaterDrawTileStruct *t = _shiplift_display_seq[GetSection(ti->tile)];
-			DrawWaterStuff(ti, t, 0, ti->z > t[3].delta_y ? 24 : 0);
+			DrawWaterStuff(ti, t, 0, ti->z > t[3].delta_y ? 24 : 0, true);
 		} break;
 
 		case WATER_TILE_DEPOT:
-			DrawWaterStuff(ti, _shipdepot_display_seq[GetSection(ti->tile)], PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), 0);
+			DrawWaterClassGround(ti);
+			DrawWaterStuff(ti, _shipdepot_display_seq[GetSection(ti->tile)], PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), 0, false);
 			break;
 	}
 }
@@ -854,9 +874,9 @@
  */
 static FloodingBehaviour GetFloodingBehaviour(TileIndex tile)
 {
-	/* FLOOD_ACTIVE:  'single-corner-raised'-coast, sea, sea-shipdepots, sea-buoys, rail with flooded halftile
+	/* FLOOD_ACTIVE:  'single-corner-raised'-coast, sea, sea-shipdepots, sea-buoys, sea-docks (water part), rail with flooded halftile
 	 * FLOOD_DRYUP:   coast with more than one corner raised, coast with rail-track, coast with trees
-	 * FLOOD_PASSIVE: oilrig, dock, water-industries
+	 * FLOOD_PASSIVE: oilrig, water-industries
 	 * FLOOD_NONE:    canals, rivers, everything else
 	 */
 	switch (GetTileType(tile)) {
@@ -878,6 +898,10 @@
 			return (GetTreeGround(tile) == TREE_GROUND_SHORE ? FLOOD_DRYUP : FLOOD_NONE);
 
 		case MP_STATION:
+			if (IsBuoy(tile) || (IsDock(tile) && GetTileSlope(tile, NULL) == SLOPE_FLAT)) {
+				return (GetWaterClass(tile) == WATER_CLASS_SEA ? FLOOD_ACTIVE : FLOOD_NONE);
+			}
+			return (IsOilRig(tile) ? FLOOD_PASSIVE : FLOOD_NONE);
 			if (IsBuoy(tile) && GetWaterClass(tile) == WATER_CLASS_SEA) return FLOOD_ACTIVE;
 			if (IsOilRig(tile) || IsDock(tile)) return FLOOD_PASSIVE;
 			if (GetStationByTile(tile)->FSMport_flood_protected) return FLOOD_PASSIVE;
@@ -896,7 +920,7 @@
  */
 static void DoFloodTile(TileIndex target)
 {
-	if (IsTileType(target, MP_WATER)) return;
+	assert(!IsTileType(target, MP_WATER));
 
 	bool flooded = false; // Will be set to true if something is changed.
 
@@ -1020,6 +1044,8 @@
 			for (Direction dir = DIR_BEGIN; dir < DIR_END; dir++) {
 				TileIndex dest = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(dir));
 				if (dest == INVALID_TILE) continue;
+				/* do not try to flood water tiles - increases performance a lot */
+				if (IsTileType(dest, MP_WATER)) continue;
 
 				uint z_dest;
 				Slope slope_dest = (Slope)(GetFoundationSlope(dest, &z_dest) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP);
@@ -1091,7 +1117,7 @@
 	}
 }
 
-static uint32 GetTileTrackStatus_Water(TileIndex tile, TransportType mode, uint sub_mode)
+static TrackStatus GetTileTrackStatus_Water(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
 	static const byte coast_tracks[] = {0, 32, 4, 0, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0};
 
@@ -1114,7 +1140,7 @@
 		/* NW border: remove tracks that connects NW tile edge */
 		ts &= ~(TRACK_BIT_Y | TRACK_BIT_LEFT | TRACK_BIT_UPPER);
 	}
-	return ts * 0x101;
+	return CombineTrackStatus(TrackBitsToTrackdirBits(ts), TRACKDIR_BIT_NONE);
 }
 
 static void ClickTile_Water(TileIndex tile)
@@ -1132,11 +1158,15 @@
 
 	if (new_player != PLAYER_SPECTATOR) {
 		SetTileOwner(tile, new_player);
-	} else if (IsShipDepot(tile)) {
-		DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
-	} else {
-		SetTileOwner(tile, OWNER_NONE);
+		return;
 	}
+
+	/* Remove depot */
+	if (IsShipDepot(tile)) DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR);
+
+	/* Set owner of canals and locks ... and also canal under dock there was before.
+	 * Check if the new owner after removing depot isn't OWNER_WATER. */
+	if (IsTileOwner(tile, old_player)) SetTileOwner(tile, OWNER_NONE);
 }
 
 static VehicleEnterTileStatus VehicleEnter_Water(Vehicle *v, TileIndex tile, int x, int y)
--- a/src/water_map.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/water_map.h	Mon Mar 10 15:26:39 2008 +0000
@@ -106,9 +106,9 @@
 	return XYNSToDiagDir(GetShipDepotAxis(t), GB(_m[t].m5, 0, 1));
 }
 
-static inline Owner GetShipDepotWaterOwner(TileIndex t)
+static inline bool IsLock(TileIndex t)
 {
-	return (Owner)_m[t].m4;
+	return IsInsideMM(_m[t].m5, LOCK_MIDDLE, LOCK_END);
 }
 
 static inline DiagDirection GetLockDirection(TileIndex t)
@@ -169,13 +169,13 @@
 	_m[t].m5 = 0;
 }
 
-static inline void MakeShipDepot(TileIndex t, Owner o, DepotPart base, Axis a, WaterClass original_water_class, Owner original_owner)
+static inline void MakeShipDepot(TileIndex t, Owner o, DepotPart base, Axis a, WaterClass original_water_class)
 {
 	SetTileType(t, MP_WATER);
 	SetTileOwner(t, o);
 	_m[t].m2 = 0;
 	_m[t].m3 = original_water_class;
-	_m[t].m4 = original_owner;
+	_m[t].m4 = 0;
 	_m[t].m5 = base + a * 2;
 }
 
--- a/src/waypoint.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/waypoint.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -34,10 +34,6 @@
 
 #include "table/strings.h"
 
-enum {
-	MAX_WAYPOINTS_PER_TOWN = 64,
-};
-
 DEFINE_OLD_POOL_GENERIC(Waypoint, Waypoint)
 
 
@@ -81,27 +77,57 @@
  */
 static void MakeDefaultWaypointName(Waypoint* wp)
 {
-	Waypoint *local_wp;
-	bool used_waypoint[MAX_WAYPOINTS_PER_TOWN];
-	int i;
+	uint32 used = 0; // bitmap of used waypoint numbers, sliding window with 'next' as base
+	uint32 next = 0; // first waypoint number in the bitmap
+	WaypointID idx = 0; // index where we will stop
 
 	wp->town_index = ClosestTownFromTile(wp->xy, (uint)-1)->index;
 
-	memset(used_waypoint, 0, sizeof(used_waypoint));
-
-	/* Find an unused waypoint number belonging to this town */
-	FOR_ALL_WAYPOINTS(local_wp) {
-		if (wp == local_wp) continue;
+	/* Find first unused waypoint number belonging to this town. This can never fail,
+	 * as long as there can be at most 65535 waypoints in total.
+	 *
+	 * This does 'n * m' search, but with 32bit 'used' bitmap, it needs at most 'n * (1 + ceil(m / 32))'
+	 * steps (n - number of waypoints in pool, m - number of waypoints near this town).
+	 * Usually, it needs only 'n' steps.
+	 *
+	 * If it wasn't using 'used' and 'idx', it would just search for increasing 'next',
+	 * but this way it is faster */
 
-		if (local_wp->xy && local_wp->name == NULL && local_wp->town_index == wp->town_index)
-			used_waypoint[local_wp->town_cn] = true;
-	}
+	WaypointID cid = 0; // current index, goes to GetWaypointPoolSize()-1, then wraps to 0
+	do {
+		Waypoint *lwp = GetWaypoint(cid);
 
-	/* Find an empty spot */
-	for (i = 0; used_waypoint[i] && i < MAX_WAYPOINTS_PER_TOWN; i++) {}
+		/* check only valid waypoints... */
+ 		if (lwp->IsValid() && wp != lwp) {
+			/* only waypoints with 'generic' name within the same city */
+			if (lwp->name == NULL && lwp->town_index == wp->town_index) {
+				/* if lwp->town_cn < next, uint will overflow to '+inf' */
+				uint i = (uint)lwp->town_cn - next;
 
-	wp->name = NULL;
-	wp->town_cn = i;
+				if (i < 32) {
+					SetBit(used, i); // update bitmap
+					if (i == 0) {
+						/* shift bitmap while the lowest bit is '1';
+						 * increase the base of the bitmap too */
+						do {
+							used >>= 1;
+							next++;
+						} while (HasBit(used, 0));
+						/* when we are at 'idx' again at end of the loop and
+						 * 'next' hasn't changed, then no waypoint had town_cn == next,
+						 * so we can safely use it */
+						idx = cid;
+					}
+				}
+			}
+		}
+
+		cid++;
+		if (cid == GetWaypointPoolSize()) cid = 0; // wrap to zero...
+	} while (cid != idx);
+
+	wp->town_cn = (uint16)next; // set index...
+	wp->name = NULL; // ... and use generic name
 }
 
 /**
@@ -197,7 +223,7 @@
 
 		wp_auto_delete = wp;
 
-		wp->town_index = 0;
+		wp->town_index = INVALID_TOWN;
 		wp->name = NULL;
 		wp->town_cn = 0;
 	} else if (flags & DC_EXEC) {
@@ -241,7 +267,7 @@
 		wp->deleted = 0;
 		wp->build_date = _date;
 
-		if (wp->town_index == 0) MakeDefaultWaypointName(wp);
+		if (wp->town_index == INVALID_TOWN) MakeDefaultWaypointName(wp);
 
 		UpdateWaypointSign(wp);
 		RedrawWaypointSign(wp);
@@ -455,7 +481,8 @@
 	SLE_CONDVAR(Waypoint, xy,         SLE_FILE_U16 | SLE_VAR_U32,  0, 5),
 	SLE_CONDVAR(Waypoint, xy,         SLE_UINT32,                  6, SL_MAX_VERSION),
 	SLE_CONDVAR(Waypoint, town_index, SLE_UINT16,                 12, SL_MAX_VERSION),
-	SLE_CONDVAR(Waypoint, town_cn,    SLE_UINT8,                  12, SL_MAX_VERSION),
+	SLE_CONDVAR(Waypoint, town_cn,    SLE_FILE_U8 | SLE_VAR_U16,  12, 88),
+	SLE_CONDVAR(Waypoint, town_cn,    SLE_UINT16,                 89, SL_MAX_VERSION),
 	SLE_CONDVAR(Waypoint, string,     SLE_STRINGID,                0, 83),
 	SLE_CONDSTR(Waypoint, name,       SLE_STR, 0,                 84, SL_MAX_VERSION),
 	    SLE_VAR(Waypoint, deleted,    SLE_UINT8),
--- a/src/waypoint.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/waypoint.h	Mon Mar 10 15:26:39 2008 +0000
@@ -16,7 +16,7 @@
 	TileIndex xy;      ///< Tile of waypoint
 
 	TownID town_index; ///< Town associated with the waypoint
-	byte town_cn;      ///< The Nth waypoint for this town (consecutive number)
+	uint16 town_cn;    ///< The Nth waypoint for this town (consecutive number)
 	StringID string;   ///< C000-C03F have special meaning in old games
 	char *name;        ///< Custom name. If not set, town + town_cn is used for naming
 
--- a/src/widgets/dropdown.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/widgets/dropdown.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -49,7 +49,7 @@
 	WindowNumber parent_wnd_num;
 	byte parent_button;
 	DropDownList *list;
-	byte selected_index;
+	int selected_index;
 	byte click_delay;
 	bool drag_mode;
 	int scrolling;
--- a/src/window.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/window.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -1085,8 +1085,6 @@
 
 	w = GetCallbackWnd();
 
-	ResetObjectToPlace();
-
 	if (w != NULL) {
 		/* send an event in client coordinates. */
 		e.event = WE_DRAGDROP;
@@ -1095,6 +1093,9 @@
 		e.we.dragdrop.widget = GetWidgetFromPos(w, e.we.dragdrop.pt.x, e.we.dragdrop.pt.y);
 		w->wndproc(w, &e);
 	}
+
+	ResetObjectToPlace();
+
 	return false;
 }
 
@@ -1708,6 +1709,21 @@
 	}
 }
 
+void HandleCtrlChanged()
+{
+	WindowEvent e;
+
+	e.event = WE_CTRL_CHANGED;
+	e.we.ctrl.cont = true;
+
+	/* Call the event, start with the uppermost window. */
+	for (Window* const *wz = _last_z_window; wz != _z_windows;) {
+		Window *w = *--wz;
+		w->wndproc(w, &e);
+		if (!e.we.ctrl.cont) break;
+	}
+}
+
 extern void UpdateTileSelection();
 extern bool VpHandlePlaceSizingDrag();
 
--- a/src/window_gui.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/window_gui.h	Mon Mar 10 15:26:39 2008 +0000
@@ -123,6 +123,7 @@
 	WE_MESSAGE,
 	WE_SCROLL,
 	WE_INVALIDATE_DATA,
+	WE_CTRL_CHANGED,
 };
 
 struct WindowEvent {
@@ -192,6 +193,10 @@
 		struct {
 			int wheel;     ///< how much was 'wheel'd'
 		} wheel;
+
+		struct {
+			bool cont;     ///< continue the search? (default true)
+		} ctrl;
 	} we;
 };
 
--- a/src/yapf/follow_track.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/* $Id$ */
-
-#include "../stdafx.h"
-#include "yapf.hpp"
-#include "follow_track.hpp"
-
-void FollowTrackInit(FollowTrack_t *This, const Vehicle* v)
-{
-	CFollowTrackWater& F = *(CFollowTrackWater*) This;
-	F.Init(v, NULL);
-}
-
-bool FollowTrackWater(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td)
-{
-	CFollowTrackWater& F = *(CFollowTrackWater*) This;
-	return F.Follow(old_tile, old_td);
-}
-
-bool FollowTrackRoad(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td)
-{
-	CFollowTrackRoad& F = *(CFollowTrackRoad*) This;
-	return F.Follow(old_tile, old_td);
-}
-
-bool FollowTrackRail(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td)
-{
-	CFollowTrackRail& F = *(CFollowTrackRail*) This;
-	return F.Follow(old_tile, old_td);
-}
-
-bool FollowTrackWaterNo90(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td)
-{
-	CFollowTrackWaterNo90& F = *(CFollowTrackWaterNo90*) This;
-	return F.Follow(old_tile, old_td);
-}
-
-bool FollowTrackRoadNo90(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td)
-{
-	CFollowTrackRoadNo90& F = *(CFollowTrackRoadNo90*) This;
-	return F.Follow(old_tile, old_td);
-}
-
-bool FollowTrackRailNo90(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td)
-{
-	CFollowTrackRailNo90& F = *(CFollowTrackRailNo90*) This;
-	return F.Follow(old_tile, old_td);
-}
--- a/src/yapf/follow_track.hpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/yapf/follow_track.hpp	Mon Mar 10 15:26:39 2008 +0000
@@ -7,12 +7,32 @@
 
 #include "yapf.hpp"
 
+
 /** Track follower helper template class (can serve pathfinders and vehicle
  *  controllers). See 6 different typedefs below for 3 different transport
  *  types w/ of w/o 90-deg turns allowed */
 template <TransportType Ttr_type_, bool T90deg_turns_allowed_ = true>
-struct CFollowTrackT : public FollowTrack_t
+struct CFollowTrackT
 {
+	enum ErrorCode {
+		EC_NONE,
+		EC_OWNER,
+		EC_RAIL_TYPE,
+		EC_90DEG,
+		EC_NO_WAY,
+	};
+
+	const Vehicle*      m_veh;           ///< moving vehicle
+	TileIndex           m_old_tile;      ///< the origin (vehicle moved from) before move
+	Trackdir            m_old_td;        ///< the trackdir (the vehicle was on) before move
+	TileIndex           m_new_tile;      ///< the new tile (the vehicle has entered)
+	TrackdirBits        m_new_td_bits;   ///< the new set of available trackdirs
+	DiagDirection       m_exitdir;       ///< exit direction (leaving the old tile)
+	bool                m_is_tunnel;     ///< last turn passed tunnel
+	bool                m_is_bridge;     ///< last turn passed bridge ramp
+	bool                m_is_station;    ///< last turn passed station
+	int                 m_tiles_skipped; ///< number of skipped tunnel or station tiles
+	ErrorCode           m_err;
 	CPerformanceTimer* m_pPerf;
 
 	FORCEINLINE CFollowTrackT(const Vehicle* v = NULL, CPerformanceTimer* pPerf = NULL)
@@ -44,7 +64,7 @@
 	/** Tests if a tile is a road tile with a single tramtrack (tram can reverse) */
 	FORCEINLINE DiagDirection GetSingleTramBit(TileIndex tile)
 	{
-		if (IsTram() && IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
+		if (IsTram() && IsNormalRoadTile(tile)) {
 			RoadBits rb = GetRoadBits(tile, ROADTYPE_TRAM);
 			switch (rb) {
 				case ROAD_NW: return DIAGDIR_NW;
@@ -64,7 +84,7 @@
 		m_old_tile = old_tile;
 		m_old_td = old_td;
 		m_err = EC_NONE;
-		assert(((GetTileTrackStatus(m_old_tile, TT(), m_veh->u.road.compatible_roadtypes) & TrackdirToTrackdirBits(m_old_td)) != 0) ||
+		assert(((TrackStatusToTrackdirBits(GetTileTrackStatus(m_old_tile, TT(), m_veh->u.road.compatible_roadtypes)) & TrackdirToTrackdirBits(m_old_td)) != 0) ||
 		       (GetSingleTramBit(m_old_tile) != INVALID_DIAGDIR)); // Disable the assertion for single tram bits
 		m_exitdir = TrackdirToExitdir(m_old_td);
 		if (ForcedReverse()) return true;
@@ -133,8 +153,7 @@
 		if (IsRailTT() && GetTileType(m_new_tile) == MP_RAILWAY && IsPlainRailTile(m_new_tile)) {
 			m_new_td_bits = (TrackdirBits)(GetTrackBits(m_new_tile) * 0x101);
 		} else {
-			uint32 ts = GetTileTrackStatus(m_new_tile, TT(), m_veh->u.road.compatible_roadtypes);
-			m_new_td_bits = (TrackdirBits)(ts & TRACKDIR_BIT_MASK);
+			m_new_td_bits = TrackStatusToTrackdirBits(GetTileTrackStatus(m_new_tile, TT(), m_veh->u.road.compatible_roadtypes));
 
 			if (m_new_td_bits == 0) {
 				/* GetTileTrackStatus() returns 0 for single tram bits.
@@ -342,7 +361,7 @@
 
 		// for now we handle only on-bridge speed limit
 		if (!IsWaterTT() && IsBridgeTile(m_old_tile)) {
-			int spd = _bridge[GetBridgeType(m_old_tile)].speed;
+			int spd = GetBridgeSpec(GetBridgeType(m_old_tile))->speed;
 			if (IsRoadTT()) spd *= 2;
 			if (max_speed > spd) max_speed = spd;
 		}
--- a/src/yapf/yapf.h	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/yapf/yapf.h	Mon Mar 10 15:26:39 2008 +0000
@@ -73,54 +73,6 @@
 extern int _aystar_stats_closed_size;
 
 
-/** Track followers. They should help whenever any new code will need to walk through
- * tracks, road or water tiles (pathfinders, signal controllers, vehicle controllers).
- * It is an attempt to introduce API that should simplify tasks listed above.
- * If you will need to use it:
- *   1. allocate/declare FollowTrack_t structure;
- *   2. call FollowTrackInit() and provide vehicle (if relevant)
- *   3. call one of 6 FollowTrackXxxx() APIs below
- *   4. check return value (if true then continue else stop)
- *   5. look at FollowTrack_t structure for the result
- *   6. optionally repeat steps 3..5
- *   7. in case of troubles contact KUDr
- */
-
-/** Base struct for track followers. */
-struct FollowTrack_t
-{
-	enum ErrorCode {
-		EC_NONE,
-		EC_OWNER,
-		EC_RAIL_TYPE,
-		EC_90DEG,
-		EC_NO_WAY,
-	};
-
-	const Vehicle*      m_veh;           ///< moving vehicle
-	TileIndex           m_old_tile;      ///< the origin (vehicle moved from) before move
-	Trackdir            m_old_td;        ///< the trackdir (the vehicle was on) before move
-	TileIndex           m_new_tile;      ///< the new tile (the vehicle has entered)
-	TrackdirBits        m_new_td_bits;   ///< the new set of available trackdirs
-	DiagDirection       m_exitdir;       ///< exit direction (leaving the old tile)
-	bool                m_is_tunnel;     ///< last turn passed tunnel
-	bool                m_is_bridge;     ///< last turn passed bridge ramp
-	bool                m_is_station;    ///< last turn passed station
-	int                 m_tiles_skipped; ///< number of skipped tunnel or station tiles
-	ErrorCode           m_err;
-};
-
-/** Initializes FollowTrack_t structure */
-void FollowTrackInit(FollowTrack_t *This, const Vehicle* v);
-
-/** Main track follower routines */
-bool FollowTrackWater    (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td);
-bool FollowTrackRoad     (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td);
-bool FollowTrackRail     (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td);
-bool FollowTrackWaterNo90(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td);
-bool FollowTrackRoadNo90 (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td);
-bool FollowTrackRailNo90 (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td);
-
 /** Base tile length units */
 enum {
 	YAPF_TILE_LENGTH = 100,
--- a/src/yapf/yapf_base.hpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/yapf/yapf_base.hpp	Mon Mar 10 15:26:39 2008 +0000
@@ -138,21 +138,23 @@
 
 #ifndef NO_DEBUG_MESSAGES
 		perf.Stop();
-		if (_debug_yapf_level >= 3) {
+		if (_debug_yapf_level >= 2) {
 			int t = perf.Get(1000000);
 			_total_pf_time_us += t;
 
-			UnitID veh_idx = (m_veh != NULL) ? m_veh->unitnumber : 0;
-			char ttc = Yapf().TransportTypeChar();
-			float cache_hit_ratio = (m_stats_cache_hits == 0) ? 0.0f : ((float)m_stats_cache_hits / (float)(m_stats_cache_hits + m_stats_cost_calcs) * 100.0f);
-			int cost = bDestFound ? m_pBestDestNode->m_cost : -1;
-			int dist = bDestFound ? m_pBestDestNode->m_estimate - m_pBestDestNode->m_cost : -1;
+			if (_debug_yapf_level >= 3) {
+				UnitID veh_idx = (m_veh != NULL) ? m_veh->unitnumber : 0;
+				char ttc = Yapf().TransportTypeChar();
+				float cache_hit_ratio = (m_stats_cache_hits == 0) ? 0.0f : ((float)m_stats_cache_hits / (float)(m_stats_cache_hits + m_stats_cost_calcs) * 100.0f);
+				int cost = bDestFound ? m_pBestDestNode->m_cost : -1;
+				int dist = bDestFound ? m_pBestDestNode->m_estimate - m_pBestDestNode->m_cost : -1;
 
-			DEBUG(yapf, 3, "[YAPF%c]%c%4d- %d us - %d rounds - %d open - %d closed - CHR %4.1f%% - c%d(sc%d, ts%d, o%d) -- ",
-			  ttc, bDestFound ? '-' : '!', veh_idx, t, m_num_steps, m_nodes.OpenCount(), m_nodes.ClosedCount(),
-			  cache_hit_ratio, cost, dist, m_perf_cost.Get(1000000), m_perf_slope_cost.Get(1000000),
-			  m_perf_ts_cost.Get(1000000), m_perf_other_cost.Get(1000000)
-			);
+				DEBUG(yapf, 3, "[YAPF%c]%c%4d- %d us - %d rounds - %d open - %d closed - CHR %4.1f%% - c%d(sc%d, ts%d, o%d) -- ",
+				  ttc, bDestFound ? '-' : '!', veh_idx, t, m_num_steps, m_nodes.OpenCount(), m_nodes.ClosedCount(),
+				  cache_hit_ratio, cost, dist, m_perf_cost.Get(1000000), m_perf_slope_cost.Get(1000000),
+				  m_perf_ts_cost.Get(1000000), m_perf_other_cost.Get(1000000)
+				);
+			}
 		}
 #endif /* !NO_DEBUG_MESSAGES */
 		return bDestFound;
--- a/src/yapf/yapf_common.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/* $Id$ */
-
-/** @file yapf_common.cpp */
-
-#include "../stdafx.h"
-
-#include "yapf.hpp"
-#include "follow_track.hpp"
-#include "yapf_node_rail.hpp"
-#include "yapf_costbase.hpp"
-#include "yapf_costcache.hpp"
-
-/** translate tileh to the bitset of up-hill trackdirs */
-const TrackdirBits CYapfCostBase::c_upwards_slopes[] = {
-	TRACKDIR_BIT_NONE                    , ///<  no tileh
-	TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///<  1
-	TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///<  2
-	TRACKDIR_BIT_X_SW                    , ///<  3
-	TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///<  4
-	TRACKDIR_BIT_NONE                    , ///<  5
-	TRACKDIR_BIT_Y_SE                    , ///<  6
-	TRACKDIR_BIT_NONE                    , ///<  7
-	TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///<  8
-	TRACKDIR_BIT_Y_NW                    , ///<  9
-	TRACKDIR_BIT_NONE                    , ///< 10
-	TRACKDIR_BIT_NONE                    , ///< 11
-	TRACKDIR_BIT_X_NE                    , ///< 12
-	TRACKDIR_BIT_NONE                    , ///< 13
-	TRACKDIR_BIT_NONE                    , ///< 14
-	TRACKDIR_BIT_NONE                    , ///< 15
-};
--- a/src/yapf/yapf_costbase.hpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/yapf/yapf_costbase.hpp	Mon Mar 10 15:26:39 2008 +0000
@@ -4,8 +4,6 @@
 #define  YAPF_COSTBASE_HPP
 
 struct CYapfCostBase {
-	static const TrackdirBits   c_upwards_slopes[16];
-
 	FORCEINLINE static bool stSlopeCost(TileIndex tile, Trackdir td)
 	{
 		if (IsDiagonalTrackdir(td)) {
@@ -19,8 +17,8 @@
 			} else {
 				// not bridge ramp
 				if (IsTunnelTile(tile)) return false; // tunnel entry/exit doesn't slope
-				uint tile_slope = GetTileSlope(tile, NULL) & 0x0F;
-				if ((c_upwards_slopes[tile_slope] & TrackdirToTrackdirBits(td)) != 0) return true; // slopes uphill => apply penalty
+				Slope tile_slope = GetTileSlope(tile, NULL);
+				return IsUphillTrackdir(tile_slope, td); // slopes uphill => apply penalty
 			}
 		}
 		return false;
--- a/src/yapf/yapf_destrail.hpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/yapf/yapf_destrail.hpp	Mon Mar 10 15:26:39 2008 +0000
@@ -113,7 +113,7 @@
 			default:
 				m_destTile = v->dest_tile;
 				m_dest_station_id = INVALID_STATION;
-				m_destTrackdirs = (TrackdirBits)(GetTileTrackStatus(v->dest_tile, TRANSPORT_RAIL, 0) & TRACKDIR_BIT_MASK);
+				m_destTrackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_RAIL, 0));
 				break;
 		}
 		CYapfDestinationRailBase::SetDestination(v);
--- a/src/yapf/yapf_rail.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/yapf/yapf_rail.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -181,15 +181,15 @@
 		return next_trackdir;
 	}
 
-	static bool stCheckReverseTrain(Vehicle* v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2)
+	static bool stCheckReverseTrain(Vehicle* v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int reverse_penalty)
 	{
 		Tpf pf1;
-		bool result1 = pf1.CheckReverseTrain(v, t1, td1, t2, td2);
+		bool result1 = pf1.CheckReverseTrain(v, t1, td1, t2, td2, reverse_penalty);
 
 #if DEBUG_YAPF_CACHE
 		Tpf pf2;
 		pf2.DisableCache(true);
-		bool result2 = pf2.CheckReverseTrain(v, t1, td1, t2, td2);
+		bool result2 = pf2.CheckReverseTrain(v, t1, td1, t2, td2, reverse_penalty);
 		if (result1 != result2) {
 			DEBUG(yapf, 0, "CACHE ERROR: CheckReverseTrain() = [%s, %s]", result1 ? "T" : "F", result2 ? "T" : "F");
 		}
@@ -198,11 +198,11 @@
 		return result1;
 	}
 
-	FORCEINLINE bool CheckReverseTrain(Vehicle* v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2)
+	FORCEINLINE bool CheckReverseTrain(Vehicle* v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int reverse_penalty)
 	{
 		// create pathfinder instance
 		// set origin and destination nodes
-		Yapf().SetOrigin(t1, td1, t2, td2, 1, false);
+		Yapf().SetOrigin(t1, td1, t2, td2, reverse_penalty, false);
 		Yapf().SetDestination(v);
 
 		// find the best path
@@ -265,18 +265,49 @@
 
 bool YapfCheckReverseTrain(Vehicle* v)
 {
-	// tile where the engine is
-	TileIndex tile = v->tile;
-	// tile where we have last wagon
+	/* last wagon */
 	Vehicle* last_veh = GetLastVehicleInChain(v);
-	// if we are in tunnel then give up
-	if (v->u.rail.track == 0x40 || last_veh->u.rail.track == 0x40) return false;
+
 	// get trackdirs of both ends
 	Trackdir td = GetVehicleTrackdir(v);
 	Trackdir td_rev = ReverseTrackdir(GetVehicleTrackdir(last_veh));
 
+	/* tiles where front and back are */
+	TileIndex tile = v->tile;
+	TileIndex tile_rev = last_veh->tile;
 
-	typedef bool (*PfnCheckReverseTrain)(Vehicle*, TileIndex, Trackdir, TileIndex, Trackdir);
+	int reverse_penalty = 0;
+
+	if (v->u.rail.track == TRACK_BIT_WORMHOLE) {
+		/* front in tunnel / on bridge */
+		DiagDirection dir_into_wormhole = GetTunnelBridgeDirection(tile);
+
+		if (TrackdirToExitdir(td) == dir_into_wormhole) tile = GetOtherTunnelBridgeEnd(tile);
+		/* Now 'tile' is the tunnel entry/bridge ramp the train will reach when driving forward */
+
+		/* Current position of the train in the wormhole */
+		TileIndex cur_tile = TileVirtXY(v->x_pos, v->y_pos);
+
+		/* Add distance to drive in the wormhole as penalty for the forward path, i.e. bonus for the reverse path
+		 * Note: Negative penalties are ok for the start tile. */
+		reverse_penalty -= DistanceManhattan(cur_tile, tile) * YAPF_TILE_LENGTH;
+	}
+
+	if (last_veh->u.rail.track == TRACK_BIT_WORMHOLE) {
+		/* back in tunnel / on bridge */
+		DiagDirection dir_into_wormhole = GetTunnelBridgeDirection(tile_rev);
+
+		if (TrackdirToExitdir(td_rev) == dir_into_wormhole) tile_rev = GetOtherTunnelBridgeEnd(tile_rev);
+		/* Now 'tile_rev' is the tunnel entry/bridge ramp the train will reach when reversing */
+
+		/* Current position of the last wagon in the wormhole */
+		TileIndex cur_tile = TileVirtXY(last_veh->x_pos, last_veh->y_pos);
+
+		/* Add distance to drive in the wormhole as penalty for the revere path. */
+		reverse_penalty += DistanceManhattan(cur_tile, tile_rev) * YAPF_TILE_LENGTH;
+	}
+
+	typedef bool (*PfnCheckReverseTrain)(Vehicle*, TileIndex, Trackdir, TileIndex, Trackdir, int);
 	PfnCheckReverseTrain pfnCheckReverseTrain = CYapfRail1::stCheckReverseTrain;
 
 	// check if non-default YAPF type needed
@@ -284,7 +315,10 @@
 		pfnCheckReverseTrain = &CYapfRail2::stCheckReverseTrain; // Trackdir, forbid 90-deg
 	}
 
-	bool reverse = pfnCheckReverseTrain(v, tile, td, last_veh->tile, td_rev);
+	/* slightly hackish: If the pathfinders finds a path, the cost of the first node is tested to distinguish between forward- and reverse-path. */
+	if (reverse_penalty == 0) reverse_penalty = 1;
+
+	bool reverse = pfnCheckReverseTrain(v, tile, td, tile_rev, td_rev, reverse_penalty);
 
 	return reverse;
 }
--- a/src/yapf/yapf_road.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/yapf/yapf_road.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -268,15 +268,13 @@
 		// our source tile will be the next vehicle tile (should be the given one)
 		TileIndex src_tile = tile;
 		// get available trackdirs on the start tile
-		uint ts = GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
-		TrackdirBits src_trackdirs = (TrackdirBits)(ts & TRACKDIR_BIT_MASK);
+		TrackdirBits src_trackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes));
 		// select reachable trackdirs only
 		src_trackdirs &= DiagdirReachesTrackdirs(enterdir);
 
 		// get available trackdirs on the destination tile
 		TileIndex dest_tile = v->dest_tile;
-		uint dest_ts = GetTileTrackStatus(dest_tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
-		TrackdirBits dest_trackdirs = (TrackdirBits)(dest_ts & TRACKDIR_BIT_MASK);
+		TrackdirBits dest_trackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(dest_tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes));
 
 		// set origin and destination nodes
 		Yapf().SetOrigin(src_tile, src_trackdirs);
@@ -320,8 +318,7 @@
 
 		// set destination tile, trackdir
 		//   get available trackdirs on the destination tile
-		uint dest_ts = GetTileTrackStatus(dst_tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
-		TrackdirBits dst_td_bits = (TrackdirBits)(dest_ts & TRACKDIR_BIT_MASK);
+		TrackdirBits dst_td_bits = TrackStatusToTrackdirBits(GetTileTrackStatus(dst_tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes));
 		Yapf().SetDestination(dst_tile, dst_td_bits);
 
 		// find the best path
@@ -345,7 +342,7 @@
 		// set origin (tile, trackdir)
 		TileIndex src_tile = v->tile;
 		Trackdir src_td = GetVehicleTrackdir(v);
-		if ((GetTileTrackStatus(src_tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes) & TrackdirToTrackdirBits(src_td)) == 0) {
+		if ((TrackStatusToTrackdirBits(GetTileTrackStatus(src_tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes)) & TrackdirToTrackdirBits(src_td)) == 0) {
 			// sometimes the roadveh is not on the road (it resides on non-existing track)
 			// how should we handle that situation?
 			return false;
@@ -438,7 +435,7 @@
 {
 	TileIndex tile = v->tile;
 	Trackdir trackdir = GetVehicleTrackdir(v);
-	if ((GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes) & TrackdirToTrackdirBits(trackdir)) == 0)
+	if ((TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes)) & TrackdirToTrackdirBits(trackdir)) == 0)
 		return NULL;
 
 	// handle the case when our vehicle is already in the depot tile
--- a/src/yapf/yapf_ship.cpp	Sun Feb 03 20:34:26 2008 +0000
+++ b/src/yapf/yapf_ship.cpp	Mon Mar 10 15:26:39 2008 +0000
@@ -53,7 +53,7 @@
 		// convert origin trackdir to TrackdirBits
 		TrackdirBits trackdirs = TrackdirToTrackdirBits(trackdir);
 		// get available trackdirs on the destination tile
-		TrackdirBits dest_trackdirs = (TrackdirBits)(GetTileTrackStatus(v->dest_tile, TRANSPORT_WATER, 0) & TRACKDIR_BIT_MASK);
+		TrackdirBits dest_trackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_WATER, 0));
 
 		// create pathfinder instance
 		Tpf pf;