include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"



include "LibHHOG_h"



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

// Library: Hogger

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

// External Library Initialization

void libHHOG_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

}



// Variable Initialization

bool libHHOG_InitVariables_completed = false;



void libHHOG_InitVariables () {

    if (libHHOG_InitVariables_completed) {

        return;

    }



    libHHOG_InitVariables_completed = true;



}



// Functions

void libHHOG_gf_HeroHoggerIncrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHHOG_gv_heroHoggerTriggerRegistrationVariable += 1;

    if ((libHHOG_gv_heroHoggerTriggerRegistrationVariable == 1)) {

        TriggerEnable(libHHOG_gt_HeroHoggerCancelHoggWildCast, true);

        TriggerEnable(libHHOG_gt_HeroHoggerHoggWildBailOut, true);

        TriggerEnable(libHHOG_gt_HeroHoggerRageGainFCTTrigger, true);

    }



}



void libHHOG_gf_HeroHoggerDecrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHHOG_gv_heroHoggerTriggerRegistrationVariable -= 1;

    if ((libHHOG_gv_heroHoggerTriggerRegistrationVariable < 0)) {

        libHHOG_gv_heroHoggerTriggerRegistrationVariable = 0;

    }



    if ((libHHOG_gv_heroHoggerTriggerRegistrationVariable == 0)) {

        TriggerEnable(libHHOG_gt_HeroHoggerCancelHoggWildCast, false);

        TriggerEnable(libHHOG_gt_HeroHoggerHoggWildBailOut, false);

        TriggerEnable(libHHOG_gt_HeroHoggerRageGainFCTTrigger, false);

    }



}



void libHHOG_gf_HeroHoggerRageGainFCT (unit lp_unit, int lp_owner, fixed lp_amount) {

    // Automatic Variable Declarations

    // Implementation

    FloatingCombatElementCreateTextAtUnit(PlayerGroupSingle(lp_owner), "Hogger/HoggerRageReceived", "", lp_unit, FixedToText(lp_amount, c_fixedPrecisionAny), libNtve_gv_FloatingCombatTextAutoRandomSeed);

}



// Triggers

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

// Trigger: Hero - Hogger - Rage Gain FCT Trigger

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

bool libHHOG_gt_HeroHoggerRageGainFCTTrigger_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_hogger;

    int lv_hoggerPlayer;

    fixed lv_amount;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_hogger = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_hoggerPlayer = UnitGetOwner(lv_hogger);



    // Actions

    if (!runActions) {

        return true;

    }



    lv_amount = CatalogFieldValueGetAsFixed(c_gameCatalogEffect, EventPlayerEffectUsed(), "VitalArray[" + IntToString(c_unitVitalEnergy) + "].Change", c_playerAny);

    if ((UnitGetPropertyFixed(lv_hogger, c_unitPropEnergy, c_unitPropCurrent) < 99.0)) {

        libHHOG_gf_HeroHoggerRageGainFCT(lv_hogger, lv_hoggerPlayer, lv_amount);

    }



    return true;

}



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

void libHHOG_gt_HeroHoggerRageGainFCTTrigger_Init () {

    libHHOG_gt_HeroHoggerRageGainFCTTrigger = TriggerCreate("libHHOG_gt_HeroHoggerRageGainFCTTrigger_Func");

    TriggerAddEventPlayerEffectUsed(libHHOG_gt_HeroHoggerRageGainFCTTrigger, c_playerAny, "HoggerEzThroDynamiteDirectHitGnollFrenzyRage");

    TriggerAddEventPlayerEffectUsed(libHHOG_gt_HeroHoggerRageGainFCTTrigger, c_playerAny, "HoggerStaggeringBlowCollisionProcGnollFrenzyRage");

    TriggerAddEventPlayerEffectUsed(libHHOG_gt_HeroHoggerRageGainFCTTrigger, c_playerAny, "HoggerShockwavePowerSpikeTalentRage");

}



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

// Trigger: Hero - Hogger - Trait CDR

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

bool libHHOG_gt_HeroHoggerTraitCDR_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_hogger;

    int lv_player;

    fixed lv_rage;

    fixed lv_rageScale;

    fixed lv_rageMod;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_hogger = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_player = UnitGetOwner(lv_hogger);

    lv_rage = (UnitGetPropertyFixed(lv_hogger, c_unitPropEnergy, c_unitPropCurrent) * -1.0);

    lv_rageScale = 0.0625;

    lv_rageMod = ((lv_rage * lv_rageScale) / 100.0);



    // Actions

    if (!runActions) {

        return true;

    }



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

        libGame_gf_StormUniversalModifyCooldownonUnitCDRforAbilities(lv_hogger, lv_rageMod, false, true, false);

    }

    else {

        libGame_gf_StormUniversalModifyCooldownonUnitCDRforAbilities(lv_hogger, lv_rageMod, false, false, false);

    }

    return true;

}



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

void libHHOG_gt_HeroHoggerTraitCDR_Init () {

    libHHOG_gt_HeroHoggerTraitCDR = TriggerCreate("libHHOG_gt_HeroHoggerTraitCDR_Func");

    TriggerAddEventPlayerEffectUsed(libHHOG_gt_HeroHoggerTraitCDR, c_playerAny, "HoggerGnollFrenzyDummyProcSet");

}



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

// Trigger: Hero - Hogger - Hogg Wild Bail Out

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

bool libHHOG_gt_HeroHoggerHoggWildBailOut_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_hogger;

    point lv_point;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_hogger = EventUnit();

    lv_point = UnitTypePlacementTestsFromPoint(UnitGetType(lv_hogger), 0, UnitGetPosition(lv_hogger), 5.0, c_placementTestIgnoreBlockersMask);



    // Conditions

    if (testConds) {

        if (!((UnitBehaviorCount(lv_hogger, "HoggerHoggWildBailOutStack") == 3))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    UnitCreateEffectPoint(lv_hogger, "HoggerHoggWildBailoutSet", lv_point);

    return true;

}



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

void libHHOG_gt_HeroHoggerHoggWildBailOut_Init () {

    libHHOG_gt_HeroHoggerHoggWildBailOut = TriggerCreate("libHHOG_gt_HeroHoggerHoggWildBailOut_Func");

    TriggerEnable(libHHOG_gt_HeroHoggerHoggWildBailOut, false);

    TriggerAddEventUnitBehaviorChange(libHHOG_gt_HeroHoggerHoggWildBailOut, null, "HoggerHoggWildBailOutStack", c_unitBehaviorChangeIncrease);

}



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

// Trigger: Hero - Hogger - Cancel Hogg Wild Cast

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

bool libHHOG_gt_HeroHoggerCancelHoggWildCast_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_unit;

    int lv_player;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_unit = EventUnit();

    lv_player = UnitGetOwner(lv_unit);



    // Conditions

    if (testConds) {

        if (!((libHHOG_gv_heroHoggerCancelHoggWildBoolean[lv_player] == false))) {

            return false;

        }



        if (!((lv_player > 0))) {

            return false;

        }



        if (!((lv_player <= libCore_gv_bALMaxPlayers))) {

            return false;

        }



        if (!(((UnitBehaviorCount(lv_unit, "HoggerHoggWildCasterBuff") == 1)))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    libHHOG_gv_heroHoggerCancelHoggWildBoolean[lv_player] = true;

    UnitCreateEffectUnitWithSource(lv_unit, "HoggerCancelHoggWildInitialSet", lv_unit, c_gameCatalogAbil, "HoggerCancelWhirlwind");

    Wait(0.0625, c_timeGame);

    libHHOG_gv_heroHoggerCancelHoggWildBoolean[lv_player] = false;

    return true;

}



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

void libHHOG_gt_HeroHoggerCancelHoggWildCast_Init () {

    libHHOG_gt_HeroHoggerCancelHoggWildCast = TriggerCreate("libHHOG_gt_HeroHoggerCancelHoggWildCast_Func");

    TriggerEnable(libHHOG_gt_HeroHoggerCancelHoggWildCast, false);

    TriggerAddEventUnitOrder(libHHOG_gt_HeroHoggerCancelHoggWildCast, null, AbilityCommand("HoggerCancelHoggWild", 0));

}



void libHHOG_InitTriggers () {

    libHHOG_gt_HeroHoggerRageGainFCTTrigger_Init();

    libHHOG_gt_HeroHoggerTraitCDR_Init();

    libHHOG_gt_HeroHoggerHoggWildBailOut_Init();

    libHHOG_gt_HeroHoggerCancelHoggWildCast_Init();

}



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

// Library Initialization

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

bool libHHOG_InitLib_completed = false;



void libHHOG_InitLib () {

    if (libHHOG_InitLib_completed) {

        return;

    }



    libHHOG_InitLib_completed = true;



    libHHOG_InitLibraries();

    libHHOG_InitVariables();

    libHHOG_InitTriggers();

}