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.campaign.DModManager;
016import com.fs.starfarer.api.impl.campaign.ids.Factions;
017import com.fs.starfarer.api.impl.campaign.ids.HullMods;
018import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
019import com.fs.starfarer.api.impl.campaign.ids.Ranks;
020import com.fs.starfarer.api.impl.campaign.ids.Tags;
021import com.fs.starfarer.api.impl.campaign.ids.Voices;
022import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseManager;
023import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
024import com.fs.starfarer.api.util.Misc;
025import com.fs.starfarer.api.util.Misc.Token;
026import com.fs.starfarer.api.util.WeightedRandomPicker;
027
028public class HandMeDownFreighter extends HubMissionWithBarEvent {
029        public static float BASE_PRICE_MULT = 0.33f;
030
031        public static WeightedRandomPicker<String> HULLS = new WeightedRandomPicker<String>();
032        static {
033                HULLS.add("buffalo_Hull", 7f);
034                HULLS.add("tarsus_Hull", 7f);
035                HULLS.add("colossus_Hull", 5f);
036                HULLS.add("atlas_Hull", 1f);
037                HULLS.add("wayfarer_Hull", 5f);
038                HULLS.add("gemini_Hull", 1f);
039                HULLS.add("mule_d_pirates_Hull", 1f);
040                HULLS.add("mule_Hull", 1f);
041        }
042        
043        
044        protected FleetMemberAPI member;
045        protected int price;
046        
047        @Override
048        protected boolean create(MarketAPI createdAt, boolean barEvent) {
049                
050                float probAbort = 0.75f * PirateBaseManager.getInstance().getStandardTimeFactor();
051                if (rollProbability(probAbort)) return false;
052                
053                if (barEvent) {
054                        setGiverFaction(Factions.INDEPENDENT);
055                        setGiverPost(Ranks.POST_SPACER);
056                        setGiverVoice(Voices.SPACER);
057                        setGiverImportance(pickLowImportance());
058                        setGiverTags(Tags.CONTACT_UNDERWORLD, Tags.CONTACT_TRADE);
059                        findOrCreateGiver(createdAt, false, false);
060                }
061                
062                PersonAPI person = getPerson();
063                if (person == null) return false;
064                MarketAPI market = person.getMarket();
065                if (market == null) return false;
066                
067                if (!setPersonMissionRef(person, "$hmdf_ref")) {
068                        return false;
069                }
070                
071                if (barEvent) {
072                        setGiverIsPotentialContactOnSuccess();
073                }
074                
075                //genRandom = Misc.random;
076                
077//              WeightedRandomPicker<String> picker = new WeightedRandomPicker<String>(genRandom);
078//              picker.add("buffalo_Hull", 7f);
079//              picker.add("tarsus_Hull", 7f);
080//              picker.add("colossus_Hull", 5f);
081//              picker.add("atlas_Hull", 1f);
082//              picker.add("wayfarer_Hull", 5f);
083//              picker.add("gemini_Hull", 1f);
084//              picker.add("mule_d_pirates_Hull", 1f);
085//              picker.add("mule_Hull", 1f);
086//              
087//              String variantId = picker.pick();
088                String variantId = HULLS.pick(genRandom);
089                ShipVariantAPI variant = Global.getSettings().getVariant(variantId).clone();
090                member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, variant);
091                assignShipName(member, Factions.INDEPENDENT);
092                
093                int dMods = 2 + genRandom.nextInt(3);
094                DModManager.addDMods(variant, true, dMods, genRandom);
095                DModManager.removeDMod(variant, HullMods.COMP_STORAGE);
096                
097                member.getCrewComposition().setCrew(100000);
098                member.getRepairTracker().setCR(0.7f);
099                
100                price = getRoundNumber(variant.getHullSpec().getBaseValue() * BASE_PRICE_MULT);
101                
102                setRepFactionChangesTiny();
103                setRepPersonChangesVeryLow();
104                
105                return true;
106        }
107        
108        protected void updateInteractionDataImpl() {
109                // this is weird - in the accept() method, the mission is aborted, which unsets
110                // $hmdf_ref. So: we use $hmdf_ref2 in the ContactPostAccept rule
111                // and $hmdf_ref2 has an expiration of 0, so it'll get unset on its own later.
112                set("$hmdf_ref2", this);
113                
114                set("$hmdf_barEvent", isBarEvent());
115                set("$hmdf_hullClass", member.getHullSpec().getHullNameWithDashClass());
116                set("$hmdf_price", Misc.getWithDGS(price));
117                set("$hmdf_manOrWoman", getPerson().getManOrWoman());
118                set("$hmdf_hisOrHer", getPerson().getHisOrHer());
119                set("$hmdf_member", member);
120        }
121        
122        @Override
123        protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params,
124                                                             Map<String, MemoryAPI> memoryMap) {
125                if ("showShip".equals(action)) {
126                        dialog.getVisualPanel().showFleetMemberInfo(member, true);
127                        return true;
128                } else if ("showPerson".equals(action)) {
129                        dialog.getVisualPanel().showPersonInfo(getPerson(), true);
130                        return true;
131                }
132                return false;
133        }
134
135        @Override
136        public String getBaseName() {
137                return "Hand-me-down Freighter"; // not used I don't think
138        }
139        
140        @Override
141        public void accept(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
142                // it's just an transaction immediate transaction handled in rules.csv
143                // no intel item etc
144                
145                currentStage = new Object(); // so that the abort() assumes the mission was successful
146                abort();
147                
148                for (CampaignFleetAPI fleet : getPerson().getMarket().getContainingLocation().getFleets()) {
149                        if (fleet.getFaction().isPlayerFaction()) continue;
150                        if (!Misc.isPatrol(fleet)) continue;
151                        fleet.getMemoryWithoutUpdate().set(MemFlags.PATROL_EXTRA_SUSPICION, 1f);
152                }
153        }
154}
155
156
157
158