|  |  | @ -89,6 +89,10 @@ DFhackCExport command_result plugin_init (color_ostream &out, std::vector <Plugi | 
			
		
	
		
		
			
				
					
					|  |  |  |         "    Fixes rendering of creature weight limits in pressure plate build menu.\n" |  |  |  |         "    Fixes rendering of creature weight limits in pressure plate build menu.\n" | 
			
		
	
		
		
			
				
					
					|  |  |  |         "  tweak stable-temp [disable]\n" |  |  |  |         "  tweak stable-temp [disable]\n" | 
			
		
	
		
		
			
				
					
					|  |  |  |         "    Fixes performance bug 6012 by squashing jitter in temperature updates.\n" |  |  |  |         "    Fixes performance bug 6012 by squashing jitter in temperature updates.\n" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         "  tweak fast-heat [max-ticks]\n" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         "    Further improves temperature updates by ensuring that 1 degree of\n" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         "    item temperature is crossed in no more than specified number of frames\n" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         "    when updating from the environment temperature.\n" | 
			
		
	
		
		
			
				
					
					|  |  |  |     )); |  |  |  |     )); | 
			
		
	
		
		
			
				
					
					|  |  |  |     return CR_OK; |  |  |  |     return CR_OK; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | @ -293,6 +297,52 @@ struct stable_temp_hook : df::item_actual { | 
			
		
	
		
		
			
				
					
					|  |  |  | IMPLEMENT_VMETHOD_INTERPOSE(stable_temp_hook, adjustTemperature); |  |  |  | IMPLEMENT_VMETHOD_INTERPOSE(stable_temp_hook, adjustTemperature); | 
			
		
	
		
		
			
				
					
					|  |  |  | IMPLEMENT_VMETHOD_INTERPOSE(stable_temp_hook, updateContaminants); |  |  |  | IMPLEMENT_VMETHOD_INTERPOSE(stable_temp_hook, updateContaminants); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 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 && max_heat_ticks > 0) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             int spec = getSpecHeat(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if (spec != 60001) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 rate_mult = std::max(map_temp_mult, spec/max_heat_ticks/abs(temp - temperature)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         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); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void enable_hook(color_ostream &out, VMethodInterposeLinkBase &hook, vector <string> ¶meters) |  |  |  | static void enable_hook(color_ostream &out, VMethodInterposeLinkBase &hook, vector <string> ¶meters) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (vector_get(parameters, 1) == "disable") |  |  |  |     if (vector_get(parameters, 1) == "disable") | 
			
		
	
	
		
		
			
				
					|  |  | @ -430,6 +480,17 @@ static command_result tweak(color_ostream &out, vector <string> ¶meters) | 
			
		
	
		
		
			
				
					
					|  |  |  |         enable_hook(out, INTERPOSE_HOOK(stable_temp_hook, adjustTemperature), parameters); |  |  |  |         enable_hook(out, INTERPOSE_HOOK(stable_temp_hook, adjustTemperature), parameters); | 
			
		
	
		
		
			
				
					
					|  |  |  |         enable_hook(out, INTERPOSE_HOOK(stable_temp_hook, updateContaminants), parameters); |  |  |  |         enable_hook(out, INTERPOSE_HOOK(stable_temp_hook, updateContaminants), parameters); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     else if (cmd == "fast-heat") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (parameters.size() < 2) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             return CR_WRONG_USAGE; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         max_heat_ticks = atoi(parameters[1].c_str()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (max_heat_ticks <= 0) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             parameters[1] = "disable"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         enable_hook(out, INTERPOSE_HOOK(fast_heat_hook, updateTempFromMap), parameters); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         enable_hook(out, INTERPOSE_HOOK(fast_heat_hook, updateTemperature), parameters); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         enable_hook(out, INTERPOSE_HOOK(fast_heat_hook, adjustTemperature), parameters); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     else  |  |  |  |     else  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return CR_WRONG_USAGE; |  |  |  |         return CR_WRONG_USAGE; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |