Mercurial > hg > openttd
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)