001package com.fs.starfarer.api.impl.campaign.missions.cb; 002 003import com.fs.starfarer.api.campaign.StarSystemAPI; 004import com.fs.starfarer.api.campaign.econ.MarketAPI; 005import com.fs.starfarer.api.impl.campaign.ids.Commodities; 006import com.fs.starfarer.api.impl.campaign.ids.Factions; 007import com.fs.starfarer.api.impl.campaign.ids.FleetTypes; 008import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent; 009import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality; 010import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize; 011import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerNum; 012import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality; 013import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode; 014 015public class CBTrader extends BaseCustomBountyCreator { 016 017 public static float PROB_IN_SYSTEM_WITH_BASE = 0.5f; 018 019 @Override 020 public float getFrequency(HubMissionWithBarEvent mission, int difficulty) { 021 return super.getFrequency(mission, difficulty) * CBStats.TRADER_FREQ; 022 } 023 024 public String getBountyNamePostfix(HubMissionWithBarEvent mission, CustomBountyData data) { 025 return " - Trade Fleet"; 026 } 027 028 @Override 029 public float getBountyDays() { 030 return 30f; 031 } 032 033 @Override 034 public CustomBountyData createBounty(MarketAPI createdAt, HubMissionWithBarEvent mission, int difficulty, Object bountyStage) { 035 CustomBountyData data = new CustomBountyData(); 036 data.difficulty = difficulty; 037 data.stage = bountyStage; 038 039 //mission.requireSystem(this); 040 mission.requireMarketSizeAtLeast(4); 041 mission.requireMarketNotHidden(); 042 mission.requireMarketHasSpaceport(); 043 mission.requireMarketNotInHyperspace(); 044 mission.requireMarketFactionCustom(ReqMode.NOT_ANY, Factions.CUSTOM_DECENTRALIZED); 045 mission.requireMarketFactionNot(Factions.PIRATES); // redundant, given the above 046 mission.requireMarketFactionNotPlayer(); 047 mission.requireMarketLocationNot(createdAt.getContainingLocation()); 048 MarketAPI target = mission.pickMarket(); 049 050 if (target == null || target.getStarSystem() == null) return null; 051 052 053 StarSystemAPI system = target.getStarSystem(); 054 data.system = system; 055 data.market = target; 056 057 FleetSize size = FleetSize.SMALL; 058 FleetQuality quality = FleetQuality.DEFAULT; 059 OfficerQuality oQuality = OfficerQuality.LOWER; 060 OfficerNum oNum = OfficerNum.FEWER; 061 String type = FleetTypes.TRADE; 062 063 if (difficulty <= 3) { 064 size = FleetSize.TINY; 065 type = FleetTypes.TRADE_SMALL; 066 } 067 068 069 beginFleet(mission, data); 070 mission.triggerCreateFleet(size, quality, Factions.INDEPENDENT, type, data.system); 071 mission.triggerSetFleetOfficers(oNum, oQuality); 072 mission.triggerSetFleetNoCommanderSkills(); 073 mission.triggerSetFleetComposition(1f, 0.2f, 0f, 0f, 0f); 074 mission.triggerSetFleetProbabilityCombatFreighters(0f); 075 mission.triggerPickLocationAtInSystemJumpPoint(data.system); 076 mission.triggerSpawnFleetAtPickedLocation(null, null); 077 078 String expensive = mission.pickOne(Commodities.LUXURY_GOODS, 079 Commodities.RARE_METALS, Commodities.VOLATILES, Commodities.LOBSTER); 080 String cheap = mission.pickOne(Commodities.DOMESTIC_GOODS, Commodities.FOOD, Commodities.ORGANICS); 081 082 mission.triggerAddCommodityFractionDrop(expensive, 0.25f); 083 mission.triggerAddCommodityFractionDrop(cheap, 0.25f); 084 mission.triggerFleetSetPatrolActionText("waiting for customs inspection"); 085 mission.triggerOrderFleetPatrol(data.system, true, target.getPrimaryEntity()); 086 mission.triggerFleetSetPatrolLeashRange(800f); 087 088 data.fleet = createFleet(mission, data); 089 if (data.fleet == null) return null; 090 091 data.custom1 = target; 092 093 setRepChangesBasedOnDifficulty(data, difficulty); 094 data.baseReward = CBStats.getBaseBounty(difficulty, CBStats.TRADER_MULT, mission); 095 096 return data; 097 } 098 099 @Override 100 public void notifyAccepted(MarketAPI createdAt, HubMissionWithBarEvent mission, CustomBountyData data) { 101 102 FleetSize size = FleetSize.SMALL; 103 FleetQuality quality = FleetQuality.DEFAULT; 104 OfficerQuality oQuality = OfficerQuality.DEFAULT; 105 OfficerNum oNum = OfficerNum.DEFAULT; 106 String type = FleetTypes.PATROL_MEDIUM; 107 108 int difficulty = data.difficulty; 109 int num = 1; 110 if (difficulty > 6) num = 2; 111 112 for (int i = 0; i < num; i++) { 113 if (difficulty <= 2) { 114 size = FleetSize.TINY; 115 type = FleetTypes.PATROL_SMALL; 116 } else if (difficulty <= 3) { 117 size = FleetSize.VERY_SMALL; 118 type = FleetTypes.PATROL_SMALL; 119 } else if (difficulty <= 4) { 120 size = FleetSize.SMALL; 121 type = FleetTypes.PATROL_SMALL; 122 } else if (difficulty <= 5) { 123 size = FleetSize.MEDIUM; 124 type = FleetTypes.PATROL_MEDIUM; 125 } else { 126 size = FleetSize.LARGE; 127 type = FleetTypes.PATROL_LARGE; 128 } 129 130 MarketAPI market = (MarketAPI) data.custom1; 131 mission.beginWithinHyperspaceRangeTrigger(market, 1f, false, data.stage); 132 mission.triggerCreateFleet(size, quality, market.getFactionId(), type, market.getPrimaryEntity()); 133 mission.triggerSetFleetOfficers(oNum, oQuality); 134 mission.triggerSetPatrol(); 135 mission.triggerSpawnFleetNear(data.fleet, null, null); 136 mission.triggerFleetSetPatrolActionText("guarding " + data.fleet.getName().toLowerCase()); 137 mission.triggerFleetSetPatrolLeashRange(100f); 138 mission.triggerOrderFleetPatrol(data.system, true, data.fleet); 139 mission.endTrigger(); 140 141 difficulty -= 4; 142 } 143 144 } 145 146 147 @Override 148 public int getMaxDifficulty() { 149 return MAX_DIFFICULTY; 150 } 151 152 @Override 153 public int getMinDifficulty() { 154 return 0; 155 } 156 157} 158 159 160 161 162 163