Starsector API
Loading...
Searching...
No Matches
VortexLauncherEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.dweller;
2
3import java.util.List;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.combat.BaseEveryFrameCombatPlugin;
9import com.fs.starfarer.api.combat.CombatEngineAPI;
10import com.fs.starfarer.api.combat.CombatEntityAPI;
11import com.fs.starfarer.api.combat.CombatFleetManagerAPI;
12import com.fs.starfarer.api.combat.DamagingProjectileAPI;
13import com.fs.starfarer.api.combat.EveryFrameWeaponEffectPlugin;
14import com.fs.starfarer.api.combat.OnFireEffectPlugin;
15import com.fs.starfarer.api.combat.ShipAPI;
16import com.fs.starfarer.api.combat.WeaponAPI;
17import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
18import com.fs.starfarer.api.input.InputEventAPI;
19import com.fs.starfarer.api.util.Misc;
20import com.fs.starfarer.api.util.WeightedRandomPicker;
21
23
24 //public static String VORTEX_VARIANT = "shrouded_vortex_Churning";
25 public static String VORTEX_WING = "shrouded_vortex_wing";
26
27 public static float LAUNCH_ARC = 60f;
28
29 public static class DisturbShroudPlugin extends BaseEveryFrameCombatPlugin {
30 float elapsed = 0f;
31 float dur;
32 Vector2f dir;
33 DwellerShroud shroud;
34 int numMembers;
35 Vector2f offset;
36 CombatEntityAPI disturber;
37
38 public DisturbShroudPlugin(float dur, Vector2f dir, CombatEntityAPI disturber, Vector2f offset, DwellerShroud shroud, int numMembers) {
39 this.dur = dur;
40 this.dir = dir;
41 this.disturber = disturber;
42 this.offset = offset;
43 this.shroud = shroud;
44 this.numMembers = numMembers;
45 }
46
47 @Override
48 public void advance(float amount, List<InputEventAPI> events) {
49 if (Global.getCombatEngine().isPaused()) return;
50
51 elapsed += amount;
52 if (elapsed > dur) {
54 engine.removePlugin(this);
55 return;
56 }
57
58 Vector2f loc = Vector2f.add(shroud.getAttachedTo().getLocation(), offset, new Vector2f());
59
60 Vector2f useDir = dir;
61 if (disturber != null) {
62 useDir = new Vector2f(disturber.getVelocity());
63 useDir = Misc.normalise(useDir);
64 }
65
66 WeightedRandomPicker<SwarmMember> picker = shroud.getPicker(false, true, loc, 70f);
67 for (int i = 0; i < numMembers; i++) {
68 SwarmMember pick = picker.pickAndRemove();
69 if (pick == null) break;
70 float accel = ConvulsiveLungeSystemScript.PARTICLE_WINDUP_ACCEL * amount * 3f;
71 accel *= 1f + (float) Math.random();
72 pick.vel.x += useDir.x * accel;
73 pick.vel.y += useDir.y * accel;
74 }
75
76 }
77 }
78
80
81 }
82
83 @Override
84 public void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon) {
85 ShipAPI ship = weapon.getShip();
86 if (ship == null) return;
87
88 //weapon.setForceFireOneFrame(true);
89 }
90
91
92
93 public void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine) {
94
95 //FighterWingSpecAPI spec = Global.getSettings().getFighterWingSpec(ATTACK_SWARM_WING);
96
97 CombatFleetManagerAPI manager = engine.getFleetManager(projectile.getOwner());
99 // wing has size 1, so no other members besides the "leader"
100 // point is to spawn a ship but without it showing up in the deployment dialog etc
101 ShipAPI vortex = manager.spawnShipOrWing(VORTEX_WING,
102 projectile.getLocation(), projectile.getFacing(), 0f, null);
103 manager.setSuppressDeploymentMessages(false);
104
105 Vector2f takeoffVel = Misc.getUnitVectorAtDegreeAngle(
106 projectile.getFacing() + LAUNCH_ARC/2f - (float) Math.random() * LAUNCH_ARC);
107 float velMult = 1f;
108 if (Misc.getAngleDiff(projectile.getFacing(), weapon.getShip().getFacing()) > 150f) {
109 velMult = 0.5f;
110 }
111 takeoffVel.scale(vortex.getMaxSpeed() * velMult);
112
113 Vector2f.add(vortex.getVelocity(), takeoffVel, vortex.getVelocity());
114
116 if (shroud != null) {
117 shroud.custom1 = weapon.getShip();
118 }
119
120 DwellerShroud sourceShroud = DwellerShroud.getShroudFor(weapon.getShip());
121 if (sourceShroud != null) {
122
123 Vector2f dir = Misc.getUnitVectorAtDegreeAngle(projectile.getFacing());
124 Vector2f offset = Vector2f.sub(projectile.getLocation(), sourceShroud.getAttachedTo().getLocation(), new Vector2f());
126 new DisturbShroudPlugin(1f, dir, vortex, offset, sourceShroud,
127 (int) (sourceShroud.getNumMembersToMaintain() * 0.1f)));
128 //new DisturbShroudPlugin(1f, dir, offset, sourceShroud, 10));
129
130 }
131
132 engine.removeEntity(projectile);
133 }
134
135
136
137}
138
139
140
141
142
143
144
145
static CombatEngineAPI getCombatEngine()
Definition Global.java:69
static DwellerShroud getShroudFor(CombatEntityAPI entity)
void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon)
void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
WeightedRandomPicker< SwarmMember > getPicker(boolean preferNonFlashing, boolean preferNonPicked, Vector2f towards)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
Definition Misc.java:1196
static float getAngleDiff(float from, float to)
Definition Misc.java:1716
static Vector2f normalise(Vector2f v)
Definition Misc.java:1134
CombatFleetManagerAPI getFleetManager(FleetSide side)
void removeEntity(CombatEntityAPI entity)
void removePlugin(EveryFrameCombatPlugin plugin)
void addPlugin(EveryFrameCombatPlugin plugin)
ShipAPI spawnShipOrWing(String specId, Vector2f location, float facing)
void setSuppressDeploymentMessages(boolean suppressDeploymentMessages)