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