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