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.PersonImportance;
008import com.fs.starfarer.api.campaign.econ.MarketAPI;
009import com.fs.starfarer.api.characters.PersonAPI;
010import com.fs.starfarer.api.impl.campaign.ids.Factions;
011import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
012import com.fs.starfarer.api.impl.campaign.ids.Ranks;
013import com.fs.starfarer.api.impl.campaign.ids.Tags;
014import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
015import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidDangerLevel;
016import com.fs.starfarer.api.ui.TooltipMakerAPI;
017import com.fs.starfarer.api.util.Misc;
018
019public class DisruptCompetitorMission extends HubMissionWithBarEvent {
020
021        public static float PROB_COMPLICATIONS = 0.25f;
022        
023        public static float MISSION_DAYS = 120f;
024        
025        public static RaidDangerLevel RAID_DANGER = RaidDangerLevel.MEDIUM;
026        
027        public static enum Stage {
028                DISRUPT,
029                COMPLETED,
030                FAILED,
031        }
032        
033        protected MarketAPI market;
034        
035        @Override
036        protected boolean create(MarketAPI createdAt, boolean barEvent) {
037                //genRandom = Misc.random;
038                if (barEvent) {
039                        setGiverRank(Ranks.CITIZEN);
040                        String post = pickOne(Ranks.POST_TRADER, Ranks.POST_COMMODITIES_AGENT, 
041                                                                  Ranks.POST_MERCHANT, Ranks.POST_INVESTOR,
042                                                                  Ranks.POST_EXECUTIVE, Ranks.POST_SENIOR_EXECUTIVE, 
043                                                                  Ranks.POST_PORTMASTER);
044                        setGiverPost(post);
045                        if (post.equals(Ranks.POST_SENIOR_EXECUTIVE)) {
046                                setGiverImportance(pickHighImportance());
047                        } else {
048                                setGiverImportance(pickImportance());
049                        }
050                        setGiverTags(Tags.CONTACT_TRADE);
051                        findOrCreateGiver(createdAt, false, false);
052                }
053                
054                PersonAPI person = getPerson();
055                if (person == null) return false;
056                
057                
058                if (!setPersonMissionRef(person, "$dcom_ref")) {
059                        return false;
060                }
061                
062                if (barEvent) {
063                        setGiverIsPotentialContactOnSuccess();
064                }
065                
066                PersonImportance importance = person.getImportance();
067                int minMarketSize = 3;
068                int maxMarketSize = 9;
069                switch (importance) {
070                case VERY_LOW:
071                        minMarketSize = 3;
072                        maxMarketSize = 4;
073                        break;
074                case LOW:
075                        minMarketSize = 4;
076                        maxMarketSize = 4;
077                        break;
078                case MEDIUM:
079                        minMarketSize = 5;
080                        maxMarketSize = 5;
081                        break;
082                case HIGH:
083                        minMarketSize = 5;
084                        maxMarketSize = 6;
085                        break;
086                case VERY_HIGH:
087                        minMarketSize = 6;
088                        maxMarketSize = 8;
089                        break;
090                }
091                requireMarketIsNot(createdAt);
092                requireMarketNotHidden();
093                requireMarketFactionNotPlayer();
094                requireMarketNotInHyperspace();
095                preferMarketSizeAtLeast(minMarketSize);
096                preferMarketSizeAtMost(maxMarketSize);
097                market = pickMarket();
098                
099                if (market == null) return false;
100                if (!setMarketMissionRef(market, "$dcom_ref")) {
101                        return false;
102                }
103                
104                int marines = getMarinesRequiredForCustomObjective(market, RAID_DANGER);
105                if (!isOkToOfferMissionRequiringMarines(marines)) {
106                        return false;
107                }
108                
109                makeImportant(market, "$dcom_target", Stage.DISRUPT);
110                
111                setStartingStage(Stage.DISRUPT);
112                setSuccessStage(Stage.COMPLETED);
113                setFailureStage(Stage.FAILED);
114                
115                setStageOnMemoryFlag(Stage.COMPLETED, market, "$dcom_completed");
116                setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
117                
118                //int sizeModifier = market.getSize() * 10000;
119                //setCreditReward(10000 + sizeModifier, 30000 + sizeModifier);
120                //setCreditReward(CreditReward.AVERAGE, market.getSize());
121                
122                int bonus = getRewardBonusForMarines(getMarinesRequiredForCustomObjective(market, RAID_DANGER));
123                setCreditRewardWithBonus(CreditReward.AVERAGE, bonus);
124                
125                return true;
126        }
127        
128        
129        @Override
130        protected void notifyEnding() {
131                super.notifyEnding();
132                
133                if (isSucceeded() && (rollProbability(PROB_COMPLICATIONS))) {
134                        DelayedFleetEncounter e = new DelayedFleetEncounter(genRandom, getMissionId());
135                        //e.setDelay(0f);
136                        e.setDelayMedium();
137                        e.setLocationInnerSector(false, Factions.INDEPENDENT);
138                        //e.setEncounterInHyper();
139                        e.beginCreate();
140                        e.triggerCreateFleet(FleetSize.LARGE, FleetQuality.SMOD_1, Factions.MERCENARY, FleetTypes.PATROL_LARGE, new Vector2f());
141                        e.triggerSetFleetOfficers(OfficerNum.MORE, OfficerQuality.HIGHER);
142                        e.triggerFleetSetFaction(Factions.INDEPENDENT);
143                        e.triggerSetAdjustStrengthBasedOnQuality(true, getQuality());
144                        e.triggerSetStandardAggroNonPirateFlags();
145                        e.triggerSetStandardAggroInterceptFlags();
146                        e.triggerSetFleetMemoryValue("$dcom_marketName", market.getName());
147                        e.triggerSetFleetMemoryValue("$dcom_marketOnOrAt", market.getOnOrAt());
148                        e.triggerSetFleetGenericHailPermanent("DCOMMercHail");
149                        e.endCreate();
150                }
151        }
152
153
154
155        protected void updateInteractionDataImpl() {
156                set("$dcom_barEvent", isBarEvent());
157                set("$dcom_manOrWoman", getPerson().getManOrWoman());
158                set("$dcom_hisOrHer", getPerson().getHisOrHer());
159                set("$dcom_reward", Misc.getWithDGS(getCreditsReward()));
160                
161                set("$dcom_systemName", market.getStarSystem().getNameWithLowercaseTypeShort());
162                set("$dcom_marketName", market.getName());
163                set("$dcom_marketOnOrAt", market.getOnOrAt());
164                set("$dcom_dist", getDistanceLY(market));
165                set("$dcom_marketFactionArticle", market.getFaction().getPersonNamePrefixAOrAn());
166                set("$dcom_marketFaction", market.getFaction().getPersonNamePrefix());
167                set("$dcom_factionColor",  market.getFaction().getBaseUIColor());
168                set("$dcom_danger", RAID_DANGER);
169                
170                set("$dcom_marines", Misc.getWithDGS(getMarinesRequiredForCustomObjective(market, RAID_DANGER)));
171        }
172        
173        @Override
174        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
175                float opad = 10f;
176                Color h = Misc.getHighlightColor();
177                if (currentStage == Stage.DISRUPT) {
178                        info.addPara("Disrupt a competitor of " + getPerson().getNameString() + " by raiding their warehouse " +
179                                        market.getOnOrAt() + " " + market.getName() + 
180                                        " in the " + market.getStarSystem().getNameWithLowercaseTypeShort() + ".", opad);
181                        
182                        addCustomRaidInfo(market, RAID_DANGER, info, 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.DISRUPT) {
190                        info.addPara("Raid warehouse " +
191                                        market.getOnOrAt() + " " + market.getName() + " in the " + 
192                                        market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad);
193                        return true;
194                }
195                return false;
196        }       
197        
198        @Override
199        public String getBaseName() {
200                return "Disrupt Competitor";
201        }
202        
203}
204