include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"

include "TriggerLibs/MapMechanicsLib"

include "TriggerLibs/StartingExperienceLib"

include "TriggerLibs/SoundLib"



include "LibMLHH_h"



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

// Library: Heaven & Hell

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

// External Library Initialization

void libMLHH_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

    libMapM_InitVariables();

    libStEx_InitVariables();

    libSond_InitVariables();

}



// Variable Initialization

bool libMLHH_InitVariables_completed = false;



void libMLHH_InitVariables () {

    int init_i;



    if (libMLHH_InitVariables_completed) {

        return;

    }



    libMLHH_InitVariables_completed = true;



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

        libMLHH_gv_hHRackTextTags[init_i] = c_textTagNone;

    }

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

        libMLHH_gv_heroVO_LegendaryFlippedVOTimers[init_i] = TimerCreate();

    }

    libMLHH_gv_hHLootLoopCount_C = 15;

}



// Functions

fixed libMLHH_gf_HHDetermineAngle (int lp_playerNumber, int lp_numberOfPoints) {

    // Automatic Variable Declarations

    // Implementation

    return ((lp_playerNumber * 360.0) / lp_numberOfPoints);

}



// Triggers

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

// Trigger: Debug - Giant Demons

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

bool libMLHH_gt_DebugGiantDemons_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_itUnit;



    // Automatic Variable Declarations

    unitgroup autoB0024A7B_g;

    int autoB0024A7B_u;

    unitgroup autoE76B01CE_g;

    int autoE76B01CE_u;



    // Variable Initialization



    // Conditions

    if (testConds) {

        if (!((libCore_gv_dEBUGDebuggingEnabled == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    autoB0024A7B_g = UnitGroup("Hell_GiantDemon_Base", c_playerAny, RegionEntireMap(), UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0);

    autoB0024A7B_u = UnitGroupCount(autoB0024A7B_g, c_unitCountAll);

    for (;; autoB0024A7B_u -= 1) {

        lv_itUnit = UnitGroupUnitFromEnd(autoB0024A7B_g, autoB0024A7B_u);

        if (lv_itUnit == null) { break; }

        ActorSend(libNtve_gf_MainActorofUnit(lv_itUnit), "AnimGroupApply Alternate");

        Wait(5.0, c_timeGame);

        ActorSend(libNtve_gf_MainActorofUnit(lv_itUnit), "AnimGroupRemove Alternate");

    }

    autoE76B01CE_g = UnitGroup("Hell_GiantDemon_Chains", c_playerAny, RegionEntireMap(), UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0);

    autoE76B01CE_u = UnitGroupCount(autoE76B01CE_g, c_unitCountAll);

    for (;; autoE76B01CE_u -= 1) {

        lv_itUnit = UnitGroupUnitFromEnd(autoE76B01CE_g, autoE76B01CE_u);

        if (lv_itUnit == null) { break; }

        ActorSend(libNtve_gf_MainActorofUnit(lv_itUnit), "AnimGroupApply Alternate");

        Wait(5.0, c_timeGame);

        ActorSend(libNtve_gf_MainActorofUnit(lv_itUnit), "AnimGroupRemove Alternate");

    }

    return true;

}



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

void libMLHH_gt_DebugGiantDemons_Init () {

    libMLHH_gt_DebugGiantDemons = TriggerCreate("libMLHH_gt_DebugGiantDemons_Func");

    TriggerAddEventChatMessage(libMLHH_gt_DebugGiantDemons, c_playerAny, "ccc", true);

}



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

// Trigger: #Include HH

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

bool libMLHH_gt_IncludeHH_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    libMapM_gf_InitializeSiegeTrooperMercType(libMapM_ge_JungleCampMercTypes_SiegeCamp1, StringExternal("Param/Value/lib_MLHH_6A2136A0"));

    libMapM_gf_InitializeSummonerMercType(libMapM_ge_JungleCampMercTypes_BruiserCamp1, StringExternal("Param/Value/lib_MLHH_BEEB4194"), StringExternal("Param/Value/lib_MLHH_D450C33E"));

    return true;

}



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

void libMLHH_gt_IncludeHH_Init () {

    libMLHH_gt_IncludeHH = TriggerCreate("libMLHH_gt_IncludeHH_Func");

}



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

// Trigger: MMHH Init

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

bool libMLHH_gt_MMHHInit_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    TechTreeUpgradeAddLevel(libStEx_gv_pLAYER_11_ORDER, "IsHeaven", 1);

    TechTreeUpgradeAddLevel(libStEx_gv_pLAYER_12_CHAOS, "IsHeaven", 1);

    return true;

}



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

void libMLHH_gt_MMHHInit_Init () {

    libMLHH_gt_MMHHInit = TriggerCreate("libMLHH_gt_MMHHInit_Func");

    libGame_gf_GameOpenTimerStarted(libMLHH_gt_MMHHInit);

}



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

// Trigger: HH Weapon Rack Broken

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

bool libMLHH_gt_HHWeaponRackBroken_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Actions

    if (!runActions) {

        return true;

    }



    libMLHH_gv_hHWeaponRackBroken = true;

    TriggerEnable(TriggerGetCurrent(), false);

    return true;

}



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

void libMLHH_gt_HHWeaponRackBroken_Init () {

    libMLHH_gt_HHWeaponRackBroken = TriggerCreate("libMLHH_gt_HHWeaponRackBroken_Func");

    TriggerAddEventPlayerEffectUsed(libMLHH_gt_HHWeaponRackBroken, c_playerAny, "WeaponRackClickApplyFlippableBehavior");

}



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

// Trigger: HH Weapon Flipped

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

bool libMLHH_gt_HHWeaponFlipped_Func (bool testConds, bool runActions) {

    // Automatic Variable Declarations

    // Conditions

    if (testConds) {

        if (!(((UnitGetType(EventUnit()) == "WeaponRackSpecialHeaven") || (UnitGetType(EventUnit()) == "WeaponRackSpecialHell")))) {

            return false;

        }



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

            return false;

        }



        if (!((UnitHasBehavior2(EventUnit(), "WeaponRackPreventTextBehavior") == false))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    if ((libMLHH_gv_hHRackTextTags[EventPlayer()] != c_textTagNone)) {

        TextTagDestroy(libMLHH_gv_hHRackTextTags[EventPlayer()]);

    }



    TextTagCreate(StringExternal("Param/Value/lib_MLHH_232BD0E2"), 15, PointWithOffset(UnitGetPosition(EventUnit()), 0.0, -2.0), 2.0, true, false, PlayerGroupSingle(EventPlayer()));

    TextTagSetTime(TextTagLastCreated(), c_textTagTimeDuration, 2.0);

    TextTagSetTime(TextTagLastCreated(), c_textTagTimeFadeOut, 1.75);

    TextTagSetTime(TextTagLastCreated(), c_textTagTimeFadeDuration, 0.25);

    libMLHH_gv_hHRackTextTags[EventPlayer()] = TextTagLastCreated();

    if ((TimerGetRemaining(libMLHH_gv_heroVO_LegendaryFlippedVOTimers[EventPlayer()]) == 0.0)) {

        TimerStart(libMLHH_gv_heroVO_LegendaryFlippedVOTimers[EventPlayer()], libMLHH_gv_heroVO_LegendaryFlippedVOTimerCooldown_C, false, c_timeGame);

        Wait(0.5, c_timeGame);

        libSond_gf_HeroVOPlayHeroLine(libCore_ge_HeroVOEvents_No, EventPlayer(), libCore_gv_playerGroupFromPlayer[EventPlayer()]);

    }



    return true;

}



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

void libMLHH_gt_HHWeaponFlipped_Init () {

    libMLHH_gt_HHWeaponFlipped = TriggerCreate("libMLHH_gt_HHWeaponFlipped_Func");

    TriggerAddEventUnitClick(libMLHH_gt_HHWeaponFlipped, null, c_playerAny);

}



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

// Trigger: HH Core Dies

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

bool libMLHH_gt_HHCoreDies_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_itCount;

    point lv_deadCorePosition;

    unit lv_livingCore;

    int lv_remainingWeaponDrops;

    int lv_legendaryDrops;

    int lv_setDrops;

    int lv_randomWeapon;

    playergroup lv_lootRingPlayerGroup;

    int lv_lootRingSize;

    int lv_lootRingSizeIncrement;

    fixed lv_angleOffset;

    fixed lv_angleOffsetIncrement;

    fixed lv_distance;

    fixed lv_distanceIncrement;

    int lv_randomLootRingPlayer;

    int lv_itPlayer;

    fixed lv_treasureDelay;

    bool lv_easterEgg;

    fixed lv_easterEggDelay;



    // Automatic Variable Declarations

    int auto2A4549F6_ae;

    const int auto2A4549F6_ai = 1;

    int auto31ABD6CD_ae;

    const int auto31ABD6CD_ai = 1;

    int auto04098EA8_ae;

    const int auto04098EA8_ai = 1;

    int autoD720B40D_ae;

    const int autoD720B40D_ai = 1;

    int auto80D413D1_ae;

    const int auto80D413D1_ai = 1;



    // Variable Initialization

    lv_deadCorePosition = UnitGetPosition(EventUnit());

    lv_livingCore = libGame_gv_teams[libGame_gf_EnemyTeamNumberOfPlayer(EventPlayer())].lv_core;

    lv_remainingWeaponDrops = libMLHH_gv_hHLootLoopCount_C;

    lv_legendaryDrops = RandomInt(1, 3);

    lv_setDrops = RandomInt(1, 2);

    lv_lootRingPlayerGroup = PlayerGroupEmpty();

    lv_lootRingSize = 15;

    lv_angleOffsetIncrement = 12.0;

    lv_distance = 5.0;

    lv_distanceIncrement = 1.75;

    lv_treasureDelay = 0.0625;



    // Actions

    if (!runActions) {

        return true;

    }



    auto2A4549F6_ae = lv_lootRingSize;

    lv_itPlayer = 1;

    for ( ; ( (auto2A4549F6_ai >= 0 && lv_itPlayer <= auto2A4549F6_ae) || (auto2A4549F6_ai < 0 && lv_itPlayer >= auto2A4549F6_ae) ) ; lv_itPlayer += auto2A4549F6_ai ) {

        PlayerGroupAdd(lv_lootRingPlayerGroup, lv_itPlayer);

    }

    Wait(2.75, c_timeGame);

    auto31ABD6CD_ae = libMLHH_gv_hHLootLoopCount_C;

    lv_itCount = 1;

    for ( ; ( (auto31ABD6CD_ai >= 0 && lv_itCount <= auto31ABD6CD_ae) || (auto31ABD6CD_ai < 0 && lv_itCount >= auto31ABD6CD_ae) ) ; lv_itCount += auto31ABD6CD_ai ) {

        if ((PlayerGroupCount(lv_lootRingPlayerGroup) == 0)) {

            lv_lootRingSize += lv_lootRingSizeIncrement;

            lv_distance += lv_distanceIncrement;

            lv_angleOffset += lv_angleOffsetIncrement;

            auto04098EA8_ae = lv_lootRingSize;

            lv_itPlayer = 1;

            for ( ; ( (auto04098EA8_ai >= 0 && lv_itPlayer <= auto04098EA8_ae) || (auto04098EA8_ai < 0 && lv_itPlayer >= auto04098EA8_ae) ) ; lv_itPlayer += auto04098EA8_ai ) {

                PlayerGroupAdd(lv_lootRingPlayerGroup, lv_itPlayer);

            }

        }



        if ((libMLHH_gv_hHWeaponRackBroken == true)) {

            if ((lv_livingCore == libGame_gv_teams[libGame_gv_teamOrderIndex_C].lv_core)) {

                lv_randomLootRingPlayer = 13;

            }

            else {

                lv_randomLootRingPlayer = 10;

            }

            PlayerGroupRemove(lv_lootRingPlayerGroup, lv_randomLootRingPlayer);

            UnitCreateEffectPoint(lv_livingCore, "LootExplosionTreasureGoblinSet", PointWithOffsetPolar(lv_deadCorePosition, lv_distance, libMLHH_gf_HHDetermineAngle(lv_randomLootRingPlayer, lv_lootRingSize)));

            libMLHH_gv_hHWeaponRackBroken = false;

            lv_easterEgg = true;

        }

        else {

            lv_randomLootRingPlayer = PlayerGroupPlayer(lv_lootRingPlayerGroup, RandomInt(1, PlayerGroupCount(lv_lootRingPlayerGroup)));

            PlayerGroupRemove(lv_lootRingPlayerGroup, lv_randomLootRingPlayer);

            UnitCreateEffectPoint(lv_livingCore, "LootExplosionGoldPileSet", PointWithOffsetPolar(lv_deadCorePosition, (lv_distance + RandomFixed(0.0, 0.5)), (libMLHH_gf_HHDetermineAngle(lv_randomLootRingPlayer, lv_lootRingSize) + (lv_angleOffset + RandomFixed(-5.0, 5.0)))));

        }

        if ((lv_easterEgg == false)) {

            Wait(lv_treasureDelay, c_timeGame);

        }



        if ((PlayerGroupCount(lv_lootRingPlayerGroup) == 0)) {

            lv_lootRingSize += lv_lootRingSizeIncrement;

            lv_distance += lv_distanceIncrement;

            lv_angleOffset += lv_angleOffsetIncrement;

            autoD720B40D_ae = lv_lootRingSize;

            lv_itPlayer = 1;

            for ( ; ( (autoD720B40D_ai >= 0 && lv_itPlayer <= autoD720B40D_ae) || (autoD720B40D_ai < 0 && lv_itPlayer >= autoD720B40D_ae) ) ; lv_itPlayer += autoD720B40D_ai ) {

                PlayerGroupAdd(lv_lootRingPlayerGroup, lv_itPlayer);

            }

        }



        lv_randomLootRingPlayer = PlayerGroupPlayer(lv_lootRingPlayerGroup, RandomInt(1, PlayerGroupCount(lv_lootRingPlayerGroup)));

        PlayerGroupRemove(lv_lootRingPlayerGroup, lv_randomLootRingPlayer);

        lv_randomWeapon = RandomInt(1, lv_remainingWeaponDrops);

        if ((lv_randomWeapon <= lv_legendaryDrops)) {

            UnitCreateEffectPoint(lv_livingCore, "LootExplosionOrangeWeaponSet", PointWithOffsetPolar(lv_deadCorePosition, (lv_distance + RandomFixed(0.0, 0.5)), (libMLHH_gf_HHDetermineAngle(lv_randomLootRingPlayer, lv_lootRingSize) + (lv_angleOffset + RandomFixed(-5.0, 5.0)))));

            lv_legendaryDrops -= 1;

        }

        else if ((lv_randomWeapon <= (lv_legendaryDrops + lv_setDrops))) {

            UnitCreateEffectPoint(lv_livingCore, "LootExplosionGreenWeaponSet", PointWithOffsetPolar(lv_deadCorePosition, (lv_distance + RandomFixed(0.0, 0.5)), (libMLHH_gf_HHDetermineAngle(lv_randomLootRingPlayer, lv_lootRingSize) + (lv_angleOffset + RandomFixed(-5.0, 5.0)))));

            lv_setDrops -= 1;

        }

        else if ((lv_randomWeapon <= lv_remainingWeaponDrops)) {

            UnitCreateEffectPoint(lv_livingCore, "LootExplosionBlueWeaponSet", PointWithOffsetPolar(lv_deadCorePosition, (lv_distance + RandomFixed(0.0, 0.5)), (libMLHH_gf_HHDetermineAngle(lv_randomLootRingPlayer, lv_lootRingSize) + (lv_angleOffset + RandomFixed(-5.0, 5.0)))));

        }

        lv_remainingWeaponDrops -= 1;

        if ((lv_easterEgg == false)) {

            Wait(lv_treasureDelay, c_timeGame);

        }



        if ((PlayerGroupCount(lv_lootRingPlayerGroup) == 0)) {

            lv_lootRingSize += lv_lootRingSizeIncrement;

            lv_distance += lv_distanceIncrement;

            lv_angleOffset += lv_angleOffsetIncrement;

            auto80D413D1_ae = lv_lootRingSize;

            lv_itPlayer = 1;

            for ( ; ( (auto80D413D1_ai >= 0 && lv_itPlayer <= auto80D413D1_ae) || (auto80D413D1_ai < 0 && lv_itPlayer >= auto80D413D1_ae) ) ; lv_itPlayer += auto80D413D1_ai ) {

                PlayerGroupAdd(lv_lootRingPlayerGroup, lv_itPlayer);

            }

        }



        lv_randomLootRingPlayer = PlayerGroupPlayer(lv_lootRingPlayerGroup, RandomInt(1, PlayerGroupCount(lv_lootRingPlayerGroup)));

        PlayerGroupRemove(lv_lootRingPlayerGroup, lv_randomLootRingPlayer);

        UnitCreateEffectPoint(lv_livingCore, "LootExplosionGoldPileSet", PointWithOffsetPolar(lv_deadCorePosition, (lv_distance + RandomFixed(0.0, 0.5)), (libMLHH_gf_HHDetermineAngle(lv_randomLootRingPlayer, lv_lootRingSize) + (lv_angleOffset + RandomFixed(-5.0, 5.0)))));

        if ((lv_easterEgg == false)) {

            Wait(lv_treasureDelay, c_timeGame);

        }

        else {

            if ((lv_easterEggDelay == 0.0)) {

                lv_easterEggDelay = 0.0625;

            }

            else {

                Wait(lv_easterEggDelay, c_timeGame);

                lv_easterEggDelay = 0.0;

            }

        }

    }

    return true;

}



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

void libMLHH_gt_HHCoreDies_Init () {

    libMLHH_gt_HHCoreDies = TriggerCreate("libMLHH_gt_HHCoreDies_Func");

    TriggerAddEventUnitDied(libMLHH_gt_HHCoreDies, UnitRefFromVariable("libGame_gv_teams[libGame_gv_teamOrderIndex_C].lv_core"));

    TriggerAddEventUnitDied(libMLHH_gt_HHCoreDies, UnitRefFromVariable("libGame_gv_teams[libGame_gv_teamChaosIndex_C].lv_core"));

}



void libMLHH_InitTriggers () {

    libMLHH_gt_DebugGiantDemons_Init();

    libMLHH_gt_IncludeHH_Init();

    libMLHH_gt_MMHHInit_Init();

    libMLHH_gt_HHWeaponRackBroken_Init();

    libMLHH_gt_HHWeaponFlipped_Init();

    libMLHH_gt_HHCoreDies_Init();

}



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

// Library Initialization

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

bool libMLHH_InitLib_completed = false;



void libMLHH_InitLib () {

    if (libMLHH_InitLib_completed) {

        return;

    }



    libMLHH_InitLib_completed = true;



    libMLHH_InitLibraries();

    libMLHH_InitVariables();

    libMLHH_InitTriggers();

}