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}