OpenTTD Source 20241224-master-gf74b0cf984
roadveh_gui.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#include "stdafx.h"
11#include "core/backup_type.hpp"
12#include "roadveh.h"
13#include "window_gui.h"
14#include "strings_func.h"
15#include "vehicle_func.h"
16#include "string_func.h"
17#include "zoom_func.h"
18
19#include "table/strings.h"
20
21#include "safeguards.h"
22
29void DrawRoadVehDetails(const Vehicle *v, const Rect &r)
30{
31 int y = r.top + (v->HasArticulatedPart() ? ScaleSpriteTrad(15) : 0); // Draw the first line below the sprite of an articulated RV instead of after it.
32 StringID str;
33 Money feeder_share = 0;
34
36 SetDParam(1, v->build_year);
37 SetDParam(2, v->value);
38 DrawString(r.left, r.right, y, STR_VEHICLE_INFO_BUILT_VALUE);
40
41 if (v->HasArticulatedPart()) {
42 CargoArray max_cargo{};
43 std::array<StringID, NUM_CARGO> subtype_text{};
44
45 for (const Vehicle *u = v; u != nullptr; u = u->Next()) {
46 max_cargo[u->cargo_type] += u->cargo_cap;
47 if (u->cargo_cap > 0) {
49 if (text != STR_EMPTY) subtype_text[u->cargo_type] = text;
50 }
51 }
52
53 std::string capacity = GetString(STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY);
54 std::string_view list_separator = GetListSeparator();
55
56 bool first = true;
57 for (const CargoSpec *cs : _sorted_cargo_specs) {
58 CargoID cid = cs->Index();
59 if (max_cargo[cid] > 0) {
60 if (!first) capacity += list_separator;
61
62 SetDParam(0, cid);
63 SetDParam(1, max_cargo[cid]);
64 AppendStringInPlace(capacity, STR_JUST_CARGO);
65
66 if (subtype_text[cid] != STR_NULL) {
67 AppendStringInPlace(capacity, subtype_text[cid]);
68 }
69
70 first = false;
71 }
72 }
73
74 DrawString(r.left, r.right, y, capacity, TC_BLUE);
76
77 for (const Vehicle *u = v; u != nullptr; u = u->Next()) {
78 if (u->cargo_cap == 0) continue;
79
80 str = STR_VEHICLE_DETAILS_CARGO_EMPTY;
81 if (u->cargo.StoredCount() > 0) {
82 SetDParam(0, u->cargo_type);
83 SetDParam(1, u->cargo.StoredCount());
84 SetDParam(2, u->cargo.GetFirstStation());
85 str = STR_VEHICLE_DETAILS_CARGO_FROM;
86 feeder_share += u->cargo.GetFeederShare();
87 }
88 DrawString(r.left, r.right, y, str);
90 }
92 } else {
93 SetDParam(0, v->cargo_type);
94 SetDParam(1, v->cargo_cap);
96 DrawString(r.left, r.right, y, STR_VEHICLE_INFO_CAPACITY);
98
99 str = STR_VEHICLE_DETAILS_CARGO_EMPTY;
100 if (v->cargo.StoredCount() > 0) {
101 SetDParam(0, v->cargo_type);
102 SetDParam(1, v->cargo.StoredCount());
104 str = STR_VEHICLE_DETAILS_CARGO_FROM;
105 feeder_share += v->cargo.GetFeederShare();
106 }
107 DrawString(r.left, r.right, y, str);
109 }
110
111 /* Draw Transfer credits text */
112 SetDParam(0, feeder_share);
113 DrawString(r.left, r.right, y, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE);
114}
115
123void DrawRoadVehImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip)
124{
125 bool rtl = _current_text_dir == TD_RTL;
126 Direction dir = rtl ? DIR_E : DIR_W;
127 const RoadVehicle *u = RoadVehicle::From(v);
128
129 DrawPixelInfo tmp_dpi;
130 int max_width = r.Width();
131
132 if (!FillDrawPixelInfo(&tmp_dpi, r)) return;
133
134 AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
135
136 bool do_overlays = ShowCargoIconOverlay();
137 /* List of overlays, only used if cargo icon overlays are enabled. */
138 static std::vector<CargoIconOverlay> overlays;
139
140 int px = rtl ? max_width + skip : -skip;
141 int y = r.Height() / 2;
142 for (; u != nullptr && (rtl ? px > 0 : px < max_width); u = u->Next())
143 {
144 Point offset;
145 int width = u->GetDisplayImageWidth(&offset);
146
147 if (rtl ? px + width > 0 : px - width < max_width) {
150 u->GetImage(dir, image_type, &seq);
151 seq.Draw(px + (rtl ? -offset.x : offset.x), y + offset.y, pal, (u->vehstatus & VS_CRASHED) != 0);
152 }
153
154 if (do_overlays) AddCargoIconOverlay(overlays, px, width, u);
155 px += rtl ? -width : width;
156 }
157
158 if (do_overlays) {
159 DrawCargoIconOverlays(overlays, y);
160 overlays.clear();
161 }
162
163 if (v->index == selection) {
164 int height = ScaleSpriteTrad(12);
165 Rect hr = {(rtl ? px : 0), 0, (rtl ? max_width : px) - 1, height - 1};
166 DrawFrameRect(hr.Translate(r.left, CenterBounds(r.top, r.bottom, height)).Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FR_BORDERONLY);
167 }
168}
Class for backupping variables and making sure they are restored later.
uint8_t CargoID
Cargo slots to indicate a cargo type within a game.
Definition cargo_type.h:22
std::vector< const CargoSpec * > _sorted_cargo_specs
Cargo specifications sorted alphabetically by name.
Money GetFeederShare() const
Returns total sum of the feeder share for all packets.
StationID GetFirstStation() const
Returns the first station of the first cargo packet in this list.
uint StoredCount() const
Returns sum of cargo on board the vehicle (ie not only reserved).
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:28
int vsep_normal
Normal vertical spacing.
Definition window_gui.h:60
RectPadding bevel
Bevel thickness, affected by "scaled bevels" game option.
Definition window_gui.h:40
Direction
Defines the 8 directions on the map.
@ DIR_W
West.
@ DIR_E
East.
uint64_t PackEngineNameDParam(EngineID engine_id, EngineNameContext context, uint32_t extra_data=0)
Combine an engine ID and a name context to an engine name dparam.
@ VehicleDetails
Name is shown in the vehicle details GUI.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:77
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:657
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height)
Set up a clipping area for only drawing into a certain area.
Definition gfx.cpp:1548
int CenterBounds(int min, int max, int size)
Determine where to draw a centred object inside a widget.
Definition gfx_func.h:166
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:209
uint32_t PaletteID
The number of the palette.
Definition gfx_type.h:19
Road vehicle states.
void DrawRoadVehImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip)
Draws an image of a road vehicle chain.
void DrawRoadVehDetails(const Vehicle *v, const Rect &r)
Draw the details for the given vehicle at the given position.
A number of safeguards to prevent using unsafe methods.
static const PaletteID PALETTE_CRASH
Recolour sprite greying of crashed vehicles.
Definition sprites.h:1605
Definition of base types and functions in a cross-platform compatible way.
Functions related to low-level strings.
std::string_view GetListSeparator()
Get the list separator string for the current language.
Definition strings.cpp:229
void AppendStringInPlace(std::string &result, StringID string)
Resolve the given StringID and append in place into an existing std::string with all the associated D...
Definition strings.cpp:345
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition strings.cpp:104
std::string GetString(StringID string)
Resolve the given StringID into a std::string with all the associated DParam lookups and formatting.
Definition strings.cpp:333
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
Functions related to OTTD's strings.
@ TD_RTL
Text is written right-to-left by default.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Class to backup a specific variable and restore it upon destruction of this object to prevent stack v...
Class for storing amounts of cargo.
Definition cargo_type.h:114
Specification of a cargo type.
Definition cargotype.h:76
Data about how and where to blit pixels.
Definition gfx_type.h:157
Coordinates of a point in 2D.
Tindex index
Index of this pool item.
Specification of a rectangle with absolute coordinates of all edges.
int Width() const
Get width of Rect.
int Height() const
Get height of Rect.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
Rect Expand(int s) const
Copy and expand Rect by s pixels.
Buses, trucks and trams belong to this class.
Definition roadveh.h:98
int GetDisplayImageWidth(Point *offset=nullptr) const
Get the width of a road vehicle image in the GUI.
void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const override
Gets the sprite to show for the given direction.
T * Next() const
Get next vehicle in the chain.
static T * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
Sprite sequence for a vehicle part.
void Draw(int x, int y, PaletteID default_pal, bool force_pal) const
Draw the sprite sequence.
Definition vehicle.cpp:131
Vehicle data structure.
EngineID engine_type
The type of engine used for this vehicle.
VehicleCargoList cargo
The cargo this vehicle is carrying.
uint16_t cargo_cap
total capacity
bool HasArticulatedPart() const
Check if an engine has an articulated part.
CargoID cargo_type
type of cargo this vehicle is carrying
Vehicle * Next() const
Get the next vehicle of this vehicle.
Money value
Value of the vehicle.
uint8_t vehstatus
Status.
TimerGameCalendar::Year build_year
Year the vehicle has been built.
PaletteID GetVehiclePalette(const Vehicle *v)
Get the colour map for a vehicle.
Definition vehicle.cpp:2152
@ VS_CRASHED
Vehicle is crashed.
Functions related to vehicles.
StringID GetCargoSubtypeText(const Vehicle *v)
Get the cargo subtype text from NewGRF for the vehicle details window.
void DrawCargoIconOverlays(std::span< const CargoIconOverlay > overlays, int y)
Draw a list of cargo icon overlays.
void AddCargoIconOverlay(std::vector< CargoIconOverlay > &overlays, int x, int width, const Vehicle *v)
Add a cargo icon to the list of overlays.
bool ShowCargoIconOverlay()
Test if cargo icon overlays should be drawn.
EngineImageType
Visualisation contexts of vehicles and engines.
uint32_t VehicleID
The type all our vehicle IDs have.
void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, FrameFlags flags)
Draw frame rectangle.
Definition widget.cpp:283
Functions, definitions and such used only by the GUI.
@ FR_BORDERONLY
Draw border only, no background.
Definition window_gui.h:27
Functions related to zooming.
int ScaleSpriteTrad(int value)
Scale traditional pixel dimensions to GUI zoom level, for drawing sprites.
Definition zoom_func.h:107