001package com.fs.starfarer.api.impl.campaign.terrain;
002
003import java.awt.Color;
004import java.util.EnumSet;
005
006import org.lwjgl.util.vector.Vector2f;
007
008import com.fs.starfarer.api.Global;
009import com.fs.starfarer.api.campaign.CampaignEngineLayers;
010import com.fs.starfarer.api.campaign.CampaignFleetAPI;
011import com.fs.starfarer.api.campaign.SectorEntityToken;
012import com.fs.starfarer.api.combat.ViewportAPI;
013import com.fs.starfarer.api.graphics.SpriteAPI;
014import com.fs.starfarer.api.impl.campaign.terrain.AuroraRenderer.AuroraRendererDelegate;
015
016public class SpatialAnomalyTerrainPlugin extends BaseRingTerrain implements AuroraRendererDelegate {
017        
018        public static class SpatialAnomalyParams extends RingParams {
019                public float dur;
020                public CampaignFleetAPI source;
021                public SpatialAnomalyParams(CampaignFleetAPI source, float dur, float bandWidthInEngine, SectorEntityToken relatedEntity) {
022                        super(bandWidthInEngine, bandWidthInEngine / 2f, relatedEntity);
023                        this.source = source;
024                        this.dur = dur;
025                }
026        }
027        
028        transient protected SpriteAPI texture = null;
029        protected SpatialAnomalyParams params;
030
031        protected float elapsed;
032        protected AuroraRenderer renderer;
033        
034        public void init(String terrainId, SectorEntityToken entity, Object param) {
035                super.init(terrainId, entity, param);
036                this.params = (SpatialAnomalyParams) param;
037                name = "Spatial Anomaly";
038        }
039        
040        @Override
041        protected Object readResolve() {
042                super.readResolve();
043                layers = EnumSet.of(CampaignEngineLayers.TERRAIN_7);
044                texture = Global.getSettings().getSprite("terrain", "aurora");
045                if (renderer == null) {
046                        renderer = new AuroraRenderer(this);
047                }
048                return this;
049        }
050        
051        Object writeReplace() {
052                return this;
053        }
054        
055        transient private EnumSet<CampaignEngineLayers> layers = EnumSet.noneOf(CampaignEngineLayers.class);
056        public EnumSet<CampaignEngineLayers> getActiveLayers() {
057                return layers;
058        }
059
060        protected transient float phase = 0f;
061        public void advance(float amount) {
062                super.advance(amount);
063                
064                float period = (float)Math.PI * 2f;
065                phase += period/10f * amount;
066                
067                float days = Global.getSector().getClock().convertToDays(amount);
068                elapsed +=  days;
069                if (elapsed >= 0.3f) params.source = null;
070                
071//              elapsed = 0.5f;
072                if (elapsed >= params.dur) {
073                        getEntity().setExpired(true);
074                }
075                
076                renderer.advance(amount);
077        }
078        
079        public void render(CampaignEngineLayers layer, ViewportAPI viewport) {
080                float alphaMult = viewport.getAlphaMult();
081                float left = params.dur - elapsed;
082                if (left < 0) left = 0;
083                if (left < 0.1f) {
084                        alphaMult *= left / 0.1f;
085                }
086                if (elapsed < 0.1f) {
087                        alphaMult *= elapsed / 0.1f;
088                }
089                
090                renderer.render(alphaMult);
091                
092//              GL11.glTranslatef(entity.getLocation().x, entity.getLocation().y, 0);
093//              
094//              
095//              float r = params.bandWidthInEngine;
096//              
097//              GL11.glDisable(GL11.GL_TEXTURE_2D);
098//              GL11.glEnable(GL11.GL_BLEND);
099//              GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
100//              Misc.renderQuad(-r, -r, r * 2f, r * 2f, Color.gray, alphaMult);
101//              
102//              GL11.glPopMatrix();
103        }
104        
105        
106        @Override
107        public void applyEffect(SectorEntityToken entity, float days) {
108                if (entity == params.source) return;
109                
110                if (entity instanceof CampaignFleetAPI) {
111                        CampaignFleetAPI fleet = (CampaignFleetAPI) entity;
112                        
113                        float penalty = 0.5f;
114                        fleet.getStats().addTemporaryModMult(0.1f, getModId() + "_1",
115                                                                "Inside " + getTerrainName().toLowerCase(), 1f - penalty, 
116                                                                fleet.getStats().getFleetwideMaxBurnMod());
117                }
118        }
119        
120        
121        @Override
122        public boolean containsPoint(Vector2f point, float radius) {
123                return super.containsPoint(point, radius);
124        }
125
126        public boolean hasTooltip() {
127                return false;
128        }
129        
130        public String getTerrainName() {
131                return super.getTerrainName();
132        }
133        
134        public String getNameForTooltip() {
135                return getTerrainName();
136        }
137        
138        public String getEffectCategory() {
139                return "spatial_anomaly";
140        }
141
142        public boolean canPlayerHoldStationIn() {
143                return false;
144        }
145
146        
147        
148        
149        public float getAuroraAlphaMultForAngle(float angle) {
150                return 1f;
151        }
152
153        public float getAuroraBandWidthInTexture() {
154                return 256f;
155        }
156
157        public RangeBlockerUtil getAuroraBlocker() {
158                return null;
159        }
160
161        public Vector2f getAuroraCenterLoc() {
162                return getEntity().getLocation();
163        }
164
165        public Color getAuroraColorForAngle(float angle) {
166                return new Color(255,165,100,255);
167        }
168
169        public float getAuroraInnerOffsetMult(float angle) {
170                return 1f;
171        }
172
173        public float getAuroraInnerRadius() {
174                //return params.bandWidthInEngine * 0.5f;
175                return 50f;
176        }
177
178        public float getAuroraOuterRadius() {
179                return params.bandWidthInEngine;
180        }
181
182        public float getAuroraShortenMult(float angle) {
183                return 0.5f;
184        }
185
186        public float getAuroraTexPerSegmentMult() {
187                return 1f;
188        }
189
190        public SpriteAPI getAuroraTexture() {
191                return texture;
192        }
193
194        public float getAuroraThicknessFlat(float angle) {
195                return 0;
196        }
197
198        public float getAuroraThicknessMult(float angle) {
199                return 1f;
200        }       
201        
202}