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)