Mercurial > hg > openttd
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];