From 4cf80d1b7ae496f23aa2487af184dcce5f69acc1 Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Sun, 10 Oct 2021 16:17:11 +0200 Subject: [PATCH 01/14] 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 From 9bbc692a579e57f6357d687f996a4717caead74a Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Sun, 10 Oct 2021 16:35:41 +0200 Subject: [PATCH 02/14] Large font in SkyUI by default (better fits Enderal font) --- scripts/ski_configmenu.pex | Bin 0 -> 38165 bytes source/scripts/ski_configmenu.psc | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 scripts/ski_configmenu.pex diff --git a/scripts/ski_configmenu.pex b/scripts/ski_configmenu.pex new file mode 100644 index 0000000000000000000000000000000000000000..70bfcf31eb573cc91700f9d4bee5138d4807c2a7 GIT binary patch literal 38165 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 Bp6dVr literal 0 HcmV?d00001 diff --git a/source/scripts/ski_configmenu.psc b/source/scripts/ski_configmenu.psc index 247310b1..96a5456e 100644 --- a/source/scripts/ski_configmenu.psc +++ b/source/scripts/ski_configmenu.psc @@ -39,7 +39,7 @@ string[] _alignmentValues string[] _sizes ; State -int _itemlistFontSizeIdx = 1 +int _itemlistFontSizeIdx = 2 int _itemlistQuantityMinCount = 6 int _itemcardAlignIdx = 2 @@ -175,6 +175,8 @@ event OnConfigInit() _alignmentValues[2] = "center" ApplySettings() + SetTextOptionValueST(_sizes[_itemlistFontSizeIdx]) + ApplyItemListFontSize() endEvent ; @implements SKI_QuestBase @@ -822,7 +824,7 @@ state ITEMLIST_FONT_SIZE ; TEXT endEvent event OnDefaultST() - _itemlistFontSizeIdx = 1 + _itemlistFontSizeIdx = 2 SetTextOptionValueST(_sizes[_itemlistFontSizeIdx]) ApplyItemListFontSize() endEvent From 9d44313842adafd83df4885f26701fb217067196 Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Sun, 10 Oct 2021 16:40:35 +0200 Subject: [PATCH 03/14] SkyUI font size update --- scripts/ski_configmenu.pex | Bin 38165 -> 38128 bytes source/scripts/ski_configmenu.psc | 1 - 2 files changed, 1 deletion(-) diff --git a/scripts/ski_configmenu.pex b/scripts/ski_configmenu.pex index 70bfcf31eb573cc91700f9d4bee5138d4807c2a7..3e69605255c5c1e287286bc9e33c687907b369a6 100644 GIT binary patch literal 38128 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 literal 38165 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 Bp6dVr diff --git a/source/scripts/ski_configmenu.psc b/source/scripts/ski_configmenu.psc index 96a5456e..8d80e629 100644 --- a/source/scripts/ski_configmenu.psc +++ b/source/scripts/ski_configmenu.psc @@ -175,7 +175,6 @@ event OnConfigInit() _alignmentValues[2] = "center" ApplySettings() - SetTextOptionValueST(_sizes[_itemlistFontSizeIdx]) ApplyItemListFontSize() endEvent From f57fac7535f88755eb5f5afb521f143296ca26e0 Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Sun, 10 Oct 2021 17:25:51 +0200 Subject: [PATCH 04/14] Fixed Heavy Leather Boots in the ravine flying away due to being placed partially in the ground --- Heavy Leather Boots in ravine position fix.esp | Bin 0 -> 853 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Heavy Leather Boots in ravine position fix.esp diff --git a/Heavy Leather Boots in ravine position fix.esp b/Heavy Leather Boots in ravine position fix.esp new file mode 100644 index 0000000000000000000000000000000000000000..8fecb20ce94c7dffca78399a201e43a2199ad02a GIT binary patch literal 853 zcmb7CO=}ZT6up^@F=B)YT@=(hE((INgjgw6OB`ojn#fBGGm|ETlrnW*H8e95W+rHL zQv^Ry|A57XZd|w)itdVt`2&J3+_>>i2;+S(NgF{I-o?Co&buFT&$|{e=U&2}mPJ@1 zx{-mM7vBm;5V?~8T2-y2K_^AEPA#aYrgap|&8?vA&a%)2UA5Hoex1Q}z3bQ!`^U8c z#B*3+ca-x=(GPC4jkmjGV|s$j+ Date: Sun, 10 Oct 2021 17:28:07 +0200 Subject: [PATCH 05/14] Merged ravine boots fix --- Enderal - Forgotten Stories.esm | Bin 10683740 -> 10683818 bytes Enderal - Forgotten Stories.esm.xml | 11 +++++++++-- ...y Leather Boots in ravine position fix.esp | Bin 853 -> 0 bytes 3 files changed, 9 insertions(+), 2 deletions(-) delete mode 100644 Heavy Leather Boots in ravine position fix.esp diff --git a/Enderal - Forgotten Stories.esm b/Enderal - Forgotten Stories.esm index ce7e93db1b5aeb3f2c4472d9f2f49f53334b3de2..7afb52dc9938770481fefbfb57223aa8848ab191 100644 GIT binary patch delta 820 zcmYMm-B*io0KoCzv!}H%G)xVRS!CpWUTdCadlXh!V=W?LVi-eVUbd1awIs?@d3V`G z=Qu8&8&0Py+~Bx#xb{Ef%GZ_eIiGXBzj|`!vEH279Z~DOZB8Mw;(z6AjT#JF#puWn zB|6~lm%hDy_t_-JTykex*3z;B6aIZ3%*clY1(=5Em;ozhVisnj5H`%gT+D+V^HGFi zIIsW*(u^MZz7VEGc8?X^xY{F)2!B%X;c2uAe zKJ0*kD)_Mz0R*997phT%-PnV@2pMU)b|@iDXtrdnVN2G@iY4>MEh{6p<4IDJAfkTtOrD6SxCt765NJ2C;NqY8uz+sBH zbfr3BFAIf3c_P-DFM|GvzgUDSCO^i<3^nd7RF(EFU!O_ym3Dus(xyC7G$4jX9L5ne z;V6!w8OLz~EjWo&h~qR`aRz6Rz&V`91tf71myp6`T)|bep&i$79XF81P29q5+(8Ce zbf6P=(S>`^(2e`(K`(OX!vpl=AqMaWk1>cLJb{j3j9?T`@eI%L0x$6juZ=0so0gw{ E0n_F}2><{9 delta 808 zcmZ9}-&f0V9LMp`x3yX%6O&1y`H>llT0h(kOyNWcbcL?SjJ37etC79?XU zwn2yONWl*1u@kA-g*2pNH}+sJGGM?y?8gBdL?#Zwh{G`92#(?yvXG7AIDs7G!i+pv za1y6*8u>Vb0$6bt=Wrf2*x|qhIN`!YT*75sQG%+%XsgsA>->d^&hJ)P^bA_2RS`u#adZwD^s+#@-IJ4Zb^uW z8cD?ccVqt3C;ZdPPUBTnpc2oj54QNCYZsHc2(SlaA;WqBTkGp6` z0QYbo9e99Fbm1Yo@d%I6gI@F@h!CEjA5SrWXOJ<7A%roE2u3i9F+9gOUf?C7c!k%P Zz#B|r3U4uu8N9=Le88;YG=B7bUjySj0IC20 diff --git a/Enderal - Forgotten Stories.esm.xml b/Enderal - Forgotten Stories.esm.xml index 63faa5b6..ecb8e865 100644 --- a/Enderal - Forgotten Stories.esm.xml +++ b/Enderal - Forgotten Stories.esm.xml @@ -2,7 +2,7 @@ - + Niseam Enderal: Forgotten Stories (Special Edition) 2.0.9 @@ -10,7 +10,7 @@ 0 Update.esm 0 - 00002160,00002161,00002162,00002163,0000228a,0000228c,00002290,0000229a,0000229b,0000229e,0000229f,000022a0,000022a5,00005acf,0000f920,00013085,00013086,00013087,00013088,00013189,00013192,00013227,00013229,00013230,00013232,00013235,00013239,00013248,000132d2,000132da,000132ec,0001490d,00014911,00014914,0001491b,00014929,00014931,0001495f,00014969,00014995,0001499a,000149ad,000149c0,000149c5,00014a01,00014a09,00014a0b,00014b02,00014b04,00014b11,00014b37,00014b38,00014b39,00014b3c,00014b41,00014b44,00014b4c,00014b4e,00014b5a,00014b5d,00014b5f,00014b60,00014b61,00014b62,00014b63,00014b64,00014b65,00014b66,00014b67,00014b68,00014b77,0001508b,0001508c,00015092,00015093,000150a2,000150a3,00015dba,00015dcb,00015dd8,00016586,00016587,00016938,00016944,00016951,00016989,0001698b,00016996,0001be2d,0001be53,0001bf18,0001bf19,0001bf2a,0001bf3e,0001bf3f,0001bf40,0001cca0,0001cccc,0001cccd,0001ccce,0001cd12,0001cd13,0001cd22,0001cd23,0001cd32,0001cd33,0001cd35,0001cd3d,0001cd40,0001cdbc,0001cdf5,0001cdf6,0001cdfe,0001cdff,0001d17d,0001d17e,0001d17f,0001d180,0001d18c,0001dbaa,0001f79f,0001f7a0,0001f7c2,0001f7c3,0001f866,0001f909,000210a6,000210e3,00021223,0002125c,0002125d,0002125e,00021278,00021279,0002127c,000212dd,000212de,00021345,00021346,00021390,000213bd,00022b55,00022b56,00022b82,00022b86,00022b87,00022fa5,00022ffe,00022fff,00023000,00023001,00023002,00023003,0002324c,0002324d,00023276,00023278,000235c8,00024a0b,000250d5,000251b9,00028f78,00028f7c,00028f7f,00029161,0002a18e,0002a515,0002a517,0002af6d,0002af85,0002af86,0002ec72,0002ec76,0002ec7a,0002ec81,0002ec8a,0002ed91,0002ee39,000333f3,00033437,00034a5d,000364bb,00036516,00036517,00036518,00036519,0003651a,0003651b,0003651d,0003651e,0003651f,00036520,00036521,00036522,00036523,00036524,00036530,0003654b,0003654c,0003654e,0003654f,00036595,000365a0,000365a1,00036a22,00036a23,00036aac,00036aad,00036ab4,00036b03,00036c2f,00036c30,00036c31,00036c32,00036c33,00036c34,00036c50,00036c51,00036c52,00036c53,00036d06,00036dff,00036e02,00036e05,00036f90,00036f91,00036f92,00036f93,00036fb6,00036fbc,00036fbe,00036fc0,00036fc2,000371d3,00037339,00037976,00037bb1,00037e08,00037e67,0003a6ca,0003a6e8,0003a6f7,0003ac84,0003c071,0003c0b5,0003c4e2,0003c4fa,0003c5e0,0003ca4e,0003caeb,0003cf3d,0003cf42,0003cf44,0003cf6e,0003cf6f,0003cf73,0003d026,0003d027,0003d02d,0003d02e,0003d800,0003d801,0003d802,0003d803,0003d804,0003d805,0003d807,0003d808,0003d80b,0003d963,0003d9f5,0003da65,0003da8e,0003dac6,0003dac7,0003e34d,0003e34e,0003e34f,00043e0c,00043e0d,00043e0e,00043e0f,00043e10,00043e11,00043e15,00044a50,00045269,0004526a,0004526f,00045271,00045272,00045278,0004527a,0004527c,00045312,00045778,0004577a,00045784,000457c9,000457ca,000457cb,000457cc,000458d5,000458e0,000458f6,00045a34,00045d4c,00046544,00046545,00046f53,00047a2e,00047d47,0004c40a,0004c62e,0004c630,0004c631,0004c85f,0004c860,0004c86b,0004c86c,0004dc98,00051169,00051233,00051244,00051245,0005124b,0005124e,00051261,00051264,0005126a,00051270,0005128f,000512a1,000512a3,000512a4,000512ab,000512ac,000512ad,000512bd,000512be,000512c4,000512c8,000512cc,000512d9,000512da,000512db,000512df,000512e0,000512ec,000512ef,000512f0,000512f2,000512f7,000512f8,000512fe,000512ff,00051300,00051301,00051303,00051311,00051312,00051313,00051314,00051315,00051317,00051318,00051319,0005131a,0005131b,0005132f,00051355,00051356,0005135c,00051363,00051364,0005136e,0005136f,00051371,0005137a,00051383,00051384,00051388,0005138a,0005139b,0005139c,000513c2,000513d6,000513d8,000513ee,000513f9,00051417,00051418,00051431,00051432,00051433,00051437,00051439,0005143a,0005143c,0005143d,0005143e,0005143f,00051442,0005149a,000514a0,00053fec,00053fed,00053fee,00054082,00055dbf,00056053,00056055,00056058,0005605c,00056090,00056091,00056092,000560ed,000560ee,000560ef,000560f0,000560f1,000560f2,000560f3,000560f4,0005bebe,0005bedf,0005bef1,0005bf28,0005bf29,0005bf2a,0005bf2b,0005bf2c,0005bf2d,0005bf2f,0005bf30,0005bf32,0005bf33,0005bf34,0005bf35,0005bf36,0005bf37,0005bf3f,0005bf40,0005bf41,0005bf42,0005bf44,0005bf45,0005bf46,0005bf47,0005bf48,0005bf49,0005bf63,0005bf64,0005bf65,0005bf66,0005bf6d,0005bf6e,0005bf6f,0005bf70,0005bf71,0005bf72,0005bf9e,0005cd7d,00060b29,000612c8,0006184c,0006184f,00061850,00061851,00061868,0006186b,000631e6,0006695d,00066a28,00066ac1,00066ac2,00066aef,0006786f,00067870,00067882,00067c4e,00067c73,00067de8,0006c769,0006c808,0006dede,0006dee3,0007003a,0007003b,0007003c,0007003d,0007003e,0007003f,00070040,00070041,00070042,00070045,00070046,00070047,00070048,00070049,0007004a,0007004b,0007004d,0007004f,00070050,00070051,00070052,00070054,0007005a,00070062,00070064,00070066,0007009d,0007009e,0007009f,000700a0,00070450,00070451,00070452,00070453,00070454,00070455,00070456,00070457,00070458,00070459,0007045a,0007045b,0007045c,0007045d,0007045e,0007045f,00070460,00070461,000705b8,000706d2,000706d6,00070d39,00070d3a,000719a6,000719fa,00071a2c,00071b63,00071c41,00071c54,00071c59,00071c5e,00071c7d,000725fb,000725fe,00072613,0007261d,00072625,00072626,0007262b,0007262e,00072633,00072634,00072636,00072637,0007263c,0007263f,00072640,00072644,00072646,00072649,0007264f,00072651,00072652,00072658,00072769,0007276a,0007289c,0007289e,0007535e,0007535f,00075363,00075381,00075385,00075622,00075741,0007892c,0007892d,0007892e,0007892f,00078930,00078931,0007987b,00079881,00079882,00079883,000798a5,0007999b,0007999c,000799e9,000799ea,0007a6e3,0007a6e4,0007b12f,0007b2c2,0007b2ca,0007b2cf,0007b2d6,0007b2e0,0007b2e1,0007b2e5,0007b2ec,0007b7c0,0007b7d7,0007b7ef,0007b8cf,0007b8d0,0007b9a2,0007b9ac,0007b9ad,0007b9b5,0007b9b6,0007b9b7,0007b9c7,0007b9c8,0007b9cc,0007b9d0,0007b9d1,0007b9d2,0007b9d3,0007b9e3,0007b9e8,0007b9e9,0007b9ea,0007b9eb,0007ba06,0007ba25,0007ba29,0007ba35,0007ba42,0007ba43,0007ba44,0007ba45,0007ba46,0007ba47,0007ba53,0007bc47,0007bc48,0007bc71,0007be16,0007be79,0007be7e,0007be81,0007be82,0007be8b,0007be8c,0007be95,0007be9c,0007be9e,0007bea2,0007beac,0007beae,0007beb8,0007beba,0007bec4,0007becd,0007becf,0007bed1,0007bedb,0007bee6,0007bee8,0007bef0,0007bef2,0007bef4,0007beff,0007bf00,0007bf01,0007bf07,0007bf0d,0007bf0e,0007bf14,0007bf1a,0007bf1b,0007bf27,0007bf28,0007bf34,0007bf35,0007bf3b,0007bf43,0007bf44,0007bf45,0007bf47,0007bf48,0007bf49,0007bf4b,0007bf4e,0007bf50,0007bf51,0007bf54,0007bf56,0007bf58,0007bf5a,0007bf5e,0007bf60,0007bf62,0007bf65,0007bf67,0007bf69,0007bf6b,0007bf6d,0007bf82,0007bf83,0007bf85,0007bf87,0007bf89,0007bf8b,0007bf8c,0007bf8e,0007bf98,0007bf99,0007bf9a,0007bf9d,0007bf9e,0007bf9f,0007bfa1,0007bfa5,0007bfab,0007bfbd,0007bfbe,0007bfc9,0007bfd4,0007bfd5,0007bfe0,0007bfe1,0007bfeb,0007bfec,0007bff7,0007bffd,0007c203,0007c6cc,0007c6cf,0007c6d7,0007c6db,0007c6dc,0007c6de,0007c6f6,0007c74c,0007c74d,0007ed39,0007ed3a,0007ed3b,0007ed3c,0007ed55,0007edc2,0007ee06,0007ee08,0007ee43,0007ee44,0007eedc,0007fab5,0007fbf4,0007fbf5,0007fc80,0007fc94,0007fd31,0007fd32,0007fd33,0007fe10,0007fe64,0007fe6c,0007ff22,00080049,00080056,000800e3,000800e5,00080168,00080169,0008016b,000812cf,000813d9,000813da,000813dc,00083c3e,000848ea,000848eb,000848ee,000848ef,0008499c,0008499d,000849a0,00085a3e,00085a40,00085a41,00085a7e,00085a7f,00085a80,00085bdc,00091f0a,00097104,0009c586,0009c587,0009c892,0009ec9f,0009f542,000a1e02,000a263d,000a263e,000a26b2,000a26b3,000a26b4,000a26b5,000a279d,000a27a8,000a27d1,000a27ea,000a27eb,000a27ec,000a2992,000a2995,000a33f6,000a80a5,000a80a6,000a80a7,000a80a8,000a80a9,000a80aa,000a80ab,000a80ac,000a80ad,000a80ae,000a80af,000a80b0,000a80b1,000a80b2,000a80b3,000a80b4,000a80b5,000a80b7,000a80b8,000a80b9,000a80ba,000a80bb,000a80bc,000a80bd,000a80bf,000a80c0,000a80c1,000a80c2,000a80c3,000a80c4,000a80c5,000a80c6,000a80c7,000a80c8,000a80c9,000a80ca,000a80cb,000a80cc,000a80cd,000a80ce,000a80cf,000a80d0,000a80d1,000a80d2,000a80d3,000a80d4,000a80d5,000a80d6,000a80d7,000a80d8,000a80d9,000a80da,000a80db,000a80dc,000a80f9,000a80ff,000a8100,000a8101,000a8609,000a8ddd,000a8dea,000acab0,000acdbf,000adfac,000b5267,000b5273,000bf5c9,000bf5ca,000bf5cb,000bf5cc,000c001f,000c0020,000c0109,000c2e09,000c2e0b,000c2ea6,000c2f3c,000c4c68,000c4cf3,000c4cf8,000c4cf9,000c675b,000c675c,000c675d,000c6763,000c681f,000c6820,000c6bcd,000c6bce,000c6c1a,000c6c1f,000c6c88,000c6c8d,000c7046,000cb286,000cdea3,000cedfb,000cf37e,000cf37f,000cf3fc,000cf3ff,000cf487,000cf54c,000cf551,000cf552,000cf64d,000cf668,000cfeab,000d17f7,000d57f7,000d5929,000d5a37,000d5a38,000d9139,000d913e,000d913f,000d93f4,000d9428,000d9429,000d942c,000d9433,000dac76,000dac78,000dac7a,000dac86,000db545,000dbdd7,000dbeed,000dbef1,000dbef7,000dc82d,000e046a,000e046b,000e046c,000e0495,000e064f,000e0ab6,000e0ace,000e0ad0,000e0ad3,000e140c,000e140d,000e140e,000e140f,000e1417,000e1418,000e1447,000e3d74,000e3d75,000e3df9,000e3dfa,000e3dfb,000e3dfc,000e48e6,000e73fd,000e73fe,000e73ff,000e7400,000e7401,000e7455,000e7456,000e7457,000e75e6,000e75e7,000eab6b,000eb409,000eb417,000eb418,000eb419,000eb41a,000ebe75,000ebe76,000ebe77,000ee660,000f005c,000f005e,000f0061,000f0062,000f067a,000f067b,000f6745,000f914a,000f914b,000f914c,000fe184,000fe185,000ffc75,000ffc76,00100219,0010021a,0010021c,00100220,00100be8,00100be9,00100bea,00100beb,00100bec,00100bed,00100bee,00100bef,00100bf0,00100bf1,00100c01,00100c02,00100c03,00100c05,00100c06,00100c07,00100c09,00100c0a,00100c0b,001029af,001029b0,00102d6f,00102d70,00102e37,00102e38,00102e9b,00103368,0010336b,001033a9,001033c3,001033c8,001033c9,001033d8,00103697,00103699,001036a2,001036a3,001036b2,001036b3,00103737,00103738,00103d2f,00103d56,00103d57,00105438,00105439,0010543a,0010543b,0010543d,00105eb6,00105eb8,00105eb9,00105eba,00105ebb,00105ebc,00105ebd,00105ebf,00105ec0,00105ec1,00105ec7,00106865,00106867,00106868,0010686a,0010686e,00106872,00106873,00106874,00106875,00106876,00106877,00106878,00106879,0010687a,0010687b,0010687c,00106883,00106884,00106981,00107185,00107186,00107187,00108a79,0010b930,0010b99e,0010b9a1,0010c32e,0010d1ee,0010d209,0010d20a,0010d20b,0010d32b,0010d330,0010d715,0010dc15,0010e0b4,0010e203,0010e204,0010e20d,0010e23b,0010e23c,0010e23d,0010e23e,0010e2ae,0010e2bd,0010e2be,0010e2bf,0010e2d1,0010e2f8,0010e323,0010e33d,0010e36f,0010e370,0010e371,0010e372,0010e375,0010e376,0010e377,0010e379,0010e37a,0010e438,0010e4bc,0010e4c1,0010e4e6,0010e4e7,0010e4e8,0010e547,0010e5ae,0010e5b0,001105cb,001105cd,001105cf,001105e9,001105ea,00110642,00110671,001107c6,001107c7,00114bce,00114bd0,001181a9,00119f27,00119f28,00119f2c,00119f38,0011aac8,0011aac9,0011aaca,0011aacd,0011ab08,0011ab0a,0011ab0b,0011ab3c,0011ab3d,0011ab45,0011ab46,0011ab47,0011c181,0011c3de,0011c3df,0011c3f2,0011c3f3,0011c3f5,0011e9c7,0011f288,0011f72c,0011f72f,0011f733,0011f737,00125259,0012525c,0012526c,0012527a,0012527b,0012527c,0012527d,00125358,0012537b,0012537c,0012537d,0012537e,00125381,00125384,001253db,001253fc,00125400,00125401,00125403,00125404,00125405,00125406,00125407,0012540b,0012540c,0012540d,0012540e,00125410,00125411,00125414,00125415,00125416,00125417,00125418,00125419,0012541a,0012541b,0012541c,0012541d,0012541e,0012541f,00125420,00125421,00125422,00125423,00125424,00125430,00125431,00125432,00125433,00125434,00125435,00125436,00125438,00125439,0012543a,0012543b,0012543c,0012543d,0012543e,0012543f,00125440,00125441,00125442,00125443,00125444,00125445,00125446,00125447,00125448,00125449,0012544b,0012544c,0012544d,0012544e,0012544f,00125450,00125451,00125452,00125453,00125454,00125455,00125456,00125457,00125458,00125459,0012545a,0012545b,0012545c,0012545d,0012545e,0012545f,00125460,00125461,00125462,00125463,00125464,00125465,00125466,00125467,00125468,00125469,0012546a,0012546b,0012546c,0012546d,0012546e,0012546f,00125470,00125471,00125472,00125473,00125474,00125475,00125476,00125477,00125478,00125479,0012547a,0012547b,0012547c,0012547d,0012547e,0012547f,00125480,00125481,00125482,00125483,00125484,00125485,00125486,00125487,00125488,00125489,0012548a,0012548b,0012548c,0012548d,0012548e,0012548f,00125490,00125491,00125492,00125493,00125494,00125495,00125496,00125497,00125498,00125499,0012549a,0012549b,0012549c,0012549d,0012549e,0012549f,001254a0,001254a1,001254a2,001254a3,001254a4,001254a5,001254a6,001254a7,001254a8,001254a9,001254aa,001254ab,001254ac,001254ad,001254ae,001254af,001254b0,001254b1,001254b2,001254b3,001254b4,001254b5,001254b6,001254b7,001254b8,001254b9,001254ba,001254bb,001254bc,001254bd,001254be,001254bf,001254c0,001254c1,001254c2,001254c3,001254c4,001254c5,001254c6,001254c7,001254c8,001254c9,001254ca,001254cb,001254cc,001254cd,001254ce,001254cf,001254d0,001254d2,001254d3,001254d4,001254d6,001254d7,001254d8,001254d9,001254da,001254db,001254dc,001254dd,001254de,001254df,001254e0,001254e1,001254e2,001254e3,001254e4,001254e5,001254e6,001254e7,001254e8,001254e9,001254ea,001254eb,001254ec,001254ed,001254ee,001254ef,001254f0,001254f1,001254f2,001254f3,001254f4,001254f5,001254f6,001254f7,001254f8,001254f9,001254fa,001254fb,001254fc,001254fd,001254fe,001254ff,00125500,00125501,00125502,00125503,00125504,00125505,00125506,00125507,00125528,00125529,0012552a,0012552c,0012553d,0012553e,0012553f,00125540,00125541,00125542,00125543,00125544,00125545,00125550,00125551,00125552,00125553,00125554,00125555,00125556,00125557,00125558,00125559,0012555a,0012555b,0012555c,0012555e,00125577,00125578,00125579,0012557a,0012558d,0012558e,0012558f,00125590,00125591,00125592,00125593,00125594,001255ad,001255ae,001255af,001255b0,001255b1,001255b2,001255be,001255bf,001255c0,001255c1,001255c2,001255c3,00125813,00125814,00125950,00125951,00125952,001277b7,001277b8,001277b9,00127803,00127804,001278a8,00127a10,00127a11,00127a12,00127d8e,00129687,00129688,001296c8,0012971a,0012971b,0012971c,00129aee,00129d47,00129d48,00129d49,00129d4a,0012da10,0012da73,0012dac3,0012dac4,0012e1a3,0012e1cd,0012e1ce,0012e1e1,0012e1e2,0012e1e3,0012e1e4,0012e1e6,0012e1e7,0012e221,0012e222,0012e237,0012e320,0012e321,0012e3b8,0012e3b9,0012f342,0012f346,00130647,001317e5,001317e6,001317e7,00132c0c,00132c46,00132e82,00132eb2,00132eb3,00132f1d,00132f1e,001332ec,001332f1,001332f2,001337cc,001337d2,001337d3,001337e0,001337e4,001337e5,001337e6,00133805,00134829,0013482a,0013482b,00135691,00135692,001356db,001356dc,001356fc,001356fe,001356ff,0013575d,00135798,001357b5,001358db,00135a55,00135b3e,00135ba8,00135dcf,00135dd5,00135e37,00135e40,00135e6d,00135e96,00135fc5,00136038,00136043,00136044,00136045,00136046,00136086,00136176,001361e7,001361f0,001361f1,001361f2,001361f3,001361f4,001361f6,001361f7,0013621c,00136226,00137396,00137725,00137732,0013773a,0013773b,0013773c,0013773d,001377e6,001377e7,001377f5,00137893,001378b9,001378ba,001378bb,001378bc,001378bd,001378be,00138278,00139477,00139ab4,00139ab9,00139aba,00139abb,00139abc,00139abd,00139abe,00139abf,00139ac0,00139ac1,00139ac2,00139ac3,00139ac4,00139ac5,00139ac6,00139b03,00139c0c,00139c26,00139e06,0013b79f,0013b7a0,0013b7a2,0013b7a3,0013b7dc,0013ca31,0013ca35,0013ca4d,0013d0ba,0013dd5c,0013e1e8,0013e1ed,0013e1f0,0013e1f7,0013e1f8,0013e1fb,0013e1fc,0013e211,0013e8cd,0013e8ce,0013e8d0,0013eb1f,0013eeef,0013eef0,0013eef1,0013ef0a,0013ef0e,0013ef22,0013ef23,0013ef27,0013ef34,0013ef9f,0013efa0,0013efa1,0013efa2,0013f139,0013f13a,0013f13b,0013f14d,0013f14e,0013f14f,0013f150,0013f191,0013f192,0013f193,0013f194,0013f195,0013f19d,0013f19e,0013f19f,0013f1a0,0013f1a8,0013f1a9,0013f1aa,0013f1b1,0013f1b2,0013f1b3,0013f1b4,0013f1bf,0013f1c4,0013f1de,0013f1fa,0013f1fb,0013f1fc,0013f291,0013f292,0013f295,0013f296,0013f2b6,0013f2b7,0013f2c8,0013f2da,0013f2db,0013f32a,0013f32b,0013f344,0013f345,0013f346,0013f347,0013f348,0013f34e,0013f34f,0013f350,0013f351,0013f352,0013f353,0013f354,0013f363,0013f364,0013f365,0013f366,0013f367,0013f368,0013f369,0013f36a,0013f36b,0013f36c,0013f383,0013f384,0013f385,0013f386,0013f39f,0013f3a0,0013f3a1,0013f3a2,0013f595,0013fd6f,0013fd70,0013fdf1,0013fe0e,0013fe1e,0013fe4a,0013fe89,0013fe8b,00140174,00141586,0014165b,0014165c,0014165d,001417a3,00141c80,00142239,00142704,00142705,00142706,00142708,00142897,00142945,00142946,00142ad4,00142d45,00142d46,00142e47,00142e66,00142f15,00142fa1,001430b9,001430ba,001430bc,001430bf,001430ff,00143101,00143102,00143138,001432fe,00143300,00143302,00143303,00143306,00143307,001447c7,00146436,001465b8,001465b9,00146b3d,00147c27,00147c29,00147dd7,00147de9,00147dfd,00147ebf,00147ed5,001490d8,00149146,00149147,00149148,00149149,0014914a,0014914e,00149294,00149297,001492bc,001492c6,00149333,00149334,00149335,00149778,00149795,00149796,00149797,001497a6,001497f8,0014bf56,0014c1e0,0014c1e1,0014c270,0014c281,0014c282,0014c284,0014c285,0014c286,0014ce64,0014de6f,0014de86,0014e587,0014e58c,0014e596,0014e5a1,0014f549,0014f59f,0014f5a0,0014f5a1,0014f5a6,0014f5a9,0014f5aa,0014f5ab,0014f5ac,0014f5ae,0014f5b5,0014f5b9,0014f5bc,0014f5bf,0014fcf8,0014fd03,0014fd04,0014fd08,0014fd0a,0014fd0f,0014fd11,0014fd15,0014fd20,0014fd21,0015014a,0015017f,001501b5,001501b7,001501b8,001501ca,001501cb,001501de,001501ea,001501ed,001501ee,0015025f,00150261,0015027e,0015028c,0015028f,00150290,00150291,001502a1,001502a2,001502a3,001502a4,001502a5,001502b3,001502c2,001502c3,001502c4,001502c5,001502ca,001502cf,001502dc,001502dd,001502e2,001502e3,001502e4,001502e5,001502f5,001502f6,001502fa,001502fb,001502fc,00150305,00150331,00150332,00150337,0015104b,0015292f,00153b14,00153b15 + 00002160,00002161,00002162,00002163,0000228a,0000228c,00002290,0000229a,0000229b,0000229e,0000229f,000022a0,000022a5,00005acf,0000f920,00013085,00013086,00013087,00013088,00013189,00013192,00013227,00013229,00013230,00013232,00013235,00013239,00013248,000132d2,000132da,000132ec,0001490d,00014911,00014914,0001491b,00014929,00014931,0001495f,00014969,00014995,0001499a,000149ad,000149c0,000149c5,00014a01,00014a09,00014a0b,00014b02,00014b04,00014b11,00014b37,00014b38,00014b39,00014b3c,00014b41,00014b44,00014b4c,00014b4e,00014b5a,00014b5d,00014b5f,00014b60,00014b61,00014b62,00014b63,00014b64,00014b65,00014b66,00014b67,00014b68,00014b77,0001508b,0001508c,00015092,00015093,000150a2,000150a3,00015dba,00015dcb,00015dd8,00016586,00016587,00016938,00016944,00016951,00016989,0001698b,00016996,0001be2d,0001be53,0001bf18,0001bf19,0001bf2a,0001bf3e,0001bf3f,0001bf40,0001cca0,0001cccc,0001cccd,0001ccce,0001cd12,0001cd13,0001cd22,0001cd23,0001cd32,0001cd33,0001cd35,0001cd3d,0001cd40,0001cdbc,0001cdf5,0001cdf6,0001cdfe,0001cdff,0001d17d,0001d17e,0001d17f,0001d180,0001d18c,0001dbaa,0001f79f,0001f7a0,0001f7c2,0001f7c3,0001f866,0001f909,000210a6,000210e3,00021223,0002125c,0002125d,0002125e,00021278,00021279,0002127c,000212dd,000212de,00021345,00021346,00021390,000213bd,00022b55,00022b56,00022b82,00022b86,00022b87,00022fa5,00022ffe,00022fff,00023000,00023001,00023002,00023003,0002324c,0002324d,00023276,00023278,000235c8,00024a0b,000250d5,000251b9,00028f78,00028f7c,00028f7f,00029161,0002a18e,0002a515,0002a517,0002af6d,0002af85,0002af86,0002ec72,0002ec76,0002ec7a,0002ec81,0002ec8a,0002ed91,0002ee39,00032159,000333f3,00033437,00034a5d,000364bb,00036516,00036517,00036518,00036519,0003651a,0003651b,0003651d,0003651e,0003651f,00036520,00036521,00036522,00036523,00036524,00036530,0003654b,0003654c,0003654e,0003654f,00036595,000365a0,000365a1,00036a22,00036a23,00036aac,00036aad,00036ab4,00036b03,00036c2f,00036c30,00036c31,00036c32,00036c33,00036c34,00036c50,00036c51,00036c52,00036c53,00036d06,00036dff,00036e02,00036e05,00036f90,00036f91,00036f92,00036f93,00036fb6,00036fbc,00036fbe,00036fc0,00036fc2,000371d3,00037339,00037976,00037bb1,00037e08,00037e67,0003a6ca,0003a6e8,0003a6f7,0003ac84,0003c071,0003c0b5,0003c4e2,0003c4fa,0003c5e0,0003ca4e,0003caeb,0003cf3d,0003cf42,0003cf44,0003cf6e,0003cf6f,0003cf73,0003d026,0003d027,0003d02d,0003d02e,0003d800,0003d801,0003d802,0003d803,0003d804,0003d805,0003d807,0003d808,0003d80b,0003d963,0003d9f5,0003da65,0003da8e,0003dac6,0003dac7,0003e34d,0003e34e,0003e34f,00043e0c,00043e0d,00043e0e,00043e0f,00043e10,00043e11,00043e15,00044a50,00045269,0004526a,0004526f,00045271,00045272,00045278,0004527a,0004527c,00045312,00045778,0004577a,00045784,000457c9,000457ca,000457cb,000457cc,000458d5,000458e0,000458f6,00045a34,00045d4c,00046544,00046545,00046f53,00047a2e,00047d47,0004c40a,0004c62e,0004c630,0004c631,0004c85f,0004c860,0004c86b,0004c86c,0004dc98,00051169,00051233,00051244,00051245,0005124b,0005124e,00051261,00051264,0005126a,00051270,0005128f,000512a1,000512a3,000512a4,000512ab,000512ac,000512ad,000512bd,000512be,000512c4,000512c8,000512cc,000512d9,000512da,000512db,000512df,000512e0,000512ec,000512ef,000512f0,000512f2,000512f7,000512f8,000512fe,000512ff,00051300,00051301,00051303,00051311,00051312,00051313,00051314,00051315,00051317,00051318,00051319,0005131a,0005131b,0005132f,00051355,00051356,0005135c,00051363,00051364,0005136e,0005136f,00051371,0005137a,00051383,00051384,00051388,0005138a,0005139b,0005139c,000513c2,000513d6,000513d8,000513ee,000513f9,00051417,00051418,00051431,00051432,00051433,00051437,00051439,0005143a,0005143c,0005143d,0005143e,0005143f,00051442,0005149a,000514a0,00053fec,00053fed,00053fee,00054082,00055dbf,00056053,00056055,00056058,0005605c,00056090,00056091,00056092,000560ed,000560ee,000560ef,000560f0,000560f1,000560f2,000560f3,000560f4,0005bebe,0005bedf,0005bef1,0005bf28,0005bf29,0005bf2a,0005bf2b,0005bf2c,0005bf2d,0005bf2f,0005bf30,0005bf32,0005bf33,0005bf34,0005bf35,0005bf36,0005bf37,0005bf3f,0005bf40,0005bf41,0005bf42,0005bf44,0005bf45,0005bf46,0005bf47,0005bf48,0005bf49,0005bf63,0005bf64,0005bf65,0005bf66,0005bf6d,0005bf6e,0005bf6f,0005bf70,0005bf71,0005bf72,0005bf9e,0005cd7d,00060b29,000612c8,0006184c,0006184f,00061850,00061851,00061868,0006186b,000631e6,0006695d,00066a28,00066ac1,00066ac2,00066aef,0006786f,00067870,00067882,00067c4e,00067c73,00067de8,0006c769,0006c808,0006dede,0006dee3,0007003a,0007003b,0007003c,0007003d,0007003e,0007003f,00070040,00070041,00070042,00070045,00070046,00070047,00070048,00070049,0007004a,0007004b,0007004d,0007004f,00070050,00070051,00070052,00070054,0007005a,00070062,00070064,00070066,0007009d,0007009e,0007009f,000700a0,00070450,00070451,00070452,00070453,00070454,00070455,00070456,00070457,00070458,00070459,0007045a,0007045b,0007045c,0007045d,0007045e,0007045f,00070460,00070461,000705b8,000706d2,000706d6,00070d39,00070d3a,000719a6,000719fa,00071a2c,00071b63,00071c41,00071c54,00071c59,00071c5e,00071c7d,000725fb,000725fe,00072613,0007261d,00072625,00072626,0007262b,0007262e,00072633,00072634,00072636,00072637,0007263c,0007263f,00072640,00072644,00072646,00072649,0007264f,00072651,00072652,00072658,00072769,0007276a,0007289c,0007289e,0007535e,0007535f,00075363,00075381,00075385,00075622,00075741,0007892c,0007892d,0007892e,0007892f,00078930,00078931,0007987b,00079881,00079882,00079883,000798a5,0007999b,0007999c,000799e9,000799ea,0007a6e3,0007a6e4,0007b12f,0007b2c2,0007b2ca,0007b2cf,0007b2d6,0007b2e0,0007b2e1,0007b2e5,0007b2ec,0007b7c0,0007b7d7,0007b7ef,0007b8cf,0007b8d0,0007b9a2,0007b9ac,0007b9ad,0007b9b5,0007b9b6,0007b9b7,0007b9c7,0007b9c8,0007b9cc,0007b9d0,0007b9d1,0007b9d2,0007b9d3,0007b9e3,0007b9e8,0007b9e9,0007b9ea,0007b9eb,0007ba06,0007ba25,0007ba29,0007ba35,0007ba42,0007ba43,0007ba44,0007ba45,0007ba46,0007ba47,0007ba53,0007bc47,0007bc48,0007bc71,0007be16,0007be79,0007be7e,0007be81,0007be82,0007be8b,0007be8c,0007be95,0007be9c,0007be9e,0007bea2,0007beac,0007beae,0007beb8,0007beba,0007bec4,0007becd,0007becf,0007bed1,0007bedb,0007bee6,0007bee8,0007bef0,0007bef2,0007bef4,0007beff,0007bf00,0007bf01,0007bf07,0007bf0d,0007bf0e,0007bf14,0007bf1a,0007bf1b,0007bf27,0007bf28,0007bf34,0007bf35,0007bf3b,0007bf43,0007bf44,0007bf45,0007bf47,0007bf48,0007bf49,0007bf4b,0007bf4e,0007bf50,0007bf51,0007bf54,0007bf56,0007bf58,0007bf5a,0007bf5e,0007bf60,0007bf62,0007bf65,0007bf67,0007bf69,0007bf6b,0007bf6d,0007bf82,0007bf83,0007bf85,0007bf87,0007bf89,0007bf8b,0007bf8c,0007bf8e,0007bf98,0007bf99,0007bf9a,0007bf9d,0007bf9e,0007bf9f,0007bfa1,0007bfa5,0007bfab,0007bfbd,0007bfbe,0007bfc9,0007bfd4,0007bfd5,0007bfe0,0007bfe1,0007bfeb,0007bfec,0007bff7,0007bffd,0007c203,0007c6cc,0007c6cf,0007c6d7,0007c6db,0007c6dc,0007c6de,0007c6f6,0007c74c,0007c74d,0007ed39,0007ed3a,0007ed3b,0007ed3c,0007ed55,0007edc2,0007ee06,0007ee08,0007ee43,0007ee44,0007eedc,0007fab5,0007fbf4,0007fbf5,0007fc80,0007fc94,0007fd31,0007fd32,0007fd33,0007fe10,0007fe64,0007fe6c,0007ff22,00080049,00080056,000800e3,000800e5,00080168,00080169,0008016b,000812cf,000813d9,000813da,000813dc,00083c3e,000848ea,000848eb,000848ee,000848ef,0008499c,0008499d,000849a0,00085a3e,00085a40,00085a41,00085a7e,00085a7f,00085a80,00085bdc,00091f0a,00097104,0009c586,0009c587,0009c892,0009ec9f,0009f542,000a1e02,000a263d,000a263e,000a26b2,000a26b3,000a26b4,000a26b5,000a279d,000a27a8,000a27d1,000a27ea,000a27eb,000a27ec,000a2992,000a2995,000a33f6,000a80a5,000a80a6,000a80a7,000a80a8,000a80a9,000a80aa,000a80ab,000a80ac,000a80ad,000a80ae,000a80af,000a80b0,000a80b1,000a80b2,000a80b3,000a80b4,000a80b5,000a80b7,000a80b8,000a80b9,000a80ba,000a80bb,000a80bc,000a80bd,000a80bf,000a80c0,000a80c1,000a80c2,000a80c3,000a80c4,000a80c5,000a80c6,000a80c7,000a80c8,000a80c9,000a80ca,000a80cb,000a80cc,000a80cd,000a80ce,000a80cf,000a80d0,000a80d1,000a80d2,000a80d3,000a80d4,000a80d5,000a80d6,000a80d7,000a80d8,000a80d9,000a80da,000a80db,000a80dc,000a80f9,000a80ff,000a8100,000a8101,000a8609,000a8ddd,000a8dea,000acab0,000acdbf,000adfac,000b5267,000b5273,000bf5c9,000bf5ca,000bf5cb,000bf5cc,000c001f,000c0020,000c0109,000c2e09,000c2e0b,000c2ea6,000c2f3c,000c4c68,000c4cf3,000c4cf8,000c4cf9,000c675b,000c675c,000c675d,000c6763,000c681f,000c6820,000c6bcd,000c6bce,000c6c1a,000c6c1f,000c6c88,000c6c8d,000c7046,000cb286,000cdea3,000cedfb,000cf37e,000cf37f,000cf3fc,000cf3ff,000cf487,000cf54c,000cf551,000cf552,000cf64d,000cf668,000cfeab,000d17f7,000d57f7,000d5929,000d5a37,000d5a38,000d9139,000d913e,000d913f,000d93f4,000d9428,000d9429,000d942c,000d9433,000dac76,000dac78,000dac7a,000dac86,000db545,000dbdd7,000dbeed,000dbef1,000dbef7,000dc82d,000e046a,000e046b,000e046c,000e0495,000e064f,000e0ab6,000e0ace,000e0ad0,000e0ad3,000e140c,000e140d,000e140e,000e140f,000e1417,000e1418,000e1447,000e3d74,000e3d75,000e3df9,000e3dfa,000e3dfb,000e3dfc,000e48e6,000e73fd,000e73fe,000e73ff,000e7400,000e7401,000e7455,000e7456,000e7457,000e75e6,000e75e7,000eab6b,000eb409,000eb417,000eb418,000eb419,000eb41a,000ebe75,000ebe76,000ebe77,000ee660,000f005c,000f005e,000f0061,000f0062,000f067a,000f067b,000f6745,000f914a,000f914b,000f914c,000fe184,000fe185,000ffc75,000ffc76,00100219,0010021a,0010021c,00100220,00100be8,00100be9,00100bea,00100beb,00100bec,00100bed,00100bee,00100bef,00100bf0,00100bf1,00100c01,00100c02,00100c03,00100c05,00100c06,00100c07,00100c09,00100c0a,00100c0b,001029af,001029b0,00102d6f,00102d70,00102e37,00102e38,00102e9b,00103368,0010336b,001033a9,001033c3,001033c8,001033c9,001033d8,00103697,00103699,001036a2,001036a3,001036b2,001036b3,00103737,00103738,00103d2f,00103d56,00103d57,00105438,00105439,0010543a,0010543b,0010543d,00105eb6,00105eb8,00105eb9,00105eba,00105ebb,00105ebc,00105ebd,00105ebf,00105ec0,00105ec1,00105ec7,00106865,00106867,00106868,0010686a,0010686e,00106872,00106873,00106874,00106875,00106876,00106877,00106878,00106879,0010687a,0010687b,0010687c,00106883,00106884,00106981,00107185,00107186,00107187,00108a79,0010b930,0010b99e,0010b9a1,0010c32e,0010d1ee,0010d209,0010d20a,0010d20b,0010d32b,0010d330,0010d715,0010dc15,0010e0b4,0010e203,0010e204,0010e20d,0010e23b,0010e23c,0010e23d,0010e23e,0010e2ae,0010e2bd,0010e2be,0010e2bf,0010e2d1,0010e2f8,0010e323,0010e33d,0010e36f,0010e370,0010e371,0010e372,0010e375,0010e376,0010e377,0010e379,0010e37a,0010e438,0010e4bc,0010e4c1,0010e4e6,0010e4e7,0010e4e8,0010e547,0010e5ae,0010e5b0,001105cb,001105cd,001105cf,001105e9,001105ea,00110642,00110671,001107c6,001107c7,00114bce,00114bd0,001181a9,00119f27,00119f28,00119f2c,00119f38,0011aac8,0011aac9,0011aaca,0011aacd,0011ab08,0011ab0a,0011ab0b,0011ab3c,0011ab3d,0011ab45,0011ab46,0011ab47,0011c181,0011c3de,0011c3df,0011c3f2,0011c3f3,0011c3f5,0011e9c7,0011f288,0011f72c,0011f72f,0011f733,0011f737,00125259,0012525c,0012526c,0012527a,0012527b,0012527c,0012527d,00125358,0012537b,0012537c,0012537d,0012537e,00125381,00125384,001253db,001253fc,00125400,00125401,00125403,00125404,00125405,00125406,00125407,0012540b,0012540c,0012540d,0012540e,00125410,00125411,00125414,00125415,00125416,00125417,00125418,00125419,0012541a,0012541b,0012541c,0012541d,0012541e,0012541f,00125420,00125421,00125422,00125423,00125424,00125430,00125431,00125432,00125433,00125434,00125435,00125436,00125438,00125439,0012543a,0012543b,0012543c,0012543d,0012543e,0012543f,00125440,00125441,00125442,00125443,00125444,00125445,00125446,00125447,00125448,00125449,0012544b,0012544c,0012544d,0012544e,0012544f,00125450,00125451,00125452,00125453,00125454,00125455,00125456,00125457,00125458,00125459,0012545a,0012545b,0012545c,0012545d,0012545e,0012545f,00125460,00125461,00125462,00125463,00125464,00125465,00125466,00125467,00125468,00125469,0012546a,0012546b,0012546c,0012546d,0012546e,0012546f,00125470,00125471,00125472,00125473,00125474,00125475,00125476,00125477,00125478,00125479,0012547a,0012547b,0012547c,0012547d,0012547e,0012547f,00125480,00125481,00125482,00125483,00125484,00125485,00125486,00125487,00125488,00125489,0012548a,0012548b,0012548c,0012548d,0012548e,0012548f,00125490,00125491,00125492,00125493,00125494,00125495,00125496,00125497,00125498,00125499,0012549a,0012549b,0012549c,0012549d,0012549e,0012549f,001254a0,001254a1,001254a2,001254a3,001254a4,001254a5,001254a6,001254a7,001254a8,001254a9,001254aa,001254ab,001254ac,001254ad,001254ae,001254af,001254b0,001254b1,001254b2,001254b3,001254b4,001254b5,001254b6,001254b7,001254b8,001254b9,001254ba,001254bb,001254bc,001254bd,001254be,001254bf,001254c0,001254c1,001254c2,001254c3,001254c4,001254c5,001254c6,001254c7,001254c8,001254c9,001254ca,001254cb,001254cc,001254cd,001254ce,001254cf,001254d0,001254d2,001254d3,001254d4,001254d6,001254d7,001254d8,001254d9,001254da,001254db,001254dc,001254dd,001254de,001254df,001254e0,001254e1,001254e2,001254e3,001254e4,001254e5,001254e6,001254e7,001254e8,001254e9,001254ea,001254eb,001254ec,001254ed,001254ee,001254ef,001254f0,001254f1,001254f2,001254f3,001254f4,001254f5,001254f6,001254f7,001254f8,001254f9,001254fa,001254fb,001254fc,001254fd,001254fe,001254ff,00125500,00125501,00125502,00125503,00125504,00125505,00125506,00125507,00125528,00125529,0012552a,0012552c,0012553d,0012553e,0012553f,00125540,00125541,00125542,00125543,00125544,00125545,00125550,00125551,00125552,00125553,00125554,00125555,00125556,00125557,00125558,00125559,0012555a,0012555b,0012555c,0012555e,00125577,00125578,00125579,0012557a,0012558d,0012558e,0012558f,00125590,00125591,00125592,00125593,00125594,001255ad,001255ae,001255af,001255b0,001255b1,001255b2,001255be,001255bf,001255c0,001255c1,001255c2,001255c3,00125813,00125814,00125950,00125951,00125952,001277b7,001277b8,001277b9,00127803,00127804,001278a8,00127a10,00127a11,00127a12,00127d8e,00129687,00129688,001296c8,0012971a,0012971b,0012971c,00129aee,00129d47,00129d48,00129d49,00129d4a,0012da10,0012da73,0012dac3,0012dac4,0012e1a3,0012e1cd,0012e1ce,0012e1e1,0012e1e2,0012e1e3,0012e1e4,0012e1e6,0012e1e7,0012e221,0012e222,0012e237,0012e320,0012e321,0012e3b8,0012e3b9,0012f342,0012f346,00130647,001317e5,001317e6,001317e7,00132c0c,00132c46,00132e82,00132eb2,00132eb3,00132f1d,00132f1e,001332ec,001332f1,001332f2,001337cc,001337d2,001337d3,001337e0,001337e4,001337e5,001337e6,00133805,00134829,0013482a,0013482b,00135691,00135692,001356db,001356dc,001356fc,001356fe,001356ff,0013575d,00135798,001357b5,001358db,00135a55,00135b3e,00135ba8,00135dcf,00135dd5,00135e37,00135e40,00135e6d,00135e96,00135fc5,00136038,00136043,00136044,00136045,00136046,00136086,00136176,001361e7,001361f0,001361f1,001361f2,001361f3,001361f4,001361f6,001361f7,0013621c,00136226,00137396,00137725,00137732,0013773a,0013773b,0013773c,0013773d,001377e6,001377e7,001377f5,00137893,001378b9,001378ba,001378bb,001378bc,001378bd,001378be,00138278,00139477,00139ab4,00139ab9,00139aba,00139abb,00139abc,00139abd,00139abe,00139abf,00139ac0,00139ac1,00139ac2,00139ac3,00139ac4,00139ac5,00139ac6,00139b03,00139c0c,00139c26,00139e06,0013b79f,0013b7a0,0013b7a2,0013b7a3,0013b7dc,0013ca31,0013ca35,0013ca4d,0013d0ba,0013dd5c,0013e1e8,0013e1ed,0013e1f0,0013e1f7,0013e1f8,0013e1fb,0013e1fc,0013e211,0013e8cd,0013e8ce,0013e8d0,0013eb1f,0013eeef,0013eef0,0013eef1,0013ef0a,0013ef0e,0013ef22,0013ef23,0013ef27,0013ef34,0013ef9f,0013efa0,0013efa1,0013efa2,0013f139,0013f13a,0013f13b,0013f14d,0013f14e,0013f14f,0013f150,0013f191,0013f192,0013f193,0013f194,0013f195,0013f19d,0013f19e,0013f19f,0013f1a0,0013f1a8,0013f1a9,0013f1aa,0013f1b1,0013f1b2,0013f1b3,0013f1b4,0013f1bf,0013f1c4,0013f1de,0013f1fa,0013f1fb,0013f1fc,0013f291,0013f292,0013f295,0013f296,0013f2b6,0013f2b7,0013f2c8,0013f2da,0013f2db,0013f32a,0013f32b,0013f344,0013f345,0013f346,0013f347,0013f348,0013f34e,0013f34f,0013f350,0013f351,0013f352,0013f353,0013f354,0013f363,0013f364,0013f365,0013f366,0013f367,0013f368,0013f369,0013f36a,0013f36b,0013f36c,0013f383,0013f384,0013f385,0013f386,0013f39f,0013f3a0,0013f3a1,0013f3a2,0013f595,0013fd6f,0013fd70,0013fdf1,0013fe0e,0013fe1e,0013fe4a,0013fe89,0013fe8b,00140174,00141586,0014165b,0014165c,0014165d,001417a3,00141c80,00142239,00142704,00142705,00142706,00142708,00142897,00142945,00142946,00142ad4,00142d45,00142d46,00142e47,00142e66,00142f15,00142fa1,001430b9,001430ba,001430bc,001430bf,001430ff,00143101,00143102,00143138,001432fe,00143300,00143302,00143303,00143306,00143307,001447c7,00146436,001465b8,001465b9,00146b3d,00147c27,00147c29,00147dd7,00147de9,00147dfd,00147ebf,00147ed5,001490d8,00149146,00149147,00149148,00149149,0014914a,0014914e,00149294,00149297,001492bc,001492c6,00149333,00149334,00149335,00149778,00149795,00149796,00149797,001497a6,001497f8,0014bf56,0014c1e0,0014c1e1,0014c270,0014c281,0014c282,0014c284,0014c285,0014c286,0014ce64,0014de6f,0014de86,0014e587,0014e58c,0014e596,0014e5a1,0014f549,0014f59f,0014f5a0,0014f5a1,0014f5a6,0014f5a9,0014f5aa,0014f5ab,0014f5ac,0014f5ae,0014f5b5,0014f5b9,0014f5bc,0014f5bf,0014fcf8,0014fd03,0014fd04,0014fd08,0014fd0a,0014fd0f,0014fd11,0014fd15,0014fd20,0014fd21,0015014a,0015017f,001501b5,001501b7,001501b8,001501ca,001501cb,001501de,001501ea,001501ed,001501ee,0015025f,00150261,0015027e,0015028c,0015028f,00150290,00150291,001502a1,001502a2,001502a3,001502a4,001502a5,001502b3,001502c2,001502c3,001502c4,001502c5,001502ca,001502cf,001502dc,001502dd,001502e2,001502e3,001502e4,001502e5,001502f5,001502f6,001502fa,001502fb,001502fc,00150305,00150331,00150332,00150337,0015104b,0015292f,00153b14,00153b15 1 @@ -492245,6 +492245,13 @@ + + 000030ba + 00066859 + + + +