Clean LoadPlayerSettings in Player-helper.
- Removed obsolete C++-side `addPlayer`, introduced in4fed9b8242
, moved out of Atlas in1c0536bf08
, unused after9ee44bd9b8
. - Get the player settings from a local function (avoids passing arguments). - Removed setting the standard diplomacy (done in cmpPlayerManager since132020f88e
). - 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:
parent
6496aea364
commit
6a2a297c0e
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user