Changeset - r14745:06b1ec7617d7
[Not reviewed]
master
0 3 0
terkhen - 14 years ago 2010-03-06 12:54:42
terkhen@openttd.org
(svn r19343) -Codechange: Make RoadVehicle a child class of GroundVehicle.
-Add: Required acceleration functions at RoadVehicle.
3 files changed with 138 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/ground_vehicle.cpp
Show inline comments
 
@@ -11,6 +11,7 @@
 

	
 
#include "stdafx.h"
 
#include "train.h"
 
#include "roadveh.h"
 
#include "ground_vehicle.hpp"
 
#include "window_type.h"
 
#include "vehicle_gui.h"
 
@@ -148,3 +149,5 @@ int GroundVehicle<T, Type>::GetAccelerat
 

	
 
/* Instantiation for Train */
 
template struct GroundVehicle<Train, VEH_TRAIN>;
 
/* Instantiation for RoadVehicle */
 
template struct GroundVehicle<RoadVehicle, VEH_ROAD>;
src/roadveh.h
Show inline comments
 
@@ -12,8 +12,11 @@
 
#ifndef ROADVEH_H
 
#define ROADVEH_H
 

	
 
#include "vehicle_base.h"
 
#include "road_type.h"
 
#include "ground_vehicle.hpp"
 
#include "engine_base.h"
 
#include "cargotype.h"
 
#include "road_map.h"
 

	
 
struct RoadVehicle;
 

	
 
@@ -89,7 +92,7 @@ struct RoadVehicleCache {
 
/**
 
 * Buses, trucks and trams belong to this class.
 
 */
 
struct RoadVehicle : public SpecializedVehicle<RoadVehicle, VEH_ROAD> {
 
struct RoadVehicle : public GroundVehicle<RoadVehicle, VEH_ROAD> {
 
	RoadVehicleCache rcache; ///< Cache of often used calculated values
 
	byte state;             ///< @see RoadVehicleStates
 
	byte frame;
 
@@ -103,10 +106,12 @@ struct RoadVehicle : public SpecializedV
 
	RoadTypes compatible_roadtypes;
 

	
 
	/** We don't want GCC to zero our struct! It already is zeroed and has an index! */
 
	RoadVehicle() : SpecializedVehicle<RoadVehicle, VEH_ROAD>() {}
 
	RoadVehicle() : GroundVehicle<RoadVehicle, VEH_ROAD>() {}
 
	/** We want to 'destruct' the right class. */
 
	virtual ~RoadVehicle() { this->PreDestructor(); }
 

	
 
	friend struct GroundVehicle<RoadVehicle, VEH_ROAD>; // GroundVehicle needs to use the acceleration functions defined at RoadVehicle.
 

	
 
	const char *GetTypeString() const { return "road vehicle"; }
 
	void MarkDirty();
 
	void UpdateDeltaXY(Direction direction);
 
@@ -155,6 +160,132 @@ struct RoadVehicle : public SpecializedV
 
	 * @return True if the engine has an articulated part.
 
	 */
 
	FORCEINLINE bool HasArticulatedPart() const { return this->Next() != NULL && this->Next()->IsArticulatedPart(); }
 

	
 
protected: // These functions should not be called outside acceleration code.
 

	
 
	/**
 
	 * Allows to know the power value that this vehicle will use.
 
	 * @return Power value from the engine in HP, or zero if the vehicle is not powered.
 
	 */
 
	FORCEINLINE uint16 GetPower() const
 
	{
 
		/* Power is not added for articulated parts */
 
		if (!this->IsArticulatedPart()) {
 
			return 10 * RoadVehInfo(this->engine_type)->power; // Road vehicle power is in units of 10 HP.
 
		}
 
		return 0;
 
	}
 

	
 
	/**
 
	 * Returns a value if this articulated part is powered.
 
	 * @return Zero, because road vehicles don't have powered parts.
 
	 */
 
	FORCEINLINE uint16 GetPoweredPartPower(const RoadVehicle *head) const
 
	{
 
		return 0;
 
	}
 

	
 
	/**
 
	 * Allows to know the weight value that this vehicle will use.
 
	 * @return Weight value from the engine in tonnes.
 
	 */
 
	FORCEINLINE uint16 GetWeight() const
 
	{
 
		uint16 weight = (CargoSpec::Get(this->cargo_type)->weight * this->cargo.Count()) / 16;
 

	
 
		/* Vehicle weight is not added for articulated parts. */
 
		if (!this->IsArticulatedPart()) {
 
			weight += RoadVehInfo(this->engine_type)->weight / 4; // Road vehicle weight is in units of 1/4 t.
 
		}
 

	
 
		return weight;
 
	}
 

	
 
	/**
 
	 * Allows to know the tractive effort value that this vehicle will use.
 
	 * @return Tractive effort value from the engine.
 
	 */
 
	FORCEINLINE byte GetTractiveEffort() const
 
	{
 
		return RoadVehInfo(this->engine_type)->tractive_effort;
 
	}
 

	
 
	/**
 
	 * Checks the current acceleration status of this vehicle.
 
	 * @return Acceleration status.
 
	 */
 
	FORCEINLINE AccelStatus GetAccelerationStatus() const
 
	{
 
		return (this->vehstatus & VS_STOPPED) ? AS_BRAKE : AS_ACCEL;
 
	}
 

	
 
	/**
 
	 * Calculates the current speed of this vehicle.
 
	 * @return Current speed in mph.
 
	 */
 
	FORCEINLINE uint16 GetCurrentSpeed() const
 
	{
 
		return this->cur_speed * 10 / 32;
 
	}
 

	
 
	/**
 
	 * Returns the rolling friction coefficient of this vehicle.
 
	 * @return Rolling friction coefficient in [1e-3].
 
	 */
 
	FORCEINLINE uint32 GetRollingFriction() const
 
	{
 
		/* Trams have a slightly greater friction coefficient than trains. The rest of road vehicles have bigger values. */
 
		return (this->roadtype == ROADTYPE_TRAM) ? 50 : 75;
 
	}
 

	
 
	/**
 
	 * Allows to know the acceleration type of a vehicle.
 
	 * @return Zero, road vehicles always use a normal acceleration method.
 
	 */
 
	FORCEINLINE int GetAccelerationType() const
 
	{
 
		return 0;
 
	}
 

	
 
	/**
 
	 * Returns the slope steepness used by this vehicle.
 
	 * @return Slope steepness used by the vehicle.
 
	 */
 
	FORCEINLINE uint32 GetSlopeSteepness() const
 
	{
 
		/* Road vehicles use by default a steeper slope than trains. */
 
		return 20 * 7; // 1% slope * slope steepness
 
	}
 

	
 
	/**
 
	 * Gets the maximum speed of the vehicle, ignoring the limitations of the kind of track the vehicle is on.
 
	 * @return Maximum speed of the vehicle.
 
	 */
 
	FORCEINLINE uint16 GetInitialMaxSpeed() const
 
	{
 
		return this->max_speed;
 
	}
 

	
 
	/**
 
	 * Gets the maximum speed allowed by the track for this vehicle.
 
	 * @return Since roads don't limit road vehicle speed, it returns always zero.
 
	 */
 
	FORCEINLINE uint16 GetMaxTrackSpeed() const
 
	{
 
		return 0;
 
	}
 

	
 
	/**
 
	 * Checks if the vehicle is at a tile that can be sloped.
 
	 * @return True if the tile can be sloped.
 
	 */
 
	FORCEINLINE bool TileMayHaveSlopedTrack() const
 
	{
 
		if (!IsNormalRoadTile(this->tile)) return false;
 
		RoadBits cur_road = GetAllRoadBits(this->tile);
 
		/* Any road that isn't ROAD_X or ROAD_Y cannot be sloped. */
 
		return cur_road == ROAD_X || cur_road == ROAD_Y;
 
	}
 
};
 

	
 
#define FOR_ALL_ROADVEHICLES(var) FOR_ALL_VEHICLES_OF_TYPE(RoadVehicle, var)
src/saveload/vehicle_sl.cpp
Show inline comments
 
@@ -563,6 +563,7 @@ const SaveLoad *GetVehicleDescription(Ve
 
		     SLE_VAR(RoadVehicle, reverse_ctr,          SLE_UINT8),
 

	
 
		SLE_CONDNULL(2,                                                               6,  68),
 
		 SLE_CONDVAR(RoadVehicle, gv_flags,             SLE_UINT16,                 139, SL_MAX_VERSION),
 
		SLE_CONDNULL(4,                                                              69, 130),
 
		SLE_CONDNULL(2,                                                               6, 130),
 
		/* reserve extra space in savegame here. (currently 16 bytes) */
0 comments (0 inline, 0 general)