//
// Copyright(C) 2014-2015 Samuel Villarreal
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// DESCRIPTION:
//      Door Object Class
//

#include "scripts/common.txt"

/*
==============================================================
TurokDoor
==============================================================
*/

class TurokDoor : ScriptObject
{
    float   delayTime;
    int     stateFlags;
    kActor  @self;

    TurokDoor(kActor @actor)
    {
        @self = actor;
        delayTime = 0;
        stateFlags = 0;
    }

    /*
    ==============================================================
    OnSpawn
    ==============================================================
    */

    void OnSpawn(void)
    {
    }

    /*
    ==============================================================
    OnTick
    ==============================================================
    */

    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);
                        }
                    }
                }
            }
        }
    }

    /*
    ==============================================================
    ActivateDoor
    ==============================================================
    */

    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);
        }
    }

    /*
    ==============================================================
    OnActivate
    ==============================================================
    */

    void OnActivate(void)
    {
        if(self.SectorIndex() <= -1)
        {
            return;
        }

        self.Flags() &= ~AF_ACTIVATED;

		// Smoke39 - Outpost
		// if we have a target TID, we're a button that must be stepped on to trigger something else
		int targetTID = self.SpawnParams(0);
		if ( targetTID > 0 )
		{
			if ( !Player.Actor().OnGround() )
				return;
			World.TriggerActorsByTID( self, targetTID );
		}

        if((stateFlags & (TFF_MOVING|TFF_WAITING)) != 0)
        {
            return;
        }

        ActivateDoor(true);
    }

    /*
    ==============================================================
    OnBeginLevel
    ==============================================================
    */

    void OnBeginLevel(void)
    {
        self.AnimState().Set(anim_doorIdle, 4.0f, 0);
        stateFlags |= TFF_ACTIVATED;
    }

    /*
    ==============================================================
    OnRestore
    ==============================================================
    */

    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;
    }
};
