include "TriggerLibs/HeroesLib"



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

// Library: Neutral Payload (Unified)

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

// Constants

const int libNPLD_gv_pathCountPerTeam_C = 3;

const int libNPLD_gv_pathMaxPossibleWaypoints_C = 17;

const string libNPLD_gv_eventID_PayloadReachedDestination_C = "Payload Reached Destination";

const string libNPLD_gv_eventParam_UnitStopsOccupyingVehicle_Vehicle_C = "Team";



// Structures

struct libNPLD_gs_NeutralPayload {

    unit lv_unit;

    bool lv_payload_ActorFlipped180;

    int lv_teamWithProgress;

    int[libCore_gv_bALMaxTeams + 1] lv_pathIndex_Team;

    int[libCore_gv_bALMaxTeams + 1] lv_pathWaypoints_LastWaypointReached;

    point[libCore_gv_bALMaxTeams + 1][libNPLD_gv_pathCountPerTeam_C + 1][libNPLD_gv_pathMaxPossibleWaypoints_C + 1] lv_pathWaypoints;

    point lv_pathWaypoints_StartLocation;

    int[libCore_gv_bALMaxTeams + 1][libNPLD_gv_pathCountPerTeam_C + 1] lv_pathWaypoints_DestinationIndex;

    int lv_pathDisplay_Order;

    int lv_pathDisplay_Chaos;

    fixed[libCore_gv_bALMaxTeams + 1][libNPLD_gv_pathCountPerTeam_C + 1] lv_totaldistance_Path;

    bool lv_destinationReached;

    bool lv_movingToStart;

    bool lv_isContested;

    int lv_destination_Team;

    int[libCore_gv_bALMaxTeams + 1] lv_warningPathDisplay;

    unit lv_warningUnit;

    bool lv_completedReward;

};



struct libNPLD_gs_Hanamura {

    int lv_payloadPanel;

    int lv_warningTimerFrame;

    int lv_warningTimerLabel;

    int[libCore_gv_bALMaxTeams + 1] lv_attackingStructureFrame;

    int[libCore_gv_bALMaxTeams + 1] lv_attackingStructureLabel;

    int lv_payloadPanel_ActivePayloadStatus;

    int[libCore_gv_bALMaxTeams + 1] lv_background_New;

    int[libCore_gv_bALMaxTeams + 1] lv_progressFrame_New;

    int[libCore_gv_bALMaxTeams + 1] lv_progressBar_New;

    int lv_unitStatusBar_New;

};



// Variable Declarations

libNPLD_gs_NeutralPayload libNPLD_gv_neutralPayload;

actor[libCore_gv_bALMaxTeams + 1][3] libNPLD_gv_activePathonMap;

fixed libNPLD_gv_preanimationRange;

fixed[libNPLD_gv_pathCountPerTeam_C + 1][4] libNPLD_gv_pathAnimationRate;

libNPLD_gs_Hanamura libNPLD_gv_hanamura;



// Function Declarations

void libNPLD_gf_PayloadReachedDestination (trigger t);

void libNPLD_gf_SendInstantEventPayloadReachedDestination (int lp_playerThatEnteredVehicle);

int libNPLD_gf_UnitStopsOccupyingVehicleVehicle ();

void libNPLD_gf_CreateNeutralPayload ();

void libNPLD_gf_Payload_MoveToTeamDestination (int lp_team);

void libNPLD_gf_Payload_ReachesDestination (int lp_team);

void libNPLD_gf_FlipPayload ();

void libNPLD_gf_CalculatePayloadPathDistances ();

fixed libNPLD_gf_CalculatePayloadTravelDistancetoDestination (int lp_team, int lp_pathIndex);

fixed libNPLD_gf_PayloadCurrentDistance ();

void libNPLD_gf_SetNewPayloadPathForTeam (int lp_team);

void libNPLD_gf_InitializePathAnimationRates ();

bool libNPLD_gf_PayloadNearElevator ();

void libNPLD_gf_ShowActivePayloadPathonMinimap ();

void libNPLD_gf_PayloadPathsCreateandStartBaseAnimations ();

void libNPLD_gf_PayloadPathsSetProgressTeamandAnimations ();

void libNPLD_gf_PayloadPathsDestroyActivePaths ();

void libNPLD_gf_PayloadPathsUpdateAnimationSpeed ();

void libNPLD_gf_PayloadPathsCrossingCenterNudgeAnimations (int lp_teamID);

void libNPLD_gf_ShowPayloadPath_Warning ();

void libNPLD_gf_DestroyPayloadWarningPath ();

void libNPLD_gf_MapMechanicUIInit (int lp_parentPanel);



// Trigger Declarations

trigger libNPLD_gt_InitPayloadPaths;

trigger libNPLD_gt_Payload_OrderMonitor_Enabled;

trigger libNPLD_gt_Payload_ChaosMonitor_Enabled;

trigger libNPLD_gt_Payload_ContestedMonitor_Enabled;

trigger libNPLD_gt_Payload_ContestedMonitor_Disabled;

trigger libNPLD_gt_Payload_UnattendedMonitor_Enabled;

trigger libNPLD_gt_PlayerCreatesTurretFromMapMechanicAbility;

trigger libNPLD_gt_Payload_GainsTurret;

trigger libNPLD_gt_InitializeUI;



// Library Initialization

void libNPLD_InitVariables ();