001package com.fs.starfarer.api.impl.campaign.missions;
002
003import java.awt.Color;
004import java.util.ArrayList;
005import java.util.List;
006import java.util.Map;
007
008import org.lwjgl.util.vector.Vector2f;
009
010import com.fs.starfarer.api.Global;
011import com.fs.starfarer.api.campaign.CargoAPI;
012import com.fs.starfarer.api.campaign.InteractionDialogAPI;
013import com.fs.starfarer.api.campaign.econ.Industry;
014import com.fs.starfarer.api.campaign.econ.MarketAPI;
015import com.fs.starfarer.api.campaign.listeners.ColonyPlayerHostileActListener;
016import com.fs.starfarer.api.campaign.rules.MemoryAPI;
017import com.fs.starfarer.api.characters.PersonAPI;
018import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
019import com.fs.starfarer.api.impl.campaign.ids.Ranks;
020import com.fs.starfarer.api.impl.campaign.ids.Tags;
021import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
022import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.TempData;
023import com.fs.starfarer.api.ui.TooltipMakerAPI;
024import com.fs.starfarer.api.util.Misc;
025
026public class TacticallyBombardColony extends HubMissionWithBarEvent implements ColonyPlayerHostileActListener {
027
028        public static float PROB_PATROL_ENCOUNTER_AFTER = 0.5f;
029        public static float MISSION_DAYS = 120f;
030        
031        public static enum Stage {
032                BOMBARD,
033                COMPLETED,
034                FAILED,
035                FAILED_NO_PENALTY,
036        }
037        
038        
039        
040        protected void createBarGiver(MarketAPI createdAt) {
041                List<String> posts = new ArrayList<String>();
042                posts.add(Ranks.POST_AGENT);
043                if (createdAt.getSize() >= 6) {
044                        posts.add(Ranks.POST_ADMINISTRATOR);
045                }
046                if (Misc.isMilitary(createdAt)) {
047                        posts.add(Ranks.POST_BASE_COMMANDER);
048                }
049                if (Misc.hasOrbitalStation(createdAt)) {
050                        posts.add(Ranks.POST_STATION_COMMANDER);
051                }
052                String post = pickOne(posts);
053                if (post == null) return;
054                
055                // rank used only when it's an agent, since the other posts mean the person already exists
056                // and doesn't need to be created
057                setGiverRank(pickOne(Ranks.GROUND_CAPTAIN, Ranks.GROUND_COLONEL, Ranks.GROUND_MAJOR,
058                                         Ranks.SPACE_COMMANDER, Ranks.SPACE_CAPTAIN, Ranks.SPACE_ADMIRAL));
059                setGiverTags(Tags.CONTACT_MILITARY);
060                setGiverPost(post);
061                setGiverImportance(pickHighImportance());
062                findOrCreateGiver(createdAt, false, false);
063        }
064        
065        
066        protected MarketAPI market;
067        
068        @Override
069        protected boolean create(MarketAPI createdAt, boolean barEvent) {
070                //genRandom = Misc.random;
071                
072                if (barEvent) {
073                        createBarGiver(createdAt);
074                }
075                
076                if (!Misc.isMilitary(createdAt)) return false;
077                
078                PersonAPI person = getPerson();
079                if (person == null) return false;
080                
081                if (!setPersonMissionRef(person, "$tabo_ref")) {
082                        return false;
083                }
084                
085                if (barEvent) {
086                        setGiverIsPotentialContactOnSuccess();
087                }
088                
089                requireMarketIsNot(createdAt);
090                requireMarketFactionNotPlayer();
091                requireMarketFactionHostileTo(createdAt.getFactionId());
092                requireMarketTacticallyBombardable();
093                requireMarketNotHidden();
094                requireMarketNotInHyperspace();
095                
096                float q = getQuality();
097                if (q <= 0) {
098                        preferMarketSizeAtMost(4);
099                } else if (q <= 0.25) {
100                        preferMarketSizeAtMost(5);
101                } else if (q <= 0.5) {
102                        preferMarketSizeAtMost(6);
103                } else if (q <= 0.75) {
104                        preferMarketSizeAtMost(7);
105                }
106                
107                market = pickMarket();
108                if (market == null) return false;
109                
110                if (!setMarketMissionRef(market, "$tabo_ref")) {
111                        return false;
112                }
113                makeImportant(market, "$tabo_target", Stage.BOMBARD);
114                
115                setStartingStage(Stage.BOMBARD);
116                setSuccessStage(Stage.COMPLETED);
117                setFailureStage(Stage.FAILED);
118                
119                setStageOnMemoryFlag(Stage.COMPLETED, market, "$tabo_completed");
120                setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
121                
122                addNoPenaltyFailureStages(Stage.FAILED_NO_PENALTY);
123                connectWithMarketDecivilized(Stage.BOMBARD, Stage.FAILED_NO_PENALTY, market);
124                setStageOnMarketDecivilized(Stage.FAILED_NO_PENALTY, createdAt);
125                connectWithHostilitiesEnded(Stage.BOMBARD, Stage.FAILED_NO_PENALTY, person, market);
126                setStageOnHostilitiesEnded(Stage.FAILED_NO_PENALTY, person, market);
127                
128                //setCreditReward(80000, 100000);
129                setCreditReward(CreditReward.VERY_HIGH, market.getSize());
130                
131                if (market.getSize() <= 4) {
132                        triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
133                        triggerCreateSmallPatrolAroundMarket(market, Stage.BOMBARD, 0f);
134                } else if (market.getSize() <= 6) {
135                        triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
136                        triggerCreateMediumPatrolAroundMarket(market, Stage.BOMBARD, 0f);
137                        triggerCreateSmallPatrolAroundMarket(market, Stage.BOMBARD, 0f);
138                } else {
139                        triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
140                        triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f);
141                        triggerCreateMediumPatrolAroundMarket(market, Stage.BOMBARD, 0f);
142                        triggerCreateSmallPatrolAroundMarket(market, Stage.BOMBARD, 0f);
143                }
144                
145                return true;
146        }
147        
148        protected void updateInteractionDataImpl() {
149                set("$tabo_barEvent", isBarEvent());
150                set("$tabo_manOrWoman", getPerson().getManOrWoman());
151                set("$tabo_reward", Misc.getWithDGS(getCreditsReward()));
152                
153                set("$tabo_personName", getPerson().getNameString());
154                set("$tabo_systemName", market.getStarSystem().getNameWithLowercaseTypeShort());
155                set("$tabo_marketName", market.getName());
156                set("$tabo_marketOnOrAt", market.getOnOrAt());
157                set("$tabo_dist", getDistanceLY(market));
158                
159                int fuel = getBombardmentFuel(market);
160                set("$tabo_fuel", Misc.getWithDGS(fuel));
161        }
162        
163        @Override
164        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
165                float opad = 10f;
166                Color h = Misc.getHighlightColor();
167                if (currentStage == Stage.BOMBARD) {
168                        addStandardMarketDesc("Perform a tactical bombardment of", market, info, opad);
169                        addBombardmentInfo(market, info, opad);
170                }
171        }
172
173        @Override
174        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
175                Color h = Misc.getHighlightColor();
176                if (currentStage == Stage.BOMBARD) {
177                        info.addPara("Tactically bombard " + market.getName() + 
178                                        " in the " + market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad);                  
179                        return true;
180                }
181                return false;
182        }       
183        
184        @Override
185        public String getBaseName() {
186                return "Bombard " + market.getName();
187        }
188        
189        
190        @Override
191        public void acceptImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
192                super.acceptImpl(dialog, memoryMap);
193                Global.getSector().getListenerManager().addListener(this);
194        }
195
196        @Override
197        protected void notifyEnding() {
198                super.notifyEnding();
199                Global.getSector().getListenerManager().removeListener(this);
200        }
201
202        public void reportRaidToDisruptFinished(InteractionDialogAPI dialog,
203                                                        MarketAPI market, TempData actionData, Industry industry) {
204                // TODO Auto-generated method stub
205        }
206        
207        
208        
209        public void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog, 
210                                                                MarketAPI market, TempData actionData,
211                                                                CargoAPI cargo) {
212                // TODO Auto-generated method stub
213        }
214
215
216        public void reportSaturationBombardmentFinished(
217                        InteractionDialogAPI dialog, MarketAPI market, TempData actionData) {
218                // TODO Auto-generated method stub
219                
220        }
221
222        public void reportTacticalBombardmentFinished(InteractionDialogAPI dialog,
223                        MarketAPI market, TempData actionData) {
224                if (this.market == market) {
225                        if (!isEnded() || isEnding()) {
226                                if (rollProbability(PROB_PATROL_ENCOUNTER_AFTER)) {
227                                        DelayedFleetEncounter e = new DelayedFleetEncounter(genRandom, getMissionId());
228                                        e.setDelayMedium();
229                                        e.setLocationCoreOnly(true, market.getFactionId());
230                                        e.beginCreate();
231                                        e.triggerCreateFleet(FleetSize.VERY_LARGE, FleetQuality.HIGHER, market.getFactionId(), FleetTypes.PATROL_LARGE, new Vector2f());
232                                        e.triggerSetFleetOfficers(OfficerNum.MORE, OfficerQuality.HIGHER);
233                                        e.triggerSetAdjustStrengthBasedOnQuality(true, getQuality());
234                                        e.triggerSetPatrol();
235                                        e.triggerSetStandardAggroInterceptFlags();
236                                        e.triggerSetFleetMemoryValue("$tabo_marketName", market.getName());
237                                        e.triggerSetFleetGenericHailPermanent("TABOPatrolHail");
238                                        e.endCreate();
239                                }
240                        }
241                        
242                        Global.getSector().getListenerManager().removeListener(this);
243                        // need to set non-zero expiration since bombardment code advances the market with 0/very small elapsed time
244                        // a few times, so if set to 0 the value would be removed from memory
245                        market.getMemoryWithoutUpdate().set("$tabo_bombardedColony", true, 1f);
246                }               
247        }
248        
249}
250
251
252
253
254