DIFF

WaterBottle.c

class WaterBottle extends Bottle_Base
{
	const float DAMAGE_OVERHEAT_PER_S = 0.1;
	const float DAMAGE_ENVIRO_LIQUID_COEF_MIN = 1;
	const float DAMAGE_ENVIRO_LIQUID_COEF_MAX = 2;
	const float DAMAGE_ENVIRO_TEMPDIFF_MIN = 80; //min damage at this demperature diff
	const float DAMAGE_ENVIRO_TEMPDIFF_MAX = 10; //maximum damage at this demperature diff
	
	override string GetPouringSoundset()
	{
		return "emptyVessle_WaterBottle_SoundSet";
	}
	
	override string GetEmptyingLoopSoundsetHard()
	{
		return "pour_HardGround_WatterBottle_SoundSet";
	}
	
	override string GetEmptyingLoopSoundsetSoft()
	{
		return "pour_SoftGround_WatterBottle_SoundSet";
	}
	
	override string GetEmptyingLoopSoundsetWater()
	{
		return "pour_Water_WatterBottle_SoundSet";
	}
	
	override string GetEmptyingEndSoundsetHard()
	{
		return "pour_End_HardGround_WatterBottle_SoundSet";
	}
	
	override string GetEmptyingEndSoundsetSoft()
	{
		return "pour_End_SoftGround_WatterBottle_SoundSet";
	}
	
	override string GetEmptyingEndSoundsetWater()
	{
		return "pour_End_Water_WatterBottle_SoundSet";
	}
	
	override bool CanPutInCargo( EntityAI parent )
	{
		if( !super.CanPutInCargo(parent) ) {return false;}	
		if ( parent && (parent.IsKindOf("WatterBottle"))/* && !(parent.IsKindOf("Container_Base"))*/)
		{
			return false;
		}
		
		return true;
	}
	
	override bool IsOpen()
	{
		return true;
	}
	
	override void EEOnCECreate()
	{
		super.EEOnCECreate();

		WorldData data = g_Game.GetMission().GetWorldData();
		if (data)
		{
			float chance = data.GetAgentSpawnChance(eAgents.CHOLERA);
			int rand = Math.RandomFloat(0, 100);
			
			if (rand < chance)
				InsertAgent(eAgents.CHOLERA, 1);
		}
	}
	
	override void OnDebugSpawn()
	{
		super.OnDebugSpawn();
		
		InsertAgent(eAgents.CHOLERA, 1);
	}
	
	override void AffectLiquidContainerOnFill(int liquid_type, float amount)
	{
		float liquidTemperature = g_Game.GetMission().GetWorldData().GetLiquidTypeEnviroTemperature(liquid_type);
		if (liquidTemperature >= GetItemOverheatThreshold())
		{
			float temperatureDiff = liquidTemperature - GetTemperature();
			float tTime = Math.Clamp(Math.InverseLerp(DAMAGE_ENVIRO_TEMPDIFF_MIN,DAMAGE_ENVIRO_TEMPDIFF_MAX,temperatureDiff),0,1);
			float temperatureDiffCoef = Math.Lerp(DAMAGE_ENVIRO_LIQUID_COEF_MIN,DAMAGE_ENVIRO_LIQUID_COEF_MAX,tTime);
			float damageVal = GetMaxHealth("","Health") / GetQuantityMax();
			DecreaseHealth(amount * damageVal * temperatureDiffCoef,false);
		}
	}
	
	override void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
	{
		//does damage if receiving scalding liquid
		if (sourceLiquidTemperature >= GetItemOverheatThreshold())
		{
			float temperatureDiff = sourceLiquidTemperature - GetTemperature();
			float tTime = Math.Clamp(Math.InverseLerp(DAMAGE_ENVIRO_TEMPDIFF_MIN,DAMAGE_ENVIRO_TEMPDIFF_MAX,temperatureDiff),0,1);
			float temperatureDiffCoef = Math.Lerp(DAMAGE_ENVIRO_LIQUID_COEF_MIN,DAMAGE_ENVIRO_LIQUID_COEF_MAX,tTime);
			float damageVal = GetMaxHealth("","Health") / GetQuantityMax();
			DecreaseHealth(amount * damageVal * temperatureDiffCoef,false);
		}
	}
	
	//! disregards liquid boil threshold if filled
	override float GetItemOverheatThreshold()
	{
		return GetTemperatureMax();
	}
}