summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--station_cmd.c118
1 files changed, 63 insertions, 55 deletions
diff --git a/station_cmd.c b/station_cmd.c
index ba61b8f4e..3e341d06e 100644
--- a/station_cmd.c
+++ b/station_cmd.c
@@ -2529,18 +2529,14 @@ uint MoveGoodsToStation(TileIndex tile, int w, int h, int type, uint amount)
{
Station *around_ptr[8];
StationID around[8];
- StationID st_index;
int i;
- Station *st;
uint moved;
uint best_rating, best_rating2;
Station *st1, *st2;
- int t;
- int rad=0;
- int w_prod=0, h_prod=0; //width and height of the "producer" of the cargo
- int x_min_prod, x_max_prod; //min and max coordinates of the producer
- int y_min_prod, y_max_prod; //relative
- int x_dist, y_dist;
+ uint t;
+ int rad = 0;
+ int w_prod; //width and height of the "producer" of the cargo
+ int h_prod;
int max_rad;
@@ -2553,65 +2549,76 @@ uint MoveGoodsToStation(TileIndex tile, int w, int h, int type, uint amount)
h += 16;
max_rad = 8;
} else {
- w += 8;
- h += 8;
+ w_prod = 0;
+ h_prod = 0;
+ w += 8;
+ h += 8;
max_rad = 4;
}
BEGIN_TILE_LOOP(cur_tile, w, h, tile - TileDiffXY(max_rad, max_rad))
+ StationID st_index;
+
cur_tile = TILE_MASK(cur_tile);
- if (IsTileType(cur_tile, MP_STATION)) {
- st_index = _m[cur_tile].m2;
- for (i = 0; i != 8; i++) {
- if (around[i] == INVALID_STATION) {
- st = GetStation(st_index);
- if (!IsBuoy(st) &&
- ( !st->town->exclusive_counter || (st->town->exclusivity == st->owner) ) && // check exclusive transport rights
- st->goods[type].rating != 0 &&
- (!_patches.selectgoods || st->goods[type].last_speed) && // if last_speed is 0, no vehicle has been there.
- ((st->facilities & (byte)~FACIL_BUS_STOP)!=0 || type==CT_PASSENGERS) && // if we have other fac. than a bus stop, or the cargo is passengers
- ((st->facilities & (byte)~FACIL_TRUCK_STOP)!=0 || type!=CT_PASSENGERS)) { // if we have other fac. than a cargo bay or the cargo is not passengers
- if (_patches.modified_catchment) {
- rad = FindCatchmentRadius(st);
- x_min_prod = y_min_prod = 9;
- x_max_prod = 8 + w_prod;
- y_max_prod = 8 + h_prod;
-
- x_dist = min(w_cur - x_min_prod, x_max_prod - w_cur);
-
- if (w_cur < x_min_prod) {
- x_dist = x_min_prod - w_cur;
- } else { //save cycles
- if (w_cur > x_max_prod) x_dist = w_cur - x_max_prod;
- }
-
- y_dist = min(h_cur - y_min_prod, y_max_prod - h_cur);
- if (h_cur < y_min_prod) {
- y_dist = y_min_prod - h_cur;
- } else {
- if (h_cur > y_max_prod) y_dist = h_cur - y_max_prod;
- }
-
- } else {
- x_dist = y_dist = 0;
+ if (!IsTileType(cur_tile, MP_STATION)) continue;
+
+ st_index = _m[cur_tile].m2;
+
+ for (i = 0; i != 8; i++) {
+ if (around[i] == INVALID_STATION) {
+ Station* st = GetStation(st_index);
+
+ if (!IsBuoy(st) &&
+ (st->town->exclusive_counter == 0 || st->town->exclusivity == st->owner) && // check exclusive transport rights
+ st->goods[type].rating != 0 &&
+ (!_patches.selectgoods || st->goods[type].last_speed > 0) && // if last_speed is 0, no vehicle has been there.
+ ((st->facilities & ~FACIL_BUS_STOP) != 0 || type == CT_PASSENGERS) && // if we have other fac. than a bus stop, or the cargo is passengers
+ ((st->facilities & ~FACIL_TRUCK_STOP) != 0 || type != CT_PASSENGERS)) { // if we have other fac. than a cargo bay or the cargo is not passengers
+ int x_dist;
+ int y_dist;
+
+ if (_patches.modified_catchment) {
+ // min and max coordinates of the producer relative
+ const int x_min_prod = 9;
+ const int x_max_prod = 8 + w_prod;
+ const int y_min_prod = 9;
+ const int y_max_prod = 8 + h_prod;
+
+ rad = FindCatchmentRadius(st);
+
+ x_dist = min(w_cur - x_min_prod, x_max_prod - w_cur);
+
+ if (w_cur < x_min_prod) {
+ x_dist = x_min_prod - w_cur;
+ } else if (w_cur > x_max_prod) {
+ x_dist = w_cur - x_max_prod;
}
- if ( !(x_dist > rad) && !(y_dist > rad) ) {
-
- around[i] = st_index;
- around_ptr[i] = st;
+ y_dist = min(h_cur - y_min_prod, y_max_prod - h_cur);
+ if (h_cur < y_min_prod) {
+ y_dist = y_min_prod - h_cur;
+ } else if (h_cur > y_max_prod) {
+ y_dist = h_cur - y_max_prod;
}
+ } else {
+ x_dist = 0;
+ y_dist = 0;
}
- break;
- } else if (around[i] == st_index)
- break;
+
+ if (x_dist <= rad && y_dist <= rad) {
+ around[i] = st_index;
+ around_ptr[i] = st;
+ }
+ }
+ break;
+ } else if (around[i] == st_index) {
+ break;
}
}
END_TILE_LOOP(cur_tile, w, h, tile - TileDiffXY(max_rad, max_rad))
/* no stations around at all? */
- if (around[0] == INVALID_STATION)
- return 0;
+ if (around[0] == INVALID_STATION) return 0;
if (around[1] == INVALID_STATION) {
/* only one station around */
@@ -2649,13 +2656,14 @@ uint MoveGoodsToStation(TileIndex tile, int w, int h, int type, uint amount)
moved = 0;
if (t != 0) {
- moved = (t * best_rating >> 8) + 1;
+ moved = t * best_rating / 256 + 1;
amount -= t;
UpdateStationWaiting(st1, type, moved);
}
if (amount != 0) {
- moved += (amount = (amount * best_rating2 >> 8) + 1);
+ amount = amount * best_rating2 / 256 + 1;
+ moved += amount;
UpdateStationWaiting(st2, type, amount);
}