Starsector API
Loading...
Searching...
No Matches
EncounterManager.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.enc;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Random;
6
7import org.lwjgl.util.vector.Vector2f;
8
9import com.fs.starfarer.api.EveryFrameScript;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.CampaignFleetAPI;
12import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
13import com.fs.starfarer.api.campaign.LocationAPI;
14import com.fs.starfarer.api.campaign.listeners.ListenerUtil;
15import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2;
16import com.fs.starfarer.api.util.IntervalUtil;
17import com.fs.starfarer.api.util.Misc;
18import com.fs.starfarer.api.util.TimeoutTracker;
19import com.fs.starfarer.api.util.WeightedRandomPicker;
20
22
23 public static String EP_TYPE_SLIPSTREAM = "ep_type_slipstream";
24 public static String EP_TYPE_OUTSIDE_SYSTEM = "ep_type_outside_system";
25
26 public static float MAX_EP_DIST_ADD = 4000;
27
28 public static List<EPEncounterCreator> CREATORS = new ArrayList<EPEncounterCreator>();
29 static {
34 CREATORS.add(new SlipstreamNoEPEC());
35
38
39 CREATORS.add(new AbyssalLightEPEC());
43 CREATORS.add(new AbyssalNoEPEC());
44 }
45
46
47 public static EncounterManager getInstance() {
48 String key = "$encounterManager";
50 if (manager == null) {
52 if (curr instanceof EncounterManager) {
53 manager = (EncounterManager) curr;
55 break;
56 }
57 }
58 }
59 return manager;
60 }
61
62 protected Object readResolve() {
63 return this;
64 }
65
66 protected Random random = new Random();
67 protected IntervalUtil interval = new IntervalUtil(0.2f, 0.4f);
70
74
75 public void advance(float amount) {
77 if (pf == null) return;
78 float days = Global.getSector().getClock().convertToDays(amount);
79 //days *= 1000f;
80 pointTimeout.advance(days);
81 creatorTimeout.advance(days);
82
83 if (interval.getRandom() == null) {
85 }
86
87 interval.advance(days);
88 if (interval.intervalElapsed()) {
89
91 if (where == null) return;
92
93 float minRange = Global.getSettings().getMaxSensorRange(where);
94 float maxRange = minRange + MAX_EP_DIST_ADD;
95
96 List<EncounterPoint> points = ListenerUtil.generateEncounterPoints(where);
97 EncounterPoint closest = null;
98 float minDist = Float.MAX_VALUE;
99
100// System.out.println("EncounterManager potential points");
101// System.out.println("---------------------------------");
102// for (EncounterPoint p : points) {
103// System.out.println(p);
104// }
105// System.out.println("---------------------------------");
106
107 for (EncounterPoint p : points) {
108 if (pointTimeout.contains(p.id)) {
109 continue;
110 }
111 float dist = Misc.getDistance(pf.getLocation(), p.loc);
112 if (dist < minRange || dist > maxRange) continue;
113 if (dist < minDist) {
114 closest = p;
115 minDist = dist;
116 }
117 }
118
119 //System.out.println("Point picked: " + closest);
120
121 if (closest != null) {
123 for (EPEncounterCreator c : CREATORS) {
124 if (creatorTimeout.contains(c.getId())) continue;
125 float f = c.getFrequencyForPoint(this, closest);
126 if (f > 0f) {
127 picker.add(c, f);
128 }
129 }
130
131 EPEncounterCreator c = picker.pick();
132 if (c != null) {
133 c.createEncounter(this, closest);
134
135 float ptTO = c.getPointTimeoutMin() + (c.getPointTimeoutMax() - c.getPointTimeoutMin()) * random.nextFloat();
136 float cTO = c.getCreatorTimeoutMin() + (c.getCreatorTimeoutMax() - c.getCreatorTimeoutMin()) * random.nextFloat();
137 if (ptTO > 0) {
138 pointTimeout.set(closest.id, ptTO);
139 }
140 if (cTO > 0) {
141 creatorTimeout.set(c.getId(), cTO);
142 }
143 }
144 }
145 }
146 }
147
148
149
150 public boolean isDone() {
151 return false;
152 }
153
154 public boolean runWhilePaused() {
155 return false;
156 }
157
158 public Random getRandom() {
159 return random;
160 }
161
165
169
170
171 public List<EncounterPoint> generateEncounterPoints(LocationAPI where) {
172 if (!where.isHyperspace()) return null;
173
174 List<EncounterPoint> result = new ArrayList<EncounterPoint>();
176 float velAngle = Misc.getAngleInDegrees(pf.getVelocity());
177 if (pf.getVelocity().length() < 10f) {
178 velAngle = pf.getFacing();
179 }
180 for (CampaignTerrainAPI ter : where.getTerrainCopy()) {
181 if (ter.getPlugin() instanceof SlipstreamTerrainPlugin2) {
182 SlipstreamTerrainPlugin2 plugin = (SlipstreamTerrainPlugin2) ter.getPlugin();
183 List<Vector2f> points = plugin.getEncounterPoints();
184 if (points != null) {
185 for (Vector2f p : points) {
186 float dist = Misc.getDistance(pf.getLocation(), p);
187 if (dist > 10000f) continue;
188 if (!Misc.isInsideSlipstream(p, 500f)) {
189 float diff = Misc.getAngleDiff(velAngle, Misc.getAngleInDegrees(pf.getLocation(), p));
190 if (diff < 90f) {
191 String id = ter.getId() + "_" + (int)Math.round(p.x) + "_" + (int)Math.round(p.y);
192 EncounterPoint ep = new EncounterPoint(id, where, p, EP_TYPE_SLIPSTREAM);
193 result.add(ep);
194 }
195 }
196 }
197 }
198 }
199 }
200 return result;
201 }
202
203}
204
205
206
207
208
209
210
static SettingsAPI getSettings()
Definition Global.java:57
static SectorAPI getSector()
Definition Global.java:65
static List< EncounterPoint > generateEncounterPoints(LocationAPI where)
List< EncounterPoint > generateEncounterPoints(LocationAPI where)
static boolean isInsideSlipstream(Vector2f loc, float radius)
Definition Misc.java:6408
static float getAngleDiff(float from, float to)
Definition Misc.java:1716
static float getDistance(SectorEntityToken from, SectorEntityToken to)
Definition Misc.java:599
static float getAngleInDegrees(Vector2f v)
Definition Misc.java:1126
List< CampaignTerrainAPI > getTerrainCopy()
List< EveryFrameScript > getScripts()
ListenerManagerAPI getListenerManager()
void set(String key, Object value)
void createEncounter(EncounterManager manager, EncounterPoint point)