From 3cefbbe253f0e3d3a8925d2e0656a2fb5a429302 Mon Sep 17 00:00:00 2001 From: historic_bruno Date: Sat, 13 Nov 2010 02:36:53 +0000 Subject: [PATCH] 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. --- .../data/mods/public/gui/session_new/input.js | 2 +- .../public/simulation/components/UnitAI.js | 29 ++++++++++++++----- .../mods/public/simulation/helpers/Player.js | 15 ++++++---- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/binaries/data/mods/public/gui/session_new/input.js b/binaries/data/mods/public/gui/session_new/input.js index de31fb8a7b..9ef0a830c1 100644 --- a/binaries/data/mods/public/gui/session_new/input.js +++ b/binaries/data/mods/public/gui/session_new/input.js @@ -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")) diff --git a/binaries/data/mods/public/simulation/components/UnitAI.js b/binaries/data/mods/public/simulation/components/UnitAI.js index c72749d4d4..0d9758c187 100644 --- a/binaries/data/mods/public/simulation/components/UnitAI.js +++ b/binaries/data/mods/public/simulation/components/UnitAI.js @@ -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); }; diff --git a/binaries/data/mods/public/simulation/helpers/Player.js b/binaries/data/mods/public/simulation/helpers/Player.js index 6ae54ecb6d..3ac178bb48 100644 --- a/binaries/data/mods/public/simulation/helpers/Player.js +++ b/binaries/data/mods/public/simulation/helpers/Player.js @@ -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)