001package com.fs.starfarer.api.impl.campaign.missions; 002 003import java.awt.Color; 004 005import org.lwjgl.util.vector.Vector2f; 006 007import com.fs.starfarer.api.campaign.PersonImportance; 008import com.fs.starfarer.api.campaign.econ.MarketAPI; 009import com.fs.starfarer.api.characters.PersonAPI; 010import com.fs.starfarer.api.impl.campaign.ids.Factions; 011import com.fs.starfarer.api.impl.campaign.ids.FleetTypes; 012import com.fs.starfarer.api.impl.campaign.ids.Ranks; 013import com.fs.starfarer.api.impl.campaign.ids.Tags; 014import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent; 015import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidDangerLevel; 016import com.fs.starfarer.api.ui.TooltipMakerAPI; 017import com.fs.starfarer.api.util.Misc; 018 019public class DisruptCompetitorMission extends HubMissionWithBarEvent { 020 021 public static float PROB_COMPLICATIONS = 0.25f; 022 023 public static float MISSION_DAYS = 120f; 024 025 public static RaidDangerLevel RAID_DANGER = RaidDangerLevel.MEDIUM; 026 027 public static enum Stage { 028 DISRUPT, 029 COMPLETED, 030 FAILED, 031 } 032 033 protected MarketAPI market; 034 035 @Override 036 protected boolean create(MarketAPI createdAt, boolean barEvent) { 037 //genRandom = Misc.random; 038 if (barEvent) { 039 setGiverRank(Ranks.CITIZEN); 040 String post = pickOne(Ranks.POST_TRADER, Ranks.POST_COMMODITIES_AGENT, 041 Ranks.POST_MERCHANT, Ranks.POST_INVESTOR, 042 Ranks.POST_EXECUTIVE, Ranks.POST_SENIOR_EXECUTIVE, 043 Ranks.POST_PORTMASTER); 044 setGiverPost(post); 045 if (post.equals(Ranks.POST_SENIOR_EXECUTIVE)) { 046 setGiverImportance(pickHighImportance()); 047 } else { 048 setGiverImportance(pickImportance()); 049 } 050 setGiverTags(Tags.CONTACT_TRADE); 051 findOrCreateGiver(createdAt, false, false); 052 } 053 054 PersonAPI person = getPerson(); 055 if (person == null) return false; 056 057 058 if (!setPersonMissionRef(person, "$dcom_ref")) { 059 return false; 060 } 061 062 if (barEvent) { 063 setGiverIsPotentialContactOnSuccess(); 064 } 065 066 PersonImportance importance = person.getImportance(); 067 int minMarketSize = 3; 068 int maxMarketSize = 9; 069 switch (importance) { 070 case VERY_LOW: 071 minMarketSize = 3; 072 maxMarketSize = 4; 073 break; 074 case LOW: 075 minMarketSize = 4; 076 maxMarketSize = 4; 077 break; 078 case MEDIUM: 079 minMarketSize = 5; 080 maxMarketSize = 5; 081 break; 082 case HIGH: 083 minMarketSize = 5; 084 maxMarketSize = 6; 085 break; 086 case VERY_HIGH: 087 minMarketSize = 6; 088 maxMarketSize = 8; 089 break; 090 } 091 requireMarketIsNot(createdAt); 092 requireMarketNotHidden(); 093 requireMarketFactionNotPlayer(); 094 requireMarketNotInHyperspace(); 095 preferMarketSizeAtLeast(minMarketSize); 096 preferMarketSizeAtMost(maxMarketSize); 097 market = pickMarket(); 098 099 if (market == null) return false; 100 if (!setMarketMissionRef(market, "$dcom_ref")) { 101 return false; 102 } 103 104 int marines = getMarinesRequiredForCustomObjective(market, RAID_DANGER); 105 if (!isOkToOfferMissionRequiringMarines(marines)) { 106 return false; 107 } 108 109 makeImportant(market, "$dcom_target", Stage.DISRUPT); 110 111 setStartingStage(Stage.DISRUPT); 112 setSuccessStage(Stage.COMPLETED); 113 setFailureStage(Stage.FAILED); 114 115 setStageOnMemoryFlag(Stage.COMPLETED, market, "$dcom_completed"); 116 setTimeLimit(Stage.FAILED, MISSION_DAYS, null); 117 118 //int sizeModifier = market.getSize() * 10000; 119 //setCreditReward(10000 + sizeModifier, 30000 + sizeModifier); 120 //setCreditReward(CreditReward.AVERAGE, market.getSize()); 121 122 int bonus = getRewardBonusForMarines(getMarinesRequiredForCustomObjective(market, RAID_DANGER)); 123 setCreditRewardWithBonus(CreditReward.AVERAGE, bonus); 124 125 return true; 126 } 127 128 129 @Override 130 protected void notifyEnding() { 131 super.notifyEnding(); 132 133 if (isSucceeded() && (rollProbability(PROB_COMPLICATIONS))) { 134 DelayedFleetEncounter e = new DelayedFleetEncounter(genRandom, getMissionId()); 135 //e.setDelay(0f); 136 e.setDelayMedium(); 137 e.setLocationInnerSector(false, Factions.INDEPENDENT); 138 //e.setEncounterInHyper(); 139 e.beginCreate(); 140 e.triggerCreateFleet(FleetSize.LARGE, FleetQuality.SMOD_1, Factions.MERCENARY, FleetTypes.PATROL_LARGE, new Vector2f()); 141 e.triggerSetFleetOfficers(OfficerNum.MORE, OfficerQuality.HIGHER); 142 e.triggerFleetSetFaction(Factions.INDEPENDENT); 143 e.triggerSetAdjustStrengthBasedOnQuality(true, getQuality()); 144 e.triggerSetStandardAggroNonPirateFlags(); 145 e.triggerSetStandardAggroInterceptFlags(); 146 e.triggerSetFleetMemoryValue("$dcom_marketName", market.getName()); 147 e.triggerSetFleetMemoryValue("$dcom_marketOnOrAt", market.getOnOrAt()); 148 e.triggerSetFleetGenericHailPermanent("DCOMMercHail"); 149 e.endCreate(); 150 } 151 } 152 153 154 155 protected void updateInteractionDataImpl() { 156 set("$dcom_barEvent", isBarEvent()); 157 set("$dcom_manOrWoman", getPerson().getManOrWoman()); 158 set("$dcom_hisOrHer", getPerson().getHisOrHer()); 159 set("$dcom_reward", Misc.getWithDGS(getCreditsReward())); 160 161 set("$dcom_systemName", market.getStarSystem().getNameWithLowercaseTypeShort()); 162 set("$dcom_marketName", market.getName()); 163 set("$dcom_marketOnOrAt", market.getOnOrAt()); 164 set("$dcom_dist", getDistanceLY(market)); 165 set("$dcom_marketFactionArticle", market.getFaction().getPersonNamePrefixAOrAn()); 166 set("$dcom_marketFaction", market.getFaction().getPersonNamePrefix()); 167 set("$dcom_factionColor", market.getFaction().getBaseUIColor()); 168 set("$dcom_danger", RAID_DANGER); 169 170 set("$dcom_marines", Misc.getWithDGS(getMarinesRequiredForCustomObjective(market, RAID_DANGER))); 171 } 172 173 @Override 174 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 175 float opad = 10f; 176 Color h = Misc.getHighlightColor(); 177 if (currentStage == Stage.DISRUPT) { 178 info.addPara("Disrupt a competitor of " + getPerson().getNameString() + " by raiding their warehouse " + 179 market.getOnOrAt() + " " + market.getName() + 180 " in the " + market.getStarSystem().getNameWithLowercaseTypeShort() + ".", opad); 181 182 addCustomRaidInfo(market, RAID_DANGER, info, opad); 183 } 184 } 185 186 @Override 187 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 188 Color h = Misc.getHighlightColor(); 189 if (currentStage == Stage.DISRUPT) { 190 info.addPara("Raid warehouse " + 191 market.getOnOrAt() + " " + market.getName() + " in the " + 192 market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad); 193 return true; 194 } 195 return false; 196 } 197 198 @Override 199 public String getBaseName() { 200 return "Disrupt Competitor"; 201 } 202 203} 204