include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"

include "TriggerLibs/AILib"

include "TriggerLibs/UILib"



include "LibHANA_h"



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

// Library: Ana

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

// External Library Initialization

void libHANA_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

    libAIAI_InitVariables();

    libUIUI_InitVariables();

}



// Variable Initialization

bool libHANA_InitVariables_completed = false;



void libHANA_InitVariables () {

    if (libHANA_InitVariables_completed) {

        return;

    }



    libHANA_InitVariables_completed = true;



    libHANA_gv_hero_Ana_Shrike_DamageDoneToken_TokenCounterStr = "";

    libHANA_gv_hero_Ana_HealingDart_ConcentratedDoses_TokenCounterStr = "";

    libHANA_gv_hero_Ana_HealingDart_ConcentratedDoses_PoisonDotStr = "";

    libHANA_gv_anaUI.lv_eyeOfHorusTargetAllianceLabel = c_invalidDialogControlId;

    libHANA_gv_anaUI.lv_EyeOfHorusTargetImage = c_invalidDialogControlId;

}



// Functions

void libHANA_gf_HeroAnaIncrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHANA_gv_heroAnaTriggerRegistrationVariable += 1;

    if ((libHANA_gv_heroAnaTriggerRegistrationVariable == 1)) {

        TriggerEnable(libHANA_gt_CCRecognitionSleep, true);

        TriggerEnable(libHANA_gt_HeroAnaNanoBoostCDR, true);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusOverlayOn, true);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusOverlayOff, true);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusActivate, true);

        TriggerEnable(libHANA_gt_HeroAnaConcentratedDoses, true);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactSetDistanceVariable, true);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactHeroValidation, true);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusRadiusTargeter, true);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusPresearchTargeter, true);

        TriggerEnable(libHANA_gt_HeroAnaNanoBoostGenderHitCheck, true);

        TriggerEnable(libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOn, true);

        TriggerEnable(libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff, true);

        TriggerEnable(libHANA_gt_HeroAnaShrikeTokenCounter, true);

        TriggerEnable(libHANA_gt_AnaGainsDeadeyeTalentCooldownConversion, true);

        libHANA_gv_hero_Ana_HealingDart_ConcentratedDoses_PoisonDotStr = CatalogFieldValueGet(c_gameCatalogBehavior, "AnaShrikeDotDamageToken", "TokenId", c_playerAny);

        libHANA_gv_hero_Ana_HealingDart_ConcentratedDoses_TokenCounterStr = CatalogFieldValueGet(c_gameCatalogBehavior, "AnaHealingDartConcentratedDosesTokenCounter", "TokenId", c_playerAny);

        libHANA_gv_hero_Ana_Shrike_DamageDoneToken_TokenCounterStr = CatalogFieldValueGet(c_gameCatalogBehavior, "AnaShrikeSelfHealPoisonTraitHealToken", "TokenId", c_playerAny);

    }



}



void libHANA_gf_HeroAnaDecrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHANA_gv_heroAnaTriggerRegistrationVariable -= 1;

    if ((libHANA_gv_heroAnaTriggerRegistrationVariable == 0)) {

        libHANA_gv_heroAnaTriggerRegistrationVariable = 0;

    }



    if ((libHANA_gv_heroAnaTriggerRegistrationVariable == 0)) {

        TriggerEnable(libHANA_gt_CCRecognitionSleep, false);

        TriggerEnable(libHANA_gt_HeroAnaNanoBoostCDR, false);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusOverlayOn, false);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusOverlayOff, false);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusActivate, false);

        TriggerEnable(libHANA_gt_HeroAnaConcentratedDoses, false);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactSetDistanceVariable, false);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactHeroValidation, false);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusRadiusTargeter, false);

        TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusPresearchTargeter, false);

        TriggerEnable(libHANA_gt_HeroAnaNanoBoostGenderHitCheck, false);

        TriggerEnable(libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOn, false);

        TriggerEnable(libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff, false);

        TriggerEnable(libHANA_gt_AnaGainsDeadeyeTalentCooldownConversion, false);

        libHANA_gv_hero_Ana_HealingDart_ConcentratedDoses_PoisonDotStr = "";

        libHANA_gv_hero_Ana_HealingDart_ConcentratedDoses_TokenCounterStr = "";

        TriggerEnable(libHANA_gt_HeroAnaShrikeTokenCounter, false);

        libHANA_gv_hero_Ana_Shrike_DamageDoneToken_TokenCounterStr = "";

    }



}



string libHANA_gf_GetPortraitPathforEyeOfHorus (unit lp_unit) {

    // Automatic Variable Declarations

    // Implementation

    if ((UnitGetOwner(lp_unit) > 10)) {

        return "Assets\\Textures\\ui_targetportrait_structure.dds";

    }

    else {

        return libUIUI_gf_KillLogGetPortraitPathforUnit(lp_unit);

    }

}



// Triggers

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

// Trigger: Hero - Ana - Shrike Token Counter

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

bool libHANA_gt_HeroAnaShrikeTokenCounter_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_anaUnit;

    fixed lv_damageAmount;

    fixed lv_currentTokenCount;

    fixed lv_newTokenCount;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_anaUnit = EventPlayerEffectUsedUnit(c_effectUnitCaster);



    // Actions

    if (!runActions) {

        return true;

    }



    lv_damageAmount = (EventPlayerEffectUsedAmountInt(c_effectAmountDamaged, false)+EventPlayerEffectUsedAmountInt(c_effectAmountBehaviorShield, false));

    lv_newTokenCount = (UnitBehaviorCount(lv_anaUnit, "AnaShrikeSelfHealPoisonTraitHealToken")+lv_damageAmount);

    UnitSetTokenCount(lv_anaUnit, libHANA_gv_hero_Ana_Shrike_DamageDoneToken_TokenCounterStr, FixedToInt(lv_newTokenCount), lv_anaUnit);

    return true;

}



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

void libHANA_gt_HeroAnaShrikeTokenCounter_Init () {

    libHANA_gt_HeroAnaShrikeTokenCounter = TriggerCreate("libHANA_gt_HeroAnaShrikeTokenCounter_Func");

    TriggerEnable(libHANA_gt_HeroAnaShrikeTokenCounter, false);

    TriggerAddEventPlayerEffectUsed(libHANA_gt_HeroAnaShrikeTokenCounter, c_playerAny, "AnaShrikeDotDamage");

}



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

// Trigger: CC Recognition - Sleep

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

bool libHANA_gt_CCRecognitionSleep_Func (bool testConds, bool runActions) {

    // Variable Declarations

    string lv_sleepBehavior;

    unit lv_sleepUnit;

    int lv_sleepPlayer;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_sleepBehavior = EventUnitBehavior();

    lv_sleepUnit = EventUnit();

    lv_sleepPlayer = UnitGetOwner(lv_sleepUnit);



    // Conditions

    if (testConds) {

        if (!((lv_sleepPlayer > 0))) {

            return false;

        }



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

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    if ((UnitBehaviorCount(lv_sleepUnit, "HeroGenericHasNoStatusBar") == 0)) {

        libUIUI_gf_HeroConsoleUnitStatusBarsUpdateStunDeathBar(lv_sleepBehavior, lv_sleepPlayer);

    }



    if (((lv_sleepUnit == libGame_gv_players[lv_sleepPlayer].lv_heroUnit) || (lv_sleepUnit == libGame_gv_players[lv_sleepPlayer].lv_activeVehicle))) {

        libUIUI_gf_FullscreenOverlaysCreateCCEffectFlashForPlayer(lv_sleepPlayer, UnitBehaviorDurationTotal(lv_sleepUnit, lv_sleepBehavior));

    }

    else {

        libAIAI_gf_HeroAIUpdateAIStatus(0);

    }

    return true;

}



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

void libHANA_gt_CCRecognitionSleep_Init () {

    libHANA_gt_CCRecognitionSleep = TriggerCreate("libHANA_gt_CCRecognitionSleep_Func");

    TriggerEnable(libHANA_gt_CCRecognitionSleep, false);

    TriggerAddEventUnitBehaviorChangeFromCategory(libHANA_gt_CCRecognitionSleep, null, c_behaviorCategorySleeping, c_unitBehaviorChangeCreate);

    TriggerAddEventUnitBehaviorChangeFromCategory(libHANA_gt_CCRecognitionSleep, null, c_behaviorCategorySleeping, c_unitBehaviorChangeRefresh);

}



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

// Trigger: Hero - Ana - Nano Boost Fullscreen Overlay On

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

bool libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOn_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    if ((UnitHasBehavior2(EventUnit(), "HeroGenericIgnoreFullscreenOverlay") == false)) {

        libUIUI_gf_FullscreenOverlayAddItemForPlayer(EventPlayer(), libUIUI_ge_FullscreenOverlayPriorities_Invulnerable, "Cutscenes\\GameUI_AnaNanoBoostOverlay.StormCutscene", EventUnitBehavior());

    }



    return true;

}



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

void libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOn_Init () {

    libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOn = TriggerCreate("libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOn_Func");

    TriggerEnable(libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOn, false);

    TriggerAddEventUnitBehaviorChange(libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOn, null, "AnaNanoBoostBuff", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Ana - Nano Boost Fullscreen Overlay Off

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

bool libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    if ((UnitHasBehavior2(EventUnit(), "HeroGenericIgnoreFullscreenOverlay") == false)) {

        libUIUI_gf_FullscreenOverlayRemoveItemFromQueueForPlayer(EventPlayer(), "Cutscenes\\GameUI_AnaNanoBoostOverlay.StormCutscene", EventUnitBehavior());

    }



    return true;

}



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

void libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff_Init () {

    libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff = TriggerCreate("libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff_Func");

    TriggerEnable(libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff, false);

    TriggerAddEventUnitBehaviorChange(libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff, null, "AnaNanoBoostBuff", c_unitBehaviorChangeDestroy);

    TriggerAddEventUnitBehaviorChange(libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff, null, "AnaNanoBoostBuff", c_unitBehaviorChangeDeactivate);

}



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

// Trigger: Hero - Ana - Nano Boost Gender Hit Check

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

bool libHANA_gt_HeroAnaNanoBoostGenderHitCheck_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_ana;

    unit lv_targetUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_ana = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_targetUnit = EventPlayerEffectUsedUnit(c_effectUnitTarget);



    // Actions

    if (!runActions) {

        return true;

    }



    if (((CatalogFieldValueGet(c_gameCatalogHero, PlayerHero(UnitGetOwner(lv_targetUnit)), "Gender", UnitGetOwner(lv_targetUnit)) == "Female") || (UnitGetType(lv_targetUnit) == "HeroProbius"))) {

        UnitCreateEffectUnit(lv_ana, "AnaNanoBoostModifyUnitDummyFemale", lv_targetUnit);

    }

    else {

        UnitCreateEffectUnit(lv_ana, "AnaNanoBoostModifyUnitDummyMale", lv_targetUnit);

    }

    return true;

}



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

void libHANA_gt_HeroAnaNanoBoostGenderHitCheck_Init () {

    libHANA_gt_HeroAnaNanoBoostGenderHitCheck = TriggerCreate("libHANA_gt_HeroAnaNanoBoostGenderHitCheck_Func");

    TriggerEnable(libHANA_gt_HeroAnaNanoBoostGenderHitCheck, false);

    TriggerAddEventPlayerEffectUsed(libHANA_gt_HeroAnaNanoBoostGenderHitCheck, c_playerAny, "AnaNanoBoostImpactSet");

}



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

// Trigger: Hero - Ana - Nano Boost CDR

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

bool libHANA_gt_HeroAnaNanoBoostCDR_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_itAbility;

    unit lv_hero;

    int lv_heroIndex;

    int lv_ownerOfHero;

    string lv_abilLink;

    string lv_cooldownLink;

    string lv_chargeLink;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_hero = EventUnit();

    lv_heroIndex = libCore_gf_GetHeroIndexForUnitType(UnitGetType(lv_hero));

    lv_ownerOfHero = UnitGetOwner(lv_hero);

    lv_cooldownLink = "";

    lv_chargeLink = "";



    // Actions

    if (!runActions) {

        return true;

    }



    while ((UnitHasBehavior2(lv_hero, "AnaNanoBoostBuff") == true)) {

        while ((UnitHasBehaviorWithCategoryFlag(lv_hero, c_behaviorCategoryTimeStop) == true)) {

            Wait(0.0625, c_timeGame);

        }

        libGame_gf_StormUniversalModifyCooldownonUnitCDRforAbilities(lv_hero, libHANA_gv_hero_Ana_NanoBoostCDRAmount_C, false, false, false);

        Wait(0.0625, c_timeGame);

    }

    return true;

}



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

void libHANA_gt_HeroAnaNanoBoostCDR_Init () {

    libHANA_gt_HeroAnaNanoBoostCDR = TriggerCreate("libHANA_gt_HeroAnaNanoBoostCDR_Func");

    TriggerEnable(libHANA_gt_HeroAnaNanoBoostCDR, false);

    TriggerAddEventUnitBehaviorChange(libHANA_gt_HeroAnaNanoBoostCDR, null, "AnaNanoBoostBuff", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Ana - Eye Of Horus Post Structure Impact Set Distance Variable

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

bool libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactSetDistanceVariable_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    libHANA_gv_heroAnaEyeOfHorusDistancetoStructureTarget = DistanceBetweenPoints(UnitGetPosition(EventPlayerEffectUsedUnit(c_effectUnitCaster)), UnitGetPosition(EventPlayerEffectUsedUnit(c_effectUnitTarget)));

    return true;

}



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

void libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactSetDistanceVariable_Init () {

    libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactSetDistanceVariable = TriggerCreate("libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactSetDistanceVariable_Func");

    TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactSetDistanceVariable, false);

    TriggerAddEventPlayerEffectUsed(libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactSetDistanceVariable, c_playerAny, "AnaEyeOfHorusImpactEnemyStructureSet");

}



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

// Trigger: Hero - Ana - Eye Of Horus Post Structure Impact Hero Validation

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

bool libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactHeroValidation_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    if ((DistanceBetweenPoints(UnitGetPosition(EventPlayerEffectUsedUnit(c_effectUnitCaster)), UnitGetPosition(EventPlayerEffectUsedUnit(c_effectUnitTarget))) <= libHANA_gv_heroAnaEyeOfHorusDistancetoStructureTarget)) {

        UnitCreateEffectUnit(EventPlayerEffectUsedUnit(c_effectUnitCaster), "AnaEyeOfHorusImpactHeroSet", EventPlayerEffectUsedUnit(c_effectUnitTarget));

    }



    return true;

}



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

void libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactHeroValidation_Init () {

    libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactHeroValidation = TriggerCreate("libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactHeroValidation_Func");

    TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactHeroValidation, false);

    TriggerAddEventPlayerEffectUsed(libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactHeroValidation, c_playerAny, "AnaEyeOfHorusImpactHeroDummySet");

}



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

// Trigger: Hero - Ana - Eye Of Horus Presearch Targeter

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

bool libHANA_gt_HeroAnaEyeOfHorusPresearchTargeter_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_anaPlayer;

    playergroup lv_anaPlayerGroup;

    unit lv_targetUnit;

    string lv_targetUnitAlliance;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_anaPlayer = EventPlayerEffectUsedUnitOwner(c_effectPlayerCaster);

    lv_anaPlayerGroup = PlayerGroupSingle(lv_anaPlayer);

    lv_targetUnit = EventPlayerEffectUsedUnit(c_effectUnitTarget);

    lv_targetUnitAlliance = "";



    // Actions

    if (!runActions) {

        return true;

    }



    DialogControlSetAnimationState(libHANA_gv_anaUI.lv_EyeOfHorusTargetImage, lv_anaPlayerGroup, "Show", "Wait");

    DialogControlSetAnimationState(libHANA_gv_anaUI.lv_EyeOfHorusTargetImage, lv_anaPlayerGroup, "Show", "Visible");

    libNtve_gf_SetDialogItemImage(libHANA_gv_anaUI.lv_EyeOfHorusTargetImage, libHANA_gf_GetPortraitPathforEyeOfHorus(EventPlayerEffectUsedUnit(c_effectUnitTarget)), lv_anaPlayerGroup);

    if ((libGame_gf_TeamNumberOfPlayer(lv_anaPlayer) == libGame_gf_TeamNumberOfPlayer(UnitGetOwner(lv_targetUnit)))) {

        lv_targetUnitAlliance = "Ally";

    }

    else {

        lv_targetUnitAlliance = "Enemy";

    }

    libNtve_gf_SetDialogItemText(libHANA_gv_anaUI.lv_eyeOfHorusTargetAllianceLabel, StringToText(lv_targetUnitAlliance), lv_anaPlayerGroup);

    return true;

}



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

void libHANA_gt_HeroAnaEyeOfHorusPresearchTargeter_Init () {

    libHANA_gt_HeroAnaEyeOfHorusPresearchTargeter = TriggerCreate("libHANA_gt_HeroAnaEyeOfHorusPresearchTargeter_Func");

    TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusPresearchTargeter, false);

    TriggerAddEventPlayerEffectUsed(libHANA_gt_HeroAnaEyeOfHorusPresearchTargeter, c_playerAny, "AnaEyeOfHorusPresearchImpactSet");

}



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

// Trigger: Hero - Ana - Eye Of Horus Radius Targeter

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

bool libHANA_gt_HeroAnaEyeOfHorusRadiusTargeter_Func (bool testConds, bool runActions) {

    // Variable Declarations

    fixed lv_eyeOfHorusDistance;

    fixed lv_eyeOfHorusAdjustedDistance;

    point lv_eyeOfHorusPoint;

    point lv_eyeOfHorusPointAdjusted;

    unit lv_anaUnit;

    point lv_posOfAna;

    unit lv_targetUnit;

    point lv_posOfTargetUnit;

    fixed lv_targetRadius;

    fixed lv_targetImpactDistance;

    fixed lv_eyeOfHorusPositionAdjustmentFactor;

    fixed lv_eyeOfHorusPositionWallAdjustment;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_anaUnit = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_posOfAna = UnitGetPosition(lv_anaUnit);

    lv_targetUnit = EventPlayerEffectUsedUnit(c_effectUnitTarget);

    lv_posOfTargetUnit = UnitGetPosition(lv_targetUnit);

    lv_eyeOfHorusPositionAdjustmentFactor = 0.8;

    lv_eyeOfHorusPositionWallAdjustment = 1.0;



    // Actions

    if (!runActions) {

        return true;

    }



    lv_eyeOfHorusDistance = DistanceBetweenPoints(lv_posOfAna, lv_posOfTargetUnit);

    lv_targetRadius = CatalogFieldValueGetAsFixed(c_gameCatalogUnit, UnitGetType(lv_targetUnit), "Radius", c_playerAny);

    lv_eyeOfHorusPoint = PointWithOffsetPolar(lv_posOfAna, lv_eyeOfHorusDistance, UnitGetFacing(lv_anaUnit));

    lv_targetImpactDistance = DistanceBetweenPoints(lv_posOfTargetUnit, lv_eyeOfHorusPoint);

    if (((UnitHasBehavior2(lv_targetUnit, "TownGateBehavior") == true) || (UnitHasBehavior2(lv_targetUnit, "TownWallBehavior") == true))) {

        lv_eyeOfHorusAdjustedDistance = (lv_eyeOfHorusDistance-lv_eyeOfHorusPositionWallAdjustment);

    }

    else {

        lv_eyeOfHorusAdjustedDistance = (lv_eyeOfHorusDistance-(lv_targetRadius-(lv_targetImpactDistance*lv_eyeOfHorusPositionAdjustmentFactor)));

    }

    lv_eyeOfHorusPointAdjusted = PointWithOffsetPolar(lv_posOfAna, lv_eyeOfHorusAdjustedDistance, UnitGetFacing(lv_anaUnit));

    if (((UnitTypeTestAttribute(UnitGetType(lv_targetUnit), c_unitAttributeStructure) == true) && (libNtve_gf_PlayerIsEnemy(UnitGetOwner(lv_anaUnit), UnitGetOwner(lv_targetUnit), libNtve_ge_PlayerRelation_Enemy) == true))) {

        UnitCreateEffectPoint(lv_anaUnit, "AnaEyeOfHorusRadiusTargetHitDummyImpact", lv_eyeOfHorusPointAdjusted);

    }



    if ((libGame_gf_TeamNumberOfPlayer(UnitGetOwner(lv_anaUnit)) == libGame_gf_TeamNumberOfPlayer(UnitGetOwner(lv_targetUnit)))) {

        UnitCreateEffectPoint(lv_anaUnit, "AnaEyeOfHorusRadiusTargetHitDummyImpactAlly", lv_eyeOfHorusPointAdjusted);

    }

    else {

        UnitCreateEffectPoint(lv_anaUnit, "AnaEyeOfHorusRadiusTargetHitDummyImpactEnemy", lv_eyeOfHorusPointAdjusted);

    }

    UnitCreateEffectPoint(lv_anaUnit, "AnaEyeOfHorusBallisticAdvantageSearch", lv_eyeOfHorusPointAdjusted);

    return true;

}



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

void libHANA_gt_HeroAnaEyeOfHorusRadiusTargeter_Init () {

    libHANA_gt_HeroAnaEyeOfHorusRadiusTargeter = TriggerCreate("libHANA_gt_HeroAnaEyeOfHorusRadiusTargeter_Func");

    TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusRadiusTargeter, false);

    TriggerAddEventPlayerEffectUsed(libHANA_gt_HeroAnaEyeOfHorusRadiusTargeter, c_playerAny, "AnaEyeOfHorusRadiusTargetHitDummyTriggerImpactCreatePersistent");

}



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

// Trigger: Hero - Ana - Eye Of Horus Activate

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

bool libHANA_gt_HeroAnaEyeOfHorusActivate_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_ana;

    int lv_player;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_ana = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_player = UnitGetOwner(lv_ana);



    // Conditions

    if (testConds) {

        if (!((UnitHasBehavior2(lv_ana, "AnaEyeOfHorus") == true))) {

            return false;

        }



        if (!((UnitIsAlive(lv_ana) == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    UISetTargetingOrder(PlayerGroupSingle(lv_player), null, OrderTargetingPoint(AbilityCommand("AnaEyeOfHorusAttack", 0), Point(PointGetX(EventPlayerEffectUsedPoint(c_effectLocationTargetPoint)), PointGetY(EventPlayerEffectUsedPoint(c_effectLocationTargetPoint)))), true);

    return true;

}



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

void libHANA_gt_HeroAnaEyeOfHorusActivate_Init () {

    libHANA_gt_HeroAnaEyeOfHorusActivate = TriggerCreate("libHANA_gt_HeroAnaEyeOfHorusActivate_Func");

    TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusActivate, false);

    TriggerAddEventPlayerEffectUsed(libHANA_gt_HeroAnaEyeOfHorusActivate, c_playerAny, "AnaEyeOfHorusPresearchSet");

}



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

// Trigger: Hero - Ana - Eye Of Horus Overlay On

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

bool libHANA_gt_HeroAnaEyeOfHorusOverlayOn_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_anaUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_anaUnit = EventUnit();



    // Actions

    if (!runActions) {

        return true;

    }



    if ((UnitIsAlive(lv_anaUnit) == true) && (UnitTestState(lv_anaUnit, c_unitStateHallucination) == false) && (UnitTypeTestAttribute(UnitGetType(lv_anaUnit), c_unitAttributeHeroic) == true) && (UnitHasBehavior2(lv_anaUnit, "HeroGenericIgnoreFullscreenOverlay") == false)) {

        libUIUI_gf_FullscreenOverlayAddItemForPlayer(EventPlayer(), libUIUI_ge_FullscreenOverlayPriorities_Stasis, "Cutscenes\\GameUI_AnaEyeOfHorus.StormCutscene", EventUnitBehavior());

    }



    return true;

}



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

void libHANA_gt_HeroAnaEyeOfHorusOverlayOn_Init () {

    libHANA_gt_HeroAnaEyeOfHorusOverlayOn = TriggerCreate("libHANA_gt_HeroAnaEyeOfHorusOverlayOn_Func");

    TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusOverlayOn, false);

    TriggerAddEventUnitBehaviorChange(libHANA_gt_HeroAnaEyeOfHorusOverlayOn, null, "AnaEyeOfHorus", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Ana - Eye Of Horus Overlay Off

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

bool libHANA_gt_HeroAnaEyeOfHorusOverlayOff_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    if ((UnitHasBehavior2(EventUnit(), "HeroGenericIgnoreFullscreenOverlay") == false)) {

        libUIUI_gf_FullscreenOverlayRemoveItemFromQueueForPlayer(EventPlayer(), "Cutscenes\\GameUI_AnaEyeOfHorus.StormCutscene", EventUnitBehavior());

    }



    return true;

}



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

void libHANA_gt_HeroAnaEyeOfHorusOverlayOff_Init () {

    libHANA_gt_HeroAnaEyeOfHorusOverlayOff = TriggerCreate("libHANA_gt_HeroAnaEyeOfHorusOverlayOff_Func");

    TriggerEnable(libHANA_gt_HeroAnaEyeOfHorusOverlayOff, false);

    TriggerAddEventUnitBehaviorChange(libHANA_gt_HeroAnaEyeOfHorusOverlayOff, null, "AnaEyeOfHorus", c_unitBehaviorChangeDestroy);

}



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

// Trigger: Hero - Ana - Gains Deadeye Talent - Cooldown Conversion

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

bool libHANA_gt_AnaGainsDeadeyeTalentCooldownConversion_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_anaPlayer;

    unit lv_anaUnit;

    fixed lv_eyeOfHorusCooldown;

    int lv_chargesToGain;

    const fixed lv_eyeOfHorusChargeRegen = 10.0;

    string lv_attackChargeLink;

    string lv_activateChargeLink;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_anaPlayer = libGame_gf_HeroGainTalentPlayer();

    lv_anaUnit = libGame_gv_players[lv_anaPlayer].lv_heroUnit;

    lv_attackChargeLink = "Abil/AnaEyeOfHorusAttack";

    lv_activateChargeLink = "Abil/AnaEyeOfHorusActivate";



    // Conditions

    if (testConds) {

        if (!((libGame_gf_HeroGainTalentGainedTalent() == "AnaEyeOfHorusDeadeye"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    Wait(0.0625, c_timeGame);

    lv_eyeOfHorusCooldown = UnitGetCooldown(lv_anaUnit, lv_activateChargeLink);

    if ((UnitHasBehavior2(lv_anaUnit, "AnaEyeOfHorus") == true)) {

        UnitAddChargeRegenRemaining(lv_anaUnit, lv_attackChargeLink, lv_eyeOfHorusChargeRegen);

        UnitAddChargeUsed(lv_anaUnit, lv_activateChargeLink, -6.0);

        UnitAddChargeUsed(lv_anaUnit, lv_activateChargeLink, UnitGetChargeUsed(lv_anaUnit, lv_attackChargeLink));

        UnitAddChargeRegenRemaining(lv_anaUnit, lv_activateChargeLink, lv_eyeOfHorusChargeRegen);

        return true;

    }

    else if ((lv_eyeOfHorusCooldown != 0.0)) {

        UnitAddChargeUsed(lv_anaUnit, lv_activateChargeLink, -6.0);

        while ((lv_eyeOfHorusCooldown > 0.0625)) {

            UnitAddChargeUsed(lv_anaUnit, lv_attackChargeLink, 1.0);

            lv_eyeOfHorusCooldown = (lv_eyeOfHorusCooldown - lv_eyeOfHorusChargeRegen);

        }

        UnitModifyCooldown(lv_anaUnit, lv_activateChargeLink, 0.5, c_cooldownOperationSet);

        UnitAddChargeRegenRemaining(lv_anaUnit, lv_attackChargeLink, lv_eyeOfHorusChargeRegen);

        UnitAddChargeRegenRemaining(lv_anaUnit, lv_activateChargeLink, lv_eyeOfHorusCooldown);

        UnitAddChargeRegenRemaining(lv_anaUnit, lv_attackChargeLink, lv_eyeOfHorusCooldown);

    }

    return true;

}



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

void libHANA_gt_AnaGainsDeadeyeTalentCooldownConversion_Init () {

    libHANA_gt_AnaGainsDeadeyeTalentCooldownConversion = TriggerCreate("libHANA_gt_AnaGainsDeadeyeTalentCooldownConversion_Func");

    TriggerEnable(libHANA_gt_AnaGainsDeadeyeTalentCooldownConversion, false);

    libGame_gf_HeroGainTalent(libHANA_gt_AnaGainsDeadeyeTalentCooldownConversion);

}



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

// Trigger: Hero - Ana - Concentrated Doses

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

bool libHANA_gt_HeroAnaConcentratedDoses_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_itPlayer;

    unit lv_itUnit;

    unit lv_anaUnit;

    int lv_anaPlayer;

    int lv_dosagesActive;



    // Automatic Variable Declarations

    unitgroup autoA6DE93B0_g;

    int autoA6DE93B0_u;



    // Variable Initialization

    lv_anaUnit = EventUnit();

    lv_anaPlayer = UnitGetOwner(lv_anaUnit);



    // Conditions

    if (testConds) {

        if (!((PlayerHasTalent(lv_anaPlayer, "AnaHealingDartConcentratedDoses") == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    autoA6DE93B0_g = UnitGetTrackedUnitGroup(lv_anaUnit, "AnaHealingDartConcentratedDosesPlayerTracker");

    autoA6DE93B0_u = UnitGroupCount(autoA6DE93B0_g, c_unitCountAll);

    for (;; autoA6DE93B0_u -= 1) {

        lv_itUnit = UnitGroupUnitFromEnd(autoA6DE93B0_g, autoA6DE93B0_u);

        if (lv_itUnit == null) { break; }

        lv_dosagesActive += (FixedToInt(UnitGetTokenCount(lv_itUnit, libHANA_gv_hero_Ana_HealingDart_ConcentratedDoses_PoisonDotStr)) + 1);

    }

    UnitSetTokenCount(lv_anaUnit, libHANA_gv_hero_Ana_HealingDart_ConcentratedDoses_TokenCounterStr, lv_dosagesActive, lv_anaUnit);

    return true;

}



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

void libHANA_gt_HeroAnaConcentratedDoses_Init () {

    libHANA_gt_HeroAnaConcentratedDoses = TriggerCreate("libHANA_gt_HeroAnaConcentratedDoses_Func");

    TriggerEnable(libHANA_gt_HeroAnaConcentratedDoses, false);

    TriggerAddEventUnitAbility(libHANA_gt_HeroAnaConcentratedDoses, null, AbilityCommand("AnaHealingDart", 0), c_unitAbilStageAll, false);

}



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

// Trigger: Ana UI Initialize

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

bool libHANA_gt_AnaUIInitialize_Func (bool testConds, bool runActions) {

    int init_i;



    // Variable Declarations

    int[6] lv_panels;

    int lv_currentPanelLayer;



    // Automatic Variable Declarations

    // Variable Initialization

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

        lv_panels[init_i] = c_invalidDialogControlId;

    }



    // Actions

    if (!runActions) {

        return true;

    }



    DialogControlHookup(libUIUI_gv_fullscreenStatusPanel, c_triggerControlTypeImage, "AnaEyeOfHorusFrame/EyeOfHorusTargetFrame/PortraitContainerFrame/PortraitImage");

    libHANA_gv_anaUI.lv_EyeOfHorusTargetImage = DialogControlLastCreated();

    DialogControlHookup(libUIUI_gv_fullscreenStatusPanel, c_triggerControlTypeLabel, "AnaEyeOfHorusFrame/EyeOfHorusTargetFrame/TargetTeamAlliance");

    libHANA_gv_anaUI.lv_eyeOfHorusTargetAllianceLabel = DialogControlLastCreated();



    return true;

}



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

void libHANA_gt_AnaUIInitialize_Init () {

    libHANA_gt_AnaUIInitialize = TriggerCreate("libHANA_gt_AnaUIInitialize_Func");

    libCore_gf_IncludeModInitialization(libHANA_gt_AnaUIInitialize);

}



void libHANA_InitTriggers () {

    libHANA_gt_HeroAnaShrikeTokenCounter_Init();

    libHANA_gt_CCRecognitionSleep_Init();

    libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOn_Init();

    libHANA_gt_HeroAnaNanoBoostFullscreenOverlayOff_Init();

    libHANA_gt_HeroAnaNanoBoostGenderHitCheck_Init();

    libHANA_gt_HeroAnaNanoBoostCDR_Init();

    libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactSetDistanceVariable_Init();

    libHANA_gt_HeroAnaEyeOfHorusPostStructureImpactHeroValidation_Init();

    libHANA_gt_HeroAnaEyeOfHorusPresearchTargeter_Init();

    libHANA_gt_HeroAnaEyeOfHorusRadiusTargeter_Init();

    libHANA_gt_HeroAnaEyeOfHorusActivate_Init();

    libHANA_gt_HeroAnaEyeOfHorusOverlayOn_Init();

    libHANA_gt_HeroAnaEyeOfHorusOverlayOff_Init();

    libHANA_gt_AnaGainsDeadeyeTalentCooldownConversion_Init();

    libHANA_gt_HeroAnaConcentratedDoses_Init();

    libHANA_gt_AnaUIInitialize_Init();

}



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

// Library Initialization

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

bool libHANA_InitLib_completed = false;



void libHANA_InitLib () {

    if (libHANA_InitLib_completed) {

        return;

    }



    libHANA_InitLib_completed = true;



    libHANA_InitLibraries();

    libHANA_InitVariables();

    libHANA_InitTriggers();

}