From 4cf80d1b7ae496f23aa2487af184dcce5f69acc1 Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Sun, 10 Oct 2021 16:17:11 +0200 Subject: [PATCH] Added SkyUI script sources --- source/scripts/ski_activeeffectswidget.psc | 158 ++ source/scripts/ski_configbase.psc | 1116 ++++++++++ source/scripts/ski_configmanager.psc | 377 ++++ source/scripts/ski_configmenu.psc | 1969 +++++++++++++++++ source/scripts/ski_main.psc | 336 +++ source/scripts/ski_playerloadgamealias.psc | 7 + .../scripts/ski_qf_configmanagerinstance.psc | 22 + source/scripts/ski_questbase.psc | 42 + source/scripts/ski_settingsmanager.psc | 145 ++ source/scripts/ski_widgetbase.psc | 322 +++ source/scripts/ski_widgetmanager.psc | 181 ++ 11 files changed, 4675 insertions(+) create mode 100644 source/scripts/ski_activeeffectswidget.psc create mode 100644 source/scripts/ski_configbase.psc create mode 100644 source/scripts/ski_configmanager.psc create mode 100644 source/scripts/ski_configmenu.psc create mode 100644 source/scripts/ski_main.psc create mode 100644 source/scripts/ski_playerloadgamealias.psc create mode 100644 source/scripts/ski_qf_configmanagerinstance.psc create mode 100644 source/scripts/ski_questbase.psc create mode 100644 source/scripts/ski_settingsmanager.psc create mode 100644 source/scripts/ski_widgetbase.psc create mode 100644 source/scripts/ski_widgetmanager.psc diff --git a/source/scripts/ski_activeeffectswidget.psc b/source/scripts/ski_activeeffectswidget.psc new file mode 100644 index 00000000..0def6f07 --- /dev/null +++ b/source/scripts/ski_activeeffectswidget.psc @@ -0,0 +1,158 @@ +scriptname SKI_ActiveEffectsWidget extends SKI_WidgetBase + +; SCRIPT VERSION ---------------------------------------------------------------------------------- +; +; History +; +; 1: - Initial version +; +; 2: - Updated hudModes +; +; 3: - Added MinimumTimeLeft + +int function GetVersion() + return 3 +endFunction + +; PRIVATE VARIABLES ------------------------------------------------------------------------------- + +; -- Version 1 -- + +; Make sure defaults match those in ConfigMenuInstance +bool _enabled = false +float _effectSize = 48.0 +int _groupEffectCount = 8 +string _orientation = "vertical" + +; -- Version 3 -- + +int _minimumTimeLeft = 180 + +; PROPERTIES -------------------------------------------------------------------------------------- + +bool Property Enabled + {Whether the active effects are displayed or not} + bool function get() + return _enabled + endFunction + + function set(bool a_val) + _enabled = a_val + if (Ready) + UI.InvokeBool(HUD_MENU, WidgetRoot + ".setEnabled", _enabled) + endIf + endFunction +endProperty + +float property EffectSize + {Size of each effect icon in pixels at a resolution of 1280x720} + float function get() + return _effectSize + endFunction + + function set(float a_val) + _effectSize = a_val + if (Ready) + UI.InvokeFloat(HUD_MENU, WidgetRoot + ".setEffectSize", _effectSize) + endIf + endFunction +endProperty + +int property GroupEffectCount + {Maximum number of widgets displayed until a new group (column, or row) is created} + int function get() + return _groupEffectCount + endFunction + + function set(int a_val) + _groupEffectCount = a_val + if (Ready) + UI.InvokeInt(HUD_MENU, WidgetRoot + ".setGroupEffectCount", _groupEffectCount) + endIf + endFunction +endProperty + +string property Orientation + {The axis in which new effects will be added to after the total number of effects > GroupEffectCount} + string function get() + return _orientation + endFunction + + function set(string a_val) + _orientation = a_val + if (Ready) + UI.InvokeString(HUD_MENU, WidgetRoot + ".setOrientation", _orientation) + endIf + endFunction +endProperty + +int property MinimumTimeLeft + {The minimum time left for an effect to be displayed} + int function get() + return _minimumTimeLeft + endFunction + + function set(int a_val) + _minimumTimeLeft = a_val + if (Ready) + UI.InvokeInt(HUD_MENU, WidgetRoot + ".setMinTimeLeft", _minimumTimeLeft) + endIf + endFunction +endProperty + +; INITIALIZATION ---------------------------------------------------------------------------------- + +; @implements SKI_QuestBase +event OnVersionUpdate(int a_version) + + ; Version 2 + if (a_version >= 2 && CurrentVersion < 2) + Debug.Trace(self + ": Updating to script version 2") + + string[] hudModes = new string[6] + hudModes[0] = "All" + hudModes[1] = "StealthMode" + hudModes[2] = "Favor" + hudModes[3] = "Swimming" + hudModes[4] = "HorseMode" + hudModes[5] = "WarHorseMode" + + Modes = hudModes + endIf +endEvent + +; EVENTS ------------------------------------------------------------------------------------------ + +; @override SKI_WidgetBase +event OnWidgetReset() + parent.OnWidgetReset() + + ; Init numbers + float[] numberArgs = new float[4] + numberArgs[0] = _enabled as float + numberArgs[1] = _effectSize + numberArgs[2] = _groupEffectCount as float + numberArgs[3] = _minimumTimeLeft as float + UI.InvokeFloatA(HUD_MENU, WidgetRoot + ".initNumbers", numberArgs) + + ; Init strings + string[] stringArgs = new string[1] + stringArgs[0] = _orientation + UI.InvokeStringA(HUD_MENU, WidgetRoot + ".initStrings", stringArgs) + + ; Init commit + UI.Invoke(HUD_MENU, WidgetRoot + ".initCommit") +endEvent + + +; FUNCTIONS --------------------------------------------------------------------------------------- + +; @overrides SKI_WidgetBase +string function GetWidgetSource() + return "skyui/activeeffects.swf" +endFunction + +; @overrides SKI_WidgetBase +string function GetWidgetType() + return "SKI_ActiveEffectsWidget" +endFunction \ No newline at end of file diff --git a/source/scripts/ski_configbase.psc b/source/scripts/ski_configbase.psc new file mode 100644 index 00000000..5f1fadd5 --- /dev/null +++ b/source/scripts/ski_configbase.psc @@ -0,0 +1,1116 @@ +scriptname SKI_ConfigBase extends SKI_QuestBase + +; CONSTANTS --------------------------------------------------------------------------------------- + +string property JOURNAL_MENU = "Journal Menu" autoReadonly +string property MENU_ROOT = "_root.ConfigPanelFader.configPanel" autoReadonly + +int property STATE_DEFAULT = 0 autoReadonly +int property STATE_RESET = 1 autoReadonly +int property STATE_SLIDER = 2 autoReadonly +int property STATE_MENU = 3 autoReadonly +int property STATE_COLOR = 4 autoReadonly + +int property OPTION_TYPE_EMPTY = 0x00 autoReadonly +int property OPTION_TYPE_HEADER = 0x01 autoReadonly +int property OPTION_TYPE_TEXT = 0x02 autoReadonly +int property OPTION_TYPE_TOGGLE = 0x03 autoReadonly +int property OPTION_TYPE_SLIDER = 0x04 autoReadonly +int property OPTION_TYPE_MENU = 0x05 autoReadonly +int property OPTION_TYPE_COLOR = 0x06 autoReadonly +int property OPTION_TYPE_KEYMAP = 0x07 autoReadonly + +int property OPTION_FLAG_NONE = 0x00 autoReadonly +int property OPTION_FLAG_DISABLED = 0x01 autoReadonly +int property OPTION_FLAG_HIDDEN = 0x02 autoReadonly +int property OPTION_FLAG_WITH_UNMAP = 0x04 autoReadonly + +int property LEFT_TO_RIGHT = 1 autoReadonly +int property TOP_TO_BOTTOM = 2 autoReadonly + + +; PRIVATE VARIABLES ------------------------------------------------------------------------------- + +SKI_ConfigManager _configManager +bool _initialized = false +int _configID = -1 +string _currentPage = "" +int _currentPageNum = 0 ; 0 for "", real pages start at 1 + +; Keep track of what we're doing at the moment for stupidity checks +int _state = 0 + +int _cursorPosition = 0 +int _cursorFillMode = 1 ;LEFT_TO_RIGHT + +; Local buffers +int[] _optionFlagsBuf ; byte 1 type, byte 2 flags +string[] _textBuf +string[] _strValueBuf +float[] _numValueBuf + +float[] _sliderParams +int[] _menuParams +int[] _colorParams + +int _activeOption = -1 + +string _infoText + +bool _messageResult = false +bool _waitForMessage = false + +string[] _stateOptionMap + + +; PROPERTIES -------------------------------------------------------------------------------------- + +string property ModName auto + +string[] property Pages auto + +string property CurrentPage + string function get() + return _currentPage + endFunction +endProperty + + +; INITIALIZATION ---------------------------------------------------------------------------------- + +event OnInit() + OnGameReload() +endEvent + +; @implements SKI_QuestBase +event OnGameReload() + if (!_initialized) + _initialized = true + + ; Buffer alloc/free on config open/close + ;_optionFlagsBuf = new int[128] + ;_textBuf = new string[128] + ;_strValueBuf = new string[128] + ;_numValueBuf = new float[128] + + ; 0 startValue + ; 1 defaultValue + ; 2 minValue + ; 3 maxValue + ; 4 interval + _sliderParams = new float[5] + + ; 0 startIndex + ; 1 defaultIndex + _menuParams = new int[2] + + ; 0 currentColor + ; 1 defaultColor + _colorParams = new int[2] + + OnConfigInit() + + Debug.Trace(self + " INITIALIZED") + endIf + + RegisterForModEvent("SKICP_configManagerReady", "OnConfigManagerReady") + RegisterForModEvent("SKICP_configManagerReset", "OnConfigManagerReset") + + CheckVersion() +endEvent + + +; EVENTS ------------------------------------------------------------------------------------------ + +; @interface +event OnConfigInit() + {Called when this config menu is initialized} +endEvent + +; @interface +event OnConfigRegister() + {Called when this config menu registered at the control panel} +endEvent + +; @interface +event OnConfigOpen() + {Called when this config menu is opened} +endEvent + +; @interface +event OnConfigClose() + {Called when this config menu is closed} +endEvent + +; @interface(SKI_QuestBase) +event OnVersionUpdate(int a_version) + {Called when a version update of this script has been detected} +endEvent + +; @interface +event OnPageReset(string a_page) + {Called when a new page is selected, including the initial empty page} +endEvent + +; @interface +event OnOptionHighlight(int a_option) + {Called when highlighting an option} +endEvent + +; @interface +event OnOptionSelect(int a_option) + {Called when a non-interactive option has been selected} +endEvent + +; @interface +event OnOptionDefault(int a_option) + {Called when resetting an option to its default value} +endEvent + +; @interface +event OnOptionSliderOpen(int a_option) + {Called when a slider option has been selected} +endEvent + +; @interface +event OnOptionSliderAccept(int a_option, float a_value) + {Called when a new slider value has been accepted} +endEvent + +; @interface +event OnOptionMenuOpen(int a_option) + {Called when a menu option has been selected} +endEvent + +; @interface +event OnOptionMenuAccept(int a_option, int a_index) + {Called when a menu entry has been accepted} +endEvent + +; @interface +event OnOptionColorOpen(int a_option) + {Called when a color option has been selected} +endEvent + +; @interface +event OnOptionColorAccept(int a_option, int a_color) + {Called when a new color has been accepted} +endEvent + +; @interface +event OnOptionKeyMapChange(int a_option, int a_keyCode, string a_conflictControl, string a_conflictName) + {Called when a key has been remapped} +endEvent + +; @interface +event OnHighlightST() + {Called when highlighting a state option} +endEvent + +; @interface +event OnSelectST() + {Called when a non-interactive state option has been selected} +endEvent + +; @interface +event OnDefaultST() + {Called when resetting a state option to its default value} +endEvent + +; @interface +event OnSliderOpenST() + {Called when a slider state option has been selected} +endEvent + +; @interface +event OnSliderAcceptST(float a_value) + {Called when a new slider state value has been accepted} +endEvent + +; @interface +event OnMenuOpenST() + {Called when a menu state option has been selected} +endEvent + +; @interface +event OnMenuAcceptST(int a_index) + {Called when a menu entry has been accepted for this state option} +endEvent + +; @interface +event OnColorOpenST() + {Called when a color state option has been selected} +endEvent + +; @interface +event OnColorAcceptST(int a_color) + {Called when a new color has been accepted for this state option} +endEvent + +; @interface +event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + {Called when a key has been remapped for this state option} +endEvent + +event OnConfigManagerReset(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + _configManager = none +endEvent + +event OnConfigManagerReady(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + SKI_ConfigManager newManager = a_sender as SKI_ConfigManager + ; Already registered? + if (_configManager == newManager || newManager == none) + return + endIf + + _configID = newManager.RegisterMod(self, ModName) + + ; Success + if (_configID >= 0) + _configManager = newManager + OnConfigRegister() + Debug.Trace(self + ": Registered " + ModName + " at MCM.") + endIf + endEvent + +event OnMessageDialogClose(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + _messageResult = a_numArg as bool + _waitForMessage = false +endEvent + + +; FUNCTIONS --------------------------------------------------------------------------------------- + +; @interface(SKI_QuestBase) +int function GetVersion() + {Returns version of this script} + return 1 +endFunction + +; @interface +string function GetCustomControl(int a_keyCode) + {Returns the name of a custom control mapped to given keyCode, or "" if the key is not in use by this config} + return "" +endFunction + +; @interface +function ForcePageReset() + {Forces a full reset of the current page} + UI.Invoke(JOURNAL_MENU, MENU_ROOT + ".forcePageReset") +endFunction + +; @interface +function SetTitleText(string a_text) + UI.InvokeString(JOURNAL_MENU, MENU_ROOT + ".setTitleText", a_text) +endFunction + +; @interface +function SetInfoText(string a_text) + _infoText = a_text +endFunction + +; @interface +function SetCursorPosition(int a_position) + if (a_position < 128) + _cursorPosition = a_position + endIf +endFunction + +; @interface +function SetCursorFillMode(int a_fillMode) + if (a_fillMode == LEFT_TO_RIGHT || a_fillMode == TOP_TO_BOTTOM) + _cursorFillMode = a_fillMode + endIf +endFunction + +; @interface +int function AddEmptyOption() + return AddOption(OPTION_TYPE_EMPTY, none, none, 0, 0) +endFunction + +; @interface +int function AddHeaderOption(string a_text, int a_flags = 0) + return AddOption(OPTION_TYPE_HEADER, a_text, none, 0, a_flags) +endFunction + +; @interface +int function AddTextOption(string a_text, string a_value, int a_flags = 0) + return AddOption(OPTION_TYPE_TEXT, a_text, a_value, 0, a_flags) +endFunction + +; @interface +int function AddToggleOption(string a_text, bool a_checked, int a_flags = 0) + return AddOption(OPTION_TYPE_TOGGLE, a_text, none, a_checked as int, a_flags) +endfunction + +; @interface +int function AddSliderOption(string a_text, float a_value, string a_formatString = "{0}", int a_flags = 0) + return AddOption(OPTION_TYPE_SLIDER, a_text, a_formatString, a_value, a_flags) +endFunction + +; @interface +int function AddMenuOption(string a_text, string a_value, int a_flags = 0) + return AddOption(OPTION_TYPE_MENU, a_text, a_value, 0, a_flags) +endFunction + +; @interface +int function AddColorOption(string a_text, int a_color, int a_flags = 0) + return AddOption(OPTION_TYPE_COLOR, a_text, none, a_color, a_flags) +endFunction + +; @interface +int function AddKeyMapOption(string a_text, int a_keyCode, int a_flags = 0) + return AddOption(OPTION_TYPE_KEYMAP, a_text, none, a_keyCode, a_flags) +endFunction + +; @interface +function AddTextOptionST(string a_stateName, string a_text, string a_value, int a_flags = 0) + AddOptionST(a_stateName, OPTION_TYPE_TEXT, a_text, a_value, 0, a_flags) +endFunction + +; @interface +function AddToggleOptionST(string a_stateName, string a_text, bool a_checked, int a_flags = 0) + AddOptionST(a_stateName, OPTION_TYPE_TOGGLE, a_text, none, a_checked as int, a_flags) +endfunction + +; @interface +function AddSliderOptionST(string a_stateName, string a_text, float a_value, string a_formatString = "{0}", int a_flags = 0) + AddOptionST(a_stateName, OPTION_TYPE_SLIDER, a_text, a_formatString, a_value, a_flags) +endFunction + +; @interface +function AddMenuOptionST(string a_stateName, string a_text, string a_value, int a_flags = 0) + AddOptionST(a_stateName, OPTION_TYPE_MENU, a_text, a_value, 0, a_flags) +endFunction + +; @interface +function AddColorOptionST(string a_stateName, string a_text, int a_color, int a_flags = 0) + AddOptionST(a_stateName, OPTION_TYPE_COLOR, a_text, none, a_color, a_flags) +endFunction + +; @interface +function AddKeyMapOptionST(string a_stateName, string a_text, int a_keyCode, int a_flags = 0) + AddOptionST(a_stateName, OPTION_TYPE_KEYMAP, a_text, none, a_keyCode, a_flags) +endFunction + +; @interface +function LoadCustomContent(string a_source, float a_x = 0.0, float a_y = 0.0) + float[] params = new float[2] + params[0] = a_x + params[1] = a_y + UI.InvokeFloatA(JOURNAL_MENU, MENU_ROOT + ".setCustomContentParams", params) + UI.InvokeString(JOURNAL_MENU, MENU_ROOT + ".loadCustomContent", a_source) +endFunction + +; @interface +function UnloadCustomContent() + UI.Invoke(JOURNAL_MENU, MENU_ROOT + ".unloadCustomContent") +endFunction + +; @interface +function SetOptionFlags(int a_option, int a_flags, bool a_noUpdate = false) + if (_state == STATE_RESET) + Error("Cannot set option flags while in OnPageReset(). Pass flags to AddOption instead") + return + endIf + + int index = a_option % 0x100 + + ; Update flags buffer + int oldFlags = _optionFlagsBuf[index] as int + oldFlags %= 0x100 ; Clear upper bytes, keep type + oldFlags += a_flags * 0x100 ; Set new flags + + ; Update display + int[] params = new int[2] + params[0] = index + params[1] = a_flags + UI.InvokeIntA(JOURNAL_MENU, MENU_ROOT + ".setOptionFlags", params) + + if (!a_noUpdate) + UI.Invoke(JOURNAL_MENU, MENU_ROOT + ".invalidateOptionData") + endIf +endFunction + +; @interface +function SetTextOptionValue(int a_option, string a_value, bool a_noUpdate = false) + int index = a_option % 0x100 + int type = _optionFlagsBuf[index] % 0x100 + + if (type != OPTION_TYPE_TEXT) + int pageIdx = ((a_option / 0x100) as int) - 1 + if (pageIdx != -1) + Error("Option type mismatch. Expected text option, page \"" + Pages[pageIdx] + "\", index " + index) + else + Error("Option type mismatch. Expected text option, page \"\", index " + index) + endIf + return + endIf + + SetOptionStrValue(index, a_value, a_noUpdate) +endFunction + +; @interface +function SetToggleOptionValue(int a_option, bool a_checked, bool a_noUpdate = false) + int index = a_option % 0x100 + int type = _optionFlagsBuf[index] % 0x100 + + if (type != OPTION_TYPE_TOGGLE) + int pageIdx = ((a_option / 0x100) as int) - 1 + if (pageIdx != -1) + Error("Option type mismatch. Expected toggle option, page \"" + Pages[pageIdx] + "\", index " + index) + else + Error("Option type mismatch. Expected toggle option, page \"\", index " + index) + endIf + return + endIf + + SetOptionNumValue(index, a_checked as int, a_noUpdate) +endfunction + +; @interface +function SetSliderOptionValue(int a_option, float a_value, string a_formatString = "{0}", bool a_noUpdate = false) + int index = a_option % 0x100 + int type = _optionFlagsBuf[index] % 0x100 + + if (type != OPTION_TYPE_SLIDER) + int pageIdx = ((a_option / 0x100) as int) - 1 + if (pageIdx != -1) + Error("Option type mismatch. Expected slider option, page \"" + Pages[pageIdx] + "\", index " + index) + else + Error("Option type mismatch. Expected slider option, page \"\", index " + index) + endIf + return + endIf + + SetOptionValues(index, a_formatString, a_value, a_noUpdate) +endFunction + +; @interface +function SetMenuOptionValue(int a_option, string a_value, bool a_noUpdate = false) + int index = a_option % 0x100 + int type = _optionFlagsBuf[index] % 0x100 + + if (type != OPTION_TYPE_MENU) + int pageIdx = ((a_option / 0x100) as int) - 1 + if (pageIdx != -1) + Error("Option type mismatch. Expected menu option, page \"" + Pages[pageIdx] + "\", index " + index) + else + Error("Option type mismatch. Expected menu option, page \"\", index " + index) + endIf + return + endIf + + SetOptionStrValue(index, a_value, a_noUpdate) +endFunction + +; @interface +function SetColorOptionValue(int a_option, int a_color, bool a_noUpdate = false) + int index = a_option % 0x100 + int type = _optionFlagsBuf[index] % 0x100 + + if (type != OPTION_TYPE_COLOR) + int pageIdx = ((a_option / 0x100) as int) - 1 + if (pageIdx != -1) + Error("Option type mismatch. Expected color option, page \"" + Pages[pageIdx] + "\", index " + index) + else + Error("Option type mismatch. Expected color option, page \"\", index " + index) + endIf + return + endIf + + SetOptionNumValue(index, a_color, a_noUpdate) +endFunction + +; @interface +function SetKeyMapOptionValue(int a_option, int a_keyCode, bool a_noUpdate = false) + int index = a_option % 0x100 + int type = _optionFlagsBuf[index] % 0x100 + + if (type != OPTION_TYPE_KEYMAP) + int pageIdx = ((a_option / 0x100) as int) - 1 + if (pageIdx != -1) + Error("Option type mismatch. Expected keymap option, page \"" + Pages[pageIdx] + "\", index " + index) + else + Error("Option type mismatch. Expected keymap option, page \"\", index " + index) + endIf + return + endIf + + SetOptionNumValue(index, a_keyCode, a_noUpdate) +endFunction + +; @interface +function SetOptionFlagsST(int a_flags, bool a_noUpdate = false, string a_stateName = "") + if (_state == STATE_RESET) + Error("Cannot set option flags while in OnPageReset(). Pass flags to AddOption instead") + return + endIf + + int index = GetStateOptionIndex(a_stateName) + if (index < 0) + Error("Cannot use SetOptionFlagsST outside a valid option state") + return + endIf + + SetOptionFlags(index, a_flags, a_noUpdate) +endFunction + +; @interface +function SetTextOptionValueST(string a_value, bool a_noUpdate = false, string a_stateName = "") + int index = GetStateOptionIndex(a_stateName) + if (index < 0) + Error("Cannot use SetTextOptionValueST outside a valid option state") + return + endIf + + SetTextOptionValue(index, a_value, a_noUpdate) +endFunction + +; @interface +function SetToggleOptionValueST(bool a_checked, bool a_noUpdate = false, string a_stateName = "") + int index = GetStateOptionIndex(a_stateName) + if (index < 0) + Error("Cannot use SetToggleOptionValueST outside a valid option state") + return + endIf + + SetToggleOptionValue(index, a_checked, a_noUpdate) +endFunction + +; @interface +function SetSliderOptionValueST(float a_value, string a_formatString = "{0}", bool a_noUpdate = false, string a_stateName = "") + int index = GetStateOptionIndex(a_stateName) + if (index < 0) + Error("Cannot use SetSliderOptionValueST outside a valid option state") + return + endIf + + SetSliderOptionValue(index, a_value, a_formatString, a_noUpdate) +endFunction + +; @interface +function SetMenuOptionValueST(string a_value, bool a_noUpdate = false, string a_stateName = "") + int index = GetStateOptionIndex(a_stateName) + if (index < 0) + Error("Cannot use SetMenuOptionValueST outside a valid option state") + return + endIf + + SetMenuOptionValue(index, a_value, a_noUpdate) +endFunction + +; @interface +function SetColorOptionValueST(int a_color, bool a_noUpdate = false, string a_stateName = "") + int index = GetStateOptionIndex(a_stateName) + if (index < 0) + Error("Cannot use SetColorOptionValueST outside a valid option state") + return + endIf + + SetColorOptionValue(index, a_color, a_noUpdate) +endFunction + +; @interface +function SetKeyMapOptionValueST(int a_keyCode, bool a_noUpdate = false, string a_stateName = "") + int index = GetStateOptionIndex(a_stateName) + if (index < 0) + Error("Cannot use SetKeyMapOptionValueST outside a valid option state") + return + endIf + + SetKeyMapOptionValue(index, a_keyCode, a_noUpdate) +endFunction + +; @interface +function SetSliderDialogStartValue(float a_value) + if (_state != STATE_SLIDER) + Error("Cannot set slider dialog params while outside OnOptionSliderOpen()") + return + endIf + + _sliderParams[0] = a_value +endFunction + +; @interface +function SetSliderDialogDefaultValue(float a_value) + if (_state != STATE_SLIDER) + Error("Cannot set slider dialog params while outside OnOptionSliderOpen()") + return + endIf + + _sliderParams[1] = a_value +endFunction + +; @interface +function SetSliderDialogRange(float a_minValue, float a_maxValue) + if (_state != STATE_SLIDER) + Error("Cannot set slider dialog params while outside OnOptionSliderOpen()") + return + endIf + + _sliderParams[2] = a_minValue + _sliderParams[3] = a_maxValue +endFunction + +; @interface +function SetSliderDialogInterval(float a_value) + if (_state != STATE_SLIDER) + Error("Cannot set slider dialog params while outside OnOptionSliderOpen()") + return + endIf + + _sliderParams[4] = a_value +endFunction + +; @interface +function SetMenuDialogStartIndex(int a_value) + if (_state != STATE_MENU) + Error("Cannot set menu dialog params while outside OnOptionMenuOpen()") + return + endIf + + _menuParams[0] = a_value +endFunction + +; @interface +function SetMenuDialogDefaultIndex(int a_value) + if (_state != STATE_MENU) + Error("Cannot set menu dialog params while outside OnOptionMenuOpen()") + return + endIf + + _menuParams[1] = a_value +endFunction + +; @interface +function SetMenuDialogOptions(string[] a_options) + if (_state != STATE_MENU) + Error("Cannot set menu dialog params while outside OnOptionMenuOpen()") + return + endIf + + UI.InvokeStringA(JOURNAL_MENU, MENU_ROOT + ".setMenuDialogOptions", a_options) +endFunction + +; @interface +function SetColorDialogStartColor(int a_color) + if (_state != STATE_COLOR) + Error("Cannot set color dialog params while outside OnOptionColorOpen()") + return + endIf + + _colorParams[0] = a_color +endFunction + +; @interface +function SetColorDialogDefaultColor(int a_color) + if (_state != STATE_COLOR) + Error("Cannot set color dialog params while outside OnOptionColorOpen()") + return + endIf + + _colorParams[1] = a_color +endFunction + +; @interface +bool function ShowMessage(string a_message, bool a_withCancel = true, string a_acceptLabel = "$Accept", string a_cancelLabel = "$Cancel") + if (_waitForMessage) + Error("Called ShowMessage() while another message was already open") + return false + endIf + + _waitForMessage = true + _messageResult = false + + string[] params = new string[3] + params[0] = a_message + params[1] = a_acceptLabel + if (a_withCancel) + params[2] = a_cancelLabel + else + params[2] = "" + endIf + + RegisterForModEvent("SKICP_messageDialogClosed", "OnMessageDialogClose") + UI.InvokeStringA(JOURNAL_MENU, MENU_ROOT + ".showMessageDialog", params) + + ; Wait for result + while (_waitForMessage) + Utility.WaitMenuMode(0.1) + endWhile + + UnregisterForModEvent("SKICP_messageDialogClosed") + + return _messageResult +endFunction + +function Error(string a_msg) + Debug.Trace(self + " ERROR: " + a_msg) +endFunction + +function OpenConfig() + ; Alloc + _optionFlagsBuf = new int[128] + _textBuf = new string[128] + _strValueBuf = new string[128] + _numValueBuf = new float[128] + _stateOptionMap = new string[128] + + SetPage("", -1) + + OnConfigOpen() + + UI.InvokeStringA(JOURNAL_MENU, MENU_ROOT + ".setPageNames", Pages) +endFunction + +function CloseConfig() + OnConfigClose() + ClearOptionBuffers() + _waitForMessage = false + + ; Free + _optionFlagsBuf = new int[1] + _textBuf = new string[1] + _strValueBuf = new string[1] + _numValueBuf = new float[1] + _stateOptionMap = new string[1] +endFunction + +function SetPage(string a_page, int a_index) + _currentPage = a_page + _currentPageNum = 1+a_index + + ; Set default title, can be overridden in OnPageReset + if (a_page != "") + SetTitleText(a_page) + else + SetTitleText(ModName) + endIf + + ClearOptionBuffers() + _state = STATE_RESET + OnPageReset(a_page) + _state = STATE_DEFAULT + WriteOptionBuffers() +endFunction + +int function AddOption(int a_optionType, string a_text, string a_strValue, float a_numValue, int a_flags) + if (_state != STATE_RESET) + Error("Cannot add option " + a_text + " outside of OnPageReset()") + return -1 + endIf + + int pos = _cursorPosition + if (pos == -1) + return -1 ; invalid + endIf + + _optionFlagsBuf[pos] = a_optionType + a_flags * 0x100 + _textBuf[pos] = a_text + _strValueBuf[pos] = a_strValue + _numValueBuf[pos] = a_numValue + + ; Just use numerical value of fill mode + _cursorPosition += _cursorFillMode + if (_cursorPosition >= 128) + _cursorPosition = -1 + endIf + + ; byte 1 - position + ; byte 2 - page + return pos + _currentPageNum * 0x100 +endFunction + +function AddOptionST(string a_stateName, int a_optionType, string a_text, string a_strValue, float a_numValue, int a_flags) + if (_stateOptionMap.find(a_stateName) != -1) + Error("State option name " + a_stateName + " is already in use") + return + endIf + + int index = AddOption(a_optionType, a_text, a_strValue, a_numValue, a_flags) % 0x100 + if (index < 0) + return + endIf + + if (_stateOptionMap[index] != "") + Error("State option index " + index + " already in use") + return + endIf + + _stateOptionMap[index] = a_stateName +endFunction + +int function GetStateOptionIndex(string a_stateName) + if (a_stateName == "") + a_stateName = GetState() + endIf + + if (a_stateName == "") + return -1 + endIf + + return _stateOptionMap.find(a_stateName) +endFunction + +function WriteOptionBuffers() + string menu = JOURNAL_MENU + string root = MENU_ROOT + int t = OPTION_TYPE_EMPTY + int i = 0 + int optionCount = 0; + + ; Tell UI where to cut off the buffer + i = 0 + while (i < 128) + if (_optionFlagsBuf[i] != t) + optionCount = i + 1 + endif + i += 1 + endWhile + + UI.InvokeIntA(menu, root + ".setOptionFlagsBuffer", _optionFlagsBuf) + UI.InvokeStringA(menu, root + ".setOptionTextBuffer", _textBuf) + UI.InvokeStringA(menu, root + ".setOptionStrValueBuffer", _strValueBuf) + UI.InvokeFloatA(menu, root + ".setOptionNumValueBuffer", _numValueBuf) + UI.InvokeInt(menu, root + ".flushOptionBuffers", optionCount) +endFunction + +function ClearOptionBuffers() + int t = OPTION_TYPE_EMPTY + int i = 0 + while (i < 128) + _optionFlagsBuf[i] = t + _textBuf[i] = "" + _strValueBuf[i] = "" + _numValueBuf[i] = 0 + + ; Also clear state map as it's tied to the buffers + _stateOptionMap[i] = "" + i += 1 + endWhile + + _cursorPosition = 0 + _cursorFillMode = LEFT_TO_RIGHT +endFunction + +function SetOptionStrValue(int a_index, string a_strValue, bool a_noUpdate) + if (_state == STATE_RESET) + Error("Cannot modify option data while in OnPageReset()") + return + endIf + + string menu = JOURNAL_MENU + string root = MENU_ROOT + + UI.SetInt(menu, root + ".optionCursorIndex", a_index) + UI.SetString(menu, root + ".optionCursor.strValue", a_strValue) + if (!a_noUpdate) + UI.Invoke(menu, root + ".invalidateOptionData") + endIf +endFunction + +function SetOptionNumValue(int a_index, float a_numValue, bool a_noUpdate) + if (_state == STATE_RESET) + Error("Cannot modify option data while in OnPageReset()") + return + endIf + + string menu = JOURNAL_MENU + string root = MENU_ROOT + + UI.SetInt(menu, root + ".optionCursorIndex", a_index) + UI.SetFloat(menu, root + ".optionCursor.numValue", a_numValue) + if (!a_noUpdate) + UI.Invoke(menu, root + ".invalidateOptionData") + endIf +endFunction + +function SetOptionValues(int a_index, string a_strValue, float a_numValue, bool a_noUpdate) + if (_state == STATE_RESET) + Error("Cannot modify option data while in OnPageReset()") + return + endIf + + string menu = JOURNAL_MENU + string root = MENU_ROOT + + UI.SetInt(menu, root + ".optionCursorIndex", a_index) + UI.SetString(menu, root + ".optionCursor.strValue", a_strValue) + UI.SetFloat(menu, root + ".optionCursor.numValue", a_numValue) + if (!a_noUpdate) + UI.Invoke(menu, root + ".invalidateOptionData") + endIf +endFunction + +function RequestSliderDialogData(int a_index) + _activeOption = a_index + _currentPageNum * 0x100 + + ; Defaults + _sliderParams[0] = 0 + _sliderParams[1] = 0 + _sliderParams[2] = 0 + _sliderParams[3] = 1 + _sliderParams[4] = 1 + + _state = STATE_SLIDER + + string optionState = _stateOptionMap[a_index] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnSliderOpenST() + gotoState(oldState) + else + OnOptionSliderOpen(_activeOption) + endIf + + _state = STATE_DEFAULT + + UI.InvokeFloatA(JOURNAL_MENU, MENU_ROOT + ".setSliderDialogParams", _sliderParams) +endFunction + +function RequestMenuDialogData(int a_index) + _activeOption = a_index + _currentPageNum * 0x100 + + ; Defaults + _menuParams[0] = -1 + _menuParams[1] = -1 + + _state = STATE_MENU + + string optionState = _stateOptionMap[a_index] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnMenuOpenST() + gotoState(oldState) + else + OnOptionMenuOpen(_activeOption) + endIf + + _state = STATE_DEFAULT + + UI.InvokeIntA(JOURNAL_MENU, MENU_ROOT + ".setMenuDialogParams", _menuParams) +endFunction + +function RequestColorDialogData(int a_index) + _activeOption = a_index + _currentPageNum * 0x100 + + ; Defaults + _colorParams[0] = -1 + _colorParams[1] = -1 + + _state = STATE_COLOR + + string optionState = _stateOptionMap[a_index] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnColorOpenST() + gotoState(oldState) + else + OnOptionColorOpen(_activeOption) + endIf + + _state = STATE_DEFAULT + + UI.InvokeIntA(JOURNAL_MENU, MENU_ROOT + ".setColorDialogParams", _colorParams) +endFunction + +function SetSliderValue(float a_value) + string optionState = _stateOptionMap[_activeOption % 0x100] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnSliderAcceptST(a_value) + gotoState(oldState) + else + OnOptionSliderAccept(_activeOption, a_value) + endIf + _activeOption = -1 +endFunction + +function SetMenuIndex(int a_index) + string optionState = _stateOptionMap[_activeOption % 0x100] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnMenuAcceptST(a_index) + gotoState(oldState) + else + OnOptionMenuAccept(_activeOption, a_index) + endIf + _activeOption = -1 +endFunction + +function SetColorValue(int a_color) + string optionState = _stateOptionMap[_activeOption % 0x100] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnColorAcceptST(a_color) + gotoState(oldState) + else + OnOptionColorAccept(_activeOption, a_color) + endIf + _activeOption = -1 +endFunction + +function SelectOption(int a_index) + string optionState = _stateOptionMap[a_index] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnSelectST() + gotoState(oldState) + else + int option = a_index + _currentPageNum * 0x100 + OnOptionSelect(option) + endIf +endFunction + +function ResetOption(int a_index) + string optionState = _stateOptionMap[a_index] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnDefaultST() + gotoState(oldState) + else + int option = a_index + _currentPageNum * 0x100 + OnOptionDefault(option) + endIf +endFunction + +function HighlightOption(int a_index) + _infoText = "" + + if (a_index != -1) + string optionState = _stateOptionMap[a_index] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnHighlightST() + gotoState(oldState) + else + int option = a_index + _currentPageNum * 0x100 + OnOptionHighlight(option) + endIf + endIf + + UI.InvokeString(JOURNAL_MENU, MENU_ROOT + ".setInfoText", _infoText) +endFunction + +function RemapKey(int a_index, int a_keyCode, string a_conflictControl, string a_conflictName) + string optionState = _stateOptionMap[a_index] + if (optionState != "") + string oldState = GetState() + gotoState(optionState) + OnKeyMapChangeST(a_keyCode, a_conflictControl, a_conflictName) + gotoState(oldState) + else + int option = a_index + _currentPageNum * 0x100 + OnOptionKeyMapChange(option, a_keyCode, a_conflictControl, a_conflictName) + endIf +endFunction diff --git a/source/scripts/ski_configmanager.psc b/source/scripts/ski_configmanager.psc new file mode 100644 index 00000000..a67391a7 --- /dev/null +++ b/source/scripts/ski_configmanager.psc @@ -0,0 +1,377 @@ +scriptname SKI_ConfigManager extends SKI_QuestBase hidden + +; SCRIPT VERSION ---------------------------------------------------------------------------------- +; +; History +; +; 1: - Initial version +; +; 2: - Added lock for API functions +; +; 3: - Removed lock again until I have time to test it properly +; +; 4: - Added redundancy for registration process + +int function GetVersion() + return 4 +endFunction + + +; CONSTANTS --------------------------------------------------------------------------------------- + +string property JOURNAL_MENU = "Journal Menu" autoReadonly +string property MENU_ROOT = "_root.ConfigPanelFader.configPanel" autoReadonly + + +; PRIVATE VARIABLES ------------------------------------------------------------------------------- + +; -- Version 1 -- + +SKI_ConfigBase[] _modConfigs +string[] _modNames +int _curConfigID = 0 +int _configCount = 0 + +SKI_ConfigBase _activeConfig + +; -- Version 2 -- + +; keep those for now +bool _lockInit = false +bool _locked = false + +; -- Version 4 -- + +bool _cleanupFlag = false +int _addCounter = 0 +int _updateCounter = 0 + + +; INITIALIZATION ---------------------------------------------------------------------------------- + +event OnInit() + _modConfigs = new SKI_ConfigBase[128] + _modNames = new string[128] + + OnGameReload() +endEvent + +; @implements SKI_QuestBase +event OnGameReload() + RegisterForModEvent("SKICP_modSelected", "OnModSelect") + RegisterForModEvent("SKICP_pageSelected", "OnPageSelect") + RegisterForModEvent("SKICP_optionHighlighted", "OnOptionHighlight") + RegisterForModEvent("SKICP_optionSelected", "OnOptionSelect") + RegisterForModEvent("SKICP_optionDefaulted", "OnOptionDefault") + RegisterForModEvent("SKICP_keymapChanged", "OnKeymapChange") + RegisterForModEvent("SKICP_sliderSelected", "OnSliderSelect") + RegisterForModEvent("SKICP_sliderAccepted", "OnSliderAccept") + RegisterForModEvent("SKICP_menuSelected", "OnMenuSelect") + RegisterForModEvent("SKICP_menuAccepted", "OnMenuAccept") + RegisterForModEvent("SKICP_colorSelected", "OnColorSelect") + RegisterForModEvent("SKICP_colorAccepted", "OnColorAccept") + RegisterForModEvent("SKICP_dialogCanceled", "OnDialogCancel") + + RegisterForMenu(JOURNAL_MENU) + + ; no longer used but better safe than sorry + _lockInit = true + + _cleanupFlag = true + + CleanUp() + SendModEvent("SKICP_configManagerReady") + + _updateCounter = 0 + RegisterForSingleUpdate(5) +endEvent + + +; EVENTS ------------------------------------------------------------------------------------------ + +event OnUpdate() + + if (_cleanupFlag) + CleanUp() + endIf + + if (_addCounter > 0) + Debug.Notification("MCM: Registered " + _addCounter + " new menu(s).") + _addCounter = 0 + endIf + + SendModEvent("SKICP_configManagerReady") + + if (_updateCounter < 6) + _updateCounter += 1 + RegisterForSingleUpdate(5) + else + RegisterForSingleUpdate(30) + endIf +endEvent + +event OnMenuOpen(string a_menuName) + GotoState("BUSY") + _activeConfig = none + UI.InvokeStringA(JOURNAL_MENU, MENU_ROOT + ".setModNames", _modNames); +endEvent + +event OnMenuClose(string a_menuName) + GotoState("") + if (_activeConfig) + _activeConfig.CloseConfig() + endIf + + _activeConfig = none +endEvent + +event OnModSelect(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int configIndex = a_numArg as int + if (configIndex > -1) + + ; We can clean the buffers of the previous menu now + if (_activeConfig) + _activeConfig.CloseConfig() + endIf + + _activeConfig = _modConfigs[configIndex] + _activeConfig.OpenConfig() + endIf + UI.InvokeBool(JOURNAL_MENU, MENU_ROOT + ".unlock", true) +endEvent + +event OnPageSelect(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + string page = a_strArg + int index = a_numArg as int + _activeConfig.SetPage(page, index) + UI.InvokeBool(JOURNAL_MENU, MENU_ROOT + ".unlock", true) +endEvent + +event OnOptionHighlight(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int optionIndex = a_numArg as int + _activeConfig.HighlightOption(optionIndex) +endEvent + +event OnOptionSelect(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int optionIndex = a_numArg as int + _activeConfig.SelectOption(optionIndex) + UI.InvokeBool(JOURNAL_MENU, MENU_ROOT + ".unlock", true) +endEvent + +event OnOptionDefault(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int optionIndex = a_numArg as int + _activeConfig.ResetOption(optionIndex) + UI.InvokeBool(JOURNAL_MENU, MENU_ROOT + ".unlock", true) +endEvent + +event OnKeymapChange(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int optionIndex = a_numArg as int + int keyCode = UI.GetInt(JOURNAL_MENU, MENU_ROOT + ".selectedKeyCode") + + ; First test vanilla controls + string conflictControl = Input.GetMappedControl(keyCode) + string conflictName = "" + + ; Then test mod controls + int i = 0 + while (conflictControl == "" && i < _modConfigs.length) + if (_modConfigs[i] != none) + conflictControl = _modConfigs[i].GetCustomControl(keyCode) + if (conflictControl != "") + conflictName = _modNames[i] + endIf + endIf + + i += 1 + endWhile + + _activeConfig.RemapKey(optionIndex, keyCode, conflictControl, conflictName) + UI.InvokeBool(JOURNAL_MENU, MENU_ROOT + ".unlock", true) +endEvent + +event OnSliderSelect(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int optionIndex = a_numArg as int + _activeConfig.RequestSliderDialogData(optionIndex) +endEvent + +event OnSliderAccept(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + float value = a_numArg + _activeConfig.SetSliderValue(value) + UI.InvokeBool(JOURNAL_MENU, MENU_ROOT + ".unlock", true) +endEvent + +event OnMenuSelect(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int optionIndex = a_numArg as int + _activeConfig.RequestMenuDialogData(optionIndex) +endEvent + +event OnMenuAccept(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int value = a_numArg as int + _activeConfig.SetMenuIndex(value) + UI.InvokeBool(JOURNAL_MENU, MENU_ROOT + ".unlock", true) +endEvent + +event OnColorSelect(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int optionIndex = a_numArg as int + _activeConfig.RequestColorDialogData(optionIndex) +endEvent + +event OnColorAccept(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + int color = a_numArg as int + _activeConfig.SetColorValue(color) + UI.InvokeBool(JOURNAL_MENU, MENU_ROOT + ".unlock", true) +endEvent + +event OnDialogCancel(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + UI.InvokeBool(JOURNAL_MENU, MENU_ROOT + ".unlock", true) +endEvent + + +; FUNCTIONS --------------------------------------------------------------------------------------- + +; @interface +int function RegisterMod(SKI_ConfigBase a_menu, string a_modName) + GotoState("BUSY") + ;Log("Registering config menu: " + a_menu + "(" + a_modName + ")") + + if (_configCount >= 128) + GotoState("") + return -1 + endIf + + ; Already registered? + int i = 0 + while (i < _modConfigs.length) + if (_modConfigs[i] == a_menu) + GotoState("") + return i + endIf + + i += 1 + endWhile + + ; New registration + int configID = NextID() + + if (configID == -1) + GotoState("") + return -1 + endIf + + _modConfigs[configID] = a_menu + _modNames[configID] = a_modName + + _configCount += 1 + + ; Track mods added in the current cycle so we don't have to display one message per mod + _addCounter += 1 + + GotoState("") + + return configID +endFunction + +; @interface +int function UnregisterMod(SKI_ConfigBase a_menu) + GotoState("BUSY") + ;Log("Unregistering config menu: " + a_menu) + + int i = 0 + while (i < _modConfigs.length) + if (_modConfigs[i] == a_menu) + _modConfigs[i] = none + _modNames[i] = "" + _configCount -= 1 + + GotoState("") + return i + endIf + + i += 1 + endWhile + + GotoState("") + return -1 +endFunction + +; @interface +function ForceReset() + Log("Forcing config manager reset...") + SendModEvent("SKICP_configManagerReset") + + GotoState("BUSY") + + int i = 0 + while (i < _modConfigs.length) + _modConfigs[i] = none + _modNames[i] = "" + i += 1 + endWhile + + _curConfigID = 0 + _configCount = 0 + + GotoState("") + + SendModEvent("SKICP_configManagerReady") +endFunction + +function CleanUp() + GotoState("BUSY") + + _cleanupFlag = false + + _configCount = 0 + int i = 0 + while (i < _modConfigs.length) + if (_modConfigs[i] == none || _modConfigs[i].GetFormID() == 0) + _modConfigs[i] = none + _modNames[i] = "" + else + _configCount += 1 + endIf + + i += 1 + endWhile + + GotoState("") +endFunction + +int function NextID() + int startIdx = _curConfigID + + while (_modConfigs[_curConfigID] != none) + _curConfigID += 1 + if (_curConfigID >= 128) + _curConfigID = 0 + endIf + if (_curConfigID == startIdx) + return -1 ; Just to be sure. + endIf + endWhile + + return _curConfigID +endFunction + +function Log(string a_msg) + Debug.Trace(self + ": " + a_msg) +endFunction + + +; STATES --------------------------------------------------------------------------------------- + +state BUSY + int function RegisterMod(SKI_ConfigBase a_menu, string a_modName) + return -2 + endFunction + + int function UnregisterMod(SKI_ConfigBase a_menu) + return -2 + endFunction + + function ForceReset() + endFunction + + function CleanUp() + endFunction +endState \ No newline at end of file diff --git a/source/scripts/ski_configmenu.psc b/source/scripts/ski_configmenu.psc new file mode 100644 index 00000000..247310b1 --- /dev/null +++ b/source/scripts/ski_configmenu.psc @@ -0,0 +1,1969 @@ +scriptname SKI_ConfigMenu extends SKI_ConfigBase + +; SCRIPT VERSION ---------------------------------------------------------------------------------- +; +; History +; +; 1: - Initial version +; +; 2: - Added category icon theme option +; - Added noIconColor option +; - Added controls section for gamepad +; +; 3: - Added disable 3D item positioning option +; +; 4: - Converted script to use state options +; - Added map menu version check +; - Added active effects widget configuration +; +; 5: - Fixed 3DItemDisablePositioning +; +; 6: - Added favorites menu options +; +; 7: - Changed page layout +; +; 8: - Removed unsupported icon themes + +int function GetVersion() + return 8 +endFunction + + +; PRIVATE VARIABLES ------------------------------------------------------------------------------- + +; -- Version 1 -- + +; Lists +string[] _alignments +string[] _alignmentValues +string[] _sizes + +; State +int _itemlistFontSizeIdx = 1 +int _itemlistQuantityMinCount = 6 + +int _itemcardAlignIdx = 2 +float _itemcardXOffset = 0.0 +float _itemcardYOffset = 0.0 + +float _3DItemXOffset = 0.0 +float _3DItemYOffset = 0.0 +float _3DItemScale = 1.5 + +int _searchKey = 57 +int _switchTabKey = 56 +int _equipModeKey = 42 + +; Internal +float _itemXBase +float _itemXBaseW + + +; -- Version 2 -- + +; Lists +string[] _categoryIconThemeShortNames +string[] _categoryIconThemeLongNames +string[] _categoryIconThemeValues + +; State +int _categoryIconThemeIdx = 0 +bool _itemlistNoIconColors = false + +int _switchTabButton = 271 ; BACK +int _prevColumnButton = 274 ; LEFT_SHOULDER +int _nextColumnButton = 275 ; RIGHT_SHOULDER +int _sortOrderButton = 272 ; LEFT_THUMB + +; -- Version 3 -- + +; State +bool _3DItemDisablePositioning = false + +; Internal +float _fInventory3DItemPosXWide +float _fInventory3DItemPosX +float _fMagic3DItemPosXWide +float _fMagic3DItemPosX + +; Flags +int _3DItemFlags + +; -- Version 4 -- + +; Lists +string[] _orientations +string[] _orientationValues + +string[] _vertAlignments +string[] _vertAlignmentValues + +float[] _effectWidgetIconSizeValues + +float[] _alignmentBaseOffsets +float[] _vertAlignmentBaseOffsets + +; State +int _effectWidgetIconSizeIdx = 1 ; medium +int _effectWidgetVAnchorIdx = 0 ; top +int _effectWidgetHAnchorIdx = 1 ; right +int _effectWidgetGroupCount = 8 +int _effectWidgetOrientationIdx = 1 ; vertical +float _effectWidgetXOffset = 0.0 +float _effectWidgetYOffset = 0.0 + +; Flags +int _effectWidgetFlags + +; -- Version 5 -- + +; Internal +float _fInventory3DItemPosZWide +float _fInventory3DItemPosZ +float _fMagic3DItemPosZWide +float _fMagic3DItemPosZ + +float _fInventory3DItemPosScaleWide +float _fMagic3DItemPosScaleWide +float _fInventory3DItemPosScale +float _fMagic3DItemPosScale + +; -- Version 6 -- + +; Lists +string[] _favGroupNames + +; State +int _favCurGroupIdx = 0 + + +; PROPERTIES -------------------------------------------------------------------------------------- + +; -- Version 1 -- + +SKI_SettingsManager property SKI_SettingsManagerInstance auto +SKI_Main property SKI_MainInstance auto + +; -- Version 4 -- + +SKI_ActiveEffectsWidget property SKI_ActiveEffectsWidgetInstance auto + +; -- Version 6 -- + +SKI_FavoritesManager property SKI_FavoritesManagerInstance auto + + +; INITIALIZATION ---------------------------------------------------------------------------------- + +; @overrides SKI_ConfigBase +event OnConfigInit() + ; Translate strings to display in UI + _alignments = new string[3] + _alignments[0] = "$Left" + _alignments[1] = "$Right" + _alignments[2] = "$Center" + + _sizes = new string[3] + _sizes[0] = "$Small" + _sizes[1] = "$Medium" + _sizes[2] = "$Large" + + ; Strings used as variable values + _alignmentValues = new string[3] + _alignmentValues[0] = "left" + _alignmentValues[1] = "right" + _alignmentValues[2] = "center" + + ApplySettings() +endEvent + +; @implements SKI_QuestBase +event OnGameReload() + parent.OnGameReload() + ApplySettings() +endEvent + +; @implements SKI_QuestBase +event OnVersionUpdate(int a_version) + + ; Version 2 + if (a_version >= 2 && CurrentVersion < 2) + Debug.Trace(self + ": Updating to script version 2") + + _categoryIconThemeShortNames = new string[4] + _categoryIconThemeShortNames[0] = "SKYUI V3" + _categoryIconThemeShortNames[1] = "CELTIC" + _categoryIconThemeShortNames[2] = "CURVED" + _categoryIconThemeShortNames[3] = "STRAIGHT" + + _categoryIconThemeLongNames = new string[4] + _categoryIconThemeLongNames[0] = "SkyUI V3, by PsychoSteve" + _categoryIconThemeLongNames[1] = "Celtic, by GreatClone" + _categoryIconThemeLongNames[2] = "Curved, by T3T" + _categoryIconThemeLongNames[3] = "Straight, by T3T" + + _categoryIconThemeValues = new string[4] + _categoryIconThemeValues[0] = "skyui\\icons_category_psychosteve.swf" + _categoryIconThemeValues[1] = "skyui\\icons_category_celtic.swf" + _categoryIconThemeValues[2] = "skyui\\icons_category_curved.swf" + _categoryIconThemeValues[3] = "skyui\\icons_category_straight.swf" + + ; Have been renamed, so clear old overrides and set new ones + SKI_SettingsManagerInstance.ClearOverride("Input$controls$search") + SKI_SettingsManagerInstance.ClearOverride("Input$controls$switchTab") + SKI_SettingsManagerInstance.ClearOverride("Input$controls$equipMode") + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$search", _searchKey) + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$switchTab", _switchTabKey) + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$equipMode", _equipModeKey) + endIf + + if (a_version >= 3 && CurrentVersion < 3) + Debug.Trace(self + ": Updating to script version 3") + + _3DItemFlags = OPTION_FLAG_NONE + + ;The below all reset to true with version 3.2 + ;SKI_MainInstance.InventoryMenuCheckEnabled + ;SKI_MainInstance.MagicMenuCheckEnabled + ;SKI_MainInstance.BarterMenuCheckEnabled + ;SKI_MainInstance.ContainerMenuCheckEnabled + ;SKI_MainInstance.GiftMenuCheckEnabled + endIf + + if (a_version >= 4 && CurrentVersion < 4) + Debug.Trace(self + ": Updating to script version 4") + + _orientations = new string[2] + _orientations[0] = "$Horizontal" + _orientations[1] = "$Vertical" + + _orientationValues = new string[2] + _orientationValues[0] = "horizontal" + _orientationValues[1] = "vertical" + + _vertAlignments = new string[3] + _vertAlignments[0] = "$Top" + _vertAlignments[1] = "$Bottom" + _vertAlignments[2] = "$Center" + + _vertAlignmentValues = new string[3] + _vertAlignmentValues[0] = "top" + _vertAlignmentValues[1] = "bottom" + _vertAlignmentValues[2] = "center" + + _effectWidgetIconSizeValues = new float[3] + _effectWidgetIconSizeValues[0] = 32.0 + _effectWidgetIconSizeValues[1] = 48.0 + _effectWidgetIconSizeValues[2] = 64.0 + + _alignmentBaseOffsets = new float[3] + _alignmentBaseOffsets[0] = 0.0 + _alignmentBaseOffsets[1] = 1280.0 + _alignmentBaseOffsets[2] = 640.0 + + _vertAlignmentBaseOffsets = new float[3] + _vertAlignmentBaseOffsets[0] = 0.0 + _vertAlignmentBaseOffsets[1] = 720.0 + _vertAlignmentBaseOffsets[2] = 360.0 + + _effectWidgetFlags = OPTION_FLAG_NONE + + ; Sync widget default values + SKI_ActiveEffectsWidgetInstance.Enabled = true + SKI_ActiveEffectsWidgetInstance.EffectSize = _effectWidgetIconSizeValues[_effectWidgetIconSizeIdx] + SKI_ActiveEffectsWidgetInstance.HAnchor = _alignmentValues[_effectWidgetHAnchorIdx] + SKI_ActiveEffectsWidgetInstance.VAnchor = _vertAlignmentValues[_effectWidgetVAnchorIdx] + SKI_ActiveEffectsWidgetInstance.GroupEffectCount = _effectWidgetGroupCount + SKI_ActiveEffectsWidgetInstance.Orientation = _orientationValues[_effectWidgetOrientationIdx] + SKI_ActiveEffectsWidgetInstance.X = _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset + SKI_ActiveEffectsWidgetInstance.Y = _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset + endIf + + if (a_version >= 5 && CurrentVersion < 5) + Debug.Trace(self + ": Updating to script version 5") + endIf + + if (a_version >= 6 && CurrentVersion < 6) + Debug.Trace(self + ": Updating to script version 6") + + Pages = new string[3] + Pages[0] = "$General" + Pages[1] = "$Favorite Groups" + Pages[2] = "$Advanced" + + _favGroupNames = new string[8] + _favGroupNames[0] = "$Group {1}" + _favGroupNames[1] = "$Group {2}" + _favGroupNames[2] = "$Group {3}" + _favGroupNames[3] = "$Group {4}" + _favGroupNames[4] = "$Group {5}" + _favGroupNames[5] = "$Group {6}" + _favGroupNames[6] = "$Group {7}" + _favGroupNames[7] = "$Group {8}" + endIf + + if (a_version >= 7 && CurrentVersion < 7) + Debug.Trace(self + ": Updating to script version 7") + + Pages = new string[3] + Pages[0] = "$General" + Pages[1] = "$Controls" + Pages[2] = "$Advanced" + endIf + + if (a_version >= 8 && CurrentVersion < 8) + Debug.Trace(self + ": Updating to script version 8") + + _categoryIconThemeShortNames = new string[1] + _categoryIconThemeShortNames[0] = "SKYUI V5" + + _categoryIconThemeLongNames = new string[1] + _categoryIconThemeLongNames[0] = "SkyUI V5, by PsychoSteve" + + _categoryIconThemeValues = new string[1] + _categoryIconThemeValues[0] = "skyui\\icons_category_psychosteve.swf" + + _categoryIconThemeIdx = 0 + + SKI_SettingsManagerInstance.ClearOverride("Appearance$icons$category$source") + SKI_SettingsManagerInstance.SetOverride("Appearance$icons$category$source", _categoryIconThemeValues[_categoryIconThemeIdx]) + endIf + + +endEvent + + +; EVENTS ------------------------------------------------------------------------------------------ + +; @implements SKI_ConfigBase +event OnPageReset(string a_page) + + ; Load custom .swf for animated logo + if (a_page == "") + LoadCustomContent("skyui/skyui_splash.swf") + return + else + UnloadCustomContent() + endIf + + ; ------------------------------------------------------- + if (a_page == "$General") + SetCursorFillMode(TOP_TO_BOTTOM) + + AddHeaderOption("$Item List") + AddTextOptionST("ITEMLIST_FONT_SIZE", "$Font Size", _sizes[_itemlistFontSizeIdx]) + AddSliderOptionST("ITEMLIST_QUANTITY_MIN_COUNT", "$Quantity Menu Min. Count", _itemlistQuantityMinCount) + ;AddMenuOptionST("ITEMLIST_CATEGORY_ICON_THEME", "$Category Icon Theme", _categoryIconThemeShortNames[_categoryIconThemeIdx]) + AddToggleOptionST("ITEMLIST_NO_ICON_COLORS", "$Disable Icon Colors", _itemlistNoIconColors) + + AddEmptyOption() + + AddHeaderOption("$Active Effects HUD") + AddToggleOptionST("EFFECT_WIDGET_ENABLED", "$Enabled", SKI_ActiveEffectsWidgetInstance.Enabled) + AddTextOptionST("EFFECT_WIDGET_ICON_SIZE","$Icon Size", _sizes[_effectWidgetIconSizeIdx], _effectWidgetFlags) + AddSliderOptionST("EFFECT_WIDGET_MIN_TIME_LEFT", "$Minimum Time Left", SKI_ActiveEffectsWidgetInstance.MinimumTimeLeft, "{0} s", _effectWidgetFlags) + + SetCursorPosition(1) + + AddHeaderOption("$Favorites Menu") + AddToggleOptionST("FAV_MENU_HELP_ENABLED", "$Show Button Help", SKI_FavoritesManagerInstance.ButtonHelpEnabled) + + AddEmptyOption() + + int ARMOR_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR + int HANDS_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_HANDS + + AddHeaderOption("$Favorite Groups") + AddMenuOptionST("FAV_GROUP_SELECT", "", "$Group {" + (_favCurGroupIdx+1) + "}") + AddToggleOptionST("FAV_GROUP_UNEQUIP_ARMOR", "$Unequip Armor", SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, ARMOR_FLAG)) + AddToggleOptionST("FAV_GROUP_UNEQUIP_HANDS", "$Unequip Hands", SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, HANDS_FLAG)) + + ; ------------------------------------------------------- + elseIf (a_page == "$Controls") + + bool isGamepad = Game.UsingGamepad() + + SetCursorFillMode(TOP_TO_BOTTOM) + + AddHeaderOption("$Item List") + if (! isGamepad) + AddKeyMapOptionST("SEARCH_KEY", "$Search", _searchKey) + AddKeyMapOptionST("SWITCH_TAB_KEY", "$Switch Tab", _switchTabKey) + AddKeyMapOptionST("EQUIP_MODE_KEY", "$Equip Mode", _equipModeKey) + else + AddKeyMapOptionST("SEARCH_KEY", "$Search", _searchKey, OPTION_FLAG_DISABLED) + AddKeyMapOptionST("SWITCH_TAB_BUTTON", "$Switch Tab", _switchTabButton) + AddKeyMapOptionST("PREV_COLUMN_BUTTON", "$Previous Column", _prevColumnButton) + AddKeyMapOptionST("NEXT_COLUMN_BUTTON", "$Next Column", _nextColumnButton) + AddKeyMapOptionST("SORT_ORDER_BUTTON", "$Order", _sortOrderButton) + endIf + + if (! isGamepad) + AddEmptyOption() + + AddHeaderOption("$Favorites Menu") + AddKeyMapOptionST("FAV_GROUP_ADD_KEY", "{$Group}/{$Ungroup}", SKI_FavoritesManagerInstance.GroupAddKey) + AddKeyMapOptionST("FAV_GROUP_USE_KEY", "$Group Use", SKI_FavoritesManagerInstance.GroupUseKey) + AddKeyMapOptionST("FAV_SET_ICON_KEY", "$Set Group Icon", SKI_FavoritesManagerInstance.SetIconKey) + AddKeyMapOptionST("FAV_EQUIP_STATE_KEY", "$Save Equip State", SKI_FavoritesManagerInstance.SaveEquipStateKey) + AddKeyMapOptionST("FAV_TOGGLE_FOCUS", "$Toggle Focus", SKI_FavoritesManagerInstance.ToggleFocusKey) + endIf + + SetCursorPosition(1) + + int[] groupHotkeys = SKI_FavoritesManagerInstance.GetGroupHotkeys() + + AddHeaderOption("$Favorite Groups") + AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY1", "$Group {1}", groupHotkeys[0], OPTION_FLAG_WITH_UNMAP) + AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY2", "$Group {2}", groupHotkeys[1], OPTION_FLAG_WITH_UNMAP) + AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY3", "$Group {3}", groupHotkeys[2], OPTION_FLAG_WITH_UNMAP) + AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY4", "$Group {4}", groupHotkeys[3], OPTION_FLAG_WITH_UNMAP) + AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY5", "$Group {5}", groupHotkeys[4], OPTION_FLAG_WITH_UNMAP) + AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY6", "$Group {6}", groupHotkeys[5], OPTION_FLAG_WITH_UNMAP) + AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY7", "$Group {7}", groupHotkeys[6], OPTION_FLAG_WITH_UNMAP) + AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY8", "$Group {8}", groupHotkeys[7], OPTION_FLAG_WITH_UNMAP) + + ; ------------------------------------------------------- + elseIf (a_page == "$Advanced") + SetCursorFillMode(TOP_TO_BOTTOM) + + AddHeaderOption("$3D Item") + AddSliderOptionST("XD_ITEM_XOFFSET", "$Horizontal Offset", _3DItemXOffset, "{0}", _3DItemFlags) + AddSliderOptionST("XD_ITEM_YOFFSET", "$Vertical Offset", _3DItemYOffset, "{0}", _3DItemFlags) + AddSliderOptionST("XD_ITEM_SCALE", "$Scale", _3DItemScale, "{1}", _3DItemFlags) + AddToggleOptionST("XD_ITEM_POSITIONING", "$Disable Positioning", _3DItemDisablePositioning) + + AddEmptyOption() + + AddHeaderOption("$Active Effects HUD") + AddTextOptionST("EFFECT_WIDGET_ORIENTATION", "$Orientation", _orientations[_effectWidgetOrientationIdx], _effectWidgetFlags) + AddTextOptionST("EFFECT_WIDGET_HORIZONTAL_ANCHOR", "$Horizontal Anchor", _alignments[_effectWidgetHAnchorIdx], _effectWidgetFlags) + AddTextOptionST("EFFECT_WIDGET_VERTICAL_ANCHOR", "$Vertical Anchor", _vertAlignments[_effectWidgetVAnchorIdx], _effectWidgetFlags) + AddSliderOptionST("EFFECT_WIDGET_GROUP_COUNT", "$Icon Group Count", SKI_ActiveEffectsWidgetInstance.GroupEffectCount, "{0}", _effectWidgetFlags) + AddSliderOptionST("EFFECT_WIDGET_XOFFSET", "$Horizontal Offset", _effectWidgetXOffset, "{0}", _effectWidgetFlags) + AddSliderOptionST("EFFECT_WIDGET_YOFFSET", "$Vertical Offset", _effectWidgetYOffset, "{0}", _effectWidgetFlags) + + SetCursorPosition(1) + + AddHeaderOption("$Item Card") + AddTextOptionST("ITEMCARD_ALIGN", "$Align", _alignments[_itemcardAlignIdx]) + AddSliderOptionST("ITEMCARD_XOFFSET", "$Horizontal Offset", _itemcardXOffset) + AddSliderOptionST("ITEMCARD_YOFFSET", "$Vertical Offset", _itemcardYOffset) + + AddEmptyOption() + + AddHeaderOption("$SWF Version Checking") + AddToggleOptionST("CHECK_MAP_MENU", "Map Menu", SKI_MainInstance.MapMenuCheckEnabled) + AddToggleOptionST("CHECK_FAVORITES_MENU", "Favorites Menu", SKI_MainInstance.FavoritesMenuCheckEnabled) + AddToggleOptionST("CHECK_INVENTORY_MENU", "Inventory Menu", SKI_MainInstance.InventoryMenuCheckEnabled) + AddToggleOptionST("CHECK_MAGIC_MENU", "Magic Menu", SKI_MainInstance.MagicMenuCheckEnabled) + AddToggleOptionST("CHECK_BARTER_MENU", "Barter Menu", SKI_MainInstance.BarterMenuCheckEnabled) + AddToggleOptionST("CHECK_CONTAINER_MENU", "Container Menu", SKI_MainInstance.ContainerMenuCheckEnabled) + AddToggleOptionST("CHECK_CRAFTING_MENU", "Crafting Menu", SKI_MainInstance.CraftingMenuCheckEnabled) + AddToggleOptionST("CHECK_GIFT_MENU", "Gift Menu", SKI_MainInstance.GiftMenuCheckEnabled) + + endIf +endEvent + + +; STATE OPTIONS ----------------------------------------------------------------------------------- + +state FAV_GROUP_ADD_KEY ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, false)) + return + endIf + + SKI_FavoritesManagerInstance.GroupAddKey = a_keyCode + RefreshFavoriteHotkeys() + endEvent + + event OnDefaultST() + SKI_FavoritesManagerInstance.GroupAddKey = 33 + RefreshFavoriteHotkeys() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{F}") + endEvent + +endState + +state FAV_GROUP_USE_KEY ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, false)) + return + endIf + + SKI_FavoritesManagerInstance.GroupUseKey = a_keyCode + RefreshFavoriteHotkeys() + endEvent + + event OnDefaultST() + SKI_FavoritesManagerInstance.GroupUseKey = 19 + RefreshFavoriteHotkeys() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{R}") + endEvent + +endState + +state FAV_SET_ICON_KEY ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, false)) + return + endIf + + SKI_FavoritesManagerInstance.SetIconKey = a_keyCode + RefreshFavoriteHotkeys() + endEvent + + event OnDefaultST() + SKI_FavoritesManagerInstance.SetIconKey = 56 + RefreshFavoriteHotkeys() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{LAlt}") + endEvent + +endState + +state FAV_EQUIP_STATE_KEY ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, false)) + return + endIf + + SKI_FavoritesManagerInstance.SaveEquipStateKey = a_keyCode + RefreshFavoriteHotkeys() + endEvent + + event OnDefaultST() + SKI_FavoritesManagerInstance.SaveEquipStateKey = 20 + RefreshFavoriteHotkeys() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{T}") + endEvent + +endState + +state FAV_TOGGLE_FOCUS ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, false)) + return + endIf + + SKI_FavoritesManagerInstance.ToggleFocusKey = a_keyCode + RefreshFavoriteHotkeys() + endEvent + + event OnDefaultST() + SKI_FavoritesManagerInstance.ToggleFocusKey = 57 + RefreshFavoriteHotkeys() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{Space}") + endEvent + +endState + +state FAV_GROUP_USE_HOTKEY1 ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + SetFavoritesGroupHotkey(0, a_keyCode, a_conflictControl, a_conflictName) + endEvent + + event OnDefaultST() + SetFavoritesGroupHotkey(0, 59) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{F1}") + endEvent + +endState + +state FAV_GROUP_USE_HOTKEY2 ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + SetFavoritesGroupHotkey(1, a_keyCode, a_conflictControl, a_conflictName) + endEvent + + event OnDefaultST() + SetFavoritesGroupHotkey(1, 60) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{F2}") + endEvent + +endState + +state FAV_GROUP_USE_HOTKEY3 ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + SetFavoritesGroupHotkey(2, a_keyCode, a_conflictControl, a_conflictName) + endEvent + + event OnDefaultST() + SetFavoritesGroupHotkey(2, 61) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{F3}") + endEvent + +endState + +state FAV_GROUP_USE_HOTKEY4 ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + SetFavoritesGroupHotkey(3, a_keyCode, a_conflictControl, a_conflictName) + endEvent + + event OnDefaultST() + SetFavoritesGroupHotkey(3, 62) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{F4}") + endEvent + +endState + +state FAV_GROUP_USE_HOTKEY5 ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + SetFavoritesGroupHotkey(4, a_keyCode, a_conflictControl, a_conflictName) + endEvent + + event OnDefaultST() + SetFavoritesGroupHotkey(4, -1) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{$Off}") + endEvent + +endState + +state FAV_GROUP_USE_HOTKEY6 ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + SetFavoritesGroupHotkey(5, a_keyCode, a_conflictControl, a_conflictName) + endEvent + + event OnDefaultST() + SetFavoritesGroupHotkey(5, -1) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{$Off}") + endEvent + +endState + +state FAV_GROUP_USE_HOTKEY7 ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + SetFavoritesGroupHotkey(6, a_keyCode, a_conflictControl, a_conflictName) + endEvent + + event OnDefaultST() + SetFavoritesGroupHotkey(6, -1) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{$Off}") + endEvent + +endState + +state FAV_GROUP_USE_HOTKEY8 ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + SetFavoritesGroupHotkey(7, a_keyCode, a_conflictControl, a_conflictName) + endEvent + + event OnDefaultST() + SetFavoritesGroupHotkey(7, -1) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{$Off}") + endEvent + +endState + +state FAV_MENU_HELP_ENABLED ; TOGGLE + + event OnSelectST() + bool newVal = !SKI_FavoritesManagerInstance.ButtonHelpEnabled + SKI_FavoritesManagerInstance.ButtonHelpEnabled = newVal + + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_FavoritesManagerInstance.ButtonHelpEnabled = true + + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{$On}") + endEvent + +endState + +state FAV_GROUP_SELECT ; MENU + + event OnMenuOpenST() + SetMenuDialogStartIndex(_favCurGroupIdx) + SetMenuDialogDefaultIndex(0) + SetMenuDialogOptions(_favGroupNames) + endEvent + + event OnMenuAcceptST(int a_index) + _favCurGroupIdx = a_index + + SetCurrentFavoriteGroup(_favCurGroupIdx) + + SetMenuOptionValueST(_favGroupNames[_favCurGroupIdx]) + endEvent + + event OnDefaultST() + _favCurGroupIdx = 0 + + SetCurrentFavoriteGroup(_favCurGroupIdx) + + SetTextOptionValueST(_favCurGroupIdx+1) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO6") + endEvent + +endState + +state FAV_GROUP_UNEQUIP_ARMOR ; TOGGLE + + event OnSelectST() + int ARMOR_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR + + bool newVal = !SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, ARMOR_FLAG) + SKI_FavoritesManagerInstance.SetGroupFlag(_favCurGroupIdx, ARMOR_FLAG, newVal) + + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + int ARMOR_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR + + SKI_FavoritesManagerInstance.SetGroupFlag(_favCurGroupIdx, ARMOR_FLAG, false) + + SetToggleOptionValueST(false) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO7{$Off}") + endEvent + +endState + +state FAV_GROUP_UNEQUIP_HANDS ; TOGGLE + + event OnSelectST() + int HANDS_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_HANDS + + bool newVal = !SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, HANDS_FLAG) + SKI_FavoritesManagerInstance.SetGroupFlag(_favCurGroupIdx, HANDS_FLAG, newVal) + + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + int HANDS_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR + + SKI_FavoritesManagerInstance.SetGroupFlag(_favCurGroupIdx, HANDS_FLAG, false) + + SetToggleOptionValueST(false) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO8{$Off}") + endEvent + +endState + +; ------------------------------------------------------- + +state ITEMLIST_FONT_SIZE ; TEXT + + event OnSelectST() + if (_itemlistFontSizeIdx < _sizes.length - 1) + _itemlistFontSizeIdx += 1 + else + _itemlistFontSizeIdx = 0 + endif + SetTextOptionValueST(_sizes[_itemlistFontSizeIdx]) + ApplyItemListFontSize() + endEvent + + event OnDefaultST() + _itemlistFontSizeIdx = 1 + SetTextOptionValueST(_sizes[_itemlistFontSizeIdx]) + ApplyItemListFontSize() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{" + _sizes[1] + "}") + endEvent + +endState + +state ITEMLIST_QUANTITY_MIN_COUNT ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(_itemlistQuantityMinCount) + SetSliderDialogDefaultValue(6) + SetSliderDialogRange(0, 100) + SetSliderDialogInterval(1) + endEvent + + event OnSliderAcceptST(float a_value) + _itemlistQuantityMinCount = a_value as int + SetSliderOptionValueST(_itemlistQuantityMinCount) + SKI_SettingsManagerInstance.SetOverride("ItemList$quantityMenu$minCount", _itemlistQuantityMinCount) + endEvent + + event OnDefaultST() + _itemlistQuantityMinCount = 6 + SetSliderOptionValueST(_itemlistQuantityMinCount) + SKI_SettingsManagerInstance.SetOverride("ItemList$quantityMenu$minCount", _itemlistQuantityMinCount) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO2{6}") + endEvent + +endState + +state ITEMLIST_CATEGORY_ICON_THEME ; MENU + + event OnMenuOpenST() + SetMenuDialogStartIndex(_categoryIconThemeIdx) + SetMenuDialogDefaultIndex(0) + SetMenuDialogOptions(_categoryIconThemeLongNames) + endEvent + + event OnMenuAcceptST(int a_index) + _categoryIconThemeIdx = a_index + SetMenuOptionValueST(_categoryIconThemeShortNames[_categoryIconThemeIdx]) + SKI_SettingsManagerInstance.SetOverride("Appearance$icons$category$source", _categoryIconThemeValues[_categoryIconThemeIdx]) + endEvent + + event OnDefaultST() + _categoryIconThemeIdx = 0 + SetTextOptionValueST(_categoryIconThemeShortNames[_categoryIconThemeIdx]) + SKI_SettingsManagerInstance.SetOverride("Appearance$icons$category$source", _categoryIconThemeValues[_categoryIconThemeIdx]) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{" + _categoryIconThemeShortNames[0] + "}") + endEvent + +endState + +state ITEMLIST_NO_ICON_COLORS ; TOGGLE + + event OnSelectST() + _itemListNoIconColors = !_itemlistNoIconColors + SetToggleOptionValueST(_itemlistNoIconColors) + SKI_SettingsManagerInstance.SetOverride("Appearance$icons$item$noColor", _itemlistNoIconColors) + endEvent + + event OnDefaultST() + _itemlistNoIconColors = false + SetToggleOptionValueST(_itemlistNoIconColors) + SKI_SettingsManagerInstance.SetOverride("Appearance$icons$item$noColor", _itemlistNoIconColors) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{$Off}") + endEvent + +endState + +; ------------------------------------------------------- + +state EFFECT_WIDGET_ENABLED ; TOGGLE + + event OnSelectST() + bool newVal = !SKI_ActiveEffectsWidgetInstance.Enabled + SKI_ActiveEffectsWidgetInstance.Enabled = newVal + + if (newVal) + _effectWidgetFlags = OPTION_FLAG_NONE + else + _effectWidgetFlags = OPTION_FLAG_DISABLED + endIf + + SetOptionFlagsST(_effectWidgetFlags, true, "EFFECT_WIDGET_ICON_SIZE") + SetOptionFlagsST(_effectWidgetFlags, true, "EFFECT_WIDGET_MIN_TIME_LEFT") + + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_ActiveEffectsWidgetInstance.Enabled = true + + _effectWidgetFlags = OPTION_FLAG_NONE + + SetOptionFlagsST(_effectWidgetFlags, true, "EFFECT_WIDGET_ICON_SIZE") + SetOptionFlagsST(_effectWidgetFlags, true, "EFFECT_WIDGET_MIN_TIME_LEFT") + + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{$On}") + endEvent + +endState + +state EFFECT_WIDGET_ICON_SIZE ; TEXT + + event OnSelectST() + if (_effectWidgetIconSizeIdx < _sizes.length - 1) + _effectWidgetIconSizeIdx += 1 + else + _effectWidgetIconSizeIdx = 0 + endIf + + SKI_ActiveEffectsWidgetInstance.EffectSize = _effectWidgetIconSizeValues[_effectWidgetIconSizeIdx] + SetTextOptionValueST(_sizes[_effectWidgetIconSizeIdx]) + endEvent + + event OnDefaultST() + _effectWidgetIconSizeIdx = 1 + SKI_ActiveEffectsWidgetInstance.EffectSize = _effectWidgetIconSizeValues[_effectWidgetIconSizeIdx] + SetTextOptionValueST(_sizes[_effectWidgetIconSizeIdx]) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{" + _sizes[1] + "}") + endEvent + +endState + +state EFFECT_WIDGET_ORIENTATION ; TEXT + + event OnSelectST() + if (_effectWidgetOrientationIdx < _orientations.length - 1) + _effectWidgetOrientationIdx += 1 + else + _effectWidgetOrientationIdx = 0 + endIf + + SKI_ActiveEffectsWidgetInstance.Orientation = _orientationValues[_effectWidgetOrientationIdx] + SetTextOptionValueST(_orientations[_effectWidgetOrientationIdx]) + endEvent + + event OnDefaultST() + _effectWidgetOrientationIdx = 1 + SKI_ActiveEffectsWidgetInstance.Orientation = _orientationValues[_effectWidgetOrientationIdx] + SetTextOptionValueST(_orientations[_effectWidgetOrientationIdx]) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{" + _orientations[1] + "}") + endEvent + +endState + +state EFFECT_WIDGET_HORIZONTAL_ANCHOR ; TEXT + + event OnSelectST() + if (_effectWidgetHAnchorIdx < _alignments.length - 1) + _effectWidgetHAnchorIdx += 1 + else + _effectWidgetHAnchorIdx = 0 + endIf + + SKI_ActiveEffectsWidgetInstance.HAnchor = _alignmentValues[_effectWidgetHAnchorIdx] + SKI_ActiveEffectsWidgetInstance.X = _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset + SetTextOptionValueST(_alignments[_effectWidgetHAnchorIdx]) + endEvent + + event OnDefaultST() + _effectWidgetVAnchorIdx = 1 + SKI_ActiveEffectsWidgetInstance.X = _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset + SetTextOptionValueST(_alignments[_effectWidgetHAnchorIdx]) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{" + _alignments[1] + "}") + endEvent + +endState + +state EFFECT_WIDGET_VERTICAL_ANCHOR ; TEXT + + event OnSelectST() + if (_effectWidgetVAnchorIdx < _vertAlignments.length - 1) + _effectWidgetVAnchorIdx += 1 + else + _effectWidgetVAnchorIdx = 0 + endIf + + SKI_ActiveEffectsWidgetInstance.VAnchor = _vertAlignmentValues[_effectWidgetVAnchorIdx] + SKI_ActiveEffectsWidgetInstance.Y = _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset + SetTextOptionValueST(_vertAlignments[_effectWidgetVAnchorIdx]) + endEvent + + event OnDefaultST() + _effectWidgetVAnchorIdx = 0 + SKI_ActiveEffectsWidgetInstance.Y = _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset + SetTextOptionValueST(_vertAlignments[_effectWidgetVAnchorIdx]) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{" + _vertAlignments[0] + "}") + endEvent + +endState + +state EFFECT_WIDGET_MIN_TIME_LEFT ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(SKI_ActiveEffectsWidgetInstance.MinimumTimeLeft) + SetSliderDialogDefaultValue(180) + SetSliderDialogRange(0, 600) + SetSliderDialogInterval(10) + endEvent + + event OnSliderAcceptST(float a_value) + SKI_ActiveEffectsWidgetInstance.MinimumTimeLeft = a_value as int + SetSliderOptionValueST(a_value as int, "{0} s") + endEvent + + event OnDefaultST() + SKI_ActiveEffectsWidgetInstance.MinimumTimeLeft = 180 + SetSliderOptionValueST(180) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO5{180}") + endEvent + +endState + +state EFFECT_WIDGET_GROUP_COUNT ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(SKI_ActiveEffectsWidgetInstance.GroupEffectCount) + SetSliderDialogDefaultValue(8) + SetSliderDialogRange(1, 16) + SetSliderDialogInterval(1) + endEvent + + event OnSliderAcceptST(float a_value) + SKI_ActiveEffectsWidgetInstance.GroupEffectCount = a_value as int + SetSliderOptionValueST(a_value as int) + endEvent + + event OnDefaultST() + SKI_ActiveEffectsWidgetInstance.GroupEffectCount = 8 + SetSliderOptionValueST(8) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{8}") + endEvent + +endState + +state EFFECT_WIDGET_XOFFSET ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(_effectWidgetXOffset) + SetSliderDialogDefaultValue(0) + SetSliderDialogRange(-1280, 1280) + SetSliderDialogInterval(1) + endEvent + + event OnSliderAcceptST(float a_value) + _effectWidgetXOffset = a_value + SKI_ActiveEffectsWidgetInstance.X = _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset + SetSliderOptionValueST(_effectWidgetXOffset) + endEvent + + event OnDefaultST() + _effectWidgetXOffset = 0.0 + SKI_ActiveEffectsWidgetInstance.X = _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset + SetSliderOptionValueST(_effectWidgetXOffset) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{0}") + endEvent + +endState + +state EFFECT_WIDGET_YOFFSET ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(_effectWidgetYOffset) + SetSliderDialogDefaultValue(0) + SetSliderDialogRange(-720, 720) + SetSliderDialogInterval(1) + endEvent + + event OnSliderAcceptST(float a_value) + _effectWidgetYOffset = a_value + SKI_ActiveEffectsWidgetInstance.Y = _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset + SetSliderOptionValueST(_effectWidgetYOffset) + endEvent + + event OnDefaultST() + _effectWidgetYOffset = 0.0 + SKI_ActiveEffectsWidgetInstance.Y = _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset + SetSliderOptionValueST(_effectWidgetYOffset) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{0}") + endEvent + +endState + +; ------------------------------------------------------- + +state SEARCH_KEY ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, false)) + return + endIf + + SwapItemListKey(a_keyCode, _searchKey) + + _searchKey = a_keyCode + SetKeyMapOptionValueST(_searchKey) + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$search", _searchKey) + endEvent + + event OnDefaultST() + _searchKey = 57 + SetKeyMapOptionValueST(_searchKey) + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$search", _searchKey) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{Space}") + endEvent + +endState + +state SWITCH_TAB_KEY ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, false)) + return + endIf + + SwapItemListKey(a_keyCode, _switchTabKey) + + _switchTabKey = a_keyCode + SetKeyMapOptionValueST(_switchTabKey) + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$switchTab", _switchTabKey) + endEvent + + event OnDefaultST() + _switchTabKey = 56 + SetKeyMapOptionValueST(_switchTabKey) + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$switchTab", _switchTabKey) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{LAlt}") + endEvent + +endState + +state EQUIP_MODE_KEY ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, false)) + return + endIf + + SwapItemListKey(a_keyCode, _equipModeKey) + + _equipModeKey = a_keyCode + SetKeyMapOptionValueST(_equipModeKey) + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$equipMode", _equipModeKey) + endEvent + + event OnDefaultST() + _equipModeKey = 42 + SetKeyMapOptionValueST(_equipModeKey) + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$equipMode", _equipModeKey) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{Shift}") + endEvent + +endState + +state SWITCH_TAB_BUTTON ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, true)) + return + endIf + + SwapItemListKey(a_keyCode, _switchTabButton) + + _switchTabButton = a_keyCode + SetKeyMapOptionValueST(_switchTabButton) + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$switchTab", _switchTabButton) + endEvent + + event OnDefaultST() + _switchTabButton = 271 + SetKeyMapOptionValueST(_switchTabButton) + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$switchTab", _switchTabButton) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{Back}") + endEvent + +endState + +state PREV_COLUMN_BUTTON ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, true)) + return + endIf + + SwapItemListKey(a_keyCode, _prevColumnButton) + + _prevColumnButton = a_keyCode + SetKeyMapOptionValueST(_prevColumnButton) + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$prevColumn", _prevColumnButton) + endEvent + + event OnDefaultST() + _prevColumnButton = 274 + SetKeyMapOptionValueST(_prevColumnButton) + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$prevColumn", _prevColumnButton) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{LB}") + endEvent + +endState + +state NEXT_COLUMN_BUTTON ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, true)) + return + endIf + + SwapItemListKey(a_keyCode, _nextColumnButton) + + _nextColumnButton = a_keyCode + SetKeyMapOptionValueST(_nextColumnButton) + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$nextColumn", _nextColumnButton) + endEvent + + event OnDefaultST() + _nextColumnButton = 275 + SetKeyMapOptionValueST(_nextColumnButton) + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$nextColumn", _nextColumnButton) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{RB}") + endEvent + +endState + +state SORT_ORDER_BUTTON ; KEYMAP + + event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName) + if (! ValidateKey(a_keyCode, true)) + return + endIf + + SwapItemListKey(a_keyCode, _sortOrderButton) + + _sortOrderButton = a_keyCode + SetKeyMapOptionValueST(_sortOrderButton) + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$sortOrder", _sortOrderButton) + endEvent + + event OnDefaultST() + _sortOrderButton = 272 + SetKeyMapOptionValueST(_sortOrderButton) + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$sortOrder", _sortOrderButton) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{LS}") + endEvent + +endState + +; ------------------------------------------------------- + +state ITEMCARD_ALIGN ; KEYMAP + + event OnSelectST() + if (_itemcardAlignIdx < _alignments.length - 1) + _itemcardAlignIdx += 1 + else + _itemcardAlignIdx = 0 + endif + SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$align", _alignmentValues[_itemcardAlignIdx]) + SetTextOptionValueST(_alignments[_itemcardAlignIdx]) + endEvent + + event OnDefaultST() + _itemcardAlignIdx = 2 + SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$align", _alignmentValues[_itemcardAlignIdx]) + SetTextOptionValueST(_alignments[_itemcardAlignIdx]) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{" + _alignments[2] + "}") + endEvent + +endState + +state ITEMCARD_XOFFSET ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(_itemcardXOffset) + SetSliderDialogDefaultValue(0) + SetSliderDialogRange(-1000, 1000) + SetSliderDialogInterval(1) + endEvent + + event OnSliderAcceptST(float a_value) + _itemcardXOffset = a_value + SetSliderOptionValueST(_itemcardXOffset) + SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$xOffset", _itemcardXOffset) + endEvent + + event OnDefaultST() + _itemcardXOffset = 0.0 + SetSliderOptionValueST(_itemcardXOffset) + SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$xOffset", _itemcardXOffset) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{0}") + endEvent + +endState + +state ITEMCARD_YOFFSET ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(_itemcardYOffset) + SetSliderDialogDefaultValue(0) + SetSliderDialogRange(-1000, 1000) + SetSliderDialogInterval(1) + endEvent + + event OnSliderAcceptST(float a_value) + _itemcardYOffset = a_value + SetSliderOptionValueST(_itemcardYOffset) + SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$yOffset", _itemcardYOffset) + endEvent + + event OnDefaultST() + _itemcardYOffset = 0.0 + SetSliderOptionValueST(_itemcardYOffset) + SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$yOffset", _itemcardYOffset) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{0}") + endEvent + +endState + +; ------------------------------------------------------- + +state XD_ITEM_XOFFSET ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(_3DItemXOffset) + SetSliderDialogDefaultValue(0) + SetSliderDialogRange(-128, 128) + SetSliderDialogInterval(1) + endEvent + + event OnSliderAcceptST(float a_value) + _3DItemXOffset = a_value + SetSliderOptionValueST(_3DItemXOffset) + Apply3DItemXOffset() + endEvent + + event OnDefaultST() + _3DItemXOffset = 0.0 + SetSliderOptionValueST(_3DItemXOffset) + Apply3DItemXOffset() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{0}") + endEvent + +endState + +state XD_ITEM_YOFFSET ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(_3DItemYOffset) + SetSliderDialogDefaultValue(0) + SetSliderDialogRange(-128, 128) + SetSliderDialogInterval(1) + endEvent + + event OnSliderAcceptST(float a_value) + _3DItemYOffset = a_value + SetSliderOptionValueST(_3DItemYOffset) + Apply3DItemYOffset() + endEvent + + event OnDefaultST() + _3DItemYOffset = 0.0 + SetSliderOptionValueST(_3DItemYOffset) + Apply3DItemYOffset() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{0}") + endEvent + +endState + +state XD_ITEM_SCALE ; SLIDER + + event OnSliderOpenST() + SetSliderDialogStartValue(_3DItemScale) + SetSliderDialogDefaultValue(1.5) + SetSliderDialogRange(0.5, 5) + SetSliderDialogInterval(0.1) + endEvent + + event OnSliderAcceptST(float a_value) + _3DItemScale = a_value + SetSliderOptionValueST(_3DItemScale, "{1}") + Apply3DItemScale() + endEvent + + event OnDefaultST() + _3DItemScale = 1.5 + SetSliderOptionValueST(_3DItemScale, "{1}") + Apply3DItemScale() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO1{1.5}") + endEvent + +endState + +state XD_ITEM_POSITIONING ; SLIDER + + event OnSelectST() + bool newVal = !_3DItemDisablePositioning + _3DItemDisablePositioning = newVal + + if (newVal) + _3DItemFlags = OPTION_FLAG_DISABLED + else + _3DItemFlags = OPTION_FLAG_NONE + endIf + + SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_XOFFSET") + SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_YOFFSET") + SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_SCALE") + SetToggleOptionValueST(newVal) + Apply3DItemXOffset() + Apply3DItemYOffset() + Apply3DItemScale() + endEvent + + event OnDefaultST() + _3DItemDisablePositioning = false + _3DItemFlags = OPTION_FLAG_NONE + SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_XOFFSET") + SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_YOFFSET") + SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_SCALE") + SetToggleOptionValueST(false) + Apply3DItemXOffset() + Apply3DItemYOffset() + Apply3DItemScale() + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO4{$Off}") + endEvent + +endState + +; ------------------------------------------------------- + +state CHECK_INVENTORY_MENU ; SLIDER + + event OnSelectST() + bool newVal = !SKI_MainInstance.InventoryMenuCheckEnabled + SKI_MainInstance.InventoryMenuCheckEnabled = newVal + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_MainInstance.InventoryMenuCheckEnabled = true + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO3{$On}") + endEvent + +endState + +state CHECK_MAGIC_MENU ; SLIDER + + event OnSelectST() + bool newVal = !SKI_MainInstance.MagicMenuCheckEnabled + SKI_MainInstance.MagicMenuCheckEnabled = newVal + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_MainInstance.MagicMenuCheckEnabled = true + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO3{$On}") + endEvent + +endState + +state CHECK_BARTER_MENU ; SLIDER + + event OnSelectST() + bool newVal = !SKI_MainInstance.BarterMenuCheckEnabled + SKI_MainInstance.BarterMenuCheckEnabled = newVal + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_MainInstance.BarterMenuCheckEnabled = true + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO3{$On}") + endEvent + +endState + +state CHECK_CONTAINER_MENU ; SLIDER + + event OnSelectST() + bool newVal = !SKI_MainInstance.ContainerMenuCheckEnabled + SKI_MainInstance.ContainerMenuCheckEnabled = newVal + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_MainInstance.ContainerMenuCheckEnabled = true + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO3{$On}") + endEvent + +endState + +state CHECK_GIFT_MENU ; SLIDER + + event OnSelectST() + bool newVal = !SKI_MainInstance.GiftMenuCheckEnabled + SKI_MainInstance.GiftMenuCheckEnabled = newVal + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_MainInstance.GiftMenuCheckEnabled = true + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO3{$On}") + endEvent + +endState + +state CHECK_MAP_MENU ; SLIDER + + event OnSelectST() + bool newVal = !SKI_MainInstance.MapMenuCheckEnabled + SKI_MainInstance.MapMenuCheckEnabled = newVal + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_MainInstance.MapMenuCheckEnabled = true + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO3{$On}") + endEvent + +endState + +state CHECK_FAVORITES_MENU ; SLIDER + + event OnSelectST() + bool newVal = !SKI_MainInstance.FavoritesMenuCheckEnabled + SKI_MainInstance.FavoritesMenuCheckEnabled = newVal + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_MainInstance.FavoritesMenuCheckEnabled = true + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO3{$On}") + endEvent + +endState + +state CHECK_CRAFTING_MENU ; SLIDER + + event OnSelectST() + bool newVal = !SKI_MainInstance.CraftingMenuCheckEnabled + SKI_MainInstance.CraftingMenuCheckEnabled = newVal + SetToggleOptionValueST(newVal) + endEvent + + event OnDefaultST() + SKI_MainInstance.CraftingMenuCheckEnabled = true + SetToggleOptionValueST(true) + endEvent + + event OnHighlightST() + SetInfoText("$SKI_INFO3{$On}") + endEvent + +endState + + +; FUNCTIONS --------------------------------------------------------------------------------------- + +; @interface +string function GetCustomControl(int a_keyCode) + int[] groupHotkeys = SKI_FavoritesManagerInstance.GetGroupHotkeys() + + int index = groupHotkeys.Find(a_keyCode) + if (index != -1) + return ("Group " + (index+1)) + endIf + + return "" +endFunction + +function ApplySettings() + ; Apply settings that aren't handled by SKI_SettingsManagerInstance + + _fInventory3DItemPosXWide = Utility.GetINIFloat("fInventory3DItemPosXWide:Interface") + _fInventory3DItemPosX = Utility.GetINIFloat("fInventory3DItemPosX:Interface") + _fMagic3DItemPosXWide = Utility.GetINIFloat("fMagic3DItemPosXWide:Interface") + _fMagic3DItemPosX = Utility.GetINIFloat("fMagic3DItemPosX:Interface") + + _fInventory3DItemPosZWide = Utility.GetINIFloat("fInventory3DItemPosZWide:Interface") + _fInventory3DItemPosZ = Utility.GetINIFloat("fInventory3DItemPosZ:Interface") + _fMagic3DItemPosZWide = Utility.GetINIFloat("fMagic3DItemPosZWide:Interface") + _fMagic3DItemPosZ = Utility.GetINIFloat("fMagic3DItemPosZ:Interface") + + _fInventory3DItemPosScaleWide = Utility.GetINIFloat("fInventory3DItemPosScaleWide:Interface") + _fMagic3DItemPosScaleWide = Utility.GetINIFloat("fMagic3DItemPosScaleWide:Interface") + _fInventory3DItemPosScale = Utility.GetINIFloat("fInventory3DItemPosScale:Interface") + _fMagic3DItemPosScale = Utility.GetINIFloat("fMagic3DItemPosScale:Interface") + + float h = Utility.GetINIInt("iSize H:Display") + float w = Utility.GetINIInt("iSize W:Display") + float ar = w / h + + ; Widescreen + if (ar == 1.6) ; 16:10, 1920×1200 + _itemXBaseW = -32.458335876465 + else + _itemXBaseW = -29.122497558594 + endIf + + ; Non-widescreen + if (ar == 1.25) ; 5:4, 1280x1024 + _itemXBase = -41.622497558594 + else + _itemXBase = -39.122497558594 + endIf + + Apply3DItemXOffset() + Apply3DItemYOffset() + Apply3DItemScale() +endFunction + +function ApplyItemListFontSize() + ; Small + if (_itemlistFontSizeIdx == 0) + SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$label$textFormat$size", "12") + SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$entry$textFormat$size", "13") + SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$n_iconSize$value", "16") + SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$a_textBorder$value", "<0, 0, 0.3, 0>") + SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$indent", "-25") + SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$border", "<0, 10, 2, 2>") + SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$iconColumn$border", "<0, 3, 2, 2>") + ; Medium + elseIf (_itemlistFontSizeIdx == 1) + SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$label$textFormat$size", "12") + SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$entry$textFormat$size", "14") + SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$n_iconSize$value", "18") + SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$a_textBorder$value", "<0, 0, 1.1, 0>") + SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$indent", "-28") + SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$border", "<0, 10, 3, 3>") + SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$iconColumn$border", "<0, 3, 3, 3>") + ; Large + else + SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$label$textFormat$size", "14") + SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$entry$textFormat$size", "18") + SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$n_iconSize$value", "20") + SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$a_textBorder$value", "<0, 0, 0.4, 0>") + SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$indent", "-30") + SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$border", "<0, 10, 3.2, 3.2>") + SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$iconColumn$border", "<0, 4, 3.2, 3.2>") + endIf +endFunction + +function Apply3DItemXOffset() + ; Negative values shift the 3D item to the right + if (_3DItemDisablePositioning) + Utility.SetINIFloat("fInventory3DItemPosXWide:Interface", _fInventory3DItemPosXWide) + Utility.SetINIFloat("fInventory3DItemPosX:Interface", _fInventory3DItemPosX) + Utility.SetINIFloat("fMagic3DItemPosXWide:Interface", _fMagic3DItemPosXWide) + Utility.SetINIFloat("fMagic3DItemPosX:Interface", _fMagic3DItemPosX) + else + Utility.SetINIFloat("fInventory3DItemPosXWide:Interface", (_itemXBaseW + _3DItemXOffset)) + Utility.SetINIFloat("fInventory3DItemPosX:Interface", (_itemXBase + _3DItemXOffset)) + Utility.SetINIFloat("fMagic3DItemPosXWide:Interface", (_itemXBaseW + _3DItemXOffset)) + Utility.SetINIFloat("fMagic3DItemPosX:Interface", (_itemXBase + _3DItemXOffset)) + endIf +endFunction + +function Apply3DItemYOffset() + ; Negative values shift the 3D item to the bottom + if (_3DItemDisablePositioning) + Utility.SetINIFloat("fInventory3DItemPosZWide:Interface", _fInventory3DItemPosZWide) + Utility.SetINIFloat("fInventory3DItemPosZ:Interface", _fInventory3DItemPosZ) + Utility.SetINIFloat("fMagic3DItemPosZWide:Interface", _fMagic3DItemPosZWide) + Utility.SetINIFloat("fMagic3DItemPosZ:Interface", _fMagic3DItemPosZ) + else + Utility.SetINIFloat("fInventory3DItemPosZWide:Interface", (12 + _3DItemYOffset)) + Utility.SetINIFloat("fInventory3DItemPosZ:Interface", (16 + _3DItemYOffset)) + Utility.SetINIFloat("fMagic3DItemPosZWide:Interface", (12 + _3DItemYOffset)) + Utility.SetINIFloat("fMagic3DItemPosZ:Interface", (16 + _3DItemYOffset)) + endIf +endFunction + +function Apply3DItemScale() + if (_3DItemDisablePositioning) + Utility.SetINIFloat("fInventory3DItemPosScaleWide:Interface", _fInventory3DItemPosScaleWide) + Utility.SetINIFloat("fMagic3DItemPosScaleWide:Interface", _fMagic3DItemPosScaleWide) + Utility.SetINIFloat("fInventory3DItemPosScale:Interface", _fInventory3DItemPosScale) + Utility.SetINIFloat("fMagic3DItemPosScale:Interface", _fMagic3DItemPosScale) + else + Utility.SetINIFloat("fInventory3DItemPosScaleWide:Interface", _3DItemScale) + Utility.SetINIFloat("fMagic3DItemPosScaleWide:Interface", _3DItemScale) + Utility.SetINIFloat("fInventory3DItemPosScale:Interface", _3DItemScale) + Utility.SetINIFloat("fMagic3DItemPosScale:Interface", _3DItemScale) + endIf +endFunction + +bool function ValidateKey(int a_keyCode, bool a_gamepad) + ; Do nothing for ESC + if (a_keyCode == 1) + return false + endIf + + bool isGamepad = Game.UsingGamepad() + + if (isGamepad != a_gamepad) + return false + endIf + + if (!isGamepad) + ; Can't detect for mouse, don't need for gamepad + if (a_keyCode > 255) + ShowMessage("$SKI_MSG1", false, "$OK") + return false + endIf + else + ; If you removed the gamepad while in this menu, ignore other keys + if (a_keyCode < 266) + return false + endIf + endIf + + return true +endFunction + +function SwapItemListKey(int a_newKey, int a_curKey) + if (a_newKey == _searchKey) + _searchKey = a_curKey + SetKeyMapOptionValueST(_searchKey, true, "SEARCH_KEY") + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$search", _searchKey) + elseIf (a_newKey == _switchTabKey) + _switchTabKey = a_curKey + SetKeyMapOptionValueST(_switchTabKey, true, "SWITCH_TAB_KEY") + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$switchTab", _switchTabKey) + elseIf (a_newKey == _equipModeKey) + _equipModeKey = a_curKey + SetKeyMapOptionValueST(_equipModeKey, true, "EQUIP_MODE_KEY") + SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$equipMode", _equipModeKey) + + elseIf (a_newKey == _switchTabButton) + _switchTabButton = a_curKey + SetKeyMapOptionValueST(_switchTabButton, true, "SWITCH_TAB_BUTTON") + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$switchTab", _switchTabButton) + elseIf (a_newKey == _prevColumnButton) + _prevColumnButton = a_curKey + SetKeyMapOptionValueST(_prevColumnButton, true, "PREV_COLUMN_BUTTON") + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$prevColumn", _prevColumnButton) + elseIf (a_newKey == _nextColumnButton) + _nextColumnButton = a_curKey + SetKeyMapOptionValueST(_nextColumnButton, true, "NEXT_COLUMN_BUTTON") + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$nextColumn", _nextColumnButton) + elseIf (a_newKey == _sortOrderButton) + _sortOrderButton = a_curKey + SetKeyMapOptionValueST(_sortOrderButton, true, "SORT_ORDER_BUTTON") + SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$sortOrder", _sortOrderButton) + endIf +endFunction + +function SetCurrentFavoriteGroup(int a_index) + int ARMOR_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR + int HANDS_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_HANDS + + SetToggleOptionValueST(SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, ARMOR_FLAG), true, "FAV_GROUP_UNEQUIP_ARMOR") + SetToggleOptionValueST(SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, HANDS_FLAG), true, "FAV_GROUP_UNEQUIP_HANDS") +endFunction + +function SetFavoritesGroupHotkey(int a_groupIndex, int a_keyCode, string a_conflictControl = "", string a_conflictName = "") + + bool continue = true + + if (a_conflictControl != "" && a_conflictName != ModName) + string msg + + if (a_conflictName != "") + msg = "$SKI_MSG2{" + a_conflictControl + " (" + a_conflictName + ")}" + else + msg = "$SKI_MSG2{" + a_conflictControl + "}" + endIf + + continue = ShowMessage(msg, true, "$Yes", "$No") + endIf + + if (!continue) + return + endIf + + if (!SKI_FavoritesManagerInstance.SetGroupHotkey(a_groupIndex, a_keyCode)) + return + endIf + + ; Update + int[] groupHotkeys = SKI_FavoritesManagerInstance.GetGroupHotkeys() + SetKeyMapOptionValueST(groupHotkeys[0], true, "FAV_GROUP_USE_HOTKEY1") + SetKeyMapOptionValueST(groupHotkeys[1], true, "FAV_GROUP_USE_HOTKEY2") + SetKeyMapOptionValueST(groupHotkeys[2], true, "FAV_GROUP_USE_HOTKEY3") + SetKeyMapOptionValueST(groupHotkeys[3], true, "FAV_GROUP_USE_HOTKEY4") + SetKeyMapOptionValueST(groupHotkeys[4], true, "FAV_GROUP_USE_HOTKEY5") + SetKeyMapOptionValueST(groupHotkeys[5], true, "FAV_GROUP_USE_HOTKEY6") + SetKeyMapOptionValueST(groupHotkeys[6], true, "FAV_GROUP_USE_HOTKEY7") + SetKeyMapOptionValueST(groupHotkeys[7], false, "FAV_GROUP_USE_HOTKEY8") +endFunction + +function RefreshFavoriteHotkeys() + SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.GroupAddKey, true, "FAV_GROUP_ADD_KEY") + SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.GroupUseKey, true, "FAV_GROUP_USE_KEY") + SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.SetIconKey, true, "FAV_SET_ICON_KEY") + SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.ToggleFocusKey, true, "FAV_TOGGLE_FOCUS") + SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.SaveEquipStateKey, false, "FAV_EQUIP_STATE_KEY") +endFunction + + +; REMOVED DATA ----------------------------------------------------------------------------------- + +; -- Version 1 -- ; (remove version) + +; int _itemlistFontSizeOID_T ; (4) +; int _itemlistQuantityMinCountOID_S ; (4) +; int _itemcardAlignOID_T ; (4) +; int _itemcardXOffsetOID_S ; (4) +; int _itemcardYOffsetOID_S ; (4) +; int _3DItemXOffsetOID_S ; (4) +; int _3DItemYOffsetOID_S ; (4) +; int _3DItemScaleOID_S ; (4) +; int _checkInventoryMenuOID_B ; (4) +; int _checkMagicMenuOID_B ; (4) +; int _checkBarterMenuOID_B ; (4) +; int _checkContainerMenuOID_B ; (4) +; int _checkGiftMenuOID_B ; (4) +; int _searchKeyOID_K ; (4) +; int _switchTabKeyOID_K ; (4) +; int _equipModeKeyOID_K ; (4) + +; -- Version 2 -- + +; int _itemlistCategoryIconThemeOID_M ; (4) +; int _itemlistNoIconColorsOID_B ; (4) +; int _switchTabButtonOID_K ; (4) +; int _prevColumnButtonOID_K ; (4) +; int _nextColumnButtonOID_K ; (4) +; int _sortOrderButtonOID_K ; (4) + +; -- Version 3 -- + +; int _3DItemDisablePositioningOID_B ; (4) \ No newline at end of file diff --git a/source/scripts/ski_main.psc b/source/scripts/ski_main.psc new file mode 100644 index 00000000..a8a83ddf --- /dev/null +++ b/source/scripts/ski_main.psc @@ -0,0 +1,336 @@ +scriptname SKI_Main extends SKI_QuestBase + +; CONSTANTS --------------------------------------------------------------------------------------- + +string property HUD_MENU = "HUD Menu" autoReadOnly +string property INVENTORY_MENU = "InventoryMenu" autoReadonly +string property MAGIC_MENU = "MagicMenu" autoReadonly +string property CONTAINER_MENU = "ContainerMenu" autoReadonly +string property BARTER_MENU = "BarterMenu" autoReadonly +string property GIFT_MENU = "GiftMenu" autoReadonly +string property JOURNAL_MENU = "Journal Menu" autoReadonly +string property MAP_MENU = "MapMenu" autoReadonly +string property FAVORITES_MENU = "FavoritesMenu" autoReadonly +string property CRAFTING_MENU = "Crafting Menu" autoReadonly + +int property ERR_SKSE_MISSING = 1 autoReadonly +int property ERR_SKSE_VERSION_RT = 2 autoReadonly +int property ERR_SKSE_VERSION_SCPT = 3 autoReadonly +int property ERR_INI_PAPYRUS = 4 autoReadonly +int property ERR_SWF_INVALID = 5 autoReadonly +int property ERR_SWF_VERSION = 6 autoReadonly +int property ERR_SKSE_BROKEN = 7 autoReadonly + + +; PRIVATE VARIABLES ------------------------------------------------------------------------------- + +bool _inventoryMenuCheckEnabled = true +bool _magicMenuCheckEnabled = true +bool _barterMenuCheckEnabled = true +bool _containerMenuCheckEnabled = true +bool _giftMenuCheckEnabled = true +bool _mapMenuCheckEnabled = true +bool _favoritesMenuCheckEnabled = true +bool _craftingMenuCheckEnabled = true + + +; PROPERTIES -------------------------------------------------------------------------------------- + +int property MinSKSERelease = 44 autoReadonly +string property MinSKSEVersion = "1.6.16" autoReadonly + +int property ReqSWFRelease = 17 autoReadonly +string property ReqSWFVersion = "5.0" autoReadonly + +bool property ErrorDetected = false auto + + +bool property InventoryMenuCheckEnabled + bool function get() + return _inventoryMenuCheckEnabled + endFunction + + function set(bool a_val) + _inventoryMenuCheckEnabled = a_val + if (a_val) + RegisterForMenu(INVENTORY_MENU) + else + UnregisterForMenu(INVENTORY_MENU) + endIf + endFunction +endProperty + +bool property MagicMenuCheckEnabled + bool function get() + return _magicMenuCheckEnabled + endFunction + + function set(bool a_val) + _magicMenuCheckEnabled = a_val + if (a_val) + RegisterForMenu(MAGIC_MENU) + else + UnregisterForMenu(MAGIC_MENU) + endIf + endFunction +endProperty + +bool property BarterMenuCheckEnabled + bool function get() + return _barterMenuCheckEnabled + endFunction + + function set(bool a_val) + _barterMenuCheckEnabled = a_val + if (a_val) + RegisterForMenu(BARTER_MENU) + else + UnregisterForMenu(BARTER_MENU) + endIf + endFunction +endProperty + +bool property ContainerMenuCheckEnabled + bool function get() + return _containerMenuCheckEnabled + endFunction + + function set(bool a_val) + _containerMenuCheckEnabled = a_val + if (a_val) + RegisterForMenu(CONTAINER_MENU) + else + UnregisterForMenu(CONTAINER_MENU) + endIf + endFunction +endProperty + +bool property GiftMenuCheckEnabled + bool function get() + return _giftMenuCheckEnabled + endFunction + + function set(bool a_val) + _giftMenuCheckEnabled = a_val + if (a_val) + RegisterForMenu(GIFT_MENU) + else + UnregisterForMenu(GIFT_MENU) + endIf + endFunction +endProperty + +bool property MapMenuCheckEnabled + bool function get() + return _mapMenuCheckEnabled + endFunction + + function set(bool a_val) + _mapMenuCheckEnabled = a_val + if (a_val) + RegisterForMenu(MAP_MENU) + else + UnregisterForMenu(MAP_MENU) + endIf + endFunction +endProperty + +bool property FavoritesMenuCheckEnabled + bool function get() + return _favoritesMenuCheckEnabled + endFunction + + function set(bool a_val) + _favoritesMenuCheckEnabled = a_val + if (a_val) + RegisterForMenu(FAVORITES_MENU) + else + UnregisterForMenu(FAVORITES_MENU) + endIf + endFunction +endProperty + +bool property CraftingMenuCheckEnabled + bool function get() + return _craftingMenuCheckEnabled + endFunction + + function set(bool a_val) + _craftingMenuCheckEnabled = a_val + if (a_val) + RegisterForMenu(CRAFTING_MENU) + else + UnregisterForMenu(CRAFTING_MENU) + endIf + endFunction +endProperty + + +; INITIALIZATION ---------------------------------------------------------------------------------- + +event OnInit() + OnGameReload() +endEvent + +; @implements SKI_QuestBase +event OnGameReload() + ErrorDetected = false + + if (SKSE.GetVersionRelease() == 0) + Error(ERR_SKSE_MISSING, "The Skyrim Script Extender (SKSE) is not running.\nSkyUI will not work correctly!\n\n" \ + + "This message may also appear if a new Skyrim Patch has been released. In this case, wait until SKSE has been updated, then install the new version.") + return + + elseIf (GetType() == 0) + Error(ERR_SKSE_BROKEN, "The SKSE scripts have been overwritten or are not properly loaded.\nReinstalling SKSE might fix this.") + return + + elseIf (SKSE.GetVersionRelease() < MinSKSERelease) + Error(ERR_SKSE_VERSION_RT, "SKSE is outdated.\nSkyUI will not work correctly!\n" \ + + "Required version: " + MinSKSEVersion + " or newer\n" \ + + "Detected version: " + SKSE.GetVersion() + "." + SKSE.GetVersionMinor() + "." + SKSE.GetVersionBeta()) + return + + elseIf (SKSE.GetScriptVersionRelease() < MinSKSERelease) + Error(ERR_SKSE_VERSION_SCPT, "SKSE scripts are outdated.\nYou probably forgot to install/update them with the rest of SKSE.\nSkyUI will not work correctly!") + return + endIf + + if (Utility.GetINIInt("iMinMemoryPageSize:Papyrus") <= 0 || Utility.GetINIInt("iMaxMemoryPageSize:Papyrus") <= 0 || Utility.GetINIInt("iMaxAllocatedMemoryBytes:Papyrus") <= 0) + Error(ERR_INI_PAPYRUS, "Your Papyrus INI settings are invalid. Please fix this, otherwise SkyUI will stop working at some point.") + return + endIf + + ; Check menus, when they're opened + if (InventoryMenuCheckEnabled) + RegisterForMenu(INVENTORY_MENU) + endIf + + if (MagicMenuCheckEnabled) + RegisterForMenu(MAGIC_MENU) + endIf + + if (ContainerMenuCheckEnabled) + RegisterForMenu(CONTAINER_MENU) + endIf + + if (BarterMenuCheckEnabled) + RegisterForMenu(BARTER_MENU) + endIf + + if (GiftMenuCheckEnabled) + RegisterForMenu(GIFT_MENU) + endIf + + if (MapMenuCheckEnabled) + RegisterForMenu(MAP_MENU) + endIf + + if (FavoritesMenuCheckEnabled) + RegisterForMenu(FAVORITES_MENU) + endIf + + if (CraftingMenuCheckEnabled) + RegisterForMenu(CRAFTING_MENU) + endIf + + RegisterForMenu(JOURNAL_MENU) +endEvent + + +; EVENTS ------------------------------------------------------------------------------------------ + +event OnMenuOpen(string a_menuName) + if (a_menuName == INVENTORY_MENU) + if (CheckMenuVersion("inventorymenu.swf", a_menuName, "_global.InventoryMenu") && \ + CheckItemMenuComponents(a_menuName)) + ; Only unregister if all checks have been performed (regardless of check result) + UnregisterForMenu(a_menuName) + endIf + + elseIf (a_menuName == MAGIC_MENU) + if (CheckMenuVersion("magicmenu.swf", a_menuName, "_global.MagicMenu") && \ + CheckItemMenuComponents(a_menuName)) + UnregisterForMenu(a_menuName) + endIf + + elseIf (a_menuName == CONTAINER_MENU) + if (CheckMenuVersion("containermenu.swf", a_menuName, "_global.ContainerMenu") && \ + CheckItemMenuComponents(a_menuName)) + UnregisterForMenu(a_menuName) + endIf + + elseIf (a_menuName == BARTER_MENU) + if (CheckMenuVersion("bartermenu.swf", a_menuName, "_global.BarterMenu") && \ + CheckItemMenuComponents(a_menuName)) + UnregisterForMenu(a_menuName) + endIf + + elseIf (a_menuName == GIFT_MENU) + if (CheckMenuVersion("giftmenu.swf", a_menuName, "_global.GiftMenu") && \ + CheckItemMenuComponents(a_menuName)) + UnregisterForMenu(a_menuName) + endIf + + elseIf (a_menuName == JOURNAL_MENU) + if (CheckMenuVersion("quest_journal.swf", a_menuName, "_global.Quest_Journal") && \ + CheckMenuVersion("skyui/configpanel.swf", a_menuName, "_global.ConfigPanel")) + UnregisterForMenu(a_menuName) + endIf + + elseIf (a_menuName == MAP_MENU) + if (CheckMenuVersion("map.swf", a_menuName, "_global.Map.MapMenu")) + UnregisterForMenu(a_menuName) + endIf + + elseIf (a_menuName == FAVORITES_MENU) + if (CheckMenuVersion("favoritesmenu.swf", a_menuName, "_global.FavoritesMenu")) + UnregisterForMenu(a_menuName) + endIf + + elseIf (a_menuName == CRAFTING_MENU) + if (CheckMenuVersion("craftingmenu.swf", a_menuName, "_global.CraftingMenu")) + UnregisterForMenu(a_menuName) + endIf + endIf +endEvent + + +; FUNCTIONS --------------------------------------------------------------------------------------- + +function Error(int a_errId, string a_msg) + Debug.MessageBox("SKYUI ERROR CODE " + a_errId + "\n\n" + a_msg + "\n\nFor more help, visit the SkyUI download site.") + ErrorDetected = true +endFunction + +bool function CheckMenuVersion(string a_swfName, string a_menu, string a_class) + ; Returns false if the menu is closed before UI.Get* receive their value + + int releaseIdx = UI.GetInt(a_menu, a_class + ".SKYUI_RELEASE_IDX") + string version = UI.GetString(a_menu, a_class + ".SKYUI_VERSION_STRING") + + if (!UI.IsMenuOpen(a_menu)) + return false + endIf + + if (releaseIdx == 0) + Error(ERR_SWF_INVALID, "Incompatible menu file (" + a_swfName + ").\nPlease make sure you installed everything correctly and no other mod has overwritten this file.\n" \ + + "If you were using an older SkyUI version, un-install it and re-install the latest version.") + + elseIf (releaseIdx != ReqSWFRelease) + Error(ERR_SWF_VERSION, "Menu file version mismatch for " + a_swfName + ".\n" \ + + "Required version: " + ReqSWFVersion + "\n" \ + + "Detected version: " + version) + + endIf + + return true +endFunction + +bool function CheckItemMenuComponents(string a_menu) + ; Returns false if the menu is closed before all checks have finished + + return CheckMenuVersion("skyui/itemcard.swf", a_menu, "_global.ItemCard") && \ + CheckMenuVersion("skyui/bottombar.swf", a_menu, "_global.BottomBar") && \ + CheckMenuVersion("skyui/inventorylists.swf", a_menu, "_global.InventoryLists") +endFunction diff --git a/source/scripts/ski_playerloadgamealias.psc b/source/scripts/ski_playerloadgamealias.psc new file mode 100644 index 00000000..d6530c4c --- /dev/null +++ b/source/scripts/ski_playerloadgamealias.psc @@ -0,0 +1,7 @@ +scriptname SKI_PlayerLoadGameAlias extends ReferenceAlias + + ; EVENTS ----------------------------------------------------------------------------------------- + +event OnPlayerLoadGame() + (GetOwningQuest() as SKI_QuestBase).OnGameReload() +endEvent diff --git a/source/scripts/ski_qf_configmanagerinstance.psc b/source/scripts/ski_qf_configmanagerinstance.psc new file mode 100644 index 00000000..05f7101d --- /dev/null +++ b/source/scripts/ski_qf_configmanagerinstance.psc @@ -0,0 +1,22 @@ +;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment +;NEXT FRAGMENT INDEX 1 +Scriptname SKI_QF_ConfigManagerInstance Extends Quest Hidden + +;BEGIN ALIAS PROPERTY PlayerRef +;ALIAS PROPERTY TYPE ReferenceAlias +ReferenceAlias Property Alias_PlayerRef Auto +;END ALIAS PROPERTY + +;BEGIN FRAGMENT Fragment_0 +Function Fragment_0() +;BEGIN AUTOCAST TYPE SKI_ConfigManager +Quest __temp = self as Quest +SKI_ConfigManager kmyQuest = __temp as SKI_ConfigManager +;END AUTOCAST +;BEGIN CODE +kmyQuest.ForceReset() +;END CODE +EndFunction +;END FRAGMENT + +;END FRAGMENT CODE - Do not edit anything between this and the begin comment diff --git a/source/scripts/ski_questbase.psc b/source/scripts/ski_questbase.psc new file mode 100644 index 00000000..cbef0d95 --- /dev/null +++ b/source/scripts/ski_questbase.psc @@ -0,0 +1,42 @@ +scriptname SKI_QuestBase extends Quest hidden + +; ------------------------------------------------------------------------------------------------- +; Version Tracking +; +; Quest implements +; GetVersion, to return the static version number +; OnVersionUpdate to handle the updating +; Update process is triggered by calling CheckVersion() + +int property CurrentVersion auto hidden + +function CheckVersion() + int version = GetVersion() + if (CurrentVersion < version) + OnVersionUpdateBase(version) + OnVersionUpdate(version) + CurrentVersion = version + endIf +endFunction + +int function GetVersion() + return 1 +endFunction + +event OnVersionUpdateBase(int a_version) +endEvent + +event OnVersionUpdate(int a_version) +endEvent + + +; ------------------------------------------------------------------------------------------------- +; Reload Events +; +; Helper to add reload event to quest script. +; 1. Create quest +; 2. Add player alias to quest +; 3. Attach SKI_PlayerLoadGameAlias to player alias + +event OnGameReload() +endEvent \ No newline at end of file diff --git a/source/scripts/ski_settingsmanager.psc b/source/scripts/ski_settingsmanager.psc new file mode 100644 index 00000000..0f6c8b40 --- /dev/null +++ b/source/scripts/ski_settingsmanager.psc @@ -0,0 +1,145 @@ +scriptname SKI_SettingsManager extends SKI_QuestBase + +; CONSTANTS --------------------------------------------------------------------------------------- + +string property MENU_ROOT = "_global.skyui.util.ConfigManager" autoReadonly + +string property INVENTORY_MENU = "InventoryMenu" autoReadonly +string property MAGIC_MENU = "MagicMenu" autoReadonly +string property CONTAINER_MENU = "ContainerMenu" autoReadonly +string property BARTER_MENU = "BarterMenu" autoReadonly +string property GIFT_MENU = "GiftMenu" autoReadonly +string property CRAFTING_MENU = "Crafting Menu" autoReadonly + + +; PRIVATE VARIABLES ------------------------------------------------------------------------------- + +int _overrideCount = 0 +string[] _overrideKeys +string[] _overrideValues + +string _currentMenu + + +; INITIALIZATION ---------------------------------------------------------------------------------- + +event OnInit() + _overrideKeys = new string[128] + _overrideValues = new string[128] + + int i = 0 + while (i<128) + _overrideKeys[i] = "" + _overrideValues[i] = "" + i += 1 + endWhile + + OnGameReload() +endEvent + +; @implements SKI_QuestBase +event OnGameReload() + RegisterForMenu(INVENTORY_MENU) + RegisterForMenu(MAGIC_MENU) + RegisterForMenu(CONTAINER_MENU) + RegisterForMenu(BARTER_MENU) + RegisterForMenu(GIFT_MENU) + RegisterForMenu(CRAFTING_MENU) + RegisterForModEvent("SKICO_setConfigOverride", "OnSetConfigOverride") +endEvent + + +; EVENTS ------------------------------------------------------------------------------------------ + +event OnMenuOpen(string a_menuName) + GotoState("LOCKED") + ; Check if it's still open + if (UI.IsMenuOpen(a_menuName)) + _currentMenu = a_menuName + UI.InvokeStringA(a_menuName, MENU_ROOT + ".setExternalOverrideKeys", _overrideKeys) + UI.InvokeStringA(a_menuName, MENU_ROOT + ".setExternalOverrideValues", _overrideValues) + endIf + GotoState("") +endEvent + +event OnSetConfigOverride(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + string overrideKey = a_strArg + string overrideValue = UI.GetString(_currentMenu, MENU_ROOT + ".out_overrides." + overrideKey) + + SetOverride(overrideKey, overrideValue) +endEvent + +; ---------------------------------------------- +state LOCKED + +event OnMenuOpen(string a_menuName) +endEvent + +endState + + +; FUNCTIONS --------------------------------------------------------------------------------------- + +; @interface +bool function SetOverride(string a_key, string a_value) + if (a_key == "") + return false + endIf + + ; Existing override? + int index = _overrideKeys.Find(a_key) + if (index != -1) + _overrideValues[index] = a_value + + return true + + ; New override + else + if (_overrideCount >= 128) + return false + endIf + + index = NextFreeIndex() + if (index == -1) + return false + endIf + + _overrideKeys[index] = a_key + _overrideValues[index] = a_value + _overrideCount += 1 + + return true + endIf + +endFunction + +; @interface +bool function ClearOverride(string a_key) + if (a_key == "") + return false + endIf + + int index = _overrideKeys.Find(a_key) + if (index == -1) + return false + endIf + + _overrideKeys[index] = "" + _overrideValues[index] = "" + _overrideCount -= 1 + + return true +endFunction + +int function NextFreeIndex() + int i = 0 + + while (i < _overrideKeys.length) + if (_overrideKeys[i] == "") + return i + endIf + i += 1 + endWhile + + return -1 +endFunction diff --git a/source/scripts/ski_widgetbase.psc b/source/scripts/ski_widgetbase.psc new file mode 100644 index 00000000..6e4b398e --- /dev/null +++ b/source/scripts/ski_widgetbase.psc @@ -0,0 +1,322 @@ +scriptname SKI_WidgetBase extends SKI_QuestBase + +; CONSTANTS --------------------------------------------------------------------------------------- + +string property HUD_MENU = "HUD Menu" autoReadOnly + + +; PRIVATE VARIABLES ------------------------------------------------------------------------------- + +SKI_WidgetManager _widgetManager + +bool _initialized = false +bool _ready = false +int _widgetID = -1 +string _widgetRoot = "" +string[] _modes +string _hAnchor = "left" +string _vAnchor = "top" +float _x = 0.0 +float _y = 0.0 +float _alpha = 100.0 + + +; PROPERTIES -------------------------------------------------------------------------------------- + +bool property RequireExtend = true auto + {Require extending the widget type instead of using it directly.} + +; @interface +string property WidgetName = "I-forgot-to-set-the-widget name" auto + {Name of the widget. Used to identify it in the user interface.} + +; @interface +int property WidgetID + {Unique ID of the widget. ReadOnly} + int function get() + return _widgetID + endFunction +endProperty + +; @interface +bool property Ready + {True once the widget has registered. ReadOnly} + bool function get() + return _initialized + endFunction +endProperty + +; @interface +string property WidgetRoot + {Path to the root of the widget from _root of HudMenu. ReadOnly} + string function get() + return _widgetRoot + endFunction +endProperty + +string[] property Modes + {HUDModes in which the widget is visible, see readme for available modes} + string[] function get() + return _modes + endFunction + + function set(string[] a_val) + _modes = a_val + if (Ready) + UpdateWidgetModes() + endIf + endFunction +endProperty + +; @interface +string property HAnchor + {Horizontal anchor point of the widget ["left", "center", "right"]. Default: "left"} + string function get() + return _hAnchor + endFunction + + function set(string a_val) + _hAnchor = a_val + if (Ready) + UpdateWidgetHAnchor() + endIf + endFunction +endProperty + +; @interface +string property VAnchor + {Vertical anchor point of the widget ["top", "center", "bottom"]. Default: "top"} + string function get() + return _vAnchor + endFunction + + function set(string a_val) + _vAnchor = a_val + if (Ready) + UpdateWidgetVAnchor() + endIf + endFunction +endProperty + +; @interface +float property X + {Horizontal position of the widget in pixels at a resolution of 1280x720 [0.0, 1280.0]. Default: 0.0} + float function get() + return _x + endFunction + + function set(float a_val) + _x = a_val + if (Ready) + UpdateWidgetPositionX() + endIf + endFunction +endProperty + +; @interface +float property Y + {Vertical position of the widget in pixels at a resolution of 1280x720 [0.0, 720.0]. Default: 0.0} + float function get() + return _y + endFunction + + function set(float a_val) + _y = a_val + if (Ready) + UpdateWidgetPositionY() + endIf + endFunction +endProperty + +; @interface +float property Alpha + {Opacity of the widget [0.0, 100.0]. Default: 0.0} + float function get() + return _alpha + endFunction + + function set(float a_val) + _alpha = a_val + if (Ready) + UpdateWidgetAlpha() + endIf + endFunction +endProperty + + +; INITIALIZATION ---------------------------------------------------------------------------------- + +event OnInit() + OnGameReload() +endEvent + +; @implements SKI_QuestBase +event OnGameReload() + _ready = false + RegisterForModEvent("SKIWF_widgetManagerReady", "OnWidgetManagerReady") + + if (!IsExtending() && RequireExtend) + Debug.MessageBox("WARNING!\n" + self as string + " must extend a base script type.") + endIf + + if (!_initialized) + _initialized = true + + ; Default Modes if not set via property + if (!_modes) + _modes = new string[6] + _modes[0] = "All" + _modes[1] = "StealthMode" + _modes[2] = "Favor" + _modes[3] = "Swimming" + _modes[4] = "HorseMode" + _modes[5] = "WarHorseMode" + endIf + + OnWidgetInit() + + Debug.Trace(self + " INITIALIZED") + endIf + + CheckVersion() +endEvent + +event OnWidgetManagerReady(string a_eventName, string a_strArg, float a_numArg, Form a_sender) + SKI_WidgetManager newManager = a_sender as SKI_WidgetManager + + ; Already registered? + if (_widgetManager == newManager) + return + endIf + + _widgetManager = newManager + + _widgetID = _widgetManager.RequestWidgetID(self) + if (_widgetID != -1) + _widgetRoot = "_root.WidgetContainer." + _widgetID + ".widget" + _widgetManager.CreateWidget(_widgetID, GetWidgetSource()) + else + Debug.Trace("WidgetWarning: " + self as string + ": could not be loaded, too many widgets. Max is 128") + endIf +endEvent + + +; EVENTS ------------------------------------------------------------------------------------------ + +; @interface +event OnWidgetInit() + {Handles any custom widget initialization} +endEvent + +; Executed after each game reload by widget manager. +event OnWidgetLoad() + _ready = true + + OnWidgetReset() + + ; Before that the widget was still hidden. + ; Now that everything is done, set modes to show it eventually. + UpdateWidgetModes() +endEvent + +event OnWidgetReset() + ; Reset base properties except modes to prevent widget from being drawn too early. + UpdateWidgetClientInfo() + UpdateWidgetHAnchor() + UpdateWidgetVAnchor() + UpdateWidgetPositionX() + UpdateWidgetPositionY() + UpdateWidgetAlpha() +endEvent + + +; FUNCTIONS --------------------------------------------------------------------------------------- + +; @interface +string function GetWidgetSource() + return "" +endFunction + +; @interface +string function GetWidgetType() + ; Must be the same as scriptname + return "" +endFunction + +; @interface +float[] function GetDimensions() + {Return the dimensions of the widget (width,height).} + float[] dim = new float[2] + dim[0] = 0 + dim[1] = 0 + return dim +endFunction + +; @interface +function TweenToX(float a_x, float a_duration) + {Moves the widget to a new x position over time} + TweenTo(a_x, _y, a_duration) +endFunction + +; @interface +function TweenToY(float a_y, float a_duration) + {Moves the widget to a new y position over time} + TweenTo(_x, a_y, a_duration) +endFunction + +; @interface +function TweenTo(float a_x, float a_y, float a_duration) + {Moves the widget to a new x, y position over time} + float[] args = new float[3] + args[0] = a_x + args[1] = a_y + args[2] = a_duration + UI.InvokeFloatA(HUD_MENU, _widgetRoot + ".tweenTo", args) +endFunction + +; @interface +function FadeTo(float a_alpha, float a_duration) + {Fades the widget to a new alpha over time} + float[] args = new float[2] + args[0] = a_alpha + args[1] = a_duration + UI.InvokeFloatA(HUD_MENU, _widgetRoot + ".fadeTo", args) +endFunction + +bool function IsExtending() + string s = self as string + string sn = GetWidgetType() + " " + s = StringUtil.Substring(s, 1, StringUtil.GetLength(sn)) + if (s == sn) + return false + endIf + return true +endFunction + +function UpdateWidgetClientInfo() + UI.InvokeString(HUD_MENU, _widgetRoot + ".setClientInfo", self as string) +endFunction + +function UpdateWidgetAlpha() + UI.InvokeFloat(HUD_MENU, _widgetRoot + ".setAlpha", Alpha) +endFunction + +function UpdateWidgetHAnchor() + UI.InvokeString(HUD_MENU, _widgetRoot + ".setHAnchor", HAnchor) +endFunction + +function UpdateWidgetVAnchor() + UI.InvokeString(HUD_MENU, _widgetRoot + ".setVAnchor", VAnchor) +endFunction + +function UpdateWidgetPositionX() + UI.InvokeFloat(HUD_MENU, _widgetRoot + ".setPositionX", X) +endFunction + +function UpdateWidgetPositionY() + UI.InvokeFloat(HUD_MENU, _widgetRoot + ".setPositionY", Y) +endFunction + +function UpdateWidgetModes() + UI.InvokeStringA(HUD_MENU, _widgetRoot + ".setModes", Modes) +endFunction \ No newline at end of file diff --git a/source/scripts/ski_widgetmanager.psc b/source/scripts/ski_widgetmanager.psc new file mode 100644 index 00000000..ce5e0298 --- /dev/null +++ b/source/scripts/ski_widgetmanager.psc @@ -0,0 +1,181 @@ +scriptname SKI_WidgetManager extends SKI_QuestBase + +; CONSTANTS --------------------------------------------------------------------------------------- + +string property HUD_MENU = "HUD Menu" autoReadOnly + + +; PRIVATE VARIABLES ------------------------------------------------------------------------------- + +SKI_WidgetBase[] _widgets +string[] _widgetSources +int _curWidgetID = 0 +int _widgetCount = 0 + + +; INITIALIZATION ---------------------------------------------------------------------------------- + +event OnInit() + _widgets = new SKI_WidgetBase[128] + _widgetSources = new string[128] + + ; Wait until all widgets have registered their callbacks + Utility.Wait(0.5) + + OnGameReload() +endEvent + +event OnGameReload() + RegisterForModEvent("SKIWF_widgetLoaded", "OnWidgetLoad") + RegisterForModEvent("SKIWF_widgetError", "OnWidgetError") + + CleanUp() + + ; Init now, or delay until hudmenu has been loaded + if (UI.IsMenuOpen(HUD_MENU)) + InitWidgetLoader() + else + RegisterForMenu(HUD_MENU) + endIf +endEvent + +event OnMenuOpen(string a_menuName) + if (a_menuName == HUD_MENU) + UnregisterForMenu(HUD_MENU) + InitWidgetLoader() + endIf +endEvent + +function CleanUp() + _widgetCount = 0 + int i = 0 + + while (i < _widgets.length) + if (_widgets[i] == none || _widgets[i].GetFormID() == 0) + ; Widget no longer exists + _widgets[i] = none + _widgetSources[i] = "" + else + _widgetCount += 1 + endIf + i += 1 + endWhile +endFunction + +function InitWidgetLoader() + Debug.Trace("InitWidgetLoader()") + + int releaseIdx = UI.GetInt(HUD_MENU, "_global.WidgetLoader.SKYUI_RELEASE_IDX") + + ; Not injected yet + if (releaseIdx == 0) + + ; Interface/ + string rootPath = "" + + string[] args = new string[2] + args[0] = "widgetLoaderContainer" + args[1] = "-1000" + + ; Create empty container clip + UI.InvokeStringA(HUD_MENU, "_root.createEmptyMovieClip", args) + + ; Try to load from Interface/exported/hudmenu.gfx + UI.InvokeString(HUD_MENU, "_root.widgetLoaderContainer.loadMovie", "skyui/widgetloader.swf") + Utility.Wait(0.5) + releaseIdx = UI.GetInt(HUD_MENU, "_global.WidgetLoader.SKYUI_RELEASE_IDX") + + ; If failed, try to load from Interface/hudmenu.swf + if (releaseIdx == 0) + ; Interface/exported + rootPath = "exported/" + UI.InvokeString(HUD_MENU, "_root.widgetLoaderContainer.loadMovie", "exported/skyui/widgetloader.swf") + Utility.Wait(0.5) + releaseIdx = UI.GetInt(HUD_MENU, "_global.WidgetLoader.SKYUI_RELEASE_IDX") + endIf + + ; Injection failed + if (releaseIdx == 0) + Debug.Trace("InitWidgetLoader(): load failed") + return + endIf + + UI.InvokeString(HUD_MENU, "_root.widgetLoaderContainer.widgetLoader.setRootPath", rootPath) + endIf + + ; Load already registered widgets + UI.InvokeStringA(HUD_MENU, "_root.widgetLoaderContainer.widgetLoader.loadWidgets", _widgetSources) + + SendModEvent("SKIWF_widgetManagerReady") +endFunction + + +; EVENTS ------------------------------------------------------------------------------------------ + +event OnWidgetLoad(string a_eventName, string a_strArg, float a_numArg, form a_sender) + int widgetID = a_strArg as int + SKI_WidgetBase client = _widgets[widgetID] + + if (client != none) + client.OnWidgetLoad() + endIf +endEvent + +event OnWidgetError(string a_eventName, string a_strArg, float a_numArg, form a_sender) + int widgetID = a_numArg as int + string errorType = a_strArg + + Debug.Trace("WidgetError: " + (_widgets[widgetID] as string) + ": " + errorType) +endEvent + + +; FUNCTIONS --------------------------------------------------------------------------------------- + +int function RequestWidgetID(SKI_WidgetBase a_client) + if (_widgetCount >= 128) + return -1 + endIf + + int widgetID = NextWidgetID() + _widgets[widgetID] = a_client + _widgetCount += 1 + + return widgetID +endFunction + +int function NextWidgetID() + int startIdx = _curWidgetID + + while (_widgets[_curWidgetID] != none) + _curWidgetID += 1 + if (_curWidgetID >= 128) + _curWidgetID = 0 + endIf + if (_curWidgetID == startIdx) + return -1 ; Should never happen because we have widgetCount. Just to be sure. + endIf + endWhile + + return _curWidgetID +endFunction + +function CreateWidget(int a_widgetID, string a_widgetSource) + _widgetSources[a_widgetID] = a_widgetSource + string[] args = new string[2] + args[0] = a_widgetID as string + args[1] = a_widgetSource + UI.InvokeStringA(HUD_MENU, "_root.widgetLoaderContainer.widgetLoader.loadWidget", args); +endFunction + +SKI_WidgetBase[] function GetWidgets() + ; Return a copy + SKI_WidgetBase[] widgetsCopy = new SKI_WidgetBase[128] + int i = 0 + + while (i < _widgets.length) + widgetsCopy[i] = _widgets[i] + i += 1 + endWhile + + return widgetsCopy +endFunction