001package com.fs.starfarer.api.impl.campaign.missions; 002 003import java.awt.Color; 004 005import com.fs.starfarer.api.campaign.PersonImportance; 006import com.fs.starfarer.api.campaign.econ.MarketAPI; 007import com.fs.starfarer.api.characters.PersonAPI; 008import com.fs.starfarer.api.impl.campaign.ids.Factions; 009import com.fs.starfarer.api.impl.campaign.ids.Ranks; 010import com.fs.starfarer.api.impl.campaign.ids.Tags; 011import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent; 012import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidDangerLevel; 013import com.fs.starfarer.api.ui.TooltipMakerAPI; 014import com.fs.starfarer.api.util.Misc; 015 016public class JailbreakMission extends HubMissionWithBarEvent { 017 018 public static float MISSION_DAYS = 120f; 019 public static float PROB_COMPLICATIONS = 0.5f; 020 021 public static enum Stage { 022 JAILBREAK, 023 RETURN, 024 COMPLETED, 025 FAILED, 026 FAILED_DECIV, 027 } 028 029 protected MarketAPI market; 030 protected RaidDangerLevel danger; 031 protected int storyCost = 0; 032 033 @Override 034 protected boolean create(MarketAPI createdAt, boolean barEvent) { 035// System.out.println("JAILBREAK: " + genRandom.nextLong()); 036 037 if (barEvent) { 038 setGiverRank(Ranks.CITIZEN); 039 setGiverPost(pickOne(Ranks.POST_AGENT, Ranks.POST_SMUGGLER, Ranks.POST_GANGSTER, 040 Ranks.POST_FENCE, Ranks.POST_CRIMINAL)); 041 setGiverImportance(pickImportance()); 042 setGiverFaction(Factions.PIRATES); 043 setGiverTags(Tags.CONTACT_UNDERWORLD); 044 findOrCreateGiver(createdAt, true, false); 045 } 046 047 PersonAPI person = getPerson(); 048 if (person == null) return false; 049 050 if (!setPersonMissionRef(person, "$jabr_ref")) { 051 return false; 052 } 053 054 if (barEvent) { 055 setGiverIsPotentialContactOnSuccess(); 056 } 057 058 PersonImportance importance = person.getImportance(); 059 int minMarketSize = 3; 060 int maxMarketSize = 9; 061 switch (importance) { 062 case VERY_LOW: 063 minMarketSize = 3; 064 maxMarketSize = 4; 065 danger = RaidDangerLevel.MINIMAL; 066 break; 067 case LOW: 068 minMarketSize = 4; 069 maxMarketSize = 4; 070 danger = RaidDangerLevel.LOW; 071 break; 072 case MEDIUM: 073 minMarketSize = 5; 074 maxMarketSize = 5; 075 danger = RaidDangerLevel.MEDIUM; 076 break; 077 case HIGH: 078 minMarketSize = 5; 079 maxMarketSize = 6; 080 danger = RaidDangerLevel.HIGH; 081 break; 082 case VERY_HIGH: 083 minMarketSize = 6; 084 maxMarketSize = 8; 085 danger = RaidDangerLevel.EXTREME; 086 break; 087 } 088 089 requireMarketIsNot(createdAt); 090 requireMarketNotHidden(); 091 requireMarketNotInHyperspace(); 092 requireMarketFactionNotPlayer(); 093 preferMarketSizeAtLeast(minMarketSize); 094 preferMarketSizeAtMost(maxMarketSize); 095 preferMarketInDirectionOfOtherMissions(); 096 market = pickMarket(); 097 098 099 if (market == null) return false; 100 if (!setMarketMissionRef(market, "$jabr_ref")) { 101 return false; 102 } 103 104 int marines = getMarinesRequiredForCustomObjective(market, danger); 105 if (!isOkToOfferMissionRequiringMarines(marines)) { 106 return false; 107 } 108 109 makeImportant(market, "$jabr_target", Stage.JAILBREAK); 110 makeImportant(getPerson(), "$jabr_returnHere", Stage.RETURN); 111 112 setStartingStage(Stage.JAILBREAK); 113 setSuccessStage(Stage.COMPLETED); 114 addFailureStages(Stage.FAILED); 115 116 connectWithMemoryFlag(Stage.JAILBREAK, Stage.RETURN, market, "$jabr_needToReturn"); 117 setStageOnMemoryFlag(Stage.COMPLETED, person, "$jabr_completed"); 118 119 addNoPenaltyFailureStages(Stage.FAILED_DECIV); 120 connectWithMarketDecivilized(Stage.JAILBREAK, Stage.FAILED_DECIV, market); 121 setStageOnMarketDecivilized(Stage.FAILED_DECIV, createdAt); 122 123 setTimeLimit(Stage.FAILED, MISSION_DAYS, null, Stage.RETURN); 124 125 //int size = market.getSize(); 126 //setCreditReward(CreditReward.HIGH, size); 127 128 int bonus = getRewardBonusForMarines(getMarinesRequiredForCustomObjective(market, danger)); 129 setCreditRewardWithBonus(CreditReward.AVERAGE, bonus); 130 131 storyCost = getRoundNumber(getCreditsReward() / 2); 132 133 134 if (rollProbability(PROB_COMPLICATIONS)) { 135 triggerComplicationBegin(Stage.RETURN, ComplicationSpawn.APPROACHING_OR_ENTERING, 136 createdAt.getStarSystem(), Factions.MERCENARY, 137 "the escapee", "they", "the escapee from " + market.getName(), 138 0, 139 true, ComplicationRepImpact.NONE, null); 140 //triggerSetFleetSizeAndQuality(FleetSize.HUGE, FleetQuality.SMOD_3, FleetTypes.PATROL_LARGE); 141 //triggerSetFleetDoctrineComp(0, 0, 5); 142 triggerComplicationEnd(true); 143// triggerComplicationBegin(Stage.JAILBREAK, ComplicationSpawn.ENTERING_SYSTEM, 144// createdAt.getStarSystem(), Factions.REMNANTS, 145// "the escapee", "they", "the escapee from " + market.getName(), 146// //getRoundNumber(getCreditsReward() * 1.5f), 147// 10000, 148// true, ComplicationRepImpact.NONE, null); 149// triggerComplicationEnd(); 150 } 151 152 return true; 153 } 154 155 156 protected void updateInteractionDataImpl() { 157 set("$jabr_barEvent", isBarEvent()); 158 set("$jabr_manOrWoman", getPerson().getManOrWoman()); 159 set("$jabr_heOrShe", getPerson().getHeOrShe()); 160 set("$jabr_hisOrHer", getPerson().getHisOrHer()); 161 set("$jabr_HisOrHer", Misc.ucFirst(getPerson().getHisOrHer())); 162 set("$jabr_reward", Misc.getWithDGS(getCreditsReward())); 163 set("$jabr_storyCost", Misc.getWithDGS(storyCost)); 164 165 set("$jabr_systemName", market.getStarSystem().getNameWithLowercaseTypeShort()); 166 set("$jabr_marketName", market.getName()); 167 set("$jabr_marketOnOrAt", market.getOnOrAt()); 168 set("$jabr_marketFactionArticle", market.getFaction().getPersonNamePrefixAOrAn()); 169 set("$jabr_marketFaction", market.getFaction().getPersonNamePrefix()); 170 set("$jabr_factionColor", market.getFaction().getBaseUIColor()); 171 set("$jabr_dist", getDistanceLY(market)); 172 173 set("$jabr_danger", danger); 174 set("$jabr_marines", Misc.getWithDGS(getMarinesRequiredForCustomObjective(market, danger))); 175 } 176 177 @Override 178 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 179 if (getPerson() == null || getPerson().getMarket() == null) return; 180 float opad = 10f; 181 Color h = Misc.getHighlightColor(); 182 if (currentStage == Stage.JAILBREAK) { 183 addStandardMarketDesc("Break target out of confinement " + market.getOnOrAt(), market, info, opad); 184 addCustomRaidInfo(market, danger, info, opad); 185 186 } else if (currentStage == Stage.RETURN) { 187 info.addPara(getReturnText(getPerson().getMarket().getName()) + ".", opad); 188 } 189 } 190 191 @Override 192 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 193 Color h = Misc.getHighlightColor(); 194 if (currentStage == Stage.JAILBREAK) { 195 info.addPara("Conduct jailbreak " + market.getOnOrAt() + " " + market.getName() + 196 " in the " + market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad); 197 return true; 198 } else if (currentStage == Stage.RETURN) { 199 info.addPara(getReturnTextShort(getPerson().getMarket().getName()), tc, pad); 200 return true; 201 } 202 return false; 203 } 204 205 @Override 206 public String getBaseName() { 207 return "Jailbreak";// - " + market.getName(); 208 } 209 210// public String getPostfixForState() { 211// String post = super.getPostfixForState(); 212// post = post.replaceFirst(" - ", ""); 213// if (!post.isEmpty()) post = " (" + post + ")"; 214// return post; 215// } 216} 217 218 219 220