OpenTTD Source 20260206-master-g4d4e37dbf1
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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
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 Money feeder_share = 0;
33
34 DrawString(r.left, r.right, y, GetString(STR_VEHICLE_INFO_BUILT_VALUE, PackEngineNameDParam(v->engine_type, EngineNameContext::VehicleDetails), v->build_year, v->value));
36
37 if (v->HasArticulatedPart()) {
38 CargoArray max_cargo{};
39 std::array<StringID, NUM_CARGO> subtype_text{};
40
41 for (const Vehicle *u = v; u != nullptr; u = u->Next()) {
42 max_cargo[u->cargo_type] += u->cargo_cap;
43 if (u->cargo_cap > 0) {
45 if (text != STR_EMPTY) subtype_text[u->cargo_type] = text;
46 }
47 }
48
49 std::string capacity;
50 std::string_view list_separator = GetListSeparator();
51
52 bool first = true;
53 for (const CargoSpec *cs : _sorted_cargo_specs) {
54 CargoType cargo_type = cs->Index();
55 if (max_cargo[cargo_type] > 0) {
56 if (!first) capacity += list_separator;
57
58 auto params = MakeParameters(cargo_type, max_cargo[cargo_type]);
59 AppendStringWithArgsInPlace(capacity, STR_JUST_CARGO, params);
60
61 if (subtype_text[cargo_type] != STR_NULL) {
62 AppendStringInPlace(capacity, subtype_text[cargo_type]);
63 }
64
65 first = false;
66 }
67 }
68
69 DrawString(r.left, r.right, y, GetString(STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY, capacity), TC_BLUE);
71
72 for (const Vehicle *u = v; u != nullptr; u = u->Next()) {
73 if (u->cargo_cap == 0) continue;
74
75 std::string str;
76 if (u->cargo.StoredCount() > 0) {
77 str = GetString(STR_VEHICLE_DETAILS_CARGO_FROM, u->cargo_type, u->cargo.StoredCount(), u->cargo.GetFirstStation());
78 feeder_share += u->cargo.GetFeederShare();
79 } else {
80 str = GetString(STR_VEHICLE_DETAILS_CARGO_EMPTY);
81 }
82 DrawString(r.left, r.right, y, str);
84 }
85 y += WidgetDimensions::scaled.vsep_normal;
86 } else {
87 DrawString(r.left, r.right, y, GetString(STR_VEHICLE_INFO_CAPACITY, v->cargo_type, v->cargo_cap, GetCargoSubtypeText(v)));
89
90 std::string str;
91 if (v->cargo.StoredCount() > 0) {
92 str = GetString(STR_VEHICLE_DETAILS_CARGO_FROM, v->cargo_type, v->cargo.StoredCount(), v->cargo.GetFirstStation());
93 feeder_share += v->cargo.GetFeederShare();
94 } else {
95 str = GetString(STR_VEHICLE_DETAILS_CARGO_EMPTY);
96 }
97 DrawString(r.left, r.right, y, str);
99 }
100
101 /* Draw Transfer credits text */
102 DrawString(r.left, r.right, y, GetString(STR_VEHICLE_INFO_FEEDER_CARGO_VALUE, feeder_share));
103}
104
113void DrawRoadVehImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip)
114{
115 bool rtl = _current_text_dir == TD_RTL;
116 Direction dir = rtl ? DIR_E : DIR_W;
117 const RoadVehicle *u = RoadVehicle::From(v);
118
119 DrawPixelInfo tmp_dpi;
120 int max_width = r.Width();
121
122 if (!FillDrawPixelInfo(&tmp_dpi, r)) return;
123
124 AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
125
126 bool do_overlays = ShowCargoIconOverlay();
127 /* List of overlays, only used if cargo icon overlays are enabled. */
128 static std::vector<CargoIconOverlay> overlays;
129
130 int px = rtl ? max_width + skip : -skip;
131 int y = r.Height() / 2;
132 for (; u != nullptr && (rtl ? px > 0 : px < max_width); u = u->Next())
133 {
134 Point offset;
135 int width = u->GetDisplayImageWidth(&offset);
136
137 if (rtl ? px + width > 0 : px - width < max_width) {
140 u->GetImage(dir, image_type, &seq);
141 seq.Draw(px + (rtl ? -offset.x : offset.x), y + offset.y, pal, u->vehstatus.Test(VehState::Crashed));
142 }
143
144 if (do_overlays) AddCargoIconOverlay(overlays, px, width, u);
145 px += rtl ? -width : width;
146 }
147
148 if (do_overlays) {
149 DrawCargoIconOverlays(overlays, y);
150 overlays.clear();
151 }
152
153 if (v->index == selection) {
154 int height = ScaleSpriteTrad(12);
155 Rect hr = {(rtl ? px : 0), 0, (rtl ? max_width : px) - 1, height - 1};
156 DrawFrameRect(hr.Translate(r.left, CentreBounds(r.top, r.bottom, height)).Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FrameFlag::BorderOnly);
157 }
158}
Class for backupping variables and making sure they are restored later.
uint8_t CargoType
Cargo slots to indicate a cargo type within a game.
Definition cargo_type.h:21
std::vector< const CargoSpec * > _sorted_cargo_specs
Cargo specifications sorted alphabetically by name.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
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:30
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:87
int CentreBounds(int min, int max, int size)
Determine where to position a centred object.
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:669
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:1573
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:249
uint32_t PaletteID
The number of the palette.
Definition gfx_type.h:18
#define Rect
Macro that prevents name conflicts between included headers.
#define Point
Macro that prevents name conflicts between included headers.
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:1619
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:299
void AppendStringInPlace(std::string &result, StringID string)
Resolve the given StringID and append in place into an existing std::string with formatting but no pa...
Definition strings.cpp:434
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
Functions related to OTTD's strings.
auto MakeParameters(Args &&... args)
Helper to create the StringParameters with its own buffer with the given parameter values.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
@ TD_RTL
Text is written right-to-left by default.
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:111
Specification of a cargo type.
Definition cargotype.h:74
T y
Y coordinate.
T x
X coordinate.
Data about how and where to blit pixels.
Definition gfx_type.h:157
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 RoadVehicle * From(Vehicle *v)
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:142
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.
VehStates vehstatus
Status.
CargoType 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.
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:2146
@ 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.
PoolID< uint32_t, struct VehicleIDTag, 0xFF000, 0xFFFFF > 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:289
Functions, definitions and such used only by the GUI.
@ BorderOnly
Draw border only, no background.
Definition window_gui.h:26
Functions related to zooming.
int ScaleSpriteTrad(int value)
Scale traditional pixel dimensions to GUI zoom level, for drawing sprites.
Definition zoom_func.h:107