include "TriggerLibs/HeroesLib"



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

// Library: Volskaya Mechanics

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

// Preset Declarations

const int libVLSK_ge_OverwatchCapturePoint_State_Capturing = 0;

const int libVLSK_ge_OverwatchCapturePoint_State_Contested = 1;

const int libVLSK_ge_OverwatchCapturePoint_State_Empty = 2;

const int libVLSK_ge_OverwatchCapturePoint_State_Resetting = 3;



// Constants

const fixed libVLSK_gv_cooldownTimerDuration_C = 150.0;

const fixed libVLSK_gv_mechanicInitialSpawnTimerDuration_C = 150.0;

const fixed libVLSK_gv_warningTimerDuration = 30.0;

const int libVLSK_gv_capturePointMaxCount_C = 3;

const fixed libVLSK_gv_capturePointCheckPeriod_C = 0.0625;

const fixed libVLSK_gv_capturePointOvertimeTime_C = 5.0;

const string libVLSK_gv_eventID_VolskayaPointWarningCreated_C = "CapturePointWarningCreated";

const string libVLSK_gv_eventParam_VolskayaPointWarningCreated_Region_C = "Region";

const string libVLSK_gv_eventID_VolskayaPointEnabled_C = "CapturePointEnabled";

const string libVLSK_gv_eventParam_VolskayaPointEnabled_Region = "Region";

const string libVLSK_gv_eventID_VolskayaPointCompleted = "CapturePointCompleted";

const string libVLSK_gv_eventParam_VolskayaPointCompleted_Region = "Region";

const string libVLSK_gv_eventParam_VolskayaPointCompleted_WinningTeam = "Team";

const string libVLSK_gv_eventID_VolskayaPointOwnershipChanged_C = "CapturePointOwnershipChanged";

const string libVLSK_gv_eventParam_VolskayaPointOwnershipChanged_Region_C = "Region";

const string libVLSK_gv_eventParam_VolskayaPointOwnershipChanged_NewOwner_C = "NewOwner";

const string libVLSK_gv_eventID_Volskaya_TeamBeginsCapturingPoint = "TeamBeginsCapturingPoint";

const string libVLSK_gv_eventParam_Volskaya_TeamBeginsCapturing_AllyTeam = "AllyTeam";

const string libVLSK_gv_eventParam_Volskaya_TeamBeginsCapturing_EnemyTeam = "EnemyTeam";

const string libVLSK_gv_eventParam_Volskaya_TeamBeginsCapturing_CapturePointIndex = "CapturePointIndex";

const string libVLSK_gv_eventID_Volskaya_TeamBeginsContestingPoint = "TeamBeginsContestingPoint";

const string libVLSK_gv_eventParam_Volskaya_TeamBeginsContesting_OriginalTeam = "OriginalTeam";

const string libVLSK_gv_eventParam_Volskaya_TeamBeginsContesting_ContestingTeam = "ContestingTeam";

const string libVLSK_gv_eventParam_Volskaya_TeamBeginsContesting_CapturePointIndex = "CapturePointIndex";

const string libVLSK_gv_eventID_Volskaya_TeamStopsCapturingPoint = "TeamStopsCapturingPoint";

const string libVLSK_gv_eventParam_Volskaya_TeamStopsCapturingPoint_Team = "Team";

const string libVLSK_gv_eventParam_Volskaya_TeamStopsCapturingPoint_CapturePointIndex = "CapturePointIndex";

const string libVLSK_gv_eventID_VolskayaGiantRobotSpawns = "GiantRobotSpawns";

const string libVLSK_gv_eventID_VolskayaGiantRobotDies = "GiantRobotDies";

const string libVLSK_gv_eventParam_VolskayaGiantRobotDies_Position = "Point";

const string libVLSK_gv_eventParam_VolskayaGiantRobotDies_OwningTeam = "OwningTeam";



// Structures

struct libVLSK_gs_OverwatchCapturePoint {

    region lv_region;

    point lv_robotSpawnPoint;

    unit lv_pilotBannerSconce;

    unit lv_gunnerBannerSconce;

    string lv_minimapIconUnitType;

    string lv_minimapIconPreviewUnitType;

    string lv_controlIndicatorImage;

    bool lv_isActive;

    int lv_owningTeam;

    bool lv_isContested;

    fixed[libCore_gv_bALMaxTeams + 1] lv_contestTimes;

    fixed[libCore_gv_bALMaxTeams + 1] lv_victoryTimes;

    bool lv_isOvertimeActive;

    fixed lv_overtimeRemaining;

    sound[libCore_gv_bALMaxTeams + 1] lv_allyCapturingSounds;

    sound[libCore_gv_bALMaxTeams + 1] lv_enemyCapturingSounds;

    unit lv_minimapIconUnit;

    int lv_state;

    bool[libCore_gv_bALMaxTeams + 1] lv_wasProgressing;

    bool[libCore_gv_bALMaxTeams + 1] lv_wasDecaying;

    int[libCore_gv_bALMaxTeams + 1] lv_oldCaptureProgress;

};



struct libVLSK_gs_VolskayaUI {

    int lv_mapMechanic_Container;

    int lv_mapMechanic_ContestProgressBar;

    int lv_mapMechanic_ContestProgressBar_FillImage;

    int lv_mapMechanic_VictoryProgress_OrderFill;

    int lv_mapMechanic_VictoryProgress_OrderStroke;

    int lv_mapMechanic_VictoryProgress_OrderLabel;

    int lv_mapMechanic_VictoryProgress_ChaosFill;

    int lv_mapMechanic_VictoryProgress_ChaosStroke;

    int lv_mapMechanic_VictoryProgress_ChaosLabel;

    int lv_mapMechanic_CenterCircle;

    int lv_mapMechanic_CenterIndicator;

    int lv_mapMechanic_ContestedLabel;

    int lv_slideout_Container;

    int lv_slideout_ToastNotification;

    int lv_slideout_InfoLabel;

    int lv_slideout_TimerLabel;

    int lv_slideout_IconA;

    int lv_slideout_IconB;

    int lv_slideout_IconC;

    int lv_overtimeBar_Container;

    int lv_overtimeBar_ProgressBar;

    int lv_robot_Container;

    int lv_robot_TimeLabel;

    int lv_robot_StatusFrame;

    int lv_robot_GunnerPortrait;

    int lv_robot_PilotPortrait;

    int lv_robot_DeathIcon1;

    int lv_robot_DeathIcon2;

    int lv_robot_DeathIcon3;

    int lv_robot_RobotIcon;

};



// Variable Declarations

fixed libVLSK_gv_capturePointContestTimeGoal_C;

fixed libVLSK_gv_capturePointVictoryTimeGoal_C;

fixed libVLSK_gv_capturePointDecayDelayTime_C;

unitfilter libVLSK_gv_capturePointContestFilter_C;

libVLSK_gs_OverwatchCapturePoint[libVLSK_gv_capturePointMaxCount_C + 1] libVLSK_gv_capturePoints;

int libVLSK_gv_capturePointCount;

int libVLSK_gv_currentCapturePoint;

timer libVLSK_gv_capturePointCooldownTimer;

timer libVLSK_gv_capturePointWarningTimer;

bool libVLSK_gv_grantStandardCapturePointRewards;

timer libVLSK_gv_mMVolskayaObjectivePreviewTimer;

fixed libVLSK_gv_mMVolskayaObjectivePreviewDelay_C;

unit libVLSK_gv_giantRobotUnit;

timer libVLSK_gv_pilotNeededTimer;

timer libVLSK_gv_gunnerNeededTimer;

fixed libVLSK_gv_controlPointVisualsActorMsgRadius_C;

bool libVLSK_gv_capturePointPlayControllingSounds;

sound[libCore_gv_bALMaxTeams + 1] libVLSK_gv_capturePoint_ControllingSound_Ally;

sound[libCore_gv_bALMaxTeams + 1] libVLSK_gv_capturePoint_ControllingSound_Enemy;

color libVLSK_gv_overwatchAllyBlue_C;

color libVLSK_gv_overwatchEnemyRed_C;

color libVLSK_gv_overwatchNeutralYellow_C;

libVLSK_gs_VolskayaUI libVLSK_gv_volskayaUI;

bool libVLSK_gv_overtimeActive;

bool libVLSK_gv_useFirstEventVoiceover;



// Function Declarations

void libVLSK_gf_InitializeOverwatchCapturePoint (region lp_region, point lp_rewardPoint, unit lp_pilotBannerSconce, unit lp_gunnerBannerSconce, string lp_minimapIconUnitType, string lp_minimapIconPreviewUnitType, string lp_controlIndicatorImage);

void libVLSK_gf_EnableDisableCapturePoint (int lp_capturePointIndex, bool lp_enableOrDisable);

void libVLSK_gf_CreateCapturePointPreview (int lp_capturePointIndex);

void libVLSK_gf_MonitorCapturePointProgressUntilComplete (int lp_capturePointIndex);

void libVLSK_gf_AdvanceCapturePointContestProgress (int lp_capturePointIndex, int lp_contestingTeam);

void libVLSK_gf_AdvanceCapturePointVictoryProgress (int lp_capturePointIndex);

void libVLSK_gf_AdvanceOvertimeTimer (int lp_capturePointIndex, bool lp_resetBarFirst);

void libVLSK_gf_AwardCapturePointVictorytoTeam (int lp_capturePointIndex, int lp_victoryTeam);

void libVLSK_gf_DecayCapturePointContest (int lp_capturePointIndex, int lp_team, fixed lp_speedMultiplier);

void libVLSK_gf_ChangeOwnershipofCapturePoint (int lp_capturePointIndex, int lp_newOwningTeam);

void libVLSK_gf_ClampVictoryProgressto99 (int lp_capturePointIndex);

int libVLSK_gf_GetCapturePointVictoryProgressasInt (int lp_capturePointIndex, int lp_teamNumber);

int libVLSK_gf_GetNextCapturePointIndex ();

int libVLSK_gf_OwningTeamOfCapturePoint (int lp_index);

int libVLSK_gf_TeamCapturingNeutralPoint (int lp_index);

fixed libVLSK_gf_CapturingProgressOfTeam (int lp_team, int lp_index);

int libVLSK_gf_StateOfPoint (int lp_index);

void libVLSK_gf_AwardGiantRobottoTeam (int lp_robotOwningTeam, point lp_spawnPoint);

void libVLSK_gf_SendEventVolskayaPointWarningCreated (region lp_position);

void libVLSK_gf_VolskayaPointWarningCreated (trigger t);

region libVLSK_gf_VolskayaPointWarningCreatedRegion ();

void libVLSK_gf_SendEventVolskayaPointEnabled (region lp_position);

void libVLSK_gf_VolskayaPointEnabled (trigger t);

region libVLSK_gf_VolskayaPointEnabledRegion ();

void libVLSK_gf_SendEventVolskayaPointCompleted (region lp_position, int lp_winningTeam);

void libVLSK_gf_VolskayaPointCompleted (trigger t);

region libVLSK_gf_VolskayaPointCompletedRegion ();

int libVLSK_gf_VolskayaPointCompletedWinningTeam ();

void libVLSK_gf_SendEventVolskayaPointOwnershipChanged (region lp_position, int lp_newOwner);

void libVLSK_gf_VolskayaPointOwnershipChanged (trigger t);

region libVLSK_gf_VolskayaPointOwnershipChangedRegion ();

int libVLSK_gf_VolskayaPointOwnershipChangedNewOwner ();

void libVLSK_gf_SendEventVolskayaTeamBeginsCapturingPoint (int lp_allyTeam, int lp_enemyTeam, int lp_capturePointIndex);

void libVLSK_gf_Volskaya_TeamBeginsCapturingPoint (trigger t);

int libVLSK_gf_Volskaya_TeamBeginsCapturingPoint_AllyTeam ();

int libVLSK_gf_Volskaya_TeamBeginsCapturingPoint_EnemyTeam ();

int libVLSK_gf_Volskaya_TeamBeginsCapturingPoint_CapturePointIndex ();

void libVLSK_gf_SendEventVolskayaTeamBeginsContestingPoint (int lp_originalTeam, int lp_contestingTeam, int lp_capturePointIndex);

void libVLSK_gf_Volskaya_TeamBeginsContestingPoint (trigger t);

int libVLSK_gf_Volskaya_TeamBeginsContestingPoint_OriginalTeam ();

int libVLSK_gf_Volskaya_TeamBeginsContestingPoint_ContestingTeam ();

int libVLSK_gf_Volskaya_TeamBeginsContestingPoint_CapturePointIndex ();

void libVLSK_gf_SendEventVolskayaTeamStopsCapturingPoint (int lp_team, int lp_capturePointIndex);

void libVLSK_gf_Volskaya_TeamStopsCapturingPoint (trigger t);

int libVLSK_gf_Volskaya_TeamStopsCapturingPoint_Team ();

int libVLSK_gf_Volskaya_TeamStopsCapturingPoint_CapturePointIndex ();

void libVLSK_gf_SendEventVolskayaGiantRobotSpawns ();

void libVLSK_gf_VolskayaGiantRobotSpawns (trigger t);

void libVLSK_gf_SendEventVolskayaGiantRobotDies (point lp_position, int lp_owningTeam);

void libVLSK_gf_VolskayaGiantRobotDies (trigger t);

point libVLSK_gf_VolskayaGiantRobotDiesPoint ();

int libVLSK_gf_VolskayaGiantRobotDiesOwningTeam ();

void libVLSK_gf_PlayControllingSoundsForTeams (int lp_owningTeam);

void libVLSK_gf_PauseUnpauseControllingSoundsForTeam (bool lp_pauseUnpause, int lp_team);

void libVLSK_gf_InitializeVolskayaUI ();

void libVLSK_gf_UpdateUIControlFrameColors (int lp_currentOwner);

void libVLSK_gf_UpdateUIContestBarProgress ();

void libVLSK_gf_UpdateUIVictoryPercentLabels ();

void libVLSK_gf_UpdateUIControlPointIndicatorImage ();

void libVLSK_gf_EnableDisableUIContestedCalloutDialog (bool lp_enableOrDisable);

void libVLSK_gf_ShowCapturePointWarningSlideoutWithPing (int lp_point);

void libVLSK_gf_ShowCapturePointCompletedSlideout (int lp_victoryTeam);

text libVLSK_gf_GetFormattedTimeRemaining (int lp_rawTime);

void libVLSK_gf_EnableDisableOvertimeBar (bool lp_enableOrDisable);

void libVLSK_gf_UpdateOvertimeBarforPoint (int lp_capturePointIndex);

void libVLSK_gf_ShowRobotSlideoutStatusFrameforUnit (unit lp_robotUnit);

void libVLSK_gf_SetPilotPortrait (unit lp_unit);

void libVLSK_gf_SetGunnerPortrait (unit lp_unit);

void libVLSK_gf_PlayVOControlPointWarning ();

void libVLSK_gf_PlayVOControlPointEnabled ();

void libVLSK_gf_PlayVOControlPointCompleted (int lp_winningTeam);

void libVLSK_gf_PlayVORobotNeedsaPilot (int lp_robotTeam);

void libVLSK_gf_PlayVORobotNeedsaGunner (int lp_robotTeam);

void libVLSK_gf_PlayVORobotDestroyed ();

void libVLSK_gf_PlayVORobotTimedOut ();

void libVLSK_gf_ResetAllVOUserData ();



// Trigger Declarations

trigger libVLSK_gt_VolskayaInitializeMapMVPAnnouncerSounds;

trigger libVLSK_gt_MapMechanicInitialization;

trigger libVLSK_gt_IncludeModInitialization;

trigger libVLSK_gt_CapturePointCooldownTimerExpires;

trigger libVLSK_gt_CapturePointWarningTimerExpires;

trigger libVLSK_gt_GateOpenTimerExpires;

trigger libVLSK_gt_MMVolskayaObjectivePreviewTimerExpires;

trigger libVLSK_gt_GiantRobotDies;

trigger libVLSK_gt_PilotEntersRobotDropBanner;

trigger libVLSK_gt_GunnerEntersRobotDropBanner;

trigger libVLSK_gt_PilotNeededTimerExpires;

trigger libVLSK_gt_GunnerNeededTimerExpires;

trigger libVLSK_gt_PilotEntersRobotStartGunnerReminderTimer;

trigger libVLSK_gt_GunnerEntersRobotStopGunnerReminderTimer;

trigger libVLSK_gt_ControlPointEnabled;

trigger libVLSK_gt_ControlPointOwnershipChanged;

trigger libVLSK_gt_ControlPointCompleted;

trigger libVLSK_gt_VehicleEntered;

trigger libVLSK_gt_VehicleSwapped;

trigger libVLSK_gt_VehicleAbandoned;

trigger libVLSK_gt_EnableNextCapturePoint;

trigger libVLSK_gt_KillRobot;

trigger libVLSK_gt_ShowOvertime;

trigger libVLSK_gt_PrepforRobotTesting;

trigger libVLSK_gt_SetPortraitIconPilot;

trigger libVLSK_gt_SetPortraitIconGunner;

trigger libVLSK_gt_PlayDeathJitter;

trigger libVLSK_gt_PlaySlideout;



// Library Initialization

void libVLSK_InitVariables ();