Starsector API
Loading...
Searching...
No Matches
GravitonBeamEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat;
2
3import java.util.List;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.combat.BeamAPI;
8import com.fs.starfarer.api.combat.BeamEffectPlugin;
9import com.fs.starfarer.api.combat.CombatEngineAPI;
10import com.fs.starfarer.api.combat.CombatEntityAPI;
11import com.fs.starfarer.api.combat.DamageAPI;
12import com.fs.starfarer.api.combat.ShipAPI;
13import com.fs.starfarer.api.combat.WeaponAPI;
14import com.fs.starfarer.api.combat.listeners.AdvanceableListener;
15import com.fs.starfarer.api.util.TimeoutTracker;
16
17public class GravitonBeamEffect implements BeamEffectPlugin {
18
19 public static float EFFECT_DUR = 1f;
20
21 public static float DAMAGE_PERCENT_ONE = 5f;
22 public static float DAMAGE_PERCENT_TWO = 8f;
23 public static float DAMAGE_PERCENT_THREE = 10f;
24
25 protected boolean wasZero = true;
26
27
28 public void advance(float amount, CombatEngineAPI engine, BeamAPI beam) {
29 CombatEntityAPI target = beam.getDamageTarget();
30 if (target instanceof ShipAPI && beam.getBrightness() >= 1f && beam.getWeapon() != null) {
31 float dur = beam.getDamage().getDpsDuration();
32 // needed because when the ship is in fast-time, dpsDuration will not be reset every frame as it should be
33 if (!wasZero) dur = 0;
34 wasZero = beam.getDamage().getDpsDuration() <= 0;
35
36 // beam tick, apply damage modifier effect if needed
37 if (dur > 0) {
38 boolean hitShield = target.getShield() != null && target.getShield().isWithinArc(beam.getTo());
39 if (hitShield) {
40 ShipAPI ship = (ShipAPI) target;
41 if (!ship.hasListenerOfClass(GravitonBeamDamageTakenMod.class)) {
42 ship.addListener(new GravitonBeamDamageTakenMod(ship));
43 }
44 List<GravitonBeamDamageTakenMod> listeners = ship.getListeners(GravitonBeamDamageTakenMod.class);
45 if (listeners.isEmpty()) return; // ???
46
47 GravitonBeamDamageTakenMod listener = listeners.get(0);
48 listener.notifyHit(beam.getWeapon());
49 }
50 }
51 }
52 }
53
54
55 public static String DAMAGE_MOD_ID = "gravitonbeam_dam_mod";
56
57 public static class GravitonBeamDamageTakenMod implements AdvanceableListener {
58 //implements DamageTakenModifier, AdvanceableListener {
59 protected ShipAPI ship;
60 protected TimeoutTracker<WeaponAPI> recentHits = new TimeoutTracker<WeaponAPI>();
61 public GravitonBeamDamageTakenMod(ShipAPI ship) {
62 this.ship = ship;
63 //ship.addListener(new GravitonBeamDamageTakenModRemover(ship));
64 }
65
66 public void notifyHit(WeaponAPI w) {
67 recentHits.add(w, EFFECT_DUR, EFFECT_DUR);
68
69 }
70
71 public void advance(float amount) {
72 recentHits.advance(amount);
73
74 int beams = recentHits.getItems().size();
75
76 float bonus = 0;
77 if (beams == 1) {
78 bonus = DAMAGE_PERCENT_ONE;
79 } else if (beams == 2) {
80 bonus = DAMAGE_PERCENT_TWO;
81 } else if (beams >= 3) {
83 }
84
85 if (bonus > 0) {
86 ship.getMutableStats().getShieldDamageTakenMult().modifyMult(DAMAGE_MOD_ID, 1f + bonus * 0.01f);
87 } else {
88 ship.removeListener(this);
89 ship.getMutableStats().getShieldDamageTakenMult().unmodify(DAMAGE_MOD_ID);
90 }
91 }
92
93 public String modifyDamageTaken(Object param,
94 CombatEntityAPI target, DamageAPI damage,
95 Vector2f point, boolean shieldHit) {
96 return null;
97 }
98
99 }
100
101}
void advance(float amount, CombatEngineAPI engine, BeamAPI beam)