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.CampaignTerrainAPI;
008import com.fs.starfarer.api.campaign.InteractionDialogAPI;
009import com.fs.starfarer.api.campaign.SectorEntityToken;
010import com.fs.starfarer.api.campaign.StarSystemAPI;
011import com.fs.starfarer.api.campaign.econ.MarketAPI;
012import com.fs.starfarer.api.campaign.rules.MemoryAPI;
013import com.fs.starfarer.api.impl.campaign.ids.Entities;
014import com.fs.starfarer.api.impl.campaign.ids.Factions;
015import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
016import com.fs.starfarer.api.impl.campaign.ids.Tags;
017import com.fs.starfarer.api.impl.campaign.ids.Terrain;
018import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
019import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.BreadcrumbSpecial;
020import com.fs.starfarer.api.ui.TooltipMakerAPI;
021import com.fs.starfarer.api.util.Misc;
022import com.fs.starfarer.api.util.Misc.Token;
023
024public class GAProbePackage extends GABaseMission {
025
026        public static float MISSION_DAYS = 120f;
027        public static float PROB_PATHERS = 0.5f;
028        public static float PROB_NOT_ASTEROIDS = 0.5f;
029        
030        public static float PROB_IT_BLEW_UP = 0.33f;
031        public static float PROB_MISSING = 0.5f;
032        public static float PROB_SCAVENGER = 0.5f;
033        
034        
035        public static enum Stage {
036                GO_TO_PROBE,
037                FIND_SCAVENGER,
038                RETURN_TO_ACADEMY,
039                COMPLETED,
040                FAILED,
041        }
042        
043        public static enum Variation {
044                BASIC,
045                SCAVENGER,
046                IT_BLEW_UP,
047                PACKAGE_MISSING,
048        }
049        
050        protected StarSystemAPI system;
051        protected Variation variation;
052        protected CampaignTerrainAPI object;
053        protected SectorEntityToken probe;
054        protected int hazardPay;
055        
056        @Override
057        protected boolean create(MarketAPI createdAt, boolean barEvent) {
058                // if this mission type was already accepted by the player, abort
059                if (!setGlobalReference("$gaProbe_ref")) {
060                        return false;
061                }
062
063                //genRandom = Misc.random;
064
065                pickDepartmentAllTags(GADepartments.SCIENCE, GADepartments.WEIRD);
066
067                requireSystemTags(ReqMode.NOT_ANY, Tags.THEME_UNSAFE, Tags.THEME_CORE);
068                requireTerrainType(ReqMode.ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD, 
069                                                   Terrain.MAGNETIC_FIELD, Terrain.NEBULA, Terrain.RING);
070                if (rollProbability(PROB_NOT_ASTEROIDS)) {
071                        preferTerrainType(ReqMode.NOT_ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD);
072                }
073
074                // important to put these last - requirements that come earlier have higher priority
075                preferSystemNotPulsar();
076                preferSystemNotBlackHole();
077                preferSystemUnexplored();
078                preferTerrainInDirectionOfOtherMissions();
079
080                //setGenRandom(new Random(99923667662341234L));
081                object = pickTerrain();
082
083                if (object == null) {
084                        return false;
085                }
086
087                system = object.getStarSystem();
088
089                //              PROB_IT_BLEW_UP = 1f;
090                //              PROB_PATHERS = 1f;
091
092                if (rollProbability(PROB_IT_BLEW_UP)) {
093                        variation = Variation.IT_BLEW_UP;
094                } else if (rollProbability(PROB_MISSING)) {
095                        variation = Variation.PACKAGE_MISSING;
096                } else if (rollProbability(PROB_SCAVENGER)) {
097                        variation = Variation.SCAVENGER;
098                } else {
099                        variation = Variation.BASIC;
100                }
101                //variation = Variation.SCAVENGER;
102                //variation = Variation.BASIC;
103                //variation = Variation.IT_BLEW_UP;
104                //variation = Variation.PACKAGE_MISSING;
105
106                setStartingStage(Stage.GO_TO_PROBE);
107                addSuccessStages(Stage.COMPLETED);
108                addFailureStages(Stage.FAILED);
109
110                probe = spawnEntity(Entities.GENERIC_PROBE, new LocData(object));
111                if (probe == null) return false;
112
113                probe.setId("gaProbe_probe");
114                makeImportant(probe, "$gaProbe_probe", Stage.GO_TO_PROBE);
115                makeImportant(getPerson(), "$gaProbe_returnHere", Stage.RETURN_TO_ACADEMY);
116
117                connectWithGlobalFlag(Stage.GO_TO_PROBE, Stage.FIND_SCAVENGER, "$gaProbe_scavengerTookIt");
118                setStageOnGlobalFlag(Stage.RETURN_TO_ACADEMY, "$gaProbe_canReturn");
119                connectWithGlobalFlag(Stage.RETURN_TO_ACADEMY, Stage.COMPLETED, "$gaProbe_finished");
120
121                if (WITH_TIME_LIMIT) {
122                        setTimeLimit(Stage.FAILED, MISSION_DAYS, system, Stage.RETURN_TO_ACADEMY);
123                }
124                //setCreditReward(30000, 40000);
125                setCreditReward(CreditReward.AVERAGE);
126                setDefaultGARepRewards();
127                if (variation == Variation.IT_BLEW_UP) {
128                        hazardPay = getCreditsReward() / 2;
129                        spawnDebrisField(DEBRIS_SMALL, DEBRIS_DENSE, new LocData(probe, false));
130                        spawnShipGraveyard(Factions.LUDDIC_PATH, 3, 5, new LocData(probe, false));
131
132                        if (rollProbability(PROB_PATHERS)) {
133                                beginWithinHyperspaceRangeTrigger(object, 1f, false, Stage.GO_TO_PROBE);
134                                triggerCreateFleet(FleetSize.TINY, FleetQuality.VERY_LOW, Factions.LUDDIC_PATH, FleetTypes.PATROL_SMALL, object);
135                                triggerSetFleetSizeFraction(0.03f);
136                                triggerMakeNonHostile();
137                                triggerMakeLowRepImpact();
138                                triggerFleetNoJump();
139                                triggerFleetPatherNoDefaultTithe();
140                                triggerSetFleetMissionRef("$gaProbe_ref");
141                                triggerFleetSetPatrolActionText("waiting"); // a bit dark, maybe?
142                                triggerOrderFleetPatrol(probe);
143                                triggerOrderFleetInterceptPlayer();
144                                triggerPickLocationAroundEntity(probe, 1000f);
145                                triggerSpawnFleetAtPickedLocation("$gaProbe_patherPermanentFlag", null);
146                                triggerFleetMakeImportant("$gaProbe_patherMissionInProgress", Stage.GO_TO_PROBE);
147                                endTrigger();
148                        }
149                }
150
151                if (variation == Variation.SCAVENGER) {
152                        beginWithinHyperspaceRangeTrigger(object, 1f, false, Stage.GO_TO_PROBE);
153                        triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.LOWER, Factions.SCAVENGERS, FleetTypes.SCAVENGER_MEDIUM, system);
154                        triggerAutoAdjustFleetStrengthMajor();
155                        triggerSetFleetFaction(Factions.INDEPENDENT);
156
157                        triggerMakeLowRepImpact();
158                        triggerFleetSetAvoidPlayerSlowly();
159                        triggerMakeFleetIgnoredByOtherFleets();
160
161                        triggerPickLocationAtClosestToEntityJumpPoint(system, probe);
162                        triggerSetEntityToPickedJumpPoint();
163                        triggerPickLocationAroundEntity(5000);
164
165                        // so the flag is there prior to the FIND_SCAVENGER stage
166                        triggerSpawnFleetAtPickedLocation("$gaProbe_scavenger", null);
167
168                        triggerFleetSetTravelActionText("exploring system");
169                        triggerFleetSetPatrolActionText("preparing to leave system");
170                        triggerOrderFleetPatrolEntity(false);
171
172                        triggerFleetMakeImportant("$gaProbe_scavenger", Stage.FIND_SCAVENGER);
173                        triggerFleetAddDefeatTrigger("gaProbeScavengerDefeated");
174                        endTrigger();
175                }
176
177                setMapMarkerNameColorBasedOnStar(system);
178
179                return true;
180        }
181        
182        @Override
183        protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
184                if (action.equals("updateReward")) {
185                        setCreditReward(getCreditsReward() + hazardPay);
186                        return true;
187                }
188                return false;
189        }
190
191
192        protected void updateInteractionDataImpl() {
193                set("$gaProbe_department", department);
194                if (getCurrentStage() != null) {
195                        set("$gaProbe_stage", ((Enum)getCurrentStage()).name());
196                }
197                set("$gaProbe_celestialObjectNameWithType", getObjectNameWithType());
198                set("$gaProbe_starName", system.getNameWithNoType());
199                set("$gaProbe_systemName", system.getNameWithLowercaseTypeShort());
200                set("$gaProbe_dist", getDistanceLY(object));
201                set("$gaProbe_reward", Misc.getWithDGS(getCreditsReward()));
202                set("$gaProbe_hazardPay", Misc.getWithDGS(hazardPay));
203                set("$gaProbe_variation", variation);
204        }
205        
206        @Override
207        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
208                float opad = 10f;
209                Color h = Misc.getHighlightColor();
210                if (currentStage == Stage.GO_TO_PROBE) {
211                        if (probe != null) {
212                                String loc = BreadcrumbSpecial.getLocatedString(probe, true);
213                                info.addPara("Recover an instrument package from a probe " + loc + ".", opad);
214                        } else {
215                                info.addPara("Recover an instrument package from a probe in the " +
216                                                system.getNameWithLowercaseTypeShort() + ".", opad);
217                        }
218                } else if (currentStage == Stage.FIND_SCAVENGER) {
219                        info.addPara("Go to the nearest jump-point and retrieve the instrument package " + 
220                                        " from scavengers before they leave the system.", opad);
221                } else if (currentStage == Stage.RETURN_TO_ACADEMY) {
222                        info.addPara("Return the instrument package to the Galatia Academy and talk to " + 
223                                        getPerson().getNameString() + " to receive your reward.", opad);
224                }
225        }
226
227        @Override
228        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
229                Color h = Misc.getHighlightColor();
230                if (currentStage == Stage.GO_TO_PROBE) {
231                        if (system.isCurrentLocation()) {
232                                info.addPara("Recover the instrument package from the probe", tc, pad);
233                        } else {
234                                info.addPara(getGoToSystemTextShort(system), tc, pad);
235                        }
236                        return true;
237                } else if (currentStage == Stage.FIND_SCAVENGER) {
238                        info.addPara("Recover the instrument package from scavengers at one of the jump-points",
239                                        tc, pad);
240                } else if (currentStage == Stage.RETURN_TO_ACADEMY) {
241                        info.addPara("Return to the Galatia Academy and talk to " + getPerson().getNameString(), tc, pad);
242                        return true;
243                }
244                return false;
245        }
246        
247        
248        protected String getObjectNameWithType() {
249                if (hasSpecialName(object)) {
250                        return getTerrainTypeAOrAn(object) + " " + getTerrainType(object) + " called " + getTerrainName(object);
251                } else {
252                        return getTerrainTypeAOrAn(object) + " " + getTerrainType(object);
253                }
254        }
255        
256        @Override
257        public String getBaseName() {
258                return "Recover Instrument Package";
259        }
260        
261}
262
263