summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2005-11-03 09:22:24 +0000
committerpeter1138 <peter1138@openttd.org>2005-11-03 09:22:24 +0000
commite80d448478746ba30f1f78ad809e14703c7b899a (patch)
tree123239ecee67253d8657a7f2bff6334fce75a4d9
parent689006ee738c8866d05161cb8bbdd6d9a6472252 (diff)
downloadopenttd-e80d448478746ba30f1f78ad809e14703c7b899a.tar.xz
(svn r3124) Alter train loading/unloading time to use the actual length of the train instead of the number of wagons. The actual length is cached in the first vehicle of the train.
-rw-r--r--economy.c11
-rw-r--r--train_cmd.c2
-rw-r--r--vehicle.h2
3 files changed, 9 insertions, 6 deletions
diff --git a/economy.c b/economy.c
index 16111d826..00490a166 100644
--- a/economy.c
+++ b/economy.c
@@ -1463,13 +1463,12 @@ int LoadUnloadVehicle(Vehicle *v)
ShowFeederIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, v_profit_total);
if (v->type == VEH_Train) {
- int num = - (int)GetStationPlatforms(st, v->tile) * 2;
- do num++; while ( (v=v->next) != NULL);
- if (num > 0) {
- unloading_time <<=1;
- unloading_time += num * unloading_time;
+ // Each platform tile is worth 2 rail vehicles.
+ int overhang = v->u.rail.cached_total_length - GetStationPlatforms(st, v->tile) * 16;
+ if (overhang > 0) {
+ unloading_time <<= 1;
+ unloading_time += (overhang * unloading_time) / 8;
}
- v = u;
}
v->load_unload_time_rem = unloading_time;
diff --git a/train_cmd.c b/train_cmd.c
index a93093a30..d6d9b08b2 100644
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -83,6 +83,7 @@ void TrainConsistChanged(Vehicle *v) {
rvi_v = RailVehInfo(v->engine_type);
first_engine = (v->subtype == TS_Front_Engine) ? v->engine_type : INVALID_VEHICLE;
+ v->u.rail.cached_total_length = 0;
for (u = v; u != NULL; u = u->next) {
const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type);
@@ -125,6 +126,7 @@ void TrainConsistChanged(Vehicle *v) {
veh_len = rvi_u->shorten_factor;
veh_len = clamp(veh_len, 0, u->next == NULL ? 7 : 5); // the clamp on vehicles not the last in chain is stricter, as too short wagons can break the 'follow next vehicle' code
u->u.rail.cached_veh_length = 8 - veh_len;
+ v->u.rail.cached_total_length += u->u.rail.cached_veh_length;
};
diff --git a/vehicle.h b/vehicle.h
index 78156caa0..e45cebe15 100644
--- a/vehicle.h
+++ b/vehicle.h
@@ -57,6 +57,8 @@ typedef struct VehicleRail {
uint16 cached_max_speed; // max speed of the consist. (minimum of the max speed of all vehicles in the consist)
uint32 cached_power; // total power of the consist.
uint8 cached_veh_length; // length of this vehicle in units of 1/8 of normal length, cached because this can be set by a callback
+ uint16 cached_total_length; ///< Length of the whole train, valid only for first engine.
+
// cached values, recalculated when the cargo on a train changes (in addition to the conditions above)
uint16 cached_weight; // total weight of the consist.
uint16 cached_veh_weight; // weight of the vehicle.