001package com.fs.starfarer.api.impl.campaign.missions; 002 003import java.awt.Color; 004 005import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI; 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 SmugglingMission extends HubMissionWithBarEvent { 017 018 public static float MISSION_DAYS = 60f; 019 public static float MIN_VALUE = 10000f; 020 public static float MAX_VALUE = 100000f; 021 022 public static enum Stage { 023 SMUGGLE, 024 COMPLETED, 025 FAILED, 026 } 027 028 protected MarketAPI market; 029 protected CommodityOnMarketAPI com; 030 protected int quantity; 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 setGiverRank(Ranks.CITIZEN); 040 setGiverPost(pickOne(Ranks.POST_SMUGGLER, Ranks.POST_GANGSTER, 041 Ranks.POST_FENCE, Ranks.POST_CRIMINAL)); 042 setGiverImportance(pickImportance()); 043 setGiverFaction(Factions.PIRATES); 044 setGiverTags(Tags.CONTACT_UNDERWORLD); 045 findOrCreateGiver(createdAt, false, false); 046 } 047 048 PersonAPI person = getPerson(); 049 if (person == null) return false; 050 051 052 if (!setPersonMissionRef(person, "$smug_ref")) { 053 return false; 054 } 055 056 if (barEvent) { 057 setGiverIsPotentialContactOnSuccess(); 058 } 059 060 requireMarketIsNot(createdAt); 061 requireMarketFactionNotPlayer(); 062 requireMarketLocationNot(createdAt.getContainingLocation()); 063 requireMarketFactionCustom(ReqMode.NOT_ANY, Factions.CUSTOM_ALLOWS_TRANSPONDER_OFF_TRADE); 064 requireMarketNotHidden(); 065 requireMarketNotInHyperspace(); 066 preferMarketInDirectionOfOtherMissions(); 067 068 requireCommodityIllegal(); 069 requireCommodityDemandAtLeast(1); 070 071 com = pickCommodity(); 072 if (com == null) return false; 073 074 market = com.getMarket(); 075 if (market == null) return false; 076 077 078 float value = MIN_VALUE + getQuality() * (MAX_VALUE - MIN_VALUE); 079 value *= 0.9f + genRandom.nextFloat() * 0.2f; 080 081 quantity = getRoundNumber(value / com.getCommodity().getBasePrice()); 082 if (quantity < 10) quantity = 10; 083 084 if (!setMarketMissionRef(market, "$smug_ref")) { 085 return false; 086 } 087 makeImportant(market, "$smug_target", Stage.SMUGGLE); 088 089 setStartingStage(Stage.SMUGGLE); 090 setSuccessStage(Stage.COMPLETED); 091 setFailureStage(Stage.FAILED); 092 093 setStageOnMemoryFlag(Stage.COMPLETED, market, "$smug_completed"); 094 setNoAbandon(); 095 setTimeLimit(Stage.FAILED, MISSION_DAYS, null); 096 097 098 //setCreditReward((int)(value * 0.5f), (int)(value * 0.7f)); 099 setCreditRewardWithBonus(CreditReward.LOW, (int) (value * 0.5f)); 100 101 triggerCreateMediumPatrolAroundMarket(market, Stage.SMUGGLE, 1f); 102 103 return true; 104 } 105 106 protected void updateInteractionDataImpl() { 107 set("$smug_barEvent", isBarEvent()); 108 set("$smug_manOrWoman", getPerson().getManOrWoman()); 109 set("$smug_reward", Misc.getWithDGS(getCreditsReward())); 110 set("$smug_commodityId", com.getId()); 111 set("$smug_commodityName", com.getCommodity().getLowerCaseName()); 112 set("$smug_quantity", Misc.getWithDGS(quantity)); 113 set("$smug_playerHasEnough", playerHasEnough(com.getId(), quantity)); 114 115 set("$smug_personName", getPerson().getNameString()); 116 set("$smug_systemName", market.getStarSystem().getNameWithLowercaseTypeShort()); 117 set("$smug_marketName", market.getName()); 118 set("$smug_marketOnOrAt", market.getOnOrAt()); 119 set("$smug_dist", getDistanceLY(market)); 120 } 121 122 @Override 123 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) { 124 float opad = 10f; 125 Color h = Misc.getHighlightColor(); 126 if (currentStage == Stage.SMUGGLE) { 127 info.addPara("Smuggle %s units of " + com.getCommodity().getLowerCaseName() + " to " + market.getName() + 128 " in the " + market.getStarSystem().getNameWithLowercaseTypeShort() + ".", opad, 129 h, Misc.getWithDGS(quantity)); 130 131 info.addPara("The authorities are aware the shipment is incoming and patrols are on high alert.", opad); 132 } 133 } 134 135 @Override 136 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) { 137 Color h = Misc.getHighlightColor(); 138 if (currentStage == Stage.SMUGGLE) { 139 info.addPara("Smuggle %s units of " + com.getCommodity().getLowerCaseName() + " to " + 140 market.getName() + " in the " + 141 market.getStarSystem().getNameWithLowercaseTypeShort(), pad, tc, 142 h, Misc.getWithDGS(quantity)); 143 return true; 144 } 145 return false; 146 } 147 148 @Override 149 public String getBaseName() { 150 return "Smuggling " + com.getCommodity().getName(); 151 } 152 153} 154