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; continue;
var playerOwned = ((targetState.player == entState.player)? true : false); 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); var gaiaOwned = ((targetState.player == 0)? true : false);
if (targetState.garrisonHolder && playerOwned && Engine.HotkeyIsPressed("session.garrison")) if (targetState.garrisonHolder && playerOwned && Engine.HotkeyIsPressed("session.garrison"))

View File

@ -262,6 +262,9 @@ var UnitFsmSpec = {
{ {
this.PushOrderFront("Attack", { "target": msg.data.attacker }); this.PushOrderFront("Attack", { "target": msg.data.attacker });
} }
else
{ // TODO: If unit can't attack, run away
}
}, },
"IDLE": { "IDLE": {
@ -604,21 +607,33 @@ UnitAI.prototype.SetupRangeQuery = function(owner)
var cmpVision = Engine.QueryInterface(this.entity, IID_Vision); var cmpVision = Engine.QueryInterface(this.entity, IID_Vision);
if (!cmpVision) if (!cmpVision)
return; return;
var rangeMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); var rangeMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
var playerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); var playerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
if (this.losRangeQuery) if (this.losRangeQuery)
rangeMan.DestroyActiveQuery(this.losRangeQuery); rangeMan.DestroyActiveQuery(this.losRangeQuery);
var range = cmpVision.GetRange(); var range = cmpVision.GetRange();
// Find all enemy players (i.e. exclude Gaia and ourselves)
var players = []; var players = [];
for (var i = 1; i < playerMan.GetNumPlayers(); ++i)
if (i != owner) if(owner != -1)
players.push(i); { // 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); this.losRangeQuery = rangeMan.CreateActiveQuery(this.entity, range, players, IID_DamageReceiver);
rangeMan.EnableActiveQuery(this.losRangeQuery); rangeMan.EnableActiveQuery(this.losRangeQuery);
}; };

View File

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