1
0
forked from 0ad/0ad

Properly handle auto-research promotion techs at game start.

This was SVN commit r16009.
This commit is contained in:
leper 2014-11-25 22:47:02 +00:00
parent 7102f86de3
commit 1430efa9d6
5 changed files with 31 additions and 33 deletions

View File

@ -1,10 +1,19 @@
function ReplaceSkirmishGlobals()
/**
* Called when the map has been loaded, but before the simulation has started.
* Only called when a new game is started, not when loading a saved game.
*/
function PreInitGame()
{
// This will be called after the map settings have been loaded,
// before the simulation has started.
// This is only called at the start of a new game, not when loading
// a saved game.
Engine.BroadcastMessage(MT_SkirmishReplace, {});
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
let playerIds = cmpPlayerManager.GetAllPlayerEntities().slice(1); // ignore gaia
for (let playerId of playerIds)
{
let cmpTechnologyManager = Engine.QueryInterface(playerId, IID_TechnologyManager);
if (cmpTechnologyManager)
cmpTechnologyManager.UpdateAutoResearch();
}
}
function InitGame(settings)
@ -13,25 +22,19 @@ function InitGame(settings)
if (!settings)
return;
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
if (settings.ExploreMap)
{
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
if (cmpRangeManager)
for (var i = 0; i < settings.PlayerData.length; i++)
cmpRangeManager.ExploreAllTiles(i+1);
}
for (var i = 0; i < settings.PlayerData.length; i++)
cmpRangeManager.ExploreAllTiles(i+1);
else
{
// Explore the map only inside the players' territory borders
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
cmpRangeManager.ExploreTerritories();
}
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager);
for (var i = 0; i < settings.PlayerData.length; ++i)
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
let cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager);
for (let i = 0; i < settings.PlayerData.length; ++i)
{
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i+1), IID_Player);
let cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i+1), IID_Player);
cmpPlayer.SetCheatsEnabled(!!settings.CheatsEnabled);
if (settings.PlayerData[i] && settings.PlayerData[i].AI && settings.PlayerData[i].AI != "")
{
@ -45,9 +48,9 @@ function InitGame(settings)
if (settings.mapType !== "scenario" && settings.StartingResources)
{
var resourceCounts = cmpPlayer.GetResourceCounts();
var newResourceCounts = {};
for (var resouces in resourceCounts)
let resourceCounts = cmpPlayer.GetResourceCounts();
let newResourceCounts = {};
for (let resouces in resourceCounts)
newResourceCounts[resouces] = settings.StartingResources;
cmpPlayer.SetResourceCounts(newResourceCounts);
}
@ -58,5 +61,5 @@ function InitGame(settings)
cmpAIManager.RunGamestateInit();
}
Engine.RegisterGlobal("ReplaceSkirmishGlobals", ReplaceSkirmishGlobals);
Engine.RegisterGlobal("PreInitGame", PreInitGame);
Engine.RegisterGlobal("InitGame", InitGame);

View File

@ -54,11 +54,6 @@ function LoadPlayerSettings(settings, newPlayers)
// Add player to player manager
cmpPlayerManager.AddPlayer(entID);
// Properly autoresearch techs on init.
var cmpTechManager = Engine.QueryInterface(entID, IID_TechnologyManager);
if (cmpTechManager !== undefined)
cmpTechManager.UpdateAutoResearch();
}
}

View File

@ -219,7 +219,7 @@ PSRETURN CGame::ReallyStartGame()
// And we need to flush destroyed entities otherwise the AI
// gets the wrong game state in the beginning and a bunch of
// "destroy" messages on turn 0, which just shouldn't happen.
m_Simulation2->ReplaceSkirmishGlobals();
m_Simulation2->PreInitGame();
m_Simulation2->FlushDestroyedEntities();
}
JS::RootedValue settings(cx);

View File

@ -649,12 +649,12 @@ ScriptInterface& CSimulation2::GetScriptInterface() const
return m->m_ComponentManager.GetScriptInterface();
}
void CSimulation2::ReplaceSkirmishGlobals()
void CSimulation2::PreInitGame()
{
JSContext* cx = GetScriptInterface().GetContext();
JSAutoRequest rq(cx);
JS::RootedValue global(cx, GetScriptInterface().GetGlobalObject());
GetScriptInterface().CallFunctionVoid(global, "ReplaceSkirmishGlobals");
GetScriptInterface().CallFunctionVoid(global, "PreInitGame");
}
void CSimulation2::InitGame(const CScriptVal& data)

View File

@ -148,12 +148,12 @@ public:
void ResetState(bool skipScriptedComponents = false, bool skipAI = false);
/**
* Send a message to replace skirmish entities with real ones
* Replace/destroy some entities (e.g. skirmish replacers)
* Called right before InitGame, on CGame instantiation.
* (This mustn't be used when e.g. loading saved games, only when starting new ones.)
* This calls the ReplaceSkirmishGlobals function defined in helpers/InitGame.js.
* This calls the PreInitGame function defined in helpers/InitGame.js.
*/
void ReplaceSkirmishGlobals();
void PreInitGame();
/**
* Initialise a new game, based on some script data. (Called on CGame instantiation)