187 if (
entity instanceof CampaignFleetAPI) {
195 CampaignFleetAPI fleet = (CampaignFleetAPI)
entity;
197 boolean inFlare =
false;
203 if (intensity <= 0)
return;
206 float buffDur = 0.1f;
208 boolean protectedFromCorona =
false;
209 if (fleet.isInCurrentLocation() &&
211 for (SectorEntityToken curr : fleet.getContainingLocation().getCustomEntitiesWithTag(Tags.PROTECTS_FROM_CORONA_IN_BATTLE)) {
212 float dist = Misc.getDistance(curr, fleet);
213 if (dist < curr.getRadius() + fleet.getRadius() + 10f) {
214 protectedFromCorona =
true;
221 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
222 float recoveryRate = member.getStats().getBaseCRRecoveryRatePercentPerDay().getModifiedValue();
223 float lossRate = member.getStats().getBaseCRRecoveryRatePercentPerDay().getBaseValue();
225 float resistance = member.getStats().getDynamic().getValue(Stats.CORONA_EFFECT_MULT);
226 if (protectedFromCorona) resistance = 0f;
229 if (inFlare) lossMult = 2f;
230 float adjustedLossMult = (0f + params.crLossMult * intensity * resistance * lossMult *
CR_LOSS_MULT_GLOBAL);
232 float loss = (-1f * recoveryRate + -1f * lossRate * adjustedLossMult) * days * 0.01f;
233 float curr = member.getRepairTracker().getBaseCR();
234 if (loss > curr) loss = curr;
235 if (resistance > 0) {
237 member.getRepairTracker().applyCREvent(loss,
"flare",
"Solar flare effect");
239 member.getRepairTracker().applyCREvent(loss,
"corona",
"Star corona effect");
244 float peakFraction = 1f / Math.max(1.3333f, 1f +
params.crLossMult * intensity);
245 float peakLost = 1f - peakFraction;
246 peakLost *= resistance;
247 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;
262 float currWindBurn = intensity * maxWindBurn;
263 float maxFleetBurnIntoWind = maxFleetBurn - Math.abs(currWindBurn);
265 float angle = Misc.getAngleInDegreesStrict(this.entity.getLocation(), fleet.getLocation());
266 Vector2f windDir = Misc.getUnitVectorAtDegreeAngle(angle);
267 if (currWindBurn < 0) {
271 Vector2f velDir = Misc.normalise(
new Vector2f(fleet.getVelocity()));
272 velDir.scale(currFleetBurn);
274 float fleetBurnAgainstWind = -1f * Vector2f.dot(windDir, velDir);
276 float accelMult = 0.5f;
277 if (fleetBurnAgainstWind > maxFleetBurnIntoWind) {
278 accelMult += 0.75f + 0.25f * (fleetBurnAgainstWind - maxFleetBurnIntoWind);
280 float fleetAccelMult = fleet.getStats().getAccelerationMult().getModifiedValue();
281 if (fleetAccelMult > 0) {
282 accelMult /= fleetAccelMult;
285 float seconds = days *
Global.
getSector().getClock().getSecondsPerDay();
287 Vector2f vel = fleet.getVelocity();
288 windDir.scale(seconds * fleet.getAcceleration() * accelMult);
289 fleet.setVelocity(vel.x + windDir.x, vel.y + windDir.y);
292 int alpha = glowColor.getAlpha();
294 glowColor = Misc.setAlpha(glowColor, 75);
299 float dist = Misc.getDistance(this.entity.getLocation(), fleet.getLocation());
301 if (
params.relatedEntity !=
null) check =
params.relatedEntity.getRadius() * 0.5f;
305 Misc.normalise(windDir);
306 float sizeNormal = 5f + 10f * intensity;
307 float sizeFlare = 10f + 15f * intensity;
308 for (FleetMemberViewAPI view : fleet.getViews()) {
310 view.getWindEffectDirX().shift(
getModId() +
"_flare", windDir.x * sizeFlare, durIn, durOut, 1f);
311 view.getWindEffectDirY().shift(
getModId() +
"_flare", windDir.y * sizeFlare, durIn, durOut, 1f);
312 view.getWindEffectColor().shift(
getModId() +
"_flare", glowColor, durIn, durOut, intensity);
314 view.getWindEffectDirX().shift(
getModId(), windDir.x * sizeNormal, durIn, durOut, 1f);
315 view.getWindEffectDirY().shift(
getModId(), windDir.y * sizeNormal, durIn, durOut, 1f);
316 view.getWindEffectColor().shift(
getModId(), glowColor, durIn, durOut, intensity);