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