//------------------------------------------------------------------- // STANDARD INCLUDES: //------------------------------------------------------------------- //#include ..\..\..\externalobjects.cs //#include ..\..\..\playerAreas.cs //#include ..\..\..\terrainpicker.cs //#include ..\..\..\HuntingAreas.cs //#include ..\..\..\nuggetUtils.cs //#include ..\..\..\default_start_groupings.cs //#include ..\..\Utils_CommonTriggersFix.cs //#include ..\..\..\Utils_CivHandler.cs //#include ..\..\..\Utils_GameTuning.cs //#include ..\..\..\Utils_Helpers.cs //#include ..\..\..\Utils_Econ.cs //#include ..\..\..\Utils_TriggerConditionWrappers.cs //#include ..\..\..\Utils_TriggerEffectWrappers.cs //#include ..\..\Utils_PvESupportFunctions.cs //------------------------------------------------------------------- // CUSTOM INCLUDES: //------------------------------------------------------------------- //#include ..\..\..\Utils_RMTerrainGen.cs //------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.Globalization; //------------------------------------------------------------------- // SCRIPT START: //------------------------------------------------------------------- public partial class RMScript : RandomMap { //--------------------------------------------------------------- // MAIN: //--------------------------------------------------------------- public override void Main() { //----------------------------------------------------------- // SETUP: //----------------------------------------------------------- UtilsGT_PreInit(); SetStatusText("", 0.01f); //createRandomMapClasses(); // fetch variable from the mission string scenarioFile = VariableGet("scenarioFile", ""); if (String.IsNullOrEmpty(scenarioFile)) { // early out on invalid scenario SetStatusText("Failed to load. Invalid scenarioFile.", 1.0f); return; } // //PreInitSetup(); // terrain and scenario creation GetTerrain("Greek Inland"); InitializeFromScenario(scenarioFile); SetSkipBeautify(true); //These secondaries have been removed. -JH 08-14-12 //secondary objectives triggers /*createSecondaryWonderObjective(1, new Vector(537.0f, 507.0f)); if(IsPlayerHuman(5)) { createSecondaryWonderObjective(5, new Vector(537.0f, 507.0f)); } //placeShipwreck(); //fireshipPatrol(); */ //legendary difficulty adjustments //buff the legendary nugget guardian (chieftain). makeNuggetsLegendary(); List meleeUnitList = UtilsCH_GetMilitaryByAttackType(2, UnitAttackInfo.Melee); List rangedUnitList = UtilsCH_GetMilitaryByAttackType(2, UnitAttackInfo.Ranged); //Player 2 and 3 have the same dataset, make seperate lists if this ever changes. //manually add the seapeople specific units meleeUnitList.Add("NPC_Winter_Unit_AbominableSnowmanFighter"); rangedUnitList.Add("Npc_SP_Bowman"); rangedUnitList.Add("Npc_SP_Flagship"); rangedUnitList.Add("NPC_SP_CatapultShip"); UtilsCT_makePlayerLegendary(2, meleeUnitList, rangedUnitList); UtilsCT_makePlayerLegendary(3, meleeUnitList, rangedUnitList); UtilsCT_makePlayerLegendary(4, meleeUnitList, rangedUnitList); //place the secondary objective fortress placeFortress(); placeChieftains(); //place the transport pickup location object. ObjectDef transportPickupLoc = new ObjectDef("transportPickupLoc"); transportPickupLoc.AddItem("AITransportPickup", 1, 0.0f); transportPickupLoc.SetMinDistance(0.0f); transportPickupLoc.SetMaxDistance(0.0f); if (transportPickupLoc.PlaceAtLoc(2, XMetersToFraction(496.0f), ZMetersToFraction(467.0f), 1) != 1) { Info("Failed to place AITransportPickup Location!"); } deploySouthWestNavalPatrol(4); // class and mission tool data spawns Class questTargetClass = new Class("questTargets"); Constraint questTargetConstraint = new ClassDistanceConstraint("quest target constraint", questTargetClass, 30.0f); PlaceExternalObjects(questTargetClass, 0.0f); UtilsGT_Init(); //----------------------------------------------------------- // WRAP UP: //----------------------------------------------------------- SetStatusText("Done.", 1.0f); } private void placeFortress() { ObjectDef fortress = new ObjectDef("fortress"); fortress.AddItem("Con_Bldg_FrostFort_L", 1, 0.0f); fortress.SetMinDistance(0.0f); fortress.SetMaxDistance(3.0f); fortress.PlaceAtLoc(4, XMetersToFraction(358.0f), ZMetersToFraction(258.0f), 1); UtilsCT_ModifyUnitHealth(4, "Con_Bldg_FrostFort_L", 14000.0f, 0.0f); UtilsCT_ModifyUnitRangedDPS(4, "Con_Bldg_FrostFort_L", 0.0f, 0.0f, 0.0f, 0.0f); if (fortress.GetNumberUnitsPlaced() == 0) { Info("Failed to place the fortress. No triggers were created."); return; } int fortressID = fortress.GetUnitPlaced(0); //place quest marker ObjectDef fortressQuestMarker = new ObjectDef("fortressQuestMarket"); fortressQuestMarker.AddItem("Qst_ObjectiveMarkerHigh", 1, 0.0f); fortressQuestMarker.SetMinDistance(0.0f); fortressQuestMarker.SetMaxDistance(3.0f); fortressQuestMarker.PlaceAtLoc(1, XMetersToFraction(358.0f), ZMetersToFraction(258.0f), 1); int questMarkerID = -1; if (fortressQuestMarker.GetNumberUnitsPlaced() == 1) { questMarkerID = fortressQuestMarker.GetUnitPlaced(0); } else { Info("Failed to place the fortress Quest Marker."); } //make the objective trigger int fortressDestroyedTrigger = CreateTrigger("FortressDestroyed", true, false, false, 4, false, false); TriggerCondition_IsDead(fortressID); TriggerEffect_QuestObjectiveComplete(VariableGet("questID", -1), VariableGet("secondaryObjectiveName", "")); TriggerEffect_Destroy(questMarkerID); //setup the timer (so we don't get completion text after the objective has failed.) CreateTrigger("secondaryTimerExpired"); TriggerCondition_Timer(VariableGet("secondaryObjectiveTimer", 0.0f)); TriggerEffect_DisableTrigger(fortressDestroyedTrigger); TriggerEffect_Destroy(questMarkerID); } private void placeChieftains() { ObjectDef chief = new ObjectDef("chief"); chief.AddItem("NPC_Winter_Unit_AbominableSnowmanFighter", 1, 0.0f); chief.SetMinDistance(0.0f); chief.SetMaxDistance(5.0f); //player 4 //3 chiefs //467 538 chief.PlaceAtLoc(4, XMetersToFraction(467.0f), ZMetersToFraction(538.0f), 3); //505 475 chief.PlaceAtLoc(4, XMetersToFraction(505.0f), ZMetersToFraction(475.0f), 3); //484 392 chief.PlaceAtLoc(4, XMetersToFraction(484.0f), ZMetersToFraction(392.0f), 3); //2 chiefs //568 498 chief.PlaceAtLoc(4, XMetersToFraction(568.0f), ZMetersToFraction(498.0f), 2); //1 chief //526 514 chief.PlaceAtLoc(4, XMetersToFraction(526.0f), ZMetersToFraction(514.0f), 1); //543 499 chief.PlaceAtLoc(4, XMetersToFraction(543.0f), ZMetersToFraction(499.0f), 1); //player3 //1 chief //508 168 chief.PlaceAtLoc(3, XMetersToFraction(508.0f), ZMetersToFraction(168.0f), 1); } //unused secondary objective. private void placeShipwreck() { //turn off allied vision CreateTrigger("turnOffVisionToP6", true, true); TriggerEffect_PlayerLOSChange(1, "False", 6); //Note: Player 5 is the coop player in this instance. They are usually player 3. TriggerEffect_PlayerLOSChange(5, "False", 6); createIslands(null, "shipwreckIsland", 1, 0.01f, 0.01f, 6.0f, baseMix, 0.5f, 5, 3, ElevationType.cElevTurbulence, 0.05f, 3, 0.05f, 0.05f, 0.05f, XMetersToFraction(20.0f), ZMetersToFraction(585.0f), null, null, buildTerrainSettings.eBuildAllAreas); createForest(null, "shipwreckIslandForest", 1, 0.005f, 0.005f, forestType, 1.0f, 1.0f, 0.0f, 1, 1, 0.0f, 0.0f, 0.5f, 5, XMetersToFraction(10.0f), ZMetersToFraction(600.0f), false, 0.0f, true); //place a ship ObjectDef wreckedShip = new ObjectDef("wreckedShip"); wreckedShip.SetMinDistance(0.0f); wreckedShip.SetMaxDistance(8.0f); wreckedShip.AddItem("GR_Civ_UtilityBoat", 1, 0.0f); wreckedShip.AddConstraint(new TerrainMaxDistanceConstraint("wreckedShipOnShore", "Land", false, 0.0f)); wreckedShip.AddConstraint(new BoxConstraint("wreckedShipAwayFromMapEdge", 0.005f, 0.005f, 0.995f, 0.995f)); wreckedShip.PlaceAtLoc(6, XMetersToFraction(25.0f), ZMetersToFraction(540.0f), 1); //early out if the shilp failed to place. if (wreckedShip.GetNumberUnitsPlaced() != 1) { Info("Failed to place the wrecked Ship!"); return; } int wreckedShipID = wreckedShip.GetUnitPlaced(0); int wreckedShipArmyID = CreateArmy(6, "wreckedShip"); AddUnitsToArmy(6, wreckedShipArmyID, wreckedShip.mID); ObjectDef maroonedMariners = new ObjectDef("maroonedMariners"); maroonedMariners.SetMinDistance(0.0f); maroonedMariners.SetMaxDistance(25.0f); maroonedMariners.AddItem("Gr_Civ_Villager", 2, 2.0f); maroonedMariners.AddConstraint(new TerrainMaxDistanceConstraint("maroonedMarinersNearShore", "Water", true, 5.0f)); maroonedMariners.AddConstraint(new ClassDistanceConstraint("maroonedMarinersAwayFromForest", mClassForest, 3.0f)); maroonedMariners.PlaceAtLoc(6, XMetersToFraction(25.0f), ZMetersToFraction(542.0f), 1); if (maroonedMariners.GetNumberUnitsPlaced() != 2) { Info("Failed to place the marooned mariners/stranded, shipwrecked seafarers!"); return; } int villager1ID = maroonedMariners.GetUnitPlaced(0); int villager2ID = maroonedMariners.GetUnitPlaced(1); AddUnitsToArmy(6, wreckedShipArmyID, maroonedMariners.mID); //damage the ship. CreateTrigger("SetWreckedShip", true, true, false); TriggerEffect_DamageUnitPercent(wreckedShipID, 95.0f); //TriggerEffect_AttachEffect(wreckedShipID, "Effects\\fire\\CampFire\\SmokeAndEmbers.xml"); int repeatShipMove = CreateTrigger("repeatShipMove", false, false, true); TriggerCondition_Timer(10.0f); TriggerEffect_ArmyMove(6, wreckedShipArmyID, GetTriggerLocationString(40.0f, 0.0f), "False", -1); int removeShip = CreateTrigger("removeShip", false, false, true, 4, false, false); TriggerCondition_ArmyDistanceToPoint(6, wreckedShipArmyID, GetTriggerLocationString(40.0f, 0.0f), "<=", 4.0f); TriggerEffect_ArmyDestroy(6, wreckedShipArmyID); TriggerEffect_DisableTrigger(repeatShipMove); int questID = VariableGet("questID", -1); string tertiaryObjective = VariableGet("tertiaryObjective", ""); int moveFixedShipID = CreateTrigger("FixedShipLeaves", false, false); TriggerEffect_ArmyMove(6, wreckedShipArmyID,GetTriggerLocationString(40.0f, 0.0f) ,"False", -1); TriggerEffect_QuestObjectiveComplete(questID, tertiaryObjective); TriggerEffect_FireEvent(repeatShipMove); TriggerEffect_FireEvent(removeShip); int garrisonVillager2ID = CreateTrigger("Villager2Garrisons", false, false); TriggerEffect_UnitGarrison(villager2ID, wreckedShipID, moveFixedShipID); CreateTrigger("ShipWasFixed"); TriggerCondition_PercentDamaged(wreckedShipID, "==", 0); TriggerEffect_UnitGarrison(villager1ID, wreckedShipID, garrisonVillager2ID); } private void deploySouthWestNavalPatrol(int patrolOwnerID) { //patrol route //83 50 //79 243 //44 373 //105 485 //238 524 //105 485 //44 373 //79 243 ObjectDef southWestPatrol = new ObjectDef("southWestPatrol"); southWestPatrol.AddItem(UtilsCH_GetCivUnitByClassAndRole(patrolOwnerID, UnitClassType.Ship, UnitRoleType.Basic, true), 6, 10.0f); southWestPatrol.AddItem(UtilsCH_GetCivUnitByClassAndRole(patrolOwnerID, UnitClassType.Ship, UnitRoleType.AntiShip, true), 2, 10.0f); southWestPatrol.SetMinDistance(0.0f); southWestPatrol.SetMaxDistance(20.0f); southWestPatrol.PlaceAtLoc(patrolOwnerID, XMetersToFraction(83.0f), ZMetersToFraction(50.0f), 1); List> patrolWaypoints = new List>(); patrolWaypoints.Add(new Vector(83.0f, 50.0f)); patrolWaypoints.Add(new Vector(79.0f, 243.0f)); patrolWaypoints.Add(new Vector(44.0f, 373.0f)); patrolWaypoints.Add(new Vector(105.0f, 485.0f)); patrolWaypoints.Add(new Vector(238.0f, 524.0f)); patrolWaypoints.Add(new Vector(105.0f, 485.0f)); patrolWaypoints.Add(new Vector(44.0f, 373.0f)); patrolWaypoints.Add(new Vector(79.0f, 243.0f)); UtilsCT_createReliablePatrol("southwestPatrolSquad", patrolOwnerID, new List { southWestPatrol.mID }, patrolWaypoints, true); } }