using UnityEngine; using UnityEngine.UI; using System; using System.Collections; using System.Collections.Generic; using SimpleJSON; using System.Linq; using System.IO; using MeshVR; using MVR.FileManagementSecure; using Request = MeshVR.AssetLoader.AssetBundleFromFileRequest; using AssetBundles; using MVR; // ************************************************************************ // VAMMoan 2 Teaser // PARTIAL : other sfxs // Sue me, it's a way to get the source code a bit more readable :p // ************************************************************************ namespace VAMMoan2TeaserPlugin { public partial class VAMMoan2Teaser : MVRScript { /** VA **/ private string lastFileExplorerPath = "Custom"; private Dictionary _vaFiles = new Dictionary(); private Dictionary _vaAudioclips = new Dictionary(); private Dictionary> _vaGroupsAudioclips = new Dictionary>(); private JSONStorableString VAFolder; /** PELVIC SLAP START **/ private JSONStorableBool enablePelvicSlap; private JSONStorableFloat PSLVolume; private JSONStorableFloat PSLPitch; private JSONStorableFloat PSLReverbMix; private JSONStorableFloat PSLMinDelay; private JSONStorableBool PSLEditAdvOptions; private JSONStorableFloat PSLMinIntensity; private JSONStorableFloat PSLMaxIntensity; private JSONStorableFloat PSLTrigger01YOffset; private JSONStorableFloat PSLTrigger01ZOffset; private JSONStorableFloat PSLTrigger02YOffset; private JSONStorableFloat PSLTrigger02ZOffset; // Values used during gameplay to avoid changing the default settings private bool _PSLPaused; private float _PSLVolume; private float _PSLPitch; private float _PSLReverbMix; private float _PSLMinDelay; private float _PSLMinIntensity; private float _PSLMaxIntensity; private bool _PSLAllowed = true; private float _PSLLastVelocity = 0f; private AudioSource pelvicSlapAudioSource; private AudioLowPassFilter pelvicSlapLPF; private GameObject _PSLTrigger01; private GameObject _PSLTrigger02; private Vector3 _PSLTrigger01DefaultPos = new Vector3(0f,-0.09f,0.065f); private Vector3 _PSLTrigger01DefaultScale = new Vector3(0.02f, 0.08f, 0.02f); private Vector3 _PSLTrigger02DefaultPos = new Vector3(0f,-0.16f,-0.08f); private Vector3 _PSLTrigger02DefaultScale = new Vector3(0.02f, 0.08f, 0.02f); // Actions public JSONStorableAction A_PausePSLTrigger; public JSONStorableAction A_UnpausePSLTrigger; public JSONStorableFloat A_PSLChangeVolume; public JSONStorableFloat A_PSLChangePitch; public JSONStorableFloat A_PSLChangeMinDelay; public JSONStorableFloat A_PSLChangeReverbMix; public JSONStorableFloat A_PSLChangeMinIntensity; public JSONStorableFloat A_PSLChangeMaxIntensity; /** PELVIC SLAP END **/ /** SQUISHES START **/ private JSONStorableBool enableSquishes; private JSONStorableFloat SQSVolume; private JSONStorableFloat SQSPitch; private JSONStorableBool SQSEditAdvOptions; private JSONStorableFloat SQSMinDelay; private JSONStorableFloat SQSReverbMix; // Values used during gameplay to avoid changing the default settings private bool _SQSPaused = false; private float _SQSVolume; private float _SQSPitch; private float _SQSMinDelay; private float _SQSReverbMix; private bool _SQSAllowed = true; private AudioSource squishesAudioSource; private AudioLowPassFilter squishesLPF; // Actions public JSONStorableAction A_PauseSQSTrigger; public JSONStorableAction A_UnpauseSQSTrigger; public JSONStorableFloat A_SQSChangeVolume; public JSONStorableFloat A_SQSChangePitch; public JSONStorableFloat A_SQSChangeMinDelay; public JSONStorableFloat A_SQSChangeReverbMix; /** SQUISHES END **/ /** MOUTH/BJ START **/ private JSONStorableFloat BJVolume; private JSONStorableFloat BJHighIntensityRatio; private JSONStorableFloat BJPause; private JSONStorableFloat BJBreathingRatio; private JSONStorableBool enableBlowjob; private JSONStorableBool BJEditAdvOptions; private JSONStorableFloat BJMinDelay; private JSONStorableFloat BJReverbMix; private JSONStorableFloat BJMoanFallbackDelay; // Values used during gameplay to avoid changing the default settings private bool _BJPaused = false; private float _BJVolume; private float _BJMinDelay; private float _BJReverbMix; private float _BJEndTimeLastSample; // Used to know when the last sample played is gonna end private float _BJMoanFallbackDelay; // How much are we gonna wait before falling back to the moan loop private bool _BJAllowed = true; private AudioSource mouthAudioSource; private AudioLowPassFilter mouthLPF; // Actions public JSONStorableAction A_PauseBJTrigger; public JSONStorableAction A_UnpauseBJTrigger; public JSONStorableFloat A_BJChangeVolume; public JSONStorableFloat A_BJChangePitch; public JSONStorableFloat A_BJChangeMinDelay; public JSONStorableFloat A_BJChangeReverbMix; public JSONStorableFloat A_BJChangeMoanFallbackDelay; /** MOUTH/BJ END **/ /** SPANK START **/ private JSONStorableBool enableSpank; private JSONStorableBool SPKAskForMore; private JSONStorableFloat SPKVolume; private JSONStorableFloat SPKReverbMix; // Values used during gameplay to avoid changing the default settings private float _SPKVolume; private float _SPKMinDelay = 0.5f; private float _SPKReverbMix; private bool _SPKAllowed = true; private AudioSource spankAudioSource; private AudioLowPassFilter spankLPF; /** SPANK END **/ // **** Rigidbodies protected Rigidbody vaTrig; protected Rigidbody penTrig01; protected Rigidbody penTrig02; protected Rigidbody penTrig03; protected Rigidbody anaTrig01; protected Rigidbody labTrig; protected Rigidbody mouTrig; protected readonly IList gluteTriggers = new List(); protected Rigidbody rbHipAS; protected Rigidbody pslRigidbody01; // Dynamic UI protected List pslAdvOptUIs = new List(); protected List sqsAdvOptUIs = new List(); protected List bjAdvOptUIs = new List(); protected void InitSFXStorablesAndUI() { /* *** Temporary UIDynamic *** */ UIDynamicTextField tmpTextfield; UIDynamicPopup tmpPopup; UIDynamicSlider tmpSlider; UIDynamicButton tmpButton; UIDynamicToggle tmpToggle; UIDynamic tmpSpacer; /* ********************************* */ /* **** VA **** */ /* ********************************* */ tmpTextfield = Utils.CreateStaticDescriptionText(this,"Global options VA","VA (Voice acting)\nFolder containing all voice lines\nfor the character.",true,95,TextAnchor.MiddleRight); otherSfxOptsUIs.Add(tmpTextfield); VAFolder = new JSONStorableString("VAFolder", ""); tmpTextfield = CreateTextField(VAFolder,true); otherSfxOptsUIs.Add((UIDynamic) tmpTextfield); Utils.SetupTextField(tmpTextfield, 100f, false, false); tmpButton = CreateButton("Select folder", true); tmpButton.button.onClick.AddListener(() => { OnSelectVAFolder(); } ); otherSfxOptsUIs.Add((UIDynamic) tmpButton); tmpButton = CreateButton("Sync folder", true); tmpButton.button.onClick.AddListener(() => { OnSyncVAFolder(); } ); otherSfxOptsUIs.Add((UIDynamic) tmpButton); SetupButtonWithLayout(tmpButton, 250f); Utils.SetButtonColor(tmpButton, btnGreenBgColor); Utils.SetButtonTextColor(tmpButton, btnGreenTxtColor); tmpButton = CreateButton("Clear VA", true); tmpButton.button.onClick.AddListener(() => { OnClearVAFolder(); } ); otherSfxOptsUIs.Add((UIDynamic) tmpButton); SetupButtonWithoutLayout(tmpButton, 250f, new Vector2(270, -580)); Utils.SetButtonColor(tmpButton, btnRedBgColor); Utils.SetButtonTextColor(tmpButton, btnRedTxtColor); tmpSpacer = CreateSpacer(true); Utils.SetupSpacer(tmpSpacer, 25f); otherSfxOptsUIs.Add(tmpSpacer); /* ********************************* */ /* **** PELVIC SLAP **** */ /* ********************************* */ tmpTextfield = Utils.CreateStaticDescriptionText(this,"Global options pelvic slap","PELVIC SLAP\nBelly and ass slappy sound.",true,80,TextAnchor.MiddleRight); otherSfxOptsUIs.Add(tmpTextfield); enablePelvicSlap = new JSONStorableBool("enablePelvicSlap", false, enablePelvicSlapCallback); tmpToggle = CreateToggle(enablePelvicSlap, true); tmpToggle.label = "Enable pelvic slap"; otherSfxOptsUIs.Add((UIDynamic) tmpToggle); PSLVolume = new JSONStorableFloat("PSLVolume", 0.5f, PSLVolumeCallback, 0f, 1f); tmpSlider = CreateSlider(PSLVolume, true); tmpSlider.label = "Slap sound volume"; otherSfxOptsUIs.Add((UIDynamic) tmpSlider); PSLPitch = new JSONStorableFloat("PSLPitch", 1f, PSLPitchCallback, 0.5f, 3f); tmpSlider = CreateSlider(PSLPitch, true); tmpSlider.label = "Slap sound pitch"; otherSfxOptsUIs.Add((UIDynamic) tmpSlider); PSLMinDelay = new JSONStorableFloat("PSLMinDelay", 0.45f, PSLMinDelayCallback, 0f, 1f); tmpSlider = CreateSlider(PSLMinDelay, true); tmpSlider.label = "Sound min delay"; otherSfxOptsUIs.Add((UIDynamic) tmpSlider); PSLEditAdvOptions = new JSONStorableBool("Edit advanced options", false, PSLEditAdvOptionsCallback){isStorable=false,isRestorable=false}; tmpToggle = CreateToggle(PSLEditAdvOptions, true); otherSfxOptsUIs.Add((UIDynamic) tmpToggle); PSLReverbMix = new JSONStorableFloat("PSLReverbMix", 1f, PSLReverbMixCallback, 0f, 1f); tmpSlider = CreateSlider(PSLReverbMix, true); tmpSlider.label = "Reverb mix"; pslAdvOptUIs.Add((UIDynamic) tmpSlider); PSLMinIntensity = new JSONStorableFloat("PSLMinIntensity", 0f, (val) => { PSLMinIntensity.valNoCallback = Mathf.Round(val); PSLMinIntensityCallback( PSLMinIntensity.valNoCallback ); PSLMaxIntensity.SetVal( Mathf.Max(PSLMaxIntensity.val, val) ); }, 0f, 2f); tmpSlider = CreateSlider(PSLMinIntensity, true); tmpSlider.label = "Sound min intensity"; pslAdvOptUIs.Add((UIDynamic) tmpSlider); PSLMaxIntensity = new JSONStorableFloat("PSLMaxIntensity", 2f, (val) => { PSLMaxIntensity.valNoCallback = Mathf.Round(val); PSLMaxIntensityCallback( PSLMaxIntensity.valNoCallback ); PSLMinIntensity.SetVal( Mathf.Min(PSLMinIntensity.val, val) ); }, 0f, 2f); tmpSlider = CreateSlider(PSLMaxIntensity, true); tmpSlider.label = "Sound max intensity"; pslAdvOptUIs.Add((UIDynamic) tmpSlider); PSLTrigger01YOffset = new JSONStorableFloat("PSLTrigger01YOffset", 0f, PSLTrigger01OffsetCallback, -0.55f, 0.55f); tmpSlider = CreateSlider(PSLTrigger01YOffset, true); tmpSlider.label = "Trigger 01 Y Offset"; pslAdvOptUIs.Add((UIDynamic) tmpSlider); PSLTrigger01ZOffset = new JSONStorableFloat("PSLTrigger01ZOffset", 0f, PSLTrigger01OffsetCallback, -0.55f, 0.55f); tmpSlider = CreateSlider(PSLTrigger01ZOffset, true); tmpSlider.label = "Trigger 01 Z Offset"; pslAdvOptUIs.Add((UIDynamic) tmpSlider); PSLTrigger02YOffset = new JSONStorableFloat("PSLTrigger02YOffset", 0f, PSLTrigger02OffsetCallback, -0.55f, 0.55f); tmpSlider = CreateSlider(PSLTrigger02YOffset, true); tmpSlider.label = "Trigger 02 Y Offset"; pslAdvOptUIs.Add((UIDynamic) tmpSlider); PSLTrigger02ZOffset = new JSONStorableFloat("PSLTrigger02ZOffset", 0f, PSLTrigger02OffsetCallback, -0.55f, 0.55f); tmpSlider = CreateSlider(PSLTrigger02ZOffset, true); tmpSlider.label = "Trigger 02 Z Offset"; pslAdvOptUIs.Add((UIDynamic) tmpSlider); /* ********************************* */ /* **** SQUISHES **** */ /* ********************************* */ tmpTextfield = Utils.CreateStaticDescriptionText(this,"Global options squishes","SQUISHES\nLabia and penis wet sounds.",true,80,TextAnchor.MiddleRight); otherSfxOptsUIs.Add(tmpTextfield); enableSquishes = new JSONStorableBool("enableSquishes", false, enableSquishesCallback); tmpToggle = CreateToggle(enableSquishes, true); tmpToggle.label = "Enable squishes sounds"; otherSfxOptsUIs.Add((UIDynamic)tmpToggle); SQSVolume = new JSONStorableFloat("SQSVolume", 1f, SQSVolumeCallback, 0f, 1f); tmpSlider = CreateSlider(SQSVolume, true); tmpSlider.label = "Squishes sounds volume"; otherSfxOptsUIs.Add((UIDynamic)tmpSlider); SQSPitch = new JSONStorableFloat("SQSPitch", 1f, SQSPitchCallback, 0.5f, 3f); tmpSlider = CreateSlider(SQSPitch, true); tmpSlider.label = "Squishes sounds pitch"; otherSfxOptsUIs.Add((UIDynamic)tmpSlider); SQSEditAdvOptions = new JSONStorableBool("Edit advanced options", false, SQSEditAdvOptionsCallback){isStorable=false,isRestorable=false}; tmpToggle = CreateToggle(SQSEditAdvOptions, true); otherSfxOptsUIs.Add((UIDynamic)tmpToggle); SQSMinDelay = new JSONStorableFloat("SQSMinDelay", 0.15f, SQSMinDelayCallback, 0f, 1f); tmpSlider = CreateSlider(SQSMinDelay, true); tmpSlider.label = "Sound min delay"; sqsAdvOptUIs.Add((UIDynamic)tmpSlider); SQSReverbMix = new JSONStorableFloat("SQSReverbMix", 1f, SQSReverbMixCallback, 0f, 1f); tmpSlider = CreateSlider(SQSReverbMix, true); tmpSlider.label = "Reverb mix"; sqsAdvOptUIs.Add((UIDynamic)tmpSlider); /* ********************************* */ /* **** BLOWJOB **** */ /* ********************************* */ tmpSpacer = CreateSpacer(true); Utils.SetupSpacer(tmpSpacer, 20f); tmpTextfield = Utils.CreateStaticDescriptionText(this, "Global options blowjob","BLOWJOB\nMouth wet sounds.",true,65,TextAnchor.MiddleRight); otherSfxOptsUIs.Add(tmpTextfield); BJVolume = new JSONStorableFloat("BJVolume", 0.4f, BJVolumeCallback, 0f, 1f); tmpSlider = CreateSlider(BJVolume, true); tmpSlider.label = "Blowjob sounds volume"; otherSfxOptsUIs.Add((UIDynamic)tmpSlider); BJHighIntensityRatio = new JSONStorableFloat("BJHighIntensityRatio", 0.15f, 0f, 1f); tmpSlider = CreateSlider(BJHighIntensityRatio, true); tmpSlider.label = "Blowjob high intensity ratio"; otherSfxOptsUIs.Add((UIDynamic)tmpSlider); tmpTextfield = Utils.CreateStaticDescriptionText(this, "Global options BJ Manual","MANUAL",true,32,TextAnchor.MiddleRight); otherSfxOptsUIs.Add(tmpTextfield); BJPause = new JSONStorableFloat("BJPause", 1f, 0f, 1f); tmpSlider = CreateSlider(BJPause, true); tmpSlider.label = "Pause between BJ sounds"; otherSfxOptsUIs.Add((UIDynamic)tmpSlider); BJBreathingRatio = new JSONStorableFloat("BJBreathingRatio", 0.1f, 0f, 0.15f); tmpSlider = CreateSlider(BJBreathingRatio, true); tmpSlider.label = "Blowjob breathing ratio"; otherSfxOptsUIs.Add((UIDynamic)tmpSlider); tmpTextfield = Utils.CreateStaticDescriptionText(this, "Global options BJ Auto","AUTO (using collisions)",true,32,TextAnchor.MiddleRight); otherSfxOptsUIs.Add(tmpTextfield); enableBlowjob = new JSONStorableBool("enableBlowjob", false, enableBlowjobCallback); tmpToggle = CreateToggle(enableBlowjob, true); tmpToggle.label = "Enable auto blowjob sounds"; otherSfxOptsUIs.Add((UIDynamic)tmpToggle); BJEditAdvOptions = new JSONStorableBool("Edit advanced options", false, BJEditAdvOptionsCallback){isStorable=false,isRestorable=false}; tmpToggle = CreateToggle(BJEditAdvOptions, true); otherSfxOptsUIs.Add((UIDynamic)tmpToggle); BJMinDelay = new JSONStorableFloat("BJMinDelay", 0.50f, BJMinDelayCallback, 0f, 1f); tmpSlider = CreateSlider(BJMinDelay, true); tmpSlider.label = "Sound min delay"; bjAdvOptUIs.Add((UIDynamic)tmpSlider); BJReverbMix = new JSONStorableFloat("BJReverbMix", 1f, BJReverbMixCallback, 0f, 1f); tmpSlider = CreateSlider(BJReverbMix, true); tmpSlider.label = "Reverb mix"; bjAdvOptUIs.Add((UIDynamic)tmpSlider); BJMoanFallbackDelay = new JSONStorableFloat("BJMoanFallbackDelay", 2f, BJMoanFallbackDelayCallback, 1f, 5f); tmpSlider = CreateSlider(BJMoanFallbackDelay, true); tmpSlider.label = "Moan fallback delay"; bjAdvOptUIs.Add((UIDynamic)tmpSlider); /* ********************************* */ /* **** KISSING **** */ /* ********************************* */ tmpSpacer = CreateSpacer(true); Utils.SetupSpacer(tmpSpacer, 20f); tmpTextfield = Utils.CreateStaticDescriptionText(this, "Global options kissing","KISSING\nKiss / lips sounds.",true,65,TextAnchor.MiddleRight); otherSfxOptsUIs.Add(tmpTextfield); VAMMKissingSpeed = new JSONStorableFloat("VAMMKissingSpeed", 0.5f, 0f, 1f); tmpSlider = CreateSlider(VAMMKissingSpeed, true); tmpSlider.label = "Kissing speed"; otherSfxOptsUIs.Add((UIDynamic)tmpSlider); /* ********************************* */ /* **** SPANKING **** */ /* ********************************* */ tmpSpacer = CreateSpacer(true); Utils.SetupSpacer(tmpSpacer, 20f); tmpTextfield = Utils.CreateStaticDescriptionText(this,"Global options spank","SPANKING\nAss spankin' sounds.",true,80,TextAnchor.MiddleRight); otherSfxOptsUIs.Add(tmpTextfield); enableSpank = new JSONStorableBool("enableSpank", false, enableSpankCallback); tmpToggle = CreateToggle(enableSpank, true); tmpToggle.label = "Enable spanking sounds"; otherSfxOptsUIs.Add((UIDynamic)tmpToggle); SPKAskForMore = new JSONStorableBool("SPKAskForMore", false); tmpToggle = CreateToggle(SPKAskForMore, true); tmpToggle.label = "Can ask for more!"; otherSfxOptsUIs.Add((UIDynamic)tmpToggle); SPKVolume = new JSONStorableFloat("SPKVolume", 0.85f, SPKVolumeCallback, 0f, 1f); tmpSlider = CreateSlider(SPKVolume, true); tmpSlider.label = "Spank sounds volume"; otherSfxOptsUIs.Add((UIDynamic)tmpSlider); SPKReverbMix = new JSONStorableFloat("SPKReverbMix", 1f, SPKReverbMixCallback, 0f, 1f); tmpSlider = CreateSlider(SPKReverbMix, true); tmpSlider.label = "Reverb mix"; otherSfxOptsUIs.Add((UIDynamic)tmpSlider); } protected void InitSFXActions() { // Pelvic slap A_PausePSLTrigger = new JSONStorableAction("Pause Pelvic slap trigger", () => { _PSLPaused = true; }); A_UnpausePSLTrigger = new JSONStorableAction("Unpause Pelvic slap trigger", () => { _PSLPaused = false; }); A_PSLChangeVolume = new JSONStorableFloat("Pelvic slap change volume", PSLVolume.val, PSLVolumeCallback, 0f, 1f){isStorable=false,isRestorable=false}; A_PSLChangePitch = new JSONStorableFloat("Pelvic slap change pitch", PSLPitch.val, PSLPitchCallback, 0.5f, 3f){isStorable=false,isRestorable=false}; A_PSLChangeMinDelay = new JSONStorableFloat("Pelvic slap change min delay", PSLMinDelay.val, PSLMinDelayCallback, 0.20f, 1f){isStorable=false,isRestorable=false}; A_PSLChangeReverbMix = new JSONStorableFloat("Pelvic slap change reverb mix", PSLReverbMix.val, PSLReverbMixCallback, 0f, 1f){isStorable=false,isRestorable=false}; A_PSLChangeMinIntensity = new JSONStorableFloat("Pelvic slap change sound min intensity", 1f, (val) => { PSLMinIntensityCallback( Mathf.Round(val) ); PSLMaxIntensityCallback( Mathf.Max(_PSLMaxIntensity, Mathf.Round(val)) ); }, 1f, 3f){isStorable=false,isRestorable=false}; A_PSLChangeMaxIntensity = new JSONStorableFloat("Pelvic slap change sound max intensity", 1f, (val) => { PSLMaxIntensityCallback( Mathf.Round(val) ); PSLMinIntensityCallback( Mathf.Min(_PSLMinIntensity, Mathf.Round(val)) ); }, 1f, 3f){isStorable=false,isRestorable=false}; // Squishes A_PauseSQSTrigger = new JSONStorableAction("Pause squishes trigger", () => { _SQSPaused = true; }); A_UnpauseSQSTrigger = new JSONStorableAction("Unpause squishes trigger", () => { _SQSPaused = false; }); A_SQSChangeVolume = new JSONStorableFloat("Squishes change volume", SQSVolume.val, SQSVolumeCallback, 0f, 1f){isStorable=false,isRestorable=false}; A_SQSChangePitch = new JSONStorableFloat("Squishes change pitch", SQSPitch.val, SQSPitchCallback, 0.5f, 3f){isStorable=false,isRestorable=false}; A_SQSChangeMinDelay = new JSONStorableFloat("Squishes change min delay", SQSMinDelay.val, SQSMinDelayCallback, 0.1f, 1f){isStorable=false,isRestorable=false}; A_SQSChangeReverbMix = new JSONStorableFloat("Squishes change reverb mix", SQSReverbMix.val, SQSReverbMixCallback, 0f, 1f){isStorable=false,isRestorable=false}; // Blowjob A_PauseBJTrigger = new JSONStorableAction("Pause blowjob trigger", () => { _BJPaused = true; }); A_UnpauseBJTrigger = new JSONStorableAction("Unpause blowjob trigger", () => { _BJPaused = false; }); A_BJChangeVolume = new JSONStorableFloat("Blowjob change volume", BJVolume.val, BJVolumeCallback, 0f, 1f){isStorable=false,isRestorable=false}; A_BJChangeMinDelay = new JSONStorableFloat("Blowjob change min delay", BJMinDelay.val, BJMinDelayCallback, 0.1f, 1f){isStorable=false,isRestorable=false}; A_BJChangeReverbMix = new JSONStorableFloat("Blowjob change reverb mix", BJReverbMix.val, BJReverbMixCallback, 0f, 1f){isStorable=false,isRestorable=false}; A_BJChangeMoanFallbackDelay = new JSONStorableFloat("Blowjob change moan fallback delay", BJMoanFallbackDelay.val, BJMoanFallbackDelayCallback, 1f, 5f){isStorable=false,isRestorable=false}; } protected void RegisterSFXStorables() { RegisterString(VAFolder); RegisterBool(enablePelvicSlap); RegisterFloat(PSLVolume); RegisterFloat(PSLPitch); RegisterFloat(PSLMinDelay); RegisterFloat(PSLReverbMix); RegisterFloat(PSLMinIntensity); RegisterFloat(PSLMaxIntensity); RegisterFloat(PSLTrigger01YOffset); RegisterFloat(PSLTrigger01ZOffset); RegisterFloat(PSLTrigger02YOffset); RegisterFloat(PSLTrigger02ZOffset); RegisterBool(enableSquishes); RegisterFloat(SQSVolume); RegisterFloat(SQSMinDelay); RegisterFloat(SQSReverbMix); RegisterBool(enableBlowjob); RegisterFloat(BJVolume); RegisterFloat(BJMinDelay); RegisterFloat(BJReverbMix); RegisterFloat(BJMoanFallbackDelay); RegisterBool(enableSpank); RegisterBool(SPKAskForMore); RegisterFloat(SPKVolume); RegisterFloat(SPKReverbMix); } protected void RegisterSFXActions() { RegisterAction(A_PausePSLTrigger); RegisterAction(A_UnpausePSLTrigger); RegisterAction(A_PauseSQSTrigger); RegisterAction(A_UnpauseSQSTrigger); RegisterAction(A_PauseBJTrigger); RegisterAction(A_UnpauseBJTrigger); JSONStorableAction fakeFuncSFXOpts = new JSONStorableAction("- - - - Use these functions below to change SFX options ↓ - - - - -", () => {}); RegisterAction(fakeFuncSFXOpts); // Pelvic slap triggers RegisterFloat(A_PSLChangeVolume); RegisterFloat(A_PSLChangePitch); RegisterFloat(A_PSLChangeMinDelay); RegisterFloat(A_PSLChangeReverbMix); RegisterFloat(A_PSLChangeMinIntensity); RegisterFloat(A_PSLChangeMaxIntensity); // Squishes triggers RegisterFloat(A_SQSChangeVolume); RegisterFloat(A_SQSChangePitch); RegisterFloat(A_SQSChangeMinDelay); RegisterFloat(A_SQSChangeReverbMix); // Blowjob triggers RegisterFloat(A_BJChangeVolume); RegisterFloat(A_BJChangeMinDelay); RegisterFloat(A_BJChangeReverbMix); RegisterFloat(A_BJChangeMoanFallbackDelay); } // ************************** // Callbacks // ************************** protected void OnSelectVAFolder() { SuperController.singleton.directoryBrowserUI.defaultPath = lastFileExplorerPath; SuperController.singleton.directoryBrowserUI.SetTitle("Select a folder containing your voice lines"); SuperController.singleton.directoryBrowserUI.keepOpen = false; SuperController.singleton.directoryBrowserUI.SetTextEntry(true); SuperController.singleton.directoryBrowserUI.showInstallFolderInDirectoryList = false; List shortCutList = new List(); ShortCut shortAp = new ShortCut(); shortAp.package = "AddonPackages Filtered"; shortAp.path = "AddonPackages"; shortAp.displayName = "Filter: Custom"; shortAp.packageFilter = "Custom"; shortCutList.Add(shortAp); ShortCut shortAp2 = new ShortCut(); shortAp2.package = "AddonPackages Filtered"; shortAp2.path = "AddonPackages"; shortAp2.displayName = "Filter: Saves"; shortAp2.packageFilter = "Saves"; shortCutList.Add(shortAp2); ShortCut shortCutCustom = new ShortCut(); shortCutCustom.path = "Custom\\"; shortCutCustom.displayName = "Custom"; shortCutCustom.flatten = false; shortCutList.Add(shortCutCustom); ShortCut shortCutSaves = new ShortCut(); shortCutSaves.path = "Saves\\"; shortCutSaves.displayName = "Saves"; shortCutSaves.flatten = false; shortCutList.Add(shortCutSaves); SuperController.singleton.directoryBrowserUI.shortCuts = shortCutList; SuperController.singleton.directoryBrowserUI.Show((val) => { if (val != "") { lastFileExplorerPath = val.Substring(0, val.LastIndexOfAny(new char[] {'/', '\\'})); VAFolder.val = SuperController.singleton.NormalizeLoadPath(val); ImportVAFolder(); } }); } protected void OnSyncVAFolder() { ImportVAFolder(false); } protected void OnClearVAFolder() { VAFolder.val = ""; _vaFiles.Clear(); UnloadAndClearVA(); SuperController.singleton.Alert("VAMMoan\nVA clearing\nAll VA files have been removed.", () => {}); } protected void PSLEditAdvOptionsCallback( bool show ) { ToggleUIDynamicGrp(pslAdvOptUIs, show); PSLShowTriggers(show); } protected void enablePelvicSlapCallback( bool enabled ) { if ( SuperController.singleton.isLoading || _isVoiceInitialized == false ) return; if( enabled == true ) { initPelvicSlapHandler(); } else { PSLEditAdvOptions.SetVal(false); clearPelvicSlapHandler(); } } protected void PSLVolumeCallback( float volume ) { _PSLVolume = volume; } protected void PSLPitchCallback( float pitch ) { _PSLPitch = pitch; } protected void PSLReverbMixCallback( float mix ) { _PSLReverbMix = mix; if( pelvicSlapAudioSource != null ) { pelvicSlapAudioSource.reverbZoneMix = _PSLReverbMix; } } protected void PSLMinDelayCallback( float delay ) { _PSLMinDelay = delay; } protected void PSLMinIntensityCallback( float minint ) { _PSLMinIntensity = minint; } protected void PSLMaxIntensityCallback( float maxint ) { _PSLMaxIntensity = maxint; } protected void PSLTrigger01OffsetCallback( float offset ) { PSLTrigger01UpdateTransform(); } protected void PSLTrigger02OffsetCallback( float offset ) { PSLTrigger02UpdateTransform(); } protected void SQSEditAdvOptionsCallback( bool show ) { ToggleUIDynamicGrp(sqsAdvOptUIs, show); } protected void enableSquishesCallback( bool enabled ) { if ( SuperController.singleton.isLoading || _isVoiceInitialized == false ) return; if( enabled == true ) { initSquishesHandler(); } else { SQSEditAdvOptions.SetVal(false); clearSquishesHandler(); } } protected void SQSVolumeCallback( float volume ) { _SQSVolume = volume; } protected void SQSPitchCallback( float pitch ) { _SQSPitch = pitch; } protected void SQSReverbMixCallback( float mix ) { _SQSReverbMix = mix; if( squishesAudioSource != null ) { squishesAudioSource.reverbZoneMix = _SQSReverbMix; } } protected void SQSMinDelayCallback( float delay ) { _SQSMinDelay = delay; } protected void BJEditAdvOptionsCallback( bool show ) { ToggleUIDynamicGrp(bjAdvOptUIs, show); } protected void enableBlowjobCallback( bool enabled ) { if ( SuperController.singleton.isLoading || _isVoiceInitialized == false ) return; if( enabled == true ) { initBlowjobHandler(); } else { // BJEditAdvOptions.SetVal(false); clearBlowjobHandler(); } } protected void BJVolumeCallback( float volume ) { _BJVolume = volume; } protected void BJReverbMixCallback( float mix ) { _BJReverbMix = mix; if( mouthAudioSource != null ) { mouthAudioSource.reverbZoneMix = _BJReverbMix; } } protected void BJMinDelayCallback( float delay ) { _BJMinDelay = delay; } protected void BJMoanFallbackDelayCallback( float delay ) { _BJMoanFallbackDelay = delay; } protected void enableSpankCallback( bool enabled ) { if ( SuperController.singleton.isLoading || _isVoiceInitialized == false ) return; if( enabled == true ) { initSpankHandler(); } else { clearSpankHandler(); } } protected void SPKVolumeCallback( float volume ) { _SPKVolume = volume; } protected void SPKReverbMixCallback( float mix ) { _SPKReverbMix = mix; if( spankAudioSource != null ) { spankAudioSource.reverbZoneMix = _SQSReverbMix; } } // ************************** // Pelvic slap // ************************** protected void initPelvicSlapHandler() { // If it is disable or the audiosource already exists (handler initialized) if( enablePelvicSlap.val == false || pelvicSlapAudioSource != null ) return; // Initializing gameplay values _PSLPaused = false; _PSLVolume = PSLVolume.val; _PSLPitch = PSLPitch.val; _PSLReverbMix = PSLReverbMix.val; _PSLMinDelay = PSLMinDelay.val; _PSLMinIntensity = PSLMinIntensity.val; _PSLMaxIntensity = PSLMaxIntensity.val; // Getting the rigidbody around the penis to have an accurate audiosource position pslRigidbody01 = containingAtom.rigidbodies.First(rb => rb.name == "pelvis"); if( pslRigidbody01 != null ) { pelvicSlapAudioSource = pslRigidbody01.gameObject.AddComponent(); // Setting the default parameters pelvicSlapAudioSource.spatialBlend = 1f; pelvicSlapAudioSource.dopplerLevel = 0f; pelvicSlapAudioSource.rolloffMode = AudioRolloffMode.Logarithmic; pelvicSlapAudioSource.minDistance = 1f; pelvicSlapAudioSource.maxDistance = 1.5f; pelvicSlapAudioSource.reverbZoneMix = _PSLReverbMix; pelvicSlapLPF = pslRigidbody01.gameObject.AddComponent(); pelvicSlapLPF.cutoffFrequency = 22000.0f; } // Initializing first trigger _PSLTrigger01 = GameObject.CreatePrimitive(PrimitiveType.Capsule); _PSLTrigger01.name = "vamm_psl_trigger01"; _PSLTrigger01.GetComponent().isTrigger = true; _PSLTrigger01.GetComponent().material = new Material(Shader.Find("Battlehub/RTGizmos/Handles")){ color = new Color(1f, 0.1f, 0.1f, 0.3f) }; _PSLTrigger01.GetComponent().enabled = false; _PSLTrigger01.transform.SetParent(pslRigidbody01.gameObject.transform,false); PSLTrigger01UpdateTransform(); _PSLTrigger01.transform.localRotation = Quaternion.Euler(0, 0, 90f); // Initializing second trigger _PSLTrigger02 = GameObject.CreatePrimitive(PrimitiveType.Capsule); _PSLTrigger02.name = "vamm_psl_trigger02"; _PSLTrigger02.GetComponent().isTrigger = true; _PSLTrigger02.GetComponent().material = new Material(Shader.Find("Battlehub/RTGizmos/Handles")){ color = new Color(0.6f, 0.3f, 0.3f, 0.3f) }; _PSLTrigger02.GetComponent().enabled = false; _PSLTrigger02.transform.SetParent(pslRigidbody01.gameObject.transform,false); PSLTrigger02UpdateTransform(); _PSLTrigger02.transform.localRotation = Quaternion.Euler(45f, 0, 90f); SexTriggerCollide collideComp; collideComp = pslRigidbody01.gameObject.AddComponent(); collideComp.OnTrigger += PslTriggerObserver; PSLShowTriggers(false); } protected void clearPelvicSlapHandler() { if( pslRigidbody01 == null ) return; // Disabling observers and removing components SexTriggerCollide tmp; pslRigidbody01.gameObject.GetComponent().OnTrigger -= PslTriggerObserver; tmp = pslRigidbody01.GetComponent(); if( tmp != null ) Destroy(tmp); if( pelvicSlapAudioSource != null ) Destroy( pelvicSlapAudioSource ); if( pelvicSlapLPF != null ) Destroy( pelvicSlapLPF ); pelvicSlapAudioSource = null; if( _PSLTrigger01 != null ) Destroy( _PSLTrigger01 ); if( _PSLTrigger02 != null ) Destroy( _PSLTrigger02 ); _PSLTrigger01 = _PSLTrigger02 = null; } protected void PSLTrigger01UpdateTransform() { if( _PSLTrigger01 == null ) return; _PSLTrigger01.transform.localPosition = _PSLTrigger01DefaultPos + new Vector3(0,PSLTrigger01YOffset.val,PSLTrigger01ZOffset.val); _PSLTrigger01.transform.localScale = _PSLTrigger01DefaultScale; } protected void PSLTrigger02UpdateTransform() { if( _PSLTrigger02 == null ) return; _PSLTrigger02.transform.localPosition = _PSLTrigger02DefaultPos + new Vector3(0,PSLTrigger02YOffset.val,PSLTrigger02ZOffset.val); _PSLTrigger02.transform.localScale = _PSLTrigger02DefaultScale; } protected void PSLShowTriggers( bool show ) { if( _PSLTrigger01 == null ) return; _PSLTrigger01.GetComponent().enabled = show; _PSLTrigger02.GetComponent().enabled = show; } // ************************** // Squishes // ************************** protected void initSquishesHandler() { // If it is disable or the audiosource already exists (handler initialized) if( enableSquishes.val == false || squishesAudioSource != null ) return; // Initializing gameplay values _SQSPaused = false; _SQSVolume = SQSVolume.val; _SQSPitch = SQSPitch.val; _SQSReverbMix = SQSReverbMix.val; _SQSMinDelay = SQSMinDelay.val; // Female / Labia (squishes sounds) if( myGender != null && myGender == DAZCharacterSelector.Gender.Female ) { labTrig = containingAtom.rigidbodies.First(rb => rb.name == "LabiaTrigger"); if( labTrig != null ) { squishesAudioSource = labTrig.gameObject.AddComponent(); squishesLPF = labTrig.gameObject.AddComponent(); squishesLPF.cutoffFrequency = 22000.0f; } labTrig.gameObject.AddComponent().OnTrigger += LabTrigObserver; // Male / Penis (squishes sounds) } else if ( myGender != null && myGender == DAZCharacterSelector.Gender.Male ) { penTrig01 = containingAtom.rigidbodies.First(rb => rb.name == "Gen1"); penTrig02 = containingAtom.rigidbodies.First(rb => rb.name == "Gen2"); penTrig01.gameObject.AddComponent().OnCollide += PenTrigObserver; penTrig02.gameObject.AddComponent().OnCollide += PenTrigObserver; if( penTrig01 != null ) { squishesAudioSource = penTrig01.gameObject.AddComponent(); squishesLPF = penTrig01.gameObject.AddComponent(); squishesLPF.cutoffFrequency = 22000.0f; } } if( squishesAudioSource != null ) { // Setting the default parameters of the audio source squishesAudioSource.spatialBlend = 1f; squishesAudioSource.dopplerLevel = 0f; squishesAudioSource.rolloffMode = AudioRolloffMode.Logarithmic; squishesAudioSource.minDistance = 1f; squishesAudioSource.maxDistance = 1.5f; squishesAudioSource.reverbZoneMix = _SQSReverbMix; } } protected void clearSquishesHandler() { // Disabling observers and removing components SexTriggerCollide tmp; if( myGender != null && myGender == DAZCharacterSelector.Gender.Female ) { if( labTrig == null ) return; labTrig.gameObject.GetComponent().OnTrigger -= LabTrigObserver; tmp = labTrig.gameObject.GetComponent(); if( tmp != null ) Destroy( tmp ); } else if ( myGender != null && myGender == DAZCharacterSelector.Gender.Male ) { if( penTrig01 == null && penTrig02 == null ) return; penTrig01.gameObject.GetComponent().OnCollide -= PenTrigObserver; penTrig02.gameObject.GetComponent().OnCollide -= PenTrigObserver; } if( squishesAudioSource != null ) Destroy( squishesAudioSource ); if( squishesLPF != null ) Destroy( squishesLPF ); squishesAudioSource = null; } // ************************** // Blowjob/Mouth // ************************** protected void initBlowjobHandler() { // If it is disable or the audiosource already exists (handler initialized) if( enableBlowjob.val == false || mouthAudioSource != null ) return; // Initializing gameplay values _BJPaused = false; // will start paused based on the options of the user/creator _BJVolume = BJVolume.val; _BJMinDelay = BJMinDelay.val; _BJReverbMix = BJReverbMix.val; _BJMoanFallbackDelay = BJMoanFallbackDelay.val; // Blowjob/mouth (slurpy sounds) mouTrig = containingAtom.rigidbodies.First(rb => rb.name == "MouthTrigger"); if( mouTrig != null ) { mouthAudioSource = mouTrig.gameObject.AddComponent(); // Setting the default parameters mouthAudioSource.spatialBlend = 1f; mouthAudioSource.dopplerLevel = 0f; mouthAudioSource.rolloffMode = AudioRolloffMode.Logarithmic; mouthAudioSource.minDistance = 1f; mouthAudioSource.maxDistance = 1.5f; mouthAudioSource.reverbZoneMix = _BJReverbMix; mouthLPF = mouTrig.gameObject.AddComponent(); mouthLPF.cutoffFrequency = 22000.0f; } mouTrig.gameObject.AddComponent().OnTrigger += MouTrigObserver; } protected void clearBlowjobHandler() { if( mouTrig == null ) return; // Disabling observers and removing components SexTriggerCollide tmp; mouTrig.gameObject.GetComponent().OnTrigger -= MouTrigObserver; tmp = mouTrig.gameObject.GetComponent(); if( tmp != null ) Destroy( tmp ); if( mouthAudioSource != null ) Destroy( mouthAudioSource ); if( mouthLPF != null ) Destroy( mouthLPF ); mouthAudioSource = null; } // ************************** // Spanking // ************************** protected void initSpankHandler() { if (gluteTriggers.Count > 0) clearSpankHandler(); // Someday we will have dudes if (myGender != null && myGender != DAZCharacterSelector.Gender.Female) return; // If it is disable or the audiosource already exists (handler initialized) if( enableSpank.val == false || spankAudioSource != null ) return; // Initializing gameplay values _SPKVolume = SPKVolume.val; _SPKReverbMix = SPKReverbMix.val; var glutes = containingAtom.rigidbodies.Where(rb => rb.name == "AutoColliderFemaleAutoCollidersLGlute1Joint" || rb.name == "AutoColliderFemaleAutoCollidersRGlute1Joint"); foreach (var rigidbody in glutes) { var gluteTrigger = rigidbody.gameObject.AddComponent(); // If the velocity isn't enough, then we ignore this (to prevent the timeout) gluteTrigger.VelocityFilter = .6f; gluteTrigger.OnCollide += GluteCollisionObserver; gluteTriggers.Add(gluteTrigger); } rbHipAS = containingAtom.rigidbodies.First(rb => rb.name == "hip"); if( rbHipAS != null ) { spankAudioSource = rbHipAS.gameObject.AddComponent(); spankLPF = rbHipAS.gameObject.AddComponent(); spankLPF.cutoffFrequency = 22000.0f; } if( spankAudioSource != null ) { // Setting the default parameters of the audio source spankAudioSource.spatialBlend = 1f; spankAudioSource.dopplerLevel = 0f; spankAudioSource.rolloffMode = AudioRolloffMode.Logarithmic; spankAudioSource.minDistance = 1f; spankAudioSource.maxDistance = 2f; spankAudioSource.reverbZoneMix = _SPKReverbMix; } } protected void clearSpankHandler() { if (gluteTriggers.Count == 0) return; // Someday we will have dudes if (myGender != null && myGender != DAZCharacterSelector.Gender.Female) return; // Disabling observers and removing components foreach (var gluteTrigger in gluteTriggers.Where(g => g != null)) { gluteTrigger.OnCollide -= GluteCollisionObserver; Destroy(gluteTrigger); } gluteTriggers.Clear(); if( spankAudioSource != null ) Destroy( spankAudioSource ); if( spankLPF != null ) Destroy( spankLPF ); spankAudioSource = null; } // ************************** // Collision events // ************************** protected void LabTrigObserver(object sender, TriggerEventArgs e) { if(e == null || e.evtType == null) return; // Timeout if (_SQSAllowed == false || _SQSPaused == true ) return; if (e.evtType == "Entered" ) { // Preventing any other sounds to be played StartCoroutine("squishesTimeout"); AudioClip sqsclip = _vammvoice.GetSquishesClip(); if (sqsclip != null) { float pitchMin = Mathf.Clamp(_SQSPitch - 0.15f, 0f, SQSPitch.max + 0.15f); float pitchMax = Mathf.Clamp(_SQSPitch + 0.15f, 0f, SQSPitch.max + 0.15f); PlayAudioSquishes(sqsclip,pitchMin,pitchMax); } } } protected void PenTrigObserver(object sender, CollideEventArgs e) { if(e == null || e.evtType == null) return; // Timeout if (_SQSAllowed == false || _SQSPaused == true ) return; if (e.evtType == "CEntered" ) { // Preventing any other sounds to be played StartCoroutine("squishesTimeout"); AudioClip sqspclip = _vammvoice.GetSquishesClip(); if (sqspclip != null) { float pitchMin = Mathf.Clamp(_SQSPitch - 0.15f, 0f, SQSPitch.max + 0.15f); float pitchMax = Mathf.Clamp(_SQSPitch + 0.15f, 0f, SQSPitch.max + 0.15f); PlayAudioSquishes(sqspclip,pitchMin,pitchMax); } } } protected void GluteCollisionObserver(object sender, CollideEventArgs e) { if(e == null || e.evtType == null) return; // Timeout if (_SPKAllowed == false ) return; if (e.evtType == "CEntered" ) { // Preventing any other sounds to be played StartCoroutine("spankTimeout"); // Relative velocity of my rigidbody and the collider triggered // I'm using only left glute to compute, not important, since both would have somewhat the same velocity due to anatomy reasons :p float colMagnitude = e.collision.relativeVelocity.magnitude; int intensityValue = 0; int reactionIntensity = 2; if( colMagnitude > 1.6f ) { intensityValue = 1; reactionIntensity = 4; } AudioClip spkclip = _vammvoice.GetSpankClip(intensityValue); if (spkclip != null) { PlayAudioSpank(spkclip,0.85f,1.15f); StartCoroutine(spankSecondarySound(reactionIntensity)); } } } protected void MouTrigObserver(object sender, TriggerEventArgs e) { if(e == null || e.evtType == null) return; // Timeout if (_BJAllowed == false || _BJPaused == true ) return; if (e.evtType == "Entered" ) { // Preventing any other sounds to be played StartCoroutine("blowjobTimeout"); // Triggering the bj trigger "start" if we have reached the moment where the fallback occured if( vammTimer > _BJEndTimeLastSample + _BJMoanFallbackDelay ) { startBlowjobTrigger.Trigger(); } AudioClip bjclip = _vammvoice.GetBlowjobClip(); if (bjclip != null) { PlayAudioBlowjob(bjclip,0.85f,1.15f); } } } // Handles the pelvic slappy slappy stuff :3 protected void PslTriggerObserver(object sender, TriggerEventArgs e) { if(e == null || e.evtType == null) return; // Timeout if (_PSLAllowed == false || _PSLPaused == true ) return; // No self collision if( containingAtom == e.collider.gameObject.GetComponentInParent() ) return; // Only on enter if (e.evtType == "Entered" ) { // Preventing any other sounds to be played StartCoroutine("pelvisSlapTimeout"); // Relative velocity of my rigidbody and the collider triggered float computedVelocity = Vector3.Magnitude ( e.collider.attachedRigidbody.velocity - pslRigidbody01.velocity ); // If the velocity isn't enough, then we ignore this (to prevent the timeout) if( computedVelocity < 0.1 ) return; _PSLLastVelocity = computedVelocity; float intensityValue = 0f; if( computedVelocity > 0.20f && computedVelocity < 0.35f ) { intensityValue = 1f; } else if( computedVelocity > 0.35f ) { intensityValue = 2f; } // Clamping the value of intensity based on user settings intensityValue = Mathf.Round( Mathf.Clamp( intensityValue, _PSLMinIntensity, _PSLMaxIntensity ) ); AudioClip pslclip = _vammvoice.GetPelvicSlapClip( (int) intensityValue); if (pslclip != null) { float pitchMin = Mathf.Clamp(_PSLPitch - 0.15f, 0f, PSLPitch.max + 0.15f); float pitchMax = Mathf.Clamp(_PSLPitch + 0.15f, 0f, PSLPitch.max + 0.15f); PlayAudioPelvicSlap(pslclip, pitchMin,pitchMax); } } } // ************************** // COROUTINES // ************************** // Inspired from ToumeiHitsuji's timeout process in slap stuff private IEnumerator pelvisSlapTimeout() { _PSLAllowed = false; yield return new WaitForSeconds(_PSLMinDelay); _PSLAllowed = true; } private IEnumerator squishesTimeout() { _SQSAllowed = false; yield return new WaitForSeconds(_SQSMinDelay); _SQSAllowed = true; } private IEnumerator blowjobTimeout() { _BJAllowed = false; yield return new WaitForSeconds(_BJMinDelay); _BJAllowed = true; } private IEnumerator spankTimeout() { _SPKAllowed = false; yield return new WaitForSeconds(_SPKMinDelay); _SPKAllowed = true; } private IEnumerator spankSecondarySound(int clipIntensity) { yield return new WaitForSeconds(0.2f); PlayAudioClipImmediate("reactions", clipIntensity); // Maybe she'd like more ? if( SPKAskForMore.val == true ) { float rndMore = UnityEngine.Random.Range(0f,1f); if( rndMore < 0.15f ) { BufferAudioClip("oneliners", clipIntensity, 6); } } } } }