001package com.fs.starfarer.api.impl.campaign.missions; 002 003import java.awt.Color; 004 005import com.fs.starfarer.api.campaign.SectorEntityToken; 006import com.fs.starfarer.api.campaign.econ.MarketAPI; 007import com.fs.starfarer.api.characters.PersonAPI; 008import com.fs.starfarer.api.impl.campaign.ids.Factions; 009import com.fs.starfarer.api.impl.campaign.ids.Ranks; 010import com.fs.starfarer.api.impl.campaign.ids.Tags; 011import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent; 012import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode; 013import com.fs.starfarer.api.ui.TooltipMakerAPI; 014import com.fs.starfarer.api.util.Misc; 015 016public class SpySatDeployment extends HubMissionWithBarEvent { 017 018 public static float PROB_BAR_UNDERWORLD = 0.25f; 019 public static float PROB_PATROL_AROUND_TARGET = 0.5f; 020 021 public static float MISSION_DAYS = 120f; 022 023 public static enum Stage { 024 DEPLOY, 025 COMPLETED, 026 FAILED, 027 } 028 029 protected MarketAPI market; 030 protected SectorEntityToken target; 031 032 @Override 033 protected boolean create(MarketAPI createdAt, boolean barEvent) { 034 //genRandom = Misc.random; 035 036 //if (Factions.PIRATES.equals(createdAt.getFaction().getId())) return false; 037 038 if (barEvent) { 039 if (rollProbability(PROB_BAR_UNDERWORLD)) { 040 setGiverRank(Ranks.CITIZEN); 041 setGiverPost(pickOne(Ranks.POST_AGENT, Ranks.POST_SMUGGLER, Ranks.POST_GANGSTER, 042 Ranks.POST_FENCE, Ranks.POST_CRIMINAL)); 043 setGiverImportance(pickImportance()); 044 setGiverFaction(Factions.PIRATES); 045 setGiverTags(Tags.CONTACT_UNDERWORLD); 046 } else { 047 setGiverRank(Ranks.CITIZEN); 048 setGiverPost(Ranks.POST_AGENT); 049 setGiverImportance(pickImportance()); 050 if (Factions.PIRATES.equals(createdAt.getFaction().getId())) { 051 setGiverTags(Tags.CONTACT_UNDERWORLD); 052 setGiverFaction(Factions.PIRATES); 053 } else { 054 setGiverTags(Tags.CONTACT_MILITARY); 055 } 056 } 057 findOrCreateGiver(createdAt, false, false); 058 } 059 060 PersonAPI person = getPerson(); 061 if (person == null) return false; 062 063 064 if (!setPersonMissionRef(person, "$ssat_ref")) { 065 return false; 066 } 067 068 if (barEvent) { 069 setGiverIsPotentialContactOnSuccess(); 070 } 071 072 requireMarketIsNot(createdAt); 073 requireMarketLocationNot(createdAt.getContainingLocation()); 074 requireMarketFactionNotPlayer(); 075 requireMarketFactionNot(person.getFaction().getId()); 076 requireMarketFactionCustom(ReqMode.NOT_ANY, Factions.CUSTOM_ALLOWS_TRANSPONDER_OFF_TRADE); 077 requireMarketMilitary(); 078 requireMarketNotHidden(); 079 requireMarketNotInHyperspace(); 080 preferMarketInDirectionOfOtherMissions(); 081 market = pickMarket(); 082 083 if (market == null) return false; 084 085 target = spawnMissionNode( 086 new LocData(EntityLocationType.ORBITING_PARAM, market.getPrimaryEntity(), market.getStarSystem())); 087 if (!setEntityMissionRef(target, "$ssat_ref")) return false; 088 089 makeImportant(target, "$ssat_target", Stage.DEPLOY); 090 setMapMarkerNameColor(market.getTextColorForFactionOrPlanet()); 091 092 setStartingStage(Stage.DEPLOY); 093 setSuccessStage(Stage.COMPLETED); 094 setFailureStage(Stage.FAILED); 095 096 setStageOnMemoryFlag(Stage.COMPLETED, target, "$ssat_completed"); 097 setTimeLimit(Stage.FAILED, MISSION_DAYS, null); 098 099// int sizeModifier = market.getSize() * 10000; 100// setCreditReward(10000 + sizeModifier, 30000 + sizeModifier); 101 setCreditReward(CreditReward.AVERAGE, market.getSize()); 102 103 if (rollProbability(PROB_PATROL_AROUND_TARGET)) { 104 triggerCreateMediumPatrolAroundMarket(market, Stage.DEPLOY, 1f); 105 } 106 107 return true; 108 } 109 110 protected void updateInteractionDataImpl() { 111 set("$ssat_barEvent", isBarEvent()); 112 set("$ssat_underworld", getPerson().hasTag(Tags.CONTACT_UNDERWORLD)); 113 set("$ssat_manOrWoman", getPerson().getManOrWoman()); 114 set("$ssat_reward", Misc.getWithDGS(getCreditsReward())); 115 116 set("$ssat_personName", getPerson().getNameString()); 117 set("$ssat_systemName", market.getStarSystem().getNameWithLowercaseTypeShort()); 118 set("$ssat_marketName", market.getName()); 119 set("$ssat_marketOnOrAt", market.getOnOrAt()); 120 set("$ssat_dist", getDistanceLY(market)); 121 } 122 123 @Override 124 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 125 float opad = 10f; 126 Color h = Misc.getHighlightColor(); 127 if (currentStage == Stage.DEPLOY) { 128 info.addPara("Deploy a spysat in orbit of " + market.getName() + 129 " in the " + market.getStarSystem().getNameWithLowercaseTypeShort() + ".", opad); 130 } 131 } 132 133 @Override 134 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 135 Color h = Misc.getHighlightColor(); 136 if (currentStage == Stage.DEPLOY) { 137 info.addPara("Deploy spysat near " + 138 market.getName() + " in the " + 139 market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad); 140 return true; 141 } 142 return false; 143 } 144 145 @Override 146 public String getBaseName() { 147 return "SpySat Deployment"; 148 } 149 150} 151