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