include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"

include "TriggerLibs/UILib"



include "LibHMEI_h"



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

// Library: MeiOW

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

// External Library Initialization

void libHMEI_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

    libUIUI_InitVariables();

}



// Variable Initialization

bool libHMEI_InitVariables_completed = false;



void libHMEI_InitVariables () {

    if (libHMEI_InitVariables_completed) {

        return;

    }



    libHMEI_InitVariables_completed = true;



}



// Functions

void libHMEI_gf_HeroMeiOWIncrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHMEI_gv_heroMeiOWTriggerRegistrationVariable += 1;

    if ((libHMEI_gv_heroMeiOWTriggerRegistrationVariable == 1)) {

        TriggerEnable(libHMEI_gt_HeroMeiOWCryoFreezeOverlayOn, true);

        TriggerEnable(libHMEI_gt_HeroMeiOWCryoFreezeOverlayOff, true);

        TriggerEnable(libHMEI_gt_HeroMeiOWAvalanchePathingChecks, true);

        TriggerEnable(libHMEI_gt_HeroMeiOWAvalancheCameraLock, true);

    }



}



void libHMEI_gf_HeroMeiOWDecrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHMEI_gv_heroMeiOWTriggerRegistrationVariable -= 1;

    if ((libHMEI_gv_heroMeiOWTriggerRegistrationVariable < 0)) {

        libHMEI_gv_heroMeiOWTriggerRegistrationVariable = 0;

    }



    if ((libHMEI_gv_heroMeiOWTriggerRegistrationVariable == 0)) {

        TriggerEnable(libHMEI_gt_HeroMeiOWCryoFreezeOverlayOn, false);

        TriggerEnable(libHMEI_gt_HeroMeiOWCryoFreezeOverlayOff, false);

        TriggerEnable(libHMEI_gt_HeroMeiOWAvalanchePathingChecks, false);

        TriggerEnable(libHMEI_gt_HeroMeiOWAvalancheCameraLock, false);

    }



}



// Triggers

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

// Trigger: Hero - MeiOW - Cryo-Freeze - Overlay On

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

bool libHMEI_gt_HeroMeiOWCryoFreezeOverlayOn_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_meiOWUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_meiOWUnit = EventUnit();



    // Actions

    if (!runActions) {

        return true;

    }



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

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

    }



    return true;

}



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

void libHMEI_gt_HeroMeiOWCryoFreezeOverlayOn_Init () {

    libHMEI_gt_HeroMeiOWCryoFreezeOverlayOn = TriggerCreate("libHMEI_gt_HeroMeiOWCryoFreezeOverlayOn_Func");

    TriggerEnable(libHMEI_gt_HeroMeiOWCryoFreezeOverlayOn, false);

    TriggerAddEventUnitBehaviorChange(libHMEI_gt_HeroMeiOWCryoFreezeOverlayOn, null, "MeiOWCryoFreezeShieldBuff", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - MeiOW - Cryo-Freeze - Overlay Off

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

bool libHMEI_gt_HeroMeiOWCryoFreezeOverlayOff_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



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

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

    }



    return true;

}



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

void libHMEI_gt_HeroMeiOWCryoFreezeOverlayOff_Init () {

    libHMEI_gt_HeroMeiOWCryoFreezeOverlayOff = TriggerCreate("libHMEI_gt_HeroMeiOWCryoFreezeOverlayOff_Func");

    TriggerEnable(libHMEI_gt_HeroMeiOWCryoFreezeOverlayOff, false);

    TriggerAddEventUnitBehaviorChange(libHMEI_gt_HeroMeiOWCryoFreezeOverlayOff, null, "MeiOWCryoFreezeShieldBuff", c_unitBehaviorChangeDestroy);

}



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

// Trigger: Hero - MeiOW - Avalanche - Camera Lock

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

bool libHMEI_gt_HeroMeiOWAvalancheCameraLock_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_targetUnit;

    int lv_targetPlayer;

    unit lv_avalancheMissileUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_targetUnit = EventUnit();

    lv_targetPlayer = UnitGetOwner(lv_targetUnit);

    lv_avalancheMissileUnit = UnitBehaviorEffectUnit(lv_targetUnit, "MeiOWAvalancheStasis", c_effectUnitSource, 0);



    // Conditions

    if (testConds) {

        if (!((UnitHasBehavior2(lv_targetUnit, "MeiOWAvalancheStasis") == true))) {

            return false;

        }



        if (!((lv_targetPlayer > 0))) {

            return false;

        }



        if (!((lv_targetPlayer <= libCore_gv_bALMaxEnginePlayerCount))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    if ((lv_targetUnit == libGame_gv_players[lv_targetPlayer].lv_heroUnit)) {

        libGame_gf_PlayerHeroDisplacementCameraLock(lv_targetUnit, "MeiOWAvalancheStasis");

    }



    while ((UnitIsAlive(lv_avalancheMissileUnit) == true) && (UnitHasBehavior2(lv_targetUnit, "MeiOWAvalancheStasis") == true)) {

        UnitSetPosition(lv_targetUnit, UnitGetPosition(lv_avalancheMissileUnit), true);

        Wait(0.0625, c_timeGame);

    }

    return true;

}



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

void libHMEI_gt_HeroMeiOWAvalancheCameraLock_Init () {

    libHMEI_gt_HeroMeiOWAvalancheCameraLock = TriggerCreate("libHMEI_gt_HeroMeiOWAvalancheCameraLock_Func");

    TriggerEnable(libHMEI_gt_HeroMeiOWAvalancheCameraLock, false);

    TriggerAddEventUnitBehaviorChange(libHMEI_gt_HeroMeiOWAvalancheCameraLock, null, "MeiOWAvalancheStasis", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - MeiOW - Avalanche Pathing Checks

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

bool libHMEI_gt_HeroMeiOWAvalanchePathingChecks_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_totalDistanceMods;

    unit lv_muradin;

    int lv_meiPlayer;

    fixed lv_abilityRange;

    point lv_targetPoint;

    point lv_actualTargetPoint;

    fixed lv_modifiedDistance;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_muradin = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_meiPlayer = UnitGetOwner(lv_muradin);

    lv_abilityRange = CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "MeiOWAvalancheLaunchMissile", "ImpactLocation.ProjectionDistanceScale", 0);

    lv_targetPoint = EventPlayerEffectUsedPoint(c_effectLocationTargetPoint);



    // Actions

    if (!runActions) {

        return true;

    }



    CatalogFieldValueSet(c_gameCatalogEffect, "MeiOWAvalancheLaunchMissile", "ImpactLocation.ProjectionDistanceScale", lv_meiPlayer, CatalogFieldValueGet(c_gameCatalogEffect, "MeiOWAvalancheLaunchMissile", "ImpactLocation.ProjectionDistanceScale", 0));

    lv_modifiedDistance = (lv_abilityRange + 0.0);

    lv_actualTargetPoint = lv_targetPoint;

    while ((PointPathingPassable(lv_actualTargetPoint) == false)) {

        lv_modifiedDistance -= 0.125;

        lv_totalDistanceMods += 1;

        lv_actualTargetPoint = libNtve_gf_PointOffsetTowardsPoint(UnitGetPosition(lv_muradin), lv_modifiedDistance, lv_targetPoint);

    }

    CatalogFieldValueSet(c_gameCatalogEffect, "MeiOWAvalancheLaunchMissile", "ImpactLocation.ProjectionDistanceScale", lv_meiPlayer, FixedToString(lv_modifiedDistance, 3));

    UnitCreateEffectPoint(lv_muradin, "MeiOWAvalancheLaunchMissile", lv_actualTargetPoint);

    return true;

}



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

void libHMEI_gt_HeroMeiOWAvalanchePathingChecks_Init () {

    libHMEI_gt_HeroMeiOWAvalanchePathingChecks = TriggerCreate("libHMEI_gt_HeroMeiOWAvalanchePathingChecks_Func");

    TriggerEnable(libHMEI_gt_HeroMeiOWAvalanchePathingChecks, false);

    TriggerAddEventPlayerEffectUsed(libHMEI_gt_HeroMeiOWAvalanchePathingChecks, c_playerAny, "MeiOWAvalancheInitialOffsetPersistent");

}



void libHMEI_InitTriggers () {

    libHMEI_gt_HeroMeiOWCryoFreezeOverlayOn_Init();

    libHMEI_gt_HeroMeiOWCryoFreezeOverlayOff_Init();

    libHMEI_gt_HeroMeiOWAvalancheCameraLock_Init();

    libHMEI_gt_HeroMeiOWAvalanchePathingChecks_Init();

}



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

// Library Initialization

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

bool libHMEI_InitLib_completed = false;



void libHMEI_InitLib () {

    if (libHMEI_InitLib_completed) {

        return;

    }



    libHMEI_InitLib_completed = true;



    libHMEI_InitLibraries();

    libHMEI_InitVariables();

    libHMEI_InitTriggers();

}