001package com.fs.starfarer.api.impl.campaign.rulecmd;
002
003import java.util.List;
004import java.util.Map;
005
006import org.lwjgl.util.vector.Vector2f;
007
008import com.fs.starfarer.api.Global;
009import com.fs.starfarer.api.campaign.CampaignFleetAPI;
010import com.fs.starfarer.api.campaign.CargoAPI;
011import com.fs.starfarer.api.campaign.InteractionDialogAPI;
012import com.fs.starfarer.api.campaign.OptionPanelAPI;
013import com.fs.starfarer.api.campaign.PlanetAPI;
014import com.fs.starfarer.api.campaign.TextPanelAPI;
015import com.fs.starfarer.api.campaign.econ.MarketAPI;
016import com.fs.starfarer.api.campaign.econ.MarketAPI.SurveyLevel;
017import com.fs.starfarer.api.campaign.econ.MarketConditionAPI;
018import com.fs.starfarer.api.campaign.rules.MemKeys;
019import com.fs.starfarer.api.campaign.rules.MemoryAPI;
020import com.fs.starfarer.api.characters.PersonAPI;
021import com.fs.starfarer.api.combat.ShipVariantAPI;
022import com.fs.starfarer.api.fleet.FleetMemberAPI;
023import com.fs.starfarer.api.fleet.FleetMemberType;
024import com.fs.starfarer.api.impl.campaign.ids.Conditions;
025import com.fs.starfarer.api.impl.campaign.ids.Factions;
026import com.fs.starfarer.api.impl.campaign.ids.HullMods;
027import com.fs.starfarer.api.impl.campaign.ids.Industries;
028import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
029import com.fs.starfarer.api.impl.campaign.ids.People;
030import com.fs.starfarer.api.impl.campaign.ids.Ranks;
031import com.fs.starfarer.api.impl.campaign.ids.Submarkets;
032import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathBaseIntel;
033import com.fs.starfarer.api.impl.campaign.missions.RecoverAPlanetkiller;
034import com.fs.starfarer.api.impl.campaign.shared.SharedData;
035import com.fs.starfarer.api.util.Misc;
036import com.fs.starfarer.api.util.Misc.Token;
037
038/**
039 * For planetkiller ("PK") related tasks.
040 * 
041 *      PK_CMD <action> <parameters>
042 */
043public class PK_CMD extends BaseCommandPlugin {
044
045        public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
046                if (dialog == null) return false;
047                
048                OptionPanelAPI options = dialog.getOptionPanel();
049                TextPanelAPI text = dialog.getTextPanel();
050                CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
051                CargoAPI cargo = pf.getCargo();
052                
053                
054                String action = params.get(0).getString(memoryMap);
055                
056                MemoryAPI memory = memoryMap.get(MemKeys.LOCAL);
057                if (memory == null) return false; // should not be possible unless there are other big problems already
058                
059//              MarketAPI market = dialog.getInteractionTarget().getMarket();
060//              StarSystemAPI system = null;
061//              if (dialog.getInteractionTarget().getContainingLocation() instanceof StarSystemAPI) {
062//                      system = (StarSystemAPI) dialog.getInteractionTarget().getContainingLocation();
063//              }
064                                
065                if ("removePKDefenses".equals(action)) {
066                        return removePKDefenses(dialog, memory);
067                } else if ("convertSentinelToColony".equals(action)) {
068                        return convertSentinelToColony(text, cargo);
069                } else if ("rightPostToAcceptPK".equals(action)) {
070                        return rightPostToAcceptPK(dialog);
071                } else if ("rightPostToTellAboutSentinel".equals(action)) {
072                        return rightPostToTellAboutSentinel(dialog);
073                } else if ("giveExecutor".equals(action)) {
074                        giveExecutor(dialog, params, memoryMap);
075                }
076                
077                return false;
078        }
079
080
081        protected boolean convertSentinelToColony(TextPanelAPI text, CargoAPI cargo) {
082                //int crew = 100;
083                //cargo.removeCrew(crew);
084                //AddRemoveCommodity.addCommodityLossText(Commodities.CREW, crew, text);
085                // Crew removal handled in rules.
086                
087                PlanetAPI planet = RecoverAPlanetkiller.getTundra();
088                MarketAPI market = planet.getMarket();
089                
090                //market.addTag(Tags.MARKET_NO_OFFICER_SPAWN);
091
092                market.setSurveyLevel(SurveyLevel.FULL);
093                for (MarketConditionAPI mc : market.getConditions()) {
094                        mc.setSurveyed(true);
095                }
096                
097                market.setName(planet.getName());
098                planet.setFaction(Factions.HEGEMONY);
099                
100                market.setDaysInExistence(0);
101                market.setPlanetConditionMarketOnly(false);
102                market.setFactionId(Factions.HEGEMONY);
103                market.addCondition(Conditions.POPULATION_3);
104                market.addIndustry(Industries.POPULATION);
105                market.addIndustry(Industries.FARMING);
106                
107                market.setSize(3);
108                
109                market.addSubmarket(Submarkets.SUBMARKET_OPEN);
110                market.addSubmarket(Submarkets.SUBMARKET_BLACK);
111                market.addSubmarket(Submarkets.SUBMARKET_STORAGE);
112                //((StoragePlugin)market.getSubmarket(Submarkets.SUBMARKET_STORAGE).getPlugin()).setPlayerPaidToUnlock(true);
113                
114                market.getSubmarket(Submarkets.SUBMARKET_OPEN).getPlugin().updateCargoPrePlayerInteraction();
115                market.getSubmarket(Submarkets.SUBMARKET_OPEN).getPlugin().getCargo().clear();
116                if (market.getSubmarket(Submarkets.SUBMARKET_OPEN).getPlugin().getCargo().getMothballedShips() != null) {
117                        market.getSubmarket(Submarkets.SUBMARKET_OPEN).getPlugin().getCargo().getMothballedShips().clear();
118                }
119                market.getSubmarket(Submarkets.SUBMARKET_BLACK).getPlugin().updateCargoPrePlayerInteraction();
120                market.getSubmarket(Submarkets.SUBMARKET_BLACK).getPlugin().getCargo().clear();
121                if (market.getSubmarket(Submarkets.SUBMARKET_BLACK).getPlugin().getCargo().getMothballedShips() != null) {
122                        market.getSubmarket(Submarkets.SUBMARKET_BLACK).getPlugin().getCargo().getMothballedShips().clear();
123                }
124                
125                market.getTariff().modifyFlat("default_tariff", market.getFaction().getTariffFraction());
126                
127                planet.setMarket(market);
128                market.setPrimaryEntity(planet);
129                market.setPlayerOwned(false);
130                
131                Global.getSector().getEconomy().addMarket(market, false);
132                Global.getSector().getEconomy().tripleStep();
133                market.advance(0f);
134                market.getConstructionQueue().addToEnd(Industries.SPACEPORT, 0);
135                
136                //market.getConditions();
137                
138                SharedData.getData().getMarketsWithoutTradeFleetSpawn().add(market.getId());
139                
140                PersonAPI skiron = People.getPerson(People.SKIRON);
141                market.setAdmin(skiron);
142                market.getCommDirectory().addPerson(skiron, 0);
143                market.addPerson(skiron);
144                
145                market.getPrimaryEntity().setInteractionImage("illustrations", "sentinel2");
146
147                return true;
148        }
149
150
151
152        protected void giveExecutor(InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
153                boolean removeSpecial = params.get(1).getBoolean(memoryMap);
154                
155                ShipVariantAPI v = Global.getSettings().getVariant("executor_Hull").clone();
156                if (removeSpecial) {
157                        v.addSuppressedMod(HullMods.ANDRADA_MODS);
158                }
159                FleetMemberAPI member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, v);
160                Global.getSector().getPlayerFleet().getFleetData().addFleetMember(member);
161                AddShip.addShipGainText(member, dialog.getTextPanel());
162        }
163
164
165        protected boolean rightPostToAcceptPK(InteractionDialogAPI dialog) {
166                PersonAPI person = dialog.getInteractionTarget().getActivePerson();
167                if (person.getMemoryWithoutUpdate().getBoolean(LuddicPathBaseIntel.PATHER_BASE_COMMANDER)) {
168                        return true;
169                }
170                return Ranks.POST_BASE_COMMANDER.equals(person.getPostId()) ||
171                                   Ranks.POST_STATION_COMMANDER.equals(person.getPostId()) ||
172                                   //Ranks.POST_ADMINISTRATOR.equals(person.getPostId()) || // just military, no regular admins
173                                   Ranks.POST_OUTPOST_COMMANDER.equals(person.getPostId());
174        }
175        
176        protected boolean rightPostToTellAboutSentinel(InteractionDialogAPI dialog) {
177                PersonAPI person = dialog.getInteractionTarget().getActivePerson();
178                return Ranks.POST_BASE_COMMANDER.equals(person.getPostId()) ||
179                                Ranks.POST_STATION_COMMANDER.equals(person.getPostId()) ||
180                                Ranks.POST_ADMINISTRATOR.equals(person.getPostId()) ||
181                                Ranks.POST_OUTPOST_COMMANDER.equals(person.getPostId());
182        }
183        
184        protected boolean removePKDefenses(InteractionDialogAPI dialog, MemoryAPI memory) {
185                CampaignFleetAPI defenders = memory.getFleet("$defenderFleet");
186                if (defenders != null) {
187                        memory.unset("$defenderFleet");
188                        memory.set("$defenderFleetDefeated", true);
189                        memory.set("$hasDefenders", false, 0);
190                        dialog.getInteractionTarget().getContainingLocation().addEntity(defenders);
191                        defenders.setAI(null);
192                        defenders.setNullAIActionText("dormant");
193                        Vector2f loc = dialog.getInteractionTarget().getLocation();
194                        defenders.setLocation(loc.x, loc.y + 100f);
195                        defenders.setCircularOrbit(dialog.getInteractionTarget().getOrbitFocus(), 90f, 100f, 20f);
196                        defenders.getMemoryWithoutUpdate().set("$pkDefenderFleet", true);
197                        defenders.getMemoryWithoutUpdate().set(MemFlags.FLEET_IGNORED_BY_OTHER_FLEETS, true);
198                        //Misc.addDefeatTrigger(defenders, "PK14thDefeated"); // handled elsewhere so the trigger is set in all cases
199                        Misc.makeNoRepImpact(defenders, "pk");
200                }
201                return true;
202        }
203
204        
205        
206}