include "TriggerLibs/HeroesLib"



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

// Library: Battlefield of Eternity (Mod)

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

// Preset Declarations

const int libMLBD_ge_MMBOEBossCutsceneType_None = 0;

const int libMLBD_ge_MMBOEBossCutsceneType_EventStart = 1;

const int libMLBD_ge_MMBOEBossCutsceneType_EventMid = 2;

const int libMLBD_ge_MMBOEBossCutsceneType_HeavenVictory = 3;

const int libMLBD_ge_MMBOEBossCutsceneType_HellVictory = 4;

const int libMLBD_ge_MMBOEEventStage_Idle = 0;

const int libMLBD_ge_MMBOEEventStage_Warning = 1;

const int libMLBD_ge_MMBOEEventStage_Duel1 = 2;

const int libMLBD_ge_MMBOEEventStage_Duel2 = 3;

const int libMLBD_ge_MMBOEEventStage_PushingPrep = 4;

const int libMLBD_ge_MMBOEEventStage_Pushing = 5;

const int libMLBD_ge_MMBOEUIModes_Idle = 0;

const int libMLBD_ge_MMBOEUIModes_Warning = 1;

const int libMLBD_ge_MMBOEUIModes_Duel = 2;

const int libMLBD_ge_MMBOEUIModes_PushingPrep = 3;

const int libMLBD_ge_MMBOEUIModes_Pushing = 4;



// Constants

const string libMLBD_gv_mMBoEMechanicName_C = "BattlefieldOfEternity";

const fixed libMLBD_gv_mMBossDuelInitialDelay_C = 180.0;

const fixed libMLBD_gv_mMBossDuelWarningDelayLong_C = 30.0;

const fixed libMLBD_gv_mMBossDuelEventCooldown_C = 105.0;

const fixed libMLBD_gv_mMBossDuelLaningPrepDelay_C = 15.0;

const int libMLBD_gv_mMBossDuelPlayerHeaven_C = 13;

const int libMLBD_gv_mMBossDuelPlayerHell_C = 14;

const fixed libMLBD_gv_mMBossDuelMeaningfulTownHPDifference_C = 0.0;

const fixed libMLBD_gv_bALBossDuelLaningShieldScale = 1.0;

const int libMLBD_gv_mMBossDuelBaseXP = 750;

const int libMLBD_gv_mMBossDuelXPScaling = 35;

const int libMLBD_gv_mMBOEExplosionsTargetTrackingArraySize = 5;

const int libMLBD_gv_mMBOEExplosionsJungleTargetMax = 5;

const int libMLBD_gv_mMBOEExplosionsLanerTargetMax = 3;

const fixed libMLBD_gv_mMBOEExplosionsMaxRange = 8.5;

const fixed libMLBD_gv_mMBOEExplosionsMinRange = 6.0;

const fixed libMLBD_gv_mMBOEExplosionsMinDistanceApart = 3.5;



// Structures

struct libMLBD_gs_MMBOEPanel {

    int lv_mainPanel;

    int lv_bossSpawnFrame;

    int lv_bossSpawnInfoLabel;

    int lv_bossSpawnTimerLabel;

    int[3] lv_bossDuelFrame;

    int[3][3] lv_bossDuelHud;

    int[3][3] lv_bossDuelHPBar;

    int[3][3] lv_bossDuelHPBarLabel_AfterDeath;

    int lv_bossLaningFrame;

    int[3][3] lv_bossLaningPortraitHud;

    int lv_bossLaningShieldBar;

    int lv_bossLaningHPBar;

    int lv_bossLaningInfoLabel;

    int lv_bossLaningTimerLabel;

    bool[3] lv_bossHudPulsed;

};



// Variable Declarations

fixed libMLBD_gv_mMBossDuelWarningDelay;

int libMLBD_gv_mMBOETimes;

unit[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOEBosses;

unit libMLBD_gv_mMBOEBossesLaning;

unit[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOEBossPathingBlockers;

point[11][libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOEBossSpawnLocationPair;

fixed[libCore_gv_bALMaxPlayers + 1] libMLBD_gv_mMBOEDamageDoneToBoss;

int libMLBD_gv_mMBOEBossSpawnLocationPairCount;

point libMLBD_gv_mMBOEBossSpawnLocationCenter;

string[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOEBossUnitTypes;

string[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOEBossLaningUnitTypes;

int[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOEBossPing;

point[3] libMLBD_gv_mMBOEBossLanerStartPoints;

int[3] libMLBD_gv_mMBOEBossSpawnLocationIndexes;

timer libMLBD_gv_mMBOEEventInitDelayTimer;

timer libMLBD_gv_mMBOEEventWarningTimer;

int libMLBD_gv_mMBOEEventWinningTeam;

timer libMLBD_gv_mMBOEEventPrepLaningTimer;

timer libMLBD_gv_mMBOEEventCooldownTimer;

timer libMLBD_gv_mMBOEEventLongWarningTimeTimer;

int libMLBD_gv_mMBOEEventDurationTimer;

doodad[3] libMLBD_gv_mMBOEBossStatues;

bool libMLBD_gv_mMBOESuppressExplosions;

int[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOELastBossAttackers;

unit libMLBD_gv_mMBOEMiddleBannerSconce;

int libMLBD_gv_mMBOEEventStage;

unit[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOEDuelPreviewUnits;

string[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOEDuelPreviewUnitTypes;

fixed libMLBD_gv_mMBOEDuelPreviewDelay;

int libMLBD_gv_mMBOELaningPathLine;

bool libMLBD_gv_mMBOELaningPathLineCreated;

point libMLBD_gv_mMBOELaningRallyPoint;

int[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOELaningBossPing;

unitgroup libMLBD_gv_mMBOEOrderMiddleStructures;

unitgroup libMLBD_gv_mMBOEChaosMiddleStructures;

int[libCore_gv_bALMaxTeams + 1] libMLBD_gv_mMBOE_AICustomUnitValue;

int libMLBD_gv_mMBOE_BossLanerPathCurrentIndex;

int libMLBD_gv_mMBOE_BossLanerPathIndexMax;

region libMLBD_gv_mMBOEHeavenRegion;

region libMLBD_gv_mMBOEHellRegion;

region libMLBD_gv_mMBOENeutralRegion;

string[libCore_gv_bALMaxEnginePlayerCount + 1] libMLBD_gv_mMUnderworldAmbience;

libMLBD_gs_MMBOEPanel libMLBD_gv_mMBOEPanel;

unit libMLBD_gv_mMBOEUIBossLaningSpawningUnit;

bool libMLBD_gv_mMBOEDebugUsed;

bool libMLBD_gv_mMBOEShowBossPositions;

fixed libMLBD_gv_mMBOEXPValue;



// Function Declarations

void libMLBD_gf_MMBOESetLanerStartPoints (point lp_lane1, point lp_lane2);

void libMLBD_gf_MMBOESetEventCombatPoints (point lp_north, point lp_south, point lp_west, point lp_east, point lp_center);

void libMLBD_gf_MMBOEPlayCutscene (int lp_cutscene, point lp_point);

int libMLBD_gf_MMBOEHHPlayer (int lp_team);

void libMLBD_gf_MMBOEDuelWarningStart ();

int libMLBD_gf_MMBOEOppositePair (int lp_pairIndex);

void libMLBD_gf_MMBOECalculateNewSpawnLocations (int lp_stage);

void libMLBD_gf_MMBOEDuelPreviewSetup (bool lp_showImmediately);

void libMLBD_gf_MMBOEDuelStart ();

string libMLBD_gf_MMBOEBossPingModel (int lp_team);

void libMLBD_gf_MMBOESpawnBoss (int lp_team, point lp_location);

void libMLBD_gf_MMBOEDuelEnd ();

void libMLBD_gf_MMBOEDuelEndShakingCamera (point lp_targetLocation);

void libMLBD_gf_MMBOEDuelEndShakingCameraForPlayer (int lp_player, point lp_targetLocation);

int libMLBD_gf_MMBOEBADBossSpawnLocation1stRound (int lp_team);

int libMLBD_gf_MMBOEBADBossSpawnLocation2ndRound (int lp_team);

void libMLBD_gf_MMBOESetMiddleStructureGroups (unitgroup lp_orderMiddleStructures, unitgroup lp_chaosMiddleStructures);

fixed libMLBD_gf_MMBOETownHealth (int lp_town, int lp_player);

int libMLBD_gf_MMBOETownComparison (int lp_town1, int lp_town2, int lp_player);

int libMLBD_gf_MMBOEBossPushingLane (int lp_team);

void libMLBD_gf_MMBOECalculateBossRallyPoint ();

void libMLBD_gf_MMBOECreateFlyerPathLine (bool lp_fly, bool lp_manage);

void libMLBD_gf_MMBOECreateGroundPathLine (unit lp_unit, bool lp_new_Path);

void libMLBD_gf_MMBOESpawnLaningBoss (int lp_team, point lp_location);

void libMLBD_gf_MMBOEDuelMidBossPings ();

void libMLBD_gf_MMBOEUpdateAmbience (int lp_player);

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

void libMLBD_gf_MMBOEInitRegions (region lp_heavenRegion, region lp_hellRegion, region lp_neutralRegion);

void libMLBD_gf_MMBOEUIInit (int lp_parentPanel);

void libMLBD_gf_MMBOEUIShowHidePanel (bool lp_showHide);

void libMLBD_gf_MMBOEUISetMode (int lp_mode);

void libMLBD_gf_MMBOEUISetBossSpawnTime (fixed lp_mode);

void libMLBD_gf_MMBOEUISetBosses (unit lp_mode, unit lp_mode2);

void libMLBD_gf_MMBOEUISetBossHP ();

void libMLBD_gf_MMBOEUISetBossKilled (int lp_mode);

void libMLBD_gf_MMBOEUISetLaningBoss (bool lp_preparing, unit lp_mode);

void libMLBD_gf_MMBOEUISetLaningPrepareTime (fixed lp_time);

void libMLBD_gf_MMBOEUIBossLaningPreparing ();

void libMLBD_gf_MMBOETransmissionDuelWarningQ ();

void libMLBD_gf_MMBOETransmissionDuelStartQ ();

void libMLBD_gf_MMBOETransmissionDuelFlyStartQ ();

void libMLBD_gf_MMBOETransmissionDuelEndQ (int lp_winningTeam);

void libMLBD_gf_MMBOETransmissionBossPushingQ (int lp_winningTeam);

void libMLBD_gf_MMBOETransmissionBossRetreatedQ (int lp_winningTeam);

void libMLBD_gf_MMBOEExplosionsLogic (int lp_maxTargets, string lp_explosionEffect, unit lp_castingUnit);

void libMLBD_gf_MMBOEAwardBossXP (unit lp_bossUnit, fixed lp_killedUnitXPAward);



// Trigger Declarations

trigger libMLBD_gt_MMBOEInit;

trigger libMLBD_gt_MMBOEPingDataInit;

trigger libMLBD_gt_MMBOEGatesOpened;

trigger libMLBD_gt_MMBOELongWarningTime;

trigger libMLBD_gt_MMBOEDuelDurationTimer;

trigger libMLBD_gt_MMBOEBossAttackedHeaven;

trigger libMLBD_gt_MMBOEBossAttackedHell;

trigger libMLBD_gt_MMBOEBossTakesDamage;

trigger libMLBD_gt_MMBOEBossDied;

trigger libMLBD_gt_MMBOEUpdateBossLanerPath;

trigger libMLBD_gt_MMBOEBossFightPing;

trigger libMLBD_gt_MMBOEBossLaningKilled;

trigger libMLBD_gt_GameOver;

trigger libMLBD_gt_MMBOEPlayerMovesCamera;

trigger libMLBD_gt_MMBOEUIModInitialize;

trigger libMLBD_gt_MMBOEUIHandler;

trigger libMLBD_gt_MMBOEDebugTownLife;

trigger libMLBD_gt_MMBOEDebugStartWithWarning;

trigger libMLBD_gt_MMBOEDebugStartImmediately;

trigger libMLBD_gt_MMBOEDebugPlayCutscene;

trigger libMLBD_gt_MMBOEDebugTransmission;

trigger libMLBD_gt_MMBOEDebugDisableEvent;

trigger libMLBD_gt_MMBOEDebugShowBossPositions;

trigger libMLBD_gt_MMBOEDuelBossReacquireAttackTarget;

trigger libMLBD_gt_MMBOEDuelBossVoidPrisonReacquireAttackTarget;

trigger libMLBD_gt_MMBOEDemonicExplosionsAbilityUsed;

trigger libMLBD_gt_MMBOEAngelicExplosionsAbilityUsed;



// Library Initialization

void libMLBD_InitVariables ();