386 Vector2f total =
new Vector2f();
390 if (curr.maxR > 0 && dist < curr.maxR) {
391 float repelWeight = curr.repelWeight;
392 if (dist > curr.minR && curr.maxR > curr.minR) {
393 repelWeight = (dist - curr.minR) / (curr.maxR - curr.minR);
394 if (repelWeight > 1f) repelWeight = 1f;
395 repelWeight = 1f - repelWeight;
396 repelWeight *= curr.repelWeight;
401 float distIntoRepel = curr.maxR - dist;
402 float repelAdjustmentAngle = 0f;
403 if (distIntoRepel < curr.repelAtAngleDist && curr.repelAtAngleDist > 0) {
404 float repelMult = (1f - distIntoRepel / curr.repelAtAngleDist);
405 repelAdjustmentAngle = 90f * repelMult;
406 repelWeight *= (1f - repelMult);
410 repelAdjustmentAngle *= turnDir;
414 dir.scale(repelWeight);
415 Vector2f.add(total, dir, total);
418 if (curr.maxA > 0 && dist < curr.maxA) {
419 float attractWeight = curr.attractWeight;
420 if (dist > curr.minA && curr.maxA > curr.minA) {
421 attractWeight = (dist - curr.minA) / (curr.maxA - curr.minA);
422 if (attractWeight > 1f) attractWeight = 1f;
423 attractWeight = 1f - attractWeight;
424 attractWeight *= curr.attractWeight;
428 dir.scale(attractWeight);
429 Vector2f.add(total, dir, total);
432 if (curr.maxC > 0 && dist < curr.maxC) {
433 float cohesionWeight = curr.cohesionWeight;
434 if (dist > curr.minC && curr.maxC > curr.minC) {
435 cohesionWeight = (dist - curr.minC) / (curr.maxC - curr.minC);
436 if (cohesionWeight > 1f) cohesionWeight = 1f;
437 cohesionWeight = 1f - cohesionWeight;
438 cohesionWeight *= curr.cohesionWeight;
441 Vector2f dir =
new Vector2f(curr.vel);
443 dir.scale(cohesionWeight);
444 Vector2f.add(total, dir, total);
448 if (total.length() <= 0) {
473 if (constructionScript !=
null && constructionScript.
getShip() !=
null) {
480 if (wing ==
null)
return;
491 radius = swarm.
params.maxOffset;
494 SharedSwarmWingData shared =
getShared();
497 float targetDist = Float.MAX_VALUE;
500 if (curr ==
ship)
continue;
501 if (curr.isFighter() && (!curr.isWingLeader() || curr.getOwner() == owner || !
attackSwarm))
continue;
505 float currRadius = curr.getCollisionRadius() * 2f;
506 FlockingData data =
new FlockingData();
507 data.facing = curr.getFacing();
508 data.loc = curr.getLocation();
509 data.vel = curr.getVelocity();
510 data.attractWeight = 0f;
514 data.minR = radius + currRadius;
515 data.maxR = radius + currRadius + Math.min(100f, currRadius * 1f);
516 data.repelAtAngleDist = (data.maxR - data.minR) * 0.5f;
521 if (curr.isHulk() || curr.getOwner() == 100)
continue;
526 float currRadius = curr.getCollisionRadius() * 0.5f;
527 FlockingData data =
new FlockingData();
528 data.facing = curr.getFacing();
529 data.loc = curr.getLocation();
530 data.vel = curr.getVelocity();
532 data.repelWeight = data.attractWeight * 10f;
533 data.minA = radius + currRadius;
534 data.maxA = 1000000f;
535 data.minR = radius + currRadius;
536 data.maxR = radius + currRadius + 100f;
537 data.repelAtAngleDist = (data.maxR - data.minR) * 0.5f;
543 float currRadius = curr.getCollisionRadius() * 0.5f;
545 if (curr.getOwner() != owner && engine.
isAwareOf(owner, curr)) {
546 FlockingData data =
new FlockingData();
547 data.facing = curr.getFacing();
548 data.loc = curr.getLocation();
549 data.vel = curr.getVelocity();
551 data.repelWeight = data.attractWeight * 10f;
552 data.minA = attackRange + radius + currRadius;
553 data.maxA = 1000000f;
554 data.repelAtAngleDist = Math.min(attackRange * 0.5f, 400f);
555 data.minR = radius + currRadius;
556 data.maxR = attackRange + radius + currRadius;
557 if (curr == shared.target) {
561 if (angleDiffFromFront < maxDiff) {
564 data.minR = data.minR + (data.maxR - data.minR) * 0.5f;
565 data.minR += 500f * (1f - angleDiffFromFront / maxDiff);
566 data.maxR += 500f * (1f - angleDiffFromFront / maxDiff);
567 data.repelAtAngleDist += 500f * (1f - angleDiffFromFront / maxDiff);
569 data.attractWeight += 200f;
570 data.repelWeight += 600f;
581 if ((curr.isDestroyer() || curr.isCruiser() || curr.isCapital()) && curr == shared.target) {
582 data =
new FlockingData();
585 dir.scale(curr.getCollisionRadius() * 0.5f + attackRange *
attackRangeMult);
586 data.facing = curr.getFacing();
587 data.loc = Vector2f.add(curr.getLocation(), dir,
new Vector2f());
588 data.vel = curr.getVelocity();
590 data.minA = attackRange + radius + currRadius;
591 data.maxA = 1000000f;
592 if (curr == shared.target) {
593 data.attractWeight += 200f;
599 }
else if (curr.getOwner() == owner) {
600 FlockingData data =
new FlockingData();
601 data.facing = curr.getFacing();
602 data.loc = curr.getLocation();
603 data.vel = curr.getVelocity();
605 data.repelWeight = data.attractWeight * 50f;
606 data.minA = attackRange + radius + currRadius;
607 data.maxA = 1000000f;
608 data.minR = radius + currRadius;
609 data.maxR = attackRange * 0.75f + radius + currRadius;
610 data.repelAtAngleDist = Math.min(attackRange * 0.5f, 400f);
615 if (target !=
null) {
622 FlockingData data =
new FlockingData();
624 data.loc =
new Vector2f();
625 data.vel =
new Vector2f();
626 data.attractWeight = 5f;
627 data.repelWeight = data.attractWeight * 10f;
629 data.maxA = 1000000f;
632 data.repelAtAngleDist = 1000f;
648 if (swarm !=
null && swarm.
params.flockingClass !=
null && swarm.
attachedTo !=
null) {
650 if (curr == swarm)
continue;
651 if (curr.attachedTo ==
ship || curr.attachedTo ==
null ||
652 curr.attachedTo.
getOwner() != owner) {
656 if (swarm.
params.flockingClass.equals(curr.params.flockingClass)) {
659 float currRadius = curr.params.maxOffset;
660 FlockingData data =
new FlockingData();
661 data.facing = curr.attachedTo.getFacing();
662 data.loc = curr.attachedTo.getLocation();
663 data.vel = curr.attachedTo.getVelocity();
664 data.attractWeight = 0f;
665 data.repelWeight = 8f;
668 data.minR = radius + currRadius;
669 data.maxR = radius + currRadius + Math.min(100f, currRadius * 1f);
670 data.repelAtAngleDist = (data.maxR - data.minR) * 0.5f;
676 boolean sameWing = wing == ((
ShipAPI)curr.attachedTo).getWing();
677 boolean otherWingLeader = ((
ShipAPI)curr.attachedTo).isWingLeader();
681 if (wingLeader && sameWing)
continue;
689 float currRadius = curr.attachedTo.getCollisionRadius() * 0.5f;
690 FlockingData data =
new FlockingData();
691 data.facing = curr.attachedTo.getFacing();
692 data.loc = curr.attachedTo.getLocation();
693 data.vel = curr.attachedTo.getVelocity();
694 data.attractWeight = 1f;
695 data.repelWeight = 10f;
696 data.cohesionWeight = 1f;
699 data.attractWeight = 0.1f;
701 data.attractWeight = 3f;
703 data.minA = 0f + radius + currRadius;
706 data.minA = 0f + radius + currRadius;
711 if (wingLeader && otherWingLeader) {