include "TriggerLibs/NativeLib"

include "TriggerLibs/HeroesLib"

include "TriggerLibs/GameLib"



include "LibHGen_h"



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

// Library: Genji

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

// External Library Initialization

void libHGen_InitLibraries () {

    libNtve_InitVariables();

    libCore_InitVariables();

    libGame_InitVariables();

}



// Variable Initialization

bool libHGen_InitVariables_completed = false;



void libHGen_InitVariables () {

    if (libHGen_InitVariables_completed) {

        return;

    }



    libHGen_InitVariables_completed = true;



    libHGen_gv_heroGenjiDeflectDamageTakenLifetimeScore = "GenericHeroRealScoreValue1";

    libHGen_gv_heroGenjiDeflectDragonClawDamageAbsorbedScore = "GenericHeroRealScoreValue2";

}



// Functions

void libHGen_gf_HeroGenjiIncrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHGen_gv_heroGenjiTriggerRegistrationVariable += 1;

    if ((libHGen_gv_heroGenjiTriggerRegistrationVariable == 1)) {

        TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountInitial, true);

        TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountRespec, true);

        TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountOff, true);

        TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountOn, true);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectDragonClawUsed, true);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectAbsorbDamage, true);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectActivated, true);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectEnd, true);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectMissileLauncher, true);

        TriggerEnable(libHGen_gt_HeroGenjiDragonbladeExtendDuration, true);

        TriggerEnable(libHGen_gt_HeroGenjiSwiftStrike, true);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectZanshinInitial, true);

        TriggerEnable(libHGen_gt_Hero, true);

        TriggerEnable(libHGen_gt_DEBUGHeroGenjiDeflectDragonClawActivateCheat, true);

    }



}



void libHGen_gf_HeroGenjiDecrementHeroCountFunction () {

    // Automatic Variable Declarations

    // Implementation

    libHGen_gv_heroGenjiTriggerRegistrationVariable -= 1;

    if ((libHGen_gv_heroGenjiTriggerRegistrationVariable < 0)) {

        libHGen_gv_heroGenjiTriggerRegistrationVariable = 0;

    }



    if ((libHGen_gv_heroGenjiTriggerRegistrationVariable == 0)) {

        TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountInitial, false);

        TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountRespec, false);

        TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountOff, false);

        TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountOn, false);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectDragonClawUsed, false);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectAbsorbDamage, false);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectActivated, false);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectEnd, false);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectMissileLauncher, false);

        TriggerEnable(libHGen_gt_HeroGenjiDragonbladeExtendDuration, false);

        TriggerEnable(libHGen_gt_HeroGenjiSwiftStrike, false);

        TriggerEnable(libHGen_gt_HeroGenjiDeflectZanshinInitial, false);

        TriggerEnable(libHGen_gt_Hero, false);

        TriggerEnable(libHGen_gt_DEBUGHeroGenjiDeflectDragonClawActivateCheat, false);

    }



}



void libHGen_gf_HeroGenjiDeflectDamageTaken (unit lp_genjiUnit, int lp_genjiPlayer, fixed lp_incomingDamage) {

    // Automatic Variable Declarations

    // Implementation

    libHGen_gv_heroGenjiDeflectDamageTaken[lp_genjiPlayer] = (libHGen_gv_heroGenjiDeflectDamageTaken[lp_genjiPlayer] + lp_incomingDamage);

    libHGen_gf_HeroGenjiDeflectDragonClawDamageTracker(lp_genjiUnit, lp_genjiPlayer, lp_incomingDamage);

    libHGen_gf_HeroGenjiDeflectZanshinDamageTracker(lp_genjiUnit, lp_genjiPlayer, lp_incomingDamage);

}



void libHGen_gf_HeroGenjiDeflectDragonClawDamageTracker (unit lp_genjiUnit, int lp_genjiPlayer, fixed lp_incomingDamage) {

    // Variable Declarations

    fixed lv_damageThreshold;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_damageThreshold = CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, "GenjiDeflectDragonClawDamageValue", "DamageResponse.ModifyLimit", lp_genjiPlayer);



    // Implementation

    if ((PlayerHasTalent(lp_genjiPlayer, "GenjiDeflectDragonClaw") == true) && (UnitHasBehavior2(lp_genjiUnit, "GenjiDeflectDragonClawActive") == false)) {

        PlayerScoreValueSetFromFixed(lp_genjiPlayer, libHGen_gv_heroGenjiDeflectDragonClawDamageAbsorbedScore, MinF((PlayerScoreValueGetAsFixed(lp_genjiPlayer, libHGen_gv_heroGenjiDeflectDragonClawDamageAbsorbedScore) + lp_incomingDamage), lv_damageThreshold));

        if ((PlayerScoreValueGetAsFixed(lp_genjiPlayer, libHGen_gv_heroGenjiDeflectDragonClawDamageAbsorbedScore) >= lv_damageThreshold)) {

            UnitCreateEffectUnit(lp_genjiUnit, "GenjiDeflectDragonClawActiveApplyBehavior", lp_genjiUnit);

        }



    }



}



void libHGen_gf_HeroGenjiDeflectZanshinDamageTracker (unit lp_genjiUnit, int lp_genjiPlayer, fixed lp_incomingDamage) {

    // Automatic Variable Declarations

    // Implementation

    if ((PlayerHasTalent(lp_genjiPlayer, "GenjiDeflectZanshin") == true) && (libHGen_gv_heroGenjiDeflectZanshinActivated[lp_genjiPlayer] == false)) {

        CatalogFieldValueSetFixed(c_gameCatalogEffect, "GenjiDeflectZanshinIncrementToken", "Value", lp_genjiPlayer, lp_incomingDamage);

        UnitCreateEffectUnit(lp_genjiUnit, "GenjiDeflectZanshinIncrementToken", lp_genjiUnit);

    }



    PlayerScoreValueSetFromFixed(lp_genjiPlayer, libHGen_gv_heroGenjiDeflectDamageTakenLifetimeScore, (PlayerScoreValueGetAsFixed(lp_genjiPlayer, libHGen_gv_heroGenjiDeflectDamageTakenLifetimeScore) + lp_incomingDamage));

    if ((PlayerHasTalent(lp_genjiPlayer, "GenjiDeflectZanshin") == true) && (PlayerScoreValueGetAsFixed(lp_genjiPlayer, libHGen_gv_heroGenjiDeflectDamageTakenLifetimeScore) >= libHGen_gv_heroGenjiDeflectZanshinDamageRequirement) && (libHGen_gv_heroGenjiDeflectZanshinActivated[lp_genjiPlayer] == false)) {

        UnitCreateEffectUnit(lp_genjiUnit, "GenjiDeflectZanshinModifySearch", lp_genjiUnit);

        libHGen_gv_heroGenjiDeflectZanshinActivated[lp_genjiPlayer] = true;

    }



}



void libHGen_gf_HeroGenjiDeflectAugmentedGuard (unit lp_genjiUnit, int lp_genjiPlayer) {

    // Automatic Variable Declarations

    // Implementation

    if ((PlayerHasTalent(lp_genjiPlayer, "GenjiDeflectAugmentedGuard") == true) && (libHGen_gv_heroGenjiDeflectDamageTaken[lp_genjiPlayer] > 0.0)) {

        CatalogFieldValueSetFixed(c_gameCatalogBehavior, "GenjiDeflectAugmentedGuard", "DamageResponse.ModifyLimit", lp_genjiPlayer, (libHGen_gv_heroGenjiDeflectDamageTaken[lp_genjiPlayer] * libHGen_gv_heroGenjiDeflectAugmentedGuardShieldPercent));

        UnitCreateEffectUnit(lp_genjiUnit, "GenjiDeflectAugmentedGuardApplyBehavior", lp_genjiUnit);

    }



}



// Triggers

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

// Trigger: Hero - Genji - Cyber Agility - Agile Dismount Initial

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

bool libHGen_gt_HeroGenjiCyberAgilityAgileDismountInitial_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_genjiPlayer;

    unit lv_genjiUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiPlayer = libGame_gf_HeroGainTalentPlayer();

    lv_genjiUnit = libGame_gv_players[lv_genjiPlayer].lv_heroUnit;



    // Conditions

    if (testConds) {

        if (!((libGame_gf_HeroGainTalentGainedTalent() == "GenjiCyberAgilityAgileDismount"))) {

            return false;

        }



        if (!((UnitHasBehavior2(lv_genjiUnit, "Mounted") == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    UnitCreateEffectUnit(lv_genjiUnit, "GenjiCyberAgilityAgileDismountIncreaseRange", lv_genjiUnit);

    return true;

}



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

void libHGen_gt_HeroGenjiCyberAgilityAgileDismountInitial_Init () {

    libHGen_gt_HeroGenjiCyberAgilityAgileDismountInitial = TriggerCreate("libHGen_gt_HeroGenjiCyberAgilityAgileDismountInitial_Func");

    TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountInitial, false);

    libGame_gf_HeroGainTalent(libHGen_gt_HeroGenjiCyberAgilityAgileDismountInitial);

}



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

// Trigger: Hero - Genji - Cyber Agility - Agile Dismount Respec

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

bool libHGen_gt_HeroGenjiCyberAgilityAgileDismountRespec_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_genjiPlayer;

    unit lv_genjiUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiPlayer = libGame_gf_HeroRespecsTalentsPlayer();

    lv_genjiUnit = libGame_gv_players[lv_genjiPlayer].lv_heroUnit;



    // Conditions

    if (testConds) {

        if (!((UnitGetType(lv_genjiUnit) == "HeroGenji"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    UnitCreateEffectUnit(lv_genjiUnit, "GenjiCyberAgilityAgileDismountDecreaseRange", lv_genjiUnit);

    return true;

}



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

void libHGen_gt_HeroGenjiCyberAgilityAgileDismountRespec_Init () {

    libHGen_gt_HeroGenjiCyberAgilityAgileDismountRespec = TriggerCreate("libHGen_gt_HeroGenjiCyberAgilityAgileDismountRespec_Func");

    TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountRespec, false);

    libGame_gf_HeroRespecsTalents(libHGen_gt_HeroGenjiCyberAgilityAgileDismountRespec);

}



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

// Trigger: Hero - Genji - Cyber Agility - Agile Dismount On

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

bool libHGen_gt_HeroGenjiCyberAgilityAgileDismountOn_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    int lv_genjiPlayer;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventUnit();

    lv_genjiPlayer = UnitGetOwner(lv_genjiUnit);



    // Conditions

    if (testConds) {

        if (!((UnitGetType(lv_genjiUnit) == "HeroGenji"))) {

            return false;

        }



        if (!((PlayerHasTalent(lv_genjiPlayer, "GenjiCyberAgilityAgileDismount") == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    UnitCreateEffectUnit(lv_genjiUnit, "GenjiCyberAgilityAgileDismountIncreaseRange", lv_genjiUnit);

    return true;

}



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

void libHGen_gt_HeroGenjiCyberAgilityAgileDismountOn_Init () {

    libHGen_gt_HeroGenjiCyberAgilityAgileDismountOn = TriggerCreate("libHGen_gt_HeroGenjiCyberAgilityAgileDismountOn_Func");

    TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountOn, false);

    TriggerAddEventUnitBehaviorChange(libHGen_gt_HeroGenjiCyberAgilityAgileDismountOn, null, "Mounted", c_unitBehaviorChangeCreate);

}



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

// Trigger: Hero - Genji - Cyber Agility - Agile Dismount Off

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

bool libHGen_gt_HeroGenjiCyberAgilityAgileDismountOff_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    int lv_genjiPlayer;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventUnit();

    lv_genjiPlayer = UnitGetOwner(lv_genjiUnit);



    // Conditions

    if (testConds) {

        if (!((UnitGetType(lv_genjiUnit) == "HeroGenji"))) {

            return false;

        }



        if (!((PlayerHasTalent(lv_genjiPlayer, "GenjiCyberAgilityAgileDismount") == true))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    UnitCreateEffectUnit(lv_genjiUnit, "GenjiCyberAgilityAgileDismountDecreaseRange", lv_genjiUnit);

    return true;

}



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

void libHGen_gt_HeroGenjiCyberAgilityAgileDismountOff_Init () {

    libHGen_gt_HeroGenjiCyberAgilityAgileDismountOff = TriggerCreate("libHGen_gt_HeroGenjiCyberAgilityAgileDismountOff_Func");

    TriggerEnable(libHGen_gt_HeroGenjiCyberAgilityAgileDismountOff, false);

    TriggerAddEventUnitBehaviorChange(libHGen_gt_HeroGenjiCyberAgilityAgileDismountOff, null, "Mounted", c_unitBehaviorChangeDestroy);

}



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

// Trigger: Hero - Genji - Deflect Activated

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

bool libHGen_gt_HeroGenjiDeflectActivated_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    int lv_genjiPlayer;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventUnit();

    lv_genjiPlayer = UnitGetOwner(lv_genjiUnit);



    // Actions

    if (!runActions) {

        return true;

    }



    libHGen_gv_heroGenjiDeflectDamageTaken[lv_genjiPlayer] = 0.0;

    return true;

}



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

void libHGen_gt_HeroGenjiDeflectActivated_Init () {

    libHGen_gt_HeroGenjiDeflectActivated = TriggerCreate("libHGen_gt_HeroGenjiDeflectActivated_Func");

    TriggerEnable(libHGen_gt_HeroGenjiDeflectActivated, false);

    TriggerAddEventUnitBehaviorChange(libHGen_gt_HeroGenjiDeflectActivated, null, "GenjiDeflect", c_unitBehaviorChangeIncrease);

}



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

// Trigger: Hero - Genji - Deflect Missile Launcher

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

bool libHGen_gt_HeroGenjiDeflectMissileLauncher_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    int lv_genjiPlayer;

    fixed lv_incomingDamage;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventUnit();

    lv_genjiPlayer = UnitGetOwner(lv_genjiUnit);

    lv_incomingDamage = EventUnitDamageAbsorbed();



    // Actions

    if (!runActions) {

        return true;

    }



    libHGen_gf_HeroGenjiDeflectDamageTaken(lv_genjiUnit, lv_genjiPlayer, lv_incomingDamage);

    CatalogFieldValueSetFixed(c_gameCatalogEffect, "GenjiDeflectReflectApplyTokenCount", "Value", EventPlayer(), lv_incomingDamage);

    UnitCreateEffectPointWithSource(lv_genjiUnit, "GenjiDeflectSearchSwitch", UnitGetPosition(lv_genjiUnit), c_gameCatalogAbil, "GenjiDeflectInstant");

    return true;

}



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

void libHGen_gt_HeroGenjiDeflectMissileLauncher_Init () {

    libHGen_gt_HeroGenjiDeflectMissileLauncher = TriggerCreate("libHGen_gt_HeroGenjiDeflectMissileLauncher_Func");

    TriggerEnable(libHGen_gt_HeroGenjiDeflectMissileLauncher, false);

    TriggerAddEventUnitDamageAbsorbed(libHGen_gt_HeroGenjiDeflectMissileLauncher, null, "GenjiDeflectMissileLauncher");

}



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

// Trigger: Hero - Genji - Deflect Missile Impact

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

bool libHGen_gt_HeroGenjiDeflectMissileImpact_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    int lv_genjiPlayer;

    unit lv_targetUnit;

    unit lv_missileUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_genjiPlayer = UnitGetOwner(lv_genjiUnit);

    lv_targetUnit = EventPlayerEffectUsedUnit(c_effectUnitTarget);

    lv_missileUnit = EventPlayerEffectUsedUnit(c_effectUnitSource);



    // Actions

    if (!runActions) {

        return true;

    }



    if ((PlayerHasTalent(lv_genjiPlayer, "GenjiDeflectReflect") == true)) {

        CatalogFieldValueSetFixed(c_gameCatalogEffect, "GenjiDeflectDamageTrigger", "Amount", lv_genjiPlayer, (CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "GenjiDeflectDamage", "Amount", lv_genjiPlayer) + UnitGetTokenCount(lv_missileUnit, "GenjiDeflectReflectTriggerTokenCounter")));

        UnitCreateEffectUnitWithSource(lv_genjiUnit, "GenjiDeflectDamageTrigger", lv_targetUnit, c_gameCatalogAbil, "GenjiDeflectInstant");

    }

    else {

        UnitCreateEffectUnitWithSource(lv_genjiUnit, "GenjiDeflectDamage", lv_targetUnit, c_gameCatalogAbil, "GenjiDeflectInstant");

    }

    return true;

}



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

void libHGen_gt_HeroGenjiDeflectMissileImpact_Init () {

    libHGen_gt_HeroGenjiDeflectMissileImpact = TriggerCreate("libHGen_gt_HeroGenjiDeflectMissileImpact_Func");

    TriggerEnable(libHGen_gt_HeroGenjiDeflectMissileImpact, false);

    TriggerAddEventPlayerEffectUsed(libHGen_gt_HeroGenjiDeflectMissileImpact, c_playerAny, "GenjiDeflectImpactSet");

}



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

// Trigger: Hero - Genji - Deflect Absorb Damage

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

bool libHGen_gt_HeroGenjiDeflectAbsorbDamage_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    int lv_genjiPlayer;

    fixed lv_incomingDamage;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventUnit();

    lv_genjiPlayer = UnitGetOwner(lv_genjiUnit);

    lv_incomingDamage = EventUnitDamageAbsorbed();



    // Actions

    if (!runActions) {

        return true;

    }



    libHGen_gf_HeroGenjiDeflectDamageTaken(lv_genjiUnit, lv_genjiPlayer, lv_incomingDamage);

    return true;

}



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

void libHGen_gt_HeroGenjiDeflectAbsorbDamage_Init () {

    libHGen_gt_HeroGenjiDeflectAbsorbDamage = TriggerCreate("libHGen_gt_HeroGenjiDeflectAbsorbDamage_Func");

    TriggerEnable(libHGen_gt_HeroGenjiDeflectAbsorbDamage, false);

    TriggerAddEventUnitDamageAbsorbed(libHGen_gt_HeroGenjiDeflectAbsorbDamage, null, "GenjiDeflectProtected");

}



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

// Trigger: Hero - Genji - Deflect End

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

bool libHGen_gt_HeroGenjiDeflectEnd_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    int lv_genjiPlayer;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventUnit();

    lv_genjiPlayer = UnitGetOwner(lv_genjiUnit);



    // Actions

    if (!runActions) {

        return true;

    }



    FloatingCombatElementCreateNumberTextAtUnit(PlayerGroupSingle(lv_genjiPlayer), "FloatingCombatElements/FloatingCombatAmountReadable", "", lv_genjiUnit, FixedToInt(libHGen_gv_heroGenjiDeflectDamageTaken[lv_genjiPlayer]), StringExternal("Param/Value/lib_HGen_2849C3B6"), libNtve_gv_FloatingCombatTextAutoRandomSeed);

    libHGen_gf_HeroGenjiDeflectAugmentedGuard(lv_genjiUnit, lv_genjiPlayer);

    return true;

}



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

void libHGen_gt_HeroGenjiDeflectEnd_Init () {

    libHGen_gt_HeroGenjiDeflectEnd = TriggerCreate("libHGen_gt_HeroGenjiDeflectEnd_Func");

    TriggerEnable(libHGen_gt_HeroGenjiDeflectEnd, false);

    TriggerAddEventUnitBehaviorChange(libHGen_gt_HeroGenjiDeflectEnd, null, "GenjiDeflect", c_unitBehaviorChangeDecrease);

}



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

// Trigger: Hero - Genji - Deflect - Dragon Claw Used

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

bool libHGen_gt_HeroGenjiDeflectDragonClawUsed_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    int lv_genjiPlayer;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventUnit();

    lv_genjiPlayer = UnitGetOwner(lv_genjiUnit);



    // Conditions

    if (testConds) {

        if (!((UnitGetOwner(lv_genjiUnit) <= libCore_gv_bALMaxPlayers))) {

            return false;

        }



        if (!((UnitGetType(lv_genjiUnit) == "HeroGenji"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    PlayerScoreValueSetFromFixed(lv_genjiPlayer, libHGen_gv_heroGenjiDeflectDragonClawDamageAbsorbedScore, 0.0);

    return true;

}



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

void libHGen_gt_HeroGenjiDeflectDragonClawUsed_Init () {

    libHGen_gt_HeroGenjiDeflectDragonClawUsed = TriggerCreate("libHGen_gt_HeroGenjiDeflectDragonClawUsed_Func");

    TriggerEnable(libHGen_gt_HeroGenjiDeflectDragonClawUsed, false);

    TriggerAddEventUnitBehaviorChange(libHGen_gt_HeroGenjiDeflectDragonClawUsed, null, "GenjiDeflectDragonClawActive", c_unitBehaviorChangeDecrease);

}



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

// Trigger: Hero - Genji - Deflect - Zanshin Initial

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

bool libHGen_gt_HeroGenjiDeflectZanshinInitial_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_genjiPlayer;

    unit lv_genjiUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiPlayer = libGame_gf_HeroGainTalentPlayer();

    lv_genjiUnit = libGame_gv_players[lv_genjiPlayer].lv_heroUnit;



    // Conditions

    if (testConds) {

        if (!((libGame_gf_HeroGainTalentGainedTalent() == "GenjiDeflectZanshin"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    CatalogFieldValueSetFixed(c_gameCatalogEffect, "GenjiDeflectZanshinIncrementToken", "Value", lv_genjiPlayer, PlayerScoreValueGetAsFixed(lv_genjiPlayer, libHGen_gv_heroGenjiDeflectDamageTakenLifetimeScore));

    UnitCreateEffectUnit(lv_genjiUnit, "GenjiDeflectZanshinIncrementToken", lv_genjiUnit);

    if ((PlayerHasTalent(lv_genjiPlayer, "GenjiDeflectZanshin") == true) && (PlayerScoreValueGetAsFixed(lv_genjiPlayer, libHGen_gv_heroGenjiDeflectDamageTakenLifetimeScore) >= libHGen_gv_heroGenjiDeflectZanshinDamageRequirement)) {

        UnitCreateEffectUnit(lv_genjiUnit, "GenjiDeflectZanshinModifySearch", lv_genjiUnit);

        libHGen_gv_heroGenjiDeflectZanshinActivated[lv_genjiPlayer] = true;

    }



    return true;

}



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

void libHGen_gt_HeroGenjiDeflectZanshinInitial_Init () {

    libHGen_gt_HeroGenjiDeflectZanshinInitial = TriggerCreate("libHGen_gt_HeroGenjiDeflectZanshinInitial_Func");

    TriggerEnable(libHGen_gt_HeroGenjiDeflectZanshinInitial, false);

    libGame_gf_HeroGainTalent(libHGen_gt_HeroGenjiDeflectZanshinInitial);

}



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

// Trigger: Hero - Genji - Dragonblade Extend Duration

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

bool libHGen_gt_HeroGenjiDragonbladeExtendDuration_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    fixed lv_duration;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventPlayerEffectUsedUnit(c_effectUnitCaster);



    // Actions

    if (!runActions) {

        return true;

    }



    lv_duration = (UnitBehaviorDuration(lv_genjiUnit, "GenjiDragonbladeActive") + libHGen_gv_heroGenjiDragonbladeTheDragonBecomesMeDurationIncreaseIncrement);

    lv_duration = MinF(lv_duration, 8.0);

    UnitBehaviorSetDurationRemaining(lv_genjiUnit, "GenjiDragonbladeActive", lv_duration);

    return true;

}



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

void libHGen_gt_HeroGenjiDragonbladeExtendDuration_Init () {

    libHGen_gt_HeroGenjiDragonbladeExtendDuration = TriggerCreate("libHGen_gt_HeroGenjiDragonbladeExtendDuration_Func");

    TriggerEnable(libHGen_gt_HeroGenjiDragonbladeExtendDuration, false);

    TriggerAddEventPlayerEffectUsed(libHGen_gt_HeroGenjiDragonbladeExtendDuration, c_playerAny, "GenjiDragonbladeExtendDurationDummy");

}



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

// Trigger: Hero - Genji - Swift Strike Self Reveal

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

bool libHGen_gt_Hero_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    unit lv_targetUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_targetUnit = EventPlayerEffectUsedUnit(c_effectUnitTarget);



    // Actions

    if (!runActions) {

        return true;

    }



    UnitBehaviorAdd(lv_genjiUnit, "GenjiSwiftStrikeSelfReveal", lv_targetUnit, 1);

    return true;

}



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

void libHGen_gt_Hero_Init () {

    libHGen_gt_Hero = TriggerCreate("libHGen_gt_Hero_Func");

    TriggerEnable(libHGen_gt_Hero, false);

    TriggerAddEventPlayerEffectUsed(libHGen_gt_Hero, c_playerAny, "GenjiSwiftStrikeImpactSet");

}



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

// Trigger: Hero - Genji - Swift Strike

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

bool libHGen_gt_HeroGenjiSwiftStrike_Func (bool testConds, bool runActions) {

    // Variable Declarations

    unit lv_genjiUnit;

    point lv_genjiPosition;

    int lv_genjiPlayer;

    point lv_initialTargetPoint;

    fixed lv_interpolationFraction;

    point lv_interpolationPoint;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiUnit = EventPlayerEffectUsedUnit(c_effectUnitCaster);

    lv_genjiPosition = UnitGetPosition(lv_genjiUnit);

    lv_genjiPlayer = UnitGetOwner(lv_genjiUnit);

    lv_initialTargetPoint = EventPlayerEffectUsedPoint(c_effectLocationTargetPoint);

    lv_interpolationFraction = 1.0;

    lv_interpolationPoint = lv_initialTargetPoint;



    // Actions

    if (!runActions) {

        return true;

    }



    while ((lv_interpolationFraction > 0.0)) {

        if ((PointPathingPassable(lv_interpolationPoint) == true)) {

            UnitCreateEffectUnitWithSource(lv_genjiUnit, "GenjiSwiftStrikeApplyBehavior", lv_genjiUnit, c_gameCatalogAbil, "GenjiSwiftStrike");

            UnitCreateEffectPointWithSource(lv_genjiUnit, "GenjiSwiftStrikeLaunchMissile", lv_interpolationPoint, c_gameCatalogAbil, "GenjiSwiftStrike");

            break;

        }

        else {

            lv_interpolationFraction = (lv_interpolationFraction - 0.05);

            lv_interpolationPoint = PointInterpolate(lv_genjiPosition, lv_initialTargetPoint, lv_interpolationFraction);

        }

    }

    return true;

}



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

void libHGen_gt_HeroGenjiSwiftStrike_Init () {

    libHGen_gt_HeroGenjiSwiftStrike = TriggerCreate("libHGen_gt_HeroGenjiSwiftStrike_Func");

    TriggerEnable(libHGen_gt_HeroGenjiSwiftStrike, false);

    TriggerAddEventPlayerEffectUsed(libHGen_gt_HeroGenjiSwiftStrike, c_playerAny, "GenjiSwiftStrikeTrigger");

}



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

// Trigger: DEBUG - Hero - Genji - Deflect - Dragon Claw Activate Cheat

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

bool libHGen_gt_DEBUGHeroGenjiDeflectDragonClawActivateCheat_Func (bool testConds, bool runActions) {

    // Variable Declarations

    int lv_genjiPlayer;

    unit lv_genjiUnit;



    // Automatic Variable Declarations

    // Variable Initialization

    lv_genjiPlayer = EventPlayer();

    lv_genjiUnit = libGame_gv_players[lv_genjiPlayer].lv_heroUnit;



    // Conditions

    if (testConds) {

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

            return false;

        }



        if (!((UnitGetOwner(lv_genjiUnit) <= libCore_gv_bALMaxPlayers))) {

            return false;

        }



        if (!((UnitGetType(lv_genjiUnit) == "HeroGenji"))) {

            return false;

        }

    }



    // Actions

    if (!runActions) {

        return true;

    }



    UnitCreateEffectUnit(lv_genjiUnit, "GenjiDeflectDragonClawActiveApplyBehavior", lv_genjiUnit);

    return true;

}



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

void libHGen_gt_DEBUGHeroGenjiDeflectDragonClawActivateCheat_Init () {

    libHGen_gt_DEBUGHeroGenjiDeflectDragonClawActivateCheat = TriggerCreate("libHGen_gt_DEBUGHeroGenjiDeflectDragonClawActivateCheat_Func");

    TriggerEnable(libHGen_gt_DEBUGHeroGenjiDeflectDragonClawActivateCheat, false);

    TriggerAddEventChatMessage(libHGen_gt_DEBUGHeroGenjiDeflectDragonClawActivateCheat, c_playerAny, "activateDragonClaw", true);

}



void libHGen_InitTriggers () {

    libHGen_gt_HeroGenjiCyberAgilityAgileDismountInitial_Init();

    libHGen_gt_HeroGenjiCyberAgilityAgileDismountRespec_Init();

    libHGen_gt_HeroGenjiCyberAgilityAgileDismountOn_Init();

    libHGen_gt_HeroGenjiCyberAgilityAgileDismountOff_Init();

    libHGen_gt_HeroGenjiDeflectActivated_Init();

    libHGen_gt_HeroGenjiDeflectMissileLauncher_Init();

    libHGen_gt_HeroGenjiDeflectMissileImpact_Init();

    libHGen_gt_HeroGenjiDeflectAbsorbDamage_Init();

    libHGen_gt_HeroGenjiDeflectEnd_Init();

    libHGen_gt_HeroGenjiDeflectDragonClawUsed_Init();

    libHGen_gt_HeroGenjiDeflectZanshinInitial_Init();

    libHGen_gt_HeroGenjiDragonbladeExtendDuration_Init();

    libHGen_gt_Hero_Init();

    libHGen_gt_HeroGenjiSwiftStrike_Init();

    libHGen_gt_DEBUGHeroGenjiDeflectDragonClawActivateCheat_Init();

}



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

// Library Initialization

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

bool libHGen_InitLib_completed = false;



void libHGen_InitLib () {

    if (libHGen_InitLib_completed) {

        return;

    }



    libHGen_InitLib_completed = true;



    libHGen_InitLibraries();

    libHGen_InitVariables();

    libHGen_InitTriggers();

}