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.Global; 008import com.fs.starfarer.api.campaign.InteractionDialogAPI; 009import com.fs.starfarer.api.campaign.PlanetAPI; 010import com.fs.starfarer.api.campaign.econ.MarketAPI; 011import com.fs.starfarer.api.campaign.rules.MemoryAPI; 012import com.fs.starfarer.api.characters.PersonAPI; 013import com.fs.starfarer.api.impl.campaign.AICoreOfficerPluginImpl; 014import com.fs.starfarer.api.impl.campaign.ids.Commodities; 015import com.fs.starfarer.api.impl.campaign.ids.Factions; 016import com.fs.starfarer.api.impl.campaign.ids.FleetTypes; 017import com.fs.starfarer.api.impl.campaign.ids.Ranks; 018import com.fs.starfarer.api.ui.TooltipMakerAPI; 019import com.fs.starfarer.api.util.Misc; 020import com.fs.starfarer.api.util.Misc.Token; 021 022public class GAOutpost extends GABaseMission { 023 024 public static float MISSION_DAYS = 120f; 025 public static float PROB_DESTROYED = 0.5f; 026 public static float PROB_ROGUE_AI = 0.6f; 027 public static float PROB_DESTROYED_PIRATES = 1f/6f; 028 public static float PROB_DESTROYED_PATHERS = 1f/5f; // 4/6 chance for DESTROYED_OTHER 029 public static float PROB_HOSTILE_FLEET = 0.5f; 030 031 032 //public static float PROB_PATHER_OR_PIRATE = 0.5f; 033// public static int RAID_DIFFICULTY = 100; 034// public static int MARINES_REQUIRED = RAID_DIFFICULTY / 2; 035 036 037 public static enum Stage { 038 GO_TO_OUTPOST, 039 RETURN_TO_ACADEMY, 040 COMPLETED, 041 FAILED, 042 } 043 044 public static enum Variation { 045 BASIC, 046 DESTROYED_PATHERS, 047 DESTROYED_PIRATES, 048 DESTROYED_OTHER, 049 ROGUE_AI, 050 } 051 052 protected PlanetAPI planet; 053 protected Variation variation; 054 protected PersonAPI leader; 055 protected PersonAPI core; 056 protected int terribleEnd; 057 protected int bizarreProject; 058 059 @Override 060 protected boolean create(MarketAPI createdAt, boolean barEvent) { 061 // if this mission type was already accepted by the player, abort 062 if (!setGlobalReference("$gaOp_ref")) { 063 return false; 064 } 065 066 pickDepartment(GADepartments.INDUSTRIAL, GADepartments.MILITARY, GADepartments.SCIENCE, GADepartments.WEIRD); 067 068 if (rollProbability(PROB_DESTROYED)) { 069 if (rollProbability(PROB_DESTROYED_PIRATES)) { 070 variation = Variation.DESTROYED_PIRATES; 071 } else if (rollProbability(PROB_DESTROYED_PATHERS)) { 072 variation = Variation.DESTROYED_PATHERS; 073 } else { 074 variation = Variation.DESTROYED_OTHER; 075 terribleEnd = genRandom.nextInt(4); 076 } 077 } else if (rollProbability(PROB_ROGUE_AI)) { 078 variation = Variation.ROGUE_AI; 079 bizarreProject = genRandom.nextInt(7); 080 } else { 081 variation = Variation.BASIC; 082 } 083 084// variation = Variation.BASIC; 085// variation = Variation.DESTROYED_OTHER; 086// terribleEnd = genRandom.nextInt(4); 087// variation = Variation.DESTROYED_PATHERS; 088// PROB_HOSTILE_FLEET = 1f; 089// variation = Variation.ROGUE_AI; 090// bizarreProject = genRandom.nextInt(7); 091 092 resetSearch(); 093 094 //genRandom = new Random(); 095// requireSystemTags(ReqMode.ANY, Tags.THEME_REMNANT, Tags.THEME_DERELICT, 096// Tags.THEME_MISC, Tags.THEME_MISC_SKIP, Tags.THEME_RUINS); 097 preferSystemInteresting(); 098 preferSystemOnFringeOfSector(); 099 preferSystemUnexplored(); 100 requirePlanetNotStar(); 101 requirePlanetUnpopulated(); 102 requirePlanetNotGasGiant(); 103 preferPlanetNotFullySurveyed(); 104 preferPlanetInDirectionOfOtherMissions(); 105 106 planet = pickPlanet(); 107 108 if (planet == null) { 109 return false; 110 } 111 112 setStartingStage(Stage.GO_TO_OUTPOST); 113 addSuccessStages(Stage.COMPLETED); 114 addFailureStages(Stage.FAILED); 115 116 makeImportant(planet, "$gaOp_targetPlanet", Stage.GO_TO_OUTPOST); 117 makeImportant(getPerson(), "$gaOp_returnHere", Stage.RETURN_TO_ACADEMY); 118 119 connectWithGlobalFlag(Stage.GO_TO_OUTPOST, Stage.RETURN_TO_ACADEMY, "$gaOp_needToReturn"); 120 setStageOnGlobalFlag(Stage.COMPLETED, "$gaOp_completed"); 121 122 if (WITH_TIME_LIMIT) { 123 setTimeLimit(Stage.FAILED, MISSION_DAYS, planet.getStarSystem(), Stage.RETURN_TO_ACADEMY); 124 } 125 //setCreditReward(40000, 50000); 126 setCreditReward(CreditReward.AVERAGE); 127 setDefaultGARepRewards(); 128 129 leader = Global.getSector().getFaction(Factions.INDEPENDENT).createRandomPerson(genRandom); 130 leader.setRankId(Ranks.CITIZEN); 131 leader.setPostId(Ranks.POST_ACADEMICIAN); 132 133 core = new AICoreOfficerPluginImpl().createPerson(Commodities.BETA_CORE, Factions.NEUTRAL, genRandom); 134 135 136 if (variation == Variation.DESTROYED_PIRATES && rollProbability(PROB_HOSTILE_FLEET)) { 137 beginStageTrigger(Stage.RETURN_TO_ACADEMY); 138 triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, Factions.PIRATES, FleetTypes.PATROL_MEDIUM, planet); 139 triggerAutoAdjustFleetStrengthModerate(); 140 triggerFleetAllowLongPursuit(); 141 triggerPickLocationAroundEntity(planet, 3000f); 142 triggerSpawnFleetAtPickedLocation(null, null); 143 triggerOrderFleetPatrol(planet); 144 endTrigger(); 145 } else if (variation == Variation.DESTROYED_PATHERS && rollProbability(PROB_HOSTILE_FLEET)) { 146 beginStageTrigger(Stage.RETURN_TO_ACADEMY); 147 triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, Factions.LUDDIC_PATH, FleetTypes.PATROL_MEDIUM, planet); 148 triggerAutoAdjustFleetStrengthModerate(); 149 triggerFleetAllowLongPursuit(); 150 triggerFleetPatherNoDefaultTithe(); 151 triggerPickLocationAroundEntity(planet, 3000f); 152 triggerSpawnFleetAtPickedLocation(null, null); 153 triggerOrderFleetPatrol(planet); 154 endTrigger(); 155 } 156 157 return true; 158 } 159 160 @Override 161 protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params, 162 Map<String, MemoryAPI> memoryMap) { 163 if (dialog != null && action.equals("showLeader")) { 164 showPersonInfo(leader, dialog, false, false); 165 return true; 166 } 167 if (dialog != null && action.equals("showCore")) { 168 showPersonInfo(core, dialog, false, false); 169 return true; 170 } 171 if (dialog != null && action.equals("doubleReward")) { 172 setCreditReward(getCreditsReward() * 2); 173 return true; 174 } 175 return false; 176 } 177 178 protected void updateInteractionDataImpl() { 179 set("$gaOp_department", department); 180 set("$gaOp_planetId", planet.getId()); 181 set("$gaOp_planetName", planet.getName()); 182 set("$gaOp_systemName", planet.getStarSystem().getNameWithNoType()); 183 set("$gaOp_dist", getDistanceLY(planet)); 184 set("$gaOp_reward", Misc.getWithDGS(getCreditsReward())); 185 set("$gaOp_leaderHeOrShe", leader.getHeOrShe()); 186 set("$gaOp_leaderHisOrHer", leader.getHisOrHer()); 187 //variation = Variation.BASIC; 188 set("$gaOp_variation", variation); 189 set("$gaOp_terribleEnd", terribleEnd); 190 set("$gaOp_bizarreProject", bizarreProject); 191 set("$gaOp_destroyed", variation == Variation.DESTROYED_OTHER || 192 variation == Variation.DESTROYED_PATHERS || 193 variation == Variation.DESTROYED_PIRATES); 194// if (variation == Variation.DECIV) { 195// set("$gaOp_marinesReq", MARINES_REQUIRED); 196// set("$gaOp_raidDifficulty", RAID_DIFFICULTY); 197// } else if (variation == Variation.PULSAR) { 198// PlanetAPI pulsar = Misc.getPulsarInSystem(planet.getStarSystem()); 199// if (pulsar != null) { 200// set("$gaOp_pulsarName", planet.getStarSystem().getNameWithNoType()); 201// } 202// } 203 } 204 205 @Override 206 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 207 float opad = 10f; 208 Color h = Misc.getHighlightColor(); 209 if (currentStage == Stage.GO_TO_OUTPOST) { 210 info.addPara(getGoToPlanetTextPre(planet) + 211 ", and drop off a small team of scientists at an outpost located there.", opad); 212 } else if (currentStage == Stage.RETURN_TO_ACADEMY) { 213 info.addPara("Return to the Galatia Academy and talk to " + 214 getPerson().getNameString() + " to receive your reward.", opad); 215 } 216 } 217 218 @Override 219 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 220 Color h = Misc.getHighlightColor(); 221 if (currentStage == Stage.GO_TO_OUTPOST) { 222 info.addPara(getGoToPlanetTextShort(planet), tc, pad); 223 return true; 224 } else if (currentStage == Stage.RETURN_TO_ACADEMY) { 225 info.addPara("Return to the Galatia Academy and talk to " + getPerson().getNameString(), tc, pad); 226 return true; 227 } 228 return false; 229 } 230 231 @Override 232 public String getBaseName() { 233 return "Science Team Transport"; 234 } 235 236} 237 238 239 240 241