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