#include "scripts/common.txt"
#include "scripts/BP_common.txt"

//(2) Health -32768..32767 (target height)
//(7) Params 1 -128..127 (time in seconds to reach target height)
//(6) Params 2 -128..127 (1 = no sounds)

class BP_FloorWater : ScriptObject
{
    kActor @self;
    bool bActivated;
	float time;
	float startZ;
    
    BP_FloorWater(kActor @actor)
    {
        @self = actor;
        bActivated = false;
		startZ = self.Origin().z;
    }

    void OnTick(void)
    {
        if (!bActivated)
        {
            return;
        }
        
		float targetTime = float(self.SpawnParams(7));
		if (time >= targetTime)
		{
			return;
		}
        
        if (self.SpawnParams(6) == 0 && (self.GameTicks() & 95) == 0)
        {
            self.PlaySound("sounds/shaders/river_flow_heavy.ksnd");
        }
        
		if (self.SpawnParams(7) > 0)
		{
			float targetHeight = float(self.SpawnParams(2));
			time += GAME_DELTA_TIME;
			float waterHeight = Math::LerpClamped(startZ, targetHeight, time / targetTime);
			self.Origin().z = waterHeight;
			World.ChangeAreaWaterHeight(self.AreaID(), waterHeight);
		}
    }
    
    void OnSpawn(void)
    {
    }
    
    void OnActivate(void)
    {
        if (bActivated)
        {
            return;
        }
        
        bActivated = true;
		if (self.SpawnParams(6) == 0)
		{
			self.PlaySound("sounds/shaders/river_flow_heavy.ksnd");
		}
        self.MarkPersistentBit(false);
        
		int areaID = self.AreaID();
		if (areaID <= -1)
		{
			return;
		}
		World.ChangeAreaFlag(areaID, AAF_WATER, true);
		if (self.SpawnParams(7) == 0)
		{
			float targetHeight = float(self.SpawnParams(2));
			World.ChangeAreaWaterHeight(areaID, targetHeight);
			self.Origin().z = targetHeight;
		}
		else
		{
			World.ChangeAreaWaterHeight(areaID, startZ);
		}
    }
    
    void OnRestore(void)
    {
		float targetHeight = float(self.SpawnParams(2));
		self.Origin().z = targetHeight;
		bActivated = true;
		float targetTime = float(self.SpawnParams(7));
		time = targetTime;
		int areaID = self.AreaID();
		if (areaID <= -1)
		{
			return;
		}
		World.ChangeAreaFlag(areaID, AAF_WATER, true);
		World.ChangeAreaWaterHeight(areaID, targetHeight);
    }
};
