From a0ddc43e92c33436bccc0d16ae935237e02a357e Mon Sep 17 00:00:00 2001 From: smatz Date: Wed, 13 Feb 2008 19:24:40 +0000 Subject: [PATCH] (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 --- src/ai/default/default.cpp | 4 ++-- src/ai/trolly/trolly.cpp | 2 +- src/aircraft_cmd.cpp | 11 ++++++++--- src/economy.cpp | 10 ++++------ src/group_gui.cpp | 4 ++-- src/newgrf_engine.cpp | 16 ++++++++-------- src/openttd.cpp | 10 ++++++++++ src/roadveh_cmd.cpp | 20 ++++++++++++-------- src/saveload.cpp | 2 +- src/ship_cmd.cpp | 14 +++++++++----- src/train_cmd.cpp | 9 ++++++--- src/vehicle.cpp | 1 + src/vehicle_base.h | 9 +++++---- src/vehicle_gui.cpp | 12 ++++++------ 14 files changed, 75 insertions(+), 49 deletions(-) diff --git a/src/ai/default/default.cpp b/src/ai/default/default.cpp index 7bddaa2cb1..95fab96196 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 01792f5278..8f62b7e954 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 cdad840ab3..494b041f29 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 995b63afec..dc055dd5e6 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 28dca46633..34169479aa 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 e7343eef53..316e07b317 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 e4accf9115..f1f55e310a 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 f340a4b2b4..85ddce643e 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; - 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); diff --git a/src/saveload.cpp b/src/saveload.cpp index 2b71c4dd2d..57e7c1a4bd 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 5c8fda196f..b0e806a91c 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; - cost.AddCost(GetVehicleProperty(this, 0x0F, ShipVehInfo(this->engine_type)->running_cost) * _price.ship_running / 364); - this->profit_this_year -= cost.GetCost() >> 8; + CommandCost cost(EXPENSES_SHIP_RUN, GetVehicleProperty(this, 0x0F, ShipVehInfo(this->engine_type)->running_cost) * _price.ship_running * this->running_ticks / (364 * DAY_TICKS)); + + 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 1cfb2feb9a..b890a7a8d2 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 31141b42c8..1e3726b1c4 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 a19b80dfb3..8d9c015d4f 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 3a5d1f4ecb..38a864a22b 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 */