1
0
forked from 0ad/0ad

Fix formations attacking by adding a combat.approaching state. Fixes #2496

This was SVN commit r15054.
This commit is contained in:
sanderd17 2014-04-28 13:05:47 +00:00
parent b5dfacbf18
commit a49b359748
2 changed files with 62 additions and 40 deletions

View File

@ -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)

View File

@ -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;
}