include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"



include "LibHPRO_h"



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

// Library: Probius

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

// External Library Initialization

void libHPRO_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

}



// Variable Initialization

bool libHPRO_InitVariables_completed = false;



void libHPRO_InitVariables () {

    int init_i;



    if (libHPRO_InitVariables_completed) {

        return;

    }



    libHPRO_InitVariables_completed = true;



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

        libHPRO_gv_heroProbiusWarpRifts[init_i] = UnitGroupEmpty();

    }

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

        libHPRO_gv_heroProbiusWarpInPylonPylonGroup[init_i] = UnitGroupEmpty();

    }

    libHPRO_gv_heroProbiusPhotonCannonGatherMineralsMaxStacks = CatalogFieldValueGetAsInt(c_gameCatalogBehavior, "ProbiusPhotonCannonGatherMineralsQuestToken", "Max", 0);

}



// Functions

void libHPRO_gf_HeroProbiusIncrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHPRO_gv_heroProbiusTriggerRegistrationVariable += 1;

    if ((libHPRO_gv_heroProbiusTriggerRegistrationVariable == 1)) {

        TriggerEnable(libHPRO_gt_HeroProbiusWarpInPylonMaintainMaxNumberOfPylons, true);

        TriggerEnable(libHPRO_gt_HeroProbiusPylonOverchargeGivePylonsWeapons, true);

        TriggerEnable(libHPRO_gt_HeroProbiusAIWarpRifttracking, true);

        TriggerEnable(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsVehiclePickup, true);

        TriggerEnable(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsOccupyVehicle, true);

        TriggerEnable(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsParticipatedInTakedown, true);

    }



}



void libHPRO_gf_HeroProbiusDecrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHPRO_gv_heroProbiusTriggerRegistrationVariable -= 1;

    if ((libHPRO_gv_heroProbiusTriggerRegistrationVariable < 0)) {

        libHPRO_gv_heroProbiusTriggerRegistrationVariable = 0;

    }



    if ((libHPRO_gv_heroProbiusTriggerRegistrationVariable == 0)) {

        TriggerEnable(libHPRO_gt_HeroProbiusWarpInPylonMaintainMaxNumberOfPylons, false);

        TriggerEnable(libHPRO_gt_HeroProbiusPylonOverchargeGivePylonsWeapons, false);

        TriggerEnable(libHPRO_gt_HeroProbiusAIWarpRifttracking, false);

        TriggerEnable(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsVehiclePickup, false);

        TriggerEnable(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsOccupyVehicle, false);

        TriggerEnable(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsParticipatedInTakedown, false);

    }



}



void libHPRO_gf_HeroProbiusWarpInPylonUpdatePylonLineofSuccession (int lp_player) {

    // Variable Declarations

    unit lv_oldestPylon;



    // Automatic Variable Declarations

    // Variable Initialization



    // Implementation

    if ((UnitGroupCount(libHPRO_gv_heroProbiusWarpInPylonPylonGroup[lp_player], c_unitCountAlive) > libHPRO_gv_heroProbiusWarpInPylonMaxNumberofPylons) && (PlayerHasTalent(lp_player, "ProbiusConstructAdditionalPylonsPylonOvercharge") == false)) {

        lv_oldestPylon = UnitGroupUnit(libHPRO_gv_heroProbiusWarpInPylonPylonGroup[lp_player], 1);

        UnitGroupRemove(libHPRO_gv_heroProbiusWarpInPylonPylonGroup[lp_player], lv_oldestPylon);

        UnitBehaviorAdd(lv_oldestPylon, "ProbiusWarpInPylonWarpOutBehavior", lv_oldestPylon, 1);

    }

    else {

        if ((UnitGroupCount(libHPRO_gv_heroProbiusWarpInPylonPylonGroup[lp_player], c_unitCountAlive) > libHPRO_gv_heroProbiusWarpInPylonConstructAdditionalPylonsMaxNumberofPylons) && (PlayerHasTalent(lp_player, "ProbiusConstructAdditionalPylonsPylonOvercharge") == true)) {

            lv_oldestPylon = UnitGroupUnit(libHPRO_gv_heroProbiusWarpInPylonPylonGroup[lp_player], 1);

            UnitGroupRemove(libHPRO_gv_heroProbiusWarpInPylonPylonGroup[lp_player], lv_oldestPylon);

            UnitBehaviorAdd(lv_oldestPylon, "ProbiusWarpInPylonWarpOutBehavior", lv_oldestPylon, 1);

        }



    }

}



void libHPRO_gf_HeroProbiusPhotonCannonGatherMineralsProc (int lp_killingPlayer, unit lp_target) {

    // Variable Declarations

    string lv_targetUnitType;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_targetUnitType = UnitGetType(lp_target);



    // Implementation

    if ((UnitGetType(libGame_gv_players[lp_killingPlayer].lv_heroUnit) == "HeroProbius") && (UnitTypeTestAttribute(lv_targetUnitType, c_unitAttributeStructure) == false) && (UnitTypeTestAttribute(lv_targetUnitType, c_unitAttributeSummoned) == false) && (UnitTypeTestAttribute(lv_targetUnitType, c_unitAttributeCreep) == false) && ((UnitTypeTestAttribute(lv_targetUnitType, c_unitAttributeMerc) == true) || (UnitTypeTestAttribute(lv_targetUnitType, c_unitAttributeMinion) == true) || (UnitTypeTestAttribute(lv_targetUnitType, c_unitAttributeHeroic) == true))) {

        libNtve_gf_CreateUnitsWithDefaultFacing(1, "ProbiusPhotonCannonGatherMineralsMineralPickup", 0, lp_killingPlayer, PointWithOffsetPolar(UnitGetPosition(lp_target), 1.0, libNtve_gf_RandomAngle()), null);

    }



}



// Triggers

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

// Trigger: Hero - Probius - AI Warp Rift tracking

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

bool libHPRO_gt_HeroProbiusAIWarpRifttracking_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_createdWarpRiftUnit;

    int lv_probiusPlayer;

    fixed lv_warpRiftArmingTime;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_createdWarpRiftUnit = EventUnitCreatedUnit();

    lv_probiusPlayer = UnitGetOwner(lv_createdWarpRiftUnit);



    // Actions

    if (!runActions) {

        return true;

    }



    lv_warpRiftArmingTime = CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, "ProbiusWarpRiftBuildInProgressBehavior", "Duration", lv_probiusPlayer);

    Wait(lv_warpRiftArmingTime, c_timeGame);

    UnitGroupAdd(libHPRO_gv_heroProbiusWarpRifts[lv_probiusPlayer], lv_createdWarpRiftUnit);

    return true;

}



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

void libHPRO_gt_HeroProbiusAIWarpRifttracking_Init () {

    libHPRO_gt_HeroProbiusAIWarpRifttracking = TriggerCreate("libHPRO_gt_HeroProbiusAIWarpRifttracking_Func");

    TriggerEnable(libHPRO_gt_HeroProbiusAIWarpRifttracking, false);

    TriggerAddEventUnitCreated(libHPRO_gt_HeroProbiusAIWarpRifttracking, null, "ProbiusWarpRift", null);

}



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

// Trigger: Hero - Probius - Pylon Overcharge - Give Pylons Weapons

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

bool libHPRO_gt_HeroProbiusPylonOverchargeGivePylonsWeapons_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_probius;

    int lv_probiusPlayer;



    // Automatic Variable Declarations

    unitgroup autoCBC54BD2_g;

    int autoCBC54BD2_u;

    unit autoCBC54BD2_var;



    // Variable Initialization

    lv_probius = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_probiusPlayer = UnitGetOwner(lv_probius);



    // Actions

    if (!runActions) {

        return true;

    }



    autoCBC54BD2_g = libHPRO_gv_heroProbiusWarpInPylonPylonGroup[lv_probiusPlayer];

    autoCBC54BD2_u = UnitGroupCount(autoCBC54BD2_g, c_unitCountAll);

    for (;; autoCBC54BD2_u -= 1) {

        autoCBC54BD2_var = UnitGroupUnitFromEnd(autoCBC54BD2_g, autoCBC54BD2_u);

        if (autoCBC54BD2_var == null) { break; }

        UnitCreateEffectUnit(autoCBC54BD2_var, "ProbiusPylonOverchargeApplyWeaponSet", autoCBC54BD2_var);

        UnitCreateEffectUnit(lv_probius, "ProbiusPylonOverchargeApplyPowerOverflowingSummonedUnitBuff", autoCBC54BD2_var);

    }

    return true;

}



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

void libHPRO_gt_HeroProbiusPylonOverchargeGivePylonsWeapons_Init () {

    libHPRO_gt_HeroProbiusPylonOverchargeGivePylonsWeapons = TriggerCreate("libHPRO_gt_HeroProbiusPylonOverchargeGivePylonsWeapons_Func");

    TriggerEnable(libHPRO_gt_HeroProbiusPylonOverchargeGivePylonsWeapons, false);

    TriggerAddEventPlayerEffectUsed(libHPRO_gt_HeroProbiusPylonOverchargeGivePylonsWeapons, c_playerAny, "ProbiusPylonOverchargeInitialDummy");

}



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

// Trigger: Hero - Probius - Warp In Pylon - Maintain Max Number Of Pylons

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

bool libHPRO_gt_HeroProbiusWarpInPylonMaintainMaxNumberOfPylons_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_probiusPlayer;

    unit lv_probius;

    unit lv_pylon;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_probiusPlayer = UnitGetOwner(EventUnitCreatedUnit());

    lv_probius = libGame_gv_players[lv_probiusPlayer].lv_heroUnit;

    lv_pylon = EventUnitCreatedUnit();



    // Actions

    if (!runActions) {

        return true;

    }



    UnitGroupAdd(libHPRO_gv_heroProbiusWarpInPylonPylonGroup[lv_probiusPlayer], lv_pylon);

    libHPRO_gf_HeroProbiusWarpInPylonUpdatePylonLineofSuccession(lv_probiusPlayer);

    if ((UnitGetType(lv_probius) == "HeroAbathur")) {

        UnitBehaviorAdd(lv_pylon, "AbathurUltimateEvolutionCleanupTarget", libGame_gv_players[lv_probiusPlayer].lv_activeVehicle, 1);

    }



    if ((UnitHasBehavior2(lv_probius, "ProbiusPylonOverchargeDummyUIBehavior") == true)) {

        UnitBehaviorAdd(lv_pylon, "ProbiusPylonOverchargeWeaponInitialCoolup", lv_probius, 1);

        UnitBehaviorAdd(lv_pylon, "ProbiusPylonOverchargeWeaponBehavior", lv_probius, 1);

        UnitBehaviorSetDurationRemaining(lv_pylon, "ProbiusPylonOverchargeWeaponBehavior", UnitBehaviorDuration(lv_probius, "ProbiusPylonOverchargeDummyUIBehavior"));

        UnitCreateEffectUnit(lv_probius, "ProbiusPylonOverchargeApplyPowerOverflowingSummonedUnitBuff", lv_pylon);

    }



    return true;

}



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

void libHPRO_gt_HeroProbiusWarpInPylonMaintainMaxNumberOfPylons_Init () {

    libHPRO_gt_HeroProbiusWarpInPylonMaintainMaxNumberOfPylons = TriggerCreate("libHPRO_gt_HeroProbiusWarpInPylonMaintainMaxNumberOfPylons_Func");

    TriggerEnable(libHPRO_gt_HeroProbiusWarpInPylonMaintainMaxNumberOfPylons, false);

    TriggerAddEventUnitCreated(libHPRO_gt_HeroProbiusWarpInPylonMaintainMaxNumberOfPylons, null, "ProbiusWarpInPylon", null);

}



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

// Trigger: Hero - Probius - Photon Cannon - Gather Minerals - Vehicle Pickup

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

bool libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsVehiclePickup_Func (bool testConds, bool runActions) {

    // Variable Declarations

    string lv_effect;

    int lv_player;

    unit lv_probius;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_effect = EventPlayerEffectUsed();



    // Conditions

    if (testConds) {

        if (!((UnitIsValid(EventPlayerEffectUsedUnit(c_effectUnitTarget)) == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    if ((UnitGetType(libGame_gv_players[EventPlayerEffectUsedUnitOwner(c_effectPlayerTarget)].lv_heroUnit) == "HeroProbius") && (UnitIsValid(libGame_gv_players[EventPlayerEffectUsedUnitOwner(c_effectPlayerTarget)].lv_activeVehicle) == true)) {

        lv_player = UnitGetOwner(EventPlayerEffectUsedUnit(c_effectUnitTarget));

        lv_probius = libGame_gv_players[lv_player].lv_heroUnit;

        UnitCreateEffectUnit(EventPlayerEffectUsedUnit(c_effectUnitCaster), "ProbiusPhotonCannonGatherMineralsImpactSet", lv_probius);

    }



    return true;

}



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

void libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsVehiclePickup_Init () {

    libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsVehiclePickup = TriggerCreate("libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsVehiclePickup_Func");

    TriggerEnable(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsVehiclePickup, false);

    TriggerAddEventPlayerEffectUsed(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsVehiclePickup, c_playerAny, "ProbiusPhotonCannonGatherMineralsImpactSetDummy");

}



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

// Trigger: Hero - Probius - Photon Cannon - Gather Minerals - Occupy Vehicle

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

bool libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsOccupyVehicle_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_probius;

    int lv_probius_Player;

    unit lv_vehicle;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_probius = EventUnit();

    lv_probius_Player = UnitGetOwner(lv_probius);

    lv_vehicle = libGame_gv_players[lv_probius_Player].lv_activeVehicle;



    // Conditions

    if (testConds) {

        if (!((UnitGetType(lv_probius) == "HeroProbius"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    UnitBehaviorAdd(lv_vehicle, "ProbiusPhotonCannonGatherMineralsCarryBehavior", lv_probius, 1);

    return true;

}



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

void libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsOccupyVehicle_Init () {

    libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsOccupyVehicle = TriggerCreate("libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsOccupyVehicle_Func");

    TriggerEnable(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsOccupyVehicle, false);

    TriggerAddEventUnitBehaviorChange(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsOccupyVehicle, null, "UsingVehicle", c_unitBehaviorChangeIncrease);

}



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

// Trigger: Hero - Probius - Photon Cannon - Gather Minerals - Participated In Takedown

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

bool libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsParticipatedInTakedown_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_probiusPlayer;

    unit lv_probius;

    unit lv_deadUnit;

    int lv_iterator;



    // Automatic Variable Declarations

    int auto65830B89_ae;

    const int auto65830B89_ai = 1;



    // Variable Initialization



    // Conditions

    if (testConds) {

        if (!((UnitGetType(libGame_gv_players[libGame_gf_HeroParticipatedInTakedownKillingPlayer()].lv_heroUnit) == "HeroProbius"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    lv_probiusPlayer = libGame_gf_HeroParticipatedInTakedownKillingPlayer();

    lv_probius = libGame_gv_players[lv_probiusPlayer].lv_heroUnit;

    lv_deadUnit = libGame_gf_HeroParticipatedInTakedownKilledHero();

    if (true) {

        auto65830B89_ae = UnitBehaviorCount(lv_deadUnit, "ButcherFreshMeatHeroicDeathResponse");

        lv_iterator = 0;

        for ( ; ( (auto65830B89_ai >= 0 && lv_iterator <= auto65830B89_ae) || (auto65830B89_ai < 0 && lv_iterator >= auto65830B89_ae) ) ; lv_iterator += auto65830B89_ai ) {

            libNtve_gf_CreateUnitsWithDefaultFacing(1, "ProbiusPhotonCannonGatherMineralsMineralPickup", 0, lv_probiusPlayer, PointWithOffsetPolar(libGame_gf_HeroParticipatedInTakedownKilledHeroPosition(), 1.0, libNtve_gf_RandomAngle()), null);

        }

    }



    return true;

}



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

void libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsParticipatedInTakedown_Init () {

    libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsParticipatedInTakedown = TriggerCreate("libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsParticipatedInTakedown_Func");

    TriggerEnable(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsParticipatedInTakedown, false);

    libGame_gf_HeroParticipatedInTakedown(libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsParticipatedInTakedown);

}



void libHPRO_InitTriggers () {

    libHPRO_gt_HeroProbiusAIWarpRifttracking_Init();

    libHPRO_gt_HeroProbiusPylonOverchargeGivePylonsWeapons_Init();

    libHPRO_gt_HeroProbiusWarpInPylonMaintainMaxNumberOfPylons_Init();

    libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsVehiclePickup_Init();

    libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsOccupyVehicle_Init();

    libHPRO_gt_HeroProbiusPhotonCannonGatherMineralsParticipatedInTakedown_Init();

}



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

// Library Initialization

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

bool libHPRO_InitLib_completed = false;



void libHPRO_InitLib () {

    if (libHPRO_InitLib_completed) {

        return;

    }



    libHPRO_InitLib_completed = true;



    libHPRO_InitLibraries();

    libHPRO_InitVariables();

    libHPRO_InitTriggers();

}