include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"



include "LibHNXH_h"



//--------------------------------------------------------------------------------------------------

// Library: NexusHunter

//--------------------------------------------------------------------------------------------------

// External Library Initialization

void libHNXH_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

}



// Variable Initialization

bool libHNXH_InitVariables_completed = false;



void libHNXH_InitVariables () {

    int init_i;



    if (libHNXH_InitVariables_completed) {

        return;

    }



    libHNXH_InitVariables_completed = true;



    for (init_i = 0; init_i <= libCore_gv_bALMaxPlayers; init_i += 1) {

        libHNXH_gv_NexusHunterEnemyHeroes[init_i] = UnitGroupEmpty();

    }

}



// Functions

void libHNXH_gf_HeroNexusHunterIncrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHNXH_gv_heroNexusHunterTriggerRegistrationVariable += 1;

    if ((libHNXH_gv_heroNexusHunterTriggerRegistrationVariable == 1)) {

    }



}



void libHNXH_gf_HeroNexusHunterDecrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHNXH_gv_heroNexusHunterTriggerRegistrationVariable -= 1;

    if ((libHNXH_gv_heroNexusHunterTriggerRegistrationVariable < 0)) {

        libHNXH_gv_heroNexusHunterTriggerRegistrationVariable = 0;

    }



    if ((libHNXH_gv_heroNexusHunterTriggerRegistrationVariable == 0)) {

    }



}



void libHNXH_gf_NexusHunterApplyEnemyTokenCounterForPlayer (int lp_playerNumber) {

    // Variable Declarations

    unit lv_NexusHunterUnit;



    // Automatic Variable Declarations

    playergroup auto4F63B540_g;

    int auto4F63B540_var;



    // Variable Initialization

    lv_NexusHunterUnit = libGame_gv_players[lp_playerNumber].lv_heroUnit;



    // Implementation

    UnitGroupClear(libHNXH_gv_NexusHunterEnemyHeroes[lp_playerNumber]);

    auto4F63B540_g = libGame_gv_teams[libGame_gf_EnemyTeamNumberOfPlayer(lp_playerNumber)].lv_teamPlayerGroup;

    auto4F63B540_var = -1;

    while (true) {

        	auto4F63B540_var = PlayerGroupNextPlayer(auto4F63B540_g, auto4F63B540_var);

        	if (auto4F63B540_var<0) { break; }

        	UnitBehaviorAdd(libGame_gv_players[auto4F63B540_var].lv_heroUnit, "NexusHunterHuntersVengeanceTargetTrackQuestToken", lv_NexusHunterUnit, 1);

        UnitBehaviorAdd(libGame_gv_players[auto4F63B540_var].lv_heroUnit, "NexusHunterHuntersVengeanceOwnershipTargetBehavior", lv_NexusHunterUnit, 1);

        UnitGroupAdd(libHNXH_gv_NexusHunterEnemyHeroes[lp_playerNumber], libGame_gv_players[auto4F63B540_var].lv_heroUnit);

    }

}



// Triggers

//--------------------------------------------------------------------------------------------------

// Trigger: NexusHunter - Hunter's Vengeance - NexusHunter Spawn (Normal)

//--------------------------------------------------------------------------------------------------

bool libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnNormal_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_player;

    unit lv_heroUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_player = libGame_gf_HeroSpawnPlayer();

    lv_heroUnit = libGame_gv_players[lv_player].lv_heroUnit;



    // Conditions

    if (testConds) {

        if (!((UnitGetType(lv_heroUnit) == "HeroNexusHunter"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    libHNXH_gv_NexusHunterInitializeNexusHunterCount += 1;

    libHNXH_gv_NexusHunterInitializedNexusHunter[libHNXH_gv_NexusHunterInitializeNexusHunterCount] = lv_player;

    libHNXH_gf_NexusHunterApplyEnemyTokenCounterForPlayer(lv_player);

    return true;

}



//--------------------------------------------------------------------------------------------------

void libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnNormal_Init () {

    libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnNormal = TriggerCreate("libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnNormal_Func");

    TriggerEnable(libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnNormal, false);

    libGame_gf_HeroSpawn(libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnNormal);

}



//--------------------------------------------------------------------------------------------------

// Trigger: NexusHunter - Hunter's Vengeance - NexusHunter Spawn (Debug)

//--------------------------------------------------------------------------------------------------

bool libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnDebug_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_player;

    unit lv_heroUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_player = libGame_gf_DebugHeroSwappedPlayer();

    lv_heroUnit = libGame_gv_players[lv_player].lv_heroUnit;



    // Conditions

    if (testConds) {

        if (!((UnitGetType(lv_heroUnit) == "HeroNexusHunter"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    libHNXH_gv_NexusHunterInitializeNexusHunterCount += 1;

    libHNXH_gv_NexusHunterInitializedNexusHunter[libHNXH_gv_NexusHunterInitializeNexusHunterCount] = lv_player;

    libHNXH_gf_NexusHunterApplyEnemyTokenCounterForPlayer(lv_player);

    return true;

}



//--------------------------------------------------------------------------------------------------

void libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnDebug_Init () {

    libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnDebug = TriggerCreate("libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnDebug_Func");

    TriggerEnable(libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnDebug, false);

    libGame_gf_DebugHeroSwapped(libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnDebug);

}



//--------------------------------------------------------------------------------------------------

// Trigger: NexusHunter - Hunter's Vengeance - Add Targets on Game Start

//--------------------------------------------------------------------------------------------------

bool libHNXH_gt_NexusHunterHuntersVengeanceAddTargetsonGameStart_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    int autoB0A6C146_ae;

    int autoB0A6C146_var;



    // Actions

    if (!runActions) {

        return true;

    }



    autoB0A6C146_ae = libHNXH_gv_NexusHunterInitializeNexusHunterCount;

    autoB0A6C146_var = 1;

    for ( ; autoB0A6C146_var <= autoB0A6C146_ae; autoB0A6C146_var += 1 ) {

        libHNXH_gf_NexusHunterApplyEnemyTokenCounterForPlayer(libHNXH_gv_NexusHunterInitializedNexusHunter[autoB0A6C146_var]);

    }

    return true;

}



//--------------------------------------------------------------------------------------------------

void libHNXH_gt_NexusHunterHuntersVengeanceAddTargetsonGameStart_Init () {

    libHNXH_gt_NexusHunterHuntersVengeanceAddTargetsonGameStart = TriggerCreate("libHNXH_gt_NexusHunterHuntersVengeanceAddTargetsonGameStart_Func");

    TriggerEnable(libHNXH_gt_NexusHunterHuntersVengeanceAddTargetsonGameStart, false);

    libGame_gf_HeroSpawn(libHNXH_gt_NexusHunterHuntersVengeanceAddTargetsonGameStart);

}



//--------------------------------------------------------------------------------------------------

// Trigger: NexusHunter - Hunter's Vengeance - Hero Takedown

//--------------------------------------------------------------------------------------------------

bool libHNXH_gt_NexusHunterHuntersVengeanceHeroTakedown_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_killingUnit;

    unit lv_killedUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_killingUnit = libGame_gv_players[libGame_gf_HeroParticipatedInTakedownKillingPlayer()].lv_heroUnit;

    lv_killedUnit = libGame_gv_players[libGame_gf_HeroParticipatedInTakedownKilledPlayer()].lv_heroUnit;



    // Conditions

    if (testConds) {

        if (!((UnitGetType(lv_killingUnit) == "HeroNexusHunter"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    UnitCreateEffectUnit(lv_killingUnit, "NexusHunterHuntersVengeanceTargetTrackAddMaxToken", lv_killedUnit);

    return true;

}



//--------------------------------------------------------------------------------------------------

void libHNXH_gt_NexusHunterHuntersVengeanceHeroTakedown_Init () {

    libHNXH_gt_NexusHunterHuntersVengeanceHeroTakedown = TriggerCreate("libHNXH_gt_NexusHunterHuntersVengeanceHeroTakedown_Func");

    TriggerEnable(libHNXH_gt_NexusHunterHuntersVengeanceHeroTakedown, false);

    libGame_gf_HeroParticipatedInTakedown(libHNXH_gt_NexusHunterHuntersVengeanceHeroTakedown);

}



//--------------------------------------------------------------------------------------------------

// Trigger: Hero - NexusHunter - Final Strike - Turn Triggers On

//--------------------------------------------------------------------------------------------------

bool libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOn_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_player;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_player = UnitGetOwner(EventUnit());



    // Actions

    if (!runActions) {

        return true;

    }



    libHNXH_gv_heroNexusHunterIsPlayerCastingFinalStrike[lv_player] = true;

    libHNXH_gv_heroNexusHunterActiveFinalStrikeCasters += 1;

    TriggerEnable(libHNXH_gt_HeroNexusHunterFinalStrikeCasterClicked, true);

    return true;

}



//--------------------------------------------------------------------------------------------------

void libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOn_Init () {

    libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOn = TriggerCreate("libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOn_Func");

    TriggerEnable(libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOn, false);

    TriggerAddEventUnitBehaviorChange(libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOn, null, "NexusHunterFinalStrikeChanneling", c_unitBehaviorChangeCreate);

}



//--------------------------------------------------------------------------------------------------

// Trigger: Hero - NexusHunter - Final Strike - Turn Triggers Off

//--------------------------------------------------------------------------------------------------

bool libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOff_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_player;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_player = UnitGetOwner(EventUnit());



    // Actions

    if (!runActions) {

        return true;

    }



    libHNXH_gv_heroNexusHunterIsPlayerCastingFinalStrike[lv_player] = false;

    libHNXH_gv_heroNexusHunterActiveFinalStrikeCasters -= 1;

    libHNXH_gv_heroNexusHunterActiveFinalStrikeCasters = libNtve_gf_ArithmeticIntClamp(libHNXH_gv_heroNexusHunterActiveFinalStrikeCasters, 0, 10);

    if ((libHNXH_gv_heroNexusHunterActiveFinalStrikeCasters == 0)) {

        TriggerEnable(libHNXH_gt_HeroNexusHunterFinalStrikeCasterClicked, false);

    }



    return true;

}



//--------------------------------------------------------------------------------------------------

void libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOff_Init () {

    libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOff = TriggerCreate("libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOff_Func");

    TriggerEnable(libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOff, false);

    TriggerAddEventUnitBehaviorChange(libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOff, null, "NexusHunterFinalStrikeChanneling", c_unitBehaviorChangeDestroy);

}



//--------------------------------------------------------------------------------------------------

// Trigger: Hero - NexusHunter - Final Strike - Caster Clicked

//--------------------------------------------------------------------------------------------------

bool libHNXH_gt_HeroNexusHunterFinalStrikeCasterClicked_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_player;

    unit lv_unit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_player = EventPlayer();

    lv_unit = libGame_gv_players[lv_player].lv_heroUnit;



    // Conditions

    if (testConds) {

        if (!((libHNXH_gv_heroNexusHunterIsPlayerCastingFinalStrike[lv_player] == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    if ((PlayerHasTalent(lv_player, "NexusHunterFinalStrike") == true)) {

        UnitIssueOrder(lv_unit, Order(AbilityCommand("AlarakDeadlyChargeExecute", 0)), c_orderQueueReplace);

    }



    return true;

}



//--------------------------------------------------------------------------------------------------

void libHNXH_gt_HeroNexusHunterFinalStrikeCasterClicked_Init () {

    libHNXH_gt_HeroNexusHunterFinalStrikeCasterClicked = TriggerCreate("libHNXH_gt_HeroNexusHunterFinalStrikeCasterClicked_Func");

    TriggerEnable(libHNXH_gt_HeroNexusHunterFinalStrikeCasterClicked, false);

}



void libHNXH_InitTriggers () {

    libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnNormal_Init();

    libHNXH_gt_NexusHunterHuntersVengeanceNexusHunterSpawnDebug_Init();

    libHNXH_gt_NexusHunterHuntersVengeanceAddTargetsonGameStart_Init();

    libHNXH_gt_NexusHunterHuntersVengeanceHeroTakedown_Init();

    libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOn_Init();

    libHNXH_gt_HeroNexusHunterFinalStrikeTurnTriggersOff_Init();

    libHNXH_gt_HeroNexusHunterFinalStrikeCasterClicked_Init();

}



//--------------------------------------------------------------------------------------------------

// Library Initialization

//--------------------------------------------------------------------------------------------------

bool libHNXH_InitLib_completed = false;



void libHNXH_InitLib () {

    if (libHNXH_InitLib_completed) {

        return;

    }



    libHNXH_InitLib_completed = true;



    libHNXH_InitLibraries();

    libHNXH_InitVariables();

    libHNXH_InitTriggers();

}