Full Code of Odie/skyui-vr for AI

master bbe0c3264e60 cached
993 files
4.5 MB
1.2M tokens
145 symbols
1 requests
Download .txt
Showing preview only (4,950K chars total). Download the full file or copy to clipboard to get everything.
Repository: Odie/skyui-vr
Branch: master
Commit: bbe0c3264e60
Files: 993
Total size: 4.5 MB

Directory structure:
gitextract_9k0d2l5e/

├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── build/
│   ├── .gitignore
│   ├── exported/
│   │   ├── skyui/
│   │   │   └── .gitkeep
│   │   └── widgets/
│   │       └── skyui/
│   │           └── .gitkeep
│   └── skyui/
│       └── config.txt
├── dist/
│   ├── .gitignore
│   ├── Data/
│   │   ├── Interface/
│   │   │   ├── Translations/
│   │   │   │   ├── SkyUI_czech.txt
│   │   │   │   ├── SkyUI_english.txt
│   │   │   │   ├── SkyUI_french.txt
│   │   │   │   ├── SkyUI_german.txt
│   │   │   │   ├── SkyUI_italian.txt
│   │   │   │   ├── SkyUI_japanese.txt
│   │   │   │   ├── SkyUI_polish.txt
│   │   │   │   ├── SkyUI_russian.txt
│   │   │   │   └── SkyUI_spanish.txt
│   │   │   └── skyui/
│   │   │       ├── config.txt
│   │   │       └── res/
│   │   │           └── mcm_logo.dds
│   │   ├── Readme - SkyUI.txt
│   │   ├── Scripts/
│   │   │   ├── Headers/
│   │   │   │   ├── SKI_ConfigBase.psc
│   │   │   │   └── SKI_QuestBase.psc
│   │   │   └── Source/
│   │   │       ├── SKI_ActiveEffectsWidget.psc
│   │   │       ├── SKI_ConfigBase.psc
│   │   │       ├── SKI_ConfigManager.psc
│   │   │       ├── SKI_ConfigMenu.psc
│   │   │       ├── SKI_FavoritesManager.psc
│   │   │       ├── SKI_Main.psc
│   │   │       ├── SKI_PlayerInventoryHook.psc
│   │   │       ├── SKI_PlayerLoadGameAlias.psc
│   │   │       ├── SKI_QF_ConfigManagerInstance.psc
│   │   │       ├── SKI_QuestBase.psc
│   │   │       ├── SKI_SettingsManager.psc
│   │   │       ├── SKI_WidgetBase.psc
│   │   │       └── SKI_WidgetManager.psc
│   │   ├── SkyUI_SE.esp
│   │   └── fomod/
│   │       ├── info.xml
│   │       └── script.cs
│   ├── Examples/
│   │   └── MCM/
│   │       ├── ConfigMenuTemplate.psc
│   │       ├── ExampleConfigMenu.esp
│   │       └── ExampleConfigMenu.psc
│   ├── bsascript.txt
│   ├── filegroup_all.txt
│   ├── filegroup_interface.txt
│   ├── filegroup_misc.txt
│   ├── filegroup_scripts.txt
│   ├── make_all.pl
│   ├── make_archive.pl
│   └── make_scripts.pl
├── misc/
│   ├── ArrowCount/
│   │   ├── Interface/
│   │   │   └── exported/
│   │   │       └── widgets/
│   │   │           └── skyui/
│   │   │               └── arrowcount.swf
│   │   └── Scripts/
│   │       └── Source/
│   │           └── PN_ArrowCountWidget.psc
│   ├── Configs/
│   │   ├── 5760x1080, by Ismelda/
│   │   │   └── skyui.cfg
│   │   ├── 5760x2160, by Ismelda/
│   │   │   └── skyui.cfg
│   │   └── ValueWeight Column/
│   │       └── skyui.cfg
│   ├── Flash Util/
│   │   ├── SkyUI - make_all.jsfl
│   │   ├── SkyUI - make_archive (fast).jsfl
│   │   ├── SkyUI - make_archive.jsfl
│   │   ├── build-all.jsfl
│   │   └── skyui_runscript.bat
│   ├── Icon Themes/
│   │   ├── Celtic, by GreatClone/
│   │   │   ├── skyui_icons_cat.swf
│   │   │   └── skyui_icons_inv.swf
│   │   ├── Curved, by T3T/
│   │   │   ├── skyui_icons_cat.swf
│   │   │   └── skyui_icons_inv.swf
│   │   └── Straight, by T3T/
│   │       ├── skyui_icons_cat.swf
│   │       └── skyui_icons_inv.swf
│   ├── Original Translates/
│   │   ├── Translate_ENGLISH.txt
│   │   ├── Translate_FRENCH.txt
│   │   ├── Translate_GERMAN.txt
│   │   ├── Translate_ITALIAN.txt
│   │   ├── Translate_Japanese.txt
│   │   ├── Translate_RUSSIAN.txt
│   │   ├── Translate_SPANISH.txt
│   │   ├── Translate_czech.txt
│   │   └── translate_polish.txt
│   ├── PrimaryNeeds/
│   │   ├── Interface/
│   │   │   └── exported/
│   │   │       └── widgets/
│   │   │           └── pnx/
│   │   │               └── statusicons.swf
│   │   ├── PrimaryNeeds.esp
│   │   └── Scripts/
│   │       ├── PN_FoodEffect.pex
│   │       ├── PN_IconWidget.pex
│   │       ├── PN_NeedsManager.pex
│   │       └── Source/
│   │           ├── PN_FoodEffect.psc
│   │           ├── PN_IconWidget.psc
│   │           └── PN_NeedsManager.psc
│   ├── Translations/
│   │   ├── SkyUI_Translations.txt
│   │   └── make_translations.pl
│   ├── cp-built-files
│   ├── decompile-pex
│   ├── pack-release
│   ├── rename-png
│   └── reorder-psc
├── sksevr_plugin/
│   ├── .editorconfig
│   ├── .gitignore
│   ├── README.md
│   ├── build.ini
│   ├── build.py
│   ├── lib/
│   │   └── openvr_api.lib
│   ├── lua/
│   │   ├── MainEntry.lua
│   │   ├── defaults-general.lua
│   │   ├── defaults-knuckles.lua
│   │   ├── defaults-oculus.lua
│   │   ├── defaults-vive.lua
│   │   ├── defaults-wmr.lua
│   │   └── inspect.lua
│   ├── lua-tests/
│   │   └── core_spec.lua
│   ├── luajit.vcxproj
│   ├── plugin/
│   │   ├── ControllerStateHook.cpp
│   │   ├── ControllerStateHook.h
│   │   ├── FormDB.cpp
│   │   ├── FormDB.h
│   │   ├── Globals.h
│   │   ├── Keyboard.cpp
│   │   ├── Keyboard.h
│   │   ├── PapyrusUIFix.cpp
│   │   ├── PapyrusUIFix.h
│   │   ├── ScaleformExtendedDataFix.cpp
│   │   ├── ScaleformExtendedDataFix.h
│   │   ├── Settings.cpp
│   │   ├── Settings.h
│   │   ├── VRHookAPI.h
│   │   ├── exports.def
│   │   ├── guicon.cpp
│   │   ├── guicon.h
│   │   ├── lua_glue.cpp
│   │   ├── lua_glue.h
│   │   ├── main.cpp
│   │   ├── plugin.vcxproj
│   │   ├── plugin.vcxproj.filters
│   │   └── scripts/
│   │       └── ExportPlugin.psc
│   ├── plugin.sln
│   └── tools/
│       └── run-lua-tests
└── src/
    ├── .gitignore
    ├── CLIK/
    │   ├── Mouse.as
    │   ├── Selection.as
    │   ├── Stage.as
    │   ├── System/
    │   │   └── capabilities.as
    │   └── gfx/
    │       ├── controls/
    │       │   ├── Button.as
    │       │   ├── ButtonBar.as
    │       │   ├── ButtonGroup.as
    │       │   ├── CoreList.as
    │       │   ├── OptionStepper.as
    │       │   ├── RadioButton.as
    │       │   ├── ScrollBar.as
    │       │   ├── ScrollIndicator.as
    │       │   ├── ScrollingList.as
    │       │   ├── Slider.as
    │       │   ├── TextArea.as
    │       │   └── TextInput.as
    │       ├── core/
    │       │   └── UIComponent.as
    │       ├── data/
    │       │   └── DataProvider.as
    │       ├── events/
    │       │   └── EventDispatcher.as
    │       ├── io/
    │       │   └── GameDelegate.as
    │       ├── managers/
    │       │   ├── FocusHandler.as
    │       │   └── InputDelegate.as
    │       ├── ui/
    │       │   ├── InputDetails.as
    │       │   └── NavigationCode.as
    │       └── utils/
    │           ├── Constraints.as
    │           └── Locale.as
    ├── Common/
    │   ├── Components/
    │   │   ├── BlinkOnDemandMeter.as
    │   │   ├── BlinkOnEmptyMeter.as
    │   │   ├── CrossPlatformButtons.as
    │   │   ├── DeltaMeter.as
    │   │   ├── Meter.as
    │   │   └── UniformTimeMeter.as
    │   ├── MouseRotationInputCatcher.as
    │   ├── QuantitySlider.as
    │   ├── SaveLoadPanel.as
    │   ├── Shared/
    │   │   ├── BSScrollingList.as
    │   │   ├── ButtonChange.as
    │   │   ├── ButtonTextArtHolder.as
    │   │   ├── CenteredScrollingList.as
    │   │   ├── ExtractPlatformText.as
    │   │   ├── GlobalFunc.as
    │   │   ├── ListFilterer.as
    │   │   ├── Macros.as
    │   │   ├── PlatformChangeUser.as
    │   │   └── Platforms.as
    │   ├── mx/
    │   │   └── transitions/
    │   │       └── Tween.as
    │   ├── skse.as
    │   └── skyui/
    │       ├── VRInput.as
    │       ├── components/
    │       │   ├── BottomBarMappedButton.as
    │       │   ├── ButtonPanel.as
    │       │   ├── MappedButton.as
    │       │   ├── MaskedTextArea.as
    │       │   ├── Meter.as
    │       │   ├── SearchWidget.as
    │       │   ├── Slider.as
    │       │   ├── TabBar.as
    │       │   ├── colorswatch/
    │       │   │   ├── ColorSquare.as
    │       │   │   └── ColorSwatch.as
    │       │   ├── dialog/
    │       │   │   ├── BasicDialog.as
    │       │   │   └── ColumnSelectDialog.as
    │       │   └── list/
    │       │       ├── BSList.as
    │       │       ├── BasicEnumeration.as
    │       │       ├── BasicList.as
    │       │       ├── BasicListEntry.as
    │       │       ├── ButtonList.as
    │       │       ├── ButtonListEntry.as
    │       │       ├── ColumnDescriptor.as
    │       │       ├── ColumnLayoutData.as
    │       │       ├── EntryClipManager.as
    │       │       ├── FilteredEnumeration.as
    │       │       ├── IEntryEnumeration.as
    │       │       ├── IListProcessor.as
    │       │       ├── ListLayout.as
    │       │       ├── ListLayoutManager.as
    │       │       ├── ListState.as
    │       │       ├── ScrollingList.as
    │       │       ├── SortedListHeader.as
    │       │       ├── TabularList.as
    │       │       └── TabularListEntry.as
    │       ├── defines/
    │       │   ├── Actor.as
    │       │   ├── Armor.as
    │       │   ├── ButtonArtNames.as
    │       │   ├── Form.as
    │       │   ├── Input.as
    │       │   ├── Inventory.as
    │       │   ├── Item.as
    │       │   ├── Magic.as
    │       │   ├── Material.as
    │       │   ├── Screen.as
    │       │   └── Weapon.as
    │       ├── filter/
    │       │   ├── IFilter.as
    │       │   ├── ItemTypeFilter.as
    │       │   ├── NameFilter.as
    │       │   └── SortFilter.as
    │       ├── props/
    │       │   ├── CompoundProperty.as
    │       │   ├── ItemFilter.as
    │       │   ├── PropertyDataExtender.as
    │       │   └── PropertyLookup.as
    │       └── util/
    │           ├── ColorFunctions.as
    │           ├── ConfigManager.as
    │           ├── Debug.as
    │           ├── DialogManager.as
    │           ├── EffectIconMap.as
    │           ├── GlobalFunctions.as
    │           ├── Hash.as
    │           ├── Input.as
    │           ├── MarkupParser.as
    │           ├── Translator.as
    │           └── Tween.as
    ├── CraftingMenu/
    │   ├── CraftingDataSetter.as
    │   ├── CraftingIconSetter.as
    │   ├── CraftingListEntry.as
    │   ├── CraftingLists.as
    │   ├── CraftingMenu.as
    │   ├── CustomAlchemyDataSetter.as
    │   ├── CustomConstructDataSetter.as
    │   ├── EnchantingBar.as
    │   ├── IconTabList.as
    │   ├── IconTabListEntry.as
    │   └── craftingmenu.fla
    ├── Enderal/
    │   ├── ButtonGrid.as
    │   ├── ButtonGridEntry.as
    │   ├── DataLoader.as
    │   ├── SkillMenu.as
    │   ├── SkillMenu.fla
    │   ├── SkillMenu.swf
    │   ├── SkillMenuData.txt
    │   ├── SkillTreeEntry.as
    │   └── SkillTreeView.as
    ├── FavoritesMenu/
    │   ├── FavoritesIconSetter.as
    │   ├── FavoritesListEntry.as
    │   ├── FavoritesMenu.as
    │   ├── FilterDataExtender.as
    │   ├── GroupButton.as
    │   ├── GroupDataExtender.as
    │   └── favoritesmenu.fla
    ├── HUDWidgets/
    │   ├── WidgetLoader.as
    │   ├── activeeffects.fla
    │   ├── arrowcount.fla
    │   ├── meter.fla
    │   ├── minimap.fla
    │   ├── pnx/
    │   │   └── widgets/
    │   │       └── StatusIconWidget.as
    │   ├── skyui/
    │   │   └── widgets/
    │   │       ├── WidgetBase.as
    │   │       ├── activeeffects/
    │   │       │   ├── ActiveEffect.as
    │   │       │   ├── ActiveEffectsGroup.as
    │   │       │   └── ActiveEffectsWidget.as
    │   │       ├── arrowcount/
    │   │       │   └── ArrowCountWidget.as
    │   │       ├── meter/
    │   │       │   └── MeterWidget.as
    │   │       ├── minimap/
    │   │       │   └── MiniMapWidget.as
    │   │       └── status/
    │   │           └── StatusWidget.as
    │   ├── status.fla
    │   ├── statusicons.fla
    │   └── widgetloader.fla
    ├── ItemMenus/
    │   ├── BarterDataSetter.as
    │   ├── BarterMenu.as
    │   ├── BottomBar.as
    │   ├── CategoryList.as
    │   ├── CategoryListEntry.as
    │   ├── ContainerMenu.as
    │   ├── GiftMenu.as
    │   ├── InventoryDataSetter.as
    │   ├── InventoryIconSetter.as
    │   ├── InventoryListEntry.as
    │   ├── InventoryLists.as
    │   ├── InventoryMenu.as
    │   ├── ItemCard.as
    │   ├── ItemMenu.as
    │   ├── ItemcardDataExtender.as
    │   ├── MagicDataSetter.as
    │   ├── MagicIconSetter.as
    │   ├── MagicMenu.as
    │   ├── bartermenu.fla
    │   ├── bottombar.fla
    │   ├── containermenu.fla
    │   ├── giftmenu.fla
    │   ├── inventorylists.fla
    │   ├── inventorymenu.fla
    │   ├── itemcard.fla
    │   └── magicmenu.fla
    ├── MapMenu/
    │   ├── Map/
    │   │   ├── LocalMap.as
    │   │   ├── LocationFinder.as
    │   │   ├── LocationListEntry.as
    │   │   ├── MapMarker.as
    │   │   ├── MapMenu.as
    │   │   └── MarkerDescription.as
    │   └── map.fla
    ├── MessageBox/
    │   ├── MessageBox.as
    │   └── messagebox.fla
    ├── ModConfigPanel/
    │   ├── ColorDialog.as
    │   ├── ConfigPanel.as
    │   ├── MenuDialog.as
    │   ├── MessageDialog.as
    │   ├── ModListPanel.as
    │   ├── MultiColumnScrollBar.as
    │   ├── MultiColumnScrollingList.as
    │   ├── OptionDialog.as
    │   ├── OptionsListEntry.as
    │   ├── ParticleEmitter.as
    │   ├── SkyUISplash.as
    │   ├── SliderDialog.as
    │   ├── SnowEffect.as
    │   ├── TextLoader.as
    │   ├── TextLoader.fla
    │   ├── configpanel.fla
    │   ├── mcm_splash.fla
    │   └── skyui_splash.fla
    ├── PauseMenu/
    │   ├── InputMappingArt.as
    │   ├── InputMappingList.as
    │   ├── JournalBottomBar.as
    │   ├── JournalSaveLoadList.as
    │   ├── ObjectiveScrollingList.as
    │   ├── OptionsList.as
    │   ├── QuestCenteredList.as
    │   ├── Quest_Journal.as
    │   ├── QuestsPage.as
    │   ├── SettingsOptionItem.as
    │   ├── StatsList.as
    │   ├── StatsPage.as
    │   ├── SystemPage.as
    │   └── quest_journal/
    │       ├── DOMDocument.xml
    │       ├── LIBRARY/
    │       │   ├── ButtonArt.xml
    │       │   ├── ButtonBG.xml
    │       │   ├── ButtonPanel.xml
    │       │   ├── DialogButton.xml
    │       │   ├── Divider.xml
    │       │   ├── Graphic/
    │       │   │   └── ButtonBG Shape.xml
    │       │   ├── InputMappingArt.xml
    │       │   ├── InputMappingArtBG.xml
    │       │   ├── JournalBottomBarCenterReference.xml
    │       │   ├── MappedButton.xml
    │       │   ├── MovieClips/
    │       │   │   ├── ButtonArtBackground.xml
    │       │   │   ├── ConfigPanelFader.xml
    │       │   │   ├── ConfirmPanel.xml
    │       │   │   ├── ConfirmText.xml
    │       │   │   ├── EquipIcon.xml
    │       │   │   ├── HelpList.xml
    │       │   │   ├── HelpListEntry.xml
    │       │   │   ├── HelpListPanel.xml
    │       │   │   ├── HelpTextButtonArtHolder.xml
    │       │   │   ├── HelpTextHolder.xml
    │       │   │   ├── HelpTextPanel.xml
    │       │   │   ├── InputMappingList.xml
    │       │   │   ├── InputMappingListEntry.xml
    │       │   │   ├── InputMappingListScrollArrow.xml
    │       │   │   ├── InputMappingPanel.xml
    │       │   │   ├── JournalBackground.xml
    │       │   │   ├── JournalBottomBar.xml
    │       │   │   ├── JournalTab.xml
    │       │   │   ├── JournalTabEnd.xml
    │       │   │   ├── LevelMeterRect.xml
    │       │   │   ├── LevelProgressBar.xml
    │       │   │   ├── MeterBar.xml
    │       │   │   ├── MeterBarBackground.xml
    │       │   │   ├── MeterBarColor.xml
    │       │   │   ├── MeterMask.xml
    │       │   │   ├── ObjectiveListItem.xml
    │       │   │   ├── ObjectiveScrollingList.xml
    │       │   │   ├── ObjectivesHeader.xml
    │       │   │   ├── OptionStepperArrowBtn.xml
    │       │   │   ├── OptionsLists.xml
    │       │   │   ├── OptionsListsList.xml
    │       │   │   ├── OptionsListsListEntry.xml
    │       │   │   ├── OptionsListsPanel.xml
    │       │   │   ├── PCQuitList.xml
    │       │   │   ├── PCQuitListEntry.xml
    │       │   │   ├── PCQuitPanel.xml
    │       │   │   ├── PlayerInfoText.xml
    │       │   │   ├── QuestJournalBase.xml
    │       │   │   ├── QuestJournalFader.xml
    │       │   │   ├── QuestTitleEndpieces.xml
    │       │   │   ├── QuestTitleHolder.xml
    │       │   │   ├── QuestTitleList.xml
    │       │   │   ├── QuestTitleListEntry.xml
    │       │   │   ├── QuestTitleListEntryCentered.xml
    │       │   │   ├── QuestTitleListEntryDivider.xml
    │       │   │   ├── QuestsFader.xml
    │       │   │   ├── QuestsPage.xml
    │       │   │   ├── SaveLoadList.xml
    │       │   │   ├── SaveLoadListEntry.xml
    │       │   │   ├── SaveLoadPanel.xml
    │       │   │   ├── ScreenshotHolder.xml
    │       │   │   ├── ScrollableText.xml
    │       │   │   ├── SettingsCheckBox.xml
    │       │   │   ├── SettingsCheckBoxBackground.xml
    │       │   │   ├── SettingsCheckBoxCheck.xml
    │       │   │   ├── SettingsList.xml
    │       │   │   ├── SettingsListEntry.xml
    │       │   │   ├── SettingsOptionStepper.xml
    │       │   │   ├── SettingsPanel.xml
    │       │   │   ├── StatsCategoryListEntry.xml
    │       │   │   ├── StatsCategoryListEntryCentered.xml
    │       │   │   ├── StatsCategoryListHolder.xml
    │       │   │   ├── StatsCategoryListList.xml
    │       │   │   ├── StatsFader.xml
    │       │   │   ├── StatsList.xml
    │       │   │   ├── StatsListEntry.xml
    │       │   │   ├── StatsPage.xml
    │       │   │   ├── SystemCategoriesList.xml
    │       │   │   ├── SystemCategoriesListEntry.xml
    │       │   │   ├── SystemCategoriesListEntryCentered.xml
    │       │   │   ├── SystemCategoryList.xml
    │       │   │   ├── SystemFader.xml
    │       │   │   └── SystemPage.xml
    │       │   ├── Shapes/
    │       │   │   ├── BackgroundRect.xml
    │       │   │   ├── Endpieces_DLC01.xml
    │       │   │   ├── Endpieces_DLC02.xml
    │       │   │   ├── MeterBackground.xml
    │       │   │   ├── Shape 122.xml
    │       │   │   ├── Shape 398.xml
    │       │   │   ├── Shape 400.xml
    │       │   │   ├── Shape 407.xml
    │       │   │   ├── Shape 409.xml
    │       │   │   ├── Shape 411.xml
    │       │   │   ├── Shape 414.xml
    │       │   │   ├── Shape 417.xml
    │       │   │   ├── Shape 432.xml
    │       │   │   ├── Shape 433.xml
    │       │   │   ├── Shape 435.xml
    │       │   │   ├── Shape 439.xml
    │       │   │   ├── Shape 440.xml
    │       │   │   ├── Shape 441.xml
    │       │   │   ├── Shape 442.xml
    │       │   │   ├── Shape 443.xml
    │       │   │   ├── Shape 444.xml
    │       │   │   ├── Shape 445.xml
    │       │   │   ├── Shape 446.xml
    │       │   │   ├── Shape 447.xml
    │       │   │   ├── Shape 468.xml
    │       │   │   ├── Shape 493.xml
    │       │   │   ├── Shape 499.xml
    │       │   │   ├── Shape 505.xml
    │       │   │   ├── Shape 507.xml
    │       │   │   ├── Shape 541.xml
    │       │   │   ├── Shape 548.xml
    │       │   │   ├── Shape 552.xml
    │       │   │   ├── Shape 556.xml
    │       │   │   ├── Shape 558.xml
    │       │   │   ├── Shape 560.xml
    │       │   │   ├── Shape 562.xml
    │       │   │   ├── Shape 569.xml
    │       │   │   ├── Shape 571.xml
    │       │   │   ├── Shape 573.xml
    │       │   │   ├── Shape 575.xml
    │       │   │   └── Shape 577.xml
    │       │   ├── TextArea.xml
    │       │   ├── scrollBar.xml
    │       │   ├── scrollBarAssets/
    │       │   │   ├── scrollBarGraphics/
    │       │   │   │   ├── scrollBarOption_thumb_shape.xml
    │       │   │   │   ├── scrollBar_cap_shape.xml
    │       │   │   │   ├── scrollBar_thumb_shape.xml
    │       │   │   │   └── scrollBar_track_shape.xml
    │       │   │   ├── scrollBarOption_thumb.xml
    │       │   │   ├── scrollBar_downArrow.xml
    │       │   │   ├── scrollBar_thumb.xml
    │       │   │   ├── scrollBar_track.xml
    │       │   │   └── scrollBar_upArrow.xml
    │       │   └── scrollBarOption.xml
    │       ├── META-INF/
    │       │   └── metadata.xml
    │       ├── MobileSettings.xml
    │       ├── PublishSettings.xml
    │       ├── bin/
    │       │   └── SymDepend.cache
    │       └── quest_journal.xfl
    ├── Resources/
    │   ├── Assets/
    │   │   ├── maskedtextarea.fla
    │   │   ├── meter.fla
    │   │   └── scrollbar.fla
    │   ├── buttonArt/
    │   │   ├── DOMDocument.xml
    │   │   ├── LIBRARY/
    │   │   │   ├── ButtonArt.xml
    │   │   │   ├── ButtonArtBackgrounds/
    │   │   │   │   ├── BackgroundBig.xml
    │   │   │   │   ├── BackgroundLarge.xml
    │   │   │   │   ├── BackgroundLeft.xml
    │   │   │   │   ├── BackgroundMedium.xml
    │   │   │   │   ├── BackgroundRight.xml
    │   │   │   │   ├── BackgroundRound.xml
    │   │   │   │   └── BackgroundSmall.xml
    │   │   │   ├── Controller/
    │   │   │   │   ├── 360/
    │   │   │   │   │   ├── Back.xml
    │   │   │   │   │   ├── LB.xml
    │   │   │   │   │   ├── LS.xml
    │   │   │   │   │   ├── LSPress.xml
    │   │   │   │   │   ├── LT.xml
    │   │   │   │   │   ├── RB.xml
    │   │   │   │   │   ├── RS.xml
    │   │   │   │   │   ├── RSPress.xml
    │   │   │   │   │   └── RT.xml
    │   │   │   │   ├── PS3/
    │   │   │   │   │   ├── Circle.xml
    │   │   │   │   │   ├── L1.xml
    │   │   │   │   │   ├── L2.xml
    │   │   │   │   │   ├── L3.xml
    │   │   │   │   │   ├── PS3X.xml
    │   │   │   │   │   ├── R1.xml
    │   │   │   │   │   ├── R2.xml
    │   │   │   │   │   ├── R3.xml
    │   │   │   │   │   ├── Select.xml
    │   │   │   │   │   ├── Square.xml
    │   │   │   │   │   └── Triangle.xml
    │   │   │   │   └── Start.xml
    │   │   │   ├── FunctionKeys/
    │   │   │   │   ├── Alt.xml
    │   │   │   │   ├── Backspace.xml
    │   │   │   │   ├── BackspaceWithArrow.xml
    │   │   │   │   ├── Caps.xml
    │   │   │   │   ├── Ctrl.xml
    │   │   │   │   ├── Del.xml
    │   │   │   │   ├── End.xml
    │   │   │   │   ├── Enter.xml
    │   │   │   │   ├── EnterWithArrow.xml
    │   │   │   │   ├── Esc.xml
    │   │   │   │   ├── F1.xml
    │   │   │   │   ├── F10.xml
    │   │   │   │   ├── F11.xml
    │   │   │   │   ├── F12.xml
    │   │   │   │   ├── F2.xml
    │   │   │   │   ├── F3.xml
    │   │   │   │   ├── F4.xml
    │   │   │   │   ├── F5.xml
    │   │   │   │   ├── F6.xml
    │   │   │   │   ├── F7.xml
    │   │   │   │   ├── F8.xml
    │   │   │   │   ├── F9.xml
    │   │   │   │   ├── Home.xml
    │   │   │   │   ├── Ins.xml
    │   │   │   │   ├── LAlt.xml
    │   │   │   │   ├── LCtrl.xml
    │   │   │   │   ├── NumLck.xml
    │   │   │   │   ├── Pause.xml
    │   │   │   │   ├── PgDn.xml
    │   │   │   │   ├── PgUp.xml
    │   │   │   │   ├── PrtSc.xml
    │   │   │   │   ├── RAlt.xml
    │   │   │   │   ├── RCtrl.xml
    │   │   │   │   ├── ScrLck.xml
    │   │   │   │   ├── Shift.xml
    │   │   │   │   ├── ShiftWithArrow.xml
    │   │   │   │   ├── Space.xml
    │   │   │   │   └── Tab.xml
    │   │   │   ├── Letters/
    │   │   │   │   ├── A.xml
    │   │   │   │   ├── B.xml
    │   │   │   │   ├── C.xml
    │   │   │   │   ├── D.xml
    │   │   │   │   ├── E.xml
    │   │   │   │   ├── F.xml
    │   │   │   │   ├── G.xml
    │   │   │   │   ├── H.xml
    │   │   │   │   ├── I.xml
    │   │   │   │   ├── J.xml
    │   │   │   │   ├── K.xml
    │   │   │   │   ├── L.xml
    │   │   │   │   ├── M.xml
    │   │   │   │   ├── N.xml
    │   │   │   │   ├── O.xml
    │   │   │   │   ├── P.xml
    │   │   │   │   ├── Q.xml
    │   │   │   │   ├── R.xml
    │   │   │   │   ├── S.xml
    │   │   │   │   ├── T.xml
    │   │   │   │   ├── U.xml
    │   │   │   │   ├── V.xml
    │   │   │   │   ├── W.xml
    │   │   │   │   ├── X.xml
    │   │   │   │   ├── Y.xml
    │   │   │   │   └── Z.xml
    │   │   │   ├── Mouse/
    │   │   │   │   ├── MouseButtons/
    │   │   │   │   │   ├── M1.xml
    │   │   │   │   │   ├── M2.xml
    │   │   │   │   │   ├── M3.xml
    │   │   │   │   │   ├── M4.xml
    │   │   │   │   │   ├── M5.xml
    │   │   │   │   │   ├── M6.xml
    │   │   │   │   │   ├── M7.xml
    │   │   │   │   │   └── M8.xml
    │   │   │   │   ├── MouseMove.xml
    │   │   │   │   └── MouseWheel/
    │   │   │   │       ├── MouseWheel.xml
    │   │   │   │       ├── MouseWheelDown.xml
    │   │   │   │       └── MouseWheelUp.xml
    │   │   │   ├── Named Icons/
    │   │   │   │   ├── Action_Double_Up.xml
    │   │   │   │   ├── Action_Up.xml
    │   │   │   │   ├── Action_Up_Arrow.xml
    │   │   │   │   ├── OCC BUTTON BASE CIRCLE.xml
    │   │   │   │   ├── OCC BUTTON BASE SQUARE.xml
    │   │   │   │   ├── OCC BUTTON MOD BASE 1.xml
    │   │   │   │   ├── OCC BUTTON MOD BASE 2.xml
    │   │   │   │   ├── OCC BUTTON MOD BASE 3.xml
    │   │   │   │   ├── OCC BUTTON MOD BASE 4.xml
    │   │   │   │   ├── OCC CONTROLLER MC.xml
    │   │   │   │   ├── OCC CONTROLLER.xml
    │   │   │   │   ├── OCC MOTION.xml
    │   │   │   │   ├── OCC THUM REST RIGHT BASE.xml
    │   │   │   │   ├── OCC THUMB REST BASE.xml
    │   │   │   │   ├── OCC THUMB REST LEFT BASE.xml
    │   │   │   │   ├── OCC THUMB_REST.xml
    │   │   │   │   ├── OCC THUMB_REST_LEFT.xml
    │   │   │   │   ├── OCC THUMB_REST_RIGHT.xml
    │   │   │   │   ├── OCC_A.xml
    │   │   │   │   ├── OCC_A_HOLD.xml
    │   │   │   │   ├── OCC_B.xml
    │   │   │   │   ├── OCC_B_HOLD.xml
    │   │   │   │   ├── OCC_X.xml
    │   │   │   │   ├── OCC_X_HOLD.xml
    │   │   │   │   ├── OCC_Y.xml
    │   │   │   │   ├── OCC_Y_HOLD.xml
    │   │   │   │   ├── Symbol 163.xml
    │   │   │   │   ├── Symbol 164.xml
    │   │   │   │   ├── Symbol 170.xml
    │   │   │   │   ├── Symbol 171.xml
    │   │   │   │   ├── Symbol 258.xml
    │   │   │   │   ├── Symbol 259.xml
    │   │   │   │   ├── Symbol 260.xml
    │   │   │   │   ├── Symbol 261.xml
    │   │   │   │   ├── Symbol 262.xml
    │   │   │   │   ├── Symbol 264.xml
    │   │   │   │   ├── Symbol 266.xml
    │   │   │   │   ├── Symbol 267.xml
    │   │   │   │   ├── Symbol 268.xml
    │   │   │   │   ├── Symbol 270.xml
    │   │   │   │   ├── Symbol 271.xml
    │   │   │   │   ├── Symbol 272.xml
    │   │   │   │   ├── Symbol 273.xml
    │   │   │   │   ├── Symbol 274.xml
    │   │   │   │   ├── Symbol 275.xml
    │   │   │   │   ├── Symbol 276.xml
    │   │   │   │   ├── Symbol 277.xml
    │   │   │   │   ├── Symbol 278.xml
    │   │   │   │   ├── Symbol 279.xml
    │   │   │   │   ├── Symbol 280.xml
    │   │   │   │   ├── Symbol 281.xml
    │   │   │   │   ├── Symbol 282.xml
    │   │   │   │   ├── Symbol 284.xml
    │   │   │   │   ├── Symbol 285.xml
    │   │   │   │   ├── Symbol 286.xml
    │   │   │   │   ├── Symbol 287.xml
    │   │   │   │   ├── Symbol 288.xml
    │   │   │   │   ├── Symbol 289.xml
    │   │   │   │   ├── Symbol 290.xml
    │   │   │   │   ├── Symbol 291.xml
    │   │   │   │   ├── Symbol 292.xml
    │   │   │   │   ├── Symbol 293.xml
    │   │   │   │   ├── Symbol 294.xml
    │   │   │   │   ├── Symbol 295.xml
    │   │   │   │   ├── Symbol 296.xml
    │   │   │   │   ├── Symbol 297.xml
    │   │   │   │   ├── Symbol 298.xml
    │   │   │   │   ├── Symbol 299.xml
    │   │   │   │   ├── Symbol 302.xml
    │   │   │   │   ├── Symbol 304.xml
    │   │   │   │   ├── Symbol 305.xml
    │   │   │   │   ├── Symbol 306.xml
    │   │   │   │   ├── Symbol 307.xml
    │   │   │   │   ├── Symbol 308.xml
    │   │   │   │   ├── Symbol 309.xml
    │   │   │   │   ├── Symbol 310.xml
    │   │   │   │   ├── Symbol 311.xml
    │   │   │   │   ├── Symbol 312.xml
    │   │   │   │   ├── Symbol 313.xml
    │   │   │   │   ├── Symbol 314.xml
    │   │   │   │   ├── Symbol 315.xml
    │   │   │   │   ├── Symbol 316.xml
    │   │   │   │   ├── Symbol 318.xml
    │   │   │   │   ├── Symbol 319.xml
    │   │   │   │   ├── Symbol 320.xml
    │   │   │   │   ├── Symbol 321.xml
    │   │   │   │   ├── Symbol 322.xml
    │   │   │   │   ├── Symbol 323.xml
    │   │   │   │   ├── Symbol 324.xml
    │   │   │   │   ├── Symbol 325.xml
    │   │   │   │   ├── Symbol 326.xml
    │   │   │   │   ├── Symbol 327.xml
    │   │   │   │   ├── Symbol 328.xml
    │   │   │   │   ├── Symbol 329.xml
    │   │   │   │   ├── Symbol 330.xml
    │   │   │   │   ├── Symbol 331.xml
    │   │   │   │   ├── Symbol 332.xml
    │   │   │   │   ├── Symbol 333.xml
    │   │   │   │   ├── Symbol 334.xml
    │   │   │   │   ├── Symbol 335.xml
    │   │   │   │   ├── Symbol 336.xml
    │   │   │   │   ├── Symbol 337.xml
    │   │   │   │   ├── Symbol 338.xml
    │   │   │   │   ├── Symbol 339.xml
    │   │   │   │   ├── Symbol 340.xml
    │   │   │   │   ├── Symbol 341.xml
    │   │   │   │   ├── Symbol 342.xml
    │   │   │   │   ├── Symbol 343.xml
    │   │   │   │   ├── Symbol 344.xml
    │   │   │   │   ├── Symbol 345.xml
    │   │   │   │   ├── Symbol 346.xml
    │   │   │   │   ├── Symbol 347.xml
    │   │   │   │   ├── Symbol 348.xml
    │   │   │   │   ├── Symbol 349.xml
    │   │   │   │   ├── Symbol 350.xml
    │   │   │   │   ├── Symbol 351.xml
    │   │   │   │   ├── Symbol 352.xml
    │   │   │   │   ├── Symbol 353.xml
    │   │   │   │   ├── Symbol 354.xml
    │   │   │   │   ├── Symbol 355.xml
    │   │   │   │   ├── Symbol 356.xml
    │   │   │   │   ├── Symbol 357.xml
    │   │   │   │   ├── Symbol 358.xml
    │   │   │   │   ├── Symbol 359.xml
    │   │   │   │   ├── Symbol 36.xml
    │   │   │   │   ├── Symbol 360.xml
    │   │   │   │   ├── Symbol 361.xml
    │   │   │   │   ├── Symbol 362.xml
    │   │   │   │   ├── Symbol 363.xml
    │   │   │   │   ├── Symbol 364.xml
    │   │   │   │   ├── Symbol 365.xml
    │   │   │   │   ├── Symbol 366.xml
    │   │   │   │   ├── Symbol 367.xml
    │   │   │   │   ├── Symbol 368.xml
    │   │   │   │   ├── Symbol 369.xml
    │   │   │   │   ├── Symbol 370.xml
    │   │   │   │   ├── Symbol 371.xml
    │   │   │   │   ├── Symbol 372.xml
    │   │   │   │   ├── Symbol 373.xml
    │   │   │   │   ├── Symbol 374.xml
    │   │   │   │   ├── Symbol 375.xml
    │   │   │   │   ├── Symbol 376.xml
    │   │   │   │   ├── Symbol 377.xml
    │   │   │   │   ├── Symbol 378.xml
    │   │   │   │   ├── Symbol 379.xml
    │   │   │   │   ├── Symbol 380.xml
    │   │   │   │   ├── Symbol 381.xml
    │   │   │   │   ├── Symbol 382.xml
    │   │   │   │   ├── Symbol 383.xml
    │   │   │   │   ├── Symbol 384.xml
    │   │   │   │   ├── Symbol 385.xml
    │   │   │   │   ├── Symbol 386.xml
    │   │   │   │   ├── Symbol 387.xml
    │   │   │   │   ├── Symbol 388.xml
    │   │   │   │   ├── Symbol 389.xml
    │   │   │   │   ├── Symbol 390.xml
    │   │   │   │   ├── Symbol 391.xml
    │   │   │   │   ├── Symbol 392.xml
    │   │   │   │   ├── Symbol 393.xml
    │   │   │   │   ├── Symbol 394.xml
    │   │   │   │   ├── Symbol 395.xml
    │   │   │   │   ├── Symbol 396.xml
    │   │   │   │   ├── Symbol 397.xml
    │   │   │   │   ├── Symbol 398.xml
    │   │   │   │   ├── Symbol 399.xml
    │   │   │   │   ├── Symbol 400.xml
    │   │   │   │   ├── Symbol 401.xml
    │   │   │   │   ├── Symbol 402.xml
    │   │   │   │   ├── Symbol 403.xml
    │   │   │   │   ├── Symbol 404.xml
    │   │   │   │   ├── Symbol 406.xml
    │   │   │   │   ├── Symbol 407.xml
    │   │   │   │   ├── Symbol 409.xml
    │   │   │   │   ├── Symbol 412.xml
    │   │   │   │   ├── Symbol 413.xml
    │   │   │   │   ├── Symbol 414.xml
    │   │   │   │   ├── Symbol 415.xml
    │   │   │   │   ├── Symbol 417.xml
    │   │   │   │   ├── Symbol 420.xml
    │   │   │   │   ├── Symbol 421.xml
    │   │   │   │   ├── Symbol 422.xml
    │   │   │   │   ├── Symbol 423.xml
    │   │   │   │   ├── Symbol 424.xml
    │   │   │   │   ├── Symbol 425.xml
    │   │   │   │   ├── Symbol 426.xml
    │   │   │   │   ├── Symbol 427.xml
    │   │   │   │   ├── Symbol 428.xml
    │   │   │   │   ├── Symbol 429.xml
    │   │   │   │   ├── Symbol 430.xml
    │   │   │   │   ├── Symbol 431.xml
    │   │   │   │   ├── Symbol 432.xml
    │   │   │   │   ├── Symbol 433.xml
    │   │   │   │   ├── Symbol 434.xml
    │   │   │   │   ├── Symbol 435.xml
    │   │   │   │   ├── Symbol 436.xml
    │   │   │   │   ├── Symbol 437.xml
    │   │   │   │   ├── Symbol 438.xml
    │   │   │   │   ├── Symbol 439.xml
    │   │   │   │   ├── Symbol 440.xml
    │   │   │   │   ├── Symbol 441.xml
    │   │   │   │   ├── Symbol 442.xml
    │   │   │   │   ├── Symbol 443.xml
    │   │   │   │   ├── Symbol 445.xml
    │   │   │   │   ├── Symbol 446.xml
    │   │   │   │   ├── Symbol 447.xml
    │   │   │   │   ├── Symbol 448.xml
    │   │   │   │   ├── Symbol 449.xml
    │   │   │   │   ├── Symbol 451.xml
    │   │   │   │   ├── Symbol 452.xml
    │   │   │   │   ├── Symbol 453.xml
    │   │   │   │   ├── Symbol 454.xml
    │   │   │   │   ├── Symbol 455.xml
    │   │   │   │   ├── Symbol 457.xml
    │   │   │   │   ├── Symbol 458.xml
    │   │   │   │   ├── Symbol 459.xml
    │   │   │   │   ├── Symbol 460.xml
    │   │   │   │   ├── Symbol 462.xml
    │   │   │   │   ├── Symbol 465.xml
    │   │   │   │   ├── Symbol 466.xml
    │   │   │   │   ├── Symbol 467.xml
    │   │   │   │   ├── Symbol 468.xml
    │   │   │   │   ├── Symbol 469.xml
    │   │   │   │   ├── Symbol 470.xml
    │   │   │   │   ├── Symbol 471.xml
    │   │   │   │   ├── Symbol 472.xml
    │   │   │   │   ├── Symbol 473.xml
    │   │   │   │   ├── Symbol 474.xml
    │   │   │   │   ├── Symbol 475.xml
    │   │   │   │   ├── Symbol 476.xml
    │   │   │   │   ├── Symbol 477.xml
    │   │   │   │   ├── Symbol 478.xml
    │   │   │   │   ├── Symbol 479.xml
    │   │   │   │   ├── Symbol 480.xml
    │   │   │   │   ├── Symbol 481.xml
    │   │   │   │   ├── Symbol 482.xml
    │   │   │   │   ├── Symbol 483.xml
    │   │   │   │   ├── Symbol 484.xml
    │   │   │   │   ├── Symbol 485.xml
    │   │   │   │   ├── Symbol 486.xml
    │   │   │   │   ├── Symbol 487.xml
    │   │   │   │   ├── Symbol 488.xml
    │   │   │   │   ├── Symbol 489.xml
    │   │   │   │   ├── Symbol 490.xml
    │   │   │   │   ├── Symbol 491.xml
    │   │   │   │   ├── Symbol 492.xml
    │   │   │   │   ├── Symbol 493.xml
    │   │   │   │   ├── Symbol 494.xml
    │   │   │   │   ├── Symbol 495.xml
    │   │   │   │   ├── Symbol 496.xml
    │   │   │   │   ├── Symbol 497.xml
    │   │   │   │   ├── Symbol 498.xml
    │   │   │   │   ├── Symbol 499.xml
    │   │   │   │   ├── Symbol 500.xml
    │   │   │   │   ├── Symbol 501.xml
    │   │   │   │   ├── Symbol 502.xml
    │   │   │   │   ├── Symbol 503.xml
    │   │   │   │   ├── Symbol 504.xml
    │   │   │   │   ├── Symbol 505.xml
    │   │   │   │   ├── Symbol 506.xml
    │   │   │   │   ├── Symbol 507.xml
    │   │   │   │   ├── Symbol 508.xml
    │   │   │   │   ├── Symbol 509.xml
    │   │   │   │   ├── Symbol 510.xml
    │   │   │   │   ├── Symbol 511.xml
    │   │   │   │   ├── Symbol 512.xml
    │   │   │   │   ├── Symbol 513.xml
    │   │   │   │   ├── Symbol 514.xml
    │   │   │   │   ├── Symbol 515.xml
    │   │   │   │   ├── Symbol 516.xml
    │   │   │   │   ├── Symbol 517.xml
    │   │   │   │   ├── Symbol 518.xml
    │   │   │   │   ├── Symbol 519.xml
    │   │   │   │   ├── Symbol 520.xml
    │   │   │   │   ├── Symbol 521.xml
    │   │   │   │   ├── Symbol 522.xml
    │   │   │   │   ├── Symbol 523.xml
    │   │   │   │   ├── Symbol 524.xml
    │   │   │   │   ├── Symbol 525.xml
    │   │   │   │   ├── Symbol 526.xml
    │   │   │   │   ├── Symbol 527.xml
    │   │   │   │   ├── Symbol 528.xml
    │   │   │   │   ├── Symbol 529.xml
    │   │   │   │   ├── Symbol 530.xml
    │   │   │   │   ├── Symbol 531.xml
    │   │   │   │   ├── Symbol 532.xml
    │   │   │   │   ├── Symbol 533.xml
    │   │   │   │   ├── Symbol 534.xml
    │   │   │   │   ├── Symbol 535.xml
    │   │   │   │   ├── Symbol 536.xml
    │   │   │   │   ├── Symbol 537.xml
    │   │   │   │   ├── Symbol 538.xml
    │   │   │   │   ├── Symbol 539.xml
    │   │   │   │   ├── Symbol 540.xml
    │   │   │   │   ├── Symbol 541.xml
    │   │   │   │   ├── Symbol 543.xml
    │   │   │   │   ├── Symbol 544.xml
    │   │   │   │   ├── Symbol 545.xml
    │   │   │   │   ├── Symbol 546.xml
    │   │   │   │   ├── Symbol 547.xml
    │   │   │   │   ├── Symbol 548.xml
    │   │   │   │   ├── Symbol 549.xml
    │   │   │   │   ├── Symbol 550.xml
    │   │   │   │   ├── Symbol 551.xml
    │   │   │   │   ├── Symbol 552.xml
    │   │   │   │   ├── Symbol 553.xml
    │   │   │   │   └── Symbol 555.xml
    │   │   │   ├── NumberPad/
    │   │   │   │   ├── NP0.xml
    │   │   │   │   ├── NP1.xml
    │   │   │   │   ├── NP2.xml
    │   │   │   │   ├── NP3.xml
    │   │   │   │   ├── NP4.xml
    │   │   │   │   ├── NP5.xml
    │   │   │   │   ├── NP6.xml
    │   │   │   │   ├── NP7.xml
    │   │   │   │   ├── NP8.xml
    │   │   │   │   ├── NP9.xml
    │   │   │   │   ├── NPAsterisk.xml
    │   │   │   │   ├── NPEnter.xml
    │   │   │   │   ├── NPForwardSlash.xml
    │   │   │   │   ├── NPMinus.xml
    │   │   │   │   ├── NPPeriod.xml
    │   │   │   │   └── NPPlus.xml
    │   │   │   ├── Numbers/
    │   │   │   │   ├── 0.xml
    │   │   │   │   ├── 1.xml
    │   │   │   │   ├── 2.xml
    │   │   │   │   ├── 3.xml
    │   │   │   │   ├── 4.xml
    │   │   │   │   ├── 5.xml
    │   │   │   │   ├── 6.xml
    │   │   │   │   ├── 7.xml
    │   │   │   │   ├── 8.xml
    │   │   │   │   └── 9.xml
    │   │   │   └── Symbols/
    │   │   │       ├── Amersand.xml
    │   │   │       ├── Arrow.xml
    │   │   │       ├── Asterisk.xml
    │   │   │       ├── At.xml
    │   │   │       ├── BackSlash.xml
    │   │   │       ├── BrokenBar.xml
    │   │   │       ├── Caret.xml
    │   │   │       ├── Colon.xml
    │   │   │       ├── Comma.xml
    │   │   │       ├── Dollar Sign.xml
    │   │   │       ├── Equals.xml
    │   │   │       ├── Exclamation.xml
    │   │   │       ├── ForwardSlash.xml
    │   │   │       ├── Grave.xml
    │   │   │       ├── GreaterThan.xml
    │   │   │       ├── LeftCurlyBracket.xml
    │   │   │       ├── LeftParenthesis.xml
    │   │   │       ├── LeftSquareBracket.xml
    │   │   │       ├── LessThan.xml
    │   │   │       ├── Minus.xml
    │   │   │       ├── Negation.xml
    │   │   │       ├── Number.xml
    │   │   │       ├── Percent.xml
    │   │   │       ├── Period.xml
    │   │   │       ├── Plus Original.xml
    │   │   │       ├── Plus.xml
    │   │   │       ├── Pound.xml
    │   │   │       ├── Question.xml
    │   │   │       ├── Quotation.xml
    │   │   │       ├── RightCurlyBracket.xml
    │   │   │       ├── RightParenthesis.xml
    │   │   │       ├── RightSquareBracket.xml
    │   │   │       ├── SemiColon.xml
    │   │   │       ├── SingleQuote.xml
    │   │   │       ├── Tilde.xml
    │   │   │       ├── Underscore.xml
    │   │   │       ├── Unknown.xml
    │   │   │       └── VerticalBar.xml
    │   │   ├── META-INF/
    │   │   │   └── metadata.xml
    │   │   ├── MobileSettings.xml
    │   │   ├── PublishSettings.xml
    │   │   ├── bin/
    │   │   │   └── SymDepend.cache
    │   │   └── buttonArt.xfl
    │   ├── buttonArtSymbols.fla
    │   ├── fonts_en_snk.fla
    │   ├── gfxfontlib.fla
    │   ├── icons_category_celtic.fla
    │   ├── icons_category_curved.fla
    │   ├── icons_category_psychosteve.fla
    │   ├── icons_category_straight.fla
    │   ├── icons_effect_psychosteve.fla
    │   ├── icons_item_celtic.fla
    │   ├── icons_item_curved.fla
    │   ├── icons_item_psychosteve.fla
    │   ├── mapMarkerArt.fla
    │   ├── mcm.psd
    │   ├── skyui_icons.fla
    │   ├── skyui_icons_psychosteve.fla
    │   └── skyui_icons_straight.fla
    └── version.as

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
compile-error.txt


================================================
FILE: .gitmodules
================================================
[submodule "sksevr_plugin/skse"]
	path = sksevr_plugin/skse
	url = git@github.com:Odie/sksevr-mirror.git
[submodule "sksevr_plugin/common"]
	path = sksevr_plugin/common
	url = git@github.com:Odie/sksevr-common-mirror.git
[submodule "sksevr_plugin/luajit"]
	path = sksevr_plugin/luajit
	url = https://luajit.org/git/luajit.git
	ignore = dirty


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2012 schlangster

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
SkyUI - VR
----------

This repository hosts the source and the packaged releases for a working
version of SkyUI (and MCM) for SkyrimVR.

### Getting SkyUI

To get the mod, head on over to 
[the release page](https://github.com/Odie/skyui-vr/releases/) and grab the
lastest version. All you need is the .7z file. (Ignore the source code download
links.)

### Prerequsite
Make sure [SKSE VR](http://skse.silverlock.org/) is installed. (Don't forget
the .pex files!)

### Installation

For MO2 users, use the "Install from file" icon in the toolbar.

For Vortex users, drop the .7z file over the vortex window.


VR specific controls
--------------------

Currently, there are certain limitations to how the UIs in the game can process
inputs from the VR controllers. At the moment, the UI seems to mostly receive
up/down/right/left signals from the game. This makes operating a more complex
UI like SkyUI a little difficult, but not impossible.

Here's what you need to know.

### Toggle trade direction
In the barter menu or the gift menu, keep hitting "left" until you've reached
the first item on the category list (titled "All"). Hit "left" again and the 
trade direction should toggle.

### Sorting items
This applies to any screen where you can see an inventory list. With the first 
item in the list selected (or nothing selected), hit "up" once to move the 
sorted column to the next one. Hit "up" twice in quick succession to change the 
sort direction.

For trackpad users, trying using "slow swipe" and "fast swipe" to differentiate 
between these two actions. The number of controller vibrations indicates how many 
"up" events the game has registered.


================================================
FILE: build/.gitignore
================================================

*.swf
fontconfig.txt
!/fonts_console.swf
!/fonts_en.swf
!/gfxfontlib.swf
!/fontconfig.txt

================================================
FILE: build/exported/skyui/.gitkeep
================================================


================================================
FILE: build/exported/widgets/skyui/.gitkeep
================================================


================================================
FILE: build/skyui/config.txt
================================================
; =====================================================================================================================
[Input]
; =====================================================================================================================
controls.pc.search = 57 ; SPACE
controls.pc.switchTab = 56 ; ALT
controls.pc.equipMode = 42 ; LSHIFT

controls.gamepad.switchTab = 271 ; BACK
controls.gamepad.prevColumn = 274 ; LEFT_SHOULDER
controls.gamepad.nextColumn = 275 ; RIGHT_SHOULDER
controls.gamepad.sortOrder = 272 ; LEFT_THUMB


; =====================================================================================================================
[SearchBox]
; =====================================================================================================================
autoupdate.enable = true
autoupdate.delay = 0


; =====================================================================================================================
[ItemInfo]
; =====================================================================================================================
itemcard.align = center
itemcard.xOffset = 0
itemcard.yOffset = 0


; =====================================================================================================================
[ItemList]
; =====================================================================================================================
quantityMenu.minCount = 6 ; Number of items required to trigger quantity dialog. 0 is disabled


; =====================================================================================================================
[Appearance]
; =====================================================================================================================
icons.category.source = 'skyui/icons_category_psychosteve.swf'

icons.item.source = 'skyui/icons_item_psychosteve.swf'
icons.item.noColor = false
icons.item.showStolen = true

colors.text.enabled = 0xffffff
colors.stolen.enabled = 0xffffff
colors.negative.enabled = 0xff0000
colors.text.disabled = 0x4c4c4c
colors.stolen.disabled = 0x4c4c4c
colors.negative.disabled = 0x800000


; =====================================================================================================================
[ListLayout]
; =====================================================================================================================
vars.a_textBorder.value = <0, 0, 1.1, 0> ; left right top bottom
vars.n_iconSize.value = 18

defaults.entryWidth = 530

; Default text format defaults -------------------------------------------------------
defaults.entry.textFormat.font = '$EverywhereMediumFont'
defaults.entry.textFormat.align = right
defaults.entry.textFormat.bold = false
defaults.entry.textFormat.italic = false
defaults.entry.textFormat.underline = false
defaults.entry.textFormat.size = 18
defaults.entry.textFormat.letterSpacing = 0.8
defaults.entry.textFormat.kerning = false
defaults.entry.textFormat.leftMargin = 0
defaults.entry.textFormat.rightMargin = 0
defaults.entry.textFormat.indent = 0
defaults.entry.textFormat.leading = 0

defaults.label.textFormat.font = '$EverywhereMediumFont'
defaults.label.textFormat.align = right
defaults.label.textFormat.bold = false
defaults.label.textFormat.italic = false
defaults.label.textFormat.underline = false
defaults.label.textFormat.size = 16
defaults.label.textFormat.letterSpacing = 0.8
defaults.label.textFormat.kerning = false
defaults.label.textFormat.leftMargin = 0
defaults.label.textFormat.rightMargin = 0
defaults.label.textFormat.indent = 0
defaults.label.textFormat.leading = 0


; ICONS -------------------------------------------------------
columns.equipColumn.type = EQUIP_ICON
columns.equipColumn.passive = true
columns.equipColumn.states = 1
columns.equipColumn.indent = -28
columns.equipColumn.icon.size = n_iconSize
columns.equipColumn.border = <0, 10, 3, 3> ; left right top bottom
columns.equipColumn.state1.label.text = ' '

columns.iconColumn.type = ITEM_ICON
columns.iconColumn.states = 2
columns.iconColumn.icon.size = n_iconSize
columns.iconColumn.border = <0, 3, 3, 3> ; left right top bottom

columns.iconColumn.state1.label.text = ' '
columns.iconColumn.state1.sortAttributes = <type, formType, subType, weightClass, material, infoDamage, infoArmor, infoSchoolName, actorValue, resistance, skillLevel, magnitude, duration, isRead, text>
columns.iconColumn.state1.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.iconColumn.state2.label.text = ' '
columns.iconColumn.state2.label.arrowDown = true
columns.iconColumn.state2.sortAttributes = <type, formType, subType, weightClass, material, infoDamage, infoArmor, infoSchoolName, actorValue, resistance, skillLevel, magnitude, duration, isRead, text>
columns.iconColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {DESCENDING | CASEINSENSITIVE}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | CASEINSENSITIVE}>

; ITEM NAME COLUMN -------------------------------------------------------
columns.itemNameColumn.type = NAME
columns.itemNameColumn.name = '$NAME'
columns.itemNameColumn.states = 4
columns.itemNameColumn.weight = 1.0
columns.itemNameColumn.border = a_textBorder
columns.itemNameColumn.label.textFormat.align = left

columns.itemNameColumn.state1.label.text = '$NAME'
columns.itemNameColumn.state1.entry.text = @text
columns.itemNameColumn.state1.sortOptions = {ASCENDING | CASEINSENSITIVE}

columns.itemNameColumn.state2.label.text = '$EQUIPPED'
columns.itemNameColumn.state2.entry.text = @text
columns.itemNameColumn.state2.sortAttributes = <isEquipped, equipState, text>
columns.itemNameColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.itemNameColumn.state2.playerOnly = true

columns.itemNameColumn.state3.label.text = '$STOLEN'
columns.itemNameColumn.state3.entry.text = @text
columns.itemNameColumn.state3.sortAttributes = <isStolen, text>
columns.itemNameColumn.state3.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.itemNameColumn.state3.playerOnly = true

columns.itemNameColumn.state4.label.text = '$ENCHANTED'
columns.itemNameColumn.state4.entry.text = @text
columns.itemNameColumn.state4.sortAttributes = <isEnchanted, text>
columns.itemNameColumn.state4.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; ARMOR RATING COLUMN -------------------------------------------------------
columns.arColumn.type = TEXT
columns.arColumn.name = '$ARMOR'
columns.arColumn.states = 2
columns.arColumn.width = 0.09
columns.arColumn.border = a_textBorder

columns.arColumn.state1.label.text = '$ARM'
columns.arColumn.state1.label.arrowDown = true
columns.arColumn.state1.entry.text = @infoArmor
columns.arColumn.state1.sortAttributes = <infoArmor, text>
columns.arColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.arColumn.state2.label.text = '$ARM'
columns.arColumn.state2.entry.text = @infoArmor
columns.arColumn.state2.sortAttributes = <infoArmor, text>
columns.arColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; SUBTYPE COLUMN -------------------------------------------------------
columns.subTypeColumn.type = TEXT
columns.subTypeColumn.name = '$TYPE'
columns.subTypeColumn.states = 2
columns.subTypeColumn.width = 0.15
columns.subTypeColumn.border = a_textBorder

columns.subTypeColumn.state1.label.text = '$TYPE'
columns.subTypeColumn.state1.entry.text = @subTypeDisplay
columns.subTypeColumn.state1.sortAttributes = <subTypeDisplay, text>
columns.subTypeColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.subTypeColumn.state2.label.text = '$TYPE'
columns.subTypeColumn.state2.entry.text = @subTypeDisplay
columns.subTypeColumn.state2.label.arrowDown = true
columns.subTypeColumn.state2.sortAttributes = <subTypeDisplay, text>
columns.subTypeColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; MATERIAL COLUMN -------------------------------------------------------
columns.materialColumn.type = TEXT
columns.materialColumn.name = '$MATERIAL'
columns.materialColumn.states = 2
columns.materialColumn.width = 0.10
columns.materialColumn.border = a_textBorder
columns.materialColumn.hidden = true

columns.materialColumn.state1.label.text = '$MAT'
columns.materialColumn.state1.entry.text = @materialDisplay
columns.materialColumn.state1.sortAttributes = <materialDisplay, text>
columns.materialColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.materialColumn.state2.label.text = '$MAT'
columns.materialColumn.state2.entry.text = @materialDisplay
columns.materialColumn.state2.label.arrowDown = true
columns.materialColumn.state2.sortAttributes = <materialDisplay, text>
columns.materialColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; CLASS COLUMN -------------------------------------------------------
columns.classColumn.type = TEXT
columns.classColumn.name = '$CLASS'
columns.classColumn.states = 2
columns.classColumn.width = 0.10
columns.classColumn.border = a_textBorder

columns.classColumn.state1.label.text = '$CLASS'
columns.classColumn.state1.entry.text = @weightClassDisplay
columns.classColumn.state1.sortAttributes = <weightClassDisplay, text>
columns.classColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.classColumn.state2.label.text = '$CLASS'
columns.classColumn.state2.entry.text = @weightClassDisplay
columns.classColumn.state2.label.arrowDown = true
columns.classColumn.state2.sortAttributes = <weightClassDisplay, text>
columns.classColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; MAGNITUDE COLUMN -------------------------------------------------------
columns.magnitudeColumn.type = TEXT
columns.magnitudeColumn.name = '$MAGNITUDE'
columns.magnitudeColumn.states = 2
columns.magnitudeColumn.width = 0.09
columns.magnitudeColumn.border = a_textBorder

columns.magnitudeColumn.state1.label.text = '$MAG'
columns.magnitudeColumn.state1.label.arrowDown = true
columns.magnitudeColumn.state1.entry.text = @magnitude
columns.magnitudeColumn.state1.sortAttributes = <magnitude, text>
columns.magnitudeColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.magnitudeColumn.state2.label.text = '$MAG'
columns.magnitudeColumn.state2.entry.text = @magnitude
columns.magnitudeColumn.state2.sortAttributes = <magnitude, text>
columns.magnitudeColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; DURATION COLUMN -------------------------------------------------------
columns.durationColumn.type = TEXT
columns.durationColumn.name = '$TIME'
columns.durationColumn.states = 2
columns.durationColumn.width = 0.09
columns.durationColumn.border = a_textBorder

columns.durationColumn.state1.label.text = '$TIME'
columns.durationColumn.state1.label.arrowDown = true
columns.durationColumn.state1.entry.text = @duration
columns.durationColumn.state1.sortAttributes = <duration, text>
columns.durationColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.durationColumn.state2.label.text = '$TIME'
columns.durationColumn.state2.entry.text = @duration
columns.durationColumn.state2.sortAttributes = <duration, text>
columns.durationColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; MAGIC MAGNITUDE COLUMN -------------------------------------------------------
columns.magicMagnitudeColumn.type = TEXT
columns.magicMagnitudeColumn.name = '$MAGNITUDE'
columns.magicMagnitudeColumn.states = 2
columns.magicMagnitudeColumn.width = 0.15
columns.magicMagnitudeColumn.border = a_textBorder

columns.magicMagnitudeColumn.state1.label.text = '$MAG'
columns.magicMagnitudeColumn.state1.label.arrowDown = true
columns.magicMagnitudeColumn.state1.entry.text = @magnitude
columns.magicMagnitudeColumn.state1.sortAttributes = <magnitude, text>
columns.magicMagnitudeColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.magicMagnitudeColumn.state2.label.text = '$MAG'
columns.magicMagnitudeColumn.state2.entry.text = @magnitude
columns.magicMagnitudeColumn.state2.sortAttributes = <magnitude, text>
columns.magicMagnitudeColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; MAGIC DURATION COLUMN -------------------------------------------------------
columns.magicDurationColumn.type = TEXT
columns.magicDurationColumn.name = '$TIME'
columns.magicDurationColumn.states = 2
columns.magicDurationColumn.width = 0.15
columns.magicDurationColumn.border = a_textBorder

columns.magicDurationColumn.state1.label.text = '$TIME'
columns.magicDurationColumn.state1.label.arrowDown = true
columns.magicDurationColumn.state1.entry.text = @duration
columns.magicDurationColumn.state1.sortAttributes = <duration, text>
columns.magicDurationColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.magicDurationColumn.state2.label.text = '$TIME'
columns.magicDurationColumn.state2.entry.text = @duration
columns.magicDurationColumn.state2.sortAttributes = <duration, text>
columns.magicDurationColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; DAMAGE COLUMN -------------------------------------------------------
columns.damageColumn.type = TEXT
columns.damageColumn.name = '$DAMAGE'
columns.damageColumn.states = 2
columns.damageColumn.width = 0.09
columns.damageColumn.border = a_textBorder

columns.damageColumn.state1.label.text = '$DAM'
columns.damageColumn.state1.label.arrowDown = true
columns.damageColumn.state1.entry.text = @infoDamage
columns.damageColumn.state1.sortAttributes = <infoDamage, text>
columns.damageColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.damageColumn.state2.label.text = '$DAM'
columns.damageColumn.state2.entry.text = @infoDamage
columns.damageColumn.state2.sortAttributes = <infoDamage, text>
columns.damageColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; WEIGHT COLUMN -------------------------------------------------------
columns.weightColumn.type = TEXT
columns.weightColumn.name = '$WEIGHT'
columns.weightColumn.states = 2
columns.weightColumn.width = 0.09
columns.weightColumn.border = a_textBorder

columns.weightColumn.state1.label.text = '$WGT'
columns.weightColumn.state1.label.arrowDown = true
columns.weightColumn.state1.entry.text = @infoWeight
columns.weightColumn.state1.sortAttributes = <infoWeight, text>
columns.weightColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.weightColumn.state2.label.text = '$WGT'
columns.weightColumn.state2.entry.text = @infoWeight
columns.weightColumn.state2.sortAttributes = <infoWeight, text>
columns.weightColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; VALUE COLUMN -------------------------------------------------------
columns.valueColumn.type = TEXT
columns.valueColumn.name = '$VALUE'
columns.valueColumn.states = 2
columns.valueColumn.width = 0.09
columns.valueColumn.border = a_textBorder

columns.valueColumn.state1.label.text = '$VAL'
columns.valueColumn.state1.label.arrowDown = true
columns.valueColumn.state1.entry.text = @infoValue
columns.valueColumn.state1.sortAttributes = <infoValue, text>
columns.valueColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.valueColumn.state2.label.text = '$VAL'
columns.valueColumn.state2.entry.text = @infoValue
columns.valueColumn.state2.sortAttributes = <infoValue, text>
columns.valueColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; VALUE/WEIGHT COLUMN -------------------------------------------------------
columns.valueWeightColumn.type = TEXT
columns.valueWeightColumn.name = '$VALUE/WEIGHT'
columns.valueWeightColumn.states = 2
columns.valueWeightColumn.width = 0.09
columns.valueWeightColumn.border = a_textBorder
columns.valueWeightColumn.hidden = true

columns.valueWeightColumn.state1.label.text = '$V/W'
columns.valueWeightColumn.state1.label.arrowDown = true
columns.valueWeightColumn.state1.entry.text = @infoValueWeight
columns.valueWeightColumn.state1.sortAttributes = <infoValueWeight, text>
columns.valueWeightColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.valueWeightColumn.state2.label.text = '$V/W'
columns.valueWeightColumn.state2.entry.text = @infoValueWeight
columns.valueWeightColumn.state2.sortAttributes = <infoValueWeight, text>
columns.valueWeightColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; MAGIC NAME COLUMN -------------------------------------------------------
columns.magicNameColumn.type = NAME
columns.magicNameColumn.name = '$NAME'
columns.magicNameColumn.states = 2
columns.magicNameColumn.weight = 1.0
columns.magicNameColumn.border = a_textBorder
columns.magicNameColumn.label.textFormat.align = left

columns.magicNameColumn.state1.label.text = '$NAME'
columns.magicNameColumn.state1.entry.text = @text
columns.magicNameColumn.state1.sortOptions = {ASCENDING | CASEINSENSITIVE}

columns.magicNameColumn.state2.label.text = '$FAVORITE'
columns.magicNameColumn.state2.entry.text = @text
columns.magicNameColumn.state2.sortAttributes = <favorite, text>
columns.magicNameColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.magicNameColumn.state2.playerOnly = true


; SPELL COST COLUMN -------------------------------------------
columns.spellCostColumn.type = TEXT
columns.spellCostColumn.name = '$SPELL COST'
columns.spellCostColumn.states = 2
columns.spellCostColumn.width = 0.15
columns.spellCostColumn.border = a_textBorder

columns.spellCostColumn.state1.label.text = '$COST'
columns.spellCostColumn.state1.label.arrowDown = true
columns.spellCostColumn.state1.entry.text = @spellCostDisplay
columns.spellCostColumn.state1.sortAttributes = <infoSpellCost, text>
columns.spellCostColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.spellCostColumn.state2.label.text = '$COST'
columns.spellCostColumn.state2.label.arrowDown = false
columns.spellCostColumn.state2.entry.text = @spellCostDisplay
columns.spellCostColumn.state2.sortAttributes = <infoSpellCost, text>
columns.spellCostColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; WORD 1 COLUMN -------------------------------------------
columns.word0Column.type = TEXT
columns.word0Column.name = '$FIRST WORD'
columns.word0Column.states = 2
columns.word0Column.width = 0.2
columns.word0Column.border = a_textBorder

columns.word0Column.state1.label.text = '$FIRST WORD'
columns.word0Column.state1.label.arrowDown = true
columns.word0Column.state1.entry.text = @word0
columns.word0Column.state1.sortAttributes = <word0Recharge, text>
columns.word0Column.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word0Column.state1.colorAttribute = word0Color

columns.word0Column.state2.label.text = '$FIRST WORD'
columns.word0Column.state2.label.arrowDown = false
columns.word0Column.state2.entry.text = @word0
columns.word0Column.state2.sortAttributes = <word0Recharge, text>
columns.word0Column.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word0Column.state2.colorAttribute = word0Color


; WORD 2 COLUMN -------------------------------------------
columns.word1Column.type = TEXT
columns.word1Column.name = '$SECOND WORD'
columns.word1Column.states = 2
columns.word1Column.width = 0.2
columns.word1Column.border = a_textBorder

columns.word1Column.state1.label.text = '$SECOND WORD'
columns.word1Column.state1.label.arrowDown = true
columns.word1Column.state1.entry.text = @word1
columns.word1Column.state1.sortAttributes = <word1Recharge, text>
columns.word1Column.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word1Column.state1.colorAttribute = word1Color

columns.word1Column.state2.label.text = '$SECOND WORD'
columns.word1Column.state2.label.arrowDown = false
columns.word1Column.state2.entry.text = @word1
columns.word1Column.state2.sortAttributes = <word1Recharge, text>
columns.word1Column.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word1Column.state2.colorAttribute = word1Color


; WORD 3 COLUMN -------------------------------------------
columns.word2Column.type = TEXT
columns.word2Column.name = '$THIRD WORD'
columns.word2Column.states = 2
columns.word2Column.width = 0.2
columns.word2Column.border = a_textBorder

columns.word2Column.state1.label.text = '$THIRD WORD'
columns.word2Column.state1.label.arrowDown = true
columns.word2Column.state1.entry.text = @word2
columns.word2Column.state1.sortAttributes = <word2Recharge, text>
columns.word2Column.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word2Column.state1.colorAttribute = word2Color

columns.word2Column.state2.label.text = '$THIRD WORD'
columns.word2Column.state2.label.arrowDown = false
columns.word2Column.state2.entry.text = @word2
columns.word2Column.state2.sortAttributes = <word2Recharge, text>
columns.word2Column.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word2Column.state2.colorAttribute = word2Color


; SCHOOL COLUMN -------------------------------------------
columns.schoolColumn.type = TEXT
columns.schoolColumn.name = '$SCHOOL'
columns.schoolColumn.states = 2
columns.schoolColumn.width = 0.15
columns.schoolColumn.border = a_textBorder

columns.schoolColumn.state1.label.text = '$SCHOOL'
columns.schoolColumn.state1.label.arrowDown = false
columns.schoolColumn.state1.entry.text = @infoSchoolName
columns.schoolColumn.state1.sortAttributes = <infoSchoolName, text>
columns.schoolColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.schoolColumn.state2.label.text = '$SCHOOL'
columns.schoolColumn.state2.label.arrowDown = true
columns.schoolColumn.state2.entry.text = @infoSchoolName
columns.schoolColumn.state2.sortAttributes = <infoSchoolName, text>
columns.schoolColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; LEVEL COLUMN -------------------------------------------
columns.levelColumn.type = TEXT
columns.levelColumn.name = '$SKILL LEVEL'
columns.levelColumn.states = 2
columns.levelColumn.width = 0.15
columns.levelColumn.border = a_textBorder

columns.levelColumn.state1.label.text = '$LEVEL'
columns.levelColumn.state1.label.arrowDown = false
columns.levelColumn.state1.entry.text = @infoCastLevel
columns.levelColumn.state1.sortAttributes = <skillLevel, text>
columns.levelColumn.state1.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.levelColumn.state2.label.text = '$LEVEL'
columns.levelColumn.state2.label.arrowDown = true
columns.levelColumn.state2.entry.text = @infoCastLevel
columns.levelColumn.state2.sortAttributes = <skillLevel, text>
columns.levelColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; TIME REMAINING COLUMN -------------------------------------------
columns.timeRemainingColumn.type = TEXT
columns.timeRemainingColumn.name = '$TIME LEFT'
columns.timeRemainingColumn.states = 2
columns.timeRemainingColumn.width = 0.333
columns.timeRemainingColumn.label.textFormat.align = center
columns.timeRemainingColumn.entry.textFormat.align = center

columns.timeRemainingColumn.state1.label.text = '$TIME LEFT'
columns.timeRemainingColumn.state1.label.arrowDown = false
columns.timeRemainingColumn.state1.entry.text = @timeRemainingDisplay
columns.timeRemainingColumn.state1.sortAttributes = <timeRemaining, text>
columns.timeRemainingColumn.state1.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.timeRemainingColumn.state2.label.text = '$TIME LEFT'
columns.timeRemainingColumn.state2.label.arrowDown = true
columns.timeRemainingColumn.state2.entry.text = @timeRemainingDisplay
columns.timeRemainingColumn.state2.sortAttributes = <timeRemaining, text>
columns.timeRemainingColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; EFFECT ITEM COLUMN -------------------------------------------
columns.effectItemColumn.type = TEXT
columns.effectItemColumn.name = '$SOURCE'
columns.effectItemColumn.states = 2
columns.effectItemColumn.width = 0.333
columns.effectItemColumn.label.textFormat.align = right
columns.effectItemColumn.entry.textFormat.align = right

columns.effectItemColumn.state1.label.text = '$SOURCE'
columns.effectItemColumn.state1.label.arrowDown = false
columns.effectItemColumn.state1.entry.text = @cardName
columns.effectItemColumn.state1.sortAttributes = <cardName, text>
columns.effectItemColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.effectItemColumn.state2.label.text = '$SOURCE'
columns.effectItemColumn.state2.label.arrowDown = true
columns.effectItemColumn.state2.entry.text = @cardName
columns.effectItemColumn.state2.sortAttributes = <cardName, text>
columns.effectItemColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; CRAFT NAME COLUMN -------------------------------------------------------
columns.craftNameColumn.type = NAME
columns.craftNameColumn.name = '$NAME'
columns.craftNameColumn.states = 1
columns.craftNameColumn.weight = 1.0
columns.craftNameColumn.border = a_textBorder
columns.craftNameColumn.label.textFormat.align = left

columns.craftNameColumn.state1.label.text = '$NAME'
columns.craftNameColumn.state1.entry.text = @text
columns.craftNameColumn.state1.sortAttributes = <text>
columns.craftNameColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}>

; DISENCHANT EFFECT COLUMN -------------------------------------------------------
columns.disenchantEffectColumn.type = TEXT
columns.disenchantEffectColumn.name = '$EFFECT'
columns.disenchantEffectColumn.states = 2
columns.disenchantEffectColumn.width = 0.4
columns.disenchantEffectColumn.label.textFormat.align = right
columns.disenchantEffectColumn.entry.textFormat.align = right

columns.disenchantEffectColumn.state1.label.text = '$EFFECT'
columns.disenchantEffectColumn.state1.label.arrowDown = false
columns.disenchantEffectColumn.state1.entry.text = @effectName
columns.disenchantEffectColumn.state1.sortAttributes = <effectName, value, text>
columns.disenchantEffectColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.disenchantEffectColumn.state2.label.text = '$EFFECT'
columns.disenchantEffectColumn.state2.label.arrowDown = true
columns.disenchantEffectColumn.state2.entry.text = @effectName
columns.disenchantEffectColumn.state2.sortAttributes = <effectName, value, text>
columns.disenchantEffectColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

; SOUL SIZE COLUMN -------------------------------------------------------
columns.soulSizeColumn.type = TEXT
columns.soulSizeColumn.name = '$HK19'
columns.soulSizeColumn.states = 2
columns.soulSizeColumn.width = 0.15
columns.soulSizeColumn.label.textFormat.align = right
columns.soulSizeColumn.entry.textFormat.align = right

columns.soulSizeColumn.state1.label.text = '$HK19'
columns.soulSizeColumn.state1.label.arrowDown = false
columns.soulSizeColumn.state1.entry.text = @soulSizeDisplay
columns.soulSizeColumn.state1.sortAttributes = <soulSize, text>
columns.soulSizeColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.soulSizeColumn.state2.label.text = '$HK19'
columns.soulSizeColumn.state2.label.arrowDown = true
columns.soulSizeColumn.state2.entry.text = @soulSizeDisplay
columns.soulSizeColumn.state2.sortAttributes = <soulSize, text>
columns.soulSizeColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

; ALCHEMY WEIGHT COLUMN -------------------------------------------------------
columns.alchWeightColumn.type = TEXT
columns.alchWeightColumn.name = '$WEIGHT'
columns.alchWeightColumn.states = 2
columns.alchWeightColumn.width = 0.14
columns.alchWeightColumn.border = a_textBorder

columns.alchWeightColumn.state1.label.text = '$WGT'
columns.alchWeightColumn.state1.label.arrowDown = true
columns.alchWeightColumn.state1.entry.text = @infoWeight
columns.alchWeightColumn.state1.sortAttributes = <infoWeight, text>
columns.alchWeightColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.alchWeightColumn.state2.label.text = '$WGT'
columns.alchWeightColumn.state2.entry.text = @infoWeight
columns.alchWeightColumn.state2.sortAttributes = <infoWeight, text>
columns.alchWeightColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; ALCHEMY VALUE COLUMN -------------------------------------------------------
columns.alchValueColumn.type = TEXT
columns.alchValueColumn.name = '$VALUE'
columns.alchValueColumn.states = 2
columns.alchValueColumn.width = 0.14
columns.alchValueColumn.border = a_textBorder

columns.alchValueColumn.state1.label.text = '$VAL'
columns.alchValueColumn.state1.label.arrowDown = true
columns.alchValueColumn.state1.entry.text = @infoValue
columns.alchValueColumn.state1.sortAttributes = <infoValue, text>
columns.alchValueColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.alchValueColumn.state2.label.text = '$VAL'
columns.alchValueColumn.state2.entry.text = @infoValue
columns.alchValueColumn.state2.sortAttributes = <infoValue, text>
columns.alchValueColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; ALCHEMY VALUE/WEIGHT COLUMN -------------------------------------------------------
columns.alchValueWeightColumn.type = TEXT
columns.alchValueWeightColumn.name = '$VALUE/WEIGHT'
columns.alchValueWeightColumn.states = 2
columns.alchValueWeightColumn.width = 0.14
columns.alchValueWeightColumn.border = a_textBorder
columns.alchValueWeightColumn.hidden = true

columns.alchValueWeightColumn.state1.label.text = '$V/W'
columns.alchValueWeightColumn.state1.label.arrowDown = true
columns.alchValueWeightColumn.state1.entry.text = @infoValueWeight
columns.alchValueWeightColumn.state1.sortAttributes = <infoValueWeight, text>
columns.alchValueWeightColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.alchValueWeightColumn.state2.label.text = '$V/W'
columns.alchValueWeightColumn.state2.entry.text = @infoValueWeight
columns.alchValueWeightColumn.state2.sortAttributes = <infoValueWeight, text>
columns.alchValueWeightColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; ITEM VIEWS -------------------------------------------------------
views.defaultItemView.primaryColumn = itemNameColumn
views.defaultItemView.columns = <equipColumn, iconColumn, itemNameColumn, subTypeColumn, weightColumn, valueColumn, valueWeightColumn>

views.weaponView.primaryColumn = itemNameColumn
views.weaponView.columns = <equipColumn, iconColumn, itemNameColumn, subTypeColumn, materialColumn, damageColumn, weightColumn, valueColumn, valueWeightColumn>
views.weaponView.category = <Inventory.FILTERFLAG_INV_WEAPONS, Inventory.FILTERFLAG_CONTAINER_WEAPONS>

views.armorView.primaryColumn = itemNameColumn
views.armorView.columns = <equipColumn, iconColumn, itemNameColumn, subTypeColumn, classColumn, materialColumn, arColumn, weightColumn, valueColumn, valueWeightColumn>
views.armorView.category = <Inventory.FILTERFLAG_INV_ARMOR, Inventory.FILTERFLAG_CONTAINER_ARMOR>

views.magicItemView.primaryColumn = itemNameColumn
views.magicItemView.columns = <equipColumn, iconColumn, itemNameColumn, subTypeColumn, magnitudeColumn, durationColumn, weightColumn, valueColumn, valueWeightColumn>
views.magicItemView.category = <Inventory.FILTERFLAG_INV_POTIONS, Inventory.FILTERFLAG_INV_SCROLLS, Inventory.FILTERFLAG_CONTAINER_POTIONS, Inventory.FILTERFLAG_CONTAINER_SCROLLS>

views.keysView.primaryColumn = itemNameColumn
views.keysView.columns = <equipColumn, iconColumn, itemNameColumn, weightColumn, valueColumn, valueWeightColumn>
views.keysView.category = <Inventory.FILTERFLAG_INV_KEYS, Inventory.FILTERFLAG_CONTAINER_KEYS>


; MAGIC VIEWS -------------------------------------------------------
views.defaultMagicView.primaryColumn = magicNameColumn
views.defaultMagicView.columns = <equipColumn, iconColumn, magicNameColumn, levelColumn, magicMagnitudeColumn, magicDurationColumn, spellCostColumn>

views.allMagicView.primaryColumn = magicNameColumn
views.allMagicView.columns = <equipColumn, iconColumn, magicNameColumn, schoolColumn, levelColumn, spellCostColumn>
views.allMagicView.category = <Inventory.FILTERFLAG_MAGIC_ALL, Inventory.FILTERFLAG_MAGIC_FAVORITES>

views.shoutsView.primaryColumn = magicNameColumn
views.shoutsView.columns = <equipColumn, iconColumn, magicNameColumn, word0Column, word1Column, word2Column>
views.shoutsView.category = Inventory.FILTERFLAG_MAGIC_SHOUTS

views.powersView.primaryColumn = magicNameColumn
views.powersView.columns = <equipColumn, iconColumn, magicNameColumn, magicDurationColumn, spellCostColumn>
views.powersView.category = Inventory.FILTERFLAG_MAGIC_POWERS

views.activeEffectView.primaryColumn = magicNameColumn
views.activeEffectView.columns = <equipColumn, iconColumn, magicNameColumn, timeRemainingColumn, effectItemColumn>
views.activeEffectView.category = Inventory.FILTERFLAG_MAGIC_ACTIVEEFFECTS


; CRAFTING VIEWS -------------------------------------------------------
views.defaultCraftingView.primaryColumn = craftNameColumn
views.defaultCraftingView.columns = <equipColumn, iconColumn, craftNameColumn, subTypeColumn, weightColumn, valueColumn, valueWeightColumn>

views.disenchantView.primaryColumn = craftNameColumn
views.disenchantView.columns = <equipColumn, iconColumn, craftNameColumn, disenchantEffectColumn, subTypeColumn, weightColumn, valueColumn, valueWeightColumn>
views.disenchantView.category = Inventory.FILTERFLAG_ENCHANTING_DISENCHANT

views.enchantItemView.primaryColumn = craftNameColumn
views.enchantItemView.columns = <equipColumn, iconColumn, craftNameColumn, subTypeColumn, materialColumn, weightColumn, valueColumn, valueWeightColumn>
views.enchantItemView.category = Inventory.FILTERFLAG_ENCHANTING_ITEM

views.enchantEnchantmentView.primaryColumn = craftNameColumn
views.enchantEnchantmentView.columns = <equipColumn, iconColumn, craftNameColumn>
views.enchantEnchantmentView.category = Inventory.FILTERFLAG_ENCHANTING_ENCHANTMENT

views.enchantSoulView.primaryColumn = craftNameColumn
views.enchantSoulView.columns = <equipColumn, iconColumn, craftNameColumn, soulSizeColumn, weightColumn, valueColumn, valueWeightColumn>
views.enchantSoulView.category = Inventory.FILTERFLAG_ENCHANTING_SOULGEM

views.craftWeaponView.primaryColumn = craftNameColumn
views.craftWeaponView.columns = <equipColumn, iconColumn, craftNameColumn, subTypeColumn, materialColumn, damageColumn, weightColumn, valueColumn, valueWeightColumn>
views.craftWeaponView.category = <Inventory.FILTERFLAG_CUST_CRAFT_WEAPONS, Inventory.FILTERFLAG_CUST_CRAFT_AMMO>

views.craftArmorView.primaryColumn = craftNameColumn
views.craftArmorView.columns = <equipColumn, iconColumn, craftNameColumn, subTypeColumn, classColumn, materialColumn, arColumn, weightColumn, valueColumn, valueWeightColumn>
views.craftArmorView.category = Inventory.FILTERFLAG_CUST_CRAFT_ARMOR

views.alchemyView.primaryColumn = craftNameColumn
views.alchemyView.columns = <equipColumn, iconColumn, craftNameColumn, alchWeightColumn, alchValueColumn, alchValueWeightColumn>


; LAYOUTS -------------------------------------------------------
layouts.itemListLayout.name = 'ItemListLayout'
layouts.itemListLayout.views = <weaponView, armorView, magicItemView, keysView, defaultItemView>

layouts.magicListLayout.name = 'MagicListLayout'
layouts.magicListLayout.views = <shoutsView, powersView, activeEffectView, allMagicView, defaultMagicView>

layouts.enchantListLayout.name = 'EnchantListLayout'
layouts.enchantListLayout.views = <disenchantView, enchantItemView, enchantEnchantmentView, enchantSoulView, defaultCraftingView>

layouts.constructListLayout.name = 'ConstructListLayout'
layouts.constructListLayout.views = <craftWeaponView, craftArmorView, defaultCraftingView>

layouts.smithingListLayout.name = 'SmithingListLayout'
layouts.smithingListLayout.views = <defaultCraftingView>

layouts.alchemyListLayout.name = 'AlchemyListLayout'
layouts.alchemyListLayout.views = <alchemyView>


================================================
FILE: dist/.gitignore
================================================

*.pex
*.swf
*.bak
*.bsa
*.bsl
Archive.log


================================================
FILE: dist/Data/Interface/skyui/config.txt
================================================
; =====================================================================================================================
[Input]
; =====================================================================================================================
controls.pc.search = 57 ; SPACE
controls.pc.switchTab = 56 ; ALT
controls.pc.equipMode = 42 ; LSHIFT

controls.gamepad.switchTab = 271 ; BACK
controls.gamepad.prevColumn = 274 ; LEFT_SHOULDER
controls.gamepad.nextColumn = 275 ; RIGHT_SHOULDER
controls.gamepad.sortOrder = 272 ; LEFT_THUMB


; =====================================================================================================================
[SearchBox]
; =====================================================================================================================
autoupdate.enable = true
autoupdate.delay = 0


; =====================================================================================================================
[ItemInfo]
; =====================================================================================================================
itemcard.align = center
itemcard.xOffset = 0
itemcard.yOffset = 0


; =====================================================================================================================
[ItemList] 
; =====================================================================================================================
quantityMenu.minCount = 6 ; Number of items required to trigger quantity dialog. 0 is disabled


; =====================================================================================================================
[Appearance] 
; =====================================================================================================================
icons.category.source = 'skyui/icons_category_psychosteve.swf'

icons.item.source = 'skyui/icons_item_psychosteve.swf'
icons.item.noColor = false
icons.item.showStolen = true

colors.text.enabled = 0xffffff
colors.stolen.enabled = 0xffffff
colors.negative.enabled = 0xff0000
colors.text.disabled = 0x4c4c4c
colors.stolen.disabled = 0x4c4c4c
colors.negative.disabled = 0x800000


; =====================================================================================================================
[ListLayout] 
; =====================================================================================================================
vars.a_textBorder.value = <0, 0, 1.1, 0> ; left right top bottom
vars.n_iconSize.value = 18

defaults.entryWidth = 530

; Default text format defaults -------------------------------------------------------
defaults.entry.textFormat.font = '$EverywhereMediumFont'
defaults.entry.textFormat.align = right
defaults.entry.textFormat.bold = false
defaults.entry.textFormat.italic = false
defaults.entry.textFormat.underline = false
defaults.entry.textFormat.size = 14
defaults.entry.textFormat.letterSpacing = 0.8
defaults.entry.textFormat.kerning = false
defaults.entry.textFormat.leftMargin = 0
defaults.entry.textFormat.rightMargin = 0
defaults.entry.textFormat.indent = 0
defaults.entry.textFormat.leading = 0

defaults.label.textFormat.font = '$EverywhereMediumFont'
defaults.label.textFormat.align = right
defaults.label.textFormat.bold = false
defaults.label.textFormat.italic = false
defaults.label.textFormat.underline = false
defaults.label.textFormat.size = 12
defaults.label.textFormat.letterSpacing = 0.8
defaults.label.textFormat.kerning = false
defaults.label.textFormat.leftMargin = 0
defaults.label.textFormat.rightMargin = 0
defaults.label.textFormat.indent = 0
defaults.label.textFormat.leading = 0


; ICONS -------------------------------------------------------
columns.equipColumn.type = EQUIP_ICON
columns.equipColumn.passive = true
columns.equipColumn.states = 1
columns.equipColumn.indent = -28
columns.equipColumn.icon.size = n_iconSize
columns.equipColumn.border = <0, 10, 3, 3> ; left right top bottom
columns.equipColumn.state1.label.text = ' '

columns.iconColumn.type = ITEM_ICON
columns.iconColumn.states = 2
columns.iconColumn.icon.size = n_iconSize
columns.iconColumn.border = <0, 3, 3, 3> ; left right top bottom

columns.iconColumn.state1.label.text = ' '
columns.iconColumn.state1.sortAttributes = <type, formType, subType, weightClass, material, infoDamage, infoArmor, infoSchoolName, actorValue, resistance, skillLevel, magnitude, duration, isRead, text>
columns.iconColumn.state1.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.iconColumn.state2.label.text = ' '
columns.iconColumn.state2.label.arrowDown = true
columns.iconColumn.state2.sortAttributes = <type, formType, subType, weightClass, material, infoDamage, infoArmor, infoSchoolName, actorValue, resistance, skillLevel, magnitude, duration, isRead, text>
columns.iconColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {DESCENDING | CASEINSENSITIVE}, {DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {ASCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {DESCENDING | CASEINSENSITIVE}>

; ITEM NAME COLUMN -------------------------------------------------------
columns.itemNameColumn.type = NAME
columns.itemNameColumn.name = '$NAME'
columns.itemNameColumn.states = 4
columns.itemNameColumn.weight = 1.0
columns.itemNameColumn.border = a_textBorder
columns.itemNameColumn.label.textFormat.align = left

columns.itemNameColumn.state1.label.text = '$NAME'
columns.itemNameColumn.state1.entry.text = @text
columns.itemNameColumn.state1.sortAttributes = <newItem, text>
columns.itemNameColumn.state1.sortOptions = {ASCENDING | CASEINSENSITIVE}

columns.itemNameColumn.state2.label.text = '$EQUIPPED'
columns.itemNameColumn.state2.entry.text = @text
columns.itemNameColumn.state2.sortAttributes = <newItem, isEquipped, equipState, text>
columns.itemNameColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.itemNameColumn.state2.playerOnly = true

columns.itemNameColumn.state3.label.text = '$STOLEN'
columns.itemNameColumn.state3.entry.text = @text
columns.itemNameColumn.state3.sortAttributes = <newItem, isStolen, text>
columns.itemNameColumn.state3.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.itemNameColumn.state3.playerOnly = true

columns.itemNameColumn.state4.label.text = '$ENCHANTED'
columns.itemNameColumn.state4.entry.text = @text
columns.itemNameColumn.state4.sortAttributes = <newItem, isEnchanted, text>
columns.itemNameColumn.state4.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; ARMOR RATING COLUMN -------------------------------------------------------
columns.arColumn.type = TEXT
columns.arColumn.name = '$ARMOR'
columns.arColumn.states = 2
columns.arColumn.width = 0.09
columns.arColumn.border = a_textBorder

columns.arColumn.state1.label.text = '$ARM'
columns.arColumn.state1.label.arrowDown = true
columns.arColumn.state1.entry.text = @infoArmor
columns.arColumn.state1.sortAttributes = <infoArmor, text>
columns.arColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.arColumn.state2.label.text = '$ARM'
columns.arColumn.state2.entry.text = @infoArmor
columns.arColumn.state2.sortAttributes = <infoArmor, text>
columns.arColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; SUBTYPE COLUMN -------------------------------------------------------
columns.subTypeColumn.type = TEXT
columns.subTypeColumn.name = '$TYPE'
columns.subTypeColumn.states = 2
columns.subTypeColumn.width = 0.15
columns.subTypeColumn.border = a_textBorder

columns.subTypeColumn.state1.label.text = '$TYPE'
columns.subTypeColumn.state1.entry.text = @subTypeDisplay
columns.subTypeColumn.state1.sortAttributes = <subTypeDisplay, text>
columns.subTypeColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.subTypeColumn.state2.label.text = '$TYPE'
columns.subTypeColumn.state2.entry.text = @subTypeDisplay
columns.subTypeColumn.state2.label.arrowDown = true
columns.subTypeColumn.state2.sortAttributes = <subTypeDisplay, text>
columns.subTypeColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; MATERIAL COLUMN -------------------------------------------------------
columns.materialColumn.type = TEXT
columns.materialColumn.name = '$MATERIAL'
columns.materialColumn.states = 2
columns.materialColumn.width = 0.10
columns.materialColumn.border = a_textBorder
columns.materialColumn.hidden = true

columns.materialColumn.state1.label.text = '$MAT'
columns.materialColumn.state1.entry.text = @materialDisplay
columns.materialColumn.state1.sortAttributes = <materialDisplay, text>
columns.materialColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.materialColumn.state2.label.text = '$MAT'
columns.materialColumn.state2.entry.text = @materialDisplay
columns.materialColumn.state2.label.arrowDown = true
columns.materialColumn.state2.sortAttributes = <materialDisplay, text>
columns.materialColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; CLASS COLUMN -------------------------------------------------------
columns.classColumn.type = TEXT
columns.classColumn.name = '$CLASS'
columns.classColumn.states = 2
columns.classColumn.width = 0.10
columns.classColumn.border = a_textBorder

columns.classColumn.state1.label.text = '$CLASS'
columns.classColumn.state1.entry.text = @weightClassDisplay
columns.classColumn.state1.sortAttributes = <weightClassDisplay, text>
columns.classColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.classColumn.state2.label.text = '$CLASS'
columns.classColumn.state2.entry.text = @weightClassDisplay
columns.classColumn.state2.label.arrowDown = true
columns.classColumn.state2.sortAttributes = <weightClassDisplay, text>
columns.classColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; MAGNITUDE COLUMN -------------------------------------------------------
columns.magnitudeColumn.type = TEXT
columns.magnitudeColumn.name = '$MAGNITUDE'
columns.magnitudeColumn.states = 2
columns.magnitudeColumn.width = 0.09
columns.magnitudeColumn.border = a_textBorder

columns.magnitudeColumn.state1.label.text = '$MAG'
columns.magnitudeColumn.state1.label.arrowDown = true
columns.magnitudeColumn.state1.entry.text = @magnitude
columns.magnitudeColumn.state1.sortAttributes = <magnitude, text>
columns.magnitudeColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.magnitudeColumn.state2.label.text = '$MAG'
columns.magnitudeColumn.state2.entry.text = @magnitude
columns.magnitudeColumn.state2.sortAttributes = <magnitude, text>
columns.magnitudeColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; DURATION COLUMN -------------------------------------------------------
columns.durationColumn.type = TEXT
columns.durationColumn.name = '$TIME'
columns.durationColumn.states = 2
columns.durationColumn.width = 0.09
columns.durationColumn.border = a_textBorder

columns.durationColumn.state1.label.text = '$TIME'
columns.durationColumn.state1.label.arrowDown = true
columns.durationColumn.state1.entry.text = @duration
columns.durationColumn.state1.sortAttributes = <duration, text>
columns.durationColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.durationColumn.state2.label.text = '$TIME'
columns.durationColumn.state2.entry.text = @duration
columns.durationColumn.state2.sortAttributes = <duration, text>
columns.durationColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; MAGIC MAGNITUDE COLUMN -------------------------------------------------------
columns.magicMagnitudeColumn.type = TEXT
columns.magicMagnitudeColumn.name = '$MAGNITUDE'
columns.magicMagnitudeColumn.states = 2
columns.magicMagnitudeColumn.width = 0.15
columns.magicMagnitudeColumn.border = a_textBorder

columns.magicMagnitudeColumn.state1.label.text = '$MAG'
columns.magicMagnitudeColumn.state1.label.arrowDown = true
columns.magicMagnitudeColumn.state1.entry.text = @magnitude
columns.magicMagnitudeColumn.state1.sortAttributes = <magnitude, text>
columns.magicMagnitudeColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.magicMagnitudeColumn.state2.label.text = '$MAG'
columns.magicMagnitudeColumn.state2.entry.text = @magnitude
columns.magicMagnitudeColumn.state2.sortAttributes = <magnitude, text>
columns.magicMagnitudeColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; MAGIC DURATION COLUMN -------------------------------------------------------
columns.magicDurationColumn.type = TEXT
columns.magicDurationColumn.name = '$TIME'
columns.magicDurationColumn.states = 2
columns.magicDurationColumn.width = 0.15
columns.magicDurationColumn.border = a_textBorder

columns.magicDurationColumn.state1.label.text = '$TIME'
columns.magicDurationColumn.state1.label.arrowDown = true
columns.magicDurationColumn.state1.entry.text = @duration
columns.magicDurationColumn.state1.sortAttributes = <duration, text>
columns.magicDurationColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.magicDurationColumn.state2.label.text = '$TIME'
columns.magicDurationColumn.state2.entry.text = @duration
columns.magicDurationColumn.state2.sortAttributes = <duration, text>
columns.magicDurationColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; DAMAGE COLUMN -------------------------------------------------------
columns.damageColumn.type = TEXT
columns.damageColumn.name = '$DAMAGE'
columns.damageColumn.states = 2
columns.damageColumn.width = 0.09
columns.damageColumn.border = a_textBorder

columns.damageColumn.state1.label.text = '$DAM'
columns.damageColumn.state1.label.arrowDown = true
columns.damageColumn.state1.entry.text = @infoDamage
columns.damageColumn.state1.sortAttributes = <infoDamage, text>
columns.damageColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.damageColumn.state2.label.text = '$DAM'
columns.damageColumn.state2.entry.text = @infoDamage
columns.damageColumn.state2.sortAttributes = <infoDamage, text>
columns.damageColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; WEIGHT COLUMN -------------------------------------------------------
columns.weightColumn.type = TEXT
columns.weightColumn.name = '$WEIGHT'
columns.weightColumn.states = 2
columns.weightColumn.width = 0.09
columns.weightColumn.border = a_textBorder

columns.weightColumn.state1.label.text = '$WGT'
columns.weightColumn.state1.label.arrowDown = true
columns.weightColumn.state1.entry.text = @infoWeight
columns.weightColumn.state1.sortAttributes = <infoWeight, text>
columns.weightColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.weightColumn.state2.label.text = '$WGT'
columns.weightColumn.state2.entry.text = @infoWeight
columns.weightColumn.state2.sortAttributes = <infoWeight, text>
columns.weightColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; VALUE COLUMN -------------------------------------------------------
columns.valueColumn.type = TEXT
columns.valueColumn.name = '$VALUE'
columns.valueColumn.states = 2
columns.valueColumn.width = 0.09
columns.valueColumn.border = a_textBorder

columns.valueColumn.state1.label.text = '$VAL'
columns.valueColumn.state1.label.arrowDown = true
columns.valueColumn.state1.entry.text = @infoValue
columns.valueColumn.state1.sortAttributes = <infoValue, text>
columns.valueColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.valueColumn.state2.label.text = '$VAL'
columns.valueColumn.state2.entry.text = @infoValue
columns.valueColumn.state2.sortAttributes = <infoValue, text>
columns.valueColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; VALUE/WEIGHT COLUMN -------------------------------------------------------
columns.valueWeightColumn.type = TEXT
columns.valueWeightColumn.name = '$VALUE/WEIGHT'
columns.valueWeightColumn.states = 2
columns.valueWeightColumn.width = 0.09
columns.valueWeightColumn.border = a_textBorder
columns.valueWeightColumn.hidden = true

columns.valueWeightColumn.state1.label.text = '$V/W'
columns.valueWeightColumn.state1.label.arrowDown = true
columns.valueWeightColumn.state1.entry.text = @infoValueWeight
columns.valueWeightColumn.state1.sortAttributes = <infoValueWeight, text>
columns.valueWeightColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.valueWeightColumn.state2.label.text = '$V/W'
columns.valueWeightColumn.state2.entry.text = @infoValueWeight
columns.valueWeightColumn.state2.sortAttributes = <infoValueWeight, text>
columns.valueWeightColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; MAGIC NAME COLUMN -------------------------------------------------------
columns.magicNameColumn.type = NAME
columns.magicNameColumn.name = '$NAME'
columns.magicNameColumn.states = 2
columns.magicNameColumn.weight = 1.0
columns.magicNameColumn.border = a_textBorder
columns.magicNameColumn.label.textFormat.align = left

columns.magicNameColumn.state1.label.text = '$NAME'
columns.magicNameColumn.state1.entry.text = @text
columns.magicNameColumn.state1.sortOptions = {ASCENDING | CASEINSENSITIVE}

columns.magicNameColumn.state2.label.text = '$FAVORITE'
columns.magicNameColumn.state2.entry.text = @text
columns.magicNameColumn.state2.sortAttributes = <favorite, text>
columns.magicNameColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.magicNameColumn.state2.playerOnly = true


; SPELL COST COLUMN -------------------------------------------
columns.spellCostColumn.type = TEXT
columns.spellCostColumn.name = '$SPELL COST'
columns.spellCostColumn.states = 2
columns.spellCostColumn.width = 0.15
columns.spellCostColumn.border = a_textBorder

columns.spellCostColumn.state1.label.text = '$COST'
columns.spellCostColumn.state1.label.arrowDown = true
columns.spellCostColumn.state1.entry.text = @spellCostDisplay
columns.spellCostColumn.state1.sortAttributes = <infoSpellCost, text>
columns.spellCostColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.spellCostColumn.state2.label.text = '$COST'
columns.spellCostColumn.state2.label.arrowDown = false
columns.spellCostColumn.state2.entry.text = @spellCostDisplay
columns.spellCostColumn.state2.sortAttributes = <infoSpellCost, text>
columns.spellCostColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; WORD 1 COLUMN -------------------------------------------
columns.word0Column.type = TEXT
columns.word0Column.name = '$FIRST WORD'
columns.word0Column.states = 2
columns.word0Column.width = 0.2
columns.word0Column.border = a_textBorder

columns.word0Column.state1.label.text = '$FIRST WORD'
columns.word0Column.state1.label.arrowDown = true
columns.word0Column.state1.entry.text = @word0
columns.word0Column.state1.sortAttributes = <word0Recharge, text>
columns.word0Column.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word0Column.state1.colorAttribute = word0Color

columns.word0Column.state2.label.text = '$FIRST WORD'
columns.word0Column.state2.label.arrowDown = false
columns.word0Column.state2.entry.text = @word0
columns.word0Column.state2.sortAttributes = <word0Recharge, text>
columns.word0Column.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word0Column.state2.colorAttribute = word0Color


; WORD 2 COLUMN -------------------------------------------
columns.word1Column.type = TEXT
columns.word1Column.name = '$SECOND WORD'
columns.word1Column.states = 2
columns.word1Column.width = 0.2
columns.word1Column.border = a_textBorder

columns.word1Column.state1.label.text = '$SECOND WORD'
columns.word1Column.state1.label.arrowDown = true
columns.word1Column.state1.entry.text = @word1
columns.word1Column.state1.sortAttributes = <word1Recharge, text>
columns.word1Column.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word1Column.state1.colorAttribute = word1Color

columns.word1Column.state2.label.text = '$SECOND WORD'
columns.word1Column.state2.label.arrowDown = false
columns.word1Column.state2.entry.text = @word1
columns.word1Column.state2.sortAttributes = <word1Recharge, text>
columns.word1Column.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word1Column.state2.colorAttribute = word1Color


; WORD 3 COLUMN -------------------------------------------
columns.word2Column.type = TEXT
columns.word2Column.name = '$THIRD WORD'
columns.word2Column.states = 2
columns.word2Column.width = 0.2
columns.word2Column.border = a_textBorder

columns.word2Column.state1.label.text = '$THIRD WORD'
columns.word2Column.state1.label.arrowDown = true
columns.word2Column.state1.entry.text = @word2
columns.word2Column.state1.sortAttributes = <word2Recharge, text>
columns.word2Column.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word2Column.state1.colorAttribute = word2Color

columns.word2Column.state2.label.text = '$THIRD WORD'
columns.word2Column.state2.label.arrowDown = false
columns.word2Column.state2.entry.text = @word2
columns.word2Column.state2.sortAttributes = <word2Recharge, text>
columns.word2Column.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>
columns.word2Column.state2.colorAttribute = word2Color


; SCHOOL COLUMN -------------------------------------------
columns.schoolColumn.type = TEXT
columns.schoolColumn.name = '$SCHOOL'
columns.schoolColumn.states = 2
columns.schoolColumn.width = 0.15
columns.schoolColumn.border = a_textBorder

columns.schoolColumn.state1.label.text = '$SCHOOL'
columns.schoolColumn.state1.label.arrowDown = false
columns.schoolColumn.state1.entry.text = @infoSchoolName
columns.schoolColumn.state1.sortAttributes = <infoSchoolName, text>
columns.schoolColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.schoolColumn.state2.label.text = '$SCHOOL'
columns.schoolColumn.state2.label.arrowDown = true
columns.schoolColumn.state2.entry.text = @infoSchoolName
columns.schoolColumn.state2.sortAttributes = <infoSchoolName, text>
columns.schoolColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; LEVEL COLUMN -------------------------------------------
columns.levelColumn.type = TEXT
columns.levelColumn.name = '$SKILL LEVEL'
columns.levelColumn.states = 2
columns.levelColumn.width = 0.15
columns.levelColumn.border = a_textBorder

columns.levelColumn.state1.label.text = '$LEVEL'
columns.levelColumn.state1.label.arrowDown = false
columns.levelColumn.state1.entry.text = @infoCastLevel
columns.levelColumn.state1.sortAttributes = <skillLevel, text>
columns.levelColumn.state1.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.levelColumn.state2.label.text = '$LEVEL'
columns.levelColumn.state2.label.arrowDown = true
columns.levelColumn.state2.entry.text = @infoCastLevel
columns.levelColumn.state2.sortAttributes = <skillLevel, text>
columns.levelColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; TIME REMAINING COLUMN -------------------------------------------
columns.timeRemainingColumn.type = TEXT
columns.timeRemainingColumn.name = '$TIME LEFT'
columns.timeRemainingColumn.states = 2
columns.timeRemainingColumn.width = 0.333
columns.timeRemainingColumn.label.textFormat.align = center
columns.timeRemainingColumn.entry.textFormat.align = center

columns.timeRemainingColumn.state1.label.text = '$TIME LEFT'
columns.timeRemainingColumn.state1.label.arrowDown = false
columns.timeRemainingColumn.state1.entry.text = @timeRemainingDisplay
columns.timeRemainingColumn.state1.sortAttributes = <timeRemaining, text>
columns.timeRemainingColumn.state1.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.timeRemainingColumn.state2.label.text = '$TIME LEFT'
columns.timeRemainingColumn.state2.label.arrowDown = true
columns.timeRemainingColumn.state2.entry.text = @timeRemainingDisplay
columns.timeRemainingColumn.state2.sortAttributes = <timeRemaining, text>
columns.timeRemainingColumn.state2.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; EFFECT ITEM COLUMN -------------------------------------------
columns.effectItemColumn.type = TEXT
columns.effectItemColumn.name = '$SOURCE'
columns.effectItemColumn.states = 2
columns.effectItemColumn.width = 0.333
columns.effectItemColumn.label.textFormat.align = right
columns.effectItemColumn.entry.textFormat.align = right

columns.effectItemColumn.state1.label.text = '$SOURCE'
columns.effectItemColumn.state1.label.arrowDown = false
columns.effectItemColumn.state1.entry.text = @cardName
columns.effectItemColumn.state1.sortAttributes = <cardName, text>
columns.effectItemColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>

columns.effectItemColumn.state2.label.text = '$SOURCE'
columns.effectItemColumn.state2.label.arrowDown = true
columns.effectItemColumn.state2.entry.text = @cardName
columns.effectItemColumn.state2.sortAttributes = <cardName, text>
columns.effectItemColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {ASCENDING | CASEINSENSITIVE}>


; CRAFT NAME COLUMN -------------------------------------------------------
columns.craftNameColumn.type = NAME
columns.craftNameColumn.name = '$NAME'
columns.craftNameColumn.states = 1
columns.craftNameColumn.weight = 1.0
columns.craftNameColumn.border = a_textBorder
columns.craftNameColumn.label.textFormat.align = left

columns.craftNameColumn.state1.label.text = '$NAME'
columns.craftNameColumn.state1.entry.text = @text
columns.craftNameColumn.state1.sortAttributes = <text>
columns.craftNameColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}>

; DISENCHANT EFFECT COLUMN -------------------------------------------------------
columns.disenchantEffectColumn.type = TEXT
columns.disenchantEffectColumn.name = '$EFFECT'
columns.disenchantEffectColumn.states = 2
columns.disenchantEffectColumn.width = 0.4
columns.disenchantEffectColumn.label.textFormat.align = right
columns.disenchantEffectColumn.entry.textFormat.align = right

columns.disenchantEffectColumn.state1.label.text = '$EFFECT'
columns.disenchantEffectColumn.state1.label.arrowDown = false
columns.disenchantEffectColumn.state1.entry.text = @effectName
columns.disenchantEffectColumn.state1.sortAttributes = <effectName, value, text>
columns.disenchantEffectColumn.state1.sortOptions = <{ASCENDING | CASEINSENSITIVE}, {DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.disenchantEffectColumn.state2.label.text = '$EFFECT'
columns.disenchantEffectColumn.state2.label.arrowDown = true
columns.disenchantEffectColumn.state2.entry.text = @effectName
columns.disenchantEffectColumn.state2.sortAttributes = <effectName, value, text>
columns.disenchantEffectColumn.state2.sortOptions = <{DESCENDING | CASEINSENSITIVE}, {DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

; SOUL SIZE COLUMN -------------------------------------------------------
columns.soulSizeColumn.type = TEXT
columns.soulSizeColumn.name = '$HK19'
columns.soulSizeColumn.states = 2
columns.soulSizeColumn.width = 0.15
columns.soulSizeColumn.label.textFormat.align = right
columns.soulSizeColumn.entry.textFormat.align = right

columns.soulSizeColumn.state1.label.text = '$HK19'
columns.soulSizeColumn.state1.label.arrowDown = false
columns.soulSizeColumn.state1.entry.text = @soulSizeDisplay
columns.soulSizeColumn.state1.sortAttributes = <soulSize, text>
columns.soulSizeColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.soulSizeColumn.state2.label.text = '$HK19'
columns.soulSizeColumn.state2.label.arrowDown = true
columns.soulSizeColumn.state2.entry.text = @soulSizeDisplay
columns.soulSizeColumn.state2.sortAttributes = <soulSize, text>
columns.soulSizeColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

; ALCHEMY WEIGHT COLUMN -------------------------------------------------------
columns.alchWeightColumn.type = TEXT
columns.alchWeightColumn.name = '$WEIGHT'
columns.alchWeightColumn.states = 2
columns.alchWeightColumn.width = 0.14
columns.alchWeightColumn.border = a_textBorder

columns.alchWeightColumn.state1.label.text = '$WGT'
columns.alchWeightColumn.state1.label.arrowDown = true
columns.alchWeightColumn.state1.entry.text = @infoWeight
columns.alchWeightColumn.state1.sortAttributes = <infoWeight, text>
columns.alchWeightColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.alchWeightColumn.state2.label.text = '$WGT'
columns.alchWeightColumn.state2.entry.text = @infoWeight
columns.alchWeightColumn.state2.sortAttributes = <infoWeight, text>
columns.alchWeightColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; ALCHEMY VALUE COLUMN -------------------------------------------------------
columns.alchValueColumn.type = TEXT
columns.alchValueColumn.name = '$VALUE'
columns.alchValueColumn.states = 2
columns.alchValueColumn.width = 0.14
columns.alchValueColumn.border = a_textBorder

columns.alchValueColumn.state1.label.text = '$VAL'
columns.alchValueColumn.state1.label.arrowDown = true
columns.alchValueColumn.state1.entry.text = @infoValue
columns.alchValueColumn.state1.sortAttributes = <infoValue, text>
columns.alchValueColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.alchValueColumn.state2.label.text = '$VAL'
columns.alchValueColumn.state2.entry.text = @infoValue
columns.alchValueColumn.state2.sortAttributes = <infoValue, text>
columns.alchValueColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; ALCHEMY VALUE/WEIGHT COLUMN -------------------------------------------------------
columns.alchValueWeightColumn.type = TEXT
columns.alchValueWeightColumn.name = '$VALUE/WEIGHT'
columns.alchValueWeightColumn.states = 2
columns.alchValueWeightColumn.width = 0.14
columns.alchValueWeightColumn.border = a_textBorder
columns.alchValueWeightColumn.hidden = true

columns.alchValueWeightColumn.state1.label.text = '$V/W'
columns.alchValueWeightColumn.state1.label.arrowDown = true
columns.alchValueWeightColumn.state1.entry.text = @infoValueWeight
columns.alchValueWeightColumn.state1.sortAttributes = <infoValueWeight, text>
columns.alchValueWeightColumn.state1.sortOptions = <{DESCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>

columns.alchValueWeightColumn.state2.label.text = '$V/W'
columns.alchValueWeightColumn.state2.entry.text = @infoValueWeight
columns.alchValueWeightColumn.state2.sortAttributes = <infoValueWeight, text>
columns.alchValueWeightColumn.state2.sortOptions = <{ASCENDING | NUMERIC}, {ASCENDING | CASEINSENSITIVE}>


; ITEM VIEWS -------------------------------------------------------
views.defaultItemView.primaryColumn = itemNameColumn
views.defaultItemView.columns = <equipColumn, iconColumn, itemNameColumn, subTypeColumn, weightColumn, valueColumn, valueWeightColumn>

views.weaponView.primaryColumn = itemNameColumn
views.weaponView.columns = <equipColumn, iconColumn, itemNameColumn, subTypeColumn, materialColumn, damageColumn, weightColumn, valueColumn, valueWeightColumn>
views.weaponView.category = <Inventory.FILTERFLAG_INV_WEAPONS, Inventory.FILTERFLAG_CONTAINER_WEAPONS>

views.armorView.primaryColumn = itemNameColumn
views.armorView.columns = <equipColumn, iconColumn, itemNameColumn, subTypeColumn, classColumn, materialColumn, arColumn, weightColumn, valueColumn, valueWeightColumn>
views.armorView.category = <Inventory.FILTERFLAG_INV_ARMOR, Inventory.FILTERFLAG_CONTAINER_ARMOR>

views.magicItemView.primaryColumn = itemNameColumn
views.magicItemView.columns = <equipColumn, iconColumn, itemNameColumn, subTypeColumn, magnitudeColumn, durationColumn, weightColumn, valueColumn, valueWeightColumn>
views.magicItemView.category = <Inventory.FILTERFLAG_INV_POTIONS, Inventory.FILTERFLAG_INV_SCROLLS, Inventory.FILTERFLAG_CONTAINER_POTIONS, Inventory.FILTERFLAG_CONTAINER_SCROLLS>

views.keysView.primaryColumn = itemNameColumn
views.keysView.columns = <equipColumn, iconColumn, itemNameColumn, weightColumn, valueColumn, valueWeightColumn>
views.keysView.category = <Inventory.FILTERFLAG_INV_KEYS, Inventory.FILTERFLAG_CONTAINER_KEYS>


; MAGIC VIEWS -------------------------------------------------------
views.defaultMagicView.primaryColumn = magicNameColumn
views.defaultMagicView.columns = <equipColumn, iconColumn, magicNameColumn, levelColumn, magicMagnitudeColumn, magicDurationColumn, spellCostColumn>

views.allMagicView.primaryColumn = magicNameColumn
views.allMagicView.columns = <equipColumn, iconColumn, magicNameColumn, schoolColumn, levelColumn, spellCostColumn>
views.allMagicView.category = <Inventory.FILTERFLAG_MAGIC_ALL, Inventory.FILTERFLAG_MAGIC_FAVORITES>

views.shoutsView.primaryColumn = magicNameColumn
views.shoutsView.columns = <equipColumn, iconColumn, magicNameColumn, word0Column, word1Column, word2Column>
views.shoutsView.category = Inventory.FILTERFLAG_MAGIC_SHOUTS

views.powersView.primaryColumn = magicNameColumn
views.powersView.columns = <equipColumn, iconColumn, magicNameColumn, magicDurationColumn, spellCostColumn>
views.powersView.category = Inventory.FILTERFLAG_MAGIC_POWERS

views.activeEffectView.primaryColumn = magicNameColumn
views.activeEffectView.columns = <equipColumn, iconColumn, magicNameColumn, timeRemainingColumn, effectItemColumn>
views.activeEffectView.category = Inventory.FILTERFLAG_MAGIC_ACTIVEEFFECTS


; CRAFTING VIEWS -------------------------------------------------------
views.defaultCraftingView.primaryColumn = craftNameColumn
views.defaultCraftingView.columns = <equipColumn, iconColumn, craftNameColumn, subTypeColumn, weightColumn, valueColumn, valueWeightColumn>

views.disenchantView.primaryColumn = craftNameColumn
views.disenchantView.columns = <equipColumn, iconColumn, craftNameColumn, disenchantEffectColumn, subTypeColumn, weightColumn, valueColumn, valueWeightColumn>
views.disenchantView.category = Inventory.FILTERFLAG_ENCHANTING_DISENCHANT

views.enchantItemView.primaryColumn = craftNameColumn
views.enchantItemView.columns = <equipColumn, iconColumn, craftNameColumn, subTypeColumn, materialColumn, weightColumn, valueColumn, valueWeightColumn>
views.enchantItemView.category = Inventory.FILTERFLAG_ENCHANTING_ITEM

views.enchantEnchantmentView.primaryColumn = craftNameColumn
views.enchantEnchantmentView.columns = <equipColumn, iconColumn, craftNameColumn>
views.enchantEnchantmentView.category = Inventory.FILTERFLAG_ENCHANTING_ENCHANTMENT

views.enchantSoulView.primaryColumn = craftNameColumn
views.enchantSoulView.columns = <equipColumn, iconColumn, craftNameColumn, soulSizeColumn, weightColumn, valueColumn, valueWeightColumn>
views.enchantSoulView.category = Inventory.FILTERFLAG_ENCHANTING_SOULGEM

views.craftWeaponView.primaryColumn = craftNameColumn
views.craftWeaponView.columns = <equipColumn, iconColumn, craftNameColumn, subTypeColumn, materialColumn, damageColumn, weightColumn, valueColumn, valueWeightColumn>
views.craftWeaponView.category = <Inventory.FILTERFLAG_CUST_CRAFT_WEAPONS, Inventory.FILTERFLAG_CUST_CRAFT_AMMO>

views.craftArmorView.primaryColumn = craftNameColumn
views.craftArmorView.columns = <equipColumn, iconColumn, craftNameColumn, subTypeColumn, classColumn, materialColumn, arColumn, weightColumn, valueColumn, valueWeightColumn>
views.craftArmorView.category = Inventory.FILTERFLAG_CUST_CRAFT_ARMOR

views.alchemyView.primaryColumn = craftNameColumn
views.alchemyView.columns = <equipColumn, iconColumn, craftNameColumn, alchWeightColumn, alchValueColumn, alchValueWeightColumn>


; LAYOUTS -------------------------------------------------------
layouts.itemListLayout.name = 'ItemListLayout'
layouts.itemListLayout.views = <weaponView, armorView, magicItemView, keysView, defaultItemView>

layouts.magicListLayout.name = 'MagicListLayout'
layouts.magicListLayout.views = <shoutsView, powersView, activeEffectView, allMagicView, defaultMagicView>

layouts.enchantListLayout.name = 'EnchantListLayout'
layouts.enchantListLayout.views = <disenchantView, enchantItemView, enchantEnchantmentView, enchantSoulView, defaultCraftingView>

layouts.constructListLayout.name = 'ConstructListLayout'
layouts.constructListLayout.views = <craftWeaponView, craftArmorView, defaultCraftingView>

layouts.smithingListLayout.name = 'SmithingListLayout'
layouts.smithingListLayout.views = <defaultCraftingView>

layouts.alchemyListLayout.name = 'AlchemyListLayout'
layouts.alchemyListLayout.views = <alchemyView>

================================================
FILE: dist/Data/Readme - SkyUI.txt
================================================
########################################################################################################################################
	_______ _     _ __   __ _     _ _____
	|______ |____/    \_/   |     |   |  
	______| |    \_    |    |_____| __|__

########################################################################################################################################

Team:			snakster, Mardoxx, T3T

Contributors:	ianpatt, behippo, Kratos, psychosteve, MisterPete, GreatClone, gibbed, PurpleLunchBox, Verteiron, Gopher, Indie

Version:		4.1

Download:		http://skyrim.nexusmods.com/mods/3863
				http://steamcommunity.com/sharedfiles/filedetails/?id=8122

Source code:	https://github.com/schlangster/skyui

########################################################################################################################################

The following mods/utilities are required for SkyUI:

* The Skyrim Script Extender (SKSE), version 1.6.16 or newer
	http://skse.silverlock.org/

########################################################################################################################################


	1. Introduction

	2. Changelog

	3. Installation

	4. Uninstallation

	5. Troubleshooting

	6. Mod Author Guide

	7. Credits & Acknowledgements
	
	8. Contact
	
	9. Permissions


########################################################################################################################################



========================================================================================================================================
 1. Introduction
========================================================================================================================================

SkyUI is a mod that aims to improve Skyrim's User Interface by making it easier to use with mouse and keyboard,
less wasteful of available screen space, and nicer to look at.

We do all that while keeping true to the style of the original UI, so new and old components are integrated seamlessly.
It is not our goal to re-create the complete interface from scratch.
Instead we try to identify and change areas that need improvement, while leaving the things that are already good alone.

Further general objectives and design concepts are:

* Finding a good balance between 'dumbed down' and 'information overkill'.

* Easy installation and setup.

* Blending features in as well as possible - players shouldn't feel reminded that they're using a mod.

* Support for user customization.


Since improving the whole UI is a big undertaking, we only release single menus at a time as progress is made.
The first menu we addressed was the Inventory. In version 2.0, we included new Barter, Container and Magic menus.
Version 3.0 introduced an in-game configuration menu for mods. The most recent addition was the Favorites menu in version 4.0.

For a more detailed description, please see our mod description on Skyrim Nexus.


========================================================================================================================================
 2. Changelog
========================================================================================================================================

------------------------------------------------------------
4.1:

[General]
- Updated SKSE version requirement to 1.6.16.

[FavoritesMenu]
- Included ammo in Gear category.
- Transforming into a Vampire Lord no longer resets group data.
- Changing the load order index of a mod no longer removes its items from any groups.
- Fixed issues when equipping a two-handed weapon that's already equipped via Group Use.
- Fixed issue with 'Unequip Armor' flag, which would incorrectly unequip an armor piece if it's already worn.
- Fixed Group Use crashes with 2 identical weapons.
- Enabled group hotkey rebinding for gamepads.

------------------------------------------------------------
4.0:

[General]
- Updated SKSE version requirement to 1.6.15.

[ModConfigurationMenu]
- Enabled nested translations for option and value text (uses the same format as SetInfoText).
- Added OPTION_FLAG_HIDDEN to hide an option.
- Added OPTION_FLAG_WITH_UNMAP. When set for keymap options, it enables an unmap button that'll send keycode -1.
- Improved menu registration process to avoid missing menus on the first save load. For real this time.
- Enabled basic HTML formatting for option label text. Example: "<font color='#FF0000'>$Hello</font>".
- Fixed an issue with gamepad/keyboard navigation where the wrong entry was selected when scrolling.

[MapMenu]
- Fixed issue where search widget wasn't being completely disabled when hidden.

[ActiveEffectsWidget]
- With SKSE 1.6.15, inactive effects are now filtered out.
- Added a configurable minimum time left to hide long lasting effects like blessings until they are about to expire.

[FavoritesMenu]
- Initial release

------------------------------------------------------------
3.4:

[ModConfigurationMenu]
- Fixed issue that could prevent certain MCM mods from registering correctly (i.e. Wet and Cold).

------------------------------------------------------------
3.3:

[General]
- Reverted batch load size to default to avoid delays with lots of saves.
- Fixed map.swf filename in conflict warning message.
- Fixed "Disable positioning" option.

[ModConfigurationMenu]
- Reverted menu registration code back to 3.1 until I have more time to resolve all issues with the new method.

[HUDWidgetLoader]
- Fixed bug that kept health bar permanently visible (or hidden).

------------------------------------------------------------
3.2:

[General]
- Updated SKSE version requirement to 1.6.9.
- Inventory and magic menus now remember and restore last selected column and sorting state.
- Added emblem to indicate read books/scrolls.
- Fixed several Dragonborn icons.
- Improved visbility of equip icons.
- Fixed an issue in the NMM installer that could cause a crash when trying to force the installation.
- Fixed issue where closing a menu before any checks are able to complete would cause false error messages to appear.
- Optimized memory usage of config menu buffers.
- Increased config timeout delay from 1 to 3 seconds.
- Added error message to detect invalid Papyrus .ini settings.
- Updated quest_journal.swf to support legendary difficulty that has been added in Skyrim 1.9.

[ModConfigurationMenu]
- Added a repair console command that forces all menus to re-register: setStage SKI_ConfigManagerInstance 1
- Improved SetInfoText to support nested translation strings. See MCM API reference for details.
- Added an new method to organize options as states. Fully backward compatible. See state MCM state option guide for details.
- Fixed issue where it would take several reloads until all menus registered successfully when running a lot of mods.

[MapMenu]
- Initial release

[ActiveEffectsWidget]
- Initial release

[HUDWidgetLoader]
- Initial release

------------------------------------------------------------
3.1:

[General]
- Added MCM option to select the category icon theme. Includes all themes from version 2.2 (Celtic, Curved, Straight).
- Added MCM options to configure some gamepad mappings manually. This should resolve conflicts with custom controlmaps.
- Added MCM option to disable icon colors.
- Added NMM installer script that detects/reports the most common installation problems.
- Added runtime check for missing SKSE scripts.
- Updated SKSE version requirement to 1.6.6. Fixes the non-functional localization.
- Fixed leather strips type identifier.
- Fixed minor mistakes in the config.
- Fixed issues with PropertyDataExtender to allow custom config.txt overrides.
- Fixed MCM logo hat madness.
- Made some error messages clearer.

------------------------------------------------------------
3.0:

[General]
- Added more columns to item lists and a drop-down menu to show/hide them.
- Added a new icon theme by Psychosteve (support for the old themes had to be dropped because they are no longer maintained).
- Added type column to group items of the same category into sub-types.
- Added dynamic icon coloring.
- Added option to configure the minimum stack size that triggers the quantity select dialog.
- Added dynamic icon art to bottom bar so it matches the current control mapping.
- Replaced NMM installer with an in-game configuration menu.
- Replaced old error messages with regular message boxes and added more safety checks for outdated SkyUI components.
- Fixed various minor issues and improved performance.
- Consolidated package format to BSA+ESP.

[ContainerMenu]
- Added support for GiftMenu.
- Improved input scheme for mouse and keyboard (no more R to Take All and Store, mouse click for Give/Take etc.).

[BarterMenu]
- Added carry weight display to bottom bar.

[MagicMenu]
- Fixed locked words being shown as unlocked if one word is known.
- Fixed an issue that could cause crashes for spells with missing effect data.

[ModConfigurationMenu]
- Initial release. Mod authors, see https://github.com/schlangster/skyui/wiki for documentation.

------------------------------------------------------------
2.1:

[General]
- Added compatiblity for the Skyrim version 1.4.21.
- Added multi-language support for Czech, English, French, German, Italian, Polish, Russian and Spanish.
- Added several options to the installer (font size, separate V/W column, special resolution).
- Added a BAIN Conversion File (BCF) including an installation wizard for better Wyre Bash support. Thanks to Lojack!
- Fixed a bug where selling/dropping/storing stacked items could cause the selected entry to jump to the bottom of the list.
- The last selected category, entry and scroll position are now saved and restored when re-opening the inventory/magic menu.
- Sorting parameters are now preserved if possible when switching through categories.
- Improved the SKSE version check so it will also display a warning when using outdated versions.
- Most features of our SKSE plugins have been reworked and are now integrated in SKSE itself.
- Various other tweaks and minor fixes.

[InventoryMenu]
- Fixed a rare bug that could cause crashes after recharging an item.

[MagicMenu]
- Fixed skill level sorting.
- Added 'Favorite' as a sort option.

[ContainerMenu]
- Fixed stealing text for Russian game version.
- Fixed overlapping of to steal/to place text for large itemcards.

------------------------------------------------------------
2.0:

[InventoryMenu]
- Fixed enchantment mini-icon so it's no longer displayed for enchanted weapons only.
- Fixed missing sort options for name field in the favorites category.
- Fixed backspace cancelling the search.
- Fixed searching for non-English languages (i.e. Russian).
- Improved sorting system. Null/invalid values are now always at the bottom.
- Empty categories are greyed out and no longer selectable by mouse or during keyboard/controller navigation.
- Included a bundled version of Gibbed's Container Categorization SKSE plugin. Thanks for giving us permission to use it!

[MagicMenu]
- Initial release

[BarterMenu]
- Initial release

[ContainerMenu]
- Initial release

------------------------------------------------------------
1.1:

[InventoryMenu]
- Updated Gibbed's interface extensions plugin to support the latest Skyrim version 1.3.10.0.
- Improved support for XBOX360 controller: LB/RB can now be used to change the active column; Left Stick changes the sorting order.
- Made SKSE warning message less intrusive; it's only shown once after each game restart now.
- Fixed LT/RT equip bug with XBOX360 controller.
- Fixed bug where 3D model/item card would not update in certain situations (dropping an item, charging an item, etc.).
- Removed custom fontconfig.txt to avoid font problems with other font mods, or with the Russian version of the game.
- Optimized column layout so it only shows states and information that make sense for the active category.
- Updated T3T's straight icon theme to include new inventory icons.
- Updated GreatClone's icon theme to the latest version. Now includes inventory icons as well, and category icons have been improved.
- Fixed wrong inventory icon for spell tomes.
- Various minor tweaks and fixes.

------------------------------------------------------------
1.0:

[InventoryMenu]
- Initial release


========================================================================================================================================
 3. Installation
========================================================================================================================================

------------------------------------------------------------
IMPORTANT:
If you were using SkyUI 2.2 or older,
you MUST remove it before installing the new version.
See section 4 for instructions.
------------------------------------------------------------

There are several ways to install SkyUI:
- Subscribe to SkyUI on Steam Workshop.
- Let the Nexus Mod Manager (NMM) download and install the archive for you.
- Download the archive manually and install it with NMM.
- Download and install the archive manually.

Pick the method you prefer.

------------------------------------------------------------
 a) Subscribe on Steam Workshop
------------------------------------------------------------

1. Go to http://steamcommunity.com/sharedfiles/filedetails/?id=8122 and click subscribe.

2. The next time you start the Skyrim Launcher, SkyUI will be downloaded and installed automatically.

OR

------------------------------------------------------------
 b) Automated Download with NMM
------------------------------------------------------------

1.	Click the 'Download with manager' button on top of the file.

2.	SkyUI will appear in in NMM's Mods list once it's downloaded. Double-click the SkyUI entry to activate it.

OR

------------------------------------------------------------
 c) Manual Download with NMM
------------------------------------------------------------

1.	Start NMM and click on 'Mods'.

2.	In the left icon bar, click on 'Add Mod From File' and select the downloaded archive file.

3.	SkyUI will now appear in the list. Double-click the entry to activate it.

OR

------------------------------------------------------------
 d) Manual Installation
------------------------------------------------------------

1.	Locate the 'Data/' folder in your Skyrim installation directory.
	Typically it's found at 'Program Files/Steam/steamapps/common/skyrim/Data/'.

2.	Extract the contents of the downloaded archive file to the 'Data/' folder.

3.	In the Skyrim Launcher, select 'Data Files' and enable 'SkyUI.esp'.


========================================================================================================================================
 4. Uninstallation
========================================================================================================================================

The uninstallation method depends on which SkyUI version you were using before and how you installed it.
Any SkyUI version older than 3.0 (this includes alpha builds) has to be removed before upgrading.

For details, see the following instructions that match your current SkyUI version/installation method.

------------------------------------------------------------
 NMM installation / Any SkyUI version
------------------------------------------------------------

In NMM's mod list, search for the SkyUI entry and deactivate the mod.

------------------------------------------------------------
 Steam workshop / Any SkyUI version
------------------------------------------------------------

Unsubscribe from the mod and deactivate it in Skyrim Launcher (if you haven't already).
There, you can also completely remove it by highlighting it and pressing 'Delete Selected'.

------------------------------------------------------------
 Manual installation / SkyUI 2.2 or older
------------------------------------------------------------

If you installed the SkyUI files manually, then you also have to remove them manually.
So view the contents of the SkyUI archive you are using, locate each file at its install location and remove it.

To revert your interface folder to its original state, you can delete the 'Interface/' directory from Skyrim's 'Data/' folder
and then use Steam to restore any original files you removed in the process by following these steps:
(Backup your interface folder before deleting it in case anything goes wrong)
	1. Locate Skyrim in Steam's game library.
	2. Open the properties dialog and select the 'Local files' tab.
	3. Verify integrity of game cache.
Be aware, that this will break any other mods that installed files to the interface folder. You will have to re-install them.

------------------------------------------------------------
 Manual installation / SkyUI 3.0 and newer
------------------------------------------------------------

1.	Locate the 'Data/' folder in your Skyrim installation directory.
	It's typically found at 'Program Files/Steam/steamapps/common/skyrim/Data/'.

2.	Delete 'SkyUI.esp' and 'SkyUI.bsa' from the data folder.

------------------------------------------------------------
 SkyUI 3.0 alpha versions
------------------------------------------------------------

Before removing any files, it is recommended to make a 'clean' save game with SkyUI deactivated.

1.	Start the Skyrim Launcher and select 'Data Files'.

2.	Search 'SkyUI.esp' and uncheck it.
	(If you don't have this file, there's no need for a clean save anyway and you can skip it)

3.	In-game, load your latest save, then save the game again.

4.	This new save game is now cleaned of SkyUI data.

You can now proceed to uninstall the files.

The 3.0 alpha packages contained loose script files required by mod authors to create configuration menus.
Make absolutely sure to remove these files, because they will override any newer scripts in SkyUI.bsa.

1.	Locate the 'Scripts/' folder in your Skyrim data directory.
	It's typically found at 'Program Files/Steam/steamapps/common/skyrim/Data/Scripts/'.

2.	Delete any script files (.pex) that start with SKI_, for example
		SKI_ConfigBase.pex, SKI_Main.pex, etc.

3.	Delete 'SkyUI.esp' and 'SkyUI.bsa' from the data folder if present.


========================================================================================================================================
 5. Troubleshooting
========================================================================================================================================

------------------------------------------------------------
Problem: There's an error message, reporting "SKYUI ERROR CODE X"...

See https://github.com/schlangster/skyui/wiki/SkyUI-Errors for potential problems and their solutions.


------------------------------------------------------------
Problem: There are dollar signs ($) in front of all words in the main menu (and in lots of other places, too)!

This happens if you accidently removed 'Data/Interface/Translate_<language>.txt'.
To restore it, use Steam to verify the integrity of Skyrim's game-cache
(Steam -> Library -> Properties of Skyrim -> Local files tab -> Verify integrity of game cache).


------------------------------------------------------------
Problem: There are mods missing from my MCM list. Is there anything I can do about it?

Before starting to reinstall mods, you can try to run a repair script we added in SkyUI 3.2.
To do this, open the console and enter "setStage SKI_ConfigManagerInstance 1" (without the quotes).


If your problem wasn't listed here, ask for help in the Nexus comments.


========================================================================================================================================
 6. Mod Author Guide
========================================================================================================================================

Since version 3.0, SkyUI provides a Mod Configuration Menu framework that can be utilized by other mods.
If you're a mod author interested in using it, have a look at the documentation:

	https://github.com/schlangster/skyui/wiki


========================================================================================================================================
 7. Credits & Acknowledgements
========================================================================================================================================

Besides the SkyUI team itself, there are other people as well who helped significantly to make this mod a reality.
In the following they are listed by name, including a list of their contributions.

Kratos:
	Was a core member of the SkyUI team until version 2.1 and as such contributed significantly to the project in various areas.

ianpatt:
	Added lots of new functions to the Skyrim Script Extender, that greatly helped us during development and enabled new features that
	would otherwise be impossible.

behippo:
	Helped improving/advancing the interface extensions plugin by decoding the game classes and giving us access to them through SKSE.

Gibbed:
	Created the 'gibbed interface extensions' SKSE plugin, which makes more game data available for display in the inventory.
	Also allowed us to bundle his container categorization plugin. As of version 2.1, both these plugins have been included in SKSE
	itself.

Indie:
	Created our trailer and helps with QA and user support.

GreatClone:
	Created an amazing set of alternative category icons.

Gopher:
	Did most of the work on the NMM installer, created an installation tutorial video and promoted SkyUI on his YouTube channel.

Lojack:
	Created a BCF (including an installation wizard) for SkyUI to improve the installation experience for Wyre Bash users.
	Also added an auto-conversion feature to Wyre Bash itself so this BCF is automatically applied.

Ismelda:
	Provided configs for very high resolutions used with multi-monitor setups.

Wakeupbrandon:
	His mock-up inspired the overall layout of the new inventory.

MisterPete:
	Implemented new column types for improved sorting.

Psychosteve:
	Created our new primary icon theme for version 3.0.
	He also created the Active Effect icons that have been added in version 3.2.

Pelinor:
	The creator of MCM for Fallout: New Vegas. Allowed us to use his original logo.


SkyUI is utilizing TweenLite, a high-performance tweening library (http://www.greensock.com/tweenlite/).
	Thanks to Jack Doyle and his team for creating it and allowing us to use it under their No Charge license.

Thanks to all the testers, who helped a great deal with improving the overall quality of this mod:
	ToJKa, HellKnight, xporc, MadCat221, Ismelda, Gribbles, freesta, Cartrodus, TheCastle,
	NewRaven, T-qb, V4N0, Noritep, claudekennilol, dj2005, llfbandit, webrunner, 352, Erelde, tejon, Sagittarius22
	(in random order)

Thanks to all translators who helped localizing SkyUI to different languages, among them being:
	Sagittarius22, LLFBandit, xporc (French)
	xlwarrior, aloot (Spanish)
	Starfis (Czech)
	Rhaegal, aloot (Italian)
	patryk110 (Polish)
	vova2112 (Russian)

Last but not least, thanks to the whole SKSE team, because without their Script Extender creating this mod wouldn't have been possible.


========================================================================================================================================
 8. Contact
========================================================================================================================================

For direct contact, send a PM to schlangster at

	http://www.skyrimnexus.com/
		or
	http://forums.bethsoft.com/

If you need help, please leave a comment on our Nexus page instead of contacting me directly.

	
========================================================================================================================================
 9. Permissions
========================================================================================================================================	

Some assets in SkyUI belong to other authors.
You will need to seek permission from these authors before you can use their assets.

You are not allowed to upload this file to other sites unless given permission by me to do so.
You are not allowed to convert this file to work on other games.
 
You must get permission from me before you are allowed to modify my files for bug fixes and improvements.
You must get permission from me before you are allowed to use any of the assets in this file.


================================================
FILE: dist/Data/Scripts/Headers/SKI_ConfigBase.psc
================================================
scriptname SKI_ConfigBase extends SKI_QuestBase

;##################################################################################################
; API Version:		3
;##################################################################################################
;
; Base script for custom config menus.
;
; This file contains the public interface of SKI_ConfigBase so you're able to extend it.
; For documentation, see https://github.com/schlangster/skyui/wiki/MCM-API-Reference.
;
; DO NOT MODIFY THIS SCRIPT!
; DO NOT RECOMPILE THIS SCRIPT!
;
;##################################################################################################

; CONSTANTS ---------------------------------------------------------------------------------------

int property		OPTION_FLAG_NONE		= 0x00 autoReadonly
int property		OPTION_FLAG_DISABLED	= 0x01 autoReadonly
int property		OPTION_FLAG_HIDDEN		= 0x02 autoReadonly			; Version 3
int property		OPTION_FLAG_WITH_UNMAP	= 0x04 autoReadonly			; Version 3

int property		LEFT_TO_RIGHT			= 1	autoReadonly
int property		TOP_TO_BOTTOM			= 2 autoReadonly


; PROPERTIES ------------------------------------------------------------------------- Version 1 --

string property		ModName auto

string[] property	Pages auto

string property		CurrentPage
	string function get()
		Guard()
		return  ""
	endFunction
endProperty


; EVENTS ----------------------------------------------------------------------------- Version 1 --

event OnConfigInit()
	{Called when this config menu is initialized}
	Guard()
endEvent

event OnConfigRegister()
	{Called when this config menu registered at the control panel}
	Guard()
endEvent

event OnConfigOpen()
	{Called when this config menu is opened}
	Guard()
endEvent

event OnConfigClose()
	{Called when this config menu is closed}
	Guard()
endEvent

event OnVersionUpdate(int a_version)
	{Called when a version update of this script has been detected}
	Guard()
endEvent

event OnPageReset(string a_page)
	{Called when a new page is selected, including the initial empty page}
	Guard()
endEvent

event OnOptionHighlight(int a_option)
	{Called when highlighting an option}
	Guard()
endEvent

event OnOptionSelect(int a_option)
	{Called when a non-interactive option has been selected}
	Guard()
endEvent

event OnOptionDefault(int a_option)
	{Called when resetting an option to its default value}
	Guard()
endEvent

event OnOptionSliderOpen(int a_option)
	{Called when a slider option has been selected}
	Guard()
endEvent

event OnOptionSliderAccept(int a_option, float a_value)
	{Called when a new slider value has been accepted}
	Guard()
endEvent

event OnOptionMenuOpen(int a_option)
	{Called when a menu option has been selected}
	Guard()
endEvent

event OnOptionMenuAccept(int a_option, int a_index)
	{Called when a menu entry has been accepted}
	Guard()
endEvent

event OnOptionColorOpen(int a_option)
	{Called when a color option has been selected}
	Guard()
endEvent

event OnOptionColorAccept(int a_option, int a_color)
	{Called when a new color has been accepted}
	Guard()
endEvent

event OnOptionKeyMapChange(int a_option, int a_keyCode, string a_conflictControl, string a_conflictName)
	{Called when a key has been remapped}
	Guard()
endEvent


; EVENTS ----------------------------------------------------------------------------- Version 2 --

event OnHighlightST()
	{Called when highlighting a state option}
	Guard()
endEvent

event OnSelectST()
	{Called when a non-interactive state option has been selected}
	Guard()
endEvent

event OnDefaultST()
	{Called when resetting a state option to its default value}
	Guard()
endEvent

event OnSliderOpenST()
	{Called when a slider state option has been selected}
	Guard()
endEvent

event OnSliderAcceptST(float a_value)
	{Called when a new slider state value has been accepted}
	Guard()
endEvent

event OnMenuOpenST()
	{Called when a menu state option has been selected}
	Guard()
endEvent

event OnMenuAcceptST(int a_index)
	{Called when a menu entry has been accepted for this state option}
	Guard()
endEvent

event OnColorOpenST()
	{Called when a color state option has been selected}
	Guard()
endEvent

event OnColorAcceptST(int a_color)
	{Called when a new color has been accepted for this state option}
	Guard()
endEvent

event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
	{Called when a key has been remapped for this state option}
	Guard()
endEvent


; FUNCTIONS -------------------------------------------------------------------------- Version 1 --

int function GetVersion()
	{Returns version of this script. Override if necessary}
	Guard()
endFunction

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. Override if necessary}
	Guard()
endFunction

function ForcePageReset()
	{Forces a full reset of the current page}
	Guard()
endFunction

function SetTitleText(string a_text)
	{Sets the title text of the control panel}
	Guard()
endFunction

function SetInfoText(string a_text)
	{Sets the text for the info text field below the option panel}
	Guard()
endFunction

function SetCursorPosition(int a_position)
	{Sets the position of the cursor used for the option setters}
	Guard()
endFunction

function SetCursorFillMode(int a_fillMode)
	{Sets the fill direction of the cursor used for the option setters}
	Guard()
endFunction

int function AddEmptyOption()
	{Adds an empty option, which can be used for padding instead of manually re-positioning the cursor}
	Guard()
endFunction

int function AddHeaderOption(string a_text, int a_flags = 0)
	{Adds a header option to group several options together}
	Guard()
endFunction

int function AddTextOption(string a_text, string a_value, int a_flags = 0)
	{Adds a generic text/value option}
	Guard()
endFunction

int function AddToggleOption(string a_text, bool a_checked, int a_flags = 0)
	{Adds a check box option that can be toggled on and off}
	Guard()
endfunction

int function AddSliderOption(string a_text, float a_value, string a_formatString = "{0}", int a_flags = 0)
	{Adds an option that opens a slider dialog when selected}
	Guard()
endFunction

int function AddMenuOption(string a_text, string a_value, int a_flags = 0)
	{Adds an option that opens a menu dialog when selected}
	Guard()
endFunction

int function AddColorOption(string a_text, int a_color, int a_flags = 0)
	{Adds an option that opens a color swatch dialog when selected}
	Guard()
endFunction

int function AddKeyMapOption(string a_text, int a_keyCode, int a_flags = 0)
	{Adds a key mapping option}
	Guard()
endFunction

function LoadCustomContent(string a_source, float a_x = 0.0, float a_y = 0.0)
	{Loads an external file into the option panel}
	Guard()
endFunction

function UnloadCustomContent()
	{Clears any custom content and re-enables the original option list}
	Guard()
endFunction

function SetOptionFlags(int a_option, int a_flags, bool a_noUpdate = false)
	{Sets the option flags}
	Guard()
endFunction

function SetTextOptionValue(int a_option, string a_value, bool a_noUpdate = false)
	{Sets the value(s) of an existing option}
	Guard()
endFunction

function SetToggleOptionValue(int a_option, bool a_checked, bool a_noUpdate = false)
	{Sets the value(s) of an existing option}
	Guard()
endfunction

function SetSliderOptionValue(int a_option, float a_value, string a_formatString = "{0}", bool a_noUpdate = false)
	{Sets the value(s) of an existing option}
	Guard()
endFunction

function SetMenuOptionValue(int a_option, string a_value, bool a_noUpdate = false)
	{Sets the value(s) of an existing option}
	Guard()
endFunction

function SetColorOptionValue(int a_option, int a_color, bool a_noUpdate = false)
	{Sets the value(s) of an existing option}
	Guard()
endFunction

function SetKeyMapOptionValue(int a_option, int a_keyCode, bool a_noUpdate = false)
	{Sets the value(s) of an existing option}
	Guard()
endFunction

function SetSliderDialogStartValue(float a_value)
	{Sets slider dialog parameter(s)}
	Guard()
endFunction

function SetSliderDialogDefaultValue(float a_value)
	{Sets slider dialog parameter(s)}
	Guard()
endFunction

function SetSliderDialogRange(float a_minValue, float a_maxValue)
	{Sets slider dialog parameter(s)}
	Guard()
endFunction

function SetSliderDialogInterval(float a_value)
	{Sets slider dialog parameter(s)}
	Guard()
endFunction

function SetMenuDialogStartIndex(int a_value)
	{Sets menu dialog parameter(s)}
	Guard()
endFunction

function SetMenuDialogDefaultIndex(int a_value)
	{Sets menu dialog parameter(s)}
	Guard()
endFunction

function SetMenuDialogOptions(string[] a_options)
	{Sets menu dialog parameter(s)}
	Guard()
endFunction

function SetColorDialogStartColor(int a_color)
	{Sets menu color parameter(s)}
	Guard()
endFunction

function SetColorDialogDefaultColor(int a_color)
	{Sets menu color parameter(s)}
	Guard()
endFunction

bool function ShowMessage(string a_message, bool a_withCancel = true, string a_acceptLabel = "$Accept", string a_cancelLabel = "$Cancel")
	{Shows a message dialog and waits until the user has closed it}
	Guard()
endFunction


; FUNCTIONS -------------------------------------------------------------------------- Version 2 --

function AddTextOptionST(string a_stateName, string a_text, string a_value, int a_flags = 0)
	{Adds a generic text/value state option}
	Guard()
endFunction

function AddToggleOptionST(string a_stateName, string a_text, bool a_checked, int a_flags = 0)
	{Adds a check box state option that can be toggled on and off}
	Guard()
endfunction

function AddSliderOptionST(string a_stateName, string a_text, float a_value, string a_formatString = "{0}", int a_flags = 0)
	{Adds a state option that opens a slider dialog when selected}
	Guard()
endFunction

function AddMenuOptionST(string a_stateName, string a_text, string a_value, int a_flags = 0)
	{Adds a state option that opens a menu dialog when selected}
	Guard()
endFunction

function AddColorOptionST(string a_stateName, string a_text, int a_color, int a_flags = 0)
	{Adds a state option that opens a color swatch dialog when selected}
	Guard()
endFunction

function AddKeyMapOptionST(string a_stateName, string a_text, int a_keyCode, int a_flags = 0)
	{Adds a key mapping state option}
	Guard()
endFunction

function SetOptionFlagsST(int a_flags, bool a_noUpdate = false, string a_stateName = "")
	{Sets the state option flags}
	Guard()
endFunction

function SetTextOptionValueST(string a_value, bool a_noUpdate = false, string a_stateName = "")
	{Sets the value(s) of an existing state option}
	Guard()
endFunction

function SetToggleOptionValueST(bool a_checked, bool a_noUpdate = false, string a_stateName = "")
	{Sets the value(s) of an existing state option}
	Guard()
endFunction

function SetSliderOptionValueST(float a_value, string a_formatString = "{0}", bool a_noUpdate = false, string a_stateName = "")
	{Sets the value(s) of an existing state option}
	Guard()
endFunction

function SetMenuOptionValueST(string a_value, bool a_noUpdate = false, string a_stateName = "")
	{Sets the value(s) of an existing state option}
	Guard()
endFunction

function SetColorOptionValueST(int a_color, bool a_noUpdate = false, string a_stateName = "")
	{Sets the value(s) of an existing state option}
	Guard()
endFunction

function SetKeyMapOptionValueST(int a_keyCode, bool a_noUpdate = false, string a_stateName = "")
	{Sets the value(s) of an existing state option}
	Guard()
endFunction


; -------------------------------------------------------------------------------------------------

function Guard()
	Debug.MessageBox("SKI_ConfigBase: Don't recompile this script!")
endFunction



================================================
FILE: dist/Data/Scripts/Headers/SKI_QuestBase.psc
================================================
scriptname SKI_QuestBase extends Quest hidden

;##################################################################################################
; API Version:		1
;##################################################################################################
;
; Base script for SkyUI quest scripts.
;
; This file contains the public interface of SKI_QuestBase so you're able to extend it.
;
; DO NOT MODIFY THIS SCRIPT!
; DO NOT RECOMPILE THIS SCRIPT!
;
;##################################################################################################

event OnInit()
endEvent

; -------------------------------------------------------------------------------------------------
; 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()
	Guard()
endFunction

int function GetVersion()
	Guard()
endFunction

event OnVersionUpdate(int a_version)
	Guard()
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

function Guard()
	Debug.MessageBox("SKI_QuestBase: Don't recompile this script!")
endFunction

================================================
FILE: dist/Data/Scripts/Source/SKI_ActiveEffectsWidget.psc
================================================
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

================================================
FILE: dist/Data/Scripts/Source/SKI_ConfigBase.psc
================================================
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		STATE_INPUT		= 5 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_TYPE_INPUT	= 0x08 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
string				_inputStartText

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

function OnOptionInputOpen(Int a_option)
{Called when a text input option has been selected}
endFunction

function OnInputOpenST()
{Called when a text input state option has been selected}
endFunction

function OnOptionInputAccept(Int a_option, String a_input)
{Called when a new text input has been accepted}
endFunction

function OnInputAcceptST(String a_input)
{Called when a new text input has been accepted for this state option}
endFunction

function SetInputOptionValue(Int a_option, String a_value, Bool a_noUpdate)
	Int index = a_option % 256
	Int type = _optionFlagsBuf[index] % 256
	if type != self.OPTION_TYPE_INPUT
		Int pageIdx = a_option / 256 - 1
		if pageIdx != -1
			self.Error("Option type mismatch. Expected input option, page \"" + Pages[pageIdx] + "\", index " + index as String)
		else
			self.Error("Option type mismatch. Expected input option, page \"\", index " + index as String)
		endIf
		return
	endIf
	self.SetOptionStrValue(index, a_value, a_noUpdate)
endFunction

function SetInputOptionValueST(String a_value, Bool a_noUpdate, String a_stateName)
	Int index = self.GetStateOptionIndex(a_stateName)
	if index < 0
		self.Error("Cannot use SetInputOptionValueST outside a valid option state")
		return
	endIf
	self.SetInputOptionValue(index, a_value, a_noUpdate)
endFunction

function RequestInputDialogData(Int a_index)
	_activeOption = a_index + _currentPageNum * 256
	_inputStartText = ""
	_state = self.STATE_INPUT
	String optionState = _stateOptionMap[a_index]
	if optionState != ""
		String oldState = self.GetState()
		self.GotoState(optionState)
		self.OnInputOpenST()
		self.GotoState(oldState)
	else
		self.OnOptionInputOpen(_activeOption)
	endIf
	_state = self.STATE_DEFAULT
	ui.InvokeString(self.JOURNAL_MENU, self.MENU_ROOT + ".setInputDialogParams", _inputStartText)
endFunction

Int function AddInputOption(String a_text, String a_value, Int a_flags)
	return self.AddOption(self.OPTION_TYPE_INPUT, a_text, a_value, 0 as Float, a_flags)
endFunction

function AddInputOptionST(String a_stateName, String a_text, String a_value, Int a_flags)
	self.AddOptionST(a_stateName, self.OPTION_TYPE_INPUT, a_text, a_value, 0 as Float, a_flags)
endFunction

function SetInputDialogStartText(String a_text)
	if _state != self.STATE_INPUT
		self.Error("Cannot set input dialog params while outside OnOptionInputOpen()")
		return
	endIf
	_inputStartText = a_text
endFunction

function SetInputText(String a_text)
	String optionState = _stateOptionMap[_activeOption % 256]
	if optionState != ""
		String oldState = self.GetState()
		self.GotoState(optionState)
		self.OnInputAcceptST(a_text)
		self.GotoState(oldState)
	else
		self.OnOptionInputAccept(_activeOption, a_text)
	endIf
	_activeOption = -1
endFunction


================================================
FILE: dist/Data/Scripts/Source/SKI_ConfigManager.psc
================================================
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")
	self.RegisterForModEvent("SKICP_inputSelected", "OnInputSelect")
	self.RegisterForModEvent("SKICP_inputAccepted", "OnInputAccept")
	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

function OnInputSelect(String a_eventName, String a_strArg, Float a_numArg, Form a_sender)
	Int optionIndex = a_numArg as Int
	_activeConfig.RequestInputDialogData(optionIndex)
endFunction

function OnInputAccept(String a_eventName, String a_strArg, Float a_numArg, Form a_sender)
	_activeConfig.SetInputText(a_strArg)
	ui.InvokeBool(self.JOURNAL_MENU, self.MENU_ROOT + ".unlock", true)
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

================================================
FILE: dist/Data/Scripts/Source/SKI_ConfigMenu.psc
================================================
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 9
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

	if a_version >= 9 && CurrentVersion < 9
		debug.Trace(self as String + ": Updating to script version 9")
		_categoryIconThemeShortNames = new String[4]
		_categoryIconThemeShortNames[0] = "SKYUI V5"
		_categoryIconThemeShortNames[1] = "CELTIC"
		_categoryIconThemeShortNames[2] = "CURVED"
		_categoryIconThemeShortNames[3] = "STRAIGHT"
		_categoryIconThemeLongNames = new String[4]
		_categoryIconThemeLongNames[0] = "SkyUI V5, 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"
	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 OnKeyMapChangeS
Download .txt
gitextract_9k0d2l5e/

├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── build/
│   ├── .gitignore
│   ├── exported/
│   │   ├── skyui/
│   │   │   └── .gitkeep
│   │   └── widgets/
│   │       └── skyui/
│   │           └── .gitkeep
│   └── skyui/
│       └── config.txt
├── dist/
│   ├── .gitignore
│   ├── Data/
│   │   ├── Interface/
│   │   │   ├── Translations/
│   │   │   │   ├── SkyUI_czech.txt
│   │   │   │   ├── SkyUI_english.txt
│   │   │   │   ├── SkyUI_french.txt
│   │   │   │   ├── SkyUI_german.txt
│   │   │   │   ├── SkyUI_italian.txt
│   │   │   │   ├── SkyUI_japanese.txt
│   │   │   │   ├── SkyUI_polish.txt
│   │   │   │   ├── SkyUI_russian.txt
│   │   │   │   └── SkyUI_spanish.txt
│   │   │   └── skyui/
│   │   │       ├── config.txt
│   │   │       └── res/
│   │   │           └── mcm_logo.dds
│   │   ├── Readme - SkyUI.txt
│   │   ├── Scripts/
│   │   │   ├── Headers/
│   │   │   │   ├── SKI_ConfigBase.psc
│   │   │   │   └── SKI_QuestBase.psc
│   │   │   └── Source/
│   │   │       ├── SKI_ActiveEffectsWidget.psc
│   │   │       ├── SKI_ConfigBase.psc
│   │   │       ├── SKI_ConfigManager.psc
│   │   │       ├── SKI_ConfigMenu.psc
│   │   │       ├── SKI_FavoritesManager.psc
│   │   │       ├── SKI_Main.psc
│   │   │       ├── SKI_PlayerInventoryHook.psc
│   │   │       ├── SKI_PlayerLoadGameAlias.psc
│   │   │       ├── SKI_QF_ConfigManagerInstance.psc
│   │   │       ├── SKI_QuestBase.psc
│   │   │       ├── SKI_SettingsManager.psc
│   │   │       ├── SKI_WidgetBase.psc
│   │   │       └── SKI_WidgetManager.psc
│   │   ├── SkyUI_SE.esp
│   │   └── fomod/
│   │       ├── info.xml
│   │       └── script.cs
│   ├── Examples/
│   │   └── MCM/
│   │       ├── ConfigMenuTemplate.psc
│   │       ├── ExampleConfigMenu.esp
│   │       └── ExampleConfigMenu.psc
│   ├── bsascript.txt
│   ├── filegroup_all.txt
│   ├── filegroup_interface.txt
│   ├── filegroup_misc.txt
│   ├── filegroup_scripts.txt
│   ├── make_all.pl
│   ├── make_archive.pl
│   └── make_scripts.pl
├── misc/
│   ├── ArrowCount/
│   │   ├── Interface/
│   │   │   └── exported/
│   │   │       └── widgets/
│   │   │           └── skyui/
│   │   │               └── arrowcount.swf
│   │   └── Scripts/
│   │       └── Source/
│   │           └── PN_ArrowCountWidget.psc
│   ├── Configs/
│   │   ├── 5760x1080, by Ismelda/
│   │   │   └── skyui.cfg
│   │   ├── 5760x2160, by Ismelda/
│   │   │   └── skyui.cfg
│   │   └── ValueWeight Column/
│   │       └── skyui.cfg
│   ├── Flash Util/
│   │   ├── SkyUI - make_all.jsfl
│   │   ├── SkyUI - make_archive (fast).jsfl
│   │   ├── SkyUI - make_archive.jsfl
│   │   ├── build-all.jsfl
│   │   └── skyui_runscript.bat
│   ├── Icon Themes/
│   │   ├── Celtic, by GreatClone/
│   │   │   ├── skyui_icons_cat.swf
│   │   │   └── skyui_icons_inv.swf
│   │   ├── Curved, by T3T/
│   │   │   ├── skyui_icons_cat.swf
│   │   │   └── skyui_icons_inv.swf
│   │   └── Straight, by T3T/
│   │       ├── skyui_icons_cat.swf
│   │       └── skyui_icons_inv.swf
│   ├── Original Translates/
│   │   ├── Translate_ENGLISH.txt
│   │   ├── Translate_FRENCH.txt
│   │   ├── Translate_GERMAN.txt
│   │   ├── Translate_ITALIAN.txt
│   │   ├── Translate_Japanese.txt
│   │   ├── Translate_RUSSIAN.txt
│   │   ├── Translate_SPANISH.txt
│   │   ├── Translate_czech.txt
│   │   └── translate_polish.txt
│   ├── PrimaryNeeds/
│   │   ├── Interface/
│   │   │   └── exported/
│   │   │       └── widgets/
│   │   │           └── pnx/
│   │   │               └── statusicons.swf
│   │   ├── PrimaryNeeds.esp
│   │   └── Scripts/
│   │       ├── PN_FoodEffect.pex
│   │       ├── PN_IconWidget.pex
│   │       ├── PN_NeedsManager.pex
│   │       └── Source/
│   │           ├── PN_FoodEffect.psc
│   │           ├── PN_IconWidget.psc
│   │           └── PN_NeedsManager.psc
│   ├── Translations/
│   │   ├── SkyUI_Translations.txt
│   │   └── make_translations.pl
│   ├── cp-built-files
│   ├── decompile-pex
│   ├── pack-release
│   ├── rename-png
│   └── reorder-psc
├── sksevr_plugin/
│   ├── .editorconfig
│   ├── .gitignore
│   ├── README.md
│   ├── build.ini
│   ├── build.py
│   ├── lib/
│   │   └── openvr_api.lib
│   ├── lua/
│   │   ├── MainEntry.lua
│   │   ├── defaults-general.lua
│   │   ├── defaults-knuckles.lua
│   │   ├── defaults-oculus.lua
│   │   ├── defaults-vive.lua
│   │   ├── defaults-wmr.lua
│   │   └── inspect.lua
│   ├── lua-tests/
│   │   └── core_spec.lua
│   ├── luajit.vcxproj
│   ├── plugin/
│   │   ├── ControllerStateHook.cpp
│   │   ├── ControllerStateHook.h
│   │   ├── FormDB.cpp
│   │   ├── FormDB.h
│   │   ├── Globals.h
│   │   ├── Keyboard.cpp
│   │   ├── Keyboard.h
│   │   ├── PapyrusUIFix.cpp
│   │   ├── PapyrusUIFix.h
│   │   ├── ScaleformExtendedDataFix.cpp
│   │   ├── ScaleformExtendedDataFix.h
│   │   ├── Settings.cpp
│   │   ├── Settings.h
│   │   ├── VRHookAPI.h
│   │   ├── exports.def
│   │   ├── guicon.cpp
│   │   ├── guicon.h
│   │   ├── lua_glue.cpp
│   │   ├── lua_glue.h
│   │   ├── main.cpp
│   │   ├── plugin.vcxproj
│   │   ├── plugin.vcxproj.filters
│   │   └── scripts/
│   │       └── ExportPlugin.psc
│   ├── plugin.sln
│   └── tools/
│       └── run-lua-tests
└── src/
    ├── .gitignore
    ├── CLIK/
    │   ├── Mouse.as
    │   ├── Selection.as
    │   ├── Stage.as
    │   ├── System/
    │   │   └── capabilities.as
    │   └── gfx/
    │       ├── controls/
    │       │   ├── Button.as
    │       │   ├── ButtonBar.as
    │       │   ├── ButtonGroup.as
    │       │   ├── CoreList.as
    │       │   ├── OptionStepper.as
    │       │   ├── RadioButton.as
    │       │   ├── ScrollBar.as
    │       │   ├── ScrollIndicator.as
    │       │   ├── ScrollingList.as
    │       │   ├── Slider.as
    │       │   ├── TextArea.as
    │       │   └── TextInput.as
    │       ├── core/
    │       │   └── UIComponent.as
    │       ├── data/
    │       │   └── DataProvider.as
    │       ├── events/
    │       │   └── EventDispatcher.as
    │       ├── io/
    │       │   └── GameDelegate.as
    │       ├── managers/
    │       │   ├── FocusHandler.as
    │       │   └── InputDelegate.as
    │       ├── ui/
    │       │   ├── InputDetails.as
    │       │   └── NavigationCode.as
    │       └── utils/
    │           ├── Constraints.as
    │           └── Locale.as
    ├── Common/
    │   ├── Components/
    │   │   ├── BlinkOnDemandMeter.as
    │   │   ├── BlinkOnEmptyMeter.as
    │   │   ├── CrossPlatformButtons.as
    │   │   ├── DeltaMeter.as
    │   │   ├── Meter.as
    │   │   └── UniformTimeMeter.as
    │   ├── MouseRotationInputCatcher.as
    │   ├── QuantitySlider.as
    │   ├── SaveLoadPanel.as
    │   ├── Shared/
    │   │   ├── BSScrollingList.as
    │   │   ├── ButtonChange.as
    │   │   ├── ButtonTextArtHolder.as
    │   │   ├── CenteredScrollingList.as
    │   │   ├── ExtractPlatformText.as
    │   │   ├── GlobalFunc.as
    │   │   ├── ListFilterer.as
    │   │   ├── Macros.as
    │   │   ├── PlatformChangeUser.as
    │   │   └── Platforms.as
    │   ├── mx/
    │   │   └── transitions/
    │   │       └── Tween.as
    │   ├── skse.as
    │   └── skyui/
    │       ├── VRInput.as
    │       ├── components/
    │       │   ├── BottomBarMappedButton.as
    │       │   ├── ButtonPanel.as
    │       │   ├── MappedButton.as
    │       │   ├── MaskedTextArea.as
    │       │   ├── Meter.as
    │       │   ├── SearchWidget.as
    │       │   ├── Slider.as
    │       │   ├── TabBar.as
    │       │   ├── colorswatch/
    │       │   │   ├── ColorSquare.as
    │       │   │   └── ColorSwatch.as
    │       │   ├── dialog/
    │       │   │   ├── BasicDialog.as
    │       │   │   └── ColumnSelectDialog.as
    │       │   └── list/
    │       │       ├── BSList.as
    │       │       ├── BasicEnumeration.as
    │       │       ├── BasicList.as
    │       │       ├── BasicListEntry.as
    │       │       ├── ButtonList.as
    │       │       ├── ButtonListEntry.as
    │       │       ├── ColumnDescriptor.as
    │       │       ├── ColumnLayoutData.as
    │       │       ├── EntryClipManager.as
    │       │       ├── FilteredEnumeration.as
    │       │       ├── IEntryEnumeration.as
    │       │       ├── IListProcessor.as
    │       │       ├── ListLayout.as
    │       │       ├── ListLayoutManager.as
    │       │       ├── ListState.as
    │       │       ├── ScrollingList.as
    │       │       ├── SortedListHeader.as
    │       │       ├── TabularList.as
    │       │       └── TabularListEntry.as
    │       ├── defines/
    │       │   ├── Actor.as
    │       │   ├── Armor.as
    │       │   ├── ButtonArtNames.as
    │       │   ├── Form.as
    │       │   ├── Input.as
    │       │   ├── Inventory.as
    │       │   ├── Item.as
    │       │   ├── Magic.as
    │       │   ├── Material.as
    │       │   ├── Screen.as
    │       │   └── Weapon.as
    │       ├── filter/
    │       │   ├── IFilter.as
    │       │   ├── ItemTypeFilter.as
    │       │   ├── NameFilter.as
    │       │   └── SortFilter.as
    │       ├── props/
    │       │   ├── CompoundProperty.as
    │       │   ├── ItemFilter.as
    │       │   ├── PropertyDataExtender.as
    │       │   └── PropertyLookup.as
    │       └── util/
    │           ├── ColorFunctions.as
    │           ├── ConfigManager.as
    │           ├── Debug.as
    │           ├── DialogManager.as
    │           ├── EffectIconMap.as
    │           ├── GlobalFunctions.as
    │           ├── Hash.as
    │           ├── Input.as
    │           ├── MarkupParser.as
    │           ├── Translator.as
    │           └── Tween.as
    ├── CraftingMenu/
    │   ├── CraftingDataSetter.as
    │   ├── CraftingIconSetter.as
    │   ├── CraftingListEntry.as
    │   ├── CraftingLists.as
    │   ├── CraftingMenu.as
    │   ├── CustomAlchemyDataSetter.as
    │   ├── CustomConstructDataSetter.as
    │   ├── EnchantingBar.as
    │   ├── IconTabList.as
    │   ├── IconTabListEntry.as
    │   └── craftingmenu.fla
    ├── Enderal/
    │   ├── ButtonGrid.as
    │   ├── ButtonGridEntry.as
    │   ├── DataLoader.as
    │   ├── SkillMenu.as
    │   ├── SkillMenu.fla
    │   ├── SkillMenu.swf
    │   ├── SkillMenuData.txt
    │   ├── SkillTreeEntry.as
    │   └── SkillTreeView.as
    ├── FavoritesMenu/
    │   ├── FavoritesIconSetter.as
    │   ├── FavoritesListEntry.as
    │   ├── FavoritesMenu.as
    │   ├── FilterDataExtender.as
    │   ├── GroupButton.as
    │   ├── GroupDataExtender.as
    │   └── favoritesmenu.fla
    ├── HUDWidgets/
    │   ├── WidgetLoader.as
    │   ├── activeeffects.fla
    │   ├── arrowcount.fla
    │   ├── meter.fla
    │   ├── minimap.fla
    │   ├── pnx/
    │   │   └── widgets/
    │   │       └── StatusIconWidget.as
    │   ├── skyui/
    │   │   └── widgets/
    │   │       ├── WidgetBase.as
    │   │       ├── activeeffects/
    │   │       │   ├── ActiveEffect.as
    │   │       │   ├── ActiveEffectsGroup.as
    │   │       │   └── ActiveEffectsWidget.as
    │   │       ├── arrowcount/
    │   │       │   └── ArrowCountWidget.as
    │   │       ├── meter/
    │   │       │   └── MeterWidget.as
    │   │       ├── minimap/
    │   │       │   └── MiniMapWidget.as
    │   │       └── status/
    │   │           └── StatusWidget.as
    │   ├── status.fla
    │   ├── statusicons.fla
    │   └── widgetloader.fla
    ├── ItemMenus/
    │   ├── BarterDataSetter.as
    │   ├── BarterMenu.as
    │   ├── BottomBar.as
    │   ├── CategoryList.as
    │   ├── CategoryListEntry.as
    │   ├── ContainerMenu.as
    │   ├── GiftMenu.as
    │   ├── InventoryDataSetter.as
    │   ├── InventoryIconSetter.as
    │   ├── InventoryListEntry.as
    │   ├── InventoryLists.as
    │   ├── InventoryMenu.as
    │   ├── ItemCard.as
    │   ├── ItemMenu.as
    │   ├── ItemcardDataExtender.as
    │   ├── MagicDataSetter.as
    │   ├── MagicIconSetter.as
    │   ├── MagicMenu.as
    │   ├── bartermenu.fla
    │   ├── bottombar.fla
    │   ├── containermenu.fla
    │   ├── giftmenu.fla
    │   ├── inventorylists.fla
    │   ├── inventorymenu.fla
    │   ├── itemcard.fla
    │   └── magicmenu.fla
    ├── MapMenu/
    │   ├── Map/
    │   │   ├── LocalMap.as
    │   │   ├── LocationFinder.as
    │   │   ├── LocationListEntry.as
    │   │   ├── MapMarker.as
    │   │   ├── MapMenu.as
    │   │   └── MarkerDescription.as
    │   └── map.fla
    ├── MessageBox/
    │   ├── MessageBox.as
    │   └── messagebox.fla
    ├── ModConfigPanel/
    │   ├── ColorDialog.as
    │   ├── ConfigPanel.as
    │   ├── MenuDialog.as
    │   ├── MessageDialog.as
    │   ├── ModListPanel.as
    │   ├── MultiColumnScrollBar.as
    │   ├── MultiColumnScrollingList.as
    │   ├── OptionDialog.as
    │   ├── OptionsListEntry.as
    │   ├── ParticleEmitter.as
    │   ├── SkyUISplash.as
    │   ├── SliderDialog.as
    │   ├── SnowEffect.as
    │   ├── TextLoader.as
    │   ├── TextLoader.fla
    │   ├── configpanel.fla
    │   ├── mcm_splash.fla
    │   └── skyui_splash.fla
    ├── PauseMenu/
    │   ├── InputMappingArt.as
    │   ├── InputMappingList.as
    │   ├── JournalBottomBar.as
    │   ├── JournalSaveLoadList.as
    │   ├── ObjectiveScrollingList.as
    │   ├── OptionsList.as
    │   ├── QuestCenteredList.as
    │   ├── Quest_Journal.as
    │   ├── QuestsPage.as
    │   ├── SettingsOptionItem.as
    │   ├── StatsList.as
    │   ├── StatsPage.as
    │   ├── SystemPage.as
    │   └── quest_journal/
    │       ├── DOMDocument.xml
    │       ├── LIBRARY/
    │       │   ├── ButtonArt.xml
    │       │   ├── ButtonBG.xml
    │       │   ├── ButtonPanel.xml
    │       │   ├── DialogButton.xml
    │       │   ├── Divider.xml
    │       │   ├── Graphic/
    │       │   │   └── ButtonBG Shape.xml
    │       │   ├── InputMappingArt.xml
    │       │   ├── InputMappingArtBG.xml
    │       │   ├── JournalBottomBarCenterReference.xml
    │       │   ├── MappedButton.xml
    │       │   ├── MovieClips/
    │       │   │   ├── ButtonArtBackground.xml
    │       │   │   ├── ConfigPanelFader.xml
    │       │   │   ├── ConfirmPanel.xml
    │       │   │   ├── ConfirmText.xml
    │       │   │   ├── EquipIcon.xml
    │       │   │   ├── HelpList.xml
    │       │   │   ├── HelpListEntry.xml
    │       │   │   ├── HelpListPanel.xml
    │       │   │   ├── HelpTextButtonArtHolder.xml
    │       │   │   ├── HelpTextHolder.xml
    │       │   │   ├── HelpTextPanel.xml
    │       │   │   ├── InputMappingList.xml
    │       │   │   ├── InputMappingListEntry.xml
    │       │   │   ├── InputMappingListScrollArrow.xml
    │       │   │   ├── InputMappingPanel.xml
    │       │   │   ├── JournalBackground.xml
    │       │   │   ├── JournalBottomBar.xml
    │       │   │   ├── JournalTab.xml
    │       │   │   ├── JournalTabEnd.xml
    │       │   │   ├── LevelMeterRect.xml
    │       │   │   ├── LevelProgressBar.xml
    │       │   │   ├── MeterBar.xml
    │       │   │   ├── MeterBarBackground.xml
    │       │   │   ├── MeterBarColor.xml
    │       │   │   ├── MeterMask.xml
    │       │   │   ├── ObjectiveListItem.xml
    │       │   │   ├── ObjectiveScrollingList.xml
    │       │   │   ├── ObjectivesHeader.xml
    │       │   │   ├── OptionStepperArrowBtn.xml
    │       │   │   ├── OptionsLists.xml
    │       │   │   ├── OptionsListsList.xml
    │       │   │   ├── OptionsListsListEntry.xml
    │       │   │   ├── OptionsListsPanel.xml
    │       │   │   ├── PCQuitList.xml
    │       │   │   ├── PCQuitListEntry.xml
    │       │   │   ├── PCQuitPanel.xml
    │       │   │   ├── PlayerInfoText.xml
    │       │   │   ├── QuestJournalBase.xml
    │       │   │   ├── QuestJournalFader.xml
    │       │   │   ├── QuestTitleEndpieces.xml
    │       │   │   ├── QuestTitleHolder.xml
    │       │   │   ├── QuestTitleList.xml
    │       │   │   ├── QuestTitleListEntry.xml
    │       │   │   ├── QuestTitleListEntryCentered.xml
    │       │   │   ├── QuestTitleListEntryDivider.xml
    │       │   │   ├── QuestsFader.xml
    │       │   │   ├── QuestsPage.xml
    │       │   │   ├── SaveLoadList.xml
    │       │   │   ├── SaveLoadListEntry.xml
    │       │   │   ├── SaveLoadPanel.xml
    │       │   │   ├── ScreenshotHolder.xml
    │       │   │   ├── ScrollableText.xml
    │       │   │   ├── SettingsCheckBox.xml
    │       │   │   ├── SettingsCheckBoxBackground.xml
    │       │   │   ├── SettingsCheckBoxCheck.xml
    │       │   │   ├── SettingsList.xml
    │       │   │   ├── SettingsListEntry.xml
    │       │   │   ├── SettingsOptionStepper.xml
    │       │   │   ├── SettingsPanel.xml
    │       │   │   ├── StatsCategoryListEntry.xml
    │       │   │   ├── StatsCategoryListEntryCentered.xml
    │       │   │   ├── StatsCategoryListHolder.xml
    │       │   │   ├── StatsCategoryListList.xml
    │       │   │   ├── StatsFader.xml
    │       │   │   ├── StatsList.xml
    │       │   │   ├── StatsListEntry.xml
    │       │   │   ├── StatsPage.xml
    │       │   │   ├── SystemCategoriesList.xml
    │       │   │   ├── SystemCategoriesListEntry.xml
    │       │   │   ├── SystemCategoriesListEntryCentered.xml
    │       │   │   ├── SystemCategoryList.xml
    │       │   │   ├── SystemFader.xml
    │       │   │   └── SystemPage.xml
    │       │   ├── Shapes/
    │       │   │   ├── BackgroundRect.xml
    │       │   │   ├── Endpieces_DLC01.xml
    │       │   │   ├── Endpieces_DLC02.xml
    │       │   │   ├── MeterBackground.xml
    │       │   │   ├── Shape 122.xml
    │       │   │   ├── Shape 398.xml
    │       │   │   ├── Shape 400.xml
    │       │   │   ├── Shape 407.xml
    │       │   │   ├── Shape 409.xml
    │       │   │   ├── Shape 411.xml
    │       │   │   ├── Shape 414.xml
    │       │   │   ├── Shape 417.xml
    │       │   │   ├── Shape 432.xml
    │       │   │   ├── Shape 433.xml
    │       │   │   ├── Shape 435.xml
    │       │   │   ├── Shape 439.xml
    │       │   │   ├── Shape 440.xml
    │       │   │   ├── Shape 441.xml
    │       │   │   ├── Shape 442.xml
    │       │   │   ├── Shape 443.xml
    │       │   │   ├── Shape 444.xml
    │       │   │   ├── Shape 445.xml
    │       │   │   ├── Shape 446.xml
    │       │   │   ├── Shape 447.xml
    │       │   │   ├── Shape 468.xml
    │       │   │   ├── Shape 493.xml
    │       │   │   ├── Shape 499.xml
    │       │   │   ├── Shape 505.xml
    │       │   │   ├── Shape 507.xml
    │       │   │   ├── Shape 541.xml
    │       │   │   ├── Shape 548.xml
    │       │   │   ├── Shape 552.xml
    │       │   │   ├── Shape 556.xml
    │       │   │   ├── Shape 558.xml
    │       │   │   ├── Shape 560.xml
    │       │   │   ├── Shape 562.xml
    │       │   │   ├── Shape 569.xml
    │       │   │   ├── Shape 571.xml
    │       │   │   ├── Shape 573.xml
    │       │   │   ├── Shape 575.xml
    │       │   │   └── Shape 577.xml
    │       │   ├── TextArea.xml
    │       │   ├── scrollBar.xml
    │       │   ├── scrollBarAssets/
    │       │   │   ├── scrollBarGraphics/
    │       │   │   │   ├── scrollBarOption_thumb_shape.xml
    │       │   │   │   ├── scrollBar_cap_shape.xml
    │       │   │   │   ├── scrollBar_thumb_shape.xml
    │       │   │   │   └── scrollBar_track_shape.xml
    │       │   │   ├── scrollBarOption_thumb.xml
    │       │   │   ├── scrollBar_downArrow.xml
    │       │   │   ├── scrollBar_thumb.xml
    │       │   │   ├── scrollBar_track.xml
    │       │   │   └── scrollBar_upArrow.xml
    │       │   └── scrollBarOption.xml
    │       ├── META-INF/
    │       │   └── metadata.xml
    │       ├── MobileSettings.xml
    │       ├── PublishSettings.xml
    │       ├── bin/
    │       │   └── SymDepend.cache
    │       └── quest_journal.xfl
    ├── Resources/
    │   ├── Assets/
    │   │   ├── maskedtextarea.fla
    │   │   ├── meter.fla
    │   │   └── scrollbar.fla
    │   ├── buttonArt/
    │   │   ├── DOMDocument.xml
    │   │   ├── LIBRARY/
    │   │   │   ├── ButtonArt.xml
    │   │   │   ├── ButtonArtBackgrounds/
    │   │   │   │   ├── BackgroundBig.xml
    │   │   │   │   ├── BackgroundLarge.xml
    │   │   │   │   ├── BackgroundLeft.xml
    │   │   │   │   ├── BackgroundMedium.xml
    │   │   │   │   ├── BackgroundRight.xml
    │   │   │   │   ├── BackgroundRound.xml
    │   │   │   │   └── BackgroundSmall.xml
    │   │   │   ├── Controller/
    │   │   │   │   ├── 360/
    │   │   │   │   │   ├── Back.xml
    │   │   │   │   │   ├── LB.xml
    │   │   │   │   │   ├── LS.xml
    │   │   │   │   │   ├── LSPress.xml
    │   │   │   │   │   ├── LT.xml
    │   │   │   │   │   ├── RB.xml
    │   │   │   │   │   ├── RS.xml
    │   │   │   │   │   ├── RSPress.xml
    │   │   │   │   │   └── RT.xml
    │   │   │   │   ├── PS3/
    │   │   │   │   │   ├── Circle.xml
    │   │   │   │   │   ├── L1.xml
    │   │   │   │   │   ├── L2.xml
    │   │   │   │   │   ├── L3.xml
    │   │   │   │   │   ├── PS3X.xml
    │   │   │   │   │   ├── R1.xml
    │   │   │   │   │   ├── R2.xml
    │   │   │   │   │   ├── R3.xml
    │   │   │   │   │   ├── Select.xml
    │   │   │   │   │   ├── Square.xml
    │   │   │   │   │   └── Triangle.xml
    │   │   │   │   └── Start.xml
    │   │   │   ├── FunctionKeys/
    │   │   │   │   ├── Alt.xml
    │   │   │   │   ├── Backspace.xml
    │   │   │   │   ├── BackspaceWithArrow.xml
    │   │   │   │   ├── Caps.xml
    │   │   │   │   ├── Ctrl.xml
    │   │   │   │   ├── Del.xml
    │   │   │   │   ├── End.xml
    │   │   │   │   ├── Enter.xml
    │   │   │   │   ├── EnterWithArrow.xml
    │   │   │   │   ├── Esc.xml
    │   │   │   │   ├── F1.xml
    │   │   │   │   ├── F10.xml
    │   │   │   │   ├── F11.xml
    │   │   │   │   ├── F12.xml
    │   │   │   │   ├── F2.xml
    │   │   │   │   ├── F3.xml
    │   │   │   │   ├── F4.xml
    │   │   │   │   ├── F5.xml
    │   │   │   │   ├── F6.xml
    │   │   │   │   ├── F7.xml
    │   │   │   │   ├── F8.xml
    │   │   │   │   ├── F9.xml
    │   │   │   │   ├── Home.xml
    │   │   │   │   ├── Ins.xml
    │   │   │   │   ├── LAlt.xml
    │   │   │   │   ├── LCtrl.xml
    │   │   │   │   ├── NumLck.xml
    │   │   │   │   ├── Pause.xml
    │   │   │   │   ├── PgDn.xml
    │   │   │   │   ├── PgUp.xml
    │   │   │   │   ├── PrtSc.xml
    │   │   │   │   ├── RAlt.xml
    │   │   │   │   ├── RCtrl.xml
    │   │   │   │   ├── ScrLck.xml
    │   │   │   │   ├── Shift.xml
    │   │   │   │   ├── ShiftWithArrow.xml
    │   │   │   │   ├── Space.xml
    │   │   │   │   └── Tab.xml
    │   │   │   ├── Letters/
    │   │   │   │   ├── A.xml
    │   │   │   │   ├── B.xml
    │   │   │   │   ├── C.xml
    │   │   │   │   ├── D.xml
    │   │   │   │   ├── E.xml
    │   │   │   │   ├── F.xml
    │   │   │   │   ├── G.xml
    │   │   │   │   ├── H.xml
    │   │   │   │   ├── I.xml
    │   │   │   │   ├── J.xml
    │   │   │   │   ├── K.xml
    │   │   │   │   ├── L.xml
    │   │   │   │   ├── M.xml
    │   │   │   │   ├── N.xml
    │   │   │   │   ├── O.xml
    │   │   │   │   ├── P.xml
    │   │   │   │   ├── Q.xml
    │   │   │   │   ├── R.xml
    │   │   │   │   ├── S.xml
    │   │   │   │   ├── T.xml
    │   │   │   │   ├── U.xml
    │   │   │   │   ├── V.xml
    │   │   │   │   ├── W.xml
    │   │   │   │   ├── X.xml
    │   │   │   │   ├── Y.xml
    │   │   │   │   └── Z.xml
    │   │   │   ├── Mouse/
    │   │   │   │   ├── MouseButtons/
    │   │   │   │   │   ├── M1.xml
    │   │   │   │   │   ├── M2.xml
    │   │   │   │   │   ├── M3.xml
    │   │   │   │   │   ├── M4.xml
    │   │   │   │   │   ├── M5.xml
    │   │   │   │   │   ├── M6.xml
    │   │   │   │   │   ├── M7.xml
    │   │   │   │   │   └── M8.xml
    │   │   │   │   ├── MouseMove.xml
    │   │   │   │   └── MouseWheel/
    │   │   │   │       ├── MouseWheel.xml
    │   │   │   │       ├── MouseWheelDown.xml
    │   │   │   │       └── MouseWheelUp.xml
    │   │   │   ├── Named Icons/
    │   │   │   │   ├── Action_Double_Up.xml
    │   │   │   │   ├── Action_Up.xml
    │   │   │   │   ├── Action_Up_Arrow.xml
    │   │   │   │   ├── OCC BUTTON BASE CIRCLE.xml
    │   │   │   │   ├── OCC BUTTON BASE SQUARE.xml
    │   │   │   │   ├── OCC BUTTON MOD BASE 1.xml
    │   │   │   │   ├── OCC BUTTON MOD BASE 2.xml
    │   │   │   │   ├── OCC BUTTON MOD BASE 3.xml
    │   │   │   │   ├── OCC BUTTON MOD BASE 4.xml
    │   │   │   │   ├── OCC CONTROLLER MC.xml
    │   │   │   │   ├── OCC CONTROLLER.xml
    │   │   │   │   ├── OCC MOTION.xml
    │   │   │   │   ├── OCC THUM REST RIGHT BASE.xml
    │   │   │   │   ├── OCC THUMB REST BASE.xml
    │   │   │   │   ├── OCC THUMB REST LEFT BASE.xml
    │   │   │   │   ├── OCC THUMB_REST.xml
    │   │   │   │   ├── OCC THUMB_REST_LEFT.xml
    │   │   │   │   ├── OCC THUMB_REST_RIGHT.xml
    │   │   │   │   ├── OCC_A.xml
    │   │   │   │   ├── OCC_A_HOLD.xml
    │   │   │   │   ├── OCC_B.xml
    │   │   │   │   ├── OCC_B_HOLD.xml
    │   │   │   │   ├── OCC_X.xml
    │   │   │   │   ├── OCC_X_HOLD.xml
    │   │   │   │   ├── OCC_Y.xml
    │   │   │   │   ├── OCC_Y_HOLD.xml
    │   │   │   │   ├── Symbol 163.xml
    │   │   │   │   ├── Symbol 164.xml
    │   │   │   │   ├── Symbol 170.xml
    │   │   │   │   ├── Symbol 171.xml
    │   │   │   │   ├── Symbol 258.xml
    │   │   │   │   ├── Symbol 259.xml
    │   │   │   │   ├── Symbol 260.xml
    │   │   │   │   ├── Symbol 261.xml
    │   │   │   │   ├── Symbol 262.xml
    │   │   │   │   ├── Symbol 264.xml
    │   │   │   │   ├── Symbol 266.xml
    │   │   │   │   ├── Symbol 267.xml
    │   │   │   │   ├── Symbol 268.xml
    │   │   │   │   ├── Symbol 270.xml
    │   │   │   │   ├── Symbol 271.xml
    │   │   │   │   ├── Symbol 272.xml
    │   │   │   │   ├── Symbol 273.xml
    │   │   │   │   ├── Symbol 274.xml
    │   │   │   │   ├── Symbol 275.xml
    │   │   │   │   ├── Symbol 276.xml
    │   │   │   │   ├── Symbol 277.xml
    │   │   │   │   ├── Symbol 278.xml
    │   │   │   │   ├── Symbol 279.xml
    │   │   │   │   ├── Symbol 280.xml
    │   │   │   │   ├── Symbol 281.xml
    │   │   │   │   ├── Symbol 282.xml
    │   │   │   │   ├── Symbol 284.xml
    │   │   │   │   ├── Symbol 285.xml
    │   │   │   │   ├── Symbol 286.xml
    │   │   │   │   ├── Symbol 287.xml
    │   │   │   │   ├── Symbol 288.xml
    │   │   │   │   ├── Symbol 289.xml
    │   │   │   │   ├── Symbol 290.xml
    │   │   │   │   ├── Symbol 291.xml
    │   │   │   │   ├── Symbol 292.xml
    │   │   │   │   ├── Symbol 293.xml
    │   │   │   │   ├── Symbol 294.xml
    │   │   │   │   ├── Symbol 295.xml
    │   │   │   │   ├── Symbol 296.xml
    │   │   │   │   ├── Symbol 297.xml
    │   │   │   │   ├── Symbol 298.xml
    │   │   │   │   ├── Symbol 299.xml
    │   │   │   │   ├── Symbol 302.xml
    │   │   │   │   ├── Symbol 304.xml
    │   │   │   │   ├── Symbol 305.xml
    │   │   │   │   ├── Symbol 306.xml
    │   │   │   │   ├── Symbol 307.xml
    │   │   │   │   ├── Symbol 308.xml
    │   │   │   │   ├── Symbol 309.xml
    │   │   │   │   ├── Symbol 310.xml
    │   │   │   │   ├── Symbol 311.xml
    │   │   │   │   ├── Symbol 312.xml
    │   │   │   │   ├── Symbol 313.xml
    │   │   │   │   ├── Symbol 314.xml
    │   │   │   │   ├── Symbol 315.xml
    │   │   │   │   ├── Symbol 316.xml
    │   │   │   │   ├── Symbol 318.xml
    │   │   │   │   ├── Symbol 319.xml
    │   │   │   │   ├── Symbol 320.xml
    │   │   │   │   ├── Symbol 321.xml
    │   │   │   │   ├── Symbol 322.xml
    │   │   │   │   ├── Symbol 323.xml
    │   │   │   │   ├── Symbol 324.xml
    │   │   │   │   ├── Symbol 325.xml
    │   │   │   │   ├── Symbol 326.xml
    │   │   │   │   ├── Symbol 327.xml
    │   │   │   │   ├── Symbol 328.xml
    │   │   │   │   ├── Symbol 329.xml
    │   │   │   │   ├── Symbol 330.xml
    │   │   │   │   ├── Symbol 331.xml
    │   │   │   │   ├── Symbol 332.xml
    │   │   │   │   ├── Symbol 333.xml
    │   │   │   │   ├── Symbol 334.xml
    │   │   │   │   ├── Symbol 335.xml
    │   │   │   │   ├── Symbol 336.xml
    │   │   │   │   ├── Symbol 337.xml
    │   │   │   │   ├── Symbol 338.xml
    │   │   │   │   ├── Symbol 339.xml
    │   │   │   │   ├── Symbol 340.xml
    │   │   │   │   ├── Symbol 341.xml
    │   │   │   │   ├── Symbol 342.xml
    │   │   │   │   ├── Symbol 343.xml
    │   │   │   │   ├── Symbol 344.xml
    │   │   │   │   ├── Symbol 345.xml
    │   │   │   │   ├── Symbol 346.xml
    │   │   │   │   ├── Symbol 347.xml
    │   │   │   │   ├── Symbol 348.xml
    │   │   │   │   ├── Symbol 349.xml
    │   │   │   │   ├── Symbol 350.xml
    │   │   │   │   ├── Symbol 351.xml
    │   │   │   │   ├── Symbol 352.xml
    │   │   │   │   ├── Symbol 353.xml
    │   │   │   │   ├── Symbol 354.xml
    │   │   │   │   ├── Symbol 355.xml
    │   │   │   │   ├── Symbol 356.xml
    │   │   │   │   ├── Symbol 357.xml
    │   │   │   │   ├── Symbol 358.xml
    │   │   │   │   ├── Symbol 359.xml
    │   │   │   │   ├── Symbol 36.xml
    │   │   │   │   ├── Symbol 360.xml
    │   │   │   │   ├── Symbol 361.xml
    │   │   │   │   ├── Symbol 362.xml
    │   │   │   │   ├── Symbol 363.xml
    │   │   │   │   ├── Symbol 364.xml
    │   │   │   │   ├── Symbol 365.xml
    │   │   │   │   ├── Symbol 366.xml
    │   │   │   │   ├── Symbol 367.xml
    │   │   │   │   ├── Symbol 368.xml
    │   │   │   │   ├── Symbol 369.xml
    │   │   │   │   ├── Symbol 370.xml
    │   │   │   │   ├── Symbol 371.xml
    │   │   │   │   ├── Symbol 372.xml
    │   │   │   │   ├── Symbol 373.xml
    │   │   │   │   ├── Symbol 374.xml
    │   │   │   │   ├── Symbol 375.xml
    │   │   │   │   ├── Symbol 376.xml
    │   │   │   │   ├── Symbol 377.xml
    │   │   │   │   ├── Symbol 378.xml
    │   │   │   │   ├── Symbol 379.xml
    │   │   │   │   ├── Symbol 380.xml
    │   │   │   │   ├── Symbol 381.xml
    │   │   │   │   ├── Symbol 382.xml
    │   │   │   │   ├── Symbol 383.xml
    │   │   │   │   ├── Symbol 384.xml
    │   │   │   │   ├── Symbol 385.xml
    │   │   │   │   ├── Symbol 386.xml
    │   │   │   │   ├── Symbol 387.xml
    │   │   │   │   ├── Symbol 388.xml
    │   │   │   │   ├── Symbol 389.xml
    │   │   │   │   ├── Symbol 390.xml
    │   │   │   │   ├── Symbol 391.xml
    │   │   │   │   ├── Symbol 392.xml
    │   │   │   │   ├── Symbol 393.xml
    │   │   │   │   ├── Symbol 394.xml
    │   │   │   │   ├── Symbol 395.xml
    │   │   │   │   ├── Symbol 396.xml
    │   │   │   │   ├── Symbol 397.xml
    │   │   │   │   ├── Symbol 398.xml
    │   │   │   │   ├── Symbol 399.xml
    │   │   │   │   ├── Symbol 400.xml
    │   │   │   │   ├── Symbol 401.xml
    │   │   │   │   ├── Symbol 402.xml
    │   │   │   │   ├── Symbol 403.xml
    │   │   │   │   ├── Symbol 404.xml
    │   │   │   │   ├── Symbol 406.xml
    │   │   │   │   ├── Symbol 407.xml
    │   │   │   │   ├── Symbol 409.xml
    │   │   │   │   ├── Symbol 412.xml
    │   │   │   │   ├── Symbol 413.xml
    │   │   │   │   ├── Symbol 414.xml
    │   │   │   │   ├── Symbol 415.xml
    │   │   │   │   ├── Symbol 417.xml
    │   │   │   │   ├── Symbol 420.xml
    │   │   │   │   ├── Symbol 421.xml
    │   │   │   │   ├── Symbol 422.xml
    │   │   │   │   ├── Symbol 423.xml
    │   │   │   │   ├── Symbol 424.xml
    │   │   │   │   ├── Symbol 425.xml
    │   │   │   │   ├── Symbol 426.xml
    │   │   │   │   ├── Symbol 427.xml
    │   │   │   │   ├── Symbol 428.xml
    │   │   │   │   ├── Symbol 429.xml
    │   │   │   │   ├── Symbol 430.xml
    │   │   │   │   ├── Symbol 431.xml
    │   │   │   │   ├── Symbol 432.xml
    │   │   │   │   ├── Symbol 433.xml
    │   │   │   │   ├── Symbol 434.xml
    │   │   │   │   ├── Symbol 435.xml
    │   │   │   │   ├── Symbol 436.xml
    │   │   │   │   ├── Symbol 437.xml
    │   │   │   │   ├── Symbol 438.xml
    │   │   │   │   ├── Symbol 439.xml
    │   │   │   │   ├── Symbol 440.xml
    │   │   │   │   ├── Symbol 441.xml
    │   │   │   │   ├── Symbol 442.xml
    │   │   │   │   ├── Symbol 443.xml
    │   │   │   │   ├── Symbol 445.xml
    │   │   │   │   ├── Symbol 446.xml
    │   │   │   │   ├── Symbol 447.xml
    │   │   │   │   ├── Symbol 448.xml
    │   │   │   │   ├── Symbol 449.xml
    │   │   │   │   ├── Symbol 451.xml
    │   │   │   │   ├── Symbol 452.xml
    │   │   │   │   ├── Symbol 453.xml
    │   │   │   │   ├── Symbol 454.xml
    │   │   │   │   ├── Symbol 455.xml
    │   │   │   │   ├── Symbol 457.xml
    │   │   │   │   ├── Symbol 458.xml
    │   │   │   │   ├── Symbol 459.xml
    │   │   │   │   ├── Symbol 460.xml
    │   │   │   │   ├── Symbol 462.xml
    │   │   │   │   ├── Symbol 465.xml
    │   │   │   │   ├── Symbol 466.xml
    │   │   │   │   ├── Symbol 467.xml
    │   │   │   │   ├── Symbol 468.xml
    │   │   │   │   ├── Symbol 469.xml
    │   │   │   │   ├── Symbol 470.xml
    │   │   │   │   ├── Symbol 471.xml
    │   │   │   │   ├── Symbol 472.xml
    │   │   │   │   ├── Symbol 473.xml
    │   │   │   │   ├── Symbol 474.xml
    │   │   │   │   ├── Symbol 475.xml
    │   │   │   │   ├── Symbol 476.xml
    │   │   │   │   ├── Symbol 477.xml
    │   │   │   │   ├── Symbol 478.xml
    │   │   │   │   ├── Symbol 479.xml
    │   │   │   │   ├── Symbol 480.xml
    │   │   │   │   ├── Symbol 481.xml
    │   │   │   │   ├── Symbol 482.xml
    │   │   │   │   ├── Symbol 483.xml
    │   │   │   │   ├── Symbol 484.xml
    │   │   │   │   ├── Symbol 485.xml
    │   │   │   │   ├── Symbol 486.xml
    │   │   │   │   ├── Symbol 487.xml
    │   │   │   │   ├── Symbol 488.xml
    │   │   │   │   ├── Symbol 489.xml
    │   │   │   │   ├── Symbol 490.xml
    │   │   │   │   ├── Symbol 491.xml
    │   │   │   │   ├── Symbol 492.xml
    │   │   │   │   ├── Symbol 493.xml
    │   │   │   │   ├── Symbol 494.xml
    │   │   │   │   ├── Symbol 495.xml
    │   │   │   │   ├── Symbol 496.xml
    │   │   │   │   ├── Symbol 497.xml
    │   │   │   │   ├── Symbol 498.xml
    │   │   │   │   ├── Symbol 499.xml
    │   │   │   │   ├── Symbol 500.xml
    │   │   │   │   ├── Symbol 501.xml
    │   │   │   │   ├── Symbol 502.xml
    │   │   │   │   ├── Symbol 503.xml
    │   │   │   │   ├── Symbol 504.xml
    │   │   │   │   ├── Symbol 505.xml
    │   │   │   │   ├── Symbol 506.xml
    │   │   │   │   ├── Symbol 507.xml
    │   │   │   │   ├── Symbol 508.xml
    │   │   │   │   ├── Symbol 509.xml
    │   │   │   │   ├── Symbol 510.xml
    │   │   │   │   ├── Symbol 511.xml
    │   │   │   │   ├── Symbol 512.xml
    │   │   │   │   ├── Symbol 513.xml
    │   │   │   │   ├── Symbol 514.xml
    │   │   │   │   ├── Symbol 515.xml
    │   │   │   │   ├── Symbol 516.xml
    │   │   │   │   ├── Symbol 517.xml
    │   │   │   │   ├── Symbol 518.xml
    │   │   │   │   ├── Symbol 519.xml
    │   │   │   │   ├── Symbol 520.xml
    │   │   │   │   ├── Symbol 521.xml
    │   │   │   │   ├── Symbol 522.xml
    │   │   │   │   ├── Symbol 523.xml
    │   │   │   │   ├── Symbol 524.xml
    │   │   │   │   ├── Symbol 525.xml
    │   │   │   │   ├── Symbol 526.xml
    │   │   │   │   ├── Symbol 527.xml
    │   │   │   │   ├── Symbol 528.xml
    │   │   │   │   ├── Symbol 529.xml
    │   │   │   │   ├── Symbol 530.xml
    │   │   │   │   ├── Symbol 531.xml
    │   │   │   │   ├── Symbol 532.xml
    │   │   │   │   ├── Symbol 533.xml
    │   │   │   │   ├── Symbol 534.xml
    │   │   │   │   ├── Symbol 535.xml
    │   │   │   │   ├── Symbol 536.xml
    │   │   │   │   ├── Symbol 537.xml
    │   │   │   │   ├── Symbol 538.xml
    │   │   │   │   ├── Symbol 539.xml
    │   │   │   │   ├── Symbol 540.xml
    │   │   │   │   ├── Symbol 541.xml
    │   │   │   │   ├── Symbol 543.xml
    │   │   │   │   ├── Symbol 544.xml
    │   │   │   │   ├── Symbol 545.xml
    │   │   │   │   ├── Symbol 546.xml
    │   │   │   │   ├── Symbol 547.xml
    │   │   │   │   ├── Symbol 548.xml
    │   │   │   │   ├── Symbol 549.xml
    │   │   │   │   ├── Symbol 550.xml
    │   │   │   │   ├── Symbol 551.xml
    │   │   │   │   ├── Symbol 552.xml
    │   │   │   │   ├── Symbol 553.xml
    │   │   │   │   └── Symbol 555.xml
    │   │   │   ├── NumberPad/
    │   │   │   │   ├── NP0.xml
    │   │   │   │   ├── NP1.xml
    │   │   │   │   ├── NP2.xml
    │   │   │   │   ├── NP3.xml
    │   │   │   │   ├── NP4.xml
    │   │   │   │   ├── NP5.xml
    │   │   │   │   ├── NP6.xml
    │   │   │   │   ├── NP7.xml
    │   │   │   │   ├── NP8.xml
    │   │   │   │   ├── NP9.xml
    │   │   │   │   ├── NPAsterisk.xml
    │   │   │   │   ├── NPEnter.xml
    │   │   │   │   ├── NPForwardSlash.xml
    │   │   │   │   ├── NPMinus.xml
    │   │   │   │   ├── NPPeriod.xml
    │   │   │   │   └── NPPlus.xml
    │   │   │   ├── Numbers/
    │   │   │   │   ├── 0.xml
    │   │   │   │   ├── 1.xml
    │   │   │   │   ├── 2.xml
    │   │   │   │   ├── 3.xml
    │   │   │   │   ├── 4.xml
    │   │   │   │   ├── 5.xml
    │   │   │   │   ├── 6.xml
    │   │   │   │   ├── 7.xml
    │   │   │   │   ├── 8.xml
    │   │   │   │   └── 9.xml
    │   │   │   └── Symbols/
    │   │   │       ├── Amersand.xml
    │   │   │       ├── Arrow.xml
    │   │   │       ├── Asterisk.xml
    │   │   │       ├── At.xml
    │   │   │       ├── BackSlash.xml
    │   │   │       ├── BrokenBar.xml
    │   │   │       ├── Caret.xml
    │   │   │       ├── Colon.xml
    │   │   │       ├── Comma.xml
    │   │   │       ├── Dollar Sign.xml
    │   │   │       ├── Equals.xml
    │   │   │       ├── Exclamation.xml
    │   │   │       ├── ForwardSlash.xml
    │   │   │       ├── Grave.xml
    │   │   │       ├── GreaterThan.xml
    │   │   │       ├── LeftCurlyBracket.xml
    │   │   │       ├── LeftParenthesis.xml
    │   │   │       ├── LeftSquareBracket.xml
    │   │   │       ├── LessThan.xml
    │   │   │       ├── Minus.xml
    │   │   │       ├── Negation.xml
    │   │   │       ├── Number.xml
    │   │   │       ├── Percent.xml
    │   │   │       ├── Period.xml
    │   │   │       ├── Plus Original.xml
    │   │   │       ├── Plus.xml
    │   │   │       ├── Pound.xml
    │   │   │       ├── Question.xml
    │   │   │       ├── Quotation.xml
    │   │   │       ├── RightCurlyBracket.xml
    │   │   │       ├── RightParenthesis.xml
    │   │   │       ├── RightSquareBracket.xml
    │   │   │       ├── SemiColon.xml
    │   │   │       ├── SingleQuote.xml
    │   │   │       ├── Tilde.xml
    │   │   │       ├── Underscore.xml
    │   │   │       ├── Unknown.xml
    │   │   │       └── VerticalBar.xml
    │   │   ├── META-INF/
    │   │   │   └── metadata.xml
    │   │   ├── MobileSettings.xml
    │   │   ├── PublishSettings.xml
    │   │   ├── bin/
    │   │   │   └── SymDepend.cache
    │   │   └── buttonArt.xfl
    │   ├── buttonArtSymbols.fla
    │   ├── fonts_en_snk.fla
    │   ├── gfxfontlib.fla
    │   ├── icons_category_celtic.fla
    │   ├── icons_category_curved.fla
    │   ├── icons_category_psychosteve.fla
    │   ├── icons_category_straight.fla
    │   ├── icons_effect_psychosteve.fla
    │   ├── icons_item_celtic.fla
    │   ├── icons_item_curved.fla
    │   ├── icons_item_psychosteve.fla
    │   ├── mapMarkerArt.fla
    │   ├── mcm.psd
    │   ├── skyui_icons.fla
    │   ├── skyui_icons_psychosteve.fla
    │   └── skyui_icons_straight.fla
    └── version.as
Download .txt
SYMBOL INDEX (145 symbols across 19 files)

FILE: dist/Data/fomod/script.cs
  class Script (line 14) | class Script : SkyrimBaseScript {
    method OnActivate (line 59) | public static bool OnActivate()
    method DetectProblems (line 77) | static void DetectProblems()
    method GenerateReport (line 112) | static void GenerateReport()
    method PrintReport (line 192) | static void PrintReport(string line)
    method InitializeComponents (line 197) | static void InitializeComponents()
    method installButton_Click (line 265) | static void installButton_Click(object sender, EventArgs e)
    method refreshButton_Click (line 271) | static void refreshButton_Click(object sender, EventArgs e)
    method cancelButton_Click (line 277) | static void cancelButton_Click(object sender, EventArgs e)
    method mainInstallForm_Load (line 283) | static void mainInstallForm_Load(object sender, EventArgs e)
    method IsPluginActive (line 288) | static bool IsPluginActive(String pluginName)

FILE: sksevr_plugin/build.py
  function search_arguments (line 9) | def search_arguments(needle):
  function configuration (line 20) | def configuration():
  function root_path (line 24) | def root_path():
  function read_ini (line 28) | def read_ini():
  function read_paths (line 35) | def read_paths():
  function build_path (line 39) | def build_path():
  function skyrim_path (line 43) | def skyrim_path():
  function papyrus_compiler_path (line 47) | def papyrus_compiler_path():
  function skyrim_compiled_scripts_path (line 51) | def skyrim_compiled_scripts_path():
  function skyrim_scripts_path (line 55) | def skyrim_scripts_path():
  function scripts_path (line 59) | def scripts_path():
  function compiled_scripts_path (line 63) | def compiled_scripts_path():
  function msbuild_path (line 67) | def msbuild_path():
  function run_command (line 71) | def run_command(command):
  function compile_plugin (line 89) | def compile_plugin():
  function compile_scripts (line 105) | def compile_scripts():
  function build (line 126) | def build():
  function copy_plugin (line 131) | def copy_plugin():
  function copy_files (line 139) | def copy_files(source, destination):
  function copy_script_sources (line 146) | def copy_script_sources():
  function copy_compiled_scripts (line 152) | def copy_compiled_scripts():
  function install (line 158) | def install():

FILE: sksevr_plugin/plugin/ControllerStateHook.cpp
  type ControllerStateHook (line 27) | namespace ControllerStateHook {
    function ControllerStateCB (line 35) | bool ControllerStateCB(vr::TrackedDeviceIndex_t unControllerDeviceInde...
    function equalGFxValue (line 54) | bool equalGFxValue(const GFxValue& lhs, const GFxValue& rhs)
    type ScaleformCallback (line 84) | struct ScaleformCallback {
    function DispatchControllerState (line 98) | void DispatchControllerState(vr::ETrackedControllerRole controllerHand...
    class VRInputScaleform_RegisterInputHandler (line 129) | class VRInputScaleform_RegisterInputHandler : public GFxFunctionHandler
      method Invoke (line 132) | virtual void	Invoke(Args* args)
    class VRInputScaleform_UnregisterInputHandler (line 162) | class VRInputScaleform_UnregisterInputHandler : public GFxFunctionHandler
      method Invoke (line 165) | virtual void	Invoke(Args* args)
    function GetControllerName (line 182) | std::string GetControllerName(vr::COpenVRContext* vrContext, vr::ETrac...
    class VRInputScaleform_ControllerType (line 194) | class VRInputScaleform_ControllerType : public GFxFunctionHandler
      method Invoke (line 197) | virtual void	Invoke(Args* args)
    function RegisterScaleformFuncs (line 220) | bool RegisterScaleformFuncs(GFxMovieView* view, GFxValue* plugin) {
    function contains (line 252) | bool contains(std::unordered_set<std::string>& set, const char* key) {
    class CleanControllerHookOnMenuClose (line 259) | class CleanControllerHookOnMenuClose : public BSTEventSink<MenuOpenClo...
      method EventResult (line 261) | EventResult ReceiveEvent(MenuOpenCloseEvent* evn, EventDispatcher<Me...
    function Init (line 308) | void Init() {

FILE: sksevr_plugin/plugin/ControllerStateHook.h
  function namespace (line 3) | namespace ControllerStateHook{

FILE: sksevr_plugin/plugin/FormDB.cpp
  type FormDB (line 19) | namespace FormDB {
    function Form_SetInt (line 22) | void Form_SetInt(UInt32 formID, const char* fieldName, SInt32 val) {
    function Form_SetInt (line 40) | void Form_SetInt(TESForm* form, BSFixedString fieldName, SInt32 val) {
    function Papyrus_Form_SetInt (line 50) | void Papyrus_Form_SetInt(StaticFunctionTag*, TESForm* form, BSFixedStr...
    function SInt32 (line 60) | SInt32 Form_GetInt(UInt32 formID, const char* fieldName, SInt32 defaul...
    function SInt32 (line 82) | SInt32 Form_GetInt(TESForm* form, BSFixedString fieldName, SInt32 defa...
    function SInt32 (line 94) | SInt32 Papyrus_Form_GetInt(StaticFunctionTag*, TESForm* form, BSFixedS...
    function Form_SetBool (line 113) | void Form_SetBool(UInt32 formID, const char* fieldName, bool val) {
    function Form_SetBool (line 126) | void Form_SetBool(TESForm* form, BSFixedString fieldName, bool val) {
    function Papyrus_Form_SetBool (line 136) | void Papyrus_Form_SetBool(StaticFunctionTag*, TESForm* form, BSFixedSt...
    function Form_GetBool (line 146) | bool Form_GetBool(UInt32 formID, const char* fieldName, bool default) {
    function Form_GetBool (line 168) | bool Form_GetBool(TESForm* form, BSFixedString fieldName, bool default) {
    function Papyrus_Form_GetBool (line 180) | bool Papyrus_Form_GetBool(StaticFunctionTag*, TESForm* form, BSFixedSt...
    function Form_RemoveField (line 192) | void Form_RemoveField(UInt32 formID, const char* fieldName) {
    function Form_RemoveField (line 203) | void Form_RemoveField(TESForm* form, BSFixedString fieldName) {
    function Papyrus_Form_RemoveField (line 213) | void Papyrus_Form_RemoveField(StaticFunctionTag*, TESForm* form, BSFix...
    function Form_RemoveAllFields (line 222) | void Form_RemoveAllFields(UInt32 formID) {
    function Form_RemoveAllFields (line 232) | void Form_RemoveAllFields(TESForm* form) {
    function Papyrus_Form_RemoveAllFields (line 241) | void Papyrus_Form_RemoveAllFields(StaticFunctionTag*, TESForm* form) {
    function RegisterPapyrusFuncs (line 250) | bool RegisterPapyrusFuncs(VMClassRegistry* registry) {
    function InitGlobalLuaVM (line 261) | bool InitGlobalLuaVM() {
    class Scaleform_RemoveField (line 276) | class Scaleform_RemoveField : public GFxFunctionHandler
      method Invoke (line 279) | virtual void	Invoke(Args* args)
    function RegisterScaleformFuncs (line 291) | bool RegisterScaleformFuncs(GFxMovieView* view, GFxValue* plugin) {
    function InventoryMarkNew (line 297) | void InventoryMarkNew(GFxMovieView* view, GFxValue* object, InventoryE...
    function RegisterScaleformInventoryHooks (line 308) | void RegisterScaleformInventoryHooks(SKSEScaleformInterface* infc) {

FILE: sksevr_plugin/plugin/FormDB.h
  function namespace (line 8) | namespace FormDB {

FILE: sksevr_plugin/plugin/Keyboard.cpp
  type Keyboard (line 20) | namespace Keyboard {
    function WaitForKeyboardInput (line 27) | void WaitForKeyboardInput(GFxValue desc, GFxValue currentText, GFxValu...
    class Scaleform_ShowVirtualKeyboard (line 98) | class Scaleform_ShowVirtualKeyboard : public GFxFunctionHandler
      method Invoke (line 101) | virtual void	Invoke(Args* args)
    function RegisterScaleformFuncs (line 128) | bool RegisterScaleformFuncs(GFxMovieView* view, GFxValue* plugin) {
    function RegisterScaleformHooks (line 135) | void RegisterScaleformHooks(SKSEScaleformInterface* infc) {

FILE: sksevr_plugin/plugin/Keyboard.h
  function namespace (line 5) | namespace Keyboard {

FILE: sksevr_plugin/plugin/PapyrusUIFix.cpp
  type PapyrusUIFix (line 14) | namespace PapyrusUIFix
    class UIInvokeDelegate (line 30) | class UIInvokeDelegate : public UIDelegate_v1, public ISKSEObject
      method UIInvokeDelegate (line 33) | UIInvokeDelegate(const char* nameBuf, const char* targetBuf) :
      method UIInvokeDelegate (line 38) | explicit UIInvokeDelegate(SerializationTag tag) {
      method UInt32 (line 43) | virtual UInt32		ClassVersion() const { return 1; }
      method Run (line 45) | virtual void Run() override
      method Dispose (line 62) | virtual void Dispose() override
      method Save (line 67) | virtual bool Save(SKSESerializationInterface* intfc)
      method Load (line 86) | virtual bool Load(SKSESerializationInterface* intfc, UInt32 version)
    function SetT (line 121) | void SetT(StaticFunctionTag* thisInput, BSFixedString menuName, BSFixe...
    function InvokeArgT (line 141) | void InvokeArgT(StaticFunctionTag* thisInput, BSFixedString menuName, ...
    function InvokeArrayT (line 158) | void InvokeArrayT(StaticFunctionTag* thisInput, BSFixedString menuName...
    function RegisterPapyrusFuncs (line 181) | bool RegisterPapyrusFuncs(VMClassRegistry* registry) {

FILE: sksevr_plugin/plugin/PapyrusUIFix.h
  function namespace (line 5) | namespace PapyrusUIFix

FILE: sksevr_plugin/plugin/ScaleformExtendedDataFix.cpp
  type ExtendDataFix (line 8) | namespace ExtendDataFix {
    function AttachAmmoFlags (line 13) | void AttachAmmoFlags(GFxMovieView* view, GFxValue* pFxVal, InventoryEn...
    function RegisterScaleformInventoryHooks (line 35) | void RegisterScaleformInventoryHooks(SKSEScaleformInterface* infc) {

FILE: sksevr_plugin/plugin/ScaleformExtendedDataFix.h
  function namespace (line 5) | namespace ExtendDataFix{

FILE: sksevr_plugin/plugin/Settings.cpp
  type Settings (line 18) | namespace Settings {
    function GetBool (line 20) | bool GetBool(lua_State* L, const char* path, bool default) {
    function GetDouble (line 24) | double GetDouble(lua_State* L, const char* path, double default) {
    function GetString (line 28) | std::string GetString(lua_State* L, const char* path, std::string defa...
    function load_settings_file (line 32) | bool load_settings_file(lua_State* L, const char* path) {
    function loadLuaConfig (line 46) | bool loadLuaConfig(const char* settingFilePath = nullptr)
    function deepCopyTable (line 72) | bool deepCopyTable(lua_State* L, int index, GFxMovieView* movie, GFxVa...
    function deepCopyValue (line 139) | bool deepCopyValue(lua_State* L, int index, GFxMovieView* movie, GFxVa...
    class Scaleform_IniGet (line 182) | class Scaleform_IniGet : public GFxFunctionHandler
      method Invoke (line 185) | virtual void	Invoke(Args* args)
    class Scaleform_IniGetWithDefaults (line 206) | class Scaleform_IniGetWithDefaults : public GFxFunctionHandler
      method Invoke (line 209) | virtual void	Invoke(Args* args)
    class Scaleform_IniGetBool (line 248) | class Scaleform_IniGetBool : public GFxFunctionHandler
      method Invoke (line 251) | virtual void	Invoke(Args* args)
    class Scaleform_IniGetNumber (line 269) | class Scaleform_IniGetNumber : public GFxFunctionHandler
      method Invoke (line 272) | virtual void	Invoke(Args* args)
    class Scaleform_IniGetString (line 290) | class Scaleform_IniGetString : public GFxFunctionHandler
      method Invoke (line 293) | virtual void	Invoke(Args* args)
    function RegisterScaleformFuncs (line 311) | bool RegisterScaleformFuncs(GFxMovieView* view, GFxValue* plugin) {

FILE: sksevr_plugin/plugin/Settings.h
  function namespace (line 5) | namespace Settings {

FILE: sksevr_plugin/plugin/VRHookAPI.h
  type vr (line 18) | typedef vr::EVRCompositorError (*WaitGetPoses_CB)(VR_ARRAY_COUNT(unRende...
  function class (line 21) | class OpenVRHookManagerAPI
  function OpenVRHookManagerAPI (line 37) | inline OpenVRHookManagerAPI* RequestOpenVRHookManagerObject()

FILE: sksevr_plugin/plugin/guicon.cpp
  function RedirectIOToConsole (line 11) | bool RedirectIOToConsole()

FILE: sksevr_plugin/plugin/lua_glue.cpp
  type lua (line 6) | namespace lua {
    function dll_path (line 7) | std::filesystem::path dll_path() {
    function lua_State (line 28) | lua_State* lua_new_with_libs() {
    function lua_prepend_package_path (line 37) | int lua_prepend_package_path(lua_State* L, const char* path) {
    function lua_State (line 57) | lua_State* lua_new_skyui_state() {
    function lua_pop_to_level (line 76) | void lua_pop_to_level(lua_State* L, int targetLevel) {
    function lua_table_is_array (line 87) | bool lua_table_is_array(lua_State* L, int tableIdx) {
    function lua_print_value (line 119) | void lua_print_value(lua_State* L, int index) {
    function lua_print_value_recursive (line 163) | void lua_print_value_recursive(lua_State* L, int index) {
    function lua_table_get_by_path (line 178) | bool lua_table_get_by_path(lua_State* L, int tableIdx, const char* pat...
    function lua_settings_get_by_path_with_defaults (line 193) | bool lua_settings_get_by_path_with_defaults(lua_State* L, int tableIdx...
    function lua_table_get_bool_by_path (line 209) | bool lua_table_get_bool_by_path(lua_State* L, int tableIdx, const char...
    function lua_table_get_double_by_path (line 219) | double lua_table_get_double_by_path(lua_State* L, int tableIdx, const ...
    function lua_table_get_string_by_path (line 229) | std::string lua_table_get_string_by_path(lua_State* L, int tableIdx, c...

FILE: sksevr_plugin/plugin/lua_glue.h
  function namespace (line 11) | namespace lua {

FILE: sksevr_plugin/plugin/main.cpp
  function WaitForDebugger (line 23) | void WaitForDebugger(bool should_break = false) {
  function SKSEPlugin_Query (line 32) | bool SKSEPlugin_Query(const SKSEInterface * skse, PluginInfo * info) {
  function SKSEPlugin_Load (line 63) | bool SKSEPlugin_Load(const SKSEInterface * skse) {
Condensed preview — 993 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,149K chars).
[
  {
    "path": ".gitignore",
    "chars": 18,
    "preview": "compile-error.txt\n"
  },
  {
    "path": ".gitmodules",
    "chars": 342,
    "preview": "[submodule \"sksevr_plugin/skse\"]\n\tpath = sksevr_plugin/skse\n\turl = git@github.com:Odie/sksevr-mirror.git\n[submodule \"sks"
  },
  {
    "path": "LICENSE",
    "chars": 1068,
    "preview": "MIT License\n\nCopyright (c) 2012 schlangster\n\nPermission is hereby granted, free of charge, to any person obtaining a cop"
  },
  {
    "path": "README.md",
    "chars": 1664,
    "preview": "SkyUI - VR\n----------\n\nThis repository hosts the source and the packaged releases for a working\nversion of SkyUI (and MC"
  },
  {
    "path": "build/.gitignore",
    "chars": 90,
    "preview": "\n*.swf\nfontconfig.txt\n!/fonts_console.swf\n!/fonts_en.swf\n!/gfxfontlib.swf\n!/fontconfig.txt"
  },
  {
    "path": "build/exported/skyui/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "build/exported/widgets/skyui/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "build/skyui/config.txt",
    "chars": 37448,
    "preview": "; =====================================================================================================================\n"
  },
  {
    "path": "dist/.gitignore",
    "chars": 43,
    "preview": "\n*.pex\n*.swf\n*.bak\n*.bsa\n*.bsl\nArchive.log\n"
  },
  {
    "path": "dist/Data/Interface/skyui/config.txt",
    "chars": 37540,
    "preview": "; =====================================================================================================================\n"
  },
  {
    "path": "dist/Data/Readme - SkyUI.txt",
    "chars": 24623,
    "preview": "########################################################################################################################"
  },
  {
    "path": "dist/Data/Scripts/Headers/SKI_ConfigBase.psc",
    "chars": 11654,
    "preview": "scriptname SKI_ConfigBase extends SKI_QuestBase\n\n;######################################################################"
  },
  {
    "path": "dist/Data/Scripts/Headers/SKI_QuestBase.psc",
    "chars": 1457,
    "preview": "scriptname SKI_QuestBase extends Quest hidden\n\n;########################################################################"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_ActiveEffectsWidget.psc",
    "chars": 3889,
    "preview": "scriptname SKI_ActiveEffectsWidget extends SKI_WidgetBase\n\n; SCRIPT VERSION --------------------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_ConfigBase.psc",
    "chars": 32230,
    "preview": "scriptname SKI_ConfigBase extends SKI_QuestBase\n\n; CONSTANTS -----------------------------------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_ConfigManager.psc",
    "chars": 9685,
    "preview": "scriptname SKI_ConfigManager extends SKI_QuestBase hidden \n\n; SCRIPT VERSION -------------------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_ConfigMenu.psc",
    "chars": 60506,
    "preview": "scriptname SKI_ConfigMenu extends SKI_ConfigBase\r\n\r\n; SCRIPT VERSION ---------------------------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_FavoritesManager.psc",
    "chars": 30468,
    "preview": "scriptname SKI_FavoritesManager extends SKI_QuestBase\n\nimport Math\n\n; SCRIPT VERSION -----------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_Main.psc",
    "chars": 10053,
    "preview": "scriptname SKI_Main extends SKI_QuestBase\n\n; CONSTANTS -----------------------------------------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_PlayerInventoryHook.psc",
    "chars": 2674,
    "preview": "scriptname SKI_PlayerInventoryHook extends ReferenceAlias\n\n;; Interface for FormDB\nFunction SetInt(Form form, string fie"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_PlayerLoadGameAlias.psc",
    "chars": 246,
    "preview": "scriptname SKI_PlayerLoadGameAlias extends ReferenceAlias\n\n ; EVENTS ---------------------------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_QF_ConfigManagerInstance.psc",
    "chars": 632,
    "preview": ";BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment\n;NEXT FRAGMENT INDEX 1\nScriptname SKI_QF_Co"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_QuestBase.psc",
    "chars": 1007,
    "preview": "scriptname SKI_QuestBase extends Quest hidden\n\n; -----------------------------------------------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_SettingsManager.psc",
    "chars": 3324,
    "preview": "scriptname SKI_SettingsManager extends SKI_QuestBase  \n\n; CONSTANTS ----------------------------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_WidgetBase.psc",
    "chars": 7472,
    "preview": "scriptname SKI_WidgetBase extends SKI_QuestBase\n\n; CONSTANTS -----------------------------------------------------------"
  },
  {
    "path": "dist/Data/Scripts/Source/SKI_WidgetManager.psc",
    "chars": 4607,
    "preview": "scriptname SKI_WidgetManager extends SKI_QuestBase\n\n; CONSTANTS --------------------------------------------------------"
  },
  {
    "path": "dist/Data/fomod/script.cs",
    "chars": 9470,
    "preview": "\nusing System;\nusing fomm.Scripting;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing"
  },
  {
    "path": "dist/Examples/MCM/ConfigMenuTemplate.psc",
    "chars": 2585,
    "preview": "scriptname MyConfigMenu extends SKI_ConfigBase\n\n; SCRIPT VERSION -------------------------------------------------------"
  },
  {
    "path": "dist/Examples/MCM/ExampleConfigMenu.psc",
    "chars": 7237,
    "preview": "scriptname ExampleConfigMenu extends SKI_ConfigBase\n\n; SCRIPT VERSION --------------------------------------------------"
  },
  {
    "path": "dist/bsascript.txt",
    "chars": 205,
    "preview": "Log: Archive.log\nNew Archive\nCheck: Menus\nCheck: Misc\nCheck: Retain Directory Names\nCheck: Retain File Names\nSet File Gr"
  },
  {
    "path": "dist/filegroup_all.txt",
    "chars": 1979,
    "preview": "Interface\\bartermenu.swf\nInterface\\containermenu.swf\nInterface\\inventorymenu.swf\nInterface\\magicmenu.swf\nInterface\\quest"
  },
  {
    "path": "dist/filegroup_interface.txt",
    "chars": 1143,
    "preview": "Interface\\bartermenu.swf\nInterface\\containermenu.swf\nInterface\\inventorymenu.swf\nInterface\\magicmenu.swf\nInterface\\quest"
  },
  {
    "path": "dist/filegroup_misc.txt",
    "chars": 18,
    "preview": "Readme - SkyUI.txt"
  },
  {
    "path": "dist/filegroup_scripts.txt",
    "chars": 895,
    "preview": "Scripts\\SKI_ActiveEffectsWidget.pex\nScripts\\SKI_ConfigBase.pex\nScripts\\SKI_ConfigManager.pex\nScripts\\SKI_ConfigMenu.pex\n"
  },
  {
    "path": "dist/make_all.pl",
    "chars": 104,
    "preview": "#!/usr/bin/perl\n\nsystem(\"make_scripts.pl\", \"1\") == 0 or die;\nsystem(\"make_archive.pl\", \"1\") == 0 or die;"
  },
  {
    "path": "dist/make_archive.pl",
    "chars": 1828,
    "preview": "#!/usr/bin/perl\n\nuse File::Basename;\nuse File::Copy;\nuse File::Path;\n\nsub error\n{\n\tprint\t\"\\n=========================\\n\\"
  },
  {
    "path": "dist/make_scripts.pl",
    "chars": 1525,
    "preview": "#!/usr/bin/perl\n\nuse File::Basename;\nuse File::Copy;\nuse File::Path;\n\nsub error\n{\n\tprint\t\"\\n=========================\\n\\"
  },
  {
    "path": "misc/ArrowCount/Scripts/Source/PN_ArrowCountWidget.psc",
    "chars": 1408,
    "preview": "scriptname PN_ArrowCountWidget extends SKI_WidgetBase  \n\n; PRIVATE VARIABLES -------------------------------------------"
  },
  {
    "path": "misc/Configs/5760x1080, by Ismelda/skyui.cfg",
    "chars": 26595,
    "preview": "; =====================================================================================================================\n"
  },
  {
    "path": "misc/Configs/5760x2160, by Ismelda/skyui.cfg",
    "chars": 26595,
    "preview": "; =====================================================================================================================\n"
  },
  {
    "path": "misc/Configs/ValueWeight Column/skyui.cfg",
    "chars": 26724,
    "preview": "; =====================================================================================================================\n"
  },
  {
    "path": "misc/Flash Util/SkyUI - make_all.jsfl",
    "chars": 58,
    "preview": "FLfile.runCommandLine(\"skyui_runscript.bat make_all.pl\");"
  },
  {
    "path": "misc/Flash Util/SkyUI - make_archive (fast).jsfl",
    "chars": 64,
    "preview": "FLfile.runCommandLine(\"skyui_runscript.bat make_archive.pl 1\");"
  },
  {
    "path": "misc/Flash Util/SkyUI - make_archive.jsfl",
    "chars": 62,
    "preview": "FLfile.runCommandLine(\"skyui_runscript.bat make_archive.pl\");"
  },
  {
    "path": "misc/Flash Util/build-all.jsfl",
    "chars": 1478,
    "preview": "var srcDir = \"file:///E:/dev/skyui/src/\"\nvar flaFiles = [\n\t\"CraftingMenu/craftingmenu.fla\",\n\t//\"FavoritesMenu/favorites"
  },
  {
    "path": "misc/Flash Util/skyui_runscript.bat",
    "chars": 325,
    "preview": "\n:: Change this path to the location of your the dist/ directory.\n:: Example:\n::\t\tC:\\Users\\MyName\\Projects\\Modding\\SkyUI"
  },
  {
    "path": "misc/PrimaryNeeds/Scripts/Source/PN_FoodEffect.psc",
    "chars": 479,
    "preview": "scriptname PN_FoodEffect extends ActiveMagicEffect  \n\n\n; PROPERTIES ----------------------------------------------------"
  },
  {
    "path": "misc/PrimaryNeeds/Scripts/Source/PN_IconWidget.psc",
    "chars": 2716,
    "preview": "scriptname PN_IconWidget extends SKI_WidgetBase  \n\n; PRIVATE VARIABLES -------------------------------------------------"
  },
  {
    "path": "misc/PrimaryNeeds/Scripts/Source/PN_NeedsManager.psc",
    "chars": 10697,
    "preview": "scriptname PN_NeedsManager extends Quest  \n\n; PRIVATE VARIABLES --------------------------------------------------------"
  },
  {
    "path": "misc/Translations/SkyUI_Translations.txt",
    "chars": 27946,
    "preview": "Language\tEnglish\tFrench\tGerman\tItalian\tSpanish\tCzech\tPolish\tRussian\tJapanese\n$ALL\tALL\tTOUS\tALLE\tTUTTO\tTODO\tVŠECHNO\tWSZYS"
  },
  {
    "path": "misc/Translations/make_translations.pl",
    "chars": 992,
    "preview": "#!/usr/bin/perl\n\nsub error\n{\n\tprint\t\"\\n=========================\\n\\n\"\n\t\t.\t\"ERROR: $_[0]\\n\";\n\tgetc(STDIN);\n\texit(1);\n}\n\nm"
  },
  {
    "path": "misc/cp-built-files",
    "chars": 4022,
    "preview": "#!/usr/bin/env ruby\n\n# This utility copys the newly built files in ../build to the\n# `destination_dir`. It's also possib"
  },
  {
    "path": "misc/decompile-pex",
    "chars": 1163,
    "preview": "#! env ruby\n\ndef toWinPath(wslPath)\n\tcmd = \"wslpath -w '#{wslPath}'\"\n\treturn `#{cmd}`.strip\nend\n\n# This utility decompil"
  },
  {
    "path": "misc/pack-release",
    "chars": 1374,
    "preview": "#!/usr/bin/env ruby\n#\n\nrequire('pathname')\nrequire('fileutils')\nrequire('tmpdir')\n\n\n# Make sure we can find where the fi"
  },
  {
    "path": "misc/rename-png",
    "chars": 1326,
    "preview": "#! env ruby\n\ndef toWinPath(wslPath)\n\tcmd = \"wslpath -w '#{wslPath}'\"\n\treturn `#{cmd}`.strip\nend\n\n# This is a one-off uti"
  },
  {
    "path": "misc/reorder-psc",
    "chars": 4726,
    "preview": "#! env ruby\n\n# Reorder/rewrite the psc file so content is sorted into the same order\n# by entity/construct name.  This i"
  },
  {
    "path": "sksevr_plugin/.editorconfig",
    "chars": 147,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 3\nend_of_line = lf\ntrim_trailing_whitespace = true\ni"
  },
  {
    "path": "sksevr_plugin/.gitignore",
    "chars": 47,
    "preview": "*.user\n*.suo\n\n**/.vs\n\n/Build\nlua-tests/luacov*\n"
  },
  {
    "path": "sksevr_plugin/README.md",
    "chars": 1529,
    "preview": "# Skyrim SKSE plugin example\n\nThis has been adapted from [this example](https://github.com/xanderdunn/skaar/releases/tag"
  },
  {
    "path": "sksevr_plugin/build.ini",
    "chars": 167,
    "preview": "[Paths]\nskyrim=C:\\Program Files (x86)\\Steam\\steamapps\\common\\Skyrim\nmsbuild=C:\\Program Files (x86)\\Microsoft Visual Stud"
  },
  {
    "path": "sksevr_plugin/build.py",
    "chars": 3671,
    "preview": "import configparser\nimport os\nimport shutil\nimport subprocess\nimport sys\n\n\n\ndef search_arguments(needle):\n   found = Fal"
  },
  {
    "path": "sksevr_plugin/lua/MainEntry.lua",
    "chars": 6845,
    "preview": "function file_exists(name)\n    local f=io.open(name,\"r\")\n    if f~=nil then\n        io.close(f)\n        return true\n    "
  },
  {
    "path": "sksevr_plugin/lua/defaults-general.lua",
    "chars": 1274,
    "preview": "Settings = {\n\t-- On a per-menu basis, change the keybind used to activate the search function.\n\t-- We're just using a bu"
  },
  {
    "path": "sksevr_plugin/lua/defaults-knuckles.lua",
    "chars": 361,
    "preview": "Settings = {\n\tBarterMenu = {\n\t\tsearch = {\"thumbstick\", \"clicked\"}\n\t},\n\tContainerMenu = {\n\t\tsearch = {\"thumbstick\", \"clic"
  },
  {
    "path": "sksevr_plugin/lua/defaults-oculus.lua",
    "chars": 433,
    "preview": "Settings = {\n\tBarterMenu = {\n\t\tsearch = {\"leftHand\", \"thumbstick\", \"clicked\"}\n\t},\n\tContainerMenu = {\n\t\tsearch = {\"leftHa"
  },
  {
    "path": "sksevr_plugin/lua/defaults-vive.lua",
    "chars": 407,
    "preview": "Settings = {\n\tBarterMenu = {\n\t\tsearch = {\"touchpad\", \"clicked\", \"bottom\"}\n\t},\n\tContainerMenu = {\n\t\tsearch = {\"touchpad\","
  },
  {
    "path": "sksevr_plugin/lua/defaults-wmr.lua",
    "chars": 397,
    "preview": "Settings = {\n\tBarterMenu = {\n\t\tsearch = {\"application menu\", \"clicked\"}\n\t},\n\tContainerMenu = {\n\t\tsearch = {\"application "
  },
  {
    "path": "sksevr_plugin/lua/inspect.lua",
    "chars": 9542,
    "preview": "local inspect ={\n  _VERSION = 'inspect.lua 3.1.0',\n  _URL     = 'http://github.com/kikito/inspect.lua',\n  _DESCRIPTION ="
  },
  {
    "path": "sksevr_plugin/lua-tests/core_spec.lua",
    "chars": 4456,
    "preview": "require(\"MainEntry\")\n\ndescribe(\"FormDB\", function()\n\tit(\"should be a top level table\", function()\n\t\tassert.truthy(_G[\"Fo"
  },
  {
    "path": "sksevr_plugin/luajit.vcxproj",
    "chars": 8673,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msb"
  },
  {
    "path": "sksevr_plugin/plugin/ControllerStateHook.cpp",
    "chars": 12114,
    "preview": "/* ControllerStateHook\n *\n * Does 2 things:\n * - Hooks into Controller State update calls made by the engine via SkyrimV"
  },
  {
    "path": "sksevr_plugin/plugin/ControllerStateHook.h",
    "chars": 135,
    "preview": "#pragma once\n\nnamespace ControllerStateHook{\n   void Init();\n   bool RegisterScaleformFuncs(GFxMovieView * view, GFxValu"
  },
  {
    "path": "sksevr_plugin/plugin/FormDB.cpp",
    "chars": 11344,
    "preview": "#include <filesystem>\n#include <assert.h>\n\n#include \"FormDB.h\"\n#include \"skse64/GameForms.h\"\n#include \"skse64/ScaleformV"
  },
  {
    "path": "sksevr_plugin/plugin/FormDB.h",
    "chars": 665,
    "preview": "#include \"skse64/PapyrusNativeFunctions.h\"\n#include \"skse64/PluginAPI.h\"\n\n#include \"lua_glue.h\"\n\nextern lua_State* g_lua"
  },
  {
    "path": "sksevr_plugin/plugin/Globals.h",
    "chars": 261,
    "preview": "#pragma once\n#include \"skse64/PluginAPI.h\"\nextern PluginHandle g_pluginHandle;\nextern SKSEPapyrusInterface* g_papyrus;\ne"
  },
  {
    "path": "sksevr_plugin/plugin/Keyboard.cpp",
    "chars": 5501,
    "preview": "#include \"skse64/PluginAPI.h\"\n#include \"skse64/ScaleformValue.h\"\n#include \"skse64/ScaleformMovie.h\"\n#include \"skse64/Sca"
  },
  {
    "path": "sksevr_plugin/plugin/Keyboard.h",
    "chars": 216,
    "preview": "#pragma once\n\n#include \"skse64/PluginAPI.h\"\n\nnamespace Keyboard {\n   void Init();\n   bool RegisterScaleformFuncs(GFxMovi"
  },
  {
    "path": "sksevr_plugin/plugin/PapyrusUIFix.cpp",
    "chars": 5441,
    "preview": "#include \"PapyrusUIFix.h\"\n\n#include \"skse64/GameMenus.h\"\n#include \"skse64/ScaleformCallbacks.h\"\n#include \"skse64/Scalefo"
  },
  {
    "path": "sksevr_plugin/plugin/PapyrusUIFix.h",
    "chars": 134,
    "preview": "#pragma once\n\n#include \"skse64/PapyrusObjects.h\"\n\nnamespace PapyrusUIFix\n{\n   bool RegisterPapyrusFuncs(VMClassRegistry*"
  },
  {
    "path": "sksevr_plugin/plugin/ScaleformExtendedDataFix.cpp",
    "chars": 1116,
    "preview": "\n#include \"ScaleformExtendedDataFix.h\"\n#include \"skse64/ScaleformValue.h\"\n#include \"skse64/ScaleformExtendedData.h\"\n#inc"
  },
  {
    "path": "sksevr_plugin/plugin/ScaleformExtendedDataFix.h",
    "chars": 143,
    "preview": "#pragma once\n\n#include \"skse64/PluginAPI.h\"\n\nnamespace ExtendDataFix{\n   void RegisterScaleformInventoryHooks(SKSEScalef"
  },
  {
    "path": "sksevr_plugin/plugin/Settings.cpp",
    "chars": 9540,
    "preview": "#include <fstream>\n#include <sstream>\n#include <algorithm>\n#include <map>\n#include <vector>\n#include <functional>\n#inclu"
  },
  {
    "path": "sksevr_plugin/plugin/Settings.h",
    "chars": 427,
    "preview": "#pragma once\n\n#include \"skse64/PluginAPI.h\"\n\nnamespace Settings {\n   bool loadLuaConfig(const char* settingFilePath = nu"
  },
  {
    "path": "sksevr_plugin/plugin/VRHookAPI.h",
    "chars": 2218,
    "preview": "/* VRHookAPI.h\n * \n * Part of SkyrimVRTools.\n * Provides ability to register callbacks to get Controller States whenever"
  },
  {
    "path": "sksevr_plugin/plugin/exports.def",
    "chars": 60,
    "preview": "LIBRARY\t\"SkyUI-VR\"\nEXPORTS\nSKSEPlugin_Query\nSKSEPlugin_Load\n"
  },
  {
    "path": "sksevr_plugin/plugin/guicon.cpp",
    "chars": 1722,
    "preview": "#include <windows.h>\n#include <stdio.h>\n#include <fcntl.h>\n#include <io.h>\n#include <iostream>\n#include <fstream>\n\n// ma"
  },
  {
    "path": "sksevr_plugin/plugin/guicon.h",
    "chars": 42,
    "preview": "#pragma once\n\nbool RedirectIOToConsole();\n"
  },
  {
    "path": "sksevr_plugin/plugin/lua_glue.cpp",
    "chars": 7332,
    "preview": "#include \"lua_glue.h\"\n#include <assert.h>\n#include <filesystem>\n#include \"FormDB.h\"\n\nnamespace lua {\n   std::filesystem:"
  },
  {
    "path": "sksevr_plugin/plugin/lua_glue.h",
    "chars": 959,
    "preview": "#pragma once\n#include <filesystem>\n\nextern \"C\" {\n#include <lua.h>\n#include <lualib.h>\n#include <lauxlib.h>\n#include \"lua"
  },
  {
    "path": "sksevr_plugin/plugin/main.cpp",
    "chars": 3827,
    "preview": "#include \"skse64/PluginAPI.h\"             // super\n#include \"skse64_common/skse_version.h\"   // What version of SKSE is "
  },
  {
    "path": "sksevr_plugin/plugin/plugin.vcxproj",
    "chars": 8340,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "sksevr_plugin/plugin/plugin.vcxproj.filters",
    "chars": 1395,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuil"
  },
  {
    "path": "sksevr_plugin/plugin/scripts/ExportPlugin.psc",
    "chars": 70,
    "preview": "ScriptName ExportPlugin Hidden\n\nfloat Function MyTest() global native\n"
  },
  {
    "path": "sksevr_plugin/plugin.sln",
    "chars": 3948,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.3170"
  },
  {
    "path": "sksevr_plugin/tools/run-lua-tests",
    "chars": 137,
    "preview": "#!/usr/bin/bash\n\nSCRIPT_PATH=`dirname \"$(realpath $0)\"`\n\ncd $SCRIPT_PATH/../lua-tests\nbusted --coverage -m \"$SCRIPT_PATH"
  },
  {
    "path": "src/.gitignore",
    "chars": 34,
    "preview": ".flashProjectProperties\n.snippets\n"
  },
  {
    "path": "src/CLIK/Mouse.as",
    "chars": 515,
    "preview": "//****************************************************************************\n// ActionScript Standard Library\n// Mous"
  },
  {
    "path": "src/CLIK/Selection.as",
    "chars": 1340,
    "preview": "//****************************************************************************\n// ActionScript Standard Library\n// Sele"
  },
  {
    "path": "src/CLIK/Stage.as",
    "chars": 805,
    "preview": "//****************************************************************************\n// ActionScript Standard Library\n// Stage"
  },
  {
    "path": "src/CLIK/System/capabilities.as",
    "chars": 2031,
    "preview": "//****************************************************************************\n// ActionScript Standard Library\n// Syst"
  },
  {
    "path": "src/CLIK/gfx/controls/Button.as",
    "chars": 13018,
    "preview": "dynamic class gfx.controls.Button extends gfx.core.UIComponent\n{\n\tvar state: String = \"up\";\n\tvar toggle: Boolean = false"
  },
  {
    "path": "src/CLIK/gfx/controls/ButtonBar.as",
    "chars": 8607,
    "preview": "dynamic class gfx.controls.ButtonBar extends gfx.core.UIComponent\n{\n\tvar _itemRenderer: String = \"Button\";\n\tvar _spacing"
  },
  {
    "path": "src/CLIK/gfx/controls/ButtonGroup.as",
    "chars": 2247,
    "preview": "dynamic class gfx.controls.ButtonGroup extends gfx.events.EventDispatcher\n{\n\tvar name: String = \"buttonGroup\";\n\tvar chil"
  },
  {
    "path": "src/CLIK/gfx/controls/CoreList.as",
    "chars": 7554,
    "preview": "dynamic class gfx.controls.CoreList extends gfx.core.UIComponent\n{\n\tvar soundMap = {theme: \"default\", focusIn: \"focusIn\""
  },
  {
    "path": "src/CLIK/gfx/controls/OptionStepper.as",
    "chars": 5467,
    "preview": "class gfx.controls.OptionStepper extends gfx.core.UIComponent\n{\n\tvar soundMap = {theme: \"default\", focusIn: \"focusIn\", "
  },
  {
    "path": "src/CLIK/gfx/controls/RadioButton.as",
    "chars": 337,
    "preview": "dynamic class gfx.controls.RadioButton extends gfx.controls.Button\n{\n\tvar _group;\n\tvar _name;\n\n\tfunction RadioButton()\n\t"
  },
  {
    "path": "src/CLIK/gfx/controls/ScrollBar.as",
    "chars": 7221,
    "preview": "dynamic class gfx.controls.ScrollBar extends gfx.controls.ScrollIndicator\n{\n\tvar trackScrollPageSize: Number = 1;\n\tvar _"
  },
  {
    "path": "src/CLIK/gfx/controls/ScrollIndicator.as",
    "chars": 5335,
    "preview": "dynamic class gfx.controls.ScrollIndicator extends gfx.core.UIComponent\n{\n\tvar direction: String = \"vertical\";\n\tvar soun"
  },
  {
    "path": "src/CLIK/gfx/controls/ScrollingList.as",
    "chars": 11335,
    "preview": "dynamic class gfx.controls.ScrollingList extends gfx.controls.CoreList\n{\n\tvar wrapping: String = \"normal\";\n\tvar autoRowC"
  },
  {
    "path": "src/CLIK/gfx/controls/Slider.as",
    "chars": 6573,
    "preview": "dynamic class gfx.controls.Slider extends gfx.core.UIComponent\n{\n\tvar liveDragging: Boolean = false;\n\tvar state: String "
  },
  {
    "path": "src/CLIK/gfx/controls/TextArea.as",
    "chars": 6461,
    "preview": "dynamic class gfx.controls.TextArea extends gfx.controls.TextInput\n{\n\tvar soundMap = {theme: \"default\", focusIn: \"focusI"
  },
  {
    "path": "src/CLIK/gfx/controls/TextInput.as",
    "chars": 7109,
    "preview": "dynamic class gfx.controls.TextInput extends gfx.core.UIComponent\n{\n\tvar defaultText: String = \"\";\n\tvar soundMap = {them"
  },
  {
    "path": "src/CLIK/gfx/core/UIComponent.as",
    "chars": 6320,
    "preview": "dynamic class gfx.core.UIComponent extends MovieClip\n{\n\tvar initialized: Boolean = false;\n\tvar enableInitCallback: Boole"
  },
  {
    "path": "src/CLIK/gfx/data/DataProvider.as",
    "chars": 1874,
    "preview": "dynamic class gfx.data.DataProvider extends Array\n{\n\tvar isDataProvider: Boolean = true;\n\tvar cleanUpEvents;\n\tvar dispat"
  },
  {
    "path": "src/CLIK/gfx/events/EventDispatcher.as",
    "chars": 3629,
    "preview": "class gfx.events.EventDispatcher\n{\n\tstatic var _instance;\n\t\n\tvar _listeners;\n\n\tfunction EventDispatcher()\n\t{\n\t}\n\n\tstati"
  },
  {
    "path": "src/CLIK/gfx/io/GameDelegate.as",
    "chars": 1450,
    "preview": "import flash.external.ExternalInterface;\n\nclass gfx.io.GameDelegate\n{\n\tstatic var responseHash = {};\n\tstatic var callBa"
  },
  {
    "path": "src/CLIK/gfx/managers/FocusHandler.as",
    "chars": 5733,
    "preview": "import skyui.util.Debug;\n\ndynamic class gfx.managers.FocusHandler\n{\n\tstatic var _instance = gfx.managers.FocusHandler.in"
  },
  {
    "path": "src/CLIK/gfx/managers/InputDelegate.as",
    "chars": 5685,
    "preview": "/* Class InputDelegate\n *\n * This is where keydown/keyup events are normally passed to the UI.\n * We attach some suppli"
  },
  {
    "path": "src/CLIK/gfx/ui/InputDetails.as",
    "chars": 918,
    "preview": "class gfx.ui.InputDetails\n{\n  /* PROPERTIES */\n  \n\tpublic var code: Number;\n\tpublic var controllerIdx: Number;\n\tpublic "
  },
  {
    "path": "src/CLIK/gfx/ui/NavigationCode.as",
    "chars": 1126,
    "preview": "class gfx.ui.NavigationCode\n{\n\tstatic var UP: String = \"up\";\n\tstatic var DOWN: String = \"down\";\n\tstatic var LEFT: Strin"
  },
  {
    "path": "src/CLIK/gfx/utils/Constraints.as",
    "chars": 3857,
    "preview": "dynamic class gfx.utils.Constraints\n{\n\tstatic var LEFT: Number = 1;\n\tstatic var RIGHT: Number = 2;\n\tstatic var TOP: Numb"
  },
  {
    "path": "src/CLIK/gfx/utils/Locale.as",
    "chars": 129,
    "preview": "dynamic class gfx.utils.Locale\n{\n\n\tfunction Locale()\n\t{\n\t}\n\n\tstatic function getTranslatedString(value)\n\t{\n\t\treturn valu"
  },
  {
    "path": "src/Common/Components/BlinkOnDemandMeter.as",
    "chars": 488,
    "preview": "class Components.BlinkOnDemandMeter extends Components.Meter\n{\n\tvar BlinkMovieClip: MovieClip;\n\tvar meterMovieClip: Mov"
  },
  {
    "path": "src/Common/Components/BlinkOnEmptyMeter.as",
    "chars": 510,
    "preview": "class Components.BlinkOnEmptyMeter extends Components.Meter\n{\n\tvar iCurrentPercent: Number;\n\tvar iEmpty: Number;\n\tvar m"
  },
  {
    "path": "src/Common/Components/CrossPlatformButtons.as",
    "chars": 2601,
    "preview": "// TODO!!! Doesn't look like this file is use at all by skyui.\n// Consider removing this file completely.\n\nimport Shared"
  },
  {
    "path": "src/Common/Components/DeltaMeter.as",
    "chars": 757,
    "preview": "import Shared.GlobalFunc;\n\nclass Components.DeltaMeter extends Components.Meter\n{\n\tvar DeltaEmpty: Number;\n\tvar DeltaFu"
  },
  {
    "path": "src/Common/Components/Meter.as",
    "chars": 2007,
    "preview": "import Shared.GlobalFunc;\n\nclass Components.Meter\n{\n\tvar CurrentPercent: Number;\n\tvar Empty: Number;\n\tvar EmptySpeed: Nu"
  },
  {
    "path": "src/Common/Components/UniformTimeMeter.as",
    "chars": 1408,
    "preview": "import Shared.GlobalFunc;\nimport gfx.io.GameDelegate;\n\nclass Components.UniformTimeMeter extends Components.Meter\n{\n\tva"
  },
  {
    "path": "src/Common/MouseRotationInputCatcher.as",
    "chars": 1081,
    "preview": "class MouseRotationInputCatcher extends MovieClip\n{\n\tstatic var PROCESS_ROTATION_DELAY: Number = 150;\n\t\n\tvar iProcessRo"
  },
  {
    "path": "src/Common/QuantitySlider.as",
    "chars": 929,
    "preview": "import gfx.ui.InputDetails;\nimport gfx.ui.NavigationCode;\nimport Shared.GlobalFunc;\n\nclass QuantitySlider extends gfx.co"
  },
  {
    "path": "src/Common/SaveLoadPanel.as",
    "chars": 10615,
    "preview": "import gfx.events.EventDispatcher;\nimport gfx.io.GameDelegate;\n\nclass SaveLoadPanel extends MovieClip\n{\n\tstatic var SCRE"
  },
  {
    "path": "src/Common/Shared/BSScrollingList.as",
    "chars": 11677,
    "preview": "import Shared.GlobalFunc;\nimport gfx.ui.InputDetails;\nimport gfx.ui.NavigationCode;\nimport gfx.events.EventDispatcher;\n\n"
  },
  {
    "path": "src/Common/Shared/ButtonChange.as",
    "chars": 1287,
    "preview": "import gfx.events.EventDispatcher;\n\nclass Shared.ButtonChange extends gfx.events.EventDispatcher\n{\n\t// Not sure why this"
  },
  {
    "path": "src/Common/Shared/ButtonTextArtHolder.as",
    "chars": 2436,
    "preview": "import gfx.io.GameDelegate;\nimport flash.display.BitmapData;\n\nclass Shared.ButtonTextArtHolder extends MovieClip\n{\n\tvar"
  },
  {
    "path": "src/Common/Shared/CenteredScrollingList.as",
    "chars": 8385,
    "preview": "import Shared.ListFilterer;\n\nclass Shared.CenteredScrollingList extends Shared.BSScrollingList\n{\n\tvar EntriesA: Array;\n"
  },
  {
    "path": "src/Common/Shared/ExtractPlatformText.as",
    "chars": 3329,
    "preview": "class Shared.ExtractPlatformText\n{\n\tfunction ExtractPlatformText()\n\t{\n\t}\n\tstatic function IsWhitespace(str)\n\t{\n\t\treturn "
  },
  {
    "path": "src/Common/Shared/GlobalFunc.as",
    "chars": 7816,
    "preview": "class Shared.GlobalFunc\n{\n\tstatic var RegisteredTextFields: Object = new Object();\n\tstatic var RegisteredMovieClips: Obj"
  },
  {
    "path": "src/Common/Shared/ListFilterer.as",
    "chars": 3060,
    "preview": "import gfx.events.EventDispatcher;\n\nclass Shared.ListFilterer\n{\n\tvar EntryMatchesFunc: Function;\n\tvar _filterArray: Arr"
  },
  {
    "path": "src/Common/Shared/Macros.as",
    "chars": 377,
    "preview": "import gfx.io.GameDelegate;\n\nclass Shared.Macros\n{\n   function Macros()\n   {\n   }\n   static function BSOUTPUT(asMessage)"
  },
  {
    "path": "src/Common/Shared/PlatformChangeUser.as",
    "chars": 526,
    "preview": "import Shared.ButtonChange;\nimport Shared.PlatformChangeUser.PlatformChange;\n\nclass Shared.PlatformChangeUser extends Mo"
  },
  {
    "path": "src/Common/Shared/Platforms.as",
    "chars": 876,
    "preview": "class Shared.Platforms\n{\n   static var CONTROLLER_PC = 0;\n   static var CONTROLLER_PCGAMEPAD = 1;\n   static var CONTROLL"
  },
  {
    "path": "src/Common/mx/transitions/Tween.as",
    "chars": 4877,
    "preview": "class mx.transitions.Tween\n{\n   var obj;\n   var prop;\n   var begin;\n   var useSeconds;\n   var _time;\n   var prevTime;\n  "
  },
  {
    "path": "src/Common/skse.as",
    "chars": 1456,
    "preview": "intrinsic class skse\n{\n\tstatic function Log(a_string:String):Void;\n\tstatic function AllowTextInput(a_flag:Boolean):Void"
  },
  {
    "path": "src/Common/skyui/VRInput.as",
    "chars": 34757,
    "preview": "// The VRInput class is a namespace that holds all functions related\n// to construction, manipulation, transformation of"
  },
  {
    "path": "src/Common/skyui/components/BottomBarMappedButton.as",
    "chars": 2199,
    "preview": "import skyui.components.MappedButton;\nimport skyui.util.GlobalFunctions;\nimport skyui.defines.Screen;\n\n// Specialized v"
  },
  {
    "path": "src/Common/skyui/components/ButtonPanel.as",
    "chars": 2606,
    "preview": "class skyui.components.ButtonPanel extends MovieClip\n{\n  /* PRIVATE VARIABLES */\t\n\t\n\t// Number of buttons that are actu"
  },
  {
    "path": "src/Common/skyui/components/MappedButton.as",
    "chars": 3986,
    "preview": "import Shared.ButtonChange;\nimport gfx.controls.Button;\nimport skyui.defines.Input;\nimport skyui.util.GlobalFunctions;\n"
  },
  {
    "path": "src/Common/skyui/components/MaskedTextArea.as",
    "chars": 4346,
    "preview": "import Shared.GlobalFunc;\n\nimport gfx.core.UIComponent;\nimport gfx.utils.Constraints;\n\nimport TextField.StyleSheet;\n\ncl"
  },
  {
    "path": "src/Common/skyui/components/Meter.as",
    "chars": 11391,
    "preview": "import skyui.util.ColorFunctions;\nimport Shared.GlobalFunc;\nimport flash.geom.Transform;\nimport flash.geom.ColorTransfor"
  },
  {
    "path": "src/Common/skyui/components/SearchWidget.as",
    "chars": 5555,
    "preview": "import flash.utils.Timer;\nimport gfx.events.EventDispatcher;\nimport gfx.managers.FocusHandler;\nimport gfx.ui.Navigation"
  },
  {
    "path": "src/Common/skyui/components/Slider.as",
    "chars": 2156,
    "preview": "import gfx.ui.InputDetails;\nimport gfx.controls.Button;\nimport gfx.utils.Constraints;\nimport gfx.ui.NavigationCode;\n\ncl"
  },
  {
    "path": "src/Common/skyui/components/TabBar.as",
    "chars": 3331,
    "preview": "import gfx.events.EventDispatcher;\n\nimport skyui.filter.ItemSortingFilter;\n\n\nclass skyui.components.TabBar extends Movi"
  },
  {
    "path": "src/Common/skyui/components/colorswatch/ColorSquare.as",
    "chars": 938,
    "preview": "import gfx.controls.Button;\n\nimport flash.geom.ColorTransform;\nimport flash.geom.Transform;\n\nimport skyui.util.ColorFunc"
  },
  {
    "path": "src/Common/skyui/components/colorswatch/ColorSwatch.as",
    "chars": 5349,
    "preview": "import gfx.controls.ButtonGroup;\nimport Shared.GlobalFunc;\nimport gfx.managers.FocusHandler;\nimport gfx.ui.InputDetails"
  },
  {
    "path": "src/Common/skyui/components/dialog/BasicDialog.as",
    "chars": 2591,
    "preview": "import gfx.events.EventDispatcher;\nimport mx.transitions.Tween;\nimport mx.transitions.easing.None;\nimport mx.utils.Dele"
  },
  {
    "path": "src/Common/skyui/components/dialog/ColumnSelectDialog.as",
    "chars": 2853,
    "preview": "import gfx.io.GameDelegate;\nimport gfx.managers.FocusHandler;\nimport gfx.ui.NavigationCode;\nimport gfx.ui.InputDetails;"
  },
  {
    "path": "src/Common/skyui/components/list/BSList.as",
    "chars": 1188,
    "preview": "/*\n *  Basic list API expected by the game.\n */\n\n// @abstract\nclass skyui.components.list.BSList extends MovieClip\n{\n  "
  },
  {
    "path": "src/Common/skyui/components/list/BasicEnumeration.as",
    "chars": 907,
    "preview": "import skyui.components.list.IEntryEnumeration;\n\n\nclass skyui.components.list.BasicEnumeration implements IEntryEnumera"
  },
  {
    "path": "src/Common/skyui/components/list/BasicList.as",
    "chars": 9460,
    "preview": "import gfx.events.EventDispatcher;\nimport gfx.ui.NavigationCode;\nimport Shared.GlobalFunc;\nimport gfx.io.GameDelegate;\n"
  },
  {
    "path": "src/Common/skyui/components/list/BasicListEntry.as",
    "chars": 1614,
    "preview": "import skyui.components.list.BasicList;\nimport skyui.components.list.ListState;\n\n\nclass skyui.components.list.BasicList"
  },
  {
    "path": "src/Common/skyui/components/list/ButtonList.as",
    "chars": 4485,
    "preview": "import gfx.ui.NavigationCode;\nimport Shared.GlobalFunc;\n\nimport skyui.components.list.BasicList;\n\n/*\n *  A simple, gene"
  },
  {
    "path": "src/Common/skyui/components/list/ButtonListEntry.as",
    "chars": 2153,
    "preview": "import skyui.components.list.BasicList;\nimport skyui.components.list.ListState;\nimport skyui.components.list.BasicListE"
  },
  {
    "path": "src/Common/skyui/components/list/ColumnDescriptor.as",
    "chars": 166,
    "preview": "class skyui.components.list.ColumnDescriptor\n{\n\tpublic var identifier: String;\n\tpublic var longName: String;\n\tpublic va"
  },
  {
    "path": "src/Common/skyui/components/list/ColumnLayoutData.as",
    "chars": 1055,
    "preview": "class skyui.components.list.ColumnLayoutData\n{\n\tpublic var type: Number = -1;\n\n\t// Entry  -----------------------------"
  },
  {
    "path": "src/Common/skyui/components/list/EntryClipManager.as",
    "chars": 1512,
    "preview": "import skyui.components.list.BasicList;\nimport skyui.components.list.IEntryClipBuilder;\n\n\nclass skyui.components.list.E"
  },
  {
    "path": "src/Common/skyui/components/list/FilteredEnumeration.as",
    "chars": 1713,
    "preview": "import skyui.filter.IFilter;\nimport skyui.components.list.BasicEnumeration;\n\n\nclass skyui.components.list.FilteredEnume"
  },
  {
    "path": "src/Common/skyui/components/list/IEntryEnumeration.as",
    "chars": 863,
    "preview": "/*\n *  An enumeration of list entries.\n *\n *  This is meant to provide an abstraction over a list of things\n *  so we h"
  },
  {
    "path": "src/Common/skyui/components/list/IListProcessor.as",
    "chars": 141,
    "preview": "import skyui.components.list.BasicList;\n\n\ninterface skyui.components.list.IListProcessor\n{\n\tfunction processList(a_list"
  },
  {
    "path": "src/Common/skyui/components/list/ListLayout.as",
    "chars": 16205,
    "preview": "import gfx.events.EventDispatcher;\n\nimport skyui.components.list.ColumnLayoutData;\nimport skyui.components.list.ColumnD"
  },
  {
    "path": "src/Common/skyui/components/list/ListLayoutManager.as",
    "chars": 1762,
    "preview": "import skyui.util.ConfigManager;\nimport skyui.components.list.ListLayout;\n\nclass skyui.components.list.ListLayoutManage"
  },
  {
    "path": "src/Common/skyui/components/list/ListState.as",
    "chars": 351,
    "preview": "import skyui.components.list.BasicList;\n\n/*\n * Used to dynamically add additional properties to a list that are passed\n"
  },
  {
    "path": "src/Common/skyui/components/list/ScrollingList.as",
    "chars": 10740,
    "preview": "import gfx.events.EventDispatcher;\nimport gfx.ui.NavigationCode;\nimport gfx.ui.InputDetails;\nimport Shared.GlobalFunc;\n"
  },
  {
    "path": "src/Common/skyui/components/list/SortedListHeader.as",
    "chars": 3648,
    "preview": "import gfx.events.EventDispatcher;\n\nimport skyui.components.list.ListLayout;\n\nclass skyui.components.list.SortedListHea"
  },
  {
    "path": "src/Common/skyui/components/list/TabularList.as",
    "chars": 4228,
    "preview": "import Shared.GlobalFunc;\nimport gfx.ui.NavigationCode;\nimport gfx.ui.InputDetails;\n\nimport skyui.defines.Input;\nimport"
  },
  {
    "path": "src/Common/skyui/components/list/TabularListEntry.as",
    "chars": 5343,
    "preview": "import skyui.components.list.TabularList;\nimport skyui.components.list.ListLayout;\nimport skyui.components.list.ListSta"
  },
  {
    "path": "src/Common/skyui/defines/Actor.as",
    "chars": 8417,
    "preview": "class skyui.defines.Actor\n{\n\tpublic static var AV_NONE: Number = 0xFFFFFFFF;\n\t\n\tpublic static var AV_AGGRESSION: Number"
  },
  {
    "path": "src/Common/skyui/defines/Armor.as",
    "chars": 3886,
    "preview": "class skyui.defines.Armor\n{\n\tpublic static var WEIGHT_LIGHT: Number\t\t= 0;\n\tpublic static var WEIGHT_HEAVY: Number\t\t= 1;"
  },
  {
    "path": "src/Common/skyui/defines/ButtonArtNames.as",
    "chars": 7014,
    "preview": "// Provides a mapping from keyname => keycode\n// The keyCodes correspond directly to the animation/timeline frames in Bu"
  },
  {
    "path": "src/Common/skyui/defines/Form.as",
    "chars": 9670,
    "preview": "class skyui.defines.Form\n{\n\tpublic static var TYPE_NONE: Number\t\t\t\t= 0;\n\n\tpublic static var TYPE_EFFECTSETTING: Number\t"
  },
  {
    "path": "src/Common/skyui/defines/Input.as",
    "chars": 2527,
    "preview": "import Shared.Platforms;\nimport skyui.util.Debug;\n\nclass skyui.defines.Input\n{\n\tstatic var DEVICE_KEYBOARD: Number\t= 0;"
  },
  {
    "path": "src/Common/skyui/defines/Inventory.as",
    "chars": 4852,
    "preview": "class skyui.defines.Inventory\n{\n\tpublic static var ICT_NONE: Number\t\t\t\t= 0;\n\tpublic static var ICT_ARMOR: Number\t\t\t\t= 1"
  },
  {
    "path": "src/Common/skyui/defines/Item.as",
    "chars": 3091,
    "preview": "class skyui.defines.Item\n{\n\tpublic static var OTHER: Number\t\t\t\t= undefined;\n\n\tpublic static var POTION_HEALTH: Number\t\t\t"
  },
  {
    "path": "src/Common/skyui/defines/Magic.as",
    "chars": 3445,
    "preview": "class skyui.defines.Magic\n{\n\t// Archetype\n\tpublic static var ARCHETYPE_VALUEMOD: Number = 0;\n\tpublic static var ARCHETY"
  },
  {
    "path": "src/Common/skyui/defines/Material.as",
    "chars": 1946,
    "preview": "class skyui.defines.Material\n{\n\tpublic static var AETHERIUM: Number\t\t\t= 0;\n\tpublic static var ARTIFACT: Number\t\t\t= 1;\n\t"
  },
  {
    "path": "src/Common/skyui/defines/Screen.as",
    "chars": 97,
    "preview": "class skyui.defines.Screen\n{\n\tstatic public var width = 1280;\n\tstatic public var height = 720;\n}\n"
  },
  {
    "path": "src/Common/skyui/defines/Weapon.as",
    "chars": 1863,
    "preview": "class skyui.defines.Weapon\n{\n\tpublic static var ANIM_HANDTOHANDMELEE: Number\t= 0;\n\tpublic static var ANIM_ONEHANDSWORD:"
  },
  {
    "path": "src/Common/skyui/filter/IFilter.as",
    "chars": 128,
    "preview": "interface skyui.filter.IFilter\n{\n\t// Apply filter on the given array\n\tpublic function applyFilter(filteredList: Array):"
  },
  {
    "path": "src/Common/skyui/filter/ItemTypeFilter.as",
    "chars": 2344,
    "preview": "import gfx.events.EventDispatcher;\n\nimport skyui.filter.IFilter;\n\n\nclass skyui.filter.ItemTypeFilter implements IFilter"
  },
  {
    "path": "src/Common/skyui/filter/NameFilter.as",
    "chars": 1868,
    "preview": "import gfx.events.EventDispatcher;\n\nimport skyui.util.GlobalFunctions;\n\n\nclass skyui.filter.NameFilter implements skyui"
  },
  {
    "path": "src/Common/skyui/filter/SortFilter.as",
    "chars": 1743,
    "preview": "import gfx.events.EventDispatcher;\n\nimport skyui.filter.IFilter;\n\n\nclass skyui.filter.SortFilter implements skyui.filte"
  },
  {
    "path": "src/Common/skyui/props/CompoundProperty.as",
    "chars": 2239,
    "preview": "import skyui.props.ItemFilter;\n\n// Combine multiple properties into one property (used for flexible sorting)\nclass skyu"
  },
  {
    "path": "src/Common/skyui/props/ItemFilter.as",
    "chars": 1034,
    "preview": "// For now this is a just a simple associative array of required values\nclass skyui.props.ItemFilter\n{\t\n\tvar reqs:Objec"
  },
  {
    "path": "src/Common/skyui/props/PropertyDataExtender.as",
    "chars": 3395,
    "preview": "import gfx.io.GameDelegate;\n\nimport skyui.components.list.BasicList;\nimport skyui.components.list.IListProcessor;\nimpor"
  },
  {
    "path": "src/Common/skyui/props/PropertyLookup.as",
    "chars": 5717,
    "preview": "import skyui.props.ItemFilter;\n\nclass skyui.props.PropertyLookup\n{\n\tprivate static var dataMemberLimit = 200;\n\tprivate "
  },
  {
    "path": "src/Common/skyui/util/ColorFunctions.as",
    "chars": 6013,
    "preview": "class skyui.util.ColorFunctions\n{\t\n  /* CONSTANTS */\n\tprivate static var RAD_TO_DEG: Number\t\t= 57.295779513082;\n\tprivate"
  },
  {
    "path": "src/Common/skyui/util/ConfigManager.as",
    "chars": 11054,
    "preview": "import flash.utils.*;\nimport gfx.events.EventDispatcher;\n\nimport skyui.components.list.ListLayout;\nimport skyui.util.Gl"
  },
  {
    "path": "src/Common/skyui/util/Debug.as",
    "chars": 5501,
    "preview": "import Date;\n\nclass skyui.util.Debug\n{\n  /* PRIVATE VARIABLES */\n\tprivate static var _buffer: Array = [];\n\n\tprivate sta"
  },
  {
    "path": "src/Common/skyui/util/DialogManager.as",
    "chars": 979,
    "preview": "import gfx.managers.FocusHandler;\nimport gfx.events.EventDispatcher;\nimport skyui.components.dialog.BasicDialog;\n\n\nclas"
  },
  {
    "path": "src/Common/skyui/util/EffectIconMap.as",
    "chars": 12357,
    "preview": "import skyui.defines.Magic;\nimport skyui.defines.Actor;\n\n\nclass skyui.util.EffectIconMap\n{\n\tprivate static var _archety"
  },
  {
    "path": "src/Common/skyui/util/GlobalFunctions.as",
    "chars": 6621,
    "preview": "import skyui.defines.Input;\n\nclass skyui.util.GlobalFunctions\n{\n  /* PUBLIC FUNCTIONS */\n\n\tpublic static function extra"
  }
]

// ... and 793 more files (download for full content)

About this extraction

This page contains the full source code of the Odie/skyui-vr GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 993 files (4.5 MB), approximately 1.2M tokens, and a symbol index with 145 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!