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.FactionAPI.ShipPickMode;
008import com.fs.starfarer.api.campaign.FactionAPI.ShipPickParams;
009import com.fs.starfarer.api.campaign.InteractionDialogAPI;
010import com.fs.starfarer.api.campaign.econ.MarketAPI;
011import com.fs.starfarer.api.campaign.rules.MemoryAPI;
012import com.fs.starfarer.api.characters.PersonAPI;
013import com.fs.starfarer.api.combat.ShipVariantAPI;
014import com.fs.starfarer.api.fleet.FleetMemberAPI;
015import com.fs.starfarer.api.fleet.FleetMemberType;
016import com.fs.starfarer.api.fleet.ShipRolePick;
017import com.fs.starfarer.api.impl.campaign.DModManager;
018import com.fs.starfarer.api.impl.campaign.econ.impl.ShipQuality;
019import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflater;
020import com.fs.starfarer.api.impl.campaign.ids.Factions;
021import com.fs.starfarer.api.impl.campaign.ids.Ranks;
022import com.fs.starfarer.api.impl.campaign.ids.Tags;
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;
026
027public class HijackingMission extends HubMissionWithBarEvent {
028
029        public static float BASE_PRICE_MULT = 0.33f;
030
031
032        protected FleetMemberAPI member;
033        protected int price;
034        protected int marines;
035        
036        @Override
037        protected boolean create(MarketAPI createdAt, boolean barEvent) {
038                
039                if (barEvent) {
040                        setGiverRank(Ranks.CITIZEN);
041                        setGiverPost(pickOne(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                PersonAPI person = getPerson();
050                if (person == null) return false;
051                MarketAPI market = person.getMarket();
052                if (market == null) return false;
053                if (market.isPlayerOwned()) return false;
054                
055                if (!setPersonMissionRef(person, "$hijack_ref")) {
056                        return false;
057                }
058                
059                if (barEvent) {
060                        setGiverIsPotentialContactOnSuccess();
061                }
062                
063                //genRandom = Misc.random;
064                
065                ShipPickParams params = new ShipPickParams(ShipPickMode.PRIORITY_THEN_ALL);
066                String role = SurplusShipHull.pickRole(getQuality(), market.getFaction(), person.getImportance(), genRandom);
067                
068                ShipVariantAPI variant = null;
069                for (int i = 0; i < 10; i++) {
070                        List<ShipRolePick> picks = market.getFaction().pickShip(role, params, null, genRandom);
071                        if (picks.isEmpty()) return false;
072                        String variantId = picks.get(0).variantId;
073                        variant = Global.getSettings().getVariant(variantId);
074                        variant = Global.getSettings().getVariant(variant.getHullSpec().getHullId() + "_Hull").clone();
075                        if (variant.getHullSpec().hasTag(Tags.NO_SELL)) {
076                                variant = null;
077                                continue;
078                        }
079                        break;
080                }
081                if (variant == null) return false;
082                        
083                member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, variant);
084                assignShipName(member, Factions.INDEPENDENT);
085                
086                float quality = ShipQuality.getShipQuality(market, market.getFaction().getId());
087                float averageDmods = DefaultFleetInflater.getAverageDmodsForQuality(quality);
088                int addDmods = DefaultFleetInflater.getNumDModsToAdd(variant, averageDmods, genRandom);
089                if (addDmods > 0) {
090                        DModManager.setDHull(variant);
091                        DModManager.addDMods(member, true, addDmods, genRandom);
092                }
093                
094                price = getRoundNumber(variant.getHullSpec().getBaseValue() * BASE_PRICE_MULT);
095                
096                
097                setRepFactionChangesTiny();
098                setRepPersonChangesVeryLow();
099                
100                switch (member.getHullSpec().getHullSize()) {
101                case CAPITAL_SHIP:
102                        marines = 100;
103                        setRepFactionChangesVeryLow();
104                        setRepPersonChangesLow();
105                        break;
106                case CRUISER:
107                        marines = 50;
108                        break;
109                case DESTROYER:
110                        marines = 20;
111                        break;
112                case FRIGATE:
113                        marines = 10;
114                        break;
115                }
116                
117                return true;
118        }
119        
120        protected void updateInteractionDataImpl() {
121                set("$hijack_barEvent", isBarEvent());
122                set("$hijack_hull", member.getHullSpec().getHullNameWithDashClass());
123                set("$hijack_designation", member.getHullSpec().getDesignation());
124                set("$hijack_price", Misc.getWithDGS(price));
125                set("$hijack_marines", Misc.getWithDGS(marines));
126                
127                set("$hijack_manOrWoman", getPerson().getManOrWoman());
128                set("$hijack_hisOrHer", getPerson().getHisOrHer());
129                set("$hijack_member", member);
130        }
131        
132        @Override
133        protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params,
134                                                             Map<String, MemoryAPI> memoryMap) {
135                if ("showShip".equals(action)) {
136                        dialog.getVisualPanel().showFleetMemberInfo(member, true);
137                        return true;
138                } else if ("showPerson".equals(action)) {
139                        dialog.getVisualPanel().showPersonInfo(getPerson(), true);
140                        return true;
141                }
142                return false;
143        }
144
145        @Override
146        public String getBaseName() {
147                return "Hijacking"; // not used since there's no intel item
148        }
149        
150        @Override
151        public void accept(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
152                // it's just an transaction immediate transaction handled in rules.csv
153                // no intel item etc
154                
155                currentStage = new Object(); // so that the abort() assumes the mission was successful
156                abort();
157        }
158}
159
160
161
162