001package com.fs.starfarer.api.impl.campaign.entities;
002
003import java.awt.Color;
004
005import org.lwjgl.util.vector.Vector2f;
006
007import com.fs.starfarer.api.Global;
008import com.fs.starfarer.api.campaign.CampaignEngineLayers;
009import com.fs.starfarer.api.campaign.SectorEntityToken;
010import com.fs.starfarer.api.combat.ViewportAPI;
011import com.fs.starfarer.api.impl.campaign.BaseCustomEntityPlugin;
012import com.fs.starfarer.api.util.CampaignEngineGlowIndividualEngine;
013import com.fs.starfarer.api.util.CampaignEngineGlowUtil;
014import com.fs.starfarer.api.util.CampaignEntityMovementUtil;
015import com.fs.starfarer.api.util.Misc;
016
017public class GateHaulerEntityPlugin extends BaseCustomEntityPlugin { // implements EngineGlowControls {
018
019        public static float MAX_SPEED = 1000f;
020        public static float ACCELERATION = 5f;
021        
022        protected CampaignEntityMovementUtil movement;
023        protected CampaignEngineGlowUtil engineGlow;
024        protected boolean longBurn = false; 
025        //protected boolean acceleratedThisFrame = false;
026        
027        public void init(SectorEntityToken entity, Object pluginParams) {
028                super.init(entity, pluginParams);
029                readResolve();
030        }
031        
032        Object readResolve() {
033                if (engineGlow == null) {
034                        Color fringe = new Color(255, 0, 0, 255);
035                        Color flame = new Color(255, 100, 100, 255);
036                        Color core = new Color(255, 255, 255, 255);
037                        
038                        engineGlow = new CampaignEngineGlowUtil(entity, fringe, core, flame, 0.25f);
039                        CampaignEngineGlowIndividualEngine engine = new CampaignEngineGlowIndividualEngine(
040                                        90f, 300f, 50f, 400f, new Vector2f(-115f, 0f), engineGlow);
041                        engine.setFlameTexSpanMult(0.5f);
042                        engineGlow.addEngine(engine);
043                }
044                
045                if (movement == null) {
046                        movement = new CampaignEntityMovementUtil(entity, 0.5f, 3f, ACCELERATION, MAX_SPEED);
047                        movement.setEngineGlow(engineGlow);
048                }
049                
050                return this;
051        }
052        
053        public CampaignEntityMovementUtil getMovement() {
054                return movement;
055        }
056
057        public CampaignEngineGlowUtil getEngineGlow() {
058                return engineGlow;
059        }
060        
061        public boolean isActivated() {
062                return entity.getMemoryWithoutUpdate().getBoolean("$activated");
063        }
064        public boolean isActivating() {
065                return entity.getMemoryWithoutUpdate().getBoolean("$activating");
066        }
067        public boolean isInTransit() {
068                return entity.getMemoryWithoutUpdate().getBoolean("$inTransit");
069        }
070        public float getRemainingActivationDays() {
071                return entity.getMemoryWithoutUpdate().getExpire("$activating");
072        }
073
074        public void advance(float amount) {
075                if (entity.isInCurrentLocation() || isInTransit()) {
076                        engineGlow.advance(amount);
077                        
078                        float soundVolume = engineGlow.getLengthMult().getCurr() * 0.5f;
079                        if (soundVolume > 0.5f) soundVolume = 0.5f;
080                        
081                        if (isActivating()) {
082                                // full time is 1 day, set in rules
083                                float remaining = getRemainingActivationDays();
084                                float f = remaining/1f;
085                                if (f < 0f) f = 0f;
086                                if (f > 1f) f = 1f;
087                                engineGlow.getFlickerRateMult().shift(this, 1f + 25f * f, 0f, 0.1f, 1f);
088                                engineGlow.getFlickerMult().shift(this, f, 0f, 0.1f, 1f);
089                        } if (!isActivated()) {
090                                engineGlow.showSuppressed();
091                        } else if (isActivated()) {
092                                if (longBurn && movement.isDesiredFacingSet()) {
093                                        float angleDiff = Misc.getAngleDiff(movement.getDesiredFacing(), entity.getFacing());
094                                        if (angleDiff < 2f) {
095                                                Vector2f dir = Misc.getUnitVectorAtDegreeAngle(movement.getDesiredFacing());
096                                                float speedInDesiredDir = Vector2f.dot(dir, entity.getVelocity());
097                                                if (movement.isFaceInOppositeDirection()) {
098                                                        speedInDesiredDir *= -1f;
099                                                }
100                                                float speed = entity.getVelocity().length();
101                                                
102                                                if (speedInDesiredDir > 10f && speedInDesiredDir > speed * 0.7f) {
103                                                        float speedForMaxEngineLength = 100f;
104                                                        float f = speedInDesiredDir / speedForMaxEngineLength;
105                                                        if (f < 0f) f = 0f;
106                                                        if (f > 1f) f = 1f;
107                                                        
108                                                        soundVolume = Math.min(soundVolume + f * 0.5f, 1f);
109                                                        
110                                                        //System.out.println("longBurn factor: " + f);
111                                                        
112                                                        float flickerZone = 0.5f;
113                                                        if (f < flickerZone) {
114                                                                engineGlow.getFlickerRateMult().shift(this, 5f, 0f, 0.1f, 1f);
115                                                                engineGlow.getFlickerMult().shift(this, 0.33f - 0.33f * f / flickerZone, 0f, 0.1f, 1f);
116                                                        }
117                                                        
118                                                        engineGlow.getGlowMult().shift(this, 2f, 1f, 1f, f);
119                                                        engineGlow.getLengthMult().shift(this, 5f, 1f, 1f, f);
120                                                        engineGlow.getWidthMult().shift(this, 3f, 1f, 1f, f);
121                                                }
122                                                
123                                        }
124                                }
125                        }
126                        
127                        if (soundVolume > 0) {
128                                if (entity.isInCurrentLocation() && entity.isVisibleToPlayerFleet()) {
129                                        Global.getSoundPlayer().playLoop("gate_hauler_engine_loop", entity, 
130                                                                1f, soundVolume,
131                                                                entity.getLocation(), entity.getVelocity());
132                                }
133                        }
134                }
135                
136                if (isActivated()) {
137                        movement.advance(amount);
138                }
139        }
140
141        public void render(CampaignEngineLayers layer, ViewportAPI viewport) {
142                float alphaMult = viewport.getAlphaMult();
143                alphaMult *= entity.getSensorFaderBrightness(); 
144                alphaMult *= entity.getSensorContactFaderBrightness();
145                if (alphaMult <= 0f) return;
146                
147                engineGlow.render(alphaMult);
148        }
149        
150        public float getRenderRange() {
151                return entity.getRadius() + 3000f; // for engine glow/trails
152        }
153
154        public boolean isLongBurn() {
155                return longBurn;
156        }
157
158        public void setLongBurn(boolean longBurn) {
159                this.longBurn = longBurn;
160        }
161
162//      public void showAccelerating() {
163//              engineGlow.showAccelerating();
164//              acceleratedThisFrame = true;
165//      }
166//
167//      public void showIdling() {
168//              engineGlow.showIdling();
169//      }
170//
171//      public void showSuppressed() {
172//              engineGlow.showSuppressed();
173//      }
174//
175//      public void showOtherAction() {
176//              engineGlow.showOtherAction();           
177//      }
178        
179        
180
181}
182
183
184
185
186
187
188
189