This was made to demonstrate using actionscript programming with conventional clothing modding
this is a loader mod, but can be used in vanilla with no noticeable difference
mod does not change skin color, alternate color used to demonstrate features
The buttplug occasionally moves outward to make it look like she is trying to push it out of her anus.
The skin on the stretched anus part follows the skin hsl and also adjusts to skin tone selection.
The position and angle of the buttplug changes based on her leg angles, so this provides a good target if looking to get anal animtools positions looking good (i know some positions included with animtools have sloppy angles)
for moreclothing stuff, this is a body mod, example:
flexingbuttplug11.swf=Flexing Buttplug:Body>Body3
heres the code for setting up the mod to be able to reference the top level 'g' object in SDT while covering the various ways the mod can be loaded:
this is the code unique to this mod to actually make it do its special stuff
this is a loader mod, but can be used in vanilla with no noticeable difference
mod does not change skin color, alternate color used to demonstrate features
The buttplug occasionally moves outward to make it look like she is trying to push it out of her anus.
The skin on the stretched anus part follows the skin hsl and also adjusts to skin tone selection.
The position and angle of the buttplug changes based on her leg angles, so this provides a good target if looking to get anal animtools positions looking good (i know some positions included with animtools have sloppy angles)
for moreclothing stuff, this is a body mod, example:
flexingbuttplug11.swf=Flexing Buttplug:Body>Body3
heres the code for setting up the mod to be able to reference the top level 'g' object in SDT while covering the various ways the mod can be loaded:
Code:
import flash.system.ApplicationDomain;
var g;
var SDT = ApplicationDomain.currentDomain;
var loadermode:Boolean = false;
var main;
try
{
g = SDT.getDefinition("g"); //if works, means loaded from vanilla swf menu, or a loader character folder
try
{
//loader character folder
main = this.parent.parent;
g = main.g; //this should fail for vanilla
//if successful, let loader handle it through initl, otherwise will cause duplicte code running
}
catch(ex)
{
//vanilla loading
loadermode = false;
finishinit();
}
}
catch(ex)
{
//loader swf selection or moreclothing, let initl do it
}
function initl(l) : void
{
g = l.g;
main = l;
loadermode = true;
finishinit();
l.unloadMod();
}
function finishinit()
{
//this is where you put your unique code that needs to be added to the mod
bottoms.addEventListener(Event.ENTER_FRAME, mytick1);
//in the mytick1 function that runs my custom code each frame in this example, i use the "loadermode" variable to filter out things that can only be done with the loader
}
this is the code unique to this mod to actually make it do its special stuff
Code:
var counter:Number = 0;
var timer:int = 0;
var timer2:int = 0;
var speed:Number = 3;
var delay:Number = 10;
var delay2:Number = 0;
var scale:Number = 0;
function mytick1(e)
{
if(!bottoms.backside.visible || bottoms.backside.parent == null || !bottoms.backside.parent.visible || g.gamePaused)
{
//mod cleared, or moreclothing has it hidden
return;
}
if(g.characterControl.currentSkin == 0)
{
bottoms.backside.plug.myplug2.myoverlay.alpha = 0.3;
}else
if(g.characterControl.currentSkin == 1)
{
bottoms.backside.plug.myplug2.myoverlay.alpha = 0.5;
}else
if(g.characterControl.currentSkin == 2)
{
bottoms.backside.plug.myplug2.myoverlay.alpha = 0.2;
}else
if(g.characterControl.currentSkin == 3)
{
bottoms.backside.plug.myplug2.myoverlay.alpha = 0;
}
bottoms.backside.plug.myplug2.myskin.filter = g.her.torso.back.filters;
if(loadermode)
{
bottoms.backside.plug.rotation = -27 + g.her.torsoIK.m2Ang * 65 / Math.PI;
}
else
{
bottoms.backside.plug.rotation = -16; //g.her.torsoIK.m2Ang not avaliable in vanilla, use static value
}
if(timer > delay)
{
if(counter < 90 || timer2 <= 0)
{
counter = Math.min(180, counter + speed);
}
bottoms.backside.plug.myplug2.x = Math.sin(counter * Math.PI / 180) * -20 * scale;
if(counter >= 90)
{
timer2 = Math.max(0, timer2 - 1);
if(counter == 180)
{
counter = 0;
delay = 50 + Math.random() * 210;
speed = 1 + Math.random() * 2.5;
timer = 0;
timer2 = -30 + Math.random() * 70;
scale = 0.5 + Math.random() * 1.7 ;
}
}
}
else
{
timer++;
}
}