(svn r13473) [NoAI] -Sync: with r13417:13472.
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;