0ad/binaries/data/mods/public/simulation/ai/qbot/entitycollection-extend.js
quantumstate c8243a50dc Large qBot update.
Key changes are:
Support for Persians
Revamped defence system supoprting groups of attackers
Dynamic priorities based on enemy strength and number of workers
Better placement of towers and fortresses
Randomised raiding in early game

This was SVN commit r10755.
2011-12-17 21:59:27 +00:00

103 lines
2.6 KiB
JavaScript

EntityCollection.prototype.attack = function(unit)
{
var unitId;
if (typeOf(unit) === "Entity"){
unitId = unit.id();
}else{
unitId = unit;
}
Engine.PostCommand({"type": "attack", "entities": this.toIdArray(), "target": unitId, "queued": false});
return this;
};
function EntityCollectionFromIds(gameState, idList){
var ents = {};
for (var i in idList){
var id = idList[i];
if (gameState.entities._entities[id]) {
ents[id] = gameState.entities._entities[id];
}
}
return new EntityCollection(gameState.ai, ents);
}
EntityCollection.prototype.attackMove = function(x, z){
Engine.PostCommand({"type": "attack-move", "entities": this.toIdArray(), "x": x, "z": z, "queued": false});
return this;
};
// Do naughty stuff to replace the entity collection constructor for updating entity collections
var tmpEntityCollection = function(baseAI, entities, filter, gameState){
this._ai = baseAI;
this._entities = entities;
if (filter){
var tmp = 3;
this.filterFunc = filter;
this._entities = this.filter(function(ent){
return filter(ent, gameState);
})._entities;
this._ai.registerUpdate(this);
}
// Compute length lazily on demand, since it can be
// expensive for large collections
// This is updated by the update() function.
this._length = undefined;
Object.defineProperty(this, "length", {
get: function () {
if (this._length === undefined)
{
this._length = 0;
for (var id in entities)
++this._length;
}
return this._length;
}
});
};
tmpEntityCollection.prototype = new EntityCollection;
EntityCollection = tmpEntityCollection;
// Keeps an EntityCollection with a filter function up to date by watching for events
EntityCollection.prototype.update = function(gameState, events){
if (!this.filterFunc)
return;
for (var i in events){
if (events[i].type === "Create"){
var ent = gameState.getEntityById(events[i].msg.entity);
if (ent){
var raw_ent = ent._entity;
if (ent && this.filterFunc(ent, gameState)){
this._entities[events[i].msg.entity] = raw_ent;
if (this._length !== undefined)
this._length ++;
}
}
}else if(events[i].type === "Destroy"){
if (this._entities[events[i].msg.entity]){
delete this._entities[events[i].msg.entity];
if (this._length !== undefined)
this._length --;
}
}
}
};
EntityCollection.prototype.getCentrePosition = function(){
var sumPos = [0, 0];
var count = 0;
this.forEach(function(ent){
if (ent.position()){
sumPos[0] += ent.position()[0];
sumPos[1] += ent.position()[1];
count ++;
}
});
if (count === 0){
return undefined;
}else{
return [sumPos[0]/count, sumPos[1]/count];
}
};