Jump to content

Recommended Posts

Posted (edited)
On 6/8/2026 at 7:59 AM, hextun said:

 

Before going to "save is borked" instead of "hextun made a booboo", given that I *did* elect to move *away* from actual API calls because in *my* testbed the API calls were not working, I'd like to collect a little info if you don't mind. :)

 

Hmm.. is this a purely custom modlist, a pre-made modlist (e.g. from wabbajack), or a customized pre-made modlist (e.g. from wabbajack, but with your own tweaks)? I'm curious to match it against my own testbed for SLP+ (Masterstroke)

 

Do you have an older save you could load, verify things are working (since you did feel confident things were working at one point), and then try 980 again? 

 

Are you willing to do unpaid testing? :)

 

Side note/PSA: In the LL text editor (i.e. where I am typing right now), if you enter a smiley (like colon-right parens, i.e. ":)" ), but do not hit enter or space after the parens, your arrow keys will stop allowing navigation in the text editor until you do so? Like, start typing, then enter the ":)" but without the quotes. Then, before you hit enter or space (thus letting the editor convert it to the :) icon), try using your arrow keys. You can't! This surprised me. Enjoy!

Purely custom modlist before wabbajack existed! Basically a migrated Skyrim to Skyrim Special modlist using Wrye Bash and not any Mod Organizers. I could try older saves, but this behaviour seems kind of familiar to an old version of SL triggers where for some reasons things would play out of order. Like start of sex scripts wouldn't run, but it would fire orgasms or end of sex scripts. Or end of sex scripts would fire at the beginning of the scene. Not sure what fixed it.
I could definitely try  some save files and see what happens. I hope we narrow down the problem.

PS: About the smiley problem. Nope! I do not have that problem :). Actually I just got that bug too. Most of the time I can, but if I enter the smiley mid sentence, like I'm editing a sentence, I ran into that bug. For reference, using Firefox.

Edit: Okay. Testing done. It seems like somewhere in-between 980 and 983, that's when the logic broke. I'm not 100% certain, but 982 worked most of the time, so it might just be 983 that is broken at the moment. This was tested using an older save that I had near the beginning of my game. Testing newer save seems to confirm that 983 is currently broken with SLP+ and aggressive detection. Using a newer save, it does seem like 982 works, but 983 doesn't.

Edited by Mushano
  • 3 weeks later...
Posted
2 hours ago, Fraying9981 said:

thanks, do you have an idea of the value range?

Not as such, though I recall the MCM has settings for e.g. small, medium, large that appeared to range typically from, say, 0.8 to 1.3 or so maybe? Factor in race multipliers and you could perhaps end up with 0.5 to 1.5? But that's all dependent on how your modlist is set up. Technically I suppose you could normalize it all to a flat 1.0 for equality. 
 

having said that I don't know for sure that that's what you'll be getting back. 

Posted
1 hour ago, hextun said:

Not as such, though I recall the MCM has settings for e.g. small, medium, large that appeared to range typically from, say, 0.8 to 1.3 or so maybe? Factor in race multipliers and you could perhaps end up with 0.5 to 1.5? But that's all dependent on how your modlist is set up. Technically I suppose you could normalize it all to a flat 1.0 for equality. 
 

having said that I don't know for sure that that's what you'll be getting back. 

 

 

image.png.efc4a608e87427d0b85bb08b05f1dbdf.pngthanks, indeed.

Posted
3 minutes ago, Fraying9981 said:

do you know what's the unit range for enjoyment?

should you only use addenjoyment + a fix number?

or does it make sense to use relative change?

I *think* it functions from 0-100 but IIRC the API allows values to exceed the range softly, meaning it won't fail but applies a cap. At least for SexLab. SexLab P+ redid a lot of the enjoyment stuff but I suspect it works similarly. 
 

I have a script I have tinkered with that plays with enjoyment during a scene and seems to work for both SL and SLP+ within an expected range of 0-100. So if you adjust enjoyment 50, it should add 50 to the current level. Note that normal execution by the respective frameworks seems to apply far more subtle amounts of enjoyment per unit time by default; an adjustment of 50 would be significant to say the least. 

Posted
55 minutes ago, Fraying9981 said:

do you know what's the unit range for enjoyment?

should you only use addenjoyment + a fix number?

or does it make sense to use relative change?

 

This is a slightly altered version of the SLTScript I mentioned, CumDelay.sltscript. It's a mini-game that can ostensibly work on its own or sit on top of something like SLSO. I have tested it on both SexLab and SexLab P+. Note that the values for enjoyment increase are large and notable, even for the "Work It" scenario (i.e. the player attempting to provide service to earn the right to orgasm). The general point of this mini-game is that there is an amount of effort that must be achieved, by stimulating the partner(s), before the player's ability to orgasm is unlocked. When the player breaks through, this level is increased; each scene where the player breaks through makes the next scene harder to break through. If the player does not break through, the level is reduced a bit. Several keys can be mapped for listening, configurable as variables near the top of the script. There are options to "give up", where further self pleasure is impossible, as well as self and other service, where an extreme amount of enjoyment is tacked on to either the player or the partner(s).

 

It is meant to be run on Sex Start, Player targeted.

 

It should give an idea of how enjoyment can be affected. You can play with the values to see how much it impacts progress. Note that, in my very anecdotal observation, SLP+ enjoyment seems to progress more quickly under normal conditions (i.e. without this script or attempting to use the built-in manipulation) than, for example, in base SexLab. So if you are using SLP+, you'll see enjoyment ratcheting up pretty noticeably, and then, if you use this script, it's going to go much more quickly.

 

Spoiler
set $CUM_DENIAL_FLOOR 100.0
set $CUM_DENIAL_DECREMENT -25.0
set $CUM_DENIAL_DECR_FLOOR $CUM_DENIAL_FLOOR - $CUM_DENIAL_DECREMENT
set $CUM_DENIAL_CEILING 2000.0
; these values are used directly with the SexLab/SexLabP+ API / It appears that for SLP the values may need to be larger to have effect, early results are inconclusive
set $SERVICE_ENJOYMENT_SELF 100				; when providing service to self, add this much enjoyment
set $SERVICE_ENJOYMENT_OTHERS 100			; when providing service to others, add this much enjoyment
set $GIVEUP_ENJOYMENT_OTHERS 20				; after giving up, add this much enjoyment to the others each 0.5 second
set $BREAKTHROUGH_ENJOYMENT_SELF 100		; upon breaking through, add this much enjoyment to self
set $WORK_ENJOYMENT_RND_OTHER_MIN 0			; for the work-it enjoyment calc, rnd(min, max) + bonus
set $WORK_ENJOYMENT_RND_OTHER_MAX 7			; for the work-it enjoyment calc, rnd(min, max) + bonus
set $WORK_ENJOYMENT_OTHER_BONUS 17			; for the work-it enjoyment calc, rnd(min, max) + bonus
; keystrokes - https://gist.github.com/arithex/3e953d1eb096afe58ce05ba6846493e4
; NP1/79 ; NP2/80 ; NP3/81 ; NP4/75; NP5/76; NP6/77 ; NP7/71 ; NP8/72 ; NP9/73; NP0/82 ; NP-/74; NP+/78 ; NPENTER/156 ; ArrowUp/200 ; ArrowLeft/203 ; ArrowRight/205 ; ArrowDown/208
set $KEY_BREAK "G"
set $DXC_BREAK 34
set $KEY_WORK "ArrowUp"
set $DXC_WORK 200
set $KEY_SELF "ArrowRight"
set $DXC_SELF 205
set $KEY_OTHER "ArrowLeft"
set $DXC_OTHER 203
set $KEY_GIVEUP "NP5"
set $DXC_GIVEUP 76

; are you the Public Whore? Much harder to cum
set $is_PW resultfrom pw_is_whore_anywhere
msg_console $"CumDelay - Public Whore - {is_PW}"
if $is_PW
	set $CUM_DENIAL_CEILING $CUM_DENIAL_CEILING * 1.5
endif

if $global.cum_denial_max < $CUM_DENIAL_FLOOR
	msg_console $"CumDelay - Initializing cum_denial_max to {CUM_DENIAL_FLOOR}"
	set $global.cum_denial_max $CUM_DENIAL_FLOOR
elseif $global.cum_denial_max > $CUM_DENIAL_CEILING
	set $rnd_decr resultfrom rnd_float 0 $global.cum_denial_max
	set $global.cum_denial_max $global.cum_denial_max - $rnd_decr
	msg_console $"CumDelay - cum_denial_max > {CUM_DENIAL_CEILING}, reducing by random amount ({rnd_decr}); new cum_denial_max - {global.cum_denial_max}"
elseif $global.cum_denial_max > $CUM_DENIAL_DECR_FLOOR
	msg_console $"CumDelay - Decrementing cum_denial_max by {CUM_DENIAL_DECREMENT}"
	inc $global.cum_denial_max $CUM_DENIAL_DECREMENT
endif

set $info_msg $"CumDelay - Press '{KEY_BREAK}' to Disable, {KEY_WORK}-Work It, {KEY_SELF}-Service self, {KEY_OTHER}-Service others, {KEY_GIVEUP}-Give up : .. {global.cum_denial}/{global.cum_denial_max}"
msg_console $info_msg
uilib_shownotification $info_msg

set $broken false
if $global.cum_denial < $global.cum_denial_max
	sl_disableorgasm $system.player true
	msg_console "CumDelay - Disabling orgasms for now"
else
	set $global.cum_denial 0.0
	inc $global.cum_denial_max $CUM_DENIAL_FLOOR
	set $broken true
	msg_console "CumDelay - Orgasms starting enabled"
endif

[startwaiting]
set $keypress resultfrom sl_waitforkbd $DXC_BREAK $DXC_WORK $DXC_SELF $DXC_OTHER $DXC_GIVEUP

if $keypress == $DXC_WORK
	set $rndi resultfrom rnd_int $WORK_ENJOYMENT_RND_OTHER_MIN $WORK_ENJOYMENT_RND_OTHER_MAX
	inc $rndi $WORK_ENJOYMENT_OTHER_BONUS
	sl_adjustenjoyment $system.partner1 $rndi
	sl_adjustenjoyment $system.partner2 $rndi
	sl_adjustenjoyment $system.partner3 $rndi
	sl_adjustenjoyment $system.partner4 $rndi
	if $broken == false
		set $decr_amount $system.random.100
		if $is_PW
			set $decr_amount $decr_amount * 0.25
		endif
		inc $global.cum_denial $decr_amount
		if $global.cum_denial > $global.cum_denial_max
			sl_disableorgasm $system.player false
			msg_console $"CumDelay - Breakthrough! {global.cum_denial}/{global.cum_denial_max}"
			set $global.cum_denial 0.0
			inc $global.cum_denial_max $CUM_DENIAL_FLOOR
			set $broken true
			sl_adjustenjoyment $system.player $BREAKTHROUGH_ENJOYMENT_SELF
		endif
	else
		sl_adjustenjoyment $system.player $rndi
	endif
	goto [startwaiting]
elseif $keypress == $DXC_OTHER
	msg_console "CumDelay - Service to Others"
	sl_adjustenjoyment $system.partner1 $SERVICE_ENJOYMENT_OTHERS
	sl_adjustenjoyment $system.partner2 $SERVICE_ENJOYMENT_OTHERS
	sl_adjustenjoyment $system.partner3 $SERVICE_ENJOYMENT_OTHERS
	sl_adjustenjoyment $system.partner4 $SERVICE_ENJOYMENT_OTHERS
	goto [startwaiting]
elseif $keypress == $DXC_SELF
	msg_console "CumDelay - Service to Self"
	if $is_PW
		msg_console "CumDelay - Unable to service self while the public whore"
	else
		sl_adjustenjoyment $system.player $SERVICE_ENJOYMENT_SELF
		sl_orgasm $system.player
	endif
	goto [startwaiting]
elseif $keypress == $DXC_GIVEUP
	sl_disableorgasm $system.player true
	msg_console "CumDelay - Giving Up and disabling orgasms"
[do giveup_service]
	sl_isin $system.player
	if $$
		sl_adjustenjoyment $system.partner1 $GIVEUP_ENJOYMENT_OTHERS
		sl_adjustenjoyment $system.partner2 $GIVEUP_ENJOYMENT_OTHERS
		sl_adjustenjoyment $system.partner3 $GIVEUP_ENJOYMENT_OTHERS
		sl_adjustenjoyment $system.partner4 $GIVEUP_ENJOYMENT_OTHERS
		util_wait 0.5
		goto [do giveup_service]
	else
		msg_console "CumDelay - Exiting after Giving Up"
		if $is_PW
			set $global.cum_denial 0
			inc $global.cum_denial_max $CUM_DENIAL_FLOOR
		endif
		return
	endif
elseif $keypress == $DXC_BREAK
	msg_console "CumDelay - Break forced"
	if $broken == true
		sl_disableorgasm $system.player false
		msg_console $"CumDelay - '{KEY_BREAK}' pressed again; Disabled: {global.cum_denial}/{global.cum_denial_max}"
		if $is_PW
			set $global.cum_denial 0
			inc $global.cum_denial_max $CUM_DENIAL_FLOOR
		endif
		return
	else
		set $global.cum_denial $global.cum_denial_max + 1.0
		msg_console $"CumDelay - '{KEY_BREAK}' pressed; Overriding cum_denial {global.cum_denial}/{global.cum_denial_max}"
		goto [startwaiting]
	endif
endif

if $is_PW
	set $global.cum_denial 0
	inc $global.cum_denial_max $CUM_DENIAL_FLOOR
endif

msg_console $"CumDelay - result: {keypress} .. {global.cum_denial}/{global.cum_denial_max}"

 

 

Posted

Probably also worth mentioning that spending some time to add Papyrus optimizations may help.

 

Here is my PapyrusTweaks.ini file for example.

 

Spoiler
# |\__/,|   (`\             ZZZZZZ
# |_ _  |.--.) )        ZZZZ
# ( T   )     /     zzz
#(((^_(((/(((_/


[Fixes]

;Fixes ToggleScripts command not persisting when saving/stack dumping
;Scripts will now stay turned off when toggled off, and on when toggled on.
bFixToggleScriptsCommand = true

;Fix unintentionally allocating script pages when getting largest available page, but out of memory.
bFixScriptPageAllocation = true

;Fix crash when passing in NONE object to script function Actor.IsHostileToActor().
bFixIsHostileToActorCrash = true

;Fix scripts that don't load right away breaking completely if they reference an invalid object type (Ex: SuperSecretScript has a function that takes InvalidScript as a parameter).
bFixDelayedScriptBreakage = true


[Experimental]

;(VR-ONLY) Pauses all non-playroom scripts while in the VR playroom, so mod scripts only initialize once you actually enter a save/new game.
;This is only experimental as it intentionally alters script behavior
bDisableScriptsInPlayroomVR = false

;Stops the game from resetting when loading a corrupted save
;This will NOT fix a broken save, just allows you to load the save no matter what information is lost. ONLY USE AS A LAST RESORT TO RECOVER A SAVE YOU HAVE BEEN WARNED!!
bBypassCorruptSaveMessage = false

;Allows the Script Engine to use as much memory as needed, with no cap. This makes `iMaxAllocatedMemoryBytes` in Skyrim.ini useless
;Note: Skyrim already ignores memory limit when stressed, this setting just keeps it ignores.
bIgnoreMemoryLimit = true

;(Formerly bRunScriptsOnMainThreadOnly)
;Speeds up native calls by desyncing them from framerate and instead syncing script calls to a spinlock, greatly improving script performance while still preventing concurrent execution of native calls
bSpeedUpNativeCalls = true

;(Formerly sMainThreadMethodsToExclude, requires bSpeedUpNativeCalls=true)
;List of script method prefixes to exclude from being sped up (ex: "Equip" excludes "EquipItem" and "EquipItemByID", but does NOT exclude "UnequipItem".
;It is strongly recommended to leave at defaults unless you absolutely know what you're doing
;as a lot of modifying functions like `EquipItem` do not work properly if executed more than once in a single frame.
; Defaults exclude everything except for read-only functions (ex: GetFormFromFile, HasKeyword, IsLoaded, etc.)
;ORIGINALsScriptMethodPrefixesToExclude = Activate, Add, Advance, Allow, Attach, Apply, Block, Cast, Change, Clear, Close, Complete, Create, Damage, Delete, Disable, Disallow, Dismount, Dispel, DoCombatSpellApply, Draw, Drop, Enable, End, Equip, Evaluate, Fade, Fail, Fire, Force, GetAnimation, GetQuest, Hide, Hold, Ignore, Increment, Keep, Kill, Knock, Learn, Load, Lock, Mod, Move, Mute, Open, Place, Play, Pop, Precache, Process, Push, Queue, Quit, Regenerate, Register, Release, RemoteCast, Remove, Request, Reset, Restore, Resurrect, Revert, Save, Say, Send, Serve, Set, Shake, Sheath, Show, Start, Stop, Teach, TempClone, Tether, Toggle, Translate, Trap, Trigger, Try, Unequip, Unlock, UnMute, UnPause, Update, Unregister
sScriptMethodPrefixesToExclude = Offset, _Set, _Adjust, _Get, _Seed, _Reset, _Clear, _Copy, CalcEnjoyment, Activate, Add, Advance, Allow, Attach, Apply, Block, Cast, Change, Clear, Close, Complete, Create, Damage, Delete, Disable, Disallow, Dismount, Dispel, DoCombatSpellApply, Draw, Drop, Enable, End, Equip, Evaluate, Fade, Fail, Fire, Force, GetAnimation, GetQuest, Hide, Hold, Ignore, Increment, Keep, Kill, Knock, Learn, Load, Lock, Mod, Move, Mute, Open, Place, Play, Pop, Precache, Process, Push, Queue, Quit, Regenerate, Register, Release, RemoteCast, Remove, Request, Reset, Restore, Resurrect, Revert, Save, Say, Send, Serve, Set, Shake, Sheath, Show, Start, Stop, Teach, TempClone, Tether, Toggle, Translate, Trap, Trigger, Try, Unequip, Unlock, UnMute, UnPause, Update, Unregister

;(Formerly sMainThreadClassesToExclude, requires bSpeedUpNativeCalls=true)
;List of script classes to exclude from being sped up by bSpeedUpNativeCalls.
;It is strongly recommended to leave at defaults unless you absolutely know what you're doing
;ORIGINALsScriptClassExclusions = UI, ConsoleUtil, PO3_SKSEFunctions, MfgConsole, MFGConsoleFunc, Input, Debug, Utility, PapyrusTweaks, Quest, MfgConsoleFuncExt
sScriptClassExclusions = UI, ConsoleUtil, PO3_SKSEFunctions, MfgConsole, MFGConsoleFunc, Input, Debug, Utility, PapyrusTweaks, Quest, MfgConsoleFuncExt, SexLabUtil, slaInternalModules, AnimSpeedHelper


[VM Tweaks (Tweaks that directly alter the script engine)]

;Maximum papyrus operations per frame. Higher number means better script performance on average
;Has a very minor impact on framerate, and varies from script to script. (Default: 500, Vanilla value: 100). Recommended Range: 100-2000. Set to 0 to disable
iMaxOpsPerFrame = 4000

;Modify how long Papyrus can be "overstressed" before dumping stacks, in milliseconds (Default value: 15000, Vanilla value: 5000).
;Set to 0 to disable the stack dump check, or -1 to disable this setting.
;See https://www.nexusmods.com/skyrimspecialedition/articles/4625 for information on what a stack dump is
iStackDumpTimeoutMS = 15000

;Enables loading of doc strings from scripts into the engine. Requires `bLoadDebugInformation` to be true in this INI
bEnableDocStrings = true

;Enables Skyrim to load debug information of scripts. This completely overrides bLoadDebugInformation in Skyrim.ini and is provided here for easier configuration
bEnableDebugInformation = true


[Logging Tweaks (Tweaks that affect script logging)]

;Disables `File " % s " does not exist or is not currently loaded.` logs from being printed when calling Game.GetFormFromFile().
;This only disables the logging of the error, the error itself will still occur
bDisableGetFormFromFileErrorLogs = false

;Improves Base Type Mismatch error to show inheritance hierarchy of scripts; Also clarifies if the script was a genuine mismatch, or if the script doesn't exist
bImproveBaseTypeMismatchLogs = true

;Improves several error logs relating to incompatible arguments to better clarify what is incompatible
bImproveValidateArgsLogs = true

;Disable "Property %s on script %s attached to %s cannot be initialized because the script no longer contains that property" log messages.
;This only disables the logging of the warning, the warning itself will still occur
bDisableNoPropertyOnScriptErrorLogs = false

;Disable "Cannot open store for class "%s", missing file?" errors being logged.
;This only disables the logging of the error, the error itself will still occur
bDisableMissingScriptError = false

;Adds a summary of events when dumping stacks to log
bSummarizeStackDumps = true

 

 

Posted
1 hour ago, hextun said:

 

This is a slightly altered version of the SLTScript I mentioned, CumDelay.sltscript. It's a mini-game that can ostensibly work on its own or sit on top of something like SLSO. I have tested it on both SexLab and SexLab P+. Note that the values for enjoyment increase are large and notable, even for the "Work It" scenario (i.e. the player attempting to provide service to earn the right to orgasm). The general point of this mini-game is that there is an amount of effort that must be achieved, by stimulating the partner(s), before the player's ability to orgasm is unlocked. When the player breaks through, this level is increased; each scene where the player breaks through makes the next scene harder to break through. If the player does not break through, the level is reduced a bit. Several keys can be mapped for listening, configurable as variables near the top of the script. There are options to "give up", where further self pleasure is impossible, as well as self and other service, where an extreme amount of enjoyment is tacked on to either the player or the partner(s).

 

It is meant to be run on Sex Start, Player targeted.

 

It should give an idea of how enjoyment can be affected. You can play with the values to see how much it impacts progress. Note that, in my very anecdotal observation, SLP+ enjoyment seems to progress more quickly under normal conditions (i.e. without this script or attempting to use the built-in manipulation) than, for example, in base SexLab. So if you are using SLP+, you'll see enjoyment ratcheting up pretty noticeably, and then, if you use this script, it's going to go much more quickly.

 

  Hide contents
set $CUM_DENIAL_FLOOR 100.0
set $CUM_DENIAL_DECREMENT -25.0
set $CUM_DENIAL_DECR_FLOOR $CUM_DENIAL_FLOOR - $CUM_DENIAL_DECREMENT
set $CUM_DENIAL_CEILING 2000.0
; these values are used directly with the SexLab/SexLabP+ API / It appears that for SLP the values may need to be larger to have effect, early results are inconclusive
set $SERVICE_ENJOYMENT_SELF 100				; when providing service to self, add this much enjoyment
set $SERVICE_ENJOYMENT_OTHERS 100			; when providing service to others, add this much enjoyment
set $GIVEUP_ENJOYMENT_OTHERS 20				; after giving up, add this much enjoyment to the others each 0.5 second
set $BREAKTHROUGH_ENJOYMENT_SELF 100		; upon breaking through, add this much enjoyment to self
set $WORK_ENJOYMENT_RND_OTHER_MIN 0			; for the work-it enjoyment calc, rnd(min, max) + bonus
set $WORK_ENJOYMENT_RND_OTHER_MAX 7			; for the work-it enjoyment calc, rnd(min, max) + bonus
set $WORK_ENJOYMENT_OTHER_BONUS 17			; for the work-it enjoyment calc, rnd(min, max) + bonus
; keystrokes - https://gist.github.com/arithex/3e953d1eb096afe58ce05ba6846493e4
; NP1/79 ; NP2/80 ; NP3/81 ; NP4/75; NP5/76; NP6/77 ; NP7/71 ; NP8/72 ; NP9/73; NP0/82 ; NP-/74; NP+/78 ; NPENTER/156 ; ArrowUp/200 ; ArrowLeft/203 ; ArrowRight/205 ; ArrowDown/208
set $KEY_BREAK "G"
set $DXC_BREAK 34
set $KEY_WORK "ArrowUp"
set $DXC_WORK 200
set $KEY_SELF "ArrowRight"
set $DXC_SELF 205
set $KEY_OTHER "ArrowLeft"
set $DXC_OTHER 203
set $KEY_GIVEUP "NP5"
set $DXC_GIVEUP 76

; are you the Public Whore? Much harder to cum
set $is_PW resultfrom pw_is_whore_anywhere
msg_console $"CumDelay - Public Whore - {is_PW}"
if $is_PW
	set $CUM_DENIAL_CEILING $CUM_DENIAL_CEILING * 1.5
endif

if $global.cum_denial_max < $CUM_DENIAL_FLOOR
	msg_console $"CumDelay - Initializing cum_denial_max to {CUM_DENIAL_FLOOR}"
	set $global.cum_denial_max $CUM_DENIAL_FLOOR
elseif $global.cum_denial_max > $CUM_DENIAL_CEILING
	set $rnd_decr resultfrom rnd_float 0 $global.cum_denial_max
	set $global.cum_denial_max $global.cum_denial_max - $rnd_decr
	msg_console $"CumDelay - cum_denial_max > {CUM_DENIAL_CEILING}, reducing by random amount ({rnd_decr}); new cum_denial_max - {global.cum_denial_max}"
elseif $global.cum_denial_max > $CUM_DENIAL_DECR_FLOOR
	msg_console $"CumDelay - Decrementing cum_denial_max by {CUM_DENIAL_DECREMENT}"
	inc $global.cum_denial_max $CUM_DENIAL_DECREMENT
endif

set $info_msg $"CumDelay - Press '{KEY_BREAK}' to Disable, {KEY_WORK}-Work It, {KEY_SELF}-Service self, {KEY_OTHER}-Service others, {KEY_GIVEUP}-Give up : .. {global.cum_denial}/{global.cum_denial_max}"
msg_console $info_msg
uilib_shownotification $info_msg

set $broken false
if $global.cum_denial < $global.cum_denial_max
	sl_disableorgasm $system.player true
	msg_console "CumDelay - Disabling orgasms for now"
else
	set $global.cum_denial 0.0
	inc $global.cum_denial_max $CUM_DENIAL_FLOOR
	set $broken true
	msg_console "CumDelay - Orgasms starting enabled"
endif

[startwaiting]
set $keypress resultfrom sl_waitforkbd $DXC_BREAK $DXC_WORK $DXC_SELF $DXC_OTHER $DXC_GIVEUP

if $keypress == $DXC_WORK
	set $rndi resultfrom rnd_int $WORK_ENJOYMENT_RND_OTHER_MIN $WORK_ENJOYMENT_RND_OTHER_MAX
	inc $rndi $WORK_ENJOYMENT_OTHER_BONUS
	sl_adjustenjoyment $system.partner1 $rndi
	sl_adjustenjoyment $system.partner2 $rndi
	sl_adjustenjoyment $system.partner3 $rndi
	sl_adjustenjoyment $system.partner4 $rndi
	if $broken == false
		set $decr_amount $system.random.100
		if $is_PW
			set $decr_amount $decr_amount * 0.25
		endif
		inc $global.cum_denial $decr_amount
		if $global.cum_denial > $global.cum_denial_max
			sl_disableorgasm $system.player false
			msg_console $"CumDelay - Breakthrough! {global.cum_denial}/{global.cum_denial_max}"
			set $global.cum_denial 0.0
			inc $global.cum_denial_max $CUM_DENIAL_FLOOR
			set $broken true
			sl_adjustenjoyment $system.player $BREAKTHROUGH_ENJOYMENT_SELF
		endif
	else
		sl_adjustenjoyment $system.player $rndi
	endif
	goto [startwaiting]
elseif $keypress == $DXC_OTHER
	msg_console "CumDelay - Service to Others"
	sl_adjustenjoyment $system.partner1 $SERVICE_ENJOYMENT_OTHERS
	sl_adjustenjoyment $system.partner2 $SERVICE_ENJOYMENT_OTHERS
	sl_adjustenjoyment $system.partner3 $SERVICE_ENJOYMENT_OTHERS
	sl_adjustenjoyment $system.partner4 $SERVICE_ENJOYMENT_OTHERS
	goto [startwaiting]
elseif $keypress == $DXC_SELF
	msg_console "CumDelay - Service to Self"
	if $is_PW
		msg_console "CumDelay - Unable to service self while the public whore"
	else
		sl_adjustenjoyment $system.player $SERVICE_ENJOYMENT_SELF
		sl_orgasm $system.player
	endif
	goto [startwaiting]
elseif $keypress == $DXC_GIVEUP
	sl_disableorgasm $system.player true
	msg_console "CumDelay - Giving Up and disabling orgasms"
[do giveup_service]
	sl_isin $system.player
	if $$
		sl_adjustenjoyment $system.partner1 $GIVEUP_ENJOYMENT_OTHERS
		sl_adjustenjoyment $system.partner2 $GIVEUP_ENJOYMENT_OTHERS
		sl_adjustenjoyment $system.partner3 $GIVEUP_ENJOYMENT_OTHERS
		sl_adjustenjoyment $system.partner4 $GIVEUP_ENJOYMENT_OTHERS
		util_wait 0.5
		goto [do giveup_service]
	else
		msg_console "CumDelay - Exiting after Giving Up"
		if $is_PW
			set $global.cum_denial 0
			inc $global.cum_denial_max $CUM_DENIAL_FLOOR
		endif
		return
	endif
elseif $keypress == $DXC_BREAK
	msg_console "CumDelay - Break forced"
	if $broken == true
		sl_disableorgasm $system.player false
		msg_console $"CumDelay - '{KEY_BREAK}' pressed again; Disabled: {global.cum_denial}/{global.cum_denial_max}"
		if $is_PW
			set $global.cum_denial 0
			inc $global.cum_denial_max $CUM_DENIAL_FLOOR
		endif
		return
	else
		set $global.cum_denial $global.cum_denial_max + 1.0
		msg_console $"CumDelay - '{KEY_BREAK}' pressed; Overriding cum_denial {global.cum_denial}/{global.cum_denial_max}"
		goto [startwaiting]
	endif
endif

if $is_PW
	set $global.cum_denial 0
	inc $global.cum_denial_max $CUM_DENIAL_FLOOR
endif

msg_console $"CumDelay - result: {keypress} .. {global.cum_denial}/{global.cum_denial_max}"

 

 

 

thank you! this is helpful to understand an example of how to use.

so the main function is "sl_adjustenjoyment "

-> does it ADD a value on top of the 0-100 scale you mentioned 
OR: does it set the level 0-100 of the enjoyment?

 

If you reach or exceed 100, do you get an orgasm automatically?

Posted
23 minutes ago, Fraying9981 said:

 

thank you! this is helpful to understand an example of how to use.

so the main function is "sl_adjustenjoyment "

-> does it ADD a value on top of the 0-100 scale you mentioned 
OR: does it set the level 0-100 of the enjoyment?

 

If you reach or exceed 100, do you get an orgasm automatically?

It appears to add to the actors existing value. And if orgasms are not disabled for them I believe that yes once you reach that value it will trigger one. I say I believe because other mods or values might also impact things. 

Posted
6 hours ago, ShadowClaw20017 said:

Quick question. Say I wanted to design a script for triggering a scene upon hunger levels dropping with certain tags, but only out of combat. How do access the hunger variable in survival mode?

 

If I am understanding you correctly, you are wanting to obtain the CC (i.e. base game, not modded like SunHelm Survival) current hunger value.

 

If I am not mistaken, you can obtain the current value, which is normally scaled from 0 (fed) to 1000 (ravenous), by querying the Global Variable "Survival_HungerNeedValue", which you can do in SLTScript using global_getvalue "Survival_HungerNeedValue", i.e.:

 

set $current_hunger resultfrom global_getvalue "Survival_HungerNeedValue"

 

Similarly, I *believe* but *am not certain* you could set it via:

 

global_setvalue "Survival_HungerNeedValue" 0.0 ; which would make you well fed again

 

I don't currently have a list set up to use vanilla survival so can't test this. I got the global variable names by pulling up ccqdrsse001-survivalmode.esl in xEdit and taking an educated guess. There are some other interesting hunger related values there too.

Posted
On 6/8/2026 at 6:11 PM, Mushano said:

Purely custom modlist before wabbajack existed! Basically a migrated Skyrim to Skyrim Special modlist using Wrye Bash and not any Mod Organizers. I could try older saves, but this behaviour seems kind of familiar to an old version of SL triggers where for some reasons things would play out of order. Like start of sex scripts wouldn't run, but it would fire orgasms or end of sex scripts. Or end of sex scripts would fire at the beginning of the scene. Not sure what fixed it.
I could definitely try  some save files and see what happens. I hope we narrow down the problem.

PS: About the smiley problem. Nope! I do not have that problem :). Actually I just got that bug too. Most of the time I can, but if I enter the smiley mid sentence, like I'm editing a sentence, I ran into that bug. For reference, using Firefox.

Edit: Okay. Testing done. It seems like somewhere in-between 980 and 983, that's when the logic broke. I'm not 100% certain, but 982 worked most of the time, so it might just be 983 that is broken at the moment. This was tested using an older save that I had near the beginning of my game. Testing newer save seems to confirm that 983 is currently broken with SLP+ and aggressive detection. Using a newer save, it does seem like 982 works, but 983 doesn't.

 

Sorry for taking so long to reply; I guess I must have missed your edit. :/

 

Well, v983 is when I introduced a change to how I resolve aggressiveness in SLP+ explicitly. Aaaaand I am guessing I borked it up.

 

I'll look at reverting that change, but the original issue that caused me to make said change will also need revisiting.

 

In the meantime, try reverting to v982, though note that that will also remove access to the introduced functions:

sl_is_actor_aggressor

sl_is_actor_submissive

sl_is_scene_aggressive

Posted
On 7/7/2026 at 9:33 AM, hextun said:

 

Sorry for taking so long to reply; I guess I must have missed your edit. :/

 

Well, v983 is when I introduced a change to how I resolve aggressiveness in SLP+ explicitly. Aaaaand I am guessing I borked it up.

 

I'll look at reverting that change, but the original issue that caused me to make said change will also need revisiting.

 

In the meantime, try reverting to v982, though note that that will also remove access to the introduced functions:

sl_is_actor_aggressor

sl_is_actor_submissive

sl_is_scene_aggressive
 

Yeah, for now I'm on a mix of 982/983...? I forgot what I did, but I think I unstubbed sl_is_aggressive and restored what you put in with 982. And I'm using the 982 version of sl_triggersExtensionSexLab. That seems to have restored the aggressive or consensual check for me.
 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...