1
0
forked from 0ad/0ad

Last batch of fix for qBot-xp for the day if all goes well.

This was SVN commit r12358.
This commit is contained in:
wraitii 2012-08-11 10:36:39 +00:00
parent 508994e4c8
commit 226738d447
10 changed files with 71 additions and 21 deletions

View File

@ -488,11 +488,16 @@ CityAttack.prototype.StartAttack = function(gameState, militaryManager){
}
this.unitCollection.move(this.path[0][0], this.path[0][1]);
this.unitCollection.setStance("aggressive"); // make sure units won't disperse out of control
delete this.pathFinder;
debug ("Started to attack with the plan " + this.name);
this.state = "walking";
} else {
gameState.ai.gameFinished = true;
debug ("I do not have any target. So I'll just assume I won the game.");
delete this.pathFinder;
return true;
}
return true;

View File

@ -45,7 +45,7 @@ var baseConfig = {
"house" : 500,
"citizenSoldier" : 65,
"villager" : 95,
"economicBuilding" : 80,
"economicBuilding" : 95,
"field" : 20,
"advancedSoldier" : 30,
"siege" : 10,

View File

@ -71,7 +71,10 @@ Defence.prototype.update = function(gameState, events, militaryManager){
// putting unneeded units at rest
this.idleDefs.forEach(function(ent) {
ent.setMetadata("role", ent.getMetadata("formerrole") );
if (ent.getMetadata("formerrole"))
ent.setMetadata("role", ent.getMetadata("formerrole") );
else
ent.setMetadata("role", "worker");
ent.setMetadata("subrole", undefined);
});
@ -229,11 +232,29 @@ Defence.prototype.defendFromEnemyArmies = function(gameState, events, militaryMa
gameState.setDefcon(3);
}
var nonDefenders = this.myUnits.filter(Filters.or( Filters.not(Filters.byMetadata("role","defence")),Filters.isIdle()));
nonDefenders = nonDefenders.filter(Filters.not(Filters.byClass("Female")));
// we're having too many.
if (this.myUnits.filter(Filters.byMetadata("role","defence")).length > nbOfAttackers*this.defenceRatio*1.3) {
this.myUnits.filter(Filters.byMetadata("role","defence")).forEach(function (defender) { //}){
if (defender.unitAIOrderData() && defender.unitAIOrderData()["target"]) {
if (self.attackerCache[defender.unitAIOrderData()["target"]].length > 3) {
// okay release me.
defender.stopMoving();
if (defender.getMetadata("formerrole"))
defender.setMetadata("role", defender.getMetadata("formerrole") );
else
defender.setMetadata("role", "worker");
defender.setMetadata("subrole", undefined);
}
}
});
}
var nonDefenders = this.myUnits.filter(Filters.or(Filters.not(Filters.byMetadata("role","defence")),Filters.isIdle()));
nonDefenders = nonDefenders.filter(Filters.not(Filters.byClass("Female")));
nonDefenders = nonDefenders.filter(Filters.not(Filters.byMetadata("subrole","attacking")));
var defenceRatio = this.defenceRatio;
if (newEnemies.length * defenceRatio> nonDefenders.length) {
if (newEnemies.length * defenceRatio > nonDefenders.length) {
defenceRatio = 1;
}
@ -264,7 +285,8 @@ Defence.prototype.defendFromEnemyArmies = function(gameState, events, militaryMa
for (var i = 0; i < defenceRatio && i < counters.length; i++) {
if (counters[i].getMetadata("plan") !== undefined)
militaryManager.pausePlan(gameState,counters[i].getMetadata("plan"));
counters[i].setMetadata("formerrole", counters[i].getMetadata("role"));
if (counters[i].getMetadata("role") == "worker" || counters[i].getMetadata("role") == "attack")
counters[i].setMetadata("formerrole", counters[i].getMetadata("role"));
counters[i].setMetadata("role","defence");
counters[i].setMetadata("subrole","defending");
counters[i].attack(+enemy.id());
@ -277,7 +299,8 @@ Defence.prototype.defendFromEnemyArmies = function(gameState, events, militaryMa
nonDefenders.filter(Filters.byClass("CitizenSoldier")).filterNearest(enemy.position(),defenceRatio-assigned).forEach(function (defender) { //}){
if (defender.getMetadata("plan") !== undefined)
militaryManager.pausePlan(gameState,defender.getMetadata("plan"));
defender.setMetadata("formerrole", defender.getMetadata("role"));
if (defender.getMetadata("role") == "worker" || defender.getMetadata("role") == "attack")
defender.setMetadata("formerrole", defender.getMetadata("role"));
defender.setMetadata("role","defence");
defender.setMetadata("subrole","defending");
defender.attack(+enemy.id());

View File

@ -291,10 +291,10 @@ EconomyManager.prototype.assignToFoundations = function(gameState) {
var nearestNonBuilders = nonBuilderWorkers.filterNearest(target.position(), this.targetNumBuilders - assigned);
nearestNonBuilders.forEach(function(ent) {
addedWorkers++;
ent.setMetadata("subrole", "builder");
ent.setMetadata("target-foundation", target);
});
addedWorkers++;
ent.setMetadata("subrole", "builder");
ent.setMetadata("target-foundation", target);
});
}
}
}
@ -470,6 +470,7 @@ EconomyManager.prototype.getBestResourceBuildSpot = function(gameState, resource
var territory = Map.createTerritoryMap(gameState);
friendlyTiles.multiplyTerritory(gameState,territory);
friendlyTiles.annulateTerritory(gameState,territory);
var resources = ["wood","stone","metal"];
for (i in resources) {
@ -488,17 +489,18 @@ EconomyManager.prototype.getBestResourceBuildSpot = function(gameState, resource
var obstructions = Map.createObstructionMap(gameState);
obstructions.expandInfluences();
var isCivilCenter = false;
var bestIdx = friendlyTiles.findBestTile(2, obstructions)[0];
var x = ((bestIdx % friendlyTiles.width) + 0.5) * gameState.cellSize;
var z = (Math.floor(bestIdx / friendlyTiles.width) + 0.5) * gameState.cellSize;
if (territory.getOwner([x,z]) === 0) {
isCivilCenter = true;
bestIdx = friendlyTiles.findBestTile(4, obstructions)[0];
x = ((bestIdx % friendlyTiles.width) + 0.5) * gameState.cellSize;
z = (Math.floor(bestIdx / friendlyTiles.width) + 0.5) * gameState.cellSize;
return [true, [x,z]];
}
return [false, [x,z]];
return [isCivilCenter, [x,z]];
};
EconomyManager.prototype.updateResourceConcentrations = function(gameState, resource){
var self = this;
@ -675,8 +677,9 @@ EconomyManager.prototype.tryBartering = function(gameState){
};
// so this always try to build dropsites.
EconomyManager.prototype.buildDropsites = function(gameState, queues){
if (queues.economicBuilding.totalLength() === 0 && gameState.countFoundationsWithType(gameState.applyCiv("structures/{civ}_mill")) === 0 &&
gameState.countFoundationsWithType(gameState.applyCiv("structures/{civ}_civil_centre")) === 0){
if ( (queues.economicBuilding.totalLength() - queues.economicBuilding.countTotalQueuedUnitsWithClass("BarterMarket")) === 0 &&
gameState.countFoundationsWithType(gameState.applyCiv("structures/{civ}_mill")) === 0 &&
gameState.countFoundationsWithType(gameState.applyCiv("structures/{civ}_civil_centre")) === 0){
//only ever build one mill/CC/market at a time
if (gameState.getTimeElapsed() > 30 * 1000){
for (var resource in this.dropsiteNumbers){
@ -804,6 +807,7 @@ EconomyManager.prototype.update = function(gameState, queues, events) {
if (e.type === "Destroy") {
if (e.msg.metadata && e.msg.metadata[gameState.getPlayerID()] && e.msg.metadata[gameState.getPlayerID()]["worker-object"]){
e.msg.metadata[gameState.getPlayerID()]["worker-object"].updateGathererCounts(gameState, true);
delete e.msg.metadata[gameState.getPlayerID()]["worker-object"];
}
}
}

View File

@ -55,7 +55,7 @@ EntityTemplate.prototype.getCounteredClasses = function() {
if (!this._template.Attack[i].Bonuses)
continue;
for (o in this._template.Attack[i].Bonuses) {
if (this._template.Attack[i].Bonuses[o].Classes == "")
if (this._template.Attack[i].Bonuses[o].Classes == undefined)
continue;
Classes.push([this._template.Attack[i].Bonuses[o].Classes.split(" "), +this._template.Attack[i].Bonuses[o].Multiplier]);
}

View File

@ -348,6 +348,15 @@ Map.prototype.multiplyTerritory = function(gameState,map){
this.map[i] *= 2.5;
}
};
// sets to 0 any enemy territory
Map.prototype.annulateTerritory = function(gameState,map){
for (var i = 0; i < this.length; ++i){
if (map.getOwnerIndex(i) !== gameState.player && map.getOwnerIndex(i) !== 0)
this.map[i] = 0;
}
};
// Multiplies current map by the parameter map pixelwise
Map.prototype.multiply = function(map, onlyBetter,divider,maxMultiplier){
for (var i = 0; i < this.length; ++i){

View File

@ -385,7 +385,7 @@ MilitaryAttackManager.prototype.buildDefences = function(gameState, queues){
}
if (numFortresses + queues.defenceBuilding.totalLength() < 1){ //gameState.getBuildLimits()["Fortress"]) {
if (gameState.getTimeElapsed() > 720 * 1000 + numFortresses * 300 * 1000){
if (gameState.getTimeElapsed() > 840 * 1000 + numFortresses * 300 * 1000){
if (gameState.ai.pathsToMe && gameState.ai.pathsToMe.length > 0){
var position = gameState.ai.pathsToMe.shift();
// TODO: pick a fort randomly from the list.
@ -410,7 +410,11 @@ MilitaryAttackManager.prototype.constructTrainingBuildings = function(gameState,
//build advanced military buildings
if (gameState.getTimeElapsed() > 720*1000){
if (queues.militaryBuilding.totalLength() === 0){
for (var i in this.bAdvanced){
var inConst = 0;
for (var i in this.bAdvanced)
inConst += gameState.countFoundationsWithType(gameState.applyCiv(this.bAdvanced[i]));
if (inConst == 0) {
var i = Math.floor(Math.random() * this.bAdvanced.length);
if (gameState.countEntitiesAndQueuedByType(gameState.applyCiv(this.bAdvanced[i])) < 1){
queues.militaryBuilding.addItem(new BuildingConstructionPlan(gameState, this.bAdvanced[i]));
}

View File

@ -144,6 +144,8 @@ BuildingConstructionPlan.prototype.findGoodPosition = function(gameState) {
var bestTile = friendlyTiles.findBestTile(10, obstructionMap);
var bestIdx = bestTile[0];
var bestVal = bestTile[1];
} else if (template.genericName() == "House") {
radius *= 0.9;
}
if (bestVal === undefined || bestVal === -1) {
var bestTile = friendlyTiles.findBestTile(radius, obstructionMap);

View File

@ -299,6 +299,7 @@ QueueManager.prototype.update = function(gameState) {
if (this.queues[p].outQueueNext().canExecute(gameState)) {
this.queues[p].executeNext(gameState);
gameState.buildingsBuilt += 1;
} else {
break;
}

View File

@ -60,9 +60,11 @@ Worker.prototype.update = function(gameState) {
} else if(subrole === "builder") {
if (this.ent.unitAIState().split(".")[1] !== "REPAIR"){
var target = this.ent.getMetadata("target-foundation");
this.ent.repair(target);
if (target.foundationProgress() === undefined && target.needsRepair() == false)
this.ent.setMetadata("subrole", "idle");
else
this.ent.repair(target);
}
//Engine.PostCommand({"type": "set-shading-color", "entities": [this.ent.id()], "rgb": [0,10,0]});
}