include "TriggerLibs/HeroesLib"



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

// Library: Alterac Pass

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

// Preset Declarations

const int libMMAP_ge_AVLanes_Null = 0;

const int libMMAP_ge_AVLanes_Top = 1;

const int libMMAP_ge_AVLanes_Mid = 2;

const int libMMAP_ge_AVLanes_Bot = 3;

const int libMMAP_ge_VictoryProgressCheckpoints__50Percent = 0;

const int libMMAP_ge_VictoryProgressCheckpoints__75Percent = 1;

const int libMMAP_ge_AVUIProgressBars_null = 0;

const int libMMAP_ge_AVUIProgressBars_Top = 1;

const int libMMAP_ge_AVUIProgressBars_Bottom = 2;



// Constants

const int libMMAP_gv_eventTimerDurationStartDuration_C = 180;

const int libMMAP_gv_eventRespawnDurationMin_C = 110;

const int libMMAP_gv_eventRespawnDurationMax_C = 150;

const int libMMAP_gv_eventTimerWarningDuration_C = 30;

const int libMMAP_gv_eventObectivePreviewDuration_C = 30;

const string libMMAP_gv_allianceCavalryUnitType_C = "AllianceCavalry";

const string libMMAP_gv_hordeCavalryUnitType_C = "HordeCavalry";

const string libMMAP_gv_capturedAllianceSoldierBirthActorType_C = "Storm_FX_WCAV_Alliance_Cavalry_Birth";

const string libMMAP_gv_capturedHordeSoldierBirthActorType_C = "Storm_FX_WCAV_Horde_Cavalry_Birth";

const string libMMAP_gv_allianceCavalryBirthActor_C = "Storm_FX_WCAV_Alliance_Cavalry02_Birth";

const string libMMAP_gv_hordeCavalryBirthActor_C = "Storm_FX_WCAV_Horde_Cavalry02_Birth";

const int libMMAP_gv_aVLaneCount_C = 3;

const int libMMAP_gv_cavalryCountMaxPerLane_C = 1;

const int libMMAP_gv_defenderIncrementCount_C = 1;

const int libMMAP_gv_defenderCountStart_C = 1;

const int libMMAP_gv_defenderCountMaximum_C = 4;

const fixed libMMAP_gv_defenderRespawnTime_C = 5.0;

const fixed libMMAP_gv_defenderAIUpdateRate_C = 0.25;

const int libMMAP_gv_defenderAIPercentChanceToWander_C = 20;

const fixed libMMAP_gv_defenderAIFlagCapturedLeashTimerDuration_C = 5.0;

const int libMMAP_gv_minionTimeToCap_C = 10;

const int libMMAP_gv_heroTimeToCap_C = 3;

const int libMMAP_gv_captureFlagMaxCountForTeam_C = 2;

const fixed libMMAP_gv_captureFlagVictoryTimeGoalStart_C = 25.0;

const fixed libMMAP_gv_captureFlagVictoryTimeGoalMax_C = 55.0;

const fixed libMMAP_gv_captureFlagVictoryTimeGoalTimeIncrement_C = 10.0;

const fixed libMMAP_gv_captureFlagCheckPeriod_C = 0.0625;

const fixed libMMAP_gv_captureFlagGoalValue_C = 100.0;

const int libMMAP_gv_mapMechanicSpawnDelay_C = 15;

const int libMMAP_gv_notificationCountMax_C = 2;



// Structures

struct libMMAP_gs_AVMechanics {

    region lv_bossAggroRegion;

    region lv_bossLeashRegion;

    unit[libMMAP_gv_aVLaneCount_C + 1] lv_keep;

    string lv_cavalryUnitType;

    string lv_cavalryBirthActorType;

    actor[libMMAP_gv_aVLaneCount_C + 1] lv_cavalryBirthActor;

    point[libMMAP_gv_aVLaneCount_C + 1] lv_cavalrySpawnPoint;

    timer lv_cavalrySpawnTimer;

    unit[libMMAP_gv_aVLaneCount_C + 1] lv_cavalryUnit;

    unitgroup lv_cavalryUnitGroup;

    trigger lv_cavalrySpawnTrigger;

    trigger lv_cavalryDeathTracker;

    fixed lv_victoryProgress;

    fixed lv_victoryProgressPercent;

    bool[3] lv_victoryProgressCheckpoints;

    timer[libMMAP_gv_defenderCountMaximum_C + 1] lv_defenderSpawnTimer;

    shuffler lv_defenderSpawnShuffler;

    region[libMMAP_gv_captureFlagMaxCountForTeam_C + 1] lv_defenderLeashRegion;

    int[libMMAP_gv_defenderCountMaximum_C + 1] lv_defenderNextSpawnPointIndex;

    bool[libMMAP_gv_defenderCountMaximum_C + 1] lv_defenderSpawnPointInUse;

    point[libMMAP_gv_captureFlagMaxCountForTeam_C + 1][libMMAP_gv_defenderCountMaximum_C + 1] lv_defenderSpawnPoints;

    unit[libMMAP_gv_defenderCountMaximum_C + 1] lv_defenderUnit;

    actor[libMMAP_gv_captureFlagMaxCountForTeam_C + 1][libMMAP_gv_defenderCountMaximum_C + 1] lv_defenderSpawnDoodadActor;

    bool lv_respawnDefenders;

    trigger lv_defenderDeathTracker;

    trigger lv_defenderSpawnTracker;

    unit lv_flagWarningUnit;

    unit[libMMAP_gv_captureFlagMaxCountForTeam_C + 1] lv_cageUnit;

    unit[libMMAP_gv_captureFlagMaxCountForTeam_C + 1] lv_cageBannerSconceUnit;

    actor lv_flagBirthActor;

    string lv_flagBirthActorType;

    unit lv_flagBeingCapturedUnit;

    unit lv_flag;

    unit lv_flagMinimapIcon;

    point[libMMAP_gv_captureFlagMaxCountForTeam_C + 1] lv_flagDummyLockUnitSpawnPoint;

    unit lv_flagDummyLockUnit;

    actor[libMMAP_gv_captureFlagMaxCountForTeam_C + 1] lv_flagCaptureDoodadActor;

    region[libMMAP_gv_captureFlagMaxCountForTeam_C + 1] lv_region;

    point[libMMAP_gv_captureFlagMaxCountForTeam_C + 1] lv_flagSpawnPoint;

    bool lv_flagIsCaptured;

    unitgroup lv_flagEnemiesCapturingUnitGroup;

    unitgroup lv_flagEnemyHeroesCapturingUnitGroup;

    unitgroup lv_eventUnitGroup;

    int lv_eventsWon;

};



struct libMMAP_gs_AVUI {

    int lv_mainPanel;

    int[libMMAP_gv_notificationCountMax_C + 1] lv_notificationFrame;

    int[libMMAP_gv_notificationCountMax_C + 1] lv_notificationLabel;

    int lv_notificationCount;

    int lv_mMContainer;

    int lv_mechanicLabel;

    int[libCore_gv_bALMaxTeams + 1] lv_teamWinningIcon;

    int[libCore_gv_bALMaxTeams + 1] lv_teamWinningIcon_Glow;

    int[libCore_gv_bALMaxTeams + 1] lv_progressBarLabel;

    int[libCore_gv_bALMaxTeams + 1] lv_victoryProgressBar;

    int[libCore_gv_bALMaxTeams + 1] lv_progressBarIconImage;

    int[libMMAP_gv_aVLaneCount_C + 1] lv_mapMechanicHealthBar;

    int[libCore_gv_bALMaxTeams + 1][libCore_gv_bALMaxTeams + 1] lv_cageTextTag;

};



struct libMMAP_gs_AVTeamSpecificSounds {

    soundlink lv_cavalrySpawnWarning;

    soundlink lv_cavalrySpawn;

    soundlink lv_coreGetHitSmall;

    soundlink lv_coreGetHitLarge;

};



struct libMMAP_gs_AVSounds {

    libMMAP_gs_AVTeamSpecificSounds[libCore_gv_bALMaxTeams + 1] lv_aVTeamSpecificSounds;

    sound[libCore_gv_bALMaxGamePlayers + 1][6] lv_snowSound;

};



struct libMMAP_gs_AVTransmissions {

    bool[libCore_gv_bALMaxTeams + 1] lv_hasPlayedCampCapturedVO;

    bool[libCore_gv_bALMaxTeams + 1] lv_hasPlayedCampRetakenVO;

    timer lv_campTransmissionCDTimer;

};



// Variable Declarations

bool libMMAP_gv_dEBUG_AlliedFlagTargetable;

bool libMMAP_gv_dEBUG_CampDefendersOn;

timer libMMAP_gv_eventTimer;

timer libMMAP_gv_eventWarningTimer;

timer libMMAP_gv_eventObjectivePreviewTimer;

int libMMAP_gv_currentCPIndex;

int libMMAP_gv_currentTeamLeader;

bool libMMAP_gv_firstEventHasHappened;

libMMAP_gs_AVMechanics[libCore_gv_bALMaxTeams + 1] libMMAP_gv_aVMechanics;

int libMMAP_gv_defenderCount;

unit libMMAP_gv_dEBUG_WatchedDefender;

fixed libMMAP_gv_captureFlagVictoryTimeGoal;

int[libCore_gv_bALMaxPlayers + 1] libMMAP_gv_cageUnlockInterrupts;

int[libCore_gv_bALMaxTeams + 1] libMMAP_gv_capturingPlayerID;

bool libMMAP_gv_mapMechanicRewardActive;

libMMAP_gs_AVUI libMMAP_gv_aVUI;

libMMAP_gs_AVSounds libMMAP_gv_aVSounds;

libMMAP_gs_AVTransmissions libMMAP_gv_aVTransmissions;

int libMMAP_gv_transmissionCDTimerDuration_C;



// Function Declarations

void libMMAP_gf_InitializeMapMVPAnnouncerSounds ();

void libMMAP_gf_OverrideMinionWaveComposition ();

void libMMAP_gf_InitializeFlagData (int lp_team, int lp_flagIndex, region lp_region, region lp_defenderLeashRegion, unit lp_cageUnit, unit lp_cageBannerSconce, point lp_flagSpawnPoint, point lp_flagDummyLockSpawnPoint, point lp_defenderSpawnPoint1, point lp_defenderSpawnPoint2, point lp_defenderSpawnPoint3, point lp_defenderSpawnPoint4, doodad lp_defenderSpawnDoodad1, doodad lp_defenderSpawnDoodad2, doodad lp_defenderSpawnDoodad3, doodad lp_defenderSpawnDoodad4);

void libMMAP_gf_InitializeMapData (int lp_team, region lp_bossAggroRegion, region lp_bossLeashRegion, unit lp_keepTop, unit lp_keepMid, unit lp_keepBot, point lp_cavalrySpawnPointTop, point lp_cavalrySpawnPointMid, point lp_cavalrySpawnPointBot);

int libMMAP_gf_TeamNumberOfUnit (unit lp_unit);

int libMMAP_gf_NoVisionComputerPlayerInTeam (int lp_team);

int libMMAP_gf_EventWarningTimerDuration (int lp_eventTimerDuration);

void libMMAP_gf_RestartEventTimers ();

void libMMAP_gf_DefenderSpawnTimerExpires (int lp_team, timer lp_timer);

void libMMAP_gf_FlagDefenderDies (unit lp_unit, int lp_team);

int libMMAP_gf_GetDefenderSpawnPointIndex (int lp_team);

void libMMAP_gf_SpawnDefenderForTeamAtCapturePoint (int lp_team, int lp_unitIndex);

void libMMAP_gf_TrickleSpawnFlagDefenders (int lp_team);

void libMMAP_gf_SpawnAllDefendersImmediately (int lp_team);

void libMMAP_gf_DefenderMainAILoop (unit lp_defenderUnit);

void libMMAP_gf_DEBUG_WatchedDefenderLog (unit lp_defenderUnit, text lp_logText);

bool libMMAP_gf_UnitIsCaptureFlag (unit lp_unit);

void libMMAP_gf_EnableDisableCaptureFlag (int lp_team, bool lp_enableOrDisable);

void libMMAP_gf_TeamCapturesFlag (int lp_teamCapturingFlag, int lp_teamOfCapturedFlag);

void libMMAP_gf_TeamCompletesCaptureofFlag (int lp_winningTeam, int lp_losingTeam);

void libMMAP_gf_FlagVictorySequence (int lp_winningTeam, int lp_losingTeam);

void libMMAP_gf_UnitNotTargetableForTeam (unit lp_unit, int lp_team);

void libMMAP_gf_TeamsRewardUnitDies (int lp_team);

void libMMAP_gf_PreparetoSpawnCavalry (int lp_team);

void libMMAP_gf_SpawnCavalryForTeam (int lp_team);

void libMMAP_gf_EventRewardFinishedAllEventUnitsDied (int lp_team);

void libMMAP_gf_HookUpUI ();

void libMMAP_gf_UpdateCaptureProgressBarUIForTeam (int lp_team, int lp_enemyTeam);

void libMMAP_gf_UpdateTeamIconForTeamCurrentlyWinning (int lp_team);

void libMMAP_gf_UpdateVictoriousTeamIcon (int lp_team);

void libMMAP_gf_TeamDoesDoesNotCaptureFlag (int lp_team, int lp_enemyTeam, bool lp_isCapturing, bool lp_isContested);

void libMMAP_gf_ShowHideNotificationFrame (fixed lp_duration, int lp_teamOfCaptor, int lp_teamOfCapturedFlag);

void libMMAP_gf_UpdateNotificationCountdownLabel (text lp_alliedText, text lp_enemyText, int lp_alliedTeam, timer lp_timer);

void libMMAP_gf_AttachHelpButtonToUnit (unit lp_attachedUnit, int lp_team, text lp_helpText, text lp_helpText2);

void libMMAP_gf_UpdateFlagUI (int lp_teamCapturingFlag, int lp_teamOfCapturedFlag);

void libMMAP_gf_HookUpTeamSpecificSounds ();

void libMMAP_gf_CoreTakesDamagePlayGetHitSound (int lp_team, fixed lp_damage);

void libMMAP_gf_CampSoon ();

void libMMAP_gf_CampActive ();

void libMMAP_gf_AllianceCapturesHordeCamp ();

void libMMAP_gf_HordeCapturesAllianceCamp ();

void libMMAP_gf_AllianceRetakesAllianceCamp ();

void libMMAP_gf_HordeRetakesHordeCamp ();

void libMMAP_gf_AllianceWinsObjective ();

void libMMAP_gf_HordeWinsObjective ();

void libMMAP_gf_AllianceCavalryCharges ();

void libMMAP_gf_HordeCavalryCharges ();

void libMMAP_gf_AllianceCavalrySlain ();

void libMMAP_gf_HordeCavalrySlain ();



// Trigger Declarations

trigger libMMAP_gt_IncludeModInit;

trigger libMMAP_gt_DEBUG_Help;

trigger libMMAP_gt_DEBUG_SendEnemyMapMechanicReward;

trigger libMMAP_gt_DEBUG_ToggleDefenders;

trigger libMMAP_gt_DEBUG_EventStart;

trigger libMMAP_gt_DEBUG_EventStartFast;

trigger libMMAP_gt_DEBUG_MakeAlliedFlagsTargetable;

trigger libMMAP_gt_GameOpenTimerStarted;

trigger libMMAP_gt_OpenTheGatesTimerExpires;

trigger libMMAP_gt_EventObjectivePreviewTimerExpires;

trigger libMMAP_gt_EventWarningTimerExpires;

trigger libMMAP_gt_EventTimerExpires;

trigger libMMAP_gt_GameOver;

trigger libMMAP_gt_TownStructureDiesRemoveBossArmor;

trigger libMMAP_gt_OrderDefenderSpawnTimerExpires;

trigger libMMAP_gt_ChaosDefenderSpawnTimerExpires;

trigger libMMAP_gt_OrderDefenderDies;

trigger libMMAP_gt_ChaosDefenderDies;

trigger libMMAP_gt_DEBUG_WatchDefenderAi;

trigger libMMAP_gt_PlayerStartsChannelMacguffin;

trigger libMMAP_gt_PlayerCompletesChannelMacguffin;

trigger libMMAP_gt_PlayerInterruptsChannelMacguffin;

trigger libMMAP_gt_OrderCavalrySpawnTimerExpires;

trigger libMMAP_gt_ChaosCavalrySpawnTimerExpires;

trigger libMMAP_gt_ChaosRewardDeathTracker;

trigger libMMAP_gt_OrderRewardDeathTracker;

trigger libMMAP_gt_OrderCoreTakesDamageGetHitSounds;

trigger libMMAP_gt_ChaosCoreTakesDamageGetHitSounds;

trigger libMMAP_gt_PlayerGainsSlowFromSnow;

trigger libMMAP_gt_PlayerLosesSlowFromSnow;



// Library Initialization

void libMMAP_InitVariables ();