Files @ r25958:603d75b53498
Branch filter:

Location: cpp/openttd-patchpack/source/src/roadveh_gui.cpp - annotation

Patric Stout
Doc: update multiplayer documentation with latest changes (#9552)

Although several places were fixed during the PR making the change,
not all made it in this document.

While at it, removed all kinds of Markdown warnings by an excessive
usage of spacebar in this document.
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r9111:983de9c5a848
r6393:f9322fdf4c2c
r5584:545d748cc681
r5584:545d748cc681
r8107:82461791b7a2
r8114:866ed489ed98
r8144:1432edd15267
r8214:9a3935f9ef4e
r21806:6d9f5fa48e29
r5584:545d748cc681
r8264:d493cb51fe8a
r7530:8eaeedf8b40c
r21383:942c32fb8b0e
r21383:942c32fb8b0e
r11443:81f75d8ddd0c
r11443:81f75d8ddd0c
r11443:81f75d8ddd0c
r11443:81f75d8ddd0c
r11443:81f75d8ddd0c
r11443:81f75d8ddd0c
r11443:81f75d8ddd0c
r11443:81f75d8ddd0c
r11443:81f75d8ddd0c
r7530:8eaeedf8b40c
r21979:8f441a1deb2a
r7530:8eaeedf8b40c
r9943:38700f276db2
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r20439:d34496be8ad3
r7530:8eaeedf8b40c
r17175:412ca7ec4689
r12251:58d0d73149cb
r11133:84e4d86c0cb1
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r11133:84e4d86c0cb1
r7530:8eaeedf8b40c
r23607:36c15679007d
r7530:8eaeedf8b40c
r11133:84e4d86c0cb1
r11133:84e4d86c0cb1
r11133:84e4d86c0cb1
r11133:84e4d86c0cb1
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r12622:202e83a6cee7
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r12483:edbdfbf85fff
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r11133:84e4d86c0cb1
r11133:84e4d86c0cb1
r11133:84e4d86c0cb1
r11133:84e4d86c0cb1
r11133:84e4d86c0cb1
r11133:84e4d86c0cb1
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r13351:43a3e6e1e395
r7530:8eaeedf8b40c
r23607:36c15679007d
r9585:ea8ab5462274
r9585:ea8ab5462274
r11725:57bc99fdc1bc
r20188:c7660e0c9b5b
r7530:8eaeedf8b40c
r20188:c7660e0c9b5b
r7530:8eaeedf8b40c
r11725:57bc99fdc1bc
r9943:38700f276db2
r7530:8eaeedf8b40c
r13351:43a3e6e1e395
r7530:8eaeedf8b40c
r13351:43a3e6e1e395
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r13351:43a3e6e1e395
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r11709:0908d1040b1c
r13925:e96b87452ce6
r7530:8eaeedf8b40c
r11725:57bc99fdc1bc
r20188:c7660e0c9b5b
r7530:8eaeedf8b40c
r20188:c7660e0c9b5b
r7530:8eaeedf8b40c
r11725:57bc99fdc1bc
r9943:38700f276db2
r7530:8eaeedf8b40c
r13351:43a3e6e1e395
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r9943:38700f276db2
r13351:43a3e6e1e395
r7530:8eaeedf8b40c
r7530:8eaeedf8b40c
r12364:cbc66d4e5c75
r12364:cbc66d4e5c75
r13599:f6ef46132fe6
r13599:f6ef46132fe6
r13599:f6ef46132fe6
r13599:f6ef46132fe6
r13599:f6ef46132fe6
r16821:db130aa96d2d
r12364:cbc66d4e5c75
r18234:0d83ef81cba4
r5584:545d748cc681
r16431:ec558deca9d7
r13602:30f9b380fb13
r12428:f9fdea44ada5
r13602:30f9b380fb13
r16820:95b8aa6ebc2d
r13599:f6ef46132fe6
r16820:95b8aa6ebc2d
r21979:8f441a1deb2a
r13602:30f9b380fb13
r16820:95b8aa6ebc2d
r16820:95b8aa6ebc2d
r16820:95b8aa6ebc2d
r16821:db130aa96d2d
r23607:36c15679007d
r12428:f9fdea44ada5
r12428:f9fdea44ada5
r8828:13b26c4bf7f4
r16820:95b8aa6ebc2d
r16820:95b8aa6ebc2d
r22459:c1921e75ce89
r22459:c1921e75ce89
r22482:804e13055d07
r16820:95b8aa6ebc2d
r13602:30f9b380fb13
r16820:95b8aa6ebc2d
r8828:13b26c4bf7f4
r8828:13b26c4bf7f4
r12428:f9fdea44ada5
r21979:8f441a1deb2a
r5584:545d748cc681
r16820:95b8aa6ebc2d
r16820:95b8aa6ebc2d
r5584:545d748cc681
/*
 * This file is part of OpenTTD.
 * 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.
 * 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.
 * 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/>.
 */

/** @file roadveh_gui.cpp GUI for road vehicles. */

#include "stdafx.h"
#include "roadveh.h"
#include "window_gui.h"
#include "strings_func.h"
#include "vehicle_func.h"
#include "string_func.h"
#include "zoom_func.h"

#include "table/strings.h"

#include "safeguards.h"

/**
 * Draw the details for the given vehicle at the given position
 *
 * @param v     current vehicle
 * @param left  The left most coordinate to draw
 * @param right The right most coordinate to draw
 * @param y     The y coordinate
 */
void DrawRoadVehDetails(const Vehicle *v, int left, int right, int y)
{
	uint y_offset = v->HasArticulatedPart() ? ScaleGUITrad(15) : 0; // Draw the first line below the sprite of an articulated RV instead of after it.
	StringID str;
	Money feeder_share = 0;

	SetDParam(0, v->engine_type);
	SetDParam(1, v->build_year);
	SetDParam(2, v->value);
	DrawString(left, right, y + y_offset, STR_VEHICLE_INFO_BUILT_VALUE);

	if (v->HasArticulatedPart()) {
		CargoArray max_cargo;
		StringID subtype_text[NUM_CARGO];
		char capacity[512];

		memset(subtype_text, 0, sizeof(subtype_text));

		for (const Vehicle *u = v; u != nullptr; u = u->Next()) {
			max_cargo[u->cargo_type] += u->cargo_cap;
			if (u->cargo_cap > 0) {
				StringID text = GetCargoSubtypeText(u);
				if (text != STR_EMPTY) subtype_text[u->cargo_type] = text;
			}
		}

		GetString(capacity, STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY, lastof(capacity));

		bool first = true;
		for (CargoID i = 0; i < NUM_CARGO; i++) {
			if (max_cargo[i] > 0) {
				char buffer[128];

				SetDParam(0, i);
				SetDParam(1, max_cargo[i]);
				GetString(buffer, STR_JUST_CARGO, lastof(buffer));

				if (!first) strecat(capacity, ", ", lastof(capacity));
				strecat(capacity, buffer, lastof(capacity));

				if (subtype_text[i] != 0) {
					GetString(buffer, subtype_text[i], lastof(buffer));
					strecat(capacity, buffer, lastof(capacity));
				}

				first = false;
			}
		}

		DrawString(left, right, y + FONT_HEIGHT_NORMAL + y_offset, capacity, TC_BLUE);

		for (const Vehicle *u = v; u != nullptr; u = u->Next()) {
			if (u->cargo_cap == 0) continue;

			str = STR_VEHICLE_DETAILS_CARGO_EMPTY;
			if (u->cargo.StoredCount() > 0) {
				SetDParam(0, u->cargo_type);
				SetDParam(1, u->cargo.StoredCount());
				SetDParam(2, u->cargo.Source());
				str = STR_VEHICLE_DETAILS_CARGO_FROM;
				feeder_share += u->cargo.FeederShare();
			}
			DrawString(left, right, y + 2 * FONT_HEIGHT_NORMAL + 1 + y_offset, str);

			y_offset += FONT_HEIGHT_NORMAL + 1;
		}

		y_offset -= FONT_HEIGHT_NORMAL + 1;
	} else {
		SetDParam(0, v->cargo_type);
		SetDParam(1, v->cargo_cap);
		SetDParam(4, GetCargoSubtypeText(v));
		DrawString(left, right, y + FONT_HEIGHT_NORMAL + y_offset, STR_VEHICLE_INFO_CAPACITY);

		str = STR_VEHICLE_DETAILS_CARGO_EMPTY;
		if (v->cargo.StoredCount() > 0) {
			SetDParam(0, v->cargo_type);
			SetDParam(1, v->cargo.StoredCount());
			SetDParam(2, v->cargo.Source());
			str = STR_VEHICLE_DETAILS_CARGO_FROM;
			feeder_share += v->cargo.FeederShare();
		}
		DrawString(left, right, y + 2 * FONT_HEIGHT_NORMAL + 1 + y_offset, str);
	}

	/* Draw Transfer credits text */
	SetDParam(0, feeder_share);
	DrawString(left, right, y + 3 * FONT_HEIGHT_NORMAL + 3 + y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE);
}

/**
 * Draws an image of a road vehicle chain
 * @param v         Front vehicle
 * @param left      The minimum horizontal position
 * @param right     The maximum horizontal position
 * @param y         Vertical position to draw at
 * @param selection Selected vehicle to draw a frame around
 * @param skip      Number of pixels to skip at the front (for scrolling)
 */
void DrawRoadVehImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type, int skip)
{
	bool rtl = _current_text_dir == TD_RTL;
	Direction dir = rtl ? DIR_E : DIR_W;
	const RoadVehicle *u = RoadVehicle::From(v);

	DrawPixelInfo tmp_dpi, *old_dpi;
	int max_width = right - left + 1;

	if (!FillDrawPixelInfo(&tmp_dpi, left, y, max_width, ScaleGUITrad(14))) return;

	old_dpi = _cur_dpi;
	_cur_dpi = &tmp_dpi;

	int px = rtl ? max_width + skip : -skip;
	for (; u != nullptr && (rtl ? px > 0 : px < max_width); u = u->Next()) {
		Point offset;
		int width = u->GetDisplayImageWidth(&offset);

		if (rtl ? px + width > 0 : px - width < max_width) {
			PaletteID pal = (u->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(u);
			VehicleSpriteSeq seq;
			u->GetImage(dir, image_type, &seq);
			seq.Draw(px + (rtl ? -offset.x : offset.x), ScaleGUITrad(6) + offset.y, pal, (u->vehstatus & VS_CRASHED) != 0);
		}

		px += rtl ? -width : width;
	}

	if (v->index == selection) {
		DrawFrameRect((rtl ? px : 0), 0, (rtl ? max_width : px) - 1, ScaleGUITrad(13) - 1, COLOUR_WHITE, FR_BORDERONLY);
	}

	_cur_dpi = old_dpi;
}