Colin's Loader Mods (1 Viewer)

colin

Content Creator
Joined
Apr 11, 2016
Current version (7.0):

Here are the full notes on the mod in it's current version:
Basic Notes:
This is my first Mod attempt. I believe I have most of the bugs worked out, but let me know if you find any.
This mod adds 22 dialogue triggers. 16 are listed here, the remaining 6 are listed in the Advanced functionality.txt file also included in this package, these triggers are for more complicated dialogues and you should probably fully understand those listed in this file before working with those.

Changes by version:
v7: Added line callback functionality that allows the writer to create test conditions, which when fulfilled cause the dialogue to jump to a specified line. Also fixed ramp/random interaction.

v6.1: bug fix for value_custom + ramping, many extra configuration options from value_custom.

v6: overhauled code to be more stable/have more options. Too many changes to list indivually, new functions/inputs below.

v5: added trigger to automate breaking through initial resistance, allows you to specify speed she moves down, and speed she moves back up seperately.
Mainly added to handle very large penis sizes where the other auto functions won't keep her pulled off long enough for the animation to clear her mouth, so it will not decrease her resistance further leading to never getting a deepthroat.

v4.2:Fixed major problem preventing custom functions from operating.
Logic changed/simplified to be much more reliable in most cases for very fast/slow automations.

v4.1: The mouse release was not occurring after a hold to balls trigger was used followed by a normal trigger so until a base auto function or stop_custom was called, or the player pressed and released the mouse button she would not take it in her mouth again. This has been fixed and the other triggers will release the hold.

v4: Fixed issue with non-oral positions always trying to reset to get in the penis in her mouth, and added 3 more new triggers: [START_LICKING_<speed>], [PRESS_BALLS_<speed>], and [MOVE_TONGUE_<IN/OUT>.

v3.2: Fixed [STOP_CUSTOM] trigger, and allowed slower speeds for [POSITION_CUSTOM], also made it less likely that the fix from 3.1 would trigger when it should not due to built in movement from breathing during very slow movements.

v3.1: Fixed issue with "missing" as the penis passes her mouth, so she just went alongside it.

Mod triggers:
[INIT_RESISTANCE_<level>]:
Sets the initial resistance to value that replaces <level>

Example: [INIT_RESISTANCE_75] will set the initial resistance to 75.

[HOLD_CUSTOM]:
Locks him/her in position so no movement will occur until command is canceled with an AUTO
setting, or another CUSTOM command.

[STOP_CUSTOM]:
Cancels the current CUSTOM command.

[PAUSE_CUSTOM]:
Freezes the current custom automation.

[CONTINUE_CUSTOM]:
Unfreezes the current custom animation, picking up exactly where it left off when pasue_animation was used.

[MOUSE_BUTTON_<position>]:
Simulates holding/releasing the left mouse button, position = down holds down, up releases, position is not case-sensitive. This allows for the dialogue writer to pull her up/down or move her alongside the penis.

[MOVE_TO_BALLS_<speed>]:
Moves her down to his balls. Speed argument specifies how fast she moves to his balls, if above ~60 or on very large penises may not activate mouse hold quickly enough. To insure it works properly, recommend using MOUSE_BUTTON_DOWN first.

[MOVE_TONGUE]:
Toggles tongue on or off, if the argument is either 'in', the tongue will be toggled off, if the srgument is 'out' otherwise it will be toggled on, the argument is not case-sensitive.

[INIT_RESIST_BREAK_<speed-going-down>_<(optional)speed-going-up>]:
Moves her up and down his penis with slight pauses (4 frames, or about 0.15 seconds) to allow animation to catch up. This allows her to clear his penis even at very high speeds so initial resistance will continue to degrade allowing an eventual deep throat. With the other custom triggers, at high speeds the animation would not catch up to the position fast enough, so she would begin going back down before she actually came off the penis. When pulling her off, it stops with a small (10-15 pixel) gap between her lips and the tip of the penis.

Example:
[INIT_RESIST_BREAK_100_20] would force her all the way down at 100% of max speed, then pull her back off at 20% speed.

Base automation triggers:
For the following triggers, all values should be between 0 and 100. All x/y coordinates are percentages of maximum value, they represent mouse positions when auto is off. so x = 30 represents the mouse being placed 30% of the way across the screen from left to right. X coordinates can be replaced with words that will calculate the appropriate position automatically, these are:
'off': sets position to 0%.
'tip': places her lips near the tip of the penis.
'head':places her lips at the base of the head of the penis.
'center': attempts to place her lips at the center of the penis, value is calculated from initial resistance broken and no throat resist.
'hilt': attempts to place her all the way down the penis. Again, affected by current resistances.

To overcome initial resistance the penis MUST actually exit her mouth before pressing back in.

[X_CUSTOM_<min-x-coordinate>_<max-x-coordinate>_<x-speed-down>_<(optional)x-speed-up>)_<(optional)x-delay-down>_<(optional)x-delay-up>]:
Sets up a custom automation with default y values, only specify x values. Optional triggers have default values if unspecified, but you cannot skip them. So to do x-delay-down you MUST specify x-speed-up first. if speed/delay up are not set, they default to the value set for the down version. Delay down defaults to 3 frames.

Example 1: [X_CUSTOM_20_50_40] will move between a simulated mouse at 20%, and 50% and back at 40% of the maximum speed, at each end point it will stay for 3 frames before reversing directions.

Example 2: [X_CUSTOM_20_50_40_70_15] will move from a simulated mouse at 20%, over to 50% at 40% of max speed, it will then stay there for 15 frames before moving back from 50% to 20% at 70% of maximum speed where it will stay for another 15 frames before beginning again.

Example 3: [X_CUSTOM_tip_center_40_70_15_20] will move her lips from the tip of the penis to the center of the penis at 40% of max speed, it will then stay there for 15 frames before moving back from the center to the tip at 70% of maximum speed where it will stay for 20 frames before beginning again.

[FULL_CUSTOM_<min-x-coordinate>_<max-x-coordinate>_<x-speed-down>_<min-y-coordinate>_<max-y-coordinate>_<y-speed-down>_<(optional)x-speed-up>_<(optional)y-speed-up>_<(optional)x-delay-down>_<(optional)x-delay-up>]:
Same as previous except y values are also specified, y delays are not currently adjustable due to lack of visibility and size of trigger result.

[POSITION_CUSTOM_<x-coordinate>_<y-coordinate>_<speed>]:
This trigger works much the same as the FULL and X triggers, but it smoothly transitions to the
specified point and stays there until another command, such as [AUTO_HARD] or [X_CUSTOM] is given.

Example: [POSITION_CUSTOM_tip_80_40] would cause her to move her lips to the tip of his penis, with the mouse simulated at 80% of the way down the screen. This movement will be at 40% of the maximum speed.

Random auto triggers:
The next three triggers act the same, and have the same initial parameters as the X_CUSTOM triggers, but more parameters are added to each:
First is the random chance, this is the chance that it will update the current min/max, speed up/down, and delay up/down of the animation. The chance is equal to this parameter/1000 and can range from 0-1000. It is HIGHLY recommended that you stay under 100, as that would average out to a new set of values every 10 frames or ~.33 seconds.

The second new parameter is the range you want the random adjustments to occur in, i.e. if this parameter is 30, all parameters will be between 70% and 130% of the original value. For delay this is rounded off as delays are measured in frames. For min/max, the change is calculated from the average of the two, and then added to the original value i.e. if min = 20 and max = 50 with a random scale of 0.2, to update min, we take average min/max = 35 * 0.2 = 7, min + 7 = 27 so now it would be 27-50. The same would be done for max.

Each item has the scale calculated individually so if the given scale is 20% (parameter = 20) each would be multiplied by 0.8-1.2. One may be multiplied by 1.15 while another might get 0.83, they are independent of each other.

Note: Every time the values are updated, the values are taken from the GIVEN parameters not the current ones. So it will NOT stack as time goes on, these blocks have rather complex inputs, so be careful when using them.

RANDOM_CUSTOM requires you to specify EVERY value, while RANDOM_SPECIFY require min/max, speedDown, randomChance, and randomScale, then choose which additional components you wish to change. both start with TRIGGER_<min-x>_<max-x>_<speed-down-x>_<random-chance>_<random-scale>
RANDOM_CUSTOM then adds _<speed-up-x>_<delay-down-x>_<delay-up-x>
RANDOM_SPECIFY you add <key>_<value> pairs, where key is the value you wish to change, and value is value you wish to assign to that key.

[RANDOM_CUSTOM_<min-x>_<max-x>_<speed-down-x>_<random-chance>_<random-scale>_<speed-up>_<delay-down>_<delay-up>]:
[RANDOM_SPECIFY_<min-x>_<max-x>_<speed-down-x>_<random-chance>_<random-scale>_+key-value-pairs-if-desired]:
Operate similarly to how X_CUSTOM does, with the extra parameters described above.

Example 1: [RANDOM_CUSTOM_20_70_80_50_30_60_10_15] will begin oscillating between simulating a mouse at 20% across the game window and 70% across the game window, with a 50/1000 = 5% chance (approximately 1 second on average) to update values to between 0.7 and 1.3 times the values you specified. it will begin by moving right at 80% of maximum speed, and will pause for 10 frames before moving back to the left at 60% of maximum speed, where it will wait for 15 frames before beginning again.
Every time that 5% chance occurs each of those values will be adjusted.
A full list of valid keys is available at the end of this file.

Example 2: [RANDOM_SPECIFY_20_70_80_50_30_dlydown_30] will use the same basis as in example one, but speed-up and delay-up were not specified so speed-up will duplicate speed-down, and delay-up will use the default 3 frames. Therefore she will move between 20-70% across the screen at 80% of maximum speed, pausing for 30 frames on the right end, and 3 frames on the left end. ~once per second it will choose a random value between 70-130% for each component and adjust it that far from your initial settings.

Ramping auto triggers:
The final two triggers are similar, but instead of a random chance, and random scaling, you select the amount you want each value to increase each interval, and how long you want that interval to be. These blocks have rather complex inputs, so be careful when using them.

[RAMP_CUSTOM_<min-x>_<max-x>_<speed-down-x>_<frames-between-increments>_<speed-up>_<delay-down>_<delay-up>_<min-increment>_<max-increment>_
<speed-down-increment>_<speed-up-increment>_<delay-down-increment>_<delay-up-increment>]:
[RAMP_SPECIFY_<min-x>_<max-x>_<speed-down-x>_<frames-between-increments>_<first-key>_<first-value>_+additional-key-value-pairs-if-desired]:
Operate as the RANDOM series does, so you will give the base command (CUSTOM or SIMPLE) and append the min, max, speed down, and increment interval to it. min/max/speed increments are in units 1/10 as large as the original values, the increment interval and delays are in frames.

If min becomes greater than max, their values and increments swap so they will begin getting farther apart again. Delays will not go below 1 frame, and speeds will not go below 1% of maximum.

These triggers are VERY large as there are many components you can specify. The result is that you append between 8 and 20 values to the base trigger. CUSTOM you specify every component in order for a total of 13 values, SPECIFY you give <key>_<value> pairs as in the random series, for between 8 and 22 values. Use CUSTOM to decrease the size of trigger if you want to specify all of them.

Example 1: [RAMP_CUSTOM_30_80_50_35_10_15_20_10_-10_50_20_2_-1] Will cause her to begin oscillating between 30-80% of maximum distance, going onto the penis at 50% of max speed, pausing for 15 frames, then moving back off at 10% of maximum speed and pausing for 20 frames before starting over. Every 35 frames the minimum will increase by 1%, the maximum will decrease by 1%, the speed down will increase by 5%, the speed up will increase by 2%, the delay before backing off will increase by 2 frames, and the speed before starting to move right again will decrease by 1 frame.

Example 2: [RAMP_SPECIFY_TIP_CENTER_10_50_dlydown_15_dlyup_20_dlydowninc_1_dlyupinc_-1_spdup_30_spddowninc_-20_spdupinc_30_maxinc_15] will begin oscillation between having her lips at the tip and at the center of the penis, going right at 10% of maximum speed, delaying 15 frames before going back off at 30% maximum speed, and then waiting 20 frames before starting to go right again. Every 50 frames, the maximum depth will increase by 1.5%, speed down will decrease by 2%, speed up will increase by 3%, delay down will increase by 1 frame, and delay up will decrease by 1 frame.

The only KNOWN issues are:
DialogueActions [AUTO_OFF] trigger does NOT turn off the custom triggers, it only returns control to mouse. If you reactivate auto mode by using a hotkey or the auto checkbox the custom setting will turn back on. Use another AUTO trigger or [STOP_CUSTOM] to deactivate a custom setting.

If in [AUTO_CUSTOM_SIMPLE] deep is set to CENTER the throat resistance setting may cause her to stop slightly short of the center if the penis is long enough, as it goes by mouse position at no resistance and the higher the resistance the farther you have to push to get her to throat it.

And finally: If moving her down quickly or on a very large penis within a frame or two of activating the mouse hold she will take the penis in her mouth before the signal that the mouse is being held is processed. Therefore you should put in a 1-2 character delay between setting mouse button to down and giving the movement command. This includes the MOVE_TO_BALLS command, if using a very large penis or high speed, use MOUSE_BUTTON_DOWN with a small delay afterward before triggering the move. Example:
move:"[MOUSE_BUTTON_down]ББ[MOVE_TO_BALLS_90]"

List of valid keys:
Keys valid for all key accepting functions:
MIN: Minimum x value to oscillate to.
MAX: Maximum x value to oscillate to.
SPDDOWN: Movement speed moving on to penis.
SPDUP: Movement speed backing off the penis.
DLYDOWN: Delay in frames before beginning to move off of penis.
DLYUP: Delay in frames before beginning to move back onto penis.

Keys valid for ramping and value_custom functions:
MININC: Amount to increase the minimum x value.
MAXINC: Amount to increase the maximum x value.
SPDUPINC: Amount to increment the speed backing off the penis.
SPDDOWNINC: Amount to increment the speed moving onto the penis.
DLYUPINC: Amount to increment the delay before starting to move onto the penis.
DLYDOWNINC: Amount to increment the delay before starting to back off of the penis.

All keys include a second version for changing Y values, just append Y to the key, i.e. SPDDOWNY to change the Y down speed.

Keys are NOT case-sensitive.

Advanced Notes:
These notes are for the more complicated functionality of the mod. You should probably understand the functionality outlined in Notes.txt before attempting to use the functionality described in this file.
These triggers/keys allow you to set up conditions, and if they are all filled, jump to a specific line in the dialogue. For example, you may wish to trigger a line ~6 seconds after a activation, with these functions you can do so. Lets say you have the following line:
Example with explanation:
go_deeper:"[RAMP_SPECIFY_0_20_50_30_maxinc_50]"

And you wish to stop increasing max one it reachs 70. Add tests to it as follows:

go_deeper:"[SET_TEST_0_max_70_ge][ACTIVE_TEST_0_on][RAMP_SPECIFY_0_20_50_30_maxinc_50][VALUE_CUSTOM_LINE_bottom-out_TEST_on]"
bottom-out:"[VALUE_CUSTOM_freqinc_1000000]"

Walking through these lines:
The first trigger sets test 0 to compare the current value of maxX to 70, and if maxX >= 70 return true.
The second trigger activates test 0.
The third trigger begins a ramp function, which start off moving between x = 0 and 20 at half of max speed. Every 30 frames maxX will increase by 5.
The fourth trigger uses the LINE keyword to set the line you wish to jump to as 'bottom-out', and then uses the TEST keyword to turn testing on.

At this point, each frame maxX will be checked to see if it is >= 70. If it returns true, then bottom-out will be called.
The trigger in bottom-out then sets the frequency at which X based increases occur to 1 per 1000000 frames, which is over 10 hours. Therefore maxX ceases to increment. (Note, even if you wait that long, the maximum value of count is 360000 after which it resets, so it still won't increment any more.)

You should be aware that when a call is made using a test based callback, it WILL interrupt and replace any dialogue that is already playing, so make sure you are not beginning the test until you are done with any previous dialogue you wish to play.

Extra triggers:
[VALUE_CUSTOM]:
Allows you to assign a single value as listed at the end of this file. Argument is a key value pair. Intended for use to modify a function that is already active, or to be followed by an ACTIVATE function. May be used to specify Y values that can not otherwise be specified, such as delayDownY, and randomChanceY. This is the only way to set up random/ramping Y values. Multiple values may be set in one trigger, the only limit is the number of values available to be set: 30. Yes, this means it can have SIXTY entries for the 30 key:value pairs, I do not expect anyone to actually use nearly that many, but the option is available.

Example 1: [VALUE_CUSTOM_MIN_30] will change the minimum x value to be 30% across the game window.

Example 2: [VALUE_CUSTOM_MIN_30_MINY_20_RANDCHANY_5] would set minimum x to 30%, minimum Y to 20% and chance for Y values to be adjusted randomly to 0.5%

In order to activate testing using TEST you must have at least one test set and already active, and LINE must have been set, LINE values may not contain an underscore "_", since the trigger reads an underscore as the separator between inputs.

[ACTIVATE_CUSTOM]:
Begins an auto function using current values for all settings, intended for use after a [VALUE_CUSTOM] call.
This WILL allow for a function that has set values for all x and y settings, that ramps, and is randomized off of those ramped values if you REALLY want customization.

[RANDOM_ACTIVATE_<random-chance>_<random-scale>]:
RANDOM_ACTIVATE uses the the current value of all parameters, intended to be used after one or more calls to [VALUE_CUSTOM].

[RAMP_ACTIVATE_<frames-between-increments>]:
RAMP_ACTIVATE uses the the current value of all parameters, intended to be used after one or more calls to [VALUE_CUSTOM].

[SET_TEST_<test-number>_<variable-key>_<test-value>_<comparison-operation>]:
Sets the given test (0-2) to compare the chosen variable (using the keys listed at the bottom of the notes) to the test value using the comparison operator. If a test is not active, then when checked it will return true. Case is only checked for the trigger, not the arguments.
All active tests must return true or the final result will be false.
Comparison values are:
g: Greater than.
ge: Greater than or equal to.
e: Equal to.
le: Less than or equal to.
l: Less than.

Example 1: [SET_TEST_1_MAX_50_le] will set test 1 to check if the current maximum x value is less than/equal to 50.
Example 2: [SET_TEST_0_COUNT_80_g] will set test 0 to check if it has been more than 80 frames since testing was activated.

If testing against COUNT, the timer does not begin until you have successfully activated testing using VALUE_CUSTOM_test_on.

[ACTIVE_TEST_<test-number>_<new-state>]:
Activates/Deactivates the selected test. test-number may be 0, 1, or 2. new-state must be 'on' or 'off', case does not matter for the arguments.
The test you wish to activate must have already been set using SET_TEST.

Example 1: [ACTIVE_TEST_0_on]: sets test 0 to active.
Example 2: [ACTIVE_TEST_1_off]: sets test 1 to inactive.

Advanced keys:
Keys valid only for the VALUE_CUSTOM function:
FREQINC: Number of frames between ramp increases.
RANDCHAN: Chance in units of 1/10 of 1% that the randomized update will occur.
RANDSCALE: Maximum percentage to scale entered values when randomized update occurs, may scale up or down by that percentage.
LINE: Line to jump to when conditions are fulfilled.
TEST: Sets testing on or off.

Keys valid only for SET_TEST function:
CURRENT: Tests against the last recorded X position.
COUNT: Tests against the number of frames since testing was activated.
To change the Y version of freqinc, randchan, randscale, or current, just append Y to the end of the key: randchany alters the random chance of y values changing.

I have added a semi-beta version of the final product. Download is in the file list, notes on changes/additions follow, all changes affect Advanced functionality only:
VALUE_CUSTOM:
Additionally, by placing a '+' behind the value, you may adjust the value by that amount instead of setting it to that amount. i.e. [VALUE_CUSTOM_max_+-5] will add -5 to maxX. So if maxX was 50, it will now be 45.

SET_TEST:
Format is now:
[SET_TEST_<test-number>_<variable-key>_<test-value>_<comparison-operation>_<(optional)adjustment-values>_<(optional)Maximum-number-of-adjustments>]

The optional values (both must be included if either is included) allow you to specify changes to be made when that test is true, and a number of times that adjustment can be made. The format for the values is the same as for VALUE_CUSTOM except ~ replaces _.

Example 3: [SET_TEST_1_MOVE_DOWN_max~+2~spddown~+3_5] will set test 1 to check if the she just reached her maximum depth, and if so will return true. The first 5 times it returns true it will also increase maxX by 2 and speedDownX by 3.

Keys valid only for SET_TEST function:
MOVE: Tests her current movement to see where she is in that movement. Returns one of 4 values:
1: If she just reached maxX that frame: "DOWN"
2: If she just reached minX that frame: "UP"
3: If she is moving towards maxX: "GODOWN"
4: If she is moving towards minX: "GOUP"
After the frame from 1 and 2, for the rest of the delay it will count as 3 and 4 respectively.

Individual updates:
Version 6.1:
Information:
This is my first Mod attempt. I believe I have most of the bugs worked out, but let me know if you find any.
This mod adds 20 dialogue triggers.

Changes by version:
v6.1: bug fix for value_custom + ramping, many extra configuration options from value_custom.

v6: overhauled code to be more stable/have more options. Too many changes to list indivually, new functions/inputs below.

v5: added trigger to automate breaking through initial resistance, allows you to specify speed she moves down, and speed she moves back up seperately.
Mainly added to handle very large penis sizes where the other auto functions won't keep her pulled off long enough for the animation to clear her mouth, so it will not decrease her resistance further leading to never getting a deepthroat.

v4.2:Fixed major problem preventing custom functions from operating.
Logic changed/simplified to be much more reliable in most cases for very fast/slow automations.

v4.1: The mouse release was not occurring after a hold to balls trigger was used followed by a normal trigger so until a base auto function or stop_custom was called, or the player pressed and released the mouse button she would not take it in her mouth again. This has been fixed and the other triggers will release the hold.

v4: Fixed issue with non-oral positions always trying to reset to get in the penis in her mouth, and added 3 more new triggers: [START_LICKING_<speed>], [PRESS_BALLS_<speed>], and [MOVE_TONGUE_<IN/OUT>.

v3.2: Fixed [STOP_CUSTOM] trigger, and allowed slower speeds for [POSITION_CUSTOM], also made it less likely that the fix from 3.1 would trigger when it should not due to built in movement from breathing during very slow movements.

v3.1: Fixed issue with "missing" as the penis passes her mouth, so she just went alongside it.

Mod triggers:
[INIT_RESISTANCE_<level>]:
Sets the initial resistance to value that replaces <level>

Example: [INIT_RESISTANCE_75] will set the initial resistance to 75.

[HOLD_CUSTOM]:
Locks him/her in position so no movement will occur until command is canceled with an AUTO
setting, or another CUSTOM command.

[STOP_CUSTOM]:
Cancels the current CUSTOM command.

[PAUSE_CUSTOM]:
Freezes the current custom automation.

[CONTINUE_CUSTOM]:
Unfreezes the current custom animation, picking up exactly where it left off when pasue_animation was used.

[MOUSE_BUTTON_<position>]:
Simulates holding/releasing the left mouse button, position = down holds down, up releases, position is not case-sensitive. This allows for the dialogue writer to pull her up/down or move her alongside the penis.

[MOVE_TO_BALLS_<speed>]:
Moves her down to his balls. Speed argument specifies how fast she moves to his balls, if above ~60 or on very large penises may not activate mouse hold quickly enough. To insure it works properly, recommend using MOUSE_BUTTON_DOWN first.

[MOVE_TONGUE]:
Toggles tongue on or off, if the argument is either 'in', the tongue will be toggled off, if the srgument is 'out' otherwise it will be toggled on, the argument is not case-sensitive.

[VALUE_CUSTOM]:
Allows you to assign a single value as listed at the end of this file. Argument is a key value pair. Intended for use to modify a function that is already active, or to be followed by an ACTIVATE function.
May be used to specify Y values that can not otherwise be specified, such as delayDownY, and randomChanceY. This is the only way to set up random/ramping Y values.
Multiple values may be set in one trigger, the only limit is the number of values available to be set: 30. Yes, this means it can have SIXTY entries for the 30 key:value pairs, I do not expect anyone to actually use nearly that many though, but the option is available.

Example 1: [VALUE_CUSTOM_MIN_30] will change the minimum x value to be 30% across the game window.

Example 2: [VALUE_CUSTOM_MIN_30_MINY_20_RANDCHANY_5] would set minimum x to 30%, minimum Y to 20% and chance for Y values to be adjusted randomly to 0.5%

[ACTIVATE_CUSTOM]:
Begins an auto function using current values for all settings, intended for use after a [VALUE_CUSTOM] call.
This WILL allow for a function that has set values for all x and y settings, that ramps, and is randomized off of those ramped values if you REALLY want customization.

[INIT_RESIST_BREAK_<speed-going-down>_<(optional)speed-going-up>]:
Moves her up and down his penis with slight pauses (4 frames, or about 0.15 seconds) to allow animation to catch up. This allows her to clear his penis even at very high speeds so initial resistance will continue to degrade allowing an eventual deep throat. With the other custom triggers, at high speeds the animation would not catch up to the position fast enough, so she would begin going back down before she actually came off the penis. When pulling her off, it stops with a small (10-15 pixel) gap between her lips and the tip of the penis.

Example:
[INIT_RESIST_BREAK_100_20] would force her all the way down at 100% of max speed, then pull her back off at 20% speed.

For the following triggers, all values should be between 0 and 100. All x/y coordinates are percentages of maximum value, they represent mouse positions when auto is off. so x = 30 represents the mouse being placed 30% of the way across the screen from left to right. X coordinates can be replaced with words that will calculate the appropriate position automatically, these are:
'off': sets position to 0%.
'tip': places her lips near the tip of the penis.
'head':places her lips at the base of the head of the penis.
'center': attempts to place her lips at the center of the penis, value is calculated from initial resistance broken and no throat resist.
'hilt': attempts to place her all the way down the penis. Again, affected by current resistances.

To overcome initial resistance the penis MUST actually exit her mouth before pressing back in.

[X_CUSTOM_<min-x-coordinate>_<max-x-coordinate>_<x-speed-down>_<(optional)x-speed-up>)_<(optional)x-delay-down>_<(optional)x-delay-up>]:
Sets up a custom automation with default y values, only specify x values. Optional triggers have default values if unspecified, but you cannot skip them. So to do x-delay-down you MUST specify x-speed-up first. if speed/delay up are not set, they default to the value set for the down version. Delay down defaults to 3 frames.

Example 1: [X_CUSTOM_20_50_40] will move between a simulated mouse at 20%, and 50% and back at 40% of the maximum speed, at each end point it will stay for 3 frames before reversing directions.

Example 2: [X_CUSTOM_20_50_40_70_15] will move from a simulated mouse at 20%, over to 50% at 40% of max speed, it will then stay there for 15 frames before moving back from 50% to 20% at 70% of maximum speed where it will stay for another 15 frames before beginning again.

Example 3: [X_CUSTOM_tip_center_40_70_15_20] will move her lips from the tip of the penis to the center of the penis at 40% of max speed, it will then stay there for 15 frames before moving back from the center to the tip at 70% of maximum speed where it will stay for 20 frames before beginning again.

[FULL_CUSTOM_<min-x-coordinate>_<max-x-coordinate>_<x-speed-down>_<min-y-coordinate>_<max-y-coordinate>_<y-speed-down>_<(optional)x-speed-up>_<(optional)y-speed-up>_<(optional)x-delay-down>_<(optional)x-delay-up>]:
Same as previous except y values are also specified, y delays are not currently adjustable due to lack of visibility and size of trigger result.

[POSITION_CUSTOM_<x-coordinate>_<y-coordinate>_<speed>]:
This trigger works much the same as the FULL and X triggers, but it smoothly transitions to the
specified point and stays there until another command, such as [AUTO_HARD] or [X_CUSTOM] is given.

Example: [POSITION_CUSTOM_tip_80_40] would cause her to move her lips to the tip of his penis, with the mouse simulated at 80% of the way down the screen. This movement will be at 40% of the maximum speed.

The next three triggers act the same, and have the same initial parameters as the X_CUSTOM triggers, but more parameters are added to each:
First is the random chance, this is the chance that it will update the current min/max, speed up/down, and delay up/down of the animation. The chance is equal to this parameter/1000 and can range from 0-1000. It is HIGHLY recommended that you stay under 100, as that would average out to a new set of values every 10 frames or ~.33 seconds.

The second new parameter is the range you want the random adjustments to occur in, i.e. if this parameter is 30, all parameters will be between 70% and 130% of the original value. For delay this is rounded off as delays are measured in frames. For min/max, the change is calculated from the average of the two, and then added to the original value i.e. if min = 20 and max = 50 with a random scale of 0.2, to update min, we take average min/max = 35 * 0.2 = 7, min + 7 = 27 so now it would be 27-50. The same would be done for max.

Each item has the scale calculated individually so if the given scale is 20% (parameter = 20) each would be multiplied by 0.8-1.2. One may be multiplied by 1.15 while another might get 0.83, they are independent of each other.

Note: Every time the values are updated, the values are taken from the GIVEN parameters not the current ones. So it will NOT stack as time goes on, these blocks have rather complex inputs, so be careful when using them.

RANDOM_CUSTOM requires you to specify EVERY value, while RANDOM_SPECIFY require min/max, speedDown, randomChance, and randomScale, then choose which additional components you wish to change. both start with TRIGGER_<min-x>_<max-x>_<speed-down-x>_<random-chance>_<random-scale>
RANDOM_CUSTOM then adds _<speed-up-x>_<delay-down-x>_<delay-up-x>
RANDOM_SPECIFY you add <key>_<value> pairs, where key is the value you wish to change, and value is value you wish to assign to that key.

[RANDOM_CUSTOM_<min-x>_<max-x>_<speed-down-x>_<random-chance>_<random-scale>_<speed-up>_<delay-down>_<delay-up>]:
[RANDOM_SPECIFY_<min-x>_<max-x>_<speed-down-x>_<random-chance>_<random-scale>_+key-value-pairs-if-desired]:
[RANDOM_ACTIVATE_<random-chance>_<random-scale>]:
Operate similarly to how X_CUSTOM does, with the extra parameters described above.
RANDOM_ACTIVATE uses the the current value of all parameters, intended to be used after one or more calls to [VALUE_CUSTOM].

Example 1: [RANDOM_CUSTOM_20_70_80_50_30_60_10_15] will begin oscillating between simulating a mouse at 20% across the game window and 70% across the game window, with a 50/1000 = 5% chance (approximately 1 second on average) to update values to between 0.7 and 1.3 times the values you specified. it will begin by moving right at 80% of maximum speed, and will pause for 10 frames before moving back to the left at 60% of maximum speed, where it will wait for 15 frames before beginning again.
Every time that 5% chance occurs each of those values will be adjusted.
A full list of valid keys is available at the end of this file.

Example 2: [RANDOM_SPECIFY_20_70_80_50_30_dlydown_30] will use the same basis as in example one, but speed-up and delay-up were not specified so speed-up will duplicate speed-down, and delay-up will use the default 3 frames. Therefore she will move between 20-70% across the screen at 80% of maximum speed, pausing for 30 frames on the right end, and 3 frames on the left end. ~once per second it will choose a random value between 70-130% for each component and adjust it that far from your initial settings.

The final three triggers are similar, but instead of a random chance, and random scaling, you select the amount you want each value to increase each interval, and how long you want that interval to be. These blocks have rather complex inputs, so be careful when using them.

[RAMP_CUSTOM_<min-x>_<max-x>_<speed-down-x>_<frames-between-increments>_<speed-up>_<delay-down>_<delay-up>_<min-increment>_<max-increment>_
<speed-down-increment>_<speed-up-increment>_<delay-down-increment>_<delay-up-increment>]:
[RAMP_SPECIFY_<min-x>_<max-x>_<speed-down-x>_<frames-between-increments>_<first-key>_<first-value>_+additional-key-value-pairs-if-desired]:
[RAMP_ACTIVATE_<frames-between-increments>]:
Operate as the RANDOM series does, so you will give the base command (CUSTOM or SIMPLE) and append the min, max, speed down, and increment interval to it. min/max/speed increments are in units 1/10 as large as the original values, the increment interval and delays are in frames.

If min becomes greater than max, their values and increments swap so they will begin getting farther apart again. Delays will not go below 1 frame, and speeds will not go below 1% of maximum.

These triggers are VERY large as there are many components you can specify. The result is that you append between 8 and 20 values to the base trigger. CUSTOM you specify every component in order for a total of 13 values, SPECIFY you give <key>_<value> pairs as in the random series, for between 8 and 22 values. Use CUSTOM to decrease the size of trigger if you want to specify all of them.

RAMP_ACTIVATE uses the the current value of all parameters, intended to be used after one or more calls to [VALUE_CUSTOM].

Example 1: [RAMP_CUSTOM_30_80_50_35_10_15_20_10_-10_50_20_2_-1] Will cause her to begin oscillating between 30-80% of maximum distance, going onto the penis at 50% of max speed, pausing for 15 frames, then moving back off at 10% of maximum speed and pausing for 20 frames before starting over. Every 35 frames the minimum will increase by 1%, the maximum will decrease by 1%, the speed down will increase by 5%, the speed up will increase by 2%, the delay before backing off will increase by 2 frames, and the speed before starting to move right again will decrease by 1 frame.

Example 2: [RAMP_SPECIFY_TIP_CENTER_10_50_dlydown_15_dlyup_20_dlydowninc_1_dlyupinc_-1_spdup_30_spddowninc_-20_spdupinc_30_maxinc_15] will begin oscillation between having her lips at the tip and at the center of the penis, going right at 10% of maximum speed, delaying 15 frames before going back off at 30% maximum speed, and then waiting 20 frames before starting to go right again. Every 50 frames, the maximum depth will increase by 1.5%, speed down will decrease by 2%, speed up will increase by 3%, delay down will increase by 1 frame, and delay up will decrease by 1 frame.

The only KNOWN issues are:
DialogueActions [AUTO_OFF] trigger does NOT turn off the custom triggers, it only returns control to mouse. If you reactivate auto mode by using a hotkey or the auto checkbox the custom setting will turn back on. Use another AUTO trigger or [STOP_CUSTOM] to deactivate a custom setting.

If in [AUTO_CUSTOM_SIMPLE] deep is set to CENTER the throat resistance setting may cause her to stop slightly short of the center if the penis is long enough, as it goes by mouse position at no resistance and the higher the resistance the farther you have to push to get her to throat it.

If a ramping action runs for more than 3.5 hours, there will be one extra increment for each ~3.5 hours it runs (VERY unlikely to be a problem, as this resets anytime an auto command other than pause/continue is issued, not to mention it is unlikely that you are not at the maximum for that item by that time.)

And finally: If moving her down quickly or on a very large penis within a frame or two of activating the mouse hold she will take the penis in her mouth before the signal that the mouse is being held is processed. Therefore you should put in a 1-2 character delay between setting mouse button to down and giving the movement command. This includes the MOVE_TO_BALLS command, if using a very large penis or high speed, use MOUSE_BUTTON_DOWN with a small delay afterward before triggering the move. Example:
move:"[MOUSE_BUTTON_down]ББ[MOVE_TO_BALLS_90]"

List of valid keys:
MIN: Minimum x value to oscillate to.
MAX: Maximum x value to oscillate to.
SPDDOWN: Movement speed moving on to penis.
SPDUP: Movement speed backing off the penis.
DLYDOWN: Delay in frames before beginning to move off of penis.
DLYUP: Delay in frames before beginning to move back onto penis.
MININC: Amount to increase the minimum x value.
MAXINC: Amount to increase the maximum x value.
SPDUPINC: Amount to increment the speed backing off the penis.
SPDDOWNINC: Amount to increment the speed moving onto the penis.
DLYUPINC: Amount to increment the delay before starting to move onto the penis.
DLYDOWNINC: Amount to increment the delay before starting to back off of the penis.
FREQINC: Number of frames between ramp increases.
RANDCHAN: Chance in units of 1/10 of 1% that the randomized update will occur.
RANDSCALE: Maximum percentage to scale entered values when randomized update occurs, may scale up or down by that percentage.

All keys include a second version for changing Y values, just append Y to the key, i.e. SPDDOWNY to change the Y down speed.

Keys are NOT case-sensitive.
Link:

Version 5.0:
Information:
This is my first Mod attempt. I believe I have most of the bugs worked out, but let me know if you find any.
This mod adds 18 dialogue triggers.

[INIT_RESISTANCE_<level>]:
Sets the initial resistance to value that replaces <level>

Example: [INIT_RESISTANCE_75] will set the initial resistance to 75.

[HOLD_CUSTOM]:
Locks him/her in position so no movement will occur until command is canceled with an AUTO
setting, or another CUSTOM command.

[STOP_CUSTOM]:
Cancels the current CUSTOM command.

[PAUSE_CUSTOM]:
Freezes the current custom automation.

[CONTINUE_CUSTOM]:
Unfreezes the current custom animation, picking up exactly where it left off when pause_animation was used.

[START_LICKING_<speed>]:
Moves her down to his balls and causes her to begin licking them. Speed argument specifies how fast she moves to his balls. i.e START_LICKING_20
Speeds work the same as in the other triggers.

If the tongue is not already out when this command is called, give it about 2 seconds to move tongue out before you expect her to actually start licking.

[PRESS_BALLS_<speed>]:
Same as START_LICKING but will NOT lick.

[MOVE_TONGUE]:
Toggles tongue on or off, if the argument is either 'IN' or 'in', the tongue will be toggled off, otherwise it will be toggled on.

[INIT_RESIST_BREAK_<speed-going-down>_<speed-going-up>]:
Moves her up and down his penis with slight pauses (5 frames, or about .16-.2 seconds) to allow animation to catch up. This allows her to clear his penis even at very high speeds so initial resistance will continue to degrade allowing an eventual deep throat. With the other custom triggers, at high speeds the animation would not catch up to the position fast enough, so she would begin going back down before she actually came off the penis. When pulling her off, it stops with a small (10-15 pixel) gap between her lips and the tip of the penis.

Example:
[INIT_RESIST_BREAK_100_20] would force her all the way down at 100% of max speed, then pull her back off at 20% speed.

Details on basic automation triggers:
For the following triggers, all values should be between 0 and 100. If target coordinate +- magnitude is outside of this range, then a portion of the sin wave will hold her still. Target coordinate sets the mid-point of the sin wave, magnitude determines how far from the center point it moves, and speed determines how fast the sin wave shifts. if magnitude is less than 100, you can increase the speed to keep the animation from slowing down, at a magnitude of 100, max speed is ~ 100, at magnitude 50, max speed is ~ 200. Speed variable is capped at 200 to prevent problems with the synchronization of her animation and the current requested position.

To overcome initial resistance the penis MUST actually exit her mouth before pressing back in.

[POSITION_CUSTOM_<target_x_coordinate>_<target_y_coordinate>_<speed>]:
This trigger works much the same as the FULL and X triggers, but it smoothly transitions to the specified point and stays there until another command, such as [AUTO_HARD] or AUTO_CUSTOM_FULL] is given. You can also use the position labels from the _SIMPLE set in place of an x coordinate, in which case the y coordinate will be ignored (It must still be present however.)

Example: [POSITION_CUSTOM_50_75_40] would cause her to transition to the point she would be at if the mouse was halfway across the screen, and 3/4ths of the way down the screen at 3/4ths of the maximum speed.

Example 2: [POSITION_CUSTOM_HEAD_75_40] would cause her to move towards the head of the penis until just the head was in her mouth. This would occur at 40% of the maximum speed, and the 75 will not be used.

[AUTO_CUSTOM_X_<target x coordinate>_<x magnitude>_<x speed>]:
Sets up a custom automation with default y values, only specify x values.

Example: [AUTO_CUSTOM_X_100_70_40] Will move between a simulated mouse at 30% of the screen, and 100% and back every (4/40) * 2PI/(180*PI) = ~36 frames. Since 100 is the max, time spent higher than 100 will hold still with the penis fully down her throat. So half the time will be spent pulling out and shoving back in, and the other half will be just held down.

[AUTO_CUSTOM_FULL_<target x coordinate>_<x magnitude>_<x speed>_<target y coordinate>_<y magnitude>_<y speed>]:
Same as previous except y values are also specified.

[AUTO_CUSTOM_SIMPLE_<shallow_position>_<deep_position>_<speed>]:
This trigger causes her to oscillate between the shallow and deep position specified, at the given speed.
The available options for shallow are: OFF (fully left), TIP (lips just touching head of penis), HEAD (mouth just covering the head of the penis), and CENTER (mid-point of the penis.)
Available options for deep are: TIP, HEAD, CENTER, and HILT (all the way down for full deepthroat.)

Example: [AUTO_CUSTOM_SIMPLE_HEAD_HILT_40] would cause her to oscillate between having just the head in her mouth, and pressed all the way down over the course of ~36 frames.

Details on the next three triggers:
The next three triggers act the same, and have almost the same parameters as the AUTO_CUSTOM triggers, but two more parameters are added to each:
First is the random chance, this is the chance that it will update the current target point, magnitude, and speed of the animation. The chance is equal to this parameter/1000 and can range from 0-1000. It is HIGHLY recommended that you stay under 100, as that would average out to a new set of values every 10 frames or ~.33 seconds.
The second new parameter is the range you want the random adjustments to occur in, i.e. if this parameter is 30, target, magnitude, and speed will be between 70% and 130% of the original value.
Note: Every time the values are updated, the values are taken from the GIVEN parameters not the current ones. So it will NOT stack as time goes on.

[AUTO_CUSTOM_RANDOM_FULL]:
[AUTO_CUSTOM_RANDOM_X]:
[AUTO_CUSTOM_RANDOM_SIMPLE]:
Operate as the AUTO_CUSTOM series do, with the two extra parameters described above.
Example: [AUTO_CUSTOM_RANDOM_X_50_20_80_10_30] will begin oscillating between simulating a mouse at 50% across the screen, with a 20% of screen movement leading to 30% and 70% across the game window at 80% of the maximum speed, with a 10/1000 = 1% chance (approximately 3-5 seconds on average) to update values.
When this 1% chance occurs, the resulting values will be:
Target center position between .7*.5 = 35% and 1.3*.5 = 65% across the screen,
Oscillation distance between 0.2*0.7 = 14% and 0.2*1.3 = 26% of the possible movement range
Speed will be between 0.8*0.7 = 56% and 0.8*1.3 = 104% --> 100% of maximum speed.

Details on the final three triggers:
The final three triggers are similar, but instead of a random chance, and random scaling, you select the amount you want each value to increase each interval, and how long you want that interval to be. These blocks have rather complex inputs, so be careful when using them.

[AUTO_CUSTOM_RAMP_FULL]:
[AUTO_CUSTOM_RAMP_X]:
[AUTO_CUSTOM_RAMP_SIMPLE]:
Operate as the AUTO_CUSTOM series does, so you will give the base command (full, x, or simple) and append the shift in target_x, magnitude_x, speed_x, and increment interval to it. target and magnitude increments are in units 1/10 as large as the original values, speed is 1/4, and the increment interval is in frames.
Example: [AUTO_CUSTOM_RAMP_X_30_40_50_5_10_15_20] Will function like [AUTO_CUSTOM_X_50_20_80] except that every 20 frames, the target x position will move right 0.5 units, the magnitude will increase by one unit, and speed will increase by 20/4 = 5.

Current known issues (unlikely to be corrected anytime soon)
DialogueActions [AUTO_OFF] trigger does NOT turn off the custom triggers, it only returns control to mouse. If you reactivate auto mode by using a hotkey or the auto checkbox the custom setting will turn back on. Use another AUTO trigger or [STOP_CUSTOM] to deactivate a custom setting.

If in [AUTO_CUSTOM_SIMPLE] deep is set to CENTER the throat resistance setting may cause her to stop slightly short of the center if the penis is long enough, as it goes by mouse position at no resistance and the higher the resistance the farther you have to push to get her to throat it.

If a ramping action runs for more than 3.5 hours, there will be one extra increment for each ~3.5 hours it runs (VERY unlikely to be a problem, as this resets anytime an auto command other than pause/continue is issued, not to mention it is unlikely that you are not at the maximum for that item by that time.)
Link:

Version 4.x:
Information:
4.2: Fixed major problem preventing custom functions from operating.
Logic changed/simplified to be much more reliable in most cases for very fast/slow automations.

4.1: The mouse release was not occurring after a hold to balls trigger was used followed by a normal trigger so until a base auto function or stop_custom was called, or the player pressed and released the mouse button she would not take it in her mouth again. This has been fixed and the other triggers will release the hold.
I am not leaving a link to 4.1 as it has mod breaking bugs in it, sorry for the trouble there.

4.0: Fixed issue with non-oral positions always trying to reset to get in the penis in her mouth, and added 3 more new triggers: [START_LICKING_<speed>], [PRESS_BALLS_<speed>], and [MOVE_TONGUE_<IN/OUT>.

New triggers:
[START_LICKING_<speed>]:
Moves her down to his balls and causes her to begin licking them. Speed argument specifies how fast she moves to his balls.

[PRESS_BALLS_<speed>]:
Same as START_LICKING but will NOT lick.

[MOVE_TONGUE]:
Toggles tongue on or off, if the argument is either 'IN' or 'in', the tongue will be toggled off, otherwise it will be toggled on.
Link to 4.2:

Version 3.2:
Information:
This version fixes [STOP_CUSTOM] trigger, and allows slower speeds for [POSITION_CUSTOM], also made it less likely that the fix from 3.1 will trigger when it should not due to built in movement from breathing during very slow movements. Will now handle speeds as low as 0.1.
Lower values MAY work, but you will have trouble seeing such slow movement and (unlikely) MAY cause issues with one of the correction functions.
Link:

Version 3.1:
Fixes problem with her mouth "missing" the penis and traveling alongside it instead, instead of moving back to try again.
MEGA

Version 3:
Information:
Fixed bug with POSITION_CUSTOM that could cause problems when switching from a member of the random set.
Also added the capability to use the position labels from the SIMPLE set in place of the x coordinate in the POSITION_CUSTOM trigger i.e. "TIP", "CENTER" etc.

Details on the three added triggers:
These three triggers are similar, but instead of a random chance, and random scaling, you select the amount you want each value to increase each interval, and how long you want that interval to be. These blocks have rather complex inputs, so be careful when using them.

[AUTO_CUSTOM_RAMP_FULL]:
[AUTO_CUSTOM_RAMP_X]:
[AUTO_CUSTOM_RAMP_SIMPLE]:
Operate as the AUTO_CUSTOM series does, so you will give the base command (full, x, or simple) and append the shift in target_x, magnitude_x, speed_x, and increment interval to it. target and magnitude increments are in units 1/10 as large as the original values, speed is 1/4, and the increment interval is in frames.
Example: [AUTO_CUSTOM_RAMP_X_30_40_50_5_10_15_20] Will function like [AUTO_CUSTOM_X_50_20_80] except that every 20 frames, the target x position will move right 0.5 units, the magnitude will increase by one unit, and speed will increase by 20/4 = 5.

Current known issues (unlikely to be corrected anytime soon)
DialogueActions [AUTO_OFF] trigger does NOT turn off the custom triggers, it only returns control to mouse. If you reactivate auto mode by using a hotkey or the auto checkbox the custom setting will turn back on. Use another AUTO trigger or [STOP_CUSTOM] to deactivate a custom setting.

If in [AUTO_CUSTOM_SIMPLE] deep is set to CENTER the throat resistance setting may cause her to stop slightly short of the center if the penis is long enough, as it goes by mouse position at no resistance and the higher the resistance the farther you have to push to get her to throat it.

If a ramping action runs for more than 3.5 hours, there will be one extra increment for each ~3.5 hours it runs (VERY unlikely to be a problem, as this resets anytime an auto command other than pause/continue is issued, not to mention it is unlikely that you are not at the maximum for that item by that time.)
Link:

Version 2 post:
Information:
Added a new version of the mod. Added 5 new triggers, and fixed a bug in custom_full and custom_x that kept the speed VERY low.

List of new additions:
[PAUSE_CUSTOM]:
Freezes the current custom automation.

[CONTINUE_CUSTOM]:
Unfreezes the current custom animation, picking up exactly where it left off when pasue_animation was used.

Details you should know about the last three triggers:
The final three triggers act the same, and have almost the same parameters as the AUTO_CUSTOM triggers, but two more parameters are added to each:
First is the random chance, this is the chance that it will update the current target point, magnitude, and speed of the animation. The chance is equal to this parameter/1000 and can range from 0-1000. It is HIGHLY recommended that you stay under 100, as that would average out to a new set of values every 10 frames or ~.33 seconds.
The second new parameter is the range you want the random adjustments to occur in, i.e. if this parameter is 30, target, magnitude, and speed will be between 70% and 130% of the original value.
Note: Every time the values are updated, the values are taken from the GIVEN parameters not the current ones. So it will NOT stack as time goes on.

[AUTO_CUSTOM_RANDOM_FULL]:
[AUTO_CUSTOM_RANDOM_X]:
[AUTO_CUSTOM_RANDOM_SIMPLE]:
Operate as the AUTO_CUSTOM series do, with the two extra parameters described above.
Example: [AUTO_CUSTOM_RANDOM_X_50_20_80_10_30] will begin oscillating between simulating a mouse at 50% across the screen, with a 20% of screen movement leading to 30% and 70% across the game window at 80% of the maximum speed, with a 10/1000 = 1% chance (approximately 3-5 seconds on average) to update values.
When this 1% chance occurs, the resulting values will be:
Target center position between .7*.5 = 35% and 1.3*.5 = 65% across the screen,
Oscillation distance between 0.2*0.7 = 14% and 0.2*1.3 = 26% of the possible movement range
Speed will be between 0.8*0.7 = 56% and 0.8*1.3 = 104% --> 100% of maximum speed.
Link:

Version 1 post:
Information:
Here is the first decent version of the mod, I am calling it version 1.

This mod gives extra trigger to allow dialogue writers more control over actions, there are currently 7 triggers added by this mod, some of which are VERY powerful for automation.

The full list:
[INIT_RESISTANCE_<level>]:
Sets the initial resistance to value that replaces <level>

Example: [INIT_RESISTANCE_75] will set the initial resistance to 75.

[HOLD_CUSTOM]:
Locks him/her in position so no movement will occur until command is canceled with an AUTO setting, or another CUSTOM command.

[STOP_CUSTOM]:
Cancels the current CUSTOM command.
For the following triggers, all values should be between 0 and 100. If target coordinate +- magnitude is outside of this range, then a portion of the sin wave will hold her still. Target coordinate sets the mid-point of the sin wave, magnitude determines how far from the center point it moves, and speed determines how fast the sin wave shifts.

To overcome initial resistance the penis MUST actually exit her mouth before pressing back in.

[AUTO_CUSTOM_X_<target x coordinate>_<x magnitude>_<x speed>]:
Sets up a custom automation with default y values, only specify x values.

Example: [AUTO_CUSTOM_X_100_70_40] Will move between a simulated mouse at 30% of the screen, and 100% and back every (4/40) * 2PI/(180*PI) = ~36 frames. Since 100 is the max, time spent higher than 100 will hold still with the penis fully down her throat. So half the time will be spent pulling out and shoving back in, and the other half will be just held down.

[AUTO_CUSTOM_FULL_<target x coordinate>_<x magnitude>_<x speed>_<target y coordinate>_<y magnitude>_<y speed>]:
Same as previous except y values are also specified.

[POSITION_CUSTOM_<target_x_coordinate>_<target_y_coordinate>_<speed>]:
This trigger works much the same as the FULL and X triggers, but it smoothly transitions to the specified point and stays there until another command, such as [AUTO_HARD] or [AUTO_CUSTOM_FULL] is given.

Example: [POSITION_CUSTOM_50_75_40] would cause her to transition to the point she would be at if the mouse was halfway across the screen, and 3/4ths pr the way down the screen over ~36 frames.

[AUTO_CUSTOM_SIMPLE_<shallow_position>_<deep_position>_<speed>]:
This trigger causes her to oscillate between the shallow and deep position specified, at the given speed.
The available options for shallow are: OFF (fully left), TIP (lips just touching head of penis), HEAD (mouth just covering the head of the penis), and CENTER (mid-point of the penis.)
Available options for deep are: TIP, HEAD, CENTER, and HILT (all the way down for full deepthroat.)

Example: [AUTO_CUSTOM_SIMPLE_HEAD_HILT_40] would cause her to oscillate between having just the head in her mouth, and pressed all the way down over the course of ~36 frames.

The only KNOWN issues are:
DialogueActions [AUTO_OFF] trigger does NOT turn off the custom triggers, it only returns control to mouse. If you reactivate auto mode by using a hotkey or the auto checkbox the custom setting will turn back on. Use another AUTO trigger or [STOP_CUSTOM] to deactivate a custom setting.

If in [AUTO_CUSTOM_SIMPLE] deep is set to CENTER the throat resistance setting may cause her to stop slightly short of the center if the penis is long enough, as it goes by mouse position at no resistance and the higher the resistance the farther you have to push to get her to throat it.

Speed is having some issues for higher values, once I solve this problem I will make speed scale about 2-2.5 times faster as it increases from 0-100.
Link:

Version 0.5 post:
Information:
This is my first Mod attempt. I believe I have most of the bugs worked out, but let me know if you find any.
This mod adds 5 dialogue triggers, and requires DialogueActions + Loader.
[INIT_RESISTANCE_<level>]
Sets the initial resistance to value that raplaces <level>
Example: [INIT_RESISTANCE_75] will set the initial resistance to 75.

[HOLD_CUSTOM]
Locks him/her in position so no movement will occur until command is canceled with an AUTO setting, or another CUSTOM command.

[STOP_CUSTOM]
Cancels the current CUSTOM command.

Detailed information for using the last two triggers:
For the following triggers, the left most value is -30, right most position is ~120. Further right will increase force somewhat but effect will mainly be staying pressed all the way down for a larger percentage of the sin wave. Target coordinate sets the mid-point of the sin wave, magnitude determines how far from the center point it moves, and speed determines how fast the sin wave shifts.

Speeds above 100 have issues due to rounding errors, some end points may be missed. Hard capped at 200.
To overcome initial resistance the penis MUST actually exit her mouth before pressing back in. The faster the speed, the further out it must be set to oscillate due to the rounding errors mentioned above.

[AUTO_CUSTOM_X_<target x coordinate>_<x magnitude>_<x speed>]
Sets up a custom automation with default y values, only specify x values.
Example: [AUTO_CUSTOM_X_100_70_40] Will move between x = 30 and x = 170 and back
every 2PI/(40 / 200)) = ~31 frames.

[AUTO_CUSTOM_FULL_<target x coordinate>_<x magnitude>_<x speed>_<target y coordinate>_<y magnitude>_<y speed>]
Same as previous except y values are also specified. I am unsure at what y-values the game begins having issues.
For now I have hard-coded 0 < target y < 2, 0 < magnitude y < 2, -1 < target y +/- magnitude y < 3,
0 < speed y < 1.5

The only KNOWN issues are:
DialogueActions [AUTO_OFF] trigger does NOT turn off the custom triggers, it only returns control to mouse. If you reactivate auto mode by using a hotkey or the auto checkbox the custom setting will turn back on. Use another AUTO trigger or [STOP_CUSTOM] to deactivate a custom setting.

DialogueActions MUST be loaded before this mod, otherwise the trigger registration will throw an error.
If anyone knows how the APINotify function should be used to fix this, feel free to let me know and I will fix it.

These automations have NO randomness, they are pure sin waves. I am considering adding an extra pair of triggers that add SOME randomness to the functions but that will be sometime in the future.

In the next few days I will probably try to add several triggers with preset values that can be used without figuring out exact values for yourself. Settings such as slow, medium, or fast hilt to near tip (assuming "normal" penis size. I MAY be able to set it to change based off that size, I will have to look in to it.) Or slow, medium, fast bobbing near tip etc. It would probably wind up with another 12-18 triggers for different setups. I have to take a test in a couple days, so it will probably be after that.
File Link:

If you have a similar feature that you would like me to add to this mod, please let me know below. I will not guarantee I will work on it, but if it is reasonably simple to add (and fits with the rest of the mod, i.e. I am not going to add new body/hair types, sounds, positions etc) I may give it a shot. If I decide against it, I will give you a reply stating that I will not be adding it.

If anyone wants to add to this mod themselves, feel free. I included the source code in the zip file.
Since I was starting to get several versions up, I moved them over to mega upload. Links to each version are available in that versions section of the post. From now on, I will only keep the newest version loaded to the attachments section of the post.

I have included a demo dialogue with appropriate position files below.
The showhim_partial file should be present in the animtool15 positions that came with that mod.

This is obviously just a quick demo of a few of the more complex functions. It shows off value_custom, position_custom, set_test, active_test, and x_custom

Most of the remaining triggers are either much simpler (init_resistance) or very similar (random_custom)

I will probably add one more comparison criteria for the testing section of the mod later, which is testing whether the auto-function is going towards min value or x value.
 

Attachments

CustomAutomationV7.zip
24.5 KB · Views: 932

Custom Auto Demo.txt
13.6 KB · Views: 649

Standing.txt
3.7 KB · Views: 753

Missionary_bed.txt
3.8 KB · Views: 860

CustomAutomationV7.1.zip
26.7 KB · Views: 893

Last edited:

colin

Content Creator
Joined
Apr 11, 2016
Ok, as of now I think this has all of the features I originally planned on. So please let me know if you find any issues I need to take care of, otherwise I think this will pretty much be it for this mod. As above, if you think of any important factors I may have missed in a mod of this nature, let me know, and if it is not TOO much work, I will try to get it in.

Let me know what you think, this is the first time I have programmed anything for others to use outside of a class assignment.
 
Last edited:

colin

Content Creator
Joined
Apr 11, 2016
Well, I guess I was wrong about being finished since I noticed a bug in the POSITION_CUSTOM logic, added the ability to use the terms from the simple category for position ("TIP", "CENTER", etc.) and added 3 new triggers to allow position, magnitude and speed to ramp up/down over time.

HOPEFULLY this really will be the last version, lol.
 

colin

Content Creator
Joined
Apr 11, 2016
I have found that there is a small chance that when she moves to the penis, if the size is set very high she will go along it instead of taking it in. This is only a problem when the parameters of the trigger do not pull her back far enough to try again. In this case the user would have to turn auto off, pull her back and turn auto on again. Obviously the same can happen when she is coughing/swallowing/otherwise cannot take it in her mouth.

I am still trying to find a good way to determine when this has occurred so it can fix it. I know a way to do it, but it is a bit hackish, so I am trying for a better method. If anyone knows a simple way to tell when she is passed the penis, let me know and I will use that to fix the problem.

Edit: To clarify what I meant about the method I currently can implement, it involves a straight comparison that will result in not triggering until a large portion of the Penis has already gone by, likely around 1/3rd in most cases. This is needed so the faster versions don't trip it up. If there is a good way to have the HER or g objects check if her lips are past the tip of the penis, please let me know so I can do this in a more accurate manner.
 
Last edited:

colin

Content Creator
Joined
Apr 11, 2016
Ok, got a version up that appears to fix the issue I last mentioned. Hope it works nicely for everyone.
 

Bruce

Potential Patron
Joined
Nov 20, 2011
Thank you very much! This is something I hoped would be done for a long time.

[STOP_CUSTOM] gets me stuck after using [Hold_CUSTOM] to interrupt an ongoing (non-custom) auto mode. It's not so big of a deal since other methods seem to work better for what I try to accomplish anyway.

For some reason she sometimes gets down again very quickly, behaves erratically. An example of what I have been playing around with:

resistance:"[POSITION_CUSTOM_150_50_100][COUGH]C'mon, I need to work it in![COUGH][AUTO_CUSTOM_X_110_30_90]%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01[COUGH]%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01%01[COUGH]%01%01%01%01%01%01%01%01%01%01%01[GAG]%01%01%01%01[AUTO_SELF]"{"style":"Thought"}
 

colin

Content Creator
Joined
Apr 11, 2016
Hmmm... the resistance line seems to work as expected when I try it... at a speed of 100 it should move about as fast as the games internal values will allow it. Remember, the value at which she is pressed down completely is ~ 96, anything above that is not doing much if anything.

If it is a resistance type then initial resistance has not been overcome yet so she will stop going down further once it gets about 1/3 to 1/2 of the way into her throat. Since you have a target position of 110 and a magnitude of 30, she should try to go from 80-140, so it should start going back at ~85, and most of the sin wave will will be as low as she can go, just a little retreat and proceed as it goes 85-80-85.

If you can give me a bit more detail about the issue with the resistance line I may be able to figure it out, or I may just have to tell you that is the way it works.

As for the stop_custom problem, I should have a new version posted sometime tomorrow with a fix, very simple problem, apparently I am an idiot and had never actually RUN stop_custom, it would error out when called was the reason you could not get it back.
 

Bruce

Potential Patron
Joined
Nov 20, 2011
What I meant was, that in that specific example [AUTO_SELF] usually means she pulls off. But sometimes, she then immediately goes down again (with lots of speed, looking strange).

I cannot reproduce the issues at the moment though.
 

colin

Content Creator
Joined
Apr 11, 2016
Actually, AUTO_SELF is just another auto setting in which SHE is supposed to be controlling things as his hand will not be on her head. In general this means a much slower/less intense motion on average, but it can still be rough if all the random numbers line up right.

When one of the normal auto functions is called, all settings my mod created are reverted and the custom settings are disconnected until called again, so I do not think that particular issue is with the mod, just an unlikely coincidence.

Edit: And a new version that fixes the STOP_CUSTOM trigger has been added. It also allows the speed of the POSITION_CUSTOM trigger to go down to 0.1 without issue. As low as ~ 0.02 SHOULD work, but I have not tested it, and 0.1 is already so slow you will have trouble being certain it is moving.
 
Last edited:

aztlan

Casual Client
Joined
Sep 14, 2013
Very interesting.

Do these work with Animtools Poses?

What's the difference between HOLD_CUSTOM and PAUSE_CUSTOM? (I have a strong suspicion I'm not getting something basic here...)

Does it matter if this loads before or after DialogueActions in $INIT?

I'm not sure how to use them yet (and think I need some time to digest exactly how the various commands work) but they seem to offer some interesting possibilities for dialogues - sort of like the ability to create little "Cut Scenes" that play out without the player interrupting them. When I get some time I'll have to experiment around with it a bit.

Thanks. Eager to see what clever things you come up with next!
 
Last edited:

colin

Content Creator
Joined
Apr 11, 2016
They work with basic animtool poses since it literally just intercepts the auto functions and replaces them with new position values as if you were moving the mouse to those points.

HOLD_CUSTOM is a custom function like AUTO_CUSTOM_X that locks position in place, it will work whether it was being controlled by mouse, normal auto function or another custom function (which it will replace).
PAUSE_CUSTOM will merely pause the current custom function where it is, and when you use CONTINUE_CUSTOM it will pick up exactly where it left off. It will have no effect on a normal auto function or mouse controls.

HOLD_CUSTOM is basically PAUSE_CUSTOM on steroids and destroys the previous position control state.

When I tested it, the load order did not matter (thank you pim for the help getting that working.)

Glad you like it. Hopefully you will be able to come up with some interesting dialogues. Not sure if I will do much more modding though, just did this because it seemed relatively simple and I and several others had noticed that the original auto settings had some... issues with story type dialogues, lol.

Quick note: Originally I was just going to add hold and continue so you would not get weird things like auto backing off while they talk about how deep it is staying. Then, well, I kinda got carried away :tongue:.
 

colin

Content Creator
Joined
Apr 11, 2016
Ok, found out my fix for "missing" her mouth also broke non-oral positions, trying to figure out a way to ignore that case if not an oral position. Will update with a fix as soon as I find out how to check position from within my code.
 

colin

Content Creator
Joined
Apr 11, 2016
The original triggers were not disabling the mouse hold activated by the triggers to move her head down to his balls, so until the player pressed the mouse button, or stop_custom/a base auto function was called she would not take it in her mouth again, I believe this has now been fixed.
 
Last edited:

colin

Content Creator
Joined
Apr 11, 2016
I apparently screwed things up big time with that last update. I think I have it fixed now, but since I have had so many problems with it recently I am going to wait till I can test it more tomorrow before posting it.

I am sorry for how shoddy my testing of that last update was, I will try not to let it happen again.
 
Last edited:

Sass

Content Creator
Joined
May 16, 2016
If you actually have a working lick trigger, you shouldn't couple it with an auto hilt movement -- just leave it as it is.
 

colin

Content Creator
Joined
Apr 11, 2016
Ok, the new version has officially been posted. I tested each major trigger type, (X, FULL, SIMPLE, POSITION, RAMP, RANDOM, licking and non licking press to balls, MOVE_TONGUE, and INIT_RESISTANCE.) And they all seem to do exactly as they should at all levels I tested.

I am not sure what you mean Sass, the lick trigger I have is intended to make her lick his balls, so the point is to go down there.
 

colin

Content Creator
Joined
Apr 11, 2016
Added one more trigger, [INIT_RESIST_BREAK_<speed-going-down>_<speed-going-up>] that you can use to break through initial resistance. At faster speeds the other custom functions will generally start forcing her back down before the animation clears her mouth so resistance will not degrade. With this function there is a slight (4/5 frame) delay at the ends of the motion so the animation can catch up.
As suggested in the trigger, you can choose separate speeds for up and down motions so you can simulate ramming her down, and slowly letting her back off.
I may add something to give the same effect in other triggers, I will have to see how well the algorithm I am using works in those cases. It may result in me rewriting most of the actually auto functionality making it much cleaner/simpler, though that would probably not be visible to dialogue writers/players. The ugly thing about it would be for the full control ramp up with this implemented it would probably end up with about 12-14 variables in the trigger:rolleyes:. Obviously, those would be additional triggers you could use, I would not replace the old triggers.

I think I also know how to combine the CUSTOM_X and CUSTOM_FULL, and possibly CUSTOM_SIMPLE triggers so that you just put in the appropriate arguments rather than needing separate triggers, so I could also cut off the X/FULL making for slightly shorter (and fewer) triggers.

Yes, this mod is becoming WAY more complex than I had initially intended:grin:.
 

colin

Content Creator
Joined
Apr 11, 2016
I have MOSTLY rewritten the auto triggers in a way that increases the customization possible. The downside is, I need to figure out the best way to allow writers to call them without requiring a ridiculous number of options every time... I was counting them up, and if I allowed y axis values in the ramp up trigger it would need TWENTY FIVE options... As it is, the new FULL_CUSTOM has 6-10 variables you use, and without the y-axis values the ramp_custom trigger can still use... 16 I think?

I was considering allowing the writer to give name_value pairs like MINX_3_SPEEDUP_4 to specify you wanted minX to increase by 3, and speed to increase by 4, with all non-specified values going to a default, but that adds even MORE values the writer would need to enter...

I may create two versions of ramp/random, one that you put all values into, and one that you specify which you want as above... in both cases you would place them after the base values you want to start with.

To give an idea of how the new version operates, AUTO_CUSTOM_X --> [X_CUSTOM_<minX>_<maxX>_<speedXDown>_<(optional)speedXUp>_<(optional)delayXDown>_<(optional)delayXUp>

minX and maxX are the minimum and maximum positions you want it to go between, i.e. 0, 100 would be full left to full right.
speedXDown is the speed at which she moves onto the penis.
speedXUp is the speed at which she moves OFF the penis (defaults to the value of speedXDown)
delayXDown is the number of frames for which she will wait before starting to back off the penis (defaults to 5, results in the animation BARELY catching up before starting to move back)
delayXUp is the number of frames for which she will wait before starting to go down on the penis again (defaults to delayXDown)

So you can specify between 3 and 6 options for X_CUSTOM now, though you MUST use earlier options in order to use later ones, i.e. you must specify speedXUp before you can specify delayXDown.

AUTO_CUSTOM_FULL is now FULL_CUSTOM and works the same way, but you can't specify DELAYS for the y values, they just go with the 5 frame delay mentioned above. It was already getting ridiculously long for a trigger.

Let me know what you think, and if you have a suggestion for a good way to design the triggers for the ramp/random functions please feel free to let me know, if I like it, and think I can reasonably code it I may just use it. (As is, this MOD is already over 800 lines of code... lol)
 
Last edited:

colin

Content Creator
Joined
Apr 11, 2016
Just an update for the overhaul: I have tested the two base custom triggers (x and full) + position_custom, and they are functioning as expected. All previous functionality is still present, and you can also specify different speeds for moving up or down the penis, as well as delays before shifting directions. This means that you can, for example, cause her to go down very fast, stay there for 3 seconds, then slowly back off until it leaves her mouth, and immediately slam it back in, and repeat.

I will also be combining the two triggers that bring her to his balls, and adding a trigger to toggle mouse hold so you can do things like pull her up or push her down as well. The combined trigger will just move her to the appropriate location.

All auto triggers will also now accept the position words for their min/max x values (TIP, HILT, etc) in addition to numeric values.

Once this overhaul is complete, you should be able to move her to any position, or between any two positions, as fast or slow as you want (up to the GAMES max movement speed of course) for each direction, with pauses of arbitrary length at each end, on or off the penis. As long as you are willing to put in enough triggers, you should be able to make her perform ANY motion you wish that the game itself allows. If the player could do it (given enough skill/precision with the mouse) you should be able to program it in. Note: if speeds/distances are changing FREQUENTLY, the triggers necessary will be plentiful and messy, but with the right timing it SHOULD be possible with this setup.
 

colin

Content Creator
Joined
Apr 11, 2016
OK, I think I have pretty much finished rebuilding now. I will begin testing sometime tomorrow, but the basic structure should be in place. For those that are interested, here is a list of the triggers that will be available:
Trigger declarations:
register("FULL_CUSTOM", 6, autoCustomFull, this, []);
register("FULL_CUSTOM", 7, autoCustomFull, this, []);
register("FULL_CUSTOM", 8, autoCustomFull, this, []);
register("FULL_CUSTOM", 9, autoCustomFull, this, []);
register("FULL_CUSTOM", 10, autoCustomFull, this, []);
register("X_CUSTOM", 3, autoCustomX, this, []);
register("X_CUSTOM", 4, autoCustomX, this, []);
register("X_CUSTOM", 5, autoCustomX, this, []);
register("X_CUSTOM", 6, autoCustomX, this, []);
register("POSITION_CUSTOM", 3, positionCustom, this, []);
register("STOP_CUSTOM", 0, stopCustom, this, null);
register("HOLD_CUSTOM", 0, customHold, this, null);
register("MOVE_TONGUE", 1, moveTongue, this, []);
register("MOUSE_BUTTON", 1, mouseSet, this, []);
register("MOVE_TO_BALLS", 1, moveToBalls, this, []);
register("INIT_RESISTANCE", 1, changeInitRes, this, []);
register("INIT_RESIST_BREAK", 1, breakInitRes, this, []);
register("INIT_RESIST_BREAK", 2, breakInitRes, this, []);
register("PAUSE_CUSTOM", 0, pauseCustom, this, null);
register("CONTINUE_CUSTOM", 0, continueCustom, this, null);
register("RANDOM_CUSTOM", 8, randomCustomX, this, []);
register("RANDOM_SPECIFY", 5, randomCustomX, this, []);
register("RANDOM_SPECIFY", 7, randomCustomX, this, []);
register("RANDOM_SPECIFY", 9, randomCustomX, this, []);
register("RAMP_CUSTOM", 13, rampCustomX, this, []);
register("RAMP_SPECIFY", 6, rampCustomX, this, []);
register("RAMP_SPECIFY", 8, rampCustomX, this, []);
register("RAMP_SPECIFY", 10, rampCustomX, this, []);
register("RAMP_SPECIFY", 12, rampCustomX, this, []);
register("RAMP_SPECIFY", 14, rampCustomX, this, []);
register("RAMP_SPECIFY", 16, rampCustomX, this, []);
register("RAMP_SPECIFY", 18, rampCustomX, this, []);
register("RAMP_SPECIFY", 20, rampCustomX, this, []);

Basic explanation:
Register tells it to register the trigger with the values given:
Argument 1: the actual trigger you will use.
Argument 2: the number of arguments that will be attached to that trigger, for example: for POSITION_CUSTOM there are 3 arguments: X, Y, and Speed. so you would call it by using [POSITION_CUSTOM_30_50_25] for 30% of the way from left side of screen to right side, then 50% from top to bottom, and a speed 25% of max.
The other arguments are not relevant to dialogue writers.

By registering a trigger multiple times with different numbers of arguments, they can support multiple different calls for varying levels of input detail. Using this, I have made it possible to specify which values you want to change from the default.
Let's do a quick explanation using ramp_specify:
You start with the basic information: left-most X, right-most X, Speed, and number of frames before an increase.
then you specify which other components you want to change from the default by stating it's name + the value you desire. let's say you just wanted to have it slowly increase how far she goes down the penis, it would look something like this: [RAMP_SPECIFIC_20_40_30_50_MAXINC_5]
This would start her moving between 20% and 40% left to right, at 30% max speed. from there on every 50 frames, her maximum depth would increase by 5% of the total possible width. So at first it would be 20-40%, 50 frames later it would go to 20-45%, another 50 frames later it would go from 20-50% etc.
You can specify between 1 and 8 values this way, if you want to specify all 9 values you would use RAMP_CUSTOM instead and not need to enter the names.

MOUSE_BUTTON allows you to set whether it believes the mouse button is held, this allows things like pulling her up/down, and moving her to his balls, the only argument is "press" or "release".

Let me know what you all think, and if there is a circumstance I may be forgetting there.
 

Users who are viewing this thread

Top


Are you 18 or older?

This website requires you to be 18 years of age or older. Please verify your age to view the content, or click Exit to leave.