001package com.fs.starfarer.api.impl.campaign.terrain; 002 003import java.awt.Color; 004 005import org.lwjgl.util.vector.Vector2f; 006 007import com.fs.starfarer.api.EveryFrameScript; 008import com.fs.starfarer.api.Global; 009import com.fs.starfarer.api.campaign.CampaignFleetAPI; 010import com.fs.starfarer.api.fleet.FleetMemberViewAPI; 011import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin.CellStateTracker; 012import com.fs.starfarer.api.util.Misc; 013 014public class HyperStormBoost implements EveryFrameScript { 015 016 public static float MAX_BURN = Global.getSettings().getFloat("maxStormStrikeBurn"); 017 public static float STORM_SPEED_BURST = Global.getSettings().getSpeedPerBurnLevel() * 50f; 018 public static float DURATION_SECONDS = 1f; 019 020 protected CampaignFleetAPI fleet; 021 protected float elapsed; 022 protected float angle; 023 protected CellStateTracker cell; 024 025 public HyperStormBoost(CellStateTracker cell, CampaignFleetAPI fleet) { 026 this.cell = cell; 027 this.fleet = fleet; 028 029 DURATION_SECONDS = 1.25f; 030 STORM_SPEED_BURST = Global.getSettings().getSpeedPerBurnLevel() * 75f; 031 032// DURATION_SECONDS = 2f; 033// STORM_SPEED_BURST = Global.getSettings().getSpeedPerBurnLevel() * 50f; 034 035 if (Misc.getHyperspaceTerrain().getPlugin() instanceof HyperspaceTerrainPlugin) { 036 HyperspaceTerrainPlugin hyper = (HyperspaceTerrainPlugin) Misc.getHyperspaceTerrain().getPlugin(); 037 038 float x = hyper.getEntity().getLocation().x; 039 float y = hyper.getEntity().getLocation().y; 040 float size = hyper.getTileSize(); 041 042 float w = hyper.getTiles().length * size; 043 float h = hyper.getTiles()[0].length * size; 044 045 x -= w/2f; 046 y -= h/2f; 047 048 float tx = x + cell.i * size + size/2f; 049 float ty = y + cell.j * size + size/2f; 050 051 angle = Misc.getAngleInDegrees(new Vector2f(tx, ty), fleet.getLocation()); 052 053 Vector2f v = fleet.getVelocity(); 054 float angle2 = Misc.getAngleInDegrees(v); 055 float speed = v.length(); 056 if (speed < 10) angle2 = fleet.getFacing(); 057 058 float bestAngleAt = Global.getSettings().getBaseTravelSpeed() + Global.getSettings().getSpeedPerBurnLevel() * 20f; 059 float mult = 0.5f + 0.4f * speed / bestAngleAt; 060 if (mult < 0.5f) mult = 0.5f; 061 if (mult > 0.9f) mult = 0.9f; 062 063 angle += Misc.getClosestTurnDirection(angle, angle2) * Misc.getAngleDiff(angle, angle2) * mult; 064 } 065 } 066 067 public void advance(float amount) { 068 elapsed += amount; 069 070 Vector2f boost = Misc.getUnitVectorAtDegreeAngle(angle); 071 072 float mult = 1f; 073 mult = 1f - elapsed / DURATION_SECONDS; 074 mult *= Math.pow(Math.min(1f, elapsed / 0.25f), 2f); 075 if (mult < 0) mult = 0; 076 if (mult > 1) mult = 1; 077 boost.scale(STORM_SPEED_BURST * amount * mult); 078 079 Vector2f v = fleet.getVelocity(); 080 081 if (fleet.getCurrBurnLevel() < MAX_BURN) { 082 fleet.setVelocity(v.x + boost.x, v.y + boost.y); 083 } 084 085 float angleHeading = Misc.getAngleInDegrees(v); 086 if (v.length() < 10) angleHeading = fleet.getFacing(); 087 088 boost = Misc.getUnitVectorAtDegreeAngle(angleHeading); 089 //boost.negate(); 090 if (boost.length() >= 1) { 091 float durIn = 1f; 092 float durOut = 3f; 093 float intensity = 1f; 094 float sizeNormal = 5f + 20f * intensity; 095 String modId = "boost " + cell.i + cell.j * 100; 096 Color glowColor = new Color(100, 100, 255, 75); 097 for (FleetMemberViewAPI view : fleet.getViews()) { 098 view.getWindEffectDirX().shift(modId, boost.x * sizeNormal, durIn, durOut, 1f); 099 view.getWindEffectDirY().shift(modId, boost.y * sizeNormal, durIn, durOut, 1f); 100 view.getWindEffectColor().shift(modId, glowColor, durIn, durOut, intensity); 101 } 102 } 103 } 104 105 public boolean isDone() { 106 return elapsed >= DURATION_SECONDS || !fleet.isInHyperspace(); 107 } 108 109 public boolean runWhilePaused() { 110 // TODO Auto-generated method stub 111 return false; 112 } 113 114}