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