diff src/roadveh_cmd.cpp @ 8556:8aae08d562cc draft

(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
author smatz <smatz@openttd.org>
date Wed, 13 Feb 2008 19:24:40 +0000 (2008-02-13)
parents 9bf902b801c6
children 992fa65afba1
line wrap: on
line diff
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -219,6 +219,8 @@
 		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 @@
 {
 	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 @@
 
 void RoadVehicle::OnNewDay()
 {
-	CommandCost cost(EXPENSES_ROADVEH_RUN);
-
 	if (!IsRoadVehFront(this)) return;
 
 	if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this);
@@ -2027,10 +2030,8 @@
 		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 @@
 		}
 	}
 
-	cost = CommandCost(EXPENSES_ROADVEH_RUN, RoadVehInfo(this->engine_type)->running_cost * _price.roadveh_running / 364);
+	if (this->running_ticks == 0) return;
 
-	this->profit_this_year -= cost.GetCost() >> 8;
+	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();
+	this->running_ticks = 0;
 
 	SubtractMoneyFromPlayerFract(this->owner, cost);