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

#include "scripts/Math.txt"
#include "scripts/Input.txt"

#include "scripts/misc/ChallengeKey.txt"
#include "scripts/misc/ChallengeTotem.txt"
#include "scripts/misc/ChallengeKeyKnife.txt"
#include "scripts/misc/ChallengeTotemKnife.txt"
#include "scripts/misc/ChallengeKeyBow.txt"
#include "scripts/misc/ChallengeTotemBow.txt"
#include "scripts/misc/ChallengeKeyPistol.txt"
#include "scripts/misc/ChallengeTotemPistol.txt"

// #include "scripts/test.txt"

#include "scripts/misc/BPVillager.txt"
#include "scripts/misc/flipPitch.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/misc/shopPoint.txt"
#include "scripts/misc/shopPointExit.txt"
#include "scripts/misc/FireEmitTall.txt"
#include "scripts/misc/WeaponRemove.txt"

#include "scripts/misc/menu.txt"
#include "scripts/misc/MenuItem.txt"
#include "scripts/misc/MenuProgress.txt"
#include "scripts/misc/MenuShop.txt"

#include "scripts/misc/shopProgressArea.txt"
#include "scripts/misc/shopBuyAreaLives.txt"
#include "scripts/misc/shopBuyAreaJump.txt"
#include "scripts/misc/shopBuyAreaFullHealth.txt"
#include "scripts/misc/shopBuyAreaUltraHealth.txt"
#include "scripts/misc/shopBuyAreaArmor.txt"
#include "scripts/misc/shopBuyAreaBackpack.txt"
#include "scripts/misc/shopBuyAreaPistol.txt"
#include "scripts/misc/shopBuyAreaShotgun.txt"
#include "scripts/misc/shopBuyAreaMinigun.txt"
#include "scripts/misc/shopBuyAreaGrenade.txt"
#include "scripts/misc/shopBuyAreaLaser.txt"
#include "scripts/misc/shopBuyAreaRocket.txt"
#include "scripts/misc/spiritPickup.txt"
#include "scripts/misc/spiritPickup10.txt"
#include "scripts/misc/beamTrapVert.txt"
#include "scripts/misc/beamTrapHorzX.txt"
#include "scripts/misc/beamTrapHorzY.txt"
#include "scripts/misc/ArrowPickup.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/enemy/BPEnemy.txt"
#include "scripts/enemy/BPGrunt.txt"
#include "scripts/enemy/BPGruntMelee.txt"
#include "scripts/enemy/BPGruntRange.txt"
#include "scripts/enemy/BPGruntGuardRange.txt"
#include "scripts/enemy/BPGruntGuardGrenade.txt"
#include "scripts/enemy/BPRaptor.txt"
#include "scripts/enemy/BPPurlin.txt"
#include "scripts/enemy/BPPurlinCommonMelee.txt"
#include "scripts/enemy/BPPurlinBoss.txt"
#include "scripts/enemy/BPHead.txt"
#include "scripts/enemy/BPIzzie.txt"
#include "scripts/enemy/BPStalker.txt"
#include "scripts/enemy/BPBeetle.txt"

#include "scripts/monkey.txt"

#include "scripts/misc/BPPickupSpawner.txt"
#include "scripts/pickups/BPArrowsPickup.txt"
#include "scripts/pickups/BPCellPickup.txt"
#include "scripts/pickups/BPClipPickup.txt"
#include "scripts/pickups/BPGrenadesPickup.txt"
#include "scripts/pickups/BPHealthPickup.txt"
#include "scripts/pickups/BPMinigunAmmoPickup.txt"
#include "scripts/pickups/BPRocketsPickup.txt"
#include "scripts/pickups/BPShellsPickup.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"


/*
==============================================================
VarFunctor
==============================================================
*/

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

/*
==============================================================
InitHummer1StateVars
==============================================================
*/

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

/*
==============================================================
InitHummer2StateVars
==============================================================
*/

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

/*
==============================================================
InitLongHunterStateVars
==============================================================
*/

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

/*
==============================================================
InitMantisStateVars
==============================================================
*/

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

/*
==============================================================
InitTRexStateVars
==============================================================
*/

void InitTRexStateVars(VARFUNC @setFunc)
{
    setFunc("trexState",  "0");
    setFunc("trexHealth", "0");
}

/*
==============================================================
InitCampaignerStateVars
==============================================================
*/

void InitCampaignerStateVars(VARFUNC @setFunc)
{
    setFunc("campaignerState",  "0");
    setFunc("campaignerHealth", "0");
}

/*
==============================================================
InitCustomStateVars
==============================================================
*/

void InitCustomStateVars(VARFUNC @setFunc)
{
    // add custom game variables here
    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");
	
    setFunc("BP.Money", "0");
    setFunc("BP.JumpPower", "0");
	setFunc("BP.GotKey1a", "0");
	setFunc("BP.PPKey1a", "0");
	setFunc("BP.intro1", "0");
	setFunc("BP.NoMovePos", "0.0 0.0 0.0");
	setFunc("BP.shopintro", "0");
	setFunc("BP.introdeath", "0");
	setFunc("BP.level3MBDead", "0");
	setFunc("BP.reachedEnd", "0");
	
	setFunc("BP.ShopWarpPos", "0.0 0.0 0.0");
	setFunc("BP.ShopWarpSector", "0");
	setFunc("BP.ShopWarpYaw", "0.0");
	setFunc("BP.ShopWarpMap", "0");
	
	setFunc("BP.ArenaWarpPos", "0.0 0.0 0.0");
	setFunc("BP.ArenaWarpSector", "0");
	setFunc("BP.ArenaWarpYaw", "0.0");
	setFunc("BP.ArenaWarpMap", "0");
	setFunc("BP.ArenaCinID", "1");

	setFunc("BP.ChallengeWarpPos", "0.0 0.0 0.0");
	setFunc("BP.ChallengeWarpSector", "0");
	setFunc("BP.ChallengeWarpYaw", "0.0");
	setFunc("BP.ChallengeWarpMap", "0");
	setFunc("BP.ChallengeID", "0");
	
	setFunc("BP.ArenaEnterCin1", "0");
	setFunc("BP.ArenaEnterCin2", "0");
	setFunc("BP.ArenaEnterCin3", "0");
	setFunc("BP.ArenaEnterCin4", "0");
	setFunc("BP.ArenaEnterCin5", "0");
	setFunc("BP.ArenaEnterCin6", "0");
	setFunc("BP.ArenaEnterCin7", "0");
	setFunc("BP.ArenaEnterCin8", "0");
	setFunc("BP.ArenaEnterCin9", "0");
	setFunc("BP.ArenaEnterCin10", "0");
	setFunc("BP.ArenaEnterCin11", "0");
	setFunc("BP.ArenaEnterCin12", "0");
	setFunc("BP.ArenaEnterCin13", "0");
	setFunc("BP.ArenaEnterCin14", "0");
	setFunc("BP.ArenaEnterCin15", "0");
	setFunc("BP.ArenaEnterCin16", "0");
	setFunc("BP.ArenaEnterCin17", "0");
	setFunc("BP.ArenaEnterCin18", "0");
	
	setFunc("BP.challengeintro", "0");
	
	setFunc("BP.ChallengeKey1", "0");
	setFunc("BP.ChallengeKey2", "0");
	setFunc("BP.ChallengeKey3", "0");
	setFunc("BP.ChallengeKey4", "0");
	setFunc("BP.ChallengeKey5", "0");
	setFunc("BP.ChallengeKey6", "0");
	setFunc("BP.ChallengeKey7", "0");
	setFunc("BP.ChallengeKey8", "0");
	
	setFunc("BP.UpgradeKnife", "0");
	setFunc("BP.UpgradeBow", "0");
	setFunc("BP.UpgradePistol", "0");
	setFunc("BP.UpgradeShotgun", "0");
	setFunc("BP.UpgradeMinigun", "0");
	setFunc("BP.UpgradeGrenade", "0");
	setFunc("BP.UpgradeLaser", "0");
	setFunc("BP.UpgradeRocket", "0");
	
	setFunc("BP.MonkeyIntro", "0");
	setFunc("BP.MonkeysL1", "0");
	setFunc("BP.MonkeysL2", "0");
	setFunc("BP.MonkeysL3", "0");
	setFunc("BP.MonkeysL4", "0");
	setFunc("BP.MonkeysL5", "0");
	setFunc("BP.MonkeysL6", "0");
	setFunc("BP.MonkeysL7", "0");
	
	setFunc("BP.LivesBought", "0");
	
	setFunc("BP.EnabledWeaponType", "0");
	
	setFunc("BP.flags", "0"); //del
	setFunc("BP.clipflags", "0"); //del
}

/*
==============================================================
SetStateVars
==============================================================
*/

void SetStateVars(VARFUNC @setFunc)
{
    // Add any function doing game variable init here.
    InitCustomStateVars(setFunc);
    InitHummer1StateVars(setFunc);
    InitHummer2StateVars(setFunc);
    InitLongHunterStateVars(setFunc);
    InitMantisStateVars(setFunc);
    InitTRexStateVars(setFunc);
    InitCampaignerStateVars(setFunc);
}

/*
==============================================================
newgame
==============================================================
*/

void newgame(void)
{
    // set all variables back to their default values
    VarFunctor functor;
    SetStateVars(VARFUNC(functor.SetValue));
}

/*
==============================================================
main
==============================================================
*/

void main(void)
{
    kStr szShowIntros;

    //
    // add game variables at startup
    //
    
    // variables which are once-only should be added here
    GameVariables.Add("bStartedIntro", "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/level05.map");
    GameVariables.SetValue("g_restartmap", "levels/level42.map");
    GameVariables.SetValue("g_trainingmap", "levels/level47.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");
}
