001package com.fs.starfarer.api.impl.campaign.missions;
002
003import java.awt.Color;
004
005import com.fs.starfarer.api.campaign.SectorEntityToken;
006import com.fs.starfarer.api.campaign.econ.MarketAPI;
007import com.fs.starfarer.api.characters.PersonAPI;
008import com.fs.starfarer.api.impl.campaign.ids.Factions;
009import com.fs.starfarer.api.impl.campaign.ids.Ranks;
010import com.fs.starfarer.api.impl.campaign.ids.Tags;
011import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
012import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
013import com.fs.starfarer.api.ui.TooltipMakerAPI;
014import com.fs.starfarer.api.util.Misc;
015
016public class SpySatDeployment extends HubMissionWithBarEvent {
017
018        public static float PROB_BAR_UNDERWORLD = 0.25f;
019        public static float PROB_PATROL_AROUND_TARGET = 0.5f;
020        
021        public static float MISSION_DAYS = 120f;
022        
023        public static enum Stage {
024                DEPLOY,
025                COMPLETED,
026                FAILED,
027        }
028        
029        protected MarketAPI market;
030        protected SectorEntityToken target;
031        
032        @Override
033        protected boolean create(MarketAPI createdAt, boolean barEvent) {
034                //genRandom = Misc.random;
035                
036                //if (Factions.PIRATES.equals(createdAt.getFaction().getId())) return false;
037                
038                if (barEvent) {
039                        if (rollProbability(PROB_BAR_UNDERWORLD)) {
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                        } else {                                
047                                setGiverRank(Ranks.CITIZEN);
048                                setGiverPost(Ranks.POST_AGENT);
049                                setGiverImportance(pickImportance());
050                                if (Factions.PIRATES.equals(createdAt.getFaction().getId())) {
051                                        setGiverTags(Tags.CONTACT_UNDERWORLD);
052                                        setGiverFaction(Factions.PIRATES);
053                                } else {
054                                        setGiverTags(Tags.CONTACT_MILITARY);
055                                }
056                        }
057                        findOrCreateGiver(createdAt, false, false);
058                }
059                
060                PersonAPI person = getPerson();
061                if (person == null) return false;
062                
063                
064                if (!setPersonMissionRef(person, "$ssat_ref")) {
065                        return false;
066                }
067                
068                if (barEvent) {
069                        setGiverIsPotentialContactOnSuccess();
070                }
071                
072                requireMarketIsNot(createdAt);
073                requireMarketLocationNot(createdAt.getContainingLocation());
074                requireMarketFactionNotPlayer();
075                requireMarketFactionNot(person.getFaction().getId());
076                requireMarketFactionCustom(ReqMode.NOT_ANY, Factions.CUSTOM_ALLOWS_TRANSPONDER_OFF_TRADE);
077                requireMarketMilitary();
078                requireMarketNotHidden();
079                requireMarketNotInHyperspace();
080                preferMarketInDirectionOfOtherMissions();
081                market = pickMarket();
082                
083                if (market == null) return false;
084                
085                target = spawnMissionNode(
086                                        new LocData(EntityLocationType.ORBITING_PARAM, market.getPrimaryEntity(), market.getStarSystem()));
087                if (!setEntityMissionRef(target, "$ssat_ref")) return false;
088                
089                makeImportant(target, "$ssat_target", Stage.DEPLOY);
090                setMapMarkerNameColor(market.getTextColorForFactionOrPlanet());
091                
092                setStartingStage(Stage.DEPLOY);
093                setSuccessStage(Stage.COMPLETED);
094                setFailureStage(Stage.FAILED);
095                
096                setStageOnMemoryFlag(Stage.COMPLETED, target, "$ssat_completed");
097                setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
098                
099//              int sizeModifier = market.getSize() * 10000;
100//              setCreditReward(10000 + sizeModifier, 30000 + sizeModifier);
101                setCreditReward(CreditReward.AVERAGE, market.getSize());
102                
103                if (rollProbability(PROB_PATROL_AROUND_TARGET)) {
104                        triggerCreateMediumPatrolAroundMarket(market, Stage.DEPLOY, 1f);
105                }
106                
107                return true;
108        }
109        
110        protected void updateInteractionDataImpl() {
111                set("$ssat_barEvent", isBarEvent());
112                set("$ssat_underworld", getPerson().hasTag(Tags.CONTACT_UNDERWORLD));
113                set("$ssat_manOrWoman", getPerson().getManOrWoman());
114                set("$ssat_reward", Misc.getWithDGS(getCreditsReward()));
115                
116                set("$ssat_personName", getPerson().getNameString());
117                set("$ssat_systemName", market.getStarSystem().getNameWithLowercaseTypeShort());
118                set("$ssat_marketName", market.getName());
119                set("$ssat_marketOnOrAt", market.getOnOrAt());
120                set("$ssat_dist", getDistanceLY(market));
121        }
122        
123        @Override
124        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
125                float opad = 10f;
126                Color h = Misc.getHighlightColor();
127                if (currentStage == Stage.DEPLOY) {
128                        info.addPara("Deploy a spysat in orbit of " + market.getName() + 
129                                        " in the " + market.getStarSystem().getNameWithLowercaseTypeShort() + ".", opad);
130                }
131        }
132
133        @Override
134        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
135                Color h = Misc.getHighlightColor();
136                if (currentStage == Stage.DEPLOY) {
137                        info.addPara("Deploy spysat near " +
138                                        market.getName() + " in the " + 
139                                        market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad);
140                        return true;
141                }
142                return false;
143        }       
144        
145        @Override
146        public String getBaseName() {
147                return "SpySat Deployment";
148        }
149        
150}
151