//
// 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:
//      Energy Totem behavior logic
//

const uint8 TOTEM_STATUS_INCOMPLETE     = 0;
const uint8 TOTEM_STATUS_SUCCESSFUL     = 1;
const uint8 TOTEM_STATUS_UNSUCCESSFUL   = 2;
const uint8 TOTEM_STATUS_DONE           = 3;

#define TOTEM_TIME              120
#define TOTEM_TOTAL_ENEMIES     8

#define TOTEM_MODEL_DAMAGED     1
#define TOTEM_MODEL_DESTROYED   2

#define TOTEM_ANIM_DAMAGED      ANIM_DESTRUCTIBLE_IDLE2
#define TOTEM_ANIM_DESTROYED    ANIM_DESTRUCTIBLE_IDLE3
#define TOTEM_ANIM_ACTIVATED    ANIM_DESTRUCTIBLE_IDLE4

/*
==============================================================
TurokTotem
==============================================================
*/

class TurokTotem : ScriptObject
{
    kActor@     self;
    uint32      m_dwRemainingEnemies;
    uint32      m_dwTime;
    uint8       m_enemiesGoingAfterPlayer;
    float       m_fTime;
    uint8       m_status;
    
    TurokTotem(kActor@ actor)
    {
        @self = actor;
        m_dwTime = TOTEM_TIME;
        m_dwRemainingEnemies = 8;
        m_enemiesGoingAfterPlayer = 1;
        m_fTime = 0.0f;
        m_status = TOTEM_STATUS_INCOMPLETE;
    }
    
    // ------------------------------------------
    void OnSpawn(void)
    {
		SetMissionSucessful();
    }
    
    // ------------------------------------------
    void OnSerialize(kDict& out dict)
    {
        SERIALIZE(m_dwRemainingEnemies);
        SERIALIZE(m_dwTime);
        SERIALIZE(m_enemiesGoingAfterPlayer);
        SERIALIZE(m_fTime);
        SERIALIZE(m_status);
    }
    
    // ------------------------------------------
    void OnDeserialize(kDict& in dict)
    {
        DESERIALIZE_INT(m_dwRemainingEnemies);
        DESERIALIZE_INT(m_dwTime);
        DESERIALIZE_INT(m_enemiesGoingAfterPlayer);
        DESERIALIZE_FLOAT(m_fTime);
        DESERIALIZE_INT(m_status);
    }
    
    // ------------------------------------------
    void SetMissionSucessful(void)
    {
		if (m_status != TOTEM_STATUS_DONE)
		{
			m_status = TOTEM_STATUS_DONE;
			Hud.DisableBar(0);
			Hud.DisableBar(1);
			
			// give the player a cookie for doing a good job
			LocalPlayer.Inventory().Give(kActor_Misc_TotemInventory);
			
			switch(Game.ActiveMapID())
			{
			case kLevel_PortOfAdia_Totem:
				DoPlayerWarp(0, 11999, kLevel_Hub, true);
				break;
				
			case kLevel_RiverOfSouls_Totem:
				DoPlayerWarp(0, 12999, kLevel_Hub, true);
				break;
				
			case kLevel_DeathMarsh_Totem:
				DoPlayerWarp(0, 13999, kLevel_Hub, true);
				break;
				
			case kLevel_BlindLair_Totem:
				DoPlayerWarp(0, 17401, kLevel_BlindOneBoss, true);
				break;
				
			case kLevel_Hive_Totem:
				DoPlayerWarp(0, 17501, kLevel_QueenBoss, true);
				break;
				
			default:
				break;
			}
		}
    }

    // ------------------------------------------
    void OnTick(void)
    {
		SetMissionSucessful();
    }
};
