2005-07-24 15:12:37 +01:00
/* $Id$ */
2009-08-21 21:21:05 +01:00
/*
* 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/>.
*/
2008-05-06 16:11:33 +01:00
/** @file roadveh_gui.cpp GUI for road vehicles. */
2007-03-28 21:41:35 +01:00
2004-08-09 18:04:08 +01:00
# include "stdafx.h"
2006-06-05 11:23:18 +01:00
# include "roadveh.h"
2007-12-19 20:45:46 +00:00
# include "window_gui.h"
2007-12-21 19:49:27 +00:00
# include "strings_func.h"
2007-12-27 13:35:39 +00:00
# include "vehicle_func.h"
2008-01-07 14:23:25 +00:00
# include "string_func.h"
2014-10-04 17:40:23 +01:00
# include "zoom_func.h"
2004-08-09 18:04:08 +01:00
2008-01-13 01:21:35 +00:00
# include "table/strings.h"
2004-08-09 18:04:08 +01:00
2014-04-23 21:13:33 +01:00
# include "safeguards.h"
2009-03-22 10:37:51 +00:00
/**
* 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 )
2007-06-11 15:00:16 +01:00
{
2014-10-04 17:40:23 +01:00
uint y_offset = v - > HasArticulatedPart ( ) ? UnScaleByZoom ( 4 * 15 , ZOOM_LVL_GUI ) : 0 ; // Draw the first line below the sprite of an articulated RV instead of after it.
2007-09-06 00:26:45 +01:00
StringID str ;
2008-08-18 17:52:40 +01:00
Money feeder_share = 0 ;
2007-06-11 15:00:16 +01:00
2007-09-06 00:26:45 +01:00
SetDParam ( 0 , v - > engine_type ) ;
SetDParam ( 1 , v - > build_year ) ;
SetDParam ( 2 , v - > value ) ;
2013-06-24 19:39:19 +01:00
DrawString ( left , right , y + y_offset , STR_VEHICLE_INFO_BUILT_VALUE ) ;
2007-06-11 15:00:16 +01:00
2011-01-29 17:30:25 +00:00
if ( v - > HasArticulatedPart ( ) ) {
2009-06-27 19:26:50 +01:00
CargoArray max_cargo ;
2009-02-14 18:42:03 +00:00
StringID subtype_text [ NUM_CARGO ] ;
2007-09-06 00:26:45 +01:00
char capacity [ 512 ] ;
2007-06-11 15:00:16 +01:00
2009-02-14 18:42:03 +00:00
memset ( subtype_text , 0 , sizeof ( subtype_text ) ) ;
2007-06-11 15:00:16 +01:00
2007-09-06 00:26:45 +01:00
for ( const Vehicle * u = v ; u ! = NULL ; u = u - > Next ( ) ) {
max_cargo [ u - > cargo_type ] + = u - > cargo_cap ;
2009-02-14 18:42:03 +00:00
if ( u - > cargo_cap > 0 ) {
StringID text = GetCargoSubtypeText ( u ) ;
if ( text ! = STR_EMPTY ) subtype_text [ u - > cargo_type ] = text ;
}
2007-06-11 15:00:16 +01:00
}
2009-08-05 18:59:21 +01:00
GetString ( capacity , STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY , lastof ( capacity ) ) ;
2007-06-11 15:00:16 +01:00
2007-09-06 00:26:45 +01:00
bool first = true ;
for ( CargoID i = 0 ; i < NUM_CARGO ; i + + ) {
if ( max_cargo [ i ] > 0 ) {
char buffer [ 128 ] ;
2007-06-11 15:00:16 +01:00
2007-09-06 00:26:45 +01:00
SetDParam ( 0 , i ) ;
SetDParam ( 1 , max_cargo [ i ] ) ;
2009-07-23 20:31:50 +01:00
GetString ( buffer , STR_JUST_CARGO , lastof ( buffer ) ) ;
2007-08-06 13:54:03 +01:00
2007-09-06 00:26:45 +01:00
if ( ! first ) strecat ( capacity , " , " , lastof ( capacity ) ) ;
strecat ( capacity , buffer , lastof ( capacity ) ) ;
2009-02-14 18:42:03 +00:00
if ( subtype_text [ i ] ! = 0 ) {
GetString ( buffer , subtype_text [ i ] , lastof ( buffer ) ) ;
strecat ( capacity , buffer , lastof ( capacity ) ) ;
}
2007-09-06 00:26:45 +01:00
first = false ;
2007-06-11 15:00:16 +01:00
}
2007-09-06 00:26:45 +01:00
}
2007-06-11 15:00:16 +01:00
2009-10-25 17:21:57 +00:00
DrawString ( left , right , y + FONT_HEIGHT_NORMAL + y_offset , capacity , TC_BLUE ) ;
2007-06-11 15:00:16 +01:00
2007-09-06 00:26:45 +01:00
for ( const Vehicle * u = v ; u ! = NULL ; u = u - > Next ( ) ) {
2008-06-24 14:49:13 +01:00
if ( u - > cargo_cap = = 0 ) continue ;
2009-04-22 00:40:56 +01:00
str = STR_VEHICLE_DETAILS_CARGO_EMPTY ;
2013-04-13 14:42:08 +01:00
if ( u - > cargo . StoredCount ( ) > 0 ) {
2007-09-06 00:26:45 +01:00
SetDParam ( 0 , u - > cargo_type ) ;
2013-04-13 14:42:08 +01:00
SetDParam ( 1 , u - > cargo . StoredCount ( ) ) ;
2007-09-06 00:26:45 +01:00
SetDParam ( 2 , u - > cargo . Source ( ) ) ;
2009-04-22 00:40:56 +01:00
str = STR_VEHICLE_DETAILS_CARGO_FROM ;
2008-08-18 17:52:40 +01:00
feeder_share + = u - > cargo . FeederShare ( ) ;
2007-06-11 15:00:16 +01:00
}
2009-10-25 17:21:57 +00:00
DrawString ( left , right , y + 2 * FONT_HEIGHT_NORMAL + 1 + y_offset , str ) ;
2007-03-02 18:49:11 +00:00
2009-10-25 17:21:57 +00:00
y_offset + = FONT_HEIGHT_NORMAL + 1 ;
2007-06-11 15:00:16 +01:00
}
2004-09-04 14:06:09 +01:00
2009-10-25 17:21:57 +00:00
y_offset - = FONT_HEIGHT_NORMAL + 1 ;
2007-09-06 00:26:45 +01:00
} else {
SetDParam ( 0 , v - > cargo_type ) ;
SetDParam ( 1 , v - > cargo_cap ) ;
2009-04-20 22:29:41 +01:00
SetDParam ( 4 , GetCargoSubtypeText ( v ) ) ;
2009-12-11 23:00:07 +00:00
DrawString ( left , right , y + FONT_HEIGHT_NORMAL + y_offset , STR_VEHICLE_INFO_CAPACITY ) ;
2004-09-04 14:06:09 +01:00
2009-04-22 00:40:56 +01:00
str = STR_VEHICLE_DETAILS_CARGO_EMPTY ;
2013-04-13 14:42:08 +01:00
if ( v - > cargo . StoredCount ( ) > 0 ) {
2007-09-06 00:26:45 +01:00
SetDParam ( 0 , v - > cargo_type ) ;
2013-04-13 14:42:08 +01:00
SetDParam ( 1 , v - > cargo . StoredCount ( ) ) ;
2007-09-06 00:26:45 +01:00
SetDParam ( 2 , v - > cargo . Source ( ) ) ;
2009-04-22 00:40:56 +01:00
str = STR_VEHICLE_DETAILS_CARGO_FROM ;
2008-08-18 17:52:40 +01:00
feeder_share + = v - > cargo . FeederShare ( ) ;
2005-05-15 19:50:55 +01:00
}
2009-10-25 17:21:57 +00:00
DrawString ( left , right , y + 2 * FONT_HEIGHT_NORMAL + 1 + y_offset , str ) ;
2004-08-09 18:04:08 +01:00
}
2007-09-06 00:26:45 +01:00
/* Draw Transfer credits text */
2008-08-18 17:52:40 +01:00
SetDParam ( 0 , feeder_share ) ;
2009-10-25 17:21:57 +00:00
DrawString ( left , right , y + 3 * FONT_HEIGHT_NORMAL + 3 + y_offset , STR_VEHICLE_INFO_FEEDER_CARGO_VALUE ) ;
2007-09-06 00:26:45 +01:00
}
2004-08-09 18:04:08 +01:00
2009-07-12 17:00:11 +01:00
/**
* Draws an image of a road vehicle chain
2009-11-16 22:25:01 +00:00
* @ 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
2010-12-21 13:56:52 +00:00
* @ param skip Number of pixels to skip at the front ( for scrolling )
2009-07-12 17:00:11 +01:00
*/
2011-11-01 16:51:47 +00:00
void DrawRoadVehImage ( const Vehicle * v , int left , int right , int y , VehicleID selection , EngineImageType image_type , int skip )
2004-08-09 18:04:08 +01:00
{
2010-11-13 09:56:25 +00:00
bool rtl = _current_text_dir = = TD_RTL ;
2009-11-17 11:36:36 +00:00
Direction dir = rtl ? DIR_E : DIR_W ;
2009-07-18 13:34:19 +01:00
const RoadVehicle * u = RoadVehicle : : From ( v ) ;
2009-11-17 11:36:36 +00:00
2010-12-21 13:56:07 +00:00
DrawPixelInfo tmp_dpi , * old_dpi ;
2009-11-16 22:25:01 +00:00
int max_width = right - left + 1 ;
2009-11-17 11:36:36 +00:00
2014-10-04 17:40:23 +01:00
if ( ! FillDrawPixelInfo ( & tmp_dpi , left , y , max_width , UnScaleByZoom ( 4 * 14 , ZOOM_LVL_GUI ) ) ) return ;
2010-12-21 13:56:07 +00:00
old_dpi = _cur_dpi ;
_cur_dpi = & tmp_dpi ;
2010-12-21 13:56:52 +00:00
int px = rtl ? max_width + skip : - skip ;
2010-12-21 13:56:07 +00:00
for ( ; u ! = NULL & & ( rtl ? px > 0 : px < max_width ) ; u = u - > Next ( ) ) {
2009-07-18 13:34:19 +01:00
Point offset ;
int width = u - > GetDisplayImageWidth ( & offset ) ;
2010-12-21 13:56:07 +00:00
if ( rtl ? px + width > 0 : px - width < max_width ) {
PaletteID pal = ( u - > vehstatus & VS_CRASHED ) ? PALETTE_CRASH : GetVehiclePalette ( u ) ;
2014-10-04 17:40:23 +01:00
DrawSprite ( u - > GetImage ( dir , image_type ) , pal , px + ( rtl ? - offset . x : offset . x ) , UnScaleByZoom ( 4 * 6 , ZOOM_LVL_GUI ) + offset . y ) ;
2010-12-21 13:56:07 +00:00
}
2009-11-17 11:36:36 +00:00
2010-12-21 13:56:07 +00:00
px + = rtl ? - width : width ;
2008-04-05 12:27:50 +01:00
}
2009-07-18 13:34:19 +01:00
if ( v - > index = = selection ) {
2014-10-04 17:40:23 +01:00
DrawFrameRect ( ( rtl ? px : 0 ) , 0 , ( rtl ? max_width : px ) - 1 , UnScaleByZoom ( 4 * 13 , ZOOM_LVL_GUI ) - 1 , COLOUR_WHITE , FR_BORDERONLY ) ;
2007-09-06 00:26:45 +01:00
}
2010-12-21 13:56:07 +00:00
_cur_dpi = old_dpi ;
2004-08-09 18:04:08 +01:00
}