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}