215 if (
entity instanceof CampaignFleetAPI) {
216 CampaignFleetAPI fleet = (CampaignFleetAPI)
entity;
219 if (intensity <= 0)
return;
222 float buffDur = 0.1f;
225 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
226 float recoveryRate = member.getStats().getBaseCRRecoveryRatePercentPerDay().getModifiedValue();
227 float lossRate = member.getStats().getBaseCRRecoveryRatePercentPerDay().getBaseValue();
229 float resistance = member.getStats().getDynamic().getValue(Stats.CORONA_EFFECT_MULT);
234 float loss = (-1f * recoveryRate + -1f * lossRate * adjustedLossMult) * days * 0.01f;
235 float curr = member.getRepairTracker().getBaseCR();
236 if (loss > curr) loss = curr;
238 if (resistance > 0) {
239 member.getRepairTracker().applyCREvent(loss,
"corona",
"Pulsar beam effect");
242 float peakFraction = 1f / Math.max(1.3333f, 1f +
params.crLossMult * intensity);
243 float peakLost = 1f - peakFraction;
244 peakLost *= resistance;
246 float degradationMult = 1f + (params.crLossMult * intensity * resistance) / 2f;
248 member.getBuffManager().addBuffOnlyUpdateStat(
new PeakPerformanceBuff(buffId +
"_1", 1f - peakLost, buffDur));
249 member.getBuffManager().addBuffOnlyUpdateStat(
new CRLossPerSecondBuff(buffId +
"_2", degradationMult, buffDur));
253 float maxFleetBurn = fleet.getFleetData().getBurnLevel();
254 float currFleetBurn = fleet.getCurrBurnLevel();
256 float maxWindBurn =
params.windBurnLevel;
259 float currWindBurn = intensity * maxWindBurn;
260 float maxFleetBurnIntoWind = maxFleetBurn - Math.abs(currWindBurn);
262 float angle = Misc.getAngleInDegreesStrict(this.entity.getLocation(), fleet.getLocation());
263 Vector2f windDir = Misc.getUnitVectorAtDegreeAngle(angle);
264 if (currWindBurn < 0) {
268 Vector2f velDir = Misc.normalise(
new Vector2f(fleet.getVelocity()));
269 velDir.scale(currFleetBurn);
271 float fleetBurnAgainstWind = -1f * Vector2f.dot(windDir, velDir);
273 float accelMult = 0.5f;
274 if (fleetBurnAgainstWind > maxFleetBurnIntoWind) {
275 accelMult += 0.75f + 0.25f * (fleetBurnAgainstWind - maxFleetBurnIntoWind);
278 float seconds = days *
Global.
getSector().getClock().getSecondsPerDay();
280 Vector2f vel = fleet.getVelocity();
281 windDir.scale(seconds * fleet.getAcceleration() * accelMult);
282 fleet.setVelocity(vel.x + windDir.x, vel.y + windDir.y);
289 int alpha = glowColor.getAlpha();
291 glowColor = Misc.setAlpha(glowColor, 75);
297 Misc.normalise(windDir);
298 float sizeNormal = 10f + 25f * intensity;
299 for (FleetMemberViewAPI view : fleet.getViews()) {
300 view.getWindEffectDirX().shift(
getModId(), windDir.x * sizeNormal, durIn, durOut, 1f);
301 view.getWindEffectDirY().shift(
getModId(), windDir.y * sizeNormal, durIn, durOut, 1f);
302 view.getWindEffectColor().shift(
getModId(), glowColor, durIn, durOut, intensity);
310 float maxDist =
params.bandWidthInEngine;
311 float minDist =
params.relatedEntity.getRadius();
312 float dist = Misc.getDistance(point,
params.relatedEntity.getLocation());
314 if (dist > maxDist)
return 0f;
316 float intensity = 1f;
317 if (minDist < maxDist) {
318 intensity = 1f - (dist - minDist) / (maxDist - minDist);
320 if (intensity < 0) intensity = 0;
321 if (intensity > 1) intensity = 1;
324 float angle = Misc.getAngleInDegreesStrict(
params.relatedEntity.getLocation(), point);
325 float diff = Misc.getAngleDiff(angle,
pulsarAngle);
326 diff = Math.min(diff, Misc.getAngleDiff(angle,
pulsarAngle + 180f));
328 if (diff > maxDiff) diff = maxDiff;
330 if (diff > maxDiff * 0.5f) {
331 intensity *= 0.25f + 0.75f * (1f - (diff - maxDiff * 0.5f) / (maxDiff * 0.5f));
354 Color gray = Misc.getGrayColor();
355 Color highlight = Misc.getHighlightColor();
357 Color bad = Misc.getNegativeHighlightColor();
359 tooltip.addTitle(
"Pulsar Beam");
364 tooltip.addSectionHeading(
"Travel", Alignment.MID, pad);
367 tooltip.addPara(
"Reduces the combat readiness of " +
368 "all ships caught in the pulsar beam at a rapid pace, and blows the fleet off-course.", nextPad);
369 tooltip.addPara(
"The magnitude of the effect drops off rapidly with distance from the source.", pad);
372 tooltip.addSectionHeading(
"Combat", Alignment.MID, pad);
373 tooltip.addPara(
"Reduces the peak performance time of ships and increases the rate of combat readiness degradation in protracted engagements.", small);