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

#include "scripts/misc/traps.txt"
#include "scripts/misc/portalHub.txt"
#include "scripts/misc/mantisObjects.txt"
#include "scripts/misc/destructibles.txt"
#include "scripts/misc/catacombWater.txt"
#include "scripts/misc/giblet.txt"
#include "scripts/misc/quakeSource.txt"
#include "scripts/misc/warpPortal.txt"
#include "scripts/misc/levelPortal.txt"
#include "scripts/misc/iggy.txt"

#include "scripts/movers/door.txt"
#include "scripts/movers/seqEvent.txt"
#include "scripts/movers/floor.txt"

#include "scripts/enemy/enemy.txt"
#include "scripts/enemy/grunt.txt"
#include "scripts/enemy/alien.txt"
#include "scripts/enemy/insect.txt"
#include "scripts/enemy/purlin.txt"
#include "scripts/enemy/raptor.txt"
#include "scripts/enemy/rider.txt"
#include "scripts/enemy/sandworm.txt"
#include "scripts/enemy/turret.txt"
#include "scripts/enemy/sentry.txt"
#include "scripts/enemy/sewerCrab.txt"

#include "scripts/player.txt"
#include "scripts/weapons.txt"
#include "scripts/pickupSpawner.txt"

#include "scripts/bosses/hummer.txt"
#include "scripts/bosses/longhunter.txt"
#include "scripts/bosses/mantis.txt"
#include "scripts/bosses/trex.txt"
#include "scripts/bosses/campainger.txt"
#include "scripts/bosses/BP_SpiritCampainger.txt"

#include "scripts/BP_common.txt"
#include "scripts/BP_SoundOnce.txt"
#include "scripts/BP_Bit.txt"
#include "scripts/BP_ArrowProjectile.txt"
#include "scripts/BP_RopeProjectile.txt"
#include "scripts/BP_AdonRopeProjectile.txt"
#include "scripts/BP_EventLink.txt"
#include "scripts/BP_WayPoint.txt"
#include "scripts/BP_SpawnerMP.txt"

#include "scripts/pickups/BP_Pickup.txt"
#include "scripts/pickups/BP_KeyPickup.txt"
#include "scripts/pickups/BP_PickupLavaArmor.txt"
#include "scripts/pickups/BP_PickupSpeed.txt"
#include "scripts/pickups/BP_PickupDefense.txt"
#include "scripts/pickups/BP_PickupWeapon.txt"
#include "scripts/pickups/BP_PickupNormWeapon.txt"
#include "scripts/pickups/BP_LifeForce1.txt"
#include "scripts/pickups/BP_LifeForce10.txt"
#include "scripts/pickups/BP_PickupFeather.txt"
#include "scripts/pickups/BP_PickupN.txt"
#include "scripts/pickups/BP_PickupHealth.txt"

#include "scripts/bosses/BP_longhunter.txt"
#include "scripts/bosses/BP_trex.txt"
#include "scripts/bosses/BP_campainger.txt"
#include "scripts/bosses/BP_mantis.txt"
#include "scripts/bosses/BP_hummer.txt"
#include "scripts/BP_RopePoint.txt"
#include "scripts/BP_DeadEnemy.txt"
#include "scripts/BP_DeadGrunt.txt"
#include "scripts/movers/floorwater.txt"
#include "scripts/BP_QuakeSource.txt"
#include "scripts/BP_Visible.txt"
#include "scripts/BP_ProjectileTrap.txt"
#include "scripts/misc/BP_FallingRocks.txt"
#include "scripts/pickups/BP_PickupSpecial.txt"
#include "scripts/pickups/BP_PickupChrono.txt"
#include "scripts/BP_SpecialStatue.txt"
#include "scripts/bosses/BP_FirebornBoss.txt"
#include "scripts/misc/BP_FireRock.txt"
#include "scripts/misc/BP_FireStag.txt"
#include "scripts/misc/BP_RollingRock.txt"
#include "scripts/misc/BP_Jumppad.txt"
#include "scripts/enemy/BP_SStatue.txt"
#include "scripts/enemy/BP_Tank.txt"
#include "scripts/misc/BP_FlyingDino.txt"
#include "scripts/misc/BP_Tunnel_Debris.txt"
#include "scripts/misc/BP_Tunnel_Ramp.txt"
#include "scripts/misc/BP_Tunnel_Health.txt"

//------------------------------------------------------------------------------------------------------------------------
void AddShakePoint(kActor @actor, const float duration)
{
	AddShakePoint(actor.Origin(), actor.SectorIndex(), duration);
}
//------------------------------------------------------------------------------------------------------------------------
void AddShakePoint(kVec3 point, const int sectorID, const float duration)
{
	kActor @qActor = ActorFactory.Spawn("BP_QuakeSource", 0, 0, 0, 0, sectorID);
	BP_QuakeSource @quake;

	if (qActor is null)
	{
		return;
	}

	@quake = cast<BP_QuakeSource@>(qActor.ScriptObject().obj);
	
	if (quake is null)
	{
		return;
	}

	quake.SetupShake(point, 1.125f * GAME_SCALE, -0.1048f, duration);
}
//------------------------------------------------------------------------------------------------------------------------
funcdef void VARFUNC(const kStr &in, const kStr &in);

class VarFunctor
{
    void Add(const kStr &in gameVar, const kStr &in value)
    {
        GameVariables.Add(gameVar, value);
    }
    
    void SetValue(const kStr &in gameVar, const kStr &in value)
    {
        GameVariables.SetValue(gameVar, value);
    }
};
//------------------------------------------------------------------------------------------------------------------------
void InitHummer1StateVars(VARFUNC @setFunc)
{
    setFunc("hummer1State", "0");
    setFunc("hummer1Health", "0");
    setFunc("hummer1Sector", "-1");
    setFunc("hummer1Origin", "0.0 0.0 0.0");
    setFunc("hummer1Yaw", "0.0");
}
//------------------------------------------------------------------------------------------------------------------------
void InitHummer2StateVars(VARFUNC @setFunc)
{
    setFunc("hummer2State", "0");
    setFunc("hummer2Health", "0");
    setFunc("hummer2Sector", "-1");
    setFunc("hummer2Origin", "0.0 0.0 0.0");
    setFunc("hummer2Yaw", "0.0");
}
//------------------------------------------------------------------------------------------------------------------------
void InitLongHunterStateVars(VARFUNC @setFunc)
{
    setFunc("longHunterState", "0");
    setFunc("longHunterHealth", "0");
    setFunc("longHunterSector", "-1");
    setFunc("longHunterOrigin", "0.0 0.0 0.0");
    setFunc("longHunterYaw", "0.0");
    setFunc("longHunterObservationPoint", "0");
}
//------------------------------------------------------------------------------------------------------------------------
void InitMantisStateVars(VARFUNC @setFunc)
{
    setFunc("mantisState", "0");
    setFunc("mantisHealth", "0");
    setFunc("mantisSector", "-1");
    setFunc("mantisOrigin", "0.0 0.0 0.0");
    setFunc("mantisYaw", "0.0");
    setFunc("mantisWallBits", "0");
    setFunc("mantisActive", "0");
}
//------------------------------------------------------------------------------------------------------------------------
void InitTRexStateVars(VARFUNC @setFunc)
{
    setFunc("trexState",  "0");
    setFunc("trexHealth", "0");
}
//------------------------------------------------------------------------------------------------------------------------
void InitCampaignerStateVars(VARFUNC @setFunc)
{
    setFunc("campaignerState",  "0");
    setFunc("campaignerHealth", "0");
}
//------------------------------------------------------------------------------------------------------------------------
void InitCustomStateVars(VARFUNC @setFunc)
{
    setFunc("bStartedHubIntro", "0");
    setFunc("lastPortalWarpChoice", "0");
    setFunc("chronoPieceFlags", "0");
    setFunc("hubPanelPieces1", "0");
    setFunc("hubPanelPieces2", "0");
    setFunc("hubPanelPieces3", "0");
    setFunc("hubPanelPieces4", "0");
    setFunc("hubPanelPieces5", "0");
    setFunc("hubPanelPieces6", "0");
    setFunc("hubPanelPieces7", "0");
    setFunc("bGotLonghunterKey", "0");
    setFunc("bGotMantisKey", "0");
}
//------------------------------------------------------------------------------------------------------------------------
void SetStateVars(VARFUNC @setFunc)
{
	InitCustomStateVars(setFunc);
    InitHummer1StateVars(setFunc);
    InitHummer2StateVars(setFunc);
    InitLongHunterStateVars(setFunc);
    InitMantisStateVars(setFunc);
    InitTRexStateVars(setFunc);
    InitCampaignerStateVars(setFunc);
	
	setFunc("BP_Version", "" + BP_VERSION);
	setFunc("BP_StartDif", "2");
	setFunc("BP_Started", "0");
	setFunc("BP_Keys", "0");
	setFunc("BP_Progress", "0");
	setFunc("BP_PlayerDefense", "0.0");
	setFunc("BP_PlayerSpeed", "0.0");
	setFunc("BP_PlayerLava", "0");
	setFunc("BP_PlayerChrono", "0");
	setFunc("BP_PlayerFlute", "0");
	setFunc("BP_Music", "0");
	setFunc("BP_DefensePickups", "0");
	setFunc("BP_SpeedPickups", "0");
	setFunc("BP_SpecialPickups", "0");
	setFunc("BP_Kills", "0");
	setFunc("BP_Deaths", "0");
	setFunc("BP_Secrets", "0");
	setFunc("BP_Feathers", "0");
	setFunc("BP_Time", "0");
	setFunc("BP_Lifeforce", "0");
	setFunc("BP_Character", "0");
	setFunc("BP_LHState", "0");
	setFunc("BP_LHHealth", "1640");
	setFunc("BP_FBBossStarted", "0");
	setFunc("BP_FBBossHealth", "0");
	setFunc("BP_SysFlags", "0");
	setFunc("BP_MinigunCount", "0");
	setFunc("BP_WeaponUpgrades", "0");
	setFunc("BP_N", "0");
	setFunc("BP_ChronoTime", "0");
}
//------------------------------------------------------------------------------------------------------------------------
void SetLifeForce(int amount)
{
	if (amount >= 100)
	{
		amount %= 100;
		if (Player.Actor() !is null)
		{
			TurokPlayer @playerScript = cast<TurokPlayer@>(Player.Actor().CastToActor().ScriptObject().obj);
			if (playerScript !is null)
			{
				playerScript.PlayRegenSound();
			}
		}
	}
	GameVariables.SetValue("BP_Lifeforce", "" + amount);
}
//------------------------------------------------------------------------------------------------------------------------
void newgame(void)
{
    // set all variables back to their default values
    VarFunctor functor;
    SetStateVars(VARFUNC(functor.SetValue));
}
//------------------------------------------------------------------------------------------------------------------------
void main(void)
{
	kStr szShowIntros;

    //
    // add game variables at startup
    //
    
    // variables which are once-only should be added here
    GameVariables.Add("bStartedIntro", "0");
	GameVariables.Add("BP_UnlockedCharacters", "1");
	GameVariables.Add("BP_Cheats", "0");
	
    
    // everything else, including anything that ought to be
    // reinitialized when a new game starts, should be added
    // in here.
    VarFunctor functor;
    SetStateVars(VARFUNC(functor.Add));
    
    // config startmap and trainingmap variables
    // note: these are created by the engine during initialization
    GameVariables.SetValue("g_startmap", "levels/00.map");
    GameVariables.SetValue("g_restartmap", "levels/level42.map");
    GameVariables.SetValue("g_trainingmap", "levels/23.map");
    GameVariables.SetValue("g_creditsmap", "levels/level02.map");
    GameVariables.SetValue("g_hubmapid", "5");
    GameVariables.SetValue("g_hubwarptid", "10666");
    
    // show intro cinematics?
    if(Sys.GetCvarValue("g_showgameintros", szShowIntros))
    {
        if(szShowIntros.Atoi() == 0)
        {
            // skip directly to title
            Game.ChangeMap("levels/level42.map");
            return;
        }
    }
    
    Game.ChangeMap("levels/level45.map");
	
}
//------------------------------------------------------------------------------------------------------------------------
