1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Custom Automation 7.0 by colin

Allows dialogues to directly control automation instead of the basic auto functions.

  1. colin
    Provides extra triggers for dialogues to use to gain much greater control of the action. Not terribly useful for the majority of dialogues currently available, but VERY useful for those trying to create a story rather than just adding lines for different situations.

    For example: With the default auto functions you may have a character who begs for the guy to take it out, while the auto function is deciding she should have a break so it already IS out.
    With these triggers you can specify a her minimum and maximum depth, how fast she should move, and how far she should move from that position (i.e. you might want to her to move from the head to 3/4ths of the way down, at a medium speed.)

    If you have any questions to ask/bugs to report feel free to post in my mod thread linked to the right. I will try to respond as quickly as possible.

    Here is the current notes for the mod.
    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:
    Sets the initial resistance to value that replaces <level>

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

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

    Cancels the current CUSTOM command.

    Freezes the current custom automation.

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

    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.

    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.

    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.

    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.

    [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.

    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.

    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.

    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.

    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.

    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:

    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 the Basic notes 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:

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


    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:
    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.

    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 uses the the current value of all parameters, intended to be used after one or more calls to [VALUE_CUSTOM].

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

    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.

    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.