1package com.fs.starfarer.api.impl.campaign.terrain;
3import java.util.EnumSet;
5import org.json.JSONArray;
6import org.json.JSONException;
7import org.json.JSONObject;
8import org.lwjgl.util.vector.Vector2f;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.CampaignEngineLayers;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.SectorEntityToken;
14import com.fs.starfarer.api.combat.ViewportAPI;
15import com.fs.starfarer.api.util.Misc;
19 public static class RadioChatterParams
extends RingParams {
20 public RadioChatterParams(
float bandWidthInEngine,
float middleRadius, SectorEntityToken relatedEntity) {
21 super(bandWidthInEngine, middleRadius, relatedEntity);
30 this.params = (RadioChatterParams) param;
36 layers = EnumSet.noneOf(CampaignEngineLayers.class);
40 Object writeReplace() {
44 transient private EnumSet<CampaignEngineLayers> layers = EnumSet.noneOf(CampaignEngineLayers.class);
51 public void render(CampaignEngineLayers layer, ViewportAPI viewport) {
55 protected transient float phase = 0f;
57 super.advance(amount);
59 float period = (float)Math.PI * 2f;
60 phase += period/10f * amount;
64 if (!
entity.isPlayerFleet())
return;
67 float volumeMult = prox;
68 float suppressionMult = prox;
69 if (volumeMult <= 0)
return;
70 volumeMult = (float) Math.sqrt(volumeMult);
75 float dirToEntity = Misc.getAngleInDegrees(
entity.getLocation(), this.entity.getLocation());
76 Vector2f playbackLoc = Misc.getUnitVectorAtDegreeAngle(dirToEntity);
77 playbackLoc.scale(500f);
78 Vector2f.add(
entity.getLocation(), playbackLoc, playbackLoc);
81 JSONArray sounds =
getSpec().getCustom().getJSONArray(
"chatter");
82 float num = sounds.length();
83 float period = (float)Math.PI * 2f;
91 for (
int i = 0; i < sounds.length(); i++) {
92 JSONObject sound = sounds.getJSONObject(i);
93 float threshold = (float) sound.getDouble(
"threshold");
94 float phaseMult = (float) sound.getDouble(
"phaseMult");
95 String soundId = sound.getString(
"sound");
102 float offset = period / num * (float) i;
104 float cos = (float) Math.cos(
phase * phaseMult + offset);
107 if (cos > threshold) {
108 volume = (cos - threshold) / (1f - threshold);
109 if (volume < 0) volume = 0;
110 if (volume > 1) volume = 1;
116 1f, volume * volumeMult,
117 playbackLoc, Misc.ZERO);
121 }
catch (JSONException e) {
129 float dist = Misc.getDistance(player.getLocation(),
entity.getLocation());
130 float radSum =
params.relatedEntity.getRadius() + player.getRadius();
135 float f = 1f - dist / Math.max(1, (
params.bandWidthInEngine -
params.relatedEntity.getRadius()));
148 return super.containsPoint(point, radius);
165 return "radio_chatter";
static SoundPlayerAPI getSoundPlayer()
static SectorAPI getSector()
void advance(float amount)
boolean canPlayerHoldStationIn()
void init(String terrainId, SectorEntityToken entity, Object param)
void render(CampaignEngineLayers layer, ViewportAPI viewport)
EnumSet< CampaignEngineLayers > getActiveLayers()
boolean containsPoint(Vector2f point, float radius)
float getExtraSoundRadius()
String getNameForTooltip()
void applyEffect(SectorEntityToken entity, float days)
float getProximitySoundFactor()
RadioChatterParams params
String getEffectCategory()
void playLoop(String id, Object playingEntity, float pitch, float volume, Vector2f loc, Vector2f vel)