001package com.fs.starfarer.api.impl.campaign.missions.academy; 002 003import java.awt.Color; 004import java.util.List; 005import java.util.Map; 006 007import com.fs.starfarer.api.campaign.CampaignTerrainAPI; 008import com.fs.starfarer.api.campaign.InteractionDialogAPI; 009import com.fs.starfarer.api.campaign.SectorEntityToken; 010import com.fs.starfarer.api.campaign.StarSystemAPI; 011import com.fs.starfarer.api.campaign.econ.MarketAPI; 012import com.fs.starfarer.api.campaign.rules.MemoryAPI; 013import com.fs.starfarer.api.impl.campaign.ids.Entities; 014import com.fs.starfarer.api.impl.campaign.ids.Factions; 015import com.fs.starfarer.api.impl.campaign.ids.FleetTypes; 016import com.fs.starfarer.api.impl.campaign.ids.Tags; 017import com.fs.starfarer.api.impl.campaign.ids.Terrain; 018import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode; 019import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.BreadcrumbSpecial; 020import com.fs.starfarer.api.ui.TooltipMakerAPI; 021import com.fs.starfarer.api.util.Misc; 022import com.fs.starfarer.api.util.Misc.Token; 023 024public class GAProbePackage extends GABaseMission { 025 026 public static float MISSION_DAYS = 120f; 027 public static float PROB_PATHERS = 0.5f; 028 public static float PROB_NOT_ASTEROIDS = 0.5f; 029 030 public static float PROB_IT_BLEW_UP = 0.33f; 031 public static float PROB_MISSING = 0.5f; 032 public static float PROB_SCAVENGER = 0.5f; 033 034 035 public static enum Stage { 036 GO_TO_PROBE, 037 FIND_SCAVENGER, 038 RETURN_TO_ACADEMY, 039 COMPLETED, 040 FAILED, 041 } 042 043 public static enum Variation { 044 BASIC, 045 SCAVENGER, 046 IT_BLEW_UP, 047 PACKAGE_MISSING, 048 } 049 050 protected StarSystemAPI system; 051 protected Variation variation; 052 protected CampaignTerrainAPI object; 053 protected SectorEntityToken probe; 054 protected int hazardPay; 055 056 @Override 057 protected boolean create(MarketAPI createdAt, boolean barEvent) { 058 // if this mission type was already accepted by the player, abort 059 if (!setGlobalReference("$gaProbe_ref")) { 060 return false; 061 } 062 063 //genRandom = Misc.random; 064 065 pickDepartmentAllTags(GADepartments.SCIENCE, GADepartments.WEIRD); 066 067 requireSystemTags(ReqMode.NOT_ANY, Tags.THEME_UNSAFE, Tags.THEME_CORE); 068 requireTerrainType(ReqMode.ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD, 069 Terrain.MAGNETIC_FIELD, Terrain.NEBULA, Terrain.RING); 070 if (rollProbability(PROB_NOT_ASTEROIDS)) { 071 preferTerrainType(ReqMode.NOT_ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD); 072 } 073 074 // important to put these last - requirements that come earlier have higher priority 075 preferSystemNotPulsar(); 076 preferSystemNotBlackHole(); 077 preferSystemUnexplored(); 078 preferTerrainInDirectionOfOtherMissions(); 079 080 //setGenRandom(new Random(99923667662341234L)); 081 object = pickTerrain(); 082 083 if (object == null) { 084 return false; 085 } 086 087 system = object.getStarSystem(); 088 089 // PROB_IT_BLEW_UP = 1f; 090 // PROB_PATHERS = 1f; 091 092 if (rollProbability(PROB_IT_BLEW_UP)) { 093 variation = Variation.IT_BLEW_UP; 094 } else if (rollProbability(PROB_MISSING)) { 095 variation = Variation.PACKAGE_MISSING; 096 } else if (rollProbability(PROB_SCAVENGER)) { 097 variation = Variation.SCAVENGER; 098 } else { 099 variation = Variation.BASIC; 100 } 101 //variation = Variation.SCAVENGER; 102 //variation = Variation.BASIC; 103 //variation = Variation.IT_BLEW_UP; 104 //variation = Variation.PACKAGE_MISSING; 105 106 setStartingStage(Stage.GO_TO_PROBE); 107 addSuccessStages(Stage.COMPLETED); 108 addFailureStages(Stage.FAILED); 109 110 probe = spawnEntity(Entities.GENERIC_PROBE, new LocData(object)); 111 if (probe == null) return false; 112 113 probe.setId("gaProbe_probe"); 114 makeImportant(probe, "$gaProbe_probe", Stage.GO_TO_PROBE); 115 makeImportant(getPerson(), "$gaProbe_returnHere", Stage.RETURN_TO_ACADEMY); 116 117 connectWithGlobalFlag(Stage.GO_TO_PROBE, Stage.FIND_SCAVENGER, "$gaProbe_scavengerTookIt"); 118 setStageOnGlobalFlag(Stage.RETURN_TO_ACADEMY, "$gaProbe_canReturn"); 119 connectWithGlobalFlag(Stage.RETURN_TO_ACADEMY, Stage.COMPLETED, "$gaProbe_finished"); 120 121 if (WITH_TIME_LIMIT) { 122 setTimeLimit(Stage.FAILED, MISSION_DAYS, system, Stage.RETURN_TO_ACADEMY); 123 } 124 //setCreditReward(30000, 40000); 125 setCreditReward(CreditReward.AVERAGE); 126 setDefaultGARepRewards(); 127 if (variation == Variation.IT_BLEW_UP) { 128 hazardPay = getCreditsReward() / 2; 129 spawnDebrisField(DEBRIS_SMALL, DEBRIS_DENSE, new LocData(probe, false)); 130 spawnShipGraveyard(Factions.LUDDIC_PATH, 3, 5, new LocData(probe, false)); 131 132 if (rollProbability(PROB_PATHERS)) { 133 beginWithinHyperspaceRangeTrigger(object, 1f, false, Stage.GO_TO_PROBE); 134 triggerCreateFleet(FleetSize.TINY, FleetQuality.VERY_LOW, Factions.LUDDIC_PATH, FleetTypes.PATROL_SMALL, object); 135 triggerSetFleetSizeFraction(0.03f); 136 triggerMakeNonHostile(); 137 triggerMakeLowRepImpact(); 138 triggerFleetNoJump(); 139 triggerFleetPatherNoDefaultTithe(); 140 triggerSetFleetMissionRef("$gaProbe_ref"); 141 triggerFleetSetPatrolActionText("waiting"); // a bit dark, maybe? 142 triggerOrderFleetPatrol(probe); 143 triggerOrderFleetInterceptPlayer(); 144 triggerPickLocationAroundEntity(probe, 1000f); 145 triggerSpawnFleetAtPickedLocation("$gaProbe_patherPermanentFlag", null); 146 triggerFleetMakeImportant("$gaProbe_patherMissionInProgress", Stage.GO_TO_PROBE); 147 endTrigger(); 148 } 149 } 150 151 if (variation == Variation.SCAVENGER) { 152 beginWithinHyperspaceRangeTrigger(object, 1f, false, Stage.GO_TO_PROBE); 153 triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.LOWER, Factions.SCAVENGERS, FleetTypes.SCAVENGER_MEDIUM, system); 154 triggerAutoAdjustFleetStrengthMajor(); 155 triggerSetFleetFaction(Factions.INDEPENDENT); 156 157 triggerMakeLowRepImpact(); 158 triggerFleetSetAvoidPlayerSlowly(); 159 triggerMakeFleetIgnoredByOtherFleets(); 160 161 triggerPickLocationAtClosestToEntityJumpPoint(system, probe); 162 triggerSetEntityToPickedJumpPoint(); 163 triggerPickLocationAroundEntity(5000); 164 165 // so the flag is there prior to the FIND_SCAVENGER stage 166 triggerSpawnFleetAtPickedLocation("$gaProbe_scavenger", null); 167 168 triggerFleetSetTravelActionText("exploring system"); 169 triggerFleetSetPatrolActionText("preparing to leave system"); 170 triggerOrderFleetPatrolEntity(false); 171 172 triggerFleetMakeImportant("$gaProbe_scavenger", Stage.FIND_SCAVENGER); 173 triggerFleetAddDefeatTrigger("gaProbeScavengerDefeated"); 174 endTrigger(); 175 } 176 177 setMapMarkerNameColorBasedOnStar(system); 178 179 return true; 180 } 181 182 @Override 183 protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) { 184 if (action.equals("updateReward")) { 185 setCreditReward(getCreditsReward() + hazardPay); 186 return true; 187 } 188 return false; 189 } 190 191 192 protected void updateInteractionDataImpl() { 193 set("$gaProbe_department", department); 194 if (getCurrentStage() != null) { 195 set("$gaProbe_stage", ((Enum)getCurrentStage()).name()); 196 } 197 set("$gaProbe_celestialObjectNameWithType", getObjectNameWithType()); 198 set("$gaProbe_starName", system.getNameWithNoType()); 199 set("$gaProbe_systemName", system.getNameWithLowercaseTypeShort()); 200 set("$gaProbe_dist", getDistanceLY(object)); 201 set("$gaProbe_reward", Misc.getWithDGS(getCreditsReward())); 202 set("$gaProbe_hazardPay", Misc.getWithDGS(hazardPay)); 203 set("$gaProbe_variation", variation); 204 } 205 206 @Override 207 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 208 float opad = 10f; 209 Color h = Misc.getHighlightColor(); 210 if (currentStage == Stage.GO_TO_PROBE) { 211 if (probe != null) { 212 String loc = BreadcrumbSpecial.getLocatedString(probe, true); 213 info.addPara("Recover an instrument package from a probe " + loc + ".", opad); 214 } else { 215 info.addPara("Recover an instrument package from a probe in the " + 216 system.getNameWithLowercaseTypeShort() + ".", opad); 217 } 218 } else if (currentStage == Stage.FIND_SCAVENGER) { 219 info.addPara("Go to the nearest jump-point and retrieve the instrument package " + 220 " from scavengers before they leave the system.", opad); 221 } else if (currentStage == Stage.RETURN_TO_ACADEMY) { 222 info.addPara("Return the instrument package to the Galatia Academy and talk to " + 223 getPerson().getNameString() + " to receive your reward.", opad); 224 } 225 } 226 227 @Override 228 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 229 Color h = Misc.getHighlightColor(); 230 if (currentStage == Stage.GO_TO_PROBE) { 231 if (system.isCurrentLocation()) { 232 info.addPara("Recover the instrument package from the probe", tc, pad); 233 } else { 234 info.addPara(getGoToSystemTextShort(system), tc, pad); 235 } 236 return true; 237 } else if (currentStage == Stage.FIND_SCAVENGER) { 238 info.addPara("Recover the instrument package from scavengers at one of the jump-points", 239 tc, pad); 240 } else if (currentStage == Stage.RETURN_TO_ACADEMY) { 241 info.addPara("Return to the Galatia Academy and talk to " + getPerson().getNameString(), tc, pad); 242 return true; 243 } 244 return false; 245 } 246 247 248 protected String getObjectNameWithType() { 249 if (hasSpecialName(object)) { 250 return getTerrainTypeAOrAn(object) + " " + getTerrainType(object) + " called " + getTerrainName(object); 251 } else { 252 return getTerrainTypeAOrAn(object) + " " + getTerrainType(object); 253 } 254 } 255 256 @Override 257 public String getBaseName() { 258 return "Recover Instrument Package"; 259 } 260 261} 262 263