enderalse/source/scripts/ski_configmanager.psc

388 lines
9.5 KiB
Plaintext

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