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}