code:
function cleanSlate() {
    orificeDibs = {
        rearslot: null,
        underslot: null,
        faceslot: null,
        overslot: null,
    }
}

async function updateEnemyState(enemyDoll) {
    await setEnemyStance(enemyDoll);
}
async function updatePlayerDraw() {
    var player = globals.player;
    await playerDoll.setVariant(globals.position);

    var bottomAccessory = await playerDoll.getAccessory("bottom");
    var topAccessory = await playerDoll.getAccessory("top");
    var headAccessory = await topAccessory.getAccessory("head");
    var faceAccessory = await headAccessory.getAccessory("face");

    await updatePlayerSkin(playerDoll);
    await updatePlayerGenitals(bottomAccessory);
    await updatePlayerHair(headAccessory);
    await updatePlayerHead(headAccessory);
    await updatePlayerFace(faceAccessory);
    await updatePlayerArms(playerDoll);
    await updatePlayerTorso(topAccessory);
    await updatePlayerClothes(bottomAccessory, topAccessory);
    playerDoll.computeGlobals();
    //TODO: other body part colorings
}

async function updateEnemyDraw(doll) {
    if (doll.NPCInfo.type != 0) {
        updateBeastEnemyDraw(doll);
    } else {
        updateHumanEnemyDraw(doll);
    }

}

async function updatePlayerTorso(top) {
    var breasts = top.getAccessory("breasts");
    var breastVariant = getNameFromValue("playerbreastsize", player.breastsize);
    breasts.setVariant(breastVariant);
}

async function updatePlayerClothes(bottom, top) {
    var worn = globals.worn;
    var underLower = bottom.getAccessory("under_lower");
    var lower = bottom.getAccessory("lower");
    await underLower.setVariant(worn.under_lower.variable);
    await underLower.setVariant(worn.under_lower.state);
    underLower.setFilter(worn.under_lower.currentcolor);
    await lower.setVariant(worn.lower.variable);
    await lower.setVariant(worn.lower.state);
    lower.setFilter(worn.lower.currentcolor);
}

async function updateBeastEnemyDraw(doll) {
    var NPCInfo = doll.NPCInfo;
    if (NPCInfo.penis != "none") {
        await scaleEnemy(doll);
        doll.computeGlobals();
        //we presume magnets are defined on any player-parts of interest to which enemies should gravitate toward
        doll.dragBy("penis_base", playerDoll, NPCInfo.penis);
    }
}

async function updateHumanEnemyDraw(doll) {
    var NPCInfo = doll.NPCInfo;
    //await setEnemyStance(doll);
    await setEnemyPhysique(doll);
    await setEnemyCosmetics(doll);
    await scaleEnemy(doll);
    //doll.getAccessory("arms").setFilter("opacity(0.5)");

    if (NPCInfo.penis != "none") {
        if (doll.NPCInfo.penis.indexOf("mouth") == 0 && globals.position == "doggy") {
            doll.getCurrentVariant().setPhase(4);
        } else {
            doll.getCurrentVariant().setPhase(0);
        }
        doll.computeGlobals();
        //we presume magnets are defined on any player-parts of interest to which enemies should gravitate toward

        doll.dragBy("penis_aligned", playerDoll, NPCInfo.penis);
        //move enemy arms down to reach tiny player if
        //NPC is in upright position.
        if (doll.NPCInfo.currentstance == "upright"
            && doll.NPCInfo.currentapproachstate == "active"
            && orificeDibs.rearslot == doll) {
            var arms = doll.getAccessory("forearm");
            arms.accessoryDragBy("hands", playerDoll, "waist");
        }
        if (doll.NPCInfo.currentstance == "laying"
            && doll.NPCInfo.currentapproachstate == "active"
            && orificeDibs.underslot == doll) {
            var arms = doll.getAccessory("arms");
            arms.accessoryDragBy("hands", playerDoll, "ribs");
        }
    }
}

async function updatePlayerSkin(bodyAccessory) {
    var skin = globals.skinColor.current;
    bodyAccessory.setFilter(skin.body);
}
async function updatePlayerGenitals(bottomAccessory) {
    var player = globals.player;
    var penisVariant = player.penisExists == true ? "small" : "none";
    bottomAccessory.getAccessory("penis").setVariant(penisVariant);
}

async function updatePlayerHead(headAccessory) {
    var throatAcc = headAccessory.getAccessory("throat");
    if (orificeDibs.faceslot != null
        && orificeDibs.faceslot.NPCInfo.penis == "mouth") {
        var penetrator = orificeDibs.faceslot.NPCInfo.penissize;
        var penisDelta = penetrator - globals.player.bodysize;
        var throatMode = penisDelta > 2 ? "huge_load" : "regular_load";
        await throatAcc.setVariant("oral");
        await throatAcc.setVariant(throatMode);
    } else {
        await throatAcc.setVariant("idle");
    }
}

async function updatePlayerHair(headAccessory) {
    var hairAccessory = headAccessory.getAccessory("hair");
    await hairAccessory.setVariant(globals.hairlengthstage);
    await hairAccessory.setFilter(globals.haircolorfilter);
    var lashAccessory = headAccessory.getAccessory("lashes");
    await lashAccessory.setFilter(globals.haircolorfilter);

}
async function updatePlayerFace(faceAccessory) {
    var arousalRatio = globals.arousal / globals.arousalmax;
    var painPercent = globals.pain;
    var traumaRatio = globals.trauma / globals.traumamax;
    var arousalPercentClamped = Math.max((arousalRatio - 0.41) * 10, 0);
    var painPercentClamped = Math.max(0, (painPercent - 41) / 10);
    var minBlush = parseInt(Math.max(arousalPercentClamped, painPercentClamped - 2))
    var blushAccessory = faceAccessory.getAccessory("blush");
    var eyesAccessory = faceAccessory.getAccessory("eyes");
    var tearsAccessory = faceAccessory.getAccessory("tears");

    await blushAccessory.setVariant("blush" + parseInt(arousalRatio * 5));
    await tearsAccessory.setVariant("tears" + parseInt(painPercent / 20));

    var scleraVariant = painPercent > 90 ? "bloodshot" : "normal";
    await eyesAccessory.getAccessory("sclera").setVariant(scleraVariant);

    var pupilVariant = traumaRatio > 0.9 ? "empty" : "normal";
    await eyesAccessory.getAccessory("eyeballs").setVariant(pupilVariant);
}

async function updatePlayerArms(playerDoll) {
    var arm_right = playerDoll.getAccessory("arm_right");
    var arm_left = playerDoll.getAccessory("arm_left");
    if (globals.rightarm == "grappled")
        await arm_right.setVariant("bound");
    else if (globals.rightarm == "penis")
        await arm_right.setVariant("handjob");
    else
        await arm_right.setVariant("normal");

    if (globals.leftarm == "grappled")
        await arm_left.setVariant("bound");
    else if (globals.leftarm == "penis")
        await arm_left.setVariant("handjob");
    else
        await arm_left.setVariant("normal");
}

async function setEnemyPhysique(doll) {
    var NPCInfo = doll.NPCInfo;
    var penisSize = null;
    var breastSize = null;

    var bodyVariant = getNameFromValue("npcbodysize", NPCInfo.bodysize);
    await doll.setVariant(bodyVariant);

    //TODO: increase number of supported penis sizes in Twine codebase
    //Currently code only generates penises of size 1, 3, and 4.
    //but the system makes it easy to visually scale penises
    //so it would be nice to have at least five
    //1 = tiny
    //2 = small
    //3 = medium
    //4 = large
    //5 = huge
    var penisSize = getNameFromValue("npcpenissize", NPCInfo.penissize);

    var penis = await doll.getAccessory("penis");
    await penis.setVariant(penisSize);
    var breastSize = getNameFromValue("npcbreastsize", NPCInfo.breastsize);
    var breasts = await doll.getAccessory("chest");
    breasts.setVariant(breastSize);
}

async function setEnemyCosmetics(doll) {
    var NPCInfo = doll.NPCInfo;
    var hairAccessory = doll.getAccessory("hair");
    var hairRear = hairAccessory.getAccessory("back");
    var hairFront = hairAccessory.getAccessory("front");
    await hairRear.setVariant(NPCInfo.hairstylerear);
    await hairFront.setVariant(NPCInfo.hairstylefront);
    var hairLengthRear = getNameFromValue("npchairlengthrear", NPCInfo.hairlengthrear);
    hairLengthRear = hairLengthRear == null? "buzz" : hairLengthRear;
    await hairAccessory.setVariant(hairLengthRear);

    doll.getAccessory("penis").setFilter(NPCInfo.peniscolor);
}

//TODO: make twine code explicitly store that a penis is a strap-on in the
//NPC variables. I'm not at all sure how the system does it currently
function isStrapon(NPCInfo) {

}

//TODO: include a penis color attribute in the NPCList
//for strap-ons and non-caucasian rapists (diversity is important!).
function setPenisColor(NPCInfo) {

}

async function setEnemyStance(doll) {
    var NPCInfo = doll.NPCInfo;
    var penisTarget = getTargetPartName(NPCInfo.penis);
    var anusTarget = getTargetPartName(NPCInfo.anus);
    var vagTarget = getTargetPartName(NPCInfo.vagina);
    if (penisTarget != null) {
        var stance = reserveStanceIfAvailable(doll, penisTarget);
        await doll.setVariant(stance.variant);
        NPCInfo.currentstance = stance.variant;
    }
    if (vagTarget != null) {
        var stance = reserveStanceIfAvailable(doll, penisTarget);
        await doll.setVariant(stance.variant);
        NPCInfo.currentstance = stance.variant;
        //update the stance of whichever NPC we had to steal the slot from
        if (stance.stealFrom != null) setEnemyStance(stance.stealFrom);
    }
    if (anusTarget != null) {
        var stance = reserveStanceIfAvailable(doll, anusTarget);
        await doll.setVariant(stance.variant);
        NPCInfo.currentstance = stance.variant;
        //update the stance of whichever NPC we had to steal the slot from
        if (stance.stealFrom != null) setEnemyStance(stance.stealFrom);
    }
    var state = getState(doll);
    await doll.setVariant(state);
    NPCInfo.currentapproachstate = state;
}

/**
 * determines if the NPC state is one of "imminent", "entrance", "penetrated"
 * @param {*} doll
 */
function getState(doll) {
    if (doll.NPCInfo.penis.indexOf("imminent") != -1) return "imminent";
    if (doll.NPCInfo.penis.indexOf("entrance") != -1) return "entrance";
    switch (doll.NPCInfo.penis) {
        case "anus":
        case "mouth":
        case "vagina": return "active"
        default: return doll.NPCInfo.penis;
    }
}

/**
 * scales the NPC enemy to the appropriate body size
 * relative to the player character
 * (so the player character is always rendered at the same size,
 * and the NPC is scaled up or down in proportion)
 *
 */
async function scaleEnemy(doll) {
    doll.computeGlobals();
    var playerInfo = SugarCube.State.variables.player;
    var globals = SugarCube.State.variables;
    doll.scale.x = doll.default_params.scale.x;
    doll.scale.y = doll.default_params.scale.y;

    playerInfo.bodysize = parseInt(playerInfo.bodysize);
    switch (playerInfo.bodysize) {
        case undefined: var playerSize = 1; break;
        case 1: var playerSize = 0.77; break;
        case 2: var playerSize = 0.88; break;
        case 3: var playerSize = 1.0; break;
        case 4: var playerSize = 1.11; break;
    }
    switch (doll.NPCInfo.bodysize) {
        case undefined: var playerSize = 1; break;
        case 1: var npcSize = 0.775; break;
        case 2: var npcSize = 0.88; break;
        case 3: var npcSize = 1.0; break;
        case 4: var npcSize = 1.11; break;
        case 5: var npcSize = 1.22; break;
        case 6: var npcSize = 1.33; break;
        case 7: var npcSize = 1.5; break;
        default: var npcSize = 1;
    }

    doll.scale.x /= playerSize;
    doll.scale.y /= playerSize;

    if (doll.NPCInfo.penis != "none") {
        if((doll.NPCInfo.penis.indexOf("mouth") == 0 && globals.position == "doggy"))
            doll.scale.x = Math.abs(doll.scale.x) * -1;
        //also scale the legs along the y axis to make it look like
        //large characters are spreading their legs to lower themselves
        var legs = doll.getAccessory("legs");
        if (legs != null) {
            legs.scale.y = legs.default_params.scale.y;
            if (doll.NPCInfo.currentapproachstate == "active"
                || doll.NPCInfo.currentapproachstate == "entrance"
                && globals.position == "doggy"
                && dibMap.underslot != doll) {
                var legScalar = playerSize / npcSize;
                legs.scale.y *= ((2 * legScalar) + 1.0) / 3;
            }

            //cross over the player's legs if the stance is far enough
            if (legs.scale.y < 0.85) {
                legs.translate.depth = 7;
            } else {
                legs.translate.depth = 0;
            }
        }
    }
}

/**
 * Returns the appropriate stance for this doll to take
 * given its purported target
 * @param {*} doll
 * @param {*} target
 */
function reserveStanceIfAvailable(doll, target) {
    var globals = SugarCube.State.variables;
    var targMap = dibMap[globals.position][target];
    var hasPriority = (target == "penis" && position == "missionary")
    doll.NPCInfo.hasPriority = hasPriority;
    for (var k of Object.keys(targMap)) {
        var check = targMap[k];
        if (orificeDibs[check] == null || orificeDibs[check] == doll) {
            orificeDibs[check] = doll;
            return { variant: k, stoleFrom: false };
        } else if (hasPriority) {
            var stealFrom = orificeDibs[check];
            if (!stealFrom.NPCInfo.hasPriority) {
                orificeDibs[check] = doll;
                return { variant: k, stoleFrom: stealFrom };
            }
        }
    }
    return null;
}

/**strips things like "imminent" and "entrance" from a target name
 * for easy slot check references
 */
function getTargetPartName(partName) {
    if (typeof partName == "string") {
        if (partName.indexOf("anus") == 0) return "anus";
        if (partName.indexOf("mouth") == 0) return "mouth";
        if (partName.indexOf("vagina") == 0) return "vagina";
        if (partName.indexOf("penis") == 0) return "penis";
    }
    return null;
}

/**
 * maps available slots on player for NPCs against orificeDibs.
 * The basic idea is that the NPC selects the orifice or appendage they are trying
 * to use from either the doggy or missionary position
 * (as defined by the player stance).
 * They then traverse each of the keys defined on that orifice in the order
 * they are defined.
 * Each key corresponds to a variant-name in the doll. The value of each key
 * corresponds to a key in orificeDibs. If the value of the key in orificeDibs is true,
 * then that means the Doll can adopt the stance specified by the key in the dibMap.
 *
 * For example:
 *  Let's say the player is in the doggy position and the NPC wants to penetrate the player's vagina.
 *  So it checks dibMap.doggy.vagina, which tells it
 *  "if you want to be in the 'upright' position, you need to check that orificeDibs.rearslot is available".
 *  The NPC checks orificeDibs.rearslot and finds that it is no longer available.
 *  So it moves on to the next option. Which states
 *  "if you want to be in the 'laying" position, you need to check that orificeDibs.underslot is available".
 *  The NPC checkes orificeDibs.underslot and find that it is available.
 *  So it adopts the 'laying' position, and sets the orificeDibs.underslot value to a reference to itself to indicate
 *  to any other NPCs that the spot is reserved by it, and that any NPCs who wish to cut in line must talk to it directly/
 *
 */
var dibMap = {
    doggy: {
        vagina: {
            upright: "rearslot",
            laying: "underslot"
        },
        anus: {
            upright: "rearslot"
        },
        penis: {
            laying: "underslot"
        },
        mouth: {
            upright: "faceslot"
        }
    },
    missionary: {
        penis: {
            hunched: "overslot"
        },
        vagina: {
            hunched: "overslot",
            crouched: "rearslot"
        },
        anus: {
            laying: "underslot"
        },
        mouth: {
            upright: "faceslot"
        }
    }
};
var orificeDibs = {
    rearslot: null,
    underslot: null,
    faceslot: null,
    overslot: null,
}


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE
    horse: {
        import: {
            filepath : "horse/horse.js",
            variable : "horse"
        }
    }
}); //IT IS VERY IMPORTANT THAT THE LAST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE

repo_name: Area/degrees

license: mit


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE
horse : {
    translate: {x:0, y:0, depth: 20},
    frames: 7,
    selected_variant : "active",
    variants : {
        active : {
            import : {variable: "horse_penetrated"}
        }
    }
},
horse_penetrated :
{
    spritesheet: "penetrated.png", //the filename of the spriteesheet for this FDoll/accessory
    width : 1624, //width of the spritesheet, in pixels.
    frames : 7, //number of frames in the spritesheet.
    magnets: { //names and locations of spots we can attach accessories to
         penis_base : {x: 152, y: 108, depth: -20},
         penis_tip : {x: 130, y: 114},
         front_hoof : {x: 39, y: 54},
         cutoff : {x:128, y: 0, depth: -10},
         saddle: {x: 170, y:0}
    },
    accessories: {
        penis: {
            width : 1624,
            frames : 7,
            spritesheet: "penetrated_penis.png",
            attach: "penis_base",
            to: "penis_base",
            magnets : {
                penis_base : {x: 152, y: 108},
            }
        }
        /*head : {
            attach: "hips",
            to: "cutoff",
            variants : {
                    centaur: {
                        specifier: "../human/human.js",
                        scale: {x:1.5, y: 1.2},
                        data: "human"
                    },
                    normal: {}
                }

        },
        rider : {
            attach: "hips",
            to: "saddle",
            specifier: "../human/human.js",
            data: "human"
        }*/
    }
}
});


code:
DoLHouse.add({
	breast_variants: {
		frames: 8,
		inherit_sequence_info: true,
		variants: {
			upright: {
				translate: { x: 0, y: 0, depth: 8 },
				import: {
					filepath: "upright/breasts_upright.js",
					variable: "breasts_upright"
				}
			},
			laying: {
				width: 648,
				frames: 4,
				translate: { x: 0, y: 0, depth: 7 },
				filter: "drop-shadow(0px -12px 8px #0006)",
				magnets: {
					base: { x: 62, y: 90 }
				},
				selected_variant: "flat",
				variants: {
					flat: {},
					budding: {
						inherit_filter: true,
						spritesheet: "laying/budding.png"
					},
					tiny: { spritesheet: "laying/tiny.png" },
					small: { spritesheet: "laying/small.png" },
					pert: {
						inherit_filter: true,
						scale: { x: 1.1, y: 1.1 },
						spritesheet: "laying/small.png"
					},
					modest: {
						inherit_filter: true,
						spritesheet: "laying/medium.png"
					},
					full: {
						inherit_filter: true,
						scale: { x: 1.1, y: 1.1 },
						spritesheet: "laying/medium.png"
					},
					large: {
						inherit_filter: true,
						spritesheet: "laying/large.png"
					},
					ample: {
						inherit_filter: true,
						scale: { x: 1.1, y: 1.1 },
						spritesheet: "laying/large.png"
					},
					massive: {
						inherit_filter: true,
						spritesheet: "laying/massive.png"
					},
					huge: {
						inherit_filter: true,
						scale: { x: 1.1, y: 1.1 },
						spritesheet: "laying/massive.png"
					},
					gigantic: {
						inherit_filter: true,
						spritesheet: "laying/huge.png"
					},
					enormous: {
						inherit_filter: true,
						scale: { x: 1.1, y: 1.1 },
						spritesheet: "laying/huge.png"
					},
				}
			}
		}
	}
});


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE

    breasts_upright: {
        inherit_sequence_info: true, /*signifies that this accessory should adopt whatever sequence is specified on the most immediate ancestor*/
        sequences: {
            imminent: [7,7,7]
        },
        variants: {
            flat: {
                /*lol, why woud there be a spritesheet for this?*/
            },
            budding: {
                inherit_sequence_info: true,
                width: 552,
                scale: { x: 1, y: 1 },
                magnets: {base: { x: 45, y: 62 }},
                spritesheet: "budding_h.png"
            },
            tiny: {
                inherit_sequence_info: true,
                width: 552,
                scale: { x: 1.2, y: 1.2 },
                magnets: { base: { x: 45, y: 62 } },
                spritesheet: "budding_h.png"
            },
            small: {
                inherit_sequence_info: true,
                width: 784,
                scale: { x: 1, y: 1 },
                magnets: { base: { x: 75, y: 75 } },
                spritesheet: "small_h.png"
            },
            pert: {
                inherit_sequence_info: true,
                width: 784,
                scale: { x: 1.1, y: 1.1 },
                magnets: { base: { x: 75, y: 73 } },
                spritesheet: "small_h.png"
            },
            modest: {
                inherit_sequence_info: true,
                width: 864,
                scale: { x: 0.9, y: 0.9 },
                magnets: { base: { x: 87, y: 78 } },
                spritesheet: "full_h.png"
            },
            full: {
                inherit_sequence_info: true,
                width: 864,
                scale: { x: 1, y: 1 },
                magnets: { base: { x: 87, y: 68 } },
                spritesheet: "full_h.png"
            }
            ,
            large: {
                inherit_sequence_info: true,
                width: 864,
                scale: { x: 1.1, y: 1.1 },
                magnets: { base: { x: 87, y: 68 } },
                spritesheet: "full_h.png"
            },
            ample: {
                inherit_sequence_info: true,
                width: 1282,
                scale: { x: 0.9, y: 0.9 },
                magnets: { base: { x: 101, y: 70 } },
                spritesheet: "ample_h.png"
            },
            massive: {
                inherit_sequence_info: true,
                width: 1282,
                scale: { x: 1.1, y: 1.1 },
                magnets: { base: { x: 101, y: 65 } },
                spritesheet: "ample_h.png"
            }
            ,
            huge: {
                inherit_sequence_info: true,
                width: 1488,
                scale: { x: 0.9, y: 0.9 },
                magnets: { base: { x: 129, y: 85 } },
                spritesheet: "huge_h.png"
            },
            gigantic: {
                inherit_sequence_info: true,
                width: 1488,
                scale: { x: 1, y: 1 },
                magnets: { base: { x: 129, y: 76 } },
                spritesheet: "huge_h.png"
            }
            ,
            enormous: {
                inherit_sequence_info: true,
                width: 1488,
                scale: { x: 1.2, y: 1.2 },
                magnets: { base: { x: 129, y: 72 } },
                spritesheet: "huge_h.png"
            }
        }
    }
}); //IT IS VERY IMPORTANT THAT THE LAST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE

    braid: {
        accessories: {
            moreHair: {
                inherit_sequence_info: true,
                width: 1160,
                attach: "base",
                to: "end",
                phase: 0,

                variants: {
                    buzz: {
                        scale: { x: 1, y: 1.3 },
                        import: {
                            variable: "tips"
                        }
                    },
                    short: {
                        scale: { x: 1, y: 1.3 },
                        import: { variable: "short" }
                    },
                    trimmed: {
                        import: { variable: "trimmed" }
                    },
                    flowing: {
                        scale: { x: 1, y: 1.3 },
                        import: { variable: "flowing" }
                    },
                    long: {
                        scale: { x: 1, y: 1.3 },
                        import: { variable: "long" }
                    },
                    luxurious: {
                        scale: { x: 1, y: 1.3 },
                        import: { variable: "luxurious" }
                    },
                    uncompromising: {
                        scale: { x: 1, y: 1.3 },
                        import: { variable: "uncompromising" }
                    },
                    repunzotic: {
                        scale: { x: 1, y: 1.3 },
                        import: { variable: "repunzotic" }
                    },
                    endless: {
                        scale: { x: 1, y: 1.3 },
                        import: { variable: "endless" }
                    }
                }
            }

        }

    },

    endless: {
        inherit_sequence_info: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820 - 808, y: 20 },
            end: { x: 820 - 808, y: 70 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "repunzotic" }
            }
        }
    },
    repunzotic: {
        inherit_sequence_info: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820 - 808, y: 20 },
            end: { x: 820 - 808, y: 70 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "uncompromising" }
            }
        }
    },
    uncompromising: {
        inherit_sequence_info: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820 - 808, y: 20 },
            end: { x: 820 - 808, y: 70 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "luxurious" }
            }
        }
    },
    luxurious: {
        inherit_sequence_info: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820 - 808, y: 20 },
            end: { x: 820 - 808, y: 70 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "long" }
            }
        }
    },
    long: {
        inherit_sequence_info: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820 - 808, y: 20 },
            end: { x: 820 - 808, y: 70 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "flowing" }
            }
        }
    },
    flowing: {
        inherit_sequence_info: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820 - 808, y: 20 },
            end: { x: 820 - 808, y: 70 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "trimmed" }
            }
        }
    },
    trimmed: {
        inherit_sequence_info: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820 - 808, y: 20 },
            end: { x: 820 - 808, y: 70 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "short" }
            }
        }
    },
    short: {
        inherit_sequence_info: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820 - 808, y: 20 },
            end: { x: 820 - 808, y: 70 }
        },
        accessories: {
            tips: {
                attach: "base",
                to: "end",
                import: {
                    variable: "tips"
                }
            }
        }
    },
    tips: {
        inherit_sequence_info: true,
        phase: 1,
        width: 1608,
        spritesheet: "tipstart_h.png",
        scale: { x: 0.5, y: 1 },
        magnets: {
            base: { x: 744 - 768, y: 5 },
            end: { x: 820 - 768, y: 40 }
        },
        accessories: {
            tipends: {
                attach: "base",
                to: "end",
                phase: 1,
                width: 1712,
                spritesheet: "tipend_h.png",
                scale: { x: 0.9, y: 1 },
                magnets: {
                    base: { x: 820 - 769, y: 0 }
                }
            }

        }
    }
});  //IT IS VERY IMPORTANT THAT THE LAST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE

    femme: {
        accessories: {
            moreHair: {
                inherit_sequence_info: true,
                inherit_filter: true,
                attach: "base",
                to: "end",
                width: 1520,
                selected_variant: "trimmed",
                variants: {
                    buzz: {
                        scale: { x: 1, y: 3 },
                        import: {
                            variable: "tips"
                        }
                    },
                    short: {
                        scale: { x: 1, y: 3 },
                        import: { variable: "short" }
                    },
                    trimmed: {
                        scale: { x: 1, y: 3 },
                        import: { variable: "trimmed" }
                    },
                    flowing: {
                        scale: { x: 1, y: 3 },
                        import: { variable: "flowing" }
                    },
                    long: {
                        scale: { x: 1, y: 3 },
                        import: { variable: "long" }
                    },
                    luxurious: {
                        scale: { x: 1, y: 3 },
                        import: { variable: "luxurious" }
                    },
                    uncompromising: {
                        scale: { x: 1, y: 3 },
                        import: { variable: "uncompromising" }
                    },
                    repunzotic: {
                        scale: { x: 1, y: 3 },
                        import: { variable: "repunzotic" }
                    },
                    endless: {
                        scale: { x: 1, y: 3 },
                        import: { variable: "endless" }
                    }
                }
            }
        }
    },

    endless: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "extension_h.png",
        magnets: {
            base: { x: 95, y: 35 },
            end: { x: 95, y: 55 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "repunzotic" }
            }
        }
    },
    repunzotic: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "extension_h.png",
        magnets: {
            base: { x: 95, y: 35 },
            end: { x: 95, y: 55 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "uncompromising" }
            }
        }
    },
    uncompromising: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "extension_h.png",
        magnets: {
            base: { x: 95, y: 35 },
            end: { x: 95, y: 55 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "luxurious" }
            }
        }
    },
    luxurious: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "extension_h.png",
        magnets: {
            base: { x: 95, y: 35 },
            end: { x: 95, y: 55 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "long" }
            }
        }
    },
    long: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "extension_h.png",
        magnets: {
            base: { x: 95, y: 35 },
            end: { x: 95, y: 55 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "flowing" }
            }
        }
    },
    flowing: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "extension_h.png",
        magnets: {
            base: { x: 95, y: 35 },
            end: { x: 95, y: 55 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "trimmed" }
            }
        }
    },
    trimmed: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "extension_h.png",
        magnets: {
            base: { x: 95, y: 35 },
            end: { x: 95, y: 55 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import: { variable: "short" }
            }
        }
    },
    short: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "extension_h.png",
        magnets: {
            base: { x: 95, y: 35 },
            end: { x: 95, y: 55 }
        },
        accessories: {
            short: {
                attach: "base",
                to: "end",
                import: {
                    variable: "tips"
                }
            }
        }
    },
    tips: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: 1,
        width: 1608,
        spritesheet: "tipstart_h.png",
        scale: { x: 1, y: 0.5 },
        magnets: {
            base: { x: 120, y: 0 },
            end: { x: 95, y: 40 }
        },
        accessories: {
            tipends: {
                inherit_sequence_info: true,
                attach: "base",
                to: "end",
                phase: 1,
                width: 1712,
                spritesheet: "tipend_h.png",
                scale: { x: 1, y: 0.5 },
                magnets: {
                    base: { x: 95, y: 0 }
                }
            }
        }
    },
    extension_magnets: {
        magnets: {
            base: { x: 95, y: 20 },
            end: { x: 95, y: 60 }
        }
    }
});  //IT IS VERY IMPORTANT THAT THE LAST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE

    pigtails: {
        inherit_sequence_info: true,
        accessories: {
            split: {
                translate: {x:-10, y: -25},
                inherit_filter: true,
                inherit_sequence_info: true,
                selected_sequence: "active",
                phase: 0,
                accessories: {
                    tail1: {
                        scale: {x: 0.6, y:1},
                        translate: { x: 60, y: -1, depth: -1 },
                        phase: 0,
                        inherit_filter: true,
                        inherit_sequence_info: true,
                        import: {
                            filepath: "ponytail.js",
                            variable: "ponytail"

                        }
                    },
                    tail2: {
                        filter: "brightness(0.9)",
                        scale: {x: -0.6, y:1},
                        inherit_filter: true,
                        inherit_sequence_info: true,
                        translate: { x: 180, y: -1, depth: -1 },
                        phase: -2,
                        import: {
                            filepath: "ponytail.js",
                            variable: "ponytail"
                        }
                    }
                }
            }
        }
    }

});  //IT IS VERY IMPORTANT THAT THE LAST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE

    ponytail: {
        inherit_sequence_info: true,
        inherit_filter: true,
        accessories: {
                    moreHair: {
                        inherit_sequence_info: true,
                        inherit_filter: true,
                        width: 1160,
                        attach: "base",
                        to: "end",
                        phase: 0,

                        variants: {
                            buzz: { scale: {x:1 , y: 1},
                                import : {
                                    variable: "short"
                                }
                            },
                            short: {
                                scale: {x:1 , y: 1.7},
                                import : {variable: "short"}
                            },
                            trimmed: {
                                scale: {x:1 , y: 1.7},
                                import : {variable: "trimmed"}
                            },
                            flowing: { scale: {x:1 , y: 1.7},
                                import : {variable: "flowing"}
                            },
                            long: { scale: {x:1 , y: 1.7},
                                import : { variable: "long"}
                            },
                            luxurious: { scale: {x:1 , y: 1.7},
                                import : { variable: "luxurious"}
                            },
                            uncompromising: { scale: {x:1 , y: 1.7},
                                import : { variable: "uncompromising"}
                            },
                            repunzotic: { scale: {x:1 , y: 1.7},
                                import : { variable: "repunzotic"}
                            },
                            endless: { scale: {x:1 , y: 1.7},
                                import : { variable: "endless"}
                            }
                        }
                    }

             }
    },

    endless: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820-808, y: 30 },
            end: { x: 820-808, y: 50 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import : { variable: "repunzotic"}
            }
        }
    },
    repunzotic: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820-808, y: 20 },
            end: { x: 820-808, y: 50 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import : { variable: "uncompromising"}
            }
        }
    },
    uncompromising: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820-808, y: 20 },
            end: { x: 820-808, y: 50 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import : { variable: "luxurious" }
            }
        }
    },
    luxurious: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820-808, y: 20 },
            end: { x: 820-808, y: 50 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import : { variable: "long"}
            }
        }
    },
    long: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820-808, y: 20 },
            end: { x: 820-808, y: 50 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import : { variable: "flowing"}
            }
        }
    },
    flowing: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820-808, y: 20 },
            end: { x: 820-808, y: 50 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import : { variable: "trimmed"}
            }
        }
    },
    trimmed: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820-808, y: 20 },
            end: { x: 820-808, y: 50 }
        },
        accessories: {
            inter: {
                attach: "base",
                to: "end",
                import : {variable: "short"}
            }
        }
    },
    short: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: -1,
        spritesheet: "thinextension_h.png",
        magnets: {
            base: { x: 820-808, y: 20 },
            end: { x: 820-808, y: 50 }
        },
        accessories: {
            tips: {
                attach: "base",
                to: "end",
                import: {
                    variable: "tips"
                }
            }
        }
    },
    tips: {
        inherit_sequence_info: true,
        inherit_filter: true,
        phase: 1,
        width: 1608,
        spritesheet: "tipstart_h.png",
        scale: { x: 0.5, y: 1 },
        magnets: {
            base: { x: 744-768, y: 5 },
            end: { x: 820-768, y: 40 }
        },
        accessories: {
            tipends: {
                inherit_filter: true,
                attach: "base",
                to: "end",
                phase: 1,
                width: 1712,
                spritesheet: "tipend_h.png",
                scale: { x: 0.9, y: 1 },
                magnets: {
                    base: { x: 820-769, y: 0 }
                }
            }

        }
    }
});  //IT IS VERY IMPORTANT THAT THE LAST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE
    hair: {
        //width: 2048,
        //frames: 8,
        attach: "base",
        to: "top",
        inherit_sequence_info: true,
        translate: { x: 0, y: 0, depth: 10 },
        variants: {
            upright: {
                inherit_sequence_info: true,
                accessories: {
                    front: {
                        width: 125,
                        frames: 1,
                        selected_variant: "swept",
                        variants: {
                            none: {},
                            bangs: {
                                spritesheet: "front/upright/bangs.png",
                                attach: "base",
                                to: "hairfront",
                                phase: -1,
                                magnets: {
                                    base: { x: 40, y: 74 }
                                }
                            },
                            pulledback: {
                                spritesheet: "front/upright/pulledback.png",
                                attach: "base",
                                to: "hairfront",
                                magnets: {
                                    base: { x: 40, y: 74 }
                                }
                            },
                            combed: {
                                spritesheet: "front/upright/combed.png",
                                attach: "base",
                                to: "hairfront",
                                magnets: {
                                    base: { x: 40, y: 74 }
                                }
                            },
                            swept: {
                                spritesheet: "front/upright/swept.png",
                                attach: "base",
                                to: "hairfront",
                                width: 222,
                                magnets: {
                                    base: { x: 40, y: 74 }
                                }
                            }
                        },

                    },
                    back: {
                        inherit_sequence_info: true,
                        inherit_filter: true,
                        selected_variant: "femme",
                        variants: {
                            femme: {
                                inherit_sequence_info: true,
                                inherit_filter: true,
                                accessories: {
                                    roots: {
                                        inherit_sequence_info: true,
                                        phase: 0,
                                        width: 2088,
                                        spritesheet: "bowl_h.png",
                                        magnets: {
                                            base: { x: 820 - 760, y: 0 },
                                            end: { x: 150, y: 158 }
                                        },

                                        import: {
                                            filepath: "back/upright/femme.js",
                                            variable: "femme"
                                        }
                                    }

                                }
                            },
                            braid: {
                                inherit_sequence_info: true,
                                inherit_filter: true,

                                accessories: {
                                    roots: {
                                        inherit_sequence_info: true,
                                        phase: 0,
                                        width: 2088,
                                        spritesheet: "bowl_h.png",
                                        magnets: {
                                            base: { x: 820 - 738, y: 0 },
                                            end: { x: 900 - 738, y: 80 }
                                        },
                                        import: {
                                            filepath: "back/upright/braid.js",
                                            variable: "braid"
                                        }
                                    }

                                }
                            },
                            pigtails: {
                                inherit_sequence_info: true,
                                inherit_filter: true,
                                accessories: {
                                    roots: {
                                        inherit_sequence_info: true,
                                        phase: 0,
                                        width: 2088,
                                        spritesheet: "bowl_h.png",
                                        magnets: {
                                            base: { x: 820 - 738, y: 0 },
                                            end: { x: 900 - 738, y: 80 }
                                        },
                                        import: {
                                            filepath: "back/upright/pigtails.js",
                                            variable: "pigtails"
                                        }
                                    }

                                }
                            },
                            ponytail: {
                                inherit_sequence_info: true,
                                inherit_filter: true,

                                accessories: {
                                    roots: {
                                        inherit_sequence_info: true,
                                        phase: 0,
                                        width: 2088,
                                        spritesheet: "bowl_h.png",
                                        magnets: {
                                            base: { x: 820 - 738, y: 0 },
                                            end: { x: 900 - 738, y: 80 }
                                        },

                                        import: {
                                            filepath: "back/upright/ponytail.js",
                                            variable: "ponytail"
                                        }
                                    }
                                }
                            }
                        }

                    }
                }
            },
            laying: {
                accessories: {
                    front: {
                        width: 104,
                        frames: 1,
                        selected_variant: "swept",
                        variants: {
                            none: {},
                            bangs: {
                                spritesheet: "front/laying/bangs.png",
                                attach: "base",
                                to: "hairfront",
                                phase: -1,
                                magnets: {
                                    base: { x: 74, y: 40 }
                                }
                            },
                            pulledback: {
                                spritesheet: "front/laying/pulledback.png",
                                attach: "base",
                                to: "hairfront",
                                magnets: {
                                    base: { x: 74, y: 40 }
                                }
                            },
                            combed: {
                                spritesheet: "front/laying/combed.png",
                                attach: "base",
                                to: "hairfront",
                                magnets: {
                                    base: { x: 74, y: 40 }
                                }
                            },
                            swept: {
                                spritesheet: "front/laying/swept.png",
                                attach: "base",
                                to: "hairfront",
                                width: 222,
                                magnets: {
                                    base: { x: 74, y: 40 }
                                }
                            }
                        },

                    },
                    back: {
                        selected_variant: "trimmed",
                        attach: "base",
                        to: "top",
                        magnets: {
                            base: {x: 160, y:168},
                        },
                        frames: 1,
                        variants: {
                            none: {},
                            bob: {
                                spritesheet: "back/laying/short.png"
                            },
                            short: {
                                spritesheet: "back/laying/short.png"
                            },
                            trimmed: {
                                spritesheet: "back/laying/medium.png"
                            },
                            flowing: {
                                spritesheet: "back/laying/medium.png"
                            },
                            long: {
                                spritesheet: "back/laying/long.png"
                            },
                            luxurious: {
                                spritesheet: "back/laying/long.png"
                            },
                            uncompromising: {
                                spritesheet: "back/laying/repunzotic.png"
                            },
                            repunzotic: {
                                spritesheet: "back/laying/repunzotic.png"
                            },
                            endless: {
                                spritesheet: "back/laying/repunzotic.png"
                            }
                        }

                    }
                }
            }

        }
    }

}); //IT IS VERY IMPORTANT THAT THE LAST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE

    human_arms: {
        selected_variant: "upright",
        inherit_filter: true,
        variants: {
            upright: {
                inherit_filter: true,
                selected_variant: "imminent",
                variants: {
                    active: {
                        inherit_filter: true,
                        translate: { x: 0, y: 0, depth: 10 },
                        spritesheet: "arms/arm_upright.png",
                        width: 3256, //width of the spritesheet, in pixels.
                        frames: 8, //number of frames in the spritesheet.
                        magnets: { //names and locations of spots we can attach accessories to
                            base: { x: 290, y: 55, depth: 2 },
                            //base: { x: 288, y: 62, depth: 2 },
                            //hands: {x: 64, y: 226}
                        },
                        accessories: {
                            forearm: {
                                spritesheet: "arms/forearm_upright.png",
                                width: 3256, //width of the spritesheet, in pixels.
                                frames: 8, //number of frames in the spritesheet.
                                magnets: {
                                    hands: { x: 114, y: 250 }
                                }
                            }
                        }
                    },
                    imminent: {
                        inherit_filter: true,
                        translate: { x: 0, y: 0, depth: 10 },
                        spritesheet: "arms/imminent_h.png",
                        width: 918, //width of the spritesheet, in pixels.
                        frames: 3, //number of frames in the spritesheet.
                        magnets: { //names and locations of spots we can attach accessories to
                            base: { x: 158, y: 30, depth: 2 }
                        }
                    },
                    entrance: {
                        inherit_filter: true,
                        translate: { x: 0, y: 0, depth: 2 },
                        spritesheet: "arms/imminent_h.png",
                        width: 918, //width of the spritesheet, in pixels.
                        frames: 3, //number of frames in the spritesheet.
                        magnets: { //names and locations of spots we can attach accessories to
                            base: { x: 158, y: 30, depth: 2 }
                        }
                    }
                }
            },
            laying: {
                inherit_filter: true,
                selected_variant: "active",
                variants: {
                    active: {
                        inherit_filter: true,
                        translate: { x: 0, y: 0, depth: 10 },
                        filter: "drop-shadow(7px -13px 6px #0006)",
                        magnets: { //names and locations of spots we can attach accessories to
                            base: { x: 120, y: 300, depth: 0 },
                            hands: {x: 140, y: 90}
                            //base: { x: 288, y: 62, depth: 2 },
                            //hands: {x: 64, y: 226}
                        },
                        selected_variant: "vaginal",
                        variants : {
                            vaginal : {
                                inherit_filter: true,
                                spritesheet: "arms/laying_h.png",
                                width: 1096, //width of the spritesheet, in pixels.
                                frames: 4, //number of frames in the spritesheet.
                            },
                            anal : {
                                inherit_filter: true,
                                spritesheet: "arms/laying_h.png",
                                width: 1096, //width of the spritesheet, in pixels.
                                frames: 4, //number of frames in the spritesheet.
                            }
                        }
                    }
                }
            }
        }
    },
    human_legs: {
        selected_variant: "upright",
        variants: {
            upright: {
                variants: {
                    active: {
                        import: { variable: "upright_leg" },
                        selected_sequence: "active"

                    },
                    imminent: {
                        import: { variable: "upright_leg" },
                        selected_sequence: "imminent"
                    },
                    entrance: {
                        import: { variable: "upright_leg" },
                        selected_sequence: "imminent"
                    }
                }
            },
            laying: {}
        }
    },
    human_head: {
        inherit_sequence_info: true,
        /**NPC body size can be scaled by various factors
         * but big people don't generally have proportionally
         * large heads so we scale the head up or down to compensate a bit
         * by specifiying different head scale variants for different body_size variants.
         *
         * (this works because specifying a variant on Doll will cause the any variant of the same name
         *  to be activated on any child accessories)
         */
        variants: {
            joke_body: {
                inherit_sequence_info: true,
                scale: { x: 0.6, y: 0.6 },
                import: { variable: "head_stance_variants" }
            },
            giant_body: {
                inherit_sequence_info: true,
                scale: { x: 0.76, y: 0.76 },
                import: { variable: "head_stance_variants" }
            },
            huge_body: {
                inherit_sequence_info: true,
                scale: { x: 0.83, y: 0.83 },
                import: { variable: "head_stance_variants" }
            },
            large_body: {
                inherit_sequence_info: true,
                scale: { x: 0.9, y: 0.9 },
                import: { variable: "head_stance_variants" }
            },
            medium_body: {
                inherit_sequence_info: true,
                scale: { x: 0.9, y: 0.9 },
                import: { variable: "head_stance_variants" }
            },
            petite_body: {
                inherit_sequence_info: true,
                scale: { x: 1, y: 1},
                import: { variable: "head_stance_variants" }
            },
            small_body: {
                inherit_sequence_info: true,
                scale: { x: 1.1, y: 1.1 },
                import: { variable: "head_stance_variants" }
            },
            tiny_body: {
                inherit_sequence_info: true,
                scale: { x: 1.2, y: 1.2 },
                import: { variable: "head_stance_variants" }
            }
        }
    },
    defaultHumanAccessoriesList: {
        arms: {
            import: { variable: "human_arms" },
            attach: "base",
            to: "shoulders"
        },
        chest: {
            import: {
                filepath: "breasts/breasts.js",
                variable: "breast_variants"
            },
            attach: "base",
            to: "sternum"
        },
        legs: {
            import: { variable: "human_legs" },
            attach: "base",
            to: "hips"
        },
        head: {
            inherit_sequence_info: true,
            import: { variable: "human_head" },
            attach: "base",
            to: "neck"
        },
        penis: {
            import: {
                filepath: "penis/penis.js",
                variable: "penis"
            }
        }
    },
    human: {
        width: 1632,
        frames: 8,
        scale: { x: 0.25, y: 0.25 },
        selected_variant: "medium_body",
        variants: {
            joke_body: {
                scale: { x: 3, y: 3 },
                import: { variable: "stance_variants" }
            },
            giant_body: {
                scale: { x: 1.5, y: 1.5 },
                import: { variable: "stance_variants" }
            },
            huge_body: {
                scale: { x: 1.33, y: 1.33 },
                import: { variable: "stance_variants" }
            },
            large_body: {
                scale: { x: 1.22, y: 1.22 },
                import: { variable: "stance_variants" }
            },
            medium_body: {
                scale: { x: 1.11, y: 1.11 },
                import: { variable: "stance_variants" }
            },
            petite_body: {
                scale: { x: 1, y: 1 },
                import: { variable: "stance_variants" }
            },
            small_body: {
                scale: { x: 0.88, y: 0.88 },
                import: { variable: "stance_variants" }
            },
            tiny_body: {
                scale: { x: 0.775, y: 0.775 },
                import: { variable: "stance_variants" }
            }
        }
    },
    stance_variants: {
        selected_variant: "upright",
        variants: {
            upright: {
                selected_variant: "imminent",
                variants: {
                    active: {
                        import: { variable: "upright_torso" },
                        selected_sequence: "active"
                    },
                    imminent: {
                        import: { variable: "upright_torso" },
                        selected_sequence: "imminent"
                    },
                    entrance: {
                        import: { variable: "upright_torso" },
                        selected_sequence: "imminent"
                    }
                }
            },
            laying: {
                width: 3680,
                frames: 4,
                spritesheet: "torso/laying_h.png",
                accessories: {
                    import: { variable: "defaultHumanAccessoriesList" }
                },
                magnets: {
                    shoulders: { x: 420, y: 220 },
                    penis_aligned: [
                        { x: 631 - (3680 * 0), y: 97 },
                        { x: 1554 - (3680 * 1), y: 116 },
                        { x: 2500 - (3680 * 2), y: 120 },
                        { x: 3411 - (3680 * 3), y: 114 }
                    ],
                    sternum: { x: 430, y: 157 },
                    neck: {x:366, y:270}
                }
            }
            /*hunching: {

            },
            feedng: {

            }*/
        }
    },
    head_stance_variants: {
        inherit_sequence_info: true,
        selected_variant: "upright",
        variants: {
            upright: {
                inherit_sequence_info: true,
                spritesheet: "head/upright_h.png",
                width: 2400, //width of the spritesheet, in pixels.
                frames: 8, //number of frames in the spritesheet.
                magnets: { //names and locations of spots we can attach accessories to
                    base: { x: 840 - 672, y: 224 - 2 },
                    top: { x: 820 - 672, y: 0 - 2 },
                    hairfront:
                        [{ x: 40 - (300 * 0), y: 78, depth: 0 },
                        { x: 352 - (300 * 1), y: 78, depth: 0 },
                        { x: 656 - (300 * 2), y: 78, depth: 0 },
                        { x: 948 - (300 * 3), y: 78, depth: 0 },
                        { x: 1240 - (300 * 4), y: 78, depth: 0 },
                        { x: 1540 - (300 * 5), y: 78, depth: 0 },
                        { x: 1836 - (300 * 6), y: 78, depth: 0 },
                        { x: 2132 - (300 * 7), y: 78, depth: 0 }]
                },
                accessories: {
                    hair: {
                        inherit_sequence_info: true,
                        import: {
                            filepath: "head/hair/hair.js",
                            variable: "hair"
                        }
                    }
                }
            },
            laying: {
                spritesheet: "head/laying_h.png",
                frames: 1,
                magnets: {
                    base: {x: 236, y: 210},
                    hairfront: {x:85, y:50},
                    top: {x:21, y:120}
                },
                accessories: {
                    hair: {
                        inherit_sequence_info: true,
                        import: {
                            filepath: "head/hair/hair.js",
                            variable: "hair"
                        }
                    }
                },

            }

        }
    },
    upright_leg: {
        spritesheet: "legs/upright_h.png",
        width: 2696, //width of the spritesheet, in pixels.
        frames: 8, //number of frames in the spritesheet.
        magnets: { //names and locations of spots we can attach accessories to
            base: { x: 820 - 687, y: 0 }
        },
        filter: "drop-shadow(-9px 34px 15px #0006)",
        sequences: {
            active: [0, 1, 2, 3, 4, 5, 6, 7],
            imminent: [3, 4, 5]
        }
    },
    upright_torso: {
        /*the spritesheet for shadow enemies is 4x resolution as everything else
                            *to minimize aliasing for various body size, so we scale it down by a fourth here*/

        accessories: {
            import: { variable: "defaultHumanAccessoriesList" }
        },
        spritesheet: "torso/upright_h.png",
        width: 1632, //width of the spritesheet, in pixels.
        frames: 8, //number of frames in the spritesheet.
        magnets: { //names and locations of spots we can attach accessories to
            hips: { x: 820 - 726, y: 520 - 198 },
            penis_aligned: [
                { x: 15 - (204 * 0), y: 322 },
                { x: 224 - (204 * 1), y: 324 },
                { x: 446 - (204 * 2), y: 326 },
                { x: 658 - (204 * 3), y: 326 },
                { x: 878 - (204 * 4), y: 328 },
                { x: 1073 - (204 * 5), y: 326 },
                { x: 1268 - (204 * 6), y: 325 },
                { x: 1452 - (204 * 7), y: 322 }

            ],
            penis_static: { x: 30, y: 520 - 198 },
            sternum: { x: 66, y: 328 - 198 },
            shoulders: { x: 114, y: 280 - 198 },
            neck: { x: 114, y: 224 - 198 }
        },
        sequences: {
            active: [0, 1, 2, 3, 4, 5, 6, 7],
            imminent: [3, 4, 5]
        }
    }

}); //IT IS VERY IMPORTANT THAT THE LAST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE

    penis: {
        inherit_filter: true,
        /**NPC body size can be scaled by various factors
         * but penises should be in absolute size.
         * If a penis is enormous, it should be just enormous on a tiny NPC as it
         * is on a giant NPC, so we specifiy different
         * penis scale variants dedicated to different body_size variants here.
         *
         * (this works because specifying a variant on Doll will cause the any variant of the same name
         *  to be activated on any child accessories)
         */
        selected_variant: "medium_body",
        variants: {
            joke_body: {
                scale: { x: 1.0 / 2.5, y: 1.0 / 2.5 },
                import: { variable: "penis_stance_variants" }
            },
			giant_body: {
                scale: { x: 1.0/1.5, y: 1.0/1.5 },
                import: { variable: "penis_stance_variants" }
            },
            huge_body: {
                scale: { x: 1.0/1.33, y: 1.0/1.33 },
                import: { variable: "penis_stance_variants" }
            },
            large_body: {
                scale: { x: 1.0/1.22, y: 1.0/1.22 },
                import: { variable: "penis_stance_variants" }
            },
            medium_body: {
                scale: { x: 1.0/1.11, y: 1.0/1.11 },
                import: { variable: "penis_stance_variants" }
            },
            petite_body: {
                scale: { x: 1.0/1.0, y: 1.0/1.0 },
                import: { variable: "penis_stance_variants" }
            },
            small_body: {
                scale: { x: 1.0/.88, y: 1.0/.88 },
                import: { variable: "penis_stance_variants" }
            },
            tiny_body: {
                scale: { x: 1.0/.775, y: 1.0/.775 },
                import: { variable: "penis_stance_variants" }
            },
        }
    },

    penis_stance_variants: {
        inherit_filter: true,
        selected_variant: "upright",
        variants: {
            laying: {},
            upright: {
                inherit_filter: true,
                selected_variant: "imminent",
                variants: {
                    imminent: {
                        import: {variable: "approaching"}
                    },
                    entrance: {
                        import: {variable: "approaching"}
                    },
                    active: {
                        frames: 8,
                        width: 2048,
                        attach: "base",
                        to: "penis_static",
                        selected_variant: "huge",
                        inherit_filter: true,
                        variants: {
                            huge: {
                                spritesheet: "upright/huge.png",
                                scale: { x: 4.0, y: 4.0 },
                                magnets: {
                                    base://[
                                        { x: 184 - (256 * 0), y: 130 }
                                    /* { x: 442-(256*1 ) , y: 130 },
                                     { x: 702-(256*2 ) , y: 130 },
                                     { x: 960-(256*3 ) , y: 130 },
                                     { x: 1222-(256*4 ) , y: 130 },
                                     { x: 1474-(256*5 ) , y: 130 },
                                     { x: 1728-(256*6 ) , y: 130 },
                                     { x: 1978-(256*7 ) , y: 130 }*/
                                    //]
                                }
                            },
                            large: {
                                spritesheet: "upright/huge.png",
                                scale: { x: 0.85 * 4.0, y: 0.85 * 4.0 },
                                magnets: {
                                    base: //[
                                        { x: 184 - (256 * 0), y: 130 }
                                    /* { x: 442-(256*1 ) , y: 130 },
                                     { x: 702-(256*2 ) , y: 130 },
                                     { x: 960-(256*3 ) , y: 130 },
                                     { x: 1222-(256*4 ) , y: 130 },
                                     { x: 1474-(256*5 ) , y: 130 },
                                     { x: 1728-(256*6 ) , y: 130 },
                                     { x: 1978-(256*7 ) , y: 130 }*/
                                    //]
                                }

                            },
                            medium: {
                                spritesheet: "upright/huge.png",
                                scale: { x: 0.7 * 4.0, y: 0.7 * 4.0 },
                                magnets: {
                                    base: //[
                                        { x: 184 - (256 * 0), y: 130 }
                                    /* { x: 442-(256*1 ) , y: 130 },
                                     { x: 702-(256*2 ) , y: 130 },
                                     { x: 960-(256*3 ) , y: 130 },
                                     { x: 1222-(256*4 ) , y: 130 },
                                     { x: 1474-(256*5 ) , y: 130 },
                                     { x: 1728-(256*6 ) , y: 130 },
                                     { x: 1978-(256*7 ) , y: 130 }*/
                                    //]
                                }
                            },
                            small: {
                                spritesheet: "upright/huge.png",
                                scale: { x: 0.55 * 4.0, y: 0.5 * 4.0 },
                                magnets: {
                                    base: //[
                                        { x: 184 - (256 * 0), y: 130 }
                                    /* { x: 442-(256*1 ) , y: 130 },
                                     { x: 702-(256*2 ) , y: 130 },
                                     { x: 960-(256*3 ) , y: 130 },
                                     { x: 1222-(256*4 ) , y: 130 },
                                     { x: 1474-(256*5 ) , y: 130 },
                                     { x: 1728-(256*6 ) , y: 130 },
                                     { x: 1978-(256*7 ) , y: 130 }*/
                                    //]
                                }
                            },
                            tiny: {
                                spritesheet: "upright/huge.png",
                                scale: { x: 0.4 * 4.0, y: 0.4 * 4.0 },
                                magnets: {
                                    base: //[
                                        { x: 184 - (256 * 0), y: 130 }
                                    /* { x: 442-(256*1 ) , y: 130 },
                                     { x: 702-(256*2 ) , y: 130 },
                                     { x: 960-(256*3 ) , y: 130 },
                                     { x: 1222-(256*4 ) , y: 130 },
                                     { x: 1474-(256*5 ) , y: 130 },
                                     { x: 1728-(256*6 ) , y: 130 },
                                     { x: 1978-(256*7 ) , y: 130 }*/
                                    //]
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    approaching: {
        inherit_filter: true,
        attach: "base",
        to: "penis_aligned",
        frames: 3,
        width: 224,
        selected_variant: "huge",
        variants: {
            huge: {
                scale: { x: 4.0, y: 4.0 },
                import: { variable: "fapping_upright" }
            },
            large: {
                scale: { x: 0.85 * 4.0, y: 0.85 * 4.0 },
                import: { variable: "fapping_upright" }
            },
            medium: {
                scale: { x: 0.7 * 4.0, y: 0.7 * 4.0 },
                import: { variable: "fapping_upright" }

            },
            small: {
                scale: { x: 0.55 * 4.0, y: 0.5 * 4.0 },
                import: { variable: "fapping_upright" }
            },
            tiny: {
                scale: { x: 0.4 * 4.0, y: 0.4 * 4.0 },
                import: { variable: "fapping_upright" }
            }
        }
    },
    fapping_upright: {
        inherit_filter: true,
        spritesheet: "upright/imminent_h.png",

        magnets: {
            base: [
                { x: 54, y: 26 },
                { x: 54, y: 26 },
                { x: 54, y: 26 }
            ]
            //{ x: 48, y: 25 }
        }
    }
});


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE
    bottom: {
        inherit_filter: true,
        inherit_sequence_info: true,
        translate: {x:0, y:0, depth:5},
        magnets: {
            anus: { x: 178, y: 120 },
            anusentrance: { x: 195, y: 122 },
            anusimminent: { x: 230, y: 122 },
            penis: { x: 150, y: 142 },
            vagina: { x: 173, y: 132 },
            vaginaimminent: { x: 263, y: 128 },
            vaginaentrance : { x: 188, y: 133 },
            footjob: { x: 205, y: 114 },
            waist: {x: 160, y: 110}
        },
        accessories: {
            clothes: {
                import: {
                    filepath: "clothes/clothes_bottom.js",
                    variable: "clothes"
                }
            },
            butt_front: {
                inherit_filter: true,
                inherit_sequence_info: true,
                selected_variant: "normal",
                variants: {
                    normal: {
                        inherit_filter: true,
                        filter: "drop-shadow(#0006 -3px 3px 3px)",
                        translate: { x: 0, y: 0, depth: 2 },
                        spritesheet: "doggyactivebasefrontrear.png",
                        accessories: {
                            import: { variable: "left_leg" }
                        }
                    },
                    inline_xray: {
                        inherit_filter: true,
                        translate: { x: 0, y: 0, depth: 2 },
                        spritesheet: "activeinlineanalxray.png",
                        accessories: {
                            import: { variable: "left_leg" }
                        }
                    }
                }
            },
            butt_back: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -2 },
                spritesheet: "doggyactivebaserightthigh.png",
                accessories: {
                    leg: {
                        inherit_filter: true,
                        selected_variant: "normal",
                        variants: {
                            normal: {
                                inherit_filter: true,
                                spritesheet: "/legs/doggyactivebaselegright.png"
                            },
                            footjob: {}
                        }
                    }
                }
            },
            penis: {
                inherit_filter: true,
                selected_variant: "small",
                variants: {
                    none: {

                    },
                    virgin: {
                        spritesheet: "/penis/doggyactivepenisvirgin.png"
                    },
                    tiny: {
                        spritesheet: "/penis/doggyactivepenis.png"
                    },
                    small: {
                        spritesheet: "/penis/doggyactivepenis.png"
                    },
                    large: {
                        spritesheet: "/penis/doggyactivepenis.png"
                    }
                }
            },
            bowels: {},
            uterus: {},
            clothing: {}
        }
    },
    left_leg: {
        leg: {
            selected_variant: "normal",
            inherit_filter: true,

            variants: {
                normal: {
                    translate: { x: 0, y: 0, depth: -1},
                    inherit_filter: true,
                    spritesheet: "/legs/doggyactivebaselegleft.png"
                },
                footjob: {
                    translate: { x: 0, y: 0, depth: 2 },
                    inherit_filter: true,
                    spritesheet: "/legs/doggyactivefeetjob.png"
                }
            }
        }
    }
});


code:
DoLHouse.add({//IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE

    clothes: {
        //inherit_filter: true,
        translate: { x: 0, y: 0, depth: 9 },
        accessories: {
            lower: {
                inherit_filter: true,
                selected_variant: "naked",
                translate: { x: 0, y: 0, depth: 1 },
                variants: {
                    naked: {},
                    cyleshorts: {
                        import: { variable: "gymbloomers" }
                    },
                    towellarge: {
                        selected_variant: "hips",
                        import: { variable: "towel_variants" }
                    },

                    boardshorts: {
                        import: { variable: "shorts" }
                    },
                    boyshorts: {
                        import: { variable: "shorts" }
                    },
                    schoolshorts: {
                        import: { variable: "shorts" }
                    },
                    schoolswimshorts: {
                        import: { variable: "gymbloomers" }
                    },
                    jorts: {
                        import: { variable: "shorts" }
                    },
                    shorts: {
                        import: { variable: "shorts" }
                    },
                    skirt: {
                        import: { variable: "skirt"}
                    },
                    micropleatedskirt : {
                        import: { variable: 'micropleatedskirt'}
                    }

                }
            },
            under_lower: {
                inherit_filter: true,
                selected_variant: "plainpanties",
                translate: {x:0, y:0, depth: 0},
                variants: {
                    naked: {},

                    bikini: {
                        import: {
                            variable: "risquepanties"
                        }
                    },
                    crotchlesspantis: {
                        import: {
                            variable: "risquepanties"
                        }
                    },
                    microkini: {
                        import: {
                            variable: "risquepanties"
                        }
                    },
                    lacepanties: {
                        import: {
                            variable: "risquepanties"
                        }
                    },
                    catgirlpanties: {
                        import: {
                            variable: "plainpanties"
                        }
                    },
                    plainpanties: {
                        import: {
                            variable: "plainpanties"
                        }
                    },
                    stripedpanties: {
                        import: {
                            variable: "plainpanties"
                        }
                    },
                    speedo: {
                        import: {
                            variable: "plainpanties"
                        }
                    },

                }
            },
            /*over_lower: {
                 variants: {
                     hips: { spritesheet: "gymbloomers/doggyactive_delim_hips.png" },
                     thighs: { spritesheet: "gymbloomers/doggyactive_gymbloomers_thighs.png" },
                     knees: { spritesheet: "gymbloomers/doggyactive_gymbloomers_knees.png" },
                     ankles: { spritesheet: "gymbloomers/doggyactive_gymbloomers_ankles.png" },
                     anklesfootjob: { spritesheet: "gymbloomers/doggyactive_gymbloomers_anklesfootjob.png" },
                 }

             },*/
            genitals: {
                selected_variant: "naked",
                variants: {
                    naked: {},
                    chastitycage: {
                        spritesheet: "doggyactivechastitycage.png"
                    },
                    chastitycagepenis: {
                        spritesheet: "doggyactivechastitycagepenis.png"
                    },
                    chastitybelt: {
                        spritesheet: "doggyactivechastitybelt.png"
                    }
                }
            }
        }
    },
    towel_variants: {
        //inherit_filter: true,
        variants: {
            hips: {
                inherit_filter: true,
                spritesheet: "lowertowel/doggyactive_towel_waist.png"
            },
            thighs: {
                inherit_filter: true,
                spritesheet: "lowertowel/doggyactive_towel_thighs.png"
            },
            knees: {
                inherit_filter: true,
                spritesheet: "lowertowel/doggyactive_towel_knees.png"
            },
            ankles: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -6 },
                spritesheet: "lowertowel/doggyactive_towel_ankles.png"
            },
        }
    },
    shorts: {
        inherit_filter: true,
        selected_variant: "hips",
        variants: {
            hips: {
                inherit_filter: true,
                spritesheet: "shorts/doggyactive_shorts_hips.png"
            },
            thighs: {
                inherit_filter: true,
                spritesheet: "shorts/doggyactive_shorts_thighs.png"
            },
            knees: {
                inherit_filter: true,
                spritesheet: "shorts/doggyactive_shorts_knees.png"
            },
            ankles: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -6 },
                spritesheet: "shorts/doggyactive_shorts_ankles.png"
            },
            anklesfootjob: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -6 },
                spritesheet: "shorts/doggyactive_shorts_anklesfootjob.png"
            },
        }
    },
    gymbloomers: {
        inherit_filter: true,
        selected_variant: "hips",
        variants: {
            hips: {
                inherit_filter: true,
                spritesheet: "gymbloomers/doggyactive_shorts_hips.png"
            },
            thighs: {
                inherit_filter: true,
                spritesheet: "gymbloomers/doggyactive_shorts_thighs.png"
            },
            knees: {
                inherit_filter: true,
                spritesheet: "gymbloomers/doggyactive_shorts_knees.png"
            },
            ankles: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -6 },
                spritesheet: "gymbloomers/doggyactive_shorts_ankles.png"
            },
            anklesfootjob: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -6 },
                spritesheet: "gymbloomers/doggyactive_shorts_anklesfootjob.png"
            },
        }
    },
    risquepanties: {
        inherit_filter: true,
        selected_variant: "hips",
        variants: {
            hips: {
                inherit_filter: true,
                spritesheet: "bikinibottom/doggyactive_bikinibottom_waist.png"
            },
            thighs: {
                inherit_filter: true,
                spritesheet: "bikinibottom/doggyactive_bikinibottom_thighs.png"
            },
            knees: {
                inherit_filter: true,
                spritesheet: "bikinibottom/doggyactive_bikinibottom_knees.png"
            },
            ankles: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -5 },
                spritesheet: "bikinibottom/doggyactive_bikinibottom_ankles.png"
            },
            anklesfootjob: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -5 },
                spritesheet: "bikinibottom/doggyactive_bikinibottom_anklefootjob.png"
            },
        }
    },
    plainpanties: {
        inherit_filter: true,
        selected_variant: "hips",
        variants: {
            hips: {
                inherit_filter: true,
                spritesheet: "plainpanties/doggyactive_plainpanties_hips.png"
            },
            thighs: {
                inherit_filter: true,
                spritesheet: "plainpanties/doggyactive_plainpanties_thighs.png"
            },
            knees: {
                inherit_filter: true,
                spritesheet: "plainpanties/doggyactive_plainpanties_knees.png"
            },
            ankles: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -5 },
                spritesheet: "plainpanties/doggyactive_plainpanties_ankles.png"
            },
            anklesfootjob: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -5 },
                spritesheet: "plainpanties/doggyactive_plainpanties_anklesfootjob.png"
            },
        }
    },
    micropleatedskirt: {
        inherit_filter: true,
        selected_variant: "hips",
        variants: {
            hips: {
                inherit_filter: true,
                spritesheet: "micropleatedskirt/hips.png"
            },
            thighs: {
                inherit_filter: true,
                spritesheet: "micropleatedskirt/thighs.png"
            },
            knees: {
                inherit_filter: true,
                spritesheet: "micropleatedskirt/knees.png"
            },
            waist: {
                inherit_filter: true,
                spritesheet: "micropleatedskirt/waist.png"
            },
            ankles: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -6 },
                spritesheet: "micropleatedskirt/ankles.png"
            },
            anklesfootjob: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -6 },
                spritesheet: "micropleatedskirt/anklesfootjob.png"
            },
        }
    },
    skirt: {
        inherit_filter: true,
        selected_variant: "hips",
        variants: {
            hips: {
                inherit_filter: true,
                spritesheet: "skirt/doggyactive_skirt_hips.png"
            },
            thighs: {
                inherit_filter: true,
                spritesheet: "skirt/doggyactive_skirt_thighs.png"
            },
            knees: {
                inherit_filter: true,
                spritesheet: "skirt/doggyactive_skirt_knees.png"
            },
            ankles: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -6 },
                spritesheet: "skirt/doggyactive_skirt_ankles.png"
            },
            anklesfootjob: {
                inherit_filter: true,
                translate: { x: 0, y: 0, depth: -6 },
                spritesheet: "skirt/doggyactive_skirt_anklesfootjob.png"
            },
        }
    }
});


code:
DoLHouse.add({ //IT IS VERY IMPORTANT THAT THE FIRST LINE IN YOUR FILE IS A COPY-PASTE OF THIS LINE
    doggy: {
        selected_variant: "active",
        inherit_filter: true,
        promulgate_sequence_info: true, //forces any descendant accessories to inherit sequence info by default
        frames: 4,
        width: 1024,
        sequences: {
            deep: [2,3,3,3,0,1,1], //for deep penetration by big NPCs with 7 frames (eg horses)
            deepcum: [2,3,3,3,0,1,1,2,3,3,3,0,1,1], //double length to allow for cumshot animation
            active: [0,1,2,3],
            activecum: [0,1,2,3,0,1,2,3], // double length to allow for cumshot animation
            still: [0], //single frame
            idle: [0, 2] //two-frame idle animation
        },
        variants: {
            deep : {
                import: {variable: "base_doggy"},
                selected_sequence: "deep"
            },
            deepcum: {
                import: {variable: "base_doggy"},
                selected_sequence: "deepcum"
            },
            active: {
                import: {variable: "base_doggy"},
                selected_sequence: "active"
            },
            activecum: {
                import: {variable: "base_doggy"},
                selected_sequence: "activecum"
            },
            idle : {
                import: {variable: "base_doggy"},
                selected_sequence: "idle"
            },
            still: {
                import: {variable: "base_doggy"},
                selected_sequence: "still"
            }
        }
    },
    base_doggy: {
        spritesheet: "doggyactivebase.png",
        translate: {x:0, y:0, depth: -5},
        inherit_filter: true,
        inherit_sequence_info: true,
        accessories: {
            bottom: {
                import: {
                    filepath: "bottom/bottom.js",
                    variable: "bottom"
                }
            },
            top: {
                import: {
                    filepath: "top/top.js",
                    variable: "top"
                }
            }
        }
    }
});