Go to the documentation of this file.
19 #include "table/strings.h"
30 void CcBuildWagon(
Commands cmd,
const CommandCost &result,
VehicleID new_veh_id, uint, uint16,
CargoArray,
TileIndex tile,
EngineID,
bool,
CargoID,
ClientID)
32 if (result.
Failed())
return;
37 if (t->IsFrontEngine() && t->tile == tile && t->IsStoppedInDepot()) {
38 if (found !=
nullptr)
return;
44 if (found !=
nullptr) {
45 found = found->
Last();
66 int dragged_width = 0;
67 for (
Train *t =
Train::Get(selection); t !=
nullptr; t = chain ? t->
Next() : (t->HasArticulatedPart() ? t->GetNextArticulatedPart() :
nullptr)) {
68 dragged_width += t->GetDisplayImageWidth(
nullptr);
71 int drag_hlight_left = rtl ? std::max(px - dragged_width + 1, 0) : px;
72 int drag_hlight_right = rtl ? px : std::min(px + dragged_width, max_width) - 1;
73 int drag_hlight_width = std::max(drag_hlight_right - drag_hlight_left + 1, 0);
75 if (drag_hlight_width > 0) {
77 int top = y - height / 2;
78 Rect r = {drag_hlight_left, top, drag_hlight_right, top + height - 1};
83 return drag_hlight_width;
103 int max_width = r.
Width();
110 int px = rtl ? max_width + skip : -skip;
112 bool sel_articulated =
false;
114 bool drag_at_end_of_train = (drag_dest == v->
index);
115 for (; v !=
nullptr && (rtl ? px > 0 : px < max_width); v = v->
Next()) {
116 if (dragging && !drag_at_end_of_train && drag_dest == v->
index) {
119 px += rtl ? -drag_hlight_width : drag_hlight_width;
125 if (rtl ? px + width > 0 : px - width < max_width) {
134 if (v->
index == selection) {
136 highlight_l = rtl ? px - width : px;
137 highlight_r = rtl ? px - 1 : px + width - 1;
138 sel_articulated =
true;
139 }
else if ((_cursor.
vehchain && highlight_r != 0) || sel_articulated) {
141 highlight_l -= width;
143 highlight_r += width;
147 px += rtl ? -width : width;
150 if (dragging && drag_at_end_of_train) {
157 if (highlight_l != highlight_r) {
161 Rect hr = {highlight_l, 0, highlight_r, height - 1};
177 return this->cargo != other.
cargo || this->subtype != other.
subtype;
183 return !(this->cargo != other.
cargo);
211 str =
FreightWagonMult(item->
cargo) > 1 ? STR_VEHICLE_DETAILS_CARGO_FROM_MULT : STR_VEHICLE_DETAILS_CARGO_FROM;
214 str = item->
cargo ==
INVALID_CARGO ? STR_LTBLUE_STRING : STR_VEHICLE_DETAILS_CARGO_EMPTY;
233 DrawString(left, right, y, STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE);
238 DrawString(left, right, y, STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE);
258 str =
FreightWagonMult(item->
cargo) > 1 ? STR_VEHICLE_INFO_CAPACITY_MULT : STR_VEHICLE_INFO_CAPACITY;
262 str = STR_VEHICLE_INFO_NO_CAPACITY;
283 auto item = std::find(summary->begin(), summary->end(), new_item);
284 if (item == summary->end()) {
285 summary->emplace_back();
286 item = summary->end() - 1;
287 item->cargo = new_item.
cargo;
288 item->subtype = new_item.
subtype;
291 item->source = INVALID_STATION;
296 if (item->source == INVALID_STATION) item->source = v->
cargo.
Source();
330 act_cargo[v->cargo_type] += v->cargo.StoredCount();
331 max_cargo[v->cargo_type] += v->cargo_cap;
338 if (max_cargo[i] > 0) num++;
366 int line_height = r.
Height();
367 int sprite_y_offset = line_height / 2;
373 int x = rtl ? r.right : r.left;
374 for (; v !=
nullptr && vscroll_pos > -vscroll_cap; v = v->
GetNextVehicle()) {
384 if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) {
387 if (e->
GetGRF() !=
nullptr) {
393 seq.
Draw(px + (rtl ? -offset.x : offset.x), r.top - line_height * vscroll_pos + sprite_y_offset + pitch, pal, (v->
vehstatus &
VS_CRASHED) != 0);
395 px += rtl ? -width : width;
401 if (separate_sprite_row) {
409 for (uint i = 0; i < num_lines; i++) {
410 if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) {
411 int py = r.top - line_height * vscroll_pos + text_y_offset;
412 if (i > 0 || separate_sprite_row) {
420 DrawString(dr.left, dr.right, py, STR_QUANTITY_N_A, TC_LIGHT_BLUE);
433 DrawString(dr.left, dr.right, py, STR_VEHICLE_INFO_NO_CAPACITY);
437 default: NOT_REACHED();
447 Money feeder_share = 0;
449 for (
const Vehicle *u = v; u !=
nullptr; u = u->
Next()) {
450 act_cargo[u->cargo_type] += u->cargo.StoredCount();
451 max_cargo[u->cargo_type] += u->cargo_cap;
452 feeder_share += u->cargo.FeederShare();
456 DrawString(r.left, r.right, y + text_y_offset, STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT);
462 if (max_cargo[i] > 0 && --vscroll_pos < 0 && vscroll_pos > -vscroll_cap) {
468 DrawString(ir.left, ir.right, y + text_y_offset,
FreightWagonMult(i) > 1 ? STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT : STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY);
473 DrawString(r.left, r.right, y + text_y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE);
int GetDisplayImageWidth(Point *offset=nullptr) const
Get the width of a train vehicle image in the GUI.
T * GetNextVehicle() const
Get the next real (non-articulated part) vehicle in the consist.
static const byte INVALID_CARGO
Constant representing invalid cargo.
uint StoredCount() const
Returns sum of cargo on board the vehicle (ie not only reserved).
static void GetCargoSummaryOfArticulatedVehicle(const Train *v, CargoSummary *summary)
Collects the cargo transported.
int Height() const
Get height of Rect.
static Titem * Get(size_t index)
Returns Titem with given index.
Direction
Defines the 8 directions on the map.
@ TDW_TAB_INFO
Tab with name and value of the vehicles.
Money value
Value of the vehicle.
uint64 PackEngineNameDParam(EngineID engine_id, EngineNameContext context, uint32 extra_data=0)
Combine an engine ID and a name context to an engine name dparam.
void DrawTrainDetails(const Train *v, const Rect &r, int vscroll_pos, uint16 vscroll_cap, TrainDetailsWindowTabs det_tab)
Draw the details for the given vehicle at the given position.
Commands
List of commands.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
T * Next() const
Get next vehicle in the chain.
TrainDetailsWindowTabs
The tabs in the train details window.
bool vehchain
vehicle chain is dragged
Tindex index
Index of this pool item.
Class for storing amounts of cargo.
@ EIT_IN_DETAILS
Vehicle drawn in vehicle details, refit window, ...
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Rect Expand(int s) const
Copy and expand Rect by s pixels.
EngineImageType
Visualisation contexts of vehicles and engines.
static void TrainDetailsCapacityTab(const CargoSummaryItem *item, int left, int right, int y)
Draw the details capacity tab for the given vehicle at the given position.
void Draw(int x, int y, PaletteID default_pal, bool force_pal) const
Draw the sprite sequence.
byte _colour_gradient[COLOUR_END][8]
All 16 colour gradients 8 colours per gradient from darkest (0) to lightest (7)
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
static const uint TRAIN_DETAILS_MIN_INDENT
Minimum indent level in the train details window.
bool IsArticulatedPart() const
Check if the vehicle is an articulated part of an engine.
uint capacity
Amount that can be carried.
@ TDW_TAB_TOTALS
Tab with sum of total cargo transported.
const GRFFile * GetGRF() const
Retrieve the NewGRF the engine is tied to.
int traininfo_vehicle_pitch
Vertical offset for drawing train images in depot GUI and vehicle details.
uint16 EngineID
Unique identification number of an engine.
std::vector< CargoSummaryItem > CargoSummary
Container for the cargo summary information.
StationID source
One of the source stations.
Common return value for all commands.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
TileIndex tile
Current tile index.
static const VehicleID INVALID_VEHICLE
Constant representing a non-existing vehicle.
EngineID engine_type
The type of engine used for this vehicle.
@ VS_CRASHED
Vehicle is crashed.
Sprite sequence for a vehicle part.
ClientID
'Unique' identifier to be given to clients
VehicleCargoList cargo
The cargo this vehicle is carrying.
bool Failed() const
Did this command fail?
static int ScaleSpriteTrad(int value)
Scale traditional pixel dimensions to GUI zoom level, for drawing sprites.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
static Train * Get(size_t index)
Gets vehicle with given index.
static CargoSummary _cargo_summary
Reused container of cargo details.
const Engine * GetEngine() const
Retrieves the engine of the vehicle.
'Train' is either a loco or a wagon.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
static const uint TRAIN_DETAILS_MAX_INDENT
Maximum indent level in the train details window; wider than this and we start on a new line.
static void TrainDetailsInfoTab(const Vehicle *v, int left, int right, int y)
Draw the details info tab for the given vehicle at the given position.
Coordinates of a point in 2D.
@ VehicleDetails
Name is shown in the vehicle details GUI.
@ WC_TRAINS_LIST
Trains list; Window numbers:
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
@ RAILVEH_WAGON
simple wagon, not motorized
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height)
Set up a clipping area for only drawing into a certain area.
StringID GetCargoSubtypeText(const Vehicle *v)
Get the cargo subtype text from NewGRF for the vehicle details window.
void CcBuildWagon(Commands cmd, const CommandCost &result, VehicleID new_veh_id, uint, uint16, CargoArray, TileIndex tile, EngineID, bool, CargoID, ClientID)
Callback for building wagons.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
static int HighlightDragPosition(int px, int max_width, int y, VehicleID selection, bool chain)
Highlight the position where a rail vehicle is dragged over by drawing a light gray background.
Helper struct for the cargo details information.
static const PaletteID PALETTE_CRASH
Recolour sprite greying of crashed vehicles.
CargoID cargo
The cargo that is carried.
static void TrainDetailsCargoTab(const CargoSummaryItem *item, int left, int right, int y)
Draw the details cargo tab for the given vehicle at the given position.
uint16 cargo_cap
total capacity
bool CanCarryCargo() const
Determines whether an engine can carry something.
@ TDW_TAB_CAPACITY
Tab with cargo capacity of the vehicles.
static Train * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
PaletteID GetVehiclePalette(const Vehicle *v)
Get the colour map for a vehicle.
#define FONT_HEIGHT_NORMAL
Height of characters in the normal (FS_NORMAL) font.
uint32 PaletteID
The number of the palette.
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
@ NUM_CARGO
Maximal number of cargo types in a game.
Year build_year
Year the vehicle has been built.
bool operator!=(const CargoSummaryItem &other) const
Used by CargoSummary::Find() and similar functions.
StationID Source() const
Returns source of the first cargo packet in this list.
static Pool::IterateWrapper< Train > Iterate(size_t from=0)
Returns an iterable ensemble of all valid vehicles of type T.
void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const override
Get the sprite to display the train.
Vehicle * Last()
Get the last vehicle of this vehicle chain.
uint32 VehicleID
The type all our vehicle IDs have.
static int CenterBounds(int min, int max, int size)
Determine where to draw a centred object inside a widget.
uint amount
Amount that is carried.
byte CargoID
Cargo slots to indicate a cargo type within a game.
bool operator==(const CargoSummaryItem &other) const
Used by std::find() and similar functions.
CargoID cargo_type
type of cargo this vehicle is carrying
static uint GetLengthOfArticulatedVehicle(const Train *v)
Get the length of an articulated vehicle.
VehicleSettings vehicle
options for vehicles
StringID subtype
STR_EMPTY if none.
int Width() const
Get width of Rect.
int GetTrainDetailsWndVScroll(VehicleID veh_id, TrainDetailsWindowTabs det_tab)
Determines the number of lines in the train details window.
uint8 freight_trains
value to multiply the weight of cargo by
Specification of a rectangle with absolute coordinates of all edges.
@ TD_RTL
Text is written right-to-left by default.
TextDirection _current_text_dir
Text direction of the currently selected language.
@ FR_BORDERONLY
Draw border only, no background.
Data about how and where to blit pixels.
void DrawTrainImage(const Train *v, const Rect &r, VehicleID selection, EngineImageType image_type, int skip, VehicleID drag_dest)
Draws an image of a whole train.
@ TDW_TAB_CARGO
Tab with cargo carried by the vehicles.
byte FreightWagonMult(CargoID cargo)
Return the cargo weight multiplier to use for a rail vehicle.