Index: ps/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/AIConfigButton.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/AIConfigButton.js (revision 23390) +++ ps/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/AIConfigButton.js (revision 23391) @@ -1,188 +1,188 @@ PlayerSettingControls.AIConfigButton = class extends GameSettingControl { constructor(...args) { super(...args); this.playerConfig = Engine.GetGUIObjectByName("playerConfig[" + this.playerIndex + "]"); this.isPageOpen = false; this.guid = undefined; this.fixedAI = undefined; this.defaultAIDiff = +Engine.ConfigDB_GetValue("user", this.ConfigDifficulty); this.defaultBehavior = Engine.ConfigDB_GetValue("user", this.ConfigBehavior); // Save little performance by not reallocating every call this.sprintfArgs = {}; this.playerConfig.onPress = this.openConfigPage.bind(this, this.playerIndex); } onMapChange(mapData) { let pData = this.gameSettingsControl.getPlayerData(g_GameAttributes, this.playerIndex); if (!pData) return; let isScenario = g_GameAttributes.mapType == "scenario"; let mapPData = this.gameSettingsControl.getPlayerData(mapData, this.playerIndex); if (mapPData && mapPData.AI) { let defaultPData = g_Settings.PlayerDefaults[this.playerIndex + 1]; this.fixedAI = { "AI": mapPData.AI, "AIDiff": mapPData.AIDiff !== undefined ? mapPData.AIDiff : defaultPData.AIDiff, "AIBehavior": mapPData.AIBehavior !== undefined ? mapPData.AIBehavior : defaultPData.AIBehavior }; } else this.fixedAI = undefined; } onAssignPlayer(source, target) { if (source && target.AI) { source.AI = target.AI; source.AIDiff = target.AIDiff; source.AIBehavior = target.AIBehavior; } target.AI = false; delete target.AIDiff; delete target.AIBehavior; } onPlayerAssignmentsChange() { this.guid = undefined; for (let guid in g_PlayerAssignments) if (g_PlayerAssignments[guid].player == this.playerIndex + 1) this.guid = guid; } onGameAttributesChange() { let pData = this.gameSettingsControl.getPlayerData(g_GameAttributes, this.playerIndex); if (!pData) return; // Enforce map specified AI if (this.fixedAI && (pData.AI !== this.fixedAI.AI || pData.AIDiff !== this.fixedAI.AIDiff || pData.AIBehavior !== this.fixedAI.AIBehavior)) { pData.AI = this.fixedAI.AI; pData.AIDiff = this.fixedAI.AIDiff; pData.AIBehavior = this.fixedAI.AIBehavior; this.gameSettingsControl.updateGameAttributes(); } // Sanitize, make AI state self-consistent if (pData.AI) { - if (!pData.AIDiff || !pData.AIBehavior) + if (pData.AIDiff === undefined || pData.AIBehavior === undefined) { - if (!pData.AIDiff) + if (pData.AIDiff === undefined) pData.AIDiff = this.defaultAIDiff; - if (!pData.AIBehavior) + if (pData.AIBehavior === undefined) pData.AIBehavior = this.defaultBehavior; this.gameSettingsControl.updateGameAttributes(); } } else if (pData.AI === undefined) { if (this.guid) pData.AI = false; else { pData.AI = g_Settings.PlayerDefaults[this.playerIndex + 1].AI; pData.AIDiff = this.defaultAIDiff; pData.AIBehavior = this.defaultBehavior; } this.gameSettingsControl.updateGameAttributes(); } - else if (pData.AIBehavior || pData.AIDiff) + else if (pData.AIBehavior !== undefined || pData.AIDiff !== undefined) { pData.AI = false; delete pData.AIBehavior; delete pData.AIDiff; this.gameSettingsControl.updateGameAttributes(); } } onGameAttributesBatchChange() { let isPageOpen = this.isPageOpen; if (isPageOpen) Engine.PopGuiPage(); let pData = this.gameSettingsControl.getPlayerData(g_GameAttributes, this.playerIndex); if (!pData) return; this.sprintfArgs.description = translateAISettings(pData); this.playerConfig.tooltip = sprintf(this.Tooltip, this.sprintfArgs); this.playerConfig.hidden = !pData.AI; if (isPageOpen) this.openConfigPage(); } openConfigPage() { let pData = this.gameSettingsControl.getPlayerData(g_GameAttributes, this.playerIndex); if (!pData || !pData.AI) return; this.isPageOpen = true; Engine.PushGuiPage( "page_aiconfig.xml", { "playerSlot": this.playerIndex, "id": pData.AI, "difficulty": pData.AIDiff, "behavior": pData.AIBehavior, "fixed": !!this.fixedAI }, this.onConfigPageClosed.bind(this)); } onConfigPageClosed(data) { this.isPageOpen = false; let pData = this.gameSettingsControl.getPlayerData(g_GameAttributes, this.playerIndex); if (!data || !data.save || !g_IsController || !pData) return; pData.AI = data.id; pData.AIDiff = data.difficulty; pData.AIBehavior = data.behavior; this.gameSettingsControl.updateGameAttributes(); this.gameSettingsControl.setNetworkGameAttributes(); } }; PlayerSettingControls.AIConfigButton.prototype.Tooltip = translate("Configure AI: %(description)s."); PlayerSettingControls.AIConfigButton.prototype.ConfigDifficulty = "gui.gamesetup.aidifficulty"; PlayerSettingControls.AIConfigButton.prototype.ConfigBehavior = "gui.gamesetup.aibehavior"; Index: ps/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingsPanel.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingsPanel.js (revision 23390) +++ ps/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingsPanel.js (revision 23391) @@ -1,187 +1,186 @@ class GameSettingsPanel { constructor(gamesetupPage, gameSettingTabs, gameSettingsControl, gameSettingControlManager) { this.settingTabButtonsFrame = Engine.GetGUIObjectByName("settingTabButtonsFrame"); this.settingsPanelFrame = Engine.GetGUIObjectByName("settingsPanelFrame"); this.gameSettingControlManager = gameSettingControlManager; this.gameSettingsPanelResizeHandlers = new Set(); this.setupWindow = Engine.GetGUIObjectByName("setupWindow"); - this.setupWindow.onWindowResized = this.onTabSelect.bind(this); + this.setupWindow.onWindowResized = this.triggerResizeHandlers.bind(this); this.settingsPanel = Engine.GetGUIObjectByName("settingsPanel"); this.enabled = Engine.ConfigDB_GetValue("user", this.ConfigNameSlide) == "true"; this.slideSpeed = this.enabled ? this.SlideSpeed : Infinity; this.lastTickTime = undefined; gameSettingTabs.registerTabSelectHandler(this.onTabSelect.bind(this)); gameSettingsControl.registerGameAttributesBatchChangeHandler(this.onGameAttributesBatchChange.bind(this)); - gamesetupPage.registerLoadHandler(this.onLoad.bind(this)); + gamesetupPage.registerLoadHandler(this.triggerResizeHandlers.bind(this)); } registerGameSettingsPanelResizeHandler(handler) { this.gameSettingsPanelResizeHandlers.add(handler); } - onLoad() + triggerResizeHandlers() { for (let handler of this.gameSettingsPanelResizeHandlers) handler(this.settingsPanelFrame); } onGameAttributesBatchChange() { this.gameSettingControlManager.updateSettingVisibility(); this.positionSettings(); } onTabSelect() { this.gameSettingControlManager.updateSettingVisibility(); this.positionSettings(); this.lastTickTime = undefined; this.settingsPanelFrame.onTick = this.onTick.bind(this); } onTick() { let now = Date.now(); let tickLength = now - this.lastTickTime; let previousTime = this.lastTickTime; this.lastTickTime = now; if (previousTime === undefined) return; let distance = this.slideSpeed * tickLength; let rightBorder = this.settingTabButtonsFrame.size.left; let offset = 0; if (g_TabCategorySelected === undefined) { let maxOffset = rightBorder - this.settingsPanelFrame.size.left; if (maxOffset > 0) offset = Math.min(distance, maxOffset); } else if (rightBorder > this.settingsPanelFrame.size.right) { offset = Math.min(distance, rightBorder - this.settingsPanelFrame.size.right); } else { let maxOffset = this.settingsPanelFrame.size.left - rightBorder + (this.settingsPanelFrame.size.right - this.settingsPanelFrame.size.left); if (maxOffset > 0) offset = -Math.min(distance, maxOffset); } if (offset) this.changePanelWidth(offset); else { delete this.settingsPanelFrame.onTick; this.lastTickTime = undefined; } } changePanelWidth(offset) { if (!offset) return; let size = this.settingsPanelFrame.size; size.left += offset; size.right += offset; this.settingsPanelFrame.size = size; - for (let handler of this.gameSettingsPanelResizeHandlers) - handler(this.settingsPanelFrame); + this.triggerResizeHandlers(); } /** * Distribute the currently visible settings over the settings panel. * First calculate the number of columns required, then place the setting frames. */ positionSettings() { let setupWindowSize = this.setupWindow.getComputedSize(); let columnWidth = Math.min( this.MaxColumnWidth, (setupWindowSize.right - setupWindowSize.left + this.settingTabButtonsFrame.size.left) / 2); let settingsPerColumn; { let settingPanelSize = this.settingsPanel.getComputedSize(); let maxSettingsPerColumn = Math.floor((settingPanelSize.bottom - settingPanelSize.top) / this.SettingHeight); let settingCount = this.settingsPanel.children.filter(child => !child.children[0].hidden).length; settingsPerColumn = settingCount / Math.ceil(settingCount / maxSettingsPerColumn); } let yPos = this.SettingMarginBottom; let column = 0; let settingsThisColumn = 0; let selectedTab = g_GameSettingsLayout[g_TabCategorySelected]; if (!selectedTab) return; for (let name of selectedTab.settings) { let settingFrame = this.gameSettingControlManager.gameSettingControls[name].frame; if (settingFrame.hidden) continue; if (settingsThisColumn >= settingsPerColumn) { yPos = this.SettingMarginBottom; ++column; settingsThisColumn = 0; } settingFrame.size = new GUISize( columnWidth * column, yPos, columnWidth * (column + 1) - this.SettingMarginRight, yPos + this.SettingHeight - this.SettingMarginBottom); yPos += this.SettingHeight; ++settingsThisColumn; } { let size = this.settingsPanelFrame.size; size.right = size.left + (column + 1) * columnWidth; this.settingsPanelFrame.size = size; } } } GameSettingsPanel.prototype.ConfigNameSlide = "gui.gamesetup.settingsslide"; /** * Maximum width of a column in the settings panel. */ GameSettingsPanel.prototype.MaxColumnWidth = 470; /** * Pixels per millisecond the settings panel slides when opening/closing. */ GameSettingsPanel.prototype.SlideSpeed = 1.2; /** * Vertical size of a setting frame. */ GameSettingsPanel.prototype.SettingHeight = 32; /** * Horizontal space between two setting frames. */ GameSettingsPanel.prototype.SettingMarginRight = 10; /** * Vertical space between two setting frames. */ GameSettingsPanel.prototype.SettingMarginBottom = 2;