summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2008-02-13 19:24:40 +0000
committersmatz <smatz@openttd.org>2008-02-13 19:24:40 +0000
commitfe48d0be219f2035b146c6444c92c305d9c3bedf (patch)
treeaf07b8c3ed3437ba91111379ab438956940c60bb
parent833a00def99ecf91bce955e35b82b33e4b7d5517 (diff)
downloadopenttd-fe48d0be219f2035b146c6444c92c305d9c3bedf.tar.xz
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
-Fix [FS#1739]: vehicle profit is now counted with 8bit fract, so it is now shown properly in the vehicle details window
-rw-r--r--src/ai/default/default.cpp4
-rw-r--r--src/ai/trolly/trolly.cpp2
-rw-r--r--src/aircraft_cmd.cpp11
-rw-r--r--src/economy.cpp10
-rw-r--r--src/group_gui.cpp4
-rw-r--r--src/newgrf_engine.cpp16
-rw-r--r--src/openttd.cpp10
-rw-r--r--src/roadveh_cmd.cpp20
-rw-r--r--src/saveload.cpp2
-rw-r--r--src/ship_cmd.cpp14
-rw-r--r--src/train_cmd.cpp9
-rw-r--r--src/vehicle.cpp1
-rw-r--r--src/vehicle_base.h9
-rw-r--r--src/vehicle_gui.cpp12
14 files changed, 75 insertions, 49 deletions
diff --git a/src/ai/default/default.cpp b/src/ai/default/default.cpp
index 7bddaa2cb..95fab9619 100644
--- a/src/ai/default/default.cpp
+++ b/src/ai/default/default.cpp
@@ -112,8 +112,8 @@ static void AiStateVehLoop(Player *p)
/* not profitable? */
if (v->age >= 730 &&
- v->profit_last_year < _price.station_value * 5 &&
- v->profit_this_year < _price.station_value * 5) {
+ v->profit_last_year >> 8 < _price.station_value * 5 &&
+ v->profit_this_year >> 8 < _price.station_value * 5) {
_players_ai[p->index].state_counter = 0;
_players_ai[p->index].state = AIS_SELL_VEHICLE;
_players_ai[p->index].cur_veh = v;
diff --git a/src/ai/trolly/trolly.cpp b/src/ai/trolly/trolly.cpp
index 01792f527..8f62b7e95 100644
--- a/src/ai/trolly/trolly.cpp
+++ b/src/ai/trolly/trolly.cpp
@@ -1252,7 +1252,7 @@ static void AiNew_CheckVehicle(Player *p, Vehicle *v)
if (v->age > 360) {
// If both years together are not more than AI_MINIMUM_ROUTE_PROFIT,
// it is not worth the line I guess...
- if (v->profit_last_year + v->profit_this_year < AI_MINIMUM_ROUTE_PROFIT ||
+ if ((v->profit_last_year + v->profit_this_year) >> 8 < AI_MINIMUM_ROUTE_PROFIT ||
(v->reliability * 100 >> 16) < 40) {
// There is a possibility that the route is fucked up...
if (v->cargo.DaysInTransit() > AI_VEHICLE_LOST_DAYS) {
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index cdad840ab..494b041f2 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -321,6 +321,8 @@ CommandCost CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
u->z_pos = GetSlopeZ(x, y);
v->z_pos = u->z_pos + 1;
+ v->running_ticks = 0;
+
// u->delta_x = u->delta_y = 0;
v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
@@ -735,11 +737,12 @@ void Aircraft::OnNewDay()
AgeVehicle(this);
CheckIfAircraftNeedsService(this);
- if (this->vehstatus & VS_STOPPED) return;
+ if (this->running_ticks == 0) return;
- CommandCost cost = CommandCost(EXPENSES_AIRCRAFT_RUN, GetVehicleProperty(this, 0x0E, AircraftVehInfo(this->engine_type)->running_cost) * _price.aircraft_running / 364);
+ CommandCost cost(EXPENSES_AIRCRAFT_RUN, GetVehicleProperty(this, 0x0E, AircraftVehInfo(this->engine_type)->running_cost) * _price.aircraft_running * this->running_ticks / (364 * DAY_TICKS));
- this->profit_this_year -= cost.GetCost() >> 8;
+ this->profit_this_year -= cost.GetCost();
+ this->running_ticks = 0;
SubtractMoneyFromPlayerFract(this->owner, cost);
@@ -2146,6 +2149,8 @@ void Aircraft::Tick()
{
if (!IsNormalAircraft(this)) return;
+ if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++;
+
if (this->subtype == AIR_HELICOPTER) HelicopterTickHandler(this);
AgeAircraftCargo(this);
diff --git a/src/economy.cpp b/src/economy.cpp
index 995b63afe..dc055dd5e 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -163,11 +163,9 @@ int UpdateCompanyRatingAndValue(Player *p, bool update)
num++;
if (v->age > 730) {
/* Find the vehicle with the lowest amount of profit */
- if (min_profit_first == true) {
- min_profit = v->profit_last_year;
+ if (min_profit_first || min_profit > v->profit_last_year >> 8) {
+ min_profit = v->profit_last_year >> 8;
min_profit_first = false;
- } else if (min_profit > v->profit_last_year) {
- min_profit = v->profit_last_year;
}
}
}
@@ -1505,7 +1503,7 @@ void VehiclePayment(Vehicle *front_v)
cp->days_in_transit,
v->cargo_type);
- front_v->profit_this_year += profit;
+ front_v->profit_this_year += profit << 8;
virtual_profit += profit; // accumulate transfer profits for whole vehicle
cp->feeder_share += profit; // account for the (virtual) profit already made for the cargo packet
cp->paid_for = true; // record that the cargo has been paid for to eliminate double counting
@@ -1523,7 +1521,7 @@ void VehiclePayment(Vehicle *front_v)
}
if (route_profit != 0) {
- front_v->profit_this_year += vehicle_profit;
+ front_v->profit_this_year += vehicle_profit << 8;
SubtractMoneyFromPlayer(CommandCost(front_v->GetExpenseType(true), -route_profit));
if (IsLocalPlayer() && !PlayVehicleSound(front_v, VSE_LOAD_UNLOAD)) {
diff --git a/src/group_gui.cpp b/src/group_gui.cpp
index 28dca4663..34169479a 100644
--- a/src/group_gui.cpp
+++ b/src/group_gui.cpp
@@ -483,8 +483,8 @@ static void GroupWndProc(Window *w, WindowEvent *e)
if (w->resize.step_height == PLY_WND_PRC__SIZE_OF_ROW_BIG2) DrawSmallOrderList(v, x + 138, y2);
- SetDParam(0, v->profit_this_year);
- SetDParam(1, v->profit_last_year);
+ SetDParam(0, v->profit_this_year >> 8);
+ SetDParam(1, v->profit_last_year >> 8);
DrawString(x + 19, y2 + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, TC_FROMSTRING);
if (IsValidGroupID(v->group_id)) {
diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp
index e7343eef5..316e07b31 100644
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -694,14 +694,14 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
case 0x4F: return GB(v->reliability, 8, 8);
case 0x50: return v->reliability_spd_dec;
case 0x51: return GB(v->reliability_spd_dec, 8, 8);
- case 0x52: return ClampToI32(v->profit_this_year);
- case 0x53: return GB(ClampToI32(v->profit_this_year), 8, 24);
- case 0x54: return GB(ClampToI32(v->profit_this_year), 16, 16);
- case 0x55: return GB(ClampToI32(v->profit_this_year), 24, 8);
- case 0x56: return ClampToI32(v->profit_last_year);
- case 0x57: return GB(ClampToI32(v->profit_last_year), 8, 24);
- case 0x58: return GB(ClampToI32(v->profit_last_year), 16, 16);
- case 0x59: return GB(ClampToI32(v->profit_last_year), 24, 8);
+ case 0x52: return ClampToI32(v->profit_this_year >> 8);
+ case 0x53: return GB(ClampToI32(v->profit_this_year >> 8), 8, 24);
+ case 0x54: return GB(ClampToI32(v->profit_this_year >> 8), 16, 16);
+ case 0x55: return GB(ClampToI32(v->profit_this_year >> 8), 24, 8);
+ case 0x56: return ClampToI32(v->profit_last_year >> 8);
+ case 0x57: return GB(ClampToI32(v->profit_last_year >> 8), 8, 24);
+ case 0x58: return GB(ClampToI32(v->profit_last_year >> 8), 16, 16);
+ case 0x59: return GB(ClampToI32(v->profit_last_year >> 8), 24, 8);
case 0x5A: return v->Next() == NULL ? INVALID_VEHICLE : v->Next()->index;
case 0x5C: return ClampToI32(v->value);
case 0x5D: return GB(ClampToI32(v->value), 8, 24);
diff --git a/src/openttd.cpp b/src/openttd.cpp
index e4accf911..f1f55e310 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -2419,6 +2419,16 @@ bool AfterLoadGame()
}
}
+ if (CheckSavegameVersion(88)) {
+ /* Profits are now with 8 bit fract */
+ Vehicle *v;
+ FOR_ALL_VEHICLES(v) {
+ v->profit_this_year <<= 8;
+ v->profit_last_year <<= 8;
+ v->running_ticks = 0;
+ }
+ }
+
return InitializeWindowsAndCaches();
}
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index f340a4b2b..85ddce643 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -219,6 +219,8 @@ CommandCost CmdBuildRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
v->y_pos = y;
v->z_pos = GetSlopeZ(x, y);
+ v->running_ticks = 0;
+
v->u.road.state = RVSB_IN_DEPOT;
v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
@@ -1966,7 +1968,10 @@ void RoadVehicle::Tick()
{
AgeRoadVehCargo(this);
- if (IsRoadVehFront(this)) RoadVehController(this);
+ if (IsRoadVehFront(this)) {
+ if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++;
+ RoadVehController(this);
+ }
}
static void CheckIfRoadVehNeedsService(Vehicle *v)
@@ -2008,8 +2013,6 @@ static void CheckIfRoadVehNeedsService(Vehicle *v)
void RoadVehicle::OnNewDay()
{
- CommandCost cost(EXPENSES_ROADVEH_RUN);
-
if (!IsRoadVehFront(this)) return;
if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this);
@@ -2027,10 +2030,8 @@ void RoadVehicle::OnNewDay()
ClearSlot(this);
}
- if (this->vehstatus & VS_STOPPED) return;
-
/* update destination */
- if (this->current_order.type == OT_GOTO_STATION && this->u.road.slot == NULL && !(this->vehstatus & VS_CRASHED)) {
+ if (!(this->vehstatus & VS_STOPPED) && this->current_order.type == OT_GOTO_STATION && this->u.road.slot == NULL && !(this->vehstatus & VS_CRASHED)) {
Station *st = GetStation(this->current_order.dest);
RoadStop *rs = st->GetPrimaryRoadStop(this);
RoadStop *best = NULL;
@@ -2088,9 +2089,12 @@ void RoadVehicle::OnNewDay()
}
}
- cost = CommandCost(EXPENSES_ROADVEH_RUN, RoadVehInfo(this->engine_type)->running_cost * _price.roadveh_running / 364);
+ if (this->running_ticks == 0) return;
+
+ CommandCost cost(EXPENSES_ROADVEH_RUN, RoadVehInfo(this->engine_type)->running_cost * _price.roadveh_running * this->running_ticks / (364 * DAY_TICKS));
- this->profit_this_year -= cost.GetCost() >> 8;
+ this->profit_this_year -= cost.GetCost();
+ this->running_ticks = 0;
SubtractMoneyFromPlayerFract(this->owner, cost);
diff --git a/src/saveload.cpp b/src/saveload.cpp
index 2b71c4dd2..57e7c1a4b 100644
--- a/src/saveload.cpp
+++ b/src/saveload.cpp
@@ -34,7 +34,7 @@
#include "table/strings.h"
-extern const uint16 SAVEGAME_VERSION = 87;
+extern const uint16 SAVEGAME_VERSION = 88;
uint16 _sl_version; ///< the major savegame version identifier
byte _sl_minor_version; ///< the minor savegame version, DO NOT USE!
diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp
index 5c8fda196..b0e806a91 100644
--- a/src/ship_cmd.cpp
+++ b/src/ship_cmd.cpp
@@ -170,8 +170,6 @@ static void CheckIfShipNeedsService(Vehicle *v)
void Ship::OnNewDay()
{
- CommandCost cost(EXPENSES_SHIP_RUN);
-
if ((++this->day_counter & 7) == 0)
DecreaseVehicleValue(this);
@@ -181,10 +179,12 @@ void Ship::OnNewDay()
CheckOrders(this);
- if (this->vehstatus & VS_STOPPED) return;
+ if (this->running_ticks == 0) return;
+
+ CommandCost cost(EXPENSES_SHIP_RUN, GetVehicleProperty(this, 0x0F, ShipVehInfo(this->engine_type)->running_cost) * _price.ship_running * this->running_ticks / (364 * DAY_TICKS));
- cost.AddCost(GetVehicleProperty(this, 0x0F, ShipVehInfo(this->engine_type)->running_cost) * _price.ship_running / 364);
- this->profit_this_year -= cost.GetCost() >> 8;
+ this->profit_this_year -= cost.GetCost();
+ this->running_ticks = 0;
SubtractMoneyFromPlayerFract(this->owner, cost);
@@ -781,6 +781,8 @@ static void AgeShipCargo(Vehicle *v)
void Ship::Tick()
{
+ if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++;
+
AgeShipCargo(this);
ShipController(this);
}
@@ -843,6 +845,8 @@ CommandCost CmdBuildShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
v->y_pos = y;
v->z_pos = GetSlopeZ(x, y);
+ v->running_ticks = 0;
+
v->UpdateDeltaXY(v->direction);
v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 1cfb2feb9..b890a7a8d 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -735,6 +735,7 @@ CommandCost CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32
v->x_pos = x;
v->y_pos = y;
v->z_pos = GetSlopeZ(x, y);
+ v->running_ticks = 0;
v->u.rail.track = TRACK_BIT_DEPOT;
v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
v->spritenum = rvi->image_index;
@@ -3595,6 +3596,7 @@ void Train::Tick()
this->tick_counter++;
if (IsFrontEngine(this)) {
+ if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++;
this->current_order_time++;
TrainLocoHandler(this, false);
@@ -3665,11 +3667,12 @@ void Train::OnNewDay()
if (tile != 0) this->dest_tile = tile;
}
- if ((this->vehstatus & VS_STOPPED) == 0) {
+ if (this->running_ticks != 0) {
/* running costs */
- CommandCost cost(EXPENSES_TRAIN_RUN, this->GetRunningCost() / 364);
+ CommandCost cost(EXPENSES_TRAIN_RUN, this->GetRunningCost() * this->running_ticks / (364 * DAY_TICKS));
- this->profit_this_year -= cost.GetCost() >> 8;
+ this->profit_this_year -= cost.GetCost();
+ this->running_ticks = 0;
SubtractMoneyFromPlayerFract(this->owner, cost);
diff --git a/src/vehicle.cpp b/src/vehicle.cpp
index 31141b42c..1e3726b1c 100644
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -2797,6 +2797,7 @@ static const SaveLoad _common_veh_desc[] = {
SLE_VAR(Vehicle, day_counter, SLE_UINT8),
SLE_VAR(Vehicle, tick_counter, SLE_UINT8),
+ SLE_CONDVAR(Vehicle, running_ticks, SLE_UINT8, 88, SL_MAX_VERSION),
SLE_VAR(Vehicle, cur_order_index, SLE_UINT8),
SLE_VAR(Vehicle, num_orders, SLE_UINT8),
diff --git a/src/vehicle_base.h b/src/vehicle_base.h
index a19b80dfb..8d9c015d4 100644
--- a/src/vehicle_base.h
+++ b/src/vehicle_base.h
@@ -249,8 +249,9 @@ public:
CargoList cargo; ///< The cargo this vehicle is carrying
- byte day_counter; // increased by one for each day
- byte tick_counter; // increased by one for each tick
+ byte day_counter; ///< Increased by one for each day
+ byte tick_counter; ///< Increased by one for each tick
+ byte running_ticks; ///< Number of ticks this vehicle was not stopped this day
/* Begin Order-stuff */
Order current_order; ///< The current order (+ status, like: loading)
@@ -291,8 +292,8 @@ public:
uint16 load_unload_time_rem;
byte vehicle_flags; // Used for gradual loading and other miscellaneous things (@see VehicleFlags enum)
- Money profit_this_year;
- Money profit_last_year;
+ Money profit_this_year; ///< Profit this year << 8, low 8 bits are fract
+ Money profit_last_year; ///< Profit last year << 8, low 8 bits are fract
Money value;
GroupID group_id; ///< Index of group Pool array
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp
index 3a5d1f4ec..38a864a22 100644
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -173,7 +173,7 @@ void DrawVehicleProfitButton(const Vehicle *v, int x, int y)
pal = PALETTE_TO_GREY;
} else if (v->profit_last_year < 0) {
pal = PALETTE_TO_RED;
- } else if (v->profit_last_year < 10000) {
+ } else if (v->profit_last_year >> 8 < 10000) {
pal = PALETTE_TO_YELLOW;
} else {
pal = PALETTE_TO_GREEN;
@@ -598,7 +598,7 @@ static int CDECL VehicleProfitLastYearSorter(const void *a, const void *b)
{
const Vehicle* va = *(const Vehicle**)a;
const Vehicle* vb = *(const Vehicle**)b;
- int r = ClampToI32(va->profit_last_year - vb->profit_last_year);
+ int r = ClampToI32((va->profit_last_year - vb->profit_last_year) >> 8);
VEHICLEUNITNUMBERSORTER(r, va, vb);
@@ -983,8 +983,8 @@ static void DrawVehicleListWindow(Window *w)
const Vehicle *v = vl->sort_list[i];
StringID str;
- SetDParam(0, v->profit_this_year);
- SetDParam(1, v->profit_last_year);
+ SetDParam(0, v->profit_this_year >> 8);
+ SetDParam(1, v->profit_last_year >> 8);
DrawVehicleImage(v, x + 19, y + 6, INVALID_VEHICLE, w->widget[VLW_WIDGET_LIST].right - w->widget[VLW_WIDGET_LIST].left - 20, 0);
DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, TC_FROMSTRING);
@@ -1500,8 +1500,8 @@ static void DrawVehicleDetailsWindow(Window *w)
}
/* Draw profit */
- SetDParam(0, v->profit_this_year);
- SetDParam(1, v->profit_last_year);
+ SetDParam(0, v->profit_this_year >> 8);
+ SetDParam(1, v->profit_last_year >> 8);
DrawString(2, 35, _vehicle_translation_table[VST_VEHICLE_PROFIT_THIS_YEAR_LAST_YEAR][v->type], TC_FROMSTRING);
/* Draw breakdown & reliability */