38 #include "table/strings.h" 
   52 static const NWidgetPart _nested_build_vehicle_widgets[] = {
 
   74     NWidget(
WWT_MATRIX, COLOUR_GREY, 
WID_BV_LIST), 
SetResize(1, 1), 
SetFill(1, 0), 
SetMatrixDataTip(1, 0, STR_NULL), 
SetScrollbar(
WID_BV_SCROLLBAR),
 
  123   const int r = va - vb;
 
  139   static char     last_name[2][64] = { 
"\0", 
"\0" };
 
  144   if (va != last_engine[0]) {
 
  147     GetString(last_name[0], STR_ENGINE_NAME, 
lastof(last_name[0]));
 
  150   if (vb != last_engine[1]) {
 
  153     GetString(last_name[1], STR_ENGINE_NAME, 
lastof(last_name[1]));
 
  156   int r = 
strnatcmp(last_name[0], last_name[1]); 
 
  173   const int r = va - vb;
 
  239   int va = 
Engine::Get(*a)->GetDisplayMaxTractiveEffort();
 
  240   int vb = 
Engine::Get(*b)->GetDisplayMaxTractiveEffort();
 
  321   int val_a = (RailVehInfo(*a)->railveh_type == 
RAILVEH_WAGON ? 1 : 0);
 
  322   int val_b = (RailVehInfo(*b)->railveh_type == 
RAILVEH_WAGON ? 1 : 0);
 
  323   int r = val_a - val_b;
 
  384   uint16 mail_a, mail_b;
 
  472   STR_SORT_BY_ENGINE_ID,
 
  474   STR_SORT_BY_MAX_SPEED,
 
  476   STR_SORT_BY_TRACTIVE_EFFORT,
 
  477   STR_SORT_BY_INTRO_DATE,
 
  479   STR_SORT_BY_RUNNING_COST,
 
  480   STR_SORT_BY_POWER_VS_RUNNING_COST,
 
  481   STR_SORT_BY_RELIABILITY,
 
  482   STR_SORT_BY_CARGO_CAPACITY,
 
  486   STR_SORT_BY_ENGINE_ID,
 
  488   STR_SORT_BY_MAX_SPEED,
 
  490   STR_SORT_BY_TRACTIVE_EFFORT,
 
  491   STR_SORT_BY_INTRO_DATE,
 
  493   STR_SORT_BY_RUNNING_COST,
 
  494   STR_SORT_BY_POWER_VS_RUNNING_COST,
 
  495   STR_SORT_BY_RELIABILITY,
 
  496   STR_SORT_BY_CARGO_CAPACITY,
 
  500   STR_SORT_BY_ENGINE_ID,
 
  502   STR_SORT_BY_MAX_SPEED,
 
  503   STR_SORT_BY_INTRO_DATE,
 
  505   STR_SORT_BY_RUNNING_COST,
 
  506   STR_SORT_BY_RELIABILITY,
 
  507   STR_SORT_BY_CARGO_CAPACITY,
 
  511   STR_SORT_BY_ENGINE_ID,
 
  513   STR_SORT_BY_MAX_SPEED,
 
  514   STR_SORT_BY_INTRO_DATE,
 
  516   STR_SORT_BY_RUNNING_COST,
 
  517   STR_SORT_BY_RELIABILITY,
 
  518   STR_SORT_BY_CARGO_CAPACITY,
 
  526   if (cid == 
CF_ANY) 
return true;
 
  528   return (cid == 
CF_NONE ? refit_mask == 0 : 
HasBit(refit_mask, cid));
 
  535 static int DrawCargoCapacityInfo(
int left, 
int right, 
int y, 
EngineID engine)
 
  542     if (cap[c] == 0) 
continue;
 
  546     SetDParam(2, 
HasBit(refits, c) ? STR_PURCHASE_INFO_REFITTABLE : STR_EMPTY);
 
  547     DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY);
 
  555 static int DrawRailWagonPurchaseInfo(
int left, 
int right, 
int y, 
EngineID engine_number, 
const RailVehicleInfo *rvi)
 
  561   DrawString(left, right, y, STR_PURCHASE_INFO_COST);
 
  569   DrawString(left, right, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT);
 
  577       DrawString(left, right, y, STR_PURCHASE_INFO_SPEED);
 
  583   if (rvi->running_cost_class != INVALID_PRICE) {
 
  585     DrawString(left, right, y, STR_PURCHASE_INFO_RUNNINGCOST);
 
  593 static int DrawRailEnginePurchaseInfo(
int left, 
int right, 
int y, 
EngineID engine_number, 
const RailVehicleInfo *rvi)
 
  600   DrawString(left, right, y, STR_PURCHASE_INFO_COST_WEIGHT);
 
  606   DrawString(left, right, y, STR_PURCHASE_INFO_SPEED_POWER);
 
  612     DrawString(left, right, y, STR_PURCHASE_INFO_MAX_TE);
 
  617   if (rvi->running_cost_class != INVALID_PRICE) {
 
  619     DrawString(left, right, y, STR_PURCHASE_INFO_RUNNINGCOST);
 
  627     DrawString(left, right, y, STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT);
 
  635 static int DrawRoadVehPurchaseInfo(
int left, 
int right, 
int y, 
EngineID engine_number)
 
  642     DrawString(left, right, y, STR_PURCHASE_INFO_COST);
 
  650     DrawString(left, right, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT);
 
  656     DrawString(left, right, y, STR_PURCHASE_INFO_SPEED_POWER);
 
  661     DrawString(left, right, y, STR_PURCHASE_INFO_MAX_TE);
 
  667     DrawString(left, right, y, STR_PURCHASE_INFO_COST_SPEED);
 
  673   DrawString(left, right, y, STR_PURCHASE_INFO_RUNNINGCOST);
 
  680 static int DrawShipPurchaseInfo(
int left, 
int right, 
int y, 
EngineID engine_number, 
bool refittable)
 
  690   if (ocean_speed == canal_speed) {
 
  692     DrawString(left, right, y, STR_PURCHASE_INFO_COST_SPEED);
 
  695     DrawString(left, right, y, STR_PURCHASE_INFO_COST);
 
  699     DrawString(left, right, y, STR_PURCHASE_INFO_SPEED_OCEAN);
 
  703     DrawString(left, right, y, STR_PURCHASE_INFO_SPEED_CANAL);
 
  710   SetDParam(2, refittable ? STR_PURCHASE_INFO_REFITTABLE : STR_EMPTY);
 
  711   DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY);
 
  716   DrawString(left, right, y, STR_PURCHASE_INFO_RUNNINGCOST);
 
  723 static int DrawAircraftPurchaseInfo(
int left, 
int right, 
int y, 
EngineID engine_number, 
bool refittable)
 
  731   DrawString(left, right, y, STR_PURCHASE_INFO_COST_SPEED);
 
  735   uint16 mail_capacity;
 
  737   if (mail_capacity > 0) {
 
  742     DrawString(left, right, y, STR_PURCHASE_INFO_AIRCRAFT_CAPACITY);
 
  748     SetDParam(2, refittable ? STR_PURCHASE_INFO_REFITTABLE : STR_EMPTY);
 
  749     DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY);
 
  755   DrawString(left, right, y, STR_PURCHASE_INFO_RUNNINGCOST);
 
  761     DrawString(left, right, y, STR_PURCHASE_INFO_AIRCRAFT_RANGE);
 
  781   if (callback > 0x400) {
 
  804   bool articulated_cargo = 
false;
 
  807     default: NOT_REACHED();
 
  810         y = DrawRailWagonPurchaseInfo(left, right, y, engine_number, &e->u.rail);
 
  812         y = DrawRailEnginePurchaseInfo(left, right, y, engine_number, &e->u.rail);
 
  814       articulated_cargo = 
true;
 
  818       y = DrawRoadVehPurchaseInfo(left, right, y, engine_number);
 
  819       articulated_cargo = 
true;
 
  823       y = DrawShipPurchaseInfo(left, right, y, engine_number, refittable);
 
  827       y = DrawAircraftPurchaseInfo(left, right, y, engine_number, refittable);
 
  831   if (articulated_cargo) {
 
  833     int new_y = DrawCargoCapacityInfo(left, right, y, engine_number);
 
  838       DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY);
 
  850     DrawString(left, right, y, STR_PURCHASE_INFO_DESIGNED_LIFE);
 
  855     DrawString(left, right, y, STR_PURCHASE_INFO_RELIABILITY);
 
  882   static const int sprite_y_offsets[] = { -1, -1, -2, -2 };
 
  885   assert(max <= eng_list->Length());
 
  891   int sprite_width = sprite_left + sprite_right;
 
  893   int sprite_x        = rtl ? r - sprite_right - 1 : l + sprite_left + 1;
 
  894   int sprite_y_offset = sprite_y_offsets[type] + step_size / 2;
 
  912   int replace_icon_y_offset = (step_size - replace_icon.height) / 2 - 1;
 
  914   for (; min < 
max; min++, y += step_size) {
 
  921     StringID str = hidden ? STR_HIDDEN_ENGINE_NAME : STR_ENGINE_NAME;
 
  925     DrawString(text_left, text_right, y + normal_text_y_offset, str, tc);
 
  944   uint32 hidden_mask = 0;
 
  990       default: NOT_REACHED();
 
 1015     widget->
tool_tip = STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP + type;
 
 1018     widget->
tool_tip = STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP + type;
 
 1021     widget->
widget_data = STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON + type;
 
 1022     widget->
tool_tip    = STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP + type;
 
 1025     widget->
widget_data = STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON + type;
 
 1026     widget->
tool_tip    = STR_BUY_VEHICLE_TRAIN_RENAME_TOOLTIP + type;
 
 1029     widget->
widget_data = STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN + type;
 
 1030     widget->
tool_tip    = STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP + type;
 
 1040     this->GenerateBuildList(); 
 
 1042     if (this->eng_list.
Length() > 0) this->sel_engine = this->eng_list[0];
 
 1048     uint filter_items = 0;
 
 1059       this->
cargo_filter_texts[filter_items] = STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE;
 
 1078     for (uint i = 0; i < filter_items; i++) {
 
 1098     if (0 == this->eng_list.
Length()) { 
 
 1100     } 
else if (!this->eng_list.
Contains(this->sel_engine)) { 
 
 1113   void GenerateBuildTrainList()
 
 1116     int num_engines = 0;
 
 1121     this->eng_list.
Clear();
 
 1139       *this->eng_list.
Append() = eid;
 
 1165   void GenerateBuildRoadVehList()
 
 1169     this->eng_list.
Clear();
 
 1172     FOR_ALL_ENGINES_OF_TYPE(e, 
VEH_ROAD) {
 
 1177       *this->eng_list.
Append() = eid;
 
 1185   void GenerateBuildShipList()
 
 1188     this->eng_list.
Clear();
 
 1191     FOR_ALL_ENGINES_OF_TYPE(e, 
VEH_SHIP) {
 
 1195       *this->eng_list.
Append() = eid;
 
 1203   void GenerateBuildAircraftList()
 
 1207     this->eng_list.
Clear();
 
 1223       *this->eng_list.
Append() = eid;
 
 1231   void GenerateBuildList()
 
 1235       default: NOT_REACHED();
 
 1237         this->GenerateBuildTrainList();
 
 1242         this->GenerateBuildRoadVehList();
 
 1245         this->GenerateBuildShipList();
 
 1248         this->GenerateBuildAircraftList();
 
 1281         size_t num_items = this->eng_list.
Length();
 
 1336     if (!gui_scope) 
return;
 
 1340         this->sort_criteria > 7) {
 
 1384         size->height = 3 * resize->height;
 
 1395         d.height += padding.height;
 
 1396         *size = 
maxdim(*size, d);
 
 1403         size->width += padding.width;
 
 1404         size->height += padding.height;
 
 1413         DrawEngineList(this->
vehicle_type, r.left + 
WD_FRAMERECT_LEFT, r.right - 
WD_FRAMERECT_RIGHT, r.top + 
WD_FRAMERECT_TOP, &this->eng_list, this->vscroll->GetPosition(), 
min(this->vscroll->
GetPosition() + this->vscroll->
GetCapacity(), this->eng_list.
Length()), this->
sel_engine, 
false, 
DEFAULT_GROUP);
 
 1424     this->GenerateBuildList();
 
 1442         this->details_height = needed_height;
 
 1451     if (str == NULL) 
return;
 
 1487   WDP_AUTO, 
"build_vehicle", 240, 268,
 
 1490   _nested_build_vehicle_widgets, 
lengthof(_nested_build_vehicle_widgets)