include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"

include "TriggerLibs/UILib"



include "LibHGUL_h"



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

// Library: Gul'dan

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

// External Library Initialization

void libHGUL_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

    libUIUI_InitVariables();

}



// Variable Initialization

bool libHGUL_InitVariables_completed = false;



void libHGUL_InitVariables () {

    if (libHGUL_InitVariables_completed) {

        return;

    }



    libHGUL_InitVariables_completed = true;



    libHGUL_gv_heroGuldanDarknessWithinDamageTrackerScoreforTooltip = "GenericHeroRealScoreValue1";

}



// Functions

void libHGUL_gf_HeroGuldanIncrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHGUL_gv_heroGuldanTriggerRegistrationCount += 1;

    if ((libHGUL_gv_heroGuldanTriggerRegistrationCount == 1)) {

        TriggerEnable(libHGUL_gt_HeroGuldanDarkBargainDeathRegister, true);

        TriggerEnable(libHGUL_gt_HeroGuldanDarkBargainStartRespawnTimer, true);

        TriggerEnable(libHGUL_gt_HeroGuldanDrainLifeTurningControl, true);

        TriggerEnable(libHGUL_gt_HeroGuldanFearCameraLock, true);

        TriggerEnable(libHGUL_gt_HeroGuldanDemonicCircleRemovePreviousPortal, true);

        TriggerEnable(libHGUL_gt_HeroGuldanDemonicCircleTalentReset, true);

        TriggerEnable(libHGUL_gt_HeroGuldanRegisterDeathRecapSpecialDamageEffect, true);

        TriggerEnable(libHGUL_gt_HeroGuldanDarknessWithinDamageTracking, true);

        TriggerEnable(libHGUL_gt_HeroGuldanDarknessWithinTrackerReset, true);

        TriggerExecute(libHGUL_gt_HeroGuldanRegisterDeathRecapSpecialDamageEffect, false, false);

    }



}



void libHGUL_gf_HeroGuldanDecrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHGUL_gv_heroGuldanTriggerRegistrationCount -= 1;

    if ((libHGUL_gv_heroGuldanTriggerRegistrationCount < 0)) {

        libHGUL_gv_heroGuldanTriggerRegistrationCount = 0;

    }



    if ((libHGUL_gv_heroGuldanTriggerRegistrationCount == 0)) {

        TriggerEnable(libHGUL_gt_HeroGuldanDarkBargainDeathRegister, false);

        TriggerEnable(libHGUL_gt_HeroGuldanDarkBargainStartRespawnTimer, false);

        TriggerEnable(libHGUL_gt_HeroGuldanDrainLifeTurningControl, false);

        TriggerEnable(libHGUL_gt_HeroGuldanFearCameraLock, false);

        TriggerEnable(libHGUL_gt_HeroGuldanDemonicCircleRemovePreviousPortal, false);

        TriggerEnable(libHGUL_gt_HeroGuldanDemonicCircleTalentReset, false);

        TriggerEnable(libHGUL_gt_HeroGuldanRegisterDeathRecapSpecialDamageEffect, false);

        TriggerEnable(libHGUL_gt_HeroGuldanDarknessWithinDamageTracking, false);

        TriggerEnable(libHGUL_gt_HeroGuldanDarknessWithinTrackerReset, false);

    }



}



// Triggers

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

// Trigger: Hero - Gul'dan - Register Death Recap Special Damage Effect

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

bool libHGUL_gt_HeroGuldanRegisterDeathRecapSpecialDamageEffect_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    libGame_gf_DeathRecapAddSpecialDamageEffect("GuldanLifeTapManaRestoreModifyUnit");

    return true;

}



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

void libHGUL_gt_HeroGuldanRegisterDeathRecapSpecialDamageEffect_Init () {

    libHGUL_gt_HeroGuldanRegisterDeathRecapSpecialDamageEffect = TriggerCreate("libHGUL_gt_HeroGuldanRegisterDeathRecapSpecialDamageEffect_Func");

    TriggerEnable(libHGUL_gt_HeroGuldanRegisterDeathRecapSpecialDamageEffect, false);

}



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

// Trigger: Hero - Gul'dan - Fear - Camera Lock

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

bool libHGUL_gt_HeroGuldanFearCameraLock_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_targetPlayer;

    int lv_itPlayer;

    fixed lv_vertOffset;

    fixed lv_horizOffset;



    // Automatic Variable Declarations

    const int auto17613DD0_ae = libCore_gv_bALMaxPlayers;

    const int auto17613DD0_ai = 1;



    // Variable Initialization

    lv_targetPlayer = UnitGetOwner(EventUnit());



    // Conditions

    if (testConds) {

        if (!(((UnitGetOwner(EventUnit()) >= 1) && (UnitGetOwner(EventUnit()) <= 10) && (EventUnit() == libGame_gv_players[lv_targetPlayer].lv_heroUnit) && (UnitIsAlive(EventUnit()) == true)))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    libGame_gf_PlayerHeroDisplacementCameraLock(EventUnit(), EventUnitBehavior());

    lv_itPlayer = 1;

    for ( ; ( (auto17613DD0_ai >= 0 && lv_itPlayer <= auto17613DD0_ae) || (auto17613DD0_ai < 0 && lv_itPlayer >= auto17613DD0_ae) ) ; lv_itPlayer += auto17613DD0_ai ) {

        lv_vertOffset = 1.5;

        lv_horizOffset = RandomFixed(-0.4, -0.6);

        libUIUI_gf_UIFloatingCombatTextCreateTextTag(lv_itPlayer, 2.0, StringExternal("Param/Value/lib_HGUL_38B8C9B2"), EventUnit(), 0.0, 0.0, libCore_ge_FloatingTextType_InsaneDamage, true);

    }

    return true;

}



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

void libHGUL_gt_HeroGuldanFearCameraLock_Init () {

    libHGUL_gt_HeroGuldanFearCameraLock = TriggerCreate("libHGUL_gt_HeroGuldanFearCameraLock_Func");

    TriggerEnable(libHGUL_gt_HeroGuldanFearCameraLock, false);

    TriggerAddEventUnitBehaviorChange(libHGUL_gt_HeroGuldanFearCameraLock, null, "GuldanHorrifyFearDuration", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Gul'dan - Drain Life - Turning Control

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

bool libHGUL_gt_HeroGuldanDrainLifeTurningControl_Func (bool testConds, bool runActions) {

    // Variable Declarations

    fixed lv_facingAngle;

    fixed lv_nextFacingAngle;

    unit lv_localTriggeringUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_localTriggeringUnit = EventUnit();



    // Actions

    if (!runActions) {

        return true;

    }



    while ((UnitHasBehavior2(lv_localTriggeringUnit, "GuldanDrainLifeChannel") == true)) {

        lv_facingAngle = UnitGetFacing(lv_localTriggeringUnit);

        Wait(0.0625, c_timeGame);

        lv_nextFacingAngle = UnitGetFacing(lv_localTriggeringUnit);

        if ((lv_facingAngle > lv_nextFacingAngle)) {

            libNtve_gf_SendActorMessageToUnit(lv_localTriggeringUnit, "Signal ShuffleRight");

        }

        else {

            if ((lv_facingAngle < lv_nextFacingAngle)) {

                libNtve_gf_SendActorMessageToUnit(lv_localTriggeringUnit, "Signal ShuffleLeft");

            }

            else {

                libNtve_gf_SendActorMessageToUnit(EventUnit(), "AnimClear Walk 0.000000");

            }

        }

    }

    libNtve_gf_SendActorMessageToUnit(EventUnit(), "AnimClear Walk");

    return true;

}



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

void libHGUL_gt_HeroGuldanDrainLifeTurningControl_Init () {

    libHGUL_gt_HeroGuldanDrainLifeTurningControl = TriggerCreate("libHGUL_gt_HeroGuldanDrainLifeTurningControl_Func");

    TriggerEnable(libHGUL_gt_HeroGuldanDrainLifeTurningControl, false);

    TriggerAddEventUnitBehaviorChange(libHGUL_gt_HeroGuldanDrainLifeTurningControl, null, "GuldanDrainLifeChannel", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Gul'dan - Darkness Within - Damage Tracking

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

bool libHGUL_gt_HeroGuldanDarknessWithinDamageTracking_Func (bool testConds, bool runActions) {

    // Variable Declarations

    fixed lv_damageDealt;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_damageDealt = (EventUnitDamageAmount() + EventUnitDamageBehaviorShield());



    // Conditions

    if (testConds) {

        if (!((UnitTypeTestAttribute(UnitGetType(EventUnit()), c_unitAttributeHeroic) == true))) {

            return false;

        }



        if (!((UnitGetType(EventUnitDamageSourceUnit()) == "HeroGuldan"))) {

            return false;

        }



        if (!((PlayerHasTalent(EventUnitDamageSourcePlayer(), "GuldanLifeTapDarknessWithin") == true))) {

            return false;

        }



        if (!((UnitHasBehavior2(EventUnitDamageSourceUnit(), "GuldanLifeTapDarknessWithinReady") != true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    libHGUL_gv_heroGuldanDarknessWithinDamageTracker[EventUnitDamageSourcePlayer()] = (libHGUL_gv_heroGuldanDarknessWithinDamageTracker[EventUnitDamageSourcePlayer()] + lv_damageDealt);

    PlayerScoreValueSetFromFixed(EventUnitDamageSourcePlayer(), "GenericHeroRealScoreValue1", MinF(libHGUL_gv_heroGuldanDarknessWithinDamageTracker[EventUnitDamageSourcePlayer()], CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "GuldanLifeTapDarknessWithinDamageThreshold", "Amount", EventUnitDamageSourcePlayer())));

    if ((libHGUL_gv_heroGuldanDarknessWithinDamageTracker[EventUnitDamageSourcePlayer()] >= CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "GuldanLifeTapDarknessWithinDamageThreshold", "Amount", EventUnitDamageSourcePlayer()))) {

        UnitBehaviorAdd(EventUnitDamageSourceUnit(), "GuldanLifeTapDarknessWithinReady", EventUnitDamageSourceUnit(), 1);

    }



    return true;

}



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

void libHGUL_gt_HeroGuldanDarknessWithinDamageTracking_Init () {

    libHGUL_gt_HeroGuldanDarknessWithinDamageTracking = TriggerCreate("libHGUL_gt_HeroGuldanDarknessWithinDamageTracking_Func");

    TriggerEnable(libHGUL_gt_HeroGuldanDarknessWithinDamageTracking, false);

    TriggerAddEventUnitDealsDamage(libHGUL_gt_HeroGuldanDarknessWithinDamageTracking, null, c_unitDamageTypeAny, c_unitDamageEither, null);

}



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

// Trigger: Hero - Gul'dan - Darkness Within - Tracker Reset

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

bool libHGUL_gt_HeroGuldanDarknessWithinTrackerReset_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    libHGUL_gv_heroGuldanDarknessWithinDamageTracker[EventPlayer()] = 0.0;

    PlayerScoreValueSetFromFixed(EventPlayer(), "GenericHeroRealScoreValue1", 0.0);

    return true;

}



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

void libHGUL_gt_HeroGuldanDarknessWithinTrackerReset_Init () {

    libHGUL_gt_HeroGuldanDarknessWithinTrackerReset = TriggerCreate("libHGUL_gt_HeroGuldanDarknessWithinTrackerReset_Func");

    TriggerEnable(libHGUL_gt_HeroGuldanDarknessWithinTrackerReset, false);

    TriggerAddEventUnitBehaviorChange(libHGUL_gt_HeroGuldanDarknessWithinTrackerReset, null, "GuldanLifeTapDarknessWithinReady", c_unitBehaviorChangeDecrease);

}



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

// Trigger: Hero - Gul'dan - Demonic Circle - Remove Previous Portal

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

bool libHGUL_gt_HeroGuldanDemonicCircleRemovePreviousPortal_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_itPlayer;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_itPlayer = UnitGetOwner(EventUnitCreatedUnit());



    // Actions

    if (!runActions) {

        return true;

    }



    if ((libHGUL_gv_heroGuldanDemonicCircleUnit[lv_itPlayer] != null)) {

        UnitBehaviorRemove(libHGUL_gv_heroGuldanDemonicCircleUnit[lv_itPlayer], "GuldanDemonicCircleActive", 1);

    }



    libHGUL_gv_heroGuldanDemonicCircleUnit[lv_itPlayer] = EventUnitCreatedUnit();

    return true;

}



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

void libHGUL_gt_HeroGuldanDemonicCircleRemovePreviousPortal_Init () {

    libHGUL_gt_HeroGuldanDemonicCircleRemovePreviousPortal = TriggerCreate("libHGUL_gt_HeroGuldanDemonicCircleRemovePreviousPortal_Func");

    TriggerEnable(libHGUL_gt_HeroGuldanDemonicCircleRemovePreviousPortal, false);

    TriggerAddEventUnitCreated(libHGUL_gt_HeroGuldanDemonicCircleRemovePreviousPortal, null, "GuldanDemonicCircleSummon", null);

}



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

// Trigger: Hero - Gul'dan - Demonic Circle - Talent Reset

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

bool libHGUL_gt_HeroGuldanDemonicCircleTalentReset_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_itPlayer;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_itPlayer = libGame_gf_HeroRespecsTalentsPlayer();



    // Conditions

    if (testConds) {

        if (!((UnitGetType(libGame_gv_players[lv_itPlayer].lv_heroUnit) == "HeroGuldan"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    libHGUL_gv_heroGuldanDemonicCircleUnit[lv_itPlayer] = null;

    return true;

}



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

void libHGUL_gt_HeroGuldanDemonicCircleTalentReset_Init () {

    libHGUL_gt_HeroGuldanDemonicCircleTalentReset = TriggerCreate("libHGUL_gt_HeroGuldanDemonicCircleTalentReset_Func");

    TriggerEnable(libHGUL_gt_HeroGuldanDemonicCircleTalentReset, false);

    libGame_gf_HeroRespecsTalents(libHGUL_gt_HeroGuldanDemonicCircleTalentReset);

}



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

// Trigger: Hero - Gul'dan - Dark Bargain - Death Register

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

bool libHGUL_gt_HeroGuldanDarkBargainDeathRegister_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_deadUnit;

    int lv_deadPlayer;

    int lv_killingPlayer;

    int lv_respawnDuration;

    point lv_deadUnitsOriginalLocation;

    fixed lv_respawnTime;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_deadUnitsOriginalLocation = UnitGetPosition(EventUnit());



    // Conditions

    if (testConds) {

        if (!((libGame_gv_gameOver == false))) {

            return false;

        }



        if (!((EventPlayer() >= 1))) {

            return false;

        }



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

            return false;

        }



        if (!((EventUnit() == libGame_gv_players[EventPlayer()].lv_heroUnit))) {

            return false;

        }



        if (!((UnitTestState(EventUnit(), c_unitStateHallucination) == false))) {

            return false;

        }



        if (!((UnitGetType(EventUnit()) == "HeroGuldan"))) {

            return false;

        }



        if (!((UnitHasBehavior2(EventUnit(), "GuldanDarkBargainMaxHealthBehavior") == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    lv_deadUnit = EventUnit();

    lv_deadPlayer = EventPlayer();

    lv_killingPlayer = libNtve_gf_KillingPlayer();

    libGame_gv_players[lv_deadPlayer].lv_isDead = true;

    libNtve_gf_CreateUnitsWithDefaultFacing(1, "DeadUnitCameraTarget", 0, lv_deadPlayer, UnitGetPosition(lv_deadUnit), lv_deadUnit);

    libGame_gv_players[lv_deadPlayer].lv_cameraDeadUnitCameraTarget = UnitLastCreated();

    libGame_gv_players[lv_deadPlayer].lv_cameraPlayerUnitGroupToFocusOn = libNtve_gf_ConvertUnitToUnitGroup(libGame_gv_players[lv_deadPlayer].lv_cameraDeadUnitCameraTarget);

    libGame_gf_CameraUpdateCameraForPlayer(lv_deadPlayer);

    libGame_gf_SendEventHeroKilled(lv_killingPlayer, lv_deadUnit);

    UnitBehaviorAdd(lv_deadUnit, "GuldanDarkBargainDuration", lv_deadUnit, 1);

    UnitBehaviorSetDuration(lv_deadUnit, "GuldanDarkBargainDuration", 10.0);

    lv_respawnTime = libCore_gf_HeroDeathTime(lv_deadPlayer, UnitLevel(libGame_gv_players[lv_deadPlayer].lv_heroUnit));

    lv_respawnTime = (lv_respawnTime + 10.0);

    libGame_gf_HeroDeathStartRespawnTimer(lv_deadPlayer, lv_respawnTime);

    libGame_gf_HeroDeathUpdateUIElementsForDeath(true, true, true, lv_deadPlayer, lv_killingPlayer);

    libGame_gf_HeroDeathEnableDisableDeadSoundStateForPlayer(true, lv_deadPlayer);

    libGame_gf_HeroDeathPortHeroBackAndSetDeathState(lv_deadPlayer, libGame_gv_players[lv_deadPlayer].lv_spawnPoint);

    return true;

}



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

void libHGUL_gt_HeroGuldanDarkBargainDeathRegister_Init () {

    libHGUL_gt_HeroGuldanDarkBargainDeathRegister = TriggerCreate("libHGUL_gt_HeroGuldanDarkBargainDeathRegister_Func");

    TriggerEnable(libHGUL_gt_HeroGuldanDarkBargainDeathRegister, false);

    TriggerAddEventUnitDied(libHGUL_gt_HeroGuldanDarkBargainDeathRegister, null);

}



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

// Trigger: Hero - Gul'dan - Dark Bargain - Start Respawn Timer

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

bool libHGUL_gt_HeroGuldanDarkBargainStartRespawnTimer_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_deadUnit;

    int lv_deadPlayer;



    // Automatic Variable Declarations

    // Variable Initialization



    // Conditions

    if (testConds) {

        if (!((libGame_gv_gameOver == false))) {

            return false;

        }



        if (!((EventPlayer() >= 1))) {

            return false;

        }



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

            return false;

        }



        if (!((EventUnit() == libGame_gv_players[EventPlayer()].lv_heroUnit))) {

            return false;

        }



        if (!((UnitTestState(EventUnit(), c_unitStateHallucination) == false))) {

            return false;

        }



        if (!((UnitGetType(EventUnit()) == "HeroGuldan"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    lv_deadUnit = EventUnit();

    lv_deadPlayer = EventPlayer();

    UnitBehaviorSetDuration(lv_deadUnit, "Dead", UnitBehaviorDuration(lv_deadUnit, "Dead"));

    libUIUI_gf_HeroConsoleUnitStatusBarsUpdateStunDeathBar("Dead", lv_deadPlayer);

    return true;

}



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

void libHGUL_gt_HeroGuldanDarkBargainStartRespawnTimer_Init () {

    libHGUL_gt_HeroGuldanDarkBargainStartRespawnTimer = TriggerCreate("libHGUL_gt_HeroGuldanDarkBargainStartRespawnTimer_Func");

    TriggerEnable(libHGUL_gt_HeroGuldanDarkBargainStartRespawnTimer, false);

    TriggerAddEventUnitBehaviorChange(libHGUL_gt_HeroGuldanDarkBargainStartRespawnTimer, null, "GuldanDarkBargainDuration", c_unitBehaviorChangeDestroy);

}



void libHGUL_InitTriggers () {

    libHGUL_gt_HeroGuldanRegisterDeathRecapSpecialDamageEffect_Init();

    libHGUL_gt_HeroGuldanFearCameraLock_Init();

    libHGUL_gt_HeroGuldanDrainLifeTurningControl_Init();

    libHGUL_gt_HeroGuldanDarknessWithinDamageTracking_Init();

    libHGUL_gt_HeroGuldanDarknessWithinTrackerReset_Init();

    libHGUL_gt_HeroGuldanDemonicCircleRemovePreviousPortal_Init();

    libHGUL_gt_HeroGuldanDemonicCircleTalentReset_Init();

    libHGUL_gt_HeroGuldanDarkBargainDeathRegister_Init();

    libHGUL_gt_HeroGuldanDarkBargainStartRespawnTimer_Init();

}



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

// Library Initialization

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

bool libHGUL_InitLib_completed = false;



void libHGUL_InitLib () {

    if (libHGUL_InitLib_completed) {

        return;

    }



    libHGUL_InitLib_completed = true;



    libHGUL_InitLibraries();

    libHGUL_InitVariables();

    libHGUL_InitTriggers();

}