31 public static Map<String, String>
FIGMENTS =
new HashMap<String, String>();
33 FIGMENTS.put(
"shard_left_Attack",
"shard_right_Attack");
34 FIGMENTS.put(
"shard_left_Attack2",
"shard_right_Attack");
35 FIGMENTS.put(
"shard_right_Attack",
"shard_left_Attack");
36 FIGMENTS.put(
"shard_left_Armorbreaker",
"shard_right_Attack");
37 FIGMENTS.put(
"shard_left_Shieldbreaker",
"shard_right_Shieldbreaker");
38 FIGMENTS.put(
"shard_right_Shieldbreaker",
"shard_left_Shieldbreaker");
39 FIGMENTS.put(
"shard_left_Defense",
"shard_right_Shock");
40 FIGMENTS.put(
"shard_right_Shock",
"shard_left_Defense");
41 FIGMENTS.put(
"shard_left_Missile",
"shard_right_Missile");
42 FIGMENTS.put(
"shard_right_Missile",
"shard_left_Missile");
45 public static final Color
JITTER_COLOR = ShardSpawner.JITTER_COLOR;
55 String variant =
FIGMENTS.get(ship.getVariant().getHullVariantId());
56 if (ship.getVariant().getOriginalVariant() !=
null && variant ==
null) {
57 variant =
FIGMENTS.get(ship.getVariant().getOriginalVariant());
59 if (variant !=
null && variant.contains(
"_left")) {
65 public void apply(MutableShipStatsAPI stats, String
id, State state,
float effectLevel) {
68 if (stats.getEntity() instanceof ShipAPI) {
69 ship = (ShipAPI) stats.getEntity();
75 float jitterLevel = effectLevel;
76 if (state == State.OUT) {
77 jitterLevel *= jitterLevel;
79 float maxRangeBonus = 25f;
80 float jitterRangeBonus = jitterLevel * maxRangeBonus;
81 if (state == State.OUT) {
84 ship.setJitterUnder(
this,
JITTER_UNDER_COLOR, jitterLevel, 11, 0f, 3f + jitterRangeBonus);
85 ship.setJitter(
this,
JITTER_COLOR, jitterLevel, 4, 0f, 0 + jitterRangeBonus);
87 if (state == State.IN) {
88 }
else if (effectLevel >= 1) {
89 String variant =
FIGMENTS.get(ship.getVariant().getHullVariantId());
90 if (ship.getVariant().getOriginalVariant() !=
null && variant ==
null) {
91 variant =
FIGMENTS.get(ship.getVariant().getOriginalVariant());
93 if (variant !=
null) {
95 float dist = ship.getCollisionRadius() * 1.25f;
96 Vector2f loc = Misc.getUnitVectorAtDegreeAngle(ship.getFacing() + angle);
98 Vector2f.add(loc, ship.getLocation(), loc);
99 if (isLocationClear(ship, loc, dist / 2f)) {
100 FigmentPlugin figment =
new FigmentPlugin(variant, ship, 1f, 20f, loc);
104 }
else if (state == State.OUT ) {
109 public void unapply(MutableShipStatsAPI stats, String
id) {
113 private boolean isLocationClear(ShipAPI ship, Vector2f loc,
float minDist) {
114 for (ShipAPI other :
Global.getCombatEngine().getShips()) {
115 if (other.isShuttlePod())
continue;
116 if (other.isFighter())
continue;
117 if (other == ship)
continue;
119 Vector2f otherLoc = other.getShieldCenterEvenIfNoShield();
120 float otherR = other.getShieldRadiusEvenIfNoShield();
123 float dist = Misc.getDistance(loc, otherLoc);
125 if (dist < r + minDist) {
129 for (CombatEntityAPI other :
Global.getCombatEngine().getAsteroids()) {
130 float dist = Misc.getDistance(loc, other.getLocation());
131 if (dist < other.getCollisionRadius() + minDist) {
139 public static class FigmentDamageListener
implements DamageListener {
140 public FigmentPlugin plugin;
141 public FigmentDamageListener(FigmentPlugin plugin) {
142 this.plugin = plugin;
145 public void reportDamageApplied(Object source, CombatEntityAPI target, ApplyDamageResultAPI result) {
146 float totalDamage = result.getDamageToHull() + result.getDamageToShields() + result.getTotalDamageToArmor();
149 if (result.isDps()) max = 0.1f;
150 plugin.recentHits += Math.min(max, totalDamage / 10f);
153 public static class FigmentPlugin
extends BaseEveryFrameCombatPlugin {
155 ShipAPI [] ships =
null;
156 CollisionClass collisionClass;
164 boolean finishedFadingIn =
false;
166 float recentHits = 0f;
168 public FigmentPlugin(String variantId, ShipAPI source,
float fadeInTime,
float dur, Vector2f loc) {
169 this.variantId = variantId;
170 this.source = source;
171 this.fadeInTime = fadeInTime;
178 public void advance(
float amount, List<InputEventAPI> events) {
179 if (Global.getCombatEngine().isPaused())
return;
183 CombatEngineAPI engine = Global.getCombatEngine();
186 float facing = source.getFacing() + 15f * ((float) Math.random() - 0.5f);
187 CombatFleetManagerAPI fleetManager = engine.getFleetManager(source.getOriginalOwner());
188 boolean wasSuppressed = fleetManager.isSuppressDeploymentMessages();
189 fleetManager.setSuppressDeploymentMessages(
true);
190 if (variantId.endsWith(
"_wing")) {
191 FighterWingSpecAPI spec = Global.getSettings().getFighterWingSpec(variantId);
192 ships =
new ShipAPI[spec.getNumFighters()];
193 PersonAPI captain = Global.getSettings().createPerson();
194 captain.setPersonality(Personalities.RECKLESS);
195 captain.getStats().setSkillLevel(Skills.POINT_DEFENSE, 2);
196 captain.getStats().setSkillLevel(Skills.GUNNERY_IMPLANTS, 2);
197 captain.getStats().setSkillLevel(Skills.IMPACT_MITIGATION, 2);
198 ShipAPI leader = engine.getFleetManager(source.getOriginalOwner()).spawnShipOrWing(variantId, loc, facing, 0f, captain);
199 for (
int i = 0; i < ships.length; i++) {
200 ships[i] = leader.getWing().getWingMembers().get(i);
201 ships[i].getLocation().set(loc);
203 collisionClass = ships[0].getCollisionClass();
205 ships =
new ShipAPI[1];
206 ships[0] = engine.getFleetManager(source.getOriginalOwner()).spawnShipOrWing(variantId, loc, facing, 0f, source.getOriginalCaptain());
208 fleetManager.setSuppressDeploymentMessages(wasSuppressed);
209 collisionClass = ships[0].getCollisionClass();
213 float progress = elapsed / fadeInTime;
215 float maxAlpha = 0.67f;
216 if (progress <= 1f) {
217 for (
int i = 0; i < ships.length; i++) {
218 ShipAPI ship = ships[i];
219 ship.setAlphaMult(progress * maxAlpha);
221 if (progress < 0.5f) {
222 ship.blockCommandForOneFrame(ShipCommand.ACCELERATE);
223 ship.blockCommandForOneFrame(ShipCommand.TURN_LEFT);
224 ship.blockCommandForOneFrame(ShipCommand.TURN_RIGHT);
225 ship.blockCommandForOneFrame(ShipCommand.STRAFE_LEFT);
226 ship.blockCommandForOneFrame(ShipCommand.STRAFE_RIGHT);
229 ship.blockCommandForOneFrame(ShipCommand.USE_SYSTEM);
230 ship.blockCommandForOneFrame(ShipCommand.TOGGLE_SHIELD_OR_PHASE_CLOAK);
231 ship.blockCommandForOneFrame(ShipCommand.FIRE);
232 ship.blockCommandForOneFrame(ShipCommand.PULL_BACK_FIGHTERS);
233 ship.blockCommandForOneFrame(ShipCommand.VENT_FLUX);
234 ship.setHoldFireOneFrame(
true);
235 ship.setHoldFire(
true);
238 ship.setCollisionClass(CollisionClass.NONE);
239 ship.getMutableStats().getHullDamageTakenMult().modifyMult(
"FigmentInvuln", 0f);
240 if (progress < 0.5f) {
241 ship.getVelocity().set(source.getVelocity());
242 }
else if (progress > 0.75f){
243 ship.setCollisionClass(collisionClass);
244 ship.getMutableStats().getHullDamageTakenMult().unmodifyMult(
"FigmentInvuln");
247 float jitterLevel = progress;
254 float jitterRange = 1f - progress * 0.5f;
255 float maxRangeBonus = 50f;
256 maxRangeBonus -= 30f * progress;
257 float jitterRangeBonus = jitterRange * maxRangeBonus;
259 float num = 18f * (1f - progress * progress) + 7f;
261 ship.setJitter(
this, c, jitterLevel, (
int)Math.round(num), 0f, jitterRangeBonus);
265 if (elapsed > fadeInTime && !finishedFadingIn) {
266 for (
int i = 0; i < ships.length; i++) {
267 ShipAPI ship = ships[i];
268 ship.setAlphaMult(maxAlpha);
269 ship.setHoldFire(
false);
270 ship.setCollisionClass(collisionClass);
271 ship.getMutableStats().getHullDamageTakenMult().unmodifyMult(
"FigmentInvuln");
274 ship.getMutableStats().getHullDamageTakenMult().modifyMult(
"FigmentExtraDamage",
DAMAGE_TAKEN_MULT);
275 ship.getMutableStats().getShieldDamageTakenMult().modifyMult(
"FigmentExtraDamage",
DAMAGE_TAKEN_MULT);
276 ship.getMutableStats().getArmorDamageTakenMult().modifyMult(
"FigmentExtraDamage",
DAMAGE_TAKEN_MULT);
278 ship.addListener(
new FigmentDamageListener(
this));
280 finishedFadingIn =
true;
283 if (elapsed > fadeInTime) {
284 for (
int i = 0; i < ships.length; i++) {
285 ShipAPI ship = ships[i];
287 if (!ship.isAlive() || !engine.isInPlay(ship)) {
288 engine.removePlugin(
this);
292 ship.setAlphaMult(maxAlpha);
293 ship.blockCommandForOneFrame(ShipCommand.USE_SYSTEM);
294 ship.blockCommandForOneFrame(ShipCommand.TOGGLE_SHIELD_OR_PHASE_CLOAK);
298 float minus = recentHits * amount * 2f;
299 minus += 0.1f * amount;
301 if (recentHits < 0) recentHits = 0;
302 if (recentHits > 5f) recentHits = 5f;
304 float jitterLevel = 1f;
305 float jitterRange = 0.5f;
306 float maxRangeBonus = 50f;
308 maxRangeBonus += recentHits * 40f;
309 float jitterRangeBonus = jitterRange * maxRangeBonus;
312 float numCopies = 7f;
313 numCopies += recentHits * 2f;
315 ship.setJitter(
this, c, jitterLevel, (
int) Math.round(numCopies), 0f, jitterRangeBonus);