fix ai bug

This was SVN commit r14737.
This commit is contained in:
mimo 2014-02-07 18:00:41 +00:00
parent 563768363b
commit 05f13bb1d8
2 changed files with 23 additions and 19 deletions

View File

@ -833,11 +833,10 @@ m.BaseManager.prototype.gatherersByType = function(gameState, type) {
// returns an entity collection of workers.
// They are idled immediatly and their subrole set to idle.
m.BaseManager.prototype.pickBuilders = function(gameState, number) {
var collec = new API3.EntityCollection(gameState.sharedScript);
m.BaseManager.prototype.pickBuilders = function(gameState, workers, number) {
// TODO: choose better.
var workers = this.workers.filter(API3.Filters.not(API3.Filters.byClass("Cavalry"))).toEntityArray();
workers.sort(function (a,b) {
var availableWorkers = this.workers.filter(API3.Filters.not(API3.Filters.byClass("Cavalry"))).toEntityArray();
availableWorkers.sort(function (a,b) {
var vala = 0, valb = 0;
if (a.getMetadata(PlayerID,"subrole") == "builder")
vala = 100;
@ -847,16 +846,17 @@ m.BaseManager.prototype.pickBuilders = function(gameState, number) {
vala = -100;
if (b.getMetadata(PlayerID,"plan") != undefined)
valb = -100;
return a < b
return vala < valb
});
for (var i = 0; i < number; ++i)
var needed = Math.min(number, availableWorkers.length);
for (var i = 0; i < needed; ++i)
{
workers[i].stopMoving();
workers[i].setMetadata(PlayerID, "subrole","idle");
collec.addEnt(workers[i]);
availableWorkers[i].stopMoving();
availableWorkers[i].setMetadata(PlayerID, "subrole", "idle");
workers.addEnt(availableWorkers[i]);
}
return collec;
}
return;
};
m.BaseManager.prototype.assignToFoundations = function(gameState, noRepair) {
// If we have some foundations, and we don't have enough builder-workers,

View File

@ -191,7 +191,6 @@ m.HQ.prototype.checkEvents = function (gameState, events, queues) {
this.baseManagers[bID].initTerritory(this, gameState);
// Let's get a few units out there to build this.
// TODO: select the best base, or use multiple bases.
var builders = this.bulkPickWorkers(gameState, bID, 10);
if (builders !== false)
{
@ -421,7 +420,6 @@ m.HQ.prototype.switchWorkerBase = function(gameState, worker, type) {
// returns an entity collection of workers through BaseManager.pickBuilders
// TODO: better the choice algo.
// TODO: also can't get over multiple bases right now.
m.HQ.prototype.bulkPickWorkers = function(gameState, newBaseID, number) {
var accessIndex = this.baseManagers[newBaseID].accessIndex;
if (!accessIndex)
@ -434,15 +432,21 @@ m.HQ.prototype.bulkPickWorkers = function(gameState, newBaseID, number) {
return 1;
return 0;
});
var needed = number;
var workers = new API3.EntityCollection(gameState.sharedScript);
for (var i in baseBest)
{
if (baseBest[i].workers.length > number)
{
return baseBest[i].pickBuilders(gameState,number);
}
baseBest[i].pickBuilders(gameState, workers, needed);
if (workers.length < number)
needed = number - workers.length;
else
break;
}
return false;
}
if (workers.length == 0)
return false;
return workers;
};
// returns the current gather rate
// This is not per-se exact, it performs a few adjustments ad-hoc to account for travel distance, stuffs like that.