1
0
forked from 0ad/0ad

Clean LoadPlayerSettings in Player-helper.

- Removed obsolete C++-side `addPlayer`, introduced in 4fed9b8242, moved
out of Atlas in 1c0536bf08, unused after 9ee44bd9b8.
- Get the player settings from a local function (avoids passing
arguments).
- Removed setting the standard diplomacy (done in cmpPlayerManager since
132020f88e).
- Create entity when adding a player instead of creating it and
instructing the playermanager to add it.
- Changed/Removed some comments.

Differential revision: https://code.wildfiregames.com/D4482
Comments by: @Stan
This was SVN commit r26404.
This commit is contained in:
Freagarach 2022-02-18 08:10:13 +00:00
parent 6496aea364
commit 6a2a297c0e
4 changed files with 53 additions and 103 deletions

View File

@ -12,8 +12,13 @@ PlayerManager.prototype.Init = function()
this.maxWorldPopulation = undefined;
};
PlayerManager.prototype.AddPlayer = function(ent)
/**
* @param {string} templateName - The template name of the player to add.
* @return {number} - The player's ID (player number).
*/
PlayerManager.prototype.AddPlayer = function(templateName)
{
const ent = Engine.AddEntity(templateName);
var id = this.playerEntities.length;
var cmpPlayer = Engine.QueryInterface(ent, IID_Player);
cmpPlayer.SetPlayerID(id);
@ -42,9 +47,12 @@ PlayerManager.prototype.AddPlayer = function(ent)
* To avoid possible problems,
* we first remove all entities from this player, and add them back after the replacement.
* Note: This should only be called during setup/init and not during the game
* @param {number} id - The player number to replace.
* @param {string} newTemplateName - The new template name for the player.
*/
PlayerManager.prototype.ReplacePlayer = function(id, ent)
PlayerManager.prototype.ReplacePlayerTemplate = function(id, newTemplateName)
{
const ent = Engine.AddEntity(newTemplateName);
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
let entities = cmpRangeManager.GetEntitiesByPlayer(id);
for (let e of entities)

View File

@ -1,7 +1,7 @@
/**
* Used to create player entities prior to reading the rest of a map,
* all other initialization must be done after loading map (terrain/entities).
* DO NOT use other components here, as they may fail unpredictably.
* Be VERY careful in using other components here, as they may not be properly initialised yet.
* settings is the object containing settings for this map.
* newPlayers if true will remove old player entities or add new ones until
* the new number of player entities is obtained
@ -9,94 +9,69 @@
*/
function LoadPlayerSettings(settings, newPlayers)
{
var playerDefaults = Engine.ReadJSONFile("simulation/data/settings/player_defaults.json").PlayerData;
const playerDefaults = Engine.ReadJSONFile("simulation/data/settings/player_defaults.json").PlayerData;
const playerData = settings.PlayerData;
if (!playerData)
warn("Player.js: Setup has no player data - using defaults.");
// Default settings
if (!settings)
settings = {};
const getPlayerSetting = (idx, property) => {
if (playerData && playerData[idx] && (property in playerData[idx]))
return playerData[idx][property];
if (playerDefaults && playerDefaults[idx] && (property in playerDefaults[idx]))
return playerDefaults[idx][property];
return undefined;
};
// Add gaia to simplify iteration
// (if gaia is not already the first civ such as when called from Atlas' ActorViewer)
if (settings.PlayerData && settings.PlayerData[0] &&
(!settings.PlayerData[0].Civ || settings.PlayerData[0].Civ != "gaia"))
settings.PlayerData.unshift(null);
if (playerData && playerData[0] && (!playerData[0].Civ || playerData[0].Civ != "gaia"))
playerData.unshift(null);
var playerData = settings.PlayerData;
// Disable the AIIinterface when no AI players are present
if (playerData && !playerData.some(v => v && !!v.AI))
Engine.QueryInterface(SYSTEM_ENTITY, IID_AIInterface).Disable();
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var numPlayers = cmpPlayerManager.GetNumPlayers();
var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
const cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
let numPlayers = cmpPlayerManager.GetNumPlayers();
// Remove existing players or add new ones
if (newPlayers)
{
var settingsNumPlayers = 9; // default 8 players + gaia
const settingsNumPlayers = playerData?.length ?? playerDefaults.length;
if (playerData)
settingsNumPlayers = playerData.length; // includes gaia (see above)
else
warn("Player.js: Setup has no player data - using defaults");
while (numPlayers < settingsNumPlayers)
cmpPlayerManager.AddPlayer(GetPlayerTemplateName(getPlayerSetting(numPlayers++, "Civ")));
while (settingsNumPlayers > numPlayers)
{
// Add player entity to engine
var entID = Engine.AddEntity(GetPlayerTemplateName(getSetting(playerData, playerDefaults, numPlayers, "Civ")));
var cmpPlayer = Engine.QueryInterface(entID, IID_Player);
if (!cmpPlayer)
throw new Error("Player.js: Error creating player entity " + numPlayers);
cmpPlayerManager.AddPlayer(entID);
++numPlayers;
}
while (settingsNumPlayers < numPlayers)
{
for (; numPlayers > settingsNumPlayers; numPlayers--)
cmpPlayerManager.RemoveLastPlayer();
--numPlayers;
}
}
// Even when no new player, we must check the template compatibility as player template may be civ dependent
for (var i = 0; i < numPlayers; ++i)
// Even when no new player, we must check the template compatibility as player templates are civ dependent.
const cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
for (let i = 0; i < numPlayers; ++i)
{
var template = GetPlayerTemplateName(getSetting(playerData, playerDefaults, i, "Civ"));
var entID = cmpPlayerManager.GetPlayerByID(i);
if (cmpTemplateManager.GetCurrentTemplateName(entID) === template)
continue;
// We need to recreate this player to have the right template
entID = Engine.AddEntity(template);
cmpPlayerManager.ReplacePlayer(i, entID);
const template = GetPlayerTemplateName(getPlayerSetting(i, "Civ"));
const entID = cmpPlayerManager.GetPlayerByID(i);
if (cmpTemplateManager.GetCurrentTemplateName(entID) !== template)
cmpPlayerManager.ReplacePlayerTemplate(i, template);
}
// Initialize the player data
for (var i = 0; i < numPlayers; ++i)
for (let i = 0; i < numPlayers; ++i)
{
QueryPlayerIDInterface(i, IID_Identity).SetName(getSetting(playerData, playerDefaults, i, "Name"));
QueryPlayerIDInterface(i, IID_Identity).SetName(getPlayerSetting(i, "Name"));
var color = getSetting(playerData, playerDefaults, i, "Color");
const color = getPlayerSetting(i, "Color");
const cmpPlayer = QueryPlayerIDInterface(i);
cmpPlayer.SetColor(color.r, color.g, color.b);
// Special case for gaia
if (i == 0)
{
// Gaia should be its own ally.
cmpPlayer.SetAlly(0);
// Gaia is everyone's enemy
for (var j = 1; j < numPlayers; ++j)
cmpPlayer.SetEnemy(j);
continue;
}
// PopulationLimit
{
let maxPopulation =
const maxPopulation =
settings.PlayerData[i].PopulationLimit !== undefined ?
settings.PlayerData[i].PopulationLimit :
settings.PopulationCap !== undefined ?
@ -123,38 +98,25 @@ function LoadPlayerSettings(settings, newPlayers)
else if (playerDefaults[i].Resources !== undefined)
cmpPlayer.SetResourceCounts(playerDefaults[i].Resources);
// DisableSpies
if (settings.DisableSpies)
{
cmpPlayer.AddDisabledTechnology("unlock_spies");
cmpPlayer.AddDisabledTemplate("special/spy");
}
// If diplomacy explicitly defined, use that; otherwise use teams
if (getSetting(playerData, playerDefaults, i, "Diplomacy") !== undefined)
cmpPlayer.SetDiplomacy(getSetting(playerData, playerDefaults, i, "Diplomacy"));
// If diplomacy explicitly defined, use that; otherwise use teams.
const diplomacy = getPlayerSetting(i, "Diplomacy");
if (diplomacy !== undefined)
cmpPlayer.SetDiplomacy(diplomacy);
else
{
// Init diplomacy
var myTeam = getSetting(playerData, playerDefaults, i, "Team");
cmpPlayer.SetTeam(getPlayerSetting(i, "Team") ?? -1);
// Set all but self as enemies as SetTeam takes care of allies
for (var j = 0; j < numPlayers; ++j)
{
if (i == j)
cmpPlayer.SetAlly(j);
else
cmpPlayer.SetEnemy(j);
}
cmpPlayer.SetTeam(myTeam === undefined ? -1 : myTeam);
}
const formations = getSetting(playerData, playerDefaults, i, "Formations");
const formations = getPlayerSetting(i, "Formations");
if (formations)
cmpPlayer.SetFormations(formations);
var startCam = getSetting(playerData, playerDefaults, i, "StartingCamera");
if (startCam !== undefined)
const startCam = getPlayerSetting(i, "StartingCamera");
if (startCam)
cmpPlayer.SetStartingCamera(startCam.Position, startCam.Rotation);
}
@ -165,19 +127,6 @@ function LoadPlayerSettings(settings, newPlayers)
QueryPlayerIDInterface(i).SetLockTeams(true);
}
// Get a setting if it exists or return default
function getSetting(settings, defaults, idx, property)
{
if (settings && settings[idx] && (property in settings[idx]))
return settings[idx][property];
// Use defaults
if (defaults && defaults[idx] && (property in defaults[idx]))
return defaults[idx][property];
return undefined;
}
function GetPlayerTemplateName(civ)
{
return "special/players/" + civ;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010 Wildfire Games.
/* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -30,11 +30,6 @@ class CCmpPlayerManagerScripted : public ICmpPlayerManager
public:
DEFAULT_SCRIPT_WRAPPER(PlayerManagerScripted)
virtual void AddPlayer(entity_id_t ent)
{
m_Script.CallVoid("AddPlayer", (int)ent);
}
virtual int32_t GetNumPlayers()
{
return m_Script.Call<int32_t>("GetNumPlayers");

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010 Wildfire Games.
/* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -26,8 +26,6 @@
class ICmpPlayerManager : public IComponent
{
public:
virtual void AddPlayer(entity_id_t ent) = 0;
virtual int32_t GetNumPlayers() = 0;
virtual entity_id_t GetPlayerByID(int32_t id) = 0;