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.SectorEntityToken; 008import com.fs.starfarer.api.campaign.StarSystemAPI; 009import com.fs.starfarer.api.campaign.econ.MarketAPI; 010import com.fs.starfarer.api.characters.PersonAPI; 011import com.fs.starfarer.api.impl.campaign.ids.Factions; 012import com.fs.starfarer.api.impl.campaign.ids.FleetTypes; 013import com.fs.starfarer.api.impl.campaign.ids.Ranks; 014import com.fs.starfarer.api.impl.campaign.ids.Tags; 015import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent; 016import com.fs.starfarer.api.ui.TooltipMakerAPI; 017import com.fs.starfarer.api.util.Misc; 018 019public class DeadDropMission extends HubMissionWithBarEvent { 020 021 public static float PROB_COMPLICATIONS = 0.5f; 022 public static float PROB_PATROL_AFTER = 0.5f; 023 public static float MISSION_DAYS = 120f; 024 025 public static enum Stage { 026 DROP_OFF, 027 COMPLETED, 028 FAILED, 029 } 030 031 protected String thing; 032 protected SectorEntityToken target; 033 protected StarSystemAPI system; 034 035 @Override 036 protected boolean create(MarketAPI createdAt, boolean barEvent) { 037 //genRandom = Misc.random; 038 039 if (barEvent) { 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 findOrCreateGiver(createdAt, false, false); 047 } 048 049 // I may have had a bit too much fun with this 050 thing = pickOne("an apparently inert data chip", 051 "a rad-shielded salvors' TriPad", 052 "a cloudy, damaged data crystal", 053 "a small EM-shielded safe", 054 "a hardcopy book made of paper", 055 "a sewing kit with strangely curved needles", 056 "a single rose in a miniaturized stasis field", 057 "a small packet of seeds embossed with a Luddic sigil", 058 "an aged, twisted piece of wood", 059 "an irradiated bulkhead in a shielded crate", 060 "a black Volturnian lobster shell", 061 "a biosample in sealed cylinder", 062 "a peculiar vial of blood", 063 "a powdered substance in a triple-sealed container", 064 "a single vacuum-desiccated finger", 065 "a tiny unicorn pendant", 066 "a delicate crane made of folded paper", 067 "a scratched golden ring", 068 "a gravimatic trap holding some kind of glowing mote", 069 "a battered Hegemony officer's pistol", 070 "a large brilliant-cut diamond", 071 "a captain's safe cut from its bulkhead", 072 "a glowing blue crystal in a sealed tube" 073 ); 074 075 PersonAPI person = getPerson(); 076 if (person == null) return false; 077 078 079 if (!setPersonMissionRef(person, "$ddro_ref")) { 080 return false; 081 } 082 083 if (barEvent) { 084 setGiverIsPotentialContactOnSuccess(); 085 } 086 087// requireSystemTags(ReqMode.NOT_ANY, Tags.THEME_UNSAFE, Tags.THEME_CORE); 088// preferSystemTags(ReqMode.ANY, Tags.THEME_INTERESTING, Tags.THEME_INTERESTING_MINOR); 089 requireSystemNot(createdAt.getStarSystem()); 090 requireSystemInterestingAndNotUnsafeOrCore(); 091 preferSystemInInnerSector(); 092 preferSystemUnexplored(); 093 preferSystemInDirectionOfOtherMissions(); 094 095 system = pickSystem(); 096 if (system == null) return false; 097 098 target = spawnMissionNode(new LocData(EntityLocationType.HIDDEN_NOT_NEAR_STAR, null, system)); 099 if (!setEntityMissionRef(target, "$ddro_ref")) return false; 100 101 makeImportant(target, "$ddro_target", Stage.DROP_OFF); 102 //setMapMarkerNameColor(Misc.getGrayColor()); 103 104 setStartingStage(Stage.DROP_OFF); 105 setSuccessStage(Stage.COMPLETED); 106 setFailureStage(Stage.FAILED); 107 108 setStageOnMemoryFlag(Stage.COMPLETED, target, "$ddro_completed"); 109 setTimeLimit(Stage.FAILED, MISSION_DAYS, null); 110 111 112 setCreditReward(CreditReward.HIGH); 113 114 if (rollProbability(PROB_COMPLICATIONS)) { 115 triggerComplicationBegin(Stage.DROP_OFF, ComplicationSpawn.APPROACHING_OR_ENTERING, 116 system, Factions.PIRATES, 117 "the " + getWithoutArticle(thing), "it", 118 "the " + getWithoutArticle(thing) + " given to you by " + person.getNameString(), 119 0, 120 true, ComplicationRepImpact.NONE, null); 121 triggerComplicationEnd(true); 122 } 123 124 return true; 125 } 126 127 @Override 128 protected void notifyEnding() { 129 super.notifyEnding(); 130 131 if (isSucceeded() && rollProbability(PROB_PATROL_AFTER)) { 132 PersonAPI person = getPerson(); 133 if (person == null || person.getMarket() == null) return; 134 String patrolFaction = person.getMarket().getFactionId(); 135 if (patrolFaction.equals(person.getFaction().getId()) || 136 Misc.isPirateFaction(person.getMarket().getFaction()) || 137 Factions.PLAYER.equals(patrolFaction)) { 138 return; 139 } 140 141 DelayedFleetEncounter e = new DelayedFleetEncounter(genRandom, getMissionId()); 142 e.setDelayNone(); 143 e.setLocationInnerSector(true, patrolFaction); 144 e.beginCreate(); 145 e.triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, patrolFaction, FleetTypes.PATROL_LARGE, new Vector2f()); 146 e.setFleetWantsThing(patrolFaction, 147 "the dead drop coordinates", "they", 148 "the dead drop coordinates given to you by " + person.getNameString(), 149 0, 150 true, ComplicationRepImpact.LOW, 151 DelayedFleetEncounter.TRIGGER_REP_LOSS_MEDIUM, getPerson()); 152 e.triggerSetAdjustStrengthBasedOnQuality(true, getQuality()); 153 e.triggerMakeLowRepImpact(); 154 e.triggerSetPatrol(); 155 e.triggerSetStandardAggroInterceptFlags(); 156 e.endCreate(); 157 } 158 } 159 160 161 162 protected void updateInteractionDataImpl() { 163 set("$ddro_barEvent", isBarEvent()); 164 set("$ddro_manOrWoman", getPerson().getManOrWoman()); 165 set("$ddro_heOrShe", getPerson().getHeOrShe()); 166 set("$ddro_reward", Misc.getWithDGS(getCreditsReward())); 167 168 set("$ddro_aOrAnThing", thing); 169 set("$ddro_thing", getWithoutArticle(thing)); 170 171 set("$ddro_personName", getPerson().getNameString()); 172 set("$ddro_systemName", system.getNameWithLowercaseTypeShort()); 173 set("$ddro_dist", getDistanceLY(target)); 174 } 175 176 @Override 177 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 178 float opad = 10f; 179 Color h = Misc.getHighlightColor(); 180 if (currentStage == Stage.DROP_OFF) { 181 info.addPara("Deliver " + thing + " to the dead drop location at the " + 182 "specified coordinates in the " + system.getNameWithLowercaseTypeShort() + ".", 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.DROP_OFF) { 190 info.addPara("Deliver " + getWithoutArticle(thing) + " to specified location in the " + 191 system.getNameWithLowercaseTypeShort(), tc, pad); 192 return true; 193 } 194 return false; 195 } 196 197 @Override 198 public String getBaseName() { 199 return "Dead Drop"; 200 } 201 202} 203 204 205 206 207 208