Diplomacy is now mutual. Refs #7.

This was SVN commit r12810.
This commit is contained in:
leper 2012-11-02 13:44:35 +00:00
parent a3ddd7b1b3
commit 9930500661
7 changed files with 131 additions and 31 deletions

View File

@ -258,18 +258,41 @@ function openDiplomacy()
// Don't display this for ourself and our locked team members
if (i != we && !(players[we].teamsLocked && players[we].team != -1 && players[we].team == players[i].team))
{
getGUIObjectByName("diplomacyPlayerTheirs["+(i-1)+"]").caption = (players[i].isAlly[we] ? "Ally" : (players[i].isNeutral[we] ? "Neutral" : "Enemy") );
// Set up the buttons
for each (var setting in ["ally", "neutral", "enemy"])
{
var button = getGUIObjectByName("diplomacyPlayer"+toTitleCase(setting)+"["+(i-1)+"]");
// Disable the button with the current setting
// TODO: Needs new graphics for the button (enabled/disabled) to make it
// look more like a checkbox
button.enabled = !((setting=="ally" && players[we].isAlly[i])
|| (setting=="neutral" && players[we].isNeutral[i])
|| (setting=="enemy" && players[we].isEnemy[i]));
if (setting == "ally")
{
if (players[we].isAlly[i])
button.caption = "o";
else if (players[we].wantAlly[i])
button.caption = "x";
else if (players[i].wantAlly[we])
button.caption = "+";
else
button.caption = "";
}
else if (setting == "neutral")
{
if (players[we].isNeutral[i])
button.caption = "o";
else if (players[we].wantNeutral[i])
button.caption = "x";
else if (players[i].wantNeutral[we])
button.caption = "+";
else
button.caption = "";
}
else // "enemy"
{
if (players[we].isEnemy[i])
button.caption = "o";
else
button.caption = "";
}
button.onpress = (function(e){ return function() { setDiplomacy(e) } })({"player": i, "to": setting});
button.hidden = false;
}

View File

@ -287,17 +287,24 @@ function addChatMessage(msg, playerAssignments)
break;
case "diplomacy":
// TODO: Proper wording for all cases
// TODO: If the second player sets the diplomacy to the same as you
// have already set, display something like "You and username are
// now msg.status" and if the other players setting is more (eg you
// set it to neutral he to ally) than your setting display something
// like "Player wants to be msg.status with you" in addition. Breaking
// alliances/declaring war should be done with only one message (maybe
// change the message generation in Commands.js)
if (msg.player == Engine.GetPlayerID())
{
username= escapeText(g_Players[msg.player1].name);
playerColor = g_Players[msg.player1].color.r + " " + g_Players[msg.player1].color.g + " " + g_Players[msg.player1].color.b;
formatted = "You are now "+msg.status+" with [color=\"" + playerColor + "\"]"+username + "[/color].";
formatted = "You want to be "+msg.status+" with [color=\"" + playerColor + "\"]"+username + "[/color].";
}
else if (msg.player1 == Engine.GetPlayerID())
{
username= escapeText(g_Players[msg.player].name);
playerColor = g_Players[msg.player].color.r + " " + g_Players[msg.player].color.g + " " + g_Players[msg.player].color.b;
formatted = "[color=\"" + playerColor + "\"]" + username + "[/color] is now " + msg.status + " with you."
formatted = "[color=\"" + playerColor + "\"]" + username + "[/color] wants to be " + msg.status + " with you."
}
else // No need for other players to know of this.
return;

View File

@ -266,13 +266,13 @@
<object name="diplomacyPlayer[n]" size="0 0 100% 20" type="image" hidden="false">
<object name="diplomacyPlayerName[n]" size="0 0 150 100%" type="text" style="chatPanel" ghost="true"/>
<object name="diplomacyPlayerCiv[n]" size="150 0 250 100%" type="text" style="chatPanel" ghost="true"/>
<object name="diplomacyPlayerTheirs[n]" size="250 0 310 100%" type="text" style="chatPanel" ghost="true"/>
<object name="diplomacyPlayerTeam[n]" size="310 0 360 100%" type="text" style="chatPanel" ghost="true"/>
<!-- TODO add tooltips to those 3 ? -->
<object name="diplomacyPlayerTeam[n]" size="250 0 310 100%" type="text" style="chatPanel" ghost="true"/>
<object name="diplomacyPlayerAlly[n]" size="100%-180 0 100%-160 100%" type="button" style="StoneButton" hidden="true"/>
<object name="diplomacyPlayerNeutral[n]" size="100%-160 0 100%-140 100%" type="button" style="StoneButton" hidden="true"/>
<object name="diplomacyPlayerEnemy[n]" size="100%-140 0 100%-120 100%" type="button" style="StoneButton" hidden="true"/>
<!-- Tribute -->
<object name="diplomacyPlayerTributeFood[n]" size="100%-110 0 100%-90 100%" type="button" style="iconButton" tooltip="Food" hidden="true">
<object name="diplomacyPlayerTributeFoodImage[n]" type="image" size="0 0 100% 100%" sprite="stretched:session/icons/resources/food.png" ghost="true"/>
</object>

View File

@ -63,6 +63,8 @@ function getPlayerData(playerAssignments)
"isAlly": playerState.isAlly,
"isNeutral": playerState.isNeutral,
"isEnemy": playerState.isEnemy,
"wantAlly": playerState.wantAlly,
"wantNeutral": playerState.wantNeutral,
"guid": undefined, // network guid for players controlled by hosts
"disconnected": false // flag for host-controlled players who have left the game
};

View File

@ -97,8 +97,7 @@ EndGameManager.prototype.UpdatePlayerStates = function()
for (var j = 0; j < numPlayers && onlyAlliesLeft; j++)
{
if (cmpPlayers[j].GetState() == "active"
&& (cmpPlayers[i].IsEnemy(j+1) || cmpPlayers[j].IsEnemy(i+1)
|| cmpPlayers[i].IsNeutral(j+1) || cmpPlayers[j].IsNeutral(i+1)))
&& (cmpPlayers[i].IsEnemy(j+1) || cmpPlayers[i].IsNeutral(j+1)))
{ // Only need to find an active non-allied player
onlyAlliesLeft = false;
}

View File

@ -66,11 +66,16 @@ GuiInterface.prototype.GetSimulationState = function(player)
var allies = [];
var neutrals = [];
var enemies = [];
for (var j = 0; j <= n; ++j)
var wantAllies = [];
var wantNeutral = [];
for (var j = 0; j < n; ++j)
{
allies[j] = cmpPlayer.IsAlly(j);
neutrals[j] = cmpPlayer.IsNeutral(j);
enemies[j] = cmpPlayer.IsEnemy(j);
wantAllies[j] = !allies[j] && cmpPlayer.WantAlly(j);
wantNeutral[j] = !allies[j] && !neutrals[j] && cmpPlayer.WantNeutral(j);
}
var playerData = {
"name": cmpPlayer.GetName(),
@ -88,6 +93,8 @@ GuiInterface.prototype.GetSimulationState = function(player)
"isAlly": allies,
"isNeutral": neutrals,
"isEnemy": enemies,
"wantAlly": wantAllies,
"wantNeutral": wantNeutral,
"buildLimits": cmpPlayerBuildLimits.GetLimits(),
"buildCounts": cmpPlayerBuildLimits.GetCounts(),
"techModifications": cmpTechnologyManager.GetTechModifications()

View File

@ -277,24 +277,48 @@ Player.prototype.SetDiplomacy = function(dipl)
Player.prototype.SetDiplomacyIndex = function(idx, value)
{
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
if (!cmpPlayerManager)
return;
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(idx), IID_Player);
if (!cmpPlayer)
return;
// You can have alliances with other players,
if (this.teamsLocked)
{
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
if (cmpPlayerManager)
// but can't stab your team members in the back
if (this.team == -1 || cmpPlayer && this.team != cmpPlayer.GetTeam())
{
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(idx), IID_Player);
// but can't stab your team members in the back
if (this.team == -1 || cmpPlayer && this.team != cmpPlayer.GetTeam())
// Break alliance or declare war
if (Math.min(this.diplomacy[idx],cmpPlayer.diplomacy[this.playerID]) > value)
{
this.diplomacy[idx] = value;
Engine.BroadcastMessage(MT_DiplomacyChanged, {"player": this.playerID});
cmpPlayer.SetDiplomacyIndex(this.playerID, value);
}
else
{
this.diplomacy[idx] = value;
}
Engine.BroadcastMessage(MT_DiplomacyChanged, {"player": this.playerID});
}
}
else
{
this.diplomacy[idx] = value;
// Break alliance or declare war
if (Math.min(this.diplomacy[idx],cmpPlayer.diplomacy[this.playerID]) > value)
{
// This is duplicated because otherwise we get too much recursion
this.diplomacy[idx] = value;
// Diplomacy is mutual
cmpPlayer.SetDiplomacyIndex(this.playerID, value);
}
else
{
this.diplomacy[idx] = value;
}
Engine.BroadcastMessage(MT_DiplomacyChanged, {"player": this.playerID});
}
};
@ -312,11 +336,7 @@ Player.prototype.UpdateSharedLos = function()
var sharedLos = [];
for (var i = 0; i < this.diplomacy.length; ++i)
if (this.IsAlly(i))
{
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i), IID_Player);
if (cmpPlayer && cmpPlayer.IsAlly(this.playerID))
sharedLos.push(i);
}
sharedLos.push(i);
cmpRangeManager.SetSharedLos(this.playerID, sharedLos);
};
@ -380,6 +400,23 @@ Player.prototype.SetAlly = function(id)
* Check if given player is our ally
*/
Player.prototype.IsAlly = function(id)
{
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
if (!cmpPlayerManager)
return false;
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(id), IID_Player);
if (!cmpPlayer)
return false;
return Math.min(this.diplomacy[id],cmpPlayer.diplomacy[this.playerID]) > 0;
};
/**
* Check if we want to be allied with the given player.
* NOTE: Returns true if we are already allies.
*/
Player.prototype.WantAlly = function(id)
{
return this.diplomacy[id] > 0;
};
@ -394,7 +431,15 @@ Player.prototype.SetEnemy = function(id)
*/
Player.prototype.IsEnemy = function(id)
{
return this.diplomacy[id] < 0;
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
if (!cmpPlayerManager)
return false;
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(id), IID_Player);
if (!cmpPlayer)
return false;
return Math.min(this.diplomacy[id],cmpPlayer.diplomacy[this.playerID]) < 0;
};
Player.prototype.SetNeutral = function(id)
@ -407,7 +452,24 @@ Player.prototype.SetNeutral = function(id)
*/
Player.prototype.IsNeutral = function(id)
{
return this.diplomacy[id] == 0;
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
if (!cmpPlayerManager)
return false;
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(id), IID_Player);
if (!cmpPlayer)
return false;
return Math.min(this.diplomacy[id],cmpPlayer.diplomacy[this.playerID]) == 0;
};
/**
* Check if we want to be neutral with the given player.
* NOTE: Returns true if we are already neutral or above.
*/
Player.prototype.WantNeutral = function(id)
{
return this.diplomacy[id] >= 0;
};
/**