Fix formations attacking by adding a combat.approaching state. Fixes #2496
This was SVN commit r15054.
This commit is contained in:
parent
b5dfacbf18
commit
a49b359748
@ -819,7 +819,8 @@ Formation.prototype.GetEstimatedOrientation = function(pos)
|
||||
{
|
||||
var cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
|
||||
var r = {"sin": 0, "cos": 1};
|
||||
if (cmpUnitAI.GetCurrentState() == "FORMATIONCONTROLLER.WALKING")
|
||||
var unitAIState = cmpUnitAI.GetCurrentState();
|
||||
if (unitAIState == "FORMATIONCONTROLLER.WALKING" || unitAIState == "FORMATIONCONTROLLER.COMBAT.APPROACHING")
|
||||
{
|
||||
var targetPos = cmpUnitAI.GetTargetPositions();
|
||||
if (!targetPos.length)
|
||||
|
@ -829,7 +829,7 @@ var UnitFsmSpec = {
|
||||
{
|
||||
if (this.MoveToTargetAttackRange(target, target))
|
||||
{
|
||||
this.SetNextState("WALKING");
|
||||
this.SetNextState("COMBAT.APPROACHING");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1112,50 +1112,70 @@ var UnitFsmSpec = {
|
||||
}
|
||||
},
|
||||
|
||||
"ATTACKING": {
|
||||
// Wait for individual members to finish
|
||||
"enter": function(msg) {
|
||||
var cmpFormation = Engine.QueryInterface(this.entity, IID_Formation);
|
||||
cmpFormation.SetRearrange(true);
|
||||
cmpFormation.MoveMembersIntoFormation(false, false);
|
||||
this.StartTimer(1000, 1000);
|
||||
|
||||
var target = this.order.data.target;
|
||||
// Check if we are already in range, otherwise walk there
|
||||
if (!this.CheckTargetAttackRange(target, target))
|
||||
{
|
||||
if (this.TargetIsAlive(target) && this.CheckTargetVisible(target))
|
||||
{
|
||||
var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|
||||
var range = cmpAttack.GetRange(target);
|
||||
this.PushOrderFront("WalkToTargetRange", { "target": target, "min": range.min, "max": range.max });
|
||||
return;
|
||||
}
|
||||
this.FinishOrder();
|
||||
return;
|
||||
}
|
||||
"COMBAT": {
|
||||
"APPROACHING": {
|
||||
"MoveStarted": function(msg) {
|
||||
var cmpFormation = Engine.QueryInterface(this.entity, IID_Formation);
|
||||
cmpFormation.SetRearrange(true);
|
||||
cmpFormation.MoveMembersIntoFormation(true, true);
|
||||
},
|
||||
|
||||
"MoveCompleted": function(msg) {
|
||||
var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|
||||
this.CallMemberFunction("Attack", [this.order.data.target, false]);
|
||||
if (cmpAttack.CanAttackAsFormation())
|
||||
this.SetNextState("COMBAT.ATTACKING");
|
||||
else
|
||||
this.SetNextState("MEMBER");
|
||||
},
|
||||
},
|
||||
|
||||
"Timer": function(msg) {
|
||||
var target = this.order.data.target;
|
||||
// Check if we are already in range, otherwise walk there
|
||||
if (!this.CheckTargetAttackRange(target, target))
|
||||
{
|
||||
if (this.TargetIsAlive(target) && this.CheckTargetVisible(target))
|
||||
"ATTACKING": {
|
||||
// Wait for individual members to finish
|
||||
"enter": function(msg) {
|
||||
var cmpFormation = Engine.QueryInterface(this.entity, IID_Formation);
|
||||
cmpFormation.SetRearrange(true);
|
||||
cmpFormation.MoveMembersIntoFormation(false, false);
|
||||
this.StartTimer(1000, 1000);
|
||||
|
||||
var target = this.order.data.target;
|
||||
// Check if we are already in range, otherwise walk there
|
||||
if (!this.CheckTargetAttackRange(target, target))
|
||||
{
|
||||
var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|
||||
var range = cmpAttack.GetRange(target);
|
||||
this.PushOrderFront("WalkToTargetRange", { "target": target, "min": range.min, "max": range.max });
|
||||
if (this.TargetIsAlive(target) && this.CheckTargetVisible(target))
|
||||
{
|
||||
var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|
||||
var range = cmpAttack.GetRange(target);
|
||||
this.PushOrderFront("WalkToTargetRange", { "target": target, "min": range.min, "max": range.max });
|
||||
return;
|
||||
}
|
||||
this.FinishOrder();
|
||||
return;
|
||||
}
|
||||
this.FinishOrder();
|
||||
return;
|
||||
}
|
||||
},
|
||||
|
||||
"leave": function(msg) {
|
||||
this.StopTimer();
|
||||
},
|
||||
|
||||
"Timer": function(msg) {
|
||||
var target = this.order.data.target;
|
||||
// Check if we are already in range, otherwise walk there
|
||||
if (!this.CheckTargetAttackRange(target, target))
|
||||
{
|
||||
if (this.TargetIsAlive(target) && this.CheckTargetVisible(target))
|
||||
{
|
||||
var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|
||||
var range = cmpAttack.GetRange(target);
|
||||
this.FinishOrder();
|
||||
this.PushOrderFront("Attack", { "target": target, "force": false });
|
||||
return;
|
||||
}
|
||||
this.FinishOrder();
|
||||
return;
|
||||
}
|
||||
},
|
||||
|
||||
"leave": function(msg) {
|
||||
this.StopTimer();
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@ -4256,7 +4276,8 @@ UnitAI.prototype.CheckTargetAttackRange = function(target, type)
|
||||
{
|
||||
var cmpFormationAttack = Engine.QueryInterface(this.formationController, IID_Attack);
|
||||
var cmpFormationUnitAI = Engine.QueryInterface(this.formationController, IID_UnitAI);
|
||||
if (cmpFormationAttack && cmpFormationAttack.CanAttackAsFormation() && cmpFormationUnitAI && cmpFormationUnitAI.GetCurrentState == "FORMATIONCONTROLLER.ATTACKING")
|
||||
|
||||
if (cmpFormationAttack && cmpFormationAttack.CanAttackAsFormation() && cmpFormationUnitAI && cmpFormationUnitAI.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING")
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user