src/build_vehicle_gui.cpp
branchnoai
changeset 9624 b71483f2330f
parent 9620 31e38d28a0af
child 9625 3301b1b3889c
equal deleted inserted replaced
9623:ee0173281563 9624:b71483f2330f
    25 #include "vehicle_gui.h"
    25 #include "vehicle_gui.h"
    26 #include "newgrf_engine.h"
    26 #include "newgrf_engine.h"
    27 #include "date.h"
    27 #include "date.h"
    28 #include "strings.h"
    28 #include "strings.h"
    29 #include "cargotype.h"
    29 #include "cargotype.h"
       
    30 #include "group.h"
    30 
    31 
    31 
    32 
    32 enum BuildVehicleWidgets {
    33 enum BuildVehicleWidgets {
    33 	BUILD_VEHICLE_WIDGET_CLOSEBOX = 0,
    34 	BUILD_VEHICLE_WIDGET_CLOSEBOX = 0,
    34 	BUILD_VEHICLE_WIDGET_CAPTION,
    35 	BUILD_VEHICLE_WIDGET_CAPTION,
   384 	y += 10;
   385 	y += 10;
   385 
   386 
   386 	/* Wagon weight - (including cargo) */
   387 	/* Wagon weight - (including cargo) */
   387 	uint weight = GetEngineProperty(engine_number, 0x16, rvi->weight);
   388 	uint weight = GetEngineProperty(engine_number, 0x16, rvi->weight);
   388 	SetDParam(0, weight);
   389 	SetDParam(0, weight);
   389 	SetDParam(1, (GetCargo(rvi->cargo_type)->weight * rvi->capacity >> 4) + weight);
   390 	SetDParam(1, (GetCargo(rvi->cargo_type)->weight * GetEngineProperty(engine_number, 0x14, rvi->capacity) >> 4) + weight);
   390 	DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, 0);
   391 	DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, 0);
   391 	y += 10;
   392 	y += 10;
   392 
   393 
   393 	/* Wagon speed limit, displayed if above zero */
   394 	/* Wagon speed limit, displayed if above zero */
   394 	if (_patches.wagon_speed_limits) {
   395 	if (_patches.wagon_speed_limits) {
   459 	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
   460 	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
   460 	y += 10;
   461 	y += 10;
   461 
   462 
   462 	/* Cargo type + capacity */
   463 	/* Cargo type + capacity */
   463 	SetDParam(0, rvi->cargo_type);
   464 	SetDParam(0, rvi->cargo_type);
   464 	SetDParam(1, rvi->capacity);
   465 	SetDParam(1, GetEngineProperty(engine_number, 0x0F, rvi->capacity));
   465 	SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY);
   466 	SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY);
   466 	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
   467 	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
   467 	y += 10;
   468 	y += 10;
   468 
   469 
   469 	return y;
   470 	return y;
   478 	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0);
   479 	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0);
   479 	y += 10;
   480 	y += 10;
   480 
   481 
   481 	/* Cargo type + capacity */
   482 	/* Cargo type + capacity */
   482 	SetDParam(0, svi->cargo_type);
   483 	SetDParam(0, svi->cargo_type);
   483 	SetDParam(1, svi->capacity);
   484 	SetDParam(1, GetEngineProperty(engine_number, 0x0D, svi->capacity));
   484 	SetDParam(2, svi->refittable ? STR_9842_REFITTABLE : STR_EMPTY);
   485 	SetDParam(2, svi->refittable ? STR_9842_REFITTABLE : STR_EMPTY);
   485 	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
   486 	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
   486 	y += 10;
   487 	y += 10;
   487 
   488 
   488 	/* Running cost */
   489 	/* Running cost */
   541 	YearMonthDay ymd;
   542 	YearMonthDay ymd;
   542 	ConvertDateToYMD(e->intro_date, &ymd);
   543 	ConvertDateToYMD(e->intro_date, &ymd);
   543 	bool refitable = false;
   544 	bool refitable = false;
   544 
   545 
   545 	switch (e->type) {
   546 	switch (e->type) {
       
   547 		default: NOT_REACHED();
   546 		case VEH_TRAIN: {
   548 		case VEH_TRAIN: {
   547 			const RailVehicleInfo *rvi = RailVehInfo(engine_number);
   549 			const RailVehicleInfo *rvi = RailVehInfo(engine_number);
   548 
   550 			uint capacity = GetEngineProperty(engine_number, 0x14, rvi->capacity);
   549 			refitable = (EngInfo(engine_number)->refit_mask != 0) && (rvi->capacity > 0);
   551 
       
   552 			refitable = (EngInfo(engine_number)->refit_mask != 0) && (capacity > 0);
   550 
   553 
   551 			if (rvi->railveh_type == RAILVEH_WAGON) {
   554 			if (rvi->railveh_type == RAILVEH_WAGON) {
   552 				y = DrawRailWagonPurchaseInfo(x, y, engine_number, rvi);
   555 				y = DrawRailWagonPurchaseInfo(x, y, engine_number, rvi);
   553 			} else {
   556 			} else {
   554 				y = DrawRailEnginePurchaseInfo(x, y, engine_number, rvi);
   557 				y = DrawRailEnginePurchaseInfo(x, y, engine_number, rvi);
   560 				SetDParam(2, STR_EMPTY);
   563 				SetDParam(2, STR_EMPTY);
   561 			} else {
   564 			} else {
   562 				int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
   565 				int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
   563 
   566 
   564 				SetDParam(0, rvi->cargo_type);
   567 				SetDParam(0, rvi->cargo_type);
   565 				SetDParam(1, (rvi->capacity * (CountArticulatedParts(engine_number) + 1)) << multihead);
   568 				SetDParam(1, (capacity * (CountArticulatedParts(engine_number) + 1)) << multihead);
   566 				SetDParam(2, refitable ? STR_9842_REFITTABLE : STR_EMPTY);
   569 				SetDParam(2, refitable ? STR_9842_REFITTABLE : STR_EMPTY);
   567 			}
   570 			}
   568 			DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
   571 			DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
   569 			y += 10;
   572 			y += 10;
   570 		}
   573 		}
   717 static void GenerateBuildList(Window *w)
   720 static void GenerateBuildList(Window *w)
   718 {
   721 {
   719 	buildvehicle_d *bv = &WP(w, buildvehicle_d);
   722 	buildvehicle_d *bv = &WP(w, buildvehicle_d);
   720 
   723 
   721 	switch (bv->vehicle_type) {
   724 	switch (bv->vehicle_type) {
       
   725 		default: NOT_REACHED();
   722 		case VEH_TRAIN:
   726 		case VEH_TRAIN:
   723 			GenerateBuildTrainList(w);
   727 			GenerateBuildTrainList(w);
   724 			return; // trains should not reach the last sorting
   728 			return; // trains should not reach the last sorting
   725 		case VEH_ROAD:
   729 		case VEH_ROAD:
   726 			GenerateBuildRoadVehList(w);
   730 			GenerateBuildRoadVehList(w);
   754  * @param min where to start in the list
   758  * @param min where to start in the list
   755  * @param max where in the list to end
   759  * @param max where in the list to end
   756  * @param selected_id what engine to highlight as selected, if any
   760  * @param selected_id what engine to highlight as selected, if any
   757  * @param show_count Display the number of vehicles (used by autoreplace)
   761  * @param show_count Display the number of vehicles (used by autoreplace)
   758  */
   762  */
   759 void DrawEngineList(byte type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count)
   763 void DrawEngineList(VehicleType type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group)
   760 {
   764 {
   761 	byte step_size = GetVehicleListHeight(type);
   765 	byte step_size = GetVehicleListHeight(type);
   762 	byte x_offset = 0;
   766 	byte x_offset = 0;
   763 	byte y_offset = 0;
   767 	byte y_offset = 0;
   764 	Player *p = GetPlayer(_local_player);
   768 	Player *p = GetPlayer(_local_player);
   790 		default: NOT_REACHED();
   794 		default: NOT_REACHED();
   791 	}
   795 	}
   792 
   796 
   793 	for (; min < max; min++, y += step_size) {
   797 	for (; min < max; min++, y += step_size) {
   794 		const EngineID engine = eng_list[min];
   798 		const EngineID engine = eng_list[min];
       
   799 		const uint num_engines = IsDefaultGroupID(selected_group) ? p->num_engines[engine] : GetGroup(selected_group)->num_engines[engine];
   795 
   800 
   796 		DrawString(x + x_offset, y, GetCustomEngineName(engine), engine == selected_id ? 0xC : 0x10);
   801 		DrawString(x + x_offset, y, GetCustomEngineName(engine), engine == selected_id ? 0xC : 0x10);
   797 		DrawVehicleEngine(type, x, y + y_offset, engine, (show_count && p->num_engines[engine] == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_player));
   802 		DrawVehicleEngine(type, x, y + y_offset, engine, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_player));
   798 		if (show_count) {
   803 		if (show_count) {
   799 			SetDParam(0, p->num_engines[engine]);
   804 			SetDParam(0, num_engines);
   800 			DrawStringRightAligned(213, y + (GetVehicleListHeight(type) == 14 ? 3 : 8), STR_TINY_BLACK, 0);
   805 			DrawStringRightAligned(213, y + (GetVehicleListHeight(type) == 14 ? 3 : 8), STR_TINY_BLACK, 0);
   801 		}
   806 		}
   802 	}
   807 	}
   803 }
   808 }
   804 
   809 
   828 
   833 
   829 	SetVScrollCount(w, EngList_Count(&bv->eng_list));
   834 	SetVScrollCount(w, EngList_Count(&bv->eng_list));
   830 	SetDParam(0, bv->filter.railtype + STR_881C_NEW_RAIL_VEHICLES); // This should only affect rail vehicles
   835 	SetDParam(0, bv->filter.railtype + STR_881C_NEW_RAIL_VEHICLES); // This should only affect rail vehicles
   831 	DrawWindowWidgets(w);
   836 	DrawWindowWidgets(w);
   832 
   837 
   833 	DrawEngineList(bv->vehicle_type, 2, 27, bv->eng_list, w->vscroll.pos, max, bv->sel_engine, false);
   838 	DrawEngineList(bv->vehicle_type, 2, 27, bv->eng_list, w->vscroll.pos, max, bv->sel_engine, false, DEFAULT_GROUP);
   834 
   839 
   835 	if (bv->sel_engine != INVALID_ENGINE) {
   840 	if (bv->sel_engine != INVALID_ENGINE) {
   836 		const Widget *wi = &w->widget[BUILD_VEHICLE_WIDGET_PANEL];
   841 		const Widget *wi = &w->widget[BUILD_VEHICLE_WIDGET_PANEL];
   837 		int text_end = DrawVehiclePurchaseInfo(2, wi->top + 1, wi->right - wi->left - 2, bv->sel_engine);
   842 		int text_end = DrawVehiclePurchaseInfo(2, wi->top + 1, wi->right - wi->left - 2, bv->sel_engine);
   838 
   843 
   869 
   874 
   870 		case BUILD_VEHICLE_WIDGET_BUILD: {
   875 		case BUILD_VEHICLE_WIDGET_BUILD: {
   871 			EngineID sel_eng = bv->sel_engine;
   876 			EngineID sel_eng = bv->sel_engine;
   872 			if (sel_eng != INVALID_ENGINE) {
   877 			if (sel_eng != INVALID_ENGINE) {
   873 				switch (bv->vehicle_type) {
   878 				switch (bv->vehicle_type) {
       
   879 					default: NOT_REACHED();
   874 					case VEH_TRAIN:
   880 					case VEH_TRAIN:
   875 						DoCommandP(w->window_number, sel_eng, 0, (RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON) ? CcBuildWagon : CcBuildLoco,
   881 						DoCommandP(w->window_number, sel_eng, 0, (RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON) ? CcBuildWagon : CcBuildLoco,
   876 								   CMD_BUILD_RAIL_VEHICLE | CMD_MSG(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE));
   882 								   CMD_BUILD_RAIL_VEHICLE | CMD_MSG(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE));
   877 						break;
   883 						break;
   878 					case VEH_ROAD:
   884 					case VEH_ROAD:
   894 			if (sel_eng != INVALID_ENGINE) {
   900 			if (sel_eng != INVALID_ENGINE) {
   895 				StringID str = STR_NULL;
   901 				StringID str = STR_NULL;
   896 
   902 
   897 				bv->rename_engine = sel_eng;
   903 				bv->rename_engine = sel_eng;
   898 				switch (bv->vehicle_type) {
   904 				switch (bv->vehicle_type) {
       
   905 					default: NOT_REACHED();
   899 					case VEH_TRAIN:    str = STR_886A_RENAME_TRAIN_VEHICLE_TYPE; break;
   906 					case VEH_TRAIN:    str = STR_886A_RENAME_TRAIN_VEHICLE_TYPE; break;
   900 					case VEH_ROAD:     str = STR_9036_RENAME_ROAD_VEHICLE_TYPE;  break;
   907 					case VEH_ROAD:     str = STR_9036_RENAME_ROAD_VEHICLE_TYPE;  break;
   901 					case VEH_SHIP:     str = STR_9838_RENAME_SHIP_TYPE;          break;
   908 					case VEH_SHIP:     str = STR_9838_RENAME_SHIP_TYPE;          break;
   902 					case VEH_AIRCRAFT: str = STR_A039_RENAME_AIRCRAFT_TYPE;      break;
   909 					case VEH_AIRCRAFT: str = STR_A039_RENAME_AIRCRAFT_TYPE;      break;
   903 				}
   910 				}
   937 		case WE_ON_EDIT_TEXT: {
   944 		case WE_ON_EDIT_TEXT: {
   938 			if (e->we.edittext.str[0] != '\0') {
   945 			if (e->we.edittext.str[0] != '\0') {
   939 				StringID str = STR_NULL;
   946 				StringID str = STR_NULL;
   940 				_cmd_text = e->we.edittext.str;
   947 				_cmd_text = e->we.edittext.str;
   941 				switch (bv->vehicle_type) {
   948 				switch (bv->vehicle_type) {
       
   949 					default: NOT_REACHED();
   942 					case VEH_TRAIN:    str = STR_886B_CAN_T_RENAME_TRAIN_VEHICLE; break;
   950 					case VEH_TRAIN:    str = STR_886B_CAN_T_RENAME_TRAIN_VEHICLE; break;
   943 					case VEH_ROAD:     str = STR_9037_CAN_T_RENAME_ROAD_VEHICLE;  break;
   951 					case VEH_ROAD:     str = STR_9037_CAN_T_RENAME_ROAD_VEHICLE;  break;
   944 					case VEH_SHIP:     str = STR_9839_CAN_T_RENAME_SHIP_TYPE;     break;
   952 					case VEH_SHIP:     str = STR_9839_CAN_T_RENAME_SHIP_TYPE;     break;
   945 					case VEH_AIRCRAFT: str = STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE; break;
   953 					case VEH_AIRCRAFT: str = STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE; break;
   946 				}
   954 				}
   974 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
   982 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
   975 	_build_vehicle_widgets,
   983 	_build_vehicle_widgets,
   976 	NewVehicleWndProc
   984 	NewVehicleWndProc
   977 };
   985 };
   978 
   986 
   979 void ShowBuildVehicleWindow(TileIndex tile, byte type)
   987 void ShowBuildVehicleWindow(TileIndex tile, VehicleType type)
   980 {
   988 {
   981 	buildvehicle_d *bv;
   989 	buildvehicle_d *bv;
   982 	Window *w;
   990 	Window *w;
   983 
   991 
   984 	assert(IsPlayerBuildableVehicleType(type));
   992 	assert(IsPlayerBuildableVehicleType(type));
  1003 
  1011 
  1004 	bv->sort_criteria         = _last_sort_criteria[type];
  1012 	bv->sort_criteria         = _last_sort_criteria[type];
  1005 	bv->descending_sort_order = _last_sort_order[type];
  1013 	bv->descending_sort_order = _last_sort_order[type];
  1006 
  1014 
  1007 	switch (type) {
  1015 	switch (type) {
       
  1016 		default: NOT_REACHED();
  1008 		case VEH_TRAIN:
  1017 		case VEH_TRAIN:
  1009 			WP(w, buildvehicle_d).filter.railtype = (tile == 0) ? RAILTYPE_END : GetRailType(tile);
  1018 			WP(w, buildvehicle_d).filter.railtype = (tile == 0) ? RAILTYPE_END : GetRailType(tile);
  1010 			ResizeWindow(w, 0, 16);
  1019 			ResizeWindow(w, 0, 16);
  1011 			break;
  1020 			break;
  1012 		case VEH_ROAD:
  1021 		case VEH_ROAD: