changeset 17848:c002a390f12a draft

(svn r22639) -Feature: [NewGRF] Support for ship props 14/15 (ocean/canal speed fraction).
author michi_cc <michi_cc@openttd.org>
date Thu, 07 Jul 2011 14:16:22 +0000
parents 178d22500708
children 1de8871abb59
files src/engine_type.h src/newgrf.cpp src/ship_cmd.cpp
diffstat 3 files changed, 17 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/engine_type.h
+++ b/src/engine_type.h
@@ -72,6 +72,8 @@
 	SoundID sfx;
 	bool old_refittable;   ///< Is ship refittable; only used during initialisation. Later use EngineInfo::refit_mask.
 	byte visual_effect;    ///< Bitstuffed NewGRF visual effect data
+	byte ocean_speed_frac; ///< Fraction of maximum speed for ocean tiles.
+	byte canal_speed_frac; ///< Fraction of maximum speed for canal/river tiles.
 };
 
 /**
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -1194,10 +1194,11 @@
 				break;
 
 			case 0x14: // Ocean speed fraction
+				svi->ocean_speed_frac = buf->ReadByte();
+				break;
+
 			case 0x15: // Canal speed fraction
-				/** @todo Speed fractions for ships on oceans and canals */
-				buf->ReadByte();
-				ret = CIR_UNHANDLED;
+				svi->canal_speed_frac = buf->ReadByte();
 				break;
 
 			case 0x16: // Retire vehicle early
--- a/src/ship_cmd.cpp
+++ b/src/ship_cmd.cpp
@@ -155,7 +155,12 @@
  */
 void Ship::UpdateCache()
 {
-	this->vcache.cached_max_speed = GetVehicleProperty(this, PROP_SHIP_SPEED, ShipVehInfo(this->engine_type)->max_speed);
+	const ShipVehicleInfo *svi = ShipVehInfo(this->engine_type);
+
+	/* Get speed fraction for the current water type. Aqueducts are always canals. */
+	byte speed_frac = (!IsTileType(this->tile, MP_TUNNELBRIDGE) && GetWaterClass(this->tile) == WATER_CLASS_SEA) ? svi->ocean_speed_frac : svi->canal_speed_frac;
+	/* speed_frac == 0 means no reduction while 0xFF means reduction to 1/256. */
+	this->vcache.cached_max_speed = GetVehicleProperty(this, PROP_SHIP_SPEED, svi->max_speed) * (256 - speed_frac) / 256;
 
 	this->UpdateVisualEffect();
 }
@@ -545,6 +550,11 @@
 			if (!HasBit(r, VETS_ENTERED_WORMHOLE)) {
 				v->tile = gp.new_tile;
 				v->state = TrackToTrackBits(track);
+
+				/* Update ship cache when the water class changes. Aqueducts are always canals. */
+				WaterClass old_wc = IsTileType(gp.old_tile, MP_TUNNELBRIDGE) ? WATER_CLASS_CANAL : GetWaterClass(gp.old_tile);
+				WaterClass new_wc = IsTileType(gp.new_tile, MP_TUNNELBRIDGE) ? WATER_CLASS_CANAL : GetWaterClass(gp.new_tile);
+				if (old_wc != new_wc) v->UpdateCache();
 			}
 
 			v->direction = (Direction)b[2];