diff --git a/src/engine.cpp b/src/engine.cpp index 1f49f2bce9..04f483bb8c 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -205,11 +205,15 @@ uint Engine::GetDisplayDefaultCapacity(uint16 *mail_capacity) const Money Engine::GetRunningCost() const { switch (this->type) { - case VEH_ROAD: - return this->u.road.running_cost * GetPriceByIndex(this->u.road.running_cost_class) >> 8; + case VEH_ROAD: { + if (this->u.road.running_cost_class == INVALID_PRICE) return 0; + return GetEngineProperty(this->index, PROP_ROADVEH_RUNNING_COST_FACTOR, this->u.road.running_cost) * GetPriceByIndex(this->u.road.running_cost_class) >> 8; + } - case VEH_TRAIN: + case VEH_TRAIN: { + if (this->u.rail.running_cost_class == INVALID_PRICE) return 0; return GetEngineProperty(this->index, PROP_TRAIN_RUNNING_COST_FACTOR, this->u.rail.running_cost) * GetPriceByIndex(this->u.rail.running_cost_class) >> 8; + } case VEH_SHIP: return GetEngineProperty(this->index, PROP_SHIP_RUNNING_COST_FACTOR, this->u.ship.running_cost) * _price[PR_RUNNING_SHIP] >> 8; @@ -233,6 +237,7 @@ Money Engine::GetCost() const } else { return GetEngineProperty(this->index, PROP_TRAIN_COST_FACTOR, this->u.rail.cost_factor) * (_price[PR_BUILD_VEHICLE_TRAIN] >> 3) >> 5; } + case VEH_SHIP: return GetEngineProperty(this->index, PROP_SHIP_COST_FACTOR, this->u.ship.cost_factor) * (_price[PR_BUILD_VEHICLE_SHIP] >> 3) >> 5; diff --git a/src/newgrf.cpp b/src/newgrf.cpp index fc38c2b9b9..69a187fd6e 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -752,7 +752,7 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop rvi->max_speed = grf_load_byte(&buf); break; - case 0x09: // Running cost factor + case PROP_ROADVEH_RUNNING_COST_FACTOR: // 0x09 Running cost factor rvi->running_cost = grf_load_byte(&buf); break; diff --git a/src/newgrf_properties.h b/src/newgrf_properties.h index 7786faf89b..758791cafb 100644 --- a/src/newgrf_properties.h +++ b/src/newgrf_properties.h @@ -27,6 +27,7 @@ enum PropertyID { PROP_TRAIN_TRACTIVE_EFFORT = 0x1F, ///< Tractive effort coefficient in 1/256 PROP_TRAIN_USER_DATA = 0x25, ///< User defined data for vehicle variable 0x42 + PROP_ROADVEH_RUNNING_COST_FACTOR = 0x09, ///< Yearly runningcost PROP_ROADVEH_CARGO_CAPACITY = 0x0F, ///< Capacity PROP_ROADVEH_COST_FACTOR = 0x11, ///< Purchase cost diff --git a/src/roadveh.h b/src/roadveh.h index ffcc953eda..279dad56ba 100644 --- a/src/roadveh.h +++ b/src/roadveh.h @@ -121,13 +121,7 @@ struct RoadVehicle : public SpecializedVehicle { SpriteID GetImage(Direction direction) const; int GetDisplaySpeed() const { return this->cur_speed / 2; } int GetDisplayMaxSpeed() const { return this->max_speed / 2; } - - Money GetRunningCost() const - { - const RoadVehicleInfo *rvi = RoadVehInfo(this->engine_type); - return rvi->running_cost * GetPriceByIndex(rvi->running_cost_class); - } - + Money GetRunningCost() const; int GetDisplayImageWidth(Point *offset = NULL) const; bool IsInDepot() const { return this->state == RVSB_IN_DEPOT; } bool IsStoppedInDepot() const; diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 8aebc4e4d3..b5121095ba 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -1821,6 +1821,17 @@ static bool RoadVehController(RoadVehicle *v) return true; } +Money RoadVehicle::GetRunningCost() const +{ + const RoadVehicleInfo *rvi = RoadVehInfo(this->engine_type); + if (rvi->running_cost_class == INVALID_PRICE) return 0; + + uint cost_factor = GetVehicleProperty(this, PROP_ROADVEH_RUNNING_COST_FACTOR, rvi->running_cost); + if (cost_factor == 0) return 0; + + return cost_factor * GetPriceByIndex(rvi->running_cost_class); +} + bool RoadVehicle::Tick() { if (this->IsRoadVehFront()) { diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 0be119ef97..73d69eb823 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -4438,7 +4438,7 @@ Money Train::GetRunningCost() const const RailVehicleInfo *rvi = RailVehInfo(v->engine_type); if (rvi->running_cost_class == INVALID_PRICE) continue; - byte cost_factor = GetVehicleProperty(v, PROP_TRAIN_RUNNING_COST_FACTOR, rvi->running_cost); + uint cost_factor = GetVehicleProperty(v, PROP_TRAIN_RUNNING_COST_FACTOR, rvi->running_cost); if (cost_factor == 0) continue; /* Halve running cost for multiheaded parts */