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