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:
parent
25cd781641
commit
3cefbbe253
@ -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"))
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user