Changeset - r25962:7ad541d5d28c
[Not reviewed]
master
0 3 0
SamuXarick - 3 years ago 2021-09-14 20:10:00
43006711+SamuXarick@users.noreply.github.com
Feature: Display icon/text whether vehicle is lost in vehicle (list) window (#9543)
3 files changed with 20 insertions and 7 deletions:
0 comments (0 inline, 0 general)
src/lang/english.txt
Show inline comments
 
@@ -4134,12 +4134,17 @@ STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR     
 
STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL                      :{LTBLUE}Heading for {STATION}, {VELOCITY}
 
STR_VEHICLE_STATUS_NO_ORDERS_VEL                                :{LTBLUE}No orders, {VELOCITY}
 
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL                     :{LTBLUE}Heading for {WAYPOINT}, {VELOCITY}
 
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL                        :{ORANGE}Heading for {DEPOT}, {VELOCITY}
 
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL                :{LTBLUE}Service at {DEPOT}, {VELOCITY}
 

	
 
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL                     :{LTBLUE}Cannot reach {STATION}, {VELOCITY}
 
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL                    :{LTBLUE}Cannot reach {WAYPOINT}, {VELOCITY}
 
STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL                       :{ORANGE}Cannot reach {DEPOT}, {VELOCITY}
 
STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL               :{LTBLUE}Cannot reach {DEPOT}, {VELOCITY}
 

	
 
# Vehicle stopped/started animations
 
###length 2
 
STR_VEHICLE_COMMAND_STOPPED_SMALL                               :{TINY_FONT}{RED}Stopped
 
STR_VEHICLE_COMMAND_STOPPED                                     :{RED}Stopped
 

	
 
###length 2
src/vehicle.cpp
Show inline comments
 
@@ -775,22 +775,26 @@ void Vehicle::HandlePathfindingResult(bo
 
	if (path_found) {
 
		/* Route found, is the vehicle marked with "lost" flag? */
 
		if (!HasBit(this->vehicle_flags, VF_PATHFINDER_LOST)) return;
 

	
 
		/* Clear the flag as the PF's problem was solved. */
 
		ClrBit(this->vehicle_flags, VF_PATHFINDER_LOST);
 
		SetWindowWidgetDirty(WC_VEHICLE_VIEW, this->index, WID_VV_START_STOP);
 
		InvalidateWindowClassesData(GetWindowClassForVehicleType(this->type));
 
		/* Delete the news item. */
 
		DeleteVehicleNews(this->index, STR_NEWS_VEHICLE_IS_LOST);
 
		return;
 
	}
 

	
 
	/* Were we already lost? */
 
	if (HasBit(this->vehicle_flags, VF_PATHFINDER_LOST)) return;
 

	
 
	/* It is first time the problem occurred, set the "lost" flag. */
 
	SetBit(this->vehicle_flags, VF_PATHFINDER_LOST);
 
	SetWindowWidgetDirty(WC_VEHICLE_VIEW, this->index, WID_VV_START_STOP);
 
	InvalidateWindowClassesData(GetWindowClassForVehicleType(this->type));
 
	/* Notify user about the event. */
 
	AI::NewEvent(this->owner, new ScriptEventVehicleLost(this->index));
 
	if (_settings_client.gui.lost_vehicle_warn && this->owner == _local_company) {
 
		SetDParam(0, this->index);
 
		AddVehicleAdviceNewsItem(STR_NEWS_VEHICLE_IS_LOST, this->index);
 
	}
src/vehicle_gui.cpp
Show inline comments
 
@@ -1539,12 +1539,16 @@ void BaseVehicleListWindow::DrawVehicleL
 
		DrawVehicleProfitButton(vehgroup.GetOldestVehicleAge(), vehgroup.GetDisplayProfitLastYear(), vehgroup.NumVehicles(), vehicle_button_x, y + FONT_HEIGHT_NORMAL + 3);
 

	
 
		switch (this->grouping) {
 
			case GB_NONE: {
 
				const Vehicle *v = vehgroup.GetSingleVehicle();
 

	
 
				if (HasBit(v->vehicle_flags, VF_PATHFINDER_LOST)) {
 
					DrawSprite(SPR_WARNING_SIGN, PAL_NONE, vehicle_button_x, y + FONT_HEIGHT_NORMAL + 3 + GetSpriteSize(SPR_PROFIT_LOT).height);
 
				}
 

	
 
				DrawVehicleImage(v, image_left, image_right, y + FONT_HEIGHT_SMALL - 1, selected_vehicle, EIT_IN_LIST, 0);
 

	
 
				if (!v->name.empty()) {
 
					/* The vehicle got a name so we will print it */
 
					SetDParam(0, v->index);
 
					DrawString(text_left, text_right, y, STR_TINY_BLACK_VEHICLE);
 
@@ -2729,13 +2733,13 @@ public:
 

	
 
	void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
 
	{
 
		const Vehicle *v = Vehicle::Get(this->window_number);
 
		switch (widget) {
 
			case WID_VV_START_STOP:
 
				size->height = std::max(size->height, std::max(GetSpriteSize(SPR_FLAG_VEH_STOPPED).height, GetSpriteSize(SPR_FLAG_VEH_RUNNING).height) + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM);
 
				size->height = std::max({size->height, GetSpriteSize(SPR_WARNING_SIGN).height, GetSpriteSize(SPR_FLAG_VEH_STOPPED).height, GetSpriteSize(SPR_FLAG_VEH_RUNNING).height}) + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM;
 
				break;
 

	
 
			case WID_VV_FORCE_PROCEED:
 
				if (v->type != VEH_TRAIN) {
 
					size->height = 0;
 
					size->width = 0;
 
@@ -2818,13 +2822,13 @@ public:
 
				}
 
			}
 
			switch (v->current_order.GetType()) {
 
				case OT_GOTO_STATION: {
 
					SetDParam(0, v->current_order.GetDestination());
 
					SetDParam(1, v->GetDisplaySpeed());
 
					str = STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL;
 
					str = HasBit(v->vehicle_flags, VF_PATHFINDER_LOST) ? STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL : STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL;
 
					break;
 
				}
 

	
 
				case OT_GOTO_DEPOT: {
 
					SetDParam(0, v->type);
 
					SetDParam(1, v->current_order.GetDestination());
 
@@ -2835,27 +2839,27 @@ public:
 
						 * nearest depot order) and there are no reachable depots.
 
						 * It is primarily to guard for the case that there is no
 
						 * depot with index 0, which would be used as fallback for
 
						 * evaluating the string in the status bar. */
 
						str = STR_EMPTY;
 
					} else if (v->current_order.GetDepotActionType() & ODATFB_HALT) {
 
						str = STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL;
 
						str = HasBit(v->vehicle_flags, VF_PATHFINDER_LOST) ? STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL : STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL;
 
					} else {
 
						str = STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL;
 
						str = HasBit(v->vehicle_flags, VF_PATHFINDER_LOST) ? STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL : STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL;
 
					}
 
					break;
 
				}
 

	
 
				case OT_LOADING:
 
					str = STR_VEHICLE_STATUS_LOADING_UNLOADING;
 
					break;
 

	
 
				case OT_GOTO_WAYPOINT: {
 
					assert(v->type == VEH_TRAIN || v->type == VEH_SHIP);
 
					SetDParam(0, v->current_order.GetDestination());
 
					str = STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL;
 
					str = HasBit(v->vehicle_flags, VF_PATHFINDER_LOST) ? STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL : STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL;
 
					SetDParam(1, v->GetDisplaySpeed());
 
					break;
 
				}
 

	
 
				case OT_LEAVESTATION:
 
					if (v->type != VEH_AIRCRAFT) {
 
@@ -2873,18 +2877,18 @@ public:
 
					break;
 
			}
 
		}
 

	
 
		/* Draw the flag plus orders. */
 
		bool rtl = (_current_text_dir == TD_RTL);
 
		uint text_offset = std::max(GetSpriteSize(SPR_FLAG_VEH_STOPPED).width, GetSpriteSize(SPR_FLAG_VEH_RUNNING).width) + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT;
 
		uint text_offset = std::max({GetSpriteSize(SPR_WARNING_SIGN).width, GetSpriteSize(SPR_FLAG_VEH_STOPPED).width, GetSpriteSize(SPR_FLAG_VEH_RUNNING).width}) + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT;
 
		int height = r.bottom - r.top;
 
		int text_left = r.left + (rtl ? (uint)WD_FRAMERECT_LEFT : text_offset);
 
		int text_right = r.right - (rtl ? text_offset : (uint)WD_FRAMERECT_RIGHT);
 
		int text_top = r.top + WD_FRAMERECT_TOP + (height - WD_FRAMERECT_TOP - WD_FRAMERECT_BOTTOM - FONT_HEIGHT_NORMAL) / 2;
 
		int image = ((v->vehstatus & VS_STOPPED) != 0) ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING;
 
		int image = ((v->vehstatus & VS_STOPPED) != 0) ? SPR_FLAG_VEH_STOPPED : (HasBit(v->vehicle_flags, VF_PATHFINDER_LOST)) ? SPR_WARNING_SIGN : SPR_FLAG_VEH_RUNNING;
 
		int image_left = (rtl ? text_right + 1 : r.left) + WD_IMGBTN_LEFT;
 
		int image_top = r.top + WD_IMGBTN_TOP + (height - WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM - GetSpriteSize(image).height) / 2;
 
		int lowered = this->IsWidgetLowered(WID_VV_START_STOP) ? 1 : 0;
 
		DrawSprite(image, PAL_NONE, image_left + lowered, image_top + lowered);
 
		DrawString(text_left + lowered, text_right + lowered, text_top + lowered, str, text_colour, SA_HOR_CENTER);
 
	}
0 comments (0 inline, 0 general)