Fix #9440: negative cargo payments not being handled right
Cargo payments were stored as unsigned integer, but cast to int64 during
application of inflation. However, then being multiplied with a uint64
making the result uint64. So in the end the payment that should have been
negative becomes hugely positive.
(cherry picked from commit d83647f9a7)
			
			
This commit is contained in:
		
				
					committed by
					
						
						Jonathan G Rennison
					
				
			
			
				
	
			
			
			
						parent
						
							e76c5dfda7
						
					
				
				
					commit
					230866ca3e
				
			@@ -59,7 +59,7 @@ struct CargoSpec {
 | 
			
		||||
	uint8 rating_colour;
 | 
			
		||||
	uint8 weight;                    ///< Weight of a single unit of this cargo type in 1/16 ton (62.5 kg).
 | 
			
		||||
	uint16 multiplier;               ///< Capacity multiplier for vehicles. (8 fractional bits)
 | 
			
		||||
	uint32 initial_payment;          ///< Initial payment rate before inflation is applied.
 | 
			
		||||
	int32 initial_payment;           ///< Initial payment rate before inflation is applied.
 | 
			
		||||
	uint8 transit_days[2];
 | 
			
		||||
 | 
			
		||||
	bool is_freight;                 ///< Cargo type is considered to be freight (affects train freight multiplier).
 | 
			
		||||
 
 | 
			
		||||
@@ -854,7 +854,7 @@ void RecomputePrices()
 | 
			
		||||
 | 
			
		||||
	/* Setup cargo payment */
 | 
			
		||||
	for (CargoSpec *cs : CargoSpec::Iterate()) {
 | 
			
		||||
		cs->current_payment = ((int64)cs->initial_payment * _economy.inflation_payment) >> 16;
 | 
			
		||||
		cs->current_payment = (cs->initial_payment * (int64)_economy.inflation_payment) >> 16;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	SetWindowClassesDirty(WC_BUILD_VEHICLE);
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ struct Economy {
 | 
			
		||||
	uint32 industry_daily_change_counter; ///< Bits 31-16 are number of industry to be performed, 15-0 are fractional collected daily
 | 
			
		||||
	uint32 industry_daily_increment;      ///< The value which will increment industry_daily_change_counter. Computed value. NOSAVE
 | 
			
		||||
	uint64 inflation_prices;              ///< Cumulated inflation of prices since game start; 16 bit fractional part
 | 
			
		||||
	uint64 inflation_payment;             ///< Cumulated inflation of cargo paypent since game start; 16 bit fractional part
 | 
			
		||||
	uint64 inflation_payment;             ///< Cumulated inflation of cargo payment since game start; 16 bit fractional part
 | 
			
		||||
 | 
			
		||||
	/* Old stuff for savegame conversion only */
 | 
			
		||||
	Money old_max_loan_unround;           ///< Old: Unrounded max loan
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user