include "TriggerLibs/HeroesLib"



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

// Library: Garden of Terror

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

// Constants

const fixed libGRDN_gv_laningTimeAtGameStart_C = 120.0;

const fixed libGRDN_gv_shortPreviewDelay_C = 15.0;

const fixed libGRDN_gv_longPreviewDelay_C = 30.0;

const fixed libGRDN_gv_seedSpawnTime_C = 30.0;

const fixed libGRDN_gv_delayBetweenSeedsMin_C = 20.0;

const fixed libGRDN_gv_delayBetweenSeedsMax_C = 50.0;

const fixed libGRDN_gv_terrorSpawnTime_C = 10.0;

const fixed libGRDN_gv_extraDelayAfterEvent_C = 40.0;

const int libGRDN_gv_seedsNeeded_C = 3;

const int libGRDN_gv_seedSpawnLocationCount_C = 6;

const int libGRDN_gv_steppingStoneCount_C = 6;

const int libGRDN_gv_recentSeedSpawnMemory_C = 2;

const int libGRDN_gv_seedDefenderCount_C = 4;

const int libGRDN_gv_laneCount_C = 3;



// Structures

struct libGRDN_gs_SeedSpawn {

    point lv_point;

    int lv_topBottomHemisphere;

    int lv_favoredTeam;

    unit lv_lootBannerSconce;

    unit lv_seedUnit;

    unit lv_previewUnit;

    actor[libGRDN_gv_steppingStoneCount_C + 1] lv_steppingStones;

};



struct libGRDN_gs_GardenUI {

    int lv_eventWarningFrame;

    int lv_eventWarningTextLabel;

    int lv_eventWarningTimerLabel;

    int lv_gatherTheSeedsFrame;

    int lv_gardenTerrorHealthFrame;

    int[libGRDN_gv_laneCount_C + 1] lv_gardenTerrorHealthStatuses;

    int lv_gardenTerrorHealthIconBlue;

    int lv_gardenTerrorHealthIconRed;

};



// Variable Declarations

timer libGRDN_gv_eventPreviewTimer;

timer libGRDN_gv_eventWarningTimer;

timer libGRDN_gv_eventStartTimer;

timer libGRDN_gv_terrorSpawnTimer;

libGRDN_gs_SeedSpawn[libGRDN_gv_seedSpawnLocationCount_C + 1] libGRDN_gv_seedSpawns;

int[libCore_gv_bALMaxTeams + 1] libGRDN_gv_seedsCollected;

int libGRDN_gv_currentSeedSpawnLocation;

int[libGRDN_gv_recentSeedSpawnMemory_C + 1] libGRDN_gv_recentSeedLocations;

unitgroup libGRDN_gv_seedDefenders;

bool libGRDN_gv_firstSeedEventWarningPlayed;

unit[libGRDN_gv_laneCount_C + 1] libGRDN_gv_gardenTerrors;

point[libGRDN_gv_laneCount_C + 1] libGRDN_gv_gardenTerrorEmergePoints;

libGRDN_gs_GardenUI libGRDN_gv_gardenUI;

bool libGRDN_gv_firstSeedSpawnTransmissionPlayed;

bool libGRDN_gv_firstTerrorSpawnTransmissionPlayed;



// Function Declarations

void libGRDN_gf_InitializeSeedLocation (int lp_locationIndex, point lp_spawnPoint, int lp_hemisphere, int lp_favoredTeam, doodad lp_doodad1, doodad lp_doodad2, doodad lp_doodad3, doodad lp_doodad4, doodad lp_doodad5, doodad lp_doodad6, unit lp_sconce);

fixed libGRDN_gf_RandomCursedPacingSeedSpawnDelay ();

int libGRDN_gf_SeedLocationIndex (unit lp_seed);

int libGRDN_gf_GetNextSeedSpawnLocation ();

void libGRDN_gf_SpawnSeedatLocation (int lp_location);

void libGRDN_gf_SpawnSeedDefender (point lp_spawnPoint);

void libGRDN_gf_EndSeedPhase (int lp_winningTeam);

point libGRDN_gf_GardenTerrorUnburrowPoint (int lp_lane, int lp_team);

void libGRDN_gf_SpawnGardenTerrors ();

void libGRDN_gf_FollowTerrortoLane (unit lp_terrorUnit, int lp_laneNumber);

void libGRDN_gf_EndTerrorPhase (int lp_terrorOwningTeam);

void libGRDN_gf_RunNightfallEnvironmentEffects ();

void libGRDN_gf_RunDaybreakEnvironmentEffects ();

void libGRDN_gf_InitializeGardenUI ();

void libGRDN_gf_UpdateSeedCountUI ();

void libGRDN_gf_ShowHideSeedUI (bool lp_toggle);

void libGRDN_gf_ShowHideGardenTerrorHealthUI (bool lp_toggle, int lp_terrorTeam);

void libGRDN_gf_ShowSeedUICounterLabel (int lp_team);

void libGRDN_gf_ShowSeedUIActiveLabel (int lp_team);

void libGRDN_gf_ShowHideGathertheSeedsSlideout (bool lp_toggle);

void libGRDN_gf_ShowHideObjectivePreviewatLocation (bool lp_toggle, int lp_locationIndex);

void libGRDN_gf_ShowSeedWarningSlideoutwithTimer (fixed lp_waitTime);

void libGRDN_gf_PingUnitUntilitsDead (unit lp_unit, bool lp_longFirstPing);

void libGRDN_gf_PlaySeedWarningFirstTransmission ();

void libGRDN_gf_PlaySeedWarningRepeatTransmission ();

void libGRDN_gf_PlaySeedSpawnFirstTransmission ();

void libGRDN_gf_PlaySeedSpawnRepeatTransmission ();

void libGRDN_gf_PlayTerrorsSpawningSoonTransmission ();

void libGRDN_gf_PlayTerrorsSummonedTransmission (int lp_activeTeam);

void libGRDN_gf_PlayTerrorsDefeatedTransmission (int lp_activeTeam);



// Trigger Declarations

trigger libGRDN_gt_MapInitialization;

trigger libGRDN_gt_IncludeModInitialization;

trigger libGRDN_gt_GatesOpen;

trigger libGRDN_gt_EventPreviewTimerExpires;

trigger libGRDN_gt_EventWarningTimerExpires;

trigger libGRDN_gt_EventStartTimerExpires;

trigger libGRDN_gt_SeedChannelStart;

trigger libGRDN_gt_SeedChannelStop;

trigger libGRDN_gt_SeedGathered;

trigger libGRDN_gt_TerrorSpawnTimerExpires;

trigger libGRDN_gt_GardenTerrorKilled;

trigger libGRDN_gt_GardenTerrorAppearsinLane;

trigger libGRDN_gt_eventstart;

trigger libGRDN_gt_transterrors1soon;

trigger libGRDN_gt_transterrors1now;

trigger libGRDN_gt_transterrors1dead;

trigger libGRDN_gt_terrors;

trigger libGRDN_gt_rainon;

trigger libGRDN_gt_rainoff;

trigger libGRDN_gt_rainleft;

trigger libGRDN_gt_rainright;

trigger libGRDN_gt_night;

trigger libGRDN_gt_day;



// Library Initialization

void libGRDN_InitVariables ();