(svn r13473) [NoAI] -Sync: with r13417:13472. noai
authorglx
Wed, 11 Jun 2008 15:23:32 +0000
branchnoai
changeset 10920 e33442a2b239
parent 10918 317f736e5fc6
child 10921 f50864092014
(svn r13473) [NoAI] -Sync: with r13417:13472.
bin/data/openttdd.grf
bin/data/openttdw.grf
src/blitter/32bpp_optimized.cpp
src/blitter/32bpp_optimized.hpp
src/bridge_gui.cpp
src/bridge_map.h
src/core/alloc_func.hpp
src/dock_gui.cpp
src/driver.cpp
src/driver.h
src/lang/english.txt
src/main_gui.cpp
src/network/network.cpp
src/network/network.h
src/network/network_gui.cpp
src/network/network_udp.cpp
src/newgrf.cpp
src/newgrf_industries.cpp
src/news_gui.cpp
src/order_gui.cpp
src/pathfind.cpp
src/rail.h
src/roadveh_cmd.cpp
src/ship_cmd.cpp
src/station_cmd.cpp
src/table/bridge_land.h
src/table/files.h
src/table/railtypes.h
src/table/sprites.h
src/town_map.h
src/train_cmd.cpp
src/tunnelbridge_cmd.cpp
src/water_cmd.cpp
src/win32.cpp
src/yapf/follow_track.hpp
src/yapf/yapf_ship.cpp
Binary file bin/data/openttdd.grf has changed
Binary file bin/data/openttdw.grf has changed
--- a/src/blitter/32bpp_optimized.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/blitter/32bpp_optimized.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -10,7 +10,7 @@
 
 static FBlitter_32bppOptimized iFBlitter_32bppOptimized;
 
-void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
+template <BlitterMode mode, ZoomLevel zoom> inline void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp)
 {
 	const SpriteLoader::CommonPixel *src, *src_line;
 	uint32 *dst, *dst_line;
@@ -66,6 +66,27 @@
 	}
 }
 
+template <BlitterMode mode> inline void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, ZoomLevel zoom)
+{
+	switch (zoom) {
+		default: NOT_REACHED();
+		case ZOOM_LVL_NORMAL: Draw<mode, ZOOM_LVL_NORMAL>(bp); return;
+		case ZOOM_LVL_OUT_2X: Draw<mode, ZOOM_LVL_OUT_2X>(bp); return;
+		case ZOOM_LVL_OUT_4X: Draw<mode, ZOOM_LVL_OUT_4X>(bp); return;
+		case ZOOM_LVL_OUT_8X: Draw<mode, ZOOM_LVL_OUT_8X>(bp); return;
+	}
+}
+
+void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
+{
+	switch (mode) {
+		default: NOT_REACHED();
+		case BM_NORMAL:       Draw<BM_NORMAL>      (bp, zoom); return;
+		case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP>(bp, zoom); return;
+		case BM_TRANSPARENT:  Draw<BM_TRANSPARENT> (bp, zoom); return;
+	}
+}
+
 Sprite *Blitter_32bppOptimized::Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator)
 {
 	Sprite *dest_sprite;
--- a/src/blitter/32bpp_optimized.hpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/blitter/32bpp_optimized.hpp	Wed Jun 11 15:23:32 2008 +0000
@@ -14,6 +14,9 @@
 	/* virtual */ Sprite *Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator);
 
 	/* virtual */ const char *GetName() { return "32bpp-optimized"; }
+
+	template <BlitterMode mode, ZoomLevel zoom> void Draw(Blitter::BlitterParams *bp);
+	template <BlitterMode mode> void Draw(Blitter::BlitterParams *bp, ZoomLevel zoom);
 };
 
 class FBlitter_32bppOptimized: public BlitterFactory<FBlitter_32bppOptimized> {
--- a/src/bridge_gui.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/bridge_gui.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -119,6 +119,7 @@
 	{
 		this->bridges->SetListing(this->last_sorting);
 		this->bridges->SetSortFuncs(this->sorter_funcs);
+		this->bridges->NeedResort();
 		this->SortBridgeList();
 
 		/* Change the data, or the caption of the gui. Set it to road or rail, accordingly */
--- a/src/bridge_map.h	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/bridge_map.h	Wed Jun 11 15:23:32 2008 +0000
@@ -200,5 +200,15 @@
 	MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_RAIL, r);
 }
 
+/**
+ * Make a bridge ramp for aqueducts.
+ * @param t          the tile to make a bridge ramp
+ * @param o          the new owner of the bridge ramp
+ * @param d          the direction this ramp must be facing
+ */
+static inline void MakeAqueductBridgeRamp(TileIndex t, Owner o, DiagDirection d)
+{
+	MakeBridgeRamp(t, o, 0, d, TRANSPORT_WATER, 0);
+}
 
 #endif /* BRIDGE_MAP_H */
--- a/src/core/alloc_func.hpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/core/alloc_func.hpp	Wed Jun 11 15:23:32 2008 +0000
@@ -90,4 +90,7 @@
 	return t_ptr;
 }
 
+/** alloca() has to be called in the parent function, so define AllocaM() as a macro */
+#define AllocaM(T, num_elements) ((T*)alloca((num_elements) * sizeof(T)))
+
 #endif /* ALLOC_FUNC_HPP */
--- a/src/dock_gui.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/dock_gui.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -69,6 +69,12 @@
 	DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_LOCK | CMD_MSG(STR_CANT_BUILD_LOCKS));
 }
 
+static void PlaceDocks_Bridge(TileIndex tile)
+{
+	VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_BUILD_BRIDGE);
+}
+
+
 /** Enum referring to the widgets of the build dock toolbar */
 enum DockToolbarWidgets {
 	DTW_BEGIN = 0,                 ///< Start of toolbar widgets
@@ -83,6 +89,7 @@
 	DTW_DEPOT,                     ///< Build depot button
 	DTW_STATION,                   ///< Build station button
 	DTW_BUOY,                      ///< Build buoy button
+	DTW_BUILD_BRIDGE,              ///< Build bride button
 	DTW_END,                       ///< End of toolbar widgets
 };
 
@@ -120,6 +127,11 @@
 	HandlePlacePushButton(w, DTW_BUOY, SPR_CURSOR_BOUY, VHM_RECT, PlaceDocks_Buoy);
 }
 
+static void BuildDocksClick_Bridge(Window *w)
+{
+	HandlePlacePushButton(w, DTW_BUILD_BRIDGE, SPR_CURSOR_BRIDGE, VHM_RECT, PlaceDocks_Bridge);
+}
+
 
 typedef void OnButtonClick(Window *w);
 static OnButtonClick * const _build_docks_button_proc[] = {
@@ -129,7 +141,8 @@
 	BuildDocksClick_Demolish,
 	BuildDocksClick_Depot,
 	BuildDocksClick_Dock,
-	BuildDocksClick_Buoy
+	BuildDocksClick_Buoy,
+	BuildDocksClick_Bridge
 };
 
 struct BuildDocksToolbarWindow : Window {
@@ -164,6 +177,7 @@
 			case '4': BuildDocksClick_Depot(this); break;
 			case '5': BuildDocksClick_Dock(this); break;
 			case '6': BuildDocksClick_Buoy(this); break;
+			case '7': BuildDocksClick_Bridge(this); break;
 			default:  return ES_NOT_HANDLED;
 		}
 		return ES_HANDLED;
@@ -183,6 +197,11 @@
 	{
 		if (pt.x != -1) {
 			switch (select_proc) {
+				case DDSP_BUILD_BRIDGE:
+					ResetObjectToPlace();
+					extern void CcBuildBridge(bool success, TileIndex tile, uint32 p1, uint32 p2);
+					DoCommandP(end_tile, start_tile, TRANSPORT_WATER << 15, CcBuildBridge, CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
+
 				case DDSP_DEMOLISH_AREA:
 					GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
 					break;
@@ -214,8 +233,8 @@
 
 static const Widget _build_docks_toolb_widgets[] = {
 {   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},                   // DTW_CLOSEBOX
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   123,     0,    13, STR_9801_DOCK_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},         // DTW_CAPTION
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   124,   135,     0,    13, 0x0,                        STR_STICKY_BUTTON},                       // DTW_STICKY
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   166,     0,    13, STR_9801_DOCK_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},         // DTW_CAPTION
+{  WWT_STICKYBOX,   RESIZE_NONE,     7,   167,   178,     0,    13, 0x0,                        STR_STICKY_BUTTON},                       // DTW_STICKY
 {     WWT_IMGBTN,   RESIZE_NONE,     7,     0,    21,    14,    35, SPR_IMG_BUILD_CANAL,        STR_BUILD_CANALS_TIP},                    // DTW_CANAL
 {     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_BUILD_LOCK,         STR_BUILD_LOCKS_TIP},                     // DTW_LOCK
 
@@ -225,11 +244,12 @@
 {     WWT_IMGBTN,   RESIZE_NONE,     7,    70,    91,    14,    35, SPR_IMG_SHIP_DEPOT,         STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING},  // DTW_DEPOT
 {     WWT_IMGBTN,   RESIZE_NONE,     7,    92,   113,    14,    35, SPR_IMG_SHIP_DOCK,          STR_981D_BUILD_SHIP_DOCK},                // DTW_STATION
 {     WWT_IMGBTN,   RESIZE_NONE,     7,   114,   135,    14,    35, SPR_IMG_BOUY,               STR_9834_POSITION_BUOY_WHICH_CAN},        // DTW_BUOY
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   136,   178,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_ROAD_BRIDGE},              // DTW_BUILD_BRIDGE
 {   WIDGETS_END},
 };
 
 static const WindowDesc _build_docks_toolbar_desc = {
-	WDP_ALIGN_TBR, 22, 136, 36, 136, 36,
+	WDP_ALIGN_TBR, 22, 179, 36, 179, 36,
 	WC_BUILD_TOOLBAR, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_build_docks_toolb_widgets,
--- a/src/driver.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/driver.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -183,3 +183,18 @@
 
 	return p;
 }
+
+/** Frees memory used for this->name
+ */
+DriverFactoryBase::~DriverFactoryBase() {
+	if (this->name == NULL) return;
+
+	/* Prefix the name with driver type to make it unique */
+	char buf[32];
+	strecpy(buf, GetDriverTypeName(type), lastof(buf));
+	strecpy(buf + 5, this->name, lastof(buf));
+
+	GetDrivers().erase(buf);
+	if (GetDrivers().empty()) delete &GetDrivers();
+	free(this->name);
+}
--- a/src/driver.h	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/driver.h	Wed Jun 11 15:23:32 2008 +0000
@@ -67,20 +67,7 @@
 		name(NULL)
 	{}
 
-	/** Frees memory used for this->name
-	 */
-	virtual ~DriverFactoryBase() {
-		if (this->name == NULL) return;
-
-		/* Prefix the name with driver type to make it unique */
-		char buf[32];
-		strecpy(buf, GetDriverTypeName(type), lastof(buf));
-		strecpy(buf + 5, this->name, lastof(buf));
-
-		GetDrivers().erase(buf);
-		if (GetDrivers().empty()) delete &GetDrivers();
-		free(this->name);
-	}
+	virtual ~DriverFactoryBase();
 
 	/** Shuts down all active drivers
 	 */
--- a/src/lang/english.txt	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/lang/english.txt	Wed Jun 11 15:23:32 2008 +0000
@@ -2663,14 +2663,17 @@
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Train in the way
 STR_8804                                                        :{SETX 10}{COMMA}: {STRING4} {STRING2}
 STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING4} {STRING2}
+STR_ORDER_NON_STOP                                              :{BLACK}Non-stop
 STR_ORDER_GO_TO                                                 :Go to
 STR_ORDER_GO_NON_STOP_TO                                        :Go non-stop to
 STR_ORDER_GO_VIA                                                :Go via
 STR_ORDER_GO_NON_STOP_VIA                                       :Go non-stop via
+STR_ORDER_TOGGLE_FULL_LOAD                                      :{BLACK}Full load any cargo
 STR_ORDER_DROP_LOAD_IF_POSSIBLE                                 :Load if available
 STR_ORDER_DROP_FULL_LOAD_ALL                                    :Full load all cargo
 STR_ORDER_DROP_FULL_LOAD_ANY                                    :Full load any cargo
 STR_ORDER_DROP_NO_LOADING                                       :No loading
+STR_ORDER_TOGGLE_UNLOAD                                         :{BLACK}Unload all
 STR_ORDER_DROP_UNLOAD_IF_ACCEPTED                               :Unload if accepted
 STR_ORDER_DROP_UNLOAD                                           :Unload all
 STR_ORDER_DROP_TRANSFER                                         :Transfer
--- a/src/main_gui.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/main_gui.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -290,7 +290,7 @@
 
 			case '1' | WKC_ALT: // Gimme money
 				/* Server can not cheat in advertise mode either! */
-				if (!_networking || !_network_server || !_network_advertise)
+				if (!_networking || !_network_server || !_settings_client.network.server_advertise)
 					DoCommandP(0, 10000000, 0, NULL, CMD_MONEY_CHEAT);
 				break;
 
--- a/src/network/network.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/network/network.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -45,7 +45,6 @@
 bool _network_server;     ///< network-server is active
 bool _network_available;  ///< is network mode available?
 bool _network_dedicated;  ///< are we a dedicated server?
-bool _network_advertise;  ///< is the server advertising to the master server?
 bool _is_network_server;  ///< Does this client wants to be a network-server?
 NetworkServerGameInfo _network_game_info;
 NetworkPlayerInfo _network_player_info[MAX_PLAYERS];
@@ -1110,7 +1109,7 @@
 		}
 	}
 
-	if (_network_advertise) NetworkUDPRemoveAdvertise();
+	if (_settings_client.network.server_advertise) NetworkUDPRemoveAdvertise();
 
 	DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
 
--- a/src/network/network.h	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/network/network.h	Wed Jun 11 15:23:32 2008 +0000
@@ -16,7 +16,6 @@
 extern bool _network_server;     ///< network-server is active
 extern bool _network_available;  ///< is network mode available?
 extern bool _network_dedicated;  ///< are we a dedicated server?
-extern bool _network_advertise;  ///< is the server advertising to the master server?
 extern bool _is_network_server;  ///< Does this client wants to be a network-server?
 
 #else /* ENABLE_NETWORK */
@@ -29,7 +28,6 @@
 #define _network_server 0
 #define _network_available 0
 #define _network_dedicated 0
-#define _network_advertise 0
 #define _is_network_server 0
 
 #endif /* ENABLE_NETWORK */
--- a/src/network/network_gui.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/network/network_gui.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -686,7 +686,7 @@
 		const FiosItem *item;
 
 		/* draw basic widgets */
-		SetDParam(1, _connection_types_dropdown[_network_advertise]);
+		SetDParam(1, _connection_types_dropdown[_settings_client.network.server_advertise]);
 		SetDParam(2, _settings_client.network.max_clients);
 		SetDParam(3, _settings_client.network.max_companies);
 		SetDParam(4, _settings_client.network.max_spectators);
@@ -748,7 +748,7 @@
 			} break;
 
 			case NSSW_CONNTYPE_BTN: // Connection type
-				ShowDropDownMenu(this, _connection_types_dropdown, _network_advertise, NSSW_CONNTYPE_BTN, 0, 0); // do it for widget NSSW_CONNTYPE_BTN
+				ShowDropDownMenu(this, _connection_types_dropdown, _settings_client.network.server_advertise, NSSW_CONNTYPE_BTN, 0, 0); // do it for widget NSSW_CONNTYPE_BTN
 				break;
 
 			case NSSW_CLIENTS_BTND:    case NSSW_CLIENTS_BTNU:    // Click on up/down button for number of clients
@@ -836,7 +836,7 @@
 	{
 		switch (widget) {
 			case NSSW_CONNTYPE_BTN:
-				_network_advertise = (index != 0);
+				_settings_client.network.server_advertise = (index != 0);
 				break;
 			case NSSW_LANGUAGE_BTN:
 				_settings_client.network.server_lang = _language_dropdown[index] - STR_NETWORK_LANG_ANY;
--- a/src/network/network_udp.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/network/network_udp.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -52,7 +52,7 @@
 	DEBUG(net, 2, "[udp] advertising on master server successful");
 
 	/* We are advertised, but we don't want to! */
-	if (!_network_advertise) NetworkUDPRemoveAdvertise();
+	if (!_settings_client.network.server_advertise) NetworkUDPRemoveAdvertise();
 }
 
 ///*** Communication with clients (we are server) ***/
@@ -562,7 +562,7 @@
 	struct sockaddr_in out_addr;
 
 	/* Check if we should send an advertise */
-	if (!_networking || !_network_server || !_network_udp_server || !_network_advertise)
+	if (!_networking || !_network_server || !_network_udp_server || !_settings_client.network.server_advertise)
 		return;
 
 	/* check for socket */
--- a/src/newgrf.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/newgrf.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -1538,6 +1538,14 @@
 				ret = true;
 			} break;
 
+			case 0x21: // long introduction year
+				housespec->min_year = grf_load_word(&buf);
+				break;
+
+			case 0x22: // long maximum year
+				housespec->max_year = grf_load_word(&buf);
+				break;
+
 			default:
 				ret = true;
 				break;
@@ -2938,7 +2946,7 @@
 		}
 	}
 
-	EngineID *engines = (EngineID*)alloca(idcount * sizeof(*engines));
+	EngineID *engines = AllocaM(EngineID, idcount);
 	for (uint i = 0; i < idcount; i++) {
 		engines[i] = GetNewEngine(_cur_grffile, (VehicleType)feature, grf_load_byte(&buf))->index;
 		if (!wagover) last_engines[i] = engines[i];
@@ -2988,7 +2996,7 @@
 
 static void CanalMapSpriteGroup(byte *buf, uint8 idcount)
 {
-	CanalFeature *cfs = (CanalFeature*)alloca(idcount * sizeof(*cfs));
+	CanalFeature *cfs = AllocaM(CanalFeature, idcount);
 	for (uint i = 0; i < idcount; i++) {
 		cfs[i] = (CanalFeature)grf_load_byte(&buf);
 	}
@@ -3014,7 +3022,7 @@
 
 static void StationMapSpriteGroup(byte *buf, uint8 idcount)
 {
-	uint8 *stations = (uint8*)alloca(idcount * sizeof(*stations));
+	uint8 *stations = AllocaM(uint8, idcount);
 	for (uint i = 0; i < idcount; i++) {
 		stations[i] = grf_load_byte(&buf);
 	}
@@ -3061,7 +3069,7 @@
 
 static void TownHouseMapSpriteGroup(byte *buf, uint8 idcount)
 {
-	uint8 *houses = (uint8*)alloca(idcount * sizeof(*houses));
+	uint8 *houses = AllocaM(uint8, idcount);
 	for (uint i = 0; i < idcount; i++) {
 		houses[i] = grf_load_byte(&buf);
 	}
@@ -3087,7 +3095,7 @@
 
 static void IndustryMapSpriteGroup(byte *buf, uint8 idcount)
 {
-	uint8 *industries = (uint8*)alloca(idcount * sizeof(*industries));
+	uint8 *industries = AllocaM(uint8, idcount);
 	for (uint i = 0; i < idcount; i++) {
 		industries[i] = grf_load_byte(&buf);
 	}
@@ -3113,7 +3121,7 @@
 
 static void IndustrytileMapSpriteGroup(byte *buf, uint8 idcount)
 {
-	uint8 *indtiles = (uint8*)alloca(idcount * sizeof(*indtiles));
+	uint8 *indtiles = AllocaM(uint8, idcount);
 	for (uint i = 0; i < idcount; i++) {
 		indtiles[i] = grf_load_byte(&buf);
 	}
@@ -3139,7 +3147,7 @@
 
 static void CargoMapSpriteGroup(byte *buf, uint8 idcount)
 {
-	CargoID *cargos = (CargoID*)alloca(idcount * sizeof(*cargos));
+	CargoID *cargos = AllocaM(CargoID, idcount);
 	for (uint i = 0; i < idcount; i++) {
 		cargos[i] = grf_load_byte(&buf);
 	}
@@ -3425,28 +3433,28 @@
 
 	static const Action5Type action5_types[] = {
 		/* Note: min_sprites should not be changed. Therefore these constants are directly here and not in sprites.h */
-		/* 0x00 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x00"             },
-		/* 0x01 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x01"             },
-		/* 0x02 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x02"             },
-		/* 0x03 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x03"             },
-		/* 0x04 */ { A5BLOCK_FIXED,        SPR_SIGNALS_BASE,   48, PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT,    "Signal graphics"       },
-		/* 0x05 */ { A5BLOCK_FIXED,        SPR_ELRAIL_BASE,    48, ELRAIL_SPRITE_COUNT,                         "Catenary graphics"     },
-		/* 0x06 */ { A5BLOCK_FIXED,        SPR_SLOPES_BASE,    74, NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT, "Foundation graphics"   },
-		/* 0x07 */ { A5BLOCK_INVALID,      0,                  75, 0,                                           "TTDP GUI graphics"     }, // Not used by OTTD.
-		/* 0x08 */ { A5BLOCK_FIXED,        SPR_CANALS_BASE,    65, CANALS_SPRITE_COUNT,                         "Canal graphics"        },
-		/* 0x09 */ { A5BLOCK_FIXED,        SPR_ONEWAY_BASE,     6, ONEWAY_SPRITE_COUNT,                         "One way road graphics" },
-		/* 0x0A */ { A5BLOCK_FIXED,        SPR_2CCMAP_BASE,   256, TWOCCMAP_SPRITE_COUNT,                       "2CC colour maps"       },
-		/* 0x0B */ { A5BLOCK_FIXED,        SPR_TRAMWAY_BASE,  113, TRAMWAY_SPRITE_COUNT,                        "Tramway graphics"      },
-		/* 0x0C */ { A5BLOCK_INVALID,      0,                 133, 0,                                           "Snowy temperate tree"  }, // Not yet used by OTTD.
-		/* 0x0D */ { A5BLOCK_FIXED,        SPR_SHORE_BASE,     16, SPR_SHORE_SPRITE_COUNT,                      "Shore graphics"        },
-		/* 0x0E */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "New Signals graphics"  }, // Not yet used by OTTD.
-		/* 0x0F */ { A5BLOCK_INVALID,      0,                  12, 0,                                           "Sloped rail track"     }, // Not yet used by OTTD.
-		/* 0x10 */ { A5BLOCK_FIXED,        SPR_AIRPORTX_BASE,  15, AIRPORTX_SPRITE_COUNT,                       "Airport graphics"      },
-		/* 0x11 */ { A5BLOCK_FIXED,        SPR_ROADSTOP_BASE,   8, ROADSTOP_SPRITE_COUNT,                       "Road stop graphics"    },
-		/* 0x12 */ { A5BLOCK_INVALID,      0,                   8, 0,                                           "Aqueduct graphics"     }, // Not yet used by OTTD.
-		/* 0x13 */ { A5BLOCK_FIXED,        SPR_AUTORAIL_BASE,  55, AUTORAIL_SPRITE_COUNT,                       "Autorail graphics"     },
-		/* 0x14 */ { A5BLOCK_ALLOW_OFFSET, SPR_FLAGS_BASE,      1, FLAGS_SPRITE_COUNT,                          "Flag graphics"         },
-		/* 0x15 */ { A5BLOCK_ALLOW_OFFSET, SPR_OPENTTD_BASE,    1, OPENTTD_SPRITE_COUNT,                        "OpenTTD GUI graphics"  },
+		/* 0x00 */ { A5BLOCK_INVALID,      0,                            0, 0,                                           "Type 0x00"             },
+		/* 0x01 */ { A5BLOCK_INVALID,      0,                            0, 0,                                           "Type 0x01"             },
+		/* 0x02 */ { A5BLOCK_INVALID,      0,                            0, 0,                                           "Type 0x02"             },
+		/* 0x03 */ { A5BLOCK_INVALID,      0,                            0, 0,                                           "Type 0x03"             },
+		/* 0x04 */ { A5BLOCK_FIXED,        SPR_SIGNALS_BASE,            48, PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT,    "Signal graphics"       },
+		/* 0x05 */ { A5BLOCK_FIXED,        SPR_ELRAIL_BASE,             48, ELRAIL_SPRITE_COUNT,                         "Catenary graphics"     },
+		/* 0x06 */ { A5BLOCK_FIXED,        SPR_SLOPES_BASE,             74, NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT, "Foundation graphics"   },
+		/* 0x07 */ { A5BLOCK_INVALID,      0,                           75, 0,                                           "TTDP GUI graphics"     }, // Not used by OTTD.
+		/* 0x08 */ { A5BLOCK_FIXED,        SPR_CANALS_BASE,             65, CANALS_SPRITE_COUNT,                         "Canal graphics"        },
+		/* 0x09 */ { A5BLOCK_FIXED,        SPR_ONEWAY_BASE,              6, ONEWAY_SPRITE_COUNT,                         "One way road graphics" },
+		/* 0x0A */ { A5BLOCK_FIXED,        SPR_2CCMAP_BASE,            256, TWOCCMAP_SPRITE_COUNT,                       "2CC colour maps"       },
+		/* 0x0B */ { A5BLOCK_FIXED,        SPR_TRAMWAY_BASE,           113, TRAMWAY_SPRITE_COUNT,                        "Tramway graphics"      },
+		/* 0x0C */ { A5BLOCK_INVALID,      0,                          133, 0,                                           "Snowy temperate tree"  }, // Not yet used by OTTD.
+		/* 0x0D */ { A5BLOCK_FIXED,        SPR_SHORE_BASE,              16, SPR_SHORE_SPRITE_COUNT,                      "Shore graphics"        },
+		/* 0x0E */ { A5BLOCK_INVALID,      0,                            0, 0,                                           "New Signals graphics"  }, // Not yet used by OTTD.
+		/* 0x0F */ { A5BLOCK_FIXED,        SPR_TRACKS_FOR_SLOPES_BASE,  12, TRACKS_FOR_SLOPES_SPRITE_COUNT,              "Sloped rail track"     },
+		/* 0x10 */ { A5BLOCK_FIXED,        SPR_AIRPORTX_BASE,           15, AIRPORTX_SPRITE_COUNT,                       "Airport graphics"      },
+		/* 0x11 */ { A5BLOCK_FIXED,        SPR_ROADSTOP_BASE,            8, ROADSTOP_SPRITE_COUNT,                       "Road stop graphics"    },
+		/* 0x12 */ { A5BLOCK_FIXED,        SPR_AQUEDUCT_BASE,            8, AQUEDUCT_SPRITE_COUNT,                       "Aqueduct graphics"     },
+		/* 0x13 */ { A5BLOCK_FIXED,        SPR_AUTORAIL_BASE,           55, AUTORAIL_SPRITE_COUNT,                       "Autorail graphics"     },
+		/* 0x14 */ { A5BLOCK_ALLOW_OFFSET, SPR_FLAGS_BASE,               1, FLAGS_SPRITE_COUNT,                          "Flag graphics"         },
+		/* 0x15 */ { A5BLOCK_ALLOW_OFFSET, SPR_OPENTTD_BASE,             1, OPENTTD_SPRITE_COUNT,                        "OpenTTD GUI graphics"  },
 	};
 
 	if (!check_length(len, 2, "GraphicsNew")) return;
--- a/src/newgrf_industries.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/newgrf_industries.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -265,6 +265,8 @@
 			return industry->founder | (is_ai ? 0x10000 : 0) | (colours << 24);
 		}
 
+		case 0x46: return industry->construction_date; // Date when built - long format - (in days)
+
 		/* Get industry ID at offset param */
 		case 0x60: return GetIndustryIDAtOffset(GetNearbyTile(parameter, industry->xy), industry);
 
--- a/src/news_gui.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/news_gui.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -528,7 +528,7 @@
 		MoveToNextItem();
 	}
 
-	if ((_current_news == ni) && (FindWindowById(WC_MESSAGE_HISTORY, 0) != NULL)) {
+	if ((_current_news == ni) && (FindWindowById(WC_NEWS_WINDOW, 0) != NULL)) {
 		/* about to remove the currently displayed item; also skip */
 		MoveToNextItem();
 	}
--- a/src/order_gui.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/order_gui.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -43,10 +43,13 @@
 	ORDER_WIDGET_SCROLLBAR,
 	ORDER_WIDGET_SKIP,
 	ORDER_WIDGET_DELETE,
+	ORDER_WIDGET_NON_STOP_DROPDOWN,
 	ORDER_WIDGET_NON_STOP,
+	ORDER_WIDGET_GOTO_DROPDOWN,
 	ORDER_WIDGET_GOTO,
-	ORDER_WIDGET_GOTO_DROPDOWN,
+	ORDER_WIDGET_FULL_LOAD_DROPDOWN,
 	ORDER_WIDGET_FULL_LOAD,
+	ORDER_WIDGET_UNLOAD_DROPDOWN,
 	ORDER_WIDGET_UNLOAD,
 	ORDER_WIDGET_REFIT,
 	ORDER_WIDGET_SERVICE,
@@ -444,13 +447,7 @@
 		if (order == NULL || order->GetLoadType() == load_type) return;
 
 		if (load_type < 0) {
-			switch (order->GetLoadType()) {
-				case OLF_LOAD_IF_POSSIBLE: load_type = OLFB_FULL_LOAD;       break;
-				case OLFB_FULL_LOAD:       load_type = OLF_FULL_LOAD_ANY;    break;
-				case OLF_FULL_LOAD_ANY:    load_type = OLFB_NO_LOAD;         break;
-				case OLFB_NO_LOAD:         load_type = OLF_LOAD_IF_POSSIBLE; break;
-				default: NOT_REACHED();
-			}
+			load_type = order->GetLoadType() == OLF_LOAD_IF_POSSIBLE ? OLF_FULL_LOAD_ANY : OLF_LOAD_IF_POSSIBLE;
 		}
 		DoCommandP(w->vehicle->tile, w->vehicle->index + (sel_ord << 16), MOF_LOAD | (load_type << 4), NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
 	}
@@ -507,13 +504,7 @@
 		if (order == NULL || order->GetUnloadType() == unload_type) return;
 
 		if (unload_type < 0) {
-			switch (order->GetUnloadType()) {
-				case OUF_UNLOAD_IF_POSSIBLE: unload_type = OUFB_UNLOAD;            break;
-				case OUFB_UNLOAD:            unload_type = OUFB_TRANSFER;          break;
-				case OUFB_TRANSFER:          unload_type = OUFB_NO_UNLOAD;         break;
-				case OUFB_NO_UNLOAD:         unload_type = OUF_UNLOAD_IF_POSSIBLE; break;
-				default: NOT_REACHED();
-			}
+			unload_type = order->GetUnloadType() == OUF_UNLOAD_IF_POSSIBLE ? OUFB_UNLOAD : OUF_UNLOAD_IF_POSSIBLE;
 		}
 
 		DoCommandP(w->vehicle->tile, w->vehicle->index + (sel_ord << 16), MOF_UNLOAD | (unload_type << 4), NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
@@ -534,9 +525,10 @@
 
 		/* Keypress if negative, so 'toggle' to the next */
 		if (non_stop < 0) {
-			non_stop = (order->GetNonStopType() + 1) % ONSF_END;
+			non_stop = order->GetNonStopType() ^ ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS;
 		}
 
+		w->InvalidateWidget(ORDER_WIDGET_NON_STOP);
 		DoCommandP(w->vehicle->tile, w->vehicle->index + (sel_ord << 16), MOF_NON_STOP | non_stop << 4,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
 	}
 
@@ -631,9 +623,6 @@
 
 		if (this->vehicle->owner == _local_player) {
 			/* Set the strings for the dropdown boxes. */
-			this->widget[ORDER_WIDGET_NON_STOP].data        = _order_non_stop_drowdown[order == NULL ? 0 : order->GetNonStopType()];
-			this->widget[ORDER_WIDGET_FULL_LOAD].data       = _order_full_load_drowdown[order == NULL ? 0 : order->GetLoadType()];
-			this->widget[ORDER_WIDGET_UNLOAD].data          = _order_unload_drowdown[order == NULL ? 0 : order->GetUnloadType()];
 			this->widget[ORDER_WIDGET_COND_VARIABLE].data   = _order_conditional_variable[order == NULL ? 0 : order->GetConditionVariable()];
 			this->widget[ORDER_WIDGET_COND_COMPARATOR].data = _order_conditional_condition[order == NULL ? 0 : order->GetConditionComparator()];
 
@@ -646,8 +635,11 @@
 
 			/* non-stop only for trains */
 			this->SetWidgetDisabledState(ORDER_WIDGET_NON_STOP,  (this->vehicle->type != VEH_TRAIN && this->vehicle->type != VEH_ROAD) || order == NULL);
+			this->SetWidgetDisabledState(ORDER_WIDGET_NON_STOP_DROPDOWN, this->IsWidgetDisabled(ORDER_WIDGET_NON_STOP));
 			this->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, order == NULL || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) != 0); // full load
+			this->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD_DROPDOWN, this->IsWidgetDisabled(ORDER_WIDGET_FULL_LOAD));
 			this->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD,    order == NULL || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) != 0); // unload
+			this->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD_DROPDOWN, this->IsWidgetDisabled(ORDER_WIDGET_UNLOAD));
 			/* Disable list of vehicles with the same shared orders if there is no list */
 			this->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || this->vehicle->orders == NULL);
 			this->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
@@ -660,35 +652,53 @@
 			this->HideWidget(ORDER_WIDGET_COND_VALUE);
 		}
 
+		this->ShowWidget(ORDER_WIDGET_NON_STOP_DROPDOWN);
 		this->ShowWidget(ORDER_WIDGET_NON_STOP);
+		this->ShowWidget(ORDER_WIDGET_UNLOAD_DROPDOWN);
 		this->ShowWidget(ORDER_WIDGET_UNLOAD);
+		this->ShowWidget(ORDER_WIDGET_FULL_LOAD_DROPDOWN);
 		this->ShowWidget(ORDER_WIDGET_FULL_LOAD);
 
+		this->RaiseWidget(ORDER_WIDGET_NON_STOP);
+		this->RaiseWidget(ORDER_WIDGET_FULL_LOAD);
+		this->RaiseWidget(ORDER_WIDGET_UNLOAD);
+
 		if (order != NULL) {
+			this->SetWidgetLoweredState(ORDER_WIDGET_NON_STOP, order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS);
 			switch (order->GetType()) {
 				case OT_GOTO_STATION:
-					if (!GetStation(order->GetDestination())->IsBuoy()) break;
+					if (!GetStation(order->GetDestination())->IsBuoy()) {
+						this->SetWidgetLoweredState(ORDER_WIDGET_FULL_LOAD, order->GetLoadType() == OLF_FULL_LOAD_ANY);
+						this->SetWidgetLoweredState(ORDER_WIDGET_UNLOAD, order->GetUnloadType() == OUFB_UNLOAD);
+						break;
+					}
 					/* Fall-through */
 
 				case OT_GOTO_WAYPOINT:
+					this->DisableWidget(ORDER_WIDGET_FULL_LOAD_DROPDOWN);
 					this->DisableWidget(ORDER_WIDGET_FULL_LOAD);
+					this->DisableWidget(ORDER_WIDGET_UNLOAD_DROPDOWN);
 					this->DisableWidget(ORDER_WIDGET_UNLOAD);
 					break;
 
 				case OT_GOTO_DEPOT:
-					this->DisableWidget(ORDER_WIDGET_FULL_LOAD);
-
 					/* Remove unload and replace it with refit */
+					this->HideWidget(ORDER_WIDGET_UNLOAD_DROPDOWN);
 					this->HideWidget(ORDER_WIDGET_UNLOAD);
+					this->HideWidget(ORDER_WIDGET_FULL_LOAD_DROPDOWN);
+					this->HideWidget(ORDER_WIDGET_FULL_LOAD);
 					this->ShowWidget(ORDER_WIDGET_REFIT);
-					this->HideWidget(ORDER_WIDGET_FULL_LOAD);
 					this->ShowWidget(ORDER_WIDGET_SERVICE);
+					this->SetWidgetLoweredState(ORDER_WIDGET_SERVICE, order->GetDepotOrderType() & ODTFB_SERVICE);
 					break;
 
 				case OT_CONDITIONAL: {
+					this->HideWidget(ORDER_WIDGET_NON_STOP_DROPDOWN);
 					this->HideWidget(ORDER_WIDGET_NON_STOP);
 					this->HideWidget(ORDER_WIDGET_UNLOAD);
+					this->HideWidget(ORDER_WIDGET_UNLOAD_DROPDOWN);
 					this->HideWidget(ORDER_WIDGET_FULL_LOAD);
+					this->HideWidget(ORDER_WIDGET_FULL_LOAD_DROPDOWN);
 					this->ShowWidget(ORDER_WIDGET_COND_VARIABLE);
 					this->ShowWidget(ORDER_WIDGET_COND_COMPARATOR);
 					this->ShowWidget(ORDER_WIDGET_COND_VALUE);
@@ -703,8 +713,11 @@
 				} break;
 
 				default: // every other orders
+					this->DisableWidget(ORDER_WIDGET_NON_STOP_DROPDOWN);
 					this->DisableWidget(ORDER_WIDGET_NON_STOP);
+					this->DisableWidget(ORDER_WIDGET_FULL_LOAD_DROPDOWN);
 					this->DisableWidget(ORDER_WIDGET_FULL_LOAD);
+					this->DisableWidget(ORDER_WIDGET_UNLOAD_DROPDOWN);
 					this->DisableWidget(ORDER_WIDGET_UNLOAD);
 			}
 		}
@@ -790,9 +803,13 @@
 				OrderClick_Delete(this, 0);
 				break;
 
-			case ORDER_WIDGET_NON_STOP: {
+			case ORDER_WIDGET_NON_STOP:
+				OrderClick_Nonstop(this, -1);
+				break;
+
+			case ORDER_WIDGET_NON_STOP_DROPDOWN: {
 				const Order *o = GetVehicleOrder(this->vehicle, this->OrderGetSel());
-				ShowDropDownMenu(this, _order_non_stop_drowdown, o->GetNonStopType(), ORDER_WIDGET_NON_STOP, 0, o->IsType(OT_GOTO_STATION) ? 0 : (o->IsType(OT_GOTO_WAYPOINT) ? 3 : 12));
+				ShowDropDownMenu(this, _order_non_stop_drowdown, o->GetNonStopType(), ORDER_WIDGET_NON_STOP_DROPDOWN, 0, o->IsType(OT_GOTO_STATION) ? 0 : (o->IsType(OT_GOTO_WAYPOINT) ? 3 : 12));
 			} break;
 
 			case ORDER_WIDGET_GOTO:
@@ -800,15 +817,23 @@
 				break;
 
 			case ORDER_WIDGET_GOTO_DROPDOWN:
-				ShowDropDownMenu(this, this->vehicle->type == VEH_AIRCRAFT ? _order_goto_dropdown_aircraft : _order_goto_dropdown, 0, ORDER_WIDGET_GOTO, 0, 0, this->widget[ORDER_WIDGET_GOTO_DROPDOWN].right - this->widget[ORDER_WIDGET_GOTO].left);
+				ShowDropDownMenu(this, this->vehicle->type == VEH_AIRCRAFT ? _order_goto_dropdown_aircraft : _order_goto_dropdown, 0, ORDER_WIDGET_GOTO_DROPDOWN, 0, 0);
 				break;
 
 			case ORDER_WIDGET_FULL_LOAD:
-				ShowDropDownMenu(this, _order_full_load_drowdown, GetVehicleOrder(this->vehicle, this->OrderGetSel())->GetLoadType(), ORDER_WIDGET_FULL_LOAD, 0, 2);
+				OrderClick_FullLoad(this, -1);
+				break;
+
+			case ORDER_WIDGET_FULL_LOAD_DROPDOWN:
+				ShowDropDownMenu(this, _order_full_load_drowdown, GetVehicleOrder(this->vehicle, this->OrderGetSel())->GetLoadType(), ORDER_WIDGET_FULL_LOAD_DROPDOWN, 0, 2);
 				break;
 
 			case ORDER_WIDGET_UNLOAD:
-				ShowDropDownMenu(this, _order_unload_drowdown, GetVehicleOrder(this->vehicle, this->OrderGetSel())->GetUnloadType(), ORDER_WIDGET_UNLOAD, 0, 8);
+				OrderClick_Unload(this, -1);
+				break;
+
+			case ORDER_WIDGET_UNLOAD_DROPDOWN:
+				ShowDropDownMenu(this, _order_unload_drowdown, GetVehicleOrder(this->vehicle, this->OrderGetSel())->GetUnloadType(), ORDER_WIDGET_UNLOAD_DROPDOWN, 0, 8);
 				break;
 
 			case ORDER_WIDGET_REFIT:
@@ -871,25 +896,21 @@
 	virtual void OnDropdownSelect(int widget, int index)
 	{
 		switch (widget) {
-			case ORDER_WIDGET_NON_STOP:
+			case ORDER_WIDGET_NON_STOP_DROPDOWN:
 				OrderClick_Nonstop(this, index);
 				break;
 
-			case ORDER_WIDGET_FULL_LOAD:
+			case ORDER_WIDGET_FULL_LOAD_DROPDOWN:
 				OrderClick_FullLoad(this, index);
 				break;
 
-			case ORDER_WIDGET_UNLOAD:
+			case ORDER_WIDGET_UNLOAD_DROPDOWN:
 				OrderClick_Unload(this, index);
 				break;
 
-			case ORDER_WIDGET_GOTO:
+			case ORDER_WIDGET_GOTO_DROPDOWN:
 				switch (index) {
-					case 0:
-						this->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
-						OrderClick_Goto(this, 0);
-						break;
-
+					case 0: OrderClick_Goto(this, 0); break;
 					case 1: OrderClick_NearestDepot(this, 0); break;
 					case 2: OrderClick_Conditional(this, 0); break;
 					default: NOT_REACHED();
@@ -1040,11 +1061,14 @@
 
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   123,    88,    99, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
-	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   123,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_NON_STOP},          // ORDER_WIDGET_NON_STOP
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   123,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_NON_STOP},          // ORDER_WIDGET_NON_STOP_DROPDOWN
+	{    WWT_TEXTBTN,   RESIZE_TB,      14,     0,   111,    76,    87, STR_ORDER_NON_STOP,      STR_ORDER_TOOLTIP_NON_STOP},          // ORDER_WIDGET_NON_STOP
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,   248,   371,    88,    99, STR_EMPTY,               STR_ORDER_GO_TO_DROPDOWN_TOOLTIP},    // ORDER_WIDGET_GOTO_DROPDOWN
 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   359,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
-	{   WWT_DROPDOWN,   RESIZE_TB,      14,   360,   371,    88,    99, STR_EMPTY,               STR_ORDER_GO_TO_DROPDOWN_TOOLTIP},    // ORDER_WIDGET_GOTO_DROPDOWN
-	{   WWT_DROPDOWN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD
-	{   WWT_DROPDOWN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD_DROPDOWN
+	{    WWT_TEXTBTN,   RESIZE_TB,      14,   124,   235,    76,    87, STR_ORDER_TOGGLE_FULL_LOAD, STR_ORDER_TOOLTIP_FULL_LOAD},      // ORDER_WIDGET_FULL_LOAD
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD_DROPDOWN
+	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   359,    76,    87, STR_ORDER_TOGGLE_UNLOAD, STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_SERVICE,             STR_SERVICE_HINT},                    // ORDER_WIDGET_SERVICE
 
@@ -1080,11 +1104,14 @@
 
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   123,    88,    99, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
+	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP_DROPDOWN
 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,   248,   371,    88,    99, STR_EMPTY,               STR_ORDER_GO_TO_DROPDOWN_TOOLTIP},    // ORDER_WIDGET_GOTO_DROPDOWN
 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   359,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
-	{   WWT_DROPDOWN,   RESIZE_TB,      14,   360,   371,    88,    99, STR_EMPTY,               STR_ORDER_GO_TO_DROPDOWN_TOOLTIP},    // ORDER_WIDGET_GOTO_DROPDOWN
-	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   185,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD
-	{   WWT_DROPDOWN,   RESIZE_TB,      14,   186,   371,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   185,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD_DROPDOWN
+	{    WWT_TEXTBTN,   RESIZE_TB,      14,     0,   173,    76,    87, STR_ORDER_TOGGLE_FULL_LOAD, STR_ORDER_TOOLTIP_FULL_LOAD},      // ORDER_WIDGET_FULL_LOAD
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,   186,   371,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD_DROPDOWN
+	{    WWT_TEXTBTN,   RESIZE_TB,      14,   186,   359,    76,    87, STR_ORDER_TOGGLE_UNLOAD, STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   185,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   186,   371,    76,    87, STR_SERVICE,             STR_SERVICE_HINT},                    // ORDER_WIDGET_SERVICE
 
@@ -1120,10 +1147,13 @@
 
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SKIP
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_DELETE
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_NON_STOP_DROPDOWN
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_NON_STOP
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO_DROPDOWN
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO_DROPDOWN
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD_DROPDOWN
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD_DROPDOWN
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SERVICE
--- a/src/pathfind.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/pathfind.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -112,9 +112,28 @@
 
 static void TPFModeShip(TrackPathFinder* tpf, TileIndex tile, DiagDirection direction)
 {
-	RememberData rd;
+	assert(tpf->tracktype == TRANSPORT_WATER);
 
-	assert(tpf->tracktype == TRANSPORT_WATER);
+	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
+		/* wrong track type */
+		if (GetTunnelBridgeTransportType(tile) != tpf->tracktype) return;
+
+		DiagDirection dir = GetTunnelBridgeDirection(tile);
+		/* entering tunnel / bridge? */
+		if (dir == direction) {
+			TileIndex endtile = GetOtherTunnelBridgeEnd(tile);
+
+			tpf->rd.cur_length += GetTunnelBridgeLength(tile, endtile) + 1;
+
+			TPFSetTileBit(tpf, tile, 14);
+			TPFSetTileBit(tpf, endtile, 14);
+
+			tile = endtile;
+		} else {
+			/* leaving tunnel / bridge? */
+			if (ReverseDiagDir(dir) != direction) return;
+		}
+	}
 
 	/* This addition will sometimes overflow by a single tile.
 	 * The use of TILE_MASK here makes sure that we still point at a valid
@@ -133,7 +152,7 @@
 	do {
 		Track track = RemoveFirstTrack(&bits);
 		if (bits != TRACK_BIT_NONE) only_one_track = false;
-		rd = tpf->rd;
+		RememberData rd = tpf->rd;
 
 		/* Change direction 4 times only */
 		if (!only_one_track && track != tpf->rd.last_choosen_track) {
--- a/src/rail.h	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/rail.h	Wed Jun 11 15:23:32 2008 +0000
@@ -38,6 +38,7 @@
 		SpriteID single_s;     ///< single piece of rail in the southern corner
 		SpriteID single_e;     ///< single piece of rail in the eastern corner
 		SpriteID single_w;     ///< single piece of rail in the western corner
+		SpriteID single_sloped;///< single piecs of rail for slopes
 		SpriteID crossing;     ///< level crossing, rail in X direction
 		SpriteID tunnel;       ///< tunnel sprites base
 	} base_sprites;
--- a/src/roadveh_cmd.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/roadveh_cmd.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -195,7 +195,7 @@
 	uint num_vehicles = 1 + CountArticulatedParts(p1, false);
 
 	/* Allow for the front and the articulated parts, plus one to "terminate" the list. */
-	Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
+	Vehicle **vl = AllocaM(Vehicle*, num_vehicles + 1);
 	memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
 
 	if (!Vehicle::AllocateList(vl, num_vehicles)) {
--- a/src/ship_cmd.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/ship_cmd.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -600,90 +600,102 @@
 	BeginVehicleMove(v);
 
 	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
-	if (gp.old_tile == gp.new_tile) {
-		/* Staying in tile */
-		if (v->IsInDepot()) {
-			gp.x = v->x_pos;
-			gp.y = v->y_pos;
-		} else {
-			/* Not inside depot */
-			r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
-			if (HasBit(r, VETS_CANNOT_ENTER)) goto reverse_direction;
+	if (v->u.ship.state != TRACK_BIT_WORMHOLE) {
+		/* Not on a bridge */
+		if (gp.old_tile == gp.new_tile) {
+			/* Staying in tile */
+			if (v->IsInDepot()) {
+				gp.x = v->x_pos;
+				gp.y = v->y_pos;
+			} else {
+				/* Not inside depot */
+				r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
+				if (HasBit(r, VETS_CANNOT_ENTER)) goto reverse_direction;
 
-			/* A leave station order only needs one tick to get processed, so we can
-			 * always skip ahead. */
-			if (v->current_order.IsType(OT_LEAVESTATION)) {
-				v->current_order.Free();
-				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
-			} else if (v->dest_tile != 0) {
-				/* We have a target, let's see if we reached it... */
-				if (v->current_order.IsType(OT_GOTO_STATION) &&
-						IsBuoyTile(v->dest_tile) &&
-						DistanceManhattan(v->dest_tile, gp.new_tile) <= 3) {
-					/* We got within 3 tiles of our target buoy, so let's skip to our
-					 * next order */
-					UpdateVehicleTimetable(v, true);
-					v->cur_order_index++;
-					v->current_order.MakeDummy();
-					InvalidateVehicleOrder(v);
-				} else {
-					/* Non-buoy orders really need to reach the tile */
-					if (v->dest_tile == gp.new_tile) {
-						if (v->current_order.IsType(OT_GOTO_DEPOT)) {
-							if ((gp.x & 0xF) == 8 && (gp.y & 0xF) == 8) {
-								VehicleEnterDepot(v);
-								return;
-							}
-						} else if (v->current_order.IsType(OT_GOTO_STATION)) {
-							v->last_station_visited = v->current_order.GetDestination();
+				/* A leave station order only needs one tick to get processed, so we can
+				* always skip ahead. */
+				if (v->current_order.IsType(OT_LEAVESTATION)) {
+					v->current_order.Free();
+					InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
+				} else if (v->dest_tile != 0) {
+					/* We have a target, let's see if we reached it... */
+					if (v->current_order.IsType(OT_GOTO_STATION) &&
+							IsBuoyTile(v->dest_tile) &&
+							DistanceManhattan(v->dest_tile, gp.new_tile) <= 3) {
+						/* We got within 3 tiles of our target buoy, so let's skip to our
+						* next order */
+						UpdateVehicleTimetable(v, true);
+						v->cur_order_index++;
+						v->current_order.MakeDummy();
+						InvalidateVehicleOrder(v);
+					} else {
+						/* Non-buoy orders really need to reach the tile */
+						if (v->dest_tile == gp.new_tile) {
+							if (v->current_order.IsType(OT_GOTO_DEPOT)) {
+								if ((gp.x & 0xF) == 8 && (gp.y & 0xF) == 8) {
+									VehicleEnterDepot(v);
+									return;
+								}
+							} else if (v->current_order.IsType(OT_GOTO_STATION)) {
+								v->last_station_visited = v->current_order.GetDestination();
 
-							/* Process station in the orderlist. */
-							Station *st = GetStation(v->current_order.GetDestination());
-							if (st->facilities & FACIL_DOCK) { // ugly, ugly workaround for problem with ships able to drop off cargo at wrong stations
-								ShipArrivesAt(v, st);
-								v->BeginLoading();
-							} else { // leave stations without docks right aways
-								v->current_order.MakeLeaveStation();
-								v->cur_order_index++;
-								InvalidateVehicleOrder(v);
+								/* Process station in the orderlist. */
+								Station *st = GetStation(v->current_order.GetDestination());
+								if (st->facilities & FACIL_DOCK) { // ugly, ugly workaround for problem with ships able to drop off cargo at wrong stations
+									ShipArrivesAt(v, st);
+									v->BeginLoading();
+								} else { // leave stations without docks right aways
+									v->current_order.MakeLeaveStation();
+									v->cur_order_index++;
+									InvalidateVehicleOrder(v);
+								}
 							}
 						}
 					}
 				}
 			}
+		} else {
+			DiagDirection diagdir;
+			/* New tile */
+			if (TileX(gp.new_tile) >= MapMaxX() || TileY(gp.new_tile) >= MapMaxY()) {
+				goto reverse_direction;
+			}
+
+			dir = ShipGetNewDirectionFromTiles(gp.new_tile, gp.old_tile);
+			assert(dir == DIR_NE || dir == DIR_SE || dir == DIR_SW || dir == DIR_NW);
+			diagdir = DirToDiagDir(dir);
+			tracks = GetAvailShipTracks(gp.new_tile, diagdir);
+			if (tracks == TRACK_BIT_NONE) goto reverse_direction;
+
+			/* Choose a direction, and continue if we find one */
+			track = ChooseShipTrack(v, gp.new_tile, diagdir, tracks);
+			if (track == INVALID_TRACK) goto reverse_direction;
+
+			b = _ship_subcoord[diagdir][track];
+
+			gp.x = (gp.x & ~0xF) | b[0];
+			gp.y = (gp.y & ~0xF) | b[1];
+
+			/* Call the landscape function and tell it that the vehicle entered the tile */
+			r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
+			if (HasBit(r, VETS_CANNOT_ENTER)) goto reverse_direction;
+
+			if (!HasBit(r, VETS_ENTERED_WORMHOLE)) {
+				v->tile = gp.new_tile;
+				v->u.ship.state = TrackToTrackBits(track);
+			}
+
+			v->direction = (Direction)b[2];
 		}
 	} else {
-		DiagDirection diagdir;
-		/* New tile */
-		if (TileX(gp.new_tile) >= MapMaxX() || TileY(gp.new_tile) >= MapMaxY()) {
-			goto reverse_direction;
+		/* On a bridge */
+		if (!IsTileType(gp.new_tile, MP_TUNNELBRIDGE) || !HasBit(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
+			v->x_pos = gp.x;
+			v->y_pos = gp.y;
+			VehiclePositionChanged(v);
+			if (!(v->vehstatus & VS_HIDDEN)) EndVehicleMove(v);
+			return;
 		}
-
-		dir = ShipGetNewDirectionFromTiles(gp.new_tile, gp.old_tile);
-		assert(dir == DIR_NE || dir == DIR_SE || dir == DIR_SW || dir == DIR_NW);
-		diagdir = DirToDiagDir(dir);
-		tracks = GetAvailShipTracks(gp.new_tile, diagdir);
-		if (tracks == TRACK_BIT_NONE) goto reverse_direction;
-
-		/* Choose a direction, and continue if we find one */
-		track = ChooseShipTrack(v, gp.new_tile, diagdir, tracks);
-		if (track == INVALID_TRACK) goto reverse_direction;
-
-		b = _ship_subcoord[diagdir][track];
-
-		gp.x = (gp.x & ~0xF) | b[0];
-		gp.y = (gp.y & ~0xF) | b[1];
-
-		/* Call the landscape function and tell it that the vehicle entered the tile */
-		r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
-		if (HasBit(r, VETS_CANNOT_ENTER)) goto reverse_direction;
-
-		if (!HasBit(r, VETS_ENTERED_WORMHOLE)) {
-			v->tile = gp.new_tile;
-			v->u.ship.state = TrackToTrackBits(track);
-		}
-
-		v->direction = (Direction)b[2];
 	}
 
 	/* update image of ship, as well as delta XY */
--- a/src/station_cmd.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/station_cmd.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -1013,7 +1013,7 @@
 		tile_delta = (axis == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
 		track = AxisToTrack(axis);
 
-		layout_ptr = (byte*)alloca(numtracks * plat_len);
+		layout_ptr = AllocaM(byte, numtracks * plat_len);
 		GetStationLayout(layout_ptr, numtracks, plat_len, statspec);
 
 		numtracks_orig = numtracks;
--- a/src/table/bridge_land.h	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/table/bridge_land.h	Wed Jun 11 15:23:32 2008 +0000
@@ -28,6 +28,12 @@
 # define MW(a) {a, PALETTE_TO_STRUCT_WHITE}
 # define MC(a) {a, PALETTE_TO_STRUCT_CONCRETE}
 
+static const PalSpriteID _aqueduct_sprites[] = {
+	{ SPR_AQUEDUCT_MIDDLE_X, PAL_NONE }, {                  0x0, PAL_NONE }, { SPR_AQUEDUCT_PILLAR_X, PAL_NONE }, {                  0x0, PAL_NONE },
+	{ SPR_AQUEDUCT_MIDDLE_Y, PAL_NONE }, {                  0x0, PAL_NONE }, { SPR_AQUEDUCT_PILLAR_Y, PAL_NONE }, {                  0x0, PAL_NONE },
+	{  SPR_AQUEDUCT_RAMP_SW, PAL_NONE }, { SPR_AQUEDUCT_RAMP_SE, PAL_NONE }, {  SPR_AQUEDUCT_RAMP_NE, PAL_NONE }, { SPR_AQUEDUCT_RAMP_NW, PAL_NONE },
+};
+
 static const PalSpriteID _bridge_sprite_table_4_0[] = {
 	{  0x9A9, PAL_NONE }, {  0x99F, PAL_NONE }, {  0x9B1, PAL_NONE }, {    0x0, PAL_NONE },
 	{  0x9A5, PAL_NONE }, {  0x997, PAL_NONE }, {  0x9AD, PAL_NONE }, {    0x0, PAL_NONE },
--- a/src/table/files.h	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/table/files.h	Wed Jun 11 15:23:32 2008 +0000
@@ -35,7 +35,7 @@
 		{ "TRGT.GRF",      {0xfc, 0xde, 0x1d, 0x7e, 0x8a, 0x74, 0x19, 0x7d, 0x72, 0xa6, 0x26, 0x95, 0x88, 0x4b, 0x90, 0x9e} }
 	},
 	{ "SAMPLE.CAT",    {0x42, 0x2e, 0xa3, 0xdd, 0x07, 0x4d, 0x28, 0x59, 0xbb, 0x51, 0x63, 0x9a, 0x6e, 0x0e, 0x85, 0xda} },
-	{ "OPENTTDD.GRF",  {0xb6, 0xed, 0x9a, 0x20, 0x89, 0xad, 0x6e, 0xa1, 0x55, 0x10, 0xad, 0x00, 0x53, 0xa3, 0xd5, 0xbc} }
+	{ "OPENTTDD.GRF",  {0x1e, 0x6c, 0x85, 0x87, 0xfa, 0x9c, 0x84, 0xed, 0x51, 0xc7, 0x96, 0x4c, 0x91, 0xcf, 0x61, 0xa4} }
 };
 
 
@@ -49,5 +49,5 @@
 		{ "TRGTR.GRF",     {0xde, 0x53, 0x65, 0x05, 0x17, 0xfe, 0x66, 0x1c, 0xea, 0xa3, 0x13, 0x8c, 0x6e, 0xdb, 0x0e, 0xb8} }
 	},
 	{ "SAMPLE.CAT",    {0x92, 0x12, 0xe8, 0x1e, 0x72, 0xba, 0xdd, 0x4b, 0xbe, 0x1e, 0xae, 0xae, 0x66, 0x45, 0x8e, 0x10} },
-	{ "OPENTTDW.GRF",  {0x41, 0x1e, 0xb6, 0xb2, 0xd2, 0xc4, 0x30, 0x6e, 0x7b, 0xc7, 0xdc, 0x39, 0xd4, 0x40, 0x46, 0xfb} }
+	{ "OPENTTDW.GRF",  {0x08, 0x2b, 0x0e, 0x53, 0x1a, 0x4e, 0x02, 0xb2, 0x1a, 0x87, 0x52, 0x08, 0x64, 0xab, 0xf8, 0xf4} }
 };
--- a/src/table/railtypes.h	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/table/railtypes.h	Wed Jun 11 15:23:32 2008 +0000
@@ -14,6 +14,7 @@
 	{ /* Main Sprites */
 		{ SPR_RAIL_TRACK_Y, SPR_RAIL_TRACK_N_S, SPR_RAIL_TRACK_BASE, SPR_RAIL_SINGLE_Y, SPR_RAIL_SINGLE_X,
 			SPR_RAIL_SINGLE_NORTH, SPR_RAIL_SINGLE_SOUTH, SPR_RAIL_SINGLE_EAST, SPR_RAIL_SINGLE_WEST,
+			SPR_TRACKS_FOR_SLOPES_RAIL_BASE,
 			SPR_CROSSING_OFF_X_RAIL,
 			SPR_TUNNEL_ENTRY_REAR_RAIL
 		},
@@ -69,6 +70,7 @@
 	{ /* Main Sprites */
 		{ SPR_RAIL_TRACK_Y, SPR_RAIL_TRACK_N_S, SPR_RAIL_TRACK_BASE, SPR_RAIL_SINGLE_Y, SPR_RAIL_SINGLE_X,
 			SPR_RAIL_SINGLE_NORTH, SPR_RAIL_SINGLE_SOUTH, SPR_RAIL_SINGLE_EAST, SPR_RAIL_SINGLE_WEST,
+			SPR_TRACKS_FOR_SLOPES_RAIL_BASE,
 			SPR_CROSSING_OFF_X_RAIL,
 			SPR_TUNNEL_ENTRY_REAR_RAIL
 		},
@@ -128,6 +130,7 @@
 	{ /* Main Sprites */
 		{ SPR_MONO_TRACK_Y, SPR_MONO_TRACK_N_S, SPR_MONO_TRACK_BASE, SPR_MONO_SINGLE_Y, SPR_MONO_SINGLE_X,
 			SPR_MONO_SINGLE_NORTH, SPR_MONO_SINGLE_SOUTH, SPR_MONO_SINGLE_EAST, SPR_MONO_SINGLE_WEST,
+			SPR_TRACKS_FOR_SLOPES_MONO_BASE,
 			SPR_CROSSING_OFF_X_MONO,
 			SPR_TUNNEL_ENTRY_REAR_MONO
 		},
@@ -183,6 +186,7 @@
 	{ /* Main sprites */
 		{ SPR_MGLV_TRACK_Y, SPR_MGLV_TRACK_N_S, SPR_MGLV_TRACK_BASE, SPR_MGLV_SINGLE_Y, SPR_MGLV_SINGLE_X,
 			SPR_MGLV_SINGLE_NORTH, SPR_MGLV_SINGLE_SOUTH, SPR_MGLV_SINGLE_EAST, SPR_MGLV_SINGLE_WEST,
+			SPR_TRACKS_FOR_SLOPES_MAGLEV_BASE,
 			SPR_CROSSING_OFF_X_MAGLEV,
 			SPR_TUNNEL_ENTRY_REAR_MAGLEV
 		},
--- a/src/table/sprites.h	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/table/sprites.h	Wed Jun 11 15:23:32 2008 +0000
@@ -132,7 +132,24 @@
 	SPR_CANALS_BASE   = SPR_SIGNALS_BASE + PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT,
 	CANALS_SPRITE_COUNT = 65,
 
-	SPR_SLOPES_BASE              = SPR_CANALS_BASE + CANALS_SPRITE_COUNT,
+	SPR_AQUEDUCT_BASE     = SPR_CANALS_BASE + CANALS_SPRITE_COUNT,
+	SPR_AQUEDUCT_RAMP_SW  = SPR_AQUEDUCT_BASE + 0,
+	SPR_AQUEDUCT_RAMP_SE  = SPR_AQUEDUCT_BASE + 1,
+	SPR_AQUEDUCT_RAMP_NE  = SPR_AQUEDUCT_BASE + 2,
+	SPR_AQUEDUCT_RAMP_NW  = SPR_AQUEDUCT_BASE + 3,
+	SPR_AQUEDUCT_MIDDLE_X = SPR_AQUEDUCT_BASE + 4,
+	SPR_AQUEDUCT_MIDDLE_Y = SPR_AQUEDUCT_BASE + 5,
+	SPR_AQUEDUCT_PILLAR_X = SPR_AQUEDUCT_BASE + 6,
+	SPR_AQUEDUCT_PILLAR_Y = SPR_AQUEDUCT_BASE + 7,
+	AQUEDUCT_SPRITE_COUNT = 8,
+
+ 	SPR_TRACKS_FOR_SLOPES_BASE        = SPR_AQUEDUCT_BASE + AQUEDUCT_SPRITE_COUNT,
+	SPR_TRACKS_FOR_SLOPES_RAIL_BASE   = SPR_AQUEDUCT_BASE + 0,
+	SPR_TRACKS_FOR_SLOPES_MONO_BASE   = SPR_AQUEDUCT_BASE + 4,
+	SPR_TRACKS_FOR_SLOPES_MAGLEV_BASE = SPR_AQUEDUCT_BASE + 8,
+	TRACKS_FOR_SLOPES_SPRITE_COUNT = 12,
+
+	SPR_SLOPES_BASE              = SPR_TRACKS_FOR_SLOPES_BASE + TRACKS_FOR_SLOPES_SPRITE_COUNT,
 	SPR_SLOPES_INCLINED_OFFSET   = 15,
 	SPR_SLOPES_VIRTUAL_BASE      = SPR_SLOPES_BASE - SPR_SLOPES_INCLINED_OFFSET, // The original foundations (see SPR_FOUNDATION_BASE below) are mapped before the additional foundations.
 	SPR_TRKFOUND_BLOCK_SIZE      = 22, // The normal track foundation sprites are organized in blocks of 22.
--- a/src/town_map.h	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/town_map.h	Wed Jun 11 15:23:32 2008 +0000
@@ -265,7 +265,7 @@
 }
 
 /**
- * Set the year that this house was constructed (between 1920 and 2175).
+ * Set the year that this house was constructed.
  * @param t the tile of this house
  * @param year the year to set
  * @pre IsTileType(t, MP_HOUSE) && IsHouseCompleted(t)
@@ -273,11 +273,11 @@
 static inline void SetHouseConstructionYear(TileIndex t, Year year)
 {
 	assert(IsTileType(t, MP_HOUSE) && IsHouseCompleted(t));
-	_m[t].m5 = Clamp(year - ORIGINAL_BASE_YEAR, 0, 0xFF);
+	_m[t].m5 = Clamp(year - GetHouseSpecs(GetHouseType(t))->min_year, 0, 0xFF);
 }
 
 /**
- * Get the year that this house was constructed (between 1920 and 2175).
+ * Get the year that this house was constructed.
  * @param t the tile of this house
  * @pre IsTileType(t, MP_HOUSE)
  * @return year
@@ -285,7 +285,7 @@
 static inline Year GetHouseConstructionYear(TileIndex t)
 {
 	assert(IsTileType(t, MP_HOUSE));
-	return IsHouseCompleted(t) ? _m[t].m5 + ORIGINAL_BASE_YEAR : 0;
+	return IsHouseCompleted(t) ? _m[t].m5 + GetHouseSpecs(GetHouseType(t))->min_year : 0;
 }
 
 /**
--- a/src/train_cmd.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/train_cmd.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -550,7 +550,7 @@
 		if (!IsCompatibleRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR;
 
 		/* Allow for the wagon and the articulated parts, plus one to "terminate" the list. */
-		Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
+		Vehicle **vl = AllocaM(Vehicle*, num_vehicles + 1);
 		memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
 
 		if (!Vehicle::AllocateList(vl, num_vehicles))
@@ -717,7 +717,7 @@
 		if (!HasPowerOnRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR;
 
 		/* Allow for the dual-heads and the articulated parts, plus one to "terminate" the list. */
-		Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
+		Vehicle **vl = AllocaM(Vehicle*, num_vehicles + 1);
 		memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
 
 		if (!Vehicle::AllocateList(vl, num_vehicles)) {
--- a/src/tunnelbridge_cmd.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/tunnelbridge_cmd.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -227,9 +227,11 @@
 			if (!ValParamRailtype(railtype)) return CMD_ERROR;
 			break;
 
+		case TRANSPORT_WATER:
+			break;
+
 		default:
-			/* For now, only TRANSPORT_RAIL and TRANSPORT_ROAD are allowed.
-			 * But let not this stops us for preparing the future */
+			/* Airports don't have tunnels. */
 			return CMD_ERROR;
 	}
 
@@ -250,9 +252,11 @@
 		return_cmd_error(STR_500A_START_AND_END_MUST_BE_IN);
 	}
 
-	/* set and test bridge length, availability */
 	bridge_len = sx + sy - x - y - 1;
-	if (!CheckBridge_Stuff(bridge_type, bridge_len)) return_cmd_error(STR_5015_CAN_T_BUILD_BRIDGE_HERE);
+	if (transport_type != TRANSPORT_WATER) {
+		/* set and test bridge length, availability */
+		if (!CheckBridge_Stuff(bridge_type, bridge_len)) return_cmd_error(STR_5015_CAN_T_BUILD_BRIDGE_HERE);
+	}
 
 	/* retrieve landscape height and ensure it's on land */
 	tile_start = TileXY(x, y);
@@ -311,7 +315,7 @@
 	} else {
 		/* Build a new bridge. */
 
-		bool allow_on_slopes = _settings_game.construction.build_on_slopes;
+		bool allow_on_slopes = (_settings_game.construction.build_on_slopes && transport_type != TRANSPORT_WATER);
 
 		/* Try and clear the start landscape */
 		ret = DoCommand(tile_start, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
@@ -331,6 +335,8 @@
 		if (CmdFailed(terraform_cost_south) || (terraform_cost_south.GetCost() != 0 && !allow_on_slopes))
 			return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 		cost.AddCost(terraform_cost_south);
+
+		if (transport_type == TRANSPORT_WATER && (tileh_start == SLOPE_FLAT || tileh_end == SLOPE_FLAT)) return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 	}
 
 	if (!replace_bridge) {
@@ -368,6 +374,11 @@
 				MakeRoadBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), roadtypes);
 				break;
 
+			case TRANSPORT_WATER:
+				MakeAqueductBridgeRamp(tile_start, owner, dir);
+				MakeAqueductBridgeRamp(tile_end,   owner, ReverseDiagDir(dir));
+				break;
+
 			default:
 				NOT_REACHED();
 				break;
@@ -445,6 +456,9 @@
 			bridge_len = CalcBridgeLenCostFactor(bridge_len);
 
 		cost.AddCost((int64)bridge_len * _price.build_bridge * GetBridgeSpec(bridge_type)->price >> 8);
+
+		/* Aqueducts are a little more expensive. */
+		if (transport_type == TRANSPORT_WATER) cost.AddCost((int64)bridge_len * _price.clear_water);
 	}
 
 	return cost;
@@ -926,7 +940,11 @@
 		if (ti->tileh == SLOPE_FLAT) base_offset += 4; // sloped bridge head
 
 		/* Table number 6 always refers to the bridge heads for any bridge type */
-		psid = &GetBridgeSpriteTable(GetBridgeType(ti->tile), 6)[base_offset];
+		if (transport_type != TRANSPORT_WATER) {
+			psid = &GetBridgeSpriteTable(GetBridgeType(ti->tile), 6)[base_offset];
+		} else {
+			psid = _aqueduct_sprites + base_offset;
+		}
 
 		if (!ice) {
 			DrawClearLandTile(ti, 3);
@@ -1023,7 +1041,7 @@
 	/* Z position of the bridge sprites relative to bridge height (downwards) */
 	static const int BRIDGE_Z_START = 3;
 
-	const PalSpriteID* psid;
+	const PalSpriteID *psid;
 	uint base_offset;
 	TileIndex rampnorth;
 	TileIndex rampsouth;
@@ -1048,13 +1066,17 @@
 	);
 	type = GetBridgeType(rampsouth);
 
-	if (transport_type == TRANSPORT_RAIL) {
-		base_offset = GetRailTypeInfo(GetRailType(rampsouth))->bridge_offset;
+	if (transport_type != TRANSPORT_WATER) {
+		if (transport_type == TRANSPORT_RAIL) {
+			base_offset = GetRailTypeInfo(GetRailType(rampsouth))->bridge_offset;
+		} else {
+			base_offset = 8;
+		}
+
+		psid = base_offset + GetBridgeSpriteTable(type, piece);
 	} else {
-		base_offset = 8;
+		psid = _aqueduct_sprites;
 	}
-
-	psid = base_offset + GetBridgeSpriteTable(type, piece);
 	if (axis != AXIS_X) psid += 4;
 
 	x = ti->x;
@@ -1342,7 +1364,7 @@
 		}
 	} else { // IsBridge(tile)
 
-		if (v->IsPrimaryVehicle()) {
+		if (v->IsPrimaryVehicle() && v->type != VEH_SHIP) {
 			/* modify speed of vehicle */
 			uint16 spd = GetBridgeSpec(GetBridgeType(tile))->speed;
 
@@ -1358,29 +1380,51 @@
 				case DIAGDIR_SW: if ((x & 0xF) != TILE_SIZE - 1) return VETSB_CONTINUE; break;
 				case DIAGDIR_NW: if ((y & 0xF) != 0)             return VETSB_CONTINUE; break;
 			}
-			if (v->type == VEH_TRAIN) {
-				v->u.rail.track = TRACK_BIT_WORMHOLE;
-				ClrBit(v->u.rail.flags, VRF_GOINGUP);
-				ClrBit(v->u.rail.flags, VRF_GOINGDOWN);
-			} else {
-				v->u.road.state = RVSB_WORMHOLE;
+			switch (v->type) {
+				case VEH_TRAIN:
+					v->u.rail.track = TRACK_BIT_WORMHOLE;
+					ClrBit(v->u.rail.flags, VRF_GOINGUP);
+					ClrBit(v->u.rail.flags, VRF_GOINGDOWN);
+					break;
+
+				case VEH_ROAD:
+					v->u.road.state = RVSB_WORMHOLE;
+					break;
+
+				case VEH_SHIP:
+					v->u.ship.state = TRACK_BIT_WORMHOLE;
+					break;
+
+				default: NOT_REACHED();
 			}
 			return VETSB_ENTERED_WORMHOLE;
 		} else if (DirToDiagDir(v->direction) == ReverseDiagDir(dir)) {
 			v->tile = tile;
-			if (v->type == VEH_TRAIN) {
-				if (v->u.rail.track == TRACK_BIT_WORMHOLE) {
-					v->u.rail.track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
-					return VETSB_ENTERED_WORMHOLE;
-				}
-			} else {
-				if (v->u.road.state == RVSB_WORMHOLE) {
-					v->u.road.state = _road_exit_tunnel_state[dir];
-					v->u.road.frame = 0;
-					return VETSB_ENTERED_WORMHOLE;
-				}
+			switch (v->type) {
+				case VEH_TRAIN:
+					if (v->u.rail.track == TRACK_BIT_WORMHOLE) {
+						v->u.rail.track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
+						return VETSB_ENTERED_WORMHOLE;
+					}
+					break;
+
+				case VEH_ROAD:
+					if (v->u.road.state == RVSB_WORMHOLE) {
+						v->u.road.state = _road_exit_tunnel_state[dir];
+						v->u.road.frame = 0;
+						return VETSB_ENTERED_WORMHOLE;
+					}
+					break;
+
+				case VEH_SHIP:
+					if (v->u.ship.state == TRACK_BIT_WORMHOLE) {
+						v->u.ship.state = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
+						return VETSB_ENTERED_WORMHOLE;
+					}
+					break;
+
+				default: NOT_REACHED();
 			}
-			return VETSB_CONTINUE;
 		}
 	}
 	return VETSB_CONTINUE;
@@ -1388,7 +1432,7 @@
 
 static CommandCost TerraformTile_TunnelBridge(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
 {
-	if (_settings_game.construction.build_on_slopes && AutoslopeEnabled() && IsBridge(tile)) {
+	if (_settings_game.construction.build_on_slopes && AutoslopeEnabled() && IsBridge(tile) && GetTunnelBridgeTransportType(tile) != TRANSPORT_WATER) {
 		DiagDirection direction = GetTunnelBridgeDirection(tile);
 		Axis axis = DiagDirToAxis(direction);
 		CommandCost res;
--- a/src/water_cmd.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/water_cmd.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -40,6 +40,7 @@
 #include "newgrf_cargo.h"
 #include "effectvehicle_func.h"
 #include "oldpool_func.h"
+#include "tunnelbridge_map.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -506,6 +507,7 @@
 
 		case MP_STATION:  return IsOilRig(tile) || (IsDock(tile) && GetTileSlope(tile, NULL) == SLOPE_FLAT) || IsBuoy(tile);
 		case MP_INDUSTRY: return (GetIndustrySpec(GetIndustryType(tile))->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0;
+		case MP_TUNNELBRIDGE: return GetTunnelBridgeTransportType(tile) == TRANSPORT_WATER;
 		default:          return false;
 	}
 }
--- a/src/win32.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/win32.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -474,7 +474,7 @@
 
 	_ident = GetTickCount(); // something pretty unique
 
-	MakeCRCTable((uint32*)alloca(256 * sizeof(uint32)));
+	MakeCRCTable(AllocaM(uint32, 256));
 	_crash_msg = output = (char*)LocalAlloc(LMEM_FIXED, 8192);
 
 	{
--- a/src/yapf/follow_track.hpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/yapf/follow_track.hpp	Wed Jun 11 15:23:32 2008 +0000
@@ -264,7 +264,7 @@
 		}
 
 		// tunnel holes and bridge ramps can be entered only from proper direction
-		if (!IsWaterTT() && IsTileType(m_new_tile, MP_TUNNELBRIDGE)) {
+		if (IsTileType(m_new_tile, MP_TUNNELBRIDGE)) {
 			if (IsTunnel(m_new_tile)) {
 				if (!m_is_tunnel) {
 					DiagDirection tunnel_enterdir = GetTunnelBridgeDirection(m_new_tile);
--- a/src/yapf/yapf_ship.cpp	Wed Jun 11 14:55:10 2008 +0000
+++ b/src/yapf/yapf_ship.cpp	Wed Jun 11 15:23:32 2008 +0000
@@ -109,6 +109,9 @@
 			/* new trackdir does not match the next one when going straight */
 			c += 10;
 		}
+
+		c += YAPF_TILE_LENGTH * tf->m_tiles_skipped;
+
 		// apply it
 		n.m_cost = n.m_parent->m_cost + c;
 		return true;