Disables build restrictions and limits for AIs (until they can be fixed).

Simplifies player diplomacy/team setup.

This was SVN commit r10008.
This commit is contained in:
historic_bruno 2011-08-15 00:25:22 +00:00
parent 1b8471da1f
commit ff85950cb7
4 changed files with 123 additions and 126 deletions

View File

@ -22,11 +22,12 @@ Player.prototype.Init = function()
this.team = -1; // team number of the player, players on the same team will always have ally diplomatic status - also this is useful for team emblems, scoring, etc. this.team = -1; // team number of the player, players on the same team will always have ally diplomatic status - also this is useful for team emblems, scoring, etc.
this.state = "active"; // game state - one of "active", "defeated", "won" this.state = "active"; // game state - one of "active", "defeated", "won"
this.diplomacy = []; // array of diplomatic stances for this player with respect to other players (including self) this.diplomacy = []; // array of diplomatic stances for this player with respect to other players (including gaia and self)
this.conquestCriticalEntitiesCount = 0; // number of owned units with ConquestCritical class this.conquestCriticalEntitiesCount = 0; // number of owned units with ConquestCritical class
this.phase = "village"; this.phase = "village";
this.startCam = undefined; this.startCam = undefined;
this.controlAllUnits = false; this.controlAllUnits = false;
this.isAI = false;
}; };
Player.prototype.SetPlayerID = function(id) Player.prototype.SetPlayerID = function(id)
@ -235,56 +236,90 @@ Player.prototype.SetPhase = function(p)
Player.prototype.GetStartingCameraPos = function() Player.prototype.GetStartingCameraPos = function()
{ {
return this.startCam.position; return this.startCam.position;
} };
Player.prototype.GetStartingCameraRot = function() Player.prototype.GetStartingCameraRot = function()
{ {
return this.startCam.rotation; return this.startCam.rotation;
} };
Player.prototype.SetStartingCamera = function(pos, rot) Player.prototype.SetStartingCamera = function(pos, rot)
{ {
this.startCam = {"position": pos, "rotation": rot}; this.startCam = {"position": pos, "rotation": rot};
} };
Player.prototype.HasStartingCamera = function() Player.prototype.HasStartingCamera = function()
{ {
return (this.startCam !== undefined); return (this.startCam !== undefined);
} };
Player.prototype.SetControlAllUnits = function(c) Player.prototype.SetControlAllUnits = function(c)
{ {
this.controlAllUnits = c; this.controlAllUnits = c;
} };
Player.prototype.CanControlAllUnits = function() Player.prototype.CanControlAllUnits = function()
{ {
return this.controlAllUnits; return this.controlAllUnits;
} };
Player.prototype.SetAI = function(flag)
{
this.isAI = flag;
};
Player.prototype.IsAI = function()
{
return this.isAI;
};
Player.prototype.SetAlly = function(id)
{
if (id >= 0 && id != this.playerID)
{
this.diplomacy[id] = 1;
}
};
/** /**
* Check if given player is our ally * Check if given player is our ally
*/ */
Player.prototype.IsAlly = function(id) Player.prototype.IsAlly = function(id)
{ {
return (id >= 0 && (id == this.playerID || this.diplomacy[id] > 0)); return (id >= 0 && id < this.diplomacy.length && (id == this.playerID || this.diplomacy[id] > 0));
} };
Player.prototype.SetEnemy = function(id)
{
if (id >= 0 && id != this.playerID)
{
this.diplomacy[id] = -1;
}
};
/** /**
* Check if given player is our enemy * Check if given player is our enemy
*/ */
Player.prototype.IsEnemy = function(id) Player.prototype.IsEnemy = function(id)
{ {
return (id >= 0 && id != this.playerID && this.diplomacy[id] < 0); return (id >= 0 && id < this.diplomacy.length && id != this.playerID && this.diplomacy[id] < 0);
} };
Player.prototype.SetNeutral = function(id)
{
if (id >= 0 && id != this.playerID)
{
this.diplomacy[id] = 0;
}
};
/** /**
* Check if given player is neutral * Check if given player is neutral
*/ */
Player.prototype.IsNeutral = function(id) Player.prototype.IsNeutral = function(id)
{ {
return (id >= 0 && id != this.playerID && this.diplomacy[id] == 0); return (id >= 0 && id < this.diplomacy.length && id != this.playerID && this.diplomacy[id] == 0);
} };
/** /**
* Keep track of population effects of all entities that * Keep track of population effects of all entities that
@ -345,6 +380,6 @@ Player.prototype.OnPlayerDefeated = function()
var cmpOwnership = Engine.QueryInterface(entity, IID_Ownership); var cmpOwnership = Engine.QueryInterface(entity, IID_Ownership);
cmpOwnership.SetOwner(0); cmpOwnership.SetOwner(0);
} }
} };
Engine.RegisterComponentType(IID_Player, "Player", Player); Engine.RegisterComponentType(IID_Player, "Player", Player);

View File

@ -3,13 +3,6 @@ function PlayerManager() {}
PlayerManager.prototype.Schema = PlayerManager.prototype.Schema =
"<a:component type='system'/><empty/>"; "<a:component type='system'/><empty/>";
// Diplomatic stance constants
PlayerManager.prototype.Diplomacy = {
"ENEMY" : -1,
"NEUTRAL" : 0,
"ALLY" : 1
};
PlayerManager.prototype.Init = function() PlayerManager.prototype.Init = function()
{ {
this.playerEntities = []; // list of player entity IDs this.playerEntities = []; // list of player entity IDs

View File

@ -143,45 +143,44 @@ function ProcessCommand(player, cmd)
cmpPosition.JumpTo(cmd.x, cmd.z); cmpPosition.JumpTo(cmd.x, cmd.z);
cmpPosition.SetYRotation(cmd.angle); cmpPosition.SetYRotation(cmd.angle);
// Check whether it's obstructed by other entities or invalid terrain // TODO: Build restrctions disabled for AI since it lacks a mechanism for checking most of them
var cmpBuildRestrictions = Engine.QueryInterface(ent, IID_BuildRestrictions); if (!cmpPlayer.IsAI())
if (!cmpBuildRestrictions || !cmpBuildRestrictions.CheckPlacement(player))
{ {
var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); // Check whether it's obstructed by other entities or invalid terrain
cmpGuiInterface.PushNotification({ "player": player, "message": "Building site was obstructed" }); var cmpBuildRestrictions = Engine.QueryInterface(ent, IID_BuildRestrictions);
if (!cmpBuildRestrictions || !cmpBuildRestrictions.CheckPlacement(player))
{
var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
cmpGuiInterface.PushNotification({ "player": player, "message": "Building site was obstructed" });
// Remove the foundation because the construction was aborted // Remove the foundation because the construction was aborted
Engine.DestroyEntity(ent); Engine.DestroyEntity(ent);
break; break;
} }
// Check build limits
var cmpBuildLimits = QueryPlayerIDInterface(player, IID_BuildLimits);
if (!cmpBuildLimits || !cmpBuildLimits.AllowedToBuild(cmpBuildRestrictions.GetCategory()))
{
// TODO: The UI should tell the user they can't build this (but we still need this check)
// Remove the foundation because the construction was aborted // Check build limits
Engine.DestroyEntity(ent); var cmpBuildLimits = QueryPlayerIDInterface(player, IID_BuildLimits);
break; if (!cmpBuildLimits || !cmpBuildLimits.AllowedToBuild(cmpBuildRestrictions.GetCategory()))
{
// TODO: The UI should tell the user they can't build this (but we still need this check)
// Remove the foundation because the construction was aborted
Engine.DestroyEntity(ent);
break;
}
// Check whether it's in a visible region
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
var visible = (cmpRangeManager.GetLosVisibility(ent, player) == "visible");
if (!visible)
{
// TODO: report error to player (the building site was not visible)
print("Building site was not visible\n");
Engine.DestroyEntity(ent);
break;
}
} }
/* TODO: the AI isn't smart enough to explore before building, so we'll
* just disable the requirement that the location is visible. Should we
* fix that, or let players build in fog too, or something?
// Check whether it's in a visible region
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
var visible = (cmpRangeManager.GetLosVisibility(ent, player) == "visible");
if (!visible)
{
// TODO: report error to player (the building site was not visible)
print("Building site was not visible\n");
Engine.DestroyEntity(ent);
break;
}
*/
var cmpCost = Engine.QueryInterface(ent, IID_Cost); var cmpCost = Engine.QueryInterface(ent, IID_Cost);
if (!cmpPlayer.TrySubtractResources(cmpCost.GetResourceCosts())) if (!cmpPlayer.TrySubtractResources(cmpCost.GetResourceCosts()))

View File

@ -25,7 +25,7 @@ function LoadPlayerSettings(settings)
var numPlayers = 8; var numPlayers = 8;
if (settings.PlayerData) if (settings.PlayerData)
{ //Get number of players including gaia { // Get number of players including gaia
numPlayers = settings.PlayerData.length + 1; numPlayers = settings.PlayerData.length + 1;
} }
else else
@ -35,36 +35,6 @@ function LoadPlayerSettings(settings)
// Get player manager // Get player manager
var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var teams = [];
var diplomacy = [];
// Build team + diplomacy data
for (var i = 0; i < numPlayers; ++i)
{
diplomacy[i] = cmpPlayerMan.Diplomacy.ENEMY;
// Skip gaia
if (i > 0)
{
var pData = settings.PlayerData ? settings.PlayerData[i-1] : {};
var pDefs = playerDefaults ? playerDefaults[i] : {};
var team = getSetting(pData, pDefs, "Team");
// If team defined, add player to the team
if (team !== undefined && team != -1)
{
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)
{ {
@ -72,13 +42,13 @@ function LoadPlayerSettings(settings)
var entID = Engine.AddEntity("special/player"); var entID = Engine.AddEntity("special/player");
// Retrieve entity // Retrieve entity
var player = Engine.QueryInterface(entID, IID_Player); var cmpPlayer = Engine.QueryInterface(entID, IID_Player);
if (!player) if (!cmpPlayer)
{ {
throw("Player.js: Error creating player entity "+i); throw("Player.js: Error creating player entity "+i);
} }
player.SetPlayerID(i); cmpPlayer.SetPlayerID(i);
var pDefs = playerDefaults ? playerDefaults[i] : {}; var pDefs = playerDefaults ? playerDefaults[i] : {};
@ -88,63 +58,66 @@ function LoadPlayerSettings(settings)
var pData = settings.PlayerData ? settings.PlayerData[i-1] : {}; var pData = settings.PlayerData ? settings.PlayerData[i-1] : {};
// Copy player data // Copy player data
player.SetName(getSetting(pData, pDefs, "Name")); cmpPlayer.SetName(getSetting(pData, pDefs, "Name"));
player.SetCiv(getSetting(pData, pDefs, "Civ")); cmpPlayer.SetCiv(getSetting(pData, pDefs, "Civ"));
cmpPlayer.SetAI(pData.AI && pData.AI != "");
var colour = getSetting(pData, pDefs, "Colour"); var colour = getSetting(pData, pDefs, "Colour");
player.SetColour(colour.r, colour.g, colour.b); cmpPlayer.SetColour(colour.r, colour.g, colour.b);
if (getSetting(pData, pDefs, "PopulationLimit") !== undefined) if (getSetting(pData, pDefs, "PopulationLimit") !== undefined)
{ {
player.SetMaxPopulation(getSetting(pData, pDefs, "PopulationLimit")); cmpPlayer.SetMaxPopulation(getSetting(pData, pDefs, "PopulationLimit"));
} }
if (getSetting(pData, pDefs, "Resources") !== undefined) if (getSetting(pData, pDefs, "Resources") !== undefined)
{ {
player.SetResourceCounts(getSetting(pData, pDefs, "Resources")); cmpPlayer.SetResourceCounts(getSetting(pData, pDefs, "Resources"));
} }
var team = getSetting(pData, pDefs, "Team"); // If diplomacy explicitly defined, use that; otherwise use teams
//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)
{ {
player.SetDiplomacy(getSetting(pData, pDefs, "Diplomacy")); cmpPlayer.SetDiplomacy(getSetting(pData, pDefs, "Diplomacy"));
}
else if (team !== undefined && team != -1)
{
//Team exists, copy default diplomacy
var teamDiplomacy = [];
for (var p in diplomacy)
{
teamDiplomacy[p] = diplomacy[p];
}
// Set teammates to allies
var myTeam = teams[team];
for (var n in myTeam)
{
teamDiplomacy[myTeam[n]] = cmpPlayerMan.Diplomacy.ALLY; //Set ally
}
player.SetDiplomacy(teamDiplomacy);
} }
else else
{ //Set default {
player.SetDiplomacy(diplomacy); var myTeam = getSetting(pData, pDefs, "Team");
for (var j = 0; j < numPlayers; ++j)
{
// Check if player is on same team
if (j > 0)
{
var theirTeam = getSetting(settings.PlayerData[j-1], playerDefaults[j], "Team");
if (myTeam !== undefined && myTeam != -1
&& theirTeam !== undefined && theirTeam != -1
&& myTeam == theirTeam)
{
cmpPlayer.SetAlly(j);
continue;
}
}
// Gaia, different team, or no team defined
cmpPlayer.SetEnemy(j);
}
} }
var startCam = getSetting(pData, pDefs, "StartingCamera"); var startCam = getSetting(pData, pDefs, "StartingCamera");
if (startCam !== undefined) if (startCam !== undefined)
{ {
player.SetStartingCamera(startCam.Position, startCam.Rotation); cmpPlayer.SetStartingCamera(startCam.Position, startCam.Rotation);
} }
} }
else else
{ // Copy gaia data from defaults { // Copy gaia data from defaults
player.SetName(pDefs.Name); cmpPlayer.SetName(pDefs.Name);
player.SetCiv(pDefs.Civ); cmpPlayer.SetCiv(pDefs.Civ);
player.SetColour(pDefs.Colour.r, pDefs.Colour.g, pDefs.Colour.b); cmpPlayer.SetColour(pDefs.Colour.r, pDefs.Colour.g, pDefs.Colour.b);
player.SetDiplomacy(diplomacy);
for (var j = 0; j < numPlayers; ++j)
{ // Gaia is everyone's enemy
cmpPlayer.SetEnemy(j);
}
} }
// Add player to player manager // Add player to player manager
@ -219,7 +192,6 @@ function IsOwnedByAllyOfEntity(entity, target)
if (cmpOwnershipTarget) if (cmpOwnershipTarget)
targetOwner = cmpOwnershipTarget.GetOwner(); targetOwner = cmpOwnershipTarget.GetOwner();
// Get our diplomacy array
var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var cmpPlayer = Engine.QueryInterface(cmpPlayerMan.GetPlayerByID(owner), IID_Player); var cmpPlayer = Engine.QueryInterface(cmpPlayerMan.GetPlayerByID(owner), IID_Player);
@ -250,7 +222,6 @@ function IsOwnedByAllyOfPlayer(player, target)
if (cmpOwnershipTarget) if (cmpOwnershipTarget)
targetOwner = cmpOwnershipTarget.GetOwner(); targetOwner = cmpOwnershipTarget.GetOwner();
// Get our diplomacy array
var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var cmpPlayer = Engine.QueryInterface(cmpPlayerMan.GetPlayerByID(player), IID_Player); var cmpPlayer = Engine.QueryInterface(cmpPlayerMan.GetPlayerByID(player), IID_Player);
@ -272,7 +243,6 @@ function IsOwnedByEnemyOfPlayer(player, target)
if (cmpOwnershipTarget) if (cmpOwnershipTarget)
targetOwner = cmpOwnershipTarget.GetOwner(); targetOwner = cmpOwnershipTarget.GetOwner();
// Get our diplomacy array
var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var cmpPlayer = Engine.QueryInterface(cmpPlayerMan.GetPlayerByID(player), IID_Player); var cmpPlayer = Engine.QueryInterface(cmpPlayerMan.GetPlayerByID(player), IID_Player);