001package com.fs.starfarer.api.impl.campaign.missions.academy;
002
003import java.awt.Color;
004
005import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
006import com.fs.starfarer.api.campaign.SectorEntityToken;
007import com.fs.starfarer.api.campaign.StarSystemAPI;
008import com.fs.starfarer.api.campaign.econ.MarketAPI;
009import com.fs.starfarer.api.impl.campaign.ids.Factions;
010import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
011import com.fs.starfarer.api.impl.campaign.ids.Tags;
012import com.fs.starfarer.api.impl.campaign.ids.Terrain;
013import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
014import com.fs.starfarer.api.ui.TooltipMakerAPI;
015import com.fs.starfarer.api.util.Misc;
016
017public class GACelestialObject extends GABaseMission {
018
019        public static float MISSION_DAYS = 120f;
020        public static float PROB_HOLOARTS = 0.33f;
021        public static float PROB_PATHERS = 0.5f;
022        public static float PROB_SLIPUP = 0.33f;
023        
024        public static float PROB_PULSAR = 0.33f;
025        public static float PROB_BLACK_HOLE = 0.5f;
026        
027        public static float PROB_NOT_ASTEROIDS = 0.5f;
028        
029        
030        public static enum Stage {
031                GO_TO_OBJECT,
032                COMPLETED,
033                FAILED,
034        }
035        
036        public static enum Variation {
037                BASIC,
038                PULSAR,
039                BLACK_HOLE,
040        }
041        
042        protected StarSystemAPI system;
043        protected Variation variation;
044        protected CampaignTerrainAPI object;
045        protected boolean holoarts = false;
046        protected boolean slipUp = false;
047        protected int patherTithe = 0;
048        
049        @Override
050        protected boolean create(MarketAPI createdAt, boolean barEvent) {
051                // if this mission type was already accepted by the player, abort
052                if (!setGlobalReference("$gaCO_ref")) {
053                        return false;
054                }
055                
056                pickDepartmentAllTags(GADepartments.SCIENCE, GADepartments.WEIRD);
057                if (rollProbability(PROB_HOLOARTS)) {
058                        department = "Holoart Studies";
059                        holoarts = true;
060                }
061
062                requireSystemTags(ReqMode.NOT_ANY, Tags.THEME_UNSAFE, Tags.THEME_CORE);
063                requireTerrainType(ReqMode.ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD, Terrain.DEBRIS_FIELD, 
064                                                   Terrain.MAGNETIC_FIELD, Terrain.NEBULA, Terrain.RING);
065                if (rollProbability(PROB_NOT_ASTEROIDS)) {
066                        preferTerrainType(ReqMode.NOT_ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD);
067                }
068
069                if (!holoarts) {
070                        if (rollProbability(PROB_PULSAR)) {
071                                preferSystemHasPulsar();
072                        } else if (rollProbability(PROB_BLACK_HOLE)) {
073                                preferSystemBlackHole();
074                        }
075                } else {
076                        preferSystemNotPulsar();
077                        preferSystemNotBlackHole();
078                }
079                
080                // important to put these last - requirements that come earlier have higher priority
081                //preferTerrainHasSpecialName();
082                preferSystemUnexplored();
083                preferTerrainInDirectionOfOtherMissions();
084                
085                object = pickTerrain();
086                
087                if (object == null) {
088                        return false;
089                }
090                
091                system = object.getStarSystem();
092                
093                setStartingStage(Stage.GO_TO_OBJECT);
094                addSuccessStages(Stage.COMPLETED);
095                addFailureStages(Stage.FAILED);
096                
097                //makeImportant(object, "$gaCO_object", Stage.GO_TO_OBJECT);
098                SectorEntityToken node = spawnMissionNode(new LocData(object));
099                makeImportant(node, "$gaCO_object", Stage.GO_TO_OBJECT);
100                
101                
102                setStageOnGlobalFlag(Stage.COMPLETED, "$gaCO_scanCompleted");
103                setStageOnGlobalFlag(Stage.FAILED, "$gaCO_gaveScannerToPathers");
104                
105                if (WITH_TIME_LIMIT) {
106                        setTimeLimit(Stage.FAILED, MISSION_DAYS, system);
107                }
108                //setCreditReward(30000, 40000);
109                setCreditReward(CreditReward.AVERAGE);
110                setDefaultGARepRewards();
111                
112                if (system.hasPulsar()) {
113                        variation = Variation.PULSAR;
114                } else if (system.hasBlackHole()) {
115                        variation = Variation.BLACK_HOLE;
116                } else {
117                        variation = Variation.BASIC;
118                }
119                
120                slipUp = rollProbability(PROB_SLIPUP);
121
122                if (rollProbability(PROB_PATHERS)) {
123                        patherTithe = genRoundNumber(10000, 15000);
124                        
125                        beginWithinHyperspaceRangeTrigger(object, 1f, false, Stage.GO_TO_OBJECT);
126                        triggerCreateFleet(FleetSize.LARGE, FleetQuality.HIGHER, Factions.LUDDIC_PATH, FleetTypes.PATROL_MEDIUM, object);
127                        triggerFleetPatherNoDefaultTithe();
128                        triggerAutoAdjustFleetStrengthModerate();
129                        triggerMakeAllFleetFlagsPermanent();
130                        triggerSetStandardAggroPirateFlags();
131                        triggerPickLocationAroundEntity(node, 1000f);
132                        triggerSpawnFleetAtPickedLocation("$gaCO_patherPermanentFlag", null);
133                        triggerFleetAllowLongPursuit();
134                        triggerOrderFleetPatrol(node);
135                        // so that the tithe value is available if the interaction with the fleet is after the mission ends
136                        triggerSetFleetMemoryValue("$gaCO_patherTithe", Misc.getWithDGS(patherTithe));
137                        triggerFleetMakeImportant("$gaCO_patherMissionInProgress", Stage.GO_TO_OBJECT);
138                        endTrigger();
139                        
140                }
141                
142                setMapMarkerNameColorBasedOnStar(system);
143                
144                
145                return true;
146        }
147        
148        protected void updateInteractionDataImpl() {
149                set("$gaCO_department", department);
150                set("$gaCO_holoarts", holoarts);
151                set("$gaCO_slipUp", slipUp);
152                set("$gaCO_objectAOrAn", getTerrainNameAOrAn(object));
153                set("$gaCO_celestialObjectNameWithTypeShort", getObjectNameWithTypeShort());
154                set("$gaCO_celestialObjectNameWithTypeLong", getObjectNameWithTypeLong());
155                set("$gaCO_celestialObjectName", getTerrainName(object));
156                set("$gaCO_celestialObjectType", getTerrainType(object));
157                set("$gaCO_starName", system.getNameWithNoType());
158                set("$gaCO_systemName", system.getNameWithLowercaseTypeShort());
159                set("$gaCO_dist", getDistanceLY(object));
160                set("$gaCO_reward", Misc.getWithDGS(getCreditsReward()));
161                set("$gaCO_variation", variation);
162        }
163        
164        @Override
165        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
166                float opad = 10f;
167                Color h = Misc.getHighlightColor();
168                if (currentStage == Stage.GO_TO_OBJECT) {
169                        String extra = "";
170                        if (variation == Variation.BLACK_HOLE) extra = " Avoid the black hole located in-system.";
171                        else if (variation == Variation.PULSAR) extra = " Avoid the beam of the in-system pulsar.";
172                        info.addPara("Run a scan package on " + getObjectNameWithTypeShort() +
173                                                " located in the " + system.getNameWithLowercaseTypeShort() + "." + extra, opad);
174                }
175        }
176
177        @Override
178        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
179                Color h = Misc.getHighlightColor();
180                if (currentStage == Stage.GO_TO_OBJECT) {
181                        info.addPara("Scan " + getTerrainTypeAOrAn(object)  + " " + getTerrainType(object) +
182                                                 " in the " + system.getNameWithLowercaseTypeShort(), tc, pad);
183                        return true;
184                }
185                return false;
186        }
187        
188        protected String getObjectNameWithTypeLong() {
189                if (hasSpecialName(object)) {
190                        return getTerrainName(object) + " - that's " + getTerrainTypeAOrAn(object) + " " + getTerrainType(object);
191                } else {
192                        return getTerrainTypeAOrAn(object) + " " + getTerrainType(object);
193                }
194        }
195        protected String getObjectNameWithTypeShort() {
196                if (hasSpecialName(object)) {
197                        return getTerrainName(object) + ", " + getTerrainTypeAOrAn(object) + " " + getTerrainType(object);
198                } else {
199                        return getTerrainTypeAOrAn(object) + " " + getTerrainType(object);
200                }
201        }
202        
203        @Override
204        public String getBaseName() {
205                return "Scan Celestial Object";
206        }
207        
208}
209
210