petra: do not always try to capture (depends on garrison inside target)
This was SVN commit r16989.
This commit is contained in:
parent
19d8c631be
commit
c1efebab15
@ -791,8 +791,8 @@ m.Entity = m.Class({
|
|||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
attack: function(unitId) {
|
attack: function(unitId, allowCapture = true) {
|
||||||
Engine.PostCommand(PlayerID,{"type": "attack", "entities": [this.id()], "target": unitId, "queued": false});
|
Engine.PostCommand(PlayerID,{"type": "attack", "entities": [this.id()], "target": unitId, "allowCapture": allowCapture, "queued": false});
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1300,7 +1300,7 @@ m.AttackPlan.prototype.update = function(gameState, events)
|
|||||||
if (this.isSiegeUnit(gameState, ourUnit))
|
if (this.isSiegeUnit(gameState, ourUnit))
|
||||||
{ // if our siege units are attacked, we'll send some units to deal with enemies.
|
{ // if our siege units are attacked, we'll send some units to deal with enemies.
|
||||||
var collec = this.unitCollection.filter(API3.Filters.not(API3.Filters.byClass("Siege"))).filterNearest(ourUnit.position(), 5);
|
var collec = this.unitCollection.filter(API3.Filters.not(API3.Filters.byClass("Siege"))).filterNearest(ourUnit.position(), 5);
|
||||||
for (var ent of collec.values())
|
for (let ent of collec.values())
|
||||||
{
|
{
|
||||||
if (this.isSiegeUnit(gameState, ent)) // needed as mauryan elephants are not filtered out
|
if (this.isSiegeUnit(gameState, ent)) // needed as mauryan elephants are not filtered out
|
||||||
continue;
|
continue;
|
||||||
@ -1310,7 +1310,7 @@ m.AttackPlan.prototype.update = function(gameState, events)
|
|||||||
// And if this attacker is a non-ranged siege unit and our unit also, attack it
|
// And if this attacker is a non-ranged siege unit and our unit also, attack it
|
||||||
if (this.isSiegeUnit(gameState, attacker) && attacker.hasClass("Melee") && ourUnit.hasClass("Melee"))
|
if (this.isSiegeUnit(gameState, attacker) && attacker.hasClass("Melee") && ourUnit.hasClass("Melee"))
|
||||||
{
|
{
|
||||||
ourUnit.attack(attacker.id());
|
ourUnit.attack(attacker.id(), false);
|
||||||
ourUnit.setMetadata(PlayerID, "lastAttackPlanUpdateTime", time);
|
ourUnit.setMetadata(PlayerID, "lastAttackPlanUpdateTime", time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1321,7 +1321,7 @@ m.AttackPlan.prototype.update = function(gameState, events)
|
|||||||
var collec = this.unitCollection.filter(API3.Filters.byClass("Melee")).filterNearest(ourUnit.position(), 5);
|
var collec = this.unitCollection.filter(API3.Filters.byClass("Melee")).filterNearest(ourUnit.position(), 5);
|
||||||
for (var ent of collec.values())
|
for (var ent of collec.values())
|
||||||
{
|
{
|
||||||
ent.attack(attacker.id());
|
ent.attack(attacker.id(), false);
|
||||||
ent.setMetadata(PlayerID, "lastAttackPlanUpdateTime", time);
|
ent.setMetadata(PlayerID, "lastAttackPlanUpdateTime", time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1457,15 +1457,22 @@ m.AttackPlan.prototype.update = function(gameState, events)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// don't update too soon if not necessary
|
// don't update too soon if not necessary
|
||||||
|
// and when not updating, we check if the unit is trying to capture and if it should continue
|
||||||
if (!needsUpdate)
|
if (!needsUpdate)
|
||||||
{
|
{
|
||||||
if (!maybeUpdate)
|
if (!maybeUpdate)
|
||||||
|
{
|
||||||
|
this.CheckCapture(ent);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
let deltat = (ent.unitAIState() === "INDIVIDUAL.COMBAT.APPROACHING") ? 10 : 5;
|
let deltat = (ent.unitAIState() === "INDIVIDUAL.COMBAT.APPROACHING") ? 10 : 5;
|
||||||
var lastAttackPlanUpdateTime = ent.getMetadata(PlayerID, "lastAttackPlanUpdateTime");
|
let lastAttackPlanUpdateTime = ent.getMetadata(PlayerID, "lastAttackPlanUpdateTime");
|
||||||
if (lastAttackPlanUpdateTime && (time - lastAttackPlanUpdateTime) < deltat)
|
if (lastAttackPlanUpdateTime && (time - lastAttackPlanUpdateTime) < deltat)
|
||||||
|
{
|
||||||
|
this.CheckCapture(ent);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ent.setMetadata(PlayerID, "lastAttackPlanUpdateTime", time);
|
ent.setMetadata(PlayerID, "lastAttackPlanUpdateTime", time);
|
||||||
var range = 60;
|
var range = 60;
|
||||||
var attackTypes = ent.attackTypes();
|
var attackTypes = ent.attackTypes();
|
||||||
@ -1780,6 +1787,36 @@ m.AttackPlan.prototype.debugAttack = function()
|
|||||||
API3.warn("------------------------------");
|
API3.warn("------------------------------");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
m.AttackPlan.prototype.CheckCapture = function(ent)
|
||||||
|
{
|
||||||
|
let state = ent.unitAIState();
|
||||||
|
if (!state || !state.split(".")[1] || state.split(".")[1] !== "COMBAT")
|
||||||
|
return;
|
||||||
|
let orderData = ent.unitAIOrderData();
|
||||||
|
if (!orderData || !orderData.target || !orderData.attackType || orderData.attackType !== "Capture")
|
||||||
|
return;
|
||||||
|
let target = gameState.getEntityById(orderData.target);
|
||||||
|
if (!target)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// For the time being, do not try to capture rams
|
||||||
|
if (target.hasClass("Siege") && target.hasClass("Melee"))
|
||||||
|
{
|
||||||
|
ent.attack(target.id(), false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No problem to capture structure without defensive fire
|
||||||
|
if (!target.hasDefensiveFire())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Check the garrison in this target to know if we can expect to capture it
|
||||||
|
// but TODO need to know how many units are currently capturing this target
|
||||||
|
// For the time being, we check on our army length
|
||||||
|
if (target.garrisoned() && target.garrisoned().length > Math.floor(this.unitCollection.length / 2))
|
||||||
|
ent.attack(target.id(), false);
|
||||||
|
};
|
||||||
|
|
||||||
m.AttackPlan.prototype.Serialize = function()
|
m.AttackPlan.prototype.Serialize = function()
|
||||||
{
|
{
|
||||||
let properties = {
|
let properties = {
|
||||||
|
Loading…
Reference in New Issue
Block a user