001package com.fs.starfarer.api.impl.campaign.terrain;
002
003import java.util.EnumSet;
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.CampaignFleetAPI;
010import com.fs.starfarer.api.campaign.SectorEntityToken;
011import com.fs.starfarer.api.combat.ViewportAPI;
012import com.fs.starfarer.api.util.Misc;
013
014/**
015 * No visuals - meant to be used in conjunction with the various LocationAPI.addRingBand() methods.
016 * 
017 * @author Alex Mosolov
018 *
019 * Copyright 2015 Fractal Softworks, LLC
020 */
021public abstract class BaseRingTerrain extends BaseTerrain {
022
023        public static class RingParams {
024                public float bandWidthInEngine;
025                public float middleRadius;
026                public SectorEntityToken relatedEntity;
027                public String name;
028                public RingParams(float bandWidthInEngine, float middleRadius,
029                                SectorEntityToken relatedEntity, String name) {
030                        this.bandWidthInEngine = bandWidthInEngine;
031                        this.middleRadius = middleRadius;
032                        this.relatedEntity = relatedEntity;
033                        this.name = name;
034                }
035                public RingParams(float bandWidthInEngine, float middleRadius,
036                                SectorEntityToken relatedEntity) {
037                        this(bandWidthInEngine, middleRadius, relatedEntity, null);
038                }
039                
040        }
041        
042        public RingParams params;
043        public void init(String terrainId, SectorEntityToken entity, Object param) {
044                super.init(terrainId, entity, param);
045                params = (RingParams) param;
046                readResolve();
047        }
048        
049        
050        @Override
051        public SectorEntityToken getRelatedEntity() {
052                return params.relatedEntity;
053        }
054
055        protected Object readResolve() {
056                layers = EnumSet.of(CampaignEngineLayers.TERRAIN_2);
057                return this;
058        }
059        
060        Object writeReplace() {
061                return this;
062        }
063        
064        transient protected EnumSet<CampaignEngineLayers> layers = EnumSet.of(CampaignEngineLayers.TERRAIN_2);
065        public EnumSet<CampaignEngineLayers> getActiveLayers() {
066                return layers;
067        }
068        
069        @Override
070        public boolean containsEntity(SectorEntityToken other) {
071                if (other.getContainingLocation() != this.entity.getContainingLocation()) return false;
072                return containsPoint(other.getLocation(), other.getRadius()) && !isPreventedFromAffecting(other);
073        }
074                
075        @Override
076        public boolean containsPoint(Vector2f point, float radius) {            
077                float dist = Misc.getDistance(this.entity.getLocation(), point);
078                if (dist > getMaxRadiusForContains() + radius) return false;
079                if (dist < getMinRadiusForContains() - radius) return false;
080                return true;
081        }
082        
083        protected float getMinRadiusForContains() {
084                return params.middleRadius - params.bandWidthInEngine / 2f;
085        }
086        
087        protected float getMaxRadiusForContains() {
088                return params.middleRadius + params.bandWidthInEngine / 2f;
089        }
090
091        public float getRenderRange() {
092                return params.middleRadius + params.bandWidthInEngine / 2f + 50f;
093        }
094        
095        public RingParams getRingParams() {
096                return params;
097        }
098
099        public float getProximitySoundFactor() {
100                float width = params.bandWidthInEngine / 2f + getExtraSoundRadius() + Global.getSector().getPlayerFleet().getRadius();
101                if (width <= 1f) return 1f;
102                
103                CampaignFleetAPI player = Global.getSector().getPlayerFleet();
104                float dist = Misc.getDistance(this.entity.getLocation(), player.getLocation());
105                float mid = params.middleRadius;
106                
107                float distFromMid = Math.abs(dist - mid);
108                if (dist < mid && params.middleRadius - params.bandWidthInEngine / 2f < getExtraSoundRadius()) {
109                        distFromMid = 0f;
110                }
111                if (distFromMid < width * 0.5f) return 1f;
112                return (width - distFromMid) / (width * 0.5f); 
113        }
114        
115        public void render(CampaignEngineLayers layer, ViewportAPI v) {
116        }
117        
118        public void renderOnMap(float factor, float alphaMult) {
119        }
120
121        public void renderOnMapAbove(float factor, float alphaMult) {
122        }
123        
124        public float getMaxEffectRadius(Vector2f locFrom) {
125                return params.middleRadius + params.bandWidthInEngine / 2f;
126        }
127        public float getMinEffectRadius(Vector2f locFrom) {
128                return params.middleRadius - params.bandWidthInEngine / 2f;
129        }
130        
131        public float getOptimalEffectRadius(Vector2f locFrom) {
132                return params.middleRadius;
133        }
134        
135        public String getNameAOrAn() {
136                if (getTerrainName() != null) {
137                        return Misc.getAOrAnFor(getTerrainName());
138                }
139                return "a";
140        }
141}
142
143
144
145
146
147
148