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}