162 if (alphaMult <= 0)
return;
173 xOff = velDir.x * -offset;
174 yOff = velDir.y * -offset;
181 float bandWidthInTexture = 256f;
186 float radStart = min;
189 if (radEnd < radStart + 10f) radEnd = radStart + 10f;
198 float startRad = (float) Math.toRadians(angle1);
199 float endRad = (float) Math.toRadians(angle2);
200 if (startRad > endRad) {
201 endRad += Math.PI * 2f;
203 float spanRad = Math.abs(endRad - startRad);
204 float anglePerSegment = spanRad / segments;
212 GL11.glTranslatef(x, y, 0);
214 GL11.glEnable(GL11.GL_TEXTURE_2D);
219 GL11.glEnable(GL11.GL_BLEND);
226 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
228 float thickness = (radEnd - radStart) * 1f;
229 float radius = radStart;
231 float texProgress = 0f;
241 texPerSegment *= 200f/256f;
242 texPerSegment *= 200f/256f;
250 float totalTex = Math.max(1f, Math.round(texPerSegment * segments));
251 texPerSegment = totalTex / segments;
264 float periodMult = 3.1415f * 2f / spanRad * 0.25f *
currentWidth / 800f;
269 texProgress = (float) (
phaseAngle / 360f) * 5f * 0.25f;
272 texProgress = (float) (
phaseAngle / 360f) * -1f * 0.25f;
280 for (
int iter = 0; iter < 4; iter++) {
284 if (iter == 2) bandIndex = 2;
285 else if (iter == 3) bandIndex = 3;
289 float leftTX = (float) bandIndex * texWidth * bandWidthInTexture / imageWidth;
290 float rightTX = (float) (bandIndex + 1f) * texWidth * bandWidthInTexture / imageWidth - 0.001f;
296 GL11.glBegin(GL11.GL_QUAD_STRIP);
297 for (
float i = 0; i < segments; i++) {
301 float angleIncrementBase = anglePerSegment;
304 phaseAngleRad = (float) Math.toRadians(
phaseAngle) + (i * angleIncrementBase * 10f);
307 phaseAngleRad = (float) Math.toRadians(-
phaseAngle) + (i * angleIncrementBase * 15f);
308 }
else if (iter == 3) {
309 phaseAngleRad = (float) Math.toRadians(
phaseAngle) + (i * angleIncrementBase * 5f);
311 phaseAngleRad = (float) Math.toRadians(-
phaseAngle) + (i * angleIncrementBase * 5f);
320 float pulseSin = (float) Math.sin(phaseAngleRad * periodMult * 1f);
321 float pulseAmount = pulseSin * thickness * 0.25f;
322 float pulseInner = pulseAmount * 0.5f;
332 float thicknessMult = 1.25f;
333 float thicknessFlat = 0f;
335 float theta = startRad + turnDir * anglePerSegment * i;
337 float cos = (float) Math.cos(theta);
338 float sin = (float) Math.sin(theta);
339 float x1 = cos * (r - pulseInner);
340 float y1 = sin * (r - pulseInner);
341 float x2 = cos * (r + thickness * thicknessMult - pulseAmount + thicknessFlat);
342 float y2 = sin * (r + thickness * thicknessMult - pulseAmount + thicknessFlat);
345 x1 = cos * (r - pulseInner - thickness * 1f);
346 y1 = sin * (r - pulseInner - thickness * 1f);
347 x2 = cos * (r + thickness * thicknessMult - pulseAmount + thicknessFlat - thickness * 0.0f);
348 y2 = sin * (r + thickness * thicknessMult - pulseAmount + thicknessFlat - thickness * 0.0f);
361 Color color = Color.white;
362 float alpha = alphaMult;
365 if (i < segments / 2f) {
368 distFromEdge = (segments - i - 1f) *
currentWidth / segments;
370 alpha *= Math.min(1f, distFromEdge / fadeDist);
372 GL11.glColor4ub((
byte)color.getRed(),
373 (
byte)color.getGreen(),
374 (
byte)color.getBlue(),
375 (
byte)((
float) color.getAlpha() * alpha));
377 GL11.glTexCoord2f(leftTX, texProgress);
378 GL11.glVertex2f(x1, y1);
379 GL11.glTexCoord2f(rightTX, texProgress);
380 GL11.glVertex2f(x2, y2);
382 texProgress += texPerSegment;
441 if (intensity <= 0)
return;
450 float maxWindBurn =
params.burnLevel;
452 float currWindBurn = intensity * maxWindBurn;
453 float burnDiff = maxFleetBurn - currWindBurn;
454 float maxFleetBurnIntoWind = 0;
455 if (burnDiff >= 5.9f) {
456 maxFleetBurnIntoWind = -params.burnLevel + 4f;
457 }
else if (burnDiff >= 3.9f) {
458 maxFleetBurnIntoWind = -params.burnLevel + 3f;
459 }
else if (burnDiff >= 2.9f) {
460 maxFleetBurnIntoWind = -params.burnLevel + 2f;
461 }
else if (burnDiff >= 0.9f) {
462 maxFleetBurnIntoWind = -params.burnLevel + 1f;
464 maxFleetBurnIntoWind = -params.burnLevel + 1f;
471 float dot = Vector2f.dot(windDir,
velDir);
473 velDir.scale(currFleetBurn);
474 float fleetBurnAgainstWind = -1f * Vector2f.dot(windDir,
velDir);
476 float burnBonus = (currWindBurn - maxFleetBurn) * dot;
478 burnBonus = Math.round(burnBonus);
479 if (burnBonus < 1) burnBonus = 1;
483 float accelMult = 0.5f;
484 if (fleetBurnAgainstWind < maxFleetBurnIntoWind) {
489 float diff = Math.abs(fleetBurnAgainstWind - maxFleetBurnIntoWind);
490 accelMult = 2f + diff * 0.25f;
499 windDir.scale(seconds * baseAccel * accelMult);
500 fleet.
setVelocity(vel.x + windDir.x, vel.y + windDir.y);
502 Color glowColor =
new Color(100,200,255,75);
503 int alpha = glowColor.getAlpha();
512 float sizeNormal = 5f + 10f * intensity;
514 view.getWindEffectDirX().shift(
getModId(), windDir.x * sizeNormal, durIn, durOut, 1f);
515 view.getWindEffectDirY().shift(
getModId(), windDir.y * sizeNormal, durIn, durOut, 1f);
517 view.getWindEffectColor().shift(
getModId(), glowColor, durIn, durOut, intensity);