diff --git a/.env.example b/.env.example index 1dff6bcbe..462d25559 100644 --- a/.env.example +++ b/.env.example @@ -1,26 +1,26 @@ # Path to MO2 mods directory. # Used to set default values for INSTALL_PATH, PAPYRUS_INCLUDE -XSE_TESV_MODS_PATH= +XSE_TES5_MODS_PATH= # Path to SkyrimSE game directory. # Used to set default values for PAPYRUS_PATH, PAPYRUS_GAMESOURCE -XSE_TESV_GAME_PATH= +XSE_TES5_GAME_PATH= # Path to Spriggit.CLI.exe SPRIGGIT_PATH= # Path to PapyrusCompiler.exe -# Default: "%XSE_TESV_GAME_PATH%\Papyrus Compiler" +# Default: "%XSE_TES5_GAME_PATH%\Papyrus Compiler" PAPYRUS_PATH= # Installation Path (if not overridden on cmd line) -# Deault: "%XSE_TESV_MODS_PATH%\SL-Dev" +# Deault: "%XSE_TES5_MODS_PATH%\SL-Dev" INSTALL_PATH= # Enable automatic install after build (0|1) # Default: 0 AUTO_INSTALL= # Path to directory conatining papyrus dependencies -# Default: "%XSE_TESV_MODS_PATH%" +# Default: "%XSE_TES5_MODS_PATH%" PAPYRUS_INCLUDE= # Path to directory containing game's `Source\Scripts` folder -# Default: "%XSE_TESV_GAME_PATH%\Data" +# Default: "%XSE_TES5_GAME_PATH%\Data" PAPYRUS_GAMESOURCE= \ No newline at end of file diff --git a/README.md b/README.md index 8b3237249..b40691d0a 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,26 @@ A high performance and stability patch for SexLab for Skyrim SE. ## Requirements +* [python](https://www.python.org/downloads/) * [xmake](https://xmake.io/#/) * Add this to your `PATH` -* [python](https://www.python.org/downloads/) +* [Spriggit CLI](https://github.com/Mutagen-Modding/Spriggit/) + * Requires [Microsoft .NET SDK](https://dotnet.microsoft.com/en-us/download/dotnet/) * [Visual Studio Community 2022](https://visualstudio.microsoft.com/) * Desktop development with C++ + * On VS Community 2026, use this command first: + ```sh + xmake f --cxflags="/Wv:18" + ``` * Papyrus Sources: * PapyrusUtil SE: [Nexus][PU-Nexus] | [GitHub][PU-GitHub] * SkyUI SDK 5.1: [GitHub][SUI-GitHub] * Race Menu (Modders Package): [Nexus][RM-Nexus] * MfgFix NG: [Nexus][MFG-Nexus] | [GitHub][MFG-GitHub] * SkyrimLovense: [Nexus][SL-Nexus] | [GitHub][SL-GitHub] + * VRIK Player Avatar: [Nexus][VR-Nexus] + * UIExtensions: [Nexus][UIX-Nexus] + * Extract BSA using [Bathesda Archive Extractor][BAE-Nexus] ## Building @@ -94,3 +103,6 @@ This project primarily falls under the [Apache License Version 2.0](./LICENSE). [MFG-GitHub]: https://github.com/KrisV-777/Mfg-Fix-NG [SL-Nexus]: https://www.nexusmods.com/skyrimspecialedition/mods/133698 [SL-GitHub]: https://github.com/KrisV-777/Skyrim-Lovense +[UIX-Nexus]: https://www.nexusmods.com/skyrimspecialedition/mods/17561 +[BAE-Nexus]: https://www.nexusmods.com/skyrimspecialedition/mods/974 +[VR-Nexus]: https://www.nexusmods.com/skyrimspecialedition/mods/23416 diff --git a/dist/Interface/Translations/SexLab_CHINESE.txt b/dist/Interface/Translations/SexLab_CHINESE.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_CHINESE.txt +++ b/dist/Interface/Translations/SexLab_CHINESE.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_CZECH.txt b/dist/Interface/Translations/SexLab_CZECH.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_CZECH.txt +++ b/dist/Interface/Translations/SexLab_CZECH.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_DANISH.txt b/dist/Interface/Translations/SexLab_DANISH.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_DANISH.txt +++ b/dist/Interface/Translations/SexLab_DANISH.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_ENGLISH.txt b/dist/Interface/Translations/SexLab_ENGLISH.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_ENGLISH.txt +++ b/dist/Interface/Translations/SexLab_ENGLISH.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_FINNISH.txt b/dist/Interface/Translations/SexLab_FINNISH.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_FINNISH.txt +++ b/dist/Interface/Translations/SexLab_FINNISH.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_FRENCH.txt b/dist/Interface/Translations/SexLab_FRENCH.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_FRENCH.txt +++ b/dist/Interface/Translations/SexLab_FRENCH.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_GERMAN.txt b/dist/Interface/Translations/SexLab_GERMAN.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_GERMAN.txt +++ b/dist/Interface/Translations/SexLab_GERMAN.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_GREEK.txt b/dist/Interface/Translations/SexLab_GREEK.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_GREEK.txt +++ b/dist/Interface/Translations/SexLab_GREEK.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_ITALIAN.txt b/dist/Interface/Translations/SexLab_ITALIAN.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_ITALIAN.txt +++ b/dist/Interface/Translations/SexLab_ITALIAN.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_JAPANESE.txt b/dist/Interface/Translations/SexLab_JAPANESE.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_JAPANESE.txt +++ b/dist/Interface/Translations/SexLab_JAPANESE.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_NORWEGIAN.txt b/dist/Interface/Translations/SexLab_NORWEGIAN.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_NORWEGIAN.txt +++ b/dist/Interface/Translations/SexLab_NORWEGIAN.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_POLISH.txt b/dist/Interface/Translations/SexLab_POLISH.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_POLISH.txt +++ b/dist/Interface/Translations/SexLab_POLISH.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_RUSSIAN.txt b/dist/Interface/Translations/SexLab_RUSSIAN.txt index 1437ec686..9db7bd25f 100644 --- a/dist/Interface/Translations/SexLab_RUSSIAN.txt +++ b/dist/Interface/Translations/SexLab_RUSSIAN.txt @@ -22,8 +22,8 @@ $SSL_High Выше $SSL_ConflictControl{}{} Эта клавиша уже назначена на:\n{} ({})\n\nХотите продолжить? $SSL_ConflictControl{} Эта клавиша уже назначена на:\n{}\n\nХотите продолжить? $SSL_KeyCannotBeDisabled Эта клавиша является обязательной для назначения и не может быть отключена. -$SSL_TSModeSelect Scenes Category -$SSL_TSModeSelectHighlight Choose the category of scenes for which the strip settings on this page are being configured +$SSL_TSModeSelect Тип сцены +$SSL_TSModeSelectHighlight Тип сцены для которой регулируется время стадии # --------------- Races ----------------------------------------------------- @@ -36,7 +36,7 @@ $SSL_Race_2 Медведь $SSL_Race_3 Кабан $SSL_Race_4 Оседланный кабан $SSL_Race_5 Одинокий кабан -$SSL_Race_6 Собачатина +$SSL_Race_6 Собакоподобный $SSL_Race_7 Корус $SSL_Race_8 Корус охотник $SSL_Race_9 Корус жнец @@ -112,9 +112,9 @@ $SSL_MoveScene Переместить сцену $SSL_Speed Скорость $SSL_NextStage Следующая стадия $SSL_EndScene Завершение -$SSL_HideHUD Hide Game HUD -$SSL_HideUI Hide Scene HUD -$SSL_None None +$SSL_HideHUD Спрятать интерфейс игры +$SSL_HideUI Спрятать интерфейс сцены +$SSL_None Нет # --------------- Sex Journal (Sex Diary) ----------------------------------------------------- $SSL_SexJournal Секс Журнал @@ -130,7 +130,7 @@ $SSL_WarnReset{}Stats Данное действие обнулит весь се # ------ Statistics $SSL_Statistics Статистика -$SSL_LastTimeInScene Дата последней сцены. +$SSL_LastTimeInScene Дата последней сцены $SSL_TimeInScenes Время потраченное в сценах $SSL_Statistic_2 Опыт вагинального секса $SSL_Statistic_3 Опыт анального секса @@ -174,11 +174,11 @@ $SSL_AnimationSettings Настройки сцены $SSL_PlayerSettings Настройки игрока $SSL_bAutoAdvance Продолжать анимацию по таймеру -$SSL_bAutoAdvanceHighlight Отключение/включение данного параметра позволяет игнорировать/использовать настройки таймера анимации, предотвращает/разрешает автоматицескую смену стадий анимации, но лишь в тех случаях, когда ИП (игровой персонаж) является участником сцены. +$SSL_bAutoAdvanceHighlight Анимация будет автоматически продолжатся по таймеру, когда в ней участвует игрок. $SSL_bDisablePlayer Отключить управление в роли жертвы $SSL_bDisablePlayerHighlight Если игрок является жертвой, управление анимацией блокируется. $SSL_bAutoTFC Автоматическая "свободная камера" -$SSL_bAutoTFCHighlight Если включено, режим "свободная камера" (консольная команда "TFC") будет автоматически включен после начала сцены. Автоматическая "свободная камера" будет включена лишь для тех сцен, в которых принимает участие ИП (игровой персонаж). +$SSL_bAutoTFCHighlight Если включено, режим "свободная камера" (консольная команда "TFC") будет автоматически включен после начала сцены. Автоматическая "свободная камера" будет включена лишь для тех сцен, в которых принимает участие игрок. $SSL_fAutoSUCSM Скорость "свободной камеры" $SSL_fAutoSUCSMHighlight Скорость движения камеры в режиме "свободная камера". $SSL_PlayerSex Пол игрового персонажа @@ -218,7 +218,7 @@ $SSL_iLovenseDurationOrgasmHighlight Продолжительность вибр # ------ Creatures $SSL_bAllowCreatures Сцены с существами -$SSL_bAllowCreaturesHighlight Разрешает существам участвовать в сценах.\nДля корректной работы требуется FNIS 5.0 Creatures или выше. +$SSL_bAllowCreaturesHighlight Разрешает существам участвовать в сценах. $SSL_bCreatureGender Пол существа должен соответствовать $SSL_bCreatureGenderHighlight Если включено, Sexlab проверит к какому полу относится существо и попытается использовать только соответствующие этому полу анимации с существами. Если отключено, SexLab будет относить всех существ только к мужскому полу и обрабатывать все соответствующие этому полу сцены и анимации. @@ -236,9 +236,15 @@ $SSL_bRedressVictimHighlight Включение данного параметр $SSL_bDisableTeleport Отключить запуск телепорта $SSL_bDisableTeleportHighlight Включение данного параметра предотвращает мгновенную телепортацию участников сцены к месту ее проигрывания. Если включено, то участники сцены, находящиеся не слишком далеко друг от друга, попытаются подойти и/или подбежать друг к другу перед началом проигрывания сцены. $SSL_bShowInMap Показать сцены на карте -$SSL_bShowInMapHighlight Если включено и Игрок не являющейся частью анимации, но анимация рядом с Игроком, сцены SexLab будут показаны на карте как квест дополнительного типа -$SSL_bSetAnimSpeedByEnjoyment Изменять скорость анимации -$SSL_bSetAnimSpeedByEnjoymentHighlight Изменять скорость анимации в зависимости от степени возбуждения. На данный момент 0.8~1.2 +$SSL_bShowInMapHighlight Получите дополнительный маркер задания для каждой сцены, происходящей поблизости (кроме тех, в которых вы сами участвуете). +$SSL_bSetAnimSpeedByEnjoyment Возбуждение влияет на скорость +$SSL_bSetAnimSpeedByEnjoymentHighlight Базовая скорость анимации изменяется в зависимости степени возбуждения актёра (+/-20%). +$SSL_AdjustStage Корректирование текущей стадии +$SSL_AdjustStageHighlight Переключает режим, при котором все изменения смещения позиции/сцены будут применяться только к текущей воспроизводимой сцене. +$SSL_fAdjustStepSize Величина шага смещения +$SSL_fAdjustStepSizeHighlight Определяет величину шага для подстройки смещения. +$SSL_bHideHUD Скрыть интерфейс игры +$SSL_bHideHUDHighlight Убирает общие элементы игрового интерфейса, но не влияет на интерфейс сцены. $SSL_FurnitureNPC Использование мебели: NPC $SSL_FurnitureNPCHighlight Как NPC используют мебель. Если быть более точным, будут ли NPC использовать мебель, если она доступна и при каких условиях. $SSL_AskNotSub Спрашивать (если игрок не покорный) @@ -248,17 +254,17 @@ $SSL_FurniturePlayerHighlight Позволяет решить, будет ли # ---- COMEBACK: Might delete $SSL_bDisableScale Отключить масштабирование / исправление CTD -$SSL_bDisableScaleHighlight !!! Использовать лишь в случае необходимости !!!\nОтключает использование функции SetScale() в SexLab, из-за которой у некоторых пользователей происходят вылеты на рабочий стол во время проигрывания сцен. +$SSL_bDisableScaleHighlight !!! Использовать лишь в случае необходимости !!!\nОтключает использование функции SetScale() в SexLab, из-за которой у некоторых пользователей происходят вылеты на рабочий стол во время проигрывания сцен. Некоторое масштабирование может по-прежнему происходить другими способами, например, при использовании мебели, и SexLab не сможет это исправить, пока эта функция включена. Результаты могут варьироватся. # ----------------- Voices & SFX --------------------------------------------------- $SSL_SoundSettings Настройки звука $SSL_fSFXVolume Громкость звуковых эффектов -$SSL_fSFXVolumeHighlight Регулирует уровень громкости звуковых эффектов в диапазоне от 1% до 100% +$SSL_fSFXVolumeHighlight Регулирует уровень громкости звуковых эффектов в диапазоне от 0.0 до 1.0 (полная громкость). $SSL_fSFXDelay Задержка звуковых эффектов -$SSL_fSFXDelayHighlight Звуковые эффекты будут воспроизводится каждый раз через указанный интервал времени. +$SSL_fSFXDelayHighlight Соответствующие звуковые эффекты будут активироватся с этим интервалом, который будет уменьшаться с каждым последующим этапом. $SSL_fVoiceVolume Громкость голосов -$SSL_fVoiceVolumeHighlight Регулирует уровень громкости голоса в диапазоне от 1% до 100% +$SSL_fVoiceVolumeHighlight Регулирует уровень громкости голоса в диапазоне от 0.0 до 1.0 (полная громкость). $SSL_fMaleVoiceDelay Задержка мужского голоса $SSL_fMaleVoiceDelayHighlight Мужские голоса будут воспроизводится каждый раз через указанный интервал времени. $SSL_fFemaleVoiceDelay Задержка женского голоса @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Волк Обычный # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Горячие клавиши +$SSL_bUseSceneMenu Использовать меню сцены +$SSL_bUseSceneMenuHighlight Включает/выключает использование встроенного меню и индикаторов наслаждения. Отключение этой функции возвращает поддержку некоторых модернизированных горячих клавиш старой версии SexLab. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Глобальные горячие клавиши -$SSL_iTargetActor Выбрать персонажа -$SSL_iTargetActorHighlight Направьте перекрестие прицела на персонажа и нажмите эту клавишу, после чего дождитесь сообщения о том, что персонаж выбран. После этого вам станут доступны новые возможности в меню SexLab - к примеру, вы сможете просмотреть сведения о статистике выбранного персонажа, изменить тип его голоса и т.д. +$SSL_iTargetActor Выбрать персонажа / Сменить партнёра +$SSL_iTargetActorHighlight После нажатия этой горячей клавиши наведите прицел на персонажа в игре и дождитесь уведомления о том, что персонаж выбран целью. После этого персонаж станет доступен для редактирования на различных страницах меню. $SSL_iToggleFreeCamera Режим "свободная камера" $SSL_iToggleFreeCameraHighlight Включает/отключает режим свободной камеры, что равносильно использованию консольной команды "TFC". Эта клавиша может быть использована в любых сценах, вне зависимости от их типа. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleThreadControl Контроль потоков # ------ Scene Manipulation $SSL_SceneManipulation Управление сценой @@ -327,13 +335,31 @@ $SSL_iKeyDown Выберите ветвь / Вниз $SSL_iKeyLeft Уменьшить скорость / Влево $SSL_iKeyRight Увеличить скорость / Вправо $SSL_iKeyAdvance Продолжить сцену / Выбрать -$SSL_iKeyEnd Закончить сцену -$SSL_iKeyExtra1 Открыть меню / Переключить цель для смещения -$SSL_iKeyExtra2 Экстра / Повернуть сцену +$SSL_iKeyEnd Закончить сцену / Закрыть меню / Назад +$SSL_iKeyExtra2 Открыть меню / Переключить страницу меню $SSL_iKeyMod Модификатор +$SSL_iKeyModHighlight Включает альтернативный эффект для других горячих клавиш.\nСледующий/Предыдущий: Сменить партнёра, сменить стадию, режим смещения.\nНастройка цели: Наслаждение, Сдерживатся, Сменить позицию, Направление смещения.\nГорячие клавиши, изменяющие свой режим на "Настройка цели" с помощью Модификатора, влияют на игрока по своему. $SSL_iKeyReset Инвертирование действия -$SSL_iChangeAnimation Change Animation -$SSL_iMoveScene Move Scene + +$SSL_LegacyHotkeys "Старые" горячие клавиши +$SSL_iChangeAnimation Сменить анимацию +$SSL_iMoveScene Переместить сцену +$SSL_iChangePositions Сменить позицию +$SSL_iOffsetAdjustMode Сменить режим смещения +$SSL_iOffsetAdjustModeHighlight Горячая клавиша для переключения между 5 режимами регулировки смещения в сцене.\nНет: Регулировка смещения отключена (по умолчанию).\nPOS-XY: клавиши L/R регулируют положение по оси X, U/D — по оси Y.\nPOS-RZ: клавиши L/R регулируют вращение положения, U/D — по оси Z.\nSCENE-XY: клавиши L/R регулируют положение по оси X, U/D — по оси Y (только для сцен с мебелью).\nSCENE-RZ: клавиши L/R регулируют вращение положения, U/D — по оси Z (только для сцен с мебелью). +$SSL_iToggleAdjustStage Переключить подстройку стадии +$SSL_iRestoreOffsets Сбросить настройки смещения +$SSL_iSceneSelectorMenu Меню выбора сцены + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Выбрать режим смещения +$SSL_SS_ChangeCurrentScene Сменить текущую сцену +$SSL_SS_ResetScenesByTagName Поиск по тегу/названию +$SSL_SS_AdjNone Отключить подстройку смещения +$SSL_SS_AdjPosXY Подстроить по оси XY +$SSL_SS_AdjPosRZ Подстроить по оси RZ +$SSL_SS_AdjSceneXY Подстроить мебель по XY +$SSL_SS_AdjSceneRZ Подстроить мебель по RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Таймеры/Раздевание @@ -394,13 +420,13 @@ $SSL_Weapons [--] Оружие # ------------------ Toggle Animations -------------------------------------------------- $SSL_ToggleAnimations Анимации $SSL_TogglePackage Фильтровать по пакету -$SSL_TogglePackageHighlight Filter animations of a specific animation pack/module only +$SSL_TogglePackageHighlight Показ анимаций только из определенного пакета/модуля. $SSL_ToggleGroup Фильтровать по группе -$SSL_togglecategoryHighlight Filter animations by human/creature category +$SSL_togglecategoryHighlight Фильтрация анимаций по категории человек/существо. $SSL_ToggleVisible Показывать отключённые -$SSL_ToggleVisibleHighlight Enable or disable all animations filtered on this page -$SSL_TagFilter Фильтровать по тэгам -$SSL_toggletagsHighlight Filter animations by tags +$SSL_ToggleVisibleHighlight Включить или отключить показ отфильтрованных анимаций. +$SSL_TagFilter Фильтровать по тегам +$SSL_toggletagsHighlight Фильтровать анимации по тегам $SSL_Page{}{} Страница {}/{} @@ -413,93 +439,101 @@ $SSL_ToggleMatchMakerHighlight Включить Генератор сцен. З # ------ Tag Settings $SSL_MatchMakerTagsSettings Настройки Тегов $SSL_InputTags Тэги: -$SSL_matchmakerInputTagsHighlight Resulting tag string based on tag inputs below -$SSL_InputRequiredTags Обязательные тэги: -$SSL_matchmakerInputRequiredTagsHighlight A list of comma-separated tags, all of which must be present simultaneously in the filtered scene(s) -$SSL_InputExcludedTags Исключённые тэги: -$SSL_matchmakerInputExcludedTagsHighlight A list of comma-separated tags, none of which shall be present in the filtered scene(s) -$SSL_InputOptionalTags Опциональные тэги: -$SSL_matchmakerInputOptionalTagsHighlight A list of comma-separated tags, at least one of which shall be present in the filtered scene(s) -$SSL_TextResetTags Сбросить тэги -$SSL_TextResetTagsHighlight Resets all tag input fields +$SSL_matchmakerInputTagsHighlight Полученная строка тегов на основе введенных ниже тегов. +$SSL_InputRequiredTags Обязательные теги: +$SSL_matchmakerInputRequiredTagsHighlight Список тегов, разделенных запятыми, все из которых должны одновременно присутствовать в отфильтрованной сцене(ах). +$SSL_InputExcludedTags Исключённые теги: +$SSL_matchmakerInputExcludedTagsHighlight Список тегов, разделённых запятыми, ни один из которых не должен присутствовать в отфильтрованной(ых) сцене(ах). +$SSL_InputOptionalTags Опциональные теги: +$SSL_matchmakerInputOptionalTagsHighlight Список тегов, разделенных запятыми, по крайней мере один из которых должен присутствовать в отфильтрованной сцене(ах). +$SSL_TextResetTags Сбросить теги +$SSL_TextResetTagsHighlight Сбросить все введённые теги $SSL_ResetTagsHere Сбросить -$SSL_TagResetAreYouSure Это сбросит все тэги, вы уверены? +$SSL_TagResetAreYouSure Это сбросит все теги, вы уверены? # ------ Actor Settings $SSL_MatchMakerActorSettings Настройка актёров $SSL_bSubmissivePlayer Игрок будет покорным -$SSL_bSubmissivePlayerHighlight Filter scenes with player in the submissive position +$SSL_bSubmissivePlayerHighlight Использовать сцены где игрок должен быть покорным. $SSL_bSubmissiveTarget Цель будет покорной -$SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissive position +$SSL_bSubmissiveTargetHighlight Использовать сцены где выбранный персонаж должен быть покорным. # ------------------ Enjoyment -------------------------------------------------- -$SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjoymentSettings Настройки наслаждения +# TODO: $SSL_EnjPrimarySettings +$SSL_EnjPrimarySettings Primary Settings +# TODO: $SSL_EnjGeneralConfigs +$SSL_EnjGeneralConfigs General Configs +# TODO: $SSL_EnjGameConfigs +$SSL_EnjGameConfigs Game Configs +# TODO: $SSL_EnjPainConfigs +$SSL_EnjPainConfigs Pain Configs +# TODO: $SSL_EnjGameHotkeys +$SSL_EnjGameHotkeys Game Hotkeys +# TODO: $SSL_EnjMiscRateMult +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings -$SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment -$SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions -$SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions.\n Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame (automated for NPCs by default). -$SSL_bGameEnabled Enable Enjoyment Game -$SSL_bGameEnabledHighlight Toggles the enjoyment minigame inspired from SLSO's implementation. +$SSL_bInternalEnjoymentEnabled Включить наслаждение +$SSL_bInternalEnjoymentEnabledHighlight Включает/выключает внутреннюю систему наслаждения. Должна оставаться включенной, если только внешняя модификация не захочет полностью взять под контроль расчет наслаждения. +$SSL_fEnjRaiseMultInter Главный множитель наслаждения +$SSL_fEnjRaiseMultInterHighlight Основной множитель/фактор, определяющий скорость увеличения наслаждения для персонажа на основе обнаруженных взаимодействий. Более высокие значения означают более быстрое увеличение наслаждения и наоборот. Может быть уменьшен до нуля, если пользователь желает, чтобы увеличение удовольствия зависело исключительно от мини-игры. +$SSL_bGameEnabled Включить мини-игру +$SSL_bGameEnabledHighlight Включает мини-игру влияющую на наслаждение, подобную той которая была в SLSO. # ------ General Configs -# TODO: $SSL_bFallbackToTagsForDetection -$SSL_bFallbackToTagsForDetection Allow Fallback to Position Tags -# TODO: $SSL_bFallbackToTagsForDetectionHighlight -$SSL_bFallbackToTagsForDetectionHighlight Toggles fallback to position tags for interactions detection when the internal physics-based real-time collision type guessing is not available. -$SSL_bNoStaminaEndsScene No Stamina Ends Scene -$SSL_bNoStaminaEndsSceneHighlight Ends the scene automatically when the actor's stamina is depleted. -$SSL_bMaleOrgasmEndsScene Male Orgasm Ends Scene -$SSL_bMaleOrgasmEndsSceneHighlight Ends the scene after the first male orgasm. -$SSL_bDomMustOrgasm Dom Actor Must Orgasm -$SSL_bDomMustOrgasmHighlight Requires the dominant actor to orgasm before scene ends.\nThread is perpetuated by chnaging to similar animations till the dominiant actor has orgasmsed once. -$SSL_bPlayerMustOrgasm Player Must Orgasm -$SSL_bPlayerMustOrgasmHighlight Requires the player to orgasm before scene ends\nThread is perpetuated by chnaging to similar animations till the player has orgasmsed once. -$SSL_bHighEnjOrgasmWait High Enj Orgasm Wait -$SSL_bHighEnjOrgasmWaitHighlight Scene will perpetutate if an actor's enjoyment is above 75 or if the actor is in edging state (maintaining enjoyment above 100) regardless of orgasms count.\nThread is perpetuated by chnaging to similar animations till the actor with high enjoyment has orgasmsed. -$SSL_iMaxNoPainOrgasmMale Max NoPain Orgasms Male -$SSL_iMaxNoPainOrgasmMaleHighlight Determines the number of orgasms till which no pain penalty will be imposed on male actors. Once the orgasm counts goes higher than the limit here, each subsequent orgasm will inflict successively higher pain penalties. -$SSL_iMaxNoPainOrgasmFemale Max NoPain Orgasms Female -$SSL_iMaxNoPainOrgasmFemaleHighlight Determines the number of orgasms till which no pain penalty will be imposed on female/futa actors. Once the orgasm counts goes higher than the limit here, each subsequent orgasm will inflict successively higher pain penalties. -$SSL_iNoPainRequiredTime Pain Decay Time -$SSL_iNoPainRequiredTimeHighlight Determines the time required in seconds for pain effects (e.g. from penetration for inexperienced actors) to decay during a scene. -$SSL_iNoPainRequiredXP Pain Avoidance XP -$SSL_iNoPainRequiredXPHighlight Determines the Anal and Vaginal XP required to avoid pain effects from penetration interactions. +$SSL_bFallbackToTagsForDetection Разрешить откат на теги поз +$SSL_bFallbackToTagsForDetectionHighlight Позволяет переключатся на расчёт по тегам поз, если расчёт по физическим коллизиям не доступен. +$SSL_bNoStaminaEndsScene Закончить при 0 выносливости +$SSL_bNoStaminaEndsSceneHighlight Если выносливость игрока снизилась до нуля - закончить сцену. +$SSL_bMaleOrgasmEndsScene Закончить если мужчина кончил +$SSL_bMaleOrgasmEndsSceneHighlight Заканчивает сцену при мужском оргазме. +$SSL_bDomMustOrgasm Доминирующий актёр должен кончить +$SSL_bDomMustOrgasmHighlight Требуется, чтобы доминирующий актёр испытал оргазм до окончания сцены.\nСцена продолжается путём смены анимаций на похожие до тех пор, пока доминирующий актёр не испытает оргазм хотя бы один раз. +$SSL_bPlayerMustOrgasm Игрок должен кончить +$SSL_bPlayerMustOrgasmHighlight Требуется, чтобы игровой персонаж испытал оргазм до окончания сцены.\nСцена продолжается путём смены анимаций на похожие до тех пор, пока игровой персонаж не испытает оргазм хотя бы один раз. +$SSL_bHighEnjOrgasmWait Ждать оргазм при высоком возбуждении +$SSL_bHighEnjOrgasmWaitHighlight Сцена продолжается, если уровень удовольствия актёра превышает 75 или если актёр находится в состояния "предела", независимо от количества оргазмов. Тема продолжается путём смены анимаций на похожие до тех пор, пока актёр с высоким уровнем удовольствия не достигнет оргазма. +$SSL_iMaxNoPainOrgasmMale Макс безболезненных оргазмов муж. +$SSL_iMaxNoPainOrgasmMaleHighlight Определяет количество оргазмов, до достижения которого мужчинам-актерам не будет налагаться болевой эффект. Как только количество оргазмов превысит установленный здесь лимит, каждый последующий оргазм будет налагать последовательно более высокие болевые эффекты. +$SSL_iMaxNoPainOrgasmFemale Макс безболезненных оргазмов жен. +$SSL_iMaxNoPainOrgasmFemaleHighlight Определяет количество оргазмов, до достижения которого женским/фута-актрисам не будет налагаться болевой эффект. Как только количество оргазмов превысит установленный здесь лимит, каждый последующий оргазм будет наносить последовательно возрастающий болевой эффект. +$SSL_iNoPainRequiredTime Время уменьшения боли +$SSL_iNoPainRequiredTimeHighlight Время, необходимое в секундах для того, чтобы болевые ощущения (например, от проникновения для неопытных актеров) исчезли во время сцены. +$SSL_iNoPainRequiredXP Опыт для избегания боли +$SSL_iNoPainRequiredXPHighlight Определяет необходимое количество опыта для анального и вагинального проникновения, чтобы избежать болевых ощущений от полового акта. # ------ Misc Multipliers -$SSL_fEnjMultVictim EnjRaise Mult: Victim -$SSL_fEnjMultVictimHighlight Additional enjoyment raise multiplier for victim actors.\n(FYI: Victim state is defined by scene's context, not tags.) -$SSL_fEnjMultAggressor EnjRaise Mult: Aggressor -$SSL_fEnjMultAggressorHighlight Additional enjoyment raise multiplier for aggressor actors.\n(FYI: Aggressor state is defined by scene's context, not tags.) -$SSL_fEnjMultSub EnjRaise Mult: Submissive -$SSL_fEnjMultSubHighlight Additional enjoyment raise multiplier for submissive actors.\n(FYI: Submissive role is defined by SLSB's submissive flags, not tags.) -$SSL_fEnjMultDom EnjRaise Mult: Dominant -$SSL_fEnjMultDomHighlight Additional enjoyment raise multiplier for dominant/non-sub actors.\n(FYI: Dominant role is defined by SLSB's submissive flags, not tags.) -$SSL_fPainHugePPMult Pain Mult: Huge PP -$SSL_fPainHugePPMultHighlight Additional factor enhancing pain for actors having penetration interactions in receieving position with actors having large schlongs.\nUsed during penetration by certain creatures only, for now. +$SSL_fEnjMultVictim Множитель наслаждения: Жертва +$SSL_fEnjMultVictimHighlight Дополнительный множитель повышения удовольствия для актёров-жертв.\n(К сведению: состояние жертвы определяется контекстом сцены, а не тегами.) +$SSL_fEnjMultAggressor Множитель наслаждения: Агрессор +$SSL_fEnjMultAggressorHighlight Дополнительный множитель повышения удовольствия для актёров-агрессоров.\n(К сведению: состояние агрессора определяется контекстом сцены, а не тегами.) +$SSL_fEnjMultSub Множитель наслаждения: Покорный +$SSL_fEnjMultSubHighlight Дополнительный множитель повышения удовольствия для покорных актёров.\n(К сведению: состояние покорного акрёра определяется внутренними настройками SLSB сцены, а не тегами.) +$SSL_fEnjMultDom Множитель наслаждения: Доминантный +$SSL_fEnjMultDomHighlight Дополнительный множитель повышения удовольствия для доминантных (не покорных) актёров.\n(К сведению: состояние доминантного актёра определяется внутренними настройками SLSB сцены, а не тегами.) +$SSL_fPainHugePPMult Множитель боли: Здоровый "агрегат" +$SSL_fPainHugePPMultHighlight Дополнительный фактор, усиливающий боль для актеров, участвующих в сценах проникновения в позе принимающего партнера с актерами, обладающими большими половыми органами. Пока что, используется только во время проникновения определенными существами. # ------ Game Configs -$SSL_iEnjGameStaminaCost Game Stamina Cost -$SSL_iEnjGameStaminaCostHighlight The amount of stamina to be depleted upon a relevant minigame action. -$SSL_iEnjGameMagickaCost Game Magicka Cost -$SSL_iEnjGameMagickaCostHighlight The amount of magicka to be depleted upon a relevant minigame action. -$SSL_bGameRequiredOnHighEnj Require Minigame on High Enj -$SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. -$SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty -$SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment.\nNOTE: This option only works when combined with the above option. +$SSL_iEnjGameStaminaCost Стоимость игры. Выносливость +$SSL_iEnjGameStaminaCostHighlight Сколько будет потрачено выносливости для соответствующего действия в мини-игре. +$SSL_iEnjGameMagickaCost Стоимость игры. Магия +$SSL_iEnjGameMagickaCostHighlight Сколько будет потрачено магии для соответствующего действия в мини-игре. +# TODO: $SSL_iGameEnjAdjAmount +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +# TODO: $SSL_iGameEnjAdjAmountHighlight +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. +$SSL_bGameRequiredOnHighEnj Требовать мини-игру для оргазма +$SSL_bGameRequiredOnHighEnjHighlight Включает/отключает получение наслаждения игроком от мини-игры за счет внутренних расчётов, когда значение превышает 80. При включении этой функции игроку придется активно полагаться на мини-игру, чтобы достичь оргазма. +$SSL_bGameSpamDelayPenalty Штрафы в мини-игре +$SSL_bGameSpamDelayPenaltyHighlight Включает в себя штрафы к наслаждению, а также истощение выносливости и магии у игрока при неудачных по таймингу попытках повысить уровень удовольствия. (ВАЖНО: Эта опция работает только в сочетании с указанной выше опцией.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Utility Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. -$SSL_iGameRaiseEnjKey Raise Enj Key -$SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment. -$SSL_iGameHoldbackKey Reduce Enj Key -$SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. +$SSL_iGameRaiseEnjKey Повысить наслаждение +$SSL_iGameRaiseEnjKeyHighlight Горячая клавиша для ручного повышения уровня наслаждения за счет выносливости. Для повышения собственного/игрового уровня наслаждения используйте в сочетании со вспомогательной клавишей.\nКак только уровень наслаждения достигнет 90, эта горячая клавиша будет использоваться для поддержания состояния "предела", при котором потребуются своевременные нажатия, чтобы избежать штрафов за спам. +$SSL_iGameHoldbackKey Кнопка "сдерживания" +$SSL_iGameHoldbackKeyHighlight Горячая клавиша для ручного ограничения/снижения удовольствия за счет расхода магии. Для снижения удовольствия для себя/игрока используйте в сочетании с вспомогательной клавишей. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Редактор эмоций @@ -560,7 +594,7 @@ $SSL_ScaleMode_Cubic Кубический $SSL_ScaleMode_Exponential Экспоненциальный $SSL_ModifyingExpression Модификаторы Эмоций -$SSL_enableexpressionHighlight Enable or disable the expression being modified currently +$SSL_enableexpressionHighlight Включить или выключить эмоцию которая в двнный момент редактируется $SSL_ExpressionScaling Алгоритм масштабирования $SSL_ExpressionsNormal Доступно в нормальных сценах $SSL_ExpressionsVictim Доступно как жертве @@ -601,7 +635,7 @@ $SSL_StripEditor Редактор раздевания $SSL_Equipment{} Снаряжение {} $SSL_FullInventory Показать весь инвентарь персонажа -$SSL_FullInventoryHighlight Allows all items in actor's inventory to show up for strip behavior editing +$SSL_FullInventoryHighlight Делает доступными все предметы из инвентаря персонажа для редактирования раздевания. $SSL_AlwaysRemove Всегда удалять $SSL_NeverRemove Никогда не удалять $SSL_StripItemSlots{} Снять вещи из слотов: {} @@ -612,14 +646,14 @@ $SSL_RebuildClean Дебаг $SSL_Installation Установка $SSL_bDebugMode Режим отладки/Разработки (моддерам) -$SSL_bDebugModeHighlight Включает дополнительное логирование. Может немного замедлить работу, но позволяет отлавливать ошибки. +$SSL_bDebugModeHighlight Включает дополнительное логирование. Может немного замедлить работу, но позволяет лучше отлавливать ошибки. $SSL_StopCurrentAnimations Остановить текущую анимацию -$SSL_StopCurrentAnimationsHighlight Stops all active SexLab threads, regardless of player involvement -$SSL_StopRunningAnimations Все запущенные анимации остановлены. -$SSL_ResetStripOverrides Сброс опций редактора раздевания -$SSL_ResetStripOverridesHighlight Resets all custom strip settings set by the user +$SSL_StopCurrentAnimationsHighlight ОСтанавливает все активные потоки SexLab, вне зависимости от степени участия в них игрока. +$SSL_StopRunningAnimations Остановить все анимации +$SSL_ResetStripOverrides Сброс редактора раздевания +$SSL_ResetStripOverridesHighlight Сброс всех настроек раздевания сделаных пользователем $SSL_CleanSystem Реинициализировать SexLab -$SSL_CleanSystemHighlight Reinstalls SexLab; not recommended! +$SSL_CleanSystemHighlight Полностью реинициализирует SexLab; Не рекоммендуется! $SSL_WarnCleanSystem Процедура очистки сбросит все внутренние настройки SexLab до первоначальных значений, остановит все запущенные анимации и остановит выполнение скриптов. Вы действительно хотите продолжить? $SSL_Resetting Сброс... $SSL_CurrentlyInstalling Инициализация SexLab... @@ -634,10 +668,10 @@ $SSL_Expressions Эмоции # ------ Available Strap-ons $SSL_AvailableStrapons Доступные страпоны $SSL_RebuildStraponList Переустановить страпоны -$SSL_RebuildStraponListHighlight Updates the strap-ons list accessible to the framework +$SSL_RebuildStraponListHighlight Обновляет список страпонов доступных SexLab $SSL_FoundStrapon Обнаружены поддерживаемые страпоны. Установка завершена. $SSL_NoStrapons Поддерживаемых страпонов не найдено. Установка отменена. -$SSL_toggleStraponHighlight Click to disable the use of this strap-on by SexLab +$SSL_toggleStraponHighlight Нажмите чтобы выключить использование данного страпона SexLab # ------------------ Legacy -------------------------------------------------- diff --git a/dist/Interface/Translations/SexLab_SPANISH.txt b/dist/Interface/Translations/SexLab_SPANISH.txt index fbe4359f8..d3e27cd23 100644 --- a/dist/Interface/Translations/SexLab_SPANISH.txt +++ b/dist/Interface/Translations/SexLab_SPANISH.txt @@ -1,527 +1,586 @@ # --------------- Global ----------------------------------------------------- -$SSL_ClickHere Click Here -$SSL_Random Random -$SSL_Never Never -$SSL_Sometimes Sometimes -$SSL_Everything Everything -$SSL_Always Always -$SSL_Unknown Unknown -$SSL_Remove Remove -$SSL_Seconds {0} Seconds -$SSL_Male Male -$SSL_Female Female +$SSL_ClickHere Haz clic aquí +$SSL_Random Aleatorio +$SSL_Never Nunca +$SSL_Sometimes A veces +$SSL_Everything Todo +$SSL_Always Siempre +$SSL_Unknown Desconocido +$SSL_Remove Eliminar +$SSL_Seconds {0} segundos +$SSL_Male Hombre +$SSL_Female Mujer $SSL_Futa Futa -$SSL_Creature Creature -$SSL_NoTarget (No Target) -$SSL_Apply Apply -$SSL_Enabled Enabled -$SSL_PrevPage << PREVIOUS PAGE -$SSL_NextPage NEXT PAGE >> -$SSL_Low Low -$SSL_High High -$SSL_ConflictControl{}{} This key is already mapped to:\n{} ({})\n\nAre you sure you want to continue? -$SSL_ConflictControl{} This key is already mapped to:\n{}\n\nAre you sure you want to continue? -$SSL_KeyCannotBeDisabled This key is mandatory to be assigned and cannot be disabled. -$SSL_TSModeSelect Scenes Category -$SSL_TSModeSelectHighlight Choose the category of scenes for which the strip settings on this page are being configured +$SSL_Creature Criatura +$SSL_NoTarget (Sin objetivo) +$SSL_Apply Aplicar +$SSL_Enabled Activado +$SSL_PrevPage << PÁGINA ANTERIOR +$SSL_NextPage PÁGINA SIGUIENTE >> +$SSL_Low Bajo +$SSL_High Alto +$SSL_ConflictControl{}{} Esta tecla ya está asignada a:\n{} ({})\n\n¿Seguro que quieres continuar? +$SSL_ConflictControl{} Esta tecla ya está asignada a:\n{}\n\n¿Seguro que quieres continuar? +$SSL_KeyCannotBeDisabled Esta tecla es obligatoria y no puede desactivarse. +$SSL_TSModeSelect Categoría de escenas +$SSL_TSModeSelectHighlight Elige la categoría de escenas para la cual se configuran las opciones de desvestido en esta página # --------------- Races ----------------------------------------------------- -$SSL_Creatures Creatures -$SSL_Humans Humans +$SSL_Creatures Criaturas +$SSL_Humans Humanos -$SSL_Race_0 Humans +$SSL_Race_0 Humanos $SSL_Race_1 Ash Hopper -$SSL_Race_2 Bear -$SSL_Race_3 Boar -$SSL_Race_4 Boar Mounted -$SSL_Race_5 Boar Single -$SSL_Race_6 Canine +$SSL_Race_2 Oso +$SSL_Race_3 Jabalí +$SSL_Race_4 Jabalí montado +$SSL_Race_5 Jabalí individual +$SSL_Race_6 Cánido $SSL_Race_7 Chaurus -$SSL_Race_8 Chaurus Hunter -$SSL_Race_9 Chaurus Reaper -$SSL_Race_10 Chicken -$SSL_Race_11 Cow -$SSL_Race_12 Deer -$SSL_Race_13 Dog -$SSL_Race_14 Dragon -$SSL_Race_15 Dragon Priest +$SSL_Race_8 Cazador Chaurus +$SSL_Race_9 Segador Chaurus +$SSL_Race_10 Gallina +$SSL_Race_11 Vaca +$SSL_Race_12 Ciervo +$SSL_Race_13 Perro +$SSL_Race_14 Dragón +$SSL_Race_15 Sacerdote dragón $SSL_Race_16 Draugr -$SSL_Race_17 Dwarven Ballista -$SSL_Race_18 Dwarven Centurion -$SSL_Race_19 Dwarven Sphere -$SSL_Race_20 Dwarven Spider +$SSL_Race_17 Balista dwemer +$SSL_Race_18 Centurión dwemer +$SSL_Race_19 Esfera dwemer +$SSL_Race_20 Araña dwemer $SSL_Race_21 Falmer -$SSL_Race_22 Flame Atronach -$SSL_Race_23 Fox -$SSL_Race_24 Frost Atronach -$SSL_Race_25 Gargoyle -$SSL_Race_26 Giant -$SSL_Race_27 Giant Spider -$SSL_Race_28 Goat +$SSL_Race_22 Atronach de fuego +$SSL_Race_23 Zorro +$SSL_Race_24 Atronach de escarcha +$SSL_Race_25 Gárgola +$SSL_Race_26 Gigante +$SSL_Race_27 Araña gigante +$SSL_Race_28 Cabra $SSL_Race_29 Hagraven -$SSL_Race_30 Rabbit +$SSL_Race_30 Conejo $SSL_Race_31 Horker -$SSL_Race_32 Horse -$SSL_Race_33 Ice Wraith -$SSL_Race_34 Large Spider +$SSL_Race_32 Caballo +$SSL_Race_33 Espectro de hielo +$SSL_Race_34 Araña grande $SSL_Race_35 Lurker -$SSL_Race_36 Mammoth -$SSL_Race_37 Mudcrab +$SSL_Race_36 Mamut +$SSL_Race_37 Cangrejo de lodo $SSL_Race_38 Netch $SSL_Race_39 Riekling -$SSL_Race_40 Sabrecat +$SSL_Race_40 Sable felino $SSL_Race_41 Seeker $SSL_Race_42 Skeever -$SSL_Race_43 Slaughterfish -$SSL_Race_44 Spider +$SSL_Race_43 Pez asesino +$SSL_Race_44 Araña $SSL_Race_45 Spriggan -$SSL_Race_46 Storm Atronach -$SSL_Race_47 Troll -$SSL_Race_48 Vampire Lord -$SSL_Race_49 Werewolf +$SSL_Race_46 Atronach de tormenta +$SSL_Race_47 Trol +$SSL_Race_48 Señor vampiro +$SSL_Race_49 Hombre lobo $SSL_Race_50 Wisp -$SSL_Race_51 Wispmother -$SSL_Race_52 Wolf +$SSL_Race_51 Madre de las wisps +$SSL_Race_52 Lobo # --------------- UI ----------------------------------------------------- -$SSL_Thread Thread -$SSL_Positions Positions +$SSL_Thread Hilo +$SSL_Positions Posiciones $SSL_Debug Debug -$SSL_SceneInfo Scene Info -$SSL_Offset Offset -$SSL_AlternateScenes Scenes -$SSL_PickRandom Play Random Scene -$SSL_ToggleAutoplay Toggle Auto Play -$SSL_Name Name -$SSL_Author Author -$SSL_Package Package -$SSL_Tags Tags -$SSL_CustomTags Annotations -$SSL_ActiveFurniture{} Center: {} -$SSL_StepSize Step Size -$SSL_StageOnly Stage Only -$SSL_ResetOffsets Reset Offsets -$SSL_Permutation Permutation -$SSL_Expression Expression -$SSL_Voice Voice -$SSL_GhostMode Ghost Mode -$SSL_ExitMenu Exit Menu -$SSL_PauseAnimation Pause Animation -$SSL_MoveScene Move Scene -$SSL_Speed Speed -$SSL_NextStage Next Stage -$SSL_EndScene End Scene -$SSL_HideHUD Hide Game HUD -$SSL_HideUI Hide Scene HUD -$SSL_None None +$SSL_SceneInfo Información de escena +$SSL_Offset Desplazamiento +$SSL_AlternateScenes Escenas +$SSL_PickRandom Reproducir escena aleatoria +$SSL_ToggleAutoplay Activar reproducción automática +$SSL_Name Nombre +$SSL_Author Autor +$SSL_Package Paquete +$SSL_Tags Etiquetas +$SSL_CustomTags Anotaciones +$SSL_ActiveFurniture{} Centro: {} +$SSL_StepSize Tamaño del paso +$SSL_StageOnly Solo etapa +$SSL_ResetOffsets Restablecer desplazamientos +$SSL_Permutation Variación +$SSL_Expression Expresión +$SSL_Voice Voz +$SSL_GhostMode Modo fantasma +$SSL_ExitMenu Salir del menú +$SSL_PauseAnimation Pausar animación +$SSL_MoveScene Mover escena +$SSL_Speed Velocidad +$SSL_NextStage Siguiente etapa +$SSL_EndScene Finalizar escena +$SSL_HideHUD Ocultar HUD del juego +$SSL_HideUI Ocultar HUD de escena +$SSL_None Ninguno # --------------- Sex Journal (Sex Diary) ----------------------------------------------------- -$SSL_SexJournal Sex Journal -$SSL_SexDiary Sex Diary +$SSL_SexJournal Diario sexual +$SSL_SexDiary Diario íntimo -$SSL_StatSelectingMenu Viewing Statistics -$SSL_StatSelectingMenuHighlight The currently selected Reference which's statistics are being displayed. +$SSL_StatSelectingMenu Visualizando estadísticas +$SSL_StatSelectingMenuHighlight Referencia seleccionada cuyas estadísticas se están mostrando actualmente. -$SSL_Reset{}Stats Reset {} Stats -$SSL_ResetStatHighlight Delete the selected Actor from the statistics registry, effectively resetting their statistics, default and custom ones. -$SSL_WarnReset{}Stats Running this will reset all sexual experience and stats for {}. Do you want to continue? +$SSL_Reset{}Stats Restablecer estadísticas de {} +$SSL_ResetStatHighlight Elimina al actor seleccionado del registro de estadísticas, restableciendo sus estadísticas (predeterminadas y personalizadas). +$SSL_WarnReset{}Stats Esto restablecerá toda la experiencia y estadísticas sexuales de {}. ¿Deseas continuar? # ------ Statistics -$SSL_Statistics Statistics - -$SSL_LastTimeInScene Date of last Scene -$SSL_TimeInScenes Time spent in Scenes -$SSL_Statistic_2 Vaginal Experience -$SSL_Statistic_3 Anal Experience -$SSL_Statistic_4 Oral Experience - -$SSL_Unskilled Unskilled -$SSL_Novice Novice -$SSL_Apprentice Apprentice -$SSL_Journeyman Journeyman -$SSL_Expert Expert -$SSL_Master Master -$SSL_GrandMaster Grand Master - -$SSL_Statistic_5 Partners: Male -$SSL_Statistic_6 Partners: Female -$SSL_Statistic_7 Partners: Futa -$SSL_Statistic_8 Partners: Creature - -$SSL_Sexuality Sexuality -$SSL_SexualityHighlight Click to change this Actors sexuality. - -$SSL_Lesbian Lesbian +$SSL_Statistics Estadísticas + +$SSL_LastTimeInScene Fecha de la última escena +$SSL_TimeInScenes Tiempo en escenas +$SSL_Statistic_2 Experiencia vaginal +$SSL_Statistic_3 Experiencia anal +$SSL_Statistic_4 Experiencia oral + +$SSL_Unskilled Inexperto +$SSL_Novice Novato +$SSL_Apprentice Aprendiz +$SSL_Journeyman Intermedio +$SSL_Expert Experto +$SSL_Master Maestro +$SSL_GrandMaster Gran maestro + +$SSL_Statistic_5 Parejas: Hombre +$SSL_Statistic_6 Parejas: Mujer +$SSL_Statistic_7 Parejas: Futa +$SSL_Statistic_8 Parejas: Criatura + +$SSL_Sexuality Sexualidad +$SSL_SexualityHighlight Haz clic para cambiar la sexualidad de este actor. + +$SSL_Lesbian Lesbiana $SSL_Gay Gay $SSL_Bisexual Bisexual $SSL_Heterosexual Heterosexual -$SSL_Statistic_9 Times Oral -$SSL_Statistic_10 Times Vaginal -$SSL_Statistic_11 Times Anal -$SSL_Statistic_12 Times Masturbated -$SSL_Statistic_13 Times Submissive -$SSL_Statistic_14 Times Dominant -$SSL_Statistic_15 Times Total +$SSL_Statistic_9 Veces oral +$SSL_Statistic_10 Veces vaginal +$SSL_Statistic_11 Veces anal +$SSL_Statistic_12 Veces masturbado +$SSL_Statistic_13 Veces sumiso +$SSL_Statistic_14 Veces dominante +$SSL_Statistic_15 Veces totales # ----------------- Animation Settings --------------------------------------------------- -$SSL_AnimationSettings Animation Settings +$SSL_AnimationSettings Ajustes de animación # ------ Player settings -$SSL_PlayerSettings Player Settings - -$SSL_bAutoAdvance Auto Advance Stages -$SSL_bAutoAdvanceHighlight Animations will automatically advance by timer when player is involved. -$SSL_bDisablePlayer Disable Victim Controls -$SSL_bDisablePlayerHighlight When player is the victim in an animation, animation controls are not enabled. -$SSL_bAutoTFC Automatic Free Camera -$SSL_bAutoTFCHighlight If enabled, will automatically enable the free flying camera (TFC) when animation involving the player starts. -$SSL_fAutoSUCSM Free Camera Speed -$SSL_fAutoSUCSMHighlight When starting the free camera this will be the default speed it will move at. -$SSL_PlayerSex Player Sex -$SSL_{}Sex {}'s Sex -$SSL_SexSelectHighlight How SexLab perceives this actor's sex. This is used to determine which position(s) an actor can be placed in during scenes. Has no direct influence on how an actor acts or looks. +$SSL_PlayerSettings Ajustes del jugador + +$SSL_bAutoAdvance Avance automático de etapas +$SSL_bAutoAdvanceHighlight Las animaciones avanzarán automáticamente por tiempo cuando el jugador esté involucrado. +$SSL_bDisablePlayer Desactivar controles de víctima +$SSL_bDisablePlayerHighlight Cuando el jugador sea la víctima en una animación, los controles de animación no estarán disponibles. +$SSL_bAutoTFC Cámara libre automática +$SSL_bAutoTFCHighlight Si está activado, se habilitará automáticamente la cámara libre (TFC) al iniciar una animación con el jugador. +$SSL_fAutoSUCSM Velocidad de cámara libre +$SSL_fAutoSUCSMHighlight Al iniciar la cámara libre, esta será la velocidad predeterminada de movimiento. +$SSL_PlayerSex Sexo del jugador +$SSL_{}Sex Sexo de {} +$SSL_SexSelectHighlight Cómo SexLab interpreta el sexo de este actor. Se usa para determinar en qué posiciones puede participar durante escenas. No afecta directamente su comportamiento o apariencia. # ------ Extra effects -$SSL_ExtraEffects Extra Effects - -$SSL_ClimaxType Climax Type -$SSL_ClimaxTypeHighlight The behavior of climaxes during Scenes. -$SSL_Climax_0 Scene (Orgasm Stages) -$SSL_Climax_1 Legacy (Animation End) -$SSL_Climax_2 Separate (SLSO) - -$SSL_bOrgasmEffects Play Orgasm Effects -$SSL_bOrgasmEffectsHighlight If enabled, orgasm sounds effects will be played on each actor orgasm, also the camera shake on player orgasm. -$SSL_fShakeStrength Shake Camera Strength -$SSL_fShakeStrengthHighlight If "Play Orgasm Effects" is enabled, set the strength of the camera shake on player orgasm.\nSet on "0" to disable it. -$SSL_bUseCum Apply Cum Effects -$SSL_bUseCumHighlight Apply a cum texture effect to receiver/victim characters after a male partner/aggressor orgasm. -$SSL_fCumTimer Cum Effect Timer -$SSL_fCumTimerHighlight How long the above cum effect will display on a character. -$SSL_bUseExpressions Apply Facial Expressions -$SSL_bUseExpressionsHighlight Applies selected MFG presets to an actor during animation which increases as the animation progresses in relation to that particular characters applicable skills. WARNING: The expression presets can cause graphical oddities when combined with the voice lip syncing option. -$SSL_bUseLipSync Play Lip Sync Animation -$SSL_bUseLipSyncHighlight Whenever an actor moans, a basic mouth movement animation will be played. WARNING: The animation tends to fail to play correctly when combined with MFG facial expressions. +$SSL_ExtraEffects Efectos extra + +$SSL_ClimaxType Tipo de clímax +$SSL_ClimaxTypeHighlight Comportamiento de los clímax durante las escenas. +$SSL_Climax_0 Escena (etapas de orgasmo) +$SSL_Climax_1 Clásico (fin de animación) +$SSL_Climax_2 Separado (SLSO) + +$SSL_bOrgasmEffects Efectos de orgasmo +$SSL_bOrgasmEffectsHighlight Si está activado, se reproducirán sonidos de orgasmo en cada actor y se aplicará vibración de cámara en el orgasmo del jugador. +$SSL_fShakeStrength Intensidad de vibración de cámara +$SSL_fShakeStrengthHighlight Si "Efectos de orgasmo" está activado, define la intensidad de la vibración de cámara en el orgasmo del jugador.\nPonlo en "0" para desactivarlo. +$SSL_bUseCum Aplicar efectos de semen +$SSL_bUseCumHighlight Aplica un efecto visual de semen al personaje receptor/víctima después del orgasmo de una pareja masculina/agresora. +$SSL_fCumTimer Duración del efecto +$SSL_fCumTimerHighlight Define cuánto tiempo se mostrará el efecto anterior en el personaje. +$SSL_bUseExpressions Aplicar expresiones faciales +$SSL_bUseExpressionsHighlight Aplica presets de MFG al actor durante la animación, aumentando según el progreso y las habilidades del personaje. ADVERTENCIA: Puede causar errores visuales si se combina con sincronización labial. +$SSL_bUseLipSync Sincronización labial +$SSL_bUseLipSyncHighlight Cuando un actor emite sonidos, se reproducirá una animación básica de movimiento de boca. ADVERTENCIA: Puede fallar si se combina con expresiones MFG. # ------ Lovense $SSL_Lovense Lovense -$SSL_iLovenseStrength Default Strength -$SSL_iLovenseStrengthHighlight Vibration strength of Lovense Toys during scenes. Only applies to scenes the player is involved. -$SSL_iLovenseStrengthOrgasm Orgasm Strength -$SSL_iLovenseStrengthOrgasmHighlight Vibration strength of Lovense Toys after an orgasm occurs. Only applies to the player's orgasms. -$SSL_iLovenseDurationOrgasm Orgasm Duration -$SSL_iLovenseDurationOrgasmHighlight How long the vibration will last before resetting when an orgasm occurs. +$SSL_iLovenseStrength Intensidad predeterminada +$SSL_iLovenseStrengthHighlight Intensidad de vibración de dispositivos Lovense durante escenas. Solo aplica si el jugador participa. +$SSL_iLovenseStrengthOrgasm Intensidad en orgasmo +$SSL_iLovenseStrengthOrgasmHighlight Intensidad de vibración tras un orgasmo. Solo aplica a los orgasmos del jugador. +$SSL_iLovenseDurationOrgasm Duración del orgasmo +$SSL_iLovenseDurationOrgasmHighlight Cuánto dura la vibración antes de reiniciarse tras un orgasmo. # ------ Creatures -$SSL_bAllowCreatures Allow Creature Animation -$SSL_bAllowCreaturesHighlight Allows creatures to be used in animations. -$SSL_bCreatureGender Match Creature Sex -$SSL_bCreatureGenderHighlight If SexLab should differ between male and female creatures.\nSexLab usually treats all non-human actors as male. +$SSL_bAllowCreatures Permitir animaciones con criaturas +$SSL_bAllowCreaturesHighlight Permite usar criaturas en animaciones. +$SSL_bCreatureGender Coincidir sexo de criaturas +$SSL_bCreatureGenderHighlight Define si SexLab diferencia entre criaturas macho y hembra.\nNormalmente, SexLab trata a todas las criaturas como machos. # ------ Animation Handling -$SSL_AnimationHandling Animation Handling - -$SSL_UseFade Use Fade -$SSL_UseFadeHighlight Apply an image modifier effect at the beginning of an animation. -$SSL_UseBlur Blur -$SSL_UseBlack Black -$SSL_bUndressAnimation Undress Animation -$SSL_bUndressAnimationHighlight Actors will play an undressing animation when initially stripping. -$SSL_bRedressVictim Victim's Re-dress -$SSL_bRedressVictimHighlight Victims in animations will not automatically dress after the animation ends. -$SSL_bDisableTeleport Disable Starting Teleport -$SSL_bDisableTeleportHighlight On animation start, actors will attempt to approach each other prior to the animation fully starting. -$SSL_bShowInMap Show Scenes on Map -$SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). -$SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed -$SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). -$SSL_FurnitureNPC Furniture Use: NPC -$SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. -$SSL_AskNotSub Ask (Unless Submissive) -$SSL_AskAlways Ask (Always) -$SSL_FurniturePlayer Furniture Use: Player -$SSL_FurniturePlayerHighlight Decide when you want to use Furniture Scenes (when applicable). This overwrites the corresponding NPC setting for scenes involved the player. 'Ask'-Options open a menu to select a furniture. If submissive (and the 'Unless Submissive' version is set), falls back into NPC settings. +$SSL_AnimationHandling Gestión de animaciones + +$SSL_UseFade Usar fundido +$SSL_UseFadeHighlight Aplica un efecto visual al inicio de la animación. +$SSL_UseBlur Desenfoque +$SSL_UseBlack Negro +$SSL_bUndressAnimation Animación de desvestido +$SSL_bUndressAnimationHighlight Los actores reproducirán una animación al desvestirse. +$SSL_bRedressVictim Vestir a la víctima +$SSL_bRedressVictimHighlight Las víctimas no se vestirán automáticamente al terminar la animación. +$SSL_bDisableTeleport Desactivar teletransporte inicial +$SSL_bDisableTeleportHighlight Al iniciar la animación, los actores intentarán acercarse antes de comenzar completamente. +$SSL_bShowInMap Mostrar escenas en el mapa +$SSL_bShowInMapHighlight Muestra un marcador de misión para cada escena cercana (excepto las del jugador). +$SSL_bSetAnimSpeedByEnjoyment Velocidad según disfrute +$SSL_bSetAnimSpeedByEnjoymentHighlight La velocidad de la animación cambia según el disfrute del actor (+/-20%). +# TODO: $SSL_AdjustStage +$SSL_AdjustStage Adjust Stage Only +# TODO: $SSL_AdjustStageHighlight +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +# TODO: $SSL_fAdjustStepSize +$SSL_fAdjustStepSize Offset Step Size +# TODO: $SSL_fAdjustStepSizeHighlight +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Ocultar HUD del juego +$SSL_bHideHUDHighlight Oculta la interfaz del juego, no la de escena. +$SSL_FurnitureNPC Uso de mobiliario: NPC +$SSL_FurnitureNPCHighlight Decide cómo los NPC usan muebles. Específicamente, si usan escenas con muebles en lugar de normales cuando estén disponibles. +$SSL_AskNotSub Preguntar (si no es sumiso) +$SSL_AskAlways Preguntar (siempre) +$SSL_FurniturePlayer Uso de mobiliario: Jugador +$SSL_FurniturePlayerHighlight Decide cuándo usar escenas con muebles. Sobrescribe la configuración de NPC en escenas con el jugador. Las opciones "Preguntar" abren un menú. Si eres sumiso, se aplican las reglas de NPC. # ---- COMEBACK: Might delete -$SSL_bDisableScale Disable Scaling / CTD Fix -$SSL_bDisableScaleHighlight !!! Only Enable if Needed !!!\nDisables all internal uses of SetScale() within SexLab, which is known to cause crashes during animation start for some users. Some scaling may still occur through other means, such as furniture use, which SexLab will be unable to correct for while this is enabled. Your results may vary. +$SSL_bDisableScale Desactivar escalado / Corrección CTD +$SSL_bDisableScaleHighlight ¡¡¡ Activar solo si es necesario !!!\nDesactiva todos los usos internos de SetScale() en SexLab, lo cual puede causar cierres inesperados (CTD) al iniciar animaciones en algunos usuarios. Puede que algunos escalados sigan ocurriendo por otros medios (como mobiliario), los cuales SexLab no podrá corregir mientras esto esté activado. Los resultados pueden variar. # ----------------- Voices & SFX --------------------------------------------------- -$SSL_SoundSettings Voices & SFX - -$SSL_fSFXVolume SFX Volume -$SSL_fSFXVolumeHighlight The overall volume of the SFX from 0.0 as silent to 1.0 as full volume. -$SSL_fSFXDelay SFX Delay -$SSL_fSFXDelayHighlight Applicable sound effects will start out at this interval and will decrease with each stage. -$SSL_fVoiceVolume Voice Volume -$SSL_fVoiceVolumeHighlight The overall volume of the voices from 0.0 as silent to 1.0 as full volume. -$SSL_fMaleVoiceDelay Male Voice Delay -$SSL_fMaleVoiceDelayHighlight Male's will start out voicing at this interval and will decrease with each stage. -$SSL_fFemaleVoiceDelay Female Voice Delay -$SSL_fFemaleVoiceDelayHighlight Female's will start out voicing at this interval and will decrease with each stage. - -$SSL_CachedVoices Cached Voices -$SSL_SelectVoiceCache Selected Actor -$SSL_SelectVoiceCacheHighlight The actor which's voice you are currently viewing. -$SSL_SelectVoiceCacheV Actor Voice -$SSL_SelectVoiceCacheVHighlight The SexLab Voice this actor is using.\nVoices (if not manually selected) will be set the first time an actor partakes in an animation. - -$SSL_ToggleVoices Toggle Voices -$SSL_ActiveVoices Viewed Voices -$SSL_ActiveVoicesHighlight The voices you are currently viewing, filtered by the specified Race. - -$SSL_FemaleAverage [SL] Female Average -$SSL_FemaleBreathy [SL] Female Breathy -$SSL_FemaleClassic [SL] Female Classic -$SSL_FemaleExcitable [SL] Female Excitable -$SSL_FemaleMature [SL] Female Mature -$SSL_FemaleQuiet [SL] Female Quiet -$SSL_FemaleStimulated [SL] Female Stimulated -$SSL_FemaleYoung [SL] Female Young -$SSL_FemaleFlat [SL] Female Flat -$SSL_FemaleRebellious [SL] Female Rebellious -$SSL_FemaleRebellious2 [SL] Female Rebellious (Alt) -$SSL_FemaleRough [SL] Female Rough -$SSL_FemaleSeductive [SL] Female Seductive -$SSL_FemaleShy [SL] Female Shy -$SSL_FemaleShy2 [SL] Female Shy (Alt) -$SSL_FemaleWarrior [SL] Female Warrior - -$SSL_MaleAverage [SL] Male Average -$SSL_MaleCalm [SL] Male Calm -$SSL_MaleNeutral [SL] Male Neutral -$SSL_MaleRough [SL] Male Rough - -$SSL_ChaurusVoice01 [SL] Chaurus Default -$SSL_DogVoice01 [SL] Dog Default -$SSL_DraugrVoice01 [SL] Draugr Default -$SSL_FalmerVoice01 [SL] Falmer Default -$SSL_GiantVoice01 [SL] Giant Default -$SSL_HorseVoice01 [SL] Horse Default -$SSL_SprigganVoice01 [SL] Spriggan Default -$SSL_TrollVoice01 [SL] Troll Default -$SSL_WerewolfVoice01 [SL] Werewolf Default -$SSL_WolfVoice01 [SL] Wolf Default +$SSL_SoundSettings Voces y efectos + +$SSL_fSFXVolume Volumen de efectos +$SSL_fSFXVolumeHighlight Volumen general de efectos desde 0.0 (silencio) hasta 1.0 (máximo). +$SSL_fSFXDelay Retardo de efectos +$SSL_fSFXDelayHighlight Los efectos de sonido comenzarán con este intervalo y disminuirán en cada etapa. +$SSL_fVoiceVolume Volumen de voz +$SSL_fVoiceVolumeHighlight Volumen general de voces desde 0.0 (silencio) hasta 1.0 (máximo). +$SSL_fMaleVoiceDelay Retardo voz masculina +$SSL_fMaleVoiceDelayHighlight Las voces masculinas comenzarán con este intervalo y disminuirán en cada etapa. +$SSL_fFemaleVoiceDelay Retardo voz femenina +$SSL_fFemaleVoiceDelayHighlight Las voces femeninas comenzarán con este intervalo y disminuirán en cada etapa. + +$SSL_CachedVoices Voces en caché +$SSL_SelectVoiceCache Actor seleccionado +$SSL_SelectVoiceCacheHighlight Actor cuya voz estás viendo actualmente. +$SSL_SelectVoiceCacheV Voz del actor +$SSL_SelectVoiceCacheVHighlight Voz de SexLab usada por este actor.\nSi no se selecciona manualmente, se asigna la primera vez que participa en una animación. + +$SSL_ToggleVoices Activar/Desactivar voces +$SSL_ActiveVoices Voces visibles +$SSL_ActiveVoicesHighlight Voces que estás visualizando actualmente, filtradas por la raza seleccionada. + +$SSL_FemaleAverage [SL] Femenina promedio +$SSL_FemaleBreathy [SL] Femenina suave +$SSL_FemaleClassic [SL] Femenina clásica +$SSL_FemaleExcitable [SL] Femenina excitada +$SSL_FemaleMature [SL] Femenina madura +$SSL_FemaleQuiet [SL] Femenina silenciosa +$SSL_FemaleStimulated [SL] Femenina estimulada +$SSL_FemaleYoung [SL] Femenina joven +$SSL_FemaleFlat [SL] Femenina plana +$SSL_FemaleRebellious [SL] Femenina rebelde +$SSL_FemaleRebellious2 [SL] Femenina rebelde (Alt) +$SSL_FemaleRough [SL] Femenina ruda +$SSL_FemaleSeductive [SL] Femenina seductora +$SSL_FemaleShy [SL] Femenina tímida +$SSL_FemaleShy2 [SL] Femenina tímida (Alt) +$SSL_FemaleWarrior [SL] Femenina guerrera + +$SSL_MaleAverage [SL] Masculina promedio +$SSL_MaleCalm [SL] Masculina calmada +$SSL_MaleNeutral [SL] Masculina neutral +$SSL_MaleRough [SL] Masculina ruda + +$SSL_ChaurusVoice01 [SL] Chaurus (predeterminado) +$SSL_DogVoice01 [SL] Perro (predeterminado) +$SSL_DraugrVoice01 [SL] Draugr (predeterminado) +$SSL_FalmerVoice01 [SL] Falmer (predeterminado) +$SSL_GiantVoice01 [SL] Gigante (predeterminado) +$SSL_HorseVoice01 [SL] Caballo (predeterminado) +$SSL_SprigganVoice01 [SL] Spriggan (predeterminado) +$SSL_TrollVoice01 [SL] Trol (predeterminado) +$SSL_WerewolfVoice01 [SL] Hombre lobo (predeterminado) +$SSL_WolfVoice01 [SL] Lobo (predeterminado) # ------------------Player Hotkeys-------------------------------------------------- -$SSL_PlayerHotkeys Player Hotkeys +$SSL_PlayerHotkeys Atajos del jugador + +# TODO: $SSL_bUseSceneMenu +$SSL_bUseSceneMenu Use Scene Menu +# TODO: $SSL_bUseSceneMenuHighlight +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. # ------ Global SexLab Hotkeys -$SSL_GlobalHotkeys Global SexLab Hotkeys +$SSL_GlobalHotkeys Atajos globales de SexLab -$SSL_iTargetActor Target Actor For Edit -$SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. -$SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iTargetActor Seleccionar actor para editar +$SSL_iTargetActorHighlight Tras pulsar esta tecla, apunta con la mira a un actor hasta recibir notificación. Luego podrás editarlo en varios menús. +$SSL_iToggleFreeCamera Alternar cámara libre +$SSL_iToggleFreeCameraHighlight Activa/desactiva la cámara libre (igual que TFC). Funciona siempre, incluso fuera de animaciones. +# TODO: $SSL_iToggleThreadControl +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation -$SSL_SceneManipulation Scene Manipulation -$SSL_iKeyUp Select Branch / Up -$SSL_iKeyDown Select Branch / Down -$SSL_iKeyLeft Decrease Speed / Left -$SSL_iKeyRight Increase Speed / Right -$SSL_iKeyAdvance Advance Scene / Select -$SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab -$SSL_iKeyExtra2 Open Menu / Swap Menu Tab -$SSL_iKeyMod Modifier -$SSL_iKeyReset Inverse Action -$SSL_iChangeAnimation Change Animation -$SSL_iMoveScene Move Scene +$SSL_SceneManipulation Control de escena +$SSL_iKeyUp Seleccionar / Arriba +$SSL_iKeyDown Seleccionar / Abajo +$SSL_iKeyLeft Reducir velocidad / Izquierda +$SSL_iKeyRight Aumentar velocidad / Derecha +$SSL_iKeyAdvance Avanzar escena / Seleccionar +$SSL_iKeyEnd Finalizar escena / Atrás +$SSL_iKeyExtra2 Abrir menú / Cambiar pestaña +$SSL_iKeyMod Modificador +# TODO: $SSL_iKeyModHighlight +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. +$SSL_iKeyReset Acción inversa + +# TODO: $SSL_LegacyHotkeys +$SSL_LegacyHotkeys Legacy Hotkeys +$SSL_iChangeAnimation Cambiar animación +$SSL_iMoveScene Mover escena +# TODO: $SSL_iChangePositions +$SSL_iChangePositions Change Positions +# TODO: $SSL_iOffsetAdjustMode +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +# TODO: $SSL_iOffsetAdjustModeHighlight +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +# TODO: $SSL_iToggleAdjustStage +$SSL_iToggleAdjustStage Toggle Adjust Stage +# TODO: $SSL_iRestoreOffsets +$SSL_iRestoreOffsets Reset Offset Adjustments +# TODO: $SSL_iSceneSelectorMenu +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +# TODO: $SSL_SS_OffsetAdjustMode +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +# TODO: $SSL_SS_ChangeCurrentScene +$SSL_SS_ChangeCurrentScene Change Current Scene +# TODO: $SSL_SS_ResetScenesByTagName +$SSL_SS_ResetScenesByTagName Search By Tag/Name +# TODO: $SSL_SS_AdjNone +$SSL_SS_AdjNone Disable Offset Adjustments +# TODO: $SSL_SS_AdjPosXY +$SSL_SS_AdjPosXY Ajust Position XY +# TODO: $SSL_SS_AdjPosRZ +$SSL_SS_AdjPosRZ Ajust Position RZ +# TODO: $SSL_SS_AdjSceneXY +$SSL_SS_AdjSceneXY Ajust Furniture XY +# TODO: $SSL_SS_AdjSceneRZ +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- -$SSL_TimersStripping Timers & Stripping +$SSL_TimersStripping Tiempos y desvestido # ------ Timers -$SSL_Timers Timers -$SSL_StageTimer_0 Stage 1 Length -$SSL_StageTimer_1 Stage 2 Length -$SSL_StageTimer_2 Stage 3 Length -$SSL_StageTimer_3 Ending Stage Length +$SSL_Timers Tiempos +$SSL_StageTimer_0 Duración etapa 1 +$SSL_StageTimer_1 Duración etapa 2 +$SSL_StageTimer_2 Duración etapa 3 +$SSL_StageTimer_3 Duración etapa final # ------ Stripping -$SSL_Stripping Stripping +$SSL_Stripping Desvestido -$SSL_DefaultStripping Standard/Default Scenes -$SSL_DominantStripping Dominant Scenes +$SSL_DefaultStripping Escenas estándar +$SSL_DominantStripping Escenas dominantes -$SSL_StrippingFst_0 Male Actors -$SSL_StrippingSnd_0 Female Actors -$SSL_StrippingFst_1 Dominant Actors -$SSL_StrippingSnd_1 Submissive Actors -$SSL_ExtraSlots Extra Slots, not always accurately labeled +$SSL_StrippingFst_0 Actores masculinos +$SSL_StrippingSnd_0 Actores femeninos +$SSL_StrippingFst_1 Actores dominantes +$SSL_StrippingSnd_1 Actores sumisos +$SSL_ExtraSlots Ranuras extra (pueden no estar bien etiquetadas) -$SSL_Strip_0 [30] Head -$SSL_Strip_1 [31] Hair +$SSL_Strip_0 [30] Cabeza +$SSL_Strip_1 [31] Cabello $SSL_Strip_2 [32] Torso -$SSL_Strip_3 [33] Hands -$SSL_Strip_4 [34] Forearms -$SSL_Strip_5 [35] Amulet -$SSL_Strip_6 [36] Ring -$SSL_Strip_7 [37] Feet -$SSL_Strip_8 [38] Calves -$SSL_Strip_9 [39] Shield -$SSL_Strip_10 [40] Tail -$SSL_Strip_11 [41] Long Hair -$SSL_Strip_12 [42] Circlet -$SSL_Strip_13 [43] Ears -$SSL_Strip_14 [44] Face/Mouth -$SSL_Strip_15 [45] Neck -$SSL_Strip_16 [46] Chest -$SSL_Strip_17 [47] Back -$SSL_Strip_18 [48] Misc Slot -$SSL_Strip_19 [49] Pelvis/Outergarments -$SSL_Strip_20 [50] Decapitated Head -$SSL_Strip_21 [51] Decapitate -$SSL_Strip_22 [52] Pelvis/Undergarments -$SSL_Strip_23 [53] Legs/Right Leg -$SSL_Strip_24 [54] Legs/Left Leg -$SSL_Strip_25 [55] Face/Jewelry -$SSL_Strip_26 [56] Chest/Undergarments -$SSL_Strip_27 [57] Shoulders -$SSL_Strip_28 [58] Arms/Left Arm/Undergarments -$SSL_Strip_29 [59] Arms/Right Arm/Outergarments -$SSL_Strip_30 [60] *3BA Bodies -$SSL_Strip_31 [61] *Spell FX -$SSL_Weapons [--] Weapons +$SSL_Strip_3 [33] Manos +$SSL_Strip_4 [34] Antebrazos +$SSL_Strip_5 [35] Amuleto +$SSL_Strip_6 [36] Anillo +$SSL_Strip_7 [37] Pies +$SSL_Strip_8 [38] Pantorrillas +$SSL_Strip_9 [39] Escudo +$SSL_Strip_10 [40] Cola +$SSL_Strip_11 [41] Cabello largo +$SSL_Strip_12 [42] Diadema +$SSL_Strip_13 [43] Orejas +$SSL_Strip_14 [44] Cara/Boca +$SSL_Strip_15 [45] Cuello +$SSL_Strip_16 [46] Pecho +$SSL_Strip_17 [47] Espalda +$SSL_Strip_18 [48] Ranura misc +$SSL_Strip_19 [49] Pelvis/Ropa exterior +$SSL_Strip_20 [50] Cabeza decapitada +$SSL_Strip_21 [51] Decapitación +$SSL_Strip_22 [52] Pelvis/Ropa interior +$SSL_Strip_23 [53] Piernas/Pierna derecha +$SSL_Strip_24 [54] Piernas/Pierna izquierda +$SSL_Strip_25 [55] Cara/Joyería +$SSL_Strip_26 [56] Pecho/Ropa interior +$SSL_Strip_27 [57] Hombros +$SSL_Strip_28 [58] Brazos/Brazo izquierdo/Ropa interior +$SSL_Strip_29 [59] Brazos/Brazo derecho/Ropa exterior +$SSL_Strip_30 [60] *Cuerpos 3BA +$SSL_Strip_31 [61] *Efectos mágicos +$SSL_Weapons [--] Armas # ------------------ Toggle Animations -------------------------------------------------- -$SSL_ToggleAnimations Toggle Animations -$SSL_TogglePackage Filter by Animation Pack -$SSL_TogglePackageHighlight Filter animations of a specific animation pack/module only -$SSL_ToggleGroup Filter by Group -$SSL_togglecategoryHighlight Filter animations by human/creature category -$SSL_ToggleVisible Toggle Visible -$SSL_ToggleVisibleHighlight Enable or disable all animations filtered on this page -$SSL_TagFilter Filter by Tags -$SSL_toggletagsHighlight Filter animations by tags -$SSL_Page{}{} Page {}/{} +$SSL_ToggleAnimations Activar/Desactivar animaciones +$SSL_TogglePackage Filtrar por paquete de animaciones +$SSL_TogglePackageHighlight Filtra únicamente las animaciones de un paquete/módulo específico +$SSL_ToggleGroup Filtrar por grupo +$SSL_togglecategoryHighlight Filtra animaciones por categoría (humano/criatura) +$SSL_ToggleVisible Activar/Desactivar visibles +$SSL_ToggleVisibleHighlight Activa o desactiva todas las animaciones filtradas en esta página +$SSL_TagFilter Filtrar por etiquetas +$SSL_toggletagsHighlight Filtra animaciones mediante etiquetas +$SSL_Page{}{} Página {}/{} # ------------------ Matchmaker -------------------------------------------------- $SSL_MatchMaker Matchmaker -$SSL_ToggleMatchMaker Enable Matchmaker -$SSL_ToggleMatchMakerHighlight Enable Matchmaker. Spells will be added to the spell menu +$SSL_ToggleMatchMaker Activar Matchmaker +$SSL_ToggleMatchMakerHighlight Activa Matchmaker. Se añadirán hechizos al menú de hechizos # ------ Tag Settings -$SSL_MatchMakerTagsSettings Tag Settings -$SSL_InputTags Tags: -$SSL_matchmakerInputTagsHighlight Resulting tag string based on tag inputs below -$SSL_InputRequiredTags Required Tags: -$SSL_matchmakerInputRequiredTagsHighlight A list of comma-separated tags, all of which must be present simultaneously in the filtered scene(s) -$SSL_InputExcludedTags Excluded Tags: -$SSL_matchmakerInputExcludedTagsHighlight A list of comma-separated tags, none of which shall be present in the filtered scene(s) -$SSL_InputOptionalTags Optional Tags: -$SSL_matchmakerInputOptionalTagsHighlight A list of comma-separated tags, at least one of which shall be present in the filtered scene(s) -$SSL_TextResetTags Reset Tags -$SSL_TextResetTagsHighlight Resets all tag input fields -$SSL_ResetTagsHere Click -$SSL_TagResetAreYouSure Reset all tags, are you sure? +$SSL_MatchMakerTagsSettings Configuración de etiquetas +$SSL_InputTags Etiquetas: +$SSL_matchmakerInputTagsHighlight Cadena de etiquetas resultante basada en las entradas de abajo +$SSL_InputRequiredTags Etiquetas requeridas: +$SSL_matchmakerInputRequiredTagsHighlight Lista de etiquetas separadas por comas; todas deben estar presentes simultáneamente en las escenas filtradas +$SSL_InputExcludedTags Etiquetas excluidas: +$SSL_matchmakerInputExcludedTagsHighlight Lista de etiquetas separadas por comas; ninguna debe estar presente en las escenas filtradas +$SSL_InputOptionalTags Etiquetas opcionales: +$SSL_matchmakerInputOptionalTagsHighlight Lista de etiquetas separadas por comas; al menos una debe estar presente en las escenas filtradas +$SSL_TextResetTags Restablecer etiquetas +$SSL_TextResetTagsHighlight Restablece todos los campos de etiquetas +$SSL_ResetTagsHere Haz clic +$SSL_TagResetAreYouSure Restablecer todas las etiquetas, ¿estás seguro? # ------ Actor Settings -$SSL_MatchMakerActorSettings Actor Settings -$SSL_bSubmissivePlayer Submissive Player -$SSL_bSubmissivePlayerHighlight Filter scenes with player in the submissive position -$SSL_bSubmissiveTarget Submissive Target -$SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissive position +$SSL_MatchMakerActorSettings Configuración de actores +$SSL_bSubmissivePlayer Jugador sumiso +$SSL_bSubmissivePlayerHighlight Filtra escenas donde el jugador está en posición sumisa +$SSL_bSubmissiveTarget Objetivo sumiso +$SSL_bSubmissiveTargetHighlight Filtra escenas donde el actor objetivo está en posición sumisa # ------------------ Enjoyment -------------------------------------------------- -$SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjoymentSettings Configuración de disfrute +# TODO: $SSL_EnjPrimarySettings +$SSL_EnjPrimarySettings Primary Settings +# TODO: $SSL_EnjGeneralConfigs +$SSL_EnjGeneralConfigs General Configs +# TODO: $SSL_EnjGameConfigs +$SSL_EnjGameConfigs Game Configs +# TODO: $SSL_EnjPainConfigs +$SSL_EnjPainConfigs Pain Configs +# TODO: $SSL_EnjGameHotkeys +$SSL_EnjGameHotkeys Game Hotkeys +# TODO: $SSL_EnjMiscRateMult +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings -$SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment -$SSL_bInternalEnjoymentEnabledHighlight Toggles the internal enjoyment system. Should stay enabled unless an external mod desires to take full control of the enjoyment calculus. -$SSL_fEnjRaiseMultInter EnjRaise Mult: Interactions -$SSL_fEnjRaiseMultInterHighlight The main multiplier/factor determining the rate at which enjoyment increases for an actor based on detected interactions. Higher values mean faster enjoyment raise and vice versa.\n Can be reduced to zero if user desires enjoyment raise to depend solely on the enjoyment minigame. -$SSL_bGameEnabled Enable Enjoyment Game -$SSL_bGameEnabledHighlight Toggles the enjoyment minigame inspired from SLSO's implementation. +$SSL_bInternalEnjoymentEnabled Activar sistema de disfrute interno +$SSL_bInternalEnjoymentEnabledHighlight Activa el sistema interno de disfrute. Debería permanecer activado salvo que otro mod externo controle completamente este sistema. +$SSL_fEnjRaiseMultInter Multiplicador de aumento (interacciones) +$SSL_fEnjRaiseMultInterHighlight Multiplicador principal que determina la velocidad a la que aumenta el disfrute según las interacciones detectadas. Valores altos = aumento más rápido.\nPuede reducirse a 0 si se desea que dependa solo del minijuego. +$SSL_bGameEnabled Activar minijuego de disfrute +$SSL_bGameEnabledHighlight Activa el minijuego de disfrute inspirado en SLSO. # ------ General Configs -$SSL_bFallbackToTagsForDetection Allow Fallback to Position Tags -$SSL_bFallbackToTagsForDetectionHighlight Toggles fallback to position tags for interactions detection when the internal physics-based real-time collision type guessing is not available. -$SSL_bNoStaminaEndsScene No Stamina Ends Scene -$SSL_bNoStaminaEndsSceneHighlight Ends the scene automatically when the actor's stamina is depleted. -$SSL_bMaleOrgasmEndsScene Male Orgasm Ends Scene -$SSL_bMaleOrgasmEndsSceneHighlight Ends the scene after the first male orgasm. -$SSL_bDomMustOrgasm Dom Actor Must Orgasm -$SSL_bDomMustOrgasmHighlight Requires the dominant actor to orgasm before scene ends.\nThread is perpetuated by changing to similar animations till the dominant actor has orgasmed once. -$SSL_bPlayerMustOrgasm Player Must Orgasm -$SSL_bPlayerMustOrgasmHighlight Requires the player to orgasm before scene ends\nThread is perpetuated by changing to similar animations till the player has orgasmed once. -$SSL_bHighEnjOrgasmWait High Enj Orgasm Wait -$SSL_bHighEnjOrgasmWaitHighlight Scene perpetuates if an actor's enjoyment is >75 or if the actor is in edging state regardless of orgasms count.\nThread is perpetuated by changing to similar animations till the actor with high enjoyment has orgasmed. -$SSL_iMaxNoPainOrgasmMale Max NoPain Orgasms Male -$SSL_iMaxNoPainOrgasmMaleHighlight Determines the number of orgasms till which no pain penalty will be imposed on male actors. Once the orgasm counts goes higher than the limit here, each subsequent orgasm will inflict successively higher pain penalties. -$SSL_iMaxNoPainOrgasmFemale Max NoPain Orgasms Female -$SSL_iMaxNoPainOrgasmFemaleHighlight Determines the number of orgasms till which no pain penalty will be imposed on female/futa actors. Once the orgasm counts goes higher than the limit here, each subsequent orgasm will inflict successively higher pain penalties. -$SSL_iNoPainRequiredTime Pain Decay Time -$SSL_iNoPainRequiredTimeHighlight Time required in seconds for pain effects (e.g. from penetration for inexperienced actors) to decay during a scene. -$SSL_iNoPainRequiredXP Pain Avoidance XP -$SSL_iNoPainRequiredXPHighlight Determines the Anal and Vaginal XP required to avoid pain effects from penetration interactions. +$SSL_bFallbackToTagsForDetection Permitir uso de etiquetas como respaldo +$SSL_bFallbackToTagsForDetectionHighlight Permite usar etiquetas de posición como respaldo cuando no está disponible la detección física en tiempo real. +$SSL_bNoStaminaEndsScene Sin resistencia termina escena +$SSL_bNoStaminaEndsSceneHighlight Finaliza la escena automáticamente cuando la resistencia del actor se agota. +$SSL_bMaleOrgasmEndsScene Orgasmo masculino termina escena +$SSL_bMaleOrgasmEndsSceneHighlight Finaliza la escena tras el primer orgasmo masculino. +$SSL_bDomMustOrgasm El dominante debe terminar +$SSL_bDomMustOrgasmHighlight Requiere que el actor dominante alcance el orgasmo antes de finalizar la escena.\nLa escena continúa cambiando a animaciones similares hasta que ocurra. +$SSL_bPlayerMustOrgasm El jugador debe terminar +$SSL_bPlayerMustOrgasmHighlight Requiere que el jugador alcance el orgasmo antes de finalizar la escena.\nLa escena continúa cambiando a animaciones similares hasta que ocurra. +$SSL_bHighEnjOrgasmWait Esperar alto disfrute +$SSL_bHighEnjOrgasmWaitHighlight La escena continúa si el disfrute es >75 o si el actor está en estado de "edging", sin importar el número de orgasmos.\nSe mantiene cambiando a animaciones similares hasta que ocurra. +$SSL_iMaxNoPainOrgasmMale Máx orgasmos sin dolor (masculino) +$SSL_iMaxNoPainOrgasmMaleHighlight Número de orgasmos antes de aplicar penalización por dolor en actores masculinos. Superado este límite, cada orgasmo aumenta el dolor progresivamente. +$SSL_iMaxNoPainOrgasmFemale Máx orgasmos sin dolor (femenino) +$SSL_iMaxNoPainOrgasmFemaleHighlight Número de orgasmos antes de aplicar penalización por dolor en actores femeninos/futa. Superado este límite, cada orgasmo aumenta el dolor progresivamente. +$SSL_iNoPainRequiredTime Tiempo de reducción de dolor +$SSL_iNoPainRequiredTimeHighlight Tiempo en segundos necesario para que los efectos de dolor disminuyan durante la escena. +$SSL_iNoPainRequiredXP XP para evitar dolor +$SSL_iNoPainRequiredXPHighlight Cantidad de experiencia anal y vaginal necesaria para evitar efectos de dolor por interacciones. # ------ Misc Multipliers -$SSL_fEnjMultVictim EnjRaise Mult: Victim -$SSL_fEnjMultVictimHighlight Additional enjoyment raise multiplier for victim actors.\n(FYI: Victim state is defined by scene's context, not tags.) -$SSL_fEnjMultAggressor EnjRaise Mult: Aggressor -$SSL_fEnjMultAggressorHighlight Additional enjoyment raise multiplier for aggressor actors.\n(FYI: Aggressor state is defined by scene's context, not tags.) -$SSL_fEnjMultSub EnjRaise Mult: Submissive -$SSL_fEnjMultSubHighlight Additional enjoyment raise multiplier for submissive actors.\n(FYI: Submissive role is defined by SLSB's submissive flags, not tags.) -$SSL_fEnjMultDom EnjRaise Mult: Dominant -$SSL_fEnjMultDomHighlight Additional enjoyment raise multiplier for dominant/non-sub actors.\n(FYI: Dominant role is defined by SLSB's submissive flags, not tags.) -$SSL_fPainHugePPMult Pain Mult: Huge PP -$SSL_fPainHugePPMultHighlight Additional factor enhancing pain for actors having penetration interactions in receiving position with actors having large schlongs. Used during penetration by certain creatures only, for now. +$SSL_fEnjMultVictim Multiplicador de disfrute: Víctima +$SSL_fEnjMultVictimHighlight Multiplicador adicional de aumento de disfrute para actores en rol de víctima.\n(Nota: El estado de víctima se define por el contexto de la escena, no por etiquetas.) +$SSL_fEnjMultAggressor Multiplicador de disfrute: Agresor +$SSL_fEnjMultAggressorHighlight Multiplicador adicional de aumento de disfrute para actores en rol de agresor.\n(Nota: El estado de agresor se define por el contexto de la escena, no por etiquetas.) +$SSL_fEnjMultSub Multiplicador de disfrute: Sumiso +$SSL_fEnjMultSubHighlight Multiplicador adicional de aumento de disfrute para actores sumisos.\n(Nota: El rol sumiso se define por las flags de SLSB, no por etiquetas.) +$SSL_fEnjMultDom Multiplicador de disfrute: Dominante +$SSL_fEnjMultDomHighlight Multiplicador adicional de aumento de disfrute para actores dominantes/no sumisos.\n(Nota: El rol dominante se define por las flags de SLSB, no por etiquetas.) +$SSL_fPainHugePPMult Multiplicador de dolor: tamaño grande +$SSL_fPainHugePPMultHighlight Factor adicional que aumenta el dolor en actores en posición receptora durante interacciones de penetración con actores de tamaño grande. Actualmente usado solo con ciertas criaturas. # ------ Game Configs -$SSL_iEnjGameStaminaCost Game Stamina Cost -$SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. -$SSL_iEnjGameMagickaCost Game Magicka Cost -$SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. -$SSL_bGameRequiredOnHighEnj Require Minigame on High Enj -$SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. -$SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty -$SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) +$SSL_iEnjGameStaminaCost Coste de resistencia del minijuego +$SSL_iEnjGameStaminaCostHighlight Cantidad de RESISTENCIA que se consume en una acción relevante del minijuego. +$SSL_iEnjGameMagickaCost Coste de magia del minijuego +$SSL_iEnjGameMagickaCostHighlight Cantidad de MAGIA que se consume en una acción relevante del minijuego. +# TODO: $SSL_iGameEnjAdjAmount +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +# TODO: $SSL_iGameEnjAdjAmountHighlight +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. +$SSL_bGameRequiredOnHighEnj Requerir minijuego con alto disfrute +$SSL_bGameRequiredOnHighEnjHighlight Desactiva el aumento de disfrute por detección de colisiones cuando supera 80.\nCon esto activo, el jugador deberá usar el minijuego para alcanzar el orgasmo. +$SSL_bGameSpamDelayPenalty Penalización por spam/tiempo incorrecto +$SSL_bGameSpamDelayPenaltyHighlight Aplica penalizaciones de disfrute, resistencia y magia por intentos mal sincronizados.\n(Importante: Solo funciona junto con la opción anterior.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. -$SSL_iGameRaiseEnjKey RaiseEnj Key -$SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. -$SSL_iGameHoldbackKey Holdback Key -$SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. +$SSL_iGameRaiseEnjKey Tecla aumentar disfrute +$SSL_iGameRaiseEnjKeyHighlight Aumenta manualmente el disfrute a costa de resistencia. Para afectar al jugador, combinar con la tecla modificadora.\nAl llegar a 90, sirve para mantener el estado de “edging”, requiriendo pulsaciones precisas. +$SSL_iGameHoldbackKey Tecla reducir disfrute +$SSL_iGameHoldbackKeyHighlight Reduce manualmente el disfrute a costa de magia. Para afectar al jugador, combinar con la tecla modificadora. # ------------------ Expression Editor -------------------------------------------------- -$SSL_ExpressionEditor Expression Editor - -$SSL_DialogueMood_0 Dialogue Anger -$SSL_DialogueMood_1 Dialogue Fear -$SSL_DialogueMood_2 Dialogue Happy -$SSL_DialogueMood_3 Dialogue Sad -$SSL_DialogueMood_4 Dialogue Surprise -$SSL_DialogueMood_5 Dialogue Puzzled -$SSL_DialogueMood_6 Dialogue Disgusted -$SSL_DialogueMood_7 Mood Neutral -$SSL_DialogueMood_8 Mood Anger -$SSL_DialogueMood_9 Mood Fear -$SSL_DialogueMood_10 Mood Happy -$SSL_DialogueMood_11 Mood Sad -$SSL_DialogueMood_12 Mood Surprise -$SSL_DialogueMood_13 Mood Puzzled -$SSL_DialogueMood_14 Mood Disgusted -$SSL_DialogueMood_15 Combat Anger -$SSL_DialogueMood_16 Combat Shout +$SSL_ExpressionEditor Editor de expresiones + +$SSL_DialogueMood_0 Diálogo: Ira +$SSL_DialogueMood_1 Diálogo: Miedo +$SSL_DialogueMood_2 Diálogo: Feliz +$SSL_DialogueMood_3 Diálogo: Triste +$SSL_DialogueMood_4 Diálogo: Sorpresa +$SSL_DialogueMood_5 Diálogo: Confusión +$SSL_DialogueMood_6 Diálogo: Asco +$SSL_DialogueMood_7 Ánimo neutral +$SSL_DialogueMood_8 Ánimo: Ira +$SSL_DialogueMood_9 Ánimo: Miedo +$SSL_DialogueMood_10 Ánimo: Feliz +$SSL_DialogueMood_11 Ánimo: Triste +$SSL_DialogueMood_12 Ánimo: Sorpresa +$SSL_DialogueMood_13 Ánimo: Confusión +$SSL_DialogueMood_14 Ánimo: Asco +$SSL_DialogueMood_15 Combate: Ira +$SSL_DialogueMood_16 Combate: Grito $SSL_Phoneme_0 0: Aah -$SSL_Phoneme_1 1: BigAah +$SSL_Phoneme_1 1: Aah grande $SSL_Phoneme_2 2: BMP $SSL_Phoneme_3 3: ChjSh $SSL_Phoneme_4 4: DST @@ -537,122 +596,122 @@ $SSL_Phoneme_13 13: R $SSL_Phoneme_14 14: Th $SSL_Phoneme_15 15: W -$SSL_Modifier_0 0: BlinkL -$SSL_Modifier_1 1: BlinkR -$SSL_Modifier_2 2: BrowDownL -$SSL_Modifier_3 3: BrownDownR -$SSL_Modifier_4 4: BrowInL -$SSL_Modifier_5 5: BrowInR -$SSL_Modifier_6 6: BrowUpL -$SSL_Modifier_7 7: BrowUpR -$SSL_Modifier_8 8: LookDown -$SSL_Modifier_9 9: LookLeft -$SSL_Modifier_10 10: LookRight -$SSL_Modifier_11 11: LookUp -$SSL_Modifier_12 12: SquintL -$SSL_Modifier_13 13: SquintR - -$SSL_ScaleMode_Linear Linear -$SSL_ScaleMode_Square Squared -$SSL_ScaleMode_Cubic Cubic -$SSL_ScaleMode_Exponential Exponential - -$SSL_ModifyingExpression Modifying Expression -$SSL_enableexpressionHighlight Enable or disable the expression being modified currently -$SSL_ExpressionScaling Scaling Function -$SSL_ExpressionsNormal Available in regular Scenes -$SSL_ExpressionsVictim Available as submissive -$SSL_ExpressionsAggressor Available as dominant -$SSL_ExpressionScalingHighlight Scaling behavior to map expression progress to scene enjoyment.\nLinear: Steady and even increase\nSquared: Fast initial increase, slow mid section, second spike as orgasm approaches\nCubic: Slow start, gradual ramp up as orgasm approaches\nExponential: Very slow start, rapid growth as orgasm approaches -$SSL_EditFemale Edit Female Data -$SSL_TestOnPlayer Test On Player - -$SSL_WarnTestExpression{} Testing selected expression on {}. Continue? -$SSL_WarnTestExpressionLowOrHight Test current expression's low (left) or high (right) profile? -$SSL_WarnTestExpressionWithOpenMouth Test current expression with an open mouth? -$SSL_StartTestExpression{} Testing Expression {}. Values will be reset after 15 seconds.\nClose the menu to continue.. -$SSL_AppliedTestExpression Expression applied, reverting expression in 15 seconds... -$SSL_RestoredTestExpression Expression restored... - -$SSL_EditExpressions_0 Expression Data (Low) -$SSL_EditExpressions_1 Expression Data (High) -$SSL_MoodType Mood Type -$SSL_MoodStrength Mood Strength -$SSL_Phoneme Phoneme -$SSL_Modifier Modifier - -$SSL_PrevPhase << Previous Phase -$SSL_NextPhase Next Phase >> +$SSL_Modifier_0 0: Parpadeo izq +$SSL_Modifier_1 1: Parpadeo der +$SSL_Modifier_2 2: Ceja abajo izq +$SSL_Modifier_3 3: Ceja abajo der +$SSL_Modifier_4 4: Ceja hacia dentro izq +$SSL_Modifier_5 5: Ceja hacia dentro der +$SSL_Modifier_6 6: Ceja arriba izq +$SSL_Modifier_7 7: Ceja arriba der +$SSL_Modifier_8 8: Mirar abajo +$SSL_Modifier_9 9: Mirar izquierda +$SSL_Modifier_10 10: Mirar derecha +$SSL_Modifier_11 11: Mirar arriba +$SSL_Modifier_12 12: Entrecerrar izq +$SSL_Modifier_13 13: Entrecerrar der + +$SSL_ScaleMode_Linear Lineal +$SSL_ScaleMode_Square Cuadrático +$SSL_ScaleMode_Cubic Cúbico +$SSL_ScaleMode_Exponential Exponencial + +$SSL_ModifyingExpression Modificando expresión +$SSL_enableexpressionHighlight Activa o desactiva la expresión actual +$SSL_ExpressionScaling Función de escala +$SSL_ExpressionsNormal Disponible en escenas normales +$SSL_ExpressionsVictim Disponible como sumiso +$SSL_ExpressionsAggressor Disponible como dominante +$SSL_ExpressionScalingHighlight Comportamiento de la escala según el progreso del disfrute.\nLineal: aumento constante\nCuadrático: aumento rápido al inicio, luego lento, con pico final\nCúbico: inicio lento, aumento progresivo\nExponencial: inicio muy lento, crecimiento rápido al final +$SSL_EditFemale Editar datos femeninos +$SSL_TestOnPlayer Probar en el jugador + +$SSL_WarnTestExpression{} Probando expresión en {}. ¿Continuar? +$SSL_WarnTestExpressionLowOrHight ¿Probar perfil bajo (izquierda) o alto (derecha)? +$SSL_WarnTestExpressionWithOpenMouth ¿Probar con la boca abierta? +$SSL_StartTestExpression{} Probando expresión {}. Valores se restablecerán en 15 segundos.\nCierra el menú para continuar.. +$SSL_AppliedTestExpression Expresión aplicada, se revertirá en 15 segundos... +$SSL_RestoredTestExpression Expresión restaurada... + +$SSL_EditExpressions_0 Datos de expresión (bajo) +$SSL_EditExpressions_1 Datos de expresión (alto) +$SSL_MoodType Tipo de ánimo +$SSL_MoodStrength Intensidad del ánimo +$SSL_Phoneme Fonema +$SSL_Modifier Modificador + +$SSL_PrevPhase << Fase anterior +$SSL_NextPhase Siguiente fase >> # ------ Sync lips config -$SSL_SyncLipsConfig Lip Sync +$SSL_SyncLipsConfig Sincronización labial -$SSL_Sync Sync -$SSL_Async Async -$SSL_LipsSoundTime Lip Sync Behavior -$SSL_LipsSoundTimeHighlight Sync: Lips begin closing when the moan has finished playing. \nAsync: Lips close after a short delay, independent of sound state. -$SSL_bLipsFixedValue Lips Fixed Value -$SSL_bLipsFixedValueHighlight If lip sync intensity should increase as enjoyment increases. +$SSL_Sync Sincronizado +$SSL_Async Asíncrono +$SSL_LipsSoundTime Comportamiento de labios +$SSL_LipsSoundTimeHighlight Sincronizado: Los labios comienzan a cerrarse cuando el sonido termina.\nAsíncrono: Los labios se cierran tras un pequeño retraso, independiente del sonido. +$SSL_bLipsFixedValue Intensidad fija de labios +$SSL_bLipsFixedValueHighlight Define si la intensidad del movimiento labial aumenta con el nivel de disfrute. # ------------------ Strip Item Editor -------------------------------------------------- -$SSL_StripEditor Strip Item Editor +$SSL_StripEditor Editor de desvestido -$SSL_Equipment{} Equipment - {} -$SSL_FullInventory Show Full Inventory -$SSL_FullInventoryHighlight Allows all items in actor's inventory to show up for strip behavior editing -$SSL_AlwaysRemove Always Remove -$SSL_NeverRemove Never Remove -$SSL_StripItemSlots{} Biped Slots: {} +$SSL_Equipment{} Equipo - {} +$SSL_FullInventory Mostrar inventario completo +$SSL_FullInventoryHighlight Permite mostrar todos los objetos del inventario del actor para editar su comportamiento al desvestirse +$SSL_AlwaysRemove Siempre quitar +$SSL_NeverRemove Nunca quitar +$SSL_StripItemSlots{} Ranuras Biped: {} # ------------------ Rebuild & Clean -------------------------------------------------- $SSL_RebuildClean Debug -$SSL_Installation Installation - -$SSL_bDebugMode Debug Mode -$SSL_bDebugModeHighlight Enable extra logs for thread and scene info.\nThis can slow down the framework but may help troubleshooting issues. -$SSL_StopCurrentAnimations Stop Current Animations -$SSL_StopCurrentAnimationsHighlight Stops all active SexLab threads, regardless of player involvement -$SSL_StopRunningAnimations All currently running animations are now halting -$SSL_ResetStripOverrides Reset Strip Overrides -$SSL_ResetStripOverridesHighlight Resets all custom strip settings set by the user -$SSL_CleanSystem Reinitialize Framework -$SSL_CleanSystemHighlight Reinstalls SexLab; not recommended! -$SSL_WarnCleanSystem Running this will re-install the framework, resetting most script internal data. Do you want to continue? -$SSL_Resetting Resetting... -$SSL_CurrentlyInstalling SexLab is being initialized... -$SSL_ForceRegisterVoices Legacy: Force Registration -$SSL_ForceRegisterVoicesHighlight Send mod events which used to be send by SexLab to notify 3rd party mods that they may now register their own voices/expressions (IMPORTANT: SexLab P+ no longer sends these events, so this option has to be used if you are using mods which require this event to be sent) - -$RegistryInfo Registry Status -$SSL_Animations Animations -$SSL_Voices Voices -$SSL_Expressions Expressions +$SSL_Installation Instalación + +$SSL_bDebugMode Modo debug +$SSL_bDebugModeHighlight Activa registros adicionales de hilos y escenas.\nPuede reducir el rendimiento pero ayuda a detectar problemas. +$SSL_StopCurrentAnimations Detener animaciones actuales +$SSL_StopCurrentAnimationsHighlight Detiene todos los procesos activos de SexLab, sin importar si el jugador participa +$SSL_StopRunningAnimations Todas las animaciones activas se están deteniendo +$SSL_ResetStripOverrides Restablecer desvestido personalizado +$SSL_ResetStripOverridesHighlight Restablece todas las configuraciones personalizadas de desvestido del usuario +$SSL_CleanSystem Reinicializar sistema +$SSL_CleanSystemHighlight Reinstala SexLab; ¡no recomendado! +$SSL_WarnCleanSystem Ejecutar esto reinstalará el sistema y reiniciará la mayoría de datos internos. ¿Deseas continuar? +$SSL_Resetting Reiniciando... +$SSL_CurrentlyInstalling SexLab se está inicializando... +$SSL_ForceRegisterVoices Legacy: Forzar registro +$SSL_ForceRegisterVoicesHighlight Envía eventos a mods externos para permitir registrar voces/expresiones.\nIMPORTANTE: SexLab P+ ya no envía estos eventos automáticamente, por lo que esta opción es necesaria para mods que dependan de ello. + +$RegistryInfo Estado del registro +$SSL_Animations Animaciones +$SSL_Voices Voces +$SSL_Expressions Expresiones # ------ Available Strap-ons -$SSL_AvailableStrapons Available Strap-ons -$SSL_RebuildStraponList Rebuild Strap-on List -$SSL_RebuildStraponListHighlight Updates the strap-ons list accessible to the framework -$SSL_FoundStrapon Found and saved strap-ons for use -$SSL_NoStrapons Found no supported strap-on mods -$SSL_toggleStraponHighlight Click to disable the use of this strap-on by SexLab +$SSL_AvailableStrapons Strap-ons disponibles +$SSL_RebuildStraponList Reconstruir lista de strap-ons +$SSL_RebuildStraponListHighlight Actualiza la lista de strap-ons disponibles para el sistema +$SSL_FoundStrapon Strap-ons encontrados y guardados +$SSL_NoStrapons No se encontraron mods de strap-ons compatibles +$SSL_toggleStraponHighlight Haz clic para desactivar este strap-on en SexLab # ------------------ Legacy -------------------------------------------------- $SSL_Neutral Neutral -$SSL_Unsullied Unsullied -$SSL_CleanCut Clean Cut -$SSL_PrimProper Prim & Proper -$SSL_Virtuous Virtuous -$SSL_EverFaithful Ever Faithful -$SSL_Ladylike Ladylike -$SSL_Lordly Lordly -$SSL_Saintly Saintly -$SSL_Experimenting Experimenting -$SSL_UnusuallyHorny Unusually Horny -$SSL_Promiscuous Promiscuous -$SSL_SexualDeviant Sexual Deviant -$SSL_Debaucherous Debaucherous -$SSL_Nymphomaniac Nymphomaniac -$SSL_Depraved Depraved -$SSL_Hypersexual Hypersexual +$SSL_Unsullied Puro +$SSL_CleanCut Impecable +$SSL_PrimProper Correcto y formal +$SSL_Virtuous Virtuoso +$SSL_EverFaithful Siempre fiel +$SSL_Ladylike Dama refinada +$SSL_Lordly Señorial +$SSL_Saintly Santo +$SSL_Experimenting Experimentando +$SSL_UnusuallyHorny Inusualmente excitado +$SSL_Promiscuous Promiscuo +$SSL_SexualDeviant Desviado sexual +$SSL_Debaucherous Degenerado +$SSL_Nymphomaniac Ninfómano +$SSL_Depraved Depravado +$SSL_Hypersexual Hipersexual \ No newline at end of file diff --git a/dist/Interface/Translations/SexLab_SWEDISH.txt b/dist/Interface/Translations/SexLab_SWEDISH.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_SWEDISH.txt +++ b/dist/Interface/Translations/SexLab_SWEDISH.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/SexLab_TURKISH.txt b/dist/Interface/Translations/SexLab_TURKISH.txt index fbe4359f8..c4d7826cc 100644 --- a/dist/Interface/Translations/SexLab_TURKISH.txt +++ b/dist/Interface/Translations/SexLab_TURKISH.txt @@ -239,6 +239,12 @@ $SSL_bShowInMap Show Scenes on Map $SSL_bShowInMapHighlight Get a miscellaneous quest marker for each scene playing nearby (except the ones you are participating in yourself). $SSL_bSetAnimSpeedByEnjoyment Enjoyment affected Animation Speed $SSL_bSetAnimSpeedByEnjoymentHighlight Base animation speed changes depending on actor enjoyment (+/-20%). +$SSL_AdjustStage Adjust Stage Only +$SSL_AdjustStageHighlight Toggles whether all edits to position/stage offsets will apply for currently playing stage only. +$SSL_fAdjustStepSize Offset Step Size +$SSL_fAdjustStepSizeHighlight Determines the step size for offset adjustments. +$SSL_bHideHUD Hide Game HUD +$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. $SSL_FurnitureNPC Furniture Use: NPC $SSL_FurnitureNPCHighlight Decide how NPC use Furniture. Specifically, decide if NPC use the furniture scenes over regular ones, when available. $SSL_AskNotSub Ask (Unless Submissive) @@ -310,15 +316,17 @@ $SSL_WolfVoice01 [SL] Wolf Default # ------------------Player Hotkeys-------------------------------------------------- $SSL_PlayerHotkeys Player Hotkeys +$SSL_bUseSceneMenu Use Scene Menu +$SSL_bUseSceneMenuHighlight Toggles the use of the native in-scene menu and enjoyment bars.\nDisabling this brings back support for some modernized legacy SL's hotkeys. + # ------ Global SexLab Hotkeys $SSL_GlobalHotkeys Global SexLab Hotkeys -$SSL_iTargetActor Target Actor For Edit +$SSL_iTargetActor Target Actor / Change Partner $SSL_iTargetActorHighlight After pressing this hotkey, place your crosshairs in game over an actor until your receive a notification that the actor is targeted, afterwards the actor will be available for editing purposes in various menu pages. $SSL_iToggleFreeCamera Toggle Free Camera Mode -$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey it enabled at all times regardless of animation. -$SSL_bHideHUD Hide Game HUD -$SSL_bHideHUDHighlight Hides the elements from game's HUD, not the scene HUD. +$SSL_iToggleFreeCameraHighlight Toggles the camera mode into a free flying camera state, same as entering TFC into console, this hotkey is enabled at all times regardless of animation. +$SSL_iToggleThreadControl Toggle Thread Control # ------ Scene Manipulation $SSL_SceneManipulation Scene Manipulation @@ -328,12 +336,30 @@ $SSL_iKeyLeft Decrease Speed / Left $SSL_iKeyRight Increase Speed / Right $SSL_iKeyAdvance Advance Scene / Select $SSL_iKeyEnd End Scene / Close Menu / Back -$SSL_iKeyExtra1 Open Menu / Swap Menu Tab $SSL_iKeyExtra2 Open Menu / Swap Menu Tab $SSL_iKeyMod Modifier +$SSL_iKeyModHighlight Toggles alternative effect for other hotkeys.\nNext/Prev: ChangePartner, AdvanceStage, OffsetAdjustMode.\nAdjustTarget: EnjRaise, EnjHoldback, ChangePosition, OffsetDirections.\nThe hotkeys changing their mode to "AdjustTarget" with ModifierKey affect Player on their own. $SSL_iKeyReset Inverse Action + +$SSL_LegacyHotkeys Legacy Hotkeys $SSL_iChangeAnimation Change Animation $SSL_iMoveScene Move Scene +$SSL_iChangePositions Change Positions +$SSL_iOffsetAdjustMode Cycle Offset Adjust Modes +$SSL_iOffsetAdjustModeHighlight Hotkey to switch between the 5 offset adjust modes when in scene.\nNone: Offset adjustments are disabled (default).\nPOS-XY: L/R keys adjust position's X, U/D adjust Y.\nPOS-RZ: L/R adjust pos's Rotation, U/D adjust Z.\nSCENE-XY: L/R adjust scene's X, U/D adjust Y (furniture scene only).\nSCENE-RZ: L/R adjust scene's Rotation, U/D adjust Z (furniture only). +$SSL_iToggleAdjustStage Toggle Adjust Stage +$SSL_iRestoreOffsets Reset Offset Adjustments +$SSL_iSceneSelectorMenu Scene Selector Menu + +# ------ Scene Selector Menu +$SSL_SS_OffsetAdjustMode Select Offset Adjust Mode +$SSL_SS_ChangeCurrentScene Change Current Scene +$SSL_SS_ResetScenesByTagName Search By Tag/Name +$SSL_SS_AdjNone Disable Offset Adjustments +$SSL_SS_AdjPosXY Ajust Position XY +$SSL_SS_AdjPosRZ Ajust Position RZ +$SSL_SS_AdjSceneXY Ajust Furniture XY +$SSL_SS_AdjSceneRZ Ajust Furniture RZ # ------------------- Timers & Stripping ------------------------------------------------- $SSL_TimersStripping Timers & Stripping @@ -434,6 +460,12 @@ $SSL_bSubmissiveTargetHighlight Filter scenes with target actor in the submissiv # ------------------ Enjoyment -------------------------------------------------- $SSL_EnjoymentSettings Enjoyment Settings +$SSL_EnjPrimarySettings Primary Settings +$SSL_EnjGeneralConfigs General Configs +$SSL_EnjGameConfigs Game Configs +$SSL_EnjPainConfigs Pain Configs +$SSL_EnjGameHotkeys Game Hotkeys +$SSL_EnjMiscRateMult Misc Rate Mult # ------ Primary Settings $SSL_bInternalEnjoymentEnabled Enable Internal Enjoyment @@ -482,22 +514,18 @@ $SSL_iEnjGameStaminaCost Game Stamina Cost $SSL_iEnjGameStaminaCostHighlight The amount of STAMINA to be depleted upon a relevant minigame action. $SSL_iEnjGameMagickaCost Game Magicka Cost $SSL_iEnjGameMagickaCostHighlight The amount of MAGICKA to be depleted upon a relevant minigame action. +$SSL_iGameEnjAdjAmount Enjoyment Adjust Amount +$SSL_iGameEnjAdjAmountHighlight The amount of enjoyment increased or depleted upon a relevant minigame action. $SSL_bGameRequiredOnHighEnj Require Minigame on High Enj $SSL_bGameRequiredOnHighEnjHighlight Toggles/disables player's enjoyment gain through collision detection when it goes above 80.\nWith this enabled, the player will have to actively rely on the minigame to reach orgasm. $SSL_bGameSpamDelayPenalty Minigame Spam/Delay Penalty $SSL_bGameSpamDelayPenaltyHighlight Toggles enjoyment penalties along with stamina and magicka depletion for the player upon badly timed attempts at raising enjoyment. (IMP: This option only works when combined with the above option.) # ------ Game Hotkeys -$SSL_iGameUtilityKey Game Modifier Key -$SSL_iGameUtilityKeyHighlight Modifier key for alternate functions of other enjoyment game hotkeys. -$SSL_iGamePauseKey Game Pause Key -$SSL_iGamePauseKeyHighlight Hotkey to pause/resume the enjoyment game.\nAlternative functions toggled by combining with utility key. $SSL_iGameRaiseEnjKey RaiseEnj Key $SSL_iGameRaiseEnjKeyHighlight Hotkey to manually raise enjoyment at the cost of stamina. To raise self/player enjoyment, combine with utility key.\nOnce enjoyment reaches 90, this hotkey is used to maintain edge state, whereby timed clicks are required to avoid spam penalties. $SSL_iGameHoldbackKey Holdback Key $SSL_iGameHoldbackKeyHighlight Hotkey to manually holdback/reduce enjoyment at the cost of magicka. To reduce self/player enjoyment, combine with utility key. -$SSL_iGameSelectNextPos Next Actor Key -$SSL_iGameSelectNextPosHighlight Hotkey to cycle/select the next position or actor.\nDirection of cycle will be reversed when combined with utility key. # ------------------ Expression Editor -------------------------------------------------- $SSL_ExpressionEditor Expression Editor diff --git a/dist/Interface/Translations/translate.py b/dist/Interface/Translations/translate.py index b34162efc..d05074148 100644 --- a/dist/Interface/Translations/translate.py +++ b/dist/Interface/Translations/translate.py @@ -1,6 +1,6 @@ import shutil -from os import listdir -from os.path import isfile, join +from pathlib import Path +import sys languages = [ "CHINESE", @@ -22,22 +22,32 @@ ] translated_languages = [ "RUSSIAN", + "SPANISH" ] -path = "Interface\\Translations" -f_english = [f for f in listdir(path) if isfile(join(path, f)) and f.endswith("ENGLISH.txt")] +script_dir = Path(__file__).parent.resolve() +if script_dir.name == "Translations": + translations_dir = script_dir +else: + translations_dir = script_dir / "Interface" / "Translations" -if len(f_english) < 1: - print("Missing Translation_ENGLISH.txt in directory") - exit() +if not translations_dir.exists(): + print(f"Error: Could not find Translations directory at {translations_dir}") + sys.exit(1) -f_raw = f_english[0].replace("ENGLISH.txt", "") -en_path = join(path, f_english[0]) +f_english = list(translations_dir.glob("*ENGLISH.txt")) +if not f_english: + print(f"Missing ENGLISH.txt in {translations_dir}") + sys.exit(1) + +en_path = f_english[0] +f_raw = en_path.name.replace("ENGLISH.txt", "") def parse_file(file_path): with open(file_path, 'r', encoding='utf-16le') as file: lines = file.readlines() - keys = {line.split(maxsplit=1)[0]: line for line in lines if line.startswith('$')} + todo_keys = {lines[i+1].split(maxsplit=1)[0] for i, line in enumerate(lines) if line.startswith("# TODO:") and i+1 < len(lines)} + keys = {line.split(maxsplit=1)[0]: line for line in lines if line.startswith('$') and line.split(maxsplit=1)[0] not in todo_keys} return keys, lines if len(translated_languages) > 0: @@ -58,7 +68,7 @@ def copy_new_keys(file_path): l_file.write(line) for l in languages: - new_path = join(path, f_raw + l + ".txt") + new_path = translations_dir / (f_raw + l + ".txt") print(f"Processing {new_path}") if l in translated_languages: print(f"Copying new keys to {l}") diff --git a/dist/SKSE/Plugins/SexLab.ini b/dist/SKSE/Plugins/SexLab.ini index b0808b89e..b22979815 100644 --- a/dist/SKSE/Plugins/SexLab.ini +++ b/dist/SKSE/Plugins/SexLab.ini @@ -4,7 +4,7 @@ fFurnitureScanRadius = 750.0 fMinScale = 0.88 bAllowDead = 0 fAdjustStepSizeIncrement = 0.1 -bAdjustNodes = 1 +bAdjustNodes = 0 fGhostModeAlpha = 0.6 fFurnitureSquare = 32.0 fFurnitureSquareHeight = 128.0 diff --git a/dist/Source/Scripts/SexLabThread.psc b/dist/Source/Scripts/SexLabThread.psc index e7d6a725b..626cb7a33 100644 --- a/dist/Source/Scripts/SexLabThread.psc +++ b/dist/Source/Scripts/SexLabThread.psc @@ -431,3 +431,15 @@ int Property PATHING_FORCE = 1 AutoReadOnly ; Always try to walk unless the di ; This can only be set before playing state Function SetPathingFlag(Actor akActor, int aiPathingFlag) EndFunction + +; ------------------------------------------------------- ; +; --- VRIK Configs + Init --- ; +; ------------------------------------------------------- ; + +; Function to temporarily dictate SL's VRIK configs for the duration of the active scene. +; Example Use: restrain hands to anim: SexLabUtil.SetConfigsVRIK(true, true, aiTrackHands=0) +Function SetConfigsVRIK(bool abEnabled=true, bool abOverrideConfig=false, int aiPOVMode=-1, \ + int abLockHeight=-1, float afHeightAdjSpeed=-1.0, int abTrackHead=-1, int aiTrackHands=-1, \ + float afDistHideHead=-1.0, float afDistNearClip=-1.0, int aiLockHmdToBody=-1, \ + float afLockHmdDistance=-1.0, float afLockHmdTolerance=-1.0, float afLockHmdSpeed=-1.0) +EndFunction \ No newline at end of file diff --git a/dist/Source/Scripts/SexLabUtil.psc b/dist/Source/Scripts/SexLabUtil.psc index 86f546420..d0241a2f0 100644 --- a/dist/Source/Scripts/SexLabUtil.psc +++ b/dist/Source/Scripts/SexLabUtil.psc @@ -84,6 +84,9 @@ function PrintConsole(string output) global native Actor[] function MakeActorArray(Actor Actor1 = none, Actor Actor2 = none, Actor Actor3 = none, Actor Actor4 = none, Actor Actor5 = none) global native float function GetCurrentGameRealTime() global native bool Function IsGodModeEnabled() global native +String Function GetTranslation(String asStr) global native +String[] Function ShuffleStringArray(String[] asArray, String asSetFirst = "", int aiMaxLen = 128) native global +Function HideElementsGameHUD(bool abHide = true) native global String[] Function MergeSplitTags(String asTags, String asTagsSuppress, bool abRequireAll) global String[] ret1 = PapyrusUtil.ClearEmpty(PapyrusUtil.StringSplit(asTags, ",")) @@ -112,16 +115,135 @@ String[] Function MergeSplitTags(String asTags, String asTagsSuppress, bool abRe EndIf EndFunction -String Function GetTranslation(String asStr) global native +string function ActorName(Actor ActorRef) global + return ActorRef.GetLeveledActorBase().GetName() +endFunction + +string[] function ActorNames(Actor[] ActorRefs) global + string[] ret = PapyrusUtil.StringArray(ActorRefs.Length) + int i = 0 + while (i < ActorRefs.Length) + ret[i] = ActorName(ActorRefs[i]) + i += 1 + endwhile + return ret +EndFunction + +float Function CalcPathingTargetDistance(int k) global + If (k==2||k==3||k==9||k==11||k==12||k==32||k==31||k==34||k==35||k==40||k==41||k==47) + return 300.0 + ElseIf (k==18||k==24||k==27||k==38||k==46) + return 400.0 + ElseIf (k==14||k==26||k==36) + return 800.0 + EndIf + return 128.0 +EndFunction + +; ------------------------------------------------------- ; +; --- Threading Utilities --- ; +; ------------------------------------------------------- ; + +Function ToggleFreeCamera(int aiForceState = -1) global + ;[-1:Toggle, 0:TFC_STAYS_OFF, 1:TFC_STAYS_ON] + bool bVRMode = GetConfig().HasVRIK + If (Game.GetCameraState() == 3) + If (aiForceState != 1) + If (!bVRMode) + MiscUtil.ToggleFreeCamera() + Else + Utility.SetIniBool("bDisablePlayerCollision:Havok", false) + SetActorMovement(Game.GetPlayer(), 2) ;MOVEMENT_LOCK + EndIf + EndIf + return + Else + If (aiForceState != 0) + ForceThirdPerson() + If (!bVRMode) + MiscUtil.SetFreeCameraSpeed(GetConfig().AutoSUCSM) + MiscUtil.ToggleFreeCamera() + Else + Utility.SetIniBool("bDisablePlayerCollision:Havok", true) + SetActorMovement(Game.GetPlayer(), 2) ;MOVEMENT_LOCK (bVRTPP==true) + EndIf + EndIf + EndIf +EndFunction + +Function ForceThirdPerson() global + bool bVRMode = GetConfig().HasVRIK + bool bVRTPP = bVRMode && (GetConfig().POVModeVR == 2) ;VRIK_TPP_FREE + If (bVRTPP) + return + ElseIf (bVRMode) + GetConfig().SetPOVModeVRIK(2, abForced=true) ;VRIK_TPP_FREE + return + Else + While (Game.GetCameraState() == 0) + Game.ForceThirdPerson() + EndWhile + EndIf +EndFunction + +Function SetActorMovement(Actor akActor, int aiMovement) global + ;[0:MOVEMENT_RELEASE, 1:MOVEMENT_UNLOCK, 2:MOVEMENT_LOCK] + If ((!akActor) || (aiMovement < 0) || (aiMovement > 2)) + return + EndIf + If (akActor != Game.GetPlayer()) + If (aiMovement == 0) ;RELEASE + akActor.SetDontMove(false) + akActor.SetRestrained(false) + Else + akActor.SetDontMove(true) + akActor.SetRestrained(true) + EndIf + return + EndIf + bool bVRMode = GetConfig().HasVRIK + While (!bVRMode && Game.GetCameraState()==0) + Game.ForceThirdPerson() + EndWhile + If (aiMovement == 2) ;LOCK + bool bVRTPP = bVRMode && (GetConfig().POVModeVR == 2) ;VRIK_TPP_FREE + Game.SetPlayerAIDriven(!bVRTPP) + Game.DisablePlayerControls(abMovement=!bVRTPP, abCamSwitch=true, abSneaking=true, abMenu=false) + Else + Game.SetPlayerAIDriven(false) + If (aiMovement == 1) ;UNLOCK + Game.EnablePlayerControls(abFighting=false, abCamSwitch=false, abSneaking=false, abActivate=false) + Else ;RELEASE + Game.EnablePlayerControls() + EndIf + EndIf +EndFunction + +Function UpdateAnimatingActorMovement(Actor akActor) global + If (!akActor) + return + EndIf + akActor.EvaluatePackage() + int aiFactionRank = akActor.GetFactionRank(GetConfig().AnimatingFaction) + int aiMovement = -1 + If (aiFactionRank < 0) ; OnAliasClear / NotAnimating / OnExtThreadRelease -> MOVEMENT_RELEASE + aiMovement = 0 + ElseIf (aiFactionRank == 0 || aiFactionRank == 2) ; OnActorUnlocked / OnPathing -> MOVEMENT_UNLOCK + aiMovement = 1 + ElseIf (aiFactionRank == 1) ; OnSetActor / OnActorLocked / OnStateAnimating / OnExtThreadControl -> MOVEMENT_LOCK + aiMovement = 2 + EndIf + SetActorMovement(akActor, aiMovement) +EndFunction ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; ; ----------------------------------------------------------------------------- ; -; ██╗ ███████╗ ██████╗ █████╗ ██████╗██╗ ██╗ ; -; ██║ ██╔════╝██╔════╝ ██╔══██╗██╔════╝╚██╗ ██╔╝ ; -; ██║ █████╗ ██║ ███╗███████║██║ ╚████╔╝ ; -; ██║ ██╔══╝ ██║ ██║██╔══██║██║ ╚██╔╝ ; -; ███████╗███████╗╚██████╔╝██║ ██║╚██████╗ ██║ ; -; ╚══════╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ; +; ██╗ ███████╗ ██████╗ █████╗ ██████╗██╗ ██╗ ; +; ██║ ██╔════╝██╔════╝ ██╔══██╗██╔════╝╚██╗ ██╔╝ ; +; ██║ █████╗ ██║ ███╗███████║██║ ╚████╔╝ ; +; ██║ ██╔══╝ ██║ ██║██╔══██║██║ ╚██╔╝ ; +; ███████╗███████╗╚██████╔╝██║ ██║╚██████╗ ██║ ; +; ╚══════╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ; ; ----------------------------------------------------------------------------- ; ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; @@ -149,20 +271,6 @@ sslThreadController function QuickStart(actor a1, actor a2 = none, actor a3 = no return SexLab.QuickStart(a1, a2, a3, a4, a5, victim, hook, animationTags) endFunction -string function ActorName(Actor ActorRef) global - return ActorRef.GetLeveledActorBase().GetName() -endFunction - -string[] function ActorNames(Actor[] ActorRefs) global - string[] ret = PapyrusUtil.StringArray(ActorRefs.Length) - int i = 0 - while (i < ActorRefs.Length) - ret[i] = ActorName(ActorRefs[i]) - i += 1 - endwhile - return ret -EndFunction - int Function GetSex(Actor akActor) global return SexLabRegistry.GetSex(akActor, false) EndFunction @@ -368,5 +476,5 @@ bool function IsActor(Form FormRef) global endFunction function EnableFreeCamera(bool Enabling = true, float sucsm = 5.0) global - return MiscUtil.SetFreeCameraState(Enabling, sucsm) + return ToggleFreeCamera(Enabling as int) endFunction diff --git a/dist/Source/Scripts/SexlabRegistry.psc b/dist/Source/Scripts/SexlabRegistry.psc index 7d217e7b6..2d6747ce4 100644 --- a/dist/Source/Scripts/SexlabRegistry.psc +++ b/dist/Source/Scripts/SexlabRegistry.psc @@ -207,9 +207,11 @@ Function SetSceneOffset(String asID, float afValue, int aiOffsetID) native globa Function SetSceneOffsetA(String asID, float[] afNewOffset) native global Function ResetSceneOffset(String asID) native global ; Offsets for the specified position in the given stage, 'raw' ignores unedited (SLSB) offsets +; Note: Offset for Rotation is returned in radians, use Math.RadiansToDegrees() if needed. float[] Function GetStageOffset(String asID, String asStage, int n) native global float[] Function GetStageOffsetRaw(String asID, String asStage, int n) native global ; Update Offsets for the specified position and stage. Pass an empty stage to edit the offset of all stages at once +; Note: Offset for Rotation is expected in degrees, and will be transformed interanlly to radians. Function SetStageOffset(String asID, String asStage, int n, float afValue, int aiOffsetID) native global Function SetStageOffsetA(String asID, String asStage, int n, float[] afNewOffset) native global Function ResetStageOffset(String asID, String asStage, int n) native global diff --git a/dist/Source/Scripts/sslActorAlias.psc b/dist/Source/Scripts/sslActorAlias.psc index c8167866f..dc0a93080 100644 --- a/dist/Source/Scripts/sslActorAlias.psc +++ b/dist/Source/Scripts/sslActorAlias.psc @@ -24,6 +24,10 @@ int Function GetSex() return _sex EndFunction +int Function GetRaceID() + return _raceID +EndFunction + bool Function GetIsDead() return _livestatus == LIVESTATUS_DEAD EndFunction @@ -68,11 +72,6 @@ Function ModEnjoymentMult(float afSet, bool bAdjust) EndIf EndFunction -; for compatibility with SLSO-based mods -int Function GetFullEnjoyment() - return _FullEnjoyment -EndFunction - ; ------------------------------------------------------- ; ; --- Interactions Info --- ; ; ------------------------------------------------------- ; @@ -100,10 +99,17 @@ bool Function IsOralComplex() || _CurrentInteractions[_Thread.aDeepthroat] || _CurrentInteractions[_Thread.pDeepthroat]) EndFunction -bool Function IsMouthBusy() - return (_CurrentInteractions[_Thread.aOral] || _CurrentInteractions[_Thread.aLickingShaft] \ - || _CurrentInteractions[_Thread.aDeepthroat] || _CurrentInteractions[_Thread.aSuckingToes] \ - || _CurrentInteractions[_Thread.pAnimObjFace]) +bool Function ShouldMouthOpen() + bool condNonCrotch = (_CurrentInteractions[_Thread.aSuckingToes] || _CurrentInteractions[_Thread.pAnimObjFace]) + bool condCrotch = (_CurrentInteractions[_Thread.aOral] || _CurrentInteractions[_Thread.aLickingShaft] || _CurrentInteractions[_Thread.aDeepthroat]) + If (!condNonCrotch && !condCrotch) + return false + ElseIf (condNonCrotch) + return true + EndIf + bool FemInNonGayScene = ((_sex==1 || _sex==4) && !_HomoTypes[2]) + bool NonFemInGayScene = ((_sex==0 || _sex==2 || _sex==3) && (_HomoTypes[0] || _HomoTypes[4])) + return (FemInNonGayScene || NonFemInGayScene) EndFunction bool Function IsAnalPenetrated() @@ -270,6 +276,7 @@ Actor Property ActorRef EndProperty int _sex +int _raceID bool _victim int _livestatus @@ -317,7 +324,6 @@ Form _HadStrapon ; Strapon worn prior to animation start ; Voice bool _IsForcedSilent -float _BaseDelay float _VoiceDelay float _ExpressionDelay @@ -334,7 +340,7 @@ bool Property OpenMouth If (ForceOpenMouth) return true EndIf - return IsMouthBusy() + return ShouldMouthOpen() EndFunction Function Set(bool abSet) ForceOpenMouth = abSet @@ -365,10 +371,6 @@ float _LastOrgasm Auto State Empty bool Function SetActor(Actor ProspectRef) - If (ProspectRef == _PlayerRef) - Game.DisablePlayerControls(abMovement=false, abFighting=true, abCamSwitch=false, abLooking=false, \ - abSneaking=false, abMenu=false, abActivate=true, abJournalTabs=false, aiDisablePOVType=0) - EndIf ForceRefTo(ProspectRef) _ActorRef = ProspectRef If (_ActorRef.IsDead()) @@ -379,14 +381,18 @@ Auto State Empty Else _livestatus = LIVESTATUS_ALIVE EndIf - _sex = SexLabRegistry.GetSex(ProspectRef, true) - + _sex = SexLabRegistry.GetSex(_ActorRef, true) + _raceID = SexLabRegistry.GetRaceID(_ActorRef) + _ActorRef.SetFactionRank(_AnimatingFaction, 1) + SexLabUtil.UpdateAnimatingActorMovement(_ActorRef) ;MOVEMENT_LOCK + StartSetActorInterrupts() TrackedEvent(TRACK_ADDED) GoToState(STATE_SETUP) return true EndFunction Function Clear() + EndSetActorInterrupts() If (GetIsDead()) If (_ActorRef.IsEssential()) _ActorRef.GetActorBase().SetEssential(false) @@ -395,9 +401,8 @@ Auto State Empty Else _Thread.RequestStatisticUpdate(_ActorRef, _StartedAt) EndIf - If (_ActorRef == _PlayerRef) - Game.EnablePlayerControls() - EndIf + _ActorRef.SetFactionRank(_AnimatingFaction, -1) + SexLabUtil.UpdateAnimatingActorMovement(_ActorRef) ;MOVEMENT_RELEASE Parent.Clear() EndFunction @@ -415,6 +420,11 @@ bool Function SetActor(Actor ProspectRef) return false EndFunction +; Take this actor out of combat and clear all actor states, return true if the actor was the player +Function StartSetActorInterrupts() native +; Undo "StartSetActorInterrupts()" persistent changes +Function EndSetActorInterrupts() native + ; ------------------------------------------------------- ; ; --- Alias SETUP --- ; ; ------------------------------------------------------- ; @@ -441,63 +451,21 @@ State Ready Event OnDoPrepare(string asEventName, string asStringArg, float afNumArg, form akPathTo) UnregisterForModEvent("SSL_PREPARE_Thread" + _Thread.tid) _ActorRef.SetActorValue("Paralysis", 0.0) - float interval = 0.05 - If(_ActorRef == _PlayerRef) - If (UI.IsMenuOpen("Dialogue Menu")) - UI.InvokeString("Dialogue Menu", "_global.skse.CloseMenu", "Dialogue Menu") - While (UI.IsMenuOpen("Dialogue Menu")) - Utility.Wait(interval) - EndWhile - EndIf - Else - _Config.CheckBardAudience(_ActorRef, true) - If(akPathTo && DoPathToCenter) - ObjectReference target = akPathTo as ObjectReference - float target_distance = 128.0 - float distance = _ActorRef.GetDistance(target) - If(distance > target_distance && distance <= 6144.0) - float fallback_timer = 15.0 - float prev_dist = distance + 1.0 - _ActorRef.SetFactionRank(_AnimatingFaction, 2) - _ActorRef.EvaluatePackage() - Utility.Wait(2.0) - While (distance > target_distance && Math.abs(prev_dist - distance) > 0.5 && fallback_timer > 0) - fallback_timer -= interval - Utility.Wait(interval) - prev_dist = distance - distance = _ActorRef.GetDistance(target) - EndWhile - EndIf - EndIf - EndIf - _ActorRef.SetFactionRank(_AnimatingFaction, 1) - _ActorRef.EvaluatePackage() - _AnimVarIsNPC = _ActorRef.GetAnimationVariableInt("IsNPC") - _AnimVarbHumanoidFootIKDisable = _ActorRef.GetAnimationVariableBool("bHumanoidFootIKDisable") - GoToState(STATE_PAUSED) - ; Code below executed in STATE_PAUSED as it should be part of event, not ReadyActor() to avoid delays - ; By compulsion, it's executed in OnDoPrepare() here due to no OnStateBegin() event in that state - LockActor() + WaitForPathToCenter(akPathTo) If (_sex <= 2) - If (DoUndress) - DoUndress = false - If (_sex == 0) - Debug.SendAnimationEvent(_ActorRef, "Arrok_Undress_G1") - Else - Debug.SendAnimationEvent(_ActorRef, "Arrok_Undress_G1") - EndIf - Utility.Wait(0.6) - EndIf - EndIf + _AnimVarIsNPC = _ActorRef.GetAnimationVariableInt("IsNPC") + _AnimVarbHumanoidFootIKDisable = _ActorRef.GetAnimationVariableBool("bHumanoidFootIKDisable") + EndIf + GoToState(STATE_PAUSED) If (asStringArg != "skip") _Thread.PrepareDone() EndIf ; Delayed Initialization If (_sex <= 2) If (_sex == 0) - _BaseDelay = _Config.MaleVoiceDelay + _VoiceDelay = _Config.MaleVoiceDelay Else - _BaseDelay = _Config.FemaleVoiceDelay + _VoiceDelay = _Config.FemaleVoiceDelay If (_sex == 1) _HadStrapon = _Config.WornStrapon(_ActorRef) If (!_HadStrapon) @@ -508,15 +476,41 @@ State Ready EndIf EndIf Else ; Creature - _BaseDelay = 3.0 + _VoiceDelay = 3.0 EndIf - _VoiceDelay = _BaseDelay - _ExpressionDelay = _BaseDelay * 2 + _ExpressionDelay = 1.0 If (_Config.DebugMode) Log("Strapon[" + _Strapon + "] Voice[" + GetActorVoice() + "] Expression[" + GetActorExpression() + "]") EndIf EndEvent + Function WaitForPathToCenter(form akPathTo) + If(_ActorRef == _PlayerRef) + return + EndIf + _Config.CheckBardAudience(_ActorRef, true) + If(!akPathTo || !DoPathToCenter) + return + EndIf + ObjectReference target = akPathTo as ObjectReference + float distance = _ActorRef.GetDistance(target) + float target_distance = SexLabUtil.CalcPathingTargetDistance(_raceID) + If(distance > target_distance && distance <= 6144.0) + _ActorRef.SetFactionRank(_AnimatingFaction, 2) + SexLabUtil.UpdateAnimatingActorMovement(_ActorRef) ;MOVEMENT_UNLOCK + float fallback_timer = 15.0 + float prev_dist = distance + 1.0 + Utility.Wait(2.0) + float interval = 0.05 + While (distance > target_distance && Math.abs(prev_dist - distance) > 0.5 && fallback_timer > 0) + fallback_timer -= interval + Utility.Wait(interval) + prev_dist = distance + distance = _ActorRef.GetDistance(target) + EndWhile + EndIf + EndFunction + Function Clear() GoToState(STATE_IDLE) Clear() @@ -525,11 +519,18 @@ State Ready Clear() Initialize() EndFunction + + Event OnEndState() + RegisterForModEvent("SSL_LOCK_Thread" + _Thread.tid, "OnRequestLock") + EndEvent EndState Event OnDoPrepare(string asEventName, string asStringArg, float afNumArg, form akPathTo) Error("Preparation request outside a valid state", "OnDoPrepare()") EndEvent +Function WaitForPathToCenter(form akPathTo) + Error("Pathing request outside a valid state", "WaitForPathToCenter()") +EndFunction ; --- Legacy @@ -550,8 +551,49 @@ EndFunction /; State Paused - ; Only called once the first time the main thread enters animating state - Function ReadyActor(int aiStripData, int aiPositionGenders) + Event OnRequestLock(string asEventName, string asStringArg, float afNumArg, form akSender) + UnregisterForModEvent("SSL_LOCK_Thread" + _Thread.tid) + LockActor() + _Thread.AliasLockDone() + EndEvent + Function LockActor() + _ActorRef.SetFactionRank(_AnimatingFaction, 1) + SexLabUtil.UpdateAnimatingActorMovement(_ActorRef) ;MOVEMENT_LOCK + Debug.SendAnimationEvent(_ActorRef, "IdleFurnitureExit") + Debug.SendAnimationEvent(_ActorRef, "AnimObjectUnequip") + Debug.SendAnimationEvent(_ActorRef, "IdleStop") + SetActorCollisions(false) + If (_ActorRef == _PlayerRef) + _Config.ToggleVRIK(true, _Config.VRIK_FPP_HMD) + If(_Config.AutoTFC) + SexLabUtil.ToggleFreeCamera(1) ;TFC_ON + EndIf + EndIf + _ActorRef.SetAnimationVariableInt("IsNPC", 0) + _ActorRef.SetAnimationVariableBool("bHumanoidFootIKDisable", 1) + SendDefaultAnimEvent() + Log("Locked Actor: " + GetActorName()) + _ActorLocked = True + EndFunction + Function TryLockAndUnpause() + LockActor() + GoToState(STATE_PLAYING) + EndFunction + + bool Function InitiateUndressing() + If (_sex <= 2) + If (DoUndress) + If (_sex == 0) + Debug.SendAnimationEvent(_ActorRef, "SexLab_MaleUndress") + Else + Debug.SendAnimationEvent(_ActorRef, "SexLab_FemaleUndress") + EndIf + return true + EndIf + EndIf + return false + EndFunction + bool Function ReadyActor(int aiStripData, int aiPositionGenders) _stripData = aiStripData _useStrapon = _sex == 1 && Math.LogicalAnd(aiPositionGenders, 0x2) == 0 If (_sex <= 2) @@ -559,9 +601,9 @@ State Paused ResolveStrapon() _ActorRef.QueueNiNodeUpdate() EndIf - ;Utility.Wait(0.5) ; Wait for schlong to update Debug.SendAnimationEvent(_ActorRef, "SOSBend0") RegisterForModEvent("SSL_READY_Thread" + _Thread.tid, "OnStartPlaying") + return true EndFunction Event OnStartPlaying(string asEventName, string asStringArg, float afNumArg, form akSender) @@ -571,6 +613,12 @@ State Paused TrackedEvent(TRACK_START) _StartedAt = SexLabUtil.GetCurrentGameRealTime() _LastOrgasm = _StartedAt + If (_sex != 1 && _sex != 4) + Utility.Wait(0.5) ; extra async call to ensure erection + Debug.SendAnimationEvent(_ActorRef, "SOSBend0") + EndIf + _HomoTypes = _Thread.CheckActiveHomoTypes() + UpdateBaseEnjoymentCalculations() EndEvent Function SetStrapon(Form ToStrapon) @@ -579,61 +627,34 @@ State Paused Function ResolveStrapon(bool force = false) ResolveStraponImpl() EndFunction - - Function LockActor() - If (_ActorRef == _PlayerRef) - If (Game.GetCameraState() == 0) - Game.ForceThirdPerson() - EndIf - Game.DisablePlayerControls(abMovement=true, abFighting=true, abCamSwitch=true, abLooking=false, \ - abSneaking=true, abMenu=false, abActivate=true, abJournalTabs=false, aiDisablePOVType=0) - If(_Config.AutoTFC) - MiscUtil.SetFreeCameraState(true) - MiscUtil.SetFreeCameraSpeed(_Config.AutoSUCSM) - EndIf + Function RemoveStrapon() + If(_Strapon && !_HadStrapon) + _ActorRef.RemoveItem(_Strapon, 1, true) EndIf - Debug.SendAnimationEvent(_ActorRef, "IdleFurnitureExit") - Debug.SendAnimationEvent(_ActorRef, "AnimObjectUnequip") - Debug.SendAnimationEvent(_ActorRef, "IdleStop") - LockActorImpl() - _ActorRef.SetAnimationVariableInt("IsNPC", 0) - _ActorRef.SetAnimationVariableBool("bHumanoidFootIKDisable", 1) - SendDefaultAnimEvent() - Log("Locked Actor: " + GetActorName()) - _ActorLocked = True EndFunction Function UnlockActor() _ActorRef.SetAnimationVariableInt("IsNPC", _AnimVarIsNPC) _ActorRef.SetAnimationVariableBool("bHumanoidFootIKDisable", _AnimVarbHumanoidFootIKDisable) If (_ActorRef == _PlayerRef) - MiscUtil.SetFreeCameraState(false) - Game.EnablePlayerControls(abMovement=true, abFighting=false, abCamSwitch=true, abLooking=true, \ - abSneaking=true, abMenu=true, abActivate=false, abJournalTabs=true, aiDisablePOVType=0) + SexLabUtil.ToggleFreeCamera(0) ;TFC_OFF + _Config.ToggleVRIK(false) EndIf - UnlockActorImpl() + SetActorCollisions(true) + _ActorRef.SetFactionRank(_AnimatingFaction, 0) + SexLabUtil.UpdateAnimatingActorMovement(_ActorRef) ;MOVEMENT_UNLOCK Log("Unlocked Actor: " + GetActorName()) _ActorLocked = False EndFunction - - Function TryLockAndUnpause() - LockActor() - GoToState(STATE_PLAYING) - EndFunction Function TryPauseAndUnlock() UnlockActor() EndFunction - Function RemoveStrapon() - If(_Strapon && !_HadStrapon) - _ActorRef.RemoveItem(_Strapon, 1, true) - EndIf - EndFunction - Function Clear() If (_sex <= 2) Redress() RemoveStrapon() + _ActorRef.ClearExpressionOverride() ;error with _sex>2 EndIf If (_ActorLocked) UnlockActor() @@ -644,9 +665,7 @@ State Paused _Thread.SetAnimationPlaybackSpeed(1.0) UnregisterForModEvent("SSL_ORGASM_Thread" + _Thread.tid) StoreExcitementState("Backup") - UnregisterEnjGameKeys() sslBaseExpression.CloseMouth(_ActorRef) - _ActorRef.ClearExpressionOverride() _ActorRef.ResetExpressionOverrides() sslBaseExpression.ClearMFG(_ActorRef) SendDefaultAnimEvent() @@ -660,8 +679,13 @@ State Paused EndFunction EndState -Function ReadyActor(int aiStripData, int aiPositionGenders) +bool Function InitiateUndressing() + Error("Cannot undress actors outside of idle state", "InitiateUndressing()") + return false +EndFunction +bool Function ReadyActor(int aiStripData, int aiPositionGenders) Error("Cannot ready outside of idle state", "ReadyActor()") + return false EndFunction Event OnStartPlaying(string asEventName, string asStringArg, float afNumArg, form akSender) Error("Playing request outside of idle state", "OnStartPlaying()") @@ -671,6 +695,9 @@ Function RemoveStrapon() EndFunction ; Lock/Unlock actor if in idling state, otherwise do nothing +Event OnRequestLock(string asEventName, string asStringArg, float afNumArg, form akSender) + Error("Lock request outside a valid state", "OnRequestLock()") +EndEvent Function LockActor() Error("Cannot lock actor outside of paused state", "LockActor()") EndFunction @@ -682,10 +709,8 @@ EndFunction ; This stays functional in STATE_PLAYING as well Function TryPauseAndUnlock() EndFunction -; Take this actor out of combat and clear all actor states, return true if the actor was the player -Function LockActorImpl() native -; Undo "LockActor()" persistent changes -Function UnlockActorImpl() native + +Function SetActorCollisions(bool abEnable) native Form[] Function StripByData(int aiStripData, int[] aiDefaults, int[] aiOverwrites) native @@ -704,19 +729,20 @@ Form[] Function StripByData(int aiStripData, int[] aiDefaults, int[] aiOverwrite float Property UPDATE_INTERVAL = 0.250 AutoReadOnly Hidden -float _LoopDelay +float _LoopVoiceDelay +float _LoopExpressionDelay float _LoopLovenseDelay -float _LoopEnjoymentDelay - bool _LovenseGenital bool _LovenseAnal bool[] _CurrentInteractions +bool[] _HomoTypes + +int _VRIKRestoreInTicks State Animating Event OnBeginState() RegisterForModEvent("SSL_ORGASM_Thread" + _Thread.tid, "OnOrgasm") - UpdateBaseEnjoymentCalculations() _LoopLovenseDelay = 0 _LovenseGenital = false _LovenseAnal = false @@ -743,60 +769,44 @@ State Animating EndFunction Event OnUpdate() - If(_Thread.GetStatus() != _Thread.STATUS_INSCENE) + If ((_Thread.GetStatus() != _Thread.STATUS_INSCENE) || (GetState() != STATE_PLAYING)) return EndIf _CurrentInteractions = _Thread.ListDetectedInteractionsInternal(_ActorRef) - If (_LoopEnjoymentDelay >= _EnjoymentDelay) - _LoopEnjoymentDelay = 0 - UpdateEffectiveEnjoymentCalculations() - EndIf + UpdateEffectiveEnjoymentCalculations() int strength = CalcReaction() - If (_LoopDelay >= _VoiceDelay && !IsSilent) - _LoopDelay = 0.0 + If (_LoopVoiceDelay >= _VoiceDelay && !IsSilent) + _LoopVoiceDelay = 0.0 bool lipsync = !OpenMouth && _Config.UseLipSync && _sex <= 2 Sound snd = _Thread.GetAliasSound(Self, GetActorVoice(), strength) sslBaseVoice.PlaySound(_ActorRef, snd, strength, lipsync) EndIf - RefreshExpressionEx(strength) + If (_LoopExpressionDelay >= _ExpressionDelay) + _LoopExpressionDelay = 0.0 + RefreshExpressionEx(strength) + EndIf If (_LoopLovenseDelay <= 0) - If (_ActorRef == _PlayerRef && sslLovense.IsLovenseInstalled()) - int lovenseStrength = sslSystemConfig.GetSettingInt("iLovenseStrength") - bool LovenseGenital = IsGenitalInteraction() - bool LovenseAnal = IsAnalPenetrated() - If (!LovenseGenital && !LovenseAnal && (_LovenseGenital || _LovenseAnal)) - sslLovense.StopAllActions() - Else - If (LovenseGenital) - If (!_LovenseGenital) - sslLovense.StartGenitalAction(lovenseStrength) - EndIf - ElseIf (_LovenseGenital) - sslLovense.StopGenitalAction(!LovenseAnal) - EndIf - If (LovenseAnal) - If (!_LovenseAnal) - sslLovense.StartAnalAction(lovenseStrength) - EndIf - ElseIf (_LovenseAnal) - sslLovense.StopAnalAction(!LovenseGenital) - EndIf - EndIf - _LovenseGenital = LovenseGenital - _LovenseAnal = LovenseAnal - EndIf + RefreshLovenseActions() Else _LoopLovenseDelay -= UPDATE_INTERVAL EndIf - If ((_FullEnjoyment >= 100) && (_Config.SeparateOrgasms || _Config.InternalEnjoymentEnabled)) - DoOrgasm() - EndIf - bool NoStaminaEndScenario = (_Config.NoStaminaEndsScene && !_victim && _ActorRef.GetActorValuePercentage("Stamina") < 0.10) - If NoStaminaEndScenario - _Thread.EnjBasedSkipToLastStage(true) + ; VRIK (Comeback: Is this always needed or upon offset changes only?) (How does this interfere with POV switching?) + If ((_ActorRef == _PlayerRef) && (_Config.POVModeVR == _Config.VRIK_FPP_FREE)) + _VRIKRestoreInTicks = _Config.UpdatePositioningVRIK(_VRIKRestoreInTicks) + If (_VRIKRestoreInTicks < 0) + _VRIKRestoreInTicks = 0 + _Config.RestoreHmdVRIK() + EndIf + If (_VRIKRestoreInTicks > 0) + _VRIKRestoreInTicks -= 1 + If _VRIKRestoreInTicks <= 1 + _VRIKRestoreInTicks = -1 + EndIf + EndIf EndIf ; Loop - _LoopDelay += UPDATE_INTERVAL + _LoopVoiceDelay += UPDATE_INTERVAL + _LoopExpressionDelay += UPDATE_INTERVAL _LoopEnjoymentDelay += UPDATE_INTERVAL RegisterForSingleUpdate(UPDATE_INTERVAL) EndEvent @@ -818,10 +828,39 @@ State Animating String expression = GetActorExpression() If (expression && _Config.UseExpressions && _livestatus == LIVESTATUS_ALIVE) sslBaseExpression.ApplyExpression(expression, _ActorRef, afStrength) - If (_Config.DebugMode) - Log("Expression? " + expression + "; Strength? " + afStrength + "; OpenMouth? " + OpenMouth, "sslBaseExpression.ApplyExpression()") + EndIf + If (_Config.DebugMode) + Log("Expression? " + expression + "; Strength? " + afStrength + "; OpenMouth? " + OpenMouth, "sslBaseExpression.ApplyExpression()") + EndIf + EndFunction + + Function RefreshLovenseActions() + If ((_ActorRef != _PlayerRef) || (!sslLovense.IsLovenseInstalled())) + return + EndIf + int lovenseStrength = sslSystemConfig.GetSettingInt("iLovenseStrength") + bool LovenseGenital = IsGenitalInteraction() + bool LovenseAnal = IsAnalPenetrated() + If (!LovenseGenital && !LovenseAnal && (_LovenseGenital || _LovenseAnal)) + sslLovense.StopAllActions() + Else + If (LovenseGenital) + If (!_LovenseGenital) + sslLovense.StartGenitalAction(lovenseStrength) + EndIf + ElseIf (_LovenseGenital) + sslLovense.StopGenitalAction(!LovenseAnal) + EndIf + If (LovenseAnal) + If (!_LovenseAnal) + sslLovense.StartAnalAction(lovenseStrength) + EndIf + ElseIf (_LovenseAnal) + sslLovense.StopAnalAction(!LovenseGenital) EndIf EndIf + _LovenseGenital = LovenseGenital + _LovenseAnal = LovenseAnal EndFunction Function PlayLouder(Sound SFX, ObjectReference FromRef, float Volume) @@ -852,10 +891,15 @@ State Animating EndIf EndIf UnregisterForUpdate() + _OrgasmCount += 1 ; SFX If(_Config.OrgasmEffects) - If (_ActorRef == _PlayerRef && _Config.ShakeStrength > 0 && Game.GetCameraState() >= 8) - Game.ShakeCamera(none, _Config.ShakeStrength, _Config.ShakeStrength + 1.0) + If (_ActorRef == _PlayerRef) + If (_Config.HasVRIK) + _Config.DoWhiteOutEfffect(_OrgasmCount) + ElseIf (_Config.ShakeStrength > 0 && Game.GetCameraState() >= 8) + Game.ShakeCamera(none, _Config.ShakeStrength, _Config.ShakeStrength + 1.0) + EndIf EndIf If (!IsSilent) Sound snd = _Thread.GetAliasOrgasmSound(Self, GetActorVoice()) @@ -884,23 +928,24 @@ State Animating ModEvent.Send(handle) TrackedEvent(TRACK_ORGASM) _LastOrgasm = SexLabUtil.GetCurrentGameRealTime() - _OrgasmCount += 1 ; Enjoyment - _FullEnjoyment = 0 - _arousalBase = 0 - SexlabStatistics.SetStatistic(_ActorRef, 17, _arousalBase) - _EnjFactor = _BaseFactor - If (_sex == 0 || _sex == 3) - If (_OrgasmCount > _Config.MaxNoPainOrgasmMale) - _FullEnjoyment -= (_OrgasmCount - _Config.MaxNoPainOrgasmMale) * 20 - EndIf - _Thread.EnjBasedSkipToLastStage(_Config.MaleOrgasmEndsScene) - Else - If (_OrgasmCount > _Config.MaxNoPainOrgasmFemale) - _FullEnjoyment -= (_OrgasmCount - _Config.MaxNoPainOrgasmFemale) * 20 + If (_bEnjEnabled) + _FullEnjoyment = 0 + _arousalBase = 0 + SexlabStatistics.SetStatistic(_ActorRef, 17, _arousalBase) + _EnjFactor = _BaseFactor + If (_sex == 0 || _sex == 3) + If (_OrgasmCount > _Config.MaxNoPainOrgasmMale) + _FullEnjoyment -= (_OrgasmCount - _Config.MaxNoPainOrgasmMale) * 20 + EndIf + _Thread.EnjBasedSkipToLastStage(_Config.MaleOrgasmEndsScene) + Else + If (_OrgasmCount > _Config.MaxNoPainOrgasmFemale) + _FullEnjoyment -= (_OrgasmCount - _Config.MaxNoPainOrgasmFemale) * 20 + EndIf EndIf + UpdateEffectiveEnjoymentCalculations() EndIf - UpdateEffectiveEnjoymentCalculations() RegisterForSingleUpdate(UPDATE_INTERVAL) _hasOrgasm = false Log(GetActorName() + ": Orgasms[" + _OrgasmCount + "] FullEnjoyment [" + _FullEnjoyment + "]") @@ -914,28 +959,6 @@ State Animating _ActorRef.QueueNiNodeUpdate() EndFunction - Event OnKeyDown(int KeyCode) - If (Utility.IsInMenuMode() || !_Config.GameEnabled) - return - EndIf - If (KeyCode == _Config.GamePauseKey) && Input.IsKeyPressed(_Config.GameUtilityKey) - _bGamePaused = !_bGamePaused - Log("[EnjGame] Game paused: " + _bGamePaused) - EndIf - If !_bGamePaused - If (KeyCode == _Config.GameRaiseEnjKey) - _Thread.ProcessEnjGameArg("Stamina", _ActorRef, _EnjGamePartner) - ElseIf (KeyCode == _Config.GameHoldbackKey) - _Thread.ProcessEnjGameArg("Magicka", _ActorRef, _EnjGamePartner) - ElseIf (KeyCode == _Config.GameSelectNextPos) - If _EnjGamePartner - int newIdx = _Thread.GameNextPartnerIdx(_ActorRef, _EnjGamePartner, Input.IsKeyPressed(_Config.GameUtilityKey)) - _EnjGamePartner = _Thread.GameChangePartner(_ActorRef, newIdx) - EndIf - EndIf - EndIf - EndEvent - Function TryPauseAndUnlock() GoToState(STATE_PAUSED) UnlockActor() @@ -951,6 +974,7 @@ State Animating EndFunction Event OnEndState() + UnregisterForUpdate() SendDefaultAnimEvent() EndEvent EndState @@ -968,6 +992,10 @@ endFunction Function RefreshExpressionEx(float afStrength) Error("Cannot refresh expression outside of playing state", "RefreshExpressionEx()") EndFunction +Function RefreshLovenseActions() + Error("Cannot process lovense actions outside of playing state", "RefreshLovenseActions()") +EndFunction + function DoOrgasm(bool Forced = false) Error("Cannot create an orgasm outside of playing state", "DoOrgasm()") endFunction @@ -1096,11 +1124,13 @@ Function Initialize() _victim = false _CanOrgasm = true _hasOrgasm = false + _DoUndress = true _AllowRedress = true ForceOpenMouth = false _ActorLocked = false ; Integers _sex = -1 + _raceID = -1 _livestatus = 0 _PathingFlag = 0 _OrgasmCount = 0 @@ -1110,7 +1140,9 @@ Function Initialize() _StartedAt = 0.0 ; Array _CurrentInteractions = Utility.CreateBoolArray(_Thread.SUPPORTED_INTER_COUNT, false) + _HomoTypes = Utility.CreateBoolArray(5, false) ResetEnjoymentVariables() + _VRIKRestoreInTicks = 0 EndFunction Event OnRequestClear(string asEventName, string asStringArg, float afDoStatistics, form akSender) @@ -1170,6 +1202,7 @@ Function UpdateEnjoyment(float afEnjoyment) native ; Defaults float _EnjoymentDelay +float _LoopEnjoymentDelay ; Base bool _bEnjEnabled bool _CrtMaleHugePP @@ -1189,13 +1222,12 @@ float _PainInterDecayBackup float _PainInterCur int _FullEnjoyment ; Game -bool _bGamePaused -Actor _EnjGamePartner float _lastHoldBack Function ResetEnjoymentVariables() ; Defaults - _EnjoymentDelay = 1.5 + _EnjoymentDelay = 0.8 + _LoopEnjoymentDelay = 0.0 ; Base _bEnjEnabled = False _CrtMaleHugePP = False @@ -1215,22 +1247,19 @@ Function ResetEnjoymentVariables() _PainInterCur = 0 _FullEnjoyment = 0 ; Game - _bGamePaused = False - _EnjGamePartner = None _lastHoldBack = 0.0 EndFunction Function UpdateBaseEnjoymentCalculations() - If (!_Config.InternalEnjoymentEnabled || !_Config.SeparateOrgasms || GetIsDead()) + If (!_Config.InternalEnjoymentEnabled || !_Config.SeparateOrgasms || GetIsDead() || !_Thread.HasPlayer) return EndIf + ResetEnjoymentVariables() _bEnjEnabled = True StoreExcitementState("Restore") - RegisterEnjGameKeys() - _EnjGamePartner = _Thread.GameChangePartner(_ActorRef) _CrtMaleHugePP = _Thread.CrtMaleHugePP() _ConSubStatus = _Thread.IdentifyConsentSubStatus() - bool SameSexThread = _Thread.SameSexThread() + bool SameSexThread = (_HomoTypes[1] || _HomoTypes[2] || _HomoTypes[3]) bool WithLover = _Thread.ActorIsWithLover(_ActorRef) _arousalBase = PapyrusUtil.ClampFloat(SexlabStatistics.GetStatistic(_ActorRef, 17), 0.0, 100.0) _PainContext = CalcContextPain() @@ -1242,9 +1271,19 @@ Function UpdateBaseEnjoymentCalculations() EndFunction Function UpdateEffectiveEnjoymentCalculations() - If (!_bEnjEnabled) + If ((!_bEnjEnabled) || (_LoopEnjoymentDelay < _EnjoymentDelay)) return EndIf + If (_FullEnjoyment >= 100) + DoOrgasm() + return + EndIf + bool NoStaminaEndScenario = (_Config.NoStaminaEndsScene && !_victim && _ActorRef.GetActorValuePercentage("Stamina") < 0.10) + If (NoStaminaEndScenario) + _Thread.EnjBasedSkipToLastStage(true) + return + EndIf + _LoopEnjoymentDelay = 0.0 _InterFactor = _Thread.CalculateInteractionFactor(_ActorRef, _CurrentInteractions) _FullEnjoyment = CalcEffectiveEnjoyment() as int UpdateEnjoyment(_FullEnjoyment as float) @@ -1283,7 +1322,7 @@ float Function CalcContextEnjFactor(bool SameSexThread, bool WithLover) ;arousal EnjMult += (_arousalBase / 50) ;creature - if (SexLabRegistry.GetRaceID(_ActorRef) > 0) + if (_raceID > 0) return (EnjMult + 0.5) EndIf ;relation @@ -1389,21 +1428,25 @@ float Function EnjFindConSubStatusMult() EndFunction int function CalcReaction() - int ret = Math.Abs(_FullEnjoyment) as int - return PapyrusUtil.ClampInt(ret, 0, 100) + If (_bEnjEnabled) + int ret = Math.Abs(_FullEnjoyment) as int + return PapyrusUtil.ClampInt(ret, 0, 100) + EndIf + return 50 EndFunction bool Function WaitForOrgasm() - If _Config.InternalEnjoymentEnabled - bool EnjScenario = (_Config.HighEnjOrgasmWait && ((_FullEnjoyment > 80 && _OrgasmCount == 0) || (_FullEnjoyment > 100))) - bool PlayerSceanrio = (_Config.PlayerMustOrgasm && (_ActorRef == _PlayerRef) && _OrgasmCount == 0) - bool DomScenario = (_Config.DomMustOrgasm && !_victim && _OrgasmCount == 0 && \ - (_ConSubStatus == _Thread.CONSENT_CONSUB || _ConSubStatus == _Thread.CONSENT_NONCONSUB)) - If (EnjScenario || DomScenario || PlayerSceanrio) - return true - EndIf + If (!_bEnjEnabled) + return False EndIf - return false + bool EnjScenario = (_Config.HighEnjOrgasmWait && (_FullEnjoyment > 80)) + bool PlayerSceanrio = (_Config.PlayerMustOrgasm && (_ActorRef == _PlayerRef) && _OrgasmCount == 0) + bool DomScenario = (_Config.DomMustOrgasm && !_victim && _OrgasmCount == 0 && \ + (_ConSubStatus == _Thread.CONSENT_CONSUB || _ConSubStatus == _Thread.CONSENT_NONCONSUB)) + If (EnjScenario || DomScenario || PlayerSceanrio) + return True + EndIf + return False EndFunction Function StoreExcitementState(String arg = "") @@ -1425,10 +1468,12 @@ Function StoreExcitementState(String arg = "") EndFunction Function RegisterRaiseEnjAttempt() - ; IDEA: expose timeCycle as a UI bar with a to and fro moving needle + If (_ActorRef != _PlayerRef) + return + EndIf If (_lastHoldBack > 0.0) + ; IDEA: expose timeCycle as a UI bar with a to and fro moving needle float timePassed = SexLabUtil.GetCurrentGameRealTime() - _lastHoldBack - ; As enjoyment gets higher, the "green zone" gets narrower ; At 80 Enj (2.0s timeCycle): Window is 25% of the bar (0.375 to 0.625) ; At 100 Enj (0.8s timeCycle): Window is 15% of the bar (0.425 to 0.575) @@ -1436,7 +1481,6 @@ Function RegisterRaiseEnjAttempt() float difficultyOffset = 0.125 - ((_FullEnjoyment - 80.0) * 0.00375) float windowStart = timeCycle * (0.5 - difficultyOffset) float windowEnd = timeCycle * (0.5 + difficultyOffset) - If (timePassed >= windowStart) && (timePassed <= windowEnd) _FullEnjoyment += 2 _ActorRef.RestoreActorValue("Stamina", _Config.GameStaminaCost) @@ -1449,35 +1493,18 @@ Function RegisterRaiseEnjAttempt() _FullEnjoyment -= 50 _EnjFactor = (_BaseFactor/2) EndIf - _ActorRef.DamageActorValue("Stamina", 2 * _Config.GameStaminaCost) - _ActorRef.DamageActorValue("Magicka", 2 * _Config.GameMagickaCost) + If (!SexLabUtil.IsGodModeEnabled()) + _ActorRef.DamageActorValue("Stamina", 2 * _Config.GameStaminaCost) + _ActorRef.DamageActorValue("Magicka", 2 * _Config.GameMagickaCost) + EndIf EndIf EndIf _lastHoldBack = SexLabUtil.GetCurrentGameRealTime() EndFunction -Function RegisterEnjGameKeys() - If (!_Config.GameEnabled || (_ActorRef != _PlayerRef)) - return - EndIf - RegisterForKey(_Config.GameUtilityKey) - RegisterForKey(_Config.GamePauseKey) - RegisterForKey(_Config.GameRaiseEnjKey) - RegisterForKey(_Config.GameHoldbackKey) - RegisterForKey(_Config.GameSelectNextPos) -EndFunction - -Function UnregisterEnjGameKeys() - UnregisterForKey(_Config.GameUtilityKey) - UnregisterForKey(_Config.GamePauseKey) - UnregisterForKey(_Config.GameRaiseEnjKey) - UnregisterForKey(_Config.GameHoldbackKey) - UnregisterForKey(_Config.GameSelectNextPos) -EndFunction - Function DebugBaseCalcVariables() string BaseCalcLog = "[ENJ] EnjFactor: " + _EnjFactor + ", BaseArousal: " + _arousalBase + ", SameSexThread: " \ - + _Thread.SameSexThread() + ", Sexuality: " + SexlabStatistics.GetSexuality(_ActorRef) + ", ConSubStatus: " \ + + (_HomoTypes[2]||_HomoTypes[3]||_HomoTypes[4]) + ", Sexuality: " + SexlabStatistics.GetSexuality(_ActorRef) + ", ConSubStatus: " \ + _ConSubStatus + ", IsVictim: " + _victim + ", HugePP: " + _CrtMaleHugePP + ", ContextPain: " + _PainContext as int Log(BaseCalcLog) EndFunction @@ -1643,6 +1670,21 @@ endFunction function SetStartAnimationEvent(string EventName, float PlayTime) endFunction +int function GetPain() + if (_FullEnjoyment < 0) + return Math.Abs(_FullEnjoyment) as int + endIf + return 0 +endFunction + +; for compatibility with SLSO-based mods +int function GetFullEnjoyment() + return _FullEnjoyment +endFunction +function BonusEnjoyment(Actor akActor = none, int AdjustBy = 0) + return _Thread.AdjustEnjoyment(akActor, AdjustBy) +endFunction + function OrgasmEffect() DoOrgasm() endFunction diff --git a/dist/Source/Scripts/sslAnimationDefaults.psc b/dist/Source/Scripts/sslAnimationDefaults.psc index 8aec81efb..48a3d4701 100644 --- a/dist/Source/Scripts/sslAnimationDefaults.psc +++ b/dist/Source/Scripts/sslAnimationDefaults.psc @@ -25,7 +25,7 @@ function LoadAnimations() MiscUtil.PrintConsole("WARNING! To continue with the SexLab animations setup close the console and all the menu") endIf Utility.Wait(0.1) - Game.ForceThirdPerson() + SexLabUtil.ForceThirdPerson() endIf bool SexLabDefault = Game.GetPlayer().GetAnimationVariableInt("SexLabDefault") >= 16300 bool APPack = Game.GetPlayer().GetAnimationVariableInt("SexLabAPAnimations") >= 16300 diff --git a/dist/Source/Scripts/sslBaseVoice.psc b/dist/Source/Scripts/sslBaseVoice.psc index 1b9f0806d..53baa4079 100644 --- a/dist/Source/Scripts/sslBaseVoice.psc +++ b/dist/Source/Scripts/sslBaseVoice.psc @@ -245,7 +245,8 @@ function Moan(Actor ActorRef, int Strength = 30, bool IsVictim = false) ;DEPRECA ActorBase BaseRef = ActorRef.GetLeveledActorBase() bool UseLipSync = Config.UseLipSync && BaseRef && !sslCreatureAnimationSlots.HasRaceType(BaseRef.GetRace()) ; Use the values of the version 1.62 for compatibility reasons - PlayMoanEx(ActorRef, Strength, IsVictim, UseLipSync, 0, 0.2, 1, 20, 50, false, Config.HasMFGFix) + bool HasMFG = SexLabUtil.GetConfig().CheckSystemPart("MfgFixNG") + PlayMoanEx(ActorRef, Strength, IsVictim, UseLipSync, 0, 0.2, 1, 20, 50, false, HasMFG) endFunction function MoanNoWait(Actor ActorRef, int Strength = 30, bool IsVictim = false, float Volume = 1.0) ;DEPRECATED @@ -287,7 +288,7 @@ function TransitUp(Actor ActorRef, int from, int to) global endIf int value = from - bool HasMFG = SexLabUtil.GetConfig().HasMFGFix + bool HasMFG = SexLabUtil.GetConfig().CheckSystemPart("MfgFixNG") if HasMFG sslExpressionUtil.SmoothSetPhoneme(ActorRef, 1, from) ; OLDRIM Utility.Wait(0.5) @@ -310,7 +311,7 @@ function TransitDown(Actor ActorRef, int from, int to) global endIf int value = from - bool HasMFG = SexLabUtil.GetConfig().HasMFGFix + bool HasMFG = SexLabUtil.GetConfig().CheckSystemPart("MfgFixNG") if HasMFG sslExpressionUtil.SmoothSetPhoneme(ActorRef, 1, from) ; OLDRIM Utility.Wait(0.5) diff --git a/dist/Source/Scripts/sslConfigMenu.psc b/dist/Source/Scripts/sslConfigMenu.psc index a1dfe995b..b002b40e9 100644 --- a/dist/Source/Scripts/sslConfigMenu.psc +++ b/dist/Source/Scripts/sslConfigMenu.psc @@ -368,7 +368,10 @@ Function AnimationSettings() AddStateOptionBool("bRedressVictim", "$SSL_bRedressVictim") AddStateOptionBool("bDisableTeleport", "$SSL_bDisableTeleport") AddStateOptionBool("bShowInMap", "$SSL_bShowInMap") + AddStateOptionBool("bHideHUD", "$SSL_bHideHUD") AddStateOptionBool("bSetAnimSpeedByEnjoyment", "$SSL_bSetAnimSpeedByEnjoyment") + AddStateOptionBool("bAdjustStage", "$SSL_AdjustStage") + AddStateOptionSlider("fAdjustStepSize", "$SSL_fAdjustStepSize", 0.5, 0, 5, 0.1, "{1}") AddMenuOptionST("FurnitureNPC", "$SSL_FurnitureNPC", _NPCFurnOpt[sslSystemConfig.GetSettingInt("iNPCBed")]) AddMenuOptionST("FurniturePlayer", "$SSL_FurniturePlayer", _PlFurnOpt[sslSystemConfig.GetSettingInt("iAskBed")]) EndFunction @@ -776,7 +779,7 @@ Function TestApply(Actor ActorRef) sslLog.Log("Testing Expression: " + _expression[_expressionIdx] + ". Low? " + testlow +", OpenMouth? " + testOpenMouth) Utility.Wait(0.1) If (ActorRef == PlayerRef) - Game.ForceThirdPerson() + SexLabUtil.ForceThirdPerson() EndIf If (testOpenMouth) sslBaseExpression.OpenMouth(ActorRef) @@ -805,45 +808,43 @@ Function EnjoymentSettings() bool game_flag = !Config.GameEnabled || !Config.InternalEnjoymentEnabled int game_header = DoDisable(game_flag) - AddHeaderOption("Primary Settings") + AddHeaderOption("$SSL_EnjPrimarySettings") AddToggleOptionST("InternalEnjoymentEnabled", "$SSL_bInternalEnjoymentEnabled", Config.InternalEnjoymentEnabled) - AddHeaderOption("General Configs", enj_header) + AddHeaderOption("$SSL_EnjGeneralConfigs", enj_header) + AddStateOptionSlider("fEnjRaiseMultInter", "$SSL_fEnjRaiseMultInter", 1.2, 0, 3, 0.1, "{1}", enj_flag) AddStateOptionBool("bFallbackToTagsForDetection", "$SSL_bFallbackToTagsForDetection", enj_flag) AddStateOptionBool("bNoStaminaEndsScene", "$SSL_bNoStaminaEndsScene", enj_flag) AddStateOptionBool("bMaleOrgasmEndsScene", "$SSL_bMaleOrgasmEndsScene", enj_flag) AddStateOptionBool("bDomMustOrgasm", "$SSL_bDomMustOrgasm", enj_flag) AddStateOptionBool("bPlayerMustOrgasm", "$SSL_bPlayerMustOrgasm", enj_flag) AddStateOptionBool("bHighEnjOrgasmWait", "$SSL_bHighEnjOrgasmWait", enj_flag) + + AddHeaderOption("$SSL_EnjPainConfigs", enj_header) AddStateOptionSlider("iMaxNoPainOrgasmMale", "$SSL_iMaxNoPainOrgasmMale", 1, 1, 4, 1, "{0}", enj_flag) AddStateOptionSlider("iMaxNoPainOrgasmFemale", "$SSL_iMaxNoPainOrgasmFemale", 2, 1, 5, 1, "{0}", enj_flag) AddStateOptionSlider("iNoPainRequiredTime", "$SSL_iNoPainRequiredTime", 50, 0, 180, 10, "{0}", enj_flag) AddStateOptionSlider("iNoPainRequiredXP", "$SSL_iNoPainRequiredXP", 50, 0, 100, 5, "{0}", enj_flag) - - AddHeaderOption("Rate Multipliers", enj_header) - AddStateOptionSlider("fEnjRaiseMultInter", "$SSL_fEnjRaiseMultInter", 1.2, 0, 3, 0.1, "{1}", enj_flag) - AddStateOptionSlider("fEnjMultVictim", "$SSL_fEnjMultVictim", 0.8, 0, 2, 0.1, "{1}", enj_flag) - AddStateOptionSlider("fEnjMultSub", "$SSL_fEnjMultSub", 0.8, 0, 2, 0.1, "{1}", enj_flag) + AddStateOptionSlider("fPainHugePPMult", "$SSL_fPainHugePPMult", 0.5, 0, 2, 0.1, "{1}", enj_flag) SetCursorPosition(1) AddEmptyOption() AddToggleOptionST("GameEnabled", "$SSL_bGameEnabled", Config.GameEnabled, enj_header) - AddHeaderOption("Game Configs", game_header) + AddHeaderOption("$SSL_EnjGameConfigs", game_header) AddStateOptionSlider("iEnjGameStaminaCost", "$SSL_iEnjGameStaminaCost", 10, 0, 50, 1, "{0}", game_flag) AddStateOptionSlider("iEnjGameMagickaCost", "$SSL_iEnjGameMagickaCost", 10, 0, 50, 1, "{0}", game_flag) + AddStateOptionSlider("iGameEnjAdjAmount", "$SSL_iGameEnjAdjAmount", 1, 0, 10, 1, "{0}", game_flag) AddStateOptionBool("bGameRequiredOnHighEnj", "$SSL_bGameRequiredOnHighEnj", game_flag) AddStateOptionBool("bGameSpamDelayPenalty", "$SSL_bGameSpamDelayPenalty", game_flag) - AddHeaderOption("Game Hotkeys", game_header) - AddStateOptionKey("iGameUtilityKey", "$SSL_iGameUtilityKey", true, true, abDisable=game_flag) - AddStateOptionKey("iGamePauseKey", "$SSL_iGamePauseKey", true, true, abDisable=game_flag) + AddHeaderOption("$SSL_EnjGameHotkeys", game_header) AddStateOptionKey("iGameRaiseEnjKey", "$SSL_iGameRaiseEnjKey", true, true, abDisable=game_flag) AddStateOptionKey("iGameHoldbackKey", "$SSL_iGameHoldbackKey", true, true, abDisable=game_flag) - AddStateOptionKey("iGameSelectNextPos", "$SSL_iGameSelectNextPos", true, true, abDisable=game_flag) - AddEmptyOption() - AddStateOptionSlider("fPainHugePPMult", "$SSL_fPainHugePPMult", 0.5, 0, 2, 0.1, "{1}", enj_flag) + AddHeaderOption("$SSL_EnjMiscRateMult", enj_header) + AddStateOptionSlider("fEnjMultVictim", "$SSL_fEnjMultVictim", 0.8, 0, 2, 0.1, "{1}", enj_flag) + AddStateOptionSlider("fEnjMultSub", "$SSL_fEnjMultSub", 0.8, 0, 2, 0.1, "{1}", enj_flag) AddStateOptionSlider("fEnjMultAggressor", "$SSL_fEnjMultAggressor", 1.2, 0, 2, 0.1, "{1}", enj_flag) AddStateOptionSlider("fEnjMultDom", "$SSL_fEnjMultDom", 1.2, 0, 2, 0.1, "{1}", enj_flag) EndFunction @@ -932,10 +933,16 @@ Function SystemCheckOptions() okOrFail[1] = "ok" AddTextOption("Skyrim Script Extender", okOrFail[Config.CheckSystemPart("SKSE") as int], OPTION_FLAG_DISABLED) - AddTextOption("SexLab.dll", okOrFail[Config.CheckSystemPart("SexLabP+") as int], OPTION_FLAG_DISABLED) + AddTextOption("SexLabUtil.dll", okOrFail[Config.CheckSystemPart("SexLabUtil") as int], OPTION_FLAG_DISABLED) AddTextOption("PapyrusUtil.dll", okOrFail[Config.CheckSystemPart("PapyrusUtil") as int], OPTION_FLAG_DISABLED) - AddTextOption("RaceMenu", okOrFail[Config.CheckSystemPart("NiOverride") as int], OPTION_FLAG_DISABLED) - AddTextOption("MfgFix NG", okOrFail[Config.CheckSystemPart("MfgFix") as int], OPTION_FLAG_DISABLED) + AddTextOption("RaceMenu", okOrFail[Config.CheckSystemPart("RaceMenu") as int], OPTION_FLAG_DISABLED) + AddTextOption("MfgFix NG", okOrFail[Config.CheckSystemPart("MfgFixNG") as int], OPTION_FLAG_DISABLED) + AddTextOption("UI Extensions", okOrFail[Config.CheckSystemPart("UIExtensions") as int], OPTION_FLAG_DISABLED) + AddTextOption("CrosshairRefEvents HangFix", okOrFail[Config.CheckSystemPart("CrossHairRef") as int], OPTION_FLAG_DISABLED) + AddTextOption("Procedural Penis Animations", okOrFail[Config.CheckSystemPart("PPA") as int], OPTION_FLAG_DISABLED) + If (sslSystemConfig.CheckForSkyrimVR()) + AddTextOption("VRIK Player Avatar", okOrFail[Config.CheckSystemPart("VRIK") as int], OPTION_FLAG_DISABLED) + EndIf EndFunction State ResetStripOverrides @@ -960,6 +967,17 @@ State CleanSystem EndEvent EndState +State ForceRegisterVoices + Event OnSelectST() + ModEvent.Send(ModEvent.Create("SexLabSlotVoices")) + ModEvent.Send(ModEvent.Create("SexLabSlotExpressions")) + SetOptionFlagsST(OPTION_FLAG_DISABLED) + EndEvent + Event OnHighlightST() + SetInfoText("$SSL_ForceRegisterVoicesHighlight") + EndEvent +EndState + State RebuildStraponList Event OnSelectST() Config.LoadStrapons() @@ -1325,7 +1343,7 @@ Event OnMenuAcceptST(int aiIndex) sslSystemConfig.SetSettingInt("iAskBed", aiIndex) SetMenuOptionValueST(_PlFurnOpt[aiIndex]) ElseIf (s[0] == "FurnitureNPC") - sslSystemConfig.SetSettingInt("iAskBedNPC", aiIndex) + sslSystemConfig.SetSettingInt("iNPCBed", aiIndex) SetMenuOptionValueST(_NpcFurnOpt[aiIndex]) EndIf EndEvent @@ -1468,37 +1486,54 @@ EndEvent ; ------------------------------------------------------- ; function PlayerHotkeys() - SetCursorFillMode(LEFT_TO_RIGHT) + SetCursorFillMode(TOP_TO_BOTTOM) AddHeaderOption("$SSL_GlobalHotkeys") - AddEmptyOption() AddStateOptionKey("iTargetActor", "$SSL_iTargetActor", needsRegister = true) - AddStateOptionKey("iToggleFreeCamera", "$SSL_iToggleFreeCamera", needsRegister = true) - ;AddStateOptionBool("bHideHUD", "$SSL_bHideHUD") + AddStateOptionKey("iToggleThreadControl", "$SSL_iToggleThreadControl", needsRegister = true) AddHeaderOption("$SSL_SceneManipulation") - AddEmptyOption() AddStateOptionKey("iKeyUp", "$SSL_iKeyUp", true, true) - AddStateOptionKey("iKeyExtra2", "$SSL_iKeyExtra2", true, true) ;open SL menu AddStateOptionKey("iKeyDown", "$SSL_iKeyDown", true, true) - AddStateOptionKey("iKeyMod", "$SSL_iKeyMod", true, true) ;modifier AddStateOptionKey("iKeyLeft", "$SSL_iKeyLeft", true, true) - AddStateOptionKey("iKeyReset", "$SSL_iKeyReset", true, true) ;inverse action AddStateOptionKey("iKeyRight", "$SSL_iKeyRight", true, true) - AddStateOptionKey("iMoveScene", "$SSL_iMoveScene", true, true) AddStateOptionKey("iKeyAdvance", "$SSL_iKeyAdvance", true, true) - AddStateOptionKey("iChangeAnimation", "$SSL_iChangeAnimation", true, true) AddStateOptionKey("iKeyEnd", "$SSL_iKeyEnd", true, true) -endFunction + AddStateOptionKey("iKeyExtra2", "$SSL_iKeyExtra2", true, true) ;open SL menu + AddStateOptionKey("iKeyMod", "$SSL_iKeyMod", true, true) ;modifier + AddStateOptionKey("iKeyReset", "$SSL_iKeyReset", true, true) ;inverse action -State ForceRegisterVoices - Event OnSelectST() - ModEvent.Send(ModEvent.Create("SexLabSlotVoices")) - ModEvent.Send(ModEvent.Create("SexLabSlotExpressions")) - SetOptionFlagsST(OPTION_FLAG_DISABLED) - EndEvent + SetCursorPosition(1) + + AddEmptyOption() + AddStateOptionKey("iToggleFreeCamera", "$SSL_iToggleFreeCamera", needsRegister = true) + AddToggleOptionST("UseSceneMenu", "$SSL_bUseSceneMenu", Config.UseSceneMenu) + bool menu_flag = Config.UseSceneMenu + bool ss_menu_flag = (menu_flag || (Game.GetModByName("UIExtensions.esp") == 255)) + + AddHeaderOption("$SSL_LegacyHotkeys") + AddStateOptionKey("iChangeAnimation", "$SSL_iChangeAnimation", true, true) + AddStateOptionKey("iMoveScene", "$SSL_iMoveScene", true, true) + AddStateOptionKey("iSceneSelectorMenu", "$SSL_iSceneSelectorMenu", true, true, abDisable=ss_menu_flag) + AddStateOptionKey("iChangePositions", "$SSL_iChangePositions", true, true, abDisable=menu_flag) + AddStateOptionKey("iOffsetAdjustMode", "$SSL_iOffsetAdjustMode", true, true, abDisable=menu_flag) + AddStateOptionKey("iToggleAdjustStage", "$SSL_iToggleAdjustStage", true, true, abDisable=menu_flag) + AddStateOptionKey("iRestoreOffsets", "$SSL_iRestoreOffsets", true, true, abDisable=menu_flag) +EndFunction + +State UseSceneMenu + Event OnSelectST() + Config.UseSceneMenu = !Config.UseSceneMenu + SetToggleOptionValueST(Config.UseSceneMenu) + ForcePageReset() + EndEvent + Event OnDefaultST() + Config.UseSceneMenu = True + SetToggleOptionValueST(Config.UseSceneMenu) + ForcePageReset() + EndEvent Event OnHighlightST() - SetInfoText("$SSL_ForceRegisterVoicesHighlight") + SetInfoText("$SSL_bUseSceneMenuHighlight") EndEvent EndState diff --git a/dist/Source/Scripts/sslCreatureAnimationDefaults.psc b/dist/Source/Scripts/sslCreatureAnimationDefaults.psc index 8559ffbd4..b3ed9ea64 100644 --- a/dist/Source/Scripts/sslCreatureAnimationDefaults.psc +++ b/dist/Source/Scripts/sslCreatureAnimationDefaults.psc @@ -10,7 +10,7 @@ function LoadCreatureAnimations() MiscUtil.PrintConsole("WARNING! To continue with the SexLab animations setup close the console and all the menu") endIf Utility.Wait(0.1) - Game.ForceThirdPerson() + SexLabUtil.ForceThirdPerson() endIf bool SexLabCreature = Game.GetPlayer().GetAnimationVariableInt("SexLabCreature") >= 16300 diff --git a/dist/Source/Scripts/sslMatchMakerMain.psc b/dist/Source/Scripts/sslMatchMakerMain.psc index a63385688..2087d1fe3 100644 --- a/dist/Source/Scripts/sslMatchMakerMain.psc +++ b/dist/Source/Scripts/sslMatchMakerMain.psc @@ -126,7 +126,7 @@ Event AnimationStarted(int aiThread, bool abHasPlayer) Config.Log("[SexLab MatchMaker] - ###### START LOGGING SCENE DATA #####") Config.Log("[SexLab MatchMaker] - Startup time: " + (retTime - _StartCall)) Config.Log("[SexLab MatchMaker] - Current thread id: " + thread.GetThreadID()) - Config.Log("[SexLab MatchMaker] - Current playing scene: " + thread.GetPlayingScenes()) + Config.Log("[SexLab MatchMaker] - Current playing scenes: " + thread.GetPlayingScenes().Length) Config.Log("[SexLab MatchMaker] - Current active scene: " + thread.GetActiveScene()) Config.Log("[SexLab MatchMaker] - Current scene name: " + SexLabRegistry.GetSceneName(thread.GetActiveScene())) Config.Log("[SexLab MatchMaker] - Current active stage: " + thread.GetActiveStage()) diff --git a/dist/Source/Scripts/sslSystemConfig.psc b/dist/Source/Scripts/sslSystemConfig.psc index 6f6d57d0e..e609f6e07 100644 --- a/dist/Source/Scripts/sslSystemConfig.psc +++ b/dist/Source/Scripts/sslSystemConfig.psc @@ -258,6 +258,38 @@ bool property SubmissiveTarget hidden SetSettingBool("bSubmissiveTarget", aSet) EndFunction EndProperty +bool property AdjustStage Hidden + bool Function Get() + return GetSettingBool("bAdjustStage") + EndFunction + Function Set(bool abSet) + SetSettingBool("bAdjustStage", abSet) + EndFunction +EndProperty +float property AdjustStepSize hidden + float Function Get() + return GetSettingFlt("fAdjustStepSize") + EndFunction + Function Set(float afSet) + SetSettingFlt("fAdjustStepSize", afSet) + EndFunction +EndProperty +bool property UseSceneMenu hidden + bool Function Get() + return GetSettingBool("bUseSceneMenu") + EndFunction + Function Set(bool aSet) + SetSettingBool("bUseSceneMenu", aSet) + EndFunction +EndProperty +bool property HideHUD hidden + bool Function Get() + return GetSettingBool("bHideHUD") + EndFunction + Function Set(bool aSet) + SetSettingBool("bHideHUD", aSet) + EndFunction +EndProperty ; Integers int property AskBed hidden @@ -330,29 +362,20 @@ int property LipsSoundTime hidden EndProperty ; Scene Control Keys -; TODO: Add support for legacy keybinds where possible -bool property AdjustTargetStage Hidden - bool Function Get() - return GetSettingBool("bAdjustTargetStage") - EndFunction - Function Set(bool abSet) - SetSettingBool("bAdjustTargetStage", abSet) - EndFunction -EndProperty -int property AdjustStage hidden +int property ModifierKey hidden int Function Get() - return GetSettingInt("iAdjustStage") + return GetSettingInt("iKeyMod") EndFunction Function Set(int aiSet) - SetSettingInt("iAdjustStage", aiSet) + SetSettingInt("iKeyMod", aiSet) EndFunction EndProperty int property AdvanceAnimation hidden int Function Get() - return GetSettingInt("iAdvanceAnimation") + return GetSettingInt("iKeyAdvance") EndFunction Function Set(int aiSet) - SetSettingInt("iAdvanceAnimation", aiSet) + SetSettingInt("iKeyAdvance", aiSet) EndFunction EndProperty int property ChangeAnimation hidden @@ -371,52 +394,46 @@ int property ChangePositions hidden SetSettingInt("iChangePositions", aiSet) EndFunction EndProperty -int property AdjustChange hidden - int Function Get() - return GetSettingInt("iAdjustChange") - EndFunction - Function Set(int aiSet) - SetSettingInt("iAdjustChange", aiSet) - EndFunction -EndProperty -int property AdjustForward hidden +int property MoveScene hidden int Function Get() - return GetSettingInt("iAdjustForward") + return GetSettingInt("iMoveScene") EndFunction Function Set(int aiSet) - SetSettingInt("iAdjustForward", aiSet) + SetSettingInt("iMoveScene", aiSet) EndFunction EndProperty -int property AdjustSideways hidden +int property EndAnimation hidden int Function Get() - return GetSettingInt("iAdjustSideways") + return GetSettingInt("iKeyEnd") EndFunction Function Set(int aiSet) - SetSettingInt("iAdjustSideways", aiSet) + SetSettingInt("iKeyEnd", aiSet) EndFunction EndProperty -int property AdjustUpward hidden +int property SceneSelectorMenu hidden int Function Get() - return GetSettingInt("iAdjustUpward") + return GetSettingInt("iSceneSelectorMenu") EndFunction Function Set(int aiSet) - SetSettingInt("iAdjustUpward", aiSet) + SetSettingInt("iSceneSelectorMenu", aiSet) EndFunction EndProperty -int property RealignActors hidden + +; Offset Adjustment Keys +int property OffsetAdjustMode hidden int Function Get() - return GetSettingInt("iRealignActors") + return GetSettingInt("iOffsetAdjustMode") EndFunction Function Set(int aiSet) - SetSettingInt("iRealignActors", aiSet) + SetSettingInt("iOffsetAdjustMode", aiSet) EndFunction EndProperty -int property MoveScene hidden +int property ToggleAdjustStage hidden int Function Get() - return GetSettingInt("iMoveScene") + return GetSettingInt("iToggleAdjustStage") EndFunction Function Set(int aiSet) - SetSettingInt("iMoveScene", aiSet) + SetSettingInt("iToggleAdjustStage", aiSet) EndFunction EndProperty int property RestoreOffsets hidden @@ -427,40 +444,40 @@ int property RestoreOffsets hidden SetSettingInt("iRestoreOffsets", aiSet) EndFunction EndProperty -int property RotateScene hidden +int property DirectionUp hidden int Function Get() - return GetSettingInt("iRotateScene") + return GetSettingInt("iKeyUp") EndFunction Function Set(int aiSet) - SetSettingInt("iRotateScene", aiSet) + SetSettingInt("iKeyUp", aiSet) EndFunction EndProperty -int property EndAnimation hidden +int property DirectionDown hidden int Function Get() - return GetSettingInt("iEndAnimation") + return GetSettingInt("iKeyDown") EndFunction Function Set(int aiSet) - SetSettingInt("iEndAnimation", aiSet) + SetSettingInt("iKeyDown", aiSet) EndFunction EndProperty -int property AdjustSchlong hidden +int property DirectionLeft hidden int Function Get() - return GetSettingInt("iAdjustSchlong") + return GetSettingInt("iKeyLeft") EndFunction Function Set(int aiSet) - SetSettingInt("iAdjustSchlong", aiSet) + SetSettingInt("iKeyLeft", aiSet) EndFunction EndProperty -int property Backwards hidden +int property DirectionRight hidden int Function Get() - return GetSettingInt("iBackwards") + return GetSettingInt("iKeyRight") EndFunction Function Set(int aiSet) - SetSettingInt("iBackwards", aiSet) + SetSettingInt("iKeyRight", aiSet) EndFunction EndProperty -; Misc Keys +; Global Keys int property ToggleFreeCamera hidden int Function Get() return GetSettingInt("iToggleFreeCamera") @@ -469,6 +486,14 @@ int property ToggleFreeCamera hidden SetSettingInt("iToggleFreeCamera", aiSet) EndFunction EndProperty +int property ToggleThreadControl hidden + int Function Get() + return GetSettingInt("iToggleThreadControl") + EndFunction + Function Set(int aiSet) + SetSettingInt("iToggleThreadControl", aiSet) + EndFunction +EndProperty int property TargetActor hidden int Function Get() return GetSettingInt("iTargetActor") @@ -477,14 +502,6 @@ int property TargetActor hidden SetSettingInt("iTargetActor", aiSet) EndFunction EndProperty -bool property HideHUD hidden - bool Function Get() - return GetSettingBool("bHideHUD") - EndFunction - Function Set(bool aSet) - SetSettingBool("bHideHUD", aSet) - EndFunction -EndProperty ; Floats float property CumTimer hidden @@ -577,20 +594,6 @@ Function _SetfTimers(int aiIdx0, float[] afSet) SetSettingFltA("fTimers", afSet[3], 3) EndFunction -; Compatibility checks -bool property HasNiOverride hidden - bool Function Get() - return SKSE.GetPluginVersion("SKEE64") >= 7 || NiOverride.GetScriptVersion() >= 7 - EndFUnction - Function Set(bool aSet) - EndFunction -EndProperty -bool property HasMFGFix hidden - bool Function Get() - return SKSE.GetPluginVersion("mfgfix") > -1 - EndFunction -EndProperty - ; ------------------------------------------------------- ; ; --- Config Accessors --- ; ; ------------------------------------------------------- ; @@ -679,61 +682,53 @@ Event OnKeyDown(int keyCode) If (Utility.IsInMenuMode()) return ElseIf (keyCode == ToggleFreeCamera) - ToggleFreeCamera() - ElseIf (keyCode == TargetActor) - If (_ActiveControl && !_ActiveControl.HasPlayer) - DisableThreadControl(_ActiveControl) - Else - SetTargetActor() - EndIf + SexLabUtil.ToggleFreeCamera() + ElseIf (keyCode == TargetActor && !_ActiveControl) + SetTargetActor(_CrosshairRef, true) + ElseIf (keyCode == ToggleThreadControl) + ToggleThreadControl() EndIf EndEvent -Function SetTargetActor() - If (!_CrosshairRef) +Function SetTargetActor(Actor akActor = None, bool abThreadControl = false) + If (!akActor || akActor == Game.GetPlayer()) return EndIf - TargetRef = _CrosshairRef - SelectedSpell.Cast(TargetRef, TargetRef) - Debug.Notification("SexLab Target Selected: " + TargetRef.GetLeveledActorBase().GetName()) - ; Attempt to grab control of their animation? - sslThreadController TargetThread = ThreadSlots.GetActorController(TargetRef) - If (TargetThread && !TargetThread.HasPlayer && TargetThread.GetStatus() == TargetThread.STATUS_INSCENE && \ - !ThreadSlots.GetActorController(Game.GetPlayer()) && TakeThreadControl.Show()) - GetThreadControl(TargetThread) + TargetRef = akActor + If (abThreadControl) + ToggleThreadControl() EndIf EndFunction -Function ToggleFreeCamera() - If (Game.GetCameraState() != 3) - MiscUtil.SetFreeCameraSpeed(AutoSUCSM) +Function ToggleThreadControl() + If (_ActiveControl) + DisableThreadControl(_ActiveControl) + return + EndIf + Actor akTarget = None + If (Game.GetPlayer().IsInFaction(AnimatingFaction)) + akTarget = Game.GetPlayer() + ElseIf (TargetRef) + akTarget = TargetRef + Else + return + EndIf + Debug.Notification("SexLab target selected: " + SexLabUtil.ActorName(akTarget)) + SelectedSpell.Cast(akTarget) + SexLabThread TargetThread = ThreadSlots.GetThreadByActor(akTarget) + If (TargetThread && TargetThread.GetStatus() == TargetThread.STATUS_INSCENE) + Log("AttemptThreadControl(), Attempting thread control for actor: " + SexLabUtil.ActorName(akTarget)) + If (TargetThread.HasPlayer() || TakeThreadControl.Show()) + GetThreadControl(TargetThread as sslThreadController) + If (UseSceneMenu) ;Comeback: Reasses need after UI update + _ActiveControl.RealignActors() + EndIf + EndIf EndIf - MiscUtil.ToggleFreeCamera() EndFunction -bool function BackwardsPressed() - return Input.GetNumKeysPressed() > 1 && MirrorPress(Backwards) -endFunction - -bool function AdjustStagePressed() - return (!AdjustTargetStage && Input.GetNumKeysPressed() > 1 && MirrorPress(AdjustStage)) \ - || (AdjustTargetStage && !(Input.GetNumKeysPressed() > 1 && MirrorPress(AdjustStage))) -endFunction - -bool function IsAdjustStagePressed() - return Input.GetNumKeysPressed() > 1 && MirrorPress(AdjustStage) -endFunction - -bool function MirrorPress(int mirrorkey) - if mirrorkey == 42 || mirrorkey == 54 ; Shift - return Input.IsKeyPressed(42) || Input.IsKeyPressed(54) - elseif mirrorkey == 29 || mirrorkey == 157 ; Ctrl - return Input.IsKeyPressed(29) || Input.IsKeyPressed(157) - elseif mirrorkey == 56 || mirrorkey == 184 ; Alt - return Input.IsKeyPressed(56) || Input.IsKeyPressed(184) - else - return Input.IsKeyPressed(mirrorkey) - endIf +bool function ModifierPressed() + return ((Input.IsKeyPressed(ModifierKey) || Input.IsKeyPressed(42) || Input.IsKeyPressed(54))) ; Shift keys endFunction ; ------------------------------------------------------- ; @@ -757,13 +752,14 @@ Function GetThreadControl(sslThreadController TargetThread) _ActiveControl = TargetThread ; Lock players movement iff they arent owned by the thread If (!_ActiveControl.HasPlayer) - Actor player = Game.GetPlayer() _ActiveControl.AutoAdvance = false + Actor player = Game.GetPlayer() player.StopCombatAlarm() if player.IsWeaponDrawn() player.SheatheWeapon() endIf - Game.SetPlayerAIDriven() + player.SetFactionRank(AnimatingFaction, 1) + SexLabUtil.UpdateAnimatingActorMovement(player) ;MOVEMENT_LOCK EndIf _ActiveControl.EnableHotkeys(true) EndFunction @@ -772,12 +768,15 @@ Function DisableThreadControl(sslThreadController TargetThread) If (!_ActiveControl || _ActiveControl != TargetThread) return EndIf + TargetRef = None ; Release players thread control _ActiveControl.DisableHotkeys() _ActiveControl.AutoAdvance = true ; Unlock players movement iff they arent owned by the thread If (!_ActiveControl.HasPlayer) - Game.SetPlayerAIDriven(false) + Actor player = Game.GetPlayer() + player.SetFactionRank(AnimatingFaction, -1) + SexLabUtil.UpdateAnimatingActorMovement(player) ;MOVEMENT_RELEASE EndIf _ActiveControl = none Endfunction @@ -958,14 +957,22 @@ bool function CheckSystemPart(string CheckSystem) return SKSE.GetScriptVersionRelease() >= 60 elseIf CheckSystem == "SkyUI" return Quest.GetQuest("SKI_ConfigManagerInstance") != none - elseIf CheckSystem == "SexLabP+" + elseIf CheckSystem == "SexLabUtil" return SKSE.GetPluginVersion("SexLabUtil") > -1 elseIf CheckSystem == "PapyrusUtil" return PapyrusUtil.GetVersion() >= 36 - elseIf CheckSystem == "NiOverride" - return HasNiOverride - elseIf CheckSystem == "MfgFix" - return HasMFGFix + elseIf CheckSystem == "RaceMenu" + return (SKSE.GetPluginVersion("skee64") > -1) || (SKSE.GetPluginVersion("skeevr") > -1) + elseIf CheckSystem == "MfgFixNG" + return SKSE.GetPluginVersion("mfgfix") > -1 + elseIf CheckSystem == "PPA" + return SKSE.GetPluginVersion("AccuratePenetration") > -1 + elseIf CheckSystem == "CrossHairRef" + return SKSE.GetPluginVersion("CrosshairRefEventsFix") > -1 + elseIf CheckSystem == "UIExtensions" + return Game.GetModByName("UIExtensions.esp") != 255 + elseif CheckSystem == "VRIK" + return CheckForVRIK() endIf return false endFunction @@ -974,8 +981,8 @@ bool function CheckSystem() If (!CheckSystemPart("SKSE")) CheckSKSE.Show(2.22) return false - ElseIf (!CheckSystemPart("SexLabP+")) - Debug.MessageBox("[SexLab]\nMissing SexLabUtil.dll.\nThis plugin is mandatory for SexLab to function. Ensure you have a with your game compatible version of SexLab installed.") + ElseIf (!CheckSystemPart("SexLabUtil")) + Debug.MessageBox("[SexLab]\nMissing SexLabUtil.dll.\nThis plugin is mandatory for SexLab to function.") return false ElseIf (!CheckSystemPart("SkyUI")) CheckSkyUI.Show(5.2) @@ -983,7 +990,18 @@ bool function CheckSystem() ElseIf (!CheckSystemPart("PapyrusUtil")) CheckPapyrusUtil.Show(4.4) return false - endIf + ElseIf (!CheckSystemPart("CrossHairRef")) + Debug.MessageBox("[SexLab]\nMissing 'CrosshairRefEvents Hang Fix'.\nThis mod is mandatory to avoid soft-locks during scene startup.") + return false + ElseIf (!CheckSystemPart("PPA")) + Debug.MessageBox("[SexLab]\nMissing 'Procedural Penis Animations'.\nThis mod is highly recommended for schlong allignments to work properly.") + ElseIf (!CheckSystemPart("UIExtensions")) + Debug.MessageBox("[SexLab]\nMissing 'UIExtensions'.\nThis mod is a soft dependency required for the internal Scene Selector Menu only.") + EndIf + If (CheckForSkyrimVR() && !CheckSystemPart("VRIK")) + Debug.MessageBox("[SexLab]\nMissing VRIK.\nThis mod is mandatory for SexLab to function properly in VR.") + return false + EndIf return true endFunction @@ -998,11 +1016,13 @@ Function Reload() _CrosshairRef = none TargetRef = none _Hooks = sslUtility.ClearNoneThreadHook(_Hooks) + HasVRIK = CheckForSkyrimVR() && CheckForVRIK() + InitFootStepVariablesVR() UnregisterForAllKeys() RegisterForKey(ToggleFreeCamera) RegisterForKey(TargetActor) - RegisterForKey(EndAnimation) + RegisterForKey(ToggleThreadControl) AddRemoveMatchmakerSpells() DisableThreadControl(_ActiveControl) @@ -1234,22 +1254,6 @@ bool Property GameEnabled hidden SetSettingBool("bGameEnabled", value) EndFunction EndProperty -int Property GameUtilityKey hidden - int Function Get() - return GetSettingInt("iGameUtilityKey") - EndFunction - Function Set(int aiSet) - SetSettingInt("iGameUtilityKey", aiSet) - EndFunction -EndProperty -int Property GamePauseKey hidden - int Function Get() - return GetSettingInt("iGamePauseKey") - EndFunction - Function Set(int aiSet) - SetSettingInt("iGamePauseKey", aiSet) - EndFunction -EndProperty int Property GameRaiseEnjKey hidden int Function Get() return GetSettingInt("iGameRaiseEnjKey") @@ -1266,14 +1270,6 @@ int Property GameHoldbackKey hidden SetSettingInt("iGameHoldbackKey", aiSet) EndFunction EndProperty -int Property GameSelectNextPos hidden - int Function Get() - return GetSettingInt("iGameSelectNextPos") - EndFunction - Function Set(int aiSet) - SetSettingInt("iGameSelectNextPos", aiSet) - EndFunction -EndProperty int Property GameStaminaCost hidden int Function Get() return GetSettingInt("iEnjGameStaminaCost") @@ -1290,6 +1286,14 @@ int Property GameMagickaCost hidden SetSettingInt("iEnjGameMagickaCost", aiSet) EndFunction EndProperty +int Property GameEnjAdjAmount hidden + int Function Get() + return GetSettingInt("iGameEnjAdjAmount") + EndFunction + Function Set(int aiSet) + SetSettingInt("iGameEnjAdjAmount", aiSet) + EndFunction +EndProperty bool Property GameRequiredOnHighEnj hidden bool Function Get() return GetSettingBool("bGameRequiredOnHighEnj") @@ -1307,6 +1311,394 @@ bool Property GameSpamDelayPenalty hidden EndFunction EndProperty +; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; +; ----------------------------------------------------------------------------- ; +; ██╗ ██╗██████╗ ██╗██╗ ██╗ ; +; ██║ ██║██╔══██╗██║██║ ██╔╝ ; +; ██║ ██║██████╔╝██║█████╔╝ ; +; ╚██╗ ██╔╝██╔══██╗██║██╔═██╗ ; +; ╚████╔╝ ██║ ██║██║██║ ██╗ ; +; ╚═══╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ; +; ----------------------------------------------------------------------------- ; +; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; + +bool Function CheckForSkyrimVR() global + return ((SKSE.GetVersion()*10000 + SKSE.GetVersionMinor()*100 + SKSE.GetVersionBeta()) == 20012) ;SKSE VR v2.0.12 +EndFunction + +bool Function CheckForVRIK() global + return (VRIK.VrikGetBuildNumber() >= 80123) +EndFunction + +Function ToggleVRIK(bool abEnabled, int aiPOVMode = -1) + If ((!HasVRIK) ||(_bAnimatingVR && abEnabled && aiPOVMode==POVModeVR) || (aiPOVMode < -1) || (aiPOVMode > VRIK_TPP_FREE)) + return + EndIf + If (abEnabled) + If (aiPOVMode > -1) + POVModeVR = aiPOVMode + EndIf + RefreshConfigsVRIK() + EndIf + ApplyConfigsVRIK(abEnabled) +EndFunction + +Function SetPOVModeVRIK(int aiSet, bool abForced = false) + If (!HasVRIK || !_bAnimatingVR) + If (abForced) + POVModeVR = aiSet + EndIf + return + EndIf + If ((aiSet==POVModeVR) || (aiSet < VRIK_FPP_HMD) || (aiSet > VRIK_TPP_FREE)) + return + EndIf + If (aiSet == VRIK_FPP_HMD) + Debug.Notification("SexLabVR POV: 1st LOCKED") + ElseIf (aiSet == VRIK_FPP_FREE) + Debug.Notification("SexLabVR POV: 1st FREE") + ElseIf (aiSet == VRIK_TPP_FREE) + Debug.Notification("SexLabVR POV: 3rd FREE") + EndIf + ToggleVRIK(true, aiPOVMode=aiSet) +EndFunction + +; ----------------------------------------------- ; +; --- VRIK CONFIGURATION --- ; +; ----------------------------------------------- ; + +int Property VRIK_FPP_HMD = 0 AutoReadOnly ; 1st Person [Headset Locked to Body] +int Property VRIK_FPP_FREE = 1 AutoReadOnly ; 1st Person [Headset Unlocked] +int Property VRIK_TPP_FREE = 2 AutoReadOnly ; 3rd Person [Headset Unlocked] + +bool _bLockHeight +float _fHeightAdjSpeed +bool _bTrackHead +int _iTrackHands +float _fDistHideHead +float _fDistNearClip +int _iLockHmdToBody +float _fLockHmdDistance +float _fLockHmdTolerance +float _fLockHmdSpeed +bool _bAnimatingVR +SoundCategory _AudioCategoryFST +SoundCategory _AudioCategoryNPCFST + +Function RefreshConfigsVRIK(bool abOverrideConfig=false, int aiPOVMode=-1, \ + int abLockHeight=-1, float afHeightAdjSpeed=-1.0, int abTrackHead=-1, int aiTrackHands=-1, \ + float afDistHideHead=-1.0, float afDistNearClip=-1.0, int aiLockHmdToBody=-1, \ + float afLockHmdDistance=-1.0, float afLockHmdTolerance=-1.0, float afLockHmdSpeed=-1.0) + If ((!HasVRIK) || (aiPOVMode < -1) || (aiPOVMode > VRIK_TPP_FREE)) + return + EndIf + ; Camera Mode + If (abOverrideConfig) && (aiPOVMode != -1) + POVModeVR = aiPOVMode + EndIf + bool VR_1st_HMD = (POVModeVR == VRIK_FPP_HMD) + bool VR_1st_FREE = (POVModeVR == VRIK_FPP_FREE) + bool VR_3rd_FREE = (POVModeVR == VRIK_TPP_FREE) + ; Shared + _fHeightAdjSpeed = HeightAdjustSpeed + _fDistNearClip = DistanceNearClip + ; Mode Dependent + If (VR_1st_HMD) + _bLockHeight = true + _iLockHmdToBody = 1 + _bTrackHead = TrackHead + _iTrackHands = TrackHands + _fDistHideHead = DistanceHideHead + _fLockHmdDistance = LockHmdDistance + _fLockHmdTolerance = LockHmdTolerance + _fLockHmdSpeed = LockHmdSpeed + ElseIf (VR_1st_FREE) + _bLockHeight = true + _iLockHmdToBody = 0 + _bTrackHead = false + _iTrackHands = 0 + _fDistHideHead = DistanceHideHead + _fLockHmdDistance = 0.0 + _fLockHmdTolerance = 0.0 + _fLockHmdSpeed = 150.0 + ElseIf (VR_3rd_FREE) + _bLockHeight = LockHeight + _iLockHmdToBody = 0 + _bTrackHead = false + _iTrackHands = 0 + _fDistHideHead = 2.0 + _fLockHmdDistance = 500.0 + _fLockHmdTolerance = 500.0 + _fLockHmdSpeed = 60.0 + EndIf + If (!abOverrideConfig) + return + EndIf + ; Apply Overrides + If (abLockHeight != -1) + _bLockHeight = abLockHeight as bool + EndIf + If (afHeightAdjSpeed != -1.0) + _fHeightAdjSpeed = afHeightAdjSpeed + EndIf + If (abTrackHead != -1) + _bTrackHead = abTrackHead as bool + EndIf + If (aiTrackHands != -1) + _iTrackHands = aiTrackHands + EndIf + If (afDistHideHead != -1.0) + _fDistHideHead = afDistHideHead + EndIf + If (afDistNearClip != -1.0) + _fDistNearClip = afDistNearClip + EndIf + If (aiLockHmdToBody != -1) + _iLockHmdToBody = aiLockHmdToBody + EndIf + If (afLockHmdDistance != -1.0) + _fLockHmdDistance = afLockHmdDistance + EndIf + If (afLockHmdTolerance != -1.0) + _fLockHmdTolerance = afLockHmdTolerance + EndIf + If (afLockHmdSpeed != -1.0) + _fLockHmdSpeed = afLockHmdSpeed + EndIf +EndFunction + +Function ApplyConfigsVRIK(bool abEnabled) + If (!HasVRIK) + return + EndIf + If (!abEnabled) + _bAnimatingVR = false + Utility.SetIniBool("bComfortSneak:VR", false) + VRIK.VrikRestoreSettings() + _AudioCategoryFST.Unmute() + _AudioCategoryNPCFST.Unmute() + SexLabUtil.UpdateAnimatingActorMovement(Game.GetPlayer()) + return + EndIf + float afScaleBody = Game.GetPlayer().GetScale() + ;float afScaleVR = VRIK.VrikGetSetting("bodySize") + If (ScaleVRBody) + VRIK.VrikSetSetting("bodySize", afScaleBody) + VRIK.VrikSetSetting("armSize", afScaleBody) + VRIK.VrikSetSetting("armLength", afScaleBody) ; or 1.0? + EndIf + ; Constant + Utility.SetIniBool("bComfortSneak:VR", true) + VRIK.VrikSetSetting("enablePosture", 0) + VRIK.VrikSetSetting("enableBody", 0) + VRIK.VrikSetSetting("enableJumping", 0) + VRIK.VrikSetSetting("displayHolsters", 0) + VRIK.VrikSetSetting("lockRotation", 1) + ; Shared + VRIK.VrikSetGesture("enableGestureHaptics", GestureHaptics as int) + VRIK.VrikSetSetting("heightAdjustSpeed", _fHeightAdjSpeed) + VRIK.VrikSetSetting("nearClipDistance", _fDistNearClip) + Utility.SetIniFloat("fNearDistance:Display", _fDistNearClip) + ; Mode Dependent + VRIK.VrikSetSetting("lockHeightToBody", _bLockHeight as int) + VRIK.VrikSetSetting("enableHead", _bTrackHead as int) + If (_iTrackHands > 0) + VRIK.VrikSetSetting("enableLeftArm", 1) + VRIK.VrikSetSetting("enableRightArm", 1) + VRIK.VrikSetSetting("enableInteractiveHands", _iTrackHands - 1) + Else + VRIK.VrikSetSetting("enableLeftArm", 0) + VRIK.VrikSetSetting("enableRightArm", 0) + VRIK.VrikSetSetting("enableInteractiveHands", 0) + EndIf + VRIK.VrikSetSetting("hidePlayerHeadDistance", _fDistHideHead) + VRIK.VrikSetSetting("lockHmdToBody", _iLockHmdToBody) + VRIK.VrikSetSetting("lockHmdMinThreshold", _fLockHmdDistance) + VRIK.VrikSetSetting("lockHmdMaxThreshold", _fLockHmdTolerance) + VRIK.VrikSetSetting("lockHmdSpeed", _fLockHmdSpeed) + ; Other Configs + _bAnimatingVR = true + _AudioCategoryFST.Mute() + _AudioCategoryNPCFST.Mute() + SexLabUtil.UpdateAnimatingActorMovement(Game.GetPlayer()) +EndFunction + +int Function UpdatePositioningVRIK(int VRIKRestoreInTicks) + If ((!_bAnimatingVR) || (POVModeVR != VRIK_FPP_FREE)) + return 0 + EndIf + Actor PlayerRef = Game.GetPlayer() + VRIK.VrikSetSetting("lockRotationAngle", PlayerRef.GetAngleZ()) + VRIK.VrikSetSetting("lockPositionX", PlayerRef.X) + VRIK.VrikSetSetting("lockPositionY", PlayerRef.Y) + VRIK.VrikSetSetting("lockPositionZ", PlayerRef.Z) + VRIK.VrikSetSetting("lockPosition", 2) + VRIK.VrikSetSetting("rotateHmdToBodySeconds", 1.5) + VRIK.VrikSetSetting("lockHmdToBody", 1) ;temp override + If (VRIKRestoreInTicks < 3) + VRIKRestoreInTicks = 3 ; t=1.5s + EndIf + return VRIKRestoreInTicks +EndFunction + +Function RestoreHmdVRIK() + If ((!_bAnimatingVR) || (POVModeVR != VRIK_FPP_FREE)) + return + EndIf + VRIK.VrikSetSetting("lockHmdToBody", 2) + VRIK.VrikSetSetting("lockPosition", 0) +EndFunction + +Function DoWhiteOutEfffect(int aiOrgasms) + If (!_bAnimatingVR || !OrgasmWhiteout) + return + EndIf + bool abKO = (Game.GetPlayer().GetActorValuePercentage("Stamina") < 0.25) + float HoldTime = (aiOrgasms as float) + 1.0 + If (HoldTime > 4.0) + HoldTime = 4.0 + EndIf + Game.FadeOutGame(true, abKO, 0.0, 2.0) + Utility.WaitMenuMode(0.5) + Game.FadeOutGame(false, false, HoldTime, 2.0) +EndFunction + +Function InitFootStepVariablesVR() + If (!HasVRIK) + return + EndIf + _AudioCategoryFST = Game.GetFormFromFile(0x0F5FFC,"Skyrim.esm") as SoundCategory + _AudioCategoryNPCFST = Game.GetFormFromFile(0x000F72,"Skyrim.esm") as SoundCategory +EndFunction + +; ----------------------------------------------- ; +; --- VRIK Settings --- ; +; ----------------------------------------------- ; + +; General +bool Property HasVRIK hidden + bool Function Get() + return GetSettingBool("bHasVRIK") + EndFunction + Function Set(bool value) + SetSettingBool("bHasVRIK", value) + EndFunction +EndProperty +bool Property UseGestures hidden + bool Function Get() + return GetSettingBool("bVRGestures") + EndFunction + Function Set(bool value) + SetSettingBool("bVRGestures", value) + EndFunction +EndProperty +bool Property GestureHaptics hidden + bool Function Get() + return GetSettingBool("bVRGestureHaptics") + EndFunction + Function Set(bool value) + SetSettingBool("bVRGestureHaptics", value) + EndFunction +EndProperty +bool Property ScaleVRBody hidden + bool Function Get() + return GetSettingBool("bVRScaleBody") + EndFunction + Function Set(bool value) + SetSettingBool("bVRScaleBody", value) + EndFunction +EndProperty +bool Property OrgasmWhiteout hidden + bool Function Get() + return GetSettingBool("bVROrgasmFX") + EndFunction + Function Set(bool value) + SetSettingBool("bVROrgasmFX", value) + EndFunction +EndProperty + +; VRIK +int Property POVModeVR hidden + int Function Get() + return GetSettingInt("iPOVModeVR") + EndFunction + Function Set(int aiSet) + SetSettingInt("iPOVModeVR", aiSet) + EndFunction +EndProperty +bool Property LockHeight hidden + bool Function Get() + return GetSettingBool("bLockHeightVR") + EndFunction + Function Set(bool value) + SetSettingBool("bLockHeightVR", value) + EndFunction +EndProperty +bool Property TrackHead hidden + bool Function Get() + return GetSettingBool("bTrackHeadVR") + EndFunction + Function Set(bool value) + SetSettingBool("bTrackHeadVR", value) + EndFunction +EndProperty +int Property TrackHands hidden + int Function Get() + return GetSettingInt("iTrackHandsVR") + EndFunction + Function Set(int aiSet) + SetSettingInt("iTrackHandsVR", aiSet) + EndFunction +EndProperty +float Property HeightAdjustSpeed hidden + float Function Get() + return GetSettingFlt("fHeightAdjSpeedVR") + EndFunction + Function Set(float afSet) + SetSettingFlt("fHeightAdjSpeedVR", afSet) + EndFunction +EndProperty +float Property DistanceHideHead hidden + float Function Get() + return GetSettingFlt("fDistHideHeadVR") + EndFunction + Function Set(float afSet) + SetSettingFlt("fDistHideHeadVR", afSet) + EndFunction +EndProperty +float Property DistanceNearClip hidden + float Function Get() + return GetSettingFlt("fDistNearClipVR") + EndFunction + Function Set(float afSet) + SetSettingFlt("fDistNearClipVR", afSet) + EndFunction +EndProperty +float Property LockHmdDistance hidden + float Function Get() + return GetSettingFlt("fLockHmdDistance") + EndFunction + Function Set(float afSet) + SetSettingFlt("fLockHmdDistance", afSet) + EndFunction +EndProperty +float Property LockHmdTolerance hidden + float Function Get() + return GetSettingFlt("fLockHmdTolerance") + EndFunction + Function Set(float afSet) + SetSettingFlt("fLockHmdTolerance", afSet) + EndFunction +EndProperty +float Property LockHmdSpeed hidden + float Function Get() + return GetSettingFlt("fLockHmdSpeed") + EndFunction + Function Set(float afSet) + SetSettingFlt("fLockHmdSpeed", afSet) + EndFunction +EndProperty + ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; ; ----------------------------------------------------------------------------- ; ; ██╗ ███████╗ ██████╗ █████╗ ██████╗██╗ ██╗ ; @@ -1349,7 +1741,6 @@ Message property CheckSexLabUtil Hidden EndFunction EndProperty - Faction property AnimatingFaction Hidden Faction Function Get() return Game.GetFormFromFile(0xE50F, "SexLab.esm") as Faction @@ -1890,6 +2281,96 @@ bool function SetOpenMouthExpression(bool isFemale, int value) return true endFunction +int property AdjustChange hidden + int Function Get() + return GetSettingInt("iAdjustChange") + EndFunction + Function Set(int aiSet) + SetSettingInt("iAdjustChange", aiSet) + EndFunction +EndProperty +int property AdjustForward hidden + int Function Get() + return GetSettingInt("iAdjustForward") + EndFunction + Function Set(int aiSet) + SetSettingInt("iAdjustForward", aiSet) + EndFunction +EndProperty +int property AdjustSideways hidden + int Function Get() + return GetSettingInt("iAdjustSideways") + EndFunction + Function Set(int aiSet) + SetSettingInt("iAdjustSideways", aiSet) + EndFunction +EndProperty +int property AdjustUpward hidden + int Function Get() + return GetSettingInt("iAdjustUpward") + EndFunction + Function Set(int aiSet) + SetSettingInt("iAdjustUpward", aiSet) + EndFunction +EndProperty +int property RealignActors hidden + int Function Get() + return GetSettingInt("iRealignActors") + EndFunction + Function Set(int aiSet) + SetSettingInt("iRealignActors", aiSet) + EndFunction +EndProperty +int property RotateScene hidden + int Function Get() + return GetSettingInt("iRotateScene") + EndFunction + Function Set(int aiSet) + SetSettingInt("iRotateScene", aiSet) + EndFunction +EndProperty +int property AdjustSchlong hidden + int Function Get() + return GetSettingInt("iAdjustSchlong") + EndFunction + Function Set(int aiSet) + SetSettingInt("iAdjustSchlong", aiSet) + EndFunction +EndProperty +int property Backwards hidden + int Function Get() + return GetSettingInt("iBackwards") + EndFunction + Function Set(int aiSet) + SetSettingInt("iBackwards", aiSet) + EndFunction +EndProperty + +bool function BackwardsPressed() + return Input.GetNumKeysPressed() > 1 && MirrorPress(Backwards) +endFunction + +bool function AdjustStagePressed() + return (!AdjustStage && Input.GetNumKeysPressed() > 1 && MirrorPress(ToggleAdjustStage)) \ + || (AdjustStage && !(Input.GetNumKeysPressed() > 1 && MirrorPress(ToggleAdjustStage))) +endFunction + +bool function IsAdjustStagePressed() + return Input.GetNumKeysPressed() > 1 && MirrorPress(ToggleAdjustStage) +endFunction + +bool function MirrorPress(int mirrorkey) + if mirrorkey == 42 || mirrorkey == 54 ; Shift + return Input.IsKeyPressed(42) || Input.IsKeyPressed(54) + elseif mirrorkey == 29 || mirrorkey == 157 ; Ctrl + return Input.IsKeyPressed(29) || Input.IsKeyPressed(157) + elseif mirrorkey == 56 || mirrorkey == 184 ; Alt + return Input.IsKeyPressed(56) || Input.IsKeyPressed(184) + else + return Input.IsKeyPressed(mirrorkey) + endIf +endFunction + ; ------------------------------------------------------- ; ; --- Functions --- ; ; ------------------------------------------------------- ; diff --git a/dist/Source/Scripts/sslThreadController.psc b/dist/Source/Scripts/sslThreadController.psc index f71b6e089..33eaac700 100644 --- a/dist/Source/Scripts/sslThreadController.psc +++ b/dist/Source/Scripts/sslThreadController.psc @@ -14,17 +14,40 @@ scriptname sslThreadController extends sslThreadModel ; ----------------------------------------------------------------------------- ; ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; -Message Property RepositionInfoMsg Auto -{[Ok, Cancel, Don't show again]} +Function EnableHotkeys(bool forced = false) + If(!HasPlayer && !forced) + return + EndIf + If (Config.UseSceneMenu && !Config.HasVRIK) + EnableMenuEvents() + EndIf + EnableTraditionalHotkeys() + If (Config.HasVRIK) + EnableGesturesVR() + EndIf +EndFunction +Function DisableHotkeys() + SexLabUtil.ToggleFreeCamera(0) ; TFC_OFF... If free cam is active here will glitch out controls? + If (Config.UseSceneMenu && !Config.HasVRIK) + DisableMenuEvents() + EndIf + DisableTraditionalHotkeys() + If (Config.HasVRIK) + DisableGesturesVR() + EndIf +EndFunction -bool _SkipHotkeyEvents -int _AutoAdvanceCache +; ------------------------------------------------------- ; +; --- Menu Events --- ; +; ------------------------------------------------------- ; String[] _MenuEvents +int _AutoAdvanceCache +bool _SkipMenuEvents = False -Function EnableHotkeys(bool forced = false) - If(!HasPlayer && !forced || !TryOpenSceneMenu()) +Function EnableMenuEvents() + If (!TryOpenSceneMenu()) return EndIf _AutoAdvanceCache = -1 @@ -42,22 +65,23 @@ Function EnableHotkeys(bool forced = false) RegisterForModEvent(_MenuEvents[i], "MenuEvent") i += 1 EndWhile - EnableTraditionalHotkeys() EndFunction -Function DisableHotkeys() +Function DisableMenuEvents() int i = 0 While (i < _MenuEvents.Length) UnregisterForModEvent(_MenuEvents[i]) i += 1 EndWhile - ; If free cam is active here will glitch out controls? - MiscUtil.SetFreeCameraState(false) TryCloseSceneMenu() - DisableTraditionalHotkeys() EndFunction Event MenuEvent(string asEventName, string asStringArg, float afNumArg, form akSender) + If (Utility.IsInMenuMode() || _SkipMenuEvents) + return + EndIf + _SkipMenuEvents = true + _SkipHotkeyEvents = true Log("MenuEvent: " + asEventName) If (asEventName == "SL_SetActiveScene") PickRandomScene(asStringArg) @@ -93,8 +117,17 @@ Event MenuEvent(string asEventName, string asStringArg, float afNumArg, form akS ElseIf (asEventName == "SL_StartAdjustOffset") ; TODO: impl EndIf + _SkipMenuEvents = false + _SkipHotkeyEvents = false EndEvent +; ------------------------------------------------------- ; +; --- Executed Functions [Menu Events] --- ; +; ------------------------------------------------------- ; + +Message Property RepositionInfoMsg Auto +{[Ok, Cancel, Don't show again]} + Function PickRandomScene(String asNewScene) String[] sceneSet = GetPlayingScenes() If(sceneSet.Length < 2) @@ -130,24 +163,22 @@ Function MoveScene() StorageUtil.SetIntValue(none, "SEXLAB_REPOSITIONMSG_INFO", 1) EndIf EndIf - sslActorAlias PlayerSlot = ActorAlias(PlayerRef) - If (HasPlayer) - PlayerSlot.TryPauseAndUnlock() - Else - Game.DisablePlayerControls(false, true, false, false, true) - EndIf int n = 0 While(n < Positions.Length) ActorAlias[n].GoToState(ActorAlias[n].STATE_PAUSED) + If (ActorAlias[n] == ActorAlias(PlayerRef)) + ActorAlias[n].TryPauseAndUnlock() + EndIf n += 1 EndWhile + SexLabUtil.SetActorMovement(PlayerRef, 1) ;MOVEMENT_UNLOCK Utility.Wait(1) int t = 0 While(t < 60 && !Input.IsKeyPressed(Config.MoveScene)) Utility.Wait(0.5) t += 1 EndWhile - Game.DisablePlayerControls() ; make sure player isnt moving before resync + SexLabUtil.SetActorMovement(PlayerRef, 2) ; MOVEMENT_LOCK... make sure player isnt moving before resync float x = PlayerRef.X float y = PlayerRef.Y float z = PlayerRef.Z @@ -163,10 +194,11 @@ Function MoveScene() ActorAlias[j].TryLockAndUnpause() j += 1 EndWhile + CenterOnObject(PlayerRef) If (!HasPlayer) - Game.EnablePlayerControls() + MoveActorsAwayFromPlayer(true) + Config.DisableThreadControl(self) EndIf - CenterOnObject(PlayerRef) EndFunction Function UpdateAnnotations(string asString) @@ -188,202 +220,685 @@ int Function GetOffsetIdx(String asOffsetType) return types.Find(asOffsetType) EndFunction -Function SetSceneOffset(float afOffsetValue, String asOffsetType) +Function SetSceneOffset(float afOffsetValue, String asOffsetType, bool abIncrement = false) String activeScene = GetActiveScene() int idx = GetOffsetIdx(asOffsetType) + If (abIncrement) + afOffsetValue += SexLabRegistry.GetSceneOffset(activeScene)[idx] + EndIf SexLabRegistry.SetSceneOffset(activeScene, afOffsetValue, idx) ResetStage() EndFunction -Function SetStageOffset(Actor akAffectedActor, float afOffsetValue, String asOffsetType) +Function SetStageOffset(Actor akAffectedActor, float afOffsetValue, String asOffsetType, bool abIncrement = false) int idx = GetOffsetIdx(asOffsetType) int n = GetPositions().Find(akAffectedActor) String activeScene = GetActiveScene() String activeStage = "" - If (sslSystemConfig.GetSettingBool("bAdjustTargetStage")) + If (Config.AdjustStage) activeStage = GetActiveStage() EndIf + If (abIncrement) + float afEditedValue = SexLabRegistry.GetStageOffset(activeScene, activeStage, n)[idx] + If (idx != 3) + afOffsetValue += afEditedValue + Else + afOffsetValue += Math.RadiansToDegrees(afEditedValue) + EndIf + EndIf SexLabRegistry.SetStageOffset(activeScene, activeStage, n, afOffsetValue, idx) UpdatePlacement(akAffectedActor) EndFunction +; ------------------------------------------------------- ; +; --- Traditional Hotkeys --- ; +; ------------------------------------------------------- ; + +int[] Hotkeys +int Property kChangeAnimation = 0 AutoReadOnly +int Property kMoveScene = 1 AutoReadOnly +int Property kChangePartner = 2 AutoReadOnly +int Property kGameRaiseEnj = 3 AutoReadOnly +int Property kGameHoldback = 4 AutoReadOnly +int Property kAdvanceAnimation = 5 AutoReadOnly +int Property kEndAnimation = 6 AutoReadOnly +int Property kChangePositions = 7 AutoReadOnly +int Property kOffsetAdjustMode = 8 AutoReadOnly +int Property kToggleAdjustStage = 9 AutoReadOnly +int Property kRestoreOffsets = 10 AutoReadOnly +int Property kDirectionUp = 11 AutoReadOnly +int Property kDirectionDown = 12 AutoReadOnly +int Property kDirectionLeft = 13 AutoReadOnly +int Property kDirectionRight = 14 AutoReadOnly +int Property kSceneSelector = 15 AutoReadOnly + +int Property AdjMode_None = 0 AutoReadOnly +int Property AdjMode_PosXY = 1 AutoReadOnly +int Property AdjMode_PosRZ = 2 AutoReadOnly +int Property AdjMode_SceneXY = 3 AutoReadOnly +int Property AdjMode_SceneRZ = 4 AutoReadOnly + +Actor _AdjustActor = None ; The actor (!=PlayerRef) currently selected for adjustments +int _AdjustMode = 0 ; Determines offsets adjustment mode +bool _SkipHotkeyEvents = False + Function EnableTraditionalHotkeys() - RegisterForKey(Config.ChangeAnimation) - RegisterForKey(Config.MoveScene) + InitLegacyHotkeys() + GetAdjustPos() + RegisterForKey(Hotkeys[kChangeAnimation]) + RegisterForKey(Hotkeys[kMoveScene]) + RegisterForKey(Hotkeys[kChangePartner]) + If (Config.GameEnabled && HasPlayer) + RegisterForKey(Hotkeys[kGameRaiseEnj]) + RegisterForKey(Hotkeys[kGameHoldback]) + EndIf + If (!Config.UseSceneMenu) + RegisterForKey(Hotkeys[kAdvanceAnimation]) + RegisterForKey(Hotkeys[kEndAnimation]) + RegisterForKey(Hotkeys[kChangePositions]) + RegisterForKey(Hotkeys[kOffsetAdjustMode]) + RegisterForKey(Hotkeys[kToggleAdjustStage]) + RegisterForKey(Hotkeys[kRestoreOffsets]) + RegisterForKey(Hotkeys[kDirectionUp]) + RegisterForKey(Hotkeys[kDirectionDown]) + RegisterForKey(Hotkeys[kDirectionLeft]) + RegisterForKey(Hotkeys[kDirectionRight]) + RegisterForKey(Hotkeys[kSceneSelector]) + EndIf EndFunction Function DisableTraditionalHotkeys() - UnregisterForKey(Config.ChangeAnimation) - UnregisterForKey(Config.MoveScene) + int i = 0 + While (i < Hotkeys.Length) + UnregisterForKey(Hotkeys[i]) + i += 1 + EndWhile EndFunction -Event OnKeyDown(int KeyCode) - If(Utility.IsInMenuMode() || _SkipHotkeyEvents) +Event OnKeyDown(int aiKey) + If (Utility.IsInMenuMode() || _SkipHotkeyEvents) return EndIf _SkipHotkeyEvents = true - If(KeyCode == Config.ChangeAnimation) - ChangeAnimation(Input.IsKeyPressed(Config.GameUtilityKey)) - ElseIf(KeyCode == Config.MoveScene) + _SkipMenuEvents = true + bool abModifier = Config.ModifierPressed() + bool abAdjustTarget = abModifier + If (aiKey == Hotkeys[kChangeAnimation]) + PickRandomScene("") + ElseIf (aiKey == Hotkeys[kMoveScene]) MoveScene() + ElseIf (aiKey == Hotkeys[kChangePartner]) + ChangeTargetPartner(abModifier) + EndIf + If (Config.GameEnabled && HasPlayer) + If (aiKey == Hotkeys[kGameRaiseEnj]) + ProcessEnjGameArg("Stamina", _AdjustActor, abAdjustTarget) + ElseIf (aiKey == Hotkeys[kGameHoldback]) + ProcessEnjGameArg("Magicka", _AdjustActor, abAdjustTarget) + EndIf + EndIf + ; Legacy + If (Config.UseSceneMenu) + _SkipHotkeyEvents = false + _SkipMenuEvents = false + return + EndIf + If (aiKey == Hotkeys[kAdvanceAnimation]) + AdvanceStage(abModifier) + ElseIf (aiKey == Hotkeys[kEndAnimation]) + EndAnimation() + ElseIf (aiKey == Hotkeys[kChangePositions]) + ChangePositions(abAdjustTarget) + ElseIf (aiKey == Hotkeys[kOffsetAdjustMode]) + CycleOffsetAdjustModes(abModifier) + ElseIf (aiKey == Hotkeys[kToggleAdjustStage]) + Config.AdjustStage = !Config.AdjustStage + Debug.Notification("SexLab: AdjustStage: " + Config.AdjustStage) + ElseIf (aiKey == Hotkeys[kRestoreOffsets]) + RestoreOffsets() + ElseIf (aiKey == Hotkeys[kSceneSelector]) + SceneSelectorMenu() + EndIf + If (_AdjustMode > AdjMode_None) + string[] asOffsetType = DetermineOffsetAdjustInputType(aiKey) + HandleOffsetAdjustment(asOffsetType, aiKey, abAdjustTarget) EndIf _SkipHotkeyEvents = false + _SkipMenuEvents = false EndEvent -Function ChangeAnimation(bool backwards = false) - string[] Scenes = GetPlayingScenes() - If(Scenes.Length < 2) +Function InitLegacyHotkeys() + Hotkeys = new int[16] + Hotkeys[kChangeAnimation] = Config.ChangeAnimation + Hotkeys[kMoveScene] = Config.MoveScene + Hotkeys[kChangePartner] = Config.TargetActor + Hotkeys[kGameRaiseEnj] = Config.GameRaiseEnjKey + Hotkeys[kGameHoldback] = Config.GameHoldbackKey + ;Legacy + Hotkeys[kAdvanceAnimation] = Config.AdvanceAnimation + Hotkeys[kEndAnimation] = Config.EndAnimation + Hotkeys[kChangePositions] = Config.ChangePositions + Hotkeys[kOffsetAdjustMode] = Config.OffsetAdjustMode + Hotkeys[kToggleAdjustStage] = Config.ToggleAdjustStage + Hotkeys[kRestoreOffsets] = Config.RestoreOffsets + Hotkeys[kDirectionUp] = Config.DirectionUp + Hotkeys[kDirectionDown] = Config.DirectionDown + Hotkeys[kDirectionLeft] = Config.DirectionLeft + Hotkeys[kDirectionRight] = Config.DirectionRight + Hotkeys[kSceneSelector] = Config.SceneSelectorMenu +EndFunction + +; ------------------------------------------------------- ; +; --- Executed Functions [Legacy Hotkeys] --- ; +; ------------------------------------------------------- ; + +Function AdvanceStage(bool abBackwards = false) + If (!abBackwards) + GoToStage(Stage + 1) + ElseIf (Stage > 1) + GoToStage(Stage - 1) + EndIf +EndFunction + +Function ChangePositions(bool abAdjustTarget = false) + If (GetPositions().Length < 2) return EndIf - UnregisterForUpdate() - int current = Scenes.Find(GetActiveScene()) - String newScene - If (!Config.AdjustStagePressed()) - newScene = Scenes[sslUtility.IndexTravel(current, Scenes.Length, backwards)] + Actor akAffectedActor = PlayerRef + If (abAdjustTarget) + akAffectedActor = GetTargetPartner() + EndIf + If (SetNextPermutation(akAffectedActor)) + SendThreadEvent("PositionChange") + return + EndIf + Debug.Notification("Selected actor cannot switch positions") +EndFunction + +int Function GetOffsetAdjustMode() + return _AdjustMode +EndFunction + +Function SetOffsetAdjustMode(int aiSet) + If ((aiSet == _AdjustMode) || (aiSet < AdjMode_None) || (aiSet > AdjMode_SceneRZ)) + return + EndIf + If (_AdjustMode == AdjMode_None) + SexLabUtil.ForceThirdPerson() + EndIf + _AdjustMode = aiSet + If (_AdjustMode == AdjMode_None) + Debug.Notification("SexLab: Disabled offset adjustments") + return + EndIf + If (_AdjustMode == AdjMode_PosXY) + Debug.Notification("SexLab: Adjusting Position X-Y") + ElseIf (_AdjustMode == AdjMode_PosRZ) + Debug.Notification("SexLab: Adjusting Position R-Z") + ElseIf (_AdjustMode == AdjMode_SceneXY) + Debug.Notification("SexLab: Adjusting Scene X-Y") + ElseIf (_AdjustMode == AdjMode_SceneRZ) + Debug.Notification("SexLab: Adjusting Scene R-Z") + EndIf +EndFunction + +Function CycleOffsetAdjustModes(bool abBackwards = false) + int modesCount = 5 + int step = 1 + If (abBackwards) + step = -1 + EndIf + int aiMode = _AdjustMode + step + If (aiMode >= modesCount) + aiMode = 0 + ElseIf (aiMode < 0) + aiMode = (modesCount - 1) + EndIf + SetOffsetAdjustMode(aiMode) +EndFunction + +string[] Function DetermineOffsetAdjustInputType(int aiKey) + string[] ret = Utility.CreateStringArray(2, "") + If ((aiKey != Config.DirectionUp) && (aiKey != Config.DirectionDown) && \ + (aiKey != Config.DirectionLeft) && (aiKey != Config.DirectionRight)) + return ret + EndIf + bool abAdjustingRZ = (_AdjustMode == AdjMode_PosRZ) || (_AdjustMode == AdjMode_SceneRZ) + If (aiKey == Config.DirectionLeft) + ret[0] = "-" + ret[1] = "R" + If (!abAdjustingRZ) + ret[1] = "X" + EndIf + ElseIf (aiKey == Config.DirectionRight) + ret[1] = "R" + If (!abAdjustingRZ) + ret[1] = "X" + EndIf + ElseIf (aiKey == Config.DirectionUp) + ret[1] = "Z" + If (!abAdjustingRZ) + ret[1] = "Y" + EndIf + ElseIf (aiKey == Config.DirectionDown) + ret[0] = "-" + ret[1] = "Z" + If (!abAdjustingRZ) + ret[1] = "Y" + EndIf + EndIf + return ret +EndFunction + +Function HandleOffsetAdjustment(String[] asOffsetType, int aiKey, bool abAdjustTarget) + If (asOffsetType[1] == "") + return + EndIf + PauseTimer(true) + Actor akAffectedActor = GetTargetPartner() + If (HasPlayer && !abAdjustTarget) + akAffectedActor = PlayerRef + EndIf + float afValue = Config.AdjustStepSize + bool abAdjustingPos = (_AdjustMode == AdjMode_PosXY) || (_AdjustMode == AdjMode_PosRZ) + ApplyOffsetAdjustment(akAffectedActor, afValue, asOffsetType, abAdjustingPos) + While (Input.IsKeyPressed(aiKey)) + ApplyOffsetAdjustment(akAffectedActor, afValue, asOffsetType, abAdjustingPos) + afValue += Config.AdjustStepSize * 0.1 + If (afValue > Config.AdjustStepSize * 5.0) + afValue = Config.AdjustStepSize * 5.0 + EndIf + Utility.Wait(0.02) + EndWhile + PauseTimer(false) +EndFunction + +Function ApplyOffsetAdjustment(Actor akAffectedActor, float afValue, String[] asOffsetType, bool abAdjustingPos) + If ((asOffsetType[1] == "") || (afValue == 0)) + return + EndIf + If (asOffsetType[0] == "-") + afValue = -afValue + EndIf + If (abAdjustingPos) + SetStageOffset(akAffectedActor, afValue, asOffsetType[1], true) Else - int r = Utility.RandomInt(0, Scenes.Length - 1) - While(r == current) - r = Utility.RandomInt(0, Scenes.Length - 1) - EndWhile - newScene = Scenes[r] + SetSceneOffset(afValue, asOffsetType[1], true) + EndIf +EndFunction + +Function RestoreOffsets() + SexLabRegistry.ResetSceneOffset(GetActiveScene()) + SexLabRegistry.ResetStageOffsetA(GetActiveScene(), GetActiveStage()) + RealignActors() +EndFunction + +Function SceneSelectorMenu() + If (Game.GetModByName("UIExtensions.esp") == 255) + return + EndIf + string asActiveScene = GetActiveScene() + string asActSceneName = SexlabRegistry.GetSceneName(asActiveScene) + string[] asPlayingScenes = GetPlayingScenes() + int aiPlayingLen = asPlayingScenes.Length + ; Init Menus + UIListMenu ListMenu = UIExtensions.GetMenu("UIListMenu") as UIListMenu + int alOffsetAdjMode = ListMenu.AddEntryItem("$SSL_SS_OffsetAdjustMode", entryHasChildren=True) + int alPlayingScenes = ListMenu.AddEntryItem("$SSL_SS_ChangeCurrentScene", entryHasChildren=True) + int alCustomInput = ListMenu.AddEntryItem("$SSL_SS_ResetScenesByTagName") + ListMenu.AddEntryItem("$SSL_SS_AdjNone", entryParent=alOffsetAdjMode) + ListMenu.AddEntryItem("$SSL_SS_AdjPosXY", entryParent=alOffsetAdjMode) + ListMenu.AddEntryItem("$SSL_SS_AdjPosRZ", entryParent=alOffsetAdjMode) + ListMenu.AddEntryItem("$SSL_SS_AdjSceneXY", entryParent=alOffsetAdjMode) + ListMenu.AddEntryItem("$SSL_SS_AdjSceneRZ", entryParent=alOffsetAdjMode) + If (aiPlayingLen > 120) ; Range for AddEntryItem 0-127 (hardcoded: 8 above) + aiPlayingLen = 120 + asPlayingScenes = SexLabUtil.ShuffleStringArray(asPlayingScenes, asActiveScene, 120) + EndIf + int i = 0 + While (i < aiPlayingLen) + If (asPlayingScenes[i] == asActiveScene) + ListMenu.AddEntryItem(">>> " + asActSceneName, entryParent=alPlayingScenes) + Else + string asSceneName = SexlabRegistry.GetSceneName(asPlayingScenes[i]) + ListMenu.AddEntryItem(asSceneName, entryParent=alPlayingScenes) + EndIf + i += 1 + EndWhile + ; Exec Menus + ListMenu.OpenMenu() + string asOptSelected = ListMenu.GetResultString() + If (asOptSelected == "") + return + EndIf + If (asOptSelected == "$SSL_SS_ResetScenesByTagName") + UITextEntryMenu TextMenu = UIExtensions.GetMenu("UITextEntryMenu") as UITextEntryMenu + TextMenu.OpenMenu() + string asTypedText = TextMenu.GetResultString() + If (asTypedText == "") + return + EndIf + bool aiNewScenes = ResetAnimationQuick(asTypedText) + If (!aiNewScenes) + string asNewScene = SexLabRegistry.GetSceneByName(asTypedText) + If (asNewScene) + ResetScene(asNewScene) + EndIf + EndIf + ElseIf (asOptSelected == "$SSL_SS_AdjNone") + SetOffsetAdjustMode(AdjMode_None) + ElseIf (asOptSelected == "$SSL_SS_AdjPosXY") + SetOffsetAdjustMode(AdjMode_PosXY) + ElseIf (asOptSelected == "$SSL_SS_AdjPosRZ") + SetOffsetAdjustMode(AdjMode_PosRZ) + ElseIf (asOptSelected == "$SSL_SS_AdjSceneXY") + SetOffsetAdjustMode(AdjMode_SceneXY) + ElseIf (asOptSelected == "$SSL_SS_AdjSceneRZ") + SetOffsetAdjustMode(AdjMode_SceneRZ) + Else + If (asOptSelected != ">>> " + asActSceneName) + string asSelectedScene = SexLabRegistry.GetSceneByName(asOptSelected) + ResetScene(asSelectedScene) + EndIf + EndIf +EndFunction + +int Function GetAdjustPos() + int AdjustIdx = -1 + If (HasPlayer) + AdjustIdx = IndexTravelComplex(GetPositionIdx(PlayerRef)) + Else + AdjustIdx = (GetPositions().Length > 1) as int + EndIf + _AdjustActor = GetIdxPosition(AdjustIdx) + Config.SetTargetActor(_AdjustActor) + return AdjustIdx +EndFunction + +Actor Function GetTargetPartner() + If (!_AdjustActor) + GetAdjustPos() + EndIf + return _AdjustActor +EndFunction + +Function ChangeTargetPartner(bool abBackwards = false) + If (Positions.Length < 3) + return + EndIf + int curIdx = GetAdjustPos() + int newIdx = IndexTravelComplex(curIdx, abBackwards, PlayerRef) + _AdjustActor = GetIdxPosition(newIdx) + Config.SetTargetActor(_AdjustActor) + Config.SelectedSpell.Cast(_AdjustActor) ; SFX for visual feedback + PlayHotkeyFX(0, !abBackwards) + Debug.Notification("SexLab partner selected: " + SexLabUtil.ActorName(_AdjustActor)) + Log("ChangeTargetPartner(), currently focused partner: " + SexLabUtil.ActorName(_AdjustActor)) +EndFunction + +Function PlayHotkeyFX(int i, bool abBackwards) + If (abBackwards) + Config.HotkeyDown[i].Play(PlayerRef) + Else + Config.HotkeyUp[i].Play(PlayerRef) EndIf - Log("Changing running scene from " + GetActiveScene() + " to " + newScene) - SendThreadEvent("AnimationChange") - ResetScene(newScene) EndFunction ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; ; ----------------------------------------------------------------------------- ; -; ██╗ ███████╗ ██████╗ █████╗ ██████╗██╗ ██╗ ; -; ██║ ██╔════╝██╔════╝ ██╔══██╗██╔════╝╚██╗ ██╔╝ ; -; ██║ █████╗ ██║ ███╗███████║██║ ╚████╔╝ ; -; ██║ ██╔══╝ ██║ ██║██╔══██║██║ ╚██╔╝ ; -; ███████╗███████╗╚██████╔╝██║ ██║╚██████╗ ██║ ; -; ╚══════╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ; +; ██╗ ██╗██████╗ ██╗██╗ ██╗ ; +; ██║ ██║██╔══██╗██║██║ ██╔╝ ; +; ██║ ██║██████╔╝██║█████╔╝ ; +; ╚██╗ ██╔╝██╔══██╗██║██╔═██╗ ; +; ╚████╔╝ ██║ ██║██║██║ ██╗ ; +; ╚═══╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ; ; ----------------------------------------------------------------------------- ; ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; -sslActorAlias AdjustAlias ; The actor currently selected for position adjustments +;# Requires: Thumbstick OR Trackpad (L+R) +;#--------------------------------------------------#; +;# {Mode 1/2} SLVR Gestures - NORMAL +;#--------------------------------------------------#; +;# L_Tap : ToggleAdjustSelf +;# L_Up : GameRaiseEnj +;# L_Down : GameHoldback +;# L_Left : TargetPartnerPrev +;# L_Right : TargetPartnerNext +;# L_Back : ToggleFreeCam +;# L_Forward : SceneSelectorMenu +;# R_Tap : CyclePOVModes +;# R_Up : SceneChange +;# R_Down : SceneEnd +;# R_Left : StagePrev +;# R_Right : StageNext +;# R_Back : MoveScene +;# R_Forward : ChangePositions +;#--------------------------------------------------#; +;# {Mode 2/2} SLVR Gestures - OFFSET +;#--------------------------------------------------#; +;# L_Tap : ToggleAdjustSelf +;# L_Up : ToggleAdjustStage +;# L_Down : RestoreOffsets +;# L_Left : OffsetAdjModePrev +;# L_Right : OffsetAdjModeNext +;# R_Tap : OffsetHoldAdj +;# R_Up : OffsetAdjUp (Y/Z) +;# R_Down : OffsetAdjDown (Y/Z) +;# R_Left : OffsetAdjLeft (X/R) +;# R_Right : OffsetAdjRight (X/R) +;#--------------------------------------------------#; + +bool _SkipGestureEvents = False +bool _AdjustSelfVR = True + +Function RegisterGesture(int aiGesture, String asName) + VRIK.VrikSetProfileAction(aiGesture, "SLVR_"+asName) + RegisterForModEvent("SLVR_"+asName, "VRHandleGesture") +EndFunction -int[] Hotkeys -int Property kAdvanceAnimation = 0 AutoReadOnly -int Property kChangeAnimation = 1 AutoReadOnly -int Property kChangePositions = 2 AutoReadOnly -int Property kAdjustChange = 3 AutoReadOnly -int Property kAdjustForward = 4 AutoReadOnly -int Property kAdjustSideways = 5 AutoReadOnly -int Property kAdjustUpward = 6 AutoReadOnly -int Property kRealignActors = 7 AutoReadOnly -int Property kRestoreOffsets = 8 AutoReadOnly -int Property kMoveScene = 9 AutoReadOnly -int Property kRotateScene = 10 AutoReadOnly -int Property kEndAnimation = 11 AutoReadOnly -int Property kAdjustSchlong = 12 AutoReadOnly -;/ -Event OnKeyDown(int KeyCode) - If(Utility.IsInMenuMode() || _SkipHotkeyEvents) +Function UnregisterGesture(String asName) + UnregisterForModEvent("SLVR_" + asName) +EndFunction + +Function EnableGesturesVR() + If (!Config.UseGestures) return EndIf - _SkipHotkeyEvents = true - int hotkey = Hotkeys.Find(KeyCode) - If(hotkey == kAdvanceAnimation) - If (Config.BackwardsPressed()) + VRIK.VrikBeginGestureProfile() + RegisterGesture(1, "L_Tap") + RegisterGesture(2, "L_Up") + RegisterGesture(3, "L_Down") + RegisterGesture(4, "L_Left") + RegisterGesture(5, "L_Right") + RegisterGesture(6, "L_Back") + RegisterGesture(7, "L_Forward") + RegisterGesture(14, "R_Tap") + RegisterGesture(15, "R_Up") + RegisterGesture(16, "R_Down") + RegisterGesture(17, "R_Left") + RegisterGesture(18, "R_Right") + RegisterGesture(19, "R_Back") + RegisterGesture(20, "R_Forward") +EndFunction + +Function DisableGesturesVR() + If (!Config.UseGestures) + return + EndIf + VRIK.VrikEndGestureProfile() + UnregisterGesture("L_Tap") + UnregisterGesture("L_Up") + UnregisterGesture("L_Down") + UnregisterGesture("L_Left") + UnregisterGesture("L_Right") + UnregisterGesture("L_Back") + UnregisterGesture("L_Forward") + UnregisterGesture("R_Tap") + UnregisterGesture("R_Up") + UnregisterGesture("R_Down") + UnregisterGesture("R_Left") + UnregisterGesture("R_Right") + UnregisterGesture("R_Back") + UnregisterGesture("R_Forward") +EndFunction + +Function VRHandleGesture(String asEventName, String Foobar, float Presses, Form Sender) + If (Utility.IsInMenuMode() || _SkipGestureEvents) + return + EndIf + _SkipGestureEvents = true + bool abAdjustTarget = !_AdjustSelfVR + String asEvent = StringUtil.Substring(asEventName, 5) + If (asEvent == "L_Tap") + _AdjustSelfVR = !_AdjustSelfVR + Debug.Notification("SexLab: AdjustSelf: " + _AdjustSelfVR) + _SkipGestureEvents = false + return + EndIf + If (GetOffsetAdjustMode() == AdjMode_None) + If (HasPlayer && Config.GameEnabled) + If (asEvent == "L_Up") + ProcessEnjGameArg("Stamina", GetTargetPartner(), abAdjustTarget) + ElseIf (asEvent == "L_Down") + ProcessEnjGameArg("Magicka", GetTargetPartner(), abAdjustTarget) + EndIf + EndIf + If (asEvent == "L_Left") + ChangeTargetPartner(true) + ElseIf (asEvent == "L_Right") + ChangeTargetPartner() + ElseIf (asEvent == "L_Back") + SexLabUtil.ToggleFreeCamera() + ElseIf (asEvent == "L_Forward") + SceneSelectorMenu() + ElseIf (asEvent == "R_Tap") + CyclePOVModesVR() + ElseIf (asEvent == "R_Up") + PickRandomScene("") + ElseIf (asEvent == "R_Down") + EndAnimation() + ElseIf (asEvent == "R_Left") AdvanceStage(true) - Else - AdvanceStage(false) + ElseIf (asEvent == "R_Right") + AdvanceStage() + ElseIf (asEvent == "R_Back") + MoveScene() + ElseIf (asEvent == "R_Forward") + ChangePositions(abAdjustTarget) EndIf - ElseIf(hotkey == kChangeAnimation) - ChangeAnimation(Config.BackwardsPressed()) - ElseIf(hotkey == kAdjustForward) - AdjustForward(Config.BackwardsPressed(), Config.AdjustStagePressed()) - ElseIf(hotkey == kAdjustUpward) - AdjustUpward(Config.BackwardsPressed(), Config.AdjustStagePressed()) - ElseIf(hotkey == kAdjustSideways) - AdjustSideways(Config.BackwardsPressed(), Config.AdjustStagePressed()) - ElseIf(hotkey == kRotateScene) - RotateScene(Config.BackwardsPressed()) - ElseIf(hotkey == kAdjustSchlong) - ; AdjustSchlongEx(Config.BackwardsPressed(), Config.AdjustStagePressed()) - ElseIf(hotkey == kAdjustChange) ; Change Adjusting Position - AdjustChange(Config.BackwardsPressed()) - ElseIf(hotkey == kRealignActors) - RealignActors() - ElseIf(hotkey == kChangePositions) - ChangePositions() - ElseIf(hotkey == kRestoreOffsets) - RestoreOffsets() - ElseIf(hotkey == kMoveScene) - MoveScene() - ElseIf(hotkey == kEndAnimation) - EndAnimation() + _SkipGestureEvents = false + return + Else + string[] asOffsetType = Utility.CreateStringArray(2, "") + If (asEvent == "L_Up") + Config.AdjustStage = !Config.AdjustStage + Debug.Notification("SexLab: AdjustStage: " + Config.AdjustStage) + ElseIf (asEvent == "L_Down") + RestoreOffsets() + ElseIf (asEvent == "L_Left") + CycleOffsetAdjustModes(true) + ElseIf (asEvent == "L_Right") + CycleOffsetAdjustModes() + ElseIf (asEvent == "R_Up") + asOffsetType = DetermineOffsetAdjustInputType(Config.DirectionUp) + ElseIf (asEvent == "R_Down") + asOffsetType = DetermineOffsetAdjustInputType(Config.DirectionDown) + ElseIf (asEvent == "R_Left") + asOffsetType = DetermineOffsetAdjustInputType(Config.DirectionLeft) + ElseIf (asEvent == "R_Right") + asOffsetType = DetermineOffsetAdjustInputType(Config.DirectionRight) + EndIf + HandleOffsetAdjustmentVR(asOffsetType, abAdjustTarget) EndIf - _SkipHotkeyEvents = false -EndEvent -/; -int Function GetAdjustPos() - int AdjustPos = -1 - if AdjustAlias && AdjustAlias.ActorRef - AdjustPos = Positions.Find(AdjustAlias.ActorRef) - endIf - if AdjustPos == -1 && Config.TargetRef - AdjustPos = Positions.Find(Config.TargetRef) - endIf - if AdjustPos == -1 - AdjustPos = (ActorCount > 1) as int - endIf - if Positions[AdjustPos] != PlayerRef - Config.TargetRef = Positions[AdjustPos] - endIf - AdjustAlias = PositionAlias(AdjustPos) - return AdjustPos + _SkipGestureEvents = false EndFunction -Function AdvanceStage(bool backwards = false) - If(!backwards) - GoToStage(Stage + 1) - Elseif(Config.IsAdjustStagePressed()) - GoToStage(1) - ElseIf(Stage > 1) - GoToStage(Stage - 1) +Function CyclePOVModesVR(bool abBackwards = false) + int aiMode = Config.VRIK_TPP_FREE + If (GetOffsetAdjustMode() == AdjMode_None) + int modesCount = 3 + int step = 1 + If (abBackwards) + step = -1 + EndIf + aiMode = Config.POVModeVR + step + If (aiMode >= modesCount) + aiMode = 0 + ElseIf (aiMode < 0) + aiMode = (modesCount - 1) + EndIf EndIf + Config.SetPOVModeVRIK(aiMode) EndFunction -Function AdjustCoordinate(bool abBackwards, bool abStageOnly, float afValue, int aiKeyIdx, int aiOffsetType) - ; aiOffsetType := [X, Y, Z, Rotation] - UnregisterForUpdate() - String scene_ = GetActiveScene() - String stage_ = "" - If (!abStageOnly) - stage_ = GetActiveStage() +Function HandleOffsetAdjustmentVR(String[] asOffsetType, bool abAdjustTarget) + If (asOffsetType[1] == "") + return EndIf - int AdjustPos = GetAdjustPos() - bool first_pass = true - While(true) - PlayHotkeyFX(0, abBackwards) - SexLabRegistry.SetStageOffset(scene_, stage_, AdjustPos, afValue, aiOffsetType) - ; UpdatePlacement(AdjustAlias.GetActorReference()) - Utility.Wait(0.1) - If(!Input.IsKeyPressed(Hotkeys[aiKeyIdx])) - UpdateTimer(5) - OnUpdate() + PauseTimer(true) + Actor akAffectedActor = GetTargetPartner() + If (HasPlayer && !abAdjustTarget) + akAffectedActor = PlayerRef + EndIf + float afValue = Config.AdjustStepSize + int aiAdjMode = GetOffsetAdjustMode() + bool abAdjustingPos = (aiAdjMode == AdjMode_PosXY) || (aiAdjMode == AdjMode_PosRZ) + ApplyOffsetAdjustment(akAffectedActor, afValue, asOffsetType, abAdjustingPos) + float refX = VRIK.VrikGetHandX(false) + float refY = VRIK.VrikGetHandY(false) + float refZ = VRIK.VrikGetHandZ(false) + float newX = 0.0 + float newY = 0.0 + float newZ = 0.0 + float curDrift = 0.0 + While (VRIK.VrikIsThumbstickPressed(false)) + newX = VRIK.VrikGetHandX(false) + newY = VRIK.VrikGetHandY(false) + newZ = VRIK.VrikGetHandZ(false) + curDrift = Math.Abs(newX - refX) + Math.Abs(newY - refY) + Math.Abs(newZ - refZ) + If (curDrift > 30.0) ;hand moved too much, not roughly in place + PauseTimer(false) return - ElseIf (first_pass) - first_pass = false - Utility.Wait(0.4) + EndIf + ApplyOffsetAdjustment(akAffectedActor, afValue, asOffsetType, abAdjustingPos) + Utility.Wait(0.02) + afValue += Config.AdjustStepSize * 0.1 + If (afValue > Config.AdjustStepSize * 5.0) + afValue = Config.AdjustStepSize * 5.0 EndIf EndWhile + If (Config.GestureHaptics) + VRIK.VrikHapticPulse(false, 2, 800) + EndIf + PauseTimer(false) +EndFunction + +; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; +; ----------------------------------------------------------------------------- ; +; ██╗ ███████╗ ██████╗ █████╗ ██████╗██╗ ██╗ ; +; ██║ ██╔════╝██╔════╝ ██╔══██╗██╔════╝╚██╗ ██╔╝ ; +; ██║ █████╗ ██║ ███╗███████║██║ ╚████╔╝ ; +; ██║ ██╔══╝ ██║ ██║██╔══██║██║ ╚██╔╝ ; +; ███████╗███████╗╚██████╔╝██║ ██║╚██████╗ ██║ ; +; ╚══════╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ; +; ----------------------------------------------------------------------------- ; +; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; + +Function ChangeAnimation(bool backwards = false) + return PickRandomScene("") +EndFunction + +Function AdjustCoordinate(bool abBackwards, bool abStageOnly, float afValue, int aiKeyIdx, int aiOffsetType) + LogRedundant("AdjustCoordinate") EndFunction Function AdjustForward(bool backwards = false, bool AdjustStage = false) - float value = 0.5 - (backwards as float) - AdjustCoordinate(backwards, AdjustStage, value, kAdjustForward, 0) + LogRedundant("AdjustForward") EndFunction Function AdjustSideways(bool backwards = false, bool AdjustStage = false) - float value = 0.5 - (backwards as float) - AdjustCoordinate(backwards, AdjustStage, value, kAdjustSideways, 1) + LogRedundant("AdjustSideways") EndFunction Function AdjustUpward(bool backwards = false, bool AdjustStage = false) - float value = 0.5 - (backwards as float) - AdjustCoordinate(backwards, AdjustStage, value, kAdjustUpward, 2) + LogRedundant("AdjustUpward") EndFunction Function RotateScene(bool backwards = false) @@ -406,7 +921,7 @@ Function RotateScene(bool backwards = false) EndIf CenterOnCoords(coords[0], coords[1], coords[2], 0, 0, coords[5], true) Utility.Wait(0.03) - If(!Input.IsKeyPressed(Hotkeys[kRotateScene])) + If(!Input.IsKeyPressed(Hotkeys[kDirectionLeft])) ;kRotateScene RegisterForSingleUpdate(0.2) return ElseIf (first_pass) @@ -417,64 +932,7 @@ Function RotateScene(bool backwards = false) EndFunction Function AdjustChange(bool backwards = false) - If(Positions.Length <= 1) - return - EndIf - int i = GetAdjustPos() - i = sslUtility.IndexTravel(i, ActorCount, backwards) - If(Positions[i] != PlayerRef) - Config.TargetRef = Positions[i] - EndIf - AdjustAlias = ActorAlias[i] - Config.SelectedSpell.Cast(Positions[i]) ; SFX for visual feedback - PlayHotkeyFX(0, !backwards) - String msg = "Adjusting Position For: " + AdjustAlias.GetActorName() - Debug.Notification(msg) - SexLabUtil.PrintConsole(msg) -EndFunction - -Function RestoreOffsets() - SexLabRegistry.ResetStageOffsetA(GetActiveScene(), GetActiveStage()) - RealignActors() -EndFunction - -Function ChangePositions(bool backwards = false) - If(Positions.Length < 2) - return - EndIf - String activeScene = GetActiveScene() - Actor actor_adj = AdjustAlias.GetActorReference() - int i_adj = GetAdjustPos() - int i = i_adj + 1 - While(i < Positions.Length + i_adj) - If(i >= Positions.Length) - i -= Positions.Length - EndIf - If(SexLabRegistry.CanFillPosition(activeScene, i_adj, Positions[i]) && \ - SexLabRegistry.CanFillPosition(activeScene, i, actor_adj)) - Actor tmpAct = Positions[i_adj] - Positions[i_adj] = Positions[i] - Positions[i] = tmpAct - - sslActorAlias tmpAli = ActorAlias[i_adj] - ActorAlias[i_adj] = ActorAlias[i] - ActorAlias[i] = tmpAli - - SendThreadEvent("PositionChange") - ResetStage() - return - EndIf - i += 1 - EndWhile - Debug.Notification("Selected actor cannot switch positions") -EndFunction - -Function PlayHotkeyFX(int i, bool backwards) - if backwards - Config.HotkeyDown[i].Play(PlayerRef) - else - Config.HotkeyUp[i].Play(PlayerRef) - endIf + ChangeTargetPartner(backwards) EndFunction float Function GetAnimationRunTime() diff --git a/dist/Source/Scripts/sslThreadModel.psc b/dist/Source/Scripts/sslThreadModel.psc index 3cdb511f9..56e0d474c 100644 --- a/dist/Source/Scripts/sslThreadModel.psc +++ b/dist/Source/Scripts/sslThreadModel.psc @@ -57,6 +57,9 @@ EndFunction int Function GetPositionIdx(Actor akActor) return _Positions.Find(akActor) EndFunction +Actor Function GetIdxPosition(int n) + return _Positions[n] +EndFunction int Function GetActorSex(Actor akActor) return GetNthPositionSex(GetPositionIdx(akActor)) @@ -560,6 +563,22 @@ string[] Function GetHooks() return PapyrusUtil.ClearEmpty(_Hooks) EndFunction +; ------------------------------------------------------- ; +; --- VRIK Configs + Init --- ; +; ------------------------------------------------------- ; + +Function SetConfigsVRIK(bool abEnabled=true, bool abOverrideConfig=false, int aiPOVMode=-1, \ + int abLockHeight=-1, float afHeightAdjSpeed=-1.0, int abTrackHead=-1, int aiTrackHands=-1, \ + float afDistHideHead=-1.0, float afDistNearClip=-1.0, int aiLockHmdToBody=-1, \ + float afLockHmdDistance=-1.0, float afLockHmdTolerance=-1.0, float afLockHmdSpeed=-1.0) + If (abEnabled) + Config.RefreshConfigsVRIK(abOverrideConfig, aiPOVMode, abLockHeight, afHeightAdjSpeed, \ + abTrackHead, aiTrackHands, afDistHideHead, afDistNearClip, aiLockHmdToBody, \ + afLockHmdDistance, afLockHmdTolerance, afLockHmdSpeed) + EndIf + Config.ApplyConfigsVRIK(abEnabled) +EndFunction + ; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ; ; ----------------------------------------------------------------------------- ; ; ██╗███╗ ██╗████████╗███████╗██████╗ ███╗ ██╗ █████╗ ██╗ ; @@ -703,6 +722,7 @@ EndFunction int _instanceCreationWaitLock int _prepareAsyncCount +int _lockAsyncCount String[] _CustomScenes String[] _PrimaryScenes String[] _LeadInScenes @@ -717,6 +737,10 @@ State Making EndEvent Event OnUpdate() Fatal("Thread has timed out during setup. Resetting thread...") + If (_QuickResetScenes) + _QuickResetScenes = false + GoToState(STATE_END) + EndIf Initialize() EndEvent @@ -754,7 +778,7 @@ State Making EndIf i += 1 EndWhile - Log("Added " + SexLabUtil.ActorNames(ActorList) + " to thread", "AddActors()") + Log("Added " + SexLabUtil.ActorNames(ActorList) + " to thread", "AddActors()") return true EndFunction bool Function AddActorsA(Actor[] ActorList, Actor[] akVictims) @@ -765,7 +789,7 @@ State Making EndIf i += 1 EndWhile - Log("Added " + SexLabUtil.ActorNames(ActorList) + " to thread", "AddActorsA()") + Log("Added " + SexLabUtil.ActorNames(ActorList) + " to thread", "AddActorsA()") return true EndFunction @@ -775,19 +799,19 @@ State Making Function ClearScenes() _PrimaryScenes = Utility.CreateStringArray(0) EndFunction - Function SetForcedScenes(String[] asScenes) - _CustomScenes = SexLabRegistry.SceneExistA(asScenes) - EndFunction + Function SetForcedScenes(String[] asScenes) + _CustomScenes = SexLabRegistry.SceneExistA(asScenes) + EndFunction Function ClearForcedScenes() _CustomScenes = Utility.CreateStringArray(0) EndFunction - Function SetLeadInScenes(String[] asScenes) - _LeadInScenes = SexLabRegistry.SceneExistA(asScenes) - LeadIn = _LeadInScenes.Length > 0 - EndFunction + Function SetLeadInScenes(String[] asScenes) + _LeadInScenes = SexLabRegistry.SceneExistA(asScenes) + LeadIn = _LeadInScenes.Length > 0 + EndFunction Function ClearLeadInScenes() _LeadInScenes = Utility.CreateStringArray(0) - LeadIn = false + LeadIn = false EndFunction Function AddScene(String asSceneID) If (!asSceneID || !SexLabRegistry.SceneExists(asSceneID)) @@ -821,7 +845,7 @@ State Making EndIf EndFunction - sslThreadController Function StartThread() + sslThreadController Function StartThread() UnregisterForUpdate() _Positions = PapyrusUtil.RemoveActor(_Positions, none) If(_Positions.Length <= 0 || _Positions.Length > POSITION_COUNT_MAX) @@ -845,8 +869,10 @@ State Making Initialize() return none EndIf - GoToState(STATE_SETUP_M) - return self as sslThreadController + If (!_QuickResetScenes) + GoToState(STATE_SETUP_M) + EndIf + return self as sslThreadController EndFunction ; Called after CreateInstance() terminates (maybe async due to center selection) Function ContinueSetup(bool abContinue) @@ -884,29 +910,73 @@ State Making_M ; Invoked n times by Aliases and once by StartThread, then continue to next state Function PrepareDone() _prepareAsyncCount += 1 - Log("Prepare done called " + _prepareAsyncCount + "/" + (_Positions.Length + 1) + " times") + Log("PrepareDone() called " + _prepareAsyncCount + "/" + (_Positions.Length + 1) + " times") If (_prepareAsyncCount < (_Positions.Length + 1)) return EndIf + _lockAsyncCount = 0 + CenterRef.SendModEvent("SSL_LOCK_Thread" + tid) String activeScene = GetActiveScene() LeadIn = LeadIn && _LeadInScenes.Find(activeScene) > -1 Log("Thread validated, playing animation: " + activeScene + ", " + SexLabRegistry.GetSceneName(activeScene), "StartThread()") SendThreadEvent("AnimationStarting") + AliasLockDone() + EndFunction + + Function AliasLockDone() + _lockAsyncCount += 1 + Log("AliasLockDone() called " + _lockAsyncCount + "/" + (_Positions.Length + 1) + " times") + If (_lockAsyncCount < (_Positions.Length + 1)) + return + EndIf + If (Config.HideHUD) + SexLabUtil.HideElementsGameHUD(true) + EndIf + If (!UndressAndStripActors()) + EndAnimation() + return + EndIf + GoToState(STATE_PLAYING) + EndFunction + + bool Function UndressAndStripActors() + bool WaitForUndress = false + int i = 0 + While (i < _Positions.Length) + WaitForUndress= (ActorAlias[i].InitiateUndressing() || WaitForUndress) + i += 1 + EndWhile + If (WaitForUndress) + Utility.Wait(2.5) + EndIf If (HasPlayer) If (sslSystemConfig.GetSettingInt("iUseFade") > 0) Config.ApplyFade() EndIf Else If (Config.ShowInMap && PlayerRef.GetDistance(CenterRef) > 750) - SetObjectiveDisplayed(0, True) + SetObjectiveDisplayed(0, true) EndIf EndIf - GoToState(STATE_PLAYING) + string activeScene = GetActiveScene() + int[] strips_ = SexLabRegistry.GetStripDataA(activeScene, "") + int[] sex_ = SexLabRegistry.GetPositionSexA(activeScene) + int j = 0 + While (j < _Positions.Length) + If (!ActorAlias[j].ReadyActor(strips_[j], sex_[j])) + return false + EndIf + j += 1 + EndWhile + If (WaitForUndress) + Utility.Wait(1.5) + EndIf + return true EndFunction Function EndAnimation(bool Quickly = false) _prepareAsyncCount = -2147483648 - Initialize() + GoToState(STATE_END) EndFunction int Function GetStatus() @@ -963,6 +1033,10 @@ EndFunction Function ContinueSetup(bool abContinue) Log("ContinueSetup() can only be called during setup", "ContinueSetup()") EndFunction +bool Function UndressAndStripActors() + Log("Actors can be undressed only during setup", "UndressAndStripActors()") + return false +EndFunction Function CreateInstance(Actor[] akSubmissives, String[] asPrimaryScenes, String[] asLeadInScenes, String[] asCustomScenes, int aiFurnitureStatus) native String[] Function GetLeadInScenes() native @@ -980,8 +1054,10 @@ String[] Function GetCustomScenes() native float Property ANIMATING_UPDATE_INTERVAL = 0.5 AutoReadOnly int _animationSyncCount +bool _QuickResetScenes ; reinits thread without actor/center changes (e.g. to get new playing scenes) bool _ForceAdvance ; Force fully auto advance (set by timed stages) float _StageTimer ; timer for the current stage +bool _TimerPaused ; whether timer drain for current stage should be paused float _SFXTimer ; so long until new SFX effect float[] _CustomTimers ; Custom set of timers to use for this animation float[] Property Timers hidden @@ -1000,18 +1076,12 @@ EndProperty State Animating Event OnBeginState() SetFurnitureIgnored(true) - String activeScene = GetActiveScene() - int[] strips_ = SexLabRegistry.GetStripDataA(activeScene, "") - int[] sex_ = SexLabRegistry.GetPositionSexA(activeScene) - int i = 0 - While (i < _Positions.Length) - ActorAlias[i].ReadyActor(strips_[i], sex_[i]) - i += 1 - EndWhile _SFXTimer = Config.SFXDelay - _animationSyncCount = 0 - SendModEvent("SSL_READY_Thread" + tid) - AnimationStart() + If (!_QuickResetScenes) + _animationSyncCount = 0 + SendModEvent("SSL_READY_Thread" + tid) + AnimationStart() + EndIf EndEvent Function AnimationStart() _animationSyncCount += 1 @@ -1083,7 +1153,7 @@ State Animating SendThreadEvent("OrgasmStart") TriggerOrgasm() EndIf - ElseIf (ctype == Config.CLIMAXTYPE_SCENE) + ElseIf ((ctype == Config.CLIMAXTYPE_SCENE) || (!HasPlayer)) int[] cactors = SexLabRegistry.GetClimaxingActors(GetActiveScene(), asNewStage) If (cactors.Length > 0) SendThreadEvent("OrgasmStart") @@ -1162,6 +1232,10 @@ State Animating TryUpdateMenuTimer(_StageTimer) EndFunction + Function PauseTimer(bool abEnable) + _TimerPaused = abEnable + EndFunction + Function SetTimers(float[] SetTimers) If (!SetTimers.Length) Log("SetTimers() - Empty timers given.", "ERROR") @@ -1194,7 +1268,7 @@ State Animating Endfunction Event OnUpdate() - If (AutoAdvance || _ForceAdvance) + If (!_TimerPaused && (AutoAdvance || _ForceAdvance)) _StageTimer -= ANIMATING_UPDATE_INTERVAL If (_StageTimer <= 0) If !ThreadWaitsForOrgasm() @@ -1302,7 +1376,7 @@ State Animating EndFunction Function EndAnimation(bool Quickly = false) UnregisterForUpdate() - If (sslSystemConfig.GetSettingInt("iClimaxType") == Config.CLIMAXTYPE_LEGACY) + If ((sslSystemConfig.GetSettingInt("iClimaxType") == Config.CLIMAXTYPE_LEGACY) && (!_QuickResetScenes)) If (SexLabRegistry.GetNodeType(GetActiveScene(), GetActiveStage()) == 2) SendThreadEvent("OrgasmEnd") EndIf @@ -1315,13 +1389,24 @@ State Animating return ResetAnimation(akNewPositions, akSubmissives, akCenter) EndFunction + bool Function ResetAnimationQuick(String asTagString = "") + UnregisterForUpdate() + String[] validScenes = SexLabRegistry.LookupScenesA(_Positions, asTagString, GetSubmissives(), _furniStatus, CenterRef) + If ((validScenes.Length < 1) || (validScenes[0] == "")) + ReStartTimer() + return false + EndIf + _QuickResetScenes = true + EndAnimation() + return ResetAnimationQuick(asTagString) + EndFunction + int Function GetStatus() return STATUS_INSCENE EndFunction Event OnEndState() UnregisterForUpdate() - UnregisterCollision() SetFurnitureIgnored(false) EndEvent EndState @@ -1361,7 +1446,10 @@ Function ReStartTimer() Log("Cannot re/start timers outside of playing state", "ReStartTimer()") EndFunction Function UpdateTimer(float AddSeconds = 0.0) - Log("Cannot upate timers outside of playing state", "UpdateTimer()") + Log("Cannot update timers outside of playing state", "UpdateTimer()") +EndFunction +Function PauseTimer(bool abEnable) + Log("Cannot pause timers outside of playing state", "PauseTimer()") EndFunction Function SetTimers(float[] SetTimers) Log("Cannot set timers outside of playing state", "SetTimers()") @@ -1390,6 +1478,7 @@ String[] Function AdvanceScene(String[] asHistory, String asNextStageId) native int Function SelectNextStage(String[] asThreadTags) native bool Function SetActiveScene(String asScene) native bool Function ReassignCenter(ObjectReference CenterOn) native +bool Function SetNextPermutation(Actor akActor) native Function UpdatePlacement(Actor akActor) native ; Physics/SFX Related bool Function IsCollisionRegistered() native @@ -1413,11 +1502,19 @@ float Function GetActionVelocity(Actor akPosition, Actor akPartner, int aiType) State Ending Event OnBeginState() + If (_QuickResetScenes) + return + EndIf Config.DisableThreadControl(self as sslThreadController) SendModEvent("SSL_CLEAR_Thread" + tid, "", 1.0) + MoveActorsAwayFromPlayer() + UnregisterCollision() If(IsObjectiveDisplayed(0)) SetObjectiveDisplayed(0, False) EndIf + If (Config.HideHUD) + SexLabUtil.HideElementsGameHUD(false) + EndIf UpdateAllEncounters() int i = 0 While (i < ActorAlias.Length) @@ -1460,11 +1557,33 @@ State Ending i += 1 EndWhile _Positions = PapyrusUtil.ActorArray(0) + DestroyInstance() GoToState(STATE_SETUP) SetScenes(validScenes) return AddActorsA(akNewPositions, akSubmissives) && StartThread() EndFunction + bool Function ResetAnimationQuick(String asTagString = "") + UnregisterForUpdateGameTime() + String[] validScenes = SexLabRegistry.LookupScenesA(_Positions, asTagString, GetSubmissives(), _furniStatus, CenterRef) + DestroyInstance() + GoToState(STATE_SETUP) + SetScenes(validScenes) + If (!StartThread()) + _QuickResetScenes = false + GoToState(STATE_END) + return false + EndIf + GoToState(STATE_PLAYING) + _PrimaryScenes = GetPrimaryScenes() + _ThreadTags = SexLabRegistry.GetCommonTags(_PrimaryScenes) + string activeScene = GetActiveScene() + Log("Thread validated, playing animation: " + activeScene + ", " + SexLabRegistry.GetSceneName(activeScene), "StartThread()") + StartStage(Utility.CreateStringArray(0), "") + _QuickResetScenes = false + return true + EndFunction + Event OnUpdateGameTime() Initialize() EndEvent @@ -1505,6 +1624,63 @@ Function SetFurnitureIgnored(bool disabling = true) CenterRef.SetNoFavorAllowed(disabling) EndFunction +int Function IndexTravelComplex(int curIdx, bool abReverse = false, Actor akSkip = None) + int posLen = _Positions.Length + If (posLen > 1) + int step = 1 + If (abReverse) + step = -1 + EndIf + int newIdx = (curIdx + step) + int i = 0 + While (i < posLen) + If (newIdx >= posLen) + newIdx = 0 + ElseIf (newIdx < 0) + newIdx = (posLen - 1) + EndIf + If (newIdx != curIdx) && (akSkip == None || _Positions[newIdx] != akSkip) + return newIdx + EndIf + newIdx += step + i += 1 + EndWhile + EndIf + return curIdx +EndFunction + +Function MoveActorsAwayFromPlayer(bool MovePlayer = false) + float adjOffset = 35.0 + int moveDir = -1 + int i = 0 + while (i < _Positions.Length) + Actor curActor = _Positions[i] + If (curActor != PlayerRef) + If (curActor.GetDistance(PlayerRef) < 50.0) + If (MovePlayer) + PlayerRef.SetPosition(PlayerRef.X + 70, PlayerRef.Y, PlayerRef.Z) + return + Else + moveDir += 1 + EndIf + float newX = curActor.X + float newY = curActor.Y + If (moveDir == 0) + newY += adjOffset + ElseIf (moveDir == 1) + newX += adjOffset + ElseIf (moveDir == 2) + newY -= adjOffset + ElseIf (moveDir == 3) + newX -= adjOffset + EndIf + curActor.SetPosition(newX, newY, curActor.Z) + EndIf + EndIf + i += 1 + EndWhile +EndFunction + ; ------------------------------------------------------- ; ; --- Function Declarations --- ; ; ------------------------------------------------------- ; @@ -1515,20 +1691,27 @@ EndFunction /; Function CenterOnObject(ObjectReference CenterOn, bool resync = true) - Log("Invalid State", "CenterOnObject()") + Log("CenterOnObject(), Function called from invalid state: " + GetState()) EndFunction Function EndAnimation(bool Quickly = false) - Log("Invalid state", "EndAnimation()") + Log("EndAnimation(), Function called from invalid state: " + GetState()) EndFunction bool Function ResetAnimation(Actor[] akNewPositions, Actor[] akSubmissives, ObjectReference akCenter) - Log("Invalid state", "ResetAnimation()") + Log("ResetAnimation(), Function called from invalid state: " + GetState()) + return false +EndFunction +bool Function ResetAnimationQuick(String asTagString = "") + Log("ResetAnimationQuick(), Function called from invalid state: " + GetState()) return false EndFunction Function PrepareDone() - Log("Invalid state", "PrepareDone()") + Log("PrepareDone(), Function called from invalid state: " + GetState()) +EndFunction +Function AliasLockDone() + Log("AliasLockDone(), Function called from invalid state: " + GetState()) EndFunction Function AnimationStart() - Log("Invalid state", "AnimationStart()") + Log("AnimationStart(), Function called from invalid state: " + GetState()) EndFunction ; ------------------------------------------------------- ; @@ -1633,7 +1816,7 @@ bool[] Function ListDetectedInteractionsInternal(Actor akPosition, Actor akPartn return ListDetectedPhysicsInteractionsInternal(akPosition, akPartner) EndIf ;COMEBACK: Re-assess the need for the fallback with new typing update - If (Config.FallbackToTagsForDetection && HasSceneTag("RimTagged")) + If (Config.FallbackToTagsForDetection && HasSceneTag("PosTagged")) return ListDetectedPosTagsInteractionsInternal(akPosition) EndIf ;If all else fails, returns pAnal, which has the highest enj factor @@ -1722,6 +1905,12 @@ Function ApplyCumFX(Actor SourceRef) bool aGrinding_ = interFlags[aGrinding] bool aAnal_ = interFlags[aAnal] bool any_oral = pOral_ || pDeepthroat_ || pLickingShaft_ + ; Comeback: reasses need for fallback + If (!any_oral && !aVaginal_ && !aGrinding_ && !aAnal_) + any_oral = IsOral() + aVaginal_ = IsVaginal() + aAnal_ = IsAnal() + EndIf Log("ApplyCumFX(): Source [" + SexLabUtil.ActorName(SourceRef) + "] Target [" + SexLabUtil.ActorName(TargetRef) + "] CumFX_Types [O: " + any_oral + ", V: " + (aVaginal_ || aGrinding_) + ", A: " + aAnal_ + "]") int aiType = -2 If (aVaginal_ || aGrinding_) @@ -1811,6 +2000,8 @@ Function Initialize() _ContextTags = Utility.CreateStringArray(0) _Hooks = Utility.CreateStringArray(0) _AnimationSpeedBase = 1.0 + _TimerPaused = false + _QuickResetScenes = false ; Enter thread selection pool DestroyInstance() GoToState(STATE_IDLE) @@ -1866,17 +2057,17 @@ Faction Property PlayerMarriedFaction Auto ; -------------------------------------------------- ; float Function CalculateInteractionFactor(Actor akPosition, bool[] interActive) - float factorTotal = 0.5 + float factorTotal = 0.25 float[] factorValues = sslSystemConfig.GetEnjoymentFactors() int len = interActive.Length int i = 0 While (i < len) If (interActive[i]) ; velFactor: [Range: 1.0 to 2.0] - ; factorValue: [Default: 1 to 12] [Adjusted: 0.583 to 4.25] - ; factorType: [Result: 0.583 to 8.5] + ; factorValue: [Default: 1 to 12] [Adjusted: 0.2 to 2.4] + ; factorType: [Result: 0.2 to 4.8] float velFactor = CalcInterVelocityFactor(akPosition, i) - float adjustedFactor = 0.25 + (factorValues[i] / 3.0) + float adjustedFactor = 0.25 + (factorValues[i] / 5.0) factorTotal += (adjustedFactor * velFactor) ;Log("InterFactor: TYPE: " + i + ", Value: " + factorValues[i] + ", Adjusted: " + adjustedFactor) EndIf @@ -1943,17 +2134,18 @@ int Function IdentifyConsentSubStatus() return ConSubStatus EndFunction -bool Function SameSexThread() - bool SameSexThread = False - int MaleCount = sslActorLibrary.CountMale(_Positions) - int FemCount = sslActorLibrary.CountFemale(_Positions) - int FutaCount = sslActorLibrary.CountFuta(_Positions) - int CrtMaleCount = sslActorLibrary.CountCrtMale(_Positions) - int CrtFemaleCount = sslActorLibrary.CountCrtFemale(_Positions) - If (_Positions.Length != 1 && ((MaleCount + CrtMaleCount == _Positions.Length) || (FemCount + CrtFemaleCount == _Positions.Length) || (FutaCount == _Positions.Length))) - SameSexThread = true ; returns False for solo scenes +bool[] Function CheckActiveHomoTypes() + int PosCount = _Positions.Length + int[] SexCount = sslActorLibrary.CountSexAll(_Positions) + bool[] HomoTypes = Utility.CreateBoolArray(5, False) + HomoTypes[0] = (PosCount == 1) ;solo + If (PosCount > 1) + HomoTypes[1] = (SexCount[0] + SexCount[3] == PosCount) ;males + HomoTypes[2] = (SexCount[1] + SexCount[4] == PosCount) ;females + HomoTypes[3] = (SexCount[2] == PosCount) ;futa + HomoTypes[4] = (SexCount[0] + SexCount[2] + SexCount[3] == PosCount) ;futa with males EndIf - return SameSexThread + return HomoTypes EndFunction bool Function CrtMaleHugePP() @@ -1983,7 +2175,7 @@ EndFunction bool Function ThreadWaitsForOrgasm() If Config.InternalEnjoymentEnabled && (GetLegacyStagesCount() - GetLegacyStageNum() == 1) int i = 0 - While i < Positions.Length + While i < _Positions.Length If ActorAlias[i].WaitForOrgasm() return true EndIf @@ -2035,9 +2227,9 @@ bool[] Function CheckSpecificStageTags(string asScene, string asStage) ret[7] = SexLabRegistry.IsStageTag(asScene, asStage, "Standing") ret[8] = SexLabRegistry.IsStageTag(asScene, asStage, "Forced") ret[9] = SexLabRegistry.IsStageTag(asScene, asStage, "Unconscious") - ret[10] = SexLabRegistry.IsStageTag(asScene, asStage, "RimTagged") - ret[11] = SexLabRegistry.IsStageTag(asScene, asStage, "RimFast") - ret[12] = SexLabRegistry.IsStageTag(asScene, asStage, "RimSlow") + ret[10] = SexLabRegistry.IsStageTag(asScene, asStage, "PosTagged") + ret[11] = SexLabRegistry.IsStageTag(asScene, asStage, "PosFast") + ret[12] = SexLabRegistry.IsStageTag(asScene, asStage, "PosSlow") return ret EndFunction @@ -2071,106 +2263,42 @@ EndFunction ; --- Enjoyment Game --- ; ; ---------------------------------------------- ; -Function GameAdjustEnj(Actor akActor, Actor akPartner, int AdjustBy = 0) - If (AdjustBy != 0) - AdjustEnjoyment(akPartner, AdjustBy) +Function GameRaiseEnjoyment(Actor akTarget) + If (SexLabUtil.IsGodModeEnabled()) + AdjustEnjoyment(akTarget, Config.GameEnjAdjAmount) return - Else - float arousalstat = PapyrusUtil.ClampFloat(SexlabStatistics.GetStatistic(akPartner, 17), 0.0, 100.0) - AdjustBy = PapyrusUtil.ClampInt((arousalstat as int / 50), 1, 2) - int basesex = GetActorSex(akPartner) - If (basesex != 0 || basesex != 3) - AdjustBy += GetOrgasmCount(akPartner) - EndIf - AdjustEnjoyment(akPartner, AdjustBy) - EndIf -EndFunction - -Function GameRaiseEnjoyment(Actor akActor, Actor akPartner) - If (akActor.GetActorValuePercentage("Stamina") > 0.10) - akActor.DamageActorValue("Stamina", Config.GameStaminaCost) - GameAdjustEnj(akActor, akPartner) + ElseIf (PlayerRef.GetActorValue("Stamina") > Config.GameStaminaCost) + PlayerRef.DamageActorValue("Stamina", Config.GameStaminaCost) + AdjustEnjoyment(akTarget, Config.GameEnjAdjAmount) EndIf EndFunction -Function GameHoldback(Actor akActor, Actor akPartner) - If (akActor.GetActorValuePercentage("Magicka") > 0.10) - akActor.DamageActorValue("Magicka", Config.GameMagickaCost) - GameAdjustEnj(akActor, akPartner, -1) +Function GameHoldback(Actor akTarget) + If (SexLabUtil.IsGodModeEnabled()) + AdjustEnjoyment(akTarget, -Config.GameEnjAdjAmount) + return + ElseIf (PlayerRef.GetActorValue("Magicka") > Config.GameMagickaCost) + PlayerRef.DamageActorValue("Magicka", Config.GameMagickaCost) + AdjustEnjoyment(akTarget, -Config.GameEnjAdjAmount) EndIf EndFunction -Function ProcessEnjGameArg(String arg, Actor akPlayer, Actor akPartner) - Actor targetActor = None - If (_Positions.Length == 1 || Input.IsKeyPressed(Config.GameUtilityKey)) - targetActor = akPlayer ;change self/player enj - ElseIf (_Positions.Length > 1) - targetActor = akPartner ;change partner enj +Function ProcessEnjGameArg(String arg, Actor akPartner, bool abAdjustTarget) + Actor akTarget = PlayerRef ;change self/player enj + If (abAdjustTarget) + akTarget = akPartner ;change partner enj EndIf - If (arg == "Magicka") ;HoldbackKey - GameHoldback(akPlayer, targetActor) - ElseIf (arg == "Stamina") ;RaiseEnjKey - If ((Config.GameRequiredOnHighEnj) && (GetEnjoyment(targetActor) > 80) && (targetActor == akPlayer)) - ActorAlias[GetPositionIdx(targetActor)].RegisterRaiseEnjAttempt() + If (arg == "Magicka") + GameHoldback(akTarget) + ElseIf (arg == "Stamina") + If ((Config.GameRequiredOnHighEnj) && (GetEnjoyment(PlayerRef) > 80)) + ActorAlias[GetPositionIdx(PlayerRef)].RegisterRaiseEnjAttempt() Else - GameRaiseEnjoyment(akPlayer, targetActor) + GameRaiseEnjoyment(akTarget) EndIf EndIf EndFunction -Actor Function GameChangePartner(Actor akActor, int idx = -1) - Actor akPartner = None - Actor tempRef = None - If (_Positions.Length > 1) - If (idx < 0) - int idxPartner = sslUtility.IndexTravel(GetPositionIdx(akActor), _Positions.Length) - akPartner = ActorAlias[idxPartner].GetActorRef() - If (akActor == PlayerRef) - Log("[EnjGame] " + akActor.GetDisplayName() + "'s current partner is " + akPartner.GetDisplayName()) - EndIf - Else - tempRef = ActorAlias[idx].GetActorRef() - If (tempRef == None || tempRef == akPartner || tempRef == akActor || tempRef == PlayerRef) - return akPartner - EndIf - akPartner = tempRef - If (akActor == PlayerRef) - Log("[EnjGame] " + akActor.GetDisplayName() + " changed focus to " + akPartner.GetDisplayName()) - EndIf - Config.SelectedSpell.Cast(akPartner, akPartner) - EndIf - EndIf - return akPartner -EndFunction - -int Function GameNextPartnerIdx(Actor akActor, Actor akPartner, bool abReverse) - int PartnerIdx = GetPositionIdx(akPartner) - If (Positions.Length <= 2) - return PartnerIdx - EndIf - int ActorIdx = GetPositionIdx(akActor) - int step = 1 - If (abReverse) - step = -1 - EndIf - int NewIdx = (PartnerIdx + step) - int PosLen = Positions.Length - int i = 0 - While (i < PosLen) - If (NewIdx >= PosLen) - NewIdx = 0 - ElseIf (NewIdx < 0) - NewIdx = PosLen - 1 - EndIf - If (NewIdx != ActorIdx) && (NewIdx != PartnerIdx) - return NewIdx - EndIf - NewIdx += step - i += 1 - EndWhile - return PartnerIdx -EndFunction - Function EnjBasedSkipToLastStage(bool abSkip) if !abSkip return @@ -3012,6 +3140,14 @@ Function SetBedding(int flag = 0) SetBedFlag(flag) EndFunction +int Function GetPain(Actor ActorRef) + sslActorAlias ref = ActorAlias(ActorRef) + If (!ref) + return 0 + EndIf + return ref.GetPain() +EndFunction + bool property DisableOrgasms hidden bool Function Get() bool ret = false diff --git a/dist/Source/Scripts/sslThreadSlots.psc b/dist/Source/Scripts/sslThreadSlots.psc index 46fe39151..c0079b2d9 100644 --- a/dist/Source/Scripts/sslThreadSlots.psc +++ b/dist/Source/Scripts/sslThreadSlots.psc @@ -98,6 +98,7 @@ EndFunction Function StopThread(sslThreadController Slot) If (Slot.GetStatus() != Slot.STATUS_IDLE) sslLog.Log("Stopping thread " + Slot + " in state " + Slot.GetState()) + Slot.EndAnimation() EndIf Slot.Initialize() EndFunction diff --git a/dist/Source/Scripts/sslTroubleshoot.psc b/dist/Source/Scripts/sslTroubleshoot.psc index 29e82dc95..477240233 100644 --- a/dist/Source/Scripts/sslTroubleshoot.psc +++ b/dist/Source/Scripts/sslTroubleshoot.psc @@ -212,7 +212,7 @@ state FNIS Tell("Attempting to play test animation on player, pay attention to your characters animation...") Debug.SendAnimationEvent(PlayerRef, "IdleForceDefaultState") Utility.Wait(0.5) - Game.ForceThirdPerson() + SexLabUtil.ForceThirdPerson() Debug.SendAnimationEvent(PlayerRef, "SexLab_Test_"+SexLabUtil.GetVersion()) Utility.Wait(8.0) if !Ask("Did the animation play on your character?") @@ -329,20 +329,15 @@ bool function Ask(string msg) endFunction function LockPlayer() - Game.SetPlayerAIDriven() - Game.ForceThirdPerson() - Game.DisablePlayerControls(true, true, true, false, true, true, true, true) - Game.ForceThirdPerson() + SexLabUtil.SetActorMovement(PlayerRef, 2) ;MOVEMENT_LOCK Debug.SendAnimationEvent(PlayerRef, "IdleForceDefaultState") PlayerRef.StopCombat() PlayerRef.SheatheWeapon() Utility.Wait(1.0) - Game.ForceThirdPerson() endFunction function UnlockPlayer() - Game.EnablePlayerControls() - Game.SetPlayerAIDriven(false) + SexLabUtil.SetActorMovement(PlayerRef, 0) ;MOVEMENT_RELEASE Debug.SendAnimationEvent(PlayerRef, "IdleForceDefaultState") Utility.Wait(1.0) endFunction diff --git a/dist/meshes/actors/character/animations/SexLab/FNIS_SexLab_List.txt b/dist/meshes/actors/character/animations/SexLab/FNIS_SexLab_List.txt new file mode 100644 index 000000000..a1aff981a --- /dev/null +++ b/dist/meshes/actors/character/animations/SexLab/FNIS_SexLab_List.txt @@ -0,0 +1,2 @@ +b SexLab_FemaleUndress SexLab_FemaleUndress.hkx +b SexLab_MaleUndress SexLab_MaleUndress.hkx diff --git a/dist/meshes/actors/character/animations/SexLab/Arrok_FemaleUndress.hkx b/dist/meshes/actors/character/animations/SexLab/SexLab_FemaleUndress.hkx similarity index 100% rename from dist/meshes/actors/character/animations/SexLab/Arrok_FemaleUndress.hkx rename to dist/meshes/actors/character/animations/SexLab/SexLab_FemaleUndress.hkx diff --git a/dist/meshes/actors/character/animations/SexLab/Arrok_MaleUndress.hkx b/dist/meshes/actors/character/animations/SexLab/SexLab_MaleUndress.hkx similarity index 100% rename from dist/meshes/actors/character/animations/SexLab/Arrok_MaleUndress.hkx rename to dist/meshes/actors/character/animations/SexLab/SexLab_MaleUndress.hkx diff --git a/dist/meshes/actors/character/behaviors/FNIS_SexLab_Behavior.hkx b/dist/meshes/actors/character/behaviors/FNIS_SexLab_Behavior.hkx new file mode 100644 index 000000000..d439ac2b0 Binary files /dev/null and b/dist/meshes/actors/character/behaviors/FNIS_SexLab_Behavior.hkx differ diff --git a/lib/CommonLibSSE-NG b/lib/CommonLibSSE-NG index da5dd61f1..293e038a1 160000 --- a/lib/CommonLibSSE-NG +++ b/lib/CommonLibSSE-NG @@ -1 +1 @@ -Subproject commit da5dd61f11d175cf351bfa7c54548ae1abdc6625 +Subproject commit 293e038a16f4635e335914ceeb6274dcc90ddad5 diff --git a/scripts/ML/main.py b/scripts/ML/main.py index c7c716255..a286f8573 100644 --- a/scripts/ML/main.py +++ b/scripts/ML/main.py @@ -187,5 +187,10 @@ def _build_arg_parser() -> argparse.ArgumentParser: out_dir = Path(args.out_dir) if args.out_dir else None model_path = _run_training(mods_path=args.mods_path, out_dir=out_dir) - ini_path = Path(args.ini_path) if args.ini_path else Path("dist/SKSE/SexLab/LinearModel.ini") + if args.ini_path: + ini_path = Path(args.ini_path) + else: + repo_root = Path(__file__).resolve().parents[2] + ini_path = repo_root / "dist" / "SKSE" / "SexLab" / "LinearModel.ini" + unify_ini_files(model_path, ini_path) diff --git a/src/Papyrus/SexLabUtil.h b/src/Papyrus/SexLabUtil.h index f84336304..5854d44aa 100644 --- a/src/Papyrus/SexLabUtil.h +++ b/src/Papyrus/SexLabUtil.h @@ -110,6 +110,53 @@ namespace Papyrus::SexLabUtil const auto player = RE::PlayerCharacter::GetSingleton(); return player->IsGodMode(); } + + std::vector ShuffleStringArray(RE::StaticFunctionTag*, std::vector arr, RE::BSFixedString asFirst, int aiMaxLen) + { + if (arr.empty()) return arr; + bool bFirstSet = false; + if (!asFirst.empty()) { + for (int i = 0; i < static_cast(arr.size()); i++) { + if (arr[i] == asFirst) { + std::swap(arr[0], arr[i]); + bFirstSet = true; + break; + } + } + } + const int total = static_cast(arr.size()); + int pickLen = aiMaxLen; + if (pickLen < 1) pickLen = 1; + if (pickLen > total) pickLen = total; + thread_local std::mt19937 rng{ std::random_device{}() }; + const int shuffleStart = bFirstSet ? 1 : 0; + for (int j = shuffleStart; j < pickLen; j++) { + std::uniform_int_distribution dist(j, total - 1); + int k = dist(rng); + std::swap(arr[j], arr[k]); + } + arr.resize(pickLen); + return arr; + } + + static constexpr std::array HUD_ELEMENTS = { + "HUD Menu", "LootMenu", "TrueHUD", "BTPS Menu", "BTPS Ovelay Menu", "oxygenMeter2", "CastingBar", "MiniMapMenu", + "Floating Damage V2", "Durability Menu", "KNNWidgetMeter", "KNNWidgetMeterOp", "lvlWidget", "goldWidget", + "gametimeWidget", "shoutWidget", "resistWidget", "playtimeWidget", "weightWidget", "equipWidget_STB", "STBActiveEffects" + }; + + void HideElementsGameHUD(RE::StaticFunctionTag*, bool a_hide) + { + SKSE::GetTaskInterface()->AddUITask([a_hide]() { + RE::GFxValue alphaValue{ a_hide ? 0.0 : 100.0 }; + auto ui = RE::UI::GetSingleton(); + for (const auto& name : HUD_ELEMENTS) { + if (auto uiMovie = ui->GetMovieView(name)) { + uiMovie->SetVariable("_root._alpha", alphaValue); + } + } + }); + } inline bool Register(VM* a_vm) { @@ -124,6 +171,8 @@ namespace Papyrus::SexLabUtil REGISTERFUNC(GetCurrentGameRealTime, "SexLabUtil", true); REGISTERFUNC(GetTranslation, "SexLabUtil", true); REGISTERFUNC(IsGodModeEnabled, "SexLabUtil", true); + REGISTERFUNC(ShuffleStringArray, "SexLabUtil", true); + REGISTERFUNC(HideElementsGameHUD, "SexLabUtil", true); return true; } diff --git a/src/Papyrus/sslLibrary/sslActorLibrary.cpp b/src/Papyrus/sslLibrary/sslActorLibrary.cpp index ecc6500da..2b055345a 100644 --- a/src/Papyrus/sslLibrary/sslActorLibrary.cpp +++ b/src/Papyrus/sslLibrary/sslActorLibrary.cpp @@ -84,7 +84,7 @@ namespace Papyrus::ActorLibrary } const auto& biped = form->As(); if (biped) { - const auto& slots = static_cast(biped->GetSlotMask()); + const auto& slots = static_cast(biped->GetSlotMask().underlying()); if (slots & a_slotmask) { strip(); continue; diff --git a/src/Papyrus/sslThreadModel.cpp b/src/Papyrus/sslThreadModel.cpp index 602eea057..db268ddfd 100644 --- a/src/Papyrus/sslThreadModel.cpp +++ b/src/Papyrus/sslThreadModel.cpp @@ -65,7 +65,7 @@ namespace Papyrus::ThreadModel position->expression = Registry::Library::GetSingleton()->GetExpressionById(a_expression); } - void LockActorImpl(ALIASARGS) + void StartSetActorInterrupts(ALIASARGS) { const auto actor = a_alias->GetActorReference(); if (!actor) { @@ -73,7 +73,6 @@ namespace Papyrus::ThreadModel return; } if (actor->IsPlayerRef()) { - RE::PlayerCharacter::GetSingleton()->SetAIDriven(true); const auto ui = RE::UI::GetSingleton(); const auto interfacestr = RE::InterfaceStrings::GetSingleton(); if (ui->IsMenuOpen(interfacestr->dialogueMenu)) { @@ -110,21 +109,17 @@ namespace Papyrus::ThreadModel } } - Thread::Collision::CollisionHandler::GetSingleton()->AddActor(actor->GetFormID()); - actor->StopCombat(); actor->EndDialogue(); actor->InterruptCast(false); actor->StopInteractingQuick(true); - // actor->SetCollision(false); if (const auto process = actor->GetActorRuntimeData().currentProcess) { process->ClearMuzzleFlashes(); } - actor->StopMoving(1.0f); } - void UnlockActorImpl(ALIASARGS) + void EndSetActorInterrupts(ALIASARGS) { const auto actor = a_alias->GetActorReference(); if (!actor) { @@ -140,13 +135,31 @@ namespace Papyrus::ThreadModel actor->AsActorState()->actorState1.lifeState = RE::ACTOR_LIFE_STATE::kAlive; break; } - if (actor->IsPlayerRef()) { - RE::PlayerCharacter::GetSingleton()->SetAIDriven(false); - } else { + if (!actor->IsPlayerRef()) { actor->AsActorValueOwner()->SetActorValue(RE::ActorValue::kVariable05, 0.0f); + } + } + + void SetActorCollisions(ALIASARGS, bool a_enable) + { + const auto actor = a_alias->GetActorReference(); + if (!actor) { + a_vm->TraceStack("Reference is empty or not an actor", a_stackID); + return; + } + const auto handler = Thread::Collision::CollisionHandler::GetSingleton(); + const auto formID = actor->GetFormID(); + if (!a_enable) { + if (!handler->HasActor(formID)) { + handler->AddActor(formID); + } + // actor->SetCollision(false); + } else { + if (handler->HasActor(formID)) { + handler->RemoveActor(formID); + } + // actor->SetCollision(true); } - Thread::Collision::CollisionHandler::GetSingleton()->RemoveActor(actor->GetFormID()); - // actor->SetCollision(true); } std::vector StripByData(ALIASARGS, int32_t a_stripdata, std::vector a_defaults, std::vector a_overwrite) @@ -231,7 +244,7 @@ namespace Papyrus::ThreadModel if (form->IsWeapon() && !weapon) { continue; } else if (const auto biped = form->As()) { - const auto biped_slots = static_cast(biped->GetSlotMask()); + const auto biped_slots = static_cast(biped->GetSlotMask().underlying()); if ((biped_slots & slots) == 0) { continue; } @@ -442,6 +455,12 @@ namespace Papyrus::ThreadModel return instance->ReplaceCenterRef(a_centeron); } + bool SetNextPermutation(QUESTARGS, RE::Actor* a_position) + { + GET_INSTANCE(false); + return instance->SetNextPermutation(a_position); + } + void UpdatePlacement(QUESTARGS, RE::Actor* a_position) { GET_INSTANCE(); diff --git a/src/Papyrus/sslThreadModel.h b/src/Papyrus/sslThreadModel.h index 888269c10..3509f0e37 100644 --- a/src/Papyrus/sslThreadModel.h +++ b/src/Papyrus/sslThreadModel.h @@ -24,8 +24,9 @@ namespace Papyrus::ThreadModel void SetActorVoiceImpl(ALIASARGS, RE::BSFixedString a_voice); void SetActorExpressionImpl(ALIASARGS, RE::BSFixedString a_expression); - void LockActorImpl(ALIASARGS); - void UnlockActorImpl(ALIASARGS); + void StartSetActorInterrupts(ALIASARGS); + void EndSetActorInterrupts(ALIASARGS); + void SetActorCollisions(ALIASARGS, bool a_enable); std::vector StripByData(ALIASARGS, int32_t a_stripdata, std::vector a_defaults, std::vector a_overwrite); std::vector StripByDataEx(ALIASARGS, int32_t a_stripdata, std::vector a_defaults, std::vector a_overwrite, std::vector a_mergewith); @@ -39,8 +40,9 @@ namespace Papyrus::ThreadModel REGISTERFUNC(SetActorVoiceImpl, "sslActorAlias", false); REGISTERFUNC(SetActorExpressionImpl, "sslActorAlias", false); - REGISTERFUNC(LockActorImpl, "sslActorAlias", false); - REGISTERFUNC(UnlockActorImpl, "sslActorAlias", false); + REGISTERFUNC(StartSetActorInterrupts, "sslActorAlias", false); + REGISTERFUNC(EndSetActorInterrupts, "sslActorAlias", false); + REGISTERFUNC(SetActorCollisions, "sslActorAlias", false); REGISTERFUNC(StripByData, "sslActorAlias", false); REGISTERFUNC(StripByDataEx, "sslActorAlias", false); @@ -66,6 +68,7 @@ namespace Papyrus::ThreadModel int SelectNextStage(QUESTARGS, std::vector a_tags); bool SetActiveScene(QUESTARGS, RE::BSFixedString a_sceneid); bool ReassignCenter(QUESTARGS, RE::TESObjectREFR* a_centeron); + bool SetNextPermutation(QUESTARGS, RE::Actor* a_position); void UpdatePlacement(QUESTARGS, RE::Actor* a_position); bool IsCollisionRegistered(QUESTARGS); @@ -106,6 +109,7 @@ namespace Papyrus::ThreadModel REGISTERFUNC(SetActiveScene, "sslThreadModel", false); REGISTERFUNC(ReassignCenter, "sslThreadModel", false); REGISTERFUNC(UpdatePlacement, "sslThreadModel", false); + REGISTERFUNC(SetNextPermutation, "sslThreadModel", false); REGISTERFUNC(IsCollisionRegistered, "sslThreadModel", true); REGISTERFUNC(UnregisterCollision, "sslThreadModel", true); diff --git a/src/Registry/Util/RayCast/Offsets.h b/src/Registry/Util/RayCast/Offsets.h index 728a4b10d..a64bf19f3 100644 --- a/src/Registry/Util/RayCast/Offsets.h +++ b/src/Registry/Util/RayCast/Offsets.h @@ -2,6 +2,8 @@ namespace Offsets { + static constexpr auto NotOnGameThread=REL::VariantID(38079, 39033, 0x6488a0); + // SE: 2F4C910 // AE: ??? static constexpr auto WorldToCamMatrix = RELOCATION_ID(519579, 406126); diff --git a/src/Registry/Util/RayCast/RayCast.cpp b/src/Registry/Util/RayCast/RayCast.cpp index d599afe79..ed98b97ea 100644 --- a/src/Registry/Util/RayCast/RayCast.cpp +++ b/src/Registry/Util/RayCast/RayCast.cpp @@ -18,6 +18,9 @@ Raycast::RayResult Raycast::CastRay(glm::vec4, glm::vec4, float) noexcept #else Raycast::RayResult Raycast::CastRay(glm::vec4 start, glm::vec4 end, float traceHullSize) noexcept { + if (((bool (*)(void))Offsets::NotOnGameThread.address())()) { + logger::error("CastRay was called on wrong thread, this should never happen and can cause random CTD/freezes"); + } RayResult res; const auto ply = RE::PlayerCharacter::GetSingleton(); @@ -67,6 +70,9 @@ Raycast::RayResult Raycast::hkpCastRay(const glm::vec4& start, const glm::vec4& Raycast::RayResult Raycast::hkpCastRay(const glm::vec4& start, const glm::vec4& end, const std::vector& a_filter) noexcept { + if (((bool (*)(void))Offsets::NotOnGameThread.address())()) { + logger::error("hkpCastRay was called on wrong thread, this should never happen and can cause random CTD/freezes"); + } const auto hkpScale = RE::bhkWorld::GetWorldScale(); const auto dif = end - start; diff --git a/src/Thread/Interface/SceneMenu.cpp b/src/Thread/Interface/SceneMenu.cpp index ef4a2088b..cb5af0bc4 100644 --- a/src/Thread/Interface/SceneMenu.cpp +++ b/src/Thread/Interface/SceneMenu.cpp @@ -54,8 +54,8 @@ namespace Thread::Interface UpdatePositions(); UpdateActiveScene(); input->AddEventSink(this); + // controls->ToggleControls(RE::ControlMap::UEFlag::kMovement, false, false); controls->ToggleControls(RE::ControlMap::UEFlag::kActivate, false, false); - controls->ToggleControls(RE::ControlMap::UEFlag::kMovement, false, false); if (Settings::bHideHUD) { RE::UIMessageQueue::GetSingleton()->AddMessage(RE::HUDMenu::MENU_NAME, RE::UI_MESSAGE_TYPE::kHide, nullptr); } @@ -64,8 +64,8 @@ namespace Thread::Interface case Type::kHide: logger::info("SceneMenu closed."); RE::UIMessageQueue::GetSingleton()->AddMessage(RE::HUDMenu::MENU_NAME, RE::UI_MESSAGE_TYPE::kShow, nullptr); + // controls->ToggleControls(RE::ControlMap::UEFlag::kMovement, true, false); controls->ToggleControls(RE::ControlMap::UEFlag::kActivate, true, false); - controls->ToggleControls(RE::ControlMap::UEFlag::kMovement, true, false); controls->AllowTextInput(false); input->RemoveEventSink(this); threadInstance = nullptr; diff --git a/src/Thread/Thread.cpp b/src/Thread/Thread.cpp index 0dcabc5a6..4b32c2198 100644 --- a/src/Thread/Thread.cpp +++ b/src/Thread/Thread.cpp @@ -3,6 +3,7 @@ #include "Registry/Library.h" #include "Registry/Util/Scale.h" #include "Thread/Interface/SceneMenu.h" +#include "Registry/Util/RayCast/Offsets.h" #include "Util/Script.h" namespace Thread @@ -198,6 +199,9 @@ namespace Thread bool Instance::ReplaceCenterRef(RE::TESObjectREFR* a_ref) { + if (((bool (*)(void))Offsets::NotOnGameThread.address())()) { + logger::error("ReplaceCenterRef is not on valid thread, this should never happen and can cause random CTD/freezes"); + } assert(a_ref); if (a_ref == center.GetRef() && !a_ref->IsPlayerRef()) { return false; @@ -395,16 +399,16 @@ namespace Thread throw std::runtime_error("Failed to find current permutation for actor."); } - void Instance::SetNextPermutation(RE::Actor* a_actor) + bool Instance::SetNextPermutation(RE::Actor* a_actor) { const auto position = GetPosition(a_actor); if (!position) { logger::error("Actor {} is not part of the current scene.", a_actor->GetFormID()); - return; + return false; } if (position->uniquePermutations < 2) { logger::info("Actor {} has no alternative permutations.", a_actor->GetFormID()); - return; + return false; } auto targetPermutation = GetCurrentPermutation(a_actor) + 1; if (targetPermutation > position->uniquePermutations) { @@ -415,18 +419,19 @@ namespace Thread const auto idx = std::distance(it->begin(), std::find(it->begin(), it->end(), a_actor)); if (idx < 0 || static_cast(idx) == it->size()) { logger::warn("Actor {} is not part of the current assignment.", a_actor->GetFormID()); - return; + return false; } else if (!seenPermutations.contains(idx)) { seenPermutations.insert(idx); if (seenPermutations.size() == targetPermutation) { activeAssignment = it; AdvanceScene(activeStage); logger::info("Actor {} changed to permutation {}.", a_actor->GetFormID(), targetPermutation); - return; + return true; } } } logger::warn("Actor {} has no alternative permutations.", a_actor->GetFormID()); + return false; } } // namespace Thread diff --git a/src/Thread/Thread.h b/src/Thread/Thread.h index e02988388..ceba7c228 100644 --- a/src/Thread/Thread.h +++ b/src/Thread/Thread.h @@ -103,7 +103,7 @@ namespace Thread void SetGhostMode(RE::Actor* a_position, bool a_ghostMode); int32_t GetUniquePermutations(RE::Actor* a_position); int32_t GetCurrentPermutation(RE::Actor* a_position); - void SetNextPermutation(RE::Actor* a_position); + bool SetNextPermutation(RE::Actor* a_position); private: RE::TESQuest* linkedQst; diff --git a/src/Thread/ThreadCtor.cpp b/src/Thread/ThreadCtor.cpp index b1bd42506..f402e05e5 100644 --- a/src/Thread/ThreadCtor.cpp +++ b/src/Thread/ThreadCtor.cpp @@ -3,6 +3,7 @@ #include "Registry/Util/RayCast.h" #include "Registry/Util/RayCast/ObjectBound.h" #include "Thread/Interface/SelectionMenu.h" +#include "Registry/Util/RayCast/Offsets.h" #include "Util/World.h" #include @@ -123,7 +124,10 @@ namespace Thread std::promise promise; auto future = promise.get_future(); const auto selectionMethod = GetSelectionMethod(furniturePreference); - SKSE::GetTaskInterface()->AddUITask([&]() mutable { + SKSE::GetTaskInterface()->AddTask([&]() mutable { + if (((bool (*)(void))Offsets::NotOnGameThread.address())()) { + logger::error("Task is not on valid thread, this should never happen and can cause random CTD/freezes"); + } try { if (center.GetRef() && InitializeFixedCenter(centerAct, prioScenes, sceneTypes)) { logger::info("Using fixed center {:X} with offset {}.", center.GetRef()->GetFormID(), center.offset.type.ToString()); @@ -172,19 +176,25 @@ namespace Thread bool Instance::InitializeFixedCenter(RE::Actor* centerAct, std::vector& prioScenes, REX::EnumSet sceneTypes) { const auto& details = center.details = Registry::Library::GetSingleton()->GetFurnitureDetails(center.GetRef()); - auto inBounds = details ? details->GetClosestCoordinatesInBound(center.GetRef(), sceneTypes, centerAct) : std::vector{}; - for (auto i = inBounds.begin(); i < inBounds.end(); i++) { - if (std::ranges::any_of(prioScenes, [type = i->type](const auto& scene) { return scene->IsCompatibleFurniture(type); })) { - center.offset = *i; + if (((bool (*)(void))Offsets::NotOnGameThread.address())()) { + logger::error("Initialize Fixed Center called on wrong thread, not executing!"); + return false; + } else { + auto inBounds = details ? details->GetClosestCoordinatesInBound(center.GetRef(), sceneTypes, centerAct) : std::vector{}; + + for (auto i = inBounds.begin(); i < inBounds.end(); i++) { + if (std::ranges::any_of(prioScenes, [type = i->type](const auto& scene) { return scene->IsCompatibleFurniture(type); })) { + center.offset = *i; + return true; + } + } + if (std::ranges::any_of(prioScenes, [](const auto& scene) { return scene->IsCompatibleFurniture(Registry::FurnitureType::None); })) { + center.offset = { Registry::FurnitureType::None, {} }; return true; } + logger::warn("Center reference {:X} is not compatible with any scene.", center.GetRef()->GetFormID()); + return false; } - if (std::ranges::any_of(prioScenes, [](const auto& scene) { return scene->IsCompatibleFurniture(Registry::FurnitureType::None); })) { - center.offset = { Registry::FurnitureType::None, {} }; - return true; - } - logger::warn("Center reference {:X} is not compatible with any scene.", center.GetRef()->GetFormID()); - return false; } Instance::CenterSelection Instance::GetSelectionMethod(FurniturePreference furniturePreference) diff --git a/src/UserData/config.def b/src/UserData/config.def index 5aa948163..493cda6fe 100644 --- a/src/UserData/config.def +++ b/src/UserData/config.def @@ -5,7 +5,7 @@ INI_SETTING(fFurnitureScanRadius, 750.0f, "Animation") INI_SETTING(fMinScale, 0.88f, "Animation") INI_SETTING(bAllowDead, false, "Animation") INI_SETTING(fAdjustStepSizeIncrement, 0.1f, "Animation") -INI_SETTING(bAdjustNodes, true, "Animation") +INI_SETTING(bAdjustNodes, false, "Animation") INI_SETTING(fGhostModeAlpha, 0.6f, "Animation") INI_SETTING(fFurnitureSquare, 32.0f, "Animation") INI_SETTING(fFurnitureSquareHeight, 128.0f, "Animation") diff --git a/src/UserData/mcm.def b/src/UserData/mcm.def index 0121f409a..ecdda8fdf 100644 --- a/src/UserData/mcm.def +++ b/src/UserData/mcm.def @@ -19,6 +19,9 @@ MCM_SETTING(bSubmissivePlayer, false) MCM_SETTING(bSubmissiveTarget, false) MCM_SETTING(bMatchMakerActive, false) MCM_SETTING(bLipsFixedValue, true) +MCM_SETTING(bAdjustStage, true) +MCM_SETTING(bHideHUD, false) +MCM_SETTING(bUseSceneMenu, true) MCM_SETTING(iAskBed, 1) MCM_SETTING(iNPCBed, 1) @@ -28,42 +31,9 @@ MCM_SETTING(iLipsSoundTime, 1) MCM_SETTING(iLovenseStrength, 10) MCM_SETTING(iLovenseStrengthOrgasm, 20) -MCM_SETTING(fLovenseDurationOrgasm, 8) +MCM_SETTING(fLovenseDurationOrgasm, 8.0f) -// KeyBinds/Scene Control Related -MCM_SETTING(iKeyUp, 0xC8) // Up Arrow -MCM_SETTING(iKeyDown, 0xD0) // Down Arrow -MCM_SETTING(iKeyLeft, 0xCB) // Left Arrow -MCM_SETTING(iKeyRight, 0xCD) // Right Arrow -MCM_SETTING(iKeyAdvance, 0x39) // Space -MCM_SETTING(iKeyEnd, 0xCF) // End -MCM_SETTING(iKeyExtra2, 0x12) // E -MCM_SETTING(iKeyMod, 0x2A) // Shift -MCM_SETTING(iKeyReset, 0x1D) // Ctrl - -MCM_SETTING(iToggleFreeCamera, 81) -MCM_SETTING(iTargetActor, 49) - -// TODO: Add these to MCM -MCM_SETTING(bAdjustTargetStage, false) MCM_SETTING(fAdjustStepSize, 0.5f) -MCM_SETTING(bAdjustStage, true) -MCM_SETTING(bHideHUD, false) - -// MCM_SETTING(iAdjustStage, 157) -// MCM_SETTING(iBackwards, 54) -MCM_SETTING(iChangeAnimation, 24) -// MCM_SETTING(iChangePositions, 13) -// MCM_SETTING(iAdjustChange, 37) -// MCM_SETTING(iAdjustForward, 38) -// MCM_SETTING(iAdjustSideways, 40) -// MCM_SETTING(iAdjustUpward, 39) -// MCM_SETTING(iRealignActors, 26) -MCM_SETTING(iMoveScene, 27) -// MCM_SETTING(iRestoreOffsets, 12) -// MCM_SETTING(iRotateScene, 22) -// MCM_SETTING(iAdjustSchlong, 46) - MCM_SETTING(fShakeStrength, 0.7f) MCM_SETTING(fAutoSUCSM, 5.0f) MCM_SETTING(fMaleVoiceDelay, 5.0f) @@ -84,6 +54,62 @@ MCM_SETTING(sOptionalTags, ""s) MCM_SETTING(iStripForms, std::vector({ 1032555423, 1, 1032555423, 1, 806420, 0, 352928413, 1 })) MCM_SETTING(fTimers, std::vector({ 10.0f, 15.0f, 25.0f, 7.0f })) +// KeyBinds/Global Hotkeys +MCM_SETTING(iToggleFreeCamera, 0x51) // Numpad 3 +MCM_SETTING(iTargetActor, 0x31) // N +MCM_SETTING(iToggleThreadControl, 0x15) // Y + +// KeyBinds/Scene Control Related +MCM_SETTING(iKeyUp, 0xC8) // Up Arrow +MCM_SETTING(iKeyDown, 0xD0) // Down Arrow +MCM_SETTING(iKeyLeft, 0xCB) // Left Arrow +MCM_SETTING(iKeyRight, 0xCD) // Right Arrow +MCM_SETTING(iKeyAdvance, 0x39) // Space +MCM_SETTING(iKeyEnd, 0xCF) // End +MCM_SETTING(iKeyExtra2, 0x12) // E +MCM_SETTING(iKeyMod, 0x2A) // Shift +MCM_SETTING(iKeyReset, 0x1D) // Ctrl + +// KeyBinds/Legacy Hotkeys +MCM_SETTING(iMoveScene, 0x25) // K +MCM_SETTING(iChangeAnimation, 0x18) // O +MCM_SETTING(iSceneSelectorMenu, 0x23) // H +MCM_SETTING(iChangePositions, 0x0D) // Numpad Enter +MCM_SETTING(iOffsetAdjustMode, 0x4E) // Numpad + +MCM_SETTING(iToggleAdjustStage, 0x52) // Numpad 0 +MCM_SETTING(iRestoreOffsets, 0x4A) // Numpad - + +// MCM_SETTING(iAdjustStage, 157) +// MCM_SETTING(iBackwards, 54) +// MCM_SETTING(iChangeAnimation, 24) +// MCM_SETTING(iChangePositions, 13) +// MCM_SETTING(iAdjustChange, 37) +// MCM_SETTING(iAdjustForward, 38) +// MCM_SETTING(iAdjustSideways, 40) +// MCM_SETTING(iAdjustUpward, 39) +// MCM_SETTING(iRealignActors, 26) +// MCM_SETTING(iMoveScene, 27) +// MCM_SETTING(iRestoreOffsets, 12) +// MCM_SETTING(iRotateScene, 22) +// MCM_SETTING(iAdjustSchlong, 46) + +// VRIK Related +MCM_SETTING(bHasVRIK, false) +MCM_SETTING(bVRGestures, true) +MCM_SETTING(bVRGestureHaptics, true) +MCM_SETTING(bVRScaleBody, true) +MCM_SETTING(bVROrgasmFX, true) +MCM_SETTING(iPOVModeVR, 2) +MCM_SETTING(bLockHeightVR, true) +MCM_SETTING(bTrackHeadVR, true) +MCM_SETTING(iTrackHandsVR, 1) +MCM_SETTING(fHeightAdjSpeedVR, 1.0f) +MCM_SETTING(fDistHideHeadVR, 16.0f) +MCM_SETTING(fDistNearClipVR, 2.0f) +MCM_SETTING(fLockHmdDistance, 2.0f) +MCM_SETTING(fLockHmdTolerance, 20.0f) +MCM_SETTING(fLockHmdSpeed, 20.0f) + // Enjoyment Related MCM_SETTING(bInternalEnjoymentEnabled, true) @@ -107,13 +133,11 @@ MCM_SETTING(fEnjMultSub, 0.8f) MCM_SETTING(fEnjMultDom, 1.2f) MCM_SETTING(fPainHugePPMult, 0.5f) -MCM_SETTING(iGameUtilityKey, 42) -MCM_SETTING(iGamePauseKey, 48) -MCM_SETTING(iGameRaiseEnjKey, 256) -MCM_SETTING(iGameHoldbackKey, 257) -MCM_SETTING(iGameSelectNextPos, 34) +MCM_SETTING(iGameRaiseEnjKey, 0x100) // RMB +MCM_SETTING(iGameHoldbackKey, 0x101) // LMB MCM_SETTING(iEnjGameStaminaCost, 10) MCM_SETTING(iEnjGameMagickaCost, 10) +MCM_SETTING(iGameEnjAdjAmount, 1) MCM_SETTING(bGameRequiredOnHighEnj, false) MCM_SETTING(bGameSpamDelayPenalty, false) diff --git a/xmake.lua b/xmake.lua index 27c4c8086..8f2f561fc 100644 --- a/xmake.lua +++ b/xmake.lua @@ -2,7 +2,7 @@ set_xmakever("2.9.5") -- Globals PROJECT_NAME = "SexLabUtil" -PROJECT_VERSION = "2.16.0" +PROJECT_VERSION = "2.17.1" -- Includes includes("lib/CommonLibSSE-NG/xmake.lua") @@ -239,6 +239,8 @@ target("papyrus") add_includedirs("$(papyrus_include)/SkyUI SDK/Source/Scripts") add_includedirs("$(papyrus_include)/Race Menu Sources/Source/Scripts") add_includedirs("$(papyrus_include)/MfgFix NG/Source/Scripts") + add_includedirs("$(papyrus_include)/UIExtensions/Source/Scripts") + add_includedirs("$(papyrus_include)/VRIK Player Avatar/Source/Scripts") add_includedirs("$(papyrus_gamesource)/Source/Scripts") on_load(function(target)