48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
| using namespace df::enums;
 | |
| 
 | |
| static int map_temp_mult = -1;
 | |
| static int max_heat_ticks = 0;
 | |
| 
 | |
| struct fast_heat_hook : df::item_actual {
 | |
|     typedef df::item_actual interpose_base;
 | |
| 
 | |
|     DEFINE_VMETHOD_INTERPOSE(
 | |
|         bool, updateTempFromMap,
 | |
|         (bool local, bool contained, bool adjust, int32_t rate_mult)
 | |
|     ) {
 | |
|         int cmult = map_temp_mult;
 | |
|         map_temp_mult = rate_mult;
 | |
| 
 | |
|         bool rv = INTERPOSE_NEXT(updateTempFromMap)(local, contained, adjust, rate_mult);
 | |
|         map_temp_mult = cmult;
 | |
|         return rv;
 | |
|     }
 | |
| 
 | |
|     DEFINE_VMETHOD_INTERPOSE(
 | |
|         bool, updateTemperature,
 | |
|         (uint16_t temp, bool local, bool contained, bool adjust, int32_t rate_mult)
 | |
|     ) {
 | |
|         // Some items take ages to cross the last degree, so speed them up
 | |
|         if (map_temp_mult > 0 && temp != temperature.whole && max_heat_ticks > 0)
 | |
|         {
 | |
|             int spec = getSpecHeat();
 | |
|             if (spec != 60001)
 | |
|                 rate_mult = std::max(map_temp_mult, spec/max_heat_ticks/abs(temp - temperature.whole));
 | |
|         }
 | |
| 
 | |
|         return INTERPOSE_NEXT(updateTemperature)(temp, local, contained, adjust, rate_mult);
 | |
|     }
 | |
| 
 | |
|     DEFINE_VMETHOD_INTERPOSE(bool, adjustTemperature, (uint16_t temp, int32_t rate_mult))
 | |
|     {
 | |
|         if (map_temp_mult > 0)
 | |
|             rate_mult = map_temp_mult;
 | |
| 
 | |
|         return INTERPOSE_NEXT(adjustTemperature)(temp, rate_mult);
 | |
|     }
 | |
| };
 | |
| 
 | |
| IMPLEMENT_VMETHOD_INTERPOSE(fast_heat_hook, updateTempFromMap);
 | |
| IMPLEMENT_VMETHOD_INTERPOSE(fast_heat_hook, updateTemperature);
 | |
| IMPLEMENT_VMETHOD_INTERPOSE(fast_heat_hook, adjustTemperature);
 |