include "TriggerLibs/HeroesLib"



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

// Library: Infernal Shrines (Mod)

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

// Preset Declarations

const int libMSHE_ge_MMISShrineTypes_None = 0;

const int libMSHE_ge_MMISShrineTypes_CombatShrine = 1;

const int libMSHE_ge_MMISShrineTypes_MonsterShrine = 2;

const int libMSHE_ge_MMISShrineTypes_SiegeShrine = 3;

const int libMSHE_ge_MMISShrineTypes_FrozenShrine = 4;

const int libMSHE_ge_MMISShrineTypes_BombardShrine = 5;

const int libMSHE_ge_MMISShrineTypes_ThunderstormShrine = 6;

const int libMSHE_ge_MMISShrineTypes_ArcaneShrine = 7;

const int libMSHE_ge_MMISUIModes_Idle = 0;

const int libMSHE_ge_MMISUIModes_ShrineWarning = 1;

const int libMSHE_ge_MMISUIModes_ShrineActive = 2;

const int libMSHE_ge_MMISUIModes_Punisher = 3;

const int libMSHE_ge_MMISUIModes_CursedEvent = 4;

const int libMSHE_ge_MMISUIModes_Engine = 5;

const int libMSHE_ge_MMISUIModes_Reinforcements = 6;

const int libMSHE_ge_MMISUIModes_PunisherSpawning = 7;



// Constants

const string libMSHE_gv_mMISMechanicName_C = "InfernalShrines";

const int libMSHE_gv_mMISTotalMonsters_C = 10;

const fixed libMSHE_gv_mMDiabloShrineRefreshMonster_C = 5.0;

const fixed libMSHE_gv_mMDiabloShrinesShrineTimerDuration_C = 150.0;

const fixed libMSHE_gv_mMDiabloShrinesBuffTimerDuration_C = 90.0;

const fixed libMSHE_gv_mMDiabloShrineWarningTimerLong_C = 30.0;

const fixed libMSHE_gv_mMDiabloShrinesExperinceTimer_C = 60.0;

const int libMSHE_gv_mMDiabloShrineCursedEventTotal_C = 40;

const int libMSHE_gv_mMISMoltenScalingAmount_C = 2;

const int libMSHE_gv_mMISThunderstormScalingAmount_C = 7;

const int libMSHE_gv_mMISArcaneScalingAmount_C = 8;

const int libMSHE_gv_mMISFrozenScalingAmount_C = 18;

const int libMSHE_gv_mMISMortarScalingAmount_C = 17;



// Structures

struct libMSHE_gs_MMTowerPushPanel {

    int lv_mainPanel;

    int[3] lv_towerPushEnergyGlobePower;

    int lv_shrineWarningFrame;

    int lv_shrineWarningInfoLabel;

    int lv_shrineWarningTimerLabel;

    int lv_shrineActiveFrame;

    int lv_shrineActiveInfoLabel;

    int lv_crystalMortarIcon;

    int lv_crystalFrozenIcon;

    int lv_crystalArcaneIcon;

    int lv_reinforcementWarningFrame;

    int lv_reinforcementWarningInfoLabel;

    int lv_reinforcementWarningTimerLabel;

    int lv_hauntedMinesSkullModeFrame;

    int[libCore_gv_bALMaxTeams + 1] lv_hauntedMinesSkullModeSkullCounterLabel;

    int lv_punisherFrame;

    int lv_punisherHealthBar;

    int lv_punisherTimer;

    int lv_punisherInfoLabel;

    int lv_punisherArcaneAllyIcon;

    int lv_punisherArcaneEnemyIcon;

    int lv_punisherFrozenAllyIcon;

    int lv_punisherFrozenEnemyIcon;

    int lv_punisherMortarAllyIcon;

    int lv_punisherMortarEnemyIcon;

};



// Variable Declarations

fixed libMSHE_gv_mMDiabloShrinesShrineTimerWarning;

int libMSHE_gv_mMDiabloShrinesShrineNotificationTimer;

timer libMSHE_gv_mMISShrineTimer;

timer libMSHE_gv_mMISBuffTimer;

timer libMSHE_gv_mMISShrineWarningTimer;

timer libMSHE_gv_mMISExperince;

timer libMSHE_gv_mMISCursedRefreshTimer;

timer libMSHE_gv_mMISLongWarningTimer;

playergroup libMSHE_gv_mMISMonsterGroup;

bool libMSHE_gv_mMISCursedEvent;

unitgroup libMSHE_gv_mMISCursedCreatures;

int[libCore_gv_bALMaxTeams + 1] libMSHE_gv_mMISTextTag;

int[libCore_gv_bALMaxPlayers + 1] libMSHE_gv_mMISDamageDoneToShrineMinions;

unitgroup libMSHE_gv_mMISInactiveShrines;

unitgroup libMSHE_gv_mMISActiveShrines;

unit[4] libMSHE_gv_mMISShrines;

unitgroup[4] libMSHE_gv_mMISShrineGroups;

int libMSHE_gv_mMISUnitGroupIndex;

point libMSHE_gv_mMISMonsterShrine;

int libMSHE_gv_mMISBuffedTeam;

unit libMSHE_gv_mMISPunisher;

text libMSHE_gv_mMISShrineBuffText;

int libMSHE_gv_mMISNumberofShrinesAllowed;

int libMSHE_gv_mMISNumberOfShrinesEvents;

int libMSHE_gv_mMISTotalShrineCount;

int libMSHE_gv_mMISLastShrine;

int libMSHE_gv_mMISLastShrineCounter;

int libMSHE_gv_mMISCurrentShrine;

fixed libMSHE_gv_mMISMonsterXP;

revealer[3] libMSHE_gv_mMISRevealers;

unit libMSHE_gv_mMISWarningUnit;

string libMSHE_gv_mMISBuff;

int libMSHE_gv_mMISBuffIndex;

int libMSHE_gv_mMISLastBuff;

region[4] libMSHE_gv_mMISRegions;

int[3] libMSHE_gv_mMISKillCount;

playergroup libMSHE_gv_mMISShrineGroup;

unitgroup libMSHE_gv_mMISParalyzeStorage;

bool libMSHE_gv_mMISShowOjectiveTimer;

bool libMSHE_gv_mMISShrineIsActive;

timer libMSHE_gv_mMISObjectivePreviewTimer;

fixed libMSHE_gv_mMISObjectivePreviewDelay_C;

int libMSHE_gv_mMISShrineReminderDelay_C;

timer libMSHE_gv_mMISShrineReminderTimer;

int libMSHE_gv_mMISShrineNotificationDelay_C;

timer libMSHE_gv_mMISShrineNotificationTimer;

timer libMSHE_gv_mMISPunisherSpawnTimer;

string[libCore_gv_bALMaxEnginePlayerCount + 1] libMSHE_gv_mMUnderworldAmbience;

timer libMSHE_gv_mMISAffixTimer;

int libMSHE_gv_mMISAffixTimerDuration;

int libMSHE_gv_punisherDuration;

fixed libMSHE_gv_punisherHeroDamage;

fixed libMSHE_gv_punisherSiegeDamage;

int libMSHE_gv_mMDiabloShrinesPunisherPushLane;

libMSHE_gs_MMTowerPushPanel libMSHE_gv_mMTowerPushPanel;

unit libMSHE_gv_mMISUIPunisherUnit;

int libMSHE_gv_forcedPunisherType;



// Function Declarations

void libMSHE_gf_MMISMapData (point lp_monsterShrine, unit lp_diabloShrineTop, unit lp_diabloShrineMiddle, unit lp_diabloShrineBottom, region lp_diabloShrineTopRegion, region lp_diabloShrineMiddleRegion, region lp_diabloShrineBottomRegion);

void libMSHE_gf_MMISTextTagScoreHandler (int lp_enemyTeam, int lp_team, unit lp_currentShrine);

void libMSHE_gf_MMISRandomizeNextShrineandShowPreview ();

int libMSHE_gf_MMISGetWhichShrine ();

void libMSHE_gf_MMISActivateShrine (int lp_shrine);

void libMSHE_gf_MMISAnnouncementShrineCaptured (unit lp_shrineUnit, int lp_shrine, int lp_team);

void libMSHE_gf_MMISWarningAnnouncementShrine (int lp_shrine);

void libMSHE_gf_MMISGrantShrineRewardToTeam (int lp_team, unit lp_shrine, string lp_shrineBuff);

string libMSHE_gf_MMISGetIconForShrine (int lp_shrine);

text libMSHE_gf_MMISGetShrineText (int lp_shrine);

string libMSHE_gf_MMISGetBuffForShrine (int lp_shrine);

void libMSHE_gf_MMISSpawnShrineMonster (int lp_affix, int lp_team);

void libMSHE_gf_MMBOEUpdateAmbience (int lp_player);

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

void libMSHE_gf_MMISTransmissionShrineWarningActivating ();

void libMSHE_gf_MMISTransmissionShrineActivating ();

void libMSHE_gf_MMISTransmissionPunisherSummoned (int lp_team, int lp_shrineType);

void libMSHE_gf_MMISTransmissionPunisherKilled (int lp_team);

void libMSHE_gf_MMTowerPushUIShowHidePanel (bool lp_showHide);

void libMSHE_gf_MMTowerPushUISetGoblinCount (int lp_count, int lp_count2);

void libMSHE_gf_MMTowerPushUISetMode (int lp_mode);

void libMSHE_gf_MMTowerPushUISetEnergyGlobalProgressUnit3 (int lp_progressUnit);

void libMSHE_gf_MMTowerPushUISetEnergyGlobalProgressUnit5 (int lp_progressUnit);

void libMSHE_gf_MMTowerPushUISetEnergyGlobalProgressUnit (unit lp_progressUnit);

void libMSHE_gf_MMTowerPushUIInit (int lp_parentPanel);

void libMSHE_gf_MMISUIPunisherSpawnTimer (int lp_team);



// Trigger Declarations

trigger libMSHE_gt_MMISInit;

trigger libMSHE_gt_MMISPingDataInit;

trigger libMSHE_gt_MMISGateOpen;

trigger libMSHE_gt_MMISWarningTimerLong;

trigger libMSHE_gt_MMISCursedEventMinionTracker;

trigger libMSHE_gt_MMISCursedEventScoreTracker;

trigger libMSHE_gt_MMISCursedEventTimerRespawner;

trigger libMSHE_gt_MMISCursedEventMinionDamageTracker;

trigger libMSHE_gt_MMISExperienceTimerExpired;

trigger libMSHE_gt_MMISInitializeShrines;

trigger libMSHE_gt_MMISShrineTimerExpired;

trigger libMSHE_gt_MMISObjectivePreviewTimerExpires;

trigger libMSHE_gt_MMISBuffTimerExpired;

trigger libMSHE_gt_MMISWarningTimerExpired;

trigger libMSHE_gt_MMISStartShrineTimer;

trigger libMSHE_gt_MMISShrineUsedbyPlayer;

trigger libMSHE_gt_GameOver;

trigger libMSHE_gt_MMISShrineReminderTimerExpired;

trigger libMSHE_gt_MMInfernalShrinesPlayerMovesCamera;

trigger libMSHE_gt_MMISAffixScaling;

trigger libMSHE_gt_PunisherLeap;

trigger libMSHE_gt_PunisherFixateOn;

trigger libMSHE_gt_PunisherFixateOff;

trigger libMSHE_gt_PunisherDamageTracking;

trigger libMSHE_gt_PunisherDurationTracking;

trigger libMSHE_gt_MMISUIModInitialize;

trigger libMSHE_gt_MMISUIHandler;

trigger libMSHE_gt_MMISForcePunisherType;

trigger libMSHE_gt_MMISDebugSpawnNextShrine;

trigger libMSHE_gt_MMISDebugWarningShrine;

trigger libMSHE_gt_MMISDebugLongShrineTimer;

trigger libMSHE_gt_MMISDebugShowObjectiveTimer;

trigger libMSHE_gt_MMISDebugDisableEvent;



// Library Initialization

void libMSHE_InitVariables ();