Starsector API
Loading...
Searching...
No Matches
DeliveryFailureConsequences.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.intel.bar.events;
2
3import java.util.Random;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.EveryFrameScript;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.BattleAPI;
10import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
11import com.fs.starfarer.api.campaign.CampaignFleetAPI;
12import com.fs.starfarer.api.campaign.FleetAssignment;
13import com.fs.starfarer.api.campaign.StarSystemAPI;
14import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.EncounterOption;
15import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
16import com.fs.starfarer.api.campaign.rules.MemoryAPI;
17import com.fs.starfarer.api.characters.AbilityPlugin;
18import com.fs.starfarer.api.characters.FullName.Gender;
19import com.fs.starfarer.api.impl.campaign.DebugFlags;
20import com.fs.starfarer.api.impl.campaign.fleets.AutoDespawnScript;
21import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
22import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
23import com.fs.starfarer.api.impl.campaign.ids.Abilities;
24import com.fs.starfarer.api.impl.campaign.ids.Factions;
25import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
26import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
27import com.fs.starfarer.api.util.Misc;
28
29public class DeliveryFailureConsequences implements EveryFrameScript, FleetEventListener {
30
31 public static float RADIUS_FROM_CORE = 30000f; // may send fleet when within this radius from core
32 public static float DAYS_IN_SYSTEM = 7f;
33
34 protected float delayDays;
35 protected boolean sentFleet;
36 protected String name;
37 protected String commodity;
38 protected Gender gender;
39 protected float reward;
40 protected long seed;
42 name = intel.getEvent().getPerson().getNameString();
43 gender = intel.getEvent().getPerson().getGender();
44 commodity = Global.getSettings().getCommoditySpec(intel.getEvent().getCommodityId()).getLowerCaseName();
45
46 reward = intel.getEvent().getReward();
47
48 seed = Misc.genRandomSeed();
49
50 delayDays = 100f + (float) Math.random() * 200f;
51
53 delayDays = 0f;
54 }
55 }
56
57 protected StarSystemAPI systemPlayerIsIn = null;
58 protected float daysInSystem = 0f;
59 public void advance(float amount) {
60 if (sentFleet) return;
61
62 float days = Misc.getDays(amount);
63 //days *= 1000f;
64 delayDays -= days;
65 if (delayDays > 0) return;
66
67
68 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
69 float distFromCore = playerFleet.getLocationInHyperspace().length();
70 if (distFromCore > RADIUS_FROM_CORE) {
71 daysInSystem = 0f;
72 systemPlayerIsIn = null;
73 return;
74 }
75
76 if (!(playerFleet.getContainingLocation() instanceof StarSystemAPI)) {
78 float dist = Misc.getDistance(systemPlayerIsIn.getLocation(), playerFleet.getLocationInHyperspace());
79 if (dist < 3000f) {
80 sendFleet();
81 }
82 }
83 daysInSystem = 0f;
84 systemPlayerIsIn = null;
85 return;
86 }
87
88 systemPlayerIsIn = (StarSystemAPI)playerFleet.getContainingLocation();
89 daysInSystem += days;
90 }
91
92 protected void sendFleet() {
93 if (sentFleet) return;
94 sentFleet = true;
95 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
96 CampaignFleetAPI hunter = createBountyHunter();
97 if (hunter != null) {
98 Global.getSector().getHyperspace().addEntity(hunter);
99 Vector2f hunterLoc = Misc.getPointAtRadius(playerFleet.getLocationInHyperspace(), 500f);
100 hunter.setLocation(hunterLoc.x, hunterLoc.y);
101 hunter.getAI().addAssignmentAtStart(FleetAssignment.INTERCEPT, playerFleet, 1000f, null);
102 Misc.giveStandardReturnToSourceAssignments(hunter, false);
103 }
104
105 }
106
107 protected CampaignFleetAPI createBountyHunter() {
108 Random random = new Random(seed);
109 String faction = Factions.INDEPENDENT;
110
111 float pts = reward / 400;
112 pts *= 0.8f + 0.4f * random.nextFloat();
113 if (pts < 30) pts = 30;
114 if (pts > 150) pts = 150; //maxes out at a 60k mission reward
115
116 float qMod = reward / 100000f; // but the quality keeps going up
117
118 String hunter = "bounty hunter";
119
120 if (random.nextFloat() < 0.5f) {
121 faction = Factions.PIRATES;
122 pts *= 1.5f;
123 hunter = "pirate";
124 }
125
126 FleetParamsV3 params = new FleetParamsV3(
127 null,
128 Global.getSector().getPlayerFleet().getLocationInHyperspace(),
129 faction,
130 null,
131 FleetTypes.MERC_BOUNTY_HUNTER,
132 pts, // combatPts
133 0f, // freighterPts
134 pts * 0.1f, // tankerPts
135 0f, // transportPts
136 0f, // linerPts
137 0f, // utilityPts
138 qMod // qualityMod
139 );
140 params.random = random;
141
142 CampaignFleetAPI fleet = FleetFactoryV3.createFleet(params);
143 if (fleet.isEmpty()) fleet = null;
144
145 if (fleet != null) {
146 EncounterOption option = fleet.getAI().pickEncounterOption(null, Global.getSector().getPlayerFleet());
147 if (option == EncounterOption.DISENGAGE) {
148 fleet = null;
149 }
150 }
151
152 if (fleet != null) {
153 //fleet.setFaction(Factions.INDEPENDENT, true);
154 Misc.makeLowRepImpact(fleet, "dmi");
155
156 fleet.addScript(new AutoDespawnScript(fleet));
157 fleet.addEventListener(this);
158
159 MemoryAPI memory = fleet.getMemoryWithoutUpdate();
160 memory.set(MemFlags.MEMORY_KEY_MAKE_HOSTILE, true);
161 memory.set(MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE, true);
162 memory.set(MemFlags.MEMORY_KEY_ALLOW_LONG_PURSUIT, true);
163
164 String hisOrHer = "his";
165 String himOrHer = "him";
166 if (gender == Gender.FEMALE) {
167 hisOrHer = "her";
168 himOrHer = "her";
169 }
170 memory.set("$dmi_bountyHunter", true);
171 memory.set("$dmi_hisOrHer", hisOrHer);
172 memory.set("$dmi_himOrHer", himOrHer);
173 memory.set("$dmi_name", name);
174 memory.set("$dmi_commodity", commodity);
175 memory.set("$dmi_hunter", hunter);
176
177 if (reward >= 50000) {
178 AbilityPlugin eb = fleet.getAbility(Abilities.EMERGENCY_BURN);
179 if (eb != null) eb.activate();
180 }
181 }
182 return fleet;
183 }
184
185
186
187 public boolean isDone() {
188 return sentFleet;
189 }
190
191 public boolean runWhilePaused() {
192 return false;
193 }
194
195 public void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle) {
196 MemoryAPI memory = fleet.getMemoryWithoutUpdate();
197 memory.unset(MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE);
198 }
199
200 public void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param) {
201
202 }
203
204}
static SettingsAPI getSettings()
Definition Global.java:51
static SectorAPI getSector()
Definition Global.java:59
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
CommoditySpecAPI getCommoditySpec(String commodityId)