include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"

include "TriggerLibs/AILib"

include "TriggerLibs/UILib"



include "LibHMLG_h"



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

// Library: Mal'Ganis

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

// External Library Initialization

void libHMLG_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

    libAIAI_InitVariables();

    libUIUI_InitVariables();

}



// Variable Initialization

bool libHMLG_InitVariables_completed = false;



void libHMLG_InitVariables () {

    int init_i;



    if (libHMLG_InitVariables_completed) {

        return;

    }



    libHMLG_InitVariables_completed = true;



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

        libHMLG_gv_heroMalGanisBlindasaBatBackupVisionGroups[init_i] = UnitGroupEmpty();

    }

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

        libHMLG_gv_heroMalGanisBlindasaBatForfeitedUnits[init_i] = UnitGroupEmpty();

    }

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

        libHMLG_gv_heroMalGanisNightRushBackupVisionGroups[init_i] = UnitGroupEmpty();

    }

}



// Functions

void libHMLG_gf_HeroMalGanisIncrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHMLG_gv_heroMalGanisTriggerRegistrationVariable += 1;

    if ((libHMLG_gv_heroMalGanisTriggerRegistrationVariable == 1)) {

        TriggerEnable(libHMLG_gt_HeroMalGanisDarkConversion, true);

        TriggerEnable(libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression, true);

        TriggerEnable(libHMLG_gt_HeroMalGanisRemoveNightRushAllyVisionSuppression, true);

        TriggerEnable(libHMLG_gt_HeroMalGanisApplyBlindasaBatAllyVisionSuppression, true);

        TriggerEnable(libHMLG_gt_HeroMalGanisRemoveBlindasaBatAllyVisionSuppression, true);

        TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOn, true);

        TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff, true);

        TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOn, true);

        TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff, true);

    }



}



void libHMLG_gf_HeroMalGanisDecrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHMLG_gv_heroMalGanisTriggerRegistrationVariable -= 1;

    if ((libHMLG_gv_heroMalGanisTriggerRegistrationVariable < 0)) {

        libHMLG_gv_heroMalGanisTriggerRegistrationVariable = 0;

    }



    if ((libHMLG_gv_heroMalGanisTriggerRegistrationVariable == 0)) {

        TriggerEnable(libHMLG_gt_HeroMalGanisDarkConversion, false);

        TriggerEnable(libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression, false);

        TriggerEnable(libHMLG_gt_HeroMalGanisRemoveNightRushAllyVisionSuppression, false);

        TriggerEnable(libHMLG_gt_HeroMalGanisApplyBlindasaBatAllyVisionSuppression, false);

        TriggerEnable(libHMLG_gt_HeroMalGanisRemoveBlindasaBatAllyVisionSuppression, false);

        TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOn, false);

        TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff, false);

        TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOn, false);

        TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff, false);

    }



}



// Triggers

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

// Trigger: Hero - Mal'Ganis - Blind as a Bat Fullscreen Overlay On

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

bool libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOn_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_MalGanisBlindOverlay.StormCutscene", EventUnitBehavior());

    }



    return true;

}



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

void libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOn_Init () {

    libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOn = TriggerCreate("libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOn_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOn, false);

    TriggerAddEventUnitBehaviorChange(libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOn, null, "MalGanisFelClawsBlindAsABatBehavior", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Mal'Ganis - Blind as a Bat Fullscreen Overlay Off

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

bool libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



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

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

    }



    return true;

}



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

void libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff_Init () {

    libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff = TriggerCreate("libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff, false);

    TriggerAddEventUnitBehaviorChange(libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff, null, "MalGanisFelClawsBlindAsABatBehavior", c_unitBehaviorChangeDestroy);

    TriggerAddEventUnitBehaviorChange(libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff, null, "MalGanisFelClawsBlindAsABatBehavior", c_unitBehaviorChangeDeactivate);

}



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

// Trigger: Hero - Mal'Ganis Multi-Hero Blind as a Bat Controller

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

bool libHMLG_gt_HeroMalGanisMultiHeroBlindasaBatController_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_malGanisPlayer;

    int lv_confinedPlayer;

    unitgroup lv_confinedPlayerVisionGroup;

    unit lv_targetUnit;

    int lv_targetplayer;

    playergroup lv_AllyPlayerGroup;

    int lv_pickedPlayer;



    // Automatic Variable Declarations

    playergroup auto463DCE26_g;



    // Variable Initialization

    lv_confinedPlayer = UnitGetOwner(EventUnit());

    lv_confinedPlayerVisionGroup = UnitGroupEmpty();

    lv_targetUnit = EventUnit();

    lv_targetplayer = UnitGetOwner(EventUnit());

    lv_AllyPlayerGroup = PlayerGroupEmpty();



    // Conditions

    if (testConds) {

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

            return false;

        }



        if (!((lv_confinedPlayer > 0))) {

            return false;

        }



        if (!((lv_confinedPlayer < libCore_gv_bALMaxPlayers))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    lv_malGanisPlayer = UnitBehaviorEffectPlayer(lv_targetUnit, "MalGanisFelClawsBlindAsABatBehavior", c_effectPlayerCaster, 0);

    UnitGroupRemove(libHMLG_gv_heroMalGanisBlindasaBatBackupVisionGroups[lv_targetplayer], lv_targetUnit);

    if ((UnitGroupCount(libHMLG_gv_heroMalGanisBlindasaBatBackupVisionGroups[lv_targetplayer], c_unitCountAlive) == 0)) {

        libGame_gf_ShareUnshareVisionOfAlliesForPlayer(false, lv_targetplayer);

        lv_AllyPlayerGroup = libGame_gf_AlliedPlayerGroupOfPlayer(lv_targetplayer);

        auto463DCE26_g = lv_AllyPlayerGroup;

        lv_pickedPlayer = -1;

        while (true) {

            	lv_pickedPlayer = PlayerGroupNextPlayer(auto463DCE26_g, lv_pickedPlayer);

            	if (lv_pickedPlayer<0) { break; }

            	PlayerSetAlliance(lv_pickedPlayer, c_allianceIdSeekHelp, lv_targetplayer, false);

            PlayerSetAlliance(lv_pickedPlayer, c_allianceIdGiveHelp, lv_targetplayer, false);

        }

        VisRevealerEnable(libGame_gv_baseRevealers[lv_targetplayer], false);

    }



    return true;

}



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

void libHMLG_gt_HeroMalGanisMultiHeroBlindasaBatController_Init () {

    libHMLG_gt_HeroMalGanisMultiHeroBlindasaBatController = TriggerCreate("libHMLG_gt_HeroMalGanisMultiHeroBlindasaBatController_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisMultiHeroBlindasaBatController, false);

    TriggerAddEventUnitDied(libHMLG_gt_HeroMalGanisMultiHeroBlindasaBatController, null);

}



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

// Trigger: Hero - Mal'Ganis Apply Blind as a Bat Ally Vision Suppression

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

bool libHMLG_gt_HeroMalGanisApplyBlindasaBatAllyVisionSuppression_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_targetUnit;

    string lv_typeOfTargetUnit;

    int lv_targetplayer;

    int lv_malGanisPlayer;

    unitgroup lv_targetPlayerVisionGroup;

    playergroup lv_AllyPlayerGroup;

    int lv_pickedPlayer;



    // Automatic Variable Declarations

    unitgroup auto88CD32A2_g;

    int auto88CD32A2_u;

    unit auto88CD32A2_var;

    playergroup auto0E946C58_g;



    // Variable Initialization

    lv_targetUnit = EventUnit();

    lv_typeOfTargetUnit = UnitGetType(lv_targetUnit);

    lv_targetplayer = UnitGetOwner(lv_targetUnit);

    lv_malGanisPlayer = UnitBehaviorEffectPlayer(lv_targetUnit, "MalGanisFelClawsBlindAsABatBehavior", c_effectPlayerCaster, 0);

    lv_targetPlayerVisionGroup = UnitGroupEmpty();

    lv_AllyPlayerGroup = PlayerGroupEmpty();



    // Conditions

    if (testConds) {

        if (!((lv_targetplayer > 0))) {

            return false;

        }



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

            return false;

        }



        if (!((lv_malGanisPlayer > 0))) {

            return false;

        }



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

            return false;

        }



        if (!((UnitTypeTestAttribute(lv_typeOfTargetUnit, c_unitAttributeHeroic) == true))) {

            return false;

        }



        if (!(((lv_targetUnit == libGame_gv_players[lv_targetplayer].lv_heroUnit) || (lv_targetUnit == libAIAI_gv_aIHeroes[lv_targetplayer].lv_currentHeroUnit) || (lv_typeOfTargetUnit == "HeroBaleog") || (lv_typeOfTargetUnit == "HeroErik") || (lv_typeOfTargetUnit == "HeroOlaf") || (lv_typeOfTargetUnit == "HeroChenEarth") || (lv_typeOfTargetUnit == "HeroChenFire") || (lv_typeOfTargetUnit == "HeroChenStorm")))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    libHMLG_gv_heroMalGanisBlindasaBatBackupVisionGroups[lv_targetplayer] = UnitGroupEmpty();

    libHMLG_gv_heroMalGanisBlindasaBatTarget += 1;

    auto88CD32A2_g = UnitGroup(null, lv_targetplayer, RegionEntireMap(), UnitFilter((1 << c_targetFilterHeroic), 0, (1 << c_targetFilterAlly) | (1 << c_targetFilterNeutral) | (1 << c_targetFilterEnemy) | (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32)) | (1 << (c_targetFilterInvulnerable - 32))), 0);

    auto88CD32A2_u = UnitGroupCount(auto88CD32A2_g, c_unitCountAll);

    for (;; auto88CD32A2_u -= 1) {

        auto88CD32A2_var = UnitGroupUnitFromEnd(auto88CD32A2_g, auto88CD32A2_u);

        if (auto88CD32A2_var == null) { break; }

        if ((UnitHasBehavior2(auto88CD32A2_var, "MalGanisFelClawsBlindAsABatBehavior") == false) && (UnitGetType(auto88CD32A2_var) != "NovaHoloCloneCloaked") && (UnitGetType(auto88CD32A2_var) != "NovaHoloClone") && (UnitGetType(auto88CD32A2_var) != "RexxarMisha")) {

            UnitGroupAdd(libHMLG_gv_heroMalGanisBlindasaBatBackupVisionGroups[lv_targetplayer], auto88CD32A2_var);

            UnitBehaviorAdd(auto88CD32A2_var, "MalGanisFelClawsBlindAsABatVisionSource", libGame_gv_players[lv_malGanisPlayer].lv_heroUnit, 1);

        }



    }

    if ((UnitGroupCount(libHMLG_gv_heroMalGanisBlindasaBatBackupVisionGroups[lv_targetplayer], c_unitCountAlive) == 0)) {

        libGame_gf_ShareUnshareVisionOfAlliesForPlayer(false, lv_targetplayer);

        lv_AllyPlayerGroup = libGame_gf_AlliedPlayerGroupOfPlayer(lv_targetplayer);

        auto0E946C58_g = lv_AllyPlayerGroup;

        lv_pickedPlayer = -1;

        while (true) {

            	lv_pickedPlayer = PlayerGroupNextPlayer(auto0E946C58_g, lv_pickedPlayer);

            	if (lv_pickedPlayer<0) { break; }

            	PlayerSetAlliance(lv_pickedPlayer, c_allianceIdSeekHelp, lv_targetplayer, false);

            PlayerSetAlliance(lv_pickedPlayer, c_allianceIdGiveHelp, lv_targetplayer, false);

        }

        VisRevealerEnable(libGame_gv_baseRevealers[lv_targetplayer], false);

    }



    if ((libHMLG_gv_heroMalGanisBlindasaBatTarget > 0) && (UnitGroupCount(libHMLG_gv_heroMalGanisBlindasaBatBackupVisionGroups[lv_targetplayer], c_unitCountAlive) > 0)) {

        TriggerEnable(libHMLG_gt_HeroMalGanisMultiHeroBlindasaBatController, true);

    }



    return true;

}



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

void libHMLG_gt_HeroMalGanisApplyBlindasaBatAllyVisionSuppression_Init () {

    libHMLG_gt_HeroMalGanisApplyBlindasaBatAllyVisionSuppression = TriggerCreate("libHMLG_gt_HeroMalGanisApplyBlindasaBatAllyVisionSuppression_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisApplyBlindasaBatAllyVisionSuppression, false);

    TriggerAddEventUnitBehaviorChange(libHMLG_gt_HeroMalGanisApplyBlindasaBatAllyVisionSuppression, null, "MalGanisFelClawsBlindAsABatBehavior", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Mal'Ganis Blind as a Bat Unit Ownership Transfer On

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

bool libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOn_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_targetplayer;



    // Automatic Variable Declarations

    unitgroup auto7E29023C_g;

    int auto7E29023C_u;

    unit auto7E29023C_var;



    // Variable Initialization

    lv_targetplayer = UnitGetOwner(EventUnit());



    // Conditions

    if (testConds) {

        if (!((lv_targetplayer > 0))) {

            return false;

        }



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

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    auto7E29023C_g = UnitGroup(null, lv_targetplayer, RegionEntireMap(), UnitFilter(0, 0, (1 << c_targetFilterSelf) | (1 << c_targetFilterHeroic) | (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0);

    auto7E29023C_u = UnitGroupCount(auto7E29023C_g, c_unitCountAll);

    for (;; auto7E29023C_u -= 1) {

        auto7E29023C_var = UnitGroupUnitFromEnd(auto7E29023C_g, auto7E29023C_u);

        if (auto7E29023C_var == null) { break; }

        UnitGroupAdd(libHMLG_gv_heroMalGanisBlindasaBatForfeitedUnits[lv_targetplayer], auto7E29023C_var);

        if ((libGame_gf_ComputerPlayerInTeam(libGame_gf_TeamNumberOfPlayer(lv_targetplayer)) == libCore_gv_cOMPUTER_TeamChaos)) {

            UnitSetOwner(auto7E29023C_var, libCore_gv_cOMPUTER_TeamChaos, true);

        }

        else {

            UnitSetOwner(auto7E29023C_var, libCore_gv_cOMPUTER_TeamOrder, true);

        }

    }

    return true;

}



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

void libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOn_Init () {

    libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOn = TriggerCreate("libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOn_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOn, false);

    TriggerAddEventUnitBehaviorChange(libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOn, null, "MalGanisFelClawsBlindAsABatBehavior", c_unitBehaviorChangeActivate);

}



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

// Trigger: Hero - Mal'Ganis Blind as a Bat Unit Ownership Transfer Off

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

bool libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_targetPlayer;



    // Automatic Variable Declarations

    unitgroup auto1A3818B8_g;

    int auto1A3818B8_u;

    unit auto1A3818B8_var;



    // Variable Initialization

    lv_targetPlayer = UnitGetOwner(EventUnit());



    // Actions

    if (!runActions) {

        return true;

    }



    auto1A3818B8_g = libHMLG_gv_heroMalGanisBlindasaBatForfeitedUnits[lv_targetPlayer];

    auto1A3818B8_u = UnitGroupCount(auto1A3818B8_g, c_unitCountAll);

    for (;; auto1A3818B8_u -= 1) {

        auto1A3818B8_var = UnitGroupUnitFromEnd(auto1A3818B8_g, auto1A3818B8_u);

        if (auto1A3818B8_var == null) { break; }

        UnitSetOwner(auto1A3818B8_var, lv_targetPlayer, true);

    }

    return true;

}



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

void libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff_Init () {

    libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff = TriggerCreate("libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff, false);

    TriggerAddEventUnitBehaviorChange(libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff, null, "MalGanisFelClawsBlindAsABatBehavior", c_unitBehaviorChangeDestroy);

    TriggerAddEventUnitBehaviorChange(libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff, null, "MalGanisFelClawsBlindAsABatBehavior", c_unitBehaviorChangeDeactivate);

}



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

// Trigger: Hero - Mal'Ganis Remove Blind as a Bat Ally Vision Suppression

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

bool libHMLG_gt_HeroMalGanisRemoveBlindasaBatAllyVisionSuppression_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_targetUnit;

    int lv_targetPlayer;

    int lv_malGanisPlayer;

    playergroup lv_allyPlayerGroup;

    int lv_pickedPlayer;



    // Automatic Variable Declarations

    unitgroup auto4FC5C26D_g;

    int auto4FC5C26D_u;

    unit auto4FC5C26D_var;

    playergroup auto53401066_g;



    // Variable Initialization

    lv_targetUnit = EventPlayerEffectUsedUnit(c_effectUnitTarget);

    lv_targetPlayer = UnitGetOwner(lv_targetUnit);

    lv_malGanisPlayer = EventPlayerEffectUsedUnitOwner(c_effectPlayerCaster);

    lv_allyPlayerGroup = PlayerGroupEmpty();



    // Conditions

    if (testConds) {

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

            return false;

        }



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

            return false;

        }



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

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    auto4FC5C26D_g = libHMLG_gv_heroMalGanisBlindasaBatBackupVisionGroups[lv_targetPlayer];

    auto4FC5C26D_u = UnitGroupCount(auto4FC5C26D_g, c_unitCountAll);

    for (;; auto4FC5C26D_u -= 1) {

        auto4FC5C26D_var = UnitGroupUnitFromEnd(auto4FC5C26D_g, auto4FC5C26D_u);

        if (auto4FC5C26D_var == null) { break; }

        UnitBehaviorRemove(auto4FC5C26D_var, "MalGanisFelClawsBlindAsABatVisionSource", 1);

    }

    libGame_gf_ShareUnshareVisionOfAlliesForPlayer(true, lv_targetPlayer);

    lv_allyPlayerGroup = libGame_gf_AlliedPlayerGroupOfPlayer(lv_targetPlayer);

    auto53401066_g = lv_allyPlayerGroup;

    lv_pickedPlayer = -1;

    while (true) {

        	lv_pickedPlayer = PlayerGroupNextPlayer(auto53401066_g, lv_pickedPlayer);

        	if (lv_pickedPlayer<0) { break; }

        	PlayerSetAlliance(lv_pickedPlayer, c_allianceIdSeekHelp, lv_targetPlayer, true);

        PlayerSetAlliance(lv_pickedPlayer, c_allianceIdGiveHelp, lv_targetPlayer, true);

    }

    VisRevealerEnable(libGame_gv_baseRevealers[lv_targetPlayer], true);

    libHMLG_gv_heroMalGanisBlindasaBatTarget -= 1;

    if ((libHMLG_gv_heroMalGanisBlindasaBatTarget == 0)) {

        TriggerEnable(libHMLG_gt_HeroMalGanisMultiHeroBlindasaBatController, false);

    }



    return true;

}



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

void libHMLG_gt_HeroMalGanisRemoveBlindasaBatAllyVisionSuppression_Init () {

    libHMLG_gt_HeroMalGanisRemoveBlindasaBatAllyVisionSuppression = TriggerCreate("libHMLG_gt_HeroMalGanisRemoveBlindasaBatAllyVisionSuppression_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisRemoveBlindasaBatAllyVisionSuppression, false);

    TriggerAddEventPlayerEffectUsed(libHMLG_gt_HeroMalGanisRemoveBlindasaBatAllyVisionSuppression, c_playerAny, "MalGanisFelClawsBlindAsABatVisionDummy");

}



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

// Trigger: Hero - Mal'Ganis - Dark Conversion

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

bool libHMLG_gt_HeroMalGanisDarkConversion_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_castingUnit;

    unit lv_targetUnit;

    int lv_castingPlayer;

    fixed lv_durationValue;

    fixed lv_castingUnitHealthPercent;

    fixed lv_targetUnitHealthPercent;

    unit lv_higherHealthUnit;

    unit lv_lowerHealthUnit;

    fixed lv_higherHealthUnitCurrentHealth;

    fixed lv_lowerHealthUnitCurrentHealth;

    fixed lv_higherHealthUnitNewHealth;

    fixed lv_lowerHealthUnitNewHealth;

    fixed lv_higherHealthIncrementValue;

    fixed lv_lowerHealthIncrementValue;

    fixed lv_wrathOfNathrezaAoESwapMultiplier;

    fixed lv_wrathOfNathrezaIncrementValue;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_castingUnit = EventPlayerEffectUsedUnitLaunch();

    lv_targetUnit = EventPlayerEffectUsedUnitImpact();

    lv_castingPlayer = UnitGetOwner(lv_castingUnit);

    lv_durationValue = (CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, "MalGanisDarkConversionSwapDoT", "Duration", lv_castingPlayer) / CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, "MalGanisDarkConversionSwapDoT", "Period", lv_castingPlayer));

    lv_castingUnitHealthPercent = UnitGetPropertyFixed(lv_castingUnit, c_unitPropLifePercent, c_unitPropCurrent);

    lv_targetUnitHealthPercent = UnitGetPropertyFixed(lv_targetUnit, c_unitPropLifePercent, c_unitPropCurrent);

    lv_wrathOfNathrezaAoESwapMultiplier = CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "MalGanisDarkConversionWrathOfNathrezaAoESwapMultiplier", "Amount", lv_castingPlayer);



    // Conditions

    if (testConds) {

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

            return false;

        }



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

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    if ((lv_castingUnitHealthPercent >= lv_targetUnitHealthPercent)) {

        lv_higherHealthUnit = lv_castingUnit;

        lv_lowerHealthUnit = lv_targetUnit;

    }

    else {

        lv_higherHealthUnit = lv_targetUnit;

        lv_lowerHealthUnit = lv_castingUnit;

    }

    lv_higherHealthUnitCurrentHealth = UnitGetPropertyFixed(lv_higherHealthUnit, c_unitPropLife, c_unitPropCurrent);

    lv_lowerHealthUnitCurrentHealth = UnitGetPropertyFixed(lv_lowerHealthUnit, c_unitPropLife, c_unitPropCurrent);

    lv_higherHealthUnitNewHealth = (UnitGetPropertyFixed(lv_higherHealthUnit, c_unitPropLifeMax, c_unitPropCurrent) * (UnitGetPropertyFixed(lv_lowerHealthUnit, c_unitPropLifePercent, c_unitPropCurrent) / 100.0));

    lv_lowerHealthUnitNewHealth = (UnitGetPropertyFixed(lv_lowerHealthUnit, c_unitPropLifeMax, c_unitPropCurrent) * (UnitGetPropertyFixed(lv_higherHealthUnit, c_unitPropLifePercent, c_unitPropCurrent) / 100.0));

    lv_higherHealthIncrementValue = ((lv_higherHealthUnitCurrentHealth - lv_higherHealthUnitNewHealth) / lv_durationValue);

    lv_lowerHealthIncrementValue = ((lv_lowerHealthUnitNewHealth - lv_lowerHealthUnitCurrentHealth) / lv_durationValue);

    CatalogFieldValueSet(c_gameCatalogEffect, "MalGanisDarkConversionSwapDamage", "Amount", lv_castingPlayer, FixedToString(lv_higherHealthIncrementValue, c_fixedPrecisionAny));

    CatalogFieldValueSet(c_gameCatalogEffect, "MalGanisDarkConversionSwapHeal", "RechargeVitalRate", lv_castingPlayer, FixedToString(lv_lowerHealthIncrementValue, c_fixedPrecisionAny));

    if ((UnitIsAlive(lv_higherHealthUnit) == true)) {

        UnitBehaviorAdd(lv_higherHealthUnit, "MalGanisDarkConversionSwapDoT", lv_castingUnit, 1);

    }



    if ((UnitIsAlive(lv_lowerHealthUnit) == true)) {

        UnitBehaviorAdd(lv_lowerHealthUnit, "MalGanisDarkConversionSwapHoT", lv_castingUnit, 1);

    }



    if ((lv_higherHealthUnit == lv_castingUnit)) {

        UnitCreateEffectUnit(lv_castingUnit, "MalGanisDarkConversionHurtSelfDummy", lv_castingUnit);

    }



    if ((PlayerHasTalent(lv_castingPlayer, "MalGanisDarkConversionWrathOfNathreza") == true)) {

        lv_wrathOfNathrezaIncrementValue = (lv_higherHealthIncrementValue * lv_wrathOfNathrezaAoESwapMultiplier);

        CatalogFieldValueSet(c_gameCatalogEffect, "MalGanisDarkConversionWrathOfNathrezaSwapDamage", "Amount", lv_castingPlayer, FixedToString(lv_wrathOfNathrezaIncrementValue, c_fixedPrecisionAny));

        UnitCreateEffectUnit(lv_castingUnit, "MalGanisDarkConversionWrathOfNathrezaSearch", lv_targetUnit);

        UnitCreateEffectUnit(lv_castingUnit, "MalGanisDarkConversionWrathOfNathrezaReveal", lv_targetUnit);

    }



    return true;

}



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

void libHMLG_gt_HeroMalGanisDarkConversion_Init () {

    libHMLG_gt_HeroMalGanisDarkConversion = TriggerCreate("libHMLG_gt_HeroMalGanisDarkConversion_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisDarkConversion, false);

    TriggerAddEventPlayerEffectUsed(libHMLG_gt_HeroMalGanisDarkConversion, c_playerAny, "MalGanisDarkConversionActivationDummy");

}



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

// Trigger: Hero - Mal'Ganis Multi-Hero Night Rush Controller

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

bool libHMLG_gt_HeroMalGanisMultiHeroNightRushController_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_malGanisPlayer;

    int lv_confinedPlayer;

    unitgroup lv_confinedPlayerVisionGroup;

    unit lv_targetUnit;

    int lv_targetplayer;

    playergroup lv_AllyPlayerGroup;

    int lv_pickedPlayer;



    // Automatic Variable Declarations

    playergroup auto6743833F_g;



    // Variable Initialization

    lv_confinedPlayer = UnitGetOwner(EventUnit());

    lv_confinedPlayerVisionGroup = UnitGroupEmpty();

    lv_targetUnit = EventUnit();

    lv_targetplayer = UnitGetOwner(EventUnit());

    lv_AllyPlayerGroup = PlayerGroupEmpty();



    // Conditions

    if (testConds) {

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

            return false;

        }



        if (!((lv_confinedPlayer > 0))) {

            return false;

        }



        if (!((lv_confinedPlayer < libCore_gv_bALMaxPlayers))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    lv_malGanisPlayer = UnitBehaviorEffectPlayer(lv_targetUnit, "MalGanisNightRushAloneInTheDarkTrigger", c_effectPlayerCaster, 0);

    UnitGroupRemove(libHMLG_gv_heroMalGanisNightRushBackupVisionGroups[lv_targetplayer], lv_targetUnit);

    if ((UnitGroupCount(libHMLG_gv_heroMalGanisNightRushBackupVisionGroups[lv_targetplayer], c_unitCountAlive) == 0)) {

        libGame_gf_ShareUnshareVisionOfAlliesForPlayer(false, lv_targetplayer);

        lv_AllyPlayerGroup = libGame_gf_AlliedPlayerGroupOfPlayer(lv_targetplayer);

        auto6743833F_g = lv_AllyPlayerGroup;

        lv_pickedPlayer = -1;

        while (true) {

            	lv_pickedPlayer = PlayerGroupNextPlayer(auto6743833F_g, lv_pickedPlayer);

            	if (lv_pickedPlayer<0) { break; }

            	PlayerSetAlliance(lv_pickedPlayer, c_allianceIdSeekHelp, lv_targetplayer, false);

            PlayerSetAlliance(lv_pickedPlayer, c_allianceIdGiveHelp, lv_targetplayer, false);

        }

        VisRevealerEnable(libGame_gv_baseRevealers[lv_targetplayer], false);

    }



    return true;

}



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

void libHMLG_gt_HeroMalGanisMultiHeroNightRushController_Init () {

    libHMLG_gt_HeroMalGanisMultiHeroNightRushController = TriggerCreate("libHMLG_gt_HeroMalGanisMultiHeroNightRushController_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisMultiHeroNightRushController, false);

    TriggerAddEventUnitDied(libHMLG_gt_HeroMalGanisMultiHeroNightRushController, null);

}



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

// Trigger: Hero - Mal'Ganis Apply Night Rush Ally Vision Suppression

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

bool libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_targetUnit;

    string lv_typeOfTargetUnit;

    int lv_targetplayer;

    int lv_malGanisPlayer;

    unitgroup lv_targetPlayerVisionGroup;

    playergroup lv_AllyPlayerGroup;

    int lv_pickedPlayer;



    // Automatic Variable Declarations

    unitgroup autoB934D5FC_g;

    int autoB934D5FC_u;

    unit autoB934D5FC_var;

    playergroup auto3D7CA02B_g;



    // Variable Initialization

    lv_targetUnit = EventUnit();

    lv_typeOfTargetUnit = UnitGetType(lv_targetUnit);

    lv_targetplayer = UnitGetOwner(lv_targetUnit);

    lv_malGanisPlayer = UnitBehaviorEffectPlayer(lv_targetUnit, "MalGanisNightRushAloneInTheDarkTrigger", c_effectPlayerCaster, 0);

    lv_targetPlayerVisionGroup = UnitGroupEmpty();

    lv_AllyPlayerGroup = PlayerGroupEmpty();



    // Conditions

    if (testConds) {

        if (!((lv_targetplayer > 0))) {

            return false;

        }



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

            return false;

        }



        if (!((lv_malGanisPlayer > 0))) {

            return false;

        }



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

            return false;

        }



        if (!((UnitTypeTestAttribute(lv_typeOfTargetUnit, c_unitAttributeHeroic) == true))) {

            return false;

        }



        if (!(((lv_targetUnit == libGame_gv_players[lv_targetplayer].lv_heroUnit) || (lv_targetUnit == libAIAI_gv_aIHeroes[lv_targetplayer].lv_currentHeroUnit) || (lv_typeOfTargetUnit == "HeroBaleog") || (lv_typeOfTargetUnit == "HeroErik") || (lv_typeOfTargetUnit == "HeroOlaf") || (lv_typeOfTargetUnit == "HeroChenEarth") || (lv_typeOfTargetUnit == "HeroChenFire") || (lv_typeOfTargetUnit == "HeroChenStorm")))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    libHMLG_gv_heroMalGanisNightRushBackupVisionGroups[lv_targetplayer] = UnitGroupEmpty();

    libHMLG_gv_heroMalGanisActiveNightRushTargets += 1;

    autoB934D5FC_g = UnitGroup(null, lv_targetplayer, RegionEntireMap(), UnitFilter((1 << c_targetFilterHeroic), 0, (1 << c_targetFilterAlly) | (1 << c_targetFilterNeutral) | (1 << c_targetFilterEnemy) | (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32)) | (1 << (c_targetFilterInvulnerable - 32))), 0);

    autoB934D5FC_u = UnitGroupCount(autoB934D5FC_g, c_unitCountAll);

    for (;; autoB934D5FC_u -= 1) {

        autoB934D5FC_var = UnitGroupUnitFromEnd(autoB934D5FC_g, autoB934D5FC_u);

        if (autoB934D5FC_var == null) { break; }

        if ((UnitHasBehavior2(autoB934D5FC_var, "MalGanisNightRushAloneInTheDarkTrigger") == false) && (UnitGetType(autoB934D5FC_var) != "NovaHoloCloneCloaked") && (UnitGetType(autoB934D5FC_var) != "NovaHoloClone") && (UnitGetType(autoB934D5FC_var) != "RexxarMisha")) {

            UnitGroupAdd(libHMLG_gv_heroMalGanisNightRushBackupVisionGroups[lv_targetplayer], autoB934D5FC_var);

            UnitBehaviorAdd(autoB934D5FC_var, "MalGanisNightRushAloneInTheDarkVisionSource", libGame_gv_players[lv_malGanisPlayer].lv_heroUnit, 1);

        }



    }

    if ((UnitGroupCount(libHMLG_gv_heroMalGanisNightRushBackupVisionGroups[lv_targetplayer], c_unitCountAlive) == 0)) {

        libGame_gf_ShareUnshareVisionOfAlliesForPlayer(false, lv_targetplayer);

        lv_AllyPlayerGroup = libGame_gf_AlliedPlayerGroupOfPlayer(lv_targetplayer);

        auto3D7CA02B_g = lv_AllyPlayerGroup;

        lv_pickedPlayer = -1;

        while (true) {

            	lv_pickedPlayer = PlayerGroupNextPlayer(auto3D7CA02B_g, lv_pickedPlayer);

            	if (lv_pickedPlayer<0) { break; }

            	PlayerSetAlliance(lv_pickedPlayer, c_allianceIdSeekHelp, lv_targetplayer, false);

            PlayerSetAlliance(lv_pickedPlayer, c_allianceIdGiveHelp, lv_targetplayer, false);

        }

        VisRevealerEnable(libGame_gv_baseRevealers[lv_targetplayer], false);

    }



    if ((libHMLG_gv_heroMalGanisActiveNightRushTargets > 0) && (UnitGroupCount(libHMLG_gv_heroMalGanisNightRushBackupVisionGroups[lv_targetplayer], c_unitCountAlive) > 0)) {

        TriggerEnable(libHMLG_gt_HeroMalGanisMultiHeroNightRushController, true);

    }



    return true;

}



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

void libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression_Init () {

    libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression = TriggerCreate("libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression, false);

    TriggerAddEventUnitBehaviorChange(libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression, null, "MalGanisNightRushAloneInTheDarkTrigger", c_unitBehaviorChangeActivate);

    TriggerAddEventUnitBehaviorChange(libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression, null, "MalGanisNightRushAloneInTheDarkTrigger", c_unitBehaviorChangeRefresh);

}



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

// Trigger: Hero - Mal'Ganis Remove Night Rush Ally Vision Suppression

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

bool libHMLG_gt_HeroMalGanisRemoveNightRushAllyVisionSuppression_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_targetUnit;

    int lv_targetPlayer;

    int lv_malGanisPlayer;

    playergroup lv_allyPlayerGroup;

    int lv_pickedPlayer;



    // Automatic Variable Declarations

    unitgroup auto0FF56D1D_g;

    int auto0FF56D1D_u;

    unit auto0FF56D1D_var;

    playergroup auto5ED0F947_g;



    // Variable Initialization

    lv_targetUnit = EventPlayerEffectUsedUnit(c_effectUnitTarget);

    lv_targetPlayer = UnitGetOwner(lv_targetUnit);

    lv_malGanisPlayer = EventPlayerEffectUsedUnitOwner(c_effectPlayerCaster);

    lv_allyPlayerGroup = PlayerGroupEmpty();



    // Conditions

    if (testConds) {

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

            return false;

        }



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

            return false;

        }



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

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    auto0FF56D1D_g = libHMLG_gv_heroMalGanisNightRushBackupVisionGroups[lv_targetPlayer];

    auto0FF56D1D_u = UnitGroupCount(auto0FF56D1D_g, c_unitCountAll);

    for (;; auto0FF56D1D_u -= 1) {

        auto0FF56D1D_var = UnitGroupUnitFromEnd(auto0FF56D1D_g, auto0FF56D1D_u);

        if (auto0FF56D1D_var == null) { break; }

        UnitBehaviorRemove(auto0FF56D1D_var, "MalGanisNightRushAloneInTheDarkVisionSource", 1);

    }

    if ((UnitHasBehaviorWithCategoryFlag(lv_targetUnit, c_behaviorCategoryVisionRemoval) == false)) {

        libGame_gf_ShareUnshareVisionOfAlliesForPlayer(true, lv_targetPlayer);

        lv_allyPlayerGroup = libGame_gf_AlliedPlayerGroupOfPlayer(lv_targetPlayer);

        auto5ED0F947_g = lv_allyPlayerGroup;

        lv_pickedPlayer = -1;

        while (true) {

            	lv_pickedPlayer = PlayerGroupNextPlayer(auto5ED0F947_g, lv_pickedPlayer);

            	if (lv_pickedPlayer<0) { break; }

            	PlayerSetAlliance(lv_pickedPlayer, c_allianceIdSeekHelp, lv_targetPlayer, true);

            PlayerSetAlliance(lv_pickedPlayer, c_allianceIdGiveHelp, lv_targetPlayer, true);

        }

        VisRevealerEnable(libGame_gv_baseRevealers[lv_targetPlayer], true);

        libHMLG_gv_heroMalGanisActiveNightRushTargets -= 1;

    }



    if ((libHMLG_gv_heroMalGanisActiveNightRushTargets == 0)) {

        TriggerEnable(libHMLG_gt_HeroMalGanisMultiHeroNightRushController, false);

    }



    return true;

}



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

void libHMLG_gt_HeroMalGanisRemoveNightRushAllyVisionSuppression_Init () {

    libHMLG_gt_HeroMalGanisRemoveNightRushAllyVisionSuppression = TriggerCreate("libHMLG_gt_HeroMalGanisRemoveNightRushAllyVisionSuppression_Func");

    TriggerEnable(libHMLG_gt_HeroMalGanisRemoveNightRushAllyVisionSuppression, false);

    TriggerAddEventPlayerEffectUsed(libHMLG_gt_HeroMalGanisRemoveNightRushAllyVisionSuppression, c_playerAny, "MalGanisNightRushAloneInTheDarkVisionDummy");

}



void libHMLG_InitTriggers () {

    libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOn_Init();

    libHMLG_gt_HeroMalGanisBlindasaBatFullscreenOverlayOff_Init();

    libHMLG_gt_HeroMalGanisMultiHeroBlindasaBatController_Init();

    libHMLG_gt_HeroMalGanisApplyBlindasaBatAllyVisionSuppression_Init();

    libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOn_Init();

    libHMLG_gt_HeroMalGanisBlindasaBatUnitOwnershipTransferOff_Init();

    libHMLG_gt_HeroMalGanisRemoveBlindasaBatAllyVisionSuppression_Init();

    libHMLG_gt_HeroMalGanisDarkConversion_Init();

    libHMLG_gt_HeroMalGanisMultiHeroNightRushController_Init();

    libHMLG_gt_HeroMalGanisApplyNightRushAllyVisionSuppression_Init();

    libHMLG_gt_HeroMalGanisRemoveNightRushAllyVisionSuppression_Init();

}



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

// Library Initialization

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

bool libHMLG_InitLib_completed = false;



void libHMLG_InitLib () {

    if (libHMLG_InitLib_completed) {

        return;

    }



    libHMLG_InitLib_completed = true;



    libHMLG_InitLibraries();

    libHMLG_InitVariables();

    libHMLG_InitTriggers();

}