include "TriggerLibs/HeroesLib"

include "TriggerLibs/MapMechanicsLib"



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

// Library: Haunted Mines

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

// Preset Declarations

const int libMHtM_ge_MMHM_GroundPlane_None = 0;

const int libMHtM_ge_MMHM_GroundPlane_AboveGround = 1;

const int libMHtM_ge_MMHM_GroundPlane_UnderGround = 2;

const int libMHtM_ge_MMHMUnderworldState_Idle = 0;

const int libMHtM_ge_MMHMUnderworldState_Preparing = 1;

const int libMHtM_ge_MMHMUnderworldState_CollectingSkulls = 2;

const int libMHtM_ge_MMHMUnderworldState_BossSummoned = 3;



// Constants

const string libMHtM_gv_mMUnderworldMechanicName_C = "HauntedMinesRework";

const int libMHtM_gv_sapperCampType_C = libMapM_ge_JungleCampMercTypes_SiegeCamp1;

const int libMHtM_gv_siegeGiantCampType_C = libMapM_ge_JungleCampMercTypes_SiegeCamp2;

const fixed libMHtM_gv_mMUnderworldStartTime_C = 150.0;

const fixed libMHtM_gv_mMUnderworldEventCooldown_C = 90.0;

const fixed libMHtM_gv_mMUnderworldPrepDuration_C = 30.0;

const fixed libMHtM_gv_mMUnderworldOpenDuration_C = 180.0;

const int libMHtM_gv_mMUnderworldTotalSkulls_C = 55;

const int libMHtM_gv_mMUnderworldDropSkullsMinion = 2;

const int libMHtM_gv_mMUnderworldDropSkullsBossFinalDrop_C = 14;

const int libMHtM_gv_mMUnderworldDropSkullsBossPerHPDrop_C = 8;

const int libMHtM_gv_mMUnderworldDropSkullsBossStartHPPercent_C = 75;

const fixed libMHtM_gv_mMUnderworldDropSkullsBossPerHPPercent_C = 25.0;

const fixed libMHtM_gv_mMUnderworldBossBuffHPPercentPerSkull_C = 0.075;

const fixed libMHtM_gv_mMUnderworldBossBuffDmgPercentPerSkull_C = 0.075;

const fixed libMHtM_gv_mMUnderworldSummonedBossDuration_C = 30.0;

const int libMHtM_gv_mMUnderworldTeleportingUnitTypeCount_C = 6;

const int libMHtM_gv_mMHM_MaxAllowableGroundHoles = 4;

const int libMHtM_gv_mMUnderworldMineSnapshotSkullCount_C = 60;



// Structures

struct libMHtM_gs_UnderworldMinionGroup {

    point[16] lv_positions;

    string[16] lv_minionType;

    int lv_minionCount;

    unitgroup lv_units;

    region lv_area;

    int lv_regenGlobeCount;

    bool lv_regenGlobeDropped;

    unit lv_iconUnit;

    int lv_defenderIndex;

    unit lv_bannerSconce;

};



struct libMHtM_gs_MMHM_GroundHole {

    unit lv_hole;

    unit lv_camera;

    unit lv_topVisionUnit;

    region lv_peakDetectionRegion;

    region lv_peakRevealRegion;

    revealer[3] lv_peakRevealers;

};



// Variable Declarations

bool libMHtM_gv_mMHM_UseOriginalGolemProgression;

timer libMHtM_gv_mMUnderworldPrepTimer;

timer libMHtM_gv_mMHM_EventCooldownTimer;

int libMHtM_gv_mMUnderworldMineOpenTimes;

int libMHtM_gv_mMUnderworldBossSummonEventCounter;

int[3] libMHtM_gv_mMUnderworldSkullCollected;

bool libMHtM_gv_mMUnderworldOpened;

unitgroup libMHtM_gv_mMUnderworldGatesAbove;

unitgroup libMHtM_gv_mMUnderworldGatesBelow;

point[5] libMHtM_gv_gatesAbovePositions;

point[5] libMHtM_gv_gatesBelowPositions;

unit[5] libMHtM_gv_gatesAbove;

unit[5] libMHtM_gv_gatesBelow;

string[libMHtM_gv_mMUnderworldTeleportingUnitTypeCount_C + 1] libMHtM_gv_mMUnderworldTeleportingUnitTypes;

int[libCore_gv_bALMaxEnginePlayerCount + 1] libMHtM_gv_mMUnderworldEnterGateIndex;

unit[libCore_gv_bALMaxPlayers + 1] libMHtM_gv_mMUnderworldCurrentHole;

int[libCore_gv_bALMaxEnginePlayerCount + 1] libMHtM_gv_mMUnderworldPlayerPlane;

libMHtM_gs_UnderworldMinionGroup[31] libMHtM_gv_mMUnderworldMinionGroups;

int libMHtM_gv_mMUnderworldMinionGroupCount;

int libMHtM_gv_mMUnderworldSkullTotal;

unit libMHtM_gv_mMUnderworldBoss;

unit libMHtM_gv_mMUnderworldBossIconUnit;

region libMHtM_gv_mMUnderworldBossRegion;

point libMHtM_gv_mMUnderworldBossLocation;

int libMHtM_gv_mMUnderworldBossSkullDroppedIndex;

int libMHtM_gv_mMUnderworldBossGlobeDroppedIndex;

unit libMHtM_gv_mMUnderworldBossIconTeamColor2;

bool libMHtM_gv_mMHM_OrderBossGoesTopLane;

point libMHtM_gv_mMHM_OrderTopBossSpawn;

point libMHtM_gv_mMHM_OrderBotBossSpawn;

point libMHtM_gv_mMHM_ChaosTopBossSpawn;

point libMHtM_gv_mMHM_ChaosBotBossSpawn;

point[3] libMHtM_gv_mMUnderworldSummonedBossLocation;

unit[3] libMHtM_gv_mMUnderworldSummonedBoss;

unit[3] libMHtM_gv_mMUnderworldSummonedBossBody;

bool libMHtM_gv_mMUnderworldSummonedBossRevive;

region libMHtM_gv_mMUnderworldFullWorldCamera;

region libMHtM_gv_mMUnderworldUnderGroundPlayable;

region libMHtM_gv_mMUnderworldAboveGroundCamera;

region libMHtM_gv_mMUnderworldAboveGroundPlayable;

string[33] libMHtM_gv_mMUnderworldAmbience;

libMHtM_gs_MMHM_GroundHole[libMHtM_gv_mMHM_MaxAllowableGroundHoles + 1] libMHtM_gv_mMHM_GroundHoles;

int libMHtM_gv_mMHM_GroundHoleCount;

bool libMHtM_gv_mMUnderworldMapEventDisabled;

int libMHtM_gv_mMUnderworldScalingTick;

timer libMHtM_gv_mMUnderworldMineTimer;

fixed libMHtM_gv_mMUnderworldMineSnapshotStartTime_C;



// Function Declarations

void libMHtM_gf_MMHMInitializeHauntedMinesMechanics ();

void libMHtM_gf_MMHMInitializeHauntedMinesMercData ();

void libMHtM_gf_MMUnderworldPrepare ();

unit libMHtM_gf_MMUnderworldPlayerHeroUnit (int lp_player);

unit libMHtM_gf_MMUnderworldUndergroundLadder (unit lp_gate);

unit libMHtM_gf_MMUnderworldGroundHole (unit lp_gate);

point libMHtM_gf_MMUnderworldGateEnteringSpawnPoint (unit lp_gate);

unit libMHtM_gf_MMUnderworldGroundHoleVision (unit lp_hole);

unit libMHtM_gf_MMUnderworldGroundHoleCamera (unit lp_hole);

string libMHtM_gf_GetOrderDataTableValueString (unit lp_unit);

region libMHtM_gf_HauntedMinePlayableRegion (int lp_plane);

void libMHtM_gf_MMUnderworldChangePlaneForUnit (unit lp_heroUnit, int lp_groundPlane);

void libMHtM_gf_MMUnderworldUpdateHeroUnitLighting (unit lp_heroUnit);

void libMHtM_gf_MMHMEnableDisableAIPortalsforMines (bool lp_toggleSetting);

int libMHtM_gf_MMUnderworldBossSkullDropCount ();

int libMHtM_gf_MMUnderworldMineMinionGroupIndex (unit lp_minion);

int libMHtM_gf_MMUnderworldSkullCollected ();

bool libMHtM_gf_MMUnderworldCleared ();

void libMHtM_gf_MMUnderworldSpawnMonsters ();

void libMHtM_gf_MMUnderworldBossDroppingSkulls ();

void libMHtM_gf_MMUnderworldBossDropsSkulls ();

void libMHtM_gf_MMUnderworldDropSkulls (point lp_location, int lp_count, bool lp_forBoss);

void libMHtM_gf_MapMechanicUnderworldAddMinionGroup (region lp_groupArea);

void libMHtM_gf_MapMechanicUnderworldAddBoss (region lp_bossRegion);

void libMHtM_gf_MMUnderworldSummonBoss ();

void libMHtM_gf_MMUnderworldSummonBossForTeam (int lp_team);

void libMHtM_gf_MMUnderworldSummonBossForTeamSound (int lp_team);

void libMHtM_gf_MMUnderworldChangeAmbience (string lp_ambience, string lp_reverb, playergroup lp_players);

void libMHtM_gf_MMUnderworldUpdateAmbience (int lp_player);

bool libMHtM_gf_MMUnderworldSummonedBossBetter (int lp_team);

void libMHtM_gf_MMUnderworldApplySummonedBossScaling (int lp_team, bool lp_displayNumber);

void libMHtM_gf_MMUnderworldObjectiveUIUpdateText ();

void libMHtM_gf_MMUnderworldTransmissionUnderworldOpeningFirstQ ();

void libMHtM_gf_MMUnderworldTransmissionUnderworldOpeningRepeatQ ();

void libMHtM_gf_MMUnderworldTransmissionUnderworldStartQ ();

void libMHtM_gf_MMUnderworldTransmissionUnderworldClearedQ ();

void libMHtM_gf_MMUnderworldTransmissionGolemSummonedQ (int lp_strongerTeam);

void libMHtM_gf_MMUnderworldTransmissionGolemRevivedQ (int lp_strongerTeam);

void libMHtM_gf_MMUnderworldTransmissionGolemDefeatedQ ();



// Trigger Declarations

trigger libMHtM_gt_MMHMMapMechanicInitialized;

trigger libMHtM_gt_MMHMGatesOpened;

trigger libMHtM_gt_MMHMEventCooldownTimerExpires;

trigger libMHtM_gt_MMHMMinesOpened;

trigger libMHtM_gt_MMHMPingGatesWhileEventinProgress;

trigger libMHtM_gt_MMHMMinesCleared;

trigger libMHtM_gt_MMHMStartToEnterGates;

trigger libMHtM_gt_MMHMEnteringGates;

trigger libMHtM_gt_MMHMEnteringGatesSummonedUnitSpecialInteraction;

trigger libMHtM_gt_MMHMUpdateHeroUnitLightingonRespawn;

trigger libMHtM_gt_MMHMMonsterDies;

trigger libMHtM_gt_MMHMSkullDroppedShareVision;

trigger libMHtM_gt_MMHMSkullDroppedVerifyPathable;

trigger libMHtM_gt_MMHMSkullPickup;

trigger libMHtM_gt_MMHMSummonedBossPingVisibility;

trigger libMHtM_gt_MMHMSummonedBossDies;

trigger libMHtM_gt_AbathurMines;

trigger libMHtM_gt_MMHMPlayerMovesCamera;

trigger libMHtM_gt_MMHMPeriodicallyRevealHoleToTeam;

trigger libMHtM_gt_MMHMDisableEvent;

trigger libMHtM_gt_MMHMDebugStartEvent;

trigger libMHtM_gt_MMHMDebugUnderworldClear;

trigger libMHtM_gt_MMHMDebugDisableReminderPings;

trigger libMHtM_gt_MMHMDebugSummonBossScaling;

trigger libMHtM_gt_MMHMDebugPushEffect;

trigger libMHtM_gt_MMHMDebugSpawnSkulls;

trigger libMHtM_gt_MMHMMineScalingSnapshot;

trigger libMHtM_gt_MMHMUnderworldObjectiveUIHandler;

trigger libMHtM_gt_MMHMSummonedBossUIBar;

trigger libMHtM_gt_MMHMEOMIncrementSkullCount;



// Library Initialization

void libMHtM_InitVariables ();