forked from mirrors/0ad
petra cleanup
This was SVN commit r19050.
This commit is contained in:
@@ -214,37 +214,39 @@ m.Army.prototype.removeOwn = function (gameState, id, Entity)
|
||||
this.assignedTo[id] = undefined;
|
||||
|
||||
let ent = Entity ? Entity : gameState.getEntityById(id);
|
||||
if (ent) // TODO recompute strength when no entities (could happen if capture+destroy)
|
||||
if (!ent)
|
||||
return true;
|
||||
|
||||
this.evaluateStrength(ent, true, true);
|
||||
ent.setMetadata(PlayerID, "PartOfArmy", undefined);
|
||||
if (ent.getMetadata(PlayerID, "plan") === -2)
|
||||
ent.setMetadata(PlayerID, "plan", -1);
|
||||
else
|
||||
ent.setMetadata(PlayerID, "plan", undefined);
|
||||
|
||||
let formerSubrole = ent.getMetadata(PlayerID, "formerSubrole");
|
||||
if (formerSubrole !== undefined)
|
||||
ent.setMetadata(PlayerID, "subrole", formerSubrole);
|
||||
else
|
||||
ent.setMetadata(PlayerID, "subrole", undefined);
|
||||
ent.setMetadata(PlayerID, "formerSubrole", undefined);
|
||||
|
||||
/*
|
||||
// TODO be sure that all units in the transport need the cancelation
|
||||
if (!ent.position()) // this unit must still be in a transport plan ... try to cancel it
|
||||
{
|
||||
this.evaluateStrength(ent, true, true);
|
||||
ent.setMetadata(PlayerID, "PartOfArmy", undefined);
|
||||
if (ent.getMetadata(PlayerID, "plan") === -2)
|
||||
ent.setMetadata(PlayerID, "plan", -1);
|
||||
else
|
||||
ent.setMetadata(PlayerID, "plan", undefined);
|
||||
|
||||
let formerSubrole = ent.getMetadata(PlayerID, "formerSubrole");
|
||||
if (formerSubrole !== undefined)
|
||||
ent.setMetadata(PlayerID, "subrole", formerSubrole);
|
||||
else
|
||||
ent.setMetadata(PlayerID, "subrole", undefined);
|
||||
ent.setMetadata(PlayerID, "formerSubrole", undefined);
|
||||
|
||||
// TODO be sure that all units in the transport need the cancelation
|
||||
/* if (!ent.position()) // this unit must still be in a transport plan ... try to cancel it
|
||||
let planID = ent.getMetadata(PlayerID, "transport");
|
||||
// no plans must mean that the unit was in a ship which was destroyed, so do nothing
|
||||
if (planID)
|
||||
{
|
||||
let planID = ent.getMetadata(PlayerID, "transport");
|
||||
// no plans must mean that the unit was in a ship which was destroyed, so do nothing
|
||||
if (planID)
|
||||
{
|
||||
if (gameState.ai.Config.debug > 0)
|
||||
warn("ent from army still in transport plan: plan " + planID + " canceled");
|
||||
let plan = gameState.ai.HQ.navalManager.getPlan(planID);
|
||||
if (plan && !plan.canceled)
|
||||
plan.cancelTransport(gameState);
|
||||
}
|
||||
} */
|
||||
if (gameState.ai.Config.debug > 0)
|
||||
warn("ent from army still in transport plan: plan " + planID + " canceled");
|
||||
let plan = gameState.ai.HQ.navalManager.getPlan(planID);
|
||||
if (plan && !plan.canceled)
|
||||
plan.cancelTransport(gameState);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
@@ -81,6 +81,44 @@ m.getMaxStrength = function(ent, againstClass)
|
||||
return strength * ent.maxHitpoints() / 100.0;
|
||||
};
|
||||
|
||||
/** Get access and cache it in metadata if not already done */
|
||||
m.GetLandAccess = function(gameState, ent)
|
||||
{
|
||||
let access = ent.getMetadata(PlayerID, "access");
|
||||
if (!access)
|
||||
{
|
||||
access = gameState.ai.accessibility.getAccessValue(ent.position());
|
||||
ent.setMetadata(PlayerID, "access", access);
|
||||
}
|
||||
return access;
|
||||
};
|
||||
|
||||
m.GetSeaAccess = function(gameState, ent)
|
||||
{
|
||||
let sea = ent.getMetadata(PlayerID, "sea");
|
||||
if (!sea)
|
||||
{
|
||||
sea = gameState.ai.accessibility.getAccessValue(ent.position(), true);
|
||||
if (sea < 2) // pre-positioned docks are sometimes not well positionned
|
||||
{
|
||||
let entPos = ent.position();
|
||||
let radius = ent.footprintRadius();
|
||||
for (let i = 0; i < 16; ++i)
|
||||
{
|
||||
let pos = [ entPos[0] + radius*Math.cos(i*Math.PI/8),
|
||||
entPos[1] + radius*Math.sin(i*Math.PI/8) ];
|
||||
sea = gameState.ai.accessibility.getAccessValue(pos, true);
|
||||
if (sea >= 2)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (sea < 2)
|
||||
API3.warn("ERROR in Petra GetSeaAccess because of dock position with index " + sea);
|
||||
ent.setMetadata(PlayerID, "sea", sea);
|
||||
}
|
||||
return sea;
|
||||
};
|
||||
|
||||
/** Decide if we should try to capture or destroy */
|
||||
m.allowCapture = function(ent, target)
|
||||
{
|
||||
|
||||
@@ -79,15 +79,7 @@ m.GarrisonManager.prototype.update = function(gameState, events)
|
||||
}
|
||||
else
|
||||
{
|
||||
let ok = false;
|
||||
for (let order of ent.unitAIOrderData())
|
||||
{
|
||||
if (!order.target || order.target != id)
|
||||
continue;
|
||||
ok = true;
|
||||
break;
|
||||
}
|
||||
if (ok)
|
||||
if (ent.unitAIOrderData().some(order => order.target && order.target == id))
|
||||
continue;
|
||||
if (ent.getMetadata(PlayerID, "garrisonHolder") == id)
|
||||
{
|
||||
|
||||
@@ -1093,11 +1093,11 @@ m.HQ.prototype.findMarketLocation = function(gameState, template)
|
||||
{
|
||||
if (isNavalMarket && market.hasClass("NavalMarket"))
|
||||
{
|
||||
if (this.navalManager.getDockIndex(gameState, market, true) !== gameState.ai.accessibility.getAccessValue(pos, true))
|
||||
if (m.GetSeaAccess(gameState, market) !== gameState.ai.accessibility.getAccessValue(pos, true))
|
||||
continue;
|
||||
gainMultiplier = traderTemplatesGains.navalGainMultiplier;
|
||||
}
|
||||
else if (gameState.ai.accessibility.getAccessValue(market.position()) === index)
|
||||
else if (m.GetLandAccess(gameState, market) === index)
|
||||
gainMultiplier = traderTemplatesGains.landGainMultiplier;
|
||||
else
|
||||
continue;
|
||||
|
||||
@@ -171,7 +171,7 @@ m.NavalManager.prototype.init = function(gameState, deserializing)
|
||||
for (let ship of this.ships.values())
|
||||
this.setShipIndex(gameState, ship);
|
||||
for (let dock of this.docks.values())
|
||||
this.setDockIndex(gameState, dock);
|
||||
this.SetAccessIndices(gameState, dock);
|
||||
};
|
||||
|
||||
m.NavalManager.prototype.updateFishingBoats = function(sea, num)
|
||||
@@ -188,54 +188,18 @@ m.NavalManager.prototype.resetFishingBoats = function(gameState, sea)
|
||||
this.wantedFishShips.fill(0);
|
||||
};
|
||||
|
||||
m.NavalManager.prototype.SetAccessIndices = function(gameState, ent)
|
||||
{
|
||||
m.GetLandAccess(gameState, ent);
|
||||
m.GetSeaAccess(gameState, ent);
|
||||
};
|
||||
|
||||
m.NavalManager.prototype.setShipIndex = function(gameState, ship)
|
||||
{
|
||||
let sea = gameState.ai.accessibility.getAccessValue(ship.position(), true);
|
||||
ship.setMetadata(PlayerID, "sea", sea);
|
||||
};
|
||||
|
||||
m.NavalManager.prototype.setDockIndex = function(gameState, dock)
|
||||
{
|
||||
let land = dock.getMetadata(PlayerID, "access");
|
||||
if (land === undefined)
|
||||
{
|
||||
land = this.getDockIndex(gameState, dock, false);
|
||||
dock.setMetadata(PlayerID, "access", land);
|
||||
}
|
||||
let sea = dock.getMetadata(PlayerID, "sea");
|
||||
if (sea === undefined)
|
||||
{
|
||||
sea = this.getDockIndex(gameState, dock, true);
|
||||
dock.setMetadata(PlayerID, "sea", sea);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* get the indices for our starting docks and those of our allies
|
||||
* land index when onWater=false, sea indes when true
|
||||
*/
|
||||
m.NavalManager.prototype.getDockIndex = function(gameState, dock, onWater)
|
||||
{
|
||||
let index = gameState.ai.accessibility.getAccessValue(dock.position(), onWater);
|
||||
if (index < 2)
|
||||
{
|
||||
// pre-positioned docks are sometimes not well positionned
|
||||
let dockPos = dock.position();
|
||||
let radius = dock.footprintRadius();
|
||||
for (let i = 0; i < 16; i++)
|
||||
{
|
||||
let pos = [ dockPos[0] + radius*Math.cos(i*Math.PI/8), dockPos[1] + radius*Math.sin(i*Math.PI/8)];
|
||||
|
||||
index = gameState.ai.accessibility.getAccessValue(pos, onWater);
|
||||
if (index >= 2)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (index < 2)
|
||||
API3.warn("ERROR in Petra navalManager because of dock position (onWater=" + onWater + ") index " + index);
|
||||
return index;
|
||||
};
|
||||
|
||||
/** get the list of seas (or lands) around this region not connected by a dock */
|
||||
m.NavalManager.prototype.getUnconnectedSeas = function(gameState, region)
|
||||
{
|
||||
@@ -259,7 +223,7 @@ m.NavalManager.prototype.checkEvents = function(gameState, queues, events)
|
||||
continue;
|
||||
let entity = gameState.getEntityById(evt.newentity);
|
||||
if (entity && entity.hasClass("Dock") && entity.isOwn(PlayerID))
|
||||
this.setDockIndex(gameState, entity);
|
||||
this.SetAccessIndices(gameState, entity);
|
||||
}
|
||||
|
||||
for (let evt of events.TrainingFinished)
|
||||
@@ -326,7 +290,7 @@ m.NavalManager.prototype.checkEvents = function(gameState, queues, events)
|
||||
{
|
||||
let ent = gameState.getEntityById(evt.entity);
|
||||
if (ent && ent.hasClass("Dock"))
|
||||
this.setDockIndex(gameState, ent);
|
||||
this.setAccessIndices(gameState, ent);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -412,16 +412,16 @@ m.TradeManager.prototype.checkRoutes = function(gameState, accessIndex)
|
||||
{
|
||||
if (!m1.position())
|
||||
continue;
|
||||
let access1 = gameState.ai.accessibility.getAccessValue(m1.position());
|
||||
let sea1 = m1.hasClass("NavalMarket") ? gameState.ai.HQ.navalManager.getDockIndex(gameState, m1, true) : undefined;
|
||||
let access1 = m.GetLandAccess(gameState, m1);
|
||||
let sea1 = m1.hasClass("NavalMarket") ? m.GetSeaAccess(gameState, m1) : undefined;
|
||||
for (let m2 of market2)
|
||||
{
|
||||
if (m1.id() === m2.id())
|
||||
continue;
|
||||
if (!m2.position())
|
||||
continue;
|
||||
let access2 = gameState.ai.accessibility.getAccessValue(m2.position());
|
||||
let sea2 = m2.hasClass("NavalMarket") ? gameState.ai.HQ.navalManager.getDockIndex(gameState, m2, true) : undefined;
|
||||
let access2 = m.GetLandAccess(gameState, m2);
|
||||
let sea2 = m2.hasClass("NavalMarket") ? m.GetSeaAccess(gameState, m2) : undefined;
|
||||
let land = access1 == access2 ? access1 : undefined;
|
||||
let sea = (sea1 && sea1 == sea2) ? sea1 : undefined;
|
||||
if (!land && !sea)
|
||||
|
||||
@@ -167,12 +167,7 @@ m.Worker.prototype.update = function(gameState, ent)
|
||||
else
|
||||
{
|
||||
let access = gameState.ai.accessibility.getAccessValue(ent.position());
|
||||
let goalAccess = target.getMetadata(PlayerID, "access");
|
||||
if (!goalAccess)
|
||||
{
|
||||
goalAccess = gameState.ai.accessibility.getAccessValue(target.position());
|
||||
target.setMetadata(PlayerID, "access", goalAccess);
|
||||
}
|
||||
let goalAccess = m.GetLandAccess(gameState, target);
|
||||
if (access === goalAccess)
|
||||
ent.repair(target, target.hasClass("House")); // autocontinue=true for houses
|
||||
else
|
||||
@@ -459,12 +454,7 @@ m.Worker.prototype.startGathering = function(gameState)
|
||||
return false;
|
||||
if (foundation.resourceDropsiteTypes() && foundation.resourceDropsiteTypes().indexOf(resource) !== -1)
|
||||
{
|
||||
let foundationAccess = foundation.getMetadata(PlayerID, "access");
|
||||
if (!foundationAccess)
|
||||
{
|
||||
foundationAccess = gameState.ai.accessibility.getAccessValue(foundation.position());
|
||||
foundation.setMetadata(PlayerID, "access", foundationAccess);
|
||||
}
|
||||
let foundationAccess = m.GetLandAccess(gameState, foundation);
|
||||
if (navalManager.requireTransport(gameState, this.ent, access, foundationAccess, foundation.position()))
|
||||
{
|
||||
if (foundation.getMetadata(PlayerID, "base") !== this.baseID)
|
||||
@@ -557,13 +547,7 @@ m.Worker.prototype.startHunting = function(gameState, position)
|
||||
// owner !== PlayerID can only happen when hasSharedDropsites === true, so no need to test it again
|
||||
if (owner !== PlayerID && (!dropsite.isSharedDropsite() || !gameState.isPlayerMutualAlly(owner)))
|
||||
continue;
|
||||
let dropsiteAccess = dropsite.getMetadata(PlayerID, "access");
|
||||
if (!dropsiteAccess)
|
||||
{
|
||||
dropsiteAccess = gameState.ai.accessibility.getAccessValue(dropsite.position());
|
||||
dropsite.setMetadata(PlayerID, "access", dropsiteAccess);
|
||||
}
|
||||
if (dropsiteAccess !== access)
|
||||
if (access !== m.GetLandAccess(gameState, dropsite))
|
||||
continue;
|
||||
distMin = Math.min(distMin, API3.SquareVectorDistance(pos, dropsite.position()));
|
||||
}
|
||||
@@ -667,13 +651,7 @@ m.Worker.prototype.startFishing = function(gameState)
|
||||
// owner !== PlayerID can only happen when hasSharedDropsites === true, so no need to test it again
|
||||
if (owner !== PlayerID && (!dropsite.isSharedDropsite() || !gameState.isPlayerMutualAlly(owner)))
|
||||
continue;
|
||||
let dropsiteSea = dropsite.getMetadata(PlayerID, "sea");
|
||||
if (!dropsiteSea)
|
||||
{
|
||||
dropsiteSea = gameState.ai.accessibility.getAccessValue(dropsite.position(), true);
|
||||
dropsite.setMetadata(PlayerID, "sea", dropsiteSea);
|
||||
}
|
||||
if (dropsiteSea !== fisherSea)
|
||||
if (fisherSea !== m.GetSeaAccess(gameState, dropsite))
|
||||
continue;
|
||||
distMin = Math.min(distMin, API3.SquareVectorDistance(pos, dropsite.position()));
|
||||
}
|
||||
@@ -808,13 +786,7 @@ m.Worker.prototype.gatherTreasure = function(gameState)
|
||||
let lastGathered = treasure.getMetadata(PlayerID, "lastGathered");
|
||||
if (lastGathered && gameState.ai.elapsedTime - lastGathered < 20)
|
||||
continue;
|
||||
let treasureAccess = treasure.getMetadata(PlayerID, "access");
|
||||
if (!treasureAccess)
|
||||
{
|
||||
treasureAccess = gameState.ai.accessibility.getAccessValue(treasure.position());
|
||||
treasure.setMetadata(PlayerID, "access", treasureAccess);
|
||||
}
|
||||
if (treasureAccess !== access)
|
||||
if (access !== m.GetLandAccess(gameState, treasure))
|
||||
continue;
|
||||
let territoryOwner = gameState.ai.HQ.territoryMap.getOwner(treasure.position());
|
||||
if (territoryOwner !== 0 && !gameState.isPlayerAlly(territoryOwner))
|
||||
|
||||
Reference in New Issue
Block a user