changeset 16119:93c0ac471690 draft

(svn r20815) -Revert (r20814): wrong patch at wrong time...
author rubidium <rubidium@openttd.org>
date Thu, 16 Sep 2010 16:31:38 +0000
parents d9663f636e0e
children 9c19ce78d8ec
files src/saveload/saveload.cpp src/saveload/station_sl.cpp src/station_base.h src/station_cmd.cpp
diffstat 4 files changed, 25 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -211,9 +211,8 @@
  *  146   20446
  *  147   20621
  *  148   20659
- *  149   TODO
  */
-extern const uint16 SAVEGAME_VERSION = 149; ///< current savegame version of OpenTTD
+extern const uint16 SAVEGAME_VERSION = 148; ///< current savegame version of OpenTTD
 
 SavegameType _savegame_type; ///< type of savegame we are loading
 
--- a/src/saveload/station_sl.cpp
+++ b/src/saveload/station_sl.cpp
@@ -238,7 +238,6 @@
 		     SLE_VAR(GoodsEntry, last_age,            SLE_UINT8),
 		SLEG_CONDVAR(            _cargo_feeder_share, SLE_FILE_U32 | SLE_VAR_I64, 14, 64),
 		SLEG_CONDVAR(            _cargo_feeder_share, SLE_INT64,                  65, 67),
-		 SLE_CONDVAR(GoodsEntry, amount_fract,        SLE_UINT8,                 149, SL_MAX_VERSION),
 		 SLE_CONDLST(GoodsEntry, cargo.packets,       REF_CARGO_PACKET,           68, SL_MAX_VERSION),
 
 		SLE_END()
--- a/src/station_base.h
+++ b/src/station_base.h
@@ -42,7 +42,6 @@
 	byte rating;
 	byte last_speed;
 	byte last_age;
-	byte amount_fract;      ///< Fractional part of the amount in the cargo list
 	StationCargoList cargo; ///< The cargo packets of cargo waiting in this station
 };
 
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -3190,13 +3190,7 @@
 
 static void UpdateStationWaiting(Station *st, CargoID type, uint amount, SourceType source_type, SourceID source_id)
 {
-	amount += st->goods[type].amount_fract;
-	st->goods[type].amount_fract = GB(amount, 0, 8);
-
-	/* No new "real" cargo item yet. */
-	if (amount <= UINT8_MAX) return;
-
-	st->goods[type].cargo.Append(new CargoPacket(st->index, st->xy, amount >> 8, source_type, source_id));
+	st->goods[type].cargo.Append(new CargoPacket(st->index, st->xy, amount, source_type, source_id));
 	SetBit(st->goods[type].acceptance_pickup, GoodsEntry::PICKUP);
 
 	TriggerStationAnimation(st, st->xy, SAT_NEW_CARGO, type);
@@ -3334,14 +3328,11 @@
 	/* no stations around at all? */
 	if (st1 == NULL) return 0;
 
-	/* From now we'll calculate with fractal cargo amounts.
-	 * First determine how much cargo we really have. */
-	amount *= best_rating1 + 1;
-
 	if (st2 == NULL) {
 		/* only one station around */
-		UpdateStationWaiting(st1, type, amount, source_type, source_id);
-		return amount >> 8;
+		uint moved = amount * best_rating1 / 256 + 1;
+		UpdateStationWaiting(st1, type, moved, source_type, source_id);
+		return moved;
 	}
 
 	/* several stations around, the best two (highest rating) are in st1 and st2 */
@@ -3349,19 +3340,26 @@
 	assert(st2 != NULL);
 	assert(best_rating1 != 0 || best_rating2 != 0);
 
-	/* Then determine the amount the worst station gets. We do it this way as the
-	 * best should get a bonus, which in this case is the rounding difference from
-	 * this calculation. In reality that will mean the bonus will be pretty low.
-	 * Nevertheless, the best station should always get the most cargo regardless
-	 * of rounding issues. */
-	uint worst_cargo = amount * best_rating2 / (best_rating1 + best_rating2);
-	assert(worst_cargo < (amount - worst_cargo));
-
-	/* And then send the cargo to the stations! */
-	UpdateStationWaiting(st1, type, amount - worst_cargo, source_type, source_id);
-	UpdateStationWaiting(st2, type, worst_cargo, source_type, source_id);
-
-	return amount >> 8;
+	/* the 2nd highest one gets a penalty */
+	best_rating2 >>= 1;
+
+	/* amount given to station 1 */
+	uint t = (best_rating1 * (amount + 1)) / (best_rating1 + best_rating2);
+
+	uint moved = 0;
+	if (t != 0) {
+		moved = t * best_rating1 / 256 + 1;
+		amount -= t;
+		UpdateStationWaiting(st1, type, moved, source_type, source_id);
+	}
+
+	if (amount != 0) {
+		amount = amount * best_rating2 / 256 + 1;
+		moved += amount;
+		UpdateStationWaiting(st2, type, amount, source_type, source_id);
+	}
+
+	return moved;
 }
 
 void BuildOilRig(TileIndex tile)