enderalse/source/scripts/ski_configbase.psc

1206 lines
32 KiB
Plaintext

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