Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/gui/session/session.js
const g_IsReplay = Engine.IsVisualReplay(); | const g_IsReplay = Engine.IsVisualReplay(); | ||||
const g_CivData = loadCivData(false, true); | const g_CivData = loadCivData(false, true); | ||||
const g_Ceasefire = prepareForDropdown(g_Settings && g_Settings.Ceasefire); | const g_Ceasefire = prepareForDropdown(g_Settings && g_Settings.Ceasefire); | ||||
const g_MapSizes = prepareForDropdown(g_Settings && g_Settings.MapSizes); | const g_MapSizes = prepareForDropdown(g_Settings && g_Settings.MapSizes); | ||||
const g_MapTypes = prepareForDropdown(g_Settings && g_Settings.MapTypes); | const g_MapTypes = prepareForDropdown(g_Settings && g_Settings.MapTypes); | ||||
const g_PopulationCapacities = prepareForDropdown(g_Settings && g_Settings.PopulationCapacities); | const g_PopulationCapacities = prepareForDropdown(g_Settings && g_Settings.PopulationCapacities); | ||||
const g_StartingResources = prepareForDropdown(g_Settings && g_Settings.StartingResources); | const g_StartingResources = prepareForDropdown(g_Settings && g_Settings.StartingResources); | ||||
const g_VictoryDurations = prepareForDropdown(g_Settings && g_Settings.VictoryDurations); | const g_VictoryDurations = prepareForDropdown(g_Settings && g_Settings.VictoryDurations); | ||||
const g_VictoryConditions = g_Settings && g_Settings.VictoryConditions; | const g_VictoryConditions = g_Settings && g_Settings.VictoryConditions; | ||||
var g_Chat; | var g_Chat; | ||||
var g_DiplomacyButton; | |||||
var g_DiplomacyColors; | |||||
var g_DiplomacyDialog; | |||||
var g_MiniMapPanel; | |||||
var g_GameSpeeds; | var g_GameSpeeds; | ||||
/** | /** | ||||
* Whether to display diplomacy colors (where players see self/ally/neutral/enemy each in different colors and | |||||
* observers see each team in a different color) or regular player colors. | |||||
*/ | |||||
var g_DiplomacyColorsToggle = false; | |||||
/** | |||||
* The array of displayed player colors (either the diplomacy color or regular color for each player). | |||||
*/ | |||||
var g_DisplayedPlayerColors; | |||||
/** | |||||
* Colors to flash when pop limit reached. | * Colors to flash when pop limit reached. | ||||
*/ | */ | ||||
var g_DefaultPopulationColor = "white"; | var g_DefaultPopulationColor = "white"; | ||||
var g_PopulationAlertColor = "orange"; | var g_PopulationAlertColor = "orange"; | ||||
/** | /** | ||||
* Seen in the tooltip of the top panel. | * Seen in the tooltip of the top panel. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 230 Lines • ▼ Show 20 Lines | function init(initData, hotloadData) | ||||
{ | { | ||||
g_ReplaySelectionData = initData.replaySelectionData; | g_ReplaySelectionData = initData.replaySelectionData; | ||||
g_HasRejoined = initData.isRejoining; | g_HasRejoined = initData.isRejoining; | ||||
if (initData.savedGUIData) | if (initData.savedGUIData) | ||||
restoreSavedGameData(initData.savedGUIData); | restoreSavedGameData(initData.savedGUIData); | ||||
} | } | ||||
g_DeveloperOverlay = new DeveloperOverlay(); | |||||
g_Chat = new Chat(); | g_Chat = new Chat(); | ||||
g_DeveloperOverlay = new DeveloperOverlay(); | |||||
g_DiplomacyColors = new DiplomacyColors(); | |||||
g_DiplomacyDialog = new DiplomacyDialog(g_DiplomacyColors); | |||||
g_DiplomacyButton = new DiplomacyButton(g_DiplomacyDialog); | |||||
g_MiniMapPanel = new MiniMapPanel(g_DiplomacyColors, g_WorkerTypes); | |||||
LoadModificationTemplates(); | LoadModificationTemplates(); | ||||
updatePlayerData(); | updatePlayerData(); | ||||
initializeMusic(); // before changing the perspective | initializeMusic(); // before changing the perspective | ||||
initGUIObjects(); | initGUIObjects(); | ||||
if (hotloadData) | if (hotloadData) | ||||
{ | { | ||||
g_Selection.selected = hotloadData.selection; | g_Selection.selected = hotloadData.selection; | ||||
g_PlayerAssignments = hotloadData.playerAssignments; | g_PlayerAssignments = hotloadData.playerAssignments; | ||||
g_Players = hotloadData.player; | g_Players = hotloadData.player; | ||||
} | } | ||||
sendLobbyPlayerlistUpdate(); | sendLobbyPlayerlistUpdate(); | ||||
onSimulationUpdate(); | onSimulationUpdate(); | ||||
setTimeout(displayGamestateNotifications, 1000); | setTimeout(displayGamestateNotifications, 1000); | ||||
} | } | ||||
function initGUIObjects() | function initGUIObjects() | ||||
{ | { | ||||
initMenu(); | initMenu(); | ||||
updateGameSpeedControl(); | updateGameSpeedControl(); | ||||
resizeDiplomacyDialog(); | |||||
resizeTradeDialog(); | resizeTradeDialog(); | ||||
initBarterButtons(); | initBarterButtons(); | ||||
initPanelEntities(); | initPanelEntities(); | ||||
g_DiplomacyColors.onPlayerInit(); | |||||
initViewedPlayerDropdown(); | initViewedPlayerDropdown(); | ||||
Engine.SetBoundingBoxDebugOverlay(false); | Engine.SetBoundingBoxDebugOverlay(false); | ||||
updateEnabledRangeOverlayTypes(); | updateEnabledRangeOverlayTypes(); | ||||
g_DiplomacyDialog.onPlayerInit(); | |||||
} | } | ||||
function updatePlayerData() | function updatePlayerData() | ||||
{ | { | ||||
let simState = GetSimState(); | let simState = GetSimState(); | ||||
if (!simState) | if (!simState) | ||||
return; | return; | ||||
Show All 34 Lines | for (let guid in g_PlayerAssignments) | ||||
playerData[playerID].guid = guid; | playerData[playerID].guid = guid; | ||||
playerData[playerID].name = g_PlayerAssignments[guid].name; | playerData[playerID].name = g_PlayerAssignments[guid].name; | ||||
} | } | ||||
g_Players = playerData; | g_Players = playerData; | ||||
} | } | ||||
function updateDiplomacyColorsButton() | |||||
{ | |||||
g_DiplomacyColorsToggle = !g_DiplomacyColorsToggle; | |||||
let diplomacyColorsButton = Engine.GetGUIObjectByName("diplomacyColorsButton"); | |||||
diplomacyColorsButton.sprite = g_DiplomacyColorsToggle ? | |||||
"stretched:session/minimap-diplomacy-on.png" : | |||||
"stretched:session/minimap-diplomacy-off.png"; | |||||
diplomacyColorsButton.sprite_over = g_DiplomacyColorsToggle ? | |||||
"stretched:session/minimap-diplomacy-on-highlight.png" : | |||||
"stretched:session/minimap-diplomacy-off-highlight.png"; | |||||
Engine.GetGUIObjectByName("diplomacyColorsWindowButtonIcon").sprite = g_DiplomacyColorsToggle ? | |||||
"stretched:session/icons/diplomacy-on.png" : | |||||
"stretched:session/icons/diplomacy.png"; | |||||
updateDisplayedPlayerColors(); | |||||
} | |||||
/** | |||||
* Updates the displayed colors of players in the simulation and GUI. | |||||
*/ | |||||
function updateDisplayedPlayerColors() | |||||
{ | |||||
if (g_DiplomacyColorsToggle) | |||||
{ | |||||
let getDiplomacyColor = stance => | |||||
guiToRgbColor(Engine.ConfigDB_GetValue("user", "gui.session.diplomacycolors." + stance)) || | |||||
guiToRgbColor(Engine.ConfigDB_GetValue("default", "gui.session.diplomacycolors." + stance)); | |||||
let teamRepresentatives = {}; | |||||
for (let i = 1; i < g_Players.length; ++i) | |||||
if (g_ViewedPlayer <= 0) | |||||
{ | |||||
// Observers and gaia see team colors | |||||
let team = g_Players[i].team; | |||||
g_DisplayedPlayerColors[i] = g_Players[teamRepresentatives[team] || i].color; | |||||
if (team != -1 && !teamRepresentatives[team]) | |||||
teamRepresentatives[team] = i; | |||||
} | |||||
else | |||||
// Players see colors depending on diplomacy | |||||
g_DisplayedPlayerColors[i] = | |||||
g_ViewedPlayer == i ? getDiplomacyColor("self") : | |||||
g_Players[g_ViewedPlayer].isAlly[i] ? getDiplomacyColor("ally") : | |||||
g_Players[g_ViewedPlayer].isNeutral[i] ? getDiplomacyColor("neutral") : | |||||
getDiplomacyColor("enemy"); | |||||
g_DisplayedPlayerColors[0] = g_Players[0].color; | |||||
} | |||||
else | |||||
g_DisplayedPlayerColors = g_Players.map(player => player.color); | |||||
Engine.GuiInterfaceCall("UpdateDisplayedPlayerColors", { | |||||
"displayedPlayerColors": g_DisplayedPlayerColors, | |||||
"displayDiplomacyColors": g_DiplomacyColorsToggle, | |||||
"showAllStatusBars": g_ShowAllStatusBars, | |||||
"selected": g_Selection.toList() | |||||
}); | |||||
updateGUIObjects(); | |||||
} | |||||
/** | /** | ||||
* Depends on the current player (g_IsObserver). | * Depends on the current player (g_IsObserver). | ||||
*/ | */ | ||||
function updateHotkeyTooltips() | function updateHotkeyTooltips() | ||||
{ | { | ||||
Engine.GetGUIObjectByName("idleWorkerButton").tooltip = | |||||
colorizeHotkey("%(hotkey)s" + " ", "selection.idleworker") + | |||||
translate("Find idle worker"); | |||||
Engine.GetGUIObjectByName("diplomacyColorsButton").tooltip = | |||||
colorizeHotkey("%(hotkey)s" + " ", "session.diplomacycolors") + | |||||
translate("Toggle Diplomacy Colors"); | |||||
Engine.GetGUIObjectByName("diplomacyColorsWindowButton").tooltip = | |||||
colorizeHotkey("%(hotkey)s" + " ", "session.diplomacycolors") + | |||||
translate("Toggle Diplomacy Colors"); | |||||
Engine.GetGUIObjectByName("diplomacyButton").tooltip = | |||||
colorizeHotkey("%(hotkey)s" + " ", "session.gui.diplomacy.toggle") + | |||||
translate("Diplomacy"); | |||||
Engine.GetGUIObjectByName("tradeButton").tooltip = | Engine.GetGUIObjectByName("tradeButton").tooltip = | ||||
colorizeHotkey("%(hotkey)s" + " ", "session.gui.barter.toggle") + | colorizeHotkey("%(hotkey)s" + " ", "session.gui.barter.toggle") + | ||||
translate("Barter & Trade"); | translate("Barter & Trade"); | ||||
Engine.GetGUIObjectByName("tradeHelp").tooltip = colorizeHotkey( | Engine.GetGUIObjectByName("tradeHelp").tooltip = colorizeHotkey( | ||||
translate("Select one type of goods you want to modify by clicking on it, and then use the arrows of the other types to modify their shares. You can also press %(hotkey)s while selecting one type of goods to bring its share to 100%%."), | translate("Select one type of goods you want to modify by clicking on it, and then use the arrows of the other types to modify their shares. You can also press %(hotkey)s while selecting one type of goods to bring its share to 100%%."), | ||||
"session.fulltradeswap"); | "session.fulltradeswap"); | ||||
▲ Show 20 Lines • Show All 51 Lines • ▼ Show 20 Lines | function initializeMusic() | ||||
if (g_ViewedPlayer != -1 && g_CivData[g_Players[g_ViewedPlayer].civ].Music) | if (g_ViewedPlayer != -1 && g_CivData[g_Players[g_ViewedPlayer].civ].Music) | ||||
global.music.storeTracks(g_CivData[g_Players[g_ViewedPlayer].civ].Music); | global.music.storeTracks(g_CivData[g_Players[g_ViewedPlayer].civ].Music); | ||||
global.music.setState(global.music.states.PEACE); | global.music.setState(global.music.states.PEACE); | ||||
playAmbient(); | playAmbient(); | ||||
} | } | ||||
function initViewedPlayerDropdown() | function initViewedPlayerDropdown() | ||||
{ | { | ||||
g_DisplayedPlayerColors = g_Players.map(player => player.color); | |||||
updateViewedPlayerDropdown(); | updateViewedPlayerDropdown(); | ||||
// Select "observer" in the view player dropdown when rejoining as a defeated player | // Select "observer" in the view player dropdown when rejoining as a defeated player | ||||
let player = g_Players[Engine.GetPlayerID()]; | let player = g_Players[Engine.GetPlayerID()]; | ||||
Engine.GetGUIObjectByName("viewPlayer").selected = player && player.state == "defeated" ? 0 : Engine.GetPlayerID() + 1; | Engine.GetGUIObjectByName("viewPlayer").selected = player && player.state == "defeated" ? 0 : Engine.GetPlayerID() + 1; | ||||
} | } | ||||
function updateViewedPlayerDropdown() | function updateViewedPlayerDropdown() | ||||
Show All 28 Lines | function selectViewPlayer(playerID) | ||||
if (g_DeveloperOverlay.isChangePerspective()) | if (g_DeveloperOverlay.isChangePerspective()) | ||||
{ | { | ||||
Engine.SetPlayerID(g_ViewedPlayer); | Engine.SetPlayerID(g_ViewedPlayer); | ||||
g_IsObserver = isPlayerObserver(g_ViewedPlayer); | g_IsObserver = isPlayerObserver(g_ViewedPlayer); | ||||
} | } | ||||
Engine.SetViewedPlayer(g_ViewedPlayer); | Engine.SetViewedPlayer(g_ViewedPlayer); | ||||
updateDisplayedPlayerColors(); | g_DiplomacyColors.updateDisplayedPlayerColors(); | ||||
updateTopPanel(); | updateTopPanel(); | ||||
g_Chat.onUpdatePlayers(); | g_Chat.onUpdatePlayers(); | ||||
updateHotkeyTooltips(); | updateHotkeyTooltips(); | ||||
// Update GUI and clear player-dependent cache | // Update GUI and clear player-dependent cache | ||||
g_TemplateData = {}; | g_TemplateData = {}; | ||||
Engine.GuiInterfaceCall("ResetTemplateModified"); | Engine.GuiInterfaceCall("ResetTemplateModified"); | ||||
onSimulationUpdate(); | onSimulationUpdate(); | ||||
if (g_IsDiplomacyOpen) | g_DiplomacyDialog.update(); | ||||
openDiplomacy(); | |||||
if (g_IsTradeOpen) | if (g_IsTradeOpen) | ||||
openTrade(); | openTrade(); | ||||
} | } | ||||
/** | /** | ||||
* Returns true if the player with that ID is in observermode. | * Returns true if the player with that ID is in observermode. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 108 Lines • ▼ Show 20 Lines | function updateTopPanel() | ||||
hideRemaining("resourceCounts", r); | hideRemaining("resourceCounts", r); | ||||
let resPop = Engine.GetGUIObjectByName("population"); | let resPop = Engine.GetGUIObjectByName("population"); | ||||
let resPopSize = resPop.size; | let resPopSize = resPop.size; | ||||
resPopSize.left = Engine.GetGUIObjectByName("resource[" + (r - 1) + "]").size.right; | resPopSize.left = Engine.GetGUIObjectByName("resource[" + (r - 1) + "]").size.right; | ||||
resPop.size = resPopSize; | resPop.size = resPopSize; | ||||
Engine.GetGUIObjectByName("population").hidden = !isPlayer; | Engine.GetGUIObjectByName("population").hidden = !isPlayer; | ||||
Engine.GetGUIObjectByName("diplomacyButton").hidden = !isPlayer; | g_DiplomacyButton.update(); | ||||
Engine.GetGUIObjectByName("tradeButton").hidden = !isPlayer || | Engine.GetGUIObjectByName("tradeButton").hidden = !isPlayer || | ||||
(!g_ResourceData.GetTradableCodes().length && !g_ResourceData.GetBarterableCodes().length); | (!g_ResourceData.GetTradableCodes().length && !g_ResourceData.GetBarterableCodes().length); | ||||
Engine.GetGUIObjectByName("observerText").hidden = isPlayer; | Engine.GetGUIObjectByName("observerText").hidden = isPlayer; | ||||
let alphaLabel = Engine.GetGUIObjectByName("alphaLabel"); | let alphaLabel = Engine.GetGUIObjectByName("alphaLabel"); | ||||
alphaLabel.hidden = isPlayer && !viewPlayer.hidden; | alphaLabel.hidden = isPlayer && !viewPlayer.hidden; | ||||
alphaLabel.size = isPlayer ? "50%+44 0 100%-283 100%" : "155 0 85%-279 100%"; | alphaLabel.size = isPlayer ? "50%+44 0 100%-283 100%" : "155 0 85%-279 100%"; | ||||
▲ Show 20 Lines • Show All 142 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
function changeGameSpeed(speed) | function changeGameSpeed(speed) | ||||
{ | { | ||||
if (!g_IsNetworked) | if (!g_IsNetworked) | ||||
Engine.SetSimRate(speed); | Engine.SetSimRate(speed); | ||||
} | } | ||||
function updateIdleWorkerButton() | |||||
{ | |||||
Engine.GetGUIObjectByName("idleWorkerButton").enabled = Engine.GuiInterfaceCall("HasIdleUnits", { | |||||
"viewedPlayer": g_ViewedPlayer, | |||||
"idleClasses": g_WorkerTypes, | |||||
"excludeUnits": [] | |||||
}); | |||||
} | |||||
function onSimulationUpdate() | function onSimulationUpdate() | ||||
{ | { | ||||
// Templates change depending on technologies and auras, so they have to be reloaded after such a change. | // Templates change depending on technologies and auras, so they have to be reloaded after such a change. | ||||
// g_TechnologyData data never changes, so it shouldn't be deleted. | // g_TechnologyData data never changes, so it shouldn't be deleted. | ||||
g_EntityStates = {}; | g_EntityStates = {}; | ||||
if (Engine.GuiInterfaceCall("IsTemplateModified")) | if (Engine.GuiInterfaceCall("IsTemplateModified")) | ||||
{ | { | ||||
g_TemplateData = {}; | g_TemplateData = {}; | ||||
▲ Show 20 Lines • Show All 75 Lines • ▼ Show 20 Lines | function updateGUIObjects() | ||||
displayPanelEntities(); | displayPanelEntities(); | ||||
updateGroups(); | updateGroups(); | ||||
updatePlayerDisplay(); | updatePlayerDisplay(); | ||||
updateResearchDisplay(); | updateResearchDisplay(); | ||||
updateSelectionDetails(); | updateSelectionDetails(); | ||||
updateBuildingPlacementPreview(); | updateBuildingPlacementPreview(); | ||||
updateTimeNotifications(); | updateTimeNotifications(); | ||||
updateIdleWorkerButton(); | |||||
if (g_IsTradeOpen) | if (g_IsTradeOpen) | ||||
{ | { | ||||
updateTraderTexts(); | updateTraderTexts(); | ||||
updateBarterButtons(); | updateBarterButtons(); | ||||
} | } | ||||
if (g_ViewedPlayer > 0) | if (g_ViewedPlayer > 0) | ||||
{ | { | ||||
let playerState = GetSimState().players[g_ViewedPlayer]; | let playerState = GetSimState().players[g_ViewedPlayer]; | ||||
g_DeveloperOverlay.setControlAll(playerState && playerState.controlsAll); | g_DeveloperOverlay.setControlAll(playerState && playerState.controlsAll); | ||||
} | } | ||||
if (!g_IsObserver) | if (!g_IsObserver) | ||||
{ | { | ||||
// Update music state on basis of battle state. | // Update music state on basis of battle state. | ||||
let battleState = Engine.GuiInterfaceCall("GetBattleState", g_ViewedPlayer); | let battleState = Engine.GuiInterfaceCall("GetBattleState", g_ViewedPlayer); | ||||
if (battleState) | if (battleState) | ||||
global.music.setState(global.music.states[battleState]); | global.music.setState(global.music.states[battleState]); | ||||
} | } | ||||
updateViewedPlayerDropdown(); | updateViewedPlayerDropdown(); | ||||
updateDiplomacy(); | |||||
g_DeveloperOverlay.update(); | g_DeveloperOverlay.update(); | ||||
g_DiplomacyDialog.update(); | |||||
g_MiniMapPanel.update(); | |||||
} | } | ||||
function saveResPopTooltipSort() | function saveResPopTooltipSort() | ||||
{ | { | ||||
Engine.ConfigDB_CreateAndWriteValueToFile("user", "gui.session.respoptooltipsort", String((+Engine.ConfigDB_GetValue("user", "gui.session.respoptooltipsort") + 2) % 3 - 1), "config/user.cfg"); | Engine.ConfigDB_CreateAndWriteValueToFile("user", "gui.session.respoptooltipsort", String((+Engine.ConfigDB_GetValue("user", "gui.session.respoptooltipsort") + 2) % 3 - 1), "config/user.cfg"); | ||||
} | } | ||||
function onReplayFinished() | function onReplayFinished() | ||||
▲ Show 20 Lines • Show All 739 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator