1
0
forked from 0ad/0ad

Use average rotation of members when giving formation controller into the world

Differential revision: https://code.wildfiregames.com/D2890
Reviewed by: wraitii
Comments by: Freagarach
This was SVN commit r23899.
This commit is contained in:
Angen 2020-07-26 18:22:26 +00:00
parent 6201574fc0
commit f074096cf3

View File

@ -473,10 +473,11 @@ Formation.prototype.MoveMembersIntoFormation = function(moveCenter, force, varia
var active = [];
var positions = [];
let rotations = 0;
for (var ent of this.members)
{
var cmpPosition = Engine.QueryInterface(ent, IID_Position);
let cmpPosition = Engine.QueryInterface(ent, IID_Position);
if (!cmpPosition || !cmpPosition.IsInWorld())
continue;
@ -485,23 +486,15 @@ Formation.prototype.MoveMembersIntoFormation = function(moveCenter, force, varia
// but bring the position to the right coordinates
var pos = cmpPosition.GetPosition2D();
positions.push(pos);
rotations += cmpPosition.GetRotation().y;
}
var avgpos = Vector2D.average(positions);
let cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
// Reposition the formation if we're told to or if we don't already have a position
var cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
var inWorld = cmpPosition.IsInWorld();
if (moveCenter || !inWorld)
{
cmpPosition.JumpTo(avgpos.x, avgpos.y);
// Don't make the formation controller entity show up in range queries
if (!inWorld)
{
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
cmpRangeManager.SetEntityFlag(this.entity, "normal", false);
}
}
if (moveCenter || (cmpPosition && !cmpPosition.IsInWorld()))
this.SetupPositionAndHandleRotation(avgpos.x, avgpos.y, rotations / active.length);
this.lastOrderVariant = variant;
// Switch between column and box if necessary
@ -567,31 +560,44 @@ Formation.prototype.MoveMembersIntoFormation = function(moveCenter, force, varia
Formation.prototype.MoveToMembersCenter = function()
{
var positions = [];
let positions = [];
let rotations = 0;
for (var ent of this.members)
for (let ent of this.members)
{
var cmpPosition = Engine.QueryInterface(ent, IID_Position);
let cmpPosition = Engine.QueryInterface(ent, IID_Position);
if (!cmpPosition || !cmpPosition.IsInWorld())
continue;
positions.push(cmpPosition.GetPosition2D());
rotations += cmpPosition.GetRotation().y;
}
var avgpos = Vector2D.average(positions);
let avgpos = Vector2D.average(positions);
var cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
var inWorld = cmpPosition.IsInWorld();
cmpPosition.JumpTo(avgpos.x, avgpos.y);
// Don't make the formation controller show up in range queries
if (!inWorld)
{
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
cmpRangeManager.SetEntityFlag(this.entity, "normal", false);
}
this.SetupPositionAndHandleRotation(avgpos.x, avgpos.y, rotations / positions.length);
};
/**
* Set formation position.
* If formation is not in world at time this is called, set new rotation and flag for range manager.
*/
Formation.prototype.SetupPositionAndHandleRotation = function(x, y, rot)
{
let cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
if (!cmpPosition)
return;
let wasInWorld = cmpPosition.IsInWorld();
cmpPosition.JumpTo(x, y);
if (wasInWorld)
return;
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
cmpRangeManager.SetEntityFlag(this.entity, "normal", false);
cmpPosition.TurnTo(rot);
}
Formation.prototype.GetAvgFootprint = function(active)
{
var footprints = [];