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.Factions; 015import com.fs.starfarer.api.impl.campaign.ids.People; 016import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithSearch; 017import com.fs.starfarer.api.impl.campaign.rulecmd.KantaCMD; 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 AFavorForKanta extends HubMissionWithSearch implements ColonyPlayerHostileActListener { 023 024 public static float MISSION_DAYS = 365f; 025 026 public static enum Stage { 027 BOMBARD, 028 COMPLETED, 029 FAILED, 030 FAILED_NO_PENALTY, 031 } 032 033 protected MarketAPI market; 034 035 @Override 036 protected boolean create(MarketAPI createdAt, boolean barEvent) { 037 //genRandom = Misc.random; 038 039 PersonAPI person = People.getPerson(People.KANTA); 040 if (person == null) return false; 041 042 MarketAPI kantasDen = person.getMarket(); 043 044 setPersonOverride(person); 045 046 setStoryMission(); 047 setNoAbandon(); 048 049 if (!setGlobalReference("$affk_ref", "$affk_inProgress")) { 050 return false; 051 } 052 053 String commission = Misc.getCommissionFactionId(); 054 055 if (kantasDen != null) { 056 requireMarketIsNot(kantasDen); 057 } 058 requireMarketFactionNotPlayer(); 059 requireMarketFactionNot(Factions.PIRATES); 060 requireMarketIsMilitary(); 061 requireMarketTacticallyBombardable(); 062 requireMarketNotHidden(); 063 requireMarketNotInHyperspace(); 064 065 if (commission != null) { 066 preferMarketFactionNot(commission); 067 } 068 preferMarketFactionNotHostileTo(Factions.PLAYER); 069 070 market = pickMarket(); 071 if (market == null) return false; 072 073 makeImportant(market, "$affk_target", Stage.BOMBARD); 074 075 setStartingStage(Stage.BOMBARD); 076 setSuccessStage(Stage.COMPLETED); 077 setFailureStage(Stage.FAILED); 078 079 setStageOnMemoryFlag(Stage.COMPLETED, market, "$affk_completed"); 080 setTimeLimit(Stage.FAILED, MISSION_DAYS, null); 081 //setTimeLimit(Stage.FAILED, 0.5f, null); 082 083 // handled in endFailure calling KantaCMD.loseProtection() 084 setRepPenaltyFaction(0f); 085 setRepPenaltyPerson(0f); 086 087 addNoPenaltyFailureStages(Stage.FAILED_NO_PENALTY); 088 connectWithMarketDecivilized(Stage.BOMBARD, Stage.FAILED_NO_PENALTY, market); 089 setStageOnMarketDecivilized(Stage.FAILED_NO_PENALTY, market); 090 091 092 triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f); 093 triggerCreateLargePatrolAroundMarket(market, Stage.BOMBARD, 0f); 094 triggerCreateMediumPatrolAroundMarket(market, Stage.BOMBARD, 0f); 095 triggerCreateSmallPatrolAroundMarket(market, Stage.BOMBARD, 0f); 096 097 return true; 098 } 099 100 @Override 101 protected void endAbandonImpl() { 102 super.endAbandonImpl(); 103 endFailureImpl(null, null); 104 } 105 106 @Override 107 protected void endFailureImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) { 108 if (currentStage == Stage.FAILED) { 109 KantaCMD.loseProtection(dialog); 110 } 111 } 112 113 114 115 protected void updateInteractionDataImpl() { 116 set("$affk_systemName", market.getStarSystem().getNameWithLowercaseTypeShort()); 117 set("$affk_marketName", market.getName()); 118 set("$affk_marketOnOrAt", market.getOnOrAt()); 119 } 120 121 @Override 122 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 123 float opad = 10f; 124 Color h = Misc.getHighlightColor(); 125 if (currentStage == Stage.BOMBARD) { 126 addStandardMarketDesc("Perform a tactical bombardment of", market, info, opad); 127 addBombardmentInfo(market, info, opad); 128 } else if (currentStage == Stage.FAILED) { 129 //info.addPara("Kanta's Protection lost", Misc.getNegativeHighlightColor(), opad); 130 info.addPara("Kanta's Protection lost", opad); 131 } 132 } 133 134 @Override 135 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 136 Color h = Misc.getHighlightColor(); 137 if (currentStage == Stage.BOMBARD) { 138 info.addPara("Tactically bombard " + market.getName() + 139 " in the " + market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad); 140 return true; 141 } 142// else if (currentStage == Stage.FAILED) { 143// //info.addPara("Kanta's Protection lost", Misc.getNegativeHighlightColor(), opad); 144// info.addPara("You have failed this mission and lost Kanta's protection.", pad); 145// return true; 146// } else if (currentStage == Stage.FAILED_NO_PENALTY) { 147// info.addPara("You have failed this mission through no fault of your own, and retain Kanta's protection.", pad); 148// return true; 149// } 150 return false; 151 } 152 153 protected String getMissionTypeNoun() { 154 return "task"; 155 } 156 157 @Override 158 public String getBaseName() { 159 //return "Bombard " + market.getName(); 160 return "A Favor for Kanta"; 161 } 162 163 164 @Override 165 public void acceptImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) { 166 super.acceptImpl(dialog, memoryMap); 167 Global.getSector().getListenerManager().addListener(this); 168 } 169 170 @Override 171 protected void notifyEnding() { 172 super.notifyEnding(); 173 Global.getSector().getListenerManager().removeListener(this); 174 } 175 176 public void reportRaidToDisruptFinished(InteractionDialogAPI dialog, 177 MarketAPI market, TempData actionData, Industry industry) { 178 // TODO Auto-generated method stub 179 } 180 181 182 183 public void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog, 184 MarketAPI market, TempData actionData, 185 CargoAPI cargo) { 186 // TODO Auto-generated method stub 187 } 188 189 190 public void reportSaturationBombardmentFinished( 191 InteractionDialogAPI dialog, MarketAPI market, TempData actionData) { 192 // TODO Auto-generated method stub 193 194 } 195 196 public void reportTacticalBombardmentFinished(InteractionDialogAPI dialog, 197 MarketAPI market, TempData actionData) { 198 if (this.market == market) { 199 Global.getSector().getListenerManager().removeListener(this); 200 // need to set non-zero expiration since bombardment code advances the market with 0/very small elapsed time 201 // a few times, so if set to 0 the value would be removed from memory 202 market.getMemoryWithoutUpdate().set("$affk_bombardedColony", true, 1f); 203 } 204 } 205 206} 207 208 209 210 211