Untitled
unknown
plain_text
3 years ago
56 kB
9
Indexable
Scriptname SSSOConfigMenu extends nl_mcm_module
;=============== PROPERTIES ==========================================;
Actor Property PlayerREF Auto
SSSOConfigMenuHelp property helppage auto
SSSOConfigMenuProfile property profilepage auto
Formlist property SSSO_DoomStoneList auto
Formlist property SSSO_ShrineLIST auto
;=============== UTILITIES ==========================================;
import StringUtil
Import Utility
;=============== VARIABLES ==========================================;
bool _use_standalone_mcm
string[] ASCIITable1
string[] ASCIITable2
string[] HexTable1
string[] HexTable2
String UniqueHash = "notset"
bool RegenIDSuccess = false
string playername
string PlayerNamefromHex = "none"
Int SaveIndex = 1
bool ModEnable = false
bool DisableAutoSave = false
Bool Saveprotection = true
bool MSGSafeSave = true
bool SleepToSave = false
bool StoneToSave = false
bool ShrineToSave = false
int Savedelay = 300
int PreviousSavedelay
Bool RotatingSave = false
bool BypassCheck = false
Int RotatingSaveNb = 10
bool IncludeManualSave = false
bool HardcoreMode = false
bool TrueHeroMode = false
bool allowedtoload = true
bool previousloadstatus = true
int quitdelay = 15
int savekey = 1
bool reset = false
bool keypressed = false
Bool activity = false
bool loading = false
bool Saveperformed = false
float lastsavetimestamp
bool automaticsave = false
bool manualsave = false
bool testsave = false
bool Immersivesave = false
bool debugcheck = false
;=============== EVENTS ==========================================;
event OnInit()
CheckRequirement()
if Game.GetModByName("SMF.esp") == 255 && Game.GetModByName("SMF.esl") == 255
_use_standalone_mcm = True
RegisterModule("Core")
helppage.RegisterModule("Help",101)
profilepage.RegisterModule("Profile",102)
else
RegisterModule("Save System - Core", 1011, "_SMF_ConfigMenuInstance")
helppage.RegisterModule("Save System - Help", 1012, "_SMF_ConfigMenuInstance" )
profilepage.RegisterModule("Save System - Profile",1013, "_SMF_ConfigMenuInstance" )
endif
endevent
event OnGameReload()
loading = true
keypressed = false
CheckRequirement()
if Game.GetModByName("SMF.esp") == 255 && Game.GetModByName("SMF.esl") == 255
if !_use_standalone_mcm
UnregisterAllModules()
_use_standalone_mcm = True
RegisterModule("Core")
helppage.RegisterModule("Help",101)
profilepage.RegisterModule("Profile",102)
endif
else
if _use_standalone_mcm
UnregisterAllModules()
_use_standalone_mcm = False
RegisterModule("Save System - Core", 1011, "_SMF_ConfigMenuInstance")
helppage.RegisterModule("Save - System - Help", 1012, "_SMF_ConfigMenuInstance" )
profilepage.RegisterModule("Save - System - Profile",1013, "_SMF_ConfigMenuInstance" )
endif
endif
Playername = PlayerREF.GetBaseObject().GetName()
if RotatingSave && UniqueHash == "notset" || RotatingSave && !RegenIDSuccess && !BypassCheck
RegenID()
EndIf
grantload()
endevent
event OnPageInit()
if _use_standalone_mcm
SetModName("Save System Overhaul 2")
SetLandingPage("Core")
endif
;Initialize array
ASCIITable1 = new string[109]
ASCIITable2 = new string[108]
HexTable1 = new string[109]
HexTable2 = new string[108]
;create conversion table
HexConvTable()
ModStart()
SetPersistentMCMPreset("persistence/settings")
endevent
event OnConfigOpen()
PreviousSavedelay = Savedelay
UnregisterForAllKeys()
endevent
event OnPageDraw()
Playername = PlayerREF.GetBaseObject().GetName()
;left side
SetCursorFillMode(TOP_TO_BOTTOM)
AddHeaderOption(FONT_PRIMARY("Main Options"))
AddToggleOptionST("ModEnableState", "Enable Mod", ModEnable)
AddToggleOptionST("SaveprotectionState", "Enable Save Protection", Saveprotection)
AddToggleOptionST("DisableAutoSaveState", "Disable Auto Save", DisableAutoSave)
AddToggleOptionST("MSGSafeSaveState", "Enable Safe Save Notification", MSGSafeSave)
AddSliderOptionST("SaveDelayState", "Time Between Saves (In Seconds): ", (savedelay))
AddHeaderOption(FONT_PRIMARY("Immersive Save Options"))
AddToggleOptionST("SleepToSaveState", "Sleep to Save", SleepToSave)
AddToggleOptionST("StoneToSaveState", "Use Standing Stone to Save", StoneToSave)
AddToggleOptionST("ShrineToSaveState", "Use God Shrine to Save", ShrineToSave)
AddKeyMapOptionST("savekeyState", "Manual Save Shortcut", savekey)
; Right side
SetCursorPosition(1)
AddHeaderOption(FONT_PRIMARY("Hardcore Mode"))
AddToggleOptionST("HardcoreModeState", "I'm Not a Milk Drinker", HardcoreMode)
if HardcoreMode
AddToggleOptionST("TrueHeroModeState", "Let Me Be a True Hero", TrueHeroMode)
AddToggleOptionST("ImmersiveSaveState", "Immersive save are always allowed to load", ImmersiveSave)
else
AddToggleOptionST("TrueHeroModeState", "Let Me Be a True Hero", TrueHeroMode, OPTION_FLAG_DISABLED)
AddToggleOptionST("ImmersiveSaveState", "Immersive save are always allowed to load", ImmersiveSave, OPTION_FLAG_DISABLED)
endif
AddSliderOptionST("QuitDelayState", "Delay (in seconds) Before Exit: ", (Quitdelay))
AddHeaderOption(FONT_PRIMARY("Rotating Saves"))
AddToggleOptionST("RotatingSaveState", "Enable Save Rotation", RotatingSave)
AddToggleOptionST("IncludeManualSaveState", "Include Manual Save in Rotation", IncludeManualSave)
AddSliderOptionST("RotatingSaveNbState", "Number of savegames to be preserved: ", (RotatingSaveNb))
AddToggleOptionST("BypassCheckState", "Bypass Name/ID Check: ", (BypassCheck))
AddHeaderOption(FONT_PRIMARY("Information "))
if manualsave
AddParagraph("Manual save performed " + (((Game.GetRealHoursPassed() - lastsavetimestamp) * 60) as int) + " minutes ago")
AddParagraph("Will be allowed to load: " + previousloadstatus)
elseif automaticsave
AddParagraph("Automatic save performed " + (((Game.GetRealHoursPassed() - lastsavetimestamp) * 60) as int) + " minutes ago")
AddParagraph("Will be allowed to load: " + previousloadstatus)
elseif testsave
AddParagraph("test save performed " + (((Game.GetRealHoursPassed() - lastsavetimestamp) * 60) as int) + " minutes ago")
AddParagraph("Will be allowed to load: " + previousloadstatus)
endif
If GetIniBool("bSaveOnPause") || GetIniBool("bSaveOnTravel") || GetIniBool("bSaveOnWait") || GetIniBool("bSaveOnRest")
AddParagraph(FONT_DANGER("Warning!"))
AddParagraph(("Game save system enabled! Check your INI"))
EndIf
AddParagraph(FONT_INFO("Character Name :\n" + playername))
if PlayerNamefromHex != "none" && PlayerNamefromHex != playername && !bypasscheck
AddParagraph("Encoded Character Name read from file:\n" + PlayerNamefromHex,FONT_INFO())
AddParagraph("Names mismatch, check your id or enable check bypass at your own risk",FONT_DANGER())
elseif PlayerNamefromHex == playername
AddParagraph("Encoded character name successfully checked",FONT_INFO())
elseif bypasscheck
AddParagraph("Encoded character name check disabled",FONT_DANGER())
endif
AddHeaderOption(FONT_PRIMARY("Maintenance"))
AddTextOptionST("ReGeneratePlayerIDState", "", FONT_WARNING("Regenerate Player ID"))
AddTextOptionST("GenerateTestSaveState", "", FONT_WARNING("Generate testing save"))
AddToggleOptionST("DebugCheckState", "Enable Debug Notification", DebugCheck)
endevent
event OnVersionUpdate(int a_version)
if CurrentVersion < 111 && a_version >= 111
SleepToSave = false
endif
if CurrentVersion < 113 && a_version >= 113
Saveperformed = false
endif
if CurrentVersion < 114 && a_version >= 114
StoneToSave = false
ShrineToSave = false
endif
if CurrentVersion < 115 && a_version >= 115
DisableAutoSave = false
ImmersiveSave = false
endif
Debug.Notification("Save System Overhaul 2 updating MCM Version " + Substring((a_version * 0.01) as string, 0, 4))
endevent
event OnConfigClose()
If PlayerUpdatedOptions
if modenable
if PreviousSavedelay != Savedelay
UnregisterForUpdate()
RegisterForSingleUpdate(savedelay)
endif
UnregisterForAllKeys()
if savekey != 1
RegisterForKey(savekey)
endif
if HardcoreMode
allowedtoload = false
else
allowedtoload = true
endif
if SleepToSave
RegisterForSleep()
else
UnRegisterForSleep()
endif
if StoneToSave || ShrineToSave
RegisterForControl("Activate")
elseif !ShrineToSave && !StoneToSave
UnregisterForAllControls()
endif
else
UnregisterForUpdate()
UnregisterForAllKeys()
UnregisterForAllControls()
endif
endif
endevent
;mod event
Event OnKeyUp(Int KeyCode, Float HoldTime)
if !keypressed
if MSGSafeSave
Debug.Notification("Save Request...")
endif
keypressed = true
UnregisterForUpdate()
GenerateSave(false)
endif
endEvent
Event OnControlUp(string control, float HoldTime)
If control == "Activate" && HoldTime >= 3.0
If StoneToSave
If Game.FindClosestReferenceOfAnyTypeInListFromRef(SSSO_DoomStoneList, PlayerRef, 350.0)
if Immersivesave
keypressed = true
endIf
GenerateSave(true)
EndIf
EndIf
If ShrineToSave
If Game.FindClosestReferenceOfAnyTypeInListFromRef(SSSO_ShrineLIST, PlayerRef, 350.0)
if Immersivesave
keypressed = true
endIf
GenerateSave(true)
EndIf
EndIf
EndIf
EndEvent
Event OnSleepStop(bool abInterrupted)
if !abInterrupted
UnregisterForUpdate()
GenerateSave(true)
endIf
endEvent
event onupdate()
If ModEnable && !Saveperformed && !DisableAutoSave
GenerateSave(true)
else
Saveperformed = false
if HardcoreMode
allowedtoload = false
endif
RegisterForSingleUpdate(savedelay - 10)
endif
EndEvent
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
activity = true
EndEvent
;=============== STATES ==========================================;
;main mode option
State ModEnableState
event OnHighlightST(string state_id)
SetInfoText("Enable / Disable save management")
endevent
event OnSelectST(string state_id)
ModEnable = !ModEnable
SetToggleOptionValueST(ModEnable, false, "ModEnableState")
endevent
EndState
State SaveprotectionState
event OnHighlightST(string state_id)
SetInfoText("Enable / Disable safe check before saving")
endevent
event OnSelectST(string state_id)
Saveprotection = !Saveprotection
SetToggleOptionValueST(Saveprotection, false, "SaveprotectionState")
endevent
EndState
State DisableAutoSaveState
event OnHighlightST(string state_id)
SetInfoText("Enable / Disable safe check before saving")
endevent
event OnSelectST(string state_id)
DisableAutoSave = !DisableAutoSave
SetToggleOptionValueST(DisableAutoSave, false, "DisableAutoSaveState")
endevent
EndState
State MSGSafeSaveState
event OnHighlightST(string state_id)
SetInfoText("Enable / Disable safe save notificaiton")
endevent
event OnSelectST(string state_id)
MSGSafeSave = !MSGSafeSave
SetToggleOptionValueST(MSGSafeSave, false, "MSGSafeSaveState")
endevent
EndState
state SaveDelayState
event OnDefaultST(string state_id)
savedelay = 300
endevent
event OnSliderOpenST(string state_id)
SetSliderDialog(savedelay, 30.0, 1200.0, 60.0, 600)
endevent
event OnSliderAcceptST(string state_id, float f)
savedelay = f as int
SetSliderOptionValueST(f)
endevent
endstate
State SleepToSaveState
event OnHighlightST(string state_id)
SetInfoText("A save will be made at wake-up (not interrupted)")
endevent
event OnSelectST(string state_id)
SleepToSave = !SleepToSave
SetToggleOptionValueST(SleepToSave, false, "SleepToSaveState")
endevent
EndState
State StoneToSaveState
event OnHighlightST(string state_id)
SetInfoText("Pray at Standing Stone to save (Stand near and hold 'Activate' 3 secs)")
endevent
event OnSelectST(string state_id)
StoneToSave = !StoneToSave
SetToggleOptionValueST(StoneToSave, false, "StoneToSaveState")
endevent
EndState
State ShrineToSaveState
event OnHighlightST(string state_id)
SetInfoText("Pray Gods to save (Stand near and hold 'Activate' 3 secs)")
endevent
event OnSelectST(string state_id)
ShrineToSave = !ShrineToSave
SetToggleOptionValueST(ShrineToSave, false, "ShrineToSaveState")
endevent
EndState
state savekeyState
event OnDefaultST(string state_id)
savekey = 1
endevent
event OnHighlightST(string state_id)
SetInfoText("Use this key to save instead of using game save system, if hardcore mode is enabled, game will exit after save complete.")
endevent
event OnKeyMapChangeST(string state_id, int keycode)
savekey = keycode
SetKeyMapOptionValueST(keycode)
endevent
endstate
;rotating save
State RotatingSaveState
event OnHighlightST(string state_id)
SetInfoText("Enable / Disable rotating save system. Before enabling, don't forget to follow instruction from mod description page")
endevent
event OnSelectST(string state_id)
RotatingSave = !RotatingSave
if RotatingSave
RegenID()
if !RegenIDSuccess && !BypassCheck
RotatingSave = false
debug.messagebox("ID Check fail - rotating save disabled" )
endif
elseif RotatingSave && BypassCheck
RegenID()
endif
SetToggleOptionValueST(RotatingSave, false, "RotatingSaveState")
endevent
EndState
State IncludeManualSaveState
event OnHighlightST(string state_id)
SetInfoText("Save performed by pressing the shortcut will use a slot.")
endevent
event OnSelectST(string state_id)
IncludeManualSave = !IncludeManualSave
SetToggleOptionValueST(IncludeManualSave, false, "IncludeManualSaveState")
endevent
EndState
State BypassCheckState
event OnHighlightST(string state_id)
SetInfoText("Bypass name check, use if system fail to confirm your character name or if you use a non latin set.")
endevent
event OnSelectST(string state_id)
BypassCheck = !BypassCheck
SetToggleOptionValueST(BypassCheck, false, "BypassCheckState")
if BypassCheck
RegenID()
endif
endevent
EndState
state RotatingSaveNbState
event OnDefaultST(string state_id)
RotatingSaveNb = 10
endevent
event OnSliderOpenST(string state_id)
SetSliderDialog(RotatingSaveNb, 5.0, 20.0, 1.0, 10)
endevent
event OnSliderAcceptST(string state_id, float f)
RotatingSavenb = f as int
SetSliderOptionValueST(f)
endevent
endstate
;hardcore mode
State HardcoreModeState
event OnHighlightST(string state_id)
SetInfoText("Enable I'm Not a Milk Drinker mode, check help for more explanation")
endevent
event OnSelectST(string state_id)
HardcoreMode = !HardcoreMode
SetToggleOptionValueST(HardcoreMode, true, "HardcoreModeState")
if HardCoreMode
allowedtoload = false
SetOptionFlagsST(OPTION_FLAG_NONE, true, "TrueHeroModeState")
SetOptionFlagsST(OPTION_FLAG_NONE, false, "ImmersiveSaveState")
else
allowedtoload = true
SetOptionFlagsST(OPTION_FLAG_DISABLED, true, "TrueHeroModeState")
SetOptionFlagsST(OPTION_FLAG_DISABLED, true, "ImmersiveSaveState")
TrueHeroMode = false
ImmersiveSave = false
SetToggleOptionValueST(TrueHeroMode, true, "TrueHeroModeState")
SetToggleOptionValueST(ImmersiveSave, false, "ImmersiveSaveState")
endif
endevent
EndState
State TrueHeroModeState
event OnHighlightST(string state_id)
SetInfoText("Enable Let Me Be a True Hero mode, check help for more explanation")
endevent
event OnSelectST(string state_id)
TrueHeroMode = !TrueHeroMode
SetToggleOptionValueST(TrueHeroMode, false, "TrueHeroModeState")
endevent
EndState
State ImmersiveSaveState
event OnHighlightST(string state_id)
SetInfoText("Immersive save are not marked and can be load without using Safety Net")
endevent
event OnSelectST(string state_id)
ImmersiveSave = !ImmersiveSave
SetToggleOptionValueST(ImmersiveSave, false, "ImmersiveSaveState")
endevent
EndState
state QuitdelayState
event OnDefaultST(string state_id)
Quitdelay = 15
endevent
event OnSliderOpenST(string state_id)
SetSliderDialog(Quitdelay, 10.0, 60.0, 1.0, 15)
endevent
event OnHighlightST(string state_id)
SetInfoText("Raise it if game quit when you reload a manual save")
endevent
event OnSliderAcceptST(string state_id, float f)
Quitdelay = f as int
SetSliderOptionValueST(f)
endevent
endstate
state ReGeneratePlayerIDState
event OnSelectST(string state_id)
RegenID()
endevent
event OnHighlightST(string state_id)
SetInfoText("Regenerate Player Unique ID - use at your own risk")
endEvent
endstate
state GenerateTestSaveState
event OnSelectST(string state_id)
Debug.trace("--------SSSO: Test save")
;Closing MCM
CloseMCM(close_journal = true)
GenerateSave(false,true)
endevent
event OnHighlightST(string state_id)
SetInfoText("Generate save, use only for debug")
endEvent
endstate
state SetUniqueHashState
event OnHighlightST(string state_id)
SetInfoText("Refers to description page to fill this properly")
endevent
event OnInputOpenST(string state_id)
SetInputDialogStartText(UniqueHash)
endevent
event OnInputAcceptST(string state_id, string str)
UniqueHash = str
endevent
endstate
State DebugCheckState
event OnHighlightST(string state_id)
SetInfoText("Enable may debug messages")
endevent
event OnSelectST(string state_id)
DebugCheck = !DebugCheck
SetToggleOptionValueST(DebugCheck, false, "DebugCheckState")
endevent
EndState
;=============== FUNCTIONS ==========================================;
int function GetVersion()
return 115
endfunction
function CheckRequirement()
int nl_mcm_version = nl_mcm_globalinfo.CurrentVersion()
if nl_mcm_version < 109
Debug.messagebox("Your NL_MCM version ("+ nl_mcm_version + ") is outdated, Install last version !")
return
EndIf
if !jcontainers.isInstalled()
AddTextOptionST("preset_jcontainers", FONT_INFO("JContainers is not installed"), "", 0)
Debug.messagebox("JContainer is missing, Install last version !")
endif
endfunction
function ModStart()
reset = true
If ModEnable
If !(GetIniBool("bSaveOnPause") || GetIniBool("bSaveOnTravel") || GetIniBool("bSaveOnWait") || GetIniBool("bSaveOnRest"))
SetIniBool("bDisableAutoSave:SaveGame", True)
EndIf
if HardcoreMode
allowedtoload = false
else
allowedtoload = true
endif
UnregisterForUpdate()
Saveperformed = false
RegisterForSingleUpdate(savedelay)
UnregisterForAllKeys()
if savekey != 1
RegisterForKey(savekey)
endif
if HardcoreMode
allowedtoload = false
endif
if SleepToSave
RegisterForSleep()
else
UnRegisterForSleep()
endif
if StoneToSave || ShrineToSave
RegisterForControl("Activate")
elseif !ShrineToSave && !StoneToSave
UnregisterForAllControls()
endif
EndIf
endfunction
function grantload()
if quitdelay < 10
quitdelay = 10
endif
if debugcheck
debug.messagebox("Save Allowed to load " + allowedtoload)
else
debug.trace("--------SSSO: Allowedtoload variable status =" + allowedtoload)
endif
if !allowedtoload && Game.GetModByName("IAmaMilkDrinker.esp") != 255
debug.messagebox("Plugin detected - new save allowed to load will be generated soon, don't move")
wait(20)
debug.notification("Wait a little bit, Milk drinker!")
wait(20)
keypressed = true
debug.messagebox("Milk Drinker, game will shutdown - don't forget to disable milkdrinker.esp plugin")
wait(0.1)
GenerateSave(false)
wait(quitdelay)
if Game.GetModByName("IAmaMilkDrinker.esp") != 255
debug.trace("--------SSSO: Unauthorised savegame loaded, Bypass Plugin detected, loading granted, new authorised savegame generated, game exit now!")
if debugcheck
debug.messagebox("should quit!")
else
Debug.QuitGame()
endif
endif
elseif !allowedtoload
debug.messagebox("Embrass your Milk Drinker nature and activate the plugin to be allowed to load this save.")
wait(0.1)
debug.messagebox("Game will shut down")
wait(0.1)
debug.trace("--------SSSO: Unauthorised savegame loaded, Bypass Plugin not detected, game exit now!")
if debugcheck
debug.messagebox("should quit!")
else
Debug.QuitGame()
endif
elseif allowedtoload && Game.GetModByName("IAmaMilkDrinker.esp") != 255
debug.messagebox("Plugin detected - please disable milkdrinker.esp")
wait(0.1)
debug.messagebox("Game will shut down")
wait(0.1)
debug.trace("--------SSSO: Authorised savegame loaded, Bypass Plugin detected, error, game exit now!")
if debugcheck
debug.messagebox("should quit!")
else
Debug.QuitGame()
endif
endif
ModStart()
endfunction
function SafeCheck()
if debugcheck
debug.notification("Safe Script started")
endif
reset = false ; if this becomes true later, it means the game was loaded while the loop was running in which case it needs to break so that it's properly restarted by the event
Int attempt = 0
Int combatwait = 0
Cell previouscell = None
Int saveready = 0
While saveready < 2
previouscell = PlayerRef.GetParentCell()
Wait(2 - saveready)
If reset || !ModEnable ; if the user has manually set the Interval to less than 10 seconds (or uninstalled the mod!), this will stop the script
Return
EndIf
If !PlayerRef.IsInCombat()
combatwait = attempt ; restart for the next combat
Else
Wait(2) ; some additional wait because we're not particularly interested in saving during combat
EndIf
If (PlayerRef.IsInCombat() && attempt < combatwait + 20) \
|| PlayerRef.GetAnimationVariableFloat("Speed") > 400 * attempt * attempt / (attempt * attempt + 3000 + 3000 * PlayerRef.IsInCombat() as Int) \
|| (PlayerRef.GetAnimationVariableBool("IsAttacking") || PlayerRef.GetAnimationVariableInt("iState") == 10 || PlayerRef.GetAnimationVariableInt("iWantBlock") || PlayerRef.GetAnimationVariableBool("bInJumpState") || PlayerRef.GetAnimationVariableBool("IsShouting")) \
|| ((Game.GetCameraState() && Game.GetCameraState() < 9 || Game.GetCameraState() == 11) || (PlayerRef.GetAnimationVariableBool("bAnimationDriven") && !Game.IsCamSwitchControlsEnabled()) || PlayerRef.GetAnimationVariableBool("bIsSynced") || PlayerRef.GetAnimationVariableBool("IsEquipping") || PlayerRef.GetAnimationVariableBool("IsUnequipping")) \
|| UI.IsMenuOpen("Dialogue Menu") \
|| PlayerRef.GetParentCell() != previouscell \
|| activity
; DO NOT SAVE WHILE in the first minute of combat since most combat CTDs usually happen in the first seconds where modded effects start applying
; or while walking, even if slowly -- especially during combat, relaxing the condition as time goes by; saving while running is generally unsafe due to the changes it causes, but at some point "generally unsafe" becomes more safe than not saving at all
; or blocking, bashing, jumping etc; it's generally safe to save during such events but its really annoying to autosave while the player is drawing their bow (iWantBlock checks all block states including bashing; iState is 10 when casting)
; or cutting firewood, using a crafting menu, attempting to sit but not while actually sitting, bleeding, playing music and similar animations (bIsSynced is true when mounting/unmounting a horse or standing up from a chair); a save cannot be performed in such conditions and we would only reset our timer, thus creating large time gaps
; or during dialogue for the same reason as above
; or we were in a different cell a few seconds ago; autosaves performed during cell transitions are risky
; or the player was hit (the activity boolean may be used for more purposes in new versions)
saveready = 0
attempt += 1
activity = false
Else
saveready += 1
EndIf
EndWhile
if debugcheck
debug.notification("Safe Script end")
endif
endfunction
function GenerateSave(bool autosave, bool special = false)
loading = false
Saveperformed = true
;debug
if debugcheck
debug.trace("-------------SSSO Generate save -------------")
debug.trace("loading " + loading)
debug.trace("special " + special)
debug.trace("autosave " + autosave)
debug.trace("keypressed " + keypressed)
debug.trace("allowedtoload " + allowedtoload)
debug.trace("HardcoreMode " + HardcoreMode)
debug.trace("TrueHeroMode " + TrueHeroMode)
endif
UnregisterForAllKeys()
if Saveprotection
SafeCheck()
endif
if special && TrueHeroMode
debug.trace("--------SSSO: Test save in TrueHero mode - not allowed to load")
allowedtoload = false
manualsave = false
automaticsave = false
testsave = true
elseif special
debug.trace("--------SSSO: Test save - allowed to load")
allowedtoload = true
manualsave = false
automaticsave = false
testsave = true
elseif keypressed && autosave
debug.trace("--------SSSO: Immersive Save - allowed to load")
allowedtoload = true
manualsave = true
automaticsave = false
testsave = false
keypressed = false
elseif keypressed
debug.trace("--------SSSO: Save by pressing key - allowed to load")
allowedtoload = true
manualsave = true
automaticsave = false
testsave = false
elseif !HardcoreMode
debug.trace("--------SSSO: Save with hardcore mode disabled - allowed to load")
manualsave = false
automaticsave = true
allowedtoload = true
testsave = false
elseif HardcoreMode && TrueHeroMode && autosave
debug.trace("--------SSSO: Save auto in TrueHero mode - not allowed to load")
manualsave = false
automaticsave = true
allowedtoload = false
testsave = false
elseif HardcoreMode && autosave
debug.trace("--------SSSO: Save auto hardcore mode - allowed to load")
manualsave = false
automaticsave = true
allowedtoload = true
testsave = false
elseif HardcoreMode ; maybe useless as save are performed only with auto or keypress
debug.trace("--------SSSO: Save in hardcore mode - not allowed to load")
manualsave = false
automaticsave = true
allowedtoload = false
testsave = false
endif
lastsavetimestamp = (Game.GetRealHoursPassed())
previousloadstatus = allowedtoload
if debugcheck
debug.trace("--------SSSO: Allowed to load: " + allowedtoload)
endif
if RotatingSave && autosave || RotatingSave && IncludeManualSave
if Saveindex > RotatingSavenb
Saveindex = 1
endif
;Building save name
string savename = ("Save" + SaveIndex + "_"+ UniqueHash +"_Rotate_0000" + SaveIndex + "_20220621142000_1_1")
Debug.trace("--------SSSO: Game will be saved under: " + savename)
if MSGSafeSave && !autosave
Debug.Notification("Manual SafeSaving...")
elseif MSGSafeSave && autosave
Debug.Notification("Auto SafeSaving...")
endif
if keypressed && HardcoreMode && !autosave
debug.messagebox("You have chosen to return to the real world... Wait until the game quits completely, your progress will be saved.")
wait(0.1)
endif
;increasing index
SaveIndex += 1
game.savegame(savename)
else
if keypressed && HardcoreMode && !autosave
debug.messagebox("You have chosen to return to the real world... Wait until the game quits completely, your progress will be saved.")
wait(0.1)
endif
Game.RequestSave()
endif
if keypressed && HardcoreMode && !autosave
if quitdelay < 10
quitdelay = 10
endif
wait(quitdelay)
endif
if debugcheck
debug.trace("-------------SSSO boot check -------------")
debug.trace("loading " + loading)
debug.trace("special " + special)
debug.trace("autosave " + autosave)
debug.trace("keypressed " + keypressed)
debug.trace("allowedtoload " + allowedtoload)
debug.trace("HardcoreMode " + HardcoreMode)
debug.trace("TrueHeroMode " + TrueHeroMode)
endif
if !loading
if keypressed && HardcoreMode && !autosave
if debugcheck
debug.messagebox("should quit!")
keypressed = false
else
debug.notification("Bye bye")
debug.trace("--------SSSO: Hardcore mode enabled, Manual Save issued, game exit now!")
wait(1)
Debug.QuitGame()
endif
return
endif
reset = true
UnregisterForAllKeys()
if keypressed
Wait(10) ; prevent too frequent use of expedited saves (this won't be triggered by MCM changes)
endif
if savekey != 1
RegisterForKey(savekey)
endif
endif
keypressed = false
RegisterForSingleUpdate(10)
endfunction
function RegenID()
parseIDConfig()
String UniqueHashTemp = SetID()
debug.trace("============= SSSO Player ID ReGeneration start =============")
if BypassCheck
UniqueHash = UniqueHashTemp
RegenIDSuccess = true
else
debug.trace("Unique profile hash is :" + UniqueHashTemp)
int Hexnamestart = (Find(UniqueHashTemp,"_", (Find(UniqueHashTemp,"_") + 1)) +1)
String hexname = Substring(UniqueHashTemp,Hexnamestart)
debug.trace("Player Hexname is :" + hexname)
PlayerNamefromHex = convertHextoASCII(Hexname)
debug.trace("Player name from Hex is :" + PlayerNamefromHex)
If Playername == PlayerNamefromHex
debug.trace("Names Match - UniqueHash Updated")
UniqueHash = UniqueHashTemp
RegenIDSuccess = true
Else
debug.trace("Names Mismatch - Abort")
RegenIDSuccess = false
EndIf
endif
ForcePageReset()
debug.trace("============= SSSO Player ID ReGeneration stop =============")
endfunction
string function SetID()
return JDB.solveStr(".ProfileID.information" + ".ID")
endfunction
function parseIDConfig()
int config
if BypassCheck
config = JValue.readFromFile("Data/SSSOConf/bypass.txt")
else
config = JValue.readFromFile("Data/SSSOConf/" + Playername + ".txt")
endif
JDB.setObj("ProfileID", config)
endfunction
string function convertHextoASCII(string Hexname)
Int iHex = GetLength(Hexname)
Int i = 0
String name
while i < iHex
string Hex= GetNthChar(Hexname,(i)) + GetNthChar(Hexname,i + 1)
Int table = 1
Int index = ArrayHasString(HexTable1,Hex)
if index == -1
table = 2
index = ArrayHasString(HexTable2,Hex)
EndIf
If table == 1
name = name + ASCIITable1[index]
else
name = name + ASCIITable2[index]
EndIf
i +=2
endwhile
return name
endfunction
int function ArrayHasString(String[] akMyArray, String asMyString) global
int i = 0
while i < akMyArray.Length
if akMyArray[i] == asMyString
return i
else
i += 1
endif
endWhile
return -1
endFunction
function HexConvTable()
;Fill ASCII Caracther Array
ASCIITable1[0]=" " ;Space
ASCIITable1[1]="!" ;Exclamation mark
ASCIITable1[2]="\"" ;Double quote
ASCIITable1[3]="#" ;Number
ASCIITable1[4]="$" ;Dollar
ASCIITable1[5]="%" ;Percent
ASCIITable1[6]="&" ;Ampersand
ASCIITable1[7]="'" ;Single quote
ASCIITable1[8]="(" ;Left parenthesis
ASCIITable1[9]=")" ;Right parenthesis
ASCIITable1[10]="*" ;Asterisk
ASCIITable1[11]="+" ;Plus
ASCIITable1[12]="," ;Comma
ASCIITable1[13]="-" ;Minus
ASCIITable1[14]="." ;Period
ASCIITable1[15]="/" ;Slash
ASCIITable1[16]="0" ;Zero
ASCIITable1[17]="1" ;One
ASCIITable1[18]="2" ;Two
ASCIITable1[19]="3" ;Three
ASCIITable1[20]="4" ;Four
ASCIITable1[21]="5" ;Five
ASCIITable1[22]="6" ;Six
ASCIITable1[23]="7" ;Seven
ASCIITable1[24]="8" ;Eight
ASCIITable1[25]="9" ;Nine
ASCIITable1[26]=":" ;Colon
ASCIITable1[27]=";" ;Semicolon
ASCIITable1[28]="<" ;Less than
ASCIITable1[29]="=" ;Equal sign
ASCIITable1[30]=">" ;Greater than
ASCIITable1[31]="?" ;Question mark
ASCIITable1[32]="@" ;At sign
ASCIITable1[33]="A" ;Uppercase A
ASCIITable1[34]="B" ;Uppercase B
ASCIITable1[35]="C" ;Uppercase C
ASCIITable1[36]="D" ;Uppercase D
ASCIITable1[37]="E" ;Uppercase E
ASCIITable1[38]="F" ;Uppercase F
ASCIITable1[39]="G" ;Uppercase G
ASCIITable1[40]="H" ;Uppercase H
ASCIITable1[41]="I" ;Uppercase I
ASCIITable1[42]="J" ;Uppercase J
ASCIITable1[43]="K" ;Uppercase K
ASCIITable1[44]="L" ;Uppercase L
ASCIITable1[45]="M" ;Uppercase M
ASCIITable1[46]="N" ;Uppercase N
ASCIITable1[47]="O" ;Uppercase O
ASCIITable1[48]="P" ;Uppercase P
ASCIITable1[49]="Q" ;Uppercase Q
ASCIITable1[50]="R" ;Uppercase R
ASCIITable1[51]="S" ;Uppercase S
ASCIITable1[52]="T" ;Uppercase T
ASCIITable1[53]="U" ;Uppercase U
ASCIITable1[54]="V" ;Uppercase V
ASCIITable1[55]="W" ;Uppercase W
ASCIITable1[56]="X" ;Uppercase X
ASCIITable1[57]="Y" ;Uppercase Y
ASCIITable1[58]="Z" ;Uppercase Z
ASCIITable1[59]="[" ;Left square bracket
ASCIITable1[60]="\\" ;backslash
ASCIITable1[61]="]" ;Right square bracket
ASCIITable1[62]="^" ;Caret / circumflex
ASCIITable1[63]="_" ;Underscore
ASCIITable1[64]="`" ;Grave / accent
ASCIITable1[65]="a" ;Lowercase a
ASCIITable1[66]="b" ;Lowercase b
ASCIITable1[67]="c" ;Lowercase c
ASCIITable1[68]="d" ;Lowercase d
ASCIITable1[69]="e" ;Lowercase e
ASCIITable1[70]="f" ;Lowercase
ASCIITable1[71]="g" ;Lowercase g
ASCIITable1[72]="h" ;Lowercase h
ASCIITable1[73]="i" ;Lowercase i
ASCIITable1[74]="j" ;Lowercase j
ASCIITable1[75]="k" ;Lowercase k
ASCIITable1[76]="l" ;Lowercase l
ASCIITable1[77]="m" ;Lowercase m
ASCIITable1[78]="n" ;Lowercase n
ASCIITable1[79]="o" ;Lowercase o
ASCIITable1[80]="p" ;Lowercase p
ASCIITable1[81]="q" ;Lowercase q
ASCIITable1[82]="r" ;Lowercase r
ASCIITable1[83]="s" ;Lowercase s
ASCIITable1[84]="t" ;Lowercase t
ASCIITable1[85]="u" ;Lowercase u
ASCIITable1[86]="v" ;Lowercase v
ASCIITable1[87]="w" ;Lowercase w
ASCIITable1[88]="x" ;Lowercase x
ASCIITable1[89]="y" ;Lowercase y
ASCIITable1[90]="z" ;Lowercase z
ASCIITable1[91]="{" ;Left curly bracket
ASCIITable1[92]="|" ;Vertical bar
ASCIITable1[93]="}" ;Right curly bracket
ASCIITable1[94]="~" ;Tilde
ASCIITable1[96]="€" ;Euro sign
ASCIITable1[97]="‚" ;Single low-9 quotation mark
ASCIITable1[98]="ƒ" ;Latin small letter f with hook
ASCIITable1[99]="„" ;Double low-9 quotation mark
ASCIITable1[100]="…" ;Horizontal ellipsis
ASCIITable1[101]="†" ;Dagger
ASCIITable1[102]="‡" ;Double dagger
ASCIITable1[103]="ˆ" ;Modifier letter circumflex accent
ASCIITable1[104]="‰" ;Per mille sign
ASCIITable1[105]="Š" ;Latin capital letter S with caron
ASCIITable1[106]="‹" ;Single left-pointing angle quotation
ASCIITable1[107]="Œ" ;Latin capital ligature OE
ASCIITable1[108]="Ž" ;Latin capital letter Z with caron
;Split array to stay under 128
ASCIITable2[0]="‘" ;Left single quotation mark
ASCIITable2[1]="’" ;Right single quotation mark
ASCIITable2[2]="“" ;Left double quotation mark
ASCIITable2[3]="”" ;Right double quotation mark
ASCIITable2[4]="•" ;Bullet
ASCIITable2[5]="–" ;En dash
ASCIITable2[6]="—" ;Em dash
ASCIITable2[7]="˜" ;Small tilde
ASCIITable2[8]="™" ;Trademark sign
ASCIITable2[9]="š" ;Latin small letter S with caron
ASCIITable2[10]="›" ;Single right-pointing angle quotation mark
ASCIITable2[11]="œ" ;Latin small ligature oe
ASCIITable2[12]="ž" ;Latin small letter z with caron
ASCIITable2[13]="Ÿ" ;Latin capital letter Y with diaeresis
ASCIITable2[15]="¡" ;Inverted exclamation mark
ASCIITable2[16]="¢" ;Cent sign
ASCIITable2[17]="£" ;Pound sign
ASCIITable2[18]="¤" ;Currency sign
ASCIITable2[19]="¥" ;Yen sign
ASCIITable2[20]="¦" ;Pipe, broken vertical bar
ASCIITable2[21]="§" ;Section sign
ASCIITable2[22]="¨" ;Spacing diaeresis - umlaut
ASCIITable2[23]="©" ;Copyright sign
ASCIITable2[24]="ª" ;Feminine ordinal indicator
ASCIITable2[25]="«" ;Left double angle quotes
ASCIITable2[26]="¬" ;Not sign
ASCIITable2[27]="¯" ;Spacing macron - overline
ASCIITable2[28]="°" ;Degree sign
ASCIITable2[29]="±" ;Plus-or-minus sign
ASCIITable2[30]="²" ;Superscript two - squared
ASCIITable2[31]="³" ;Superscript three - cubed
ASCIITable2[32]="´" ;Acute accent - spacing acute
ASCIITable2[33]="µ" ;Micro sign
ASCIITable2[34]="¶" ;Pilcrow sign - paragraph sign
ASCIITable2[35]="·" ;Middle dot - Georgian comma
ASCIITable2[36]="¸" ;Spacing cedilla
ASCIITable2[37]="¹" ;Superscript one
ASCIITable2[38]="º" ;Masculine ordinal indicator
ASCIITable2[39]="»" ;Right double angle quotes
ASCIITable2[40]="¼" ;Fraction one quarter
ASCIITable2[41]="½" ;Fraction one half
ASCIITable2[42]="¾" ;Fraction three quarters
ASCIITable2[43]="¿" ;Inverted question mark
ASCIITable2[44]="À" ;Latin capital letter A with grave
ASCIITable2[45]="Á" ;Latin capital letter A with acute
ASCIITable2[46]="Â" ;Latin capital letter A with circumflex
ASCIITable2[47]="Ã" ;Latin capital letter A with tilde
ASCIITable2[48]="Ä" ;Latin capital letter A with diaeresis
ASCIITable2[49]="Å" ;Latin capital letter A with ring above
ASCIITable2[50]="Æ" ;Latin capital letter AE
ASCIITable2[51]="Ç" ;Latin capital letter C with cedilla
ASCIITable2[52]="È" ;Latin capital letter E with grave
ASCIITable2[53]="É" ;Latin capital letter E with acute
ASCIITable2[54]="Ê" ;Latin capital letter E with circumflex
ASCIITable2[55]="Ë" ;Latin capital letter E with diaeresis
ASCIITable2[56]="Ì" ;Latin capital letter I with grave
ASCIITable2[57]="Í" ;Latin capital letter I with acute
ASCIITable2[58]="Î" ;Latin capital letter I with circumflex
ASCIITable2[59]="Ï" ;Latin capital letter I with diaeresis
ASCIITable2[60]="Ð" ;Latin capital letter ETH
ASCIITable2[61]="Ñ" ;Latin capital letter N with tilde
ASCIITable2[62]="Ò" ;Latin capital letter O with grave
ASCIITable2[63]="Ó" ;Latin capital letter O with acute
ASCIITable2[64]="Ô" ;Latin capital letter O with circumflex
ASCIITable2[65]="Õ" ;Latin capital letter O with tilde
ASCIITable2[66]="Ö" ;Latin capital letter O with diaeresis
ASCIITable2[67]="×" ;Multiplication sign
ASCIITable2[68]="Ø" ;Latin capital letter O with slash
ASCIITable2[69]="Ù" ;Latin capital letter U with grave
ASCIITable2[70]="Ú" ;Latin capital letter U with acute
ASCIITable2[71]="Û" ;Latin capital letter U with circumflex
ASCIITable2[72]="Ü" ;Latin capital letter U with diaeresis
ASCIITable2[73]="Ý" ;Latin capital letter Y with acute
ASCIITable2[74]="Þ" ;Latin capital letter THORN
ASCIITable2[75]="ß" ;Latin small letter sharp s - ess-zed
ASCIITable2[76]="à" ;Latin small letter a with grave
ASCIITable2[77]="á" ;Latin small letter a with acute
ASCIITable2[78]="â" ;Latin small letter a with circumflex
ASCIITable2[79]="ã" ;Latin small letter a with tilde
ASCIITable2[80]="ä" ;Latin small letter a with diaeresis
ASCIITable2[81]="å" ;Latin small letter a with ring above
ASCIITable2[82]="æ" ;Latin small letter ae
ASCIITable2[83]="ç" ;Latin small letter c with cedilla
ASCIITable2[84]="è" ;Latin small letter e with grave
ASCIITable2[85]="é" ;Latin small letter e with acute
ASCIITable2[86]="ê" ;Latin small letter e with circumflex
ASCIITable2[87]="ë" ;Latin small letter e with diaeresis
ASCIITable2[88]="ì" ;Latin small letter i with grave
ASCIITable2[89]="í" ;Latin small letter i with acute
ASCIITable2[90]="î" ;Latin small letter i with circumflex
ASCIITable2[91]="ï" ;Latin small letter i with diaeresis
ASCIITable2[92]="ð" ;Latin small letter eth
ASCIITable2[93]="ñ" ;Latin small letter n with tilde
ASCIITable2[94]="ò" ;Latin small letter o with grave
ASCIITable2[95]="ó" ;Latin small letter o with acute
ASCIITable2[96]="ô" ;Latin small letter o with circumflex
ASCIITable2[97]="õ" ;Latin small letter o with tilde
ASCIITable2[98]="ö" ;Latin small letter o with diaeresis
ASCIITable2[99]="÷" ;Division sign
ASCIITable2[100]="ø" ;Latin small letter o with slash
ASCIITable2[101]="ù" ;Latin small letter u with grave
ASCIITable2[102]="ú" ;Latin small letter u with acute
ASCIITable2[103]="û" ;Latin small letter u with circumflex
ASCIITable2[104]="ü" ;Latin small letter u with diaeresis
ASCIITable2[105]="ý" ;Latin small letter y with acute
ASCIITable2[106]="þ" ;Latin small letter thorn
ASCIITable2[107]="ÿ" ;Latin small letter y with diaeresis
; Fill Hex Table
HexTable1[0]="20" ;Space
HexTable1[1]="21" ;Exclamation mark
HexTable1[2]="22" ;Double quote
HexTable1[3]="23" ;Number
HexTable1[4]="24" ;Dollar
HexTable1[5]="25" ;Percent
HexTable1[6]="26" ;Ampersand
HexTable1[7]="27" ;Single quote
HexTable1[8]="28" ;Left parenthesis
HexTable1[9]="29" ;Right parenthesis
HexTable1[10]="2A" ;Asterisk
HexTable1[11]="2B" ;Plus
HexTable1[12]="2C" ;Comma
HexTable1[13]="2D" ;Minus
HexTable1[14]="2E" ;Period
HexTable1[15]="2F" ;Slash
HexTable1[16]="30" ;Zero
HexTable1[17]="31" ;One
HexTable1[18]="32" ;Two
HexTable1[19]="33" ;Three
HexTable1[20]="34" ;Four
HexTable1[21]="35" ;Five
HexTable1[22]="36" ;Six
HexTable1[23]="37" ;Seven
HexTable1[24]="38" ;Eight
HexTable1[25]="39" ;Nine
HexTable1[26]="3A" ;Colon
HexTable1[27]="3B" ;Semicolon
HexTable1[28]="3C" ;Less than
HexTable1[29]="3D" ;Equal sign
HexTable1[30]="3E" ;Greater than
HexTable1[31]="3F" ;Question mark
HexTable1[32]="40" ;At sign
HexTable1[33]="41" ;Uppercase A
HexTable1[34]="42" ;Uppercase B
HexTable1[35]="43" ;Uppercase C
HexTable1[36]="44" ;Uppercase D
HexTable1[37]="45" ;Uppercase E
HexTable1[38]="46" ;Uppercase F
HexTable1[39]="47" ;Uppercase G
HexTable1[40]="48" ;Uppercase H
HexTable1[41]="49" ;Uppercase I
HexTable1[42]="4A" ;Uppercase J
HexTable1[43]="4B" ;Uppercase K
HexTable1[44]="4C" ;Uppercase L
HexTable1[45]="4D" ;Uppercase M
HexTable1[46]="4E" ;Uppercase N
HexTable1[47]="4F" ;Uppercase O
HexTable1[48]="50" ;Uppercase P
HexTable1[49]="51" ;Uppercase Q
HexTable1[50]="52" ;Uppercase R
HexTable1[51]="53" ;Uppercase S
HexTable1[52]="54" ;Uppercase T
HexTable1[53]="55" ;Uppercase U
HexTable1[54]="56" ;Uppercase V
HexTable1[55]="57" ;Uppercase W
HexTable1[56]="58" ;Uppercase X
HexTable1[57]="59" ;Uppercase Y
HexTable1[58]="5A" ;Uppercase Z
HexTable1[59]="5B" ;Left square bracket
HexTable1[60]="5C" ;backslash
HexTable1[61]="5D" ;Right square bracket
HexTable1[62]="5E" ;Caret / circumflex
HexTable1[63]="5F" ;Underscore
HexTable1[64]="60" ;Grave / accent
HexTable1[65]="61" ;Lowercase a
HexTable1[66]="62" ;Lowercase b
HexTable1[67]="63" ;Lowercase c
HexTable1[68]="64" ;Lowercase d
HexTable1[69]="65" ;Lowercase e
HexTable1[70]="66" ;Lowercase
HexTable1[71]="67" ;Lowercase g
HexTable1[72]="68" ;Lowercase h
HexTable1[73]="69" ;Lowercase i
HexTable1[74]="6A" ;Lowercase j
HexTable1[75]="6B" ;Lowercase k
HexTable1[76]="6C" ;Lowercase l
HexTable1[77]="6D" ;Lowercase m
HexTable1[78]="6E" ;Lowercase n
HexTable1[79]="6F" ;Lowercase o
HexTable1[80]="70" ;Lowercase p
HexTable1[81]="71" ;Lowercase q
HexTable1[82]="72" ;Lowercase r
HexTable1[83]="73" ;Lowercase s
HexTable1[84]="74" ;Lowercase t
HexTable1[85]="75" ;Lowercase u
HexTable1[86]="76" ;Lowercase v
HexTable1[87]="77" ;Lowercase w
HexTable1[88]="78" ;Lowercase x
HexTable1[89]="79" ;Lowercase y
HexTable1[90]="7A" ;Lowercase z
HexTable1[91]="7B" ;Left curly bracket
HexTable1[92]="7C" ;Vertical bar
HexTable1[93]="7D" ;Right curly bracket
HexTable1[94]="7E" ;Tilde
HexTable1[96]="80" ;Euro sign
HexTable1[97]="82" ;Single low-9 quotation mark
HexTable1[98]="83" ;Latin small letter f with hook
HexTable1[99]="84" ;Double low-9 quotation mark
HexTable1[100]="85" ;Horizontal ellipsis
HexTable1[101]="86" ;Dagger
HexTable1[102]="87" ;Double dagger
HexTable1[103]="88" ;Modifier letter circumflex accent
HexTable1[104]="89" ;Per mille sign
HexTable1[105]="8A" ;Latin capital letter S with caron
HexTable1[106]="8B" ;Single left-pointing angle quotation
HexTable1[107]="8C" ;Latin capital ligature OE
HexTable1[108]="8E" ;Latin capital letter Z with caron
HexTable2[0]="91" ;Left single quotation mark
HexTable2[1]="92" ;Right single quotation mark
HexTable2[2]="93" ;Left double quotation mark
HexTable2[3]="94" ;Right double quotation mark
HexTable2[4]="95" ;Bullet
HexTable2[5]="96" ;En dash
HexTable2[6]="97" ;Em dash
HexTable2[7]="98" ;Small tilde
HexTable2[8]="99" ;Trademark sign
HexTable2[9]="9A" ;Latin small letter S with caron
HexTable2[10]="9B" ;Single right-pointing angle quotation mark
HexTable2[11]="9C" ;Latin small ligature oe
HexTable2[12]="9E" ;Latin small letter z with caron
HexTable2[13]="9F" ;Latin capital letter Y with diaeresis
HexTable2[15]="A1" ;Inverted exclamation mark
HexTable2[16]="A2" ;Cent sign
HexTable2[17]="A3" ;Pound sign
HexTable2[18]="A4" ;Currency sign
HexTable2[19]="A5" ;Yen sign
HexTable2[20]="A6" ;Pipe, broken vertical bar
HexTable2[21]="A7" ;Section sign
HexTable2[22]="A8" ;Spacing diaeresis - umlaut
HexTable2[23]="A9" ;Copyright sign
HexTable2[24]="AA" ;Feminine ordinal indicator
HexTable2[25]="AB" ;Left double angle quotes
HexTable2[26]="AC" ;Not sign
HexTable2[27]="AF" ;Spacing macron - overline
HexTable2[28]="B0" ;Degree sign
HexTable2[29]="B1" ;Plus-or-minus sign
HexTable2[30]="B2" ;Superscript two - squared
HexTable2[31]="B3" ;Superscript three - cubed
HexTable2[32]="B4" ;Acute accent - spacing acute
HexTable2[33]="B5" ;Micro sign
HexTable2[34]="B6" ;Pilcrow sign - paragraph sign
HexTable2[35]="B7" ;Middle dot - Georgian comma
HexTable2[36]="B8" ;Spacing cedilla
HexTable2[37]="B9" ;Superscript one
HexTable2[38]="BA" ;Masculine ordinal indicator
HexTable2[39]="BB" ;Right double angle quotes
HexTable2[40]="BC" ;Fraction one quarter
HexTable2[41]="BD" ;Fraction one half
HexTable2[42]="BE" ;Fraction three quarters
HexTable2[43]="BF" ;Inverted question mark
HexTable2[44]="C0" ;Latin capital letter A with grave
HexTable2[45]="C1" ;Latin capital letter A with acute
HexTable2[46]="C2" ;Latin capital letter A with circumflex
HexTable2[47]="C3" ;Latin capital letter A with tilde
HexTable2[48]="C4" ;Latin capital letter A with diaeresis
HexTable2[49]="C5" ;Latin capital letter A with ring above
HexTable2[50]="C6" ;Latin capital letter AE
HexTable2[51]="C7" ;Latin capital letter C with cedilla
HexTable2[52]="C8" ;Latin capital letter E with grave
HexTable2[53]="C9" ;Latin capital letter E with acute
HexTable2[54]="CA" ;Latin capital letter E with circumflex
HexTable2[55]="CB" ;Latin capital letter E with diaeresis
HexTable2[56]="CC" ;Latin capital letter I with grave
HexTable2[57]="CD" ;Latin capital letter I with acute
HexTable2[58]="CE" ;Latin capital letter I with circumflex
HexTable2[59]="CF" ;Latin capital letter I with diaeresis
HexTable2[60]="D0" ;Latin capital letter ETH
HexTable2[61]="D1" ;Latin capital letter N with tilde
HexTable2[62]="D2" ;Latin capital letter O with grave
HexTable2[63]="D3" ;Latin capital letter O with acute
HexTable2[64]="D4" ;Latin capital letter O with circumflex
HexTable2[65]="D5" ;Latin capital letter O with tilde
HexTable2[66]="D6" ;Latin capital letter O with diaeresis
HexTable2[67]="D7" ;Multiplication sign
HexTable2[68]="D8" ;Latin capital letter O with slash
HexTable2[69]="D9" ;Latin capital letter U with grave
HexTable2[70]="DA" ;Latin capital letter U with acute
HexTable2[71]="DB" ;Latin capital letter U with circumflex
HexTable2[72]="DC" ;Latin capital letter U with diaeresis
HexTable2[73]="DD" ;Latin capital letter Y with acute
HexTable2[74]="DE" ;Latin capital letter THORN
HexTable2[75]="DF" ;Latin small letter sharp s - ess-zed
HexTable2[76]="E0" ;Latin small letter a with grave
HexTable2[77]="E1" ;Latin small letter a with acute
HexTable2[78]="E2" ;Latin small letter a with circumflex
HexTable2[79]="E3" ;Latin small letter a with tilde
HexTable2[80]="E4" ;Latin small letter a with diaeresis
HexTable2[81]="E5" ;Latin small letter a with ring above
HexTable2[82]="E6" ;Latin small letter ae
HexTable2[83]="E7" ;Latin small letter c with cedilla
HexTable2[84]="E8" ;Latin small letter e with grave
HexTable2[85]="E9" ;Latin small letter e with acute
HexTable2[86]="EA" ;Latin small letter e with circumflex
HexTable2[87]="EB" ;Latin small letter e with diaeresis
HexTable2[88]="EC" ;Latin small letter i with grave
HexTable2[89]="ED" ;Latin small letter i with acute
HexTable2[90]="EE" ;Latin small letter i with circumflex
HexTable2[91]="EF" ;Latin small letter i with diaeresis
HexTable2[92]="F0" ;Latin small letter eth
HexTable2[93]="F1" ;Latin small letter n with tilde
HexTable2[94]="F2" ;Latin small letter o with grave
HexTable2[95]="F3" ;Latin small letter o with acute
HexTable2[96]="F4" ;Latin small letter o with circumflex
HexTable2[97]="F5" ;Latin small letter o with tilde
HexTable2[98]="F6" ;Latin small letter o with diaeresis
HexTable2[99]="F7" ;Division sign
HexTable2[100]="F8" ;Latin small letter o with slash
HexTable2[101]="F9" ;Latin small letter u with grave
HexTable2[102]="FA" ;Latin small letter u with acute
HexTable2[103]="FB" ;Latin small letter u with circumflex
HexTable2[104]="FC" ;Latin small letter u with diaeresis
HexTable2[105]="FD" ;Latin small letter y with acute
HexTable2[106]="FE" ;Latin small letter thorn
HexTable2[107]="FF" ;Latin small letter y with diaeresis
endfunction
Int function SaveData()
Int jObj = JMap.object()
jmap.SetInt(jObj, "ModEnable", ModEnable as int)
jmap.SetInt(jObj, "Saveprotection", Saveprotection as int)
jmap.SetInt(jObj, "MSGSafeSave", MSGSafeSave as int)
jmap.SetInt(jObj, "Savedelay", Savedelay as int)
jmap.SetInt(jObj, "savekey", savekey as int)
jmap.SetInt(jObj, "RotatingSave", RotatingSave as int)
jmap.SetInt(jObj, "IncludeManualSave", IncludeManualSave as int)
jmap.SetInt(jObj, "RotatingSaveNb", RotatingSaveNb as int)
jmap.SetInt(jObj, "HardcoreMode", HardcoreMode as int)
jmap.SetInt(jObj, "TrueHeroMode", TrueHeroMode as int)
jmap.SetInt(jObj, "Quitdelay", Quitdelay as int)
jmap.SetInt(jObj, "SleepToSave", SleepToSave as int)
jmap.SetInt(jObj, "StoneToSave", StoneToSave as int)
jmap.SetInt(jObj, "ShrineToSave", ShrineToSave as int)
return jObj
endFunction
function LoadData(Int jObj)
ModEnable = (jmap.getInt(jObj, "ModEnable") as bool)
Saveprotection = (jmap.getInt(jObj, "Saveprotection") as bool)
MSGSafeSave = (jmap.getInt(jObj, "MSGSafeSave") as bool)
Savedelay = (jmap.getInt(jObj, "Savedelay", 300))
savekey = (jmap.getInt(jObj, "savekey", 1))
RotatingSave = ((jmap.getInt(jObj, "RotatingSave") as bool))
IncludeManualSave = ((jmap.getInt(jObj, "IncludeManualSave") as bool))
RotatingSaveNb = (jmap.getInt(jObj, "RotatingSaveNb", 10))
HardcoreMode = (jmap.getInt(jObj, "HardcoreMode") as bool)
TrueHeroMode = (jmap.getInt(jObj, "TrueHeroMode") as bool)
Quitdelay = (jmap.getInt(jObj, "Quitdelay", 15))
SleepToSave = (jmap.getInt(jObj, "SleepToSave") as bool)
StoneToSave = (jmap.getInt(jObj, "StoneToSave") as bool)
ShrineToSave = (jmap.getInt(jObj, "ShrineToSave") as bool)
RegisterForKey(savekey)
endFunctionEditor is loading...