001package com.fs.starfarer.api.impl.campaign.missions;
002
003import java.awt.Color;
004import java.util.Map;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.CargoAPI;
008import com.fs.starfarer.api.campaign.InteractionDialogAPI;
009import com.fs.starfarer.api.campaign.econ.Industry;
010import com.fs.starfarer.api.campaign.econ.MarketAPI;
011import com.fs.starfarer.api.campaign.listeners.ColonyPlayerHostileActListener;
012import com.fs.starfarer.api.campaign.rules.MemoryAPI;
013import com.fs.starfarer.api.characters.PersonAPI;
014import com.fs.starfarer.api.impl.campaign.ids.Industries;
015import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
016import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
017import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD;
018import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.TempData;
019import com.fs.starfarer.api.ui.TooltipMakerAPI;
020import com.fs.starfarer.api.util.Misc;
021
022public class BaseDisruptIndustry extends HubMissionWithBarEvent implements ColonyPlayerHostileActListener {
023
024        public static float MISSION_DAYS = 240f;
025        
026        public static enum Stage {
027                DISRUPT,
028                COMPLETED,
029                FAILED,
030                FAILED_NO_PENALTY,
031        }
032        
033        protected MarketAPI market;
034        protected Industry industry;
035        protected int disruptDays;
036        
037        protected void createBarGiver(MarketAPI createdAt) {
038        }
039        
040        protected String [] getTargetIndustries() {
041                return new String[] {Industries.HEAVYINDUSTRY, Industries.ORBITALWORKS};
042        }
043        
044        protected CreditReward getRewardTier() {
045                return CreditReward.HIGH;
046        }
047        
048        protected boolean requireFactionHostile() {
049                return true;
050        }
051        
052        protected void setMarketSearchParameters(MarketAPI createdAt, String [] industries) {
053                requireMarketIsNot(createdAt);
054                requireMarketLocationNot(createdAt.getContainingLocation());
055                requireMarketFactionNotPlayer();
056                if (requireFactionHostile()) {
057                        requireMarketFactionHostileTo(createdAt.getFactionId());
058                }
059                requireMarketNotHidden();
060                requireMarketIndustries(ReqMode.ANY, industries);
061                requireMarketNotInHyperspace();
062                
063                float q = getQuality();
064                if (q <= 0) {
065                        preferMarketSizeAtMost(4);
066                } else if (q <= 0.25) {
067                        preferMarketSizeAtMost(5);
068                } else if (q <= 0.5) {
069                        preferMarketSizeAtMost(6);
070                } else if (q <= 0.75) {
071                        preferMarketSizeAtMost(7);
072                }
073        }
074        
075        protected void addExtraTriggers(MarketAPI createdAt) {
076                
077        }
078        
079        protected boolean availableAtMarket(MarketAPI createdAt) {
080                return true;
081        }
082        
083        @Override
084        protected boolean create(MarketAPI createdAt, boolean barEvent) {
085                //genRandom = Misc.random;
086                
087                //if (Factions.PIRATES.equals(createdAt.getFaction().getId())) return false;
088                
089                if (!availableAtMarket(createdAt)) {
090                        return false;
091                }
092                
093                if (barEvent) {
094                        createBarGiver(createdAt);
095                }
096                
097                PersonAPI person = getPerson();
098                if (person == null) return false;
099                
100                String id = getMissionId();
101                if (!setPersonMissionRef(person, "$" + id + "_ref")) {
102                        return false;
103                }
104                
105                if (barEvent) {
106                        setGiverIsPotentialContactOnSuccess();
107                }
108                
109                String [] industries = getTargetIndustries();
110                
111                setMarketSearchParameters(createdAt, industries);
112                
113                market = pickMarket();
114                if (market == null) return false;
115                
116                for (String indId : industries) {
117                        industry = market.getIndustry(indId);
118                        if (industry != null) {
119                                break;
120                        }
121                }
122                if (industry == null) return false;
123                
124                disruptDays = MarketCMD.getDisruptDaysPerToken(market, industry) * 3;
125                
126                if (!setMarketMissionRef(market, "$" + id + "_ref")) {
127                        return false;
128                }
129                
130                int marines = getMarinesRequiredToDisrupt(market, industry, disruptDays);
131                if (!isOkToOfferMissionRequiringMarines(marines)) {
132                        return false;
133                }
134                
135                makeImportant(market, "$" + id + "_target", Stage.DISRUPT);
136                
137                setStartingStage(Stage.DISRUPT);
138                setSuccessStage(Stage.COMPLETED);
139                setFailureStage(Stage.FAILED);
140                
141                setStageOnMemoryFlag(Stage.COMPLETED, market, "$" + id + "_completed");
142                setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
143                
144                addNoPenaltyFailureStages(Stage.FAILED_NO_PENALTY);
145                connectWithMarketDecivilized(Stage.DISRUPT, Stage.FAILED_NO_PENALTY, market);
146                setStageOnMarketDecivilized(Stage.FAILED_NO_PENALTY, createdAt);
147                if (requireFactionHostile()) {
148                        connectWithHostilitiesEnded(Stage.DISRUPT, Stage.FAILED_NO_PENALTY, person, market);
149                        setStageOnHostilitiesEnded(Stage.FAILED_NO_PENALTY, person, market);
150                }
151                
152                //setCreditReward(80000, 100000);
153                //setCreditReward(getRewardTier(), market.getSize());
154                
155                int bonus = getRewardBonusForMarines(getMarinesRequiredToDisrupt(market, industry, disruptDays));
156                setCreditRewardWithBonus(getRewardTier(), bonus);
157                
158                addExtraTriggers(createdAt);
159
160                return true;
161        }
162        
163        protected void updateInteractionDataImpl() {
164                String id = getMissionId();
165                set("$" + id + "_barEvent", isBarEvent());
166                set("$" + id + "_manOrWoman", getPerson().getManOrWoman());
167                set("$" + id + "_hisOrHer", getPerson().getHisOrHer());
168                set("$" + id + "_heOrShe", getPerson().getHeOrShe());
169                set("$" + id + "_reward", Misc.getWithDGS(getCreditsReward()));
170                set("$" + id + "_industry", industry.getCurrentName());
171                set("$" + id + "_disruptDays", disruptDays);
172                set("$" + id + "_marines", Misc.getWithDGS(getMarinesRequiredToDisrupt(market, industry, disruptDays)));
173                
174                set("$" + id + "_personName", getPerson().getNameString());
175                set("$" + id + "_systemName", market.getStarSystem().getNameWithLowercaseTypeShort());
176                set("$" + id + "_marketName", market.getName());
177                set("$" + id + "_marketOnOrAt", market.getOnOrAt());
178                set("$" + id + "_dist", getDistanceLY(market));
179        }
180        
181        @Override
182        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
183                float opad = 10f;
184                Color h = Misc.getHighlightColor();
185                if (currentStage == Stage.DISRUPT) {
186//                      info.addPara("Disrupt " + industry.getCurrentName().toLowerCase() + " " + market.getOnOrAt() + " "+ market.getName() + 
187//                                      " in the " + market.getStarSystem().getNameWithLowercaseTypeShort() + ".", opad);
188                        
189                        addStandardMarketDesc("Disrupt " + industry.getCurrentName() + " " + market.getOnOrAt(), market, info, opad);
190                        //addStandardMarketDesc(market, info, opad);
191                        
192                        addDisruptRaidInfo(market, industry, disruptDays, info, opad);
193                }
194        }
195
196        @Override
197        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
198                Color h = Misc.getHighlightColor();
199                if (currentStage == Stage.DISRUPT) {
200                        info.addPara("Disrupt " + industry.getCurrentName().toLowerCase() + " " + market.getOnOrAt() + " "+ market.getName() + 
201                                        " in the " + market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad);                  
202                        return true;
203                }
204                return false;
205        }       
206        
207        @Override
208        public String getBaseName() {
209                return "Disrupt " + industry.getCurrentName();
210        }
211        
212        
213        @Override
214        public void acceptImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
215                super.acceptImpl(dialog, memoryMap);
216                Global.getSector().getListenerManager().addListener(this);
217        }
218
219        @Override
220        protected void notifyEnding() {
221                super.notifyEnding();
222                Global.getSector().getListenerManager().removeListener(this);
223        }
224
225        public void reportRaidToDisruptFinished(InteractionDialogAPI dialog,
226                                                        MarketAPI market, TempData actionData, Industry industry) {
227                if (this.industry == industry && industry.getDisruptedDays() >= disruptDays) {
228                        Global.getSector().getListenerManager().removeListener(this);
229                        String id = getMissionId();
230                        market.getMemoryWithoutUpdate().set("$" + id + "_raidedTargetIndustry", true, 0);
231                }
232        }
233        
234        
235        
236        public void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog, 
237                                                                MarketAPI market, TempData actionData,
238                                                                CargoAPI cargo) {
239                // TODO Auto-generated method stub
240        }
241
242
243        public void reportSaturationBombardmentFinished(
244                        InteractionDialogAPI dialog, MarketAPI market, TempData actionData) {
245                // TODO Auto-generated method stub
246                
247        }
248
249        public void reportTacticalBombardmentFinished(InteractionDialogAPI dialog,
250                        MarketAPI market, TempData actionData) {
251                // TODO Auto-generated method stub
252                
253        }
254        
255}
256
257
258