src/bridge_gui.cpp
changeset 8557 d5fb341fc220
parent 8535 ef36a2eb9345
child 8558 2f50ad3af2a9
equal deleted inserted replaced
8556:ce8d86cc14d2 8557:d5fb341fc220
    23 static struct BridgeData {
    23 static struct BridgeData {
    24 	uint8 last_size;
    24 	uint8 last_size;
    25 	uint count;
    25 	uint count;
    26 	TileIndex start_tile;
    26 	TileIndex start_tile;
    27 	TileIndex end_tile;
    27 	TileIndex end_tile;
    28 	uint8 type;
    28 	uint32 type; ///< Data type for the bridge. Bit 16,15 = transport type, 14..8 = road/rail pieces, 7..0 = type of bridge
    29 	BridgeType indexes[MAX_BRIDGES];
    29 	BridgeType indexes[MAX_BRIDGES];
    30 	Money costs[MAX_BRIDGES];
    30 	Money costs[MAX_BRIDGES];
    31 
    31 
    32 	BridgeData()
    32 	BridgeData()
    33 		: last_size(4)
    33 		: last_size(4)
    42 
    42 
    43 static void BuildBridge(Window *w, int i)
    43 static void BuildBridge(Window *w, int i)
    44 {
    44 {
    45 	DeleteWindow(w);
    45 	DeleteWindow(w);
    46 	DoCommandP(_bridgedata.end_tile, _bridgedata.start_tile,
    46 	DoCommandP(_bridgedata.end_tile, _bridgedata.start_tile,
    47 		_bridgedata.indexes[i] | (_bridgedata.type << 8), CcBuildBridge,
    47 		_bridgedata.type | _bridgedata.indexes[i], CcBuildBridge,
    48 		CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
    48 		CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
    49 }
    49 }
    50 
    50 
    51 /* Names of the build bridge selection window */
    51 /* Names of the build bridge selection window */
    52 enum BuildBridgeSelectionWidgets {
    52 enum BuildBridgeSelectionWidgets {
   141 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   141 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   142 	_build_bridge_widgets,
   142 	_build_bridge_widgets,
   143 	BuildBridgeWndProc
   143 	BuildBridgeWndProc
   144 };
   144 };
   145 
   145 
   146 /* Widget definition for the road bridge selection window */
   146 void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte bridge_type)
   147 static const Widget _build_road_bridge_widgets[] = {
       
   148 {   WWT_CLOSEBOX,   RESIZE_NONE,  7,   0,  10,   0,  13, STR_00C5,                    STR_018B_CLOSE_WINDOW},            // BBSW_CLOSEBOX
       
   149 {    WWT_CAPTION,   RESIZE_NONE,  7,  11, 199,   0,  13, STR_1803_SELECT_ROAD_BRIDGE, STR_018C_WINDOW_TITLE_DRAG_THIS},  // BBSW_CAPTION
       
   150 {     WWT_MATRIX, RESIZE_BOTTOM,  7,   0, 187,  14, 101, 0x401,                       STR_101F_BRIDGE_SELECTION_CLICK},  // BBSW_BRIDGE_LIST
       
   151 {  WWT_SCROLLBAR, RESIZE_BOTTOM,  7, 188, 199,  14,  89, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST}, // BBSW_SCROLLBAR
       
   152 {  WWT_RESIZEBOX,     RESIZE_TB,  7, 188, 199,  90, 101, 0x0,                         STR_RESIZE_BUTTON},                // BBSW_RESIZEBOX
       
   153 {   WIDGETS_END},
       
   154 };
       
   155 
       
   156 /* Window definition for the road bridge selection window */
       
   157 static const WindowDesc _build_road_bridge_desc = {
       
   158 	WDP_AUTO, WDP_AUTO, 200, 102, 200, 102,
       
   159 	WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR,
       
   160 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
       
   161 	_build_road_bridge_widgets,
       
   162 	BuildBridgeWndProc
       
   163 };
       
   164 
       
   165 
       
   166 void ShowBuildBridgeWindow(TileIndex start, TileIndex end, byte bridge_type)
       
   167 {
   147 {
   168 	DeleteWindowById(WC_BUILD_BRIDGE, 0);
   148 	DeleteWindowById(WC_BUILD_BRIDGE, 0);
   169 
   149 
   170 	_bridgedata.type = bridge_type;
   150 	_bridgedata.type = ((transport_type << 7) | bridge_type) << 8; //prepare the parameter for use only once
   171 	_bridgedata.start_tile = start;
   151 	_bridgedata.start_tile = start;
   172 	_bridgedata.end_tile = end;
   152 	_bridgedata.end_tile = end;
   173 
   153 
   174 	/* only query bridge building possibility once, result is the same for all bridges!
   154 	/* only query bridge building possibility once, result is the same for all bridges!
   175 	 * returns CMD_ERROR on failure, and price on success */
   155 	 * returns CMD_ERROR on failure, and price on success */
   176 	StringID errmsg = INVALID_STRING_ID;
   156 	StringID errmsg = INVALID_STRING_ID;
   177 	CommandCost ret = DoCommand(end, start, (bridge_type << 8), DC_AUTO | DC_QUERY_COST, CMD_BUILD_BRIDGE);
   157 	CommandCost ret = DoCommand(end, start, _bridgedata.type, DC_AUTO | DC_QUERY_COST, CMD_BUILD_BRIDGE);
   178 
   158 
   179 	uint8 j = 0;
   159 	uint8 j = 0;
   180 	if (CmdFailed(ret)) {
   160 	if (CmdFailed(ret)) {
   181 		errmsg = _error_message;
   161 		errmsg = _error_message;
   182 	} else {
   162 	} else {
   202 
   182 
   203 		_bridgedata.count = j;
   183 		_bridgedata.count = j;
   204 	}
   184 	}
   205 
   185 
   206 	if (j != 0) {
   186 	if (j != 0) {
   207 		AllocateWindowDesc((_bridgedata.type & 0x80) ? &_build_road_bridge_desc : &_build_bridge_desc);
   187 		Window *w = AllocateWindowDesc(&_build_bridge_desc);
       
   188 		/* Change the data, or the caption of the gui. Set it to road or rail, accordingly */
       
   189 		w->widget[BBSW_CAPTION].data = (transport_type == TRANSPORT_ROAD) ? STR_1803_SELECT_ROAD_BRIDGE : STR_100D_SELECT_RAIL_BRIDGE;
   208 	} else {
   190 	} else {
   209 		ShowErrorMessage(errmsg, STR_5015_CAN_T_BUILD_BRIDGE_HERE, TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE);
   191 		ShowErrorMessage(errmsg, STR_5015_CAN_T_BUILD_BRIDGE_HERE, TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE);
   210 	}
   192 	}
   211 }
   193 }