Merge branch 'improved_breakdowns-sx' into jgrpp

Conflicts:
	src/saveload/extended_ver_sl.cpp
	src/saveload/vehicle_sl.cpp
	src/settings_type.h
This commit is contained in:
Jonathan G Rennison
2016-01-18 23:09:17 +00:00
6 changed files with 22 additions and 18 deletions

View File

@@ -55,7 +55,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
{ XSLFI_TIMETABLES_START_TICKS, XSCF_NULL, WALLCLOCK_NETWORK_COMPATIBLE ? 0 : 1, 1, "timetable_start_ticks", NULL, NULL, NULL }, { XSLFI_TIMETABLES_START_TICKS, XSCF_NULL, WALLCLOCK_NETWORK_COMPATIBLE ? 0 : 1, 1, "timetable_start_ticks", NULL, NULL, NULL },
{ XSLFI_TOWN_CARGO_ADJ, XSCF_IGNORABLE_UNKNOWN, 1, 1, "town_cargo_adj", NULL, NULL, NULL }, { XSLFI_TOWN_CARGO_ADJ, XSCF_IGNORABLE_UNKNOWN, 1, 1, "town_cargo_adj", NULL, NULL, NULL },
{ XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 1, 1, "signal_tunnel_bridge", NULL, NULL, NULL }, { XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 1, 1, "signal_tunnel_bridge", NULL, NULL, NULL },
{ XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 1, 1, "improved_breakdowns", NULL, NULL, NULL }, { XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 2, 2, "improved_breakdowns", NULL, NULL, NULL },
{ XSLFI_TT_WAIT_IN_DEPOT, XSCF_NULL, 1, 1, "tt_wait_in_depot", NULL, NULL, NULL }, { XSLFI_TT_WAIT_IN_DEPOT, XSCF_NULL, 1, 1, "tt_wait_in_depot", NULL, NULL, NULL },
{ XSLFI_AUTO_TIMETABLE, XSCF_NULL, 3, 3, "auto_timetables", NULL, NULL, NULL }, { XSLFI_AUTO_TIMETABLE, XSCF_NULL, 3, 3, "auto_timetables", NULL, NULL, NULL },
{ XSLFI_VEHICLE_REPAIR_COST, XSCF_NULL, 1, 1, "vehicle_repair_cost", NULL, NULL, NULL }, { XSLFI_VEHICLE_REPAIR_COST, XSCF_NULL, 1, 1, "vehicle_repair_cost", NULL, NULL, NULL },

View File

@@ -761,6 +761,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt)
SLE_CONDVAR(Train, gv_flags, SLE_UINT16, 139, SL_MAX_VERSION), SLE_CONDVAR(Train, gv_flags, SLE_UINT16, 139, SL_MAX_VERSION),
SLE_CONDNULL(11, 2, 143), // old reserved space SLE_CONDNULL(11, 2, 143), // old reserved space
SLE_CONDVAR_X(Train, reverse_distance, SLE_UINT16, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_REVERSE_AT_WAYPOINT)), SLE_CONDVAR_X(Train, reverse_distance, SLE_UINT16, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_REVERSE_AT_WAYPOINT)),
SLE_CONDVAR_X(Train, critical_breakdown_count, SLE_UINT8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_IMPROVED_BREAKDOWNS, 2)),
SLE_END() SLE_END()
}; };

View File

@@ -509,7 +509,7 @@ struct VehicleSettings {
byte road_side; ///< the side of the road vehicles drive on byte road_side; ///< the side of the road vehicles drive on
uint8 plane_crashes; ///< number of plane crashes, 0 = none, 1 = reduced, 2 = normal uint8 plane_crashes; ///< number of plane crashes, 0 = none, 1 = reduced, 2 = normal
bool adjacent_crossings; ///< enable closing of adjacent level crossings bool adjacent_crossings; ///< enable closing of adjacent level crossings
bool improved_breakdowns; ///< different types, chances and serverities of breakdowns bool improved_breakdowns; ///< different types, chances and severities of breakdowns
bool pay_for_repair; ///< pay for repairing vehicle bool pay_for_repair; ///< pay for repairing vehicle
uint8 repair_cost; ///< cost of repairing vehicle uint8 repair_cost; ///< cost of repairing vehicle
}; };

View File

@@ -108,6 +108,7 @@ struct Train FINAL : public GroundVehicle<Train, VEH_TRAIN> {
TrackBitsByte track; TrackBitsByte track;
TrainForceProceedingByte force_proceed; TrainForceProceedingByte force_proceed;
RailTypeByte railtype; RailTypeByte railtype;
byte critical_breakdown_count; ///< Counter for the number of critical breakdowns since last service
RailTypes compatible_railtypes; RailTypes compatible_railtypes;
/** Ticks waiting in front of a signal, ticks being stuck or a counter for forced proceeding through signals. */ /** Ticks waiting in front of a signal, ticks being stuck or a counter for forced proceeding through signals. */

View File

@@ -192,6 +192,12 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
u->tcache.user_def_data = GetVehicleProperty(u, PROP_TRAIN_USER_DATA, u->tcache.user_def_data); u->tcache.user_def_data = GetVehicleProperty(u, PROP_TRAIN_USER_DATA, u->tcache.user_def_data);
this->InvalidateNewGRFCache(); this->InvalidateNewGRFCache();
u->InvalidateNewGRFCache(); u->InvalidateNewGRFCache();
if (!u->IsArticulatedPart()) {
if (u->IsEngine() || u->IsMultiheaded()) {
this->tcache.cached_num_engines++;
}
}
} }
for (Train *u = this; u != NULL; u = u->Next()) { for (Train *u = this; u != NULL; u = u->Next()) {
@@ -234,12 +240,12 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
/* max speed is the minimum of the speed limits of all vehicles in the consist */ /* max speed is the minimum of the speed limits of all vehicles in the consist */
if ((rvi_u->railveh_type != RAILVEH_WAGON || _settings_game.vehicle.wagon_speed_limits) && !UsesWagonOverride(u)) { if ((rvi_u->railveh_type != RAILVEH_WAGON || _settings_game.vehicle.wagon_speed_limits) && !UsesWagonOverride(u)) {
uint16 speed = GetVehicleProperty(u, PROP_TRAIN_SPEED, rvi_u->max_speed); uint16 speed = GetVehicleProperty(u, PROP_TRAIN_SPEED, rvi_u->max_speed);
if (HasBit(u->flags, VRF_NEED_REPAIR)) speed = u->vcache.cached_max_speed; if (HasBit(u->flags, VRF_NEED_REPAIR) && this->IsFrontEngine()) {
if (speed != 0) max_speed = min(speed, max_speed); for (uint i = 0; i < u->critical_breakdown_count; i++) {
speed = min(speed - (speed / (this->tcache.cached_num_engines + 2)) + 1, speed);
} }
}
if (u->IsEngine() || u-> IsMultiheaded()) { if (speed != 0) max_speed = min(speed, max_speed);
this->tcache.cached_num_engines++;
} }
} }

View File

@@ -106,6 +106,7 @@ void VehicleServiceInDepot(Vehicle *v)
if (v->Next() != NULL) VehicleServiceInDepot(v->Next()); if (v->Next() != NULL) VehicleServiceInDepot(v->Next());
if (!(Train::From(v)->IsEngine()) && !(Train::From(v)->IsRearDualheaded())) return; if (!(Train::From(v)->IsEngine()) && !(Train::From(v)->IsRearDualheaded())) return;
ClrBit(Train::From(v)->flags,VRF_NEED_REPAIR); ClrBit(Train::From(v)->flags,VRF_NEED_REPAIR);
Train::From(v)->critical_breakdown_count = 0;
const RailVehicleInfo *rvi = &e->u.rail; const RailVehicleInfo *rvi = &e->u.rail;
v->vcache.cached_max_speed = rvi->max_speed; v->vcache.cached_max_speed = rvi->max_speed;
if (Train::From(v)->IsFrontEngine()) { if (Train::From(v)->IsFrontEngine()) {
@@ -1469,17 +1470,12 @@ bool Vehicle::HandleBreakdown()
} }
/* Max Speed reduction*/ /* Max Speed reduction*/
if (_settings_game.vehicle.improved_breakdowns) { if (_settings_game.vehicle.improved_breakdowns) {
const Engine *e = Engine::Get(this->engine_type);
const RailVehicleInfo *rvi = &e->u.rail;
if (!HasBit(Train::From(this)->flags, VRF_NEED_REPAIR)) { if (!HasBit(Train::From(this)->flags, VRF_NEED_REPAIR)) {
if (rvi->max_speed > this->vcache.cached_max_speed) {
this->vcache.cached_max_speed = rvi->max_speed;
}
}
uint16 target_max_speed = min(this->vcache.cached_max_speed -
(this->vcache.cached_max_speed >> 1) / Train::From(this->First())->tcache.cached_num_engines + 1, this->vcache.cached_max_speed);
this->vcache.cached_max_speed = max(target_max_speed, min<uint16>(rvi->max_speed / 4, 28));
SetBit(Train::From(this)->flags, VRF_NEED_REPAIR); SetBit(Train::From(this)->flags, VRF_NEED_REPAIR);
Train::From(this)->critical_breakdown_count = 1;
} else if (Train::From(this)->critical_breakdown_count != 255) {
Train::From(this)->critical_breakdown_count++;
}
Train::From(this->First())->ConsistChanged(CCF_TRACK); Train::From(this->First())->ConsistChanged(CCF_TRACK);
} }
/* FALL THROUGH */ /* FALL THROUGH */