(svn r10981) -Fix [FS#1156] (r10970): stations gave ratings for accepted cargo too.
authorrubidium
Sun, 26 Aug 2007 13:55:36 +0000
changeset 7970 204ece3a05d5
parent 7969 9050701304bd
child 7971 c1b1fa49885a
(svn r10981) -Fix [FS#1156] (r10970): stations gave ratings for accepted cargo too.
src/economy.cpp
src/newgrf_station.cpp
src/oldloader.cpp
src/station.h
src/station_cmd.cpp
src/station_gui.cpp
--- a/src/economy.cpp	Sun Aug 26 00:23:32 2007 +0000
+++ b/src/economy.cpp	Sun Aug 26 13:55:36 2007 +0000
@@ -1429,7 +1429,7 @@
 			CargoPacket *cp = *it;
 			if (!cp->paid_for &&
 					cp->source != last_visited &&
-					ge->acceptance &&
+					HASBIT(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) &&
 					(front_v->current_order.flags & OF_TRANSFER) == 0) {
 				/* Deliver goods to the station */
 				st->time_since_unload = 0;
@@ -1545,13 +1545,14 @@
 			uint amount_unloaded = _patches.gradual_loading ? min(cargo_count, load_amount) : cargo_count;
 			bool remaining; // Are there cargo entities in this vehicle that can still be unloaded here?
 
-			if (ge->acceptance && !(u->current_order.flags & OF_TRANSFER)) {
+			if (HASBIT(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && !(u->current_order.flags & OF_TRANSFER)) {
 				/* The cargo has reached it's final destination, the packets may now be destroyed */
 				remaining = v->cargo.MoveTo(NULL, amount_unloaded, CargoList::MTA_FINAL_DELIVERY, last_visited);
 
 				result |= 1;
 			} else if (u->current_order.flags & (OF_UNLOAD | OF_TRANSFER)) {
 				remaining = v->cargo.MoveTo(&ge->cargo, amount_unloaded);
+				SETBIT(ge->acceptance_pickup, GoodsEntry::PICKUP);
 
 				result |= 2;
 			} else {
@@ -1628,10 +1629,12 @@
 
 			ge->cargo.MoveTo(&v->cargo, cap, CargoList::MTA_CARGO_LOAD, st->xy);
 
-			unloading_time += cap;
+			SETBIT(ge->acceptance_pickup, GoodsEntry::PICKUP);
 			st->time_since_load = 0;
 			st->last_vehicle_type = v->type;
 
+			unloading_time += cap;
+
 			result |= 2;
 		}
 
--- a/src/newgrf_station.cpp	Sun Aug 26 00:23:32 2007 +0000
+++ b/src/newgrf_station.cpp	Sun Aug 26 13:55:36 2007 +0000
@@ -429,7 +429,7 @@
 			uint32 value = 0;
 
 			for (cargo_type = 0; cargo_type < NUM_CARGO; cargo_type++) {
-				if (st->goods[cargo_type].acceptance) SETBIT(value, cargo_type);
+				if (HASBIT(st->goods[cargo_type].acceptance_pickup, GoodsEntry::PICKUP)) SETBIT(value, cargo_type);
 			}
 			return value;
 		}
@@ -467,7 +467,7 @@
 			case 0x62: return ge->rating;
 			case 0x63: return ge->cargo.DaysInTransit();
 			case 0x64: return ge->last_speed | (ge->last_age << 8);
-			case 0x65: return ge->acceptance << 3;
+			case 0x65: return GB(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1) << 3;
 		}
 	}
 
@@ -476,7 +476,7 @@
 		const GoodsEntry *g = &st->goods[GB(variable - 0x8C, 3, 4)];
 		switch (GB(variable - 0x8C, 0, 3)) {
 			case 0: return g->cargo.Count();
-			case 1: return GB(min(g->cargo.Count(), 4095), 0, 4) | (g->acceptance << 7);
+			case 1: return GB(min(g->cargo.Count(), 4095), 0, 4) | (GB(g->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1) << 7);
 			case 2: return g->days_since_pickup;
 			case 3: return g->rating;
 			case 4: return g->cargo.Source();
--- a/src/oldloader.cpp	Sun Aug 26 00:23:32 2007 +0000
+++ b/src/oldloader.cpp	Sun Aug 26 13:55:36 2007 +0000
@@ -579,12 +579,15 @@
 	Station *st = GetStation(_current_station_id);
 	GoodsEntry *ge = &st->goods[num];
 	bool ret = LoadChunk(ls, ge, goods_chunk);
-	if (ret && GB(_waiting_acceptance, 0, 12) != 0) {
+	if (!ret) return false;
+
+	SB(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, HASBIT(_waiting_acceptance, 15));
+	SB(ge->acceptance_pickup, GoodsEntry::PICKUP, 1, _cargo_source != 0xFF);
+	if (GB(_waiting_acceptance, 0, 12) != 0) {
 		CargoPacket *cp = new CargoPacket();
 		cp->source          = (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source;
 		cp->count           = GB(_waiting_acceptance, 0, 12);
 		cp->days_in_transit = _cargo_days;
-		ge->acceptance      = HASBIT(_waiting_acceptance, 15);
 		ge->cargo.Append(cp);
 	}
 	return ret;
--- a/src/station.h	Sun Aug 26 00:23:32 2007 +0000
+++ b/src/station.h	Sun Aug 26 13:55:36 2007 +0000
@@ -24,15 +24,20 @@
 static const byte INITIAL_STATION_RATING = 175;
 
 struct GoodsEntry {
+	enum AcceptancePickup {
+		ACCEPTANCE,
+		PICKUP
+	};
+
 	GoodsEntry() :
-		acceptance(false),
+		acceptance_pickup(0),
 		days_since_pickup(255),
 		rating(INITIAL_STATION_RATING),
 		last_speed(0),
 		last_age(255)
 	{}
 
-	bool acceptance;
+	byte acceptance_pickup;
 	byte days_since_pickup;
 	byte rating;
 	byte last_speed;
--- a/src/station_cmd.cpp	Sun Aug 26 00:23:32 2007 +0000
+++ b/src/station_cmd.cpp	Sun Aug 26 13:55:36 2007 +0000
@@ -389,7 +389,7 @@
 	uint mask = 0;
 
 	for (CargoID i = 0; i < NUM_CARGO; i++) {
-		if (st->goods[i].acceptance) mask |= 1 << i;
+		if (HASBIT(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE)) mask |= 1 << i;
 	}
 	return mask;
 }
@@ -570,7 +570,7 @@
 				(is_passengers && !(st->facilities & (byte)~FACIL_TRUCK_STOP)))
 			amt = 0;
 
-		st->goods[i].acceptance = (amt >= 8);
+		SB(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, amt >= 8);
 	}
 
 	// Only show a message in case the acceptance was actually changed.
@@ -2384,10 +2384,12 @@
 		/* Slowly increase the rating back to his original level in the case we
 		 *  didn't deliver cargo yet to this station. This happens when a bribe
 		 *  failed while you didn't moved that cargo yet to a station. */
-		if (ge->days_since_pickup == 255 && ge->rating < INITIAL_STATION_RATING)
+		if (!HASBIT(ge->acceptance_pickup, GoodsEntry::PICKUP) && ge->rating < INITIAL_STATION_RATING) {
 			ge->rating++;
+		}
+
 		/* Only change the rating if we are moving this cargo */
-		if (ge->last_speed != 0) {
+		if (HASBIT(ge->acceptance_pickup, GoodsEntry::PICKUP)) {
 			byte_inc_sat(&ge->days_since_pickup);
 
 			int rating = 0;
@@ -2519,7 +2521,7 @@
 			for (CargoID i = 0; i < NUM_CARGO; i++) {
 				GoodsEntry* ge = &st->goods[i];
 
-				if (ge->days_since_pickup != 255) {
+				if (ge->acceptance_pickup != 0) {
 					ge->rating = clamp(ge->rating + amount, 0, 255);
 				}
 			}
@@ -2616,8 +2618,8 @@
 			if (around[i] == NULL) {
 				if (!st->IsBuoy() &&
 						(st->town->exclusive_counter == 0 || st->town->exclusivity == st->owner) && // check exclusive transport rights
-						st->goods[type].rating != 0 && st->goods[type].last_speed != 0 && // we actually service the station
-						(!_patches.selectgoods || st->goods[type].last_speed > 0) && // if last_speed is 0, no vehicle has been there.
+						st->goods[type].rating != 0 && // when you've got the lowest rating you can get, it's better not to give cargo anymore
+						(!_patches.selectgoods || st->goods[type].last_speed > 0) && // we are servicing the station (or cargo is dumped on all stations)
 						((st->facilities & ~FACIL_BUS_STOP)   != 0 || IsCargoInClass(type, CC_PASSENGERS)) && // if we have other fac. than a bus stop, or the cargo is passengers
 						((st->facilities & ~FACIL_TRUCK_STOP) != 0 || !IsCargoInClass(type, CC_PASSENGERS))) { // if we have other fac. than a cargo bay or the cargo is not passengers
 					if (_patches.modified_catchment) {
@@ -2746,7 +2748,7 @@
 	st->build_date = _date;
 
 	for (CargoID j = 0; j < NUM_CARGO; j++) {
-		st->goods[j].acceptance = false;
+		st->goods[j].acceptance_pickup = 0;
 		st->goods[j].days_since_pickup = 255;
 		st->goods[j].rating = INITIAL_STATION_RATING;
 		st->goods[j].last_speed = 0;
@@ -2977,7 +2979,7 @@
 
 static const SaveLoad _goods_desc[] = {
 	SLEG_CONDVAR(            _waiting_acceptance, SLE_UINT16,                  0, 67),
-	 SLE_CONDVAR(GoodsEntry, acceptance,          SLE_BOOL,                   68, SL_MAX_VERSION),
+	 SLE_CONDVAR(GoodsEntry, acceptance_pickup,   SLE_UINT8,                  68, SL_MAX_VERSION),
 	SLE_CONDNULL(2,                                                           51, 67),
 	     SLE_VAR(GoodsEntry, days_since_pickup,   SLE_UINT8),
 	     SLE_VAR(GoodsEntry, rating,              SLE_UINT8),
@@ -3013,7 +3015,7 @@
 		GoodsEntry *ge = &st->goods[i];
 		SlObject(ge, _goods_desc);
 		if (CheckSavegameVersion(68)) {
-			ge->acceptance = HASBIT(_waiting_acceptance, 15);
+			SB(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, HASBIT(_waiting_acceptance, 15));
 			if (GB(_waiting_acceptance, 0, 12) != 0) {
 				/* Don't construct the packet with station here, because that'll fail with old savegames */
 				CargoPacket *cp = new CargoPacket();
@@ -3025,9 +3027,8 @@
 				cp->source_xy       = _cargo_source_xy;
 				cp->days_in_transit = _cargo_days;
 				cp->feeder_share    = _cargo_feeder_share;
+				SB(ge->acceptance_pickup, GoodsEntry::PICKUP, 1, 1);
 				ge->cargo.Append(cp);
-			} else {
-				ge->days_since_pickup = 255;
 			}
 		}
 	}
--- a/src/station_gui.cpp	Sun Aug 26 00:23:32 2007 +0000
+++ b/src/station_gui.cpp	Sun Aug 26 13:55:36 2007 +0000
@@ -157,8 +157,8 @@
 	byte maxr2 = 0;
 
 	for (CargoID j = 0; j < NUM_CARGO; j++) {
-		if (st1->goods[j].days_since_pickup != 255) maxr1 = max(maxr1, st1->goods[j].rating);
-		if (st2->goods[j].days_since_pickup != 255) maxr2 = max(maxr2, st2->goods[j].rating);
+		if (HASBIT(st1->goods[j].acceptance_pickup, GoodsEntry::PICKUP)) maxr1 = max(maxr1, st1->goods[j].rating);
+		if (HASBIT(st2->goods[j].acceptance_pickup, GoodsEntry::PICKUP)) maxr2 = max(maxr2, st2->goods[j].rating);
 	}
 
 	return (_internal_sort_order & 1) ? maxr2 - maxr1 : maxr1 - maxr2;
@@ -771,7 +771,7 @@
 
 		for (CargoID i = 0; i < NUM_CARGO; i++) {
 			if (b >= endof(_userstring) - 5 - 1) break;
-			if (st->goods[i].acceptance) {
+			if (HASBIT(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE)) {
 				if (first) {
 					first = false;
 				} else {
@@ -797,7 +797,7 @@
 			if (!cs->IsValid()) continue;
 
 			const GoodsEntry *ge = &st->goods[i];
-			if (ge->days_since_pickup == 255) continue;
+			if (!HASBIT(ge->acceptance_pickup, GoodsEntry::PICKUP)) continue;
 
 			SetDParam(0, cs->name);
 			SetDParam(2, ge->rating * 101 >> 8);