truelight@0: #include "stdafx.h" truelight@0: #include "ttd.h" tron@1363: #include "table/sprites.h" tron@507: #include "table/strings.h" tron@679: #include "map.h" tron@1209: #include "tile.h" truelight@0: #include "window.h" truelight@0: #include "gui.h" truelight@0: #include "gfx.h" truelight@0: #include "vehicle.h" truelight@0: #include "station.h" truelight@0: #include "town.h" truelight@0: #include "command.h" truelight@0: #include "viewport.h" truelight@1313: #include "depot.h" truelight@1542: #include "waypoint.h" truelight@0: truelight@0: static int OrderGetSel(Window *w) truelight@0: { truelight@919: Vehicle *v = GetVehicle(w->window_number); truelight@0: int num = WP(w,order_d).sel; truelight@0: truelight@1024: if (num < 0 || num > v->num_orders) truelight@1024: return v->num_orders; truelight@0: truelight@1024: return num; truelight@0: } truelight@0: truelight@0: static void DrawOrdersWindow(Window *w) truelight@0: { truelight@1024: const Vehicle *v; truelight@1024: const Order *order; truelight@1024: StringID str; truelight@1024: int sel; truelight@0: int y, i; truelight@1024: bool shared_orders; truelight@1024: byte color; truelight@0: truelight@919: v = GetVehicle(w->window_number); truelight@0: celestar@995: w->disabled_state = (v->owner == _local_player) ? 0 : ( celestar@995: 1 << 4 | //skip celestar@995: 1 << 5 | //delete celestar@995: 1 << 6 | //non-stop celestar@995: 1 << 7 | //go-to celestar@995: 1 << 8 | //full load celestar@995: 1 << 9 //unload celestar@995: ); tron@1019: darkvater@1242: if (v->type != VEH_Train) darkvater@1242: SETBIT(w->disabled_state, 6); //disable non-stop for non-trains truelight@0: truelight@1024: shared_orders = IsOrderListShared(v); truelight@0: truelight@1024: if ((uint)v->num_orders + shared_orders <= (uint)WP(w,order_d).sel) truelight@0: SETBIT(w->disabled_state, 5); /* delete */ truelight@0: truelight@1024: if (v->num_orders == 0) truelight@0: SETBIT(w->disabled_state, 4); /* skip */ truelight@0: truelight@1024: SetVScrollCount(w, v->num_orders + 1); truelight@0: truelight@0: sel = OrderGetSel(w); truelight@1024: SetDParam(2, STR_8827_FULL_LOAD); truelight@193: truelight@1024: order = GetVehicleOrder(v, sel); tron@725: truelight@1024: if (order != NULL) { truelight@1024: switch (order->type) { truelight@1024: case OT_GOTO_STATION: truelight@1024: break; truelight@1024: case OT_GOTO_DEPOT: truelight@1024: SETBIT(w->disabled_state, 9); /* unload */ truelight@1024: SetDParam(2,STR_SERVICE); truelight@1024: break; tron@725: truelight@1024: case OT_GOTO_WAYPOINT: truelight@1024: SETBIT(w->disabled_state, 8); /* full load */ truelight@1024: SETBIT(w->disabled_state, 9); /* unload */ truelight@1024: break; truelight@1024: truelight@1024: default: truelight@1024: SETBIT(w->disabled_state, 6); /* nonstop */ truelight@1024: SETBIT(w->disabled_state, 8); /* full load */ truelight@1024: SETBIT(w->disabled_state, 9); /* unload */ truelight@1024: } truelight@1024: } else { truelight@0: SETBIT(w->disabled_state, 6); /* nonstop */ truelight@0: SETBIT(w->disabled_state, 8); /* full load */ truelight@193: SETBIT(w->disabled_state, 9); /* unload */ truelight@0: } truelight@0: tron@534: SetDParam(0, v->string_id); tron@534: SetDParam(1, v->unitnumber); truelight@0: DrawWindowWidgets(w); truelight@0: truelight@0: y = 15; truelight@0: truelight@1024: i = w->vscroll.pos; truelight@1024: order = GetVehicleOrder(v, i); truelight@1024: while (order != NULL) { truelight@1024: str = (v->cur_order_index == i) ? STR_8805 : STR_8804; truelight@0: darkvater@1242: if (i - w->vscroll.pos < w->vscroll.cap) { truelight@1024: SetDParam(1, 6); truelight@1024: truelight@1024: if (order->type == OT_GOTO_STATION) { truelight@1024: SetDParam(1, STR_8806_GO_TO + (order->flags >> 1)); truelight@1024: SetDParam(2, order->station); truelight@1024: } else if (order->type == OT_GOTO_DEPOT) { truelight@1024: StringID s = STR_NULL; truelight@1024: if (v->type == VEH_Aircraft) { truelight@1024: s = STR_GO_TO_AIRPORT_HANGAR; truelight@1024: SetDParam(2, order->station); truelight@1024: } else { truelight@1313: SetDParam(2, GetDepot(order->station)->town_index); truelight@1024: switch (v->type) { truelight@1024: case VEH_Train: s = STR_880E_GO_TO_TRAIN_DEPOT; break; truelight@1024: case VEH_Road: s = STR_9038_GO_TO_ROADVEH_DEPOT; break; truelight@1024: case VEH_Ship: s = STR_GO_TO_SHIP_DEPOT; break; matthijs@1752: default: matthijs@1752: break; truelight@0: } truelight@0: } truelight@1024: if (v->type == VEH_Train && order->flags & OF_NON_STOP) truelight@1024: s += 2; truelight@1024: truelight@1024: if (order->flags & OF_FULL_LOAD) truelight@1024: s++; /* XXX service */ truelight@1024: truelight@1024: SetDParam(1, s); truelight@1024: } else if (order->type == OT_GOTO_WAYPOINT) { truelight@1024: SetDParam(1, (order->flags & OF_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT); truelight@1024: SetDParam(2, order->station); truelight@0: } truelight@1024: truelight@1024: color = (i == WP(w,order_d).sel) ? 0xC : 0x10; truelight@1024: SetDParam(0, i + 1); truelight@1024: if (order->type != OT_DUMMY) { truelight@1024: DrawString(2, y, str, color); truelight@1024: } else { truelight@1024: SetDParam(1, STR_INVALID_ORDER); truelight@1024: SetDParam(2, order->station); truelight@1024: DrawString(2, y, str, color); truelight@0: } truelight@0: y += 10; truelight@0: } truelight@0: truelight@0: i++; truelight@1024: order = order->next; truelight@1024: } truelight@0: darkvater@1242: if (i - w->vscroll.pos < w->vscroll.cap) { truelight@1024: str = shared_orders ? STR_END_OF_SHARED_ORDERS : STR_882A_END_OF_ORDERS; truelight@1024: color = (i == WP(w,order_d).sel) ? 0xC : 0x10; truelight@1024: DrawString(2, y, str, color); truelight@0: } truelight@0: } truelight@0: darkvater@558: static Order GetOrderCmdFromTile(Vehicle *v, uint tile) truelight@0: { darkvater@558: Order order; truelight@0: Station *st; truelight@0: int st_index; truelight@0: truelight@0: // check depot first truelight@0: if (_patches.gotodepot) { tron@1214: switch (GetTileType(tile)) { truelight@0: case MP_RAILWAY: truelight@0: if (v->type == VEH_Train && _map_owner[tile] == _local_player) { Celestar@560: if ((_map5[tile]&0xFC)==0xC0) { darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS; truelight@1313: order.station = GetDepotByTile(tile)->index; darkvater@558: return order; Celestar@560: } truelight@0: } truelight@0: break; truelight@0: truelight@0: case MP_STREET: Celestar@560: if ((_map5[tile] & 0xF0) == 0x20 && v->type == VEH_Road && _map_owner[tile] == _local_player) { darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS; truelight@1313: order.station = GetDepotByTile(tile)->index; darkvater@558: return order; Celestar@560: } truelight@0: break; truelight@0: truelight@0: case MP_STATION: truelight@0: if (v->type != VEH_Aircraft) break; Celestar@559: if ( IsAircraftHangarTile(tile) && _map_owner[tile] == _local_player) { darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS | OF_NON_STOP; //XXX - whats the nonstop stuff doing here? darkvater@558: order.station = _map2[tile]; darkvater@558: return order; Celestar@560: } truelight@0: break; truelight@0: truelight@0: case MP_WATER: truelight@0: if (v->type != VEH_Ship) break; tron@1334: if (IsTileDepotType(tile, TRANSPORT_WATER) && tron@1334: IsTileOwner(tile, _local_player)) { truelight@0: switch (_map5[tile]) { truelight@0: case 0x81: tile--; break; truelight@0: case 0x83: tile-= TILE_XY(0,1); break; truelight@0: } darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS; truelight@1313: order.station = GetDepotByTile(tile)->index; darkvater@558: return order; truelight@0: } tron@1214: tron@1214: default: tron@1214: break; truelight@0: } truelight@0: } truelight@0: darkvater@395: // check waypoint tron@1035: if (IsTileType(tile, MP_RAILWAY) truelight@867: && v->type == VEH_Train dominik@319: && _map_owner[tile] == _local_player darkvater@558: && (_map5[tile]&0xFE)==0xC4) { darkvater@558: order.type = OT_GOTO_WAYPOINT; darkvater@558: order.flags = 0; truelight@1542: order.station = GetWaypointByTile(tile)->index; darkvater@558: return order; darkvater@558: } dominik@319: tron@1035: if (IsTileType(tile, MP_STATION)) { truelight@919: st = GetStation(st_index = _map2[tile]); truelight@0: truelight@0: if (st->owner == _current_player || st->owner == OWNER_NONE) { truelight@0: byte facil; truelight@0: (facil=FACIL_DOCK, v->type == VEH_Ship) || truelight@0: (facil=FACIL_TRAIN, v->type == VEH_Train) || truelight@0: (facil=FACIL_AIRPORT, v->type == VEH_Aircraft) || truelight@0: (facil=FACIL_BUS_STOP, v->type == VEH_Road && v->cargo_type == CT_PASSENGERS) || truelight@0: (facil=FACIL_TRUCK_STOP, 1); darkvater@558: if (st->facilities & facil) { darkvater@558: order.type = OT_GOTO_STATION; darkvater@558: order.flags = 0; darkvater@558: order.station = st_index; darkvater@558: return order; darkvater@558: } truelight@0: } truelight@0: } truelight@0: truelight@0: // not found darkvater@558: order.type = OT_NOTHING; darkvater@558: order.flags = 0; darkvater@558: return order; truelight@0: } truelight@0: truelight@0: static bool HandleOrderVehClick(Vehicle *v, Vehicle *u, Window *w) truelight@0: { truelight@0: if (u->type != v->type) truelight@0: return false; truelight@0: bjarni@1067: if (u->type == VEH_Train && u->subtype != TS_Front_Engine) { truelight@0: u = GetFirstVehicleInChain(u); bjarni@1067: if (u->subtype != TS_Front_Engine) truelight@0: return false; truelight@0: } truelight@0: truelight@0: // v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet truelight@0: // obviously if you press CTRL on a non-empty orders vehicle you know what you are doing truelight@0: if (v->num_orders != 0 && _ctrl_pressed == 0) {return false;} truelight@193: truelight@0: if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? 0 : 1, NULL, truelight@0: _ctrl_pressed ? CMD_CLONE_ORDER | CMD_MSG(STR_CANT_SHARE_ORDER_LIST) : CMD_CLONE_ORDER | CMD_MSG(STR_CANT_COPY_ORDER_LIST))) { truelight@0: WP(w,order_d).sel = -1; truelight@0: ResetObjectToPlace(); truelight@0: } truelight@0: truelight@0: return true; truelight@0: } truelight@0: truelight@0: static void OrdersPlaceObj(Vehicle *v, uint tile, Window *w) truelight@0: { darkvater@558: Order cmd; truelight@0: Vehicle *u; truelight@193: truelight@0: // check if we're clicking on a vehicle first.. clone orders in that case. truelight@0: u = CheckMouseOverVehicle(); truelight@0: if (u && HandleOrderVehClick(v, u, w)) truelight@0: return; truelight@0: truelight@0: cmd = GetOrderCmdFromTile(v, tile); darkvater@558: if (cmd.type == OT_NOTHING) return; truelight@0: darkvater@558: if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), PackOrder(&cmd), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) { truelight@0: if (WP(w,order_d).sel != -1) truelight@0: WP(w,order_d).sel++; truelight@0: ResetObjectToPlace(); truelight@0: } truelight@0: } truelight@0: Celestar@1000: static void OrderClick_Goto(Window *w, Vehicle *v) Celestar@1000: { Celestar@1000: InvalidateWidget(w, 7); Celestar@1000: TOGGLEBIT(w->click_state, 7); Celestar@1000: if (HASBIT(w->click_state, 7)) { Celestar@1000: _place_clicked_vehicle = NULL; Celestar@1000: SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, 1, w); Celestar@1000: } else { Celestar@1000: ResetObjectToPlace(); Celestar@1000: } Celestar@1000: } Celestar@1000: Celestar@1000: static void OrderClick_FullLoad(Window *w, Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_FULL_LOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); Celestar@1000: } Celestar@1000: Celestar@1000: static void OrderClick_Unload(Window *w, Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_UNLOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); truelight@1024: } truelight@1024: truelight@1024: static void OrderClick_Nonstop(Window *w, Vehicle *v) truelight@1024: { truelight@1024: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_NON_STOP, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); Celestar@1000: } Celestar@1000: Celestar@1000: static void OrderClick_Skip(Window *w, Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index, 0, NULL, CMD_SKIP_ORDER); Celestar@1000: } Celestar@1000: Celestar@1000: static void OrderClick_Delete(Window *w, Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER)); Celestar@1000: } Celestar@1000: Celestar@1000: typedef void OnButtonClick(Window *w, Vehicle *v); Celestar@1000: Celestar@1000: static OnButtonClick * const _order_button_proc[] = { Celestar@1000: OrderClick_Skip, Celestar@1000: OrderClick_Delete, Celestar@1000: OrderClick_Nonstop, Celestar@1000: OrderClick_Goto, Celestar@1000: OrderClick_FullLoad, Celestar@1000: OrderClick_Unload Celestar@1000: }; Celestar@1000: Celestar@1000: static const uint16 _order_keycodes[] = { Celestar@1000: 'D', //skip order Celestar@1000: 'F', //delete order Celestar@1000: 'G', //non-stop Celestar@1000: 'H', //goto order Celestar@1000: 'J', //full load Celestar@1000: 'K' //unload Celestar@1000: }; truelight@0: truelight@0: static void OrdersWndProc(Window *w, WindowEvent *e) truelight@0: { truelight@0: switch(e->event) { truelight@0: case WE_PAINT: truelight@0: DrawOrdersWindow(w); truelight@0: break; truelight@0: truelight@0: case WE_CLICK: { truelight@919: Vehicle *v = GetVehicle(w->window_number); truelight@0: switch(e->click.widget) { darkvater@1242: case 2: { /* orders list */ truelight@0: int sel; truelight@0: sel = (e->click.pt.y - 15) / 10; truelight@0: darkvater@1242: if ((uint)sel >= w->vscroll.cap) truelight@0: return; truelight@0: truelight@0: sel += w->vscroll.pos; truelight@0: truelight@1024: if (_ctrl_pressed && sel < v->num_orders) { truelight@1043: const Order *ord = GetVehicleOrder(v, sel); darkvater@44: int xy = 0; truelight@1024: switch (ord->type) { darkvater@44: case OT_GOTO_STATION: /* station order */ truelight@1024: xy = GetStation(ord->station)->xy ; darkvater@44: break; darkvater@44: case OT_GOTO_DEPOT: /* goto depot order */ truelight@1313: xy = GetDepot(ord->station)->xy; darkvater@44: break; darkvater@395: case OT_GOTO_WAYPOINT: /* goto waypoint order */ truelight@1542: xy = GetWaypoint(ord->station)->xy; darkvater@44: } darkvater@44: darkvater@44: if (xy) darkvater@44: ScrollMainWindowToTile(xy); truelight@193: darkvater@44: return; darkvater@44: } darkvater@44: truelight@0: if (sel == WP(w,order_d).sel) sel = -1; truelight@0: WP(w,order_d).sel = sel; truelight@0: SetWindowDirty(w); truelight@0: } break; truelight@0: truelight@0: case 4: /* skip button */ Celestar@1000: OrderClick_Skip(w, v); truelight@0: break; truelight@0: truelight@0: case 5: /* delete button */ Celestar@1000: OrderClick_Delete(w, v); truelight@0: break; truelight@0: Celestar@1000: case 6: /* non stop button */ Celestar@1000: OrderClick_Nonstop(w, v); Celestar@1000: break; tron@1019: truelight@0: case 7: /* goto button */ Celestar@1000: OrderClick_Goto(w, v); truelight@0: break; truelight@0: truelight@0: case 8: /* full load button */ Celestar@1000: OrderClick_FullLoad(w, v); truelight@0: break; truelight@0: truelight@0: case 9: /* unload button */ Celestar@1000: OrderClick_Unload(w, v); truelight@0: break; truelight@0: } truelight@0: } break; tron@1019: Celestar@1000: case WE_KEYPRESS: { Celestar@1000: Vehicle *v = GetVehicle(w->window_number); Celestar@1000: uint i; Celestar@1000: Celestar@1000: for(i = 0; i < lengthof(_order_keycodes); i++) { Celestar@1000: if (e->keypress.keycode == _order_keycodes[i]) { Celestar@1000: e->keypress.cont = false; tron@1019: //see if the button is disabled Celestar@1000: if (!(HASBIT(w->disabled_state, (i + 4)))) { Celestar@1000: _order_button_proc[i](w, v); Celestar@1000: } Celestar@1000: break; Celestar@1000: } Celestar@1000: } Celestar@1000: break; Celestar@1000: } Celestar@1000: truelight@0: case WE_RCLICK: { truelight@919: Vehicle *v = GetVehicle(w->window_number); celestar@1256: int sel = OrderGetSel(w); celestar@1256: if (e->click.widget != 8) break; celestar@1256: if (sel == v->num_orders || GetVehicleOrder(v, sel)->type != OT_GOTO_DEPOT) celestar@1256: GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER); celestar@1256: else truelight@0: GuiShowTooltips(STR_SERVICE_HINT); darkvater@1242: } break; truelight@0: truelight@0: case WE_4: { truelight@0: if (FindWindowById(WC_VEHICLE_VIEW, w->window_number) == NULL) truelight@0: DeleteWindow(w); truelight@0: } break; truelight@0: truelight@0: case WE_PLACE_OBJ: { truelight@919: OrdersPlaceObj(GetVehicle(w->window_number), e->place.tile, w); truelight@0: } break; truelight@0: truelight@0: case WE_ABORT_PLACE_OBJ: { darkvater@1242: CLRBIT(w->click_state, 7); truelight@0: InvalidateWidget(w, 7); truelight@0: } break; truelight@0: truelight@0: // check if a vehicle in a depot was clicked.. truelight@0: case WE_MOUSELOOP: { truelight@0: Vehicle *v = _place_clicked_vehicle; truelight@25: /* truelight@25: * Check if we clicked on a vehicle truelight@25: * and if the GOTO button of this window is pressed truelight@25: * This is because of all open order windows WE_MOUSELOOP is called truelight@25: * and if you have 3 windows open, and this check is not done truelight@25: * the order is copied to the last open window instead of the truelight@25: * one where GOTO is enalbed truelight@25: */ darkvater@1242: if (v != NULL && HASBIT(w->click_state, 7)) { truelight@0: _place_clicked_vehicle = NULL; truelight@919: HandleOrderVehClick(GetVehicle(w->window_number), v, w); truelight@0: } truelight@0: } break; truelight@193: darkvater@1242: case WE_RESIZE: darkvater@1242: /* Update the scroll + matrix */ darkvater@1242: w->vscroll.cap = (w->widget[2].bottom - w->widget[2].top) / 10; darkvater@1242: break; truelight@0: } darkvater@1242: truelight@0: } truelight@0: dominik@1081: static const Widget _orders_train_widgets[] = { darkvater@1242: { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, darkvater@1242: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 331, 0, 13, STR_8829_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, darkvater@1242: { WWT_PANEL, RESIZE_RB, 14, 0, 319, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, darkvater@1242: { WWT_SCROLLBAR, RESIZE_LRB, 14, 320, 331, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, darkvater@1242: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 52, 76, 87, STR_8823_SKIP, STR_8853_SKIP_THE_CURRENT_ORDER}, darkvater@1242: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 53, 105, 76, 87, STR_8824_DELETE, STR_8854_DELETE_THE_HIGHLIGHTED}, darkvater@1242: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 106, 158, 76, 87, STR_8825_NON_STOP, STR_8855_MAKE_THE_HIGHLIGHTED_ORDER}, darkvater@1242: {WWT_NODISTXTBTN, RESIZE_TB, 14, 159, 211, 76, 87, STR_8826_GO_TO, STR_8856_INSERT_A_NEW_ORDER_BEFORE}, darkvater@1242: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 212, 264, 76, 87, STR_FULLLOAD_OR_SERVICE, STR_NULL}, darkvater@1242: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 265, 319, 76, 87, STR_8828_UNLOAD, STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, darkvater@1242: { WWT_PANEL, RESIZE_RTB, 14, 320, 319, 76, 87, 0x0, STR_NULL}, darkvater@1242: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 320, 331, 76, 87, 0x0, STR_RESIZE_BUTTON}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: dominik@1081: static const WindowDesc _orders_train_desc = { darkvater@1242: -1,-1, 332, 88, dominik@1081: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, darkvater@1242: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESTORE_DPARAM | WDF_RESIZABLE, dominik@1081: _orders_train_widgets, dominik@1081: OrdersWndProc dominik@1081: }; dominik@1081: dominik@1081: static const Widget _orders_widgets[] = { darkvater@1242: { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, darkvater@1242: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 331, 0, 13, STR_8829_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, darkvater@1242: { WWT_PANEL, RESIZE_RB, 14, 0, 319, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, darkvater@1242: { WWT_SCROLLBAR, RESIZE_LRB, 14, 320, 331, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, dominik@1081: darkvater@1242: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 63, 76, 87, STR_8823_SKIP, STR_8853_SKIP_THE_CURRENT_ORDER}, darkvater@1242: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 64, 128, 76, 87, STR_8824_DELETE, STR_8854_DELETE_THE_HIGHLIGHTED}, darkvater@1242: { WWT_EMPTY, RESIZE_TB, 14, 0, 0, 76, 87, 0x0, 0x0}, darkvater@1242: {WWT_NODISTXTBTN, RESIZE_TB, 14, 129, 192, 76, 87, STR_8826_GO_TO, STR_8856_INSERT_A_NEW_ORDER_BEFORE}, darkvater@1242: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 193, 256, 76, 87, STR_FULLLOAD_OR_SERVICE, STR_NULL}, darkvater@1242: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 257, 319, 76, 87, STR_8828_UNLOAD, STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, darkvater@1242: { WWT_PANEL, RESIZE_RTB, 14, 320, 319, 76, 87, 0x0, STR_NULL}, darkvater@1242: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 320, 331, 76, 87, 0x0, STR_RESIZE_BUTTON}, dominik@1081: { WIDGETS_END}, dominik@1081: }; dominik@1081: celestar@995: static const WindowDesc _orders_desc = { darkvater@1242: -1,-1, 332, 88, truelight@0: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, darkvater@1242: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESTORE_DPARAM | WDF_RESIZABLE, celestar@995: _orders_widgets, truelight@0: OrdersWndProc truelight@0: }; truelight@0: celestar@995: static const Widget _other_orders_widgets[] = { darkvater@1242: { WWT_TEXTBTN, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, darkvater@1242: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 331, 0, 13, STR_A00B_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, darkvater@1242: { WWT_PANEL, RESIZE_RB, 14, 0, 319, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, darkvater@1242: { WWT_SCROLLBAR, RESIZE_LRB, 14, 320, 331, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, darkvater@1242: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, darkvater@1242: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, darkvater@1242: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, darkvater@1242: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, darkvater@1242: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, darkvater@1242: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, darkvater@1242: { WWT_PANEL, RESIZE_RTB, 14, 0, 319, 76, 87, 0x0, STR_NULL}, darkvater@1242: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 320, 331, 76, 87, 0x0, STR_RESIZE_BUTTON}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: celestar@995: static const WindowDesc _other_orders_desc = { darkvater@1242: -1,-1, 332, 88, truelight@0: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, darkvater@1242: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, celestar@995: _other_orders_widgets, truelight@0: OrdersWndProc truelight@0: }; truelight@0: truelight@0: void ShowOrdersWindow(Vehicle *v) truelight@0: { truelight@0: Window *w; truelight@0: VehicleID veh = v->index; truelight@0: truelight@0: DeleteWindowById(WC_VEHICLE_ORDERS, veh); truelight@0: DeleteWindowById(WC_VEHICLE_DETAILS, veh); truelight@193: truelight@0: _alloc_wnd_parent_num = veh; tron@1019: dominik@1081: if (v->owner != _local_player) { dominik@1081: w = AllocateWindowDesc( &_other_orders_desc); darkvater@1242: } else dominik@1081: w = AllocateWindowDesc( (v->type == VEH_Train) ? &_orders_train_desc : &_orders_desc); truelight@0: darkvater@1242: if (w != NULL) { darkvater@1242: w->window_number = veh; darkvater@1242: w->caption_color = v->owner; darkvater@1242: w->vscroll.cap = 6; darkvater@1242: w->resize.step_height = 10; darkvater@1242: WP(w,order_d).sel = -1; darkvater@1242: } truelight@0: }