Advertisement
Guest User

Untitled

a guest
Jun 28th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.05 KB | None | 0 0
  1. package data.scripts.world.exipirated;
  2.  
  3. import com.fs.starfarer.api.EveryFrameScript;
  4. import com.fs.starfarer.api.Global;
  5. import com.fs.starfarer.api.campaign.CampaignFleetAPI;
  6. import com.fs.starfarer.api.campaign.FleetAssignment;
  7. import com.fs.starfarer.api.campaign.SectorEntityToken;
  8. import com.fs.starfarer.api.campaign.StarSystemAPI;
  9. import com.fs.starfarer.api.campaign.econ.MarketAPI;
  10. import com.fs.starfarer.api.util.IntervalUtil;
  11. import com.fs.starfarer.api.util.Misc;
  12. import com.fs.starfarer.api.util.WeightedRandomPicker;
  13. import org.lazywizard.lazylib.MathUtils;
  14. import org.lwjgl.util.vector.Vector2f;
  15.  
  16. public class ExipiratedCollectorAssignmentAI implements EveryFrameScript {
  17.  
  18. private float daysTotal = 0f;
  19. private final CampaignFleetAPI fleet;
  20. private final float maxDays;
  21. private boolean orderedReturn = false;
  22. private boolean reachedSystem = false;
  23. private final MarketAPI sourceMarket;
  24. private final int startingFleetPoints;
  25. private StarSystemAPI system = null;
  26. private final IntervalUtil tracker = new IntervalUtil(0.5f, 1.5f);
  27.  
  28. public ExipiratedCollectorAssignmentAI(CampaignFleetAPI fleet, MarketAPI market) {
  29. this.fleet = fleet;
  30. sourceMarket = market;
  31. maxDays = 60f;
  32. startingFleetPoints = fleet.getFleetPoints();
  33. giveInitialAssignment();
  34. }
  35.  
  36. @Override
  37. public void advance(float amount) {
  38. boolean loiter = Avesta.getAvestaMovementScript().isLoitering();
  39.  
  40. if (orderedReturn) {
  41. return;
  42. }
  43.  
  44. float days = Global.getSector().getClock().convertToDays(amount);
  45. daysTotal += days;
  46.  
  47. if (daysTotal > maxDays || !loiter) {
  48. giveReturnToSourceMarketOrders();
  49. return;
  50. }
  51.  
  52. tracker.advance(days);
  53. if (tracker.intervalElapsed()) {
  54. if (system == fleet.getContainingLocation() && !reachedSystem) {
  55. reachedSystem = true;
  56.  
  57. float nominalSpeed = Misc.getSpeedForBurnLevel(fleet.getFleetData().getMinBurnLevel() - 2);
  58. float nominalSpeedSq = nominalSpeed * nominalSpeed;
  59. float minDist = Float.MAX_VALUE;
  60. SectorEntityToken asteroid = null;
  61. for (SectorEntityToken roid : system.getAsteroids()) {
  62. if (roid.getVelocity().lengthSquared() >= nominalSpeedSq) {
  63. continue;
  64. }
  65.  
  66. float dist = MathUtils.getDistance(roid, fleet);
  67. if (dist < minDist) {
  68. minDist = dist;
  69. asteroid = roid;
  70. }
  71. }
  72. if (asteroid == null) {
  73. giveReturnToSourceMarketOrders();
  74. return;
  75. }
  76.  
  77. fleet.clearAssignments();
  78. fleet.addAssignment(FleetAssignment.DELIVER_RESOURCES, asteroid, 1000, "searching for asteroids");
  79. if (startingFleetPoints < 25f) {
  80. fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 5 + startingFleetPoints / 5f, "prospecting for hulls");
  81. } else if (startingFleetPoints < 50f) {
  82. fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 4 + startingFleetPoints / 5f, "gathering rocks");
  83. } else if (startingFleetPoints < 100f) {
  84. fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 3 + startingFleetPoints / 5f, "collecting starship resources");
  85. } else if (startingFleetPoints < 150f) {
  86. fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 2 + startingFleetPoints / 5f, "assembling core components");
  87. } else {
  88. fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 1 + startingFleetPoints / 5f, "constructing hull frames");
  89. }
  90. fleet.addAssignment(FleetAssignment.DELIVER_RESOURCES, sourceMarket.getPrimaryEntity(), 1000, "returning to " + sourceMarket.getName());
  91. fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, sourceMarket.getPrimaryEntity(), getDaysToOrbit() * 2f + 2f, "unloading at " +
  92. sourceMarket.getName());
  93. }
  94. }
  95.  
  96. if (fleet.getAI().getCurrentAssignment() != null) {
  97. float fp = fleet.getFleetPoints();
  98. if (fp < startingFleetPoints * 0.75f) {
  99. giveReturnToSourceMarketOrders();
  100. }
  101. } else {
  102. system = pickNearbyStarSystemToCollect();
  103. if (system != null) {
  104. Vector2f dest = Misc.getPointAtRadius(system.getStar().getLocation(), MathUtils.getRandomNumberInRange(3000f, 7000f));
  105. SectorEntityToken token = system.createToken(dest.x, dest.y);
  106.  
  107. if (system != fleet.getContainingLocation()) {
  108. fleet.addAssignment(FleetAssignment.DELIVER_RESOURCES, token, 1000,
  109. "travelling to the " + system.getBaseName() + " star system");
  110. }
  111. } else {
  112. giveReturnToSourceMarketOrders();
  113. }
  114. }
  115. }
  116.  
  117. @Override
  118. public boolean isDone() {
  119. return false;
  120. }
  121.  
  122. @Override
  123. public boolean runWhilePaused() {
  124. return false;
  125. }
  126.  
  127. private float getDaysToOrbit() {
  128. return 0.5f + (float) Math.random() * 0.5f;
  129. }
  130.  
  131. private void giveInitialAssignment() {
  132. float daysToOrbit = getDaysToOrbit();
  133. fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, sourceMarket.getPrimaryEntity(), daysToOrbit, "loading at " + sourceMarket.getName());
  134. }
  135.  
  136. private void giveReturnToSourceMarketOrders() {
  137. if (!orderedReturn) {
  138. orderedReturn = true;
  139.  
  140. fleet.clearAssignments();
  141. fleet.addAssignment(FleetAssignment.DELIVER_RESOURCES, sourceMarket.getPrimaryEntity(), 1000, "returning to " + sourceMarket.getName());
  142. fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, sourceMarket.getPrimaryEntity(), getDaysToOrbit(), "unloading at " + sourceMarket.getName());
  143. fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, sourceMarket.getPrimaryEntity(), 1000);
  144. }
  145. }
  146.  
  147. private StarSystemAPI pickNearbyStarSystemToCollect() {
  148. WeightedRandomPicker<StarSystemAPI> picker = new WeightedRandomPicker<>();
  149.  
  150. for (StarSystemAPI ss : Global.getSector().getStarSystems()) {
  151. float weight = ss.getAsteroids().size();
  152.  
  153. float dist = Misc.getDistance(ss.getLocation(), fleet.getLocationInHyperspace());
  154. if (dist < 500f) {
  155. dist = 500f;
  156. }
  157. if (dist > 5000f) {
  158. continue;
  159. }
  160.  
  161. weight *= Math.pow(5000f / dist, 1.5);
  162.  
  163. picker.add(ss, weight);
  164. }
  165.  
  166. StarSystemAPI ss = picker.pick();
  167. if (ss == null) {
  168. return null;
  169. }
  170. return ss;
  171. }
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement