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