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.Industries; 015import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent; 016import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode; 017import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD; 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 BaseDisruptIndustry extends HubMissionWithBarEvent implements ColonyPlayerHostileActListener { 023 024 public static float MISSION_DAYS = 240f; 025 026 public static enum Stage { 027 DISRUPT, 028 COMPLETED, 029 FAILED, 030 FAILED_NO_PENALTY, 031 } 032 033 protected MarketAPI market; 034 protected Industry industry; 035 protected int disruptDays; 036 037 protected void createBarGiver(MarketAPI createdAt) { 038 } 039 040 protected String [] getTargetIndustries() { 041 return new String[] {Industries.HEAVYINDUSTRY, Industries.ORBITALWORKS}; 042 } 043 044 protected CreditReward getRewardTier() { 045 return CreditReward.HIGH; 046 } 047 048 protected boolean requireFactionHostile() { 049 return true; 050 } 051 052 protected void setMarketSearchParameters(MarketAPI createdAt, String [] industries) { 053 requireMarketIsNot(createdAt); 054 requireMarketLocationNot(createdAt.getContainingLocation()); 055 requireMarketFactionNotPlayer(); 056 if (requireFactionHostile()) { 057 requireMarketFactionHostileTo(createdAt.getFactionId()); 058 } 059 requireMarketNotHidden(); 060 requireMarketIndustries(ReqMode.ANY, industries); 061 requireMarketNotInHyperspace(); 062 063 float q = getQuality(); 064 if (q <= 0) { 065 preferMarketSizeAtMost(4); 066 } else if (q <= 0.25) { 067 preferMarketSizeAtMost(5); 068 } else if (q <= 0.5) { 069 preferMarketSizeAtMost(6); 070 } else if (q <= 0.75) { 071 preferMarketSizeAtMost(7); 072 } 073 } 074 075 protected void addExtraTriggers(MarketAPI createdAt) { 076 077 } 078 079 protected boolean availableAtMarket(MarketAPI createdAt) { 080 return true; 081 } 082 083 @Override 084 protected boolean create(MarketAPI createdAt, boolean barEvent) { 085 //genRandom = Misc.random; 086 087 //if (Factions.PIRATES.equals(createdAt.getFaction().getId())) return false; 088 089 if (!availableAtMarket(createdAt)) { 090 return false; 091 } 092 093 if (barEvent) { 094 createBarGiver(createdAt); 095 } 096 097 PersonAPI person = getPerson(); 098 if (person == null) return false; 099 100 String id = getMissionId(); 101 if (!setPersonMissionRef(person, "$" + id + "_ref")) { 102 return false; 103 } 104 105 if (barEvent) { 106 setGiverIsPotentialContactOnSuccess(); 107 } 108 109 String [] industries = getTargetIndustries(); 110 111 setMarketSearchParameters(createdAt, industries); 112 113 market = pickMarket(); 114 if (market == null) return false; 115 116 for (String indId : industries) { 117 industry = market.getIndustry(indId); 118 if (industry != null) { 119 break; 120 } 121 } 122 if (industry == null) return false; 123 124 disruptDays = MarketCMD.getDisruptDaysPerToken(market, industry) * 3; 125 126 if (!setMarketMissionRef(market, "$" + id + "_ref")) { 127 return false; 128 } 129 130 int marines = getMarinesRequiredToDisrupt(market, industry, disruptDays); 131 if (!isOkToOfferMissionRequiringMarines(marines)) { 132 return false; 133 } 134 135 makeImportant(market, "$" + id + "_target", Stage.DISRUPT); 136 137 setStartingStage(Stage.DISRUPT); 138 setSuccessStage(Stage.COMPLETED); 139 setFailureStage(Stage.FAILED); 140 141 setStageOnMemoryFlag(Stage.COMPLETED, market, "$" + id + "_completed"); 142 setTimeLimit(Stage.FAILED, MISSION_DAYS, null); 143 144 addNoPenaltyFailureStages(Stage.FAILED_NO_PENALTY); 145 connectWithMarketDecivilized(Stage.DISRUPT, Stage.FAILED_NO_PENALTY, market); 146 setStageOnMarketDecivilized(Stage.FAILED_NO_PENALTY, createdAt); 147 if (requireFactionHostile()) { 148 connectWithHostilitiesEnded(Stage.DISRUPT, Stage.FAILED_NO_PENALTY, person, market); 149 setStageOnHostilitiesEnded(Stage.FAILED_NO_PENALTY, person, market); 150 } 151 152 //setCreditReward(80000, 100000); 153 //setCreditReward(getRewardTier(), market.getSize()); 154 155 int bonus = getRewardBonusForMarines(getMarinesRequiredToDisrupt(market, industry, disruptDays)); 156 setCreditRewardWithBonus(getRewardTier(), bonus); 157 158 addExtraTriggers(createdAt); 159 160 return true; 161 } 162 163 protected void updateInteractionDataImpl() { 164 String id = getMissionId(); 165 set("$" + id + "_barEvent", isBarEvent()); 166 set("$" + id + "_manOrWoman", getPerson().getManOrWoman()); 167 set("$" + id + "_hisOrHer", getPerson().getHisOrHer()); 168 set("$" + id + "_heOrShe", getPerson().getHeOrShe()); 169 set("$" + id + "_reward", Misc.getWithDGS(getCreditsReward())); 170 set("$" + id + "_industry", industry.getCurrentName()); 171 set("$" + id + "_disruptDays", disruptDays); 172 set("$" + id + "_marines", Misc.getWithDGS(getMarinesRequiredToDisrupt(market, industry, disruptDays))); 173 174 set("$" + id + "_personName", getPerson().getNameString()); 175 set("$" + id + "_systemName", market.getStarSystem().getNameWithLowercaseTypeShort()); 176 set("$" + id + "_marketName", market.getName()); 177 set("$" + id + "_marketOnOrAt", market.getOnOrAt()); 178 set("$" + id + "_dist", getDistanceLY(market)); 179 } 180 181 @Override 182 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 183 float opad = 10f; 184 Color h = Misc.getHighlightColor(); 185 if (currentStage == Stage.DISRUPT) { 186// info.addPara("Disrupt " + industry.getCurrentName().toLowerCase() + " " + market.getOnOrAt() + " "+ market.getName() + 187// " in the " + market.getStarSystem().getNameWithLowercaseTypeShort() + ".", opad); 188 189 addStandardMarketDesc("Disrupt " + industry.getCurrentName() + " " + market.getOnOrAt(), market, info, opad); 190 //addStandardMarketDesc(market, info, opad); 191 192 addDisruptRaidInfo(market, industry, disruptDays, info, opad); 193 } 194 } 195 196 @Override 197 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 198 Color h = Misc.getHighlightColor(); 199 if (currentStage == Stage.DISRUPT) { 200 info.addPara("Disrupt " + industry.getCurrentName().toLowerCase() + " " + market.getOnOrAt() + " "+ market.getName() + 201 " in the " + market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad); 202 return true; 203 } 204 return false; 205 } 206 207 @Override 208 public String getBaseName() { 209 return "Disrupt " + industry.getCurrentName(); 210 } 211 212 213 @Override 214 public void acceptImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) { 215 super.acceptImpl(dialog, memoryMap); 216 Global.getSector().getListenerManager().addListener(this); 217 } 218 219 @Override 220 protected void notifyEnding() { 221 super.notifyEnding(); 222 Global.getSector().getListenerManager().removeListener(this); 223 } 224 225 public void reportRaidToDisruptFinished(InteractionDialogAPI dialog, 226 MarketAPI market, TempData actionData, Industry industry) { 227 if (this.industry == industry && industry.getDisruptedDays() >= disruptDays) { 228 Global.getSector().getListenerManager().removeListener(this); 229 String id = getMissionId(); 230 market.getMemoryWithoutUpdate().set("$" + id + "_raidedTargetIndustry", true, 0); 231 } 232 } 233 234 235 236 public void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog, 237 MarketAPI market, TempData actionData, 238 CargoAPI cargo) { 239 // TODO Auto-generated method stub 240 } 241 242 243 public void reportSaturationBombardmentFinished( 244 InteractionDialogAPI dialog, MarketAPI market, TempData actionData) { 245 // TODO Auto-generated method stub 246 247 } 248 249 public void reportTacticalBombardmentFinished(InteractionDialogAPI dialog, 250 MarketAPI market, TempData actionData) { 251 // TODO Auto-generated method stub 252 253 } 254 255} 256 257 258