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());
42 CREATORS.add(new AbyssalNoEPEC());
43 }
44
45
46 public static EncounterManager getInstance() {
47 String key = "$encounterManager";
48 EncounterManager calc = (EncounterManager) Global.getSector().getMemoryWithoutUpdate().get(key);
49 if (calc == null) {
50 for (EveryFrameScript curr : Global.getSector().getScripts()) {
51 if (curr instanceof EncounterManager) {
52 calc = (EncounterManager) curr;
53 Global.getSector().getMemoryWithoutUpdate().set(key, calc);
54 break;
55 }
56 }
57 }
58 return calc;
59 }
60
61 protected Object readResolve() {
62 return this;
63 }
64
65 protected Random random = new Random();
66 protected IntervalUtil interval = new IntervalUtil(0.2f, 0.4f);
67 protected TimeoutTracker<String> pointTimeout = new TimeoutTracker<String>();
68 protected TimeoutTracker<String> creatorTimeout = new TimeoutTracker<String>();
69
71 Global.getSector().getListenerManager().addListener(this);
72 }
73
74 public void advance(float amount) {
75 CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
76 if (pf == null) return;
77 float days = Global.getSector().getClock().convertToDays(amount);
78 //days *= 1000f;
79 pointTimeout.advance(days);
80 creatorTimeout.advance(days);
81
82 if (interval.getRandom() == null) {
83 interval.setRandom(random);
84 }
85
86 interval.advance(days);
87 if (interval.intervalElapsed()) {
88
89 LocationAPI where = Global.getSector().getCurrentLocation();
90 if (where == null) return;
91
92 float minRange = Global.getSettings().getMaxSensorRange(where);
93 float maxRange = minRange + MAX_EP_DIST_ADD;
94
95 List<EncounterPoint> points = ListenerUtil.generateEncounterPoints(where);
96 EncounterPoint closest = null;
97 float minDist = Float.MAX_VALUE;
98
99// System.out.println("EncounterManager potential points");
100// System.out.println("---------------------------------");
101// for (EncounterPoint p : points) {
102// System.out.println(p);
103// }
104// System.out.println("---------------------------------");
105
106 for (EncounterPoint p : points) {
107 if (pointTimeout.contains(p.id)) {
108 continue;
109 }
110 float dist = Misc.getDistance(pf.getLocation(), p.loc);
111 if (dist < minRange || dist > maxRange) continue;
112 if (dist < minDist) {
113 closest = p;
114 minDist = dist;
115 }
116 }
117
118 //System.out.println("Point picked: " + closest);
119
120 if (closest != null) {
121 WeightedRandomPicker<EPEncounterCreator> picker = new WeightedRandomPicker<EPEncounterCreator>(random);
122 for (EPEncounterCreator c : CREATORS) {
123 if (creatorTimeout.contains(c.getId())) continue;
124 float f = c.getFrequencyForPoint(this, closest);
125 if (f > 0f) {
126 picker.add(c, f);
127 }
128 }
129
130 EPEncounterCreator c = picker.pick();
131 if (c != null) {
132 c.createEncounter(this, closest);
133
134 float ptTO = c.getPointTimeoutMin() + (c.getPointTimeoutMax() - c.getPointTimeoutMin()) * random.nextFloat();
135 float cTO = c.getCreatorTimeoutMin() + (c.getCreatorTimeoutMax() - c.getCreatorTimeoutMin()) * random.nextFloat();
136 if (ptTO > 0) {
137 pointTimeout.set(closest.id, ptTO);
138 }
139 if (cTO > 0) {
140 creatorTimeout.set(c.getId(), cTO);
141 }
142 }
143 }
144 }
145 }
146
147
148
149 public boolean isDone() {
150 return false;
151 }
152
153 public boolean runWhilePaused() {
154 return false;
155 }
156
157 public Random getRandom() {
158 return random;
159 }
160
161 public TimeoutTracker<String> getPointTimeout() {
162 return pointTimeout;
163 }
164
165 public TimeoutTracker<String> getCreatorTimeout() {
166 return creatorTimeout;
167 }
168
169
170 public List<EncounterPoint> generateEncounterPoints(LocationAPI where) {
171 if (!where.isHyperspace()) return null;
172
173 List<EncounterPoint> result = new ArrayList<EncounterPoint>();
174 CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
175 float velAngle = Misc.getAngleInDegrees(pf.getVelocity());
176 if (pf.getVelocity().length() < 10f) {
177 velAngle = pf.getFacing();
178 }
179 for (CampaignTerrainAPI ter : where.getTerrainCopy()) {
180 if (ter.getPlugin() instanceof SlipstreamTerrainPlugin2) {
181 SlipstreamTerrainPlugin2 plugin = (SlipstreamTerrainPlugin2) ter.getPlugin();
182 List<Vector2f> points = plugin.getEncounterPoints();
183 if (points != null) {
184 for (Vector2f p : points) {
185 float dist = Misc.getDistance(pf.getLocation(), p);
186 if (dist > 10000f) continue;
187 if (!Misc.isInsideSlipstream(p, 500f)) {
188 float diff = Misc.getAngleDiff(velAngle, Misc.getAngleInDegrees(pf.getLocation(), p));
189 if (diff < 90f) {
190 String id = ter.getId() + "_" + (int)Math.round(p.x) + "_" + (int)Math.round(p.y);
191 EncounterPoint ep = new EncounterPoint(id, where, p, EP_TYPE_SLIPSTREAM);
192 result.add(ep);
193 }
194 }
195 }
196 }
197 }
198 }
199 return result;
200 }
201
202}
203
204
205
206
207
208
209
static SettingsAPI getSettings()
Definition Global.java:51
static SectorAPI getSector()
Definition Global.java:59
List< EncounterPoint > generateEncounterPoints(LocationAPI where)
void createEncounter(EncounterManager manager, EncounterPoint point)