Starsector API
Loading...
Searching...
No Matches
PseudoparticleJetEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.dweller;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import java.awt.Color;
7
8import org.lwjgl.opengl.GL11;
9import org.lwjgl.opengl.GL14;
10import org.lwjgl.util.vector.Vector2f;
11
12import com.fs.starfarer.api.Global;
13import com.fs.starfarer.api.combat.CombatEngineAPI;
14import com.fs.starfarer.api.combat.CombatEngineLayers;
15import com.fs.starfarer.api.combat.CombatEntityAPI;
16import com.fs.starfarer.api.combat.DamagingProjectileAPI;
17import com.fs.starfarer.api.combat.ShipAPI;
18import com.fs.starfarer.api.combat.ViewportAPI;
19import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI;
20import com.fs.starfarer.api.impl.combat.CryofluxTransducerEffect;
21import com.fs.starfarer.api.impl.combat.RiftLanceEffect;
22import com.fs.starfarer.api.util.IntervalUtil;
23import com.fs.starfarer.api.util.Misc;
24
26
27 public static float PARTICLE_SCALE_MULT = 0.7f;
28
29 protected IntervalUtil interval = new IntervalUtil(0.075f, 0.125f);
30 protected List<ParticleData> negativeParticles = new ArrayList<>();
31
33 super();
34 }
35
37 super(projectile, prev);
38
39 int num = 2;
40 num = 1;
41 for (int i = 0; i < num; i++) {
42 negativeParticles.add(new ParticleData(proj, this));
43 }
44
45 //PARTICLE_SCALE_MULT = 0.7f;
46
47 float size = proj.getProjectileSpec().getWidth() * 0.6f;
48
49 for (ParticleData p : negativeParticles) {
50 p.sprite = Global.getSettings().getSprite(super.getParticleSpriteCat(), super.getParticleSpriteKey());
51 float i = Misc.random.nextInt(4);
52 float j = Misc.random.nextInt(4);
53 p.sprite.setTexWidth(0.25f);
54 p.sprite.setTexHeight(0.25f);
55 p.sprite.setTexX(i * 0.25f);
56 p.sprite.setTexY(j * 0.25f);
57
58 p.scale = 2f + (float) Math.random();
59 p.scale *= 1.5f; // 1 particle instead of 2
60 p.scale *= PARTICLE_SCALE_MULT;
61 p.scaleIncreaseRate *= 1f + (float) Math.random();
62
63 Vector2f v = Misc.getUnitVectorAtDegreeAngle((float) Math.random() * 360f);
64 v.scale(size + size * (float) Math.random() * 0.5f);
65 v.scale(0.67f * p.scale);
66 p.vel.set(v);
67 //Vector2f.add(vel, v, v);
68
69// p.fader.setDuration(0.25f, 0.75f);
70// p.fader.setBounceDown(true);
71
72// float f = index / Math.max(1f, (negativeParticles.size() - 1));
73// Vector2f dir = Misc.getUnitVectorAtDegreeAngle(proj.getFacing() + 180f);
74// dir.scale(length * f);
75// Vector2f.add(p.offset, dir, p.offset);
76
77 //p.offset = Misc.getPointWithinRadius(p.offset, width * 0.5f);
78 p.offset = Misc.getPointWithinRadiusUniform(p.offset, size * 0.1f * p.scale, Misc.random);
79
80 float offsetAngle = Misc.getAngleInDegrees(p.vel) + 180f;
81 offsetAngle += 90f * ((float) Math.random() - 0.5f);
82 p.offset = Misc.getUnitVectorAtDegreeAngle(offsetAngle);
83 p.offset.scale(size * 1f * p.scale);
84
85 //p.scale *= 1.5f;
86 p.scale *= 0.7f;
87
88 // don't apply scale increase to negative particles or they cover up too much
89 p.scaleIncreaseRate /= getParticleScaleIncreaseRateMult();
90
91 //p.scale = 0.25f + 0.75f * (1 - f);
92 }
93 }
94
98
99
100 public void advance(float amount) {
101 super.advance(amount);
102
103 if (Global.getCombatEngine().isPaused()) return;
104
105 for (ParticleData p : negativeParticles) {
106 p.advance(amount);
107 }
108 }
109
110
111 @Override
113 super.render(layer, viewport);
114 //if (true) return;
115 float x = entity.getLocation().x;
116 float y = entity.getLocation().y;
117
118
120 color = Misc.setAlpha(color, 100);
121
122 float b = proj.getBrightness();
123 b *= viewport.getAlphaMult();
124
125 GL14.glBlendEquation(GL14.GL_FUNC_REVERSE_SUBTRACT);
126
127 for (ParticleData p : negativeParticles) {
128 float size = proj.getProjectileSpec().getWidth() * 0.6f;
129 size *= p.scale;
130
131 float alphaMult = 1f;
132 Vector2f offset = p.offset;
133 float diff = Misc.getAngleDiff(baseFacing, proj.getFacing());
134 if (Math.abs(diff) > 0.1f) {
135 offset = Misc.rotateAroundOrigin(offset, diff);
136 }
137 Vector2f loc = new Vector2f(x + offset.x, y + offset.y);
138
139 p.sprite.setBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
140 p.sprite.setAngle(p.angle);
141 p.sprite.setSize(size, size);
142 p.sprite.setAlphaMult(b * alphaMult * p.fader.getBrightness());
143 p.sprite.setColor(color);
144 p.sprite.renderAtCenter(loc.x, loc.y);
145 }
146
147 GL14.glBlendEquation(GL14.GL_FUNC_ADD);
148 }
149
150
151
152 public void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine) {
153 super.onHit(projectile, target, point, shieldHit, damageResult, engine);
154
156 c = Misc.setAlpha(c, 100);
157 float baseDuration = 1f;
158 float baseSize = projectile.getProjectileSpec().getLength() * 0.5f;
159 float size = baseSize * 1.5f;
160 float sizeMult = Misc.getHitGlowSize(100f, projectile.getDamage().getBaseDamage(), damageResult) / 100f;
161 size *= sizeMult;
162
163 size *= 1.5f;
164
165 float extraDur = 0f;
166
167 point = Misc.getPointWithinRadiusUniform(point, baseSize * 0.75f, Misc.random);
168 float dur = baseDuration + baseDuration * (float) Math.random();
169 dur += extraDur;
170 float nSize = size;
171 Vector2f pt = point;
172
173 Vector2f vel = new Vector2f();
174 if (target instanceof ShipAPI) {
175 vel.set(target.getVelocity());
176 }
177
178 Vector2f v = Misc.getUnitVectorAtDegreeAngle((float) Math.random() * 360f);
179 v.scale(nSize + nSize * (float) Math.random() * 0.5f);
180 v.scale(0.5f);
181 Vector2f.add(vel, v, v);
182
183 float maxSpeed = nSize * 1.5f * 0.2f;
184 float minSpeed = nSize * 1f * 0.2f;
185 float overMin = v.length() - minSpeed;
186 if (overMin > 0) {
187 float durMult = 1f - overMin / (maxSpeed - minSpeed);
188 if (durMult < 0.1f) durMult = 0.1f;
189 dur *= 0.5f + 0.5f * durMult;
190 }
191
192 engine.addNegativeNebulaParticle(pt, v, nSize * 1f, 2f,
193 0.25f / dur, 0f, dur, c);
194 }
195
196
197 protected String getParticleSpriteCat() {
198 return "dweller";
199 }
200 protected String getParticleSpriteKey() {
201 return "dweller_pieces";
202 }
203 protected float getParticleScale() {
204 return 2.5f * PARTICLE_SCALE_MULT;
205 }
207 return 1.5f;
208 }
209 protected int getNumParticles() {
210 return 2;
211 }
212 public Color getParticleColor() {
213 Color color = proj.getProjectileSpec().getFringeColor();
214 color = Misc.setAlpha(color, 75);
215 return color;
216 }
217
218 protected String getLoopId() {
219 return "pseudoparticle_jet_loop";
220 }
221 protected float getThresholdDist() {
222 //return 50f;
223 return super.getThresholdDist();
224 }
225
226 protected void playImpactSound(ApplyDamageResultAPI damageResult, Vector2f point, Vector2f vel) {
227 Misc.playSound(damageResult, point, vel,
228 "pseudoparticle_jet_hit_shield_light",
229 "pseudoparticle_jet_hit_shield_solid",
230 "pseudoparticle_jet_hit_shield_heavy",
231 "pseudoparticle_jet_hit_light",
232 "pseudoparticle_jet_hit_solid",
233 "pseudoparticle_jet_hit_heavy");
234 }
235}
static SettingsAPI getSettings()
Definition Global.java:57
static CombatEngineAPI getCombatEngine()
Definition Global.java:69
PseudoparticleJetEffect(DamagingProjectileAPI projectile, DamagingProjectileAPI prev)
PseudoparticleJetEffect createTrail(DamagingProjectileAPI projectile, DamagingProjectileAPI prev)
void render(CombatEngineLayers layer, ViewportAPI viewport)
void playImpactSound(ApplyDamageResultAPI damageResult, Vector2f point, Vector2f vel)
void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine)
static void playSound(ApplyDamageResultAPI result, Vector2f loc, Vector2f vel, String lightShields, String solidShields, String heavyShields, String lightHull, String solidHull, String heavyHull)
Definition Misc.java:6036
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
Definition Misc.java:1196
static Color setAlpha(Color color, int alpha)
Definition Misc.java:1316
static Vector2f rotateAroundOrigin(Vector2f v, float angle)
Definition Misc.java:1205
static float getHitGlowSize(float baseSize, float baseDamage, ApplyDamageResultAPI result)
Definition Misc.java:5353
static float getAngleDiff(float from, float to)
Definition Misc.java:1716
static Vector2f getPointWithinRadiusUniform(Vector2f from, float r, Random random)
Definition Misc.java:722
static float getAngleInDegrees(Vector2f v)
Definition Misc.java:1126
SpriteAPI getSprite(String filename)
void addNegativeNebulaParticle(Vector2f loc, Vector2f vel, float size, float endSizeMult, float rampUpFraction, float fullBrightnessFraction, float totalDuration, Color color)