various small petra tunings
This was SVN commit r15880.
This commit is contained in:
parent
a29e233fdf
commit
620399270d
@ -590,9 +590,20 @@ m.BaseManager.prototype.setWorkersIdleByPriority = function(gameState)
|
|||||||
// but we require a bit more to avoid too frequent changes
|
// but we require a bit more to avoid too frequent changes
|
||||||
if ((scale*moreNeed.wanted - moreNeed.current) - (scale*lessNeed.wanted - lessNeed.current) > 1.5)
|
if ((scale*moreNeed.wanted - moreNeed.current) - (scale*lessNeed.wanted - lessNeed.current) > 1.5)
|
||||||
{
|
{
|
||||||
this.gatherersByType(gameState, lessNeed.type).forEach( function (ent) {
|
let only = undefined;
|
||||||
|
// in average, females are less efficient for stone and metal, and citizenSoldiers for food
|
||||||
|
let gatherers = this.gatherersByType(gameState, lessNeed.type);
|
||||||
|
if (lessNeed.type === "food" && gatherers.filter(API3.Filters.byClass("CitizenSoldier")).length)
|
||||||
|
only = "CitizenSoldier";
|
||||||
|
else if ((lessNeed.type === "stone" || lessNeed.type === "metal") && moreNeed.type !== "stone" && moreNeed.type !== "metal"
|
||||||
|
&& gatherers.filter(API3.Filters.byClass("Female")).length)
|
||||||
|
only = "Female";
|
||||||
|
|
||||||
|
gatherers.forEach( function (ent) {
|
||||||
if (nb === 0)
|
if (nb === 0)
|
||||||
return;
|
return;
|
||||||
|
if (only && !ent.hasClass(only))
|
||||||
|
return;
|
||||||
--nb;
|
--nb;
|
||||||
ent.stopMoving();
|
ent.stopMoving();
|
||||||
ent.setMetadata(PlayerID, "gather-type", moreNeed.type);
|
ent.setMetadata(PlayerID, "gather-type", moreNeed.type);
|
||||||
|
@ -157,7 +157,7 @@ m.Config.prototype.setConfig = function(gameState)
|
|||||||
if (gameState.getPopulationMax() < 300)
|
if (gameState.getPopulationMax() < 300)
|
||||||
this.popScaling = Math.sqrt(gameState.getPopulationMax() / 300);
|
this.popScaling = Math.sqrt(gameState.getPopulationMax() / 300);
|
||||||
|
|
||||||
if (this.debug < 1)
|
if (this.debug < 2)
|
||||||
return;
|
return;
|
||||||
API3.warn(" >>> Petra bot: personality = " + uneval(this.personality));
|
API3.warn(" >>> Petra bot: personality = " + uneval(this.personality));
|
||||||
};
|
};
|
||||||
|
@ -28,7 +28,6 @@ m.HQ = function(Config)
|
|||||||
this.currentRates = { "food": 0, "wood": 0, "stone":0, "metal": 0 };
|
this.currentRates = { "food": 0, "wood": 0, "stone":0, "metal": 0 };
|
||||||
this.lastFailedGather = { "wood": undefined, "stone": undefined, "metal": undefined };
|
this.lastFailedGather = { "wood": undefined, "stone": undefined, "metal": undefined };
|
||||||
|
|
||||||
|
|
||||||
// this means we'll have about a big third of women, and thus we can maximize resource gathering rates.
|
// this means we'll have about a big third of women, and thus we can maximize resource gathering rates.
|
||||||
this.femaleRatio = this.Config.Economy.femaleRatio;
|
this.femaleRatio = this.Config.Economy.femaleRatio;
|
||||||
|
|
||||||
|
@ -108,8 +108,6 @@ m.createObstructionMap = function(gameState, accessIndex, template)
|
|||||||
var tileAccessible = (accessIndex === gameState.ai.accessibility.landPassMap[i]);
|
var tileAccessible = (accessIndex === gameState.ai.accessibility.landPassMap[i]);
|
||||||
else
|
else
|
||||||
var tileAccessible = true;
|
var tileAccessible = true;
|
||||||
if (placementType === "shore")
|
|
||||||
tileAccessible = true;
|
|
||||||
obstructionTiles[i] = (!tileAccessible || invalidTerritory || (passabilityMap.data[i] & obstructionMask)) ? 0 : 255;
|
obstructionTiles[i] = (!tileAccessible || invalidTerritory || (passabilityMap.data[i] & obstructionMask)) ? 0 : 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -469,7 +469,37 @@ m.NavalManager.prototype.moveApart = function(gameState)
|
|||||||
for (var sea = 0; sea < gameState.ai.accessibility.regionSize.length; ++sea)
|
for (var sea = 0; sea < gameState.ai.accessibility.regionSize.length; ++sea)
|
||||||
{
|
{
|
||||||
this.seaShips[sea].forEach(function(ship) {
|
this.seaShips[sea].forEach(function(ship) {
|
||||||
|
if (ship.hasClass("FishingBoat")) // small ships should not be a problem
|
||||||
|
return;
|
||||||
if (ship.getMetadata(PlayerID, "transporter") === undefined)
|
if (ship.getMetadata(PlayerID, "transporter") === undefined)
|
||||||
|
{
|
||||||
|
if (ship.isIdle()) // do not stay idle near a dock to not disturb other ships
|
||||||
|
{
|
||||||
|
gameState.getOwnStructures().filter(API3.Filters.byClass("Dock")).forEach(function(dock) {
|
||||||
|
if (dock.getMetadata(PlayerID, "sea") !== sea)
|
||||||
|
return;
|
||||||
|
if (API3.SquareVectorDistance(ship.position(), dock.position()) > 2500)
|
||||||
|
return;
|
||||||
|
ship.moveApart(dock.position(), 50);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.seaShips[sea].forEach(function(blockingShip) {
|
||||||
|
if (blockingShip === ship || !blockingShip.isIdle())
|
||||||
|
return;
|
||||||
|
if (API3.SquareVectorDistance(ship.position(), blockingShip.position()) > 900)
|
||||||
|
return;
|
||||||
|
if (blockingShip.getMetadata(PlayerID, "transporter") === undefined)
|
||||||
|
blockingShip.moveApart(ship.position(), 12);
|
||||||
|
else
|
||||||
|
blockingShip.moveApart(ship.position(), 6);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
gameState.ai.HQ.tradeManager.traders.filter(API3.Filters.byMetadata(PlayerID, "sea", sea)).forEach(function(ship) {
|
||||||
|
if (ship.getMetadata(PlayerID, "route") === undefined)
|
||||||
return;
|
return;
|
||||||
self.seaShips[sea].forEach(function(blockingShip) {
|
self.seaShips[sea].forEach(function(blockingShip) {
|
||||||
if (blockingShip === ship || !blockingShip.isIdle())
|
if (blockingShip === ship || !blockingShip.isIdle())
|
||||||
|
@ -95,7 +95,7 @@ m.TrainingPlan.prototype.start = function(gameState)
|
|||||||
this.metadata.base = trainers[0].getMetadata(PlayerID, "base");
|
this.metadata.base = trainers[0].getMetadata(PlayerID, "base");
|
||||||
trainers[0].train(this.type, this.number, this.metadata, this.promotedTypes(gameState));
|
trainers[0].train(this.type, this.number, this.metadata, this.promotedTypes(gameState));
|
||||||
}
|
}
|
||||||
else if (gameState.ai.Config.debug > 1)
|
else if (gameState.Config.debug > 1)
|
||||||
warn(" no trainers for this queue " + this.type);
|
warn(" no trainers for this queue " + this.type);
|
||||||
this.onStart(gameState);
|
this.onStart(gameState);
|
||||||
};
|
};
|
||||||
@ -120,7 +120,7 @@ m.TrainingPlan.prototype.promotedTypes = function(gameState)
|
|||||||
promotion = gameState.getTemplate(promotion).promotion();
|
promotion = gameState.getTemplate(promotion).promotion();
|
||||||
if (previous === promotion)
|
if (previous === promotion)
|
||||||
{
|
{
|
||||||
if (gameState.ai.Config.debug > 0)
|
if (gameState.Config.debug > 0)
|
||||||
API3.warn(" unit " + promotion + " is its own promoted unit");
|
API3.warn(" unit " + promotion + " is its own promoted unit");
|
||||||
promotion = undefined;
|
promotion = undefined;
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ m.TransportPlan.prototype.assignUnitToShip = function(gameState, ent)
|
|||||||
{
|
{
|
||||||
ent.setMetadata(PlayerID, "onBoard", ship.id());
|
ent.setMetadata(PlayerID, "onBoard", ship.id());
|
||||||
done = true;
|
done = true;
|
||||||
if (self.debug > 0)
|
if (self.debug > 1)
|
||||||
{
|
{
|
||||||
if (ent.getMetadata(PlayerID, "role") === "attack")
|
if (ent.getMetadata(PlayerID, "role") === "attack")
|
||||||
Engine.PostCommand(PlayerID,{"type": "set-shading-color", "entities": [ent.id()], "rgb": [2,0,0]});
|
Engine.PostCommand(PlayerID,{"type": "set-shading-color", "entities": [ent.id()], "rgb": [2,0,0]});
|
||||||
@ -252,7 +252,7 @@ m.TransportPlan.prototype.onBoarding = function(gameState)
|
|||||||
var ship = gameState.getEntityById(shipId);
|
var ship = gameState.getEntityById(shipId);
|
||||||
if (!self.boardingPos[shipId])
|
if (!self.boardingPos[shipId])
|
||||||
{
|
{
|
||||||
self.boardingPos[shipId] = self.getBoardingPos(gameState, self.startIndex, self.sea, ent.position(), false);
|
self.boardingPos[shipId] = self.getBoardingPos(gameState, ship, self.startIndex, self.sea, ent.position(), false);
|
||||||
ship.move(self.boardingPos[shipId][0], self.boardingPos[shipId][1]);
|
ship.move(self.boardingPos[shipId][0], self.boardingPos[shipId][1]);
|
||||||
ship.setMetadata(PlayerID, "timeGarrison", time);
|
ship.setMetadata(PlayerID, "timeGarrison", time);
|
||||||
}
|
}
|
||||||
@ -282,7 +282,7 @@ m.TransportPlan.prototype.onBoarding = function(gameState)
|
|||||||
self.nTry[shipId] = 0;
|
self.nTry[shipId] = 0;
|
||||||
if (self.debug > 1)
|
if (self.debug > 1)
|
||||||
API3.warn("ship " + shipId + " new attempt for a landing point ");
|
API3.warn("ship " + shipId + " new attempt for a landing point ");
|
||||||
self.boardingPos[shipId] = self.getBoardingPos(gameState, self.startIndex, self.sea, undefined, false);
|
self.boardingPos[shipId] = self.getBoardingPos(gameState, ship, self.startIndex, self.sea, undefined, false);
|
||||||
}
|
}
|
||||||
ship.move(self.boardingPos[shipId][0], self.boardingPos[shipId][1]);
|
ship.move(self.boardingPos[shipId][0], self.boardingPos[shipId][1]);
|
||||||
ship.setMetadata(PlayerID, "timeGarrison", time);
|
ship.setMetadata(PlayerID, "timeGarrison", time);
|
||||||
@ -328,7 +328,7 @@ m.TransportPlan.prototype.onBoarding = function(gameState)
|
|||||||
|
|
||||||
this.ships.forEach(function (ship) {
|
this.ships.forEach(function (ship) {
|
||||||
self.boardingPos[ship.id()] = undefined;
|
self.boardingPos[ship.id()] = undefined;
|
||||||
self.boardingPos[ship.id()] = self.getBoardingPos(gameState, self.endIndex, self.sea, self.endPos, true);
|
self.boardingPos[ship.id()] = self.getBoardingPos(gameState, ship, self.endIndex, self.sea, self.endPos, true);
|
||||||
ship.move(self.boardingPos[ship.id()][0], self.boardingPos[ship.id()][1]);
|
ship.move(self.boardingPos[ship.id()][0], self.boardingPos[ship.id()][1]);
|
||||||
});
|
});
|
||||||
this.state = "sailing";
|
this.state = "sailing";
|
||||||
@ -351,7 +351,7 @@ m.TransportPlan.prototype.isOnBoard = function(ent)
|
|||||||
};
|
};
|
||||||
|
|
||||||
// when avoidEnnemy is true, we try to not board/unboard in ennemy territory
|
// when avoidEnnemy is true, we try to not board/unboard in ennemy territory
|
||||||
m.TransportPlan.prototype.getBoardingPos = function(gameState, landIndex, seaIndex, destination, avoidEnnemy)
|
m.TransportPlan.prototype.getBoardingPos = function(gameState, ship, landIndex, seaIndex, destination, avoidEnnemy)
|
||||||
{
|
{
|
||||||
if (!gameState.ai.HQ.navalManager.landingZones[landIndex][seaIndex])
|
if (!gameState.ai.HQ.navalManager.landingZones[landIndex][seaIndex])
|
||||||
{
|
{
|
||||||
@ -359,7 +359,7 @@ m.TransportPlan.prototype.getBoardingPos = function(gameState, landIndex, seaInd
|
|||||||
return destination;
|
return destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
var startPos = this.transportShips.getCentrePosition();
|
var startPos = ship.position();
|
||||||
var distmin = Math.min();
|
var distmin = Math.min();
|
||||||
var posmin = destination;
|
var posmin = destination;
|
||||||
var width = gameState.getMap().width;
|
var width = gameState.getMap().width;
|
||||||
@ -380,7 +380,7 @@ m.TransportPlan.prototype.getBoardingPos = function(gameState, landIndex, seaInd
|
|||||||
// require a small distance between all ships of the transport plan to avoid path finder problems
|
// require a small distance between all ships of the transport plan to avoid path finder problems
|
||||||
// this is also used when the ship is blocked and we want to find a new boarding point
|
// this is also used when the ship is blocked and we want to find a new boarding point
|
||||||
for (var shipId in this.boardingPos)
|
for (var shipId in this.boardingPos)
|
||||||
if (this.boardingPos[shipId] !== undefined && API3.SquareVectorDistance(this.boardingPos[shipId], pos) < 100)
|
if (this.boardingPos[shipId] !== undefined && API3.SquareVectorDistance(this.boardingPos[shipId], pos) < 225)
|
||||||
dist += 1000000;
|
dist += 1000000;
|
||||||
if (dist > distmin)
|
if (dist > distmin)
|
||||||
continue;
|
continue;
|
||||||
@ -488,7 +488,7 @@ m.TransportPlan.prototype.onSailing = function(gameState)
|
|||||||
}
|
}
|
||||||
for (var shipId in shipsToMove)
|
for (var shipId in shipsToMove)
|
||||||
{
|
{
|
||||||
this.boardingPos[shipId] = this.getBoardingPos(gameState, this.endIndex, this.sea, this.endPos, true);
|
this.boardingPos[shipId] = this.getBoardingPos(gameState, shipsToMove[shipId], this.endIndex, this.sea, this.endPos, true);
|
||||||
shipsToMove[shipId].move(this.boardingPos[shipId][0], this.boardingPos[shipId][1]);
|
shipsToMove[shipId].move(this.boardingPos[shipId][0], this.boardingPos[shipId][1]);
|
||||||
}
|
}
|
||||||
this.unloaded = [];
|
this.unloaded = [];
|
||||||
@ -497,7 +497,7 @@ m.TransportPlan.prototype.onSailing = function(gameState)
|
|||||||
{
|
{
|
||||||
this.ships.forEach(function (ship) {
|
this.ships.forEach(function (ship) {
|
||||||
self.boardingPos[ship.id()] = undefined;
|
self.boardingPos[ship.id()] = undefined;
|
||||||
self.boardingPos[ship.id()] = self.getBoardingPos(gameState, self.endIndex, self.sea, self.endPos, true);
|
self.boardingPos[ship.id()] = self.getBoardingPos(gameState, ship, self.endIndex, self.sea, self.endPos, true);
|
||||||
ship.move(self.boardingPos[ship.id()][0], self.boardingPos[ship.id()][1]);
|
ship.move(self.boardingPos[ship.id()][0], self.boardingPos[ship.id()][1]);
|
||||||
});
|
});
|
||||||
this.canceled = undefined;
|
this.canceled = undefined;
|
||||||
@ -549,7 +549,7 @@ m.TransportPlan.prototype.onSailing = function(gameState)
|
|||||||
self.nTry[shipId] = 0;
|
self.nTry[shipId] = 0;
|
||||||
if (self.debug > 1)
|
if (self.debug > 1)
|
||||||
API3.warn(shipId + " new attempt for a landing point ");
|
API3.warn(shipId + " new attempt for a landing point ");
|
||||||
self.boardingPos[shipId] = self.getBoardingPos(gameState, self.endIndex, self.sea, undefined, true);
|
self.boardingPos[shipId] = self.getBoardingPos(gameState, ship, self.endIndex, self.sea, undefined, true);
|
||||||
}
|
}
|
||||||
ship.move(self.boardingPos[shipId][0], self.boardingPos[shipId][1]);
|
ship.move(self.boardingPos[shipId][0], self.boardingPos[shipId][1]);
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
<History>The Ptolemaic kings invited Greeks, Macedonians, Galatians (Gauls), Cretans, and Thracians alike to settle within Egypt in military colonies called cleruchies (klēroukhia). Under this arrangement, the settlers were given a plot of land, or a kleros, and in return were required to serve in the great king's army when called to duty. This created a upper-middle class of military settlers who owed their livelihoods and fortunes to the Ptolemaic kings and helped grow the available manpower for the imperial Ptolemaic army. A side effect of this system was that it drained the Greek homeland of military-aged men, a contributing factor to Greece's eventual conquest by Rome.</History>
|
<History>The Ptolemaic kings invited Greeks, Macedonians, Galatians (Gauls), Cretans, and Thracians alike to settle within Egypt in military colonies called cleruchies (klēroukhia). Under this arrangement, the settlers were given a plot of land, or a kleros, and in return were required to serve in the great king's army when called to duty. This created a upper-middle class of military settlers who owed their livelihoods and fortunes to the Ptolemaic kings and helped grow the available manpower for the imperial Ptolemaic army. A side effect of this system was that it drained the Greek homeland of military-aged men, a contributing factor to Greece's eventual conquest by Rome.</History>
|
||||||
<Tooltip>This is the Ptolemaic expansion building, similar to Civic Centers for other factions. It is weaker and carries a smaller territory influence, but is cheaper and built faster.
|
<Tooltip>This is the Ptolemaic expansion building, similar to Civic Centers for other factions. It is weaker and carries a smaller territory influence, but is cheaper and built faster.
|
||||||
- Train settler-soldiers of various nationalities.
|
- Train settler-soldiers of various nationalities.
|
||||||
- Min. distance from other Military Colonies: 100 meters.</Tooltip>
|
- Min. distance from other Military Colonies: 120 meters.</Tooltip>
|
||||||
<Icon>structures/military_settlement.png</Icon>
|
<Icon>structures/military_settlement.png</Icon>
|
||||||
<RequiredTechnology>phase_town</RequiredTechnology>
|
<RequiredTechnology>phase_town</RequiredTechnology>
|
||||||
</Identity>
|
</Identity>
|
||||||
|
Loading…
Reference in New Issue
Block a user