forked from 0ad/0ad
Petra: improve support for wonder games
This was SVN commit r15535.
This commit is contained in:
parent
52f4cda439
commit
de9ae66326
@ -213,7 +213,28 @@ m.AttackPlan.prototype.setPaused = function(boolValue)
|
||||
m.AttackPlan.prototype.getEnemyPlayer = function(gameState)
|
||||
{
|
||||
var enemyPlayer = undefined;
|
||||
// let's find our prefered target enemy, basically counting our enemies units.
|
||||
|
||||
// first check if there is a preferred enemy based on our victory conditions
|
||||
if (gameState.getGameType() === "wonder")
|
||||
{
|
||||
var moreAdvanced = undefined;
|
||||
var enemyWonder = undefined;
|
||||
var wonders = gameState.getEnemyStructures().filter(API3.Filters.byClass("Wonder")).toEntityArray();
|
||||
for (var wonder of wonders)
|
||||
{
|
||||
var progress = wonder.foundationProgress();
|
||||
if (progress === undefined)
|
||||
return wonder.owner();
|
||||
if (enemyWonder && moreAdvanced > progress)
|
||||
continue;
|
||||
enemyWonder = wonder;
|
||||
moreAdvanced = progress;
|
||||
}
|
||||
if (enemyWonder)
|
||||
return enemyWonder.owner();
|
||||
}
|
||||
|
||||
// then let's find our prefered target enemy, basically counting our enemies units.
|
||||
var enemyCount = {};
|
||||
var enemyDefense = {};
|
||||
for (var i = 1; i < gameState.sharedScript.playersData.length; ++i)
|
||||
@ -696,16 +717,24 @@ m.AttackPlan.prototype.getNearestTarget = function(gameState, position, sameLand
|
||||
// Default target finder aims for conquest critical targets
|
||||
m.AttackPlan.prototype.defaultTargetFinder = function(gameState)
|
||||
{
|
||||
var targets = undefined;
|
||||
if (gameState.getGameType() === "wonder")
|
||||
{
|
||||
targets = gameState.getEnemyStructures(this.targetPlayer).filter(API3.Filters.byClass("Wonder"));
|
||||
if (targets.length)
|
||||
return targets;
|
||||
}
|
||||
|
||||
var targets = gameState.getEnemyStructures(this.targetPlayer).filter(API3.Filters.byClass("CivCentre"));
|
||||
if (targets.length == 0)
|
||||
if (!targets.length)
|
||||
targets = gameState.getEnemyStructures(this.targetPlayer).filter(API3.Filters.byClass("ConquestCritical"));
|
||||
// If there's nothing, attack anything else that's less critical
|
||||
if (targets.length == 0)
|
||||
if (!targets.length)
|
||||
targets = gameState.getEnemyStructures(this.targetPlayer).filter(API3.Filters.byClass("Town"));
|
||||
if (targets.length == 0)
|
||||
if (!targets.length)
|
||||
targets = gameState.getEnemyStructures(this.targetPlayer).filter(API3.Filters.byClass("Village"));
|
||||
// no buildings, attack anything conquest critical, even units (it's assuming it won't move).
|
||||
if (targets.length == 0)
|
||||
// no buildings, attack anything conquest critical, even units
|
||||
if (!targets.length)
|
||||
targets = gameState.getEnemyEntities(this.targetPlayer).filter(API3.Filters.byClass("ConquestCritical"));
|
||||
return targets;
|
||||
};
|
||||
|
@ -756,7 +756,7 @@ m.BaseManager.prototype.assignToFoundations = function(gameState, noRepair)
|
||||
targetNB = 4;
|
||||
else if (target.hasClass("Fortress"))
|
||||
targetNB = 7;
|
||||
if (target.getMetadata(PlayerID, "baseAnchor") == true)
|
||||
if (target.getMetadata(PlayerID, "baseAnchor") == true || (target.hasClass("Wonder") && gameState.getGameType() === "wonder"))
|
||||
targetNB = 15;
|
||||
|
||||
if (assigned < targetNB)
|
||||
|
@ -290,6 +290,22 @@ m.HQ.prototype.checkEvents = function (gameState, events, queues)
|
||||
});
|
||||
}
|
||||
}
|
||||
else if (ent.hasClass("Wonder") && gameState.getGameType() === "wonder")
|
||||
{
|
||||
var base = ent.getMetadata(PlayerID, "base");
|
||||
if (!base)
|
||||
warn("Petra: wonder founadtion without base ???");
|
||||
// Let's get a few units out there to build this.
|
||||
var builders = this.bulkPickWorkers(gameState, base, 10);
|
||||
if (builders !== false)
|
||||
{
|
||||
builders.forEach(function (worker) {
|
||||
worker.setMetadata(PlayerID, "base", base);
|
||||
worker.setMetadata(PlayerID, "subrole", "builder");
|
||||
worker.setMetadata(PlayerID, "target-foundation", ent.id());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var ConstructionEvents = events["ConstructionFinished"];
|
||||
@ -1002,6 +1018,16 @@ m.HQ.prototype.findDefensiveLocation = function(gameState, template)
|
||||
var ownStructures = gameState.getOwnStructures().filter(API3.Filters.byClassesOr(["Fortress", "Tower"])).toEntityArray();
|
||||
var enemyStructures = gameState.getEnemyStructures().filter(API3.Filters.byClassesOr(["CivCentre", "Fortress", "Tower"])).toEntityArray();
|
||||
|
||||
var wonderMode = (gameState.getGameType() === "wonder");
|
||||
var wonderDistmin = undefined;
|
||||
if (wonderMode)
|
||||
{
|
||||
var wonders = gameState.getOwnStructures().filter(API3.Filters.byClass("Wonder")).toEntityArray();
|
||||
wonderMode = (wonders.length !== 0);
|
||||
if (wonderMode)
|
||||
wonderDistmin = (50 + wonders[0].footprintRadius()) * (50 + wonders[0].footprintRadius());
|
||||
}
|
||||
|
||||
// obstruction map
|
||||
var obstructions = m.createObstructionMap(gameState, 0, template);
|
||||
obstructions.expandInfluences();
|
||||
@ -1016,11 +1042,14 @@ m.HQ.prototype.findDefensiveLocation = function(gameState, template)
|
||||
|
||||
for (var j = 0; j < this.territoryMap.length; ++j)
|
||||
{
|
||||
// do not try if well inside or outside territory
|
||||
if (this.frontierMap.map[j] === 0)
|
||||
continue
|
||||
if (this.frontierMap.map[j] === 1 && template.hasClass("Tower"))
|
||||
continue;
|
||||
if (!wonderMode)
|
||||
{
|
||||
// do not try if well inside or outside territory
|
||||
if (this.frontierMap.map[j] === 0)
|
||||
continue
|
||||
if (this.frontierMap.map[j] === 1 && template.hasClass("Tower"))
|
||||
continue;
|
||||
}
|
||||
if (this.basesMap.map[j] === 0) // inaccessible cell
|
||||
continue;
|
||||
if (obstructions.map[j] <= radius) // check room around
|
||||
@ -1030,6 +1059,16 @@ m.HQ.prototype.findDefensiveLocation = function(gameState, template)
|
||||
pos = [gameState.cellSize*pos[0], gameState.cellSize*pos[1]];
|
||||
// checking distances to other structures
|
||||
var minDist = Math.min();
|
||||
|
||||
var dista = 0;
|
||||
if (wonderMode)
|
||||
{
|
||||
dista = API3.SquareVectorDistance(wonders[0].position(), pos);
|
||||
if (dista < wonderDistmin)
|
||||
continue;
|
||||
dista *= 200; // empirical factor (TODO should depend on map size) to stay near the wonder
|
||||
}
|
||||
|
||||
for (var str of enemyStructures)
|
||||
{
|
||||
if (str.foundationProgress() !== undefined)
|
||||
@ -1043,8 +1082,8 @@ m.HQ.prototype.findDefensiveLocation = function(gameState, template)
|
||||
minDist = -1;
|
||||
break;
|
||||
}
|
||||
if (str.hasClass("CivCentre") && dist < minDist)
|
||||
minDist = dist;
|
||||
if (str.hasClass("CivCentre") && dist + dista < minDist)
|
||||
minDist = dist + dista;
|
||||
}
|
||||
if (minDist < 0)
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user