include "TriggerLibs/HeroesLib"



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

// Library: Warhead Junction

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

// Preset Declarations

const int libMSC2_ge_MMSC2EventStates__None = 0;

const int libMSC2_ge_MMSC2EventStates_NoEvent = 1;

const int libMSC2_ge_MMSC2EventStates_CanisterWarning = 2;

const int libMSC2_ge_MMSC2EventStates_NukesActive = 3;

const int libMSC2_ge_MMSC2UIModes_None = 0;

const int libMSC2_ge_MMSC2UIModes_NoEvent = 1;

const int libMSC2_ge_MMSC2UIModes_CanisterWarning = 2;

const int libMSC2_ge_MMSC2UIModes_NukesActive = 3;



// Constants

const string libMSC2_gv_mMSC2MechanicName_C = "WarheadJunction";

const fixed libMSC2_gv_mMSC2FirstEventDelay_C = 180.0;

const fixed libMSC2_gv_mMSC2RepeatEventDelay_C = 35.0;

const fixed libMSC2_gv_mMSC2EventWarningDelayGasCanister_C = 30.0;

const fixed libMSC2_gv_mMSC2NukeArmingDuration_C = 5.0;

const fixed libMSC2_gv_mMSC2NukeInterruptDelay_C = 10.0;

const fixed libMSC2_gv_mMSC2NukeExpireDuration_C = 120.0;

const fixed libMSC2_gv_mMSC2NukeExpireWarningTime_C = 30.0;

const int libMSC2_gv_mMSC2BuiltWarheadsCountMax_C = 5;

const int libMSC2_gv_mMSC2DroppedWarheadsCountMax_C = 20;

const int libMSC2_gv_mMSC2TerrazineReward_C = 1;

const fixed libMSC2_gv_mMToDWaygateRevealArea_C = 5.0;

const int libMSC2_gv_mMFieldofSlaughterWaygateMaxCount_C = 2;

const fixed libMSC2_gv_mMSC2NukeDamageScalingDelay_C = 60.0;



// Structures

struct libMSC2_gs_MMToDWaygate {

    point lv_position;

    unit lv_waygateUnit;

    unit lv_topWaygate;

    unit lv_bottomWaygate;

};



struct libMSC2_gs_MMSC2_Nuke_Record {

    bool[libCore_gv_bALMaxTeams + 1] lv_teamHasNukes;

    bool[libCore_gv_bALMaxPlayers + 1] lv_playerNukeStateChanged;

};



struct libMSC2_gs_MMSC2WarheadPoints {

    point lv_middleCanisterPoint;

    point lv_leftCanisterPoint;

    point lv_rightCanisterPoint;

    doodad lv_middleCanisterDoodad;

    doodad lv_leftCanisterDoodad;

    doodad lv_rightCanisterDoodad;

};



struct libMSC2_gs_MMSC2UIPanel {

    int lv_capturePointsPanel;

    int lv_capturePointsTimerModeFrame;

    int lv_capturePointsTimerModeNameLabel;

    int lv_capturePointsTimerModeTimeLabel;

    int lv_capturePointsTimerModeQuantityLabel;

    int[libCore_gv_bALMaxTeams + 1] lv_ravenCourtTeamTributeFrame;

    int[libCore_gv_bALMaxTeams + 1] lv_ravenCourtTeamTributeCounterLabel;

    int[libCore_gv_bALMaxTeams + 1] lv_ravenCourtTeamTributeCounterLabel2;

    int lv_ravenCourtCurseFrame;

    int lv_ravenCourtCurseInfoLabel;

    int lv_ravenCourtCurseTimerLabel;

    int lv_ravenCourtCurseTimerLabel2;

    int[libCore_gv_bALMaxPlayersOnATeam + 1] lv_ravenCourtCurseTimerLabel3;

    int[libCore_gv_bALMaxPlayersOnATeam + 1] lv_ravenCourtCurseTimerLabel4;

    int[libCore_gv_bALMaxPlayersOnATeam + 1] lv_ravenCourtCurseTimerLabel5;

    int lv_NukeFrameAllyTeam;

    int[libCore_gv_bALMaxPlayersOnATeam + 1] lv_NukeFrameAllyTeamPlayerIconBorders;

    int[libCore_gv_bALMaxPlayersOnATeam + 1] lv_NukeFrameAllyTeamPlayerIcons;

    int[libCore_gv_bALMaxPlayersOnATeam + 1] lv_NukeFrameAllyTeamPlayerTimer;

    int lv_NukeFrameEnemyTeam;

    int[libCore_gv_bALMaxPlayersOnATeam + 1] lv_NukeFrameEnemyTeamPlayerIconBorders;

    int[libCore_gv_bALMaxPlayersOnATeam + 1] lv_NukeFrameEnemyTeamPlayerIcons;

    int lv_NukeFrameAllyTeam2;

    int lv_NukeFrameAllyTeam3;

    int lv_NukeFrameAllyTeam4;

    int[libCore_gv_bALMaxTeams + 1] lv_backgroundImageBlueLeft;

    int[libCore_gv_bALMaxTeams + 1] lv_backgroundImageBlueRight;

    int[libCore_gv_bALMaxTeams + 1] lv_backgroundImageRedLeft;

    int[libCore_gv_bALMaxTeams + 1] lv_backgroundImageRedRight;

    int[libCore_gv_bALMaxTeams + 1] lv_nukeIconImageBlueLeft;

    int[libCore_gv_bALMaxTeams + 1] lv_nukeIconImageBlueRight;

    int[libCore_gv_bALMaxTeams + 1] lv_nukeIconImageRedLeft;

    int[libCore_gv_bALMaxTeams + 1] lv_nukeIconImageRedRight;

};



// Variable Declarations

fixed libMSC2_gv_mMSC2NukePickupRange_C;

int libMSC2_gv_mMSC2EventState;

bool libMSC2_gv_mMSC2ThreeWarheadsSpawn;

int libMSC2_gv_mMSC2LastDoubleWarheadLane;

int libMSC2_gv_mMSC2LastEmptyWarheadLane;

timer libMSC2_gv_mMSC2TerrazineMainEventTimer;

unitgroup libMSC2_gv_mMSC2BuiltWarheadsActive;

unit[libMSC2_gv_mMSC2BuiltWarheadsCountMax_C + 1] libMSC2_gv_mMSC2BuiltWarheads;

revealer[libMSC2_gv_mMSC2BuiltWarheadsCountMax_C + 1][libCore_gv_bALMaxTeams + 1] libMSC2_gv_mMSC2BuiltWarheadsRevealer;

actor[libMSC2_gv_mMSC2BuiltWarheadsCountMax_C + 1] libMSC2_gv_mMSC2BuiltWarheadsWarningEffect;

unit[libMSC2_gv_mMSC2BuiltWarheadsCountMax_C + 1] libMSC2_gv_mMSC2BuiltWarheadsPreviewUnits;

int[libMSC2_gv_mMSC2BuiltWarheadsCountMax_C + 1] libMSC2_gv_mMSC2BuiltWarheadsWarningPing;

int libMSC2_gv_mMSC2BuiltWarheadsWarningEffectCount;

int[libCore_gv_bALMaxPlayers + 1][3] libMSC2_gv_mMSC2NukeCalldownPiing;

bool libMSC2_gv_mMSC2WarheadEventFirstTime;

fixed libMSC2_gv_mMSC2WarheadPickupReminderDelay_C;

timer libMSC2_gv_mMSC2BuiltWarheadReminderTimer;

int libMSC2_gv_mMSC2SpecialSpawnLane;

int libMSC2_gv_mMSC2EventTracker;

timer libMSC2_gv_mMSC2ObjectivePreviewTimer;

fixed libMSC2_gv_mMSC2ObjectivePreviewDelay_C;

libMSC2_gs_MMToDWaygate[libMSC2_gv_mMFieldofSlaughterWaygateMaxCount_C + 1] libMSC2_gv_mMToDWaygates;

libMSC2_gs_MMSC2_Nuke_Record libMSC2_gv_mMSC2_Nuke_Info;

libMSC2_gs_MMSC2WarheadPoints[4] libMSC2_gv_mMSC2WarheadData;

timer libMSC2_gv_mMSC2NukeDamageScalingTimer;

int[libCore_gv_bALMaxPlayers + 1] libMSC2_gv_mMSC2NukeDamageScalesDone;

int libMSC2_gv_mMSC2NukeDamageScalesNeeded;

int[libCore_gv_bALMaxPlayers + 1] libMSC2_gv_mMSC2NukeDamageDone;

timer libMSC2_gv_mMSC2DroppedWarheadReminderTimer;

unitgroup libMSC2_gv_mMSC2DroppedWarheadsGroup;

unit[libCore_gv_bALMaxTeams + 1] libMSC2_gv_nukeSiloUnit;

playergroup libMSC2_gv_mMSC2VOPlayingdelete;

bool libMSC2_gv_mMSC2GlobalConversationPlayingdelete;

bool libMSC2_gv_mMSC2GlobalConversationPlaying;

playergroup libMSC2_gv_mMSC2VOSoundPlaying;

libMSC2_gs_MMSC2UIPanel libMSC2_gv_mMSC2UIPanel;

int[libCore_gv_bALMaxEnginePlayerCount + 1][libCore_gv_bALMaxTeams + 1][libCore_gv_bALMaxPlayersOnATeam + 1] libMSC2_gv_mMSC2UINukeSiloPlayers;



// Function Declarations

void libMSC2_gf_MMSC2AddWarheadSpawnLocation (int lp_lane, doodad lp_leftCanisterPointDoodad, point lp_leftCannisterPoint, doodad lp_middleCanisterPointDoodad, point lp_middleCanisterPoint, doodad lp_rightCanisterPointDoodad, point lp_rightCannisterPoint);

int libMSC2_gf_MMSC2DetermineDoubleWarheadSpawnLane ();

int libMSC2_gf_MMSC2CountofNukesForPlayer (int lp_playerIndex);

void libMSC2_gf_MMSC2WarningStarts (int lp_specialLane);

void libMSC2_gf_MMSC2SetupandStartPreview (int lp_specialLane);

void libMSC2_gf_MMSC2CreateCanisterPreview (point lp_location);

void libMSC2_gf_MMSC2CreateCanisterSpawningSignal (point lp_location);

void libMSC2_gf_MMSC2ClearCanisterSpawningSignals ();

void libMSC2_gf_MMSC2ClearWarheadPreviews ();

void libMSC2_gf_MMSC2SpawnNukeCanisters (int lp_specialSpawnLane);

void libMSC2_gf_MMSC2NukeButtonStartFlashingForPlayer (int lp_player);

void libMSC2_gf_MMSC2NukeButtonStopFlashingForPlayer (int lp_player);

void libMSC2_gf_MMSC2BuiltWarheadSpawned (point lp_canisterSpawnLocation, int lp_gasAmount);

void libMSC2_gf_MMTodAddWaygate (int lp_waygateIndex, unit lp_waygateUnit, unit lp_topEntrance, unit lp_bottomEntrance);

void libMSC2_gf_MMToDActivateWaygates ();

int libMSC2_gf_MMSC2NukeCountforTeam (int lp_team);

void libMSC2_gf_MMSC2UpdateNukeTextTagsForPlayers ();

void libMSC2_gf_MMSC2ShowHideNukeTextTagsForPlayer (bool lp_showHide, int lp_player);

void libMSC2_gf_MMSC2NukeDamageScalingOnPickup (int lp_playerIndex);

void libMSC2_gf_MMSC2ArmNukeForUnit (unit lp_unit);

void libMSC2_gf_MMSC2PlayerUsesNuke (unit lp_unit);

void libMSC2_gf_MMSC2CanisterPlaformPlayBirthAnimations (doodad lp_doodad);

void libMSC2_gf_MMSC2CanisterEventDone ();

void libMSC2_gf_MMSC2PlayVOSoundforPlayer (soundlink lp_vOSound, int lp_player);

void libMSC2_gf_MMSC2TransmissionWarheadSpawnWarningQ ();

void libMSC2_gf_MMSC2TransmissionWarheadsSpawnedQ ();

void libMSC2_gf_MMSC2TransmissionPlayerCollectsNuke (int lp_player);

void libMSC2_gf_MMSC2TransmissionPlayerNukeReady (int lp_player);

void libMSC2_gf_MMSC2TransmissionPlayerFiresNuke (int lp_player);

void libMSC2_gf_MMSC2TransmissionAllNukesCollectedQ ();

void libMSC2_gf_MMSC2UIInit (int lp_parentPanel);

void libMSC2_gf_MMSC2UISetMode (int lp_mode);

void libMSC2_gf_MMSC2UIUpdateNukeStateInitForPlayer (int lp_player);

void libMSC2_gf_MMSC2UIUpdateNukeStateForPlayer (int lp_player);

void libMSC2_gf_MMSC2UISetEruptionWarningTime (int lp_remainingSeconds);

void libMSC2_gf_MMSC2UIEnableNukeUIStateForPlayer (int lp_player);

void libMSC2_gf_MMSC2UIDisableNukeUIStateForPlayer (int lp_player);

void libMSC2_gf_MMSC2UIUpdateNukeCountForTeam (int lp_count, int lp_team);



// Trigger Declarations

trigger libMSC2_gt_IncludeWarheadJunction;

trigger libMSC2_gt_MMSC2Init;

trigger libMSC2_gt_MMSC2InitializePingData;

trigger libMSC2_gt_MMSC2GatesOpened;

trigger libMSC2_gt_MMSC2MainThread;

trigger libMSC2_gt_MMSC2ObjectivePreviewTimerExpires;

trigger libMSC2_gt_MMSC2ActivateWaygates;

trigger libMSC2_gt_MMToDEnteredWaygate;

trigger libMSC2_gt_MMSC2BuiltWarheadReminderTimerExpires;

trigger libMSC2_gt_MMSC2NukeDamageScaling;

trigger libMSC2_gt_MMSC2BuiltWarheadChannelStarted;

trigger libMSC2_gt_MMSC2BuiltWarheadCaptured;

trigger libMSC2_gt_MMSC2NukeChannelingPing;

trigger libMSC2_gt_MMSC2NukeCancelingPing;

trigger libMSC2_gt_MMSC2NukeInterrupted;

trigger libMSC2_gt_MMSC2NukeUsed;

trigger libMSC2_gt_MMSC2NukeDamageDealt;

trigger libMSC2_gt_MMSC2PlayerDieswithNuke;

trigger libMSC2_gt_MMSC2DroppedWarheadSpawned;

trigger libMSC2_gt_MMSC2DroppedWarheadChannelStarted;

trigger libMSC2_gt_MMSC2DroppedWarheadCaptured;

trigger libMSC2_gt_MMSC2DroppedWarheadReminderTimerExpired;

trigger libMSC2_gt_InitNukeSilos;

trigger libMSC2_gt_MMSC2DebugVOTest;

trigger libMSC2_gt_MMSC2DebugVOCollect;

trigger libMSC2_gt_MMSC2DebugVOWarning;

trigger libMSC2_gt_MMSC2DebugVOCheck;

trigger libMSC2_gt_MMSC2DebugVOCheck2;

trigger libMSC2_gt_MMSC2UIModInitialize;

trigger libMSC2_gt_MMSC2UIHandler;

trigger libMSC2_gt_MMSC2DebugEventStart;



// Library Initialization

void libMSC2_InitVariables ();