001package com.fs.starfarer.api.impl.campaign.terrain;
002
003import java.awt.Color;
004
005import com.fs.starfarer.api.Global;
006import com.fs.starfarer.api.campaign.CampaignEngineLayers;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.PlanetAPI;
009import com.fs.starfarer.api.campaign.SectorEntityToken;
010import com.fs.starfarer.api.campaign.TerrainAIFlags;
011import com.fs.starfarer.api.combat.ViewportAPI;
012import com.fs.starfarer.api.loading.Description.Type;
013import com.fs.starfarer.api.ui.Alignment;
014import com.fs.starfarer.api.ui.TooltipMakerAPI;
015import com.fs.starfarer.api.util.Misc;
016
017public class RingSystemTerrainPlugin extends BaseRingTerrain {
018        private static float VISIBLITY_MULT = 0.25f;
019        private static float VISIBLITY_MULT_NPC = 0.5f;
020        
021        public static float getVisibilityMult(CampaignFleetAPI fleet) {
022                if (fleet != null && fleet.isPlayerFleet()) {
023                        return VISIBLITY_MULT;
024                }
025                return VISIBLITY_MULT_NPC;
026        }
027        
028        public void init(String terrainId, SectorEntityToken entity, Object param) {
029                super.init(terrainId, entity, param);
030                name = params.name;
031                if (name == null) {
032                        name = "Ring System";
033                }
034        }
035        
036        private transient RingRenderer rr;
037        public void renderOnMap(float factor, float alphaMult) {
038                if (params == null) return;
039                if (rr == null) {
040                        rr = new RingRenderer("systemMap", "map_ring");
041                }
042                //Color color = new Color(175, 175, 105, 255);
043                Color color = Global.getSettings().getColor("ringSystemMapColor");
044                if (entity.getOrbitFocus() instanceof PlanetAPI) {
045                        PlanetAPI planet = (PlanetAPI) entity.getOrbitFocus();
046                        //color = Misc.interpolateColor(color, planet.getSpec().getIconColor(), 0.5f);
047                }
048                boolean spiral = params.bandWidthInEngine / 2f + 10f >= params.middleRadius;
049                rr.render(entity.getLocation(),
050                                  params.middleRadius - params.bandWidthInEngine * 0.5f,
051                                  params.middleRadius + params.bandWidthInEngine * 0.5f,
052                                  color,
053                                  spiral, factor, alphaMult);
054        }
055        
056        
057        
058        public void advance(float amount) {
059                super.advance(amount);
060        }
061                
062
063        public void render(CampaignEngineLayers layer, ViewportAPI viewport) {
064                super.render(layer, viewport);
065        }
066
067        @Override
068        public void applyEffect(SectorEntityToken entity, float days) {
069                if (entity instanceof CampaignFleetAPI) {
070                        CampaignFleetAPI fleet = (CampaignFleetAPI) entity;
071                        //if (fleet.getCurrBurnLevel() <= MAX_SNEAK_BURN_LEVEL) {
072                        if (Misc.isSlowMoving(fleet)) {
073                                fleet.getStats().addTemporaryModMult(0.1f, getModId() + "_1",
074                                                                        "Hiding inside ring system", getVisibilityMult(fleet), 
075                                                                        fleet.getStats().getDetectedRangeMod());
076                        }
077                }
078        }
079
080        public boolean hasTooltip() {
081                return true;
082        }
083
084        private String nameForTooltip = null;
085        public String getNameForTooltip() {
086                if (nameForTooltip == null) return "Ring System";
087                return nameForTooltip;
088        }
089
090        public void setNameForTooltip(String nameForTooltip) {
091                this.nameForTooltip = nameForTooltip;
092        }
093
094        public void createTooltip(TooltipMakerAPI tooltip, boolean expanded) {
095                float pad = 10f;
096                float small = 5f;
097                Color gray = Misc.getGrayColor();
098                Color highlight = Misc.getHighlightColor();
099                Color fuel = Global.getSettings().getColor("progressBarFuelColor");
100                Color bad = Misc.getNegativeHighlightColor();
101                
102                tooltip.addTitle(getNameForTooltip());
103                tooltip.addPara(Global.getSettings().getDescription(getTerrainId(), Type.TERRAIN).getText1(), pad);
104                float nextPad = pad;
105                if (expanded) {
106                        tooltip.addSectionHeading("Travel", Alignment.MID, pad);
107                        nextPad = small;
108                }
109//              tooltip.addPara("Reduces the range at which stationary fleets inside it can be detected by %s.", nextPad,
110//                              highlight, 
111//                              "" + (int) ((1f - VISIBLITY_MULT) * 100) + "%"
112//              );
113                String stop = Global.getSettings().getControlStringForEnumName("GO_SLOW");
114                tooltip.addPara("Reduces the range at which stationary or slow-moving* fleets inside it can be detected by %s.", nextPad,
115                                highlight, 
116                                "" + (int) ((1f - VISIBLITY_MULT) * 100) + "%"
117                );
118                tooltip.addPara("*Press and hold %s to stop; combine with holding the left mouse button down to move slowly.", nextPad,
119                                Misc.getGrayColor(), highlight, 
120                                stop
121                );
122                
123                if (expanded) {
124                        tooltip.addSectionHeading("Combat", Alignment.MID, pad);
125                        tooltip.addPara("Numerous small bodies that make up the ring system present on the battlefield. Not large enough to be an in-combat navigational hazard.", small);
126                }
127                //tooltip.addPara("Does not stack with other similar terrain effects.", pad);
128        }
129        
130        public boolean isTooltipExpandable() {
131                return true;
132        }
133        
134        public float getTooltipWidth() {
135                return 350f;
136        }
137        
138        public String getEffectCategory() {
139                return "ringsystem-like";
140        }
141        
142        public boolean hasAIFlag(Object flag) {
143                return flag == TerrainAIFlags.HIDING_STATIONARY;
144        }
145}