2010-08-12 00:16:16 +02:00
|
|
|
// Network Mode
|
|
|
|
var g_IsNetworked = false;
|
|
|
|
|
|
|
|
// Cache the basic player data (name, civ, color)
|
|
|
|
var g_Players = [];
|
2010-08-14 17:34:36 +02:00
|
|
|
var g_PlayerAssignments = { "local": { "name": "You", "player": 1 } };
|
2010-08-12 21:31:17 +02:00
|
|
|
|
2010-06-30 23:34:44 +02:00
|
|
|
// Cache dev-mode settings that are frequently or widely used
|
|
|
|
var g_DevSettings = {
|
|
|
|
controlAll: false
|
|
|
|
};
|
|
|
|
|
2010-09-04 15:24:52 +02:00
|
|
|
// Indicate when one of the current player's training queues is blocked
|
|
|
|
// (this is used to support population counter blinking)
|
|
|
|
var g_IsTrainingQueueBlocked = false;
|
|
|
|
|
2010-08-28 23:12:52 +02:00
|
|
|
// Cache EntityStates
|
|
|
|
var g_EntityStates = {}; // {id:entState}
|
|
|
|
|
|
|
|
function GetEntityState(entId)
|
|
|
|
{
|
|
|
|
if (!(entId in g_EntityStates))
|
|
|
|
{
|
|
|
|
var entState = Engine.GuiInterfaceCall("GetEntityState", entId);
|
|
|
|
g_EntityStates[entId] = entState;
|
|
|
|
}
|
|
|
|
|
|
|
|
return g_EntityStates[entId];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Cache TemplateData
|
|
|
|
var g_TemplateData = {}; // {id:template}
|
|
|
|
|
|
|
|
function GetTemplateData(templateName)
|
|
|
|
{
|
|
|
|
if (!(templateName in g_TemplateData))
|
|
|
|
{
|
|
|
|
var template = Engine.GuiInterfaceCall("GetTemplateData", templateName);
|
|
|
|
g_TemplateData[templateName] = template;
|
|
|
|
}
|
|
|
|
|
|
|
|
return g_TemplateData[templateName];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init
|
2010-06-30 23:34:44 +02:00
|
|
|
function init(initData, hotloadData)
|
|
|
|
{
|
|
|
|
if (hotloadData)
|
|
|
|
{
|
|
|
|
g_Selection.selected = hotloadData.selection;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Starting for the first time:
|
|
|
|
startMusic();
|
|
|
|
}
|
|
|
|
|
2010-08-12 00:16:16 +02:00
|
|
|
if (initData)
|
|
|
|
{
|
|
|
|
g_IsNetworked = initData.isNetworked; // Set network mode
|
2010-08-12 21:31:17 +02:00
|
|
|
g_PlayerAssignments = initData.playerAssignments;
|
2010-08-12 00:16:16 +02:00
|
|
|
g_Players = getPlayerData(initData.playerAssignments); // Cache the player data
|
|
|
|
}
|
2010-08-12 05:01:33 +02:00
|
|
|
else // Needed for autostart loading option
|
|
|
|
{
|
|
|
|
g_Players = getPlayerData(null);
|
|
|
|
}
|
2010-08-14 06:34:49 +02:00
|
|
|
|
2010-08-13 18:05:06 +02:00
|
|
|
cacheMenuObjects();
|
2010-08-12 00:16:16 +02:00
|
|
|
|
2010-06-30 23:34:44 +02:00
|
|
|
onSimulationUpdate();
|
|
|
|
}
|
|
|
|
|
|
|
|
function leaveGame()
|
|
|
|
{
|
|
|
|
stopMusic();
|
|
|
|
endGame();
|
|
|
|
Engine.SwitchGuiPage("page_pregame.xml");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return some data that we'll use when hotloading this file after changes
|
|
|
|
function getHotloadData()
|
|
|
|
{
|
|
|
|
return { selection: g_Selection.selected };
|
|
|
|
}
|
|
|
|
|
|
|
|
function onTick()
|
|
|
|
{
|
2010-07-02 23:28:48 +02:00
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
var message = Engine.PollNetworkClient();
|
|
|
|
if (!message)
|
|
|
|
break;
|
|
|
|
handleNetMessage(message);
|
|
|
|
}
|
|
|
|
|
2010-06-30 23:34:44 +02:00
|
|
|
g_DevSettings.controlAll = getGUIObjectByName("devControlAll").checked;
|
|
|
|
// TODO: at some point this controlAll needs to disable the simulation code's
|
|
|
|
// player checks (once it has some player checks)
|
|
|
|
|
|
|
|
updateCursor();
|
|
|
|
|
|
|
|
// If the selection changed, we need to regenerate the sim display
|
|
|
|
if (g_Selection.dirty)
|
2010-08-05 12:20:47 +02:00
|
|
|
{
|
2010-06-30 23:34:44 +02:00
|
|
|
onSimulationUpdate();
|
2010-08-05 12:20:47 +02:00
|
|
|
|
|
|
|
// Display rally points for selected buildings
|
|
|
|
Engine.GuiInterfaceCall("DisplayRallyPoint", { "entities": g_Selection.toList() });
|
|
|
|
}
|
2010-08-11 23:04:09 +02:00
|
|
|
|
|
|
|
// Run timers
|
|
|
|
updateTimers();
|
2010-09-04 15:24:52 +02:00
|
|
|
|
|
|
|
// When training is blocked, flash population (alternates colour every 500msec)
|
|
|
|
if (g_IsTrainingQueueBlocked && (Date.now() % 1000) < 500)
|
|
|
|
getGUIObjectByName("resourcePop").textcolor = "255 0 0";
|
|
|
|
else
|
|
|
|
getGUIObjectByName("resourcePop").textcolor = "0 0 0";
|
2010-06-30 23:34:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function onSimulationUpdate()
|
|
|
|
{
|
|
|
|
g_Selection.dirty = false;
|
2010-08-28 23:12:52 +02:00
|
|
|
g_EntityStates = {};
|
|
|
|
g_TemplateData = {};
|
|
|
|
|
2010-06-30 23:34:44 +02:00
|
|
|
var simState = Engine.GuiInterfaceCall("GetSimulationState");
|
|
|
|
|
|
|
|
// If we're called during init when the game is first loading, there will be no simulation yet, so do nothing
|
|
|
|
if (!simState)
|
|
|
|
return;
|
|
|
|
|
2010-08-14 00:02:27 +02:00
|
|
|
handleNotifications();
|
2010-08-14 00:06:19 +02:00
|
|
|
|
2010-06-30 23:34:44 +02:00
|
|
|
updateDebug(simState);
|
|
|
|
updatePlayerDisplay(simState);
|
2010-08-12 00:16:16 +02:00
|
|
|
updateSelectionDetails();
|
2010-06-30 23:34:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function updateDebug(simState)
|
|
|
|
{
|
|
|
|
var debug = getGUIObjectByName("debug");
|
|
|
|
|
|
|
|
if (getGUIObjectByName("devDisplayState").checked)
|
|
|
|
{
|
|
|
|
debug.hidden = false;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
debug.hidden = true;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var text = uneval(simState);
|
|
|
|
|
|
|
|
var selection = g_Selection.toList();
|
|
|
|
if (selection.length)
|
|
|
|
{
|
2010-08-28 23:12:52 +02:00
|
|
|
var entState = GetEntityState(selection[0]);
|
2010-06-30 23:34:44 +02:00
|
|
|
if (entState)
|
|
|
|
{
|
2010-08-28 23:12:52 +02:00
|
|
|
var template = GetTemplateData(entState.template);
|
2010-06-30 23:34:44 +02:00
|
|
|
text += "\n\n" + uneval(entState) + "\n\n" + uneval(template);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
debug.caption = text;
|
|
|
|
}
|
|
|
|
|
|
|
|
function updatePlayerDisplay(simState)
|
|
|
|
{
|
|
|
|
var playerState = simState.players[Engine.GetPlayerID()];
|
2010-06-30 23:41:04 +02:00
|
|
|
if (!playerState)
|
|
|
|
return;
|
|
|
|
|
2010-06-30 23:34:44 +02:00
|
|
|
getGUIObjectByName("resourceFood").caption = playerState.resourceCounts.food;
|
|
|
|
getGUIObjectByName("resourceWood").caption = playerState.resourceCounts.wood;
|
|
|
|
getGUIObjectByName("resourceStone").caption = playerState.resourceCounts.stone;
|
|
|
|
getGUIObjectByName("resourceMetal").caption = playerState.resourceCounts.metal;
|
|
|
|
getGUIObjectByName("resourcePop").caption = playerState.popCount + "/" + playerState.popLimit;
|
2010-09-04 15:24:52 +02:00
|
|
|
|
|
|
|
g_IsTrainingQueueBlocked = playerState.trainingQueueBlocked;
|
2010-06-30 23:34:44 +02:00
|
|
|
}
|