tron@2186: /* $Id$ */ tron@2186: truelight@0: #include "stdafx.h" Darkvater@1891: #include "openttd.h" tron@1363: #include "table/sprites.h" tron@507: #include "table/strings.h" tron@2163: #include "functions.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" bjarni@2676: #include "train.h" truelight@0: tron@2548: static int OrderGetSel(const Window* w) truelight@0: { tron@2548: const Vehicle* v = GetVehicle(w->window_number); truelight@0: int num = WP(w,order_d).sel; truelight@0: tron@2549: return (num >= 0 && num < v->num_orders) ? num : v->num_orders; truelight@0: } truelight@0: celestar@1935: static StringID StationOrderStrings[] = { celestar@1937: STR_8806_GO_TO, celestar@1935: STR_8807_GO_TO_TRANSFER, celestar@1935: STR_8808_GO_TO_UNLOAD, celestar@1935: STR_8809_GO_TO_TRANSFER_UNLOAD, celestar@1935: STR_880A_GO_TO_LOAD, celestar@1935: STR_880B_GO_TO_TRANSFER_LOAD, celestar@1935: STR_NULL, celestar@1935: STR_NULL, celestar@1935: STR_880C_GO_NON_STOP_TO, celestar@1935: STR_880D_GO_TO_NON_STOP_TRANSFER, celestar@1935: STR_880E_GO_NON_STOP_TO_UNLOAD, celestar@1935: STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD, celestar@1935: STR_8810_GO_NON_STOP_TO_LOAD, celestar@1935: STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD, celestar@1935: STR_NULL celestar@1935: }; celestar@1935: 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@1935: 1 << 9 | //unload celestar@1935: 1 << 10 //transfer 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: matthijs@1857: if ((uint)v->num_orders + (shared_orders?1:0) <= (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; tron@2549: truelight@1024: case OT_GOTO_DEPOT: truelight@1024: SETBIT(w->disabled_state, 9); /* unload */ celestar@1935: SETBIT(w->disabled_state, 10); /* transfer */ 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 */ celestar@1935: SETBIT(w->disabled_state, 10); /* transfer */ 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 */ celestar@1935: SETBIT(w->disabled_state, 10); /* transfer */ 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: tron@2631: switch (order->type) { tron@2631: case OT_GOTO_STATION: tron@2631: SetDParam(1, StationOrderStrings[order->flags]); truelight@1024: SetDParam(2, order->station); tron@2631: break; celestar@1935: tron@2631: case OT_GOTO_DEPOT: { tron@2631: StringID s = STR_NULL; tron@2631: tron@2631: if (v->type == VEH_Aircraft) { tron@2631: s = STR_GO_TO_AIRPORT_HANGAR; tron@2631: SetDParam(2, order->station); tron@2631: } else { tron@2631: SetDParam(2, GetDepot(order->station)->town_index); tron@2631: tron@2631: switch (v->type) { tron@2631: case VEH_Train: s = (order->flags & OF_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break; tron@2631: case VEH_Road: s = STR_9038_GO_TO_ROADVEH_DEPOT; break; tron@2631: case VEH_Ship: s = STR_GO_TO_SHIP_DEPOT; break; tron@2631: default: break; tron@2631: } truelight@0: } celestar@1935: tron@2631: if (order->flags & OF_FULL_LOAD) s++; /* service at */ tron@2631: celestar@1935: SetDParam(1, s); tron@2631: break; truelight@0: } truelight@1024: tron@2631: case OT_GOTO_WAYPOINT: tron@2631: SetDParam(1, (order->flags & OF_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT); tron@2631: SetDParam(2, order->station); tron@2631: break; 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@2436: static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) truelight@0: { darkvater@558: Order order; 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: tron@1901: if (v->type == VEH_Train && IsTileOwner(tile, _local_player)) { tron@2049: if ((_m[tile].m5&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: tron@2049: if ((_m[tile].m5 & 0xF0) == 0x20 && v->type == VEH_Road && IsTileOwner(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; tron@1901: if (IsAircraftHangarTile(tile) && IsTileOwner(tile, _local_player)) { darkvater@558: order.type = OT_GOTO_DEPOT; Darkvater@2778: order.flags = OF_PART_OF_ORDERS; tron@2049: order.station = _m[tile].m2; 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)) { tron@2049: switch (_m[tile].m5) { tron@1981: case 0x81: tile -= TileDiffXY(1, 0); break; tron@1981: case 0x83: tile -= TileDiffXY(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@1901: if (IsTileType(tile, MP_RAILWAY) && tron@1901: v->type == VEH_Train && tron@1901: IsTileOwner(tile, _local_player) && truelight@2668: IsRailWaypoint(tile)) { 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)) { tron@2549: const Station* st = GetStation(st_index = _m[tile].m2); 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; truelight@2921: order.station = INVALID_STATION; darkvater@558: return order; truelight@0: } truelight@0: tron@2549: static bool HandleOrderVehClick(const Vehicle* v, const Vehicle* u, Window* w) truelight@0: { tron@2549: if (u->type != v->type) return false; truelight@0: bjarni@2676: if (u->type == VEH_Train && !IsFrontEngine(u)) { truelight@0: u = GetFirstVehicleInChain(u); bjarni@2676: if (!IsFrontEngine(u)) 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 tron@2549: 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: tron@2549: static void OrdersPlaceObj(const Vehicle* v, TileIndex tile, Window* w) truelight@0: { darkvater@558: Order cmd; tron@2549: const Vehicle* u; truelight@193: truelight@0: // check if we're clicking on a vehicle first.. clone orders in that case. truelight@0: u = CheckMouseOverVehicle(); tron@2549: if (u != NULL && HandleOrderVehClick(v, u, w)) 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))) { tron@2549: if (WP(w,order_d).sel != -1) WP(w,order_d).sel++; truelight@0: ResetObjectToPlace(); truelight@0: } truelight@0: } truelight@0: tron@2549: static void OrderClick_Goto(Window* w, const 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: tron@2549: static void OrderClick_FullLoad(Window* w, const 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: tron@2549: static void OrderClick_Unload(Window* w, const 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: tron@2549: static void OrderClick_Nonstop(Window* w, const 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: tron@2549: static void OrderClick_Transfer(Window* w, const Vehicle* v) celestar@1935: { celestar@1935: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_TRANSFER, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); celestar@1935: } celestar@1935: tron@2549: static void OrderClick_Skip(Window* w, const Vehicle* v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index, 0, NULL, CMD_SKIP_ORDER); Celestar@1000: } Celestar@1000: tron@2549: static void OrderClick_Delete(Window* w, const 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: tron@2549: typedef void OnButtonClick(Window* w, const Vehicle* v); Celestar@1000: tron@2549: 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@1935: OrderClick_Unload, celestar@1935: OrderClick_Transfer 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: { tron@2549: 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; celestar@1935: case 10: /* transfer button */ celestar@1935: OrderClick_Transfer(w, v); celestar@1935: 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: { tron@2643: const Vehicle* v = GetVehicle(w->window_number); tron@2639: int s = OrderGetSel(w); tron@2639: tron@2639: if (e->click.widget != 8) break; tron@2639: if (s == v->num_orders || GetVehicleOrder(v, s)->type != OT_GOTO_DEPOT) { celestar@1256: GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER); tron@2639: } else { truelight@0: GuiShowTooltips(STR_SERVICE_HINT); tron@2639: } 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: { tron@2549: const 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}, celestar@1935: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 384, 0, 13, STR_8829_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, celestar@1935: { WWT_PANEL, RESIZE_RB, 14, 0, 372, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, celestar@1935: { WWT_SCROLLBAR, RESIZE_LRB, 14, 373, 384, 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}, celestar@1935: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 320, 372, 76, 87, STR_886F_TRANSFER, STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, celestar@1935: { WWT_PANEL, RESIZE_RTB, 14, 373, 372, 76, 87, 0x0, STR_NULL}, celestar@1935: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 373, 384, 76, 87, 0x0, STR_RESIZE_BUTTON}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: dominik@1081: static const WindowDesc _orders_train_desc = { celestar@1935: -1,-1, 385, 88, dominik@1081: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, ludde@2064: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | 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}, celestar@1935: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 395, 0, 13, STR_8829_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, celestar@1935: { WWT_PANEL, RESIZE_RB, 14, 0, 383, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, celestar@1935: { WWT_SCROLLBAR, RESIZE_LRB, 14, 384, 395, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, 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}, celestar@1935: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 320, 383, 76, 87, STR_886F_TRANSFER, STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, celestar@1935: { WWT_PANEL, RESIZE_RTB, 14, 384, 383, 76, 87, 0x0, STR_NULL}, celestar@1935: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 384, 395, 76, 87, 0x0, STR_RESIZE_BUTTON}, dominik@1081: { WIDGETS_END}, dominik@1081: }; dominik@1081: celestar@995: static const WindowDesc _orders_desc = { celestar@1935: -1,-1, 396, 88, truelight@0: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, ludde@2064: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, celestar@995: _orders_widgets, truelight@0: OrdersWndProc truelight@0: }; truelight@0: celestar@995: static const Widget _other_orders_widgets[] = { peter1138@2725: { 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_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: tron@2549: void ShowOrdersWindow(const 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) { tron@2549: w = AllocateWindowDesc(&_other_orders_desc); tron@2549: } else { tron@2549: w = AllocateWindowDesc((v->type == VEH_Train) ? &_orders_train_desc : &_orders_desc); tron@2549: } 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: }