This patch adds territory support for JuBot, which is the main thing to get it up to date for the next alpha. More advanced features are in development but some will probably have to wait until Christmas/Early 2012.
This was SVN commit r10560.
This commit is contained in:
parent
20df816fbc
commit
f80f1fb86b
@ -21,10 +21,9 @@ var EconomyManager = Class({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
villageBuildingList: function (gameState) {
|
||||||
checkBuildingList: function (gameState) {
|
|
||||||
if (gameState.displayCiv() == "hele"){
|
if (gameState.displayCiv() == "hele"){
|
||||||
this.targetBuildings = [
|
this.villageBuildings = [
|
||||||
{
|
{
|
||||||
"template": "structures/{civ}_scout_tower",
|
"template": "structures/{civ}_scout_tower",
|
||||||
"priority": 105,
|
"priority": 105,
|
||||||
@ -41,10 +40,123 @@ var EconomyManager = Class({
|
|||||||
"count": 1,
|
"count": 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"template": "structures/{civ}_scout_tower",
|
"template": "structures/{civ}_field",
|
||||||
"priority": 90,
|
"priority": 70,
|
||||||
"count": 3,
|
"count": 2,
|
||||||
},
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
// Celt building list
|
||||||
|
else if (gameState.displayCiv() == "celt"){
|
||||||
|
this.villageBuildings = [
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_scout_tower",
|
||||||
|
"priority": 105,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_field",
|
||||||
|
"priority": 103,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_barracks",
|
||||||
|
"priority": 101,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_field",
|
||||||
|
"priority": 70,
|
||||||
|
"count": 2,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
// Carthage building list
|
||||||
|
else if (gameState.displayCiv() == "cart"){
|
||||||
|
this.villageBuildings = [
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_scout_tower",
|
||||||
|
"priority": 105,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_field",
|
||||||
|
"priority": 103,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_barracks",
|
||||||
|
"priority": 101,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_field",
|
||||||
|
"priority": 70,
|
||||||
|
"count": 2,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
// Celt building list
|
||||||
|
else if (gameState.displayCiv() == "iber"){
|
||||||
|
this.villageBuildings = [
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_scout_tower",
|
||||||
|
"priority": 105,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_field",
|
||||||
|
"priority": 103,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_barracks",
|
||||||
|
"priority": 101,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_field",
|
||||||
|
"priority": 70,
|
||||||
|
"count": 2,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback option just in case
|
||||||
|
else {
|
||||||
|
this.villageBuildings = [
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_scout_tower",
|
||||||
|
"priority": 105,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_field",
|
||||||
|
"priority": 100,
|
||||||
|
"count": 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_barracks",
|
||||||
|
"priority": 99,
|
||||||
|
"count": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_scout_tower",
|
||||||
|
"priority": 60,
|
||||||
|
"count": 4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"template": "structures/{civ}_field",
|
||||||
|
"priority": 40,
|
||||||
|
"count": 5,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
checkBuildingList: function (gameState) {
|
||||||
|
if (gameState.displayCiv() == "hele"){
|
||||||
|
this.targetBuildings = [
|
||||||
{
|
{
|
||||||
"template": "structures/hele_gymnasion",
|
"template": "structures/hele_gymnasion",
|
||||||
"priority": 80,
|
"priority": 80,
|
||||||
@ -60,11 +172,6 @@ var EconomyManager = Class({
|
|||||||
"priority": 60,
|
"priority": 60,
|
||||||
"count": 1,
|
"count": 1,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"template": "structures/{civ}_scout_tower",
|
|
||||||
"priority": 50,
|
|
||||||
"count": 5,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"template": "structures/{civ}_field",
|
"template": "structures/{civ}_field",
|
||||||
"priority": 40,
|
"priority": 40,
|
||||||
@ -75,11 +182,6 @@ var EconomyManager = Class({
|
|||||||
// Celt building list
|
// Celt building list
|
||||||
else if (gameState.displayCiv() == "celt"){
|
else if (gameState.displayCiv() == "celt"){
|
||||||
this.targetBuildings = [
|
this.targetBuildings = [
|
||||||
{
|
|
||||||
"template": "structures/{civ}_field",
|
|
||||||
"priority": 100,
|
|
||||||
"count": 1,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"template": "structures/{civ}_barracks",
|
"template": "structures/{civ}_barracks",
|
||||||
"priority": 90,
|
"priority": 90,
|
||||||
@ -90,31 +192,11 @@ var EconomyManager = Class({
|
|||||||
"priority": 80,
|
"priority": 80,
|
||||||
"count": 1,
|
"count": 1,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"template": "structures/{civ}_scout_tower",
|
|
||||||
"priority": 60,
|
|
||||||
"count": 3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"template": "structures/{civ}_field",
|
|
||||||
"priority": 40,
|
|
||||||
"count": 3,
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
// Carthage building list
|
// Carthage building list
|
||||||
else if (gameState.displayCiv() == "cart"){
|
else if (gameState.displayCiv() == "cart"){
|
||||||
this.targetBuildings = [
|
this.targetBuildings = [
|
||||||
{
|
|
||||||
"template": "structures/{civ}_field",
|
|
||||||
"priority": 100,
|
|
||||||
"count": 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"template": "structures/{civ}_barracks",
|
|
||||||
"priority": 100,
|
|
||||||
"count": 1,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"template": "structures/cart_fortress",
|
"template": "structures/cart_fortress",
|
||||||
"priority": 80,
|
"priority": 80,
|
||||||
@ -125,11 +207,6 @@ var EconomyManager = Class({
|
|||||||
"priority": 75,
|
"priority": 75,
|
||||||
"count": 1,
|
"count": 1,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"template": "structures/{civ}_scout_tower",
|
|
||||||
"priority": 70,
|
|
||||||
"count": 3,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"template": "structures/cart_embassy_celtic",
|
"template": "structures/cart_embassy_celtic",
|
||||||
"priority": 50,
|
"priority": 50,
|
||||||
@ -145,52 +222,22 @@ var EconomyManager = Class({
|
|||||||
"priority": 50,
|
"priority": 50,
|
||||||
"count": 1,
|
"count": 1,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"template": "structures/{civ}_field",
|
|
||||||
"priority": 40,
|
|
||||||
"count": 3,
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
// Celt building list
|
// Celt building list
|
||||||
else if (gameState.displayCiv() == "iber"){
|
else if (gameState.displayCiv() == "iber"){
|
||||||
this.targetBuildings = [
|
this.targetBuildings = [
|
||||||
{
|
|
||||||
"template": "structures/{civ}_field",
|
|
||||||
"priority": 100,
|
|
||||||
"count": 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"template": "structures/{civ}_barracks",
|
|
||||||
"priority": 100,
|
|
||||||
"count": 1,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"template": "structures/iber_fortress",
|
"template": "structures/iber_fortress",
|
||||||
"priority": 80,
|
"priority": 80,
|
||||||
"count": 1,
|
"count": 1,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"template": "structures/{civ}_scout_tower",
|
|
||||||
"priority": 70,
|
|
||||||
"count": 3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"template": "structures/{civ}_field",
|
|
||||||
"priority": 40,
|
|
||||||
"count": 3,
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback option just in case
|
// Fallback option just in case
|
||||||
else {
|
else {
|
||||||
this.targetBuildings = [
|
this.targetBuildings = [
|
||||||
{
|
|
||||||
"template": "structures/{civ}_scout_tower",
|
|
||||||
"priority": 105,
|
|
||||||
"count": 1,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"template": "structures/{civ}_field",
|
"template": "structures/{civ}_field",
|
||||||
"priority": 100,
|
"priority": 100,
|
||||||
@ -244,17 +291,47 @@ var EconomyManager = Class({
|
|||||||
if (gameState.findFoundations().length > 0)
|
if (gameState.findFoundations().length > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// START BY GETTING ALL CCs UP TO SMALL VILLAGE LEVEL
|
||||||
|
for each (var building in this.villageBuildings)
|
||||||
|
{
|
||||||
|
var numBuildings = gameState.countEntitiesAndQueuedWithType(gameState.applyCiv(building.template));
|
||||||
|
|
||||||
|
var wantedtotal = building.count * numCCs;
|
||||||
|
// If we have too few, build another
|
||||||
|
if (numBuildings < wantedtotal && building.template != gameState.applyCiv("structures/{civ}_field"))
|
||||||
|
{
|
||||||
|
planGroups.economyConstruction.addPlan(building.priority,
|
||||||
|
new BuildingConstructionPlan(gameState, building.template, 1)
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (numBuildings < wantedtotal && building.template == gameState.applyCiv("structures/{civ}_field"))
|
||||||
|
{
|
||||||
|
planGroups.economyConstruction.addPlan(building.priority,
|
||||||
|
new BuildingConstructionPlanResources(gameState, building.template, 1)
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// THEN BUILD THE MAIN BASE INTO A TOWN
|
||||||
for each (var building in this.targetBuildings)
|
for each (var building in this.targetBuildings)
|
||||||
{
|
{
|
||||||
var numBuildings = gameState.countEntitiesAndQueuedWithType(gameState.applyCiv(building.template));
|
var numBuildings = gameState.countEntitiesAndQueuedWithType(gameState.applyCiv(building.template));
|
||||||
// If we have too few, build another
|
// If we have too few, build another
|
||||||
if (numBuildings < building.count)
|
if (numBuildings < building.count && building.template != gameState.applyCiv("structures/{civ}_field"))
|
||||||
{
|
{
|
||||||
planGroups.economyConstruction.addPlan(building.priority,
|
planGroups.economyConstruction.addPlan(building.priority,
|
||||||
new BuildingConstructionPlan(gameState, building.template, 1)
|
new BuildingConstructionPlan(gameState, building.template, 1)
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (numBuildings < building.count && building.template == gameState.applyCiv("structures/{civ}_field"))
|
||||||
|
{
|
||||||
|
planGroups.economyConstruction.addPlan(building.priority,
|
||||||
|
new BuildingConstructionPlanResources(gameState, building.template, 1)
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -400,8 +477,8 @@ var EconomyManager = Class({
|
|||||||
var targets = gameState.entities.filter(function(enten) {
|
var targets = gameState.entities.filter(function(enten) {
|
||||||
var foeposition = enten.position();
|
var foeposition = enten.position();
|
||||||
if (foeposition){
|
if (foeposition){
|
||||||
var dist = VectorDistance(foeposition, currentPosition);
|
var dist = SquareVectorDistance(foeposition, currentPosition);
|
||||||
return (enten.isEnemy() && enten.owner()!= 0 && dist < 50);
|
return (enten.isEnemy() && enten.owner()!= 0 && dist < 2500);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return false;
|
return false;
|
||||||
@ -466,7 +543,7 @@ var EconomyManager = Class({
|
|||||||
// Make sure there's actually some of that type
|
// Make sure there's actually some of that type
|
||||||
if (!resourceSupplies[type])
|
if (!resourceSupplies[type])
|
||||||
continue;
|
continue;
|
||||||
|
// The types are food wood stone metal
|
||||||
// Pick the closest one.
|
// Pick the closest one.
|
||||||
// TODO: we should care about distance to dropsites, not (just) to the worker,
|
// TODO: we should care about distance to dropsites, not (just) to the worker,
|
||||||
// and gather rates of workers
|
// and gather rates of workers
|
||||||
@ -481,39 +558,66 @@ var EconomyManager = Class({
|
|||||||
if (supply.entity.hasClass("SeaCreature"))
|
if (supply.entity.hasClass("SeaCreature"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var distcheck = 1000000;
|
var distcheck = 10000000000;
|
||||||
var supplydistcheck = 1000000;
|
var supplydistcheck = 100000000000;
|
||||||
gameState.getOwnEntities().forEach(function(centre) {
|
gameState.getOwnEntities().forEach(function(centre) {
|
||||||
if (centre.hasClass("CivCentre"))
|
if (centre.hasClass("CivCentre"))
|
||||||
{
|
{
|
||||||
var centrePosition = centre.position();
|
var centrePosition = centre.position();
|
||||||
var currentsupplydistcheck = VectorDistance(supply.position, centrePosition);
|
var currentsupplydistcheck = SquareVectorDistance(supply.position, centrePosition);
|
||||||
if (currentsupplydistcheck < currentsupplydistcheck){
|
if (currentsupplydistcheck < currentsupplydistcheck){
|
||||||
supplydistcheck = currentsupplydistcheck;
|
supplydistcheck = currentsupplydistcheck;
|
||||||
}
|
}
|
||||||
var currentdistcheck = VectorDistance(supply.position, centrePosition);
|
var currentdistcheck = SquareVectorDistance(supply.position, centrePosition);
|
||||||
if (currentdistcheck < distcheck){
|
if (currentdistcheck < distcheck){
|
||||||
distcheck = currentdistcheck;
|
distcheck = currentdistcheck;
|
||||||
}
|
}
|
||||||
// Skip targets that are far too far away (e.g. in the enemy base)
|
// Skip targets that are far too far away (e.g. in the enemy base)
|
||||||
}
|
}
|
||||||
else if (centre.hasClass("Economic"))
|
else if (centre.hasClass("DropsiteFood") && type == "food")
|
||||||
{
|
{
|
||||||
var centrePosition = centre.position();
|
var centrePosition = centre.position();
|
||||||
var currentsupplydistcheck = VectorDistance(supply.position, centrePosition);
|
var currentsupplydistcheck = SquareVectorDistance(supply.position, centrePosition);
|
||||||
|
if (currentsupplydistcheck < currentsupplydistcheck){
|
||||||
|
supplydistcheck = currentsupplydistcheck;
|
||||||
|
}
|
||||||
|
// Skip targets that are far too far away (e.g. in the enemy base)
|
||||||
|
}
|
||||||
|
else if (centre.hasClass("DropsiteWood") && type == "wood")
|
||||||
|
{
|
||||||
|
var centrePosition = centre.position();
|
||||||
|
var currentsupplydistcheck = SquareVectorDistance(supply.position, centrePosition);
|
||||||
|
if (currentsupplydistcheck < currentsupplydistcheck){
|
||||||
|
supplydistcheck = currentsupplydistcheck;
|
||||||
|
}
|
||||||
|
// Skip targets that are far too far away (e.g. in the enemy base)
|
||||||
|
}
|
||||||
|
else if (centre.hasClass("DropsiteStone") && type == "stone")
|
||||||
|
{
|
||||||
|
var centrePosition = centre.position();
|
||||||
|
var currentsupplydistcheck = SquareVectorDistance(supply.position, centrePosition);
|
||||||
|
if (currentsupplydistcheck < currentsupplydistcheck){
|
||||||
|
supplydistcheck = currentsupplydistcheck;
|
||||||
|
}
|
||||||
|
// Skip targets that are far too far away (e.g. in the enemy base)
|
||||||
|
}
|
||||||
|
else if (centre.hasClass("DropsiteMetal") && type == "metal")
|
||||||
|
{
|
||||||
|
var centrePosition = centre.position();
|
||||||
|
var currentsupplydistcheck = SquareVectorDistance(supply.position, centrePosition);
|
||||||
if (currentsupplydistcheck < currentsupplydistcheck){
|
if (currentsupplydistcheck < currentsupplydistcheck){
|
||||||
supplydistcheck = currentsupplydistcheck;
|
supplydistcheck = currentsupplydistcheck;
|
||||||
}
|
}
|
||||||
// Skip targets that are far too far away (e.g. in the enemy base)
|
// Skip targets that are far too far away (e.g. in the enemy base)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (distcheck > 500)
|
if (distcheck > 250000)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var dist = VectorDistance(supply.position, workerPosition);
|
var dist = SquareVectorDistance(supply.position, workerPosition);
|
||||||
|
|
||||||
// Skip targets that are far too far away (e.g. in the enemy base)
|
// Skip targets that are far too far away (e.g. in the enemy base)
|
||||||
if (dist > 500)
|
if (dist > 250000)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
supplies.push({ dist: dist, entity: supply.entity });
|
supplies.push({ dist: dist, entity: supply.entity });
|
||||||
@ -527,35 +631,76 @@ var EconomyManager = Class({
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (type == "food"){
|
||||||
|
var whatshallwebuild = "structures/{civ}_farmstead"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var whatshallwebuild = "structures/{civ}_mill"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Start gathering
|
// Start gathering
|
||||||
if (supplies.length)
|
if (supplies.length)
|
||||||
{
|
{
|
||||||
// THIS SHOULD BE A GLOBAL VARIABLE
|
// THIS SHOULD BE A GLOBAL VARIABLE
|
||||||
var currentposformill = supplies[0].entity.position();
|
var currentposformill = supplies[0].entity.position();
|
||||||
var distcheckoldII = 10000;
|
var distcheckoldII = 1000000000;
|
||||||
// CHECK DISTANCE
|
// CHECK DISTANCE
|
||||||
gameState.getOwnEntities().forEach(function(centre) {
|
gameState.getOwnEntities().forEach(function(centre) {
|
||||||
if (centre.hasClass("CivCentre") || centre.hasClass("Economic"))
|
if (centre.hasClass("CivCentre"))
|
||||||
{
|
{
|
||||||
var centrePosition = centre.position();
|
var centrePosition = centre.position();
|
||||||
var distcheckII = VectorDistance(currentposformill, centrePosition);
|
var distcheckII = SquareVectorDistance(currentposformill, centrePosition);
|
||||||
|
if (distcheckII < distcheckoldII){
|
||||||
|
distcheckoldII = distcheckII;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (centre.hasClass("DropsiteFood") && type == "food")
|
||||||
|
{
|
||||||
|
var centrePosition = centre.position();
|
||||||
|
var distcheckII = SquareVectorDistance(currentposformill, centrePosition);
|
||||||
|
if (distcheckII < distcheckoldII){
|
||||||
|
distcheckoldII = distcheckII;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (centre.hasClass("DropsiteWood") && type == "wood")
|
||||||
|
{
|
||||||
|
var centrePosition = centre.position();
|
||||||
|
var distcheckII = SquareVectorDistance(currentposformill, centrePosition);
|
||||||
|
if (distcheckII < distcheckoldII){
|
||||||
|
distcheckoldII = distcheckII;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (centre.hasClass("DropsiteMetal") && type == "metal")
|
||||||
|
{
|
||||||
|
var centrePosition = centre.position();
|
||||||
|
var distcheckII = SquareVectorDistance(currentposformill, centrePosition);
|
||||||
|
if (distcheckII < distcheckoldII){
|
||||||
|
distcheckoldII = distcheckII;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (centre.hasClass("DropsiteStone") && type == "stone")
|
||||||
|
{
|
||||||
|
var centrePosition = centre.position();
|
||||||
|
var distcheckII = SquareVectorDistance(currentposformill, centrePosition);
|
||||||
if (distcheckII < distcheckoldII){
|
if (distcheckII < distcheckoldII){
|
||||||
distcheckoldII = distcheckII;
|
distcheckoldII = distcheckII;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var foundationsyes = false;
|
var foundationsyes = false;
|
||||||
if (gameState.findFoundations().length > 2){
|
if (gameState.findFoundations().length > 1){
|
||||||
foundationsyes = false;
|
foundationsyes = false;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
foundationsyes = true;
|
foundationsyes = true;
|
||||||
}
|
}
|
||||||
|
//warn(type + " is the resource and " + distcheckoldII + " is the distance.");
|
||||||
|
|
||||||
if (distcheckoldII > 60 && foundationsyes == true){
|
if (distcheckoldII > 5000 && foundationsyes == true){
|
||||||
//JuBotAI.prototype.chat("Building Mill");
|
//JuBotAI.prototype.chat("Building Mill");
|
||||||
planGroups.economyConstruction.addPlan(80,
|
planGroups.economyConstruction.addPlan(150,
|
||||||
new BuildingConstructionPlanEcon(gameState, "structures/{civ}_mill", 1, currentposformill)
|
new BuildingConstructionPlanEcon(gameState, whatshallwebuild, 1, currentposformill)
|
||||||
);
|
);
|
||||||
//JuBotAI.prototype.chat("Gathering");
|
//JuBotAI.prototype.chat("Gathering");
|
||||||
ent.gather(supplies[0].entity);
|
ent.gather(supplies[0].entity);
|
||||||
@ -647,6 +792,7 @@ var EconomyManager = Class({
|
|||||||
//this.buildRegroup(gameState, planGroups)
|
//this.buildRegroup(gameState, planGroups)
|
||||||
|
|
||||||
this.checkBuildingList(gameState);
|
this.checkBuildingList(gameState);
|
||||||
|
this.villageBuildingList(gameState);
|
||||||
|
|
||||||
this.reassignRolelessUnits(gameState);
|
this.reassignRolelessUnits(gameState);
|
||||||
|
|
||||||
|
@ -203,8 +203,8 @@ var MilitaryAttackManager = Class({
|
|||||||
var targets = gameState.entities.filter(function(ent) {
|
var targets = gameState.entities.filter(function(ent) {
|
||||||
var foeposition = ent.position();
|
var foeposition = ent.position();
|
||||||
if (foeposition){
|
if (foeposition){
|
||||||
var dist = VectorDistance(foeposition, currentPosition);
|
var dist = SquareVectorDistance(foeposition, currentPosition);
|
||||||
return (ent.isEnemy() && ent.owner()!= 0 && dist < 50);
|
return (ent.isEnemy() && ent.owner()!= 0 && dist < 2500);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return false;
|
return false;
|
||||||
@ -223,6 +223,52 @@ var MilitaryAttackManager = Class({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
CombatAnalyser: function(gameState, planGroups, startunit)
|
||||||
|
{
|
||||||
|
var centrepoint = startunit.position();
|
||||||
|
var targets = gameState.entities.filter(function(squeak) {
|
||||||
|
var currentPosition = squeak.position();
|
||||||
|
if (currentPosition){
|
||||||
|
var dist = SquareVectorDistance(foeposition, currentPosition);
|
||||||
|
return (dist < 2500);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (targets.length)
|
||||||
|
{
|
||||||
|
var forest = 0;
|
||||||
|
var foeTot = 0;
|
||||||
|
var foeCav = 0;
|
||||||
|
var foeInf = 0;
|
||||||
|
var foeBow = 0;
|
||||||
|
var foeRangeCav = 0;
|
||||||
|
targets.forEach(function(item) {
|
||||||
|
if (item.hasClass("ForestPlant")){
|
||||||
|
forest += 1;
|
||||||
|
}
|
||||||
|
if (item.isEnemy() && item.owner != 0 && item.hasClass("Infantry") && item.hasClass("Melee")){
|
||||||
|
foeTot += 1;
|
||||||
|
foeInf += 1;
|
||||||
|
}
|
||||||
|
if (item.isEnemy() && item.owner != 0 && item.hasClass("Infantry" && item.hasClass("Ranged"))){
|
||||||
|
foeTot += 1;
|
||||||
|
foeBow += 1;
|
||||||
|
}
|
||||||
|
if (item.isEnemy() && item.owner != 0 && item.hasClass("Cavalry") && item.hasClass("Melee")){
|
||||||
|
foeTot += 1;
|
||||||
|
foeCav += 1;
|
||||||
|
}
|
||||||
|
if (item.isEnemy() && item.owner != 0 && item.hasClass("Cavalry" && item.hasClass("Ranged"))){
|
||||||
|
foeTot += 1;
|
||||||
|
foeRangeCav += 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
combatcheckMilitia: function(gameState, planGroups, assaultgroup)
|
combatcheckMilitia: function(gameState, planGroups, assaultgroup)
|
||||||
{
|
{
|
||||||
var regroupneeded = gameState.getOwnEntitiesWithRole(assaultgroup);
|
var regroupneeded = gameState.getOwnEntitiesWithRole(assaultgroup);
|
||||||
@ -232,8 +278,8 @@ var MilitaryAttackManager = Class({
|
|||||||
var targets = gameState.entities.filter(function(ent) {
|
var targets = gameState.entities.filter(function(ent) {
|
||||||
var foeposition = ent.position();
|
var foeposition = ent.position();
|
||||||
if (foeposition){
|
if (foeposition){
|
||||||
var dist = VectorDistance(foeposition, currentPosition);
|
var dist = SquareVectorDistance(foeposition, currentPosition);
|
||||||
return (ent.isEnemy() && ent.owner()!= 0 && dist < 50);
|
return (ent.isEnemy() && ent.owner()!= 0 && dist < 2500);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return false;
|
return false;
|
||||||
@ -243,8 +289,8 @@ var MilitaryAttackManager = Class({
|
|||||||
var ownbuildings = gameState.getOwnEntities().filter(function(ent) {
|
var ownbuildings = gameState.getOwnEntities().filter(function(ent) {
|
||||||
var foeposition = ent.position();
|
var foeposition = ent.position();
|
||||||
if (foeposition){
|
if (foeposition){
|
||||||
var dist = VectorDistance(foeposition, currentPosition);
|
var dist = SquareVectorDistance(foeposition, currentPosition);
|
||||||
return (dist < 50 && ent.hasClass("Village"));
|
return (dist < 2500 && ent.hasClass("Village"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return false;
|
return false;
|
||||||
@ -252,12 +298,17 @@ var MilitaryAttackManager = Class({
|
|||||||
});
|
});
|
||||||
if (targets.length >= 5 && ownbuildings.length > 0){
|
if (targets.length >= 5 && ownbuildings.length > 0){
|
||||||
regroupneeded.forEach(function(person) {
|
regroupneeded.forEach(function(person) {
|
||||||
|
var position = targets.toEntityArray()[0].position();
|
||||||
|
var ourposition = person.position();
|
||||||
|
var distance = SquareVectorDistance(position, ourposition);
|
||||||
|
if (distance <= 22500){
|
||||||
var targetrandomiser = Math.floor(Math.random()*targets.length);
|
var targetrandomiser = Math.floor(Math.random()*targets.length);
|
||||||
var target = targets.toEntityArray()[targetrandomiser];
|
var target = targets.toEntityArray()[targetrandomiser];
|
||||||
var targetPos = target.position();
|
var targetPos = target.position();
|
||||||
// TODO: this should be an attack-move command
|
// TODO: this should be an attack-move command
|
||||||
person.move(targetPos[0], targetPos[1]);
|
person.move(targetPos[0], targetPos[1]);
|
||||||
person.setMetadata("role", "militiafighter");
|
person.setMetadata("role", "militiafighter");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -200,9 +200,23 @@ var BuildingConstructionPlan = Class({
|
|||||||
gameState.getOwnEntities().forEach(function(ent) {
|
gameState.getOwnEntities().forEach(function(ent) {
|
||||||
if (ent.hasClass("Structure"))
|
if (ent.hasClass("Structure"))
|
||||||
{
|
{
|
||||||
var infl = 32;
|
var infl = 15;
|
||||||
if (ent.hasClass("CivCentre"))
|
if (ent.hasClass("CivCentre"))
|
||||||
infl *= 5;
|
{
|
||||||
|
infl = infl*5;
|
||||||
|
}
|
||||||
|
else if (ent.hasClass("Village"))
|
||||||
|
{
|
||||||
|
infl = 0;
|
||||||
|
}
|
||||||
|
else if (ent.hasClass("Economic"))
|
||||||
|
{
|
||||||
|
infl = 20;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
infl = 0;
|
||||||
|
}
|
||||||
|
|
||||||
var pos = ent.position();
|
var pos = ent.position();
|
||||||
var x = Math.round(pos[0] / cellSize);
|
var x = Math.round(pos[0] / cellSize);
|
||||||
|
@ -4,6 +4,9 @@ var BuildingConstructionPlanEcon = Class({
|
|||||||
{
|
{
|
||||||
this.type = gameState.applyCiv(type);
|
this.type = gameState.applyCiv(type);
|
||||||
|
|
||||||
|
this.resourceposition = resourcepos;
|
||||||
|
this.pos = this.findGoodPosition(gameState);
|
||||||
|
|
||||||
var template = gameState.getTemplate(this.type);
|
var template = gameState.getTemplate(this.type);
|
||||||
if (!template)
|
if (!template)
|
||||||
{
|
{
|
||||||
@ -12,7 +15,6 @@ var BuildingConstructionPlanEcon = Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.cost = new Resources(template.cost());
|
this.cost = new Resources(template.cost());
|
||||||
this.resourceposition = resourcepos;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
canExecute: function(gameState)
|
canExecute: function(gameState)
|
||||||
@ -37,7 +39,6 @@ var BuildingConstructionPlanEcon = Class({
|
|||||||
// do the building themselves - all we care about is that there is
|
// do the building themselves - all we care about is that there is
|
||||||
// some unit that can start the foundation
|
// some unit that can start the foundation
|
||||||
|
|
||||||
var pos = this.findGoodPosition(gameState);
|
|
||||||
//Check distance from Pos to CC - we don't want to get too far from the centre, for now.
|
//Check distance from Pos to CC - we don't want to get too far from the centre, for now.
|
||||||
// THIS SHOULD BE A GLOBAL VARIABLE
|
// THIS SHOULD BE A GLOBAL VARIABLE
|
||||||
//var distcheckold = 10000;
|
//var distcheckold = 10000;
|
||||||
@ -56,7 +57,7 @@ var BuildingConstructionPlanEcon = Class({
|
|||||||
//});
|
//});
|
||||||
//Distcheck is thus the distance to the nearest CC - we only build if it's low enough.
|
//Distcheck is thus the distance to the nearest CC - we only build if it's low enough.
|
||||||
///if (distcheckold < 400){
|
///if (distcheckold < 400){
|
||||||
builders[0].construct(this.type, pos.x, pos.z, pos.angle);
|
builders[0].construct(this.type, this.pos.x, this.pos.z, this.pos.angle);
|
||||||
//}
|
//}
|
||||||
//else {
|
//else {
|
||||||
//var pos = this.findGoodPositionOldStyle(gameState);
|
//var pos = this.findGoodPositionOldStyle(gameState);
|
||||||
@ -188,7 +189,6 @@ var BuildingConstructionPlanEcon = Class({
|
|||||||
);
|
);
|
||||||
obstructionTiles[i] = (invalidTerritory || (passabilityMap.data[i] & obstructionMask)) ? 0 : 65535;
|
obstructionTiles[i] = (invalidTerritory || (passabilityMap.data[i] & obstructionMask)) ? 0 : 65535;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Engine.DumpImage("tiles0.png", obstructionTiles, passabilityMap.width, passabilityMap.height, 64);
|
// Engine.DumpImage("tiles0.png", obstructionTiles, passabilityMap.width, passabilityMap.height, 64);
|
||||||
|
|
||||||
this.expandInfluences(obstructionTiles, passabilityMap.width, passabilityMap.height);
|
this.expandInfluences(obstructionTiles, passabilityMap.width, passabilityMap.height);
|
||||||
@ -198,7 +198,7 @@ var BuildingConstructionPlanEcon = Class({
|
|||||||
// Compute each tile's closeness to friendly structures:
|
// Compute each tile's closeness to friendly structures:
|
||||||
|
|
||||||
var friendlyTiles = new Uint16Array(passabilityMap.data.length);
|
var friendlyTiles = new Uint16Array(passabilityMap.data.length);
|
||||||
var infl = 100;
|
var infl = 25;
|
||||||
var pos = this.resourceposition;
|
var pos = this.resourceposition;
|
||||||
var x = Math.round(pos[0] / cellSize);
|
var x = Math.round(pos[0] / cellSize);
|
||||||
var z = Math.round(pos[1] / cellSize);
|
var z = Math.round(pos[1] / cellSize);
|
||||||
@ -228,10 +228,69 @@ var BuildingConstructionPlanEcon = Class({
|
|||||||
{
|
{
|
||||||
bestVal = v;
|
bestVal = v;
|
||||||
bestIdx = i;
|
bestIdx = i;
|
||||||
//JuBotAI.prototype.chat("BestVal is " + bestVal + ", and bestIdx is " + bestIdx + ".");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//warn("BestVal is " + bestVal + ", and bestIdx is " + bestIdx + ".");
|
||||||
|
|
||||||
|
if (bestVal <= 5) {
|
||||||
|
//warn("Trying to build Civ Centre");
|
||||||
|
this.type = gameState.applyCiv("structures/{civ}_civil_centre");
|
||||||
|
|
||||||
|
var playerID = gameState.getPlayerID();
|
||||||
|
var buildOwn = template.hasBuildTerritory("own");
|
||||||
|
var buildAlly = template.hasBuildTerritory("ally");
|
||||||
|
var buildNeutral = template.hasBuildTerritory("neutral");
|
||||||
|
var buildEnemy = template.hasBuildTerritory("enemy");
|
||||||
|
// Since this is for CCs, only refrain from building on actual enemy territory.
|
||||||
|
var obstructionTilesII = new Uint16Array(passabilityMap.data.length);
|
||||||
|
for (var i = 0; i < passabilityMap.data.length; ++i)
|
||||||
|
{
|
||||||
|
var tilePlayer = (territoryMap.data[i] & TERRITORY_PLAYER_MASK);
|
||||||
|
var invalidTerritory = (
|
||||||
|
(!buildEnemy && gameState.isPlayerEnemy(tilePlayer) && tilePlayer !=0)
|
||||||
|
);
|
||||||
|
obstructionTilesII[i] = (invalidTerritory || (passabilityMap.data[i] & obstructionMask)) ? 0 : 65535;
|
||||||
|
}
|
||||||
|
// Engine.DumpImage("tiles0.png", obstructionTiles, passabilityMap.width, passabilityMap.height, 64);
|
||||||
|
|
||||||
|
this.expandInfluences(obstructionTilesII, passabilityMap.width, passabilityMap.height);
|
||||||
|
|
||||||
|
// TODO: handle distance restrictions for e.g. CivCentres
|
||||||
|
|
||||||
|
// Compute each tile's closeness to friendly structures:
|
||||||
|
|
||||||
|
var friendlyTiles = new Uint16Array(passabilityMap.data.length);
|
||||||
|
var infl = 50;
|
||||||
|
var pos = this.resourceposition;
|
||||||
|
var x = Math.round(pos[0] / cellSize);
|
||||||
|
var z = Math.round(pos[1] / cellSize);
|
||||||
|
self.addInfluence(friendlyTiles, passabilityMap.width, passabilityMap.height, x, z, infl);
|
||||||
|
|
||||||
|
|
||||||
|
var template = gameState.getTemplate(this.type);
|
||||||
|
var radius = Math.ceil(template.obstructionRadius() / cellSize) + 1;
|
||||||
|
var bestIdx = 0;
|
||||||
|
var bestVal = -1;
|
||||||
|
for (var i = 0; i < passabilityMap.data.length; ++i)
|
||||||
|
{
|
||||||
|
if (obstructionTilesII[i] > radius)
|
||||||
|
{
|
||||||
|
var v = friendlyTiles[i];
|
||||||
|
//var foe = enemyTiles[i];
|
||||||
|
//JuBotAI.prototype.chat(v);
|
||||||
|
//JuBotAI.prototype.chat(i);
|
||||||
|
//JuBotAI.prototype.chat(foe);
|
||||||
|
if (v >= bestVal)
|
||||||
|
{
|
||||||
|
bestVal = v;
|
||||||
|
bestIdx = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//warn("For CC, BestVal is " + bestVal + ", and bestIdx is " + bestIdx + ".");
|
||||||
|
}
|
||||||
|
|
||||||
var x = ((bestIdx % passabilityMap.width) + 0.5) * cellSize;
|
var x = ((bestIdx % passabilityMap.width) + 0.5) * cellSize;
|
||||||
var z = (Math.floor(bestIdx / passabilityMap.width) + 0.5) * cellSize;
|
var z = (Math.floor(bestIdx / passabilityMap.width) + 0.5) * cellSize;
|
||||||
|
|
||||||
@ -242,6 +301,7 @@ var BuildingConstructionPlanEcon = Class({
|
|||||||
var angle = 0.75*Math.PI;
|
var angle = 0.75*Math.PI;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
"canbuild": true,
|
||||||
"x": x,
|
"x": x,
|
||||||
"z": z,
|
"z": z,
|
||||||
"angle": angle
|
"angle": angle
|
||||||
|
Loading…
Reference in New Issue
Block a user