include "TriggerLibs/HeroesLib"



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

// Library: Tomb Spider Queen

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

// Preset Declarations

const int libMSOC_ge_MMTombSpiderQueenAnimStates_FirstGems = 0;

const int libMSOC_ge_MMTombSpiderQueenAnimStates_Active = 1;

const int libMSOC_ge_MMTombSpiderQueenAnimStates_EventPrepare = 2;

const int libMSOC_ge_MMTombSpiderQueenAnimStates_EventStart = 3;

const int libMSOC_ge_MMTombSpiderQueenAnimStates_EventEnd = 4;

const int libMSOC_ge_MMTombSpiderQueenState_Idle = 0;

const int libMSOC_ge_MMTombSpiderQueenState_Collecting = 1;

const int libMSOC_ge_MMTombSpiderQueenState_Summoning = 2;

const int libMSOC_ge_MMTombSpiderQueenState_Active = 3;

const int libMSOC_ge_MMTombSpiderQueenUIModes_Collecting = 0;

const int libMSOC_ge_MMTombSpiderQueenUIModes_Releasing = 1;

const int libMSOC_ge_MMTombSpiderQueenUIModes_Active = 2;



// Constants

const string libMSOC_gv_mMTombSpiderQueenMechanicName_C = "TombOfTheSpiderQueen";

const int libMSOC_gv_mMTombSpiderQueenCount_C = 2;

const fixed libMSOC_gv_mMTombSpiderQueenAuraDuration_C = 70.0;

const fixed libMSOC_gv_mMTombSpiderQueenPostAuraWaitTime_C = 15.0;

const fixed libMSOC_gv_mMTombSpiderQueenSpawnTimer_C = 30.0;

const fixed libMSOC_gv_mMTombSpiderQueenInitialStatueTimer_C = 0.0;

const fixed libMSOC_gv_mMTombSpiderQueenInteractTime_C = 2.0;

const int libMSOC_gv_mMTombSpiderQueenActivationAmountStart_C = 50;

const int libMSOC_gv_mMTombSpiderQueenActivationAmountIncrement_C = 5;

const int libMSOC_gv_mMTombSpiderQueenActivationAmountCap_C = 80;

const int libMSOC_gv_mMTombSpiderQueenGemCap_C = 200;

const int libMSOC_gv_mMTombSpiderQueenHeroGem_C = 3;

const int libMSOC_gv_mMTombSpiderQueenMinionPriest_C = 1;

const int libMSOC_gv_mMTombSpiderQueenSiegeGiant_C = 2;

const int libMSOC_gv_mMTombSpiderQueenKnight_C = 4;

const int libMSOC_gv_mMTombSpiderQueenGolem_C = 5;

const fixed libMSOC_gv_mMTombSpiderQueenAuraTimerTime_C = 70.0;

const fixed libMSOC_gv_mMTombSpiderQueenTreasureChestEventDelay_C = 180.0;

const int libMSOC_gv_mMTombSpiderQueenTreasureChestEventAreaMaxCount_C = 5;

const int libMSOC_gv_mMTombSpiderQueenTreasureChestEventSpawnMaxCount_C = 5;

const int libMSOC_gv_mMTombSpiderQueenSoulEatersMaxCount_C = 3;

const fixed libMSOC_gv_mMTombSpiderQueenSoulEaterSummonTime = 15.0;

const fixed libMSOC_gv_mMTombSpiderQueenAnimationHandlerTime = 11.0;



// Structures

struct libMSOC_gs_MMTombSpiderQueen {

    point lv_positions;

    unit lv_units;

    actor lv_units2;

    actor[3][4] lv_soulEffects;

    int[libCore_gv_bALMaxTeams + 1] lv_ping;

    int[libCore_gv_bALMaxPlayers + 1] lv_hintTextTag;

    int[3] lv_countTextTagAlly;

    int lv_countTextTagEnemy;

    bool lv_active;

    bool lv_summoning;

};



struct libMSOC_gs_MMTombSpiderQueenSoulEaterModeFrames {

    int lv_mainPanel;

    int lv_topSoulEaterEnabled;

    int lv_topSoulEaterHealth;

    int lv_topSoulEaterFlames;

    int lv_midSoulEaterEnabled;

    int lv_midSoulEaterHealth;

    int lv_midSoulEaterFlames;

    int lv_bottomSoulEaterEnabled;

    int lv_bottomSoulEaterHealth;

    int lv_bottomSoulEaterFlames;

};



struct libMSOC_gs_MMTombSpiderQueenPanel {

    int lv_theCryptsPanel;

    int[libCore_gv_bALMaxTeams + 1] lv_theCryptsTeamSoulFrame;

    int[libCore_gv_bALMaxTeams + 1] lv_theCryptsTeamSoulCounterLabel;

    int[libCore_gv_bALMaxTeams + 1] lv_theCryptsTeamSoulCounterLabel2;

    int[libCore_gv_bALMaxTeams + 1] lv_theCryptsTurninGlow;

    int lv_theCryptsSoulEaterFrame;

    int lv_theCryptsSoulEaterCooldownFrame;

    int lv_theCryptsSoulEaterCooldownLabel;

    int lv_theCryptsSoulEaterFrameStatusLabel;

    libMSOC_gs_MMTombSpiderQueenSoulEaterModeFrames lv_soulEaterModeBlueFrame;

    libMSOC_gs_MMTombSpiderQueenSoulEaterModeFrames lv_soulEaterModeRedFrame;

};



// Variable Declarations

libMSOC_gs_MMTombSpiderQueen[libMSOC_gv_mMTombSpiderQueenCount_C + 1] libMSOC_gv_mMTombSpiderQueen;

unit[3] libMSOC_gv_mMTombSpiderQueenCooldownStatue;

unitgroup libMSOC_gv_mMTombSpiderQueenGroup;

int[3] libMSOC_gv_mMTombSpiderQueenSoulsTotal;

int libMSOC_gv_mMTombSpiderQueenTotalTimesSpawned;

revealer libMSOC_gv_mMTombSpiderQueenRevealer;

bool libMSOC_gv_mMTombSpiderQueenFirstActivation;

bool libMSOC_gv_mMTombSpiderQueenTurnInCompleteFirstTime;

timer libMSOC_gv_mMTombSpiderQueenWaitTimer;

timer libMSOC_gv_mMTombSpiderQueenAnimationHandlerTimer;

unit[libMSOC_gv_mMTombSpiderQueenSoulEatersMaxCount_C + 1] libMSOC_gv_mMTombSpiderQueenQueensBirthing;

timer libMSOC_gv_mMTombSpiderQueenSandGolemDeathTimer;

timer libMSOC_gv_mMTombSpiderQueenSandGolemInitialTimer;

point libMSOC_gv_mMTombSpiderQueenSandGolemDeathLocation;

unit libMSOC_gv_mMTombSpiderQueenSandGolem;

int libMSOC_gv_mMTombSpiderQueenSandGolemInitialTimerDuration_C;

fixed libMSOC_gv_mMTombSpiderQueenSandGolemDeathTimerDuration_C;

int[3] libMSOC_gv_mMTombSpiderQueenActivationAmountRequired;

int[libCore_gv_bALMaxPlayers + 1] libMSOC_gv_mMTombSpiderQueenTotalGemsTurnedIn;

int[libCore_gv_bALMaxPlayers + 1] libMSOC_gv_mMTombSpiderQueenGemsHeldForPlayer;

point[3][4] libMSOC_gv_mMTombSpiderQueenSoulEaterSpawnPoints;

unit[libMSOC_gv_mMTombSpiderQueenSoulEatersMaxCount_C + 1] libMSOC_gv_mMTombSpiderQueenSoulEaters;

timer libMSOC_gv_mMTombSpiderQueenSoulEaterSummonTimer;

int libMSOC_gv_mMTombSpiderQueenSummoningTeam;

bool libMSOC_gv_mMTombSpiderQueenScalingStart;

fixed libMSOC_gv_mMTombSpiderQueenSpiderQueenHealthDecay_C;

timer libMSOC_gv_mMTombSpiderQueenScalingTimer;

libMSOC_gs_MMTombSpiderQueenPanel libMSOC_gv_mMTombSpiderQueenPanel;

bool libMSOC_gv_mMTombSpiderQueenHarrisonFinale;

bool libMSOC_gv_mMTombSpiderQueenEventStartOn;

bool libMSOC_gv_mMTombSpiderQueenDisableEvent;



// Function Declarations

void libMSOC_gf_MMTombSpiderQueenSetMapData (point lp_statuePosition, int lp_teamIndex, unit lp_soulCage);

void libMSOC_gf_MMTombSpiderQueenUpdateSouls (int lp_team);

void libMSOC_gf_MMTombSpiderQueenUpdateSoulPing (int lp_team);

void libMSOC_gf_MMTombSpiderQueenAnimationHandlerMain (int lp_animState);

void libMSOC_gf_MMTombSpiderQueenTurnInPointTeamColor (int lp_team);

void libMSOC_gf_MMTombSpiderQueenDropSoulsForEnemy (point lp_location, int lp_count, bool lp_furtherDrop, int lp_soulOwner);

void libMSOC_gf_MMTombSpiderQueenDropSoulsForAlly (point lp_location, int lp_count, bool lp_furtherDrop, int lp_soulOwner);

int libMSOC_gf_MMTombSpiderQueenGetGemsHeldforUnit (unit lp_heroUnit);

bool libMSOC_gf_MMTombSpiderQueenTurnInPossible ();

void libMSOC_gf_MMTombSpiderQueenEnableDisableTurnInGoals (bool lp_toggleSetting, unit lp_turnInUnit);

int libMSOC_gf_MMTombSpiderQueenSoulEatersCountAlive ();

void libMSOC_gf_MMTombSpiderQueenSoulCollectionThresholdReached (int lp_winningTeam);

void libMSOC_gf_MMTombSpiderQueenSpawnSoulEaters (int lp_enemyPlayer);

void libMSOC_gf_MMTombSpiderQueenSoulEaterLifeMonitor ();

void libMSOC_gf_MMTombSpiderQueenUpdateCameraLighting (unit lp_heroUnit);

void libMSOC_gf_MMCountsUpdateDisplay (int lp_orderCount, int lp_chaosCount);

void libMSOC_gf_MMTombSpiderQueenUICheckTurnInStatus (int lp_heldCount, int lp_teamNumber);

void libMSOC_gf_MMTombSpiderQueenUIShowHidePanel (bool lp_showHide);

void libMSOC_gf_MMTombSpiderQueenUIShowHideHealthPanels (bool lp_showHide, int lp_spawningTeam);

void libMSOC_gf_MMTombSpiderQueenUIUpdateHealthPanels (int lp_soulEaterLane, fixed lp_healthPercent);

void libMSOC_gf_MMTombSpiderQueenUISetModeForTeam (int lp_mode, int lp_teamThatActivateCage);

void libMSOC_gf_MMTombSpiderQueenUISetSoulCountForTeam (int lp_count, int lp_countRequirement, bool lp_onCooldown, int lp_team);

void libMSOC_gf_MMTombSpiderQueenUIInit (int lp_parentPanel);

void libMSOC_gf_MMTombSpiderQueenSoulEaterSummoningUI (int lp_team);

void libMSOC_gf_MMTombSpiderQueenSoulEaterUI (int lp_team);

void libMSOC_gf_MMTombSpiderQueenTransmissionSoulCageActivatedQ (int lp_team);

void libMSOC_gf_MMTombSpiderQueenTransmissionSoulEatersSpawnQ (int lp_summoningTeam);

void libMSOC_gf_MMTombSpiderQueenTransmissionSoulEatersSpawningQ (int lp_summoningTeam);

void libMSOC_gf_MMTombSpiderQueenTransmissionSoulEatersAreDeadQ ();



// Trigger Declarations

trigger libMSOC_gt_MMTombSpiderQueenAnnouncerInit;

trigger libMSOC_gt_MMTombSpiderQueenInit;

trigger libMSOC_gt_MMTombSpiderQueenPingDataInit;

trigger libMSOC_gt_MMTombSpiderQueenUILightingInit;

trigger libMSOC_gt_MMTombSpiderQueenGateOpen;

trigger libMSOC_gt_MMTombSpiderQueenGameOver;

trigger libMSOC_gt_MMTombSpiderQueenSandGolemDefenderSpawns;

trigger libMSOC_gt_MMTombSpiderQueenSandGolemLanerSpawns;

trigger libMSOC_gt_MMTombSpiderQueenSandGolemDeathTimerExpires;

trigger libMSOC_gt_MMTombSpiderQueenSoulEatersDied;

trigger libMSOC_gt_MMTombSpiderQueenSpawnSoulsCarrierDies;

trigger libMSOC_gt_MMTombSpiderQueenSpawnSoulsNPCMindControlled;

trigger libMSOC_gt_MMTombSpiderQueenSpawnSoulsHeroDies;

trigger libMSOC_gt_MMTombSpiderQueenSoulSpawned;

trigger libMSOC_gt_MMTombSpiderQueenSoulPickUp;

trigger libMSOC_gt_MMTombSpiderQueenSoulStacksChange;

trigger libMSOC_gt_MMTombSpiderQueenHandInSouls;

trigger libMSOC_gt_MMTombSpiderQueenStartLightTransition;

trigger libMSOC_gt_MMTombSpiderQueenSoulEaterImpactsATarget;

trigger libMSOC_gt_MMTombSpiderQueenSoulEatersActive;

trigger libMSOC_gt_MMTombSpiderQueenSoulEaterDies;

trigger libMSOC_gt_MMTombSpiderQueenSoulEatersareDead;

trigger libMSOC_gt_MMTombSpiderQueenAuraStartLightTransition;

trigger libMSOC_gt_MMTombSpiderQueenSoulEaterSpawnXP;

trigger libMSOC_gt_MMTombSpiderQueenScalingTimer;

trigger libMSOC_gt_MMTombSpiderQueenUIModInitialize;

trigger libMSOC_gt_MMTombSpiderQueenUIHandler;

trigger libMSOC_gt_MMTombSpiderQueenHarrisonJonesProcced;

trigger libMSOC_gt_HarrisonJonesVictory;

trigger libMSOC_gt_MMTombSpiderQueenDebugEventStart;

trigger libMSOC_gt_MMTombSpiderQueenDebugEnemyEventStart;

trigger libMSOC_gt_MMTombSpiderQueenDebugSpiderSpawnRunMode;

trigger libMSOC_gt_MMTombSpiderQueenDebugSpiderSpawnActive;

trigger libMSOC_gt_MMTombSpiderQueenDebugSpiderSpawnRunModeEnemy;

trigger libMSOC_gt_MMTombSpiderQueenDebugGemsSpawn;

trigger libMSOC_gt_MMTombSpiderQueenDebugGemsNoDeath;

trigger libMSOC_gt_MMTombSpiderQueenDebugShowSoulsCollected;

trigger libMSOC_gt_MMTombSpiderQueenDebugKillSouleaters;

trigger libMSOC_gt_MMTombSpiderQueenDebugNeutralSoul;



// Library Initialization

void libMSOC_InitVariables ();