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.Factions;
015import com.fs.starfarer.api.impl.campaign.ids.People;
016import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithSearch;
017import com.fs.starfarer.api.impl.campaign.rulecmd.KantaCMD;
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 AFavorForKanta extends HubMissionWithSearch implements ColonyPlayerHostileActListener {
023
024        public static float MISSION_DAYS = 365f;
025        
026        public static enum Stage {
027                BOMBARD,
028                COMPLETED,
029                FAILED,
030                FAILED_NO_PENALTY,
031        }
032        
033        protected MarketAPI market;
034        
035        @Override
036        protected boolean create(MarketAPI createdAt, boolean barEvent) {
037                //genRandom = Misc.random;
038                
039                PersonAPI person = People.getPerson(People.KANTA);
040                if (person == null) return false;
041
042                MarketAPI kantasDen = person.getMarket();
043                
044                setPersonOverride(person);
045                
046                setStoryMission();
047                setNoAbandon();
048                
049                if (!setGlobalReference("$affk_ref", "$affk_inProgress")) {
050                        return false;
051                }
052                
053                String commission = Misc.getCommissionFactionId();
054
055                if (kantasDen != null) {
056                        requireMarketIsNot(kantasDen);
057                }
058                requireMarketFactionNotPlayer();
059                requireMarketFactionNot(Factions.PIRATES);
060                requireMarketIsMilitary();
061                requireMarketTacticallyBombardable();
062                requireMarketNotHidden();
063                requireMarketNotInHyperspace();
064                
065                if (commission != null) {
066                        preferMarketFactionNot(commission);
067                }
068                preferMarketFactionNotHostileTo(Factions.PLAYER);
069                
070                market = pickMarket();
071                if (market == null) return false;
072                
073                makeImportant(market, "$affk_target", Stage.BOMBARD);
074                
075                setStartingStage(Stage.BOMBARD);
076                setSuccessStage(Stage.COMPLETED);
077                setFailureStage(Stage.FAILED);
078                
079                setStageOnMemoryFlag(Stage.COMPLETED, market, "$affk_completed");
080                setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
081                //setTimeLimit(Stage.FAILED, 0.5f, null);
082                
083                // handled in endFailure calling KantaCMD.loseProtection()
084                setRepPenaltyFaction(0f);
085                setRepPenaltyPerson(0f);
086                
087                addNoPenaltyFailureStages(Stage.FAILED_NO_PENALTY);
088                connectWithMarketDecivilized(Stage.BOMBARD, Stage.FAILED_NO_PENALTY, market);
089                setStageOnMarketDecivilized(Stage.FAILED_NO_PENALTY, market);
090
091                
092                triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
093                triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
094                triggerCreateMediumPatrolAroundMarket(market, Stage.BOMBARD, 0f);
095                triggerCreateSmallPatrolAroundMarket(market, Stage.BOMBARD, 0f);
096                
097                return true;
098        }
099        
100        @Override
101        protected void endAbandonImpl() {
102                super.endAbandonImpl();
103                endFailureImpl(null, null);
104        }
105
106        @Override
107        protected void endFailureImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
108                if (currentStage == Stage.FAILED) {
109                        KantaCMD.loseProtection(dialog);
110                }
111        }
112        
113        
114        
115        protected void updateInteractionDataImpl() {
116                set("$affk_systemName", market.getStarSystem().getNameWithLowercaseTypeShort());
117                set("$affk_marketName", market.getName());
118                set("$affk_marketOnOrAt", market.getOnOrAt());
119        }
120        
121        @Override
122        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
123                float opad = 10f;
124                Color h = Misc.getHighlightColor();
125                if (currentStage == Stage.BOMBARD) {
126                        addStandardMarketDesc("Perform a tactical bombardment of", market, info, opad);
127                        addBombardmentInfo(market, info, opad);
128                } else if (currentStage == Stage.FAILED) {
129                        //info.addPara("Kanta's Protection lost", Misc.getNegativeHighlightColor(), opad);
130                        info.addPara("Kanta's Protection lost", opad);
131                }
132        }
133
134        @Override
135        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
136                Color h = Misc.getHighlightColor();
137                if (currentStage == Stage.BOMBARD) {
138                        info.addPara("Tactically bombard " + market.getName() + 
139                                        " in the " + market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad);                  
140                        return true;
141                }
142//              else if (currentStage == Stage.FAILED) {
143//                      //info.addPara("Kanta's Protection lost", Misc.getNegativeHighlightColor(), opad);
144//                      info.addPara("You have failed this mission and lost Kanta's protection.", pad);
145//                      return true;
146//              } else if (currentStage == Stage.FAILED_NO_PENALTY) {
147//                      info.addPara("You have failed this mission through no fault of your own, and retain Kanta's protection.", pad);
148//                      return true;
149//              }
150                return false;
151        }
152        
153        protected String getMissionTypeNoun() {
154                return "task";
155        }
156        
157        @Override
158        public String getBaseName() {
159                //return "Bombard " + market.getName();
160                return "A Favor for Kanta";
161        }
162        
163        
164        @Override
165        public void acceptImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
166                super.acceptImpl(dialog, memoryMap);
167                Global.getSector().getListenerManager().addListener(this);
168        }
169
170        @Override
171        protected void notifyEnding() {
172                super.notifyEnding();
173                Global.getSector().getListenerManager().removeListener(this);
174        }
175
176        public void reportRaidToDisruptFinished(InteractionDialogAPI dialog,
177                                                        MarketAPI market, TempData actionData, Industry industry) {
178                // TODO Auto-generated method stub
179        }
180        
181        
182        
183        public void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog, 
184                                                                MarketAPI market, TempData actionData,
185                                                                CargoAPI cargo) {
186                // TODO Auto-generated method stub
187        }
188
189
190        public void reportSaturationBombardmentFinished(
191                        InteractionDialogAPI dialog, MarketAPI market, TempData actionData) {
192                // TODO Auto-generated method stub
193                
194        }
195
196        public void reportTacticalBombardmentFinished(InteractionDialogAPI dialog,
197                        MarketAPI market, TempData actionData) {
198                if (this.market == market) {
199                        Global.getSector().getListenerManager().removeListener(this);
200                        // need to set non-zero expiration since bombardment code advances the market with 0/very small elapsed time
201                        // a few times, so if set to 0 the value would be removed from memory
202                        market.getMemoryWithoutUpdate().set("$affk_bombardedColony", true, 1f);
203                }               
204        }
205        
206}
207
208
209
210
211