//
// 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:
//      Sequence Event Object Classes
//

#include "scripts/common.txt"

//-----------------------------------------------------------------------------
//
// Timer Event
//
//-----------------------------------------------------------------------------

/*
==============================================================
TurokTimerEvent
==============================================================
*/

class TurokTimerEvent : BPR::CL_BPR_WorldObject //[BP_Randomizer]
{
    float   delayTime;
    float   currentTime;
    int     countDown;
    int     stateFlags;
    kActor  @self;
    
    TurokTimerEvent(kActor @actor)
    {
		super(actor); //[BP_Randomizer]
        @self = actor;
        stateFlags = 0;
        delayTime = 0;
        countDown = 0;
        currentTime = 0;
    }
    
    /*
    ==============================================================
    OnSpawn
    ==============================================================
    */
    
    void OnSpawn(void)
    {
    }
    
    /*
    ==============================================================
    OnTick
    ==============================================================
    */
    
    void OnTick(void)
    {
        if(self.SectorIndex() <= -1)
        {
            return;
        }
        
        currentTime -= 0.05f;
        
        if((stateFlags & TFF_ACTIVATED) == 0)
        {
            self.AnimState().Set(anim_liftRaise, 4.0f, 0);
            stateFlags |= TFF_ACTIVATED;
            delayTime = 0.0f;
            countDown = self.SpawnParams(2);
            return;
        }
        
        if((stateFlags & TFF_WAITING) == 0)
        {
            if((stateFlags & TFF_MOVING) != 0)
            {
                if(delayTime <= 0.0f)
                {
                    float delay;
                    
                    if(countDown == 0)
                    {
                        stateFlags |= TFF_WAITING;
                        stateFlags &= ~TFF_MOVING;
                        
                        delay = float(self.SpawnParams(7) * 15);
                    }
                    else
                    {
                        countDown--;
                        
                        if(countDown == 0)
                        {
                            stateFlags &= ~(TFF_MOVING|TFF_WAITING|TFF_ACTIVATED);
                            return;
                        }
                        
                        stateFlags |= TFF_WAITING;
                        stateFlags &= ~TFF_MOVING;
                        
                        delay = float(self.SpawnParams(7) * 15);
                    }
                    
                    delayTime = delay;
                    self.AnimState().Set(anim_liftLower, 4.0f, ANF_LOOP);
                    return;
                }
                
                delayTime -= GAME_FRAME_TIME;
            }
            
            return;
        }
        
        if(delayTime > -1.0f)
        {
            delayTime -= GAME_FRAME_TIME;
            
            if(delayTime <= -1.0f)
            {
                stateFlags &= ~TFF_WAITING;
                stateFlags |= TFF_MOVING;
                delayTime = float(self.SpawnParams(4) * 15);
                self.AnimState().Set(anim_liftRaise, 4.0f, 0);
            }
            
            return;
        }
        
        if(currentTime <= 0.0f)
        {
            delayTime = 0;
        }
        else
        {
            currentTime = 0;
        }
    }
    
    /*
    ==============================================================
    OnActivate
    ==============================================================
    */
    
    void OnActivate(void)
    {
        if(self.SectorIndex() <= -1)
        {
            return;
        }
        
        self.Flags() &= ~AF_ACTIVATED;
        
        if((stateFlags & TFF_ACTIVATED) != 0)
        {
            currentTime = 1.0f;
            
            if((stateFlags & (TFF_WAITING|TFF_MOVING)) == 0)
            {
                self.AnimState().Set(anim_liftLower, 4.0f, ANF_LOOP);
                stateFlags |= TFF_WAITING;
                
                if(self.SpawnParams(7) == -1)
                {
                    delayTime = -1.0f;
                }
                else
                {
                    delayTime = float(self.SpawnParams(7) * 15);
                }
            }
        }
    }
};

//-----------------------------------------------------------------------------
//
// Timer Event (No Activation)
//
//-----------------------------------------------------------------------------

/*
==============================================================
TurokTimerEventConstant
==============================================================
*/

class TurokTimerEventConstant : BPR::CL_BPR_WorldObject //[BP_Randomizer]
{
    float   delayTime;
    int     stateFlags;
    kActor  @self;
    
    TurokTimerEventConstant(kActor @actor)
    {
		super(actor); //[BP_Randomizer]
        @self = actor;
        stateFlags = 0;
        delayTime = 0;
    }
    
    /*
    ==============================================================
    MeleeVeryWimpy
    ==============================================================
    */
    
    void MeleeVeryWimpy(kActor @instigator, const float w, const float x, const float y, const float z)
    {
        self.MeleeObject("Damage_Generic_1", kVec3(x, y, z), w);
    }
    
    /*
    ==============================================================
    OnSpawn
    ==============================================================
    */
    
    void OnSpawn(void)
    {
    }
    
    /*
    ==============================================================
    OnTick
    ==============================================================
    */
    
    void OnTick(void)
    {
        if(self.SectorIndex() <= -1)
        {
            return;
        }
        
        if((stateFlags & TFF_ACTIVATED) == 0)
        {
            self.AnimState().Set(anim_timerStart, 8.0f, ANF_LOOP);
            delayTime = float(self.SpawnParams(7) * 15);
            stateFlags |= (TFF_ACTIVATED|TFF_WAITING);
        }
        else if((stateFlags & TFF_WAITING) != 0)
        {
            if(delayTime <= 0.0f)
            {
                stateFlags &= ~TFF_WAITING;
                stateFlags |= TFF_MOVING;
                delayTime = float(self.SpawnParams(4) * 15);
                self.AnimState().Set(anim_timerIdle, 8.0f, ANF_LOOP);
            }
            else
            {
                delayTime -= GAME_FRAME_TIME;
            }
        }
        else if((stateFlags & TFF_MOVING) != 0)
        {
            if(delayTime <= 0.0f)
            {
                stateFlags &= ~TFF_MOVING;
                stateFlags |= TFF_WAITING;
                delayTime = float(self.SpawnParams(7) * 15);
                self.AnimState().Set(anim_timerStart, 8.0f, ANF_LOOP);
            }
            else
            {
                delayTime -= GAME_FRAME_TIME;
            }
        }
    }
};

//-----------------------------------------------------------------------------
//
// Pressure Event
//
//-----------------------------------------------------------------------------

/*
==============================================================
TurokPressureEvent
==============================================================
*/

class TurokPressureEvent : BPR::CL_BPR_WorldObject //[BP_Randomizer]
{
    float   delayTime;
    int     currentTime;
    int     stateFlags;
    kActor  @self;
    
    TurokPressureEvent(kActor @actor)
    {
		super(actor); //[BP_Randomizer]
        @self = actor;
        stateFlags = 0;
        delayTime = 0;
        currentTime = 0;
    }
    
    /*
    ==============================================================
    OnSpawn
    ==============================================================
    */
    
    void OnSpawn(void)
    {
    }
    
    /*
    ==============================================================
    OnTick
    ==============================================================
    */
    
    void OnTick(void)
    {
        if(self.SectorIndex() <= -1)
        {
            return;
        }
        
        self.Flags() &= ~AF_ACTIVATED;
        
        if((stateFlags & TFF_ACTIVATED) == 0)
        {
            self.AnimState().Set(anim_trapIdle, 4.0f, 0);
            stateFlags |= TFF_ACTIVATED;
            delayTime = 0.0f;
        }
        else if((stateFlags & TFF_WAITING) != 0)
        {
            delayTime -= GAME_FRAME_TIME;
            
            if(delayTime < 0.0f)
            {
                // message received?
                if(currentTime != 0)
                {
                    self.AnimState().Set(anim_trapActivate, 4.0f, ANF_LOOP);
                    stateFlags &= ~TFF_WAITING;
                    stateFlags |= TFF_MOVING;
                }
                else
                {
                    // restart it
                    stateFlags &= ~(TFF_MOVING|TFF_WAITING|TFF_ACTIVATED);
                }
            }
        }
        else
        {
            if(currentTime == 0)
            {
                stateFlags &= ~(TFF_MOVING|TFF_WAITING|TFF_ACTIVATED);
            }
        }
        
        if(currentTime != 0)
        {
            currentTime--;
        }
    }
    
    /*
    ==============================================================
    OnActivate
    ==============================================================
    */
    
    void OnActivate(void)
    {
        if(self.SectorIndex() <= -1)
        {
            return;
        }
        
        if((stateFlags & TFF_ACTIVATED) != 0)
        {
            currentTime = 2;
            
            if((stateFlags & (TFF_WAITING|TFF_MOVING)) == 0)
            {
                stateFlags |= TFF_WAITING;
                delayTime = float(self.SpawnParams(7) * 15);
            }
        }
    }
};
