Files
Endfield-Data/LuaScripts/UI/Panels/GameSetting/GameSettingCtrl.lua
2026-01-31 21:42:01 +07:00

3607 lines
103 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.GameSetting
local HGUtils = CS.HG.Rendering.Runtime.HGUtils
local GameSettingSetter = CS.Beyond.Scripts.Entry.GameSettingSetter
local GameSettingHelper = CS.Beyond.Gameplay.GameSettingHelper
local GameSetting = CS.Beyond.GameSetting
local GameSettingVideoQuality = CS.Beyond.GameSetting.GameSettingVideoQuality
local GameSettingSubQualityOptionState = CS.Beyond.Gameplay.GameSettingSubQualityOptionState
local QualityManager = CS.Beyond.Scripts.Quality.QualityManager
local QualityManagerInst = QualityManager.instance
local DeviceControllerType = CS.Beyond.DeviceInfo.ControllerType
local InputDeviceFlags = CS.Beyond.Input.InputDeviceFlags
local KeyboardKeyCode = CS.Beyond.Input.KeyboardKeyCode
local GamepadKeyCode = CS.Beyond.Input.GamepadKeyCode
local QUALITY_SETTING_ID = GameSetting.ID_VIDEO_QUALITY
local STANDARD_HORIZONTAL_RESOLUTION = CS.Beyond.UI.UIConst.STANDARD_HORIZONTAL_RESOLUTION
local STANDARD_VERTICAL_RESOLUTION = CS.Beyond.UI.UIConst.STANDARD_VERTICAL_RESOLUTION
GameSettingCtrl = HL.Class('GameSettingCtrl', uiCtrl.UICtrl)
local KEYICON_PATH = "Assets/Beyond/InitialAssets/UI/Sprites/KeyIcon/"
local VIDEO_TAB_ID = "gameSetting_video"
local SETTING_ICON_SPRITE_NAME_FORMAT = "icon_settings_%s"
local INITIAL_TAB_INDEX = 1
local CUSTOM_QUALITY_SETTING_INDEX = 1
local VOLUME_COEFFICIENT = 10.0
local PADDING_CANVAS_MIN_WIDTH = 1920
local MB = 1024 * 1024
local LANGUAGE_TEXT_POP_UP_CONTENT_TEXT_ID = "ui_set_gamesetting_switch_lang_black"
local LANGUAGE_AUDIO_POP_UP_CONTENT_TEXT_ID = "ui_set_gamesetting_switch_voice_black"
local LANGUAGE_POP_UP_WARNING_TEXT_ID = "ui_set_gamesetting_switch_lang_red"
local QUALITY_POP_UP_CONTENT_TEXT_ID = "ui_set_gamesetting_switch_graphic"
local QUALITY_POP_UP_MOBILE_CONTENT_TEXT_ID = "ui_set_gamesetting_switch_graphic_black"
local QUALITY_POP_UP_MOBILE_WARNING_TEXT_ID = "ui_set_gamesetting_switch_graphic_red"
local DROPDOWN_FULL_SCREEN_RESOLUTION_TEXT_ID = "LUA_GAME_SETTING_FULL_SCREEN_RESOLUTION"
local DROPDOWN_WINDOWED_RESOLUTION_TEXT_ID = "LUA_GAME_SETTING_WINDOWED_RESOLUTION"
local DROPDOWN_MAIN_QUALITY_DEFAULT_TEXT_ID = "LUA_GAME_SETTING_DEFAULT_MAIN_QUALITY"
local DROPDOWN_OPTION_STATE_NORMAL = "Normal"
local DROPDOWN_OPTION_STATE_WARNING = "Warning"
local DROPDOWN_OPTION_STATE_DISABLED = "Disabled"
local DROPDOWN_OPTION_STATE_HIDDEN = "Hidden"
local SubQualityOptionStateToDropdownOptionState = {
[GameSettingSubQualityOptionState.Normal] = DROPDOWN_OPTION_STATE_NORMAL,
[GameSettingSubQualityOptionState.Warning] = DROPDOWN_OPTION_STATE_WARNING,
[GameSettingSubQualityOptionState.Disabled] = DROPDOWN_OPTION_STATE_DISABLED,
[GameSettingSubQualityOptionState.Hidden] = DROPDOWN_OPTION_STATE_HIDDEN,
}
local LANGUAGE_TAB_ID = "gameSetting_language"
local KEY_HINT_TAB_ID = "gameSetting_key_hint"
local GAMEPAD_TAB_ID = "gameSetting_gamepad"
local GAMEPAD_ACTION_DROPDOWN_SETTINGS = {
"gamepad_sprint_jump",
"gamepad_skill_combo",
}
local ITEM_TYPE_LIST = {
GEnums.SettingItemType.Toggle,
GEnums.SettingItemType.Dropdown,
GEnums.SettingItemType.Slider,
GEnums.SettingItemType.Button,
GEnums.SettingItemType.Key,
}
local KEY_ACTION_STATE = {
None = 0,
Dirty = 1 << 0,
Warning = 1 << 1,
}
local KEY_ACTION_STATE_BITS = 2
local KEY_ACTION_STATE_MASK = (1 << KEY_ACTION_STATE_BITS) - 1
local KEY_ACTION_STATE_MAX_LEVEL = KEY_ACTION_STATE_MASK
local function HasKeyActionState(value, target)
return (value & target) == target
end
GameSettingCtrl.m_settingChanged = HL.Field(HL.Boolean) << false
GameSettingCtrl.m_tabIndex = HL.Field(HL.Number) << -1
GameSettingCtrl.m_tabCells = HL.Field(HL.Forward('UIListCache'))
GameSettingCtrl.m_tabDataList = HL.Field(HL.Table)
GameSettingCtrl.m_itemCells = HL.Field(HL.Forward('UIListCache'))
GameSettingCtrl.m_itemCacheMap = HL.Field(HL.Table)
GameSettingCtrl.m_itemDataMap = HL.Field(HL.Table)
GameSettingCtrl.m_itemDataList = HL.Field(HL.Table)
GameSettingCtrl.m_itemCellMap = HL.Field(HL.Table)
GameSettingCtrl.m_currentDeviceNode = HL.Field(HL.Table)
GameSettingCtrl.m_contentHeight = HL.Field(HL.Number) << -1
GameSettingCtrl.m_itemCellHeight = HL.Field(HL.Number) << -1
GameSettingCtrl.m_itemCellHeightWithoutTitle = HL.Field(HL.Number) << -1
GameSettingCtrl.m_originalPadding = HL.Field(HL.Number) << -1
GameSettingCtrl.m_originalAudioSlide = HL.Field(HL.String) << ""
GameSettingCtrl.m_sliderValueDataMap = HL.Field(HL.Table)
GameSettingCtrl.m_keyActionScope2ItemDataList = HL.Field(HL.Table)
GameSettingCtrl.m_keyActionStateMap = HL.Field(HL.Table)
GameSettingCtrl.m_qualitySubSettingDataMap = HL.Field(HL.Table)
GameSettingCtrl.m_notchPaddingViewTick = HL.Field(HL.Number) << -1
GameSettingCtrl.m_notchPaddingViewTime = HL.Field(HL.Number) << -1
GameSettingCtrl.m_rootCanvasHelper = HL.Field(HL.Userdata)
GameSettingCtrl.m_worldRootCanvasHelper = HL.Field(HL.Userdata)
GameSettingCtrl.m_rootCanvasWidth = HL.Field(HL.Number) << -1
GameSettingCtrl.m_rootCanvasHeight = HL.Field(HL.Number) << -1
GameSettingCtrl.m_isNotchPaddingChanged = HL.Field(HL.Boolean) << false
GameSettingCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_TRY_CHANGE_INPUT_DEVICE_TYPE] = "_OnTryChangeInputDeviceType",
[MessageConst.ON_CONTROLLER_TYPE_CHANGED] = "_OnControllerTypeChanged",
[MessageConst.ON_CLOSE_CUSTOMER_SERVICE] = "_OnCloseCustomerService",
[MessageConst.GAME_SETTING_VOICE_RESOURCE_STATE_CHANGED] = "_OnVoiceResourceStateChanged",
}
GameSettingCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.view.btnClose.onClick:AddListener(function()
self:_OnCloseBtnClick()
end)
self.view.resetBtn.onClick:AddListener(function()
self:_OnResetBtnClick()
end)
self.view.saveBtn.onClick:AddListener(function()
self:_OnSaveBtnClick()
end)
self.view.deviceModeToggle:InitCommonToggle(function(isOn)
self:_SwitchDeviceMode(isOn)
end, true, true)
self.view.deviceModeBattleBtn.onClick:AddListener(function()
self.view.deviceModeToggle:SetValue(true)
end)
self.view.deviceModeFactoryBtn.onClick:AddListener(function()
self.view.deviceModeToggle:SetValue(false)
end)
self.m_tabCells = UIUtils.genCellCache(self.view.tabs.tabCell)
self.m_itemCells = UIUtils.genCellCache(self.view.settingItemCell)
self.m_itemCellHeight = self.view.settingItemCell.transform.rect.height
self.m_itemCellHeightWithoutTitle = self.m_itemCellHeight - self.view.settingItemCell.titleNode.rect.height
self.m_originalPadding = self.view.sourceItem.dropDownSetting.dropDownListMask.padding.w
self.m_originalAudioSlide = self.view.sourceItem.sliderSetting.slider.audioSlide
self.m_tabDataList = {}
self.m_itemDataList = {}
self.m_itemDataMap = {}
self.m_itemCellMap = {}
self.m_sliderValueDataMap = {}
self.m_keyActionScope2ItemDataList = {}
self.m_keyActionStateMap = {}
self.m_qualitySubSettingDataMap = {}
self.m_itemCacheMap = {}
self.m_rootCanvasHelper = UIManager.m_uiCanvasScaleHelper
self.m_worldRootCanvasHelper = UIManager.m_worldUICanvasScaleHelper
self.m_rootCanvasWidth = UIManager.uiCanvasRect.rect.width
self.m_rootCanvasHeight = UIManager.uiCanvasRect.rect.height
self.m_isNotchPaddingChanged = false
self.m_settingChanged = false
self.view.mobileNotchPaddingNode.gameObject:SetActive(false)
GameSetting.InitAvailableScreenResolutionList()
self:_InitLoad()
self:_BuildSettingDataList()
self:_InitSettingTabList()
if not GameInstance.isInGameplay then
InputManagerInst.needProcessTryChange = true
logger.important(CS.Beyond.EnableLogType.DevOnly, "[InputDevice] 设置界面关闭直接切换设备")
local LoginManagerInst = CS.Beyond.LoginManager.instance
if LoginManagerInst then
LoginManagerInst:ToggleLoginBindingGroup(false)
end
end
self:_InitController()
self:_QueryUnreadMsg()
end
GameSettingCtrl.OnClose = HL.Override() << function(self)
self:_SliderClearNotchPaddingTick()
self:_SliderTryApplyAllNotchPadding()
if not GameInstance.isInGameplay then
InputManagerInst.needProcessTryChange = false
logger.important(CS.Beyond.EnableLogType.DevOnly, "[InputDevice] 设置界面开启直接切换设备")
local LoginManagerInst = CS.Beyond.LoginManager.instance
if LoginManagerInst then
LoginManagerInst:ToggleLoginBindingGroup(true)
end
end
local isAnyDirty = self:_IsAnyKeyActionStateDirty()
if isAnyDirty then
self:_KeyClearPendingActions()
end
if self.m_settingChanged then
Notify(MessageConst.ON_GAME_SETTING_CHANGED)
GameInstance.player.gameSettingSystem:SaveSetting()
end
end
GameSettingCtrl._OnCloseBtnClick = HL.Method() << function(self)
local callback = function()
self.m_phase:CloseSelf()
end
if self:_CheckLeaveCurrentSettingTab(callback) then
callback()
end
end
GameSettingCtrl._OnResetBtnClick = HL.Method() << function(self)
self:_KeyResetActions()
end
GameSettingCtrl._OnSaveBtnClick = HL.Method() << function(self)
self:_KeySaveActions()
end
GameSettingCtrl._BuildSettingDataList = HL.Method() << function(self)
local tabDataMap = Tables.settingTabTable
if tabDataMap == nil then
return
end
for tabId, tabData in pairs(tabDataMap) do
if self:_IsSettingTabValid(tabId, tabData.validateFunction) then
if tabData.tabItems ~= nil then
table.insert(self.m_tabDataList, tabData)
end
end
end
table.sort(self.m_tabDataList, function(dataA, dataB)
return dataA.tabSortOrder < dataB.tabSortOrder
end)
for tabIndex, tabData in ipairs(self.m_tabDataList) do
self.m_itemDataList[tabIndex] = self:_BuildSettingTabData(tabData)
end
end
GameSettingCtrl._BuildSettingTabData = HL.Method(HL.Userdata).Return(HL.Table) << function(self, tabData)
local itemDataList = {}
for itemId, itemData in pairs(tabData.tabItems) do
if self:_IsSettingItemValid(itemData.settingId, itemData.validateFunction) then
table.insert(itemDataList, itemData)
self.m_itemDataMap[itemId] = itemData
end
end
if tabData.tabId == VIDEO_TAB_ID then
self:_InsertSubQualityItemDataList(itemDataList)
elseif tabData.tabId == KEY_HINT_TAB_ID then
lume.clear(self.m_keyActionScope2ItemDataList)
self:_InitKeyActionScopeMap(itemDataList)
end
table.sort(itemDataList, function(dataA, dataB)
return dataA.settingSortOrder < dataB.settingSortOrder
end)
return itemDataList
end
GameSettingCtrl._GetCachedItem = HL.Method(HL.Userdata, HL.Userdata).Return(HL.Table) << function(self, transform, itemType)
if self.m_itemCacheMap[transform] == nil then
self.m_itemCacheMap[transform] = {}
end
local cachedItem = self.m_itemCacheMap[transform]
local sourceNode = self.view.sourceItem
if cachedItem[itemType] == nil then
local sourceItem
if itemType == GEnums.SettingItemType.Dropdown then
sourceItem = sourceNode.dropDownSetting
elseif itemType == GEnums.SettingItemType.Slider then
sourceItem = sourceNode.sliderSetting
elseif itemType == GEnums.SettingItemType.Button then
sourceItem = sourceNode.buttonSetting
elseif itemType == GEnums.SettingItemType.Toggle then
sourceItem = sourceNode.toggleSetting
elseif itemType == GEnums.SettingItemType.Key then
sourceItem = sourceNode.keySetting
end
local object = CSUtils.CreateObject(sourceItem.gameObject, transform)
cachedItem[itemType] = Utils.wrapLuaNode(object)
end
local item = cachedItem[itemType]
for _, type in pairs(ITEM_TYPE_LIST) do
if type ~= itemType then
if cachedItem[type] ~= nil then
cachedItem[type].gameObject:SetActive(false)
end
end
end
item.gameObject:SetActive(true)
item.rectTransform.anchoredPosition = Vector2.zero
return item
end
GameSettingCtrl._IsSettingTabValid = HL.Method(HL.String, HL.String)
.Return(HL.Boolean)
<< function(self, settingTabId, validateFunction)
if not GameSetting.IsSettingTabValid(settingTabId) then
return false
end
if string.isEmpty(validateFunction) then
return true
end
validateFunction = self[self:_GetSettingFunctionName(validateFunction)]
if validateFunction == nil then
logger.error(ELogChannel.GameSetting, "Setting tab validate function not found, settingTabId: " .. tostring(settingTabId))
return false
end
local success, result = xpcall(validateFunction, debug.traceback, self, settingTabId)
if not success then
logger.error(ELogChannel.GameSetting, "Setting tab validate function error, message: " .. tostring(result))
return false
end
return result
end
GameSettingCtrl._InitSettingTabList = HL.Method() << function(self)
self.m_tabCells:Refresh(#self.m_tabDataList, function(tabCell, tabIndex)
self:_RefreshSettingTabCell(tabCell, tabIndex)
end)
self:_RefreshSettingTab(INITIAL_TAB_INDEX, true)
end
GameSettingCtrl._RefreshSettingTabCell = HL.Method(HL.Table, HL.Number) << function(self, tabCell, tabIndex)
local tabData = self.m_tabDataList[tabIndex]
if tabData == nil then
return
end
tabCell.gameObject.name = string.format("GameSettingTab_%s", tabData.tabId)
local spriteName = string.format(SETTING_ICON_SPRITE_NAME_FORMAT, tabData.tabIcon)
UIUtils.setTabIcons(tabCell,UIConst.UI_SPRITE_GAME_SETTING,spriteName)
tabCell.toggle.isOn = tabIndex == INITIAL_TAB_INDEX
tabCell.toggle.checkIsValueValid = function(isOn)
if not isOn then
return true
end
return self:_ValidateClickSettingTab(tabCell)
end
tabCell.toggle.onValueChanged:RemoveAllListeners()
tabCell.toggle.onValueChanged:AddListener(function(isOn)
if isOn then
self:_OnSettingTabClicked(tabIndex)
end
end)
if string.isEmpty(tabData.tabRedDot) then
tabCell.redDot.gameObject:SetActive(false)
else
tabCell.redDot.gameObject:SetActive(true)
tabCell.redDot:InitRedDot(tabData.tabRedDot)
end
end
GameSettingCtrl._ValidateClickSettingTab = HL.Method(HL.Table).Return(HL.Boolean) << function(self, tabCell)
local callback = function()
tabCell.toggle.isOn = true
end
return self:_CheckLeaveCurrentSettingTab(callback)
end
GameSettingCtrl._OnSettingTabClicked = HL.Method(HL.Number) << function(self, tabIndex)
self:_RefreshSettingTab(tabIndex, true)
self.view.animationWrapper:PlayWithTween("gamesetting_change")
self:_SliderClearNotchPaddingTick()
end
GameSettingCtrl._CheckLeaveCurrentSettingTab = HL.Method(HL.Function).Return(HL.Boolean) << function(self, callback)
local tabData = self.m_tabDataList[self.m_tabIndex]
local leaveFunctionName = self:_GetSettingFunctionName(tabData.tabLeaveFunction)
if string.isEmpty(leaveFunctionName) then
return true
end
local leaveFunction = self[leaveFunctionName]
local success, result = xpcall(leaveFunction, debug.traceback, self, tabData.tabId, callback)
if not success then
logger.error(ELogChannel.GameSetting, "Setting tab leave function error, message: " .. tostring(result))
return false
end
return result
end
GameSettingCtrl._LeaveSettingTab_KeyHint = HL.Method(HL.String, HL.Function)
.Return(HL.Boolean)
<< function(self, settingTabId, callback)
local stateLevel = self:_GetKeyActionStateLevel()
local content
local warningContent
if HasKeyActionState(stateLevel, KEY_ACTION_STATE.Warning) then
content = Language.LUA_GAME_SETTING_KEY_LEAVE_CONFIRM_CANNOT_SAVE
warningContent = Language.LUA_GAME_SETTING_KEY_LEAVE_CONFIRM_WARNING
elseif HasKeyActionState(stateLevel, KEY_ACTION_STATE.Dirty) then
content = Language.LUA_GAME_SETTING_KEY_LEAVE_CONFIRM_NOT_SAVE
end
if not content then
return true
end
Notify(MessageConst.SHOW_POP_UP, {
content = content,
warningContent = warningContent,
onConfirm = function()
self:_KeyClearPendingActions()
callback()
end,
})
return false
end
GameSettingCtrl._RefreshSettingTab = HL.Method(HL.Number, HL.Boolean, HL.Opt(HL.Boolean)) << function(self, tabIndex, init, rebuildData)
local tabData = self.m_tabDataList[tabIndex]
if tabData == nil then
return
end
if rebuildData then
self.m_itemDataList[tabIndex] = self:_BuildSettingTabData(tabData)
end
local itemDataList = self.m_itemDataList[tabIndex]
if itemDataList == nil then
return
end
self.m_tabIndex = tabIndex
self.view.tabTitleTxt.text = tabData.tabText
self:_RefreshLoad()
self:_RefreshDeviceNode(init)
self.m_contentHeight = 0
if self.view.deviceNode.gameObject.activeInHierarchy then
self.m_contentHeight = self.m_contentHeight + self.view.deviceNode.rect.height
end
self.m_itemCellMap = {}
self.m_qualitySubSettingDataMap = {}
self.m_itemCells:Refresh(#itemDataList, function(itemCell, itemIndex)
self:_RefreshSettingItemCell(itemCell, itemIndex, tabIndex)
end)
UIUtils.setSizeDeltaY(self.view.viewContent, self.m_contentHeight)
local isKeyHintTab = tabData.tabId == KEY_HINT_TAB_ID
self.view.bottomNode.gameObject:SetActive(isKeyHintTab)
if isKeyHintTab then
local isAnyDirty = self:_IsAnyKeyActionStateDirty()
self.view.saveBtn.interactable = isAnyDirty
local saveBtnStateName = isAnyDirty and "NormalState" or "DisableState"
self.view.saveBtnStateCtrl:SetState(saveBtnStateName)
end
if init then
self:_SetSettingItemControllerNaviTarget()
self.view.scrollView:ScrollTo(Vector2(0, 0), true)
end
end
GameSettingCtrl._RefreshCurrentSettingTab = HL.Method(HL.Opt(HL.Boolean)) << function(self, rebuildData)
self:_RefreshSettingTab(self.m_tabIndex, false, rebuildData)
end
GameSettingCtrl._ValidateAccount = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return not GameInstance.player.gameSettingSystem.forbiddenAccountPage
and not UIUtils.inDungeonOrFocusMode()
end
GameSettingCtrl._ValidateController = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return not UIUtils.inDungeonOrFocusMode()
end
GameSettingCtrl._ValidateKeyHint = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return not UIUtils.inDungeonOrFocusMode()
end
GameSettingCtrl._ValidateGamepad = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
if UIUtils.inDungeonOrFocusMode() then
return false
end
if DeviceInfo.isMobile then
return DeviceInfo.usingController
end
return true
end
GameSettingCtrl._ValidateLanguage = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return not CS.Beyond.GlobalOptions.instance.auditing
end
GameSettingCtrl._ValidateOther = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return not UIUtils.inDungeonOrFocusMode()
end
GameSettingCtrl._RefreshDeviceNode = HL.Method(HL.Boolean) << function(self, init)
local tabData = self.m_tabDataList[self.m_tabIndex]
local showDeviceNode = tabData.tabId == GAMEPAD_TAB_ID
self.view.deviceNode.gameObject:SetActive(showDeviceNode)
if not showDeviceNode then
return
end
local controllerType = DeviceInfo.controllerType
local isPSController = UNITY_PS5
or controllerType == DeviceControllerType.PS4 or controllerType == DeviceControllerType.PS5
local isXboxController = not isPSController
self.view.psDeviceNode.gameObject:SetActive(isPSController)
self.view.xboxDeviceNode.gameObject:SetActive(isXboxController)
if isPSController then
self.m_currentDeviceNode = self.view.psDeviceNode
local layoutStateName = InputManager.isNonSupportPsController and "NoTouchpad" or "Touchpad"
self.view.psDeviceNode.stateCtrl:SetState(layoutStateName)
elseif isXboxController then
self.m_currentDeviceNode = self.view.xboxDeviceNode
end
if init then
self.view.deviceModeToggle:SetValue(true, true)
end
self:_SwitchDeviceMode(self.view.deviceModeToggle.toggle.isOn)
end
GameSettingCtrl._SwitchDeviceMode = HL.Method(HL.Boolean) << function(self, isOn)
self:_ApplyGamepadSettingsToDevice()
local deviceMode = isOn and "Battle" or "Factory"
self.m_currentDeviceNode.stateCtrl:SetState(deviceMode)
end
GameSettingCtrl._ApplyGamepadSettingsToDevice = HL.Method() << function(self)
self:_ApplyGamepadActionSettingsToDevice()
self:_ApplyGamepadEnableUltimateMode2SettingToDevice()
end
GameSettingCtrl._ApplyGamepadActionSettingsToDevice = HL.Method() << function(self)
for i = 1, #GAMEPAD_ACTION_DROPDOWN_SETTINGS do
local settingId = GAMEPAD_ACTION_DROPDOWN_SETTINGS[i]
local optionGroupData = Tables.gamepadSettingOptionTable:GetValue(settingId)
local optionIndex = self:_DropdownGetIndexGamepadSetting(settingId)
local optionData = optionGroupData.options[optionIndex - 1]
local actionKeys = optionData.actionKeys
for j = 0, actionKeys.Count - 1 do
local actionKeyData = actionKeys[j]
local keyHintText = self.m_currentDeviceNode["keyHintText_" .. actionKeyData.actionKey]
if keyHintText then
if string.isEmpty(actionKeyData.actionKeyHintTextId) then
keyHintText.text = nil
else
keyHintText.text = Language[actionKeyData.actionKeyHintTextId]
end
end
end
end
local indicatorActionInfo = InputManagerInst:GetPlayerActionInfo("common_indicator_start")
local indicatorKeyIconPath = InputManager.GetKeyIconPath(indicatorActionInfo.primaryGamepadInput, false, true)
self.m_currentDeviceNode.indicatorKeyIcon01:LoadSpriteWithOutFormat(indicatorKeyIconPath)
self.m_currentDeviceNode.indicatorKeyIcon02:LoadSpriteWithOutFormat(indicatorKeyIconPath)
self.m_currentDeviceNode.indicatorKeyIcon03:LoadSpriteWithOutFormat(indicatorKeyIconPath)
self.m_currentDeviceNode.indicatorKeyIcon04:LoadSpriteWithOutFormat(indicatorKeyIconPath)
end
GameSettingCtrl._ApplyGamepadEnableUltimateMode2SettingToDevice = HL.Method() << function(self)
local enableUltimateMode2 = self:_ToggleGetEnableUltimateMode2(GameSetting.ID_GAMEPAD_ENABLE_ULTIMATE_MODE_2)
self.m_currentDeviceNode.useUltimateMode2StateCtrl:SetState(enableUltimateMode2 and "Enabled" or "Disabled")
end
GameSettingCtrl._IsSettingItemValid = HL.Method(HL.String, HL.String)
.Return(HL.Boolean)
<< function(self, settingId, validateFunction)
if not GameSetting.IsSettingItemValid(settingId) then
return false
end
if string.isEmpty(validateFunction) then
return true
end
validateFunction = self[self:_GetSettingFunctionName(validateFunction)]
if validateFunction == nil then
logger.error(ELogChannel.GameSetting, "Setting item validate function not found, settingId: " .. tostring(settingId))
return false
end
local success, result = xpcall(validateFunction, debug.traceback, self, settingId)
if not success then
logger.error(ELogChannel.GameSetting, "Setting item validate function error, message: " .. tostring(result))
return false
end
return result
end
GameSettingCtrl._RefreshSettingItemCell = HL.Method(HL.Table, HL.Number, HL.Number) << function(self, itemCell, itemIndex, tabIndex)
local itemDataList = self.m_itemDataList[tabIndex]
if itemDataList == nil then
return
end
local itemData = itemDataList[itemIndex]
if itemData == nil then
return
end
local itemType = itemData.settingItemType
itemCell.gameObject.name = string.format("GameSettingItem_%s", itemData.settingId)
itemCell.settingItemText.text = itemData.settingText
itemCell.naviDecorator.onIsNaviTargetChanged = itemIndex == 1 and function(isTarget)
if isTarget then
self.view.scrollView:ScrollTo(Vector2(0, 0), false)
end
end or nil
local showTitle = not string.isEmpty(itemData.settingGroupTitle)
itemCell.titleNode.gameObject:SetActive(showTitle)
if showTitle then
itemCell.itemTitleText.text = itemData.settingGroupTitle
itemCell.itemTitleKey.gameObject:SetActive(itemType == GEnums.SettingItemType.Key)
end
if string.isEmpty(itemData.settingRedDot) then
itemCell.redDot.gameObject:SetActive(false)
else
itemCell.redDot.gameObject:SetActive(true)
itemCell.redDot:InitRedDot(itemData.settingRedDot)
end
local item = self:_GetCachedItem(itemCell.cacheTransform, itemType)
if GameSettingHelper.IsQualitySubSetting(itemData.settingId) then
self.m_qualitySubSettingDataMap[itemData.settingId] = {
itemCell = item,
itemData = itemData,
}
end
if itemType == GEnums.SettingItemType.Dropdown then
self:_InitDropdownSettingItem(item, itemData, itemCell)
elseif itemType == GEnums.SettingItemType.Slider then
self:_InitSliderSettingItem(item, itemData, itemCell)
elseif itemType == GEnums.SettingItemType.Button then
self:_InitButtonSettingItem(item, itemData)
elseif itemType == GEnums.SettingItemType.Toggle then
self:_InitToggleSettingItem(item, itemData)
elseif itemType == GEnums.SettingItemType.Key then
self:_InitKeySettingItem(item, itemData)
end
local cellHeight = showTitle and self.m_itemCellHeight or self.m_itemCellHeightWithoutTitle
UIUtils.setSizeDeltaY(itemCell.rectTransform, cellHeight)
if itemIndex > 1 then
if showTitle then
cellHeight = cellHeight + self.view.config.SETTING_ITEM_TITLE_PADDING_TOP
end
self.m_contentHeight = self.m_contentHeight + self.view.config.SETTING_ITEM_VERTICAL_SPACE
end
self.m_contentHeight = self.m_contentHeight + cellHeight
local position = itemCell.rectTransform.anchoredPosition
itemCell.rectTransform.anchoredPosition = Vector2(
position.x,
-self.m_contentHeight
)
self.m_itemCellMap[itemData.settingId] = item
end
GameSettingCtrl._InitDropdownSettingItem = HL.Method(HL.Table, HL.Any, HL.Table) << function(self, itemCell, itemData, originalCell)
local settingId = itemData.settingId
local optionTextList = {}
local optionStateList
itemCell.dropdown:ClearComponent()
itemCell.dropdown:Init(function(csIndex, option, isSelected)
local index = LuaIndex(csIndex)
option:SetText(optionTextList[index])
option:SetState(optionStateList and optionStateList[index] or DROPDOWN_OPTION_STATE_NORMAL)
end, function(csIndex)
if GameSettingHelper.IsQualitySubSetting(settingId) then
local index = self:_DropdownGetQualitySubSettingOptionIndex(settingId)
if index ~= LuaIndex(csIndex) then
self:_DropdownSetQualitySubSettingOptionIndex(settingId, LuaIndex(csIndex))
self.m_settingChanged = true
end
else
local selectFunction = self:_GetSettingFunctionName(itemData.dropdownOptionSelectFunction)
local getFunction = self:_GetSettingFunctionName(itemData.dropdownOptionGetFunction)
if not string.isEmpty(selectFunction) then
local index = -1
if string.isEmpty(getFunction) then
index = self:_DropdownGetOptionIndex(settingId)
else
index = self[getFunction](self, settingId)
end
if index ~= LuaIndex(csIndex) then
self[selectFunction](self, settingId, LuaIndex(csIndex))
self.m_settingChanged = true
end
end
end
end)
itemCell.dropdown.onToggleOptList:AddListener(function(active)
if active then
self:_DropdownAdjustExpandDirection(itemCell, originalCell)
itemCell.dropdown:ScrollToSelected()
end
end)
itemCell.dropdown.onValidateSelectCell = function(csFromIndex, csToIndex)
local valid = true
local validateSelectFunction = self:_GetSettingFunctionName(itemData.dropdownOptionValidateSelectFunction)
if not string.isEmpty(validateSelectFunction) then
valid = self[validateSelectFunction](self, itemData, LuaIndex(csFromIndex), LuaIndex(csToIndex))
end
return valid
end
local isGamepad = itemData.settingTabId == GAMEPAD_TAB_ID
itemCell.sizeStateCtrl:SetState(isGamepad and "Large" or "Normal")
local initIndex = 1
if GameSettingHelper.IsQualitySubSetting(settingId) then
initIndex = self:_DropdownGetQualitySubSettingOptionIndex(settingId)
else
local getFunction = self:_GetSettingFunctionName(itemData.dropdownOptionGetFunction)
initIndex = string.isEmpty(getFunction) and self:_DropdownGetOptionIndex(settingId) or self[getFunction](self, settingId)
end
self:_StartCoroutine(function()
coroutine.step()
if GameSettingHelper.IsQualitySubSetting(settingId) then
optionTextList = itemData.optionTextList
optionStateList = itemData.optionStateList
else
if string.isEmpty(itemData.dropdownOptionTextListGetFunction) then
local optionTextData = itemData.dropdownOptionTextList
if optionTextData ~= nil then
for i = 0, optionTextData.length - 1 do
if not string.isEmpty(optionTextData[i]) then
local text = optionTextData[i]
table.insert(optionTextList, text)
end
end
end
else
local textListGetFunctionName = self:_GetSettingFunctionName(itemData.dropdownOptionTextListGetFunction)
if not string.isEmpty(textListGetFunctionName) then
optionTextList, optionStateList = self[textListGetFunctionName](self, itemData)
end
end
end
itemCell.dropdown:Refresh(#optionTextList, CSIndex(initIndex), false)
end)
end
GameSettingCtrl._InitSliderSettingItem = HL.Method(HL.Table, HL.Any, HL.Table) << function(self, itemCell, itemData, originalCell)
local settingId = itemData.settingId
local getFunctionName = self:_GetSettingFunctionName(itemData.sliderValueGetFunction)
local setFunctionName = self:_GetSettingFunctionName(itemData.sliderValueSetFunction)
local maxValueGetFunctionName = itemData.sliderMaxValueGetFunction
local iconOnClickFunction = itemData.sliderIconOnClickFunction
local iconListLength = itemData.sliderIconList and #itemData.sliderIconList or 0
itemCell.sliderIconNode.gameObject:SetActive(iconListLength > 0)
itemCell.sliderFillArea.gameObject:SetActive(itemData.sliderUseFill)
itemCell.slider:ClearComponent()
itemCell.sliderIconButton.onClick:RemoveAllListeners()
itemCell.slider.audioSlide = ""
itemCell.slider.wholeNumbers = itemData.sliderWholeNumbers
itemCell.slider.minValue = itemData.sliderMinValue
itemCell.slider.snapStep = true
itemCell.slider.stepValue = itemData.sliderStepValue
if string.isEmpty(maxValueGetFunctionName) then
itemCell.slider.maxValue = itemData.sliderMaxValue
else
maxValueGetFunctionName = self:_GetSettingFunctionName(maxValueGetFunctionName)
local maxValue = self[maxValueGetFunctionName](self, settingId)
if itemData.sliderMinValue >= maxValue then
originalCell.gameObject:SetActive(false)
return
end
itemCell.slider.maxValue = maxValue
end
local wholeNumbersText = itemCell.slider.minValue < 0 or itemCell.slider.maxValue > 1
self.m_sliderValueDataMap[settingId] = {
minValue = itemData.sliderMinValue,
maxValue = itemData.sliderMaxValue
}
itemCell.slider.onValueChanged:AddListener(function(value)
if not string.isEmpty(setFunctionName) then
local currValue
if string.isEmpty(getFunctionName) then
currValue = self:_SliderGetValue(settingId)
else
currValue = self[getFunctionName](self, settingId)
end
if value ~= currValue then
self.m_settingChanged = true
end
self[setFunctionName](self, settingId, value)
self:_SliderRecordValue(settingId, value)
end
if iconListLength > 0 then
local icon = self:_SliderGetIcon(value, itemData.sliderIconList, itemData.sliderIconRangeList)
if icon ~= nil then
itemCell.sliderIcon.sprite = icon
itemCell.sliderIcon.gameObject:SetActive(true)
else
itemCell.sliderIcon.gameObject:SetActive(false)
end
end
self:_SliderRefreshText(itemCell, value, wholeNumbersText)
end)
if not string.isEmpty(getFunctionName) then
local initValue = self[getFunctionName](self, settingId)
itemCell.slider:SetValueWithoutNotify(initValue, false)
self:_SliderRefreshText(itemCell, initValue, wholeNumbersText)
self:_SliderRecordValue(settingId, initValue)
if itemCell.slider.value == 0.0 then
itemCell.slider.onValueChanged:Invoke(initValue)
end
end
if not string.isEmpty(iconOnClickFunction) and iconListLength > 0 then
iconOnClickFunction = self:_GetSettingFunctionName(iconOnClickFunction)
itemCell.sliderIconButton.onClick:AddListener(function()
self[iconOnClickFunction](self, settingId)
end)
end
itemCell.slider.audioSlide = self.m_originalAudioSlide
end
GameSettingCtrl._InitButtonSettingItem = HL.Method(HL.Table, HL.Any) << function(self, itemCell, itemData)
local getStateFunction = itemData.buttonGetStateFunction
if string.isEmpty(getStateFunction) then
itemCell.buttonText.text = itemData.buttonText
itemCell.buttonIcon.gameObject:SetActive(true)
itemCell.stateCtrl:SetState("NormalState")
else
getStateFunction = self[self:_GetSettingFunctionName(getStateFunction)]
local success, result = xpcall(getStateFunction, debug.traceback, self, itemData)
if success then
itemCell.buttonText.text = result.currentText
if string.isEmpty(result.currentIcon) then
itemCell.buttonIcon.gameObject:SetActive(false)
else
itemCell.buttonIcon.gameObject:SetActive(true)
end
itemCell.stateCtrl:SetState(result.currentState)
else
logger.error(ELogChannel.GameSetting, "Setting item button get state function error, message: " .. tostring(result))
end
end
local clickFunctionName = self:_GetSettingFunctionName(itemData.buttonOnClickFunction)
if not string.isEmpty(clickFunctionName) then
itemCell.button.onClick:RemoveAllListeners()
itemCell.button.onClick:AddListener(function()
self[clickFunctionName](self)
end)
end
end
GameSettingCtrl._InitToggleSettingItem = HL.Method(HL.Table, HL.Any) << function(self, itemCell, itemData)
local settingId = itemData.settingId
local getFunctionName
local setFunctionName
local initialValue = false
if GameSettingHelper.IsQualitySubSetting(settingId) then
initialValue = self:_ToggleGetQualitySubSettingValue(settingId)
else
getFunctionName = self:_GetSettingFunctionName(itemData.toggleValueGetFunction)
setFunctionName = self:_GetSettingFunctionName(itemData.toggleValueSetFunction)
if not string.isEmpty(getFunctionName) then
initialValue = self[getFunctionName](self, settingId)
end
end
itemCell.toggle:InitCommonToggle(function(isOn)
if GameSettingHelper.IsQualitySubSetting(settingId) then
initialValue = self:_ToggleSetQualitySubSettingValue(settingId, isOn)
self.m_settingChanged = true
else
if not string.isEmpty(setFunctionName) then
self[setFunctionName](self, settingId, isOn)
self.m_settingChanged = true
end
end
end, initialValue, true)
end
GameSettingCtrl._InitKeySettingItem = HL.Method(HL.Table, HL.Userdata) << function(self, itemCell, itemData)
local useActionIds2 = itemData.keyActionIds2.Count > 0
local actionIds2 = useActionIds2 and itemData.keyActionIds2 or itemData.keyActionIds1
local fallbackSecondary = useActionIds2
local isSet1 = self:_InitKeySettingItem_KeyAction(itemCell.keyAction1, true,
itemData, itemData.keyActionIds1, nil, itemData.keyIcon1, itemData.keyIsMutable1, itemData.keyIsLongPress1, fallbackSecondary)
local isSet2 = self:_InitKeySettingItem_KeyAction(itemCell.keyAction2, useActionIds2,
itemData, actionIds2, nil, itemData.keyIcon2, itemData.keyIsMutable2, itemData.keyIsLongPress2, fallbackSecondary)
local allUnset = not isSet1 and not isSet2
if allUnset then
itemCell.keyAction1.stateCtrl:SetState("Warning")
self:_AddKeyActionState(itemData.settingId, KEY_ACTION_STATE.Warning, true)
itemCell.keyAction2.stateCtrl:SetState("Warning")
self:_AddKeyActionState(itemData.settingId, KEY_ACTION_STATE.Warning, false)
else
self:_RemoveKeyActionState(itemData.settingId, KEY_ACTION_STATE.Warning, true)
self:_RemoveKeyActionState(itemData.settingId, KEY_ACTION_STATE.Warning, false)
end
end
GameSettingCtrl._InitKeySettingItem_KeyAction = HL.Method(HL.Table, HL.Boolean, HL.Userdata, HL.Userdata, HL.Any, HL.Any, HL.Boolean, HL.Boolean, HL.Boolean)
.Return(HL.Boolean)
<< function(self, view, isPrimary, itemData, actionIds, modifyIconPath, iconPath, isMutable, isLongPress, fallbackSecondary)
local isSet = false
local stateName
view.button.onClick:RemoveAllListeners()
view.button.onHoverChange:RemoveAllListeners()
view.delBtn.onClick:RemoveAllListeners()
view.delBtn.gameObject:SetActive(false)
local actionId = actionIds.Count > 0 and actionIds[0] or nil
if actionId then
local actionInfo = InputManagerInst:GetPlayerActionInfo(actionId)
if isPrimary then
modifyIconPath = InputManager.GetKeyIconPath(actionInfo.primaryKeyboardInput, true, isLongPress, true)
iconPath = InputManager.GetKeyIconPath(actionInfo.primaryKeyboardInput, false, isLongPress, true)
if fallbackSecondary and string.isEmpty(iconPath) then
modifyIconPath = InputManager.GetKeyIconPath(actionInfo.secondaryKeyboardInput, true, isLongPress, true)
iconPath = InputManager.GetKeyIconPath(actionInfo.secondaryKeyboardInput, false, isLongPress, true)
end
elseif actionInfo.needSecond then
modifyIconPath = InputManager.GetKeyIconPath(actionInfo.secondaryKeyboardInput, true, isLongPress, true)
iconPath = InputManager.GetKeyIconPath(actionInfo.secondaryKeyboardInput, false, isLongPress, true)
end
if isMutable then
view.button.onClick:AddListener(function()
self:_KeyShowKeyCodePopup(itemData, actionIds, isPrimary)
end)
if string.isEmpty(iconPath) then
stateName = "Empty"
else
isSet = true
stateName = "Normal"
view.button.onHoverChange:AddListener(function(isHover)
view.delBtn.gameObject:SetActive(isHover)
end)
view.delBtn.onClick:AddListener(function()
if self:_KeyDeleteActions(itemData, actionIds, isPrimary) then
self:_RefreshCurrentSettingTab()
AudioAdapter.PostEvent("Au_UI_Toast_SetShortcutError")
end
end)
end
else
if not string.isEmpty(iconPath) then
isSet = true
end
stateName = "Locked"
end
else
if not string.isEmpty(iconPath) then
isSet = true
iconPath = KEYICON_PATH .. iconPath .. ".png"
end
stateName = "Locked"
end
view.text.text = nil
if string.isEmpty(iconPath) then
view.modifyIcon.gameObject:SetActive(false)
view.icon.gameObject:SetActive(false)
else
local showModifyIcon = not string.isEmpty(modifyIconPath)
view.modifyIcon.gameObject:SetActive(showModifyIcon)
if showModifyIcon then
view.modifyIcon:LoadSpriteWithOutFormat(modifyIconPath)
end
local showIcon = not string.isEmpty(iconPath)
view.icon.gameObject:SetActive(showIcon)
if showIcon then
view.icon:LoadSpriteWithOutFormat(iconPath)
end
end
view.stateCtrl:SetState(stateName)
return isSet
end
GameSettingCtrl._GetSettingFunctionName = HL.Method(HL.String).Return(HL.String) << function(self, functionName)
if not string.isEmpty(functionName) then
functionName = "_" .. functionName
end
return functionName
end
GameSettingCtrl._ValidateVideoNotchPadding = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
local currentRatio = self.m_rootCanvasWidth / self.m_rootCanvasHeight
local standardRatio = STANDARD_HORIZONTAL_RESOLUTION / STANDARD_VERTICAL_RESOLUTION
if currentRatio > standardRatio then
return true
end
local safeArea = Screen.safeArea
if safeArea.x > 0 or safeArea.y > 0 then
return true
end
if CS.Beyond.UI.UIConst.IsPadDevice() then
return true
end
return false
end
GameSettingCtrl._ValidateQualitySubSetting = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return GameSettingHelper.IsQualitySubSettingValid(settingId)
end
GameSettingCtrl._ValidateVideoQualityMainSetting = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return not UNITY_PS5
end
GameSettingCtrl._ValidatePSVideoQualityMainSetting = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return UNITY_PS5
end
GameSettingCtrl._ValidateHudLayout = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
if DeviceInfo.usingController then
return false
end
return true
end
GameSettingCtrl._ValidateLanguageTextChangeSetting = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return not UIManager:IsOpen(PanelId.CommonTaskTrackHud)
end
GameSettingCtrl._ValidateBackgroundMusic = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return CS.Beyond.GlobalOptions.instance.auditing
end
GameSettingCtrl._ValidateWebView = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return not GameInstance.player.gameSettingSystem.forbiddenWebView
end
GameSettingCtrl._ValidateCDK = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return not CS.Beyond.GlobalOptions.instance.auditing
and not GameInstance.player.gameSettingSystem.forbiddenCDK
end
GameSettingCtrl._DropdownAdjustExpandDirection = HL.Method(HL.Any, HL.Any) << function(self, cell, originalCell)
originalCell.rectTransform:SetSiblingIndex(originalCell.rectTransform.parent.childCount - 1)
local viewRect = self.view.scrollView.transform
local cellRect = cell.rectTransform
local listRect = cell.dropDownListRectTransform
local listMask = cell.dropDownListMask
local cellRectMax = cellRect.rect.max
local cellRectMaxWorldPos = cellRect:TransformPoint(Vector3(cellRectMax.x, cellRectMax.y, 0))
local cellRectMaxLocalPos = viewRect:InverseTransformPoint(cellRectMaxWorldPos)
local isInUpperHalf = (cellRectMaxLocalPos.y - listRect.rect.height) >= viewRect.rect.yMin
listRect.pivot = isInUpperHalf and Vector2(0.5, 1.0) or Vector2(0.5, 0)
listRect.anchorMin = isInUpperHalf and Vector2(0, 1.0) or Vector2(0, 0)
listRect.anchorMax = isInUpperHalf and Vector2(1.0, 1.0) or Vector2(1.0, 0)
listRect.anchoredPosition = Vector2.zero
local maskPadding = listMask.padding
maskPadding.w = isInUpperHalf and self.m_originalPadding or 0
maskPadding.y = isInUpperHalf and 0 or self.m_originalPadding
listMask.padding = maskPadding
cell.topMask.gameObject:SetActive(not isInUpperHalf)
cell.bottomMask.gameObject:SetActive(isInUpperHalf)
cell.layoutStateCtrl:SetState(isInUpperHalf and "Downward" or "Upward")
end
GameSettingCtrl._DropdownGetOptionIndex = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
local success, value = GameSetting.GameSettingGetInt(settingId)
if success then
return value
end
logger.error("GameSetting: 在打开界面时尝试获取一个尚未存在的设置项数值", settingId)
return 1
end
GameSettingCtrl._DropdownGetIndexVideoResolution = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
local resolutionList = GameSetting.availableScreenResolutionList
local currentResolution = GameSetting.videoResolution
for i = 0, resolutionList.Count - 1 do
local resolution = resolutionList[i]
if resolution.height <= currentResolution.height and resolution.width <= currentResolution.width then
return i + 1
end
end
return 1
end
GameSettingCtrl._DropdownGetVideoMainQualityTextList = HL.Method(HL.Any).Return(HL.Table, HL.Table) << function(self, itemData)
local qualityTextList = {}
local qualityStateList = {}
local optionTextData = itemData.dropdownOptionTextList
if optionTextData ~= nil then
local defaultQualityIndex = GameSettingHelper.GetDefaultVideoQualityIndex()
for i = 0, optionTextData.length - 1 do
if not string.isEmpty(optionTextData[i]) then
local text = optionTextData[i]
local state = DROPDOWN_OPTION_STATE_NORMAL
if i == defaultQualityIndex then
table.insert(qualityTextList, string.format(Language[DROPDOWN_MAIN_QUALITY_DEFAULT_TEXT_ID], text))
else
table.insert(qualityTextList, text)
if i > 0 then
local isValid = GameSettingHelper.IsValidQualityIndex(i)
if not isValid then
state = DROPDOWN_OPTION_STATE_DISABLED
else
local isRecommended = i >= defaultQualityIndex
if not isRecommended then
state = DROPDOWN_OPTION_STATE_WARNING
end
end
end
end
table.insert(qualityStateList, state)
end
end
end
return qualityTextList, qualityStateList
end
GameSettingCtrl._DropdownGetPSVideoMainQualityTextList = HL.Method(HL.Any).Return(HL.Table, HL.Table) << function(self, itemData)
local qualityTextList = {}
local qualityStateList = {}
local optionTextData = itemData.dropdownOptionTextList
if optionTextData ~= nil then
local defaultQualityIndex = GameSettingHelper.GetDefaultVideoQualityIndex()
for i = 1, optionTextData.length - 1 do
if not string.isEmpty(optionTextData[i]) then
local text = optionTextData[i]
local state = DROPDOWN_OPTION_STATE_NORMAL
if i == defaultQualityIndex then
table.insert(qualityTextList, string.format(Language[DROPDOWN_MAIN_QUALITY_DEFAULT_TEXT_ID], text))
else
local isValid = GameSettingHelper.IsValidQualityIndex(i)
if isValid then
table.insert(qualityTextList, text)
local isRecommended = i >= defaultQualityIndex
if not isRecommended then
state = DROPDOWN_OPTION_STATE_WARNING
end
table.insert(qualityStateList, state)
end
end
end
end
end
return qualityTextList, qualityStateList
end
GameSettingCtrl._DropdownGetVideoResolutionTextList = HL.Method(HL.Any).Return(HL.Table) << function(self, itemData)
local resolutionList = GameSetting.availableScreenResolutionList
local resolutionTextList = {}
for i = 0, resolutionList.Count - 1 do
local resolution = resolutionList[i]
if resolution.isFullScreen then
table.insert(resolutionTextList, string.format(Language[DROPDOWN_FULL_SCREEN_RESOLUTION_TEXT_ID], resolution.width, resolution.height))
else
table.insert(resolutionTextList, string.format(Language[DROPDOWN_WINDOWED_RESOLUTION_TEXT_ID], resolution.width, resolution.height))
end
end
return resolutionTextList
end
GameSettingCtrl._DropdownOnSelectVideoResolution = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
local listIndex = index - 1
local resolutionList = GameSetting.availableScreenResolutionList
if listIndex < 0 or listIndex >= resolutionList.Count then
return
end
local resolution = resolutionList[listIndex]
if resolution.width <= 0 or resolution.height <= 0 then
return
end
GameSettingSetter.graphicsResolution:Set(resolution.width, resolution.height)
self:_RefreshLoad(true)
end
GameSettingCtrl._DropdownOnSelectLanguageText = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
local lastIndex = CSIndex(self:_DropdownGetIndexLanguageText(settingId))
local dropdown = self.m_itemCellMap[settingId].dropdown
Notify(MessageConst.SHOW_POP_UP, {
content = Language[LANGUAGE_TEXT_POP_UP_CONTENT_TEXT_ID],
freezeWorld = true,
hideBlur = true,
onConfirm = function()
local lang = CS.Beyond.I18n.I18nUtils.GetLangByIndex(CSIndex(index))
GameSettingSetter.languageText:Set(lang:GetHashCode())
end,
onCancel = function()
if dropdown ~= nil then
dropdown:SetSelected(lastIndex, false, false)
end
end
})
end
GameSettingCtrl._DropdownGetIndexLanguageText = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
local languageText = LuaIndex(CS.Beyond.I18n.I18nUtils.GetLangShowOrder(GameSetting.languageText))
return languageText
end
GameSettingCtrl._DropdownGetLanguageTextTextList = HL.Method(HL.Any).Return(HL.Table) << function(self, itemData)
local textList = {}
local typeList = {}
for i = 0, GEnums.EnvLang.MAX:GetHashCode() - 1 do
local langType = Utils.intToEnum(typeof(GEnums.EnvLang), i)
table.insert(typeList, langType)
end
table.sort(typeList, function(left, right)
return CS.Beyond.I18n.I18nUtils.GetLangShowOrder(left) < CS.Beyond.I18n.I18nUtils.GetLangShowOrder(right)
end)
for i = 1, #typeList do
local textKey = "UI_LOGIN_ROOT_LANGUAGE_" .. typeList[i]:ToString()
local text = CS.Beyond.I18n.I18nUtils.GetText(textKey)
table.insert(textList, text)
end
return textList
end
GameSettingCtrl._DropdownGetLanguageAudioTextList = HL.Method(HL.Any).Return(HL.Table) << function(self, itemData)
local configTextList = itemData.dropdownOptionTextList
local optionTextList = {}
for i = 0, configTextList.Count - 1 do
local optionText = configTextList[i]
if string.isEmpty(optionText) then
break
end
local languageAudio = Utils.intToEnum(typeof(GameSetting.GameSettingLanguageAudio), i + 1)
local vfsBlockType = GameSettingHelper.ToVFSBlockType(languageAudio)
local isDownloaded = GameInstance.resPrefManager:GetResourcePreferred(vfsBlockType)
if not isDownloaded then
local resourceSize = GameInstance.resPrefManager:GetResourceSize(vfsBlockType)
optionText = string.format("%1$s (%2$.2fMB)", optionText, resourceSize / MB)
end
table.insert(optionTextList, optionText)
end
return optionTextList
end
GameSettingCtrl._DropdownOnValidateSelectLanguageAudio = HL.Method(HL.Userdata, HL.Number, HL.Number)
.Return(HL.Boolean)
<< function(self, itemData, fromIndex, toIndex)
local languageAudio = Utils.intToEnum(typeof(GameSetting.GameSettingLanguageAudio), toIndex)
local vfsBlockType = GameSettingHelper.ToVFSBlockType(languageAudio)
local isDownloaded = GameInstance.resPrefManager:GetResourcePreferred(vfsBlockType)
if isDownloaded then
return true
end
local languageName = itemData.dropdownOptionTextList[CSIndex(toIndex)]
local resourceSize = GameInstance.resPrefManager:GetResourceSize(vfsBlockType)
Notify(MessageConst.SHOW_POP_UP, {
content = string.format(Language.LUA_GAME_SETTING_VOICE_DOWNLOAD_POP_UP_CONTENT, languageName, resourceSize / MB),
onConfirm = function()
GameInstance.resPrefManager:SetVocResDownload(vfsBlockType)
GameSettingSetter.languageAudio:Set(languageAudio)
GameInstance.instance:ReturnToLogin()
end
})
return false
end
GameSettingCtrl._DropdownOnSelectLanguageAudio = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
GameSettingSetter.languageAudio:Set(index)
end
GameSettingCtrl._DropdownOnSelectAudioSuiteMode = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
GameSettingSetter.audioSuiteMode:Set(index)
end
GameSettingCtrl._DropdownOnSelectControllerAutoLockTarget = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
GameSettingSetter.controllerAutoLockTarget:Set(index)
end
GameSettingCtrl._DropdownOnSelectComboSkillCameraAlpha = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
GameSettingSetter.comboSkillCameraAlpha:Set(index)
end
GameSettingCtrl._DropdownGetGamepadSettingTextList = HL.Method(HL.Any).Return(HL.Table) << function(self, itemData)
local textList = {}
local settingId = itemData.settingId
local existed, optionGroupData = Tables.gamepadSettingOptionTable:TryGetValue(settingId)
if not existed then
logger.error("[GameSetting] Gamepad setting options not found, settingId: " .. tostring(settingId))
return textList
end
local formatArgs = {}
local options = optionGroupData.options
for i = 0, options.Count - 1 do
local optionData = options[i]
lume.clear(formatArgs)
local optionTextFormatKeys = optionData.optionTextFormatKeys
for j = 0, optionTextFormatKeys.Count - 1 do
local keyStr = string.lower(optionTextFormatKeys[j])
table.insert(formatArgs, InputManager.GetGamepadKeyIconPath(keyStr, false, false))
end
local success, optionText = xpcall(string.format, debug.traceback, optionGroupData.optionText, unpack(formatArgs))
if not success then
logger.error("[GameSetting] Get gamepad setting option text failed, settingId: " .. tostring(settingId)
.. ", optionIndex: " .. tostring(optionData.optionIndex))
optionText = ""
end
textList[optionData.optionIndex] = optionText
end
return textList
end
GameSettingCtrl._DropdownGetIndexGamepadSetting = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return GameInstance.player.gameSettingSystem:GetDropdownValue(settingId)
end
GameSettingCtrl._DropdownOnSelectGamepadSetting = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
GameInstance.player.gameSettingSystem:SetDropdownValue(settingId, index)
self:_RefreshCurrentSettingTab()
end
GameSettingCtrl._SliderRefreshText = HL.Method(HL.Any, HL.Number, HL.Boolean) << function(self, sliderItemCell, value, wholeNumbersText)
local valueText = ""
if wholeNumbersText then
valueText = string.format("%d", math.floor(value + 0.5))
else
valueText = string.format("%.1f", value)
end
sliderItemCell.sliderValueText.text = valueText
end
GameSettingCtrl._SliderGetValue = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
local success, value = GameSetting.GameSettingGetFloat(settingId)
if success then
return value
end
logger.error("GameSetting: 在打开界面时尝试获取一个尚未存在的设置项数值", settingId)
return 0
end
GameSettingCtrl._SliderGetIcon = HL.Method(HL.Number, HL.Any, HL.Any).Return(HL.Any) << function(self, value, iconList, rangeList)
local listLength = math.min(#iconList, #rangeList)
if listLength == 0 then
return nil
end
for i = 0, listLength - 1 do
if value <= rangeList[i] then
return self:LoadSprite(UIConst.UI_SPRITE_GAME_SETTING, iconList[i])
end
end
return self:LoadSprite(UIConst.UI_SPRITE_GAME_SETTING, iconList[listLength - 1])
end
GameSettingCtrl._SliderRecordValue = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
local sliderValueData = self.m_sliderValueDataMap[settingId]
if sliderValueData == nil then
return
end
sliderValueData.currValue = value
if value > sliderValueData.minValue then
sliderValueData.lastValidValue = value
end
end
GameSettingCtrl._SliderOnAudioIconClicked = HL.Method(HL.String) << function(self, settingId)
local valueData = self.m_sliderValueDataMap[settingId]
if valueData == nil then
return
end
local slider = self.m_itemCellMap[settingId].slider
if valueData.currValue > valueData.minValue then
slider.value = valueData.minValue
else
local nextValue = valueData.lastValidValue == nil and valueData.maxValue or valueData.lastValidValue
slider.value = nextValue
end
end
GameSettingCtrl._SliderGetMaxNotchPadding = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
local settingData = self.m_itemDataMap[settingId]
local originalMaxValue = settingData.sliderMaxValue
local maxValue = math.min(originalMaxValue, (self.m_rootCanvasWidth - STANDARD_HORIZONTAL_RESOLUTION) / 2)
maxValue = math.max(maxValue, GameSettingHelper.GetGameSettingDefaultCanvasPadding(self.m_rootCanvasWidth, STANDARD_HORIZONTAL_RESOLUTION))
return maxValue
end
GameSettingCtrl._SliderGetGlobalVolume = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return VOLUME_COEFFICIENT * self:_SliderGetValue(settingId)
end
GameSettingCtrl._SliderGetVoiceVolume = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return VOLUME_COEFFICIENT * self:_SliderGetValue(settingId)
end
GameSettingCtrl._SliderGetMusicVolume = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return VOLUME_COEFFICIENT * self:_SliderGetValue(settingId)
end
GameSettingCtrl._SliderGetSfxVolume = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return VOLUME_COEFFICIENT * self:_SliderGetValue(settingId)
end
GameSettingCtrl._SliderGetCameraSpeedX = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return self:_SliderGetValue(settingId)
end
GameSettingCtrl._SliderGetCameraSpeedY = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return self:_SliderGetValue(settingId)
end
GameSettingCtrl._SliderGetCameraTopViewSpeed = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return self:_SliderGetValue(settingId)
end
GameSettingCtrl._SliderGetWalkRunRatio = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return self:_SliderGetValue(settingId)
end
GameSettingCtrl._SliderGetNotchPadding = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return GameSettingHelper.GetGameSettingCanvasPaddingFromNotchPadding(self:_SliderGetValue(settingId), self.m_rootCanvasWidth)
end
GameSettingCtrl._SliderSetGlobalVolume = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
local systemValue = value / VOLUME_COEFFICIENT
GameSettingSetter.audioGlobalVolume:Set(systemValue)
end
GameSettingCtrl._SliderSetVoiceVolume = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
local systemValue = value / VOLUME_COEFFICIENT
GameSettingSetter.audioVoiceVolume:Set(systemValue)
end
GameSettingCtrl._SliderSetMusicVolume = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
local systemValue = value / VOLUME_COEFFICIENT
GameSettingSetter.audioMusicVolume:Set(systemValue)
end
GameSettingCtrl._SliderSetSfxVolume = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
local systemValue = value / VOLUME_COEFFICIENT
GameSettingSetter.audioSfxVolume:Set(systemValue)
end
GameSettingCtrl._SliderSetCameraSpeedX = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
GameSettingSetter.controllerCameraSpeedX:Set(value)
end
GameSettingCtrl._SliderSetCameraSpeedY = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
GameSettingSetter.controllerCameraSpeedY:Set(value)
end
GameSettingCtrl._SliderSetCameraTopViewSpeed = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
GameSettingSetter.controllerCameraTopViewSpeed:Set(value)
end
GameSettingCtrl._SliderSetWalkRunRatio = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
GameSettingSetter.controllerWalkRunRatio:Set(value)
end
GameSettingCtrl._SliderSetNotchPadding = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
local setValue = GameSettingHelper.GetGameSettingNotchPaddingFromCanvasPadding(value, self.m_rootCanvasWidth)
GameSettingSetter.graphicsNotchPadding:Set(setValue)
self.m_isNotchPaddingChanged = true
self.view.notchAdapter:ApplyNewNotch()
if self.m_notchPaddingViewTick < 0 then
UIUtils.PlayAnimationAndToggleActive(self.view.mobileNotchPaddingNode.animationWrapper, true)
self.m_notchPaddingViewTick = LuaUpdate:Add("Tick", function(deltaTime)
self.m_notchPaddingViewTime = self.m_notchPaddingViewTime + deltaTime
if self.m_notchPaddingViewTime >= self.view.config.NOTCH_VIEW_DURATION then
self:_SliderClearNotchPaddingTick()
end
end)
end
self.m_notchPaddingViewTime = 0
end
GameSettingCtrl._SliderClearNotchPaddingTick = HL.Method() << function(self)
if self.m_notchPaddingViewTick < 0 then
return
end
UIUtils.PlayAnimationAndToggleActive(self.view.mobileNotchPaddingNode.animationWrapper, false)
self.m_notchPaddingViewTick = LuaUpdate:Remove(self.m_notchPaddingViewTick)
end
GameSettingCtrl._SliderTryApplyAllNotchPadding = HL.Method() << function(self)
if not self.m_isNotchPaddingChanged then
return
end
if self.m_rootCanvasHelper ~= nil and self.m_rootCanvasHelper.onCanvasChanged ~= nil then
self.m_rootCanvasHelper:ForceCanvasUpdate()
end
if self.m_worldRootCanvasHelper ~= nil and self.m_worldRootCanvasHelper.onCanvasChanged ~= nil then
self.m_worldRootCanvasHelper:ForceCanvasUpdate()
end
end
GameSettingCtrl._SliderOnGlobalVolumeIconClicked = HL.Method(HL.String) << function(self, settingId)
self:_SliderOnAudioIconClicked(settingId)
end
GameSettingCtrl._SliderOnVoiceVolumeIconClicked = HL.Method(HL.String) << function(self, settingId)
self:_SliderOnAudioIconClicked(settingId)
end
GameSettingCtrl._SliderOnMusicVolumeIconClicked = HL.Method(HL.String) << function(self, settingId)
self:_SliderOnAudioIconClicked(settingId)
end
GameSettingCtrl._SliderOnSfxVolumeIconClicked = HL.Method(HL.String) << function(self, settingId)
self:_SliderOnAudioIconClicked(settingId)
end
GameSettingCtrl._ButtonOnAccountCenterClick = HL.Method() << function(self)
CSUtils.OpenAccountCenter()
end
GameSettingCtrl._ButtonOnGiftCodeClick = HL.Method() << function(self)
CS.Beyond.SDK.SDKAccountUtils.OpenGiftCode()
end
GameSettingCtrl._ButtonOnCustomerServiceCenterClick = HL.Method() << function(self)
CS.Beyond.Gameplay.AnnouncementSystem.OpenCustomService()
end
GameSettingCtrl._ButtonOnGameProtocolServiceClick = HL.Method() << function(self)
CS.Beyond.SDK.SDKAccountUtils.OpenGameProtocol(CS.Beyond.SDK.SDKGameProtocolType.SERVICE)
end
GameSettingCtrl._ButtonOnGameProtocolServiceOverseaClick = HL.Method() << function(self)
CS.Beyond.SDK.SDKAccountUtils.OpenGameProtocol(CS.Beyond.SDK.SDKGameProtocolType.OVERSEA_SERVICE)
end
GameSettingCtrl._ButtonOnGameProtocolPrivacyClick = HL.Method() << function(self)
CS.Beyond.SDK.SDKAccountUtils.OpenGameProtocol(CS.Beyond.SDK.SDKGameProtocolType.PRIVACY)
end
GameSettingCtrl._ButtonOnGameProtocolPrivacyOverseaClick = HL.Method() << function(self)
CS.Beyond.SDK.SDKAccountUtils.OpenGameProtocol(CS.Beyond.SDK.SDKGameProtocolType.OVERSEA_PRIVACY)
end
GameSettingCtrl._ButtonOnGameProtocolChildrenPrivacyClick = HL.Method() << function(self)
CS.Beyond.SDK.SDKAccountUtils.OpenGameProtocol(CS.Beyond.SDK.SDKGameProtocolType.CHILDREN_PRIVACY)
end
GameSettingCtrl._ButtonOnGameProtocolPersonalInfoCollectionClick = HL.Method() << function(self)
CS.Beyond.SDK.SDKAccountUtils.OpenGameProtocol(CS.Beyond.SDK.SDKGameProtocolType.PERSONAL_INFO_COLLECTION)
end
GameSettingCtrl._ButtonOnGameProtocolThirdPartySharedInfoClick = HL.Method() << function(self)
CS.Beyond.SDK.SDKAccountUtils.OpenGameProtocol(CS.Beyond.SDK.SDKGameProtocolType.THIRD_PARTY_SHARED_INFO)
end
GameSettingCtrl._ButtonOnDeleteAccountClick = HL.Method() << function(self)
GameInstance.player.gameSettingSystem:OpenDeleteAccount()
end
GameSettingCtrl._ButtonOnHudLayoutClick = HL.Method() << function(self)
UIManager:Open(PanelId.HudLayout)
end
GameSettingCtrl._ButtonOnGetUnstuckClick = HL.Method() << function(self)
if GameInstance.player.forbidSystem:IsForbidden(ForbidType.ForbidMapTeleport) then
Notify(MessageConst.SHOW_TOAST, Language.LUA_SYSTEM_FORBIDDEN)
return
end
GameInstance.player.gameSettingSystem:RequestGetUnstuck()
end
GameSettingCtrl._ButtonOnAudioManageClick = HL.Method() << function(self)
UIManager:Open(PanelId.GameSettingVoiceManagePopup)
end
GameSettingCtrl._ToggleGetValue = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
local success, value = GameSetting.GameSettingGetBool(settingId)
if success then
return value
end
logger.error("GameSetting: 在打开界面时尝试获取一个尚未存在的设置项数值", settingId)
return false
end
GameSettingCtrl._ToggleGetSuspendUnfocused = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetBackgroundMusic = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetAudioController = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetAudioSpatial = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetCameraReverseX = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetCameraReverseY = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetEnableCameraFar = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetEnableAutoAttackTouch = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetEnableAutoAttackGamepad = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetAutoSprint = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetMotion = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetTriggerEffect = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetShowSmartAlert = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return self:_ToggleGetValue(settingId)
end
GameSettingCtrl._ToggleGetEnableUltimateMode2 = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return GameInstance.player.gameSettingSystem:GetToggleValue(settingId)
end
GameSettingCtrl._ToggleGetPSNOnly = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return GameInstance.player.friendSystem.isPSNOnly
end
GameSettingCtrl._ToggleSetSuspendUnfocused = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.audioSuspendUnfocused:Set(value)
end
GameSettingCtrl._ToggleSetBackgroundMusic = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.audioBackgroundMusic:Set(value)
end
GameSettingCtrl._ToggleSetAudioController = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.audioController:Set(value)
end
GameSettingCtrl._ToggleSetAudioSpatial = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.audioSpatial:Set(value)
end
GameSettingCtrl._ToggleSetCameraReverseX = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.controllerCameraReverseX:Set(value)
end
GameSettingCtrl._ToggleSetCameraReverseY = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.controllerCameraReverseY:Set(value)
end
GameSettingCtrl._ToggleSetEnableCameraFar = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.enableCameraFar:Set(value)
end
GameSettingCtrl._ToggleSetEnableAutoAttackTouch = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.enableAutoAttackTouch:Set(value)
end
GameSettingCtrl._ToggleSetEnableAutoAttackGamepad = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.enableAutoAttackGamepad:Set(value)
end
GameSettingCtrl._ToggleSetAutoSprint = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.controllerAutoSprint:Set(value)
end
GameSettingCtrl._ToggleSetMotion = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.controllerMotion:Set(value)
end
GameSettingCtrl._ToggleSetTriggerEffect = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.controllerTriggerEffect:Set(value)
end
GameSettingCtrl._ToggleSetShowSmartAlert = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameSettingSetter.otherShowSmartAlert:Set(value)
end
GameSettingCtrl._ToggleSetEnableUltimateMode2 = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameInstance.player.gameSettingSystem:SetToggleValue(settingId, value)
self:_ApplyGamepadEnableUltimateMode2SettingToDevice()
end
GameSettingCtrl._ToggleSetPSNOnly = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
GameInstance.player.friendSystem:SetPsnOnly(value)
end
GameSettingCtrl._KeyShowKeyCodePopup = HL.Method(HL.Userdata, HL.Userdata, HL.Boolean)
<< function(self, itemData, actionIds, isPrimary)
UIManager:Open(PanelId.GameSettingKeycodePopup, {
settingItemData = itemData,
isPrimary = isPrimary,
onKeyCodeInput = function(keyCode)
local actionId = actionIds[0]
local currKeyCode = InputManagerInst:GetActionKeyboardKeyCode(actionId, false, isPrimary)
if keyCode == currKeyCode then
return true
end
local conflict, conflictItemDataList = self:_KeyCheckSettingConflict(itemData, actionIds, keyCode)
if conflict then
local conflictTextBuilder = {}
for i, conflictItemData in ipairs(conflictItemDataList) do
local itemName = string.format(Language.LUA_GAME_SETTING_KEY_NAME, conflictItemData.settingText)
table.insert(conflictTextBuilder, itemName)
end
local conflictText = table.concat(conflictTextBuilder)
Notify(MessageConst.SHOW_POP_UP, {
content = string.format(Language.LUA_GAME_SETTING_KEY_CONFLICT, conflictText, conflictText),
onConfirm = function()
UIManager:Close(PanelId.GameSettingKeycodePopup)
for i, conflictItemData in ipairs(conflictItemDataList) do
self:_KeyCheckActionsConflictAndDelete(conflictItemData,
actionIds, conflictItemData.keyActionIds1, keyCode, true)
self:_KeyCheckActionsConflictAndDelete(conflictItemData,
actionIds, conflictItemData.keyActionIds2, keyCode, true)
end
if self:_KeyChangeActions(itemData, actionIds, keyCode, isPrimary) then
self:_RefreshCurrentSettingTab()
AudioAdapter.PostEvent("Au_UI_Toast_SetShortcutError")
end
end,
})
return false
end
if self:_KeyChangeActions(itemData, actionIds, keyCode, isPrimary) then
self:_RefreshCurrentSettingTab()
end
return true
end
})
end
GameSettingCtrl._KeyCheckSettingConflict = HL.Method(HL.Userdata, HL.Userdata, CS.Beyond.Input.KeyboardKeyCode)
.Return(HL.Boolean, HL.Opt(HL.Any))
<< function(self, itemData, actionIds, keyCode)
local conflict = false
local conflictItemDataList = {}
local checkedItemDataMap = {}
local scopes = itemData.keyActionScopes
for i = 0, scopes.Count - 1 do
local scope = scopes[i]
local scopeItemDataList = self.m_keyActionScope2ItemDataList[scope]
for j, scopeItemData in ipairs(scopeItemDataList) do
if itemData.settingId == scopeItemData.settingId or checkedItemDataMap[scopeItemData] then
else
if self:_KeyCheckActionsConflictAndDelete(nil, actionIds, scopeItemData.keyActionIds1, keyCode, false)
or self:_KeyCheckActionsConflictAndDelete(nil, actionIds, scopeItemData.keyActionIds2, keyCode, false) then
conflict = true
table.insert(conflictItemDataList, scopeItemData)
checkedItemDataMap[scopeItemData] = true
end
end
end
end
return conflict, conflictItemDataList
end
GameSettingCtrl._KeyCheckActionsConflictAndDelete = HL.Method(HL.Userdata, HL.Userdata, HL.Userdata, CS.Beyond.Input.KeyboardKeyCode, HL.Boolean)
.Return(HL.Boolean)
<< function(self, itemData, srcActionIds, checkActionIds, keyCode, delete)
local anyConflict = false
local checkActionId = checkActionIds.Count > 0 and checkActionIds[0] or nil
if checkActionId then
if lume.find(srcActionIds, checkActionId) then
return false
end
local conflict, isPrimary = InputManagerInst:CheckActionKeyCodeConflict(checkActionId, keyCode)
if conflict then
if not delete then
return true
end
anyConflict = true
self:_KeyDeleteActions(itemData, checkActionIds, isPrimary)
end
end
return anyConflict
end
GameSettingCtrl._KeyDeleteActions = HL.Method(HL.Userdata, HL.Userdata, HL.Boolean).Return(HL.Boolean)
<< function(self, itemData, actionIds, isPrimary)
return self:_KeyChangeActions(itemData, actionIds, KeyboardKeyCode.None, isPrimary)
end
GameSettingCtrl._KeyChangeActions = HL.Method(HL.Userdata, HL.Userdata, HL.Userdata, HL.Boolean).Return(HL.Boolean)
<< function(self, itemData, actionIds, keyCode, isPrimary)
local actionId = actionIds[0]
local currKeyCode = InputManagerInst:GetActionKeyboardKeyCode(actionId, false, isPrimary)
if currKeyCode == keyCode then
return false
end
GameInstance.player.gameSettingSystem:SetKeySetting(itemData.settingId, keyCode, isPrimary)
self:_SetKeyActionState(itemData.settingId, KEY_ACTION_STATE.Dirty, isPrimary)
return true
end
GameSettingCtrl._KeyResetActions = HL.Method() << function(self)
Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_GAME_SETTING_KEY_RESET_ALL_ACTIONS,
onConfirm = function()
GameInstance.player.gameSettingSystem:ResetAllKeySettings(InputDeviceFlags.Keyboard)
GameInstance.player.gameSettingSystem:SaveSetting()
self:_ClearAllKeyActionStates()
self:_RefreshCurrentSettingTab()
end,
})
end
GameSettingCtrl._KeySaveActions = HL.Method() << function(self)
local stateLevel = self:_GetKeyActionStateLevel()
if HasKeyActionState(stateLevel, KEY_ACTION_STATE.Warning) then
Notify(MessageConst.SHOW_TOAST, Language.LUA_GAME_SETTING_KEY_SAVE_FAILED_WARNING)
elseif HasKeyActionState(stateLevel, KEY_ACTION_STATE.Dirty) then
Notify(MessageConst.SHOW_TOAST, Language.LUA_GAME_SETTING_KEY_SAVE_SUCCESS)
GameInstance.player.gameSettingSystem:SaveSetting()
self:_ClearAllKeyActionStates()
self:_RefreshCurrentSettingTab()
end
end
GameSettingCtrl._KeyClearPendingActions = HL.Method() << function(self)
GameInstance.player.gameSettingSystem:ClearAllPendingKeySettings()
self:_ClearAllKeyActionStates()
end
GameSettingCtrl._InitKeyActionScopeMap = HL.Method(HL.Table) << function(self, itemDataList)
for i, itemData in ipairs(itemDataList) do
local scopes = itemData.keyActionScopes
if scopes.Count == 0 then
logger.error("[GameSetting] The action should belong to at least one scope, id: " .. tostring(itemData.settingId))
else
for j = 0, scopes.Count - 1 do
local scope = scopes[j]
local scopeItemDataList = self.m_keyActionScope2ItemDataList[scope]
if scopeItemDataList == nil then
scopeItemDataList = {}
self.m_keyActionScope2ItemDataList[scope] = scopeItemDataList
end
table.insert(scopeItemDataList, itemData)
end
end
end
end
local function PackKeyActionState(primaryState, secondaryState)
return (primaryState & KEY_ACTION_STATE_MASK) + ((secondaryState & KEY_ACTION_STATE_MASK) << KEY_ACTION_STATE_BITS)
end
local function UnpackKeyActionState(state)
return (state & KEY_ACTION_STATE_MASK), ((state >> KEY_ACTION_STATE_BITS) & KEY_ACTION_STATE_MASK)
end
GameSettingCtrl._GetKeyActionState = HL.Method(HL.String)
.Return(HL.Number, HL.Opt(HL.Number))
<< function(self, settingId)
local state = self.m_keyActionStateMap[settingId]
if state == nil then
return KEY_ACTION_STATE.None, KEY_ACTION_STATE.None
end
local primaryState, secondaryState = UnpackKeyActionState(state)
return primaryState, secondaryState
end
GameSettingCtrl._SetKeyActionState = HL.Method(HL.String, HL.Number, HL.Boolean)
<< function(self, settingId, newState, isPrimary)
local primaryState, secondaryState = self:_GetKeyActionState(settingId)
if isPrimary then
primaryState = newState
else
secondaryState = newState
end
self.m_keyActionStateMap[settingId] = PackKeyActionState(primaryState, secondaryState)
end
GameSettingCtrl._AddKeyActionState = HL.Method(HL.String, HL.Number, HL.Boolean)
<< function(self, settingId, state, isPrimary)
local primaryState, secondaryState = self:_GetKeyActionState(settingId)
if isPrimary then
primaryState = primaryState | state
else
secondaryState = secondaryState | state
end
self.m_keyActionStateMap[settingId] = PackKeyActionState(primaryState, secondaryState)
end
GameSettingCtrl._RemoveKeyActionState = HL.Method(HL.String, HL.Number, HL.Boolean)
<< function(self, settingId, state, isPrimary)
local primaryState, secondaryState = self:_GetKeyActionState(settingId)
if isPrimary then
if not HasKeyActionState(primaryState, state) then
return
end
primaryState = primaryState & ~state
else
if not HasKeyActionState(secondaryState, state) then
return
end
secondaryState = secondaryState & ~state
end
self.m_keyActionStateMap[settingId] = PackKeyActionState(primaryState, secondaryState)
end
GameSettingCtrl._GetKeyActionStateLevel = HL.Method().Return(HL.Number) << function(self)
local stateLevel = KEY_ACTION_STATE.None
for settingId, state in pairs(self.m_keyActionStateMap) do
local primaryState, secondaryState = UnpackKeyActionState(state)
stateLevel = stateLevel | primaryState | secondaryState
if stateLevel == KEY_ACTION_STATE_MAX_LEVEL then
break
end
end
return stateLevel
end
GameSettingCtrl._IsAnyKeyActionStateDirty = HL.Method().Return(HL.Boolean) << function(self)
local stateLevel = self:_GetKeyActionStateLevel()
return stateLevel ~= KEY_ACTION_STATE.None
end
GameSettingCtrl._ClearAllKeyActionStates = HL.Method() << function(self)
lume.clear(self.m_keyActionStateMap)
end
GameSettingCtrl._InsertSubQualityItemDataList = HL.Method(HL.Table) << function(self, itemDataList)
local originalCount = #itemDataList
for settingId, subQualityData in pairs(Tables.qualitySubSettingTable) do
if self:_IsSettingItemValid(settingId, "ValidateQualitySubSetting") then
local itemData = {}
itemData.settingId = settingId
itemData.settingGroupTitle = subQualityData.settingGroupTitle
local configSuccess, itemConfig = GameSettingHelper.GetQualitySubSettingConfigBySettingId(settingId)
if configSuccess then
local itemTypeSuccess, settingItemType = GameSettingHelper.GetQualitySubSettingItemTypeBySettingId(settingId)
if itemTypeSuccess then
itemData.settingItemType = settingItemType
if settingItemType == GEnums.SettingItemType.Dropdown then
self:_DropdownBuildQualitySubSettingItemData(itemData, itemConfig)
elseif settingItemType == GEnums.SettingItemType.Toggle then
self:_ToggleBuildQualitySubSettingItemData(itemData, itemConfig)
elseif settingItemType == GEnums.SettingItemType.Slider then
self:_SliderBuildQualitySubSettingItemData(itemData, itemConfig)
end
itemData.settingText = subQualityData.settingText
itemData.settingSortOrder = originalCount + 1 + subQualityData.settingSortOrder
itemData.refreshViewOnValueChanged = itemConfig.refreshViewOnValueChanged
itemData.ignoreMainChange = itemConfig.ignoreMainChange
table.insert(itemDataList, itemData)
end
else
logger.error("画质子项没有在Config中配置", settingId)
end
end
end
end
GameSettingCtrl._DropdownBuildQualitySubSettingItemData = HL.Method(HL.Table, HL.Userdata) << function(self, itemData, itemConfig)
local settingId = itemData.settingId
itemData.dropdownOptionValidateSelectFunction = "DropdownValidateSetQualitySubSettingOptionIndex"
local optionGroupConfig = itemConfig:DropdownGetOptionGroupConfig(QualityManagerInst.device.m_platform)
local optionTextList = {}
local optionStateList = {}
for index = 0, optionGroupConfig.optionList.Count - 1 do
local optionConfig = optionGroupConfig.optionList[index]
local optionId = optionConfig.optionId
local tableData = Tables.qualitySubSettingOptionTable[optionId]
table.insert(optionTextList, tableData.optionText)
local state = DROPDOWN_OPTION_STATE_NORMAL
local isValid = GameSettingHelper.IsQualitySubSettingTierValid(settingId, index)
if not isValid then
state = SubQualityOptionStateToDropdownOptionState[optionGroupConfig.stateOnNotValid]
else
local isRecommended = GameSettingHelper.IsQualitySubSettingTierRecommended(settingId, index)
if not isRecommended then
state = SubQualityOptionStateToDropdownOptionState[optionGroupConfig.stateOnNotRecommended]
end
end
table.insert(optionStateList, state)
end
local tierCount = GameSettingHelper.GetQualitySubSettingCountBySettingId(settingId)
if tierCount ~= #optionTextList then
if tierCount > #optionTextList then
logger.error("画质子项配置选项数量与ComponentTierCount不一致可能导致越界或设置效果不一致等问题", itemConfig.qualityComponentType)
else
optionTextList = lume.slice(optionTextList, #optionTextList - tierCount + 1, #optionTextList)
optionStateList = lume.slice(optionStateList, #optionStateList - tierCount + 1, #optionStateList)
end
end
itemData.optionTextList = optionTextList
itemData.optionStateList = optionStateList
end
GameSettingCtrl._DropdownOnValidateSelectVideoQuality = HL.Method(HL.Userdata, HL.Number, HL.Number)
.Return(HL.Boolean)
<< function(self, itemData, fromIndex, toIndex)
local csToIndex = CSIndex(toIndex)
if csToIndex == 0 then
return true
end
local isValid = GameSettingHelper.IsValidQualityIndex(csToIndex)
if not isValid then
return false
end
local csDefaultIndex = GameSettingHelper.GetDefaultVideoQualityIndex()
local isRecommended = csToIndex >= csDefaultIndex
if not isRecommended then
UIManager:Open(PanelId.GameSettingWarningPopUp, {
content = string.format(Language.LUA_GAME_SETTING_QUALITY_SELECT_CONFIRM, itemData.settingText),
warningContent = Language.LUA_GAME_SETTING_QUALITY_SELECT_CONFIRM_WARNING,
onForceConfirm = function()
local itemCell = self.m_itemCellMap[itemData.settingId]
itemCell.dropdown:SetSelected(csToIndex, false, true)
end,
})
return false
end
return true
end
GameSettingCtrl._DropdownOnValidateSelectPSVideoQuality = HL.Method(HL.Userdata, HL.Number, HL.Number)
.Return(HL.Boolean)
<< function(self, itemData, fromIndex, toIndex)
return self:_DropdownOnValidateSelectVideoQuality(itemData, fromIndex + 1, toIndex + 1)
end
GameSettingCtrl._DropdownOnSelectPSVideoQuality = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
local lastIndex = self:_DropdownGetIndexPSVideoQuality(settingId)
local dropdown = self.m_itemCellMap[settingId].dropdown
self:_DoSelectVideoQuality(index + 1, lastIndex + 1, dropdown)
end
GameSettingCtrl._DropdownOnSelectVideoQuality = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
local lastIndex = self:_DropdownGetIndexVideoQuality(settingId)
local dropdown = self.m_itemCellMap[settingId].dropdown
if index == CUSTOM_QUALITY_SETTING_INDEX then
GameSettingHelper.SetQualityCustomState(true)
else
self:_DoSelectVideoQuality(index, lastIndex, dropdown)
end
end
GameSettingCtrl._DoSelectVideoQuality = HL.Method(HL.Number, HL.Number, HL.Userdata) << function(self, index, lastIndex, dropdown)
local qualityIndex = index - 1
if GameSettingHelper.IsValidQualityIndex(qualityIndex) then
GameSettingHelper.SetQualityCustomState(false)
GameSettingSetter.graphicsQuality:Set(qualityIndex, true)
self:_UpdateAndRefreshQualitySubSettingsState()
self:_RefreshLoad(true)
local needRestart = QualityManagerInst:NeedRestart()
if needRestart then
self:_ShowRebootTips()
end
else
Notify(MessageConst.SHOW_POP_UP, {
content = Language[QUALITY_POP_UP_CONTENT_TEXT_ID],
freezeWorld = true,
hideBlur = true,
hideCancel = true,
onConfirm = function()
if dropdown ~= nil then
dropdown:SetSelected(CSIndex(lastIndex), false, false)
end
end
})
end
end
GameSettingCtrl._DropdownGetIndexVideoQuality = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
if GameSettingHelper.GetQualityCustomState() then
return CUSTOM_QUALITY_SETTING_INDEX
else
return GameSettingHelper.GetQualityIndex() + 1
end
end
GameSettingCtrl._DropdownGetIndexPSVideoQuality = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return GameSettingHelper.GetQualityIndex()
end
GameSettingCtrl._UpdateAndRefreshQualitySubSettingsState = HL.Method() << function(self)
for settingId, subSettingData in pairs(self.m_qualitySubSettingDataMap) do
if not subSettingData.itemData.ignoreMainChange then
GameSetting.RemoveGameSettingSaveValue(settingId)
local itemCell = subSettingData.itemCell
local itemType = subSettingData.itemData.settingItemType
if itemType == GEnums.SettingItemType.Dropdown then
local index = self:_DropdownGetQualitySubSettingOptionIndex(settingId)
itemCell.dropdown:SetSelected(CSIndex(index), false, false)
elseif itemType == GEnums.SettingItemType.Toggle then
local value = self:_ToggleGetQualitySubSettingValue(settingId)
itemCell.toggle:SetValue(value, true)
elseif itemType == GEnums.SettingItemType.Slider then
local value = self:_SliderGetQualitySubSettingValue(settingId)
itemCell.slider:SetValueWithoutNotify(value)
end
end
end
end
GameSettingCtrl._DropdownGetQualitySubSettingOptionIndex = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return GameSettingHelper.GetQualitySubSettingTierBySettingId(settingId)
end
GameSettingCtrl._DropdownValidateSetQualitySubSettingOptionIndex = HL.Method(HL.Table, HL.Number, HL.Number)
.Return(HL.Boolean)
<< function(self, itemData, fromIndex, toIndex)
local csToIndex = CSIndex(toIndex)
local optionState = itemData.optionStateList[toIndex]
if optionState == DROPDOWN_OPTION_STATE_NORMAL then
return true
end
if optionState == DROPDOWN_OPTION_STATE_WARNING then
UIManager:Open(PanelId.GameSettingWarningPopUp, {
content = string.format(Language.LUA_GAME_SETTING_QUALITY_SELECT_CONFIRM, itemData.settingText),
warningContent = Language.LUA_GAME_SETTING_QUALITY_SELECT_CONFIRM_WARNING,
onForceConfirm = function()
local itemCell = self.m_itemCellMap[itemData.settingId]
itemCell.dropdown:SetSelected(csToIndex, false, true)
end,
})
end
return false
end
GameSettingCtrl._DropdownSetQualitySubSettingOptionIndex = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
self:_SetQualitySubSettingTier(settingId, index)
end
GameSettingCtrl._DropdownOnSelectCameraImpulseLevel = HL.Method(HL.String, HL.Number) << function(self, settingId, index)
GameSettingSetter.cameraImpulseLevel:Set(index)
end
GameSettingCtrl._ToggleBuildQualitySubSettingItemData = HL.Method(HL.Table, HL.Userdata) << function(self, itemData, itemConfig)
end
GameSettingCtrl._ToggleGetQualitySubSettingValue = HL.Method(HL.String).Return(HL.Boolean) << function(self, settingId)
return GameSettingHelper.GetQualitySubSettingTierBySettingId(settingId) > 0
end
GameSettingCtrl._ToggleSetQualitySubSettingValue = HL.Method(HL.String, HL.Boolean) << function(self, settingId, value)
local toggleTier = value and 1 or 0
self:_SetQualitySubSettingTier(settingId, toggleTier)
end
GameSettingCtrl._SliderBuildQualitySubSettingItemData = HL.Method(HL.Table, HL.Userdata) << function(self, itemData, itemConfig)
local settingId = itemData.settingId
itemData.sliderValueGetFunction = "SliderGetQualitySubSettingValue"
itemData.sliderValueSetFunction = "SliderSetQualitySubSettingValue"
local sliderMinValue, sliderMaxValue = GameSettingHelper.GetQualitySubSettingCountBySettingId(settingId)
itemData.sliderMinValue = sliderMinValue
itemData.sliderMaxValue = sliderMaxValue
itemData.sliderWholeNumbers = itemConfig.sliderWholeNumbers
itemData.sliderStepValue = itemConfig.sliderStepValue
end
GameSettingCtrl._SliderGetQualitySubSettingValue = HL.Method(HL.String).Return(HL.Number) << function(self, settingId)
return GameSettingHelper.GetQualitySubSettingTierBySettingId(settingId)
end
GameSettingCtrl._SliderSetQualitySubSettingValue = HL.Method(HL.String, HL.Number) << function(self, settingId, value)
self:_SetQualitySubSettingTier(settingId, value)
end
GameSettingCtrl._SetQualitySubSettingTier = HL.Method(HL.String, HL.Any) << function(self, settingId, tier)
local qualitySubSettingData = self.m_qualitySubSettingDataMap[settingId]
if qualitySubSettingData == nil then
logger.error("[GameSetting] QualitySubSetting not found, settingId: " .. tostring(settingId))
return
end
local itemData = qualitySubSettingData.itemData
if not itemData.ignoreMainChange then
local qualityCell = self.m_itemCellMap[QUALITY_SETTING_ID]
if qualityCell ~= nil and qualityCell.dropdown ~= nil then
qualityCell.dropdown:SetSelected(0, false, false)
GameSettingHelper.SetQualityCustomState(true)
end
end
GameSettingHelper.SetQualitySubSettingTierBySettingId(settingId, tier)
self:_OnQualitySubSettingTierChanged(itemData)
end
GameSettingCtrl._OnQualitySubSettingTierChanged = HL.Method(HL.Table) << function(self, itemData)
if itemData.refreshViewOnValueChanged then
self:_RefreshCurrentSettingTab(true)
end
local needRestart = QualityManagerInst:NeedRestart()
if needRestart then
self:_ShowRebootTips()
end
self:_RefreshLoad(true)
end
GameSettingCtrl._ShowRebootTips = HL.Method() << function(self)
Notify(MessageConst.SHOW_POP_UP, {
content = Language[QUALITY_POP_UP_MOBILE_CONTENT_TEXT_ID],
warningContent = Language[QUALITY_POP_UP_MOBILE_WARNING_TEXT_ID],
freezeWorld = true,
hideBlur = true,
hideCancel = true,
})
end
GameSettingCtrl._InitLoad = HL.Method() << function(self)
self:_InitQualityLoad()
self:_InitMemoryLoad()
end
GameSettingCtrl._InitQualityLoad = HL.Method() << function(self)
local qualityConfig = GameInstance.dataManager.gameSettingSubQualityConfig
local qualityLoadConfig = qualityConfig:GetQualityLoadConfig(QualityManagerInst.defaultTier)
local maxQualityLoad = GameSettingHelper.CalculateDefaultQualityLoad() / qualityLoadConfig.defaultLoadRatio
local args = {
maxProgress = maxQualityLoad,
currentProgressGetter = GameSettingHelper.CalculateCurrentQualityLoad,
progressConfigs = {
{ threshold = 1.0, stateName = "High", stateText = Language.LUA_GAME_SETTING_QUALITY_LOAD_CRITICAL },
{ threshold = 0.8, stateName = "High", stateText = Language.LUA_GAME_SETTING_QUALITY_LOAD_EX_HIGH },
{ threshold = 0.6, stateName = "Medium", stateText = Language.LUA_GAME_SETTING_QUALITY_LOAD_HIGH },
{ threshold = 0.4, stateName = "Low", stateText = Language.LUA_GAME_SETTING_QUALITY_LOAD_MEDIUM },
{ threshold = 0.2, stateName = "Low", stateText = Language.LUA_GAME_SETTING_QUALITY_LOAD_LOW },
{ threshold = 0.0, stateName = "Low", stateText = Language.LUA_GAME_SETTING_QUALITY_LOAD_EX_LOW },
},
onCurrentProgressChanged = function(previousProgress, currentProgress)
local oldRatio = math.max(0, previousProgress / maxQualityLoad)
local newRatio = math.max(0, currentProgress / maxQualityLoad)
if oldRatio > 0 and newRatio > 0 then
GameSetting.GameSettingSendEventLog("quality_load", oldRatio, newRatio)
end
end,
}
self.view.qualityLoadBar:InitGameSettingLoadBar(args)
end
GameSettingCtrl._InitMemoryLoad = HL.Method() << function(self)
local args = {
maxProgress = HGUtils.GetVRAMUsageWarningThreshold(),
currentProgressGetter = HGUtils.GetEstimatedVRAMUsage,
progressConfigs = {
{ threshold = 1.0, stateName = "High", stateText = Language.LUA_GAME_SETTING_MEMORY_LOAD_HIGH },
{ threshold = 0.8, stateName = "Medium", stateText = Language.LUA_GAME_SETTING_MEMORY_LOAD_MEDIUM },
{ threshold = 0.0, stateName = "Low", stateText = Language.LUA_GAME_SETTING_MEMORY_LOAD_LOW },
},
}
self.view.memoryLoadBar:InitGameSettingLoadBar(args)
end
GameSettingCtrl._RefreshLoad = HL.Method(HL.Opt(HL.Boolean)) << function(self, playAnim)
local tabData = self.m_tabDataList[self.m_tabIndex]
local show = tabData.tabId == VIDEO_TAB_ID
self.view.loadNode.gameObject:SetActive(show)
if not show then
return
end
self:_RefreshQualityLoad(playAnim)
self:_RefreshMemoryLoad(playAnim)
end
GameSettingCtrl._RefreshQualityLoad = HL.Method(HL.Opt(HL.Boolean)) << function(self, playAnim)
local show = DeviceInfo.isPC or DeviceInfo.isMobile
self.view.qualityLoadBar.gameObject:SetActive(show)
if not show then
return
end
playAnim = playAnim == true
self.view.qualityLoadBar:Refresh(playAnim, self.view.config.QUALITY_LOAD_BAR_TWEEN_DURATION)
end
GameSettingCtrl._RefreshMemoryLoad = HL.Method(HL.Opt(HL.Boolean)) << function(self, playAnim)
local show = DeviceInfo.isPC
self.view.memoryLoadBar.gameObject:SetActive(show)
if not show then
return
end
playAnim = playAnim == true
self.view.memoryLoadBar:Refresh(playAnim, self.view.config.QUALITY_LOAD_BAR_TWEEN_DURATION)
end
GameSettingCtrl._InitController = HL.Method() << function(self)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputGroup.groupId })
end
GameSettingCtrl._SetSettingItemControllerNaviTarget = HL.Method() << function(self)
local itemDataList = self.m_itemDataList[self.m_tabIndex]
if itemDataList == nil then
return
end
InputManagerInst.controllerNaviManager:SetTarget(nil)
local itemCount = #itemDataList
if itemCount > 0 then
local firstCell = self.m_itemCells:Get(1)
InputManagerInst.controllerNaviManager:SetTarget(firstCell.naviDecorator)
end
end
GameSettingCtrl._OnTryChangeInputDeviceType = HL.Method(HL.Any) << function(self, args)
if GameInstance.isInGameplay then
return
end
Notify(MessageConst.SHOW_TOAST, Language.LUA_INPUT_DEVICE_CHANGE_FORBIDDEN)
end
GameSettingCtrl._OnControllerTypeChanged = HL.Method(HL.Any) << function(self, args)
local controllerType = DeviceInfo.controllerType
if controllerType == DeviceControllerType.None then
return
end
local tabData = self.m_tabDataList[self.m_tabIndex]
local isGamepadTab = tabData.tabId == GAMEPAD_TAB_ID
if not isGamepadTab then
return
end
self:_RefreshCurrentSettingTab()
end
GameSettingCtrl._QueryUnreadMsg = HL.Method() << function(self)
if UNITY_PS5 then
return
end
CS.Beyond.Gameplay.AnnouncementSystem.QueryUnreadMsg()
end
GameSettingCtrl._OnCloseCustomerService = HL.Method() << function(self)
self:_QueryUnreadMsg()
end
GameSettingCtrl._OnVoiceResourceStateChanged = HL.Method() << function(self)
local tabData = self.m_tabDataList[self.m_tabIndex]
if tabData.tabId ~= LANGUAGE_TAB_ID then
return
end
self:_RefreshCurrentSettingTab(true)
end
GameSettingCtrl.OpenGameSettingPhase = HL.StaticMethod() << function()
PhaseManager:OpenPhase(PhaseId.GameSetting)
end
GameSettingCtrl.OnSystemDisplaySizeChanged = HL.StaticMethod() << function()
CoroutineManager:StartCoroutine(function()
coroutine.waitForRenderDone()
if CS.Beyond.GameSetting.IsSettingNotSet(CS.Beyond.GameSetting.GetCurVideoNotchPaddingId()) then
local defaultPadding = CS.Beyond.Gameplay.GameSettingHelper.GetGameSettingDefaultNotchPadding(
UIManager.uiCanvasRect.rect.width,
STANDARD_HORIZONTAL_RESOLUTION
)
CS.Beyond.Scripts.Entry.GameSettingSetter.graphicsNotchPadding:Set(defaultPadding)
else
CS.Beyond.Scripts.Entry.GameSettingSetter.graphicsNotchPadding:Set(CS.Beyond.GameSetting.videoNotchPadding)
end
if PhaseManager:IsOpen(PhaseId.GameSetting) then
PhaseManager:ExitPhaseFast(PhaseId.GameSetting)
end
local rootCanvasHelper = UIManager.m_uiCanvasScaleHelper
local worldRootCanvasHelper = UIManager.m_worldUICanvasScaleHelper
if rootCanvasHelper ~= nil and rootCanvasHelper.onCanvasChanged ~= nil then
rootCanvasHelper:ForceCanvasUpdate()
end
if worldRootCanvasHelper ~= nil and worldRootCanvasHelper.onCanvasChanged ~= nil then
worldRootCanvasHelper:ForceCanvasUpdate()
end
Notify(MessageConst.ON_SCREEN_SIZE_CHANGED)
end)
end
HL.Commit(GameSettingCtrl)