include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"

include "TriggerLibs/UILib"



include "LibHCHR_h"



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

// Library: Chromie

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

// External Library Initialization

void libHCHR_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

    libUIUI_InitVariables();

}



// Variable Initialization

bool libHCHR_InitVariables_completed = false;



void libHCHR_InitVariables () {

    int init_i;



    if (libHCHR_InitVariables_completed) {

        return;

    }



    libHCHR_InitVariables_completed = true;



    libHCHR_gv_heroChromieBlessingoftheBronzeCDR = CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "ChromieBlessingOfTheBronzeDummyCDRVariable", "XP", c_playerAny);

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

        libHCHR_gv_timeTrapUnitGroup[init_i] = UnitGroupEmpty();

    }

}



// Functions

void libHCHR_gf_HeroChromieIncrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHCHR_gv_heroChromieTriggerRegistrationVariable += 1;

    if ((libHCHR_gv_heroChromieTriggerRegistrationVariable == 1)) {

        TriggerEnable(libHCHR_gt_HeroChromieTimeOutOverlayOff, true);

        TriggerEnable(libHCHR_gt_HeroChromieTimeOutOverlayOn, true);

        TriggerEnable(libHCHR_gt_HeroChromieBlessingoftheBronzeCDR, true);

        TriggerEnable(libHCHR_gt_HeroChromieTemporalLoopCameraSnap, true);

        TriggerEnable(libHCHR_gt_HeroChromieTemporalLoopTeleportDetection, true);

        TriggerEnable(libHCHR_gt_HeroChromieTimeTrapOverlayOff, true);

        TriggerEnable(libHCHR_gt_HeroChromieTimeTrapOverlayOn, true);

    }



}



void libHCHR_gf_HeroChromieDecrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHCHR_gv_heroChromieTriggerRegistrationVariable -= 1;

    if ((libHCHR_gv_heroChromieTriggerRegistrationVariable < 0)) {

        libHCHR_gv_heroChromieTriggerRegistrationVariable = 0;

    }



    if ((libHCHR_gv_heroChromieTriggerRegistrationVariable == 0)) {

        TriggerEnable(libHCHR_gt_HeroChromieTimeOutOverlayOff, false);

        TriggerEnable(libHCHR_gt_HeroChromieTimeOutOverlayOn, false);

        TriggerEnable(libHCHR_gt_HeroChromieBlessingoftheBronzeCDR, false);

        TriggerEnable(libHCHR_gt_HeroChromieTemporalLoopCameraSnap, false);

        TriggerEnable(libHCHR_gt_HeroChromieTemporalLoopTeleportDetection, false);

        TriggerEnable(libHCHR_gt_HeroChromieTimeTrapOverlayOff, false);

        TriggerEnable(libHCHR_gt_HeroChromieTimeTrapOverlayOn, false);

    }



}



// Triggers

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

// Trigger: Hero - Chromie - Time Out Overlay On

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

bool libHCHR_gt_HeroChromieTimeOutOverlayOn_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_unit;

    int lv_player;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_unit = EventUnit();

    lv_player = UnitGetOwner(EventUnit());



    // Actions

    if (!runActions) {

        return true;

    }



    if ((UnitIsAlive(lv_unit) == true) && (UnitTestState(lv_unit, c_unitStateHallucination) == false) && (UnitHasBehavior2(lv_unit, "HeroGenericIgnoreFullscreenOverlay") == false)) {

        libUIUI_gf_FullscreenOverlayAddItemForPlayer(lv_player, libUIUI_ge_FullscreenOverlayPriorities_Stasis, "Cutscenes\\GameUI_StasisOverlay.StormCutscene", EventUnitBehavior());

    }



    return true;

}



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

void libHCHR_gt_HeroChromieTimeOutOverlayOn_Init () {

    libHCHR_gt_HeroChromieTimeOutOverlayOn = TriggerCreate("libHCHR_gt_HeroChromieTimeOutOverlayOn_Func");

    TriggerEnable(libHCHR_gt_HeroChromieTimeOutOverlayOn, false);

    TriggerAddEventUnitBehaviorChange(libHCHR_gt_HeroChromieTimeOutOverlayOn, null, "ChromieTimeOutBehavior", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Chromie - Time Out Overlay Off

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

bool libHCHR_gt_HeroChromieTimeOutOverlayOff_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_unit;

    int lv_player;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_unit = EventUnit();

    lv_player = UnitGetOwner(EventUnit());



    // Actions

    if (!runActions) {

        return true;

    }



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

        libUIUI_gf_FullscreenOverlayRemoveItemFromQueueForPlayer(lv_player, "Cutscenes\\GameUI_StasisOverlay.StormCutscene", EventUnitBehavior());

    }



    return true;

}



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

void libHCHR_gt_HeroChromieTimeOutOverlayOff_Init () {

    libHCHR_gt_HeroChromieTimeOutOverlayOff = TriggerCreate("libHCHR_gt_HeroChromieTimeOutOverlayOff_Func");

    TriggerEnable(libHCHR_gt_HeroChromieTimeOutOverlayOff, false);

    TriggerAddEventUnitBehaviorChange(libHCHR_gt_HeroChromieTimeOutOverlayOff, null, "ChromieTimeOutBehavior", c_unitBehaviorChangeDestroy);

}



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

// Trigger: Hero - Chromie - Blessing of the Bronze - CDR

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

bool libHCHR_gt_HeroChromieBlessingoftheBronzeCDR_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_hero;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_hero = EventPlayerEffectUsedUnit(c_effectUnitTarget);



    // Actions

    if (!runActions) {

        return true;

    }



    libGame_gf_StormUniversalModifyCooldownonUnitCDRforAbilities(lv_hero, libHCHR_gv_heroChromieBlessingoftheBronzeCDR, false, false, false);

    return true;

}



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

void libHCHR_gt_HeroChromieBlessingoftheBronzeCDR_Init () {

    libHCHR_gt_HeroChromieBlessingoftheBronzeCDR = TriggerCreate("libHCHR_gt_HeroChromieBlessingoftheBronzeCDR_Func");

    TriggerEnable(libHCHR_gt_HeroChromieBlessingoftheBronzeCDR, false);

    TriggerAddEventPlayerEffectUsed(libHCHR_gt_HeroChromieBlessingoftheBronzeCDR, c_playerAny, "ChromieBlessingOfTheBronzeDummyCDRTriggerEffect");

}



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

// Trigger: Hero - Chromie - Sand Echo - Basic Attack Animation Begins

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

bool libHCHR_gt_HeroChromieSandEchoBasicAttackAnimationBegins_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_targetUnit;

    unit lv_targetUnit2;

    int lv_triggeringPlayer;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_targetUnit = UnitGetLastAttackTargetUnit(EventUnit());

    lv_targetUnit2 = EventUnit();

    lv_triggeringPlayer = EventPlayer();



    // Actions

    if (!runActions) {

        return true;

    }



    UnitCreateEffectUnit(lv_targetUnit2, "ChromieSandEchoBasicAttackEnumerateAnimation", lv_targetUnit);

    return true;

}



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

void libHCHR_gt_HeroChromieSandEchoBasicAttackAnimationBegins_Init () {

    libHCHR_gt_HeroChromieSandEchoBasicAttackAnimationBegins = TriggerCreate("libHCHR_gt_HeroChromieSandEchoBasicAttackAnimationBegins_Func");

    TriggerAddEventUnitStartedAttack2(libHCHR_gt_HeroChromieSandEchoBasicAttackAnimationBegins, null, "ChromieHeroWeapon");

}



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

// Trigger: Hero - Chromie - Temporal Loop Camera Snap

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

bool libHCHR_gt_HeroChromieTemporalLoopCameraSnap_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_unit;

    int lv_player;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_unit = EventPlayerEffectUsedUnit(c_effectUnitTarget);

    lv_player = UnitGetOwner(lv_unit);



    // Conditions

    if (testConds) {

        if (!(((libGame_gv_players[lv_player].lv_activeVehicle == lv_unit) || (libGame_gv_players[lv_player].lv_heroUnit == lv_unit)))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    CameraPan(lv_player, UnitGetPosition(lv_unit), 0.0, -1, 0.0, false);

    return true;

}



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

void libHCHR_gt_HeroChromieTemporalLoopCameraSnap_Init () {

    libHCHR_gt_HeroChromieTemporalLoopCameraSnap = TriggerCreate("libHCHR_gt_HeroChromieTemporalLoopCameraSnap_Func");

    TriggerEnable(libHCHR_gt_HeroChromieTemporalLoopCameraSnap, false);

    TriggerAddEventPlayerEffectUsed(libHCHR_gt_HeroChromieTemporalLoopCameraSnap, c_playerAny, "ChromieTemporalLoopTeleportTargetCameraSnapDummy");

}



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

// Trigger: Hero - Chromie - Temporal Loop Teleport Detection

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

bool libHCHR_gt_HeroChromieTemporalLoopTeleportDetection_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Conditions

    if (testConds) {

        if (!((UnitHasBehavior2(EventPlayerEffectUsedUnitLaunch(), "ChromieTemporalLoopTargetBehavior") == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    ActorSend(ActorFromScope(ActorScopeFromUnit(EventPlayerEffectUsedUnitLaunch()), "ChromieTemporalLoopTargetTrailFX"), "AnimGroupApply Teleport {} {} Instant");

    ActorCreate(ActorScopeFromUnit(EventPlayerEffectUsedUnitLaunch()), "ChromieTemporalLoopTargetTrailFX", null, null, null);

    ActorSend(libNtve_gf_ActorLastCreated(), "AnimBracketStart BSD {} Stand Death");

    return true;

}



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

void libHCHR_gt_HeroChromieTemporalLoopTeleportDetection_Init () {

    libHCHR_gt_HeroChromieTemporalLoopTeleportDetection = TriggerCreate("libHCHR_gt_HeroChromieTemporalLoopTeleportDetection_Func");

    TriggerEnable(libHCHR_gt_HeroChromieTemporalLoopTeleportDetection, false);

    TriggerAddEventPlayerEffectUsedFromScope(libHCHR_gt_HeroChromieTemporalLoopTeleportDetection, c_playerAny, "CEffectTeleport");

}



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

// Trigger: Hero - Chromie - Time Trap Overlay On

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

bool libHCHR_gt_HeroChromieTimeTrapOverlayOn_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_unit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_unit = EventUnit();



    // Actions

    if (!runActions) {

        return true;

    }



    if ((UnitIsAlive(lv_unit) == true) && (UnitTestState(lv_unit, c_unitStateHallucination) == false) && (UnitHasBehavior2(lv_unit, "HeroGenericIgnoreFullscreenOverlay") == false)) {

        libUIUI_gf_FullscreenOverlayAddItemForPlayer(UnitGetOwner(lv_unit), libUIUI_ge_FullscreenOverlayPriorities_Stasis, "Cutscenes\\GameUI_StasisOverlay.StormCutscene", EventUnitBehavior());

    }



    return true;

}



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

void libHCHR_gt_HeroChromieTimeTrapOverlayOn_Init () {

    libHCHR_gt_HeroChromieTimeTrapOverlayOn = TriggerCreate("libHCHR_gt_HeroChromieTimeTrapOverlayOn_Func");

    TriggerEnable(libHCHR_gt_HeroChromieTimeTrapOverlayOn, false);

    TriggerAddEventUnitBehaviorChange(libHCHR_gt_HeroChromieTimeTrapOverlayOn, null, "ChromieTimeTrapTargetBehavior", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Chromie - Time Trap Overlay Off

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

bool libHCHR_gt_HeroChromieTimeTrapOverlayOff_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_unit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_unit = EventUnit();



    // Actions

    if (!runActions) {

        return true;

    }



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

        libUIUI_gf_FullscreenOverlayRemoveItemFromQueueForPlayer(UnitGetOwner(lv_unit), "Cutscenes\\GameUI_StasisOverlay.StormCutscene", EventUnitBehavior());

    }



    return true;

}



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

void libHCHR_gt_HeroChromieTimeTrapOverlayOff_Init () {

    libHCHR_gt_HeroChromieTimeTrapOverlayOff = TriggerCreate("libHCHR_gt_HeroChromieTimeTrapOverlayOff_Func");

    TriggerEnable(libHCHR_gt_HeroChromieTimeTrapOverlayOff, false);

    TriggerAddEventUnitBehaviorChange(libHCHR_gt_HeroChromieTimeTrapOverlayOff, null, "ChromieTimeTrapTargetBehavior", c_unitBehaviorChangeDestroy);

}



void libHCHR_InitTriggers () {

    libHCHR_gt_HeroChromieTimeOutOverlayOn_Init();

    libHCHR_gt_HeroChromieTimeOutOverlayOff_Init();

    libHCHR_gt_HeroChromieBlessingoftheBronzeCDR_Init();

    libHCHR_gt_HeroChromieSandEchoBasicAttackAnimationBegins_Init();

    libHCHR_gt_HeroChromieTemporalLoopCameraSnap_Init();

    libHCHR_gt_HeroChromieTemporalLoopTeleportDetection_Init();

    libHCHR_gt_HeroChromieTimeTrapOverlayOn_Init();

    libHCHR_gt_HeroChromieTimeTrapOverlayOff_Init();

}



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

// Library Initialization

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

bool libHCHR_InitLib_completed = false;



void libHCHR_InitLib () {

    if (libHCHR_InitLib_completed) {

        return;

    }



    libHCHR_InitLib_completed = true;



    libHCHR_InitLibraries();

    libHCHR_InitVariables();

    libHCHR_InitTriggers();

}