diff -r 4874b9ce2765 -r efc3546bc313 vehicle_gui.c --- a/vehicle_gui.c Sun Jan 02 12:03:43 2005 +0000 +++ b/vehicle_gui.c Sun Jan 02 17:23:04 2005 +0000 @@ -3,6 +3,10 @@ #include "table/strings.h" #include "vehicle.h" #include "window.h" +#include "engine.h" +#include "gui.h" +#include "command.h" +#include "gfx.h" VehicleSortListingTypeFunctions * const _vehicle_sorter[] = { &VehicleUnsortedSorter, @@ -29,6 +33,13 @@ INVALID_STRING_ID }; +const StringID _rail_types_list[] = { + STR_RAIL_VEHICLES, + STR_MONORAIL_VEHICLES, + STR_MAGLEV_VEHICLES, + INVALID_STRING_ID +}; + void RebuildVehicleLists(void) { Window *w; @@ -294,3 +305,636 @@ return (_internal_sort_order & 1) ? -r : r; } + +// this define is to match engine.c, but engine.c keeps it to itself +// ENGINE_AVAILABLE is used in ReplaceVehicleWndProc +#define ENGINE_AVAILABLE ((e->flags & 1 && HASBIT(info->railtype_climates, _opt.landscape)) || HASBIT(e->player_avail, _local_player)) + +/* if show_outdated is selected, it do not sort psudo engines properly but it draws all engines + * if used compined with show_cars set to false, it will work as intended. Replace window do it like that + * this was a big hack even before show_outdated was added. Stupid newgrf :p */ +static void train_engine_drawing_loop(int *x, int *y, int *pos, int *sel, int *selected_id, byte railtype, + uint8 lines_drawn, bool is_engine, bool show_cars, bool show_outdated) +{ + int i; + byte colour; + + for (i = 0; i < NUM_TRAIN_ENGINES; i++) { + const Engine *e = DEREF_ENGINE(i); + const RailVehicleInfo *rvi = RailVehInfo(i); + const EngineInfo *info = &_engine_info[i]; + + if ( rvi->power == 0 && !(show_cars) ) // disables display of cars (works since they do not have power) + continue; + + if (*sel == 0) *selected_id = i; + + + colour = *sel == 0 ? 0xC : 0x10; + if (!(ENGINE_AVAILABLE && show_outdated && RailVehInfo(i)->power && e->railtype == railtype)) { + if (e->railtype != railtype || !(rvi->flags & RVI_WAGON) != is_engine || + !HASBIT(e->player_avail, _local_player)) + continue; + } /*else { + // TODO find a nice red colour for vehicles being replaced + if ( _autoreplace_array[i] != i ) + colour = *sel == 0 ? 0x44 : 0x45; + } */ + + if (IS_INT_INSIDE(--*pos, -lines_drawn, 0)) { + DrawString(*x + 59, *y + 2, GetCustomEngineName(i), + colour); + DrawTrainEngine(*x + 29, *y + 6, i, + SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + *y += 14; + } + --*sel; + } +} + + +static void SetupScrollStuffForReplaceWindow(Window *w) +{ + byte railtype; + int selected_id[2] = {-1,-1}; + int sel[2] = { WP(w,replaceveh_d).sel_index[0], WP(w,replaceveh_d).sel_index[1]}; + int count = 0; + int count2 = 0; + int engine_id; + + switch (WP(w,replaceveh_d).vehicletype) { + case VEH_Train: { + railtype = WP(w,replaceveh_d).railtype; + for (engine_id = 0; engine_id < NUM_TRAIN_ENGINES; engine_id++) { + const Engine *e = DEREF_ENGINE(engine_id); + const EngineInfo *info = &_engine_info[engine_id]; + + if (ENGINE_AVAILABLE && RailVehInfo(engine_id)->power && e->railtype == railtype) { + count++; + if (sel[0]==0) selected_id[0] = engine_id; + sel[0]--; + if (HASBIT(e->player_avail, _local_player)) { + if (sel[1]==0) selected_id[1] = engine_id; + count2++; + sel[1]--; + } + } + } + break; + } + case VEH_Road: { + int num = NUM_ROAD_ENGINES; + Engine *e = &_engines[ROAD_ENGINES_INDEX]; + byte cargo; + EngineInfo *info; + engine_id = ROAD_ENGINES_INDEX; + + do { + info = &_engine_info[engine_id]; + if (ENGINE_AVAILABLE) { + if (sel[0]==0) selected_id[0] = engine_id; + count++; + sel[0]--; + } + } while (++engine_id,++e,--num); + + if ( selected_id[0] != -1 ) { // only draw right array if we have anything in the left one + num = NUM_ROAD_ENGINES; + engine_id = ROAD_ENGINES_INDEX; + e = &_engines[ROAD_ENGINES_INDEX]; + cargo = RoadVehInfo(selected_id[0])->cargo_type; + + do { + if ( cargo == RoadVehInfo(engine_id)->cargo_type && HASBIT(e->player_avail, _local_player)) { + count2++; + if (sel[1]==0) selected_id[1] = engine_id; + sel[1]--; + } + } while (++engine_id,++e,--num); + } + break; + } + + case VEH_Ship: { + int num = NUM_SHIP_ENGINES; + Engine *e = &_engines[SHIP_ENGINES_INDEX]; + byte cargo; + EngineInfo *info; + engine_id = SHIP_ENGINES_INDEX; + byte refittable; + + do { + info = &_engine_info[engine_id]; + if (ENGINE_AVAILABLE) { + if ( sel[0] == 0 ) selected_id[0] = engine_id; + count++; + sel[0]--; + } + } while (++engine_id,++e,--num); + + if ( selected_id[0] != -1 ) { + num = NUM_SHIP_ENGINES; + e = &_engines[SHIP_ENGINES_INDEX]; + engine_id = SHIP_ENGINES_INDEX; + cargo = ShipVehInfo(selected_id[0])->cargo_type; + refittable = ShipVehInfo(selected_id[0])->refittable; + + do { + if (HASBIT(e->player_avail, _local_player) + && ( cargo == ShipVehInfo(engine_id)->cargo_type || refittable & ShipVehInfo(engine_id)->refittable)) { + + if ( sel[1]==0) selected_id[1] = engine_id; + sel[1]--; + count2++; + } + } while (++engine_id,++e,--num); + } + break; + } //end of ship + + case VEH_Aircraft:{ + int num = NUM_AIRCRAFT_ENGINES; + Engine *e = &_engines[AIRCRAFT_ENGINES_INDEX]; + EngineInfo *info; + engine_id = AIRCRAFT_ENGINES_INDEX; + byte subtype; + + do { + info = &_engine_info[engine_id]; + if (ENGINE_AVAILABLE) { + count++; + if (sel[0]==0) selected_id[0] = engine_id; + sel[0]--; + } + } while (++engine_id,++e,--num); + + if ( selected_id[0] != -1 ) { + num = NUM_AIRCRAFT_ENGINES; + e = &_engines[AIRCRAFT_ENGINES_INDEX]; + subtype = AircraftVehInfo(selected_id[0])->subtype; + engine_id = AIRCRAFT_ENGINES_INDEX; + do { + if (HASBIT(e->player_avail, _local_player)) { + if ( (subtype && AircraftVehInfo(engine_id)->subtype) || (!(subtype) && !AircraftVehInfo(engine_id)->subtype) ) { + count2++; + if (sel[1]==0) selected_id[1] = engine_id; + sel[1]--; + } + } + } while (++engine_id,++e,--num); + } + break; + } + } + // sets up the number of items in each list + SetVScrollCount(w, count); + SetVScroll2Count(w, count2); + WP(w,replaceveh_d).sel_engine[0] = selected_id[0]; + WP(w,replaceveh_d).sel_engine[1] = selected_id[1]; + + WP(w,replaceveh_d).count[0] = count; + WP(w,replaceveh_d).count[1] = count2; + return; +} + + +static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int y2, int pos, int pos2, + int sel1, int sel2, int selected_id1, int selected_id2) +{ + int sel[2] = {sel1, sel2}; + int selected_id[2] = {selected_id1, selected_id2}; + switch (WP(w,replaceveh_d).vehicletype) { + case VEH_Train: { + byte railtype = WP(w,replaceveh_d).railtype; + DrawString(157, 89 + (14 * w->vscroll.cap), _rail_types_list[railtype], 0x10); + /* draw sorting criteria string */ + + /* Ensure that custom engines which substituted wagons + * are sorted correctly. + * XXX - DO NOT EVER DO THIS EVER AGAIN! GRRR hacking in wagons as + * engines to get more types.. Stays here until we have our own format + * then it is exit!!! */ + train_engine_drawing_loop(&x, &y, &pos, &sel[0], &selected_id[0], railtype, w->vscroll.cap, true, false, true); // True engines + train_engine_drawing_loop(&x2, &y2, &pos2, &sel[1], &selected_id[1], railtype, w->vscroll.cap, true, false, false); // True engines + train_engine_drawing_loop(&x2, &y2, &pos2, &sel[1], &selected_id[1], railtype, w->vscroll.cap, false, false, false); // Feeble wagons + break; + } + + case VEH_Road: { + int num = NUM_ROAD_ENGINES; + Engine *e = &_engines[ROAD_ENGINES_INDEX]; + int engine_id = ROAD_ENGINES_INDEX; + byte cargo; + EngineInfo *info; + + if ( selected_id[0] >= ROAD_ENGINES_INDEX && selected_id[0] <= SHIP_ENGINES_INDEX ) + cargo = RoadVehInfo(selected_id[0])->cargo_type; + + do { + info = &_engine_info[engine_id]; + if (ENGINE_AVAILABLE) { + if (IS_INT_INSIDE(--pos, -w->vscroll.cap, 0)) { + DrawString(x+59, y+2, GetCustomEngineName(engine_id), sel[0]==0 ? 0xC : 0x10); + DrawRoadVehEngine(x+29, y+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + y += 14; + } + + if ( RoadVehInfo(engine_id)->cargo_type == cargo && HASBIT(e->player_avail, _local_player) ) { + if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0) && RoadVehInfo(engine_id)->cargo_type == cargo) { + DrawString(x2+59, y2+2, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10); + DrawRoadVehEngine(x2+29, y2+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + y2 += 14; + } + sel[1]--; + } + sel[0]--; + } + } while (++engine_id, ++e,--num); + + break; + } + + case VEH_Ship: { + int num = NUM_SHIP_ENGINES; + Engine *e = &_engines[SHIP_ENGINES_INDEX]; + int engine_id = SHIP_ENGINES_INDEX; + byte cargo, refittable; + EngineInfo *info; + + if ( selected_id[0] != -1 ) { + cargo = ShipVehInfo(selected_id[0])->cargo_type; + refittable = ShipVehInfo(selected_id[0])->refittable; + } + + do { + info = &_engine_info[engine_id]; + if (ENGINE_AVAILABLE) { + if (IS_INT_INSIDE(--pos, -w->vscroll.cap, 0)) { + DrawString(x+75, y+7, GetCustomEngineName(engine_id), sel[0]==0 ? 0xC : 0x10); + DrawShipEngine(x+35, y+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + y += 24; + } + if ( selected_id[0] != -1 ) { + if (HASBIT(e->player_avail, _local_player) && ( cargo == ShipVehInfo(engine_id)->cargo_type || refittable & ShipVehInfo(engine_id)->refittable)) { + if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0)) { + DrawString(x2+75, y2+7, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10); + DrawShipEngine(x2+35, y2+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + y2 += 24; + } + sel[1]--; + } + } + sel[0]--; + } + } while (++engine_id, ++e,--num); + break; + } //end of ship + + case VEH_Aircraft: { + if ( selected_id[0] != -1 ) { + int num = NUM_AIRCRAFT_ENGINES; + Engine *e = &_engines[AIRCRAFT_ENGINES_INDEX]; + int engine_id = AIRCRAFT_ENGINES_INDEX; + byte subtype = AircraftVehInfo(selected_id[0])->subtype; + EngineInfo *info; + + do { + info = &_engine_info[engine_id]; + if (ENGINE_AVAILABLE) { + if (sel[0]==0) selected_id[0] = engine_id; + if (IS_INT_INSIDE(--pos, -w->vscroll.cap, 0)) { + DrawString(x+62, y+7, GetCustomEngineName(engine_id), sel[0]==0 ? 0xC : 0x10); + DrawAircraftEngine(x+29, y+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + y += 24; + } + if ( ((subtype && AircraftVehInfo(engine_id)->subtype) || (!(subtype) && !AircraftVehInfo(engine_id)->subtype)) + && HASBIT(e->player_avail, _local_player) ) { + if (sel[1]==0) selected_id[1] = engine_id; + if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0)) { + DrawString(x2+62, y2+7, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10); + DrawAircraftEngine(x2+29, y2+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + y2 += 24; + } + sel[1]--; + } + sel[0]--; + } + } while (++engine_id, ++e,--num); + } + break; + } // end of aircraft + } + +} +static void ReplaceVehicleWndProc(Window *w, WindowEvent *e) +{ + // these 3 variables is used if any of the lists is clicked + uint16 click_scroll_pos = w->vscroll2.pos; + uint16 click_scroll_cap = w->vscroll2.cap; + byte click_side = 1; + + switch(e->event) { + case WE_PAINT: + { + int pos = w->vscroll.pos; + int selected_id[2] = {-1,-1}; + int x = 1; + int y = 15; + int pos2 = w->vscroll2.pos; + int x2 = 1 + 228; + int y2 = 15; + int sel[2] = { WP(w,replaceveh_d).sel_index[0], WP(w,replaceveh_d).sel_index[1]}; + + SetupScrollStuffForReplaceWindow(w); + + selected_id[0] = WP(w,replaceveh_d).sel_engine[0]; + selected_id[1] = WP(w,replaceveh_d).sel_engine[1]; + + // sets the selected left item to the top one if it's greater than the number of vehicles in the left side + + if ( WP(w,replaceveh_d).count[0] <= sel[0] ) { + if (WP(w,replaceveh_d).count[0]) { + sel[0] = 0; + WP(w,replaceveh_d).sel_index[0] = 0; + w->vscroll.pos = 0; + // now we go back to set selected_id[1] properly + SetWindowDirty(w); + return; + } else { //there are no vehicles in the left window + selected_id[1] = -1; + } + } + + if ( WP(w,replaceveh_d).count[1] <= sel[1] ) { + if (WP(w,replaceveh_d).count[1]) { + sel[1] = 0; + WP(w,replaceveh_d).sel_index[1] = 0; + w->vscroll2.pos = 0; + // now we go back to set selected_id[1] properly + SetWindowDirty(w); + return; + } else { //there are no vehicles in the right window + selected_id[1] = -1; + } + } + + if ( selected_id[0] == selected_id[1] || _autoreplace_array[selected_id[0]] == selected_id[1] + || selected_id[0] == -1 || selected_id[1] == -1 ) + SETBIT(w->disabled_state, 4); + else + CLRBIT(w->disabled_state, 4); + + if ( _autoreplace_array[selected_id[0]] == selected_id[0] || selected_id[0] == -1 ) + SETBIT(w->disabled_state, 6); + else + CLRBIT(w->disabled_state, 6); + + // now the actual drawing of the window itself takes place + DrawWindowWidgets(w); + + + + // sets up the string for the vehicle that is being replaced to + if ( selected_id[0] != -1 ) { + if ( selected_id[0] == _autoreplace_array[selected_id[0]] ) + SetDParam(0, STR_NOT_REPLACING); + else + SetDParam(0, GetCustomEngineName(_autoreplace_array[selected_id[0]])); + } else { + SetDParam(0, STR_NOT_REPLACING_VEHICLE_SELECTED); + } + + + DrawString(145, (WP(w,replaceveh_d).line_height == 24 ? 67 : 77 ) + ( WP(w,replaceveh_d).line_height * w->vscroll.cap), STR_02BD, 0x10); + + + /* now we draw the two arrays according to what we just counted */ + DrawEngineArrayInReplaceWindow(w, x, y, x2, y2, pos, pos2, sel[0], sel[1], selected_id[0], selected_id[1]); + + WP(w,replaceveh_d).sel_engine[0] = selected_id[0]; + WP(w,replaceveh_d).sel_engine[1] = selected_id[1]; + /* now we draw the info about the vehicles we selected */ + switch (WP(w,replaceveh_d).vehicletype) { + case VEH_Train: { + byte i = 0; + int offset = 0; + + for ( i = 0 ; i < 2 ; i++) { + if ( i ) + offset = 228; + if (selected_id[i] != -1) { + if (!(RailVehInfo(selected_id[i])->flags & RVI_WAGON)) { + /* it's an engine */ + Set_DPARAM_Train_Engine_Build_Window(selected_id[i]); + DrawString(2 + offset, 15 + (14 * w->vscroll.cap), STR_8817_COST_WEIGHT_T_SPEED_POWER, 0); + } else { + /* it's a wagon. Train cars are not replaced with the current GUI, but this code is ready for newgrf if anybody adds that*/ + Set_DPARAM_Train_Car_Build_Window(w, selected_id[i]); + DrawString(2 + offset, 15 + (14 * w->vscroll.cap), STR_8821_COST_WEIGHT_T_T_CAPACITY, 0); + } + } + } + break; + } //end if case VEH_Train + + case VEH_Road: { + if (selected_id[0] != -1) { + Set_DPARAM_Road_Veh_Build_Window(selected_id[0]); + DrawString(2, 15 + (14 * w->vscroll.cap), STR_9008_COST_SPEED_RUNNING_COST, 0); + if (selected_id[1] != -1) { + Set_DPARAM_Road_Veh_Build_Window(selected_id[1]); + DrawString(2 + 228, 15 + (14 * w->vscroll.cap), STR_9008_COST_SPEED_RUNNING_COST, 0); + } + } + break; + } // end of VEH_Road + + case VEH_Ship: { + if (selected_id[0] != -1) { + Set_DPARAM_Ship_Build_Window(selected_id[0]); + DrawString(2, 15 + (24 * w->vscroll.cap), STR_980A_COST_SPEED_CAPACITY_RUNNING, 0); + if (selected_id[1] != -1) { + Set_DPARAM_Ship_Build_Window(selected_id[1]); + DrawString(2 + 228, 15 + (24 * w->vscroll.cap), STR_980A_COST_SPEED_CAPACITY_RUNNING, 0); + } + } + break; + } // end of VEH_Ship + + case VEH_Aircraft: { + if (selected_id[0] != -1) { + Set_DPARAM_Aircraft_Build_Window(selected_id[0]); + DrawString(2, 15 + (24 * w->vscroll.cap), STR_A007_COST_SPEED_CAPACITY_PASSENGERS, 0); + if (selected_id[1] != -1) { + Set_DPARAM_Aircraft_Build_Window(selected_id[1]); + DrawString(2 + 228, 15 + (24 * w->vscroll.cap), STR_A007_COST_SPEED_CAPACITY_PASSENGERS, 0); + } + } + break; + } // end of VEH_Aircraft + } + } // end of paint + + case WE_CLICK: { + switch(e->click.widget) { + /*case 0: + DeleteWindowById(WC_REPLACE_VEHICLE, WP(w,replaceveh_d).vehicletype ); + break;*/ + + case 14: case 15:/* Select sorting criteria dropdown menu */ + // finds mask for available engines + { + int engine_avail = 0; + if ( !(HASBIT(_engines[NUM_NORMAL_RAIL_ENGINES + NUM_MONORAIL_ENGINES].player_avail, _local_player))) { + engine_avail = 4; + if ( !(HASBIT(_engines[NUM_NORMAL_RAIL_ENGINES].player_avail, _local_player))) + engine_avail = 6; + } + ShowDropDownMenu(w, _rail_types_list, WP(w,replaceveh_d).railtype, 15, engine_avail, 1); + return; + } + case 4: { + _autoreplace_array[WP(w,replaceveh_d).sel_engine[0]] = WP(w,replaceveh_d).sel_engine[1]; + SetWindowDirty(w); + break; + } + + case 6: { + _autoreplace_array[WP(w,replaceveh_d).sel_engine[0]] = WP(w,replaceveh_d).sel_engine[0]; + SetWindowDirty(w); + break; + } + + case 7: + // sets up that the left one was clicked. The default values are for the right one (9) + // this way, the code for 9 handles both sides + click_scroll_pos = w->vscroll.pos; + click_scroll_cap = w->vscroll.cap; + click_side = 0; + case 9: { + uint i = (e->click.pt.y - 14) / WP(w,replaceveh_d).line_height; + if (i < click_scroll_cap) { + WP(w,replaceveh_d).sel_index[click_side] = i + click_scroll_pos; + SetWindowDirty(w); + } + } break; + } + + } break; + + case WE_DROPDOWN_SELECT: { /* we have selected a dropdown item in the list */ + //potiential bug: railtypes needs to be activated 0, 1, 2... If one is skipped, it messes up + WP(w,replaceveh_d).railtype = e->dropdown.index; + SetWindowDirty(w); + break; + } + } +} + +static const Widget _replace_rail_vehicle_widgets[] = { +{ WWT_CLOSEBOX, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_CAPTION, 14, 11, 443, 0, 13, STR_REPLACE_VEHICLES, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_STICKYBOX, 14, 444, 455, 0, 13, 0x0, STR_STICKY_BUTTON}, +{ WWT_PANEL, 14, 0, 227, 126, 187, 0x0, STR_NULL}, +{ WWT_PUSHTXTBTN, 14, 0, 138, 200, 211, STR_REPLACE_VEHICLES_START,STR_REPLACE_HELP_START_BUTTON}, +{ WWT_PANEL, 14, 139, 316, 188, 199, 0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB}, +{ WWT_PUSHTXTBTN, 14, 317, 455, 200, 211, STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON}, +{ WWT_MATRIX, 14, 0, 216, 14, 125, 0x801, STR_REPLACE_HELP_LEFT_ARRAY}, +{ WWT_SCROLLBAR, 14, 217, 227, 14, 125, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_MATRIX, 14, 228, 455, 14, 125, 0x801, STR_REPLACE_HELP_RIGHT_ARRAY}, +{ WWT_SCROLL2BAR, 14, 445, 455, 14, 125, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_PANEL, 14, 228, 455, 126, 187, 0x0, STR_NULL}, +// the rest are train specific stuff +{ WWT_PANEL, 14, 0, 138, 188, 199, 0x0, STR_NULL}, +{ WWT_PANEL, 3, 139, 153, 200, 211, 0x0, STR_NULL}, +{ WWT_PANEL, 14, 154, 290, 200, 211, 0x0, STR_REPLACE_HELP_RAILTYPE}, +{ WWT_CLOSEBOX, 14, 291, 301, 200, 210, STR_0225, STR_REPLACE_HELP_RAILTYPE}, +{ WWT_PANEL, 3, 301, 316, 200, 211, 0x0, STR_NULL}, +{ WWT_PANEL, 14, 317, 455, 188, 199, 0x0, STR_NULL}, + +{ WIDGETS_END}, +}; + +static const Widget _replace_road_vehicle_widgets[] = { +{ WWT_CLOSEBOX, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_CAPTION, 14, 11, 443, 0, 13, STR_REPLACE_VEHICLES, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_STICKYBOX, 14, 444, 455, 0, 13, 0x0, STR_STICKY_BUTTON}, +{ WWT_PANEL, 14, 0, 227, 126, 187, 0x0, STR_NULL}, +{ WWT_PUSHTXTBTN, 14, 0, 138, 188, 199, STR_REPLACE_VEHICLES_START,STR_REPLACE_HELP_START_BUTTON}, +{ WWT_PANEL, 14, 139, 316, 188, 199, 0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB}, +{ WWT_PUSHTXTBTN, 14, 317, 455, 188, 199, STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON}, +{ WWT_MATRIX, 14, 0, 216, 14, 125, 0x801, STR_REPLACE_HELP_LEFT_ARRAY}, +{ WWT_SCROLLBAR, 14, 217, 227, 14, 125, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_MATRIX, 14, 228, 455, 14, 125, 0x801, STR_REPLACE_HELP_RIGHT_ARRAY}, +{ WWT_SCROLL2BAR, 14, 445, 455, 14, 125, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_PANEL, 14, 228, 455, 126, 187, 0x0, STR_NULL}, +{ WIDGETS_END}, +}; + +static const Widget _replace_ship_aircraft_vehicle_widgets[] = { +{ WWT_CLOSEBOX, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_CAPTION, 14, 11, 443, 0, 13, STR_REPLACE_VEHICLES, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_STICKYBOX, 14, 444, 455, 0, 13, 0x0, STR_STICKY_BUTTON}, +{ WWT_PANEL, 14, 0, 227, 110, 161, 0x0, STR_NULL}, +{ WWT_PUSHTXTBTN, 14, 0, 138, 162, 173, STR_REPLACE_VEHICLES_START,STR_REPLACE_HELP_START_BUTTON}, +{ WWT_PANEL, 14, 139, 316, 162, 173, 0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB}, +{ WWT_PUSHTXTBTN, 14, 317, 455, 162, 173, STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON}, +{ WWT_MATRIX, 14, 0, 216, 14, 109, 0x401, STR_REPLACE_HELP_LEFT_ARRAY}, +{ WWT_SCROLLBAR, 14, 217, 227, 14, 109, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_MATRIX, 14, 228, 455, 14, 109, 0x401, STR_REPLACE_HELP_RIGHT_ARRAY}, +{ WWT_SCROLL2BAR, 14, 445, 455, 14, 109, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_PANEL, 14, 228, 455, 110, 161, 0x0, STR_NULL}, +{ WIDGETS_END}, +}; + +static const WindowDesc _replace_rail_vehicle_desc = { + -1, -1, 456, 212, + WC_REPLACE_VEHICLE,0, + WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, + _replace_rail_vehicle_widgets, + ReplaceVehicleWndProc +}; + +static const WindowDesc _replace_road_vehicle_desc = { + -1, -1, 456, 200, + WC_REPLACE_VEHICLE,0, + WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, + _replace_road_vehicle_widgets, + ReplaceVehicleWndProc +}; + +static const WindowDesc _replace_ship_aircraft_vehicle_desc = { + -1, -1, 456, 174, + WC_REPLACE_VEHICLE,0, + WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON, + _replace_ship_aircraft_vehicle_widgets, + ReplaceVehicleWndProc +}; + + +void ShowReplaceVehicleWindow(byte vehicletype) +{ + Window *w; + + DeleteWindowById(WC_REPLACE_VEHICLE, vehicletype ); + + switch (vehicletype) { + case VEH_Train: + w = AllocateWindowDescFront(&_replace_rail_vehicle_desc, vehicletype); + w->vscroll.cap = 8; + WP(w,replaceveh_d).line_height = 14; + break; + case VEH_Road: + w = AllocateWindowDescFront(&_replace_road_vehicle_desc, vehicletype); + w->vscroll.cap = 8; + WP(w,replaceveh_d).line_height = 14; + break; + case VEH_Ship: case VEH_Aircraft: + w = AllocateWindowDescFront(&_replace_ship_aircraft_vehicle_desc, vehicletype); + w->vscroll.cap = 4; + WP(w,replaceveh_d).line_height = 24; + break; + } + WP(w,replaceveh_d).vehicletype = vehicletype; + w->vscroll2.cap = w->vscroll.cap; // these two are always the same +}