001package com.fs.starfarer.api.impl.campaign.missions;
002
003import java.awt.Color;
004
005import org.lwjgl.util.vector.Vector2f;
006
007import com.fs.starfarer.api.campaign.SectorEntityToken;
008import com.fs.starfarer.api.campaign.StarSystemAPI;
009import com.fs.starfarer.api.campaign.econ.MarketAPI;
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.impl.campaign.ids.Ranks;
014import com.fs.starfarer.api.impl.campaign.ids.Tags;
015import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
016import com.fs.starfarer.api.ui.TooltipMakerAPI;
017import com.fs.starfarer.api.util.Misc;
018
019public class DeadDropMission extends HubMissionWithBarEvent {
020
021        public static float PROB_COMPLICATIONS = 0.5f;
022        public static float PROB_PATROL_AFTER = 0.5f;
023        public static float MISSION_DAYS = 120f;
024        
025        public static enum Stage {
026                DROP_OFF,
027                COMPLETED,
028                FAILED,
029        }
030        
031        protected String thing;
032        protected SectorEntityToken target;
033        protected StarSystemAPI system;
034        
035        @Override
036        protected boolean create(MarketAPI createdAt, boolean barEvent) {
037                //genRandom = Misc.random;
038                
039                if (barEvent) {
040                        setGiverRank(Ranks.CITIZEN);
041                        setGiverPost(pickOne(Ranks.POST_AGENT, Ranks.POST_SMUGGLER, Ranks.POST_GANGSTER, 
042                                                                 Ranks.POST_FENCE, Ranks.POST_CRIMINAL));
043                        setGiverImportance(pickImportance());
044                        setGiverFaction(Factions.PIRATES);
045                        setGiverTags(Tags.CONTACT_UNDERWORLD);
046                        findOrCreateGiver(createdAt, false, false);
047                }
048                
049                // I may have had a bit too much fun with this
050                thing = pickOne("an apparently inert data chip",
051                                                "a rad-shielded salvors' TriPad", 
052                                                "a cloudy, damaged data crystal",
053                                                "a small EM-shielded safe",
054                                                "a hardcopy book made of paper",
055                                                "a sewing kit with strangely curved needles",
056                                                "a single rose in a miniaturized stasis field",
057                                                "a small packet of seeds embossed with a Luddic sigil",
058                                                "an aged, twisted piece of wood",
059                                                "an irradiated bulkhead in a shielded crate",
060                                                "a black Volturnian lobster shell",
061                                                "a biosample in sealed cylinder",
062                                                "a peculiar vial of blood",
063                                                "a powdered substance in a triple-sealed container",
064                                                "a single vacuum-desiccated finger",
065                                                "a tiny unicorn pendant",
066                                                "a delicate crane made of folded paper", 
067                                                "a scratched golden ring",
068                                                "a gravimatic trap holding some kind of glowing mote",
069                                                "a battered Hegemony officer's pistol",
070                                                "a large brilliant-cut diamond",
071                                                "a captain's safe cut from its bulkhead",
072                                                "a glowing blue crystal in a sealed tube"
073                                                );
074                
075                PersonAPI person = getPerson();
076                if (person == null) return false;
077                
078                
079                if (!setPersonMissionRef(person, "$ddro_ref")) {
080                        return false;
081                }
082                
083                if (barEvent) {
084                        setGiverIsPotentialContactOnSuccess();
085                }
086                
087//              requireSystemTags(ReqMode.NOT_ANY, Tags.THEME_UNSAFE, Tags.THEME_CORE);
088//              preferSystemTags(ReqMode.ANY, Tags.THEME_INTERESTING, Tags.THEME_INTERESTING_MINOR);
089                requireSystemNot(createdAt.getStarSystem());
090                requireSystemInterestingAndNotUnsafeOrCore();
091                preferSystemInInnerSector();
092                preferSystemUnexplored();
093                preferSystemInDirectionOfOtherMissions();
094                
095                system = pickSystem();
096                if (system == null) return false;
097                
098                target = spawnMissionNode(new LocData(EntityLocationType.HIDDEN_NOT_NEAR_STAR, null, system));
099                if (!setEntityMissionRef(target, "$ddro_ref")) return false;
100                
101                makeImportant(target, "$ddro_target", Stage.DROP_OFF);
102                //setMapMarkerNameColor(Misc.getGrayColor());
103
104                setStartingStage(Stage.DROP_OFF);
105                setSuccessStage(Stage.COMPLETED);
106                setFailureStage(Stage.FAILED);
107                
108                setStageOnMemoryFlag(Stage.COMPLETED, target, "$ddro_completed");
109                setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
110                
111
112                setCreditReward(CreditReward.HIGH);
113                
114                if (rollProbability(PROB_COMPLICATIONS)) {
115                        triggerComplicationBegin(Stage.DROP_OFF, ComplicationSpawn.APPROACHING_OR_ENTERING,
116                                        system, Factions.PIRATES,
117                                        "the " + getWithoutArticle(thing), "it",
118                                        "the " + getWithoutArticle(thing) + " given to you by " + person.getNameString(),
119                                        0,
120                                        true, ComplicationRepImpact.NONE, null);
121                        triggerComplicationEnd(true);
122                }
123                
124                return true;
125        }
126        
127        @Override
128        protected void notifyEnding() {
129                super.notifyEnding();
130                
131                if (isSucceeded() && rollProbability(PROB_PATROL_AFTER)) {
132                        PersonAPI person = getPerson();
133                        if (person == null || person.getMarket() == null) return;
134                        String patrolFaction = person.getMarket().getFactionId();
135                        if (patrolFaction.equals(person.getFaction().getId()) || 
136                                        Misc.isPirateFaction(person.getMarket().getFaction()) ||
137                                        Factions.PLAYER.equals(patrolFaction)) {
138                                return;
139                        }
140                        
141                        DelayedFleetEncounter e = new DelayedFleetEncounter(genRandom, getMissionId());
142                        e.setDelayNone();
143                        e.setLocationInnerSector(true, patrolFaction);
144                        e.beginCreate();
145                        e.triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, patrolFaction, FleetTypes.PATROL_LARGE, new Vector2f());
146                        e.setFleetWantsThing(patrolFaction, 
147                                        "the dead drop coordinates", "they",
148                                        "the dead drop coordinates given to you by " + person.getNameString(),
149                                        0,
150                                        true, ComplicationRepImpact.LOW,
151                                        DelayedFleetEncounter.TRIGGER_REP_LOSS_MEDIUM, getPerson());
152                        e.triggerSetAdjustStrengthBasedOnQuality(true, getQuality());
153                        e.triggerMakeLowRepImpact();
154                        e.triggerSetPatrol();
155                        e.triggerSetStandardAggroInterceptFlags();
156                        e.endCreate();
157                }
158        }
159
160
161
162        protected void updateInteractionDataImpl() {
163                set("$ddro_barEvent", isBarEvent());
164                set("$ddro_manOrWoman", getPerson().getManOrWoman());
165                set("$ddro_heOrShe", getPerson().getHeOrShe());
166                set("$ddro_reward", Misc.getWithDGS(getCreditsReward()));
167                
168                set("$ddro_aOrAnThing", thing);
169                set("$ddro_thing", getWithoutArticle(thing));
170                
171                set("$ddro_personName", getPerson().getNameString());
172                set("$ddro_systemName", system.getNameWithLowercaseTypeShort());
173                set("$ddro_dist", getDistanceLY(target));
174        }
175        
176        @Override
177        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
178                float opad = 10f;
179                Color h = Misc.getHighlightColor();
180                if (currentStage == Stage.DROP_OFF) {
181                        info.addPara("Deliver " + thing + " to the dead drop location at the " +
182                                        "specified coordinates in the " + system.getNameWithLowercaseTypeShort() + ".", opad);
183                }
184        }
185
186        @Override
187        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
188                Color h = Misc.getHighlightColor();
189                if (currentStage == Stage.DROP_OFF) {
190                        info.addPara("Deliver " + getWithoutArticle(thing) + " to specified location in the " +  
191                                        system.getNameWithLowercaseTypeShort(), tc, pad);
192                        return true;
193                }
194                return false;
195        }       
196        
197        @Override
198        public String getBaseName() {
199                return "Dead Drop";
200        }
201        
202}
203
204
205
206
207
208