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