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.InteractionDialogAPI; 008import com.fs.starfarer.api.campaign.econ.MarketAPI; 009import com.fs.starfarer.api.campaign.rules.MemoryAPI; 010import com.fs.starfarer.api.characters.PersonAPI; 011import com.fs.starfarer.api.impl.campaign.ids.Factions; 012import com.fs.starfarer.api.impl.campaign.ids.FleetTypes; 013import com.fs.starfarer.api.ui.TooltipMakerAPI; 014import com.fs.starfarer.api.util.Misc; 015import com.fs.starfarer.api.util.Misc.Token; 016 017public class GABuyArtifact extends GABaseMission { 018 019 public static float RAID_DIFFICULTY = 100f; 020 021 public static float MISSION_DAYS = 120f; 022 023 public static float PROB_PIRATE_FLEET = 1f/4f; 024 public static float PROB_PATHER_FLEET = 1f/3f; 025 public static float PROB_TRITACH_FLEET = 1f/2f; 026 027 public static float PROB_PIRATE_VARIATION = 0.5f; 028 029 030 public static enum Stage { 031 GO_TO_MARKET, 032 RETURN_TO_ACADEMY, 033 COMPLETED, 034 FAILED, 035 FAILED_DECIV, 036 } 037 038 public static enum Variation { 039 PIRATE, 040 PATHER, 041 } 042 043 protected MarketAPI market; 044 protected Variation variation; 045 protected PersonAPI contact; 046 protected String item; 047 048 protected int costNormal; 049 protected int costHigh; 050 protected int costVeryLow; 051 052 @Override 053 protected boolean create(MarketAPI createdAt, boolean barEvent) { 054 // if this mission type was already accepted by the player, abort 055 if (!setGlobalReference("$gaBA_ref")) { 056 return false; 057 } 058 if (getGlobalMemory().contains("$gaBA_playerOwes")) { 059 return false; // the player needs to pay back the advance before this mission is offered again 060 } 061 062 pickDepartment(GADepartments.INDUSTRIAL, GADepartments.MILITARY, GADepartments.SCIENCE, GADepartments.WEIRD); 063 064 if (rollProbability(PROB_PIRATE_VARIATION)) { 065 variation = Variation.PIRATE; 066 } else { 067 variation = Variation.PATHER; 068 } 069 070 resetSearch(); 071 072 if (variation == Variation.PIRATE) { 073 requireMarketFaction(Factions.PIRATES); 074 } else { 075 requireMarketFaction(Factions.LUDDIC_PATH, Factions.LUDDIC_CHURCH); 076 } 077 requireMarketNotHidden(); 078 requireMarketNotInHyperspace(); 079 requireMarketLocationNot("galatia"); 080 preferMarketInDirectionOfOtherMissions(); 081 market = pickMarket(); 082 083// market = getMarket("kantas_den"); 084// variation = Variation.PIRATE; 085 086 if (market == null) { 087 return false; 088 } 089 090 if (variation == Variation.PIRATE) { 091 contact = findOrCreateCriminalTrader(market, true); 092 } else { 093 contact = findOrCreateTrader(Factions.LUDDIC_PATH, market, true); 094 } 095 if (contact == null) { 096 return false; 097 } 098 099 item = pickOne( 100 "unique regenerative structural elements", 101 "an advanced phase conversion prototype", 102 "an example of a lost technology", 103 "experimental hull material samples", 104 "uncommon power system components", 105 "Domain-era forge components", 106 "a small-scale momentum decoupling device", 107 "a fascinating low-power field projector", 108 "parts of an experimental bulk phase converter", 109 "classified Explorarium probe samples" 110 ); 111 112 setStartingStage(Stage.GO_TO_MARKET); 113 addSuccessStages(Stage.COMPLETED); 114 addFailureStages(Stage.FAILED); 115 addNoPenaltyFailureStages(Stage.FAILED_DECIV); 116 117 //setPersonDoGenericPortAuthorityCheck(contact); 118 makeImportant(contact, "$gaBA_contact", Stage.GO_TO_MARKET); 119 makeImportant(getPerson(), "$gaBA_returnHere", Stage.RETURN_TO_ACADEMY); 120 121 connectWithGlobalFlag(Stage.GO_TO_MARKET, Stage.RETURN_TO_ACADEMY, "$gaBA_needToReturn"); 122 setStageOnGlobalFlag(Stage.COMPLETED, "$gaBA_completed"); 123 setStageOnGlobalFlag(Stage.FAILED, "$gaBA_failed"); 124 125 connectWithMarketDecivilized(Stage.GO_TO_MARKET, Stage.FAILED_DECIV, market); 126 127 if (WITH_TIME_LIMIT) { 128 setTimeLimit(Stage.FAILED, MISSION_DAYS, market.getStarSystem(), Stage.RETURN_TO_ACADEMY); 129 } 130 //setCreditReward(30000, 40000); 131 setCreditReward(CreditReward.AVERAGE); 132 setDefaultGARepRewards(); 133 134 costNormal = genRoundNumber(40000, 50000); 135 costHigh = genRoundNumber(70000, 80000); 136 costVeryLow = genRoundNumber(5000, 8000); 137 138 beginStageTrigger(Stage.FAILED, Stage.FAILED_DECIV); 139 triggerSetGlobalMemoryValuePermanent("$gaBA_playerOwes", true); 140 triggerSetGlobalMemoryValuePermanent("$gaBA_failedItem", getWithoutArticle(item)); 141 triggerSetGlobalMemoryValuePermanent("$gaBA_failedCredits", Misc.getWithDGS(costNormal)); 142 endTrigger(); 143 144 if (rollProbability(PROB_PIRATE_FLEET)) { 145 beginWithinHyperspaceRangeTrigger(createdAt, 3f, true, Stage.RETURN_TO_ACADEMY); 146 triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, Factions.PIRATES, FleetTypes.PATROL_MEDIUM, createdAt.getPrimaryEntity()); 147 //triggerFleetSetOfficers(OfficerNum.MORE, OfficerQuality.HIGHER); 148 triggerAutoAdjustFleetStrengthModerate(); 149 //triggerSetFleetDoctrineOther(5, 4); 150 151 triggerSetStandardAggroPirateFlags(); 152 triggerFleetAllowLongPursuit(); 153 triggerSetFleetAlwaysPursue(); 154 triggerPickLocationTowardsPlayer(createdAt.getStarSystem().getHyperspaceAnchor(), 90f, getUnits(1.5f)); 155 triggerSpawnFleetAtPickedLocation("$pwi_wantsItem", null); 156 triggerSetFleetMemoryValue("$pwi_item", getWithoutArticle(item)); 157 triggerSetFleetMemoryValue("$pwi_credits", Misc.getWithDGS(genRoundNumber(10000, 15000))); 158 triggerSetFleetMemoryValue("$pwi_missionFailTrigger", "GABAHandedOverItemFailMission"); 159 triggerOrderFleetInterceptPlayer(); 160 triggerFleetMakeImportant(null, Stage.RETURN_TO_ACADEMY); 161 endTrigger(); 162 } else if (rollProbability(PROB_PATHER_FLEET)) { 163 beginWithinHyperspaceRangeTrigger(createdAt, 3f, true, Stage.RETURN_TO_ACADEMY); 164 triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, Factions.LUDDIC_PATH, FleetTypes.PATROL_MEDIUM, createdAt.getPrimaryEntity()); 165 triggerAutoAdjustFleetStrengthModerate(); 166 triggerSetStandardAggroPirateFlags(); 167 triggerFleetAllowLongPursuit(); 168 triggerSetFleetAlwaysPursue(); 169 triggerPickLocationTowardsPlayer(createdAt.getStarSystem().getHyperspaceAnchor(), 90f, getUnits(1.5f)); 170 triggerSpawnFleetAtPickedLocation("$pwi2_wantsItem", null); 171 triggerSetFleetMemoryValue("$pwi2_item", getWithoutArticle(item)); 172 triggerSetFleetMemoryValue("$pwi2_missionFailTrigger", "GABAHandedOverItemFailMission"); 173 triggerOrderFleetInterceptPlayer(); 174 triggerFleetMakeImportant(null, Stage.RETURN_TO_ACADEMY); 175 endTrigger(); 176 } else if (rollProbability(PROB_TRITACH_FLEET)) { 177 beginWithinHyperspaceRangeTrigger(createdAt, 3f, true, Stage.RETURN_TO_ACADEMY); 178 triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, Factions.TRITACHYON, FleetTypes.TASK_FORCE, createdAt.getPrimaryEntity()); 179 triggerAutoAdjustFleetStrengthModerate(); 180 triggerFleetAllowLongPursuit(); 181 triggerPickLocationTowardsPlayer(createdAt.getStarSystem().getHyperspaceAnchor(), 90f, getUnits(1.5f)); 182 triggerSpawnFleetAtPickedLocation("$ttwi_wantsItem", null); 183 triggerSetFleetMemoryValue("$ttwi_item", getWithoutArticle(item)); 184 triggerSetFleetMemoryValue("$ttwi_credits", Misc.getWithDGS(genRoundNumber(120000, 150000))); 185 triggerSetFleetMemoryValue("$ttwi_missionFailTrigger", "GABAHandedOverItemFailMission"); 186 triggerOrderFleetInterceptPlayer(); 187 triggerFleetMakeImportant(null, Stage.RETURN_TO_ACADEMY); 188 endTrigger(); 189 } 190 191 192 return true; 193 } 194 195 @Override 196 protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params, 197 Map<String, MemoryAPI> memoryMap) { 198// if (dialog != null && action.equals("showLeader")) { 199// showPersonInfo(leader, dialog, false, false); 200// return true; 201// } 202 return false; 203 } 204 205 protected void updateInteractionDataImpl() { 206 set("$gaBA_department", department); 207 set("$gaBA_marketName", market.getName()); 208 set("$gaBA_onOrAt", market.getOnOrAt()); 209 210 set("$gaBA_contactName", contact.getNameString()); 211 set("$gaBA_raidDifficulty", RAID_DIFFICULTY); 212 213 set("$gaBA_costVeryLow", Misc.getWithDGS(costVeryLow)); 214 set("$gaBA_costNormal", Misc.getWithDGS(costNormal)); 215 set("$gaBA_costHigh", Misc.getWithDGS(costHigh)); 216 217 set("$gaBA_systemName", market.getStarSystem().getNameWithNoType()); 218 set("$gaBA_dist", getDistanceLY(market)); 219 set("$gaBA_reward", Misc.getWithDGS(getCreditsReward())); 220 set("$gaBA_variation", variation); 221 222 set("$gaBA_aOrAnItem", item); 223 set("$gaBA_item", getWithoutArticle(item)); 224 } 225 226 @Override 227 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 228 if (getPerson() == null || getPerson().getMarket() == null) return; 229 float opad = 10f; 230 Color h = Misc.getHighlightColor(); 231 if (currentStage == Stage.GO_TO_MARKET) { 232 info.addPara(getGoToMarketText(market) + 233 ", and buy " + item + " from " + contact.getNameString() + ".", opad); 234 } else if (currentStage == Stage.RETURN_TO_ACADEMY) { 235 info.addPara(getReturnText("the Galatia Academy") + ".", opad); 236 } 237 } 238 239 @Override 240 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 241 Color h = Misc.getHighlightColor(); 242 if (currentStage == Stage.GO_TO_MARKET) { 243 info.addPara(getGoToMarketText(market), tc, pad); 244 return true; 245 } else if (currentStage == Stage.RETURN_TO_ACADEMY) { 246 info.addPara(getReturnTextShort("the Galatia Academy"), tc, pad); 247 return true; 248 } 249 return false; 250 } 251 252 @Override 253 public String getBaseName() { 254 return "Acquire Artifact"; 255 } 256 257} 258 259 260 261 262