Modified UnitAI to respect diplomatic status of players, allies can no longer be attacked, and fixed some related bugs in player init

This was SVN commit r8583.
This commit is contained in:
historic_bruno 2010-11-13 02:36:53 +00:00
parent 25cd781641
commit 3cefbbe253
3 changed files with 33 additions and 13 deletions

View File

@ -123,7 +123,7 @@ function determineAction(x, y, fromMinimap)
continue;
var playerOwned = ((targetState.player == entState.player)? true : false);
var enemyOwned = ((targetState.player != entState.player)? true : false);
var enemyOwned = ((targetState.player != entState.player && entState.diplomacy && entState.diplomacy[targetState.player - 1] < 0)? true : false);
var gaiaOwned = ((targetState.player == 0)? true : false);
if (targetState.garrisonHolder && playerOwned && Engine.HotkeyIsPressed("session.garrison"))

View File

@ -262,6 +262,9 @@ var UnitFsmSpec = {
{
this.PushOrderFront("Attack", { "target": msg.data.attacker });
}
else
{ // TODO: If unit can't attack, run away
}
},
"IDLE": {
@ -604,21 +607,33 @@ UnitAI.prototype.SetupRangeQuery = function(owner)
var cmpVision = Engine.QueryInterface(this.entity, IID_Vision);
if (!cmpVision)
return;
var rangeMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
var playerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
if (this.losRangeQuery)
rangeMan.DestroyActiveQuery(this.losRangeQuery);
var range = cmpVision.GetRange();
// Find all enemy players (i.e. exclude Gaia and ourselves)
var players = [];
for (var i = 1; i < playerMan.GetNumPlayers(); ++i)
if (i != owner)
players.push(i);
if(owner != -1)
{ // If unit not just killed, get enemy players via diplomacy
var player = Engine.QueryInterface(playerMan.GetPlayerByID(owner), IID_Player);
// Get our diplomacy array
var diplomacy = player.GetDiplomacy();
var numPlayers = playerMan.GetNumPlayers();
for (var i = 1; i < numPlayers; ++i)
{ // Exclude gaia, allies, and self
// TODO: How to handle neutral players - Special query to attack military only?
if (i != owner && diplomacy[i - 1] < 0)
players.push(i);
}
}
this.losRangeQuery = rangeMan.CreateActiveQuery(this.entity, range, players, IID_DamageReceiver);
rangeMan.EnableActiveQuery(this.losRangeQuery);
};

View File

@ -18,7 +18,7 @@ function LoadPlayerSettings(settings)
var playerDefaults = rawData.PlayerData;
// default number of players
var numPlayers = 2;
var numPlayers = 8;
if (settings.PlayerData)
{ //Get number of players including gaia
@ -41,12 +41,17 @@ function LoadPlayerSettings(settings)
diplomacy[i] = cmpPlayerMan.Diplomacy.ENEMY;
var pData = settings.PlayerData ? settings.PlayerData[i] : {};
var pDefs = playerDefaults ? playerDefaults[i] : {};
var team = getSetting(settings, pDefs, "Team");
var pDefs = playerDefaults ? playerDefaults[i+1] : {};
var team = getSetting(pData, pDefs, "Team");
// If team defined, add player to the team
if (team && team != -1)
teams[team].push(i);
{
if (!teams[team])
teams[team] = [i];
else
teams[team].push(i);
}
}
for (var i = 0; i < numPlayers; ++i)
@ -82,7 +87,7 @@ function LoadPlayerSettings(settings)
player.SetResourceCounts(getSetting(pData, pDefs, "Resources"));
var team = getSetting(settings, pDefs, "Team");
var team = getSetting(pData, pDefs, "Team");
//If diplomacy array exists use that, otherwise use team data or default diplomacy
if (getSetting(pData, pDefs, "Diplomacy") !== undefined)