#include "scripts/common.txt"

class TurokDoorToggle : ScriptObject
{
    kActor @self;
    
    TurokDoorToggle(kActor @actor)
    {
        @self = actor;
    }
    
    void OnSpawn(void)
    {
    }
    
    void OnTick(void)
    {
    }
    
    void ActivateDoor()
    {
        if (self.IsPersistentMarked())
        {
			self.MarkPersistentBit(true);
			self.AnimState().Blend(anim_doorClose, 4.0f, 4.0f, 0);
        }
        else
        {
            self.MarkPersistentBit(false);
			self.AnimState().Blend(anim_doorOpen, 4.0f, 4.0f, 0);
        }
    }
    
    void OnActivate(void)
    {
        if (self.SectorIndex() <= -1)
        {
            return;
        }
        self.Flags() &= ~AF_ACTIVATED;
        ActivateDoor();
    }
        
    void OnBeginLevel(void)
    {
		self.AnimState().Set(anim_doorIdle, 4.0f, 0);
    }
    
    void OnRestore(void)
    {
        self.AnimState().Set(anim_doorOpen, 4.0f, 0);
        self.AnimState().SetLastFrame(true);
        //self.Flags() |= AF_IGNORESOUNDEVENTS;
    }
};
//===================================================================================================================================
//(4) Attach Chance 0..255 (delay to close. if 0 stays open forever)
//(7) Params 1 -128..127 (delay to activate)
class TurokDoor : ScriptObject
{
    float   delayTime;
    int     stateFlags;
    kActor  @self;
    
    TurokDoor(kActor @actor)
    {
        @self = actor;
        delayTime = 0;
        stateFlags = 0;
    }
    
    void OnSpawn(void)
    {
    }
    
    void OnTick(void)
    {
        if((stateFlags & TFF_ACTIVATED) != 0)
        {
            if((stateFlags & TFF_MOVING) != 0)
            {
                if(delayTime > 0.0f)
                {
                    delayTime -= GAME_FRAME_TIME;
                    
                    if(delayTime <= 0.0f)
                    {
                        self.AnimState().Blend(anim_doorClose, 4.0f, 4.0f, 0);
                        stateFlags &= ~(TFF_MOVING|TFF_WAITING);
                    }
                }
            }
            else
            {
                if((stateFlags & TFF_WAITING) != 0)
                {
                    delayTime -= GAME_FRAME_TIME;
                    
                    if(delayTime <= 0.0f)
                    {
                        delayTime = float(self.SpawnParams(4) * 60);
                        self.AnimState().Blend(anim_doorOpen, 4.0f, 4.0f, 0);
                        
                        stateFlags |= TFF_MOVING;
                        
                        // if going to stay open forever, keep in persistent data
                        if(self.SpawnParams(4) == 0)
                        {
                            self.MarkPersistentBit(false);
                        }
                    }
                }
            }
        }
    }
    
    void ActivateDoor(const bool bOpen)
    {
        if(bOpen)
        {
            if((stateFlags & TFF_WAITING) == 0)
            {
                if(self.SpawnParams(7) == 0)
                {
                    delayTime = float(self.SpawnParams(4) * 60);
                    stateFlags |= TFF_MOVING;
                    self.AnimState().Blend(anim_doorOpen, 4.0f, 4.0f, 0);
                    
                    // if going to stay open forever, keep in persistent data
                    if(self.SpawnParams(4) == 0)
                    {
                        self.MarkPersistentBit(false);
                    }
                }
                else
                {
                    stateFlags |= TFF_WAITING;
                    delayTime = float(self.SpawnParams(7) * 60);
                }
            }
        }
        else
        {
            self.AnimState().Blend(anim_doorClose, 4.0f, 4.0f, 0);
            stateFlags &= ~(TFF_MOVING|TFF_WAITING);
        }
    }
    
    void OnActivate(void)
    {
        if(self.SectorIndex() <= -1)
        {
            return;
        }
        
        self.Flags() &= ~AF_ACTIVATED;
        
        if((stateFlags & (TFF_MOVING|TFF_WAITING)) != 0)
        {
            return;
        }
        
        ActivateDoor(true);
    }
        
    void OnBeginLevel(void)
    {
        self.AnimState().Set(anim_doorIdle, 4.0f, 0);
        stateFlags |= TFF_ACTIVATED;
    }
    
    void OnRestore(void)
    {
        self.AnimState().Set(anim_doorOpen, 4.0f, 0);
        self.AnimState().SetLastFrame(true);
        self.Flags() |= AF_IGNORESOUNDEVENTS;
        
        stateFlags |= TFF_ACTIVATED|TFF_MOVING;
        delayTime = 0;
    }
};
