130 public void init(SectorEntityToken
entity, Object pluginParams) {
131 super.init(
entity, pluginParams);
134 params = (ExplosionParams) pluginParams;
137 if (
params.where.isCurrentLocation()) {
141 float baseSize = params.radius * 0.08f;
144 float fullArea = (float) (Math.PI *
params.radius *
params.radius);
145 float particleArea = (float) (Math.PI * baseSize * baseSize);
147 int count = (int) Math.round(fullArea / particleArea * 1f);
150 durMult =
params.durationMult;
153 for (
int i = 0; i < count; i++) {
154 float size = baseSize * (1f + (float) Math.random());
156 Color randomColor =
new Color(Misc.random.nextInt(256),
157 Misc.random.nextInt(256), Misc.random.nextInt(256),
params.color.getAlpha());
158 Color adjustedColor = Misc.interpolateColor(
params.color, randomColor, 0.2f);
159 adjustedColor =
params.color;
160 ParticleData data =
new ParticleData(adjustedColor, size,
161 (0.25f + (
float) Math.random()) * 2f * durMult, 3f);
163 float r = (float) Math.random();
164 float dist = params.radius * 0.2f * (0.1f + r * 0.9f);
165 float dir = (float) Math.random() * 360f;
166 data.setOffset(dir, dist, dist);
168 dir = Misc.getAngleInDegrees(data.offset);
172 data.swImpact = (float) Math.random();
173 if (i > count / 2) data.swImpact = 1;
178 Vector2f loc =
new Vector2f(
params.loc);
179 loc.x -= params.radius * 0.01f;
180 loc.y += params.radius * 0.01f;
183 params.where.addHitParticle(loc,
new Vector2f(),
params.radius * 1f, b, 1f * durMult,
params.color);
184 loc =
new Vector2f(
params.loc);
185 params.where.addHitParticle(loc,
new Vector2f(),
params.radius * 0.4f, 0.5f, 1f * durMult, Color.white);
312 if (
params.damage ==
null ||
params.damage == ExplosionFleetDamage.NONE) {
316 float shockwaveDist = 0f;
318 shockwaveDist = Math.max(shockwaveDist, p.offset.length());
321 for (CampaignFleetAPI fleet :
entity.getContainingLocation().getFleets()) {
322 String
id = fleet.getId();
324 float dist = Misc.getDistance(fleet,
entity);
325 if (dist < shockwaveDist) {
326 float damageMult = 1f - (dist /
params.radius);
327 if (damageMult > 1f) damageMult = 1f;
328 if (damageMult < 0.1f) damageMult = 0.1f;
329 if (dist <
entity.getRadius() + params.radius * 0.1f) damageMult = 1f;
340 List<FleetMemberAPI> members = fleet.getFleetData().getMembersListCopy();
341 if (members.isEmpty())
return;
343 float totalValue = 0;
344 for (FleetMemberAPI member : members) {
345 totalValue += member.getStats().getSuppliesToRecover().getModifiedValue();
347 if (totalValue <= 0)
return;
350 float damageFraction = 0f;
355 damageFraction = 0.1f;
358 damageFraction = 0.3f;
361 damageFraction = 0.6f;
364 damageFraction = 0.9f;
368 damageFraction *= damageMult;
370 float shoveDir = Misc.getAngleInDegrees(
entity.getLocation(), fleet.getLocation());
371 fleet.addScript(
new ShoveFleetScript(fleet, shoveDir, damageFraction));
373 if (fleet.isInCurrentLocation()) {
374 float dist = Misc.getDistance(fleet,
Global.
getSector().getPlayerFleet());
375 if (dist < HyperspaceTerrainPlugin.STORM_STRIKE_SOUND_RANGE) {
376 float volumeMult = 0.5f + 0.5f * damageFraction;
383 WeightedRandomPicker<FleetMemberAPI> picker =
new WeightedRandomPicker<FleetMemberAPI>();
384 for (FleetMemberAPI member : members) {
386 if (member.isFrigate()) w *= 0.1f;
387 if (member.isDestroyer()) w *= 0.2f;
388 if (member.isCruiser()) w *= 0.5f;
389 picker.add(member, w);
392 int numStrikes = picker.getItems().size();
394 for (
int i = 0; i < numStrikes; i++) {
395 FleetMemberAPI member = picker.pick();
396 if (member ==
null)
return;
398 float crPerDep = member.getDeployCost();
400 float suppliesPerDep = member.getStats().getSuppliesToRecover().getModifiedValue();
401 if (suppliesPerDep <= 0 || crPerDep <= 0)
return;
402 float suppliesPer100CR = suppliesPerDep * 1f / Math.max(0.01f, crPerDep);
405 float strikeSupplies = (250f + suppliesPer100CR) * 0.5f * damageFraction;
408 float strikeDamage = strikeSupplies / suppliesPer100CR * (0.75f + (float) Math.random() * 0.5f);
412 float resistance = member.getStats().getDynamic().getValue(Stats.CORONA_EFFECT_MULT);
413 strikeDamage *= resistance;
415 if (strikeDamage > HyperspaceTerrainPlugin.STORM_MAX_STRIKE_DAMAGE) {
416 strikeDamage = HyperspaceTerrainPlugin.STORM_MAX_STRIKE_DAMAGE;
419 if (strikeDamage > 0) {
420 float currCR = member.getRepairTracker().getBaseCR();
421 float crDamage = Math.min(currCR, strikeDamage);
424 member.getRepairTracker().applyCREvent(-crDamage,
"explosion_" +
entity.getId(),
425 "Damaged by explosion");
428 float hitStrength = member.getStats().getArmorBonus().computeEffective(member.getHullSpec().getArmorRating());
430 int numHits = (int) (strikeDamage / 0.1f);
431 if (numHits < 1) numHits = 1;
432 for (
int j = 0; j < numHits; j++) {
433 member.getStatus().applyDamage(hitStrength);
436 if (member.getStatus().getHullFraction() < 0.01f) {
437 member.getStatus().setHullFraction(0.01f);
438 picker.remove(member);
440 float w = picker.getWeight(member);
441 picker.setWeight(picker.getItems().indexOf(member), w * 0.5f);
447 if (fleet.isPlayerFleet()) {
449 "Your fleet suffers damage from being caught in an explosion", Misc.getNegativeHighlightColor());