001package com.fs.starfarer.api.impl.campaign.missions;
002
003import java.util.List;
004import java.util.Map;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.InteractionDialogAPI;
009import com.fs.starfarer.api.campaign.econ.MarketAPI;
010import com.fs.starfarer.api.campaign.rules.MemoryAPI;
011import com.fs.starfarer.api.characters.PersonAPI;
012import com.fs.starfarer.api.combat.ShipVariantAPI;
013import com.fs.starfarer.api.fleet.FleetMemberAPI;
014import com.fs.starfarer.api.fleet.FleetMemberType;
015import com.fs.starfarer.api.impl.PlayerFleetPersonnelTracker;
016import com.fs.starfarer.api.impl.campaign.DModManager;
017import com.fs.starfarer.api.impl.campaign.ids.Factions;
018import com.fs.starfarer.api.impl.campaign.ids.HullMods;
019import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
020import com.fs.starfarer.api.impl.campaign.ids.Ranks;
021import com.fs.starfarer.api.impl.campaign.ids.Tags;
022import com.fs.starfarer.api.impl.campaign.ids.Voices;
023import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseManager;
024import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
025import com.fs.starfarer.api.util.Misc;
026import com.fs.starfarer.api.util.Misc.Token;
027import com.fs.starfarer.api.util.WeightedRandomPicker;
028
029public class MercsOnTheRun extends HubMissionWithBarEvent {
030        public static float BASE_PRICE_MULT = 0.75f;
031        
032        protected FleetMemberAPI member;
033        protected int price;
034        protected int quantity;
035        protected MarketAPI market;
036        protected String commodity;
037        protected int totalPrice;
038        
039        @Override
040        protected boolean create(MarketAPI createdAt, boolean barEvent) {
041                
042                if (barEvent) {
043                        setGiverFaction(Factions.INDEPENDENT);
044                        setGiverPost(Ranks.POST_MARINE_SQUAD_LEADER);
045                        setGiverVoice(Voices.SPACER);
046                        setGiverImportance(pickLowImportance());
047                        //no. setGiverTags(Tags.CONTACT_UNDERWORLD, Tags.CONTACT_TRADE);
048                        findOrCreateGiver(createdAt, false, false);
049                }
050                
051                PersonAPI person = getPerson();
052                if (person == null) return false;
053                
054                market = person.getMarket();
055                if (market == null) return false;
056                
057                if (!setPersonMissionRef(person, "$motr_ref")) {
058                        return false;
059                }
060        
061                commodity = "marines"; // kosher?
062        
063                quantity = 30 + genRandom.nextInt(21);
064                
065                float _price = market.getSupplyPrice(commodity, 1, true);
066                
067                float unitPrice = (int) (_price * BASE_PRICE_MULT);
068                if (unitPrice > 50) {
069                        unitPrice = unitPrice / 10 * 10;
070                }
071                if (unitPrice < 1 && unitPrice > 0) {
072                        unitPrice = 1;
073                }
074                
075                price = (int)(unitPrice * quantity);
076                
077                setRepFactionChangesTiny();
078                setRepPersonChangesVeryLow();
079                
080                return true;
081        }
082        
083        protected void updateInteractionDataImpl() {
084                // this is weird - in the accept() method, the mission is aborted, which unsets
085                // $hmdf_ref. So: we use $hmdf_ref2 in the ContactPostAccept rule
086                // and $hmdf_ref2 has an expiration of 0, so it'll get unset on its own later.
087                set("$motr_ref2", this);
088                
089                set("$motr_barEvent", isBarEvent());
090                set("$motr_price", price);
091                set("$motr_numberOfMarines", quantity);
092                set("$motr_priceText", Misc.getWithDGS(price));
093                set("$motr_manOrWoman", getPerson().getManOrWoman());
094                set("$motr_hisOrHer", getPerson().getHisOrHer());
095                set("$motr_member", member);
096        }
097        
098        @Override
099        protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
100                //if ("showShip".equals(action)) {
101                //      dialog.getVisualPanel().showFleetMemberInfo(member, true);
102                //      return true;
103                if ("buyMarines".equals(action)) {
104                        //dialog.getVisualPanel().showPersonInfo(getPerson(), true);
105                        PlayerFleetPersonnelTracker.getInstance().update();
106                        PlayerFleetPersonnelTracker.getInstance().getMarineData().addXP((float)quantity);
107                        return true;
108                }
109                return false;
110        }
111
112        @Override
113        public String getBaseName() {
114                return "Mercs On The Run"; // not used I don't think
115        }
116        
117        @Override
118        public void accept(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
119                // it's just an transaction immediate transaction handled in rules.csv
120                // no intel item etc
121                
122                currentStage = new Object(); // so that the abort() assumes the mission was successful
123                abort();
124                
125                for (CampaignFleetAPI fleet : getPerson().getMarket().getContainingLocation().getFleets()) {
126                        if (fleet.getFaction().isPlayerFaction()) continue;
127                        if (!Misc.isPatrol(fleet)) continue;
128                        fleet.getMemoryWithoutUpdate().set(MemFlags.PATROL_EXTRA_SUSPICION, 1f);
129                }
130        }
131        
132}
133
134
135
136