diff options
author | tron <tron@openttd.org> | 2004-11-29 11:59:09 +0000 |
---|---|---|
committer | tron <tron@openttd.org> | 2004-11-29 11:59:09 +0000 |
commit | d701668f50de51f7cac62fda6911135a7332b515 (patch) | |
tree | ad22a5d2270d27b4910086a64b63bd6a4c5a2d88 /economy.c | |
parent | 5733ad3e3243883b68f7c223bbc5685057e70f16 (diff) | |
download | openttd-d701668f50de51f7cac62fda6911135a7332b515.tar.xz |
(svn r853) -Feature: Implement improved vehicle loading algorithm
It's not FIFO loading, but does the right thing in the common case:
If a vehicle is empty and another vehicle is already loading the same cargo at this station then the vehicle waits.
This is an reworked version of [ 1072211 ] submitted by Hackykid, thanks!
Diffstat (limited to 'economy.c')
-rw-r--r-- | economy.c | 57 |
1 files changed, 57 insertions, 0 deletions
@@ -1200,6 +1200,59 @@ static int32 DeliverGoods(int num_pieces, byte cargo_type, byte source, byte des return profit; } +/* + * Returns true if Vehicle v should wait loading because other vehicle is + * already loading the same cargo type + * v = vehicle to load, u = GetFirstInChain(v) + */ +static bool LoadWait(const Vehicle *v, const Vehicle *u) { + const Vehicle *w; + const Vehicle *x; + bool has_any_cargo = false; + + if (!(u->next_order & OF_FULL_LOAD)) return false; + + for (w = u; w != NULL; w = w->next) { + if (w->cargo_count != 0) { + if (v->cargo_type == w->cargo_type && + u->last_station_visited == w->cargo_source) + return false; + has_any_cargo = true; + } + } + + FOR_ALL_VEHICLES(x) { + if ((x->type != VEH_Train || x->subtype == 0) && // for all locs + u->last_station_visited == x->last_station_visited && // at the same station + !(x->vehstatus & VS_STOPPED) && // not stopped + (x->next_order & OT_MASK) == OT_LOADING && // loading + u != x) { // not itself + bool other_has_any_cargo = false; + bool has_space_for_same_type = false; + bool other_has_same_type = false; + + for (w = x; w != NULL; w = w->next) { + if (w->cargo_count < w->cargo_cap && v->cargo_type == w->cargo_type) + has_space_for_same_type = true; + + if (w->cargo_count != 0) { + if (v->cargo_type == w->cargo_type && + u->last_station_visited == w->cargo_source) + other_has_same_type = true; + other_has_any_cargo = true; + } + } + + if (has_space_for_same_type) { + if (other_has_same_type) return true; + if (other_has_any_cargo && !has_any_cargo) return true; + } + } + } + + return false; +} + int LoadUnloadVehicle(Vehicle *v) { int profit = 0; @@ -1279,6 +1332,10 @@ int LoadUnloadVehicle(Vehicle *v) if (v->cargo_count == 0) TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO); + /* Skip loading this vehicle if another train/vehicle is already handling + * the same cargo type at this station */ + if (_patches.improved_load && LoadWait(v,u)) continue; + /* TODO: Regarding this, when we do gradual loading, we * should first unload all vehicles and then start * loading them. Since this will cause |