tron@2186: /* $Id$ */ tron@2186: celestar@2262: /** @file bridge_gui.c Graphical user interface for bridge construction*/ celestar@2262: truelight@0: #include "stdafx.h" Darkvater@1891: #include "openttd.h" tron@507: #include "table/strings.h" tron@2163: #include "functions.h" tron@679: #include "map.h" truelight@0: #include "window.h" truelight@0: #include "gui.h" truelight@0: #include "viewport.h" truelight@0: #include "gfx.h" truelight@0: #include "command.h" tron@337: #include "sound.h" tron@2159: #include "variables.h" celestar@2262: #include "bridge.h" truelight@0: truelight@0: static struct BridgeData { tron@2133: uint count; truelight@0: TileIndex start_tile; truelight@0: TileIndex end_tile; truelight@0: byte type; truelight@0: byte indexes[MAX_BRIDGES]; truelight@0: int32 costs[MAX_BRIDGES]; celestar@2262: } _bridgedata; truelight@0: tron@1977: void CcBuildBridge(bool success, TileIndex tile, uint32 p1, uint32 p2) truelight@0: { tron@541: if (success) SndPlayTileFx(SND_27_BLACKSMITH_ANVIL, tile); truelight@0: } truelight@0: truelight@0: static void BuildBridge(Window *w, int i) truelight@0: { truelight@0: DeleteWindow(w); tron@2639: DoCommandP(_bridgedata.end_tile, _bridgedata.start_tile, tron@2639: _bridgedata.indexes[i] | (_bridgedata.type << 8), CcBuildBridge, truelight@0: CMD_BUILD_BRIDGE | CMD_AUTO | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE)); truelight@0: } truelight@0: truelight@0: static void BuildBridgeWndProc(Window *w, WindowEvent *e) truelight@0: { truelight@0: switch(e->event) { truelight@0: case WE_PAINT: { tron@2133: uint i; truelight@0: truelight@0: DrawWindowWidgets(w); truelight@0: celestar@2262: for (i = 0; i < 4 && i + w->vscroll.pos < _bridgedata.count; i++) { celestar@2262: const Bridge *b = &_bridge[_bridgedata.indexes[i + w->vscroll.pos]]; truelight@0: celestar@2262: SetDParam(2, _bridgedata.costs[i + w->vscroll.pos]); celestar@2262: SetDParam(1, (b->speed >> 4) * 10); celestar@2262: SetDParam(0, b->material); celestar@2262: DrawSprite(b->sprite, 3, 15 + i * 22); truelight@0: celestar@2262: DrawString(44, 15 + i * 22 , STR_500D, 0); truelight@0: } truelight@0: } break; truelight@0: truelight@0: case WE_KEYPRESS: { truelight@0: uint i = e->keypress.keycode - '1'; celestar@2262: if (i < 9 && i < _bridgedata.count) { truelight@0: e->keypress.cont = false; truelight@0: BuildBridge(w, i); truelight@0: } truelight@193: truelight@0: break; truelight@0: } truelight@0: truelight@193: case WE_CLICK: tron@2548: if (e->click.widget == 2) { truelight@0: uint ind = ((int)e->click.pt.y - 14) / 22; celestar@2262: if (ind < 4 && (ind += w->vscroll.pos) < _bridgedata.count) truelight@0: BuildBridge(w, ind); truelight@0: } truelight@0: break; truelight@0: } truelight@0: } truelight@0: truelight@0: static const Widget _build_bridge_widgets[] = { truelight@867: { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, truelight@867: { WWT_CAPTION, RESIZE_NONE, 7, 11, 199, 0, 13, STR_100D_SELECT_RAIL_BRIDGE, STR_018C_WINDOW_TITLE_DRAG_THIS}, darkvater@894: { WWT_MATRIX, RESIZE_NONE, 7, 0, 187, 14, 101, 0x401, STR_101F_BRIDGE_SELECTION_CLICK}, darkvater@894: { WWT_SCROLLBAR, RESIZE_NONE, 7, 188, 199, 14, 101, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: truelight@0: static const WindowDesc _build_bridge_desc = { truelight@0: -1, -1, 200, 102, truelight@0: WC_BUILD_BRIDGE,WC_BUILD_TOOLBAR, truelight@0: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, truelight@0: _build_bridge_widgets, truelight@0: BuildBridgeWndProc truelight@0: }; truelight@0: truelight@0: truelight@0: static const Widget _build_road_bridge_widgets[] = { truelight@867: { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, truelight@867: { WWT_CAPTION, RESIZE_NONE, 7, 11, 199, 0, 13, STR_1803_SELECT_ROAD_BRIDGE, STR_018C_WINDOW_TITLE_DRAG_THIS}, tron@908: { WWT_MATRIX, RESIZE_NONE, 7, 0, 187, 14, 101, 0x401, STR_101F_BRIDGE_SELECTION_CLICK}, tron@908: { WWT_SCROLLBAR, RESIZE_NONE, 7, 188, 199, 14, 101, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: truelight@0: static const WindowDesc _build_road_bridge_desc = { truelight@0: -1, -1, 200, 102, truelight@0: WC_BUILD_BRIDGE,WC_BUILD_TOOLBAR, truelight@0: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, truelight@0: _build_road_bridge_widgets, truelight@0: BuildBridgeWndProc truelight@0: }; truelight@0: truelight@0: tron@1977: void ShowBuildBridgeWindow(TileIndex start, TileIndex end, byte bridge_type) truelight@0: { tron@2133: uint j = 0; truelight@0: int32 ret; tron@2470: StringID errmsg; truelight@0: truelight@0: DeleteWindowById(WC_BUILD_BRIDGE, 0); truelight@0: celestar@2262: _bridgedata.type = bridge_type; celestar@2262: _bridgedata.start_tile = start; celestar@2262: _bridgedata.end_tile = end; truelight@0: tron@2470: errmsg = INVALID_STRING_ID; truelight@0: truelight@0: // only query bridge building possibility once, result is the same for all bridges! tron@2548: // returns CMD_ERROR on failure, and price on success truelight@0: ret = DoCommandByTile(end, start, (bridge_type << 8), DC_AUTO | DC_QUERY_COST, CMD_BUILD_BRIDGE); truelight@0: peter1138@2737: if (CmdFailed(ret)) { truelight@0: errmsg = _error_message; tron@2548: } else { tron@2548: // check which bridges can be built truelight@0: int bridge_len; // length of the middle parts of the bridge celestar@2262: int tot_bridgedata_len; // total length of bridge truelight@0: truelight@0: // get absolute bridge length truelight@0: bridge_len = GetBridgeLength(start, end); celestar@2262: tot_bridgedata_len = bridge_len + 2; truelight@0: celestar@2262: tot_bridgedata_len = CalcBridgeLenCostFactor(tot_bridgedata_len); truelight@0: truelight@0: for (bridge_type = 0; bridge_type != MAX_BRIDGES; bridge_type++) { // loop for all bridgetypes truelight@0: if (CheckBridge_Stuff(bridge_type, bridge_len)) { celestar@2262: const Bridge *b = &_bridge[bridge_type]; truelight@0: // bridge is accepted, add to list truelight@0: // add to terraforming & bulldozing costs the cost of the bridge itself (not computed with DC_QUERY_COST) celestar@2262: _bridgedata.costs[j] = ret + (((int64)tot_bridgedata_len * _price.build_bridge * b->price) >> 8); celestar@2262: _bridgedata.indexes[j] = bridge_type; truelight@0: j++; truelight@0: } truelight@0: } truelight@0: } truelight@0: celestar@2262: _bridgedata.count = j; truelight@0: truelight@0: if (j != 0) { celestar@2262: Window *w = AllocateWindowDesc((_bridgedata.type & 0x80) ? &_build_road_bridge_desc : &_build_bridge_desc); truelight@0: w->vscroll.cap = 4; truelight@0: w->vscroll.count = (byte)j; truelight@0: } else { Darkvater@1781: ShowErrorMessage(errmsg, STR_5015_CAN_T_BUILD_BRIDGE_HERE, TileX(end) * 16, TileY(end) * 16); truelight@0: } truelight@0: }