diff -r 0b2aebc8283e -r 0b8b245a2391 src/road_gui.cpp --- a/src/road_gui.cpp Wed Jun 13 11:17:30 2007 +0000 +++ b/src/road_gui.cpp Wed Jun 13 11:45:14 2007 +0000 @@ -4,8 +4,6 @@ #include "stdafx.h" #include "openttd.h" -#include "road_cmd.h" -#include "road_map.h" #include "table/sprites.h" #include "table/strings.h" #include "functions.h" @@ -18,6 +16,9 @@ #include "sound.h" #include "command.h" #include "variables.h" +#include "road.h" +#include "road_cmd.h" +#include "road_map.h" #include "station_map.h" //needed for catchments #include "station.h" @@ -31,6 +32,8 @@ static byte _place_road_flag; +static RoadType _cur_roadtype; + static DiagDirection _road_depot_orientation; static DiagDirection _road_station_picker_orientation; @@ -42,18 +45,18 @@ static void PlaceRoad_NE(TileIndex tile) { _place_road_flag = (_tile_fract_coords.y >= 8) + 4; - VpStartPlaceSizing(tile, VPM_FIX_X); + VpStartPlaceSizing(tile, VPM_FIX_X, GUI_PlaceProc_None); } static void PlaceRoad_NW(TileIndex tile) { _place_road_flag = (_tile_fract_coords.x >= 8) + 0; - VpStartPlaceSizing(tile, VPM_FIX_Y); + VpStartPlaceSizing(tile, VPM_FIX_Y, GUI_PlaceProc_None); } static void PlaceRoad_Bridge(TileIndex tile) { - VpStartPlaceSizing(tile, VPM_X_OR_Y); + VpStartPlaceSizing(tile, VPM_X_OR_Y, GUI_PlaceProc_None); } @@ -69,7 +72,7 @@ static void PlaceRoad_Tunnel(TileIndex tile) { - DoCommandP(tile, 0x200, 0, CcBuildRoadTunnel, CMD_BUILD_TUNNEL | CMD_AUTO | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE)); + DoCommandP(tile, 0x200 | RoadTypeToRoadTypes(_cur_roadtype), 0, CcBuildRoadTunnel, CMD_BUILD_TUNNEL | CMD_AUTO | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE)); } static void BuildRoadOutsideStation(TileIndex tile, DiagDirection direction) @@ -77,24 +80,27 @@ tile += TileOffsByDiagDir(direction); // if there is a roadpiece just outside of the station entrance, build a connecting route if (IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) { - DoCommandP(tile, DiagDirToRoadBits(ReverseDiagDir(direction)), 0, NULL, CMD_BUILD_ROAD); + if (GetRoadBits(tile, _cur_roadtype) != ROAD_NONE) { + DoCommandP(tile, _cur_roadtype << 4 | DiagDirToRoadBits(ReverseDiagDir(direction)), 0, NULL, CMD_BUILD_ROAD); + } } } void CcRoadDepot(bool success, TileIndex tile, uint32 p1, uint32 p2) { if (success) { + DiagDirection dir = (DiagDirection)GB(p1, 0, 2); SndPlayTileFx(SND_1F_SPLAT, tile); ResetObjectToPlace(); - BuildRoadOutsideStation(tile, (DiagDirection)p1); + BuildRoadOutsideStation(tile, dir); /* For a drive-through road stop build connecting road for other entrance */ - if (HASBIT(p2, 1)) BuildRoadOutsideStation(tile, ReverseDiagDir((DiagDirection)p1)); + if (HASBIT(p2, 1)) BuildRoadOutsideStation(tile, ReverseDiagDir(dir)); } } static void PlaceRoad_Depot(TileIndex tile) { - DoCommandP(tile, _road_depot_orientation, 0, CcRoadDepot, CMD_BUILD_ROAD_DEPOT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1807_CAN_T_BUILD_ROAD_VEHICLE)); + DoCommandP(tile, _cur_roadtype << 2 | _road_depot_orientation, 0, CcRoadDepot, CMD_BUILD_ROAD_DEPOT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1807_CAN_T_BUILD_ROAD_VEHICLE)); } static void PlaceRoadStop(TileIndex tile, uint32 p2, uint32 cmd) @@ -113,7 +119,7 @@ if (_remove_button_clicked) { DoCommandP(tile, 0, RoadStop::BUS, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(STR_CAN_T_REMOVE_BUS_STATION)); } else { - PlaceRoadStop(tile, RoadStop::BUS, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1808_CAN_T_BUILD_BUS_STATION)); + PlaceRoadStop(tile, ROADTYPES_ROAD << 2 | RoadStop::BUS, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1808_CAN_T_BUILD_BUS_STATION)); } } @@ -122,13 +128,13 @@ if (_remove_button_clicked) { DoCommandP(tile, 0, RoadStop::TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(STR_CAN_T_REMOVE_TRUCK_STATION)); } else { - PlaceRoadStop(tile, RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1809_CAN_T_BUILD_TRUCK_STATION)); + PlaceRoadStop(tile, ROADTYPES_ROAD << 2 | RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1809_CAN_T_BUILD_TRUCK_STATION)); } } static void PlaceRoad_DemolishArea(TileIndex tile) { - VpStartPlaceSizing(tile, 4); + VpStartPlaceSizing(tile, VPM_X_AND_Y, GUI_PlaceProc_None); } @@ -264,47 +270,41 @@ if (w != NULL) WP(w, def_d).close = true; break; - case WE_PLACE_DRAG: { - int sel_method; - switch (e->we.place.userdata) { - case 1: - sel_method = VPM_FIX_X; + case WE_PLACE_DRAG: + switch (e->we.place.select_method) { + case VPM_FIX_X: _place_road_flag = (_place_road_flag & ~2) | ((e->we.place.pt.y & 8) >> 2); break; - case 2: - sel_method = VPM_FIX_Y; + case VPM_FIX_Y: _place_road_flag = (_place_road_flag & ~2) | ((e->we.place.pt.x & 8) >> 2); break; - - case 4: - sel_method = VPM_X_AND_Y; - break; - - default: - sel_method = VPM_X_OR_Y; - break; } - VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, sel_method); + VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method); return; - } case WE_PLACE_MOUSEUP: if (e->we.place.pt.x != -1) { TileIndex start_tile = e->we.place.starttile; TileIndex end_tile = e->we.place.tile; - if (e->we.place.userdata == 0) { - ResetObjectToPlace(); - ShowBuildBridgeWindow(start_tile, end_tile, 0x80); - } else if (e->we.place.userdata != 4) { - DoCommandP(end_tile, start_tile, _place_road_flag, CcPlaySound1D, - _remove_button_clicked ? - CMD_REMOVE_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1805_CAN_T_REMOVE_ROAD_FROM) : - CMD_BUILD_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1804_CAN_T_BUILD_ROAD_HERE)); - } else { - DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA)); + switch (e->we.place.select_method) { + case VPM_X_OR_Y: + ResetObjectToPlace(); + ShowBuildBridgeWindow(start_tile, end_tile, 0x80 | RoadTypeToRoadTypes(_cur_roadtype)); + break; + + case VPM_X_AND_Y: + DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA)); + break; + + default: + DoCommandP(end_tile, start_tile, _place_road_flag | (_cur_roadtype << 3), CcPlaySound1D, + _remove_button_clicked ? + CMD_REMOVE_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1805_CAN_T_REMOVE_ROAD_FROM) : + CMD_BUILD_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1804_CAN_T_BUILD_ROAD_HERE)); + break; } } break; @@ -312,7 +312,7 @@ case WE_PLACE_PRESIZE: { TileIndex tile = e->we.place.tile; - DoCommand(tile, 0x200, 0, DC_AUTO, CMD_BUILD_TUNNEL); + DoCommand(tile, 0x200 | _cur_roadtype, 0, DC_AUTO, CMD_BUILD_TUNNEL); VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile); break; } @@ -348,9 +348,10 @@ BuildRoadToolbWndProc }; -void ShowBuildRoadToolbar() +void ShowBuildRoadToolbar(RoadType roadtype) { if (!IsValidPlayer(_current_player)) return; + _cur_roadtype = roadtype; DeleteWindowById(WC_BUILD_TOOLBAR, 0); Window *w = AllocateWindowDesc(&_build_road_desc); @@ -395,10 +396,10 @@ case WE_PAINT: DrawWindowWidgets(w); - DrawRoadDepotSprite(70, 17, DIAGDIR_NE); - DrawRoadDepotSprite(70, 69, DIAGDIR_SE); - DrawRoadDepotSprite( 2, 69, DIAGDIR_SW); - DrawRoadDepotSprite( 2, 17, DIAGDIR_NW); + DrawRoadDepotSprite(70, 17, DIAGDIR_NE, _cur_roadtype); + DrawRoadDepotSprite(70, 69, DIAGDIR_SE, _cur_roadtype); + DrawRoadDepotSprite( 2, 69, DIAGDIR_SW, _cur_roadtype); + DrawRoadDepotSprite( 2, 17, DIAGDIR_NW, _cur_roadtype); break; case WE_CLICK: {