001package com.fs.starfarer.api.impl.campaign.missions.academy; 002 003import java.awt.Color; 004 005import com.fs.starfarer.api.campaign.CampaignTerrainAPI; 006import com.fs.starfarer.api.campaign.SectorEntityToken; 007import com.fs.starfarer.api.campaign.StarSystemAPI; 008import com.fs.starfarer.api.campaign.econ.MarketAPI; 009import com.fs.starfarer.api.impl.campaign.ids.Factions; 010import com.fs.starfarer.api.impl.campaign.ids.FleetTypes; 011import com.fs.starfarer.api.impl.campaign.ids.Tags; 012import com.fs.starfarer.api.impl.campaign.ids.Terrain; 013import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode; 014import com.fs.starfarer.api.ui.TooltipMakerAPI; 015import com.fs.starfarer.api.util.Misc; 016 017public class GACelestialObject extends GABaseMission { 018 019 public static float MISSION_DAYS = 120f; 020 public static float PROB_HOLOARTS = 0.33f; 021 public static float PROB_PATHERS = 0.5f; 022 public static float PROB_SLIPUP = 0.33f; 023 024 public static float PROB_PULSAR = 0.33f; 025 public static float PROB_BLACK_HOLE = 0.5f; 026 027 public static float PROB_NOT_ASTEROIDS = 0.5f; 028 029 030 public static enum Stage { 031 GO_TO_OBJECT, 032 COMPLETED, 033 FAILED, 034 } 035 036 public static enum Variation { 037 BASIC, 038 PULSAR, 039 BLACK_HOLE, 040 } 041 042 protected StarSystemAPI system; 043 protected Variation variation; 044 protected CampaignTerrainAPI object; 045 protected boolean holoarts = false; 046 protected boolean slipUp = false; 047 protected int patherTithe = 0; 048 049 @Override 050 protected boolean create(MarketAPI createdAt, boolean barEvent) { 051 // if this mission type was already accepted by the player, abort 052 if (!setGlobalReference("$gaCO_ref")) { 053 return false; 054 } 055 056 pickDepartmentAllTags(GADepartments.SCIENCE, GADepartments.WEIRD); 057 if (rollProbability(PROB_HOLOARTS)) { 058 department = "Holoart Studies"; 059 holoarts = true; 060 } 061 062 requireSystemTags(ReqMode.NOT_ANY, Tags.THEME_UNSAFE, Tags.THEME_CORE); 063 requireTerrainType(ReqMode.ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD, Terrain.DEBRIS_FIELD, 064 Terrain.MAGNETIC_FIELD, Terrain.NEBULA, Terrain.RING); 065 if (rollProbability(PROB_NOT_ASTEROIDS)) { 066 preferTerrainType(ReqMode.NOT_ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD); 067 } 068 069 if (!holoarts) { 070 if (rollProbability(PROB_PULSAR)) { 071 preferSystemHasPulsar(); 072 } else if (rollProbability(PROB_BLACK_HOLE)) { 073 preferSystemBlackHole(); 074 } 075 } else { 076 preferSystemNotPulsar(); 077 preferSystemNotBlackHole(); 078 } 079 080 // important to put these last - requirements that come earlier have higher priority 081 //preferTerrainHasSpecialName(); 082 preferSystemUnexplored(); 083 preferTerrainInDirectionOfOtherMissions(); 084 085 object = pickTerrain(); 086 087 if (object == null) { 088 return false; 089 } 090 091 system = object.getStarSystem(); 092 093 setStartingStage(Stage.GO_TO_OBJECT); 094 addSuccessStages(Stage.COMPLETED); 095 addFailureStages(Stage.FAILED); 096 097 //makeImportant(object, "$gaCO_object", Stage.GO_TO_OBJECT); 098 SectorEntityToken node = spawnMissionNode(new LocData(object)); 099 makeImportant(node, "$gaCO_object", Stage.GO_TO_OBJECT); 100 101 102 setStageOnGlobalFlag(Stage.COMPLETED, "$gaCO_scanCompleted"); 103 setStageOnGlobalFlag(Stage.FAILED, "$gaCO_gaveScannerToPathers"); 104 105 if (WITH_TIME_LIMIT) { 106 setTimeLimit(Stage.FAILED, MISSION_DAYS, system); 107 } 108 //setCreditReward(30000, 40000); 109 setCreditReward(CreditReward.AVERAGE); 110 setDefaultGARepRewards(); 111 112 if (system.hasPulsar()) { 113 variation = Variation.PULSAR; 114 } else if (system.hasBlackHole()) { 115 variation = Variation.BLACK_HOLE; 116 } else { 117 variation = Variation.BASIC; 118 } 119 120 slipUp = rollProbability(PROB_SLIPUP); 121 122 if (rollProbability(PROB_PATHERS)) { 123 patherTithe = genRoundNumber(10000, 15000); 124 125 beginWithinHyperspaceRangeTrigger(object, 1f, false, Stage.GO_TO_OBJECT); 126 triggerCreateFleet(FleetSize.LARGE, FleetQuality.HIGHER, Factions.LUDDIC_PATH, FleetTypes.PATROL_MEDIUM, object); 127 triggerFleetPatherNoDefaultTithe(); 128 triggerAutoAdjustFleetStrengthModerate(); 129 triggerMakeAllFleetFlagsPermanent(); 130 triggerSetStandardAggroPirateFlags(); 131 triggerPickLocationAroundEntity(node, 1000f); 132 triggerSpawnFleetAtPickedLocation("$gaCO_patherPermanentFlag", null); 133 triggerFleetAllowLongPursuit(); 134 triggerOrderFleetPatrol(node); 135 // so that the tithe value is available if the interaction with the fleet is after the mission ends 136 triggerSetFleetMemoryValue("$gaCO_patherTithe", Misc.getWithDGS(patherTithe)); 137 triggerFleetMakeImportant("$gaCO_patherMissionInProgress", Stage.GO_TO_OBJECT); 138 endTrigger(); 139 140 } 141 142 setMapMarkerNameColorBasedOnStar(system); 143 144 145 return true; 146 } 147 148 protected void updateInteractionDataImpl() { 149 set("$gaCO_department", department); 150 set("$gaCO_holoarts", holoarts); 151 set("$gaCO_slipUp", slipUp); 152 set("$gaCO_objectAOrAn", getTerrainNameAOrAn(object)); 153 set("$gaCO_celestialObjectNameWithTypeShort", getObjectNameWithTypeShort()); 154 set("$gaCO_celestialObjectNameWithTypeLong", getObjectNameWithTypeLong()); 155 set("$gaCO_celestialObjectName", getTerrainName(object)); 156 set("$gaCO_celestialObjectType", getTerrainType(object)); 157 set("$gaCO_starName", system.getNameWithNoType()); 158 set("$gaCO_systemName", system.getNameWithLowercaseTypeShort()); 159 set("$gaCO_dist", getDistanceLY(object)); 160 set("$gaCO_reward", Misc.getWithDGS(getCreditsReward())); 161 set("$gaCO_variation", variation); 162 } 163 164 @Override 165 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 166 float opad = 10f; 167 Color h = Misc.getHighlightColor(); 168 if (currentStage == Stage.GO_TO_OBJECT) { 169 String extra = ""; 170 if (variation == Variation.BLACK_HOLE) extra = " Avoid the black hole located in-system."; 171 else if (variation == Variation.PULSAR) extra = " Avoid the beam of the in-system pulsar."; 172 info.addPara("Run a scan package on " + getObjectNameWithTypeShort() + 173 " located in the " + system.getNameWithLowercaseTypeShort() + "." + extra, opad); 174 } 175 } 176 177 @Override 178 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 179 Color h = Misc.getHighlightColor(); 180 if (currentStage == Stage.GO_TO_OBJECT) { 181 info.addPara("Scan " + getTerrainTypeAOrAn(object) + " " + getTerrainType(object) + 182 " in the " + system.getNameWithLowercaseTypeShort(), tc, pad); 183 return true; 184 } 185 return false; 186 } 187 188 protected String getObjectNameWithTypeLong() { 189 if (hasSpecialName(object)) { 190 return getTerrainName(object) + " - that's " + getTerrainTypeAOrAn(object) + " " + getTerrainType(object); 191 } else { 192 return getTerrainTypeAOrAn(object) + " " + getTerrainType(object); 193 } 194 } 195 protected String getObjectNameWithTypeShort() { 196 if (hasSpecialName(object)) { 197 return getTerrainName(object) + ", " + getTerrainTypeAOrAn(object) + " " + getTerrainType(object); 198 } else { 199 return getTerrainTypeAOrAn(object) + " " + getTerrainType(object); 200 } 201 } 202 203 @Override 204 public String getBaseName() { 205 return "Scan Celestial Object"; 206 } 207 208} 209 210