Starsector API
Loading...
Searching...
No Matches
AssayingRiftEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.dweller;
2
3import java.util.List;
4
5import java.awt.Color;
6
7import org.lwjgl.util.vector.Vector2f;
8
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.combat.CombatEngineAPI;
11import com.fs.starfarer.api.combat.CombatEntityAPI;
12import com.fs.starfarer.api.combat.DamagingProjectileAPI;
13import com.fs.starfarer.api.combat.EveryFrameWeaponEffectPlugin;
14import com.fs.starfarer.api.combat.MissileAIPlugin;
15import com.fs.starfarer.api.combat.MissileAPI;
16import com.fs.starfarer.api.combat.OnFireEffectPlugin;
17import com.fs.starfarer.api.combat.OnHitEffectPlugin;
18import com.fs.starfarer.api.combat.ShipAPI;
19import com.fs.starfarer.api.combat.WeaponAPI;
20import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI;
21import com.fs.starfarer.api.impl.campaign.ids.Tags;
22import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual.NEParams;
23import com.fs.starfarer.api.impl.combat.RiftCascadeEffect;
24import com.fs.starfarer.api.impl.combat.RiftCascadeMineExplosion;
25import com.fs.starfarer.api.impl.combat.RiftLanceEffect;
26import com.fs.starfarer.api.impl.combat.RiftTrailEffect;
27import com.fs.starfarer.api.input.InputEventAPI;
28import com.fs.starfarer.api.loading.MissileSpecAPI;
29import com.fs.starfarer.api.util.WeightedRandomPicker;
30
37
38
39 public static String HUNGERING_RIFT_HEAL_MULT_STAT = "hungering_rift_heal_mult_stat";
40 public static String HUNGERING_RIFT_HEAL_MOD_HUMAN_SHIPS = "hungering_rift_heal_mod";
41
42 public static float HEAL_AMOUNT = 1000f;
43
44 //public static float HITPOINTS_MULT_WHEN_BY_DWELLER_SHIP = 2f;
45
46 public static String ASSAYING_RIFT = "assaying_rift";
47
51 public static int MAX_RIFTS = 10;
52
53
54 public static class AssayingRiftCount {
55 int count = 0;
56 float totalElapsed = 0;
57
58 public void update() {
59 float elapsed = Global.getCombatEngine().getTotalElapsedTime(false);
60 if (totalElapsed >= elapsed) return;
61
62 totalElapsed = elapsed;
63
64 count = 0;
66 if (m.hasTag(ASSAYING_RIFT)) {
67 count++;
68 }
69 }
70 }
71 }
72
73
74 @Override
75 public void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon) {
76 if (weapon.getShip() != null && weapon.getShip().getHullSpec().hasTag(Tags.DWELLER)) {
77 return;
78 }
79
80 String key = "AssayingRiftSharedDataKey";
81 AssayingRiftCount data = (AssayingRiftCount) engine.getCustomData().get(key);
82 if (data == null) {
83 data = new AssayingRiftCount();
84 engine.getCustomData().put(key, data);
85 }
86
87 data.update();
88
89 boolean disable = data.count >= MAX_RIFTS;
90 weapon.setForceDisabled(disable);
91 }
92
93 public void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine) {
95 Object o = projectile.getWeapon().getSpec().getProjectileSpec();
96 if (o instanceof MissileSpecAPI) {
98 color = spec.getExplosionColor();
99 }
100
101 if (!shieldHit && target instanceof ShipAPI) {
102 ShipAPI targetShip = (ShipAPI) target;
103 ShipAPI source = projectile.getSource();
104
105// DwellerShroud shroud = DwellerShroud.getShroudFor(source);
106// if (shroud != null && source != null && !source.isHulk() && !targetShip.isHulk()) {
107// source.setHitpoints(Math.min(source.getMaxHitpoints(), source.getHitpoints() + HEAL_AMOUNT));
108// }
109
110 if (!targetShip.isHulk()) {
113 for (ShipAPI other : Global.getCombatEngine().getShips()) {
114 if (other.isHulk()) continue;
115 if (other.isFighter()) continue;
116 if (other.getOwner() != source.getOwner()) continue;
117
118 if (getHealMult(other) <= 0) continue;
119
120 DwellerShroud otherShroud = DwellerShroud.getShroudFor(source);
121 if (otherShroud == null) continue;
122
123 float missingHp = other.getMaxHitpoints() - other.getHitpoints();
124 if (missingHp < HEAL_AMOUNT * 0.7f && missingHp > 0f) {
125 healNeedLess.add(other, missingHp);
126 } else {
127 healTargets.add(other, missingHp);
128 }
129 }
130
131 ShipAPI toHeal = healTargets.pick();
132 if (toHeal == null) toHeal = healNeedLess.pick();
133 if (toHeal != null) {
134 float healAmount = HEAL_AMOUNT;
135 healAmount *= getHealMult(toHeal);
136 toHeal.setHitpoints(Math.min(toHeal.getMaxHitpoints(), toHeal.getHitpoints() + healAmount));
137 }
138 }
139 }
140
141 NEParams p = RiftCascadeMineExplosion.createStandardRiftParams(color, 15f);
142 p.fadeOut = 1f;
143 p.hitGlowSizeMult = 1f;
144 //p.invertForDarkening = NSProjEffect.STANDARD_RIFT_COLOR;
146
147 Vector2f vel = new Vector2f();
148 if (target != null) vel.set(target.getVelocity());
149 Global.getSoundPlayer().playSound("assaying_rift_explosion", 1f, 1f, point, vel);
150 }
151
152 public static float getHealMult(ShipAPI toHeal) {
155 return base;
156 }
157
158
159 public void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine) {
161 RiftTrailEffect trail = new RiftTrailEffect((MissileAPI) projectile, null) {
162 boolean exploded = false;
163 float elapsed = 0f;
164 @Override
165 public void advance(float amount, List<InputEventAPI> events) {
166 super.advance(amount, events);
167 proxAI.advance(amount);
168 if (!exploded && !missile.didDamage() && missile.wasRemoved()) {// !engine.isMissileAlive(missile)) {
169 onHit(missile, null, missile.getLocation(), false, null, engine);
170 exploded = true;
171 }
172
173// if (!exploded) {
174// elapsed += amount;
175// if (elapsed > 1f) {
176// float speedBonus = Math.min(100f, (elapsed - 1f) * 100f);
177// String id = "AssayingRiftSpeedBonus";
178// missile.getEngineStats().getMaxSpeed().modifyFlat(id, speedBonus);
179// missile.getEngineStats().getAcceleration().modifyFlat(id, speedBonus * 2f);
180// missile.getEngineStats().getDeceleration().modifyFlat(id, speedBonus * 2f);
181// missile.updateMaxSpeed();
182// }
183// }
184 }
185 protected Color getUndercolor() {
186 //return new Color(100, 0, 20, 255);
188 }
189 protected Color getDarkeningColor() {
190 return RiftLanceEffect.getColorForDarkening(getUndercolor());
191 }
192 @Override
193 protected float getBaseParticleDuration() {
194 return 1.5f;
195 }
196
197
198 };
199
200 MissileAPI missile = ((MissileAPI) projectile);
201
202 missile.setEmpResistance(1000);
203 missile.setEccmChanceOverride(1f);
204 missile.addTag(ASSAYING_RIFT);
205
206// if (weapon.getShip().getHullSpec().hasTag(Tags.DWELLER)) {
207// missile.setHitpoints(missile.getHitpoints() * HITPOINTS_MULT_WHEN_BY_DWELLER_SHIP);
208// }
209
211 }
212
213}
214
215
216
217
218
219
220
221
222
223
224
225
226
227
static SoundPlayerAPI getSoundPlayer()
Definition Global.java:49
static CombatEngineAPI getCombatEngine()
Definition Global.java:69
static void spawnStandardRift(DamagingProjectileAPI explosion, NEParams params)
static NEParams createStandardRiftParams(String minelayerId, float baseRadius)
void advance(float amount, List< InputEventAPI > events)
void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine)
void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon)
static DwellerShroud getShroudFor(CombatEntityAPI entity)
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)
float getTotalElapsedTime(boolean includePaused)
void addPlugin(EveryFrameCombatPlugin plugin)
MissileAIPlugin createProximityFuseAI(MissileAPI missile)
void setEccmChanceOverride(float eccmChanceOverride)
void setEmpResistance(int empResistance)
MutableShipStatsAPI getMutableStats()
void setForceDisabled(boolean forceDisabled)