Mercurial > hg > openttd
changeset 7789:bf6bc46be9da draft
(svn r11339) -Add: autoroad; same as autorail, but for road and trams and only on X and Y direction. Patch by Octopussy and skidd13.
author | rubidium <rubidium@openttd.org> |
---|---|
date | Mon, 22 Oct 2007 19:11:50 +0000 |
parents | 3294d5b88b1b |
children | 5ead3ee7f7b7 |
files | bin/data/openttd.grf src/gfxinit.cpp src/gui.h src/lang/english.txt src/road_gui.cpp src/table/files.h src/table/sprites.h |
diffstat | 7 files changed, 159 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
index 6bfc3dc1191183a2692cf06ef283525cccc6e42d..627c602bca617e6a5ff9ea7ab15051b89a999922 GIT binary patch literal 31847 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
--- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -324,7 +324,7 @@ 377, 377, ///< · small 153, 153, ///< · medium 601, 601, ///< · large - SPR_WARNING_SIGN, SPR_WARNING_SIGN, + SPR_WARNING_SIGN, SPR_CURSOR_AUTOTRAM, END };
--- a/src/gui.h +++ b/src/gui.h @@ -88,6 +88,7 @@ /* Road specific actions */ DDSP_PLACE_ROAD_NE, DDSP_PLACE_ROAD_NW, + DDSP_PLACE_AUTOROAD, }; /* misc_gui.cpp */
--- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1667,7 +1667,9 @@ STR_180A_ROAD_CONSTRUCTION :Road construction STR_180A_TRAMWAY_CONSTRUCTION :Tramway construction STR_180B_BUILD_ROAD_SECTION :{BLACK}Build road section +STR_BUILD_AUTOROAD_TIP :{BLACK}Build road section using the Autoroad mode STR_180B_BUILD_TRAMWAY_SECTION :{BLACK}Build tramway section +STR_BUILD_AUTOTRAM_TIP :{BLACK}Build tramway section using the Autotram mode STR_180C_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Build road vehicle depot (for building and servicing vehicles) STR_180C_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Build tram vehicle depot (for building and servicing vehicles) STR_180D_BUILD_BUS_STATION :{BLACK}Build bus station
--- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -30,7 +30,22 @@ static bool _remove_button_clicked; -static byte _place_road_flag; +/** + * Define the values of the RoadFlags + * @see CmdBuildLongRoad + */ +enum RoadFlags { + RF_NONE = 0x00, + RF_START_HALFROAD_Y = 0x01, // The start tile in Y-dir should have only a half hoad + RF_END_HALFROAD_Y = 0x02, // The end tile in Y-dir should have only a half hoad + RF_DIR_Y = 0x04, // The direction is Y-dir + RF_DIR_X = RF_NONE, // Dummy; Dir X is set when RF_DIR_Y is not set + RF_START_HALFROAD_X = 0x08, // The start tile in X-dir should have only a half hoad + RF_END_HALFROAD_X = 0x10, // The end tile in X-dir should have only a half hoad +}; +DECLARE_ENUM_AS_BIT_SET(RoadFlags); + +static RoadFlags _place_road_flag; static RoadType _cur_roadtype; @@ -42,18 +57,52 @@ if (success) SndPlayTileFx(SND_1F_SPLAT, tile); } +/** + * Set the initial flags for the road constuction. + * The flags are: + * @li The direction is the Y-dir + * @li The first tile has a partitial RoadBit (true or false) + * + * @param tile The start tile + */ static void PlaceRoad_NE(TileIndex tile) { - _place_road_flag = (_tile_fract_coords.y >= 8) + 4; + _place_road_flag = RF_DIR_Y; + if (_tile_fract_coords.y >= 8) _place_road_flag |= RF_START_HALFROAD_Y; VpStartPlaceSizing(tile, VPM_FIX_X, DDSP_PLACE_ROAD_NE); } +/** + * Set the initial flags for the road constuction. + * The flags are: + * @li The direction is the X-dir + * @li The first tile has a partitial RoadBit (true or false) + * + * @param tile The start tile + */ static void PlaceRoad_NW(TileIndex tile) { - _place_road_flag = (_tile_fract_coords.x >= 8) + 0; + _place_road_flag = RF_DIR_X; + if (_tile_fract_coords.x >= 8) _place_road_flag |= RF_START_HALFROAD_X; VpStartPlaceSizing(tile, VPM_FIX_Y, DDSP_PLACE_ROAD_NW); } +/** + * Set the initial flags for the road constuction. + * The flags are: + * @li The direction is not set. + * @li The first tile has a partitial RoadBit (true or false) + * + * @param tile The start tile + */ +static void PlaceRoad_AutoRoad(TileIndex tile) +{ + _place_road_flag = RF_NONE; + if (_tile_fract_coords.x >= 8) _place_road_flag |= RF_START_HALFROAD_X; + if (_tile_fract_coords.y >= 8) _place_road_flag |= RF_START_HALFROAD_Y; + VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_PLACE_AUTOROAD); +} + static void PlaceRoad_Bridge(TileIndex tile) { VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_BUILD_BRIDGE); @@ -83,6 +132,7 @@ SpriteID cursor_nesw; ///< Cursor for building NE and SW bits SpriteID cursor_nwse; ///< Cursor for building NW and SE bits + SpriteID cursor_autoroad; ///< Cursor for building autoroad }; /** What errors/cursors must be shown for several types of roads */ @@ -98,6 +148,7 @@ SPR_CURSOR_ROAD_NESW, SPR_CURSOR_ROAD_NWSE, + SPR_CURSOR_AUTOROAD, }, { STR_1804_CAN_T_BUILD_TRAMWAY_HERE, @@ -110,6 +161,7 @@ SPR_CURSOR_TRAMWAY_NESW, SPR_CURSOR_TRAMWAY_NWSE, + SPR_CURSOR_AUTOTRAM, }, }; @@ -187,6 +239,7 @@ RTW_STICKY, RTW_ROAD_X, RTW_ROAD_Y, + RTW_AUTOROAD, RTW_DEMOLISH, RTW_DEPOT, RTW_BUS_STATION, @@ -198,16 +251,38 @@ typedef void OnButtonClick(Window *w); +/** + * Function that handles the click on the + * X road placement button. + * + * @param w The current window + */ static void BuildRoadClick_NE(Window *w) { HandlePlacePushButton(w, RTW_ROAD_X, _road_type_infos[_cur_roadtype].cursor_nesw, 1, PlaceRoad_NE); } +/** + * Function that handles the click on the + * Y road placement button. + * + * @param w The current window + */ static void BuildRoadClick_NW(Window *w) { HandlePlacePushButton(w, RTW_ROAD_Y, _road_type_infos[_cur_roadtype].cursor_nwse, 1, PlaceRoad_NW); } +/** + * Function that handles the click on the + * autoroad placement button. + * + * @param w The current window + */ +static void BuildRoadClick_AutoRoad(Window *w) +{ + HandlePlacePushButton(w, RTW_AUTOROAD, _road_type_infos[_cur_roadtype].cursor_autoroad, 1, PlaceRoad_AutoRoad); +} static void BuildRoadClick_Demolish(Window *w) { @@ -251,9 +326,11 @@ SetSelectionRed(IsWindowWidgetLowered(w, RTW_REMOVE)); } +/** Array with the handlers of the button-clicks for the road-toolbar */ static OnButtonClick* const _build_road_button_proc[] = { BuildRoadClick_NE, BuildRoadClick_NW, + BuildRoadClick_AutoRoad, BuildRoadClick_Demolish, BuildRoadClick_Depot, BuildRoadClick_BusStation, @@ -263,6 +340,7 @@ BuildRoadClick_Remove }; +/** Array with the keycode of the button-clicks for the road-toolbar */ static const uint16 _road_keycodes[] = { '1', '2', @@ -270,6 +348,7 @@ '4', '5', '6', + '7', 'B', 'T', 'R', @@ -291,6 +370,7 @@ break; case RTW_ROAD_X: case RTW_ROAD_Y: + case RTW_AUTOROAD: case RTW_BUS_STATION: case RTW_TRUCK_STATION: /* Removal button is enabled only if the road/station @@ -361,13 +441,38 @@ break; case WE_PLACE_DRAG: + /* Here we update the end tile flags + * of the road placement actions. + * At first we reset the end halfroad + * bits and if needed we set them again. */ switch (e->we.place.select_proc) { case DDSP_PLACE_ROAD_NE: - _place_road_flag = (_place_road_flag & ~2) | ((e->we.place.pt.y & 8) >> 2); + _place_road_flag &= ~RF_END_HALFROAD_Y; + if (e->we.place.pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y; break; case DDSP_PLACE_ROAD_NW: - _place_road_flag = (_place_road_flag & ~2) | ((e->we.place.pt.x & 8) >> 2); + _place_road_flag &= ~RF_END_HALFROAD_X; + if (e->we.place.pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X; + break; + + case DDSP_PLACE_AUTOROAD: + _place_road_flag &= ~(RF_END_HALFROAD_Y | RF_END_HALFROAD_X); + if (e->we.place.pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y; + if (e->we.place.pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X; + + /* For autoroad we need to update the + * direction of the road */ + if (_thd.size.x > _thd.size.y || (_thd.size.x == _thd.size.y && + (_tile_fract_coords.x < _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) < 16) || + (_tile_fract_coords.x > _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) > 16) )) { + /* Set dir = X */ + _place_road_flag &= ~RF_DIR_Y; + } else { + /* Set dir = Y */ + _place_road_flag |= RF_DIR_Y; + } + break; } @@ -391,6 +496,13 @@ case DDSP_PLACE_ROAD_NE: case DDSP_PLACE_ROAD_NW: + case DDSP_PLACE_AUTOROAD: + /* Flag description: + * Use the first three bits (0x07) if dir == Y + * else use the last 2 bits (X dir has + * not the 3rd bit set) */ + _place_road_flag = (RoadFlags)((_place_road_flag & RF_DIR_Y) ? (_place_road_flag & 0x07) : (_place_road_flag >> 3)); + DoCommandP(end_tile, start_tile, _place_road_flag | (_cur_roadtype << 3) | _ctrl_pressed << 5, CcPlaySound1D, _remove_button_clicked ? CMD_REMOVE_LONG_ROAD | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_road) : @@ -417,23 +529,25 @@ /** Widget definition of the build road toolbar */ static const Widget _build_road_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // RTW_CLOSEBOX -{ WWT_CAPTION, RESIZE_NONE, 7, 11, 205, 0, 13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // RTW_CAPTION -{ WWT_STICKYBOX, RESIZE_NONE, 7, 206, 217, 0, 13, 0x0, STR_STICKY_BUTTON}, // RTW_STICKY +{ WWT_CAPTION, RESIZE_NONE, 7, 11, 227, 0, 13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // RTW_CAPTION +{ WWT_STICKYBOX, RESIZE_NONE, 7, 228, 239, 0, 13, 0x0, STR_STICKY_BUTTON}, // RTW_STICKY { WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_ROAD_NW, STR_180B_BUILD_ROAD_SECTION}, // RTW_ROAD_X { WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_ROAD_NE, STR_180B_BUILD_ROAD_SECTION}, // RTW_ROAD_Y -{ WWT_IMGBTN, RESIZE_NONE, 7, 44, 65, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // RTW_DEMOLISH -{ WWT_IMGBTN, RESIZE_NONE, 7, 66, 87, 14, 35, SPR_IMG_ROAD_DEPOT, STR_180C_BUILD_ROAD_VEHICLE_DEPOT}, // RTW_DEPOT -{ WWT_IMGBTN, RESIZE_NONE, 7, 88, 109, 14, 35, SPR_IMG_BUS_STATION, STR_180D_BUILD_BUS_STATION}, // RTW_BUS_STATION -{ WWT_IMGBTN, RESIZE_NONE, 7, 110, 131, 14, 35, SPR_IMG_TRUCK_BAY, STR_180E_BUILD_TRUCK_LOADING_BAY}, // RTW_TRUCK_STATION -{ WWT_IMGBTN, RESIZE_NONE, 7, 132, 173, 14, 35, SPR_IMG_BRIDGE, STR_180F_BUILD_ROAD_BRIDGE}, // RTW_BUILD_BRIDGE -{ WWT_IMGBTN, RESIZE_NONE, 7, 174, 195, 14, 35, SPR_IMG_ROAD_TUNNEL, STR_1810_BUILD_ROAD_TUNNEL}, // RTW_BUILD_TUNNEL -{ WWT_IMGBTN, RESIZE_NONE, 7, 196, 217, 14, 35, SPR_IMG_REMOVE, STR_1811_TOGGLE_BUILD_REMOVE_FOR}, // RTW_REMOVE +{ WWT_IMGBTN, RESIZE_NONE, 7, 44, 65, 14, 35, SPR_IMG_AUTOROAD, STR_BUILD_AUTOROAD_TIP}, // RTW_AUTOROAD +{ WWT_IMGBTN, RESIZE_NONE, 7, 66, 87, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // RTW_DEMOLISH +{ WWT_IMGBTN, RESIZE_NONE, 7, 88, 109, 14, 35, SPR_IMG_ROAD_DEPOT, STR_180C_BUILD_ROAD_VEHICLE_DEPOT}, // RTW_DEPOT +{ WWT_IMGBTN, RESIZE_NONE, 7, 110, 131, 14, 35, SPR_IMG_BUS_STATION, STR_180D_BUILD_BUS_STATION}, // RTW_BUS_STATION +{ WWT_IMGBTN, RESIZE_NONE, 7, 132, 153, 14, 35, SPR_IMG_TRUCK_BAY, STR_180E_BUILD_TRUCK_LOADING_BAY}, // RTW_TRUCK_STATION +{ WWT_IMGBTN, RESIZE_NONE, 7, 153, 195, 14, 35, SPR_IMG_BRIDGE, STR_180F_BUILD_ROAD_BRIDGE}, // RTW_BUILD_BRIDGE +{ WWT_IMGBTN, RESIZE_NONE, 7, 196, 217, 14, 35, SPR_IMG_ROAD_TUNNEL, STR_1810_BUILD_ROAD_TUNNEL}, // RTW_BUILD_TUNNEL +{ WWT_IMGBTN, RESIZE_NONE, 7, 218, 239, 14, 35, SPR_IMG_REMOVE, STR_1811_TOGGLE_BUILD_REMOVE_FOR}, // RTW_REMOVE + { WIDGETS_END}, }; static const WindowDesc _build_road_desc = { - WDP_ALIGN_TBR, 22, 218, 36, 218, 36, + WDP_ALIGN_TBR, 22, 240, 36, 240, 36, WC_BUILD_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _build_road_widgets, @@ -443,23 +557,25 @@ /** Widget definition of the build tram toolbar */ static const Widget _build_tramway_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // RTW_CLOSEBOX -{ WWT_CAPTION, RESIZE_NONE, 7, 11, 205, 0, 13, STR_1802_TRAMWAY_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // RTW_CAPTION -{ WWT_STICKYBOX, RESIZE_NONE, 7, 206, 217, 0, 13, 0x0, STR_STICKY_BUTTON}, // RTW_STICKY +{ WWT_CAPTION, RESIZE_NONE, 7, 11, 227, 0, 13, STR_1802_TRAMWAY_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // RTW_CAPTION +{ WWT_STICKYBOX, RESIZE_NONE, 7, 228, 239, 0, 13, 0x0, STR_STICKY_BUTTON}, // RTW_STICKY { WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_TRAMWAY_NW, STR_180B_BUILD_TRAMWAY_SECTION}, // RTW_ROAD_X { WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_TRAMWAY_NE, STR_180B_BUILD_TRAMWAY_SECTION}, // RTW_ROAD_Y -{ WWT_IMGBTN, RESIZE_NONE, 7, 44, 65, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // RTW_DEMOLISH -{ WWT_IMGBTN, RESIZE_NONE, 7, 66, 87, 14, 35, SPR_IMG_ROAD_DEPOT, STR_180C_BUILD_TRAM_VEHICLE_DEPOT}, // RTW_DEPOT -{ WWT_IMGBTN, RESIZE_NONE, 7, 88, 109, 14, 35, SPR_IMG_BUS_STATION, STR_180D_BUILD_PASSENGER_TRAM_STATION}, // RTW_BUS_STATION -{ WWT_IMGBTN, RESIZE_NONE, 7, 110, 131, 14, 35, SPR_IMG_TRUCK_BAY, STR_180E_BUILD_CARGO_TRAM_STATION}, // RTW_TRUCK_STATION -{ WWT_IMGBTN, RESIZE_NONE, 7, 132, 173, 14, 35, SPR_IMG_BRIDGE, STR_180F_BUILD_TRAMWAY_BRIDGE}, // RTW_BUILD_BRIDGE -{ WWT_IMGBTN, RESIZE_NONE, 7, 174, 195, 14, 35, SPR_IMG_ROAD_TUNNEL, STR_1810_BUILD_TRAMWAY_TUNNEL}, // RTW_BUILD_TUNNEL -{ WWT_IMGBTN, RESIZE_NONE, 7, 196, 217, 14, 35, SPR_IMG_REMOVE, STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS}, // RTW_REMOVE +{ WWT_IMGBTN, RESIZE_NONE, 7, 44, 65, 14, 35, SPR_IMG_AUTOTRAM, STR_BUILD_AUTOTRAM_TIP}, // RTW_AUTOROAD +{ WWT_IMGBTN, RESIZE_NONE, 7, 66, 87, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // RTW_DEMOLISH +{ WWT_IMGBTN, RESIZE_NONE, 7, 88, 109, 14, 35, SPR_IMG_ROAD_DEPOT, STR_180C_BUILD_TRAM_VEHICLE_DEPOT}, // RTW_DEPOT +{ WWT_IMGBTN, RESIZE_NONE, 7, 110, 131, 14, 35, SPR_IMG_BUS_STATION, STR_180D_BUILD_PASSENGER_TRAM_STATION}, // RTW_BUS_STATION +{ WWT_IMGBTN, RESIZE_NONE, 7, 132, 153, 14, 35, SPR_IMG_TRUCK_BAY, STR_180E_BUILD_CARGO_TRAM_STATION}, // RTW_TRUCK_STATION +{ WWT_IMGBTN, RESIZE_NONE, 7, 153, 195, 14, 35, SPR_IMG_BRIDGE, STR_180F_BUILD_TRAMWAY_BRIDGE}, // RTW_BUILD_BRIDGE +{ WWT_IMGBTN, RESIZE_NONE, 7, 196, 217, 14, 35, SPR_IMG_ROAD_TUNNEL, STR_1810_BUILD_TRAMWAY_TUNNEL}, // RTW_BUILD_TUNNEL +{ WWT_IMGBTN, RESIZE_NONE, 7, 218, 239, 14, 35, SPR_IMG_REMOVE, STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS}, // RTW_REMOVE + { WIDGETS_END}, }; static const WindowDesc _build_tramway_desc = { - WDP_ALIGN_TBR, 22, 218, 36, 218, 36, + WDP_ALIGN_TBR, 22, 240, 36, 240, 36, WC_BUILD_TOOLBAR, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _build_tramway_widgets, @@ -479,23 +595,24 @@ /** Widget definition of the build road toolbar in the scenario editor */ static const Widget _build_road_scen_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // RTW_CLOSEBOX -{ WWT_CAPTION, RESIZE_NONE, 7, 11, 139, 0, 13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // RTW_CAPTION -{ WWT_STICKYBOX, RESIZE_NONE, 7, 140, 151, 0, 13, 0x0, STR_STICKY_BUTTON}, // RTW_STICKY +{ WWT_CAPTION, RESIZE_NONE, 7, 11, 161, 0, 13, STR_1802_ROAD_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // RTW_CAPTION +{ WWT_STICKYBOX, RESIZE_NONE, 7, 162, 173, 0, 13, 0x0, STR_STICKY_BUTTON}, // RTW_STICKY { WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_ROAD_NW, STR_180B_BUILD_ROAD_SECTION}, // RTW_ROAD_X { WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_ROAD_NE, STR_180B_BUILD_ROAD_SECTION}, // RTW_ROAD_Y -{ WWT_IMGBTN, RESIZE_NONE, 7, 44, 65, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // RTW_DEMOLISH +{ WWT_IMGBTN, RESIZE_NONE, 7, 44, 65, 14, 35, SPR_IMG_AUTOROAD, STR_BUILD_AUTOROAD_TIP}, // RTW_AUTOROAD +{ WWT_IMGBTN, RESIZE_NONE, 7, 66, 87, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // RTW_DEMOLISH { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // RTW_DEPOT { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // RTW_BUS_STATION { WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // RTW_TRUCK_STATION -{ WWT_IMGBTN, RESIZE_NONE, 7, 66, 107, 14, 35, SPR_IMG_BRIDGE, STR_180F_BUILD_ROAD_BRIDGE}, // RTW_BUILD_BRIDGE -{ WWT_IMGBTN, RESIZE_NONE, 7, 108, 129, 14, 35, SPR_IMG_ROAD_TUNNEL, STR_1810_BUILD_ROAD_TUNNEL}, // RTW_BUILD_TUNNEL -{ WWT_IMGBTN, RESIZE_NONE, 7, 130, 151, 14, 35, SPR_IMG_REMOVE, STR_1811_TOGGLE_BUILD_REMOVE_FOR}, // RTW_REMOVE +{ WWT_IMGBTN, RESIZE_NONE, 7, 88, 130, 14, 35, SPR_IMG_BRIDGE, STR_180F_BUILD_ROAD_BRIDGE}, // RTW_BUILD_BRIDGE +{ WWT_IMGBTN, RESIZE_NONE, 7, 131, 151, 14, 35, SPR_IMG_ROAD_TUNNEL, STR_1810_BUILD_ROAD_TUNNEL}, // RTW_BUILD_TUNNEL +{ WWT_IMGBTN, RESIZE_NONE, 7, 152, 173, 14, 35, SPR_IMG_REMOVE, STR_1811_TOGGLE_BUILD_REMOVE_FOR}, // RTW_REMOVE { WIDGETS_END}, }; static const WindowDesc _build_road_scen_desc = { - WDP_AUTO, WDP_AUTO, 152, 36, 152, 36, + WDP_AUTO, WDP_AUTO, 174, 36, 174, 36, WC_SCEN_BUILD_ROAD, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, _build_road_scen_widgets,
--- a/src/table/files.h +++ b/src/table/files.h @@ -59,7 +59,7 @@ { "autorail.grf", { 0xed, 0x44, 0x7f, 0xbb, 0x19, 0x44, 0x48, 0x4c, 0x07, 0x8a, 0xb1, 0xc1, 0x5c, 0x12, 0x3a, 0x60 } }, { "canalsw.grf", { 0x13, 0x9c, 0x98, 0xcf, 0xb8, 0x7c, 0xd7, 0x1f, 0xca, 0x34, 0xa5, 0x6b, 0x65, 0x31, 0xec, 0x0f } }, { "elrailsw.grf", { 0x4f, 0xf9, 0xac, 0x79, 0x50, 0x28, 0x9b, 0xe2, 0x15, 0x30, 0xa8, 0x1e, 0xd5, 0xfd, 0xe1, 0xda } }, - { "openttd.grf", { 0x20, 0x64, 0x4a, 0xf6, 0x75, 0x26, 0x5b, 0x92, 0xbb, 0x6f, 0x8d, 0x0e, 0x34, 0x7e, 0xa6, 0xe3 } }, + { "openttd.grf", { 0x95, 0xe3, 0x09, 0xe4, 0x2c, 0x2d, 0x47, 0x80, 0xd2, 0x09, 0x06, 0x64, 0xaf, 0x20, 0x32, 0x14 } }, { "trkfoundw.grf", { 0x12, 0x33, 0x3f, 0xa3, 0xd1, 0x86, 0x8b, 0x04, 0x53, 0x18, 0x9c, 0xee, 0xf9, 0x2d, 0xf5, 0x95 } }, { "roadstops.grf", { 0xa1, 0x5b, 0xb3, 0x52, 0x60, 0x12, 0x3c, 0xb7, 0x7b, 0x73, 0x09, 0xc1, 0x1a, 0xb4, 0xd0, 0xb8 } }, { "group.grf", { 0xe8, 0x52, 0x5f, 0x1c, 0x3e, 0xf9, 0x91, 0x9d, 0x0f, 0x70, 0x8c, 0x8a, 0x21, 0xa4, 0xc7, 0x02 } },
--- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -47,7 +47,7 @@ SPR_ASCII_SPACE_BIG = 450, /* Extra graphic spritenumbers */ - OPENTTD_SPRITES_COUNT = 112, // number of gfx-sprites in openttd.grf + OPENTTD_SPRITES_COUNT = 116, // number of gfx-sprites in openttd.grf SPR_SIGNALS_BASE = 4896, SPR_CANALS_BASE = SPR_SIGNALS_BASE + 486, @@ -1225,6 +1225,7 @@ /* road_gui.c */ SPR_IMG_ROAD_NW = 1309, SPR_IMG_ROAD_NE = 1310, + SPR_IMG_AUTOROAD = SPR_OPENTTD_BASE + 112, SPR_IMG_ROAD_DEPOT = 1295, SPR_IMG_BUS_STATION = 749, SPR_IMG_TRUCK_BAY = 750, @@ -1233,6 +1234,7 @@ SPR_IMG_REMOVE = 714, SPR_IMG_TRAMWAY_NW = SPR_TRAMWAY_BASE + 0, SPR_IMG_TRAMWAY_NE = SPR_TRAMWAY_BASE + 1, + SPR_IMG_AUTOTRAM = SPR_OPENTTD_BASE + 114, /* rail_gui.c */ SPR_IMG_RAIL_NS = 1251, @@ -1349,8 +1351,10 @@ /* road cursors */ SPR_CURSOR_ROAD_NESW = 1311, SPR_CURSOR_ROAD_NWSE = 1312, + SPR_CURSOR_AUTOROAD = SPR_OPENTTD_BASE + 113, SPR_CURSOR_TRAMWAY_NESW = SPR_TRAMWAY_BASE + 2, SPR_CURSOR_TRAMWAY_NWSE = SPR_TRAMWAY_BASE + 3, + SPR_CURSOR_AUTOTRAM = SPR_OPENTTD_BASE + 115, SPR_CURSOR_ROAD_DEPOT = 1297, SPR_CURSOR_BUS_STATION = 2725,