Expand hardcore interaction pools

This commit is contained in:
2026-06-26 12:54:35 +02:00
parent 4f0203fc3d
commit a392ab9779
6 changed files with 1203 additions and 11 deletions
+8
View File
@@ -299,6 +299,8 @@ NODE_INPUT_TOOLTIPS = {
"allow_double": "Allow double-penetration or second-contact wording.",
"allow_penetration": "Allow vaginal/penetrative sex subcategories.",
"allow_foreplay": "Allow hardcore teasing/foreplay setup actions such as kissing, caressing, breast/face touching, and undressing.",
"allow_interaction": "Allow non-act interaction pools such as body worship, clothing transitions, guidance, camera presentation, watching, and aftercare.",
"allow_manual": "Allow manual stimulation pools such as fingering, clit rubbing, and mutual masturbation.",
"allow_oral": "Allow oral sex subcategories.",
"allow_outercourse": "Allow non-penetrative penis-contact acts such as boobjob/titjob, footjob, penis licking, and testicle sucking.",
"allow_anal": "Allow anal subcategories.",
@@ -2262,6 +2264,8 @@ class SxCPHardcoreActionFilter:
"allow_double": ("BOOLEAN", {"default": False}),
"allow_penetration": ("BOOLEAN", {"default": True}),
"allow_foreplay": ("BOOLEAN", {"default": True}),
"allow_interaction": ("BOOLEAN", {"default": True}),
"allow_manual": ("BOOLEAN", {"default": True}),
"allow_oral": ("BOOLEAN", {"default": True}),
"allow_outercourse": ("BOOLEAN", {"default": True}),
"allow_anal": ("BOOLEAN", {"default": True}),
@@ -2284,6 +2288,8 @@ class SxCPHardcoreActionFilter:
allow_double,
allow_penetration,
allow_foreplay,
allow_interaction,
allow_manual,
allow_oral,
allow_outercourse,
allow_anal,
@@ -2297,6 +2303,8 @@ class SxCPHardcoreActionFilter:
allow_double=allow_double,
allow_penetration=allow_penetration,
allow_foreplay=allow_foreplay,
allow_interaction=allow_interaction,
allow_manual=allow_manual,
allow_oral=allow_oral,
allow_outercourse=allow_outercourse,
allow_anal=allow_anal,
@@ -211,6 +211,50 @@
"focused stare while clothing is pulled aside",
"close-range lustful eye contact"
],
"hardcore_interaction_expressions": [
"close-range lustful eye contact",
"breathless body-contact expression",
"focused stare while hands guide the pose",
"flushed reaction to teasing touch",
"heavy-lidded look during body worship",
"mouth open during hands-on guidance",
"controlled dominant stare",
"submissive bitten-lip expression",
"shameless camera-aware expression",
"soft moan while being held",
"hungry stare during clothing movement",
"wide-eyed aroused reaction",
"teasing grin while being watched",
"steady eye contact during the transition"
],
"hardcore_manual_expressions": [
"focused pleasure face during manual stimulation",
"bitten-lip reaction to fingers",
"eyes half-closed while being touched",
"breathless open-mouth manual-stimulation expression",
"direct eye contact while fingers work",
"flushed face with hips lifting",
"controlled clit-rubbing reaction",
"messy aroused stare during fingering",
"shameless mutual-masturbation expression",
"glossy eyes and parted lips while hands move",
"strained moan from hand stimulation",
"soft dazed pleasure face"
],
"hardcore_aftercare_expressions": [
"spent satisfied expression",
"soft post-sex eye contact",
"breathless relaxed face",
"dazed afterglow stare",
"small exhausted smile",
"heavy-lidded calm expression",
"flushed skin and relaxed mouth",
"tender direct gaze",
"sleepy post-orgasm look",
"messy but satisfied stare",
"quiet intimate expression",
"soft cleanup-focused gaze"
],
"hardcore_penetration_expressions": [
"controlled eye contact during penetration",
"focused adult pleasure face during thrusting",
@@ -483,6 +527,56 @@
{"text": "close candid creator-shot frame centered on undressing and body contact", "min_people": 2, "max_people": 3},
{"text": "full-body pre-sex foreplay frame with faces, hands, and clothes readable", "min_people": 2, "max_people": 3}
],
"manual_stimulation_compositions": [
{"text": "close crop on hands, open thighs, and manual contact", "min_people": 1, "max_people": 3},
{"text": "bed-edge manual-stimulation frame with fingers and face readable", "min_people": 1, "max_people": 3},
{"text": "mirror-view manual contact composition with hands centered", "min_people": 1, "max_people": 3},
{"text": "side-profile hand-between-thighs composition", "min_people": 1, "max_people": 3},
{"text": "overhead manual-stimulation frame with body geometry clear", "min_people": 1, "max_people": 3},
{"text": "tight creator-shot crop centered on fingers, thighs, and reaction", "min_people": 1, "max_people": 3},
{"text": "seated lap manual contact frame", "min_people": 2, "max_people": 3},
{"text": "full-body manual-stimulation composition with hands and expression visible", "min_people": 1, "max_people": 3}
],
"interaction_compositions": [
{"text": "close body-interaction frame with hands, faces, and exposed skin readable", "min_people": 2, "max_people": 3},
{"text": "standing hands-on-body composition with clear body contact", "min_people": 2, "max_people": 3},
{"text": "bed-edge transition frame with clothing movement and hand placement visible", "min_people": 2, "max_people": 3},
{"text": "mirror-view interaction composition with bodies and gestures readable", "min_people": 2, "max_people": 3},
{"text": "tight crop on guidance hands, face, waist, and hips", "min_people": 2, "max_people": 3},
{"text": "wall-pressed body-control frame with hands and reaction visible", "min_people": 2, "max_people": 3},
{"text": "couch body-worship composition with mouth, hands, and skin centered", "min_people": 2, "max_people": 3},
{"text": "full-body transition composition showing the next position clearly", "min_people": 2, "max_people": 3}
],
"camera_performance_compositions": [
{"text": "direct-to-camera body presentation with hands and exposed skin centered", "min_people": 1, "max_people": 3},
{"text": "mirror creator-performance frame with the body presented to the viewer", "min_people": 1, "max_people": 3},
{"text": "low phone-angle reveal with hands framing the body", "min_people": 1, "max_people": 3},
{"text": "bed-edge camera presentation with direct eye contact", "min_people": 1, "max_people": 3},
{"text": "partner-held presentation frame with the body opened toward the camera", "min_people": 2, "max_people": 3},
{"text": "tight subscriber-view crop centered on presentation gesture", "min_people": 1, "max_people": 3},
{"text": "vertical creator-shot frame with body display and face readable", "min_people": 1, "max_people": 3},
{"text": "wide creator-performance frame with hands, hips, and camera awareness visible", "min_people": 1, "max_people": 3}
],
"group_coordination_compositions": [
{"text": "wide group coordination frame with watching and touching roles readable", "min_people": 3},
{"text": "center-body group frame with partners arranged around the subject", "min_people": 3},
{"text": "mirror-view group interaction showing observer and touching roles", "min_people": 3},
{"text": "bed-level group coordination composition with hands and faces visible", "min_people": 3},
{"text": "three-person close frame with one watching and one touching", "min_people": 3, "max_people": 3},
{"text": "full-room group interaction frame with clear role spacing", "min_people": 3},
{"text": "side-profile group presentation frame", "min_people": 3},
{"text": "overhead group coordination frame with bodies separated clearly", "min_people": 3}
],
"aftercare_compositions": [
{"text": "post-sex close body-contact frame with hands and faces readable", "min_people": 2},
{"text": "bed-edge cleanup composition with towel, skin, and aftermath detail visible", "min_people": 2},
{"text": "side-lying aftercare frame with bodies held close", "min_people": 2},
{"text": "mirror-view aftermath composition with relaxed bodies and cleanup detail", "min_people": 2},
{"text": "tight crop on towel, hands, thighs, and spent faces", "min_people": 2},
{"text": "wide aftermath frame with rumpled sheets and discarded clothing", "min_people": 2},
{"text": "couch post-sex cuddle composition", "min_people": 2},
{"text": "shower-bench cleanup frame with hands and wet skin visible", "min_people": 2}
],
"hardcore_explicit_compositions": [
{"text": "full-body explicit sex frame with all adult bodies visible", "min_people": 2},
{"text": "bed-level camera angle focused on genital contact and faces", "min_people": 2, "max_people": 3},
+740
View File
@@ -203,6 +203,746 @@
]
}
},
{
"name": "Manual stimulation",
"slug": "manual_stimulation",
"min_people": 1,
"min_women": 1,
"inherit_expressions": false,
"inherit_compositions": false,
"weight": 0.85,
"item_label": "Manual action",
"positive_suffix": "Use clear adult manual contact, readable hands, explicit body positioning, exposed skin, warm erotic lighting, crisp comic linework, detailed hatching, and tactile textured paper.",
"prompt_template": "{subject_phrase}, all 21+ consenting adults: {style}. Cast: {cast_summary}. Role graph: {role_graph} Manual action: {item}. Setting: {scene}. Composition: {composition}. Facial expressions: {expression}. Make the scene explicit through adult manual stimulation, visible hands, exposed skin, clear body positioning, and readable reaction. {positive_suffix} Avoid: {negative_prompt}.",
"caption_template": "{trigger}, {scene_kind}, {cast_summary}, {role_graph}, manual stimulation action: {item}, {scene}, {composition}, explicit consensual adult manual stimulation illustration",
"scene_pools": ["hardcore_private_scenes", "hardcore_bed_scenes", "hardcore_mirror_scenes"],
"expression_pools": ["hardcore_manual_expressions"],
"composition_pools": ["manual_stimulation_compositions"],
"item_templates": [
"{manual_act} in {position}, with {manual_detail}, {body_contact}, and {visibility}",
"{position} featuring {manual_act}, {hand_detail}, {reaction_detail}, and {visibility}",
"{manual_act} on {surface}, with {manual_detail}, {hand_detail}, and {reaction_detail}",
"manual stimulation setup: {position}, {manual_act}, {body_contact}, and {visibility}",
"{position} while {manual_act}, with {hand_detail}, {manual_detail}, and {reaction_detail}"
],
"item_axes": {
"position": [
"reclining open-thigh manual position",
"bed-edge fingering position",
"seated lap manual stimulation position",
"standing wall-braced manual position",
"side-lying clit-rubbing position",
"mirror-facing mutual masturbation position",
"kneeling hand-between-thighs position",
"couch manual stimulation position"
],
"manual_act": [
"fingering with fingers working inside the pussy",
"two fingers sliding into the pussy while the other hand holds the thigh open",
"clit rubbing with fingers moving over the clit",
"slow clit stimulation while thighs stay open",
"hand on pussy with fingers spreading and rubbing",
"mutual masturbation with both bodies touching themselves",
"one partner guiding the other's hand between the thighs",
"partner-held vibrator pressed to the clit",
"toy-assisted manual stimulation with one hand controlling the toy",
"wet fingers moving between the thighs"
],
"manual_detail": [
"fingers visibly pressing into wet skin",
"hand placement centered between the open thighs",
"one hand holding the thigh open",
"thumb circling the clit",
"fingers sliding against the pussy",
"wet shine on fingers and inner thighs",
"hand guided firmly into place",
"toy and fingers both visible at the contact point"
],
"hand_detail": [
"one hand braced on the hip",
"one hand gripping the sheets",
"hands spreading thighs apart",
"fingers hooked at the inner thigh",
"one hand holding the wrist in place",
"both hands visible and active",
"fingers pressing into soft skin",
"hand resting on the lower belly"
],
"body_contact": [
"thighs held open",
"hips tilted toward the hand",
"knees spread with the hand centered",
"body arched into the touch",
"legs parted around the active hand",
"torso leaning back with hips exposed",
"bodies pressed close while one hand works",
"one partner leaning over the other"
],
"reaction_detail": [
"breathless open mouth",
"focused direct eye contact",
"eyes half-closed from the touch",
"bitten-lip reaction",
"hips lifting toward the hand",
"strained moan with flushed cheeks",
"messy aroused expression",
"controlled pleasure stare"
],
"visibility": [
"hands and contact point clearly readable",
"manual stimulation visible between the thighs",
"open thighs and fingers centered",
"hands, pussy, and reaction visible",
"toy or fingers clearly visible",
"body position and hand action readable"
],
"surface": [
"rumpled bed sheets",
"a wide couch",
"a hotel bed",
"floor cushions",
"a low mattress",
"a mirror-side bench",
"a soft rug",
"a private shower bench"
]
}
},
{
"name": "Body worship and touching",
"slug": "body_worship_touching",
"min_people": 2,
"min_women": 1,
"inherit_expressions": false,
"inherit_compositions": false,
"weight": 0.7,
"item_label": "Body interaction",
"positive_suffix": "Use readable adult body contact, hands and mouth on skin, exposed skin, warm erotic lighting, crisp comic linework, detailed hatching, and tactile textured paper.",
"prompt_template": "{subject_phrase}, all 21+ consenting adults: {style}. Cast: {cast_summary}. Role graph: {role_graph} Body interaction: {item}. Setting: {scene}. Composition: {composition}. Facial expressions: {expression}. Make the scene explicit through adult body worship, close skin contact, mouth and hand placement, exposed skin, and readable body positioning. {positive_suffix} Avoid: {negative_prompt}.",
"caption_template": "{trigger}, {scene_kind}, {cast_summary}, {role_graph}, body worship action: {item}, {scene}, {composition}, explicit consensual adult body-contact illustration",
"scene_pools": ["hardcore_private_scenes", "hardcore_bed_scenes", "hardcore_mirror_scenes"],
"expression_pools": ["hardcore_interaction_expressions"],
"composition_pools": ["interaction_compositions"],
"item_templates": [
"{worship_act} in {position}, with {touch_detail}, {face_detail}, and {visibility}",
"{position} featuring {worship_act}, {body_contact}, {touch_detail}, and {reaction_detail}",
"{worship_act} on {surface}, with {body_contact}, {face_detail}, and {visibility}",
"body worship setup: {position}, {worship_act}, {touch_detail}, and {reaction_detail}",
"{position} while {worship_act}, with {body_contact}, {face_detail}, and {visibility}"
],
"item_axes": {
"position": [
"reclining body-worship position",
"kneeling nipple-play position",
"bed-edge thigh-kissing body-worship position",
"mirror-facing ass-grab body-worship position",
"standing breast-touch position",
"bed-edge thigh-kissing position",
"side-lying caress position",
"mirror-facing ass-grab position",
"lap-sitting body-contact position",
"couch body-worship position"
],
"worship_act": [
"mouth kissing down the chest and stomach",
"nipple licking with one hand cupping the breast",
"nipple sucking while the other hand grips the waist",
"thigh kissing with mouth on inner thighs",
"mouth on inner thighs while hands hold the legs open",
"kissing inner thighs with hands holding the legs open",
"ass grabbing with fingers pressing into soft skin",
"mouth on the stomach while hands roam over hips",
"breast kissing while the body arches upward",
"slow body worship with hands tracing breasts, waist, and thighs",
"kissing across the hips and lower belly",
"face pressed against the body while hands hold the ass"
],
"touch_detail": [
"hands cupping breasts",
"fingers squeezing the ass",
"thumbs brushing nipples",
"hands sliding across the lower belly",
"fingers tracing the inner thighs",
"hands gripping the waist",
"one hand holding the chin in place",
"hands spreading the thighs gently"
],
"face_detail": [
"mouth pressed to skin",
"lips around a nipple",
"face close to the chest",
"cheek pressed against the stomach",
"mouth near the inner thigh",
"heavy eye contact while kissing the body",
"breath against exposed skin",
"tongue visible on skin"
],
"body_contact": [
"chest arched toward the mouth",
"thighs open around the kissing partner",
"hips tilted into the touch",
"body pressed against the wall",
"one body reclined while the other kneels close",
"torso bent toward the touch",
"bodies close enough for skin-on-skin pressure",
"legs draped around the partner"
],
"reaction_detail": [
"breathless parted lips",
"eyes half-closed from the touch",
"hands gripping sheets",
"flushed skin and direct eye contact",
"soft moan while being kissed",
"body arching into the mouth",
"head tilted back",
"controlled aroused stare"
],
"visibility": [
"mouth, hands, and exposed skin clearly readable",
"breasts, thighs, hands, and faces visible",
"body worship contact centered",
"skin contact and reaction visible",
"hands and mouth placement clear",
"full body-contact geography readable"
],
"surface": [
"rumpled bed sheets",
"a hotel bed",
"a wide couch",
"floor cushions",
"a soft rug",
"a mirror-side bench",
"a low mattress",
"a velvet chair"
]
}
},
{
"name": "Clothing and position transitions",
"slug": "clothing_position_transitions",
"min_people": 2,
"min_women": 1,
"inherit_expressions": false,
"inherit_compositions": false,
"weight": 0.65,
"item_label": "Transition action",
"positive_suffix": "Use readable adult movement, clothing being moved, hands guiding bodies, exposed skin, warm erotic lighting, crisp comic linework, detailed hatching, and tactile textured paper.",
"prompt_template": "{subject_phrase}, all 21+ consenting adults: {style}. Cast: {cast_summary}. Role graph: {role_graph} Transition action: {item}. Setting: {scene}. Composition: {composition}. Facial expressions: {expression}. Make the scene explicit through adult undressing, position changes, visible hands, exposed skin, and clear movement from one sexual beat to the next. {positive_suffix} Avoid: {negative_prompt}.",
"caption_template": "{trigger}, {scene_kind}, {cast_summary}, {role_graph}, clothing and position transition: {item}, {scene}, {composition}, explicit consensual adult transition illustration",
"scene_pools": ["hardcore_private_scenes", "hardcore_bed_scenes", "hardcore_mirror_scenes"],
"expression_pools": ["hardcore_interaction_expressions"],
"composition_pools": ["interaction_compositions"],
"item_templates": [
"{transition_act} in {position}, with {clothing_detail}, {hand_detail}, and {visibility}",
"{position} featuring {transition_act}, {body_contact}, {clothing_detail}, and {movement_detail}",
"{transition_act} on {surface}, with {hand_detail}, {body_contact}, and {visibility}",
"position transition: {position}, {transition_act}, {movement_detail}, and {clothing_detail}",
"{position} while {transition_act}, with {hand_detail}, {body_contact}, and {visibility}"
],
"item_axes": {
"position": [
"bed-edge clothing-removal position",
"standing turn-around transition",
"pulling-onto-the-bed transition",
"lifting-legs transition position",
"kneeling-to-standing transition",
"mirror undressing transition",
"couch position-change setup",
"floor-to-bed transition"
],
"transition_act": [
"pulling clothing aside before the next act",
"lower garments being pulled down below the hips",
"shirt being opened while bodies press together",
"one partner turning the other around by the hips",
"one partner pulling the other onto the bed",
"legs being lifted and spread into position",
"hips being guided backward into position",
"body being turned from kissing into a rear-facing pose",
"kneeling partner being guided upward by the hands",
"clothes being discarded beside the bodies"
],
"clothing_detail": [
"fabric bunched at the waist",
"straps sliding off shoulders",
"panties or lower garments pulled aside",
"shirt open with bare chest visible",
"skirt lifted high around the hips",
"trousers or underwear lowered below the hips",
"garment half removed and hanging from one leg",
"discarded clothing visible on the floor"
],
"hand_detail": [
"hands on hips guiding the turn",
"one hand lifting a thigh",
"hands pulling fabric aside",
"one hand on the lower back",
"hands spreading thighs into position",
"fingers hooked into the waistband",
"hands pulling the body closer",
"one hand braced on the bed"
],
"body_contact": [
"bodies pressed together during the position change",
"hips angled toward the next pose",
"legs lifted into the frame",
"knees moving apart",
"torso bent forward by the guiding hands",
"body rotated toward the camera",
"one body reclined while the other stands close",
"skin revealed as clothing moves"
],
"movement_detail": [
"movement frozen mid-transition",
"clear before-the-next-act body geometry",
"hands actively changing the pose",
"clothing motion visible",
"body weight shifting toward the bed",
"hips and legs visibly being repositioned",
"urgent consensual movement",
"slow teasing repositioning"
],
"visibility": [
"clothing movement and hands clearly readable",
"transition body geometry visible",
"fabric, exposed skin, and hand placement centered",
"pose change visible in one frame",
"the next position readable from the body angle",
"hands, hips, and clothing clearly visible"
],
"surface": [
"rumpled bed sheets",
"a hotel bed",
"a wide couch",
"a low mattress",
"floor cushions",
"a mirror-side bench",
"a soft rug",
"a dressing-room chair"
]
}
},
{
"name": "Dominant guidance and restraint",
"slug": "dominant_guidance",
"min_people": 2,
"min_women": 1,
"inherit_expressions": false,
"inherit_compositions": false,
"weight": 0.55,
"item_label": "Guidance action",
"positive_suffix": "Use consensual adult control, readable hand placement, clear body positioning, exposed skin, warm erotic lighting, crisp comic linework, detailed hatching, and tactile textured paper.",
"prompt_template": "{subject_phrase}, all 21+ consenting adults: {style}. Cast: {cast_summary}. Role graph: {role_graph} Guidance action: {item}. Setting: {scene}. Composition: {composition}. Facial expressions: {expression}. Make the scene explicit through consensual adult guidance, hair or wrist control, body positioning, visible hands, exposed skin, and clear power dynamic. {positive_suffix} Avoid: {negative_prompt}.",
"caption_template": "{trigger}, {scene_kind}, {cast_summary}, {role_graph}, dominant guidance action: {item}, {scene}, {composition}, explicit consensual adult power-dynamic illustration",
"scene_pools": ["hardcore_private_scenes", "hardcore_bed_scenes", "hardcore_mirror_scenes"],
"expression_pools": ["hardcore_interaction_expressions"],
"composition_pools": ["interaction_compositions"],
"item_templates": [
"{control_act} in {position}, with {hand_detail}, {body_contact}, and {visibility}",
"{position} featuring {control_act}, {power_detail}, {hand_detail}, and {reaction_detail}",
"{control_act} on {surface}, with {body_contact}, {power_detail}, and {visibility}",
"consensual control setup: {position}, {control_act}, {hand_detail}, and {reaction_detail}",
"{position} while {control_act}, with {power_detail}, {body_contact}, and {visibility}"
],
"item_axes": {
"position": [
"standing hair-holding position",
"bed-edge wrist-pinning position",
"kneeling guided-position position",
"wall-pinned body-control position",
"reclining wrists-overhead position",
"mirror-facing dominant guidance position",
"couch hands-on-hips position",
"close dirty-talk guidance position",
"floor-level guided pose"
],
"control_act": [
"hair held back while the body is guided closer",
"wrists pinned above the head on the bed",
"one hand holding the jaw while the other guides the hips",
"hands on hips turning the body into position",
"one partner spreading thighs with both hands",
"hair pulled back gently to expose the face",
"wrist held down while the body arches",
"dirty talk whispered close to the ear while one hand holds the waist",
"mouth near the ear giving verbal teasing while the body is held close",
"hands pressing the body into a wall-braced pose",
"chin lifted by fingers during a dominant stare",
"hips pulled back by both hands"
],
"hand_detail": [
"fingers tangled in hair",
"one hand wrapped around both wrists",
"hands gripping hips",
"one hand under the chin",
"hands spreading thighs",
"palm pressing between the shoulder blades",
"one hand braced near the head",
"one hand holding the body close during whispering",
"fingers pressing into the waist"
],
"power_detail": [
"consensual rough guidance",
"controlled dominant pacing",
"clear guided body position",
"submissive presenting posture",
"dominant hand placement visible",
"steady eye contact during control",
"body held open for the camera",
"dirty talk and verbal teasing visible through mouth-near-ear body language",
"commanding close-range tension"
],
"body_contact": [
"body arched under the guiding hands",
"hips pulled toward the partner",
"wrists held against the sheets",
"thighs spread by both hands",
"torso pressed toward the wall",
"body angled by the grip on the hips",
"knees separated while hands hold position",
"head tilted back by the hair hold"
],
"reaction_detail": [
"wide-eyed aroused stare",
"bitten-lip submission",
"steady dominant eye contact",
"breathless parted lips",
"flushed controlled expression",
"shameless direct gaze",
"eyes half-closed under control",
"strained moan with consent visible"
],
"visibility": [
"hands, wrists, hair, and body position clearly readable",
"control gesture visible without confusion",
"dominant hand placement centered",
"face, hands, and hips visible",
"the guided body position readable",
"consensual power dynamic clear in the pose"
],
"surface": [
"rumpled bed sheets",
"a hotel bed",
"against a wall",
"a wide couch",
"floor cushions",
"a low mattress",
"a mirror-side bench",
"a soft rug"
]
}
},
{
"name": "Camera performance and presentation",
"slug": "camera_performance",
"min_people": 1,
"min_women": 1,
"inherit_expressions": false,
"inherit_compositions": false,
"weight": 0.6,
"item_label": "Camera performance",
"positive_suffix": "Use creator-shot adult presentation, readable camera-facing pose, exposed skin, clear hand placement, warm erotic lighting, crisp comic linework, detailed hatching, and tactile textured paper.",
"prompt_template": "{subject_phrase}, all 21+ consenting adults: {style}. Cast: {cast_summary}. Role graph: {role_graph} Camera performance: {item}. Setting: {scene}. Composition: {composition}. Facial expressions: {expression}. Make the scene explicit through camera-aware adult presentation, body opened or displayed to the viewer, visible hands, exposed skin, and clean creator-shot framing. {positive_suffix} Avoid: {negative_prompt}.",
"caption_template": "{trigger}, {scene_kind}, {cast_summary}, {role_graph}, camera performance action: {item}, {scene}, {composition}, explicit consensual adult creator-performance illustration",
"scene_pools": ["hardcore_private_scenes", "hardcore_bed_scenes", "hardcore_mirror_scenes"],
"expression_pools": ["hardcore_interaction_expressions"],
"composition_pools": ["camera_performance_compositions"],
"item_templates": [
"{performance_act} in {position}, with {presentation_detail}, {hand_detail}, and {visibility}",
"{position} featuring {performance_act}, {camera_detail}, {presentation_detail}, and {reaction_detail}",
"{performance_act} on {surface}, with {hand_detail}, {camera_detail}, and {visibility}",
"creator-performance setup: {position}, {performance_act}, {presentation_detail}, and {reaction_detail}",
"{position} while {performance_act}, with {camera_detail}, {hand_detail}, and {visibility}"
],
"item_axes": {
"position": [
"reclining camera-presentation position",
"mirror spread-open presentation",
"standing show-to-camera position",
"bed-edge creator presentation",
"kneeling close-camera reveal",
"side-lying camera-facing display",
"partner-held presentation position",
"couch camera-performance position"
],
"performance_act": [
"body presented directly to the camera",
"spreading open for the camera with hands visible",
"partner holding the body open for the camera",
"looking into the camera while exposing the body",
"mirror-facing creator reveal with phone-angle intimacy",
"one hand pointing or guiding attention to the body",
"teasing the camera while a partner watches",
"showing the next action to the camera",
"hands framing breasts, hips, and thighs for the viewer",
"body angled to keep the erotic focus visible"
],
"presentation_detail": [
"direct eye contact with the lens",
"hands framing the exposed body",
"body opened toward the viewer",
"hips tilted toward the camera",
"legs placed to keep the body readable",
"partner's hands presenting the body",
"mirror reflection doubling the reveal",
"phone-camera intimacy implied by the framing"
],
"camera_detail": [
"creator-shot framing",
"close subscriber-view angle",
"mirror-camera presentation",
"low phone angle",
"tight handheld crop",
"vertical feed-style framing",
"direct-to-camera performance",
"camera-aware body display"
],
"hand_detail": [
"hands holding thighs open",
"one hand on the camera-facing hip",
"hands framing breasts",
"partner's hands on the waist",
"one hand pulling fabric aside",
"fingers spread over the lower belly",
"hands braced beside the body",
"one hand touching the face while looking at the camera"
],
"reaction_detail": [
"confident direct stare",
"shameless camera-aware grin",
"breathless close-camera expression",
"heavy-lidded creator gaze",
"teasing open mouth",
"controlled performance stare",
"flushed direct eye contact",
"knowing subscriber-camera expression"
],
"visibility": [
"camera-facing action clearly readable",
"hands, exposed skin, and body opening centered",
"presentation gesture visible",
"body display and camera awareness clear",
"partner hands and creator gaze visible",
"mirror or lens-directed pose readable"
],
"surface": [
"rumpled bed sheets",
"a hotel bed",
"a mirror-side bench",
"a wide couch",
"floor cushions",
"a low mattress",
"a soft rug",
"a private shower bench"
]
}
},
{
"name": "Group coordination and watching",
"slug": "group_coordination",
"min_people": 3,
"inherit_expressions": false,
"inherit_compositions": false,
"weight": 0.55,
"item_label": "Group interaction",
"positive_suffix": "Use readable adult group coordination, clear body spacing, visible watching/touching roles, exposed skin, warm erotic lighting, crisp comic linework, detailed hatching, and tactile textured paper.",
"prompt_template": "{subject_phrase}, all 21+ consenting adults: {style}. Cast: {cast_summary}. Role graph: {role_graph} Group interaction: {item}. Setting: {scene}. Composition: {composition}. Facial expressions: {expression}. Make the scene explicit through adult group coordination, watching, guiding hands, body presentation, exposed skin, and clear role spacing. {positive_suffix} Avoid: {negative_prompt}.",
"caption_template": "{trigger}, {scene_kind}, {cast_summary}, {role_graph}, group coordination action: {item}, {scene}, {composition}, explicit consensual adult group-interaction illustration",
"scene_pools": ["hardcore_group_scenes", "hardcore_private_scenes"],
"expression_pools": ["hardcore_group_expressions"],
"composition_pools": ["group_coordination_compositions"],
"item_templates": [
"{coordination_act} with {arrangement}, {touch_detail}, {reaction_detail}, and {visibility}",
"{arrangement} featuring {coordination_act}, {body_contact}, {watching_detail}, and {visibility}",
"{coordination_act} on {surface}, with {touch_detail}, {watching_detail}, and {body_contact}",
"group coordination setup: {arrangement}, {coordination_act}, {watching_detail}, and {visibility}",
"{arrangement} while {coordination_act}, with {touch_detail}, {reaction_detail}, and {visibility}"
],
"item_axes": {
"arrangement": [
"one central body with partners arranged around them",
"one partner watching while another touches the central body",
"two partners guiding the central body into position",
"one partner behind and one partner in front without penetration",
"a waiting-turn arrangement beside the bed",
"partners framing the body from both sides",
"one partner kneeling while another stands close",
"mirror-view group coordination arrangement"
],
"coordination_act": [
"one partner watches while another caresses the body",
"two partners hold the body open for the camera",
"one partner kisses while another touches breasts and hips",
"partners take turns touching and presenting the central body",
"one partner guides the face while another guides the hips",
"watching partner keeps a hand on the shoulder",
"two partners coordinate hands across breasts, waist, and thighs",
"one partner waits close while the other controls the pose"
],
"touch_detail": [
"hands on breasts, hips, and thighs",
"one hand holding the chin",
"hands spreading thighs",
"one partner gripping the waist",
"hands framing the exposed body",
"one partner touching from behind",
"fingers tangled in hair",
"one hand braced on the bed"
],
"watching_detail": [
"watching partner keeps eye contact",
"one partner looks down at the action",
"waiting partner stays close in frame",
"side partner watches with hands on skin",
"partners exchange direct looks",
"one partner watches from beside the bed",
"mirror reflection shows the observer",
"all faces remain readable"
],
"body_contact": [
"central body held open",
"bodies pressed around the center",
"partners close enough to touch from both sides",
"central hips angled toward the camera",
"knees spread by guiding hands",
"skin-on-skin contact from multiple sides",
"body framed by surrounding hands",
"clear spacing between each role"
],
"reaction_detail": [
"mixed hungry stares",
"central body flushed and breathless",
"watching partner focused and close",
"several direct camera-aware looks",
"one partner smiling while another concentrates",
"shared aroused expressions",
"heavy-lidded group tension",
"focused adult anticipation"
],
"visibility": [
"all roles readable in one frame",
"watching, touching, and presenting roles clear",
"hands and faces visible across the group",
"central body and surrounding partners visible",
"group spacing clear without action confusion",
"body presentation and observer reaction visible"
],
"surface": [
"rumpled bed sheets",
"a hotel bed",
"floor cushions",
"a wide couch",
"a low mattress",
"a velvet lounge",
"a soft rug",
"a private suite floor"
]
}
},
{
"name": "Aftercare and cleanup",
"slug": "aftercare_cleanup",
"min_people": 2,
"inherit_expressions": false,
"inherit_compositions": false,
"weight": 0.35,
"item_label": "Aftermath interaction",
"positive_suffix": "Use adult post-sex intimacy, readable bodies and hands, visible aftermath details, warm erotic lighting, crisp comic linework, detailed hatching, and tactile textured paper.",
"prompt_template": "{subject_phrase}, all 21+ consenting adults: {style}. Cast: {cast_summary}. Role graph: {role_graph} Aftermath interaction: {item}. Setting: {scene}. Composition: {composition}. Facial expressions: {expression}. Make the scene explicit through adult post-sex closeness, cleanup, visible skin, relaxed body contact, aftermath details, and readable hands and faces. {positive_suffix} Avoid: {negative_prompt}.",
"caption_template": "{trigger}, {scene_kind}, {cast_summary}, {role_graph}, aftercare and cleanup action: {item}, {scene}, {composition}, explicit consensual adult post-sex aftermath illustration",
"scene_pools": ["hardcore_climax_scenes", "hardcore_bed_scenes", "hardcore_private_scenes"],
"expression_pools": ["hardcore_aftercare_expressions"],
"composition_pools": ["aftercare_compositions"],
"item_templates": [
"{aftercare_act} in {position}, with {cleanup_detail}, {body_contact}, and {visibility}",
"{position} featuring {aftercare_act}, {touch_detail}, {cleanup_detail}, and {reaction_detail}",
"{aftercare_act} on {surface}, with {body_contact}, {touch_detail}, and {visibility}",
"post-sex aftermath setup: {position}, {aftercare_act}, {cleanup_detail}, and {reaction_detail}",
"{position} while {aftercare_act}, with {touch_detail}, {body_contact}, and {visibility}"
],
"item_axes": {
"position": [
"reclining post-sex cuddle position",
"bed-edge cleanup position",
"side-lying aftercare position",
"kneeling towel-cleanup position",
"mirror aftermath position",
"couch post-sex closeness position",
"lap-held aftercare position",
"shower-bench cleanup position"
],
"aftercare_act": [
"kissing after sex with bodies still close",
"one partner wiping skin with a towel",
"post-sex cuddle with hands on the body",
"one partner checking the other's face while holding them close",
"cleanup with a wet cloth across the thighs",
"exhausted bodies resting together after orgasm",
"one partner kissing cum or sweat from skin",
"gentle caressing after the explicit act",
"bodies still tangled in the aftermath",
"one partner holding the other against the chest"
],
"cleanup_detail": [
"towel visible in one hand",
"wet cloth wiping skin",
"aftermath fluids still visible on skin",
"rumpled sheets and discarded clothing nearby",
"hands wiping thighs and belly",
"skin shiny with sweat and aftermath",
"one hand smoothing hair away from the face",
"messy bedding and relaxed limbs"
],
"touch_detail": [
"hands resting on the lower back",
"one hand cupping the face",
"fingers brushing hair aside",
"hands wrapped around the waist",
"one hand on the thigh",
"bodies held chest to chest",
"gentle hand on the stomach",
"arms wrapped around shoulders"
],
"body_contact": [
"bodies lying close together",
"legs tangled on the sheets",
"one body curled against the other",
"skin pressed together in relaxed contact",
"one partner kneeling close with a towel",
"thighs relaxed and open after the scene",
"body resting against a partner's chest",
"both bodies exhausted but close"
],
"reaction_detail": [
"spent satisfied expression",
"soft post-sex eye contact",
"breathless relaxed face",
"dazed afterglow stare",
"small exhausted smile",
"heavy-lidded calm expression",
"flushed skin and relaxed mouth",
"tender direct gaze"
],
"visibility": [
"aftercare gesture clearly visible",
"cleanup object and body contact readable",
"hands, faces, and aftermath details visible",
"post-sex closeness centered",
"towel or cloth action clear",
"relaxed bodies and visible skin readable"
],
"surface": [
"rumpled bed sheets",
"a hotel bed",
"a wide couch",
"floor cushions",
"a low mattress",
"a shower bench",
"a soft rug",
"a velvet chaise"
]
}
},
{
"name": "Penetrative sex",
"slug": "penetrative_sex",
+40 -5
View File
@@ -85,6 +85,7 @@ These recipes identify the intended road before editing prompt text.
| Keep character/location but change only sexual pose | `Global Seed` or fixed seed config -> builder/pair | Keep `person_seed` and `scene_seed` fixed; change `pose_seed` and usually `role_seed`; for hardcore categories check `content_seed_axis` | `sexual_poses.json`, `hardcore_position_config`, Krea `_hardcore_action_sentence` |
| Generate a specific hardcore oral/blowjob scene | `Hardcore Position Pool` -> `Hardcore Action Filter` -> `Insta/OF Prompt Pair` or `Prompt Builder` | Use `focus=oral_only` or disable non-oral families; keep `allow_oral=true`; constrain position pool to kneeling/standing/oral variants when needed | `sexual_poses.json` oral subcategory/templates, `_apply_hardcore_position_config_to_subcategory`, `_hardcore_action_sentence` |
| Generate POV oral or POV penetration | `Man Slot` with POV presence -> `character_cast` -> pair/builder -> Krea2 formatter | POV man must be in the cast; use metadata into Krea2; normal camera directive is suppressed by POV | `_pov_hardcore_pose_sentence`, `_pov_action_phrase`, `_cast_prose` omit-label handling |
| Generate porn-scene interaction beats | `Hardcore Position Pool` -> `Hardcore Action Filter` -> pair/builder | Use `focus=interaction_only` for kissing/body worship/transitions/guidance/camera/watching/aftercare, or `focus=manual_only` for fingering/clit/manual stimulation; constrain keys such as `camera_showing`, `wrist_pinning`, `fingering`, `aftercare` | `sexual_poses.json` interaction/manual subcategories, `_role_graph`, Krea `_is_foreplay_text` / `_hardcore_action_sentence` |
| Same woman, same room, softcore and hardcore outputs | `Character Slot/Profile` -> `Insta/OF Options` -> `Insta/OF Prompt Pair` | `continuity=same_creator_same_room`; set `softcore_cast` as needed; use pair metadata into formatter | `build_insta_of_pair`, `softcore_row`, `hardcore_row`, pair metadata fields |
| Same cast in softcore and hardcore | Character slot chain -> `Insta/OF Options` | `softcore_cast=same_as_hardcore`; configure partner slots/outfits if needed | `_insta_of_partner_styling`, character slot clothing, pair Krea branch |
| Change only outfit/clothing | Character clothing or category content route | Keep `person_seed`, `scene_seed`, `pose_seed`; change `content_seed`; slot `softcore_outfit` overrides Insta/OF outfit | `SxCP Character Clothing`, `INSTA_OF_SOFTCORE_OUTFITS`, category item templates |
@@ -205,7 +206,7 @@ This table is the first stop when the selected content is wrong.
| `default_categories.json` men casual subcategories | Male casual outfit/items and men-specific casual pools | Same as above | Medium if men are part of a mixed cast and clothing detail is too strong |
| `default_categories.json` couple casual subcategories | Couple outfit/action-ish soft poses and couple pools | Same as above | Medium because labels and partner styling can duplicate pair mode |
| `erotic_clothes.json` | Provocative/erotic clothing categories and softcore creator scenes | `content`, `scene`, `expression`, `composition` | Medium because nude/implied-nude wording can conflict with clothes |
| `sexual_poses.json` foreplay/oral/outercourse/penetration/etc. | Hardcore action item templates, role graphs, axis values, hardcore pool references | `pose` for pose-content route, also `role`; sometimes `content` aliases matter | High because Krea2 rewrites action and POV position text |
| `sexual_poses.json` foreplay/interaction/manual/oral/outercourse/penetration/etc. | Hardcore action and porn-scene interaction templates, role graphs, axis values, hardcore pool references | `pose` for pose-content route, also `role`; sometimes `content` aliases matter | High because Krea2 rewrites action and POV position text |
| `location_pools.json` | Reusable scene pools and legacy scene extensions | `scene` | Medium when a camera-aware adapter changes scene/composition wording |
| `expression_composition_pools.json` | Reusable expressions and framing/composition pools | `expression`, `composition` | Medium because formatter may label or suppress expressions |
| `generate_prompt_batches.py` legacy pools | Built-in generator clothing, pose, expression, scene, composition lists | Main row seed plus axis config through legacy adapter | Medium because legacy prompt format is field-label heavy |
@@ -268,6 +269,10 @@ Edit targets:
- Normal pose pools: legacy `g.POSES`, `g.EVOCATIVE_POSES`, or JSON `poses`.
- Hardcore positions/actions: `categories/sexual_poses.json`.
- Hardcore interaction beats: `categories/sexual_poses.json` subcategories
`foreplay_teasing`, `manual_stimulation`, `body_worship_touching`,
`clothing_position_transitions`, `dominant_guidance`,
`camera_performance`, `group_coordination`, and `aftercare_cleanup`.
- Position filtering UI: `build_hardcore_position_pool_json`,
`build_hardcore_action_filter_json`, `_apply_hardcore_position_config_to_subcategory`.
- Krea2 action rewrite, POV position rewrite, cleanup: `krea_formatter.py`.
@@ -358,8 +363,8 @@ Hardcore row:
- Category is always `Hardcore sexual poses`.
- Cast count comes from `SxCP Insta/OF Options`.
- Position/action can be constrained by `SxCP Hardcore Position Pool` and
`SxCP Hardcore Action Filter`.
- Position/action/interaction can be constrained by `SxCP Hardcore Position
Pool` and `SxCP Hardcore Action Filter`.
- Clothing comes from character slot hardcore clothing first, then fallback
`hardcore_clothing_continuity`.
- Men receive default hardcore clothing if visible and not configured.
@@ -410,7 +415,7 @@ plain prompt text. When debugging, inspect these fields before editing pools.
| `character_cast_slots` | Character slot chain | POV/camera/formatters | Raw configured slots. |
| `character_slot_status`, `character_profile_status` | Character/profile application | Debug | Explains whether slot/profile was applied or skipped. |
| `pov_character_labels` | Character slot presence mode | Krea/prompt/camera | Labels omitted from visible cast and rewritten as first-person POV. |
| `hardcore_position_config` | Hardcore position/filter nodes | Debug | Active hardcore family/position/action constraints. |
| `hardcore_position_config` | Hardcore position/filter nodes | Debug | Active hardcore family/position/action/interaction constraints, including `interaction_only` and `manual_only`. |
| `negative_prompt` | Category/pair/default negative route | Formatter output | Base negative text before formatter extras. |
| `trigger` | Builder input | Formatter/fallback/debug | Active trigger after fallback to default. |
@@ -453,11 +458,40 @@ flowchart TD
What each part owns:
- `sexual_poses.json`: available positions, families, action templates, role
graph templates, and action-specific pool references.
graph templates, interaction templates, and action-specific pool references.
- `prompt_builder.py`: filters which templates/axes remain available.
- `krea_formatter.py`: rewrites the selected action into model-readable prose,
including POV variants and cleanup.
Current broad hardcore families:
| Family / focus | Subcategories |
| --- | --- |
| `penetrative` / `penetration_only` | `penetrative_sex` |
| `foreplay` / `foreplay_only` | `foreplay_teasing` |
| `interaction` / `interaction_only` | `foreplay_teasing`, `body_worship_touching`, `clothing_position_transitions`, `dominant_guidance`, `camera_performance`, `group_coordination`, `aftercare_cleanup` |
| `manual` / `manual_only` | `manual_stimulation` |
| `oral` / `oral_only` | `oral_sex` |
| `outercourse` / `outercourse_only` | `outercourse_sex`, `manual_stimulation` |
| `anal` / `anal_only` | `anal_double_penetration` |
| `climax` / `climax_only` | `cumshot_climax` |
| `threesome` / `threesome_only` | `threesomes` |
| `group` / `group_only` | `group_sex_orgy` |
The action filter also has independent gates for toys, double-contact,
penetration, foreplay, interaction, manual stimulation, oral, outercourse, anal,
and climax. Keep `allow_interaction=true` when using the broader interaction
family; keep `allow_manual=true` when manual stimulation should remain possible.
`allow_anal=false` blocks anal-sex wording, not ordinary ass-touching interaction
phrases such as ass grabbing or body worship.
Interaction selector keys include kissing/caressing/undressing, body worship,
nipple play, ass grabbing, thigh kissing, hair holding, wrist pinning, dirty
talk, position transitions, guided positioning, camera presentation, watching,
aftercare, cleanup, fingering, clit rubbing, and mutual masturbation. These keys
are still routed through `hardcore_position_config.positions`, so they are
controlled by the same `pose`/`role` debug path as other hardcore action keys.
If one action keeps recurring, inspect:
1. The enabled position family/action flags.
@@ -614,6 +648,7 @@ or pool appears there but not in this map, update the relevant route table.
| Wrong expression intensity | Character slot expression settings, `_expression_entries_for_intensity`, expression pools. |
| Expression appears when disabled | `_disable_row_expression`, formatter expression extraction. |
| Same hardcore action repeats | Hardcore filter config, `sexual_poses.json` weights, `_apply_hardcore_position_config_to_subcategory`. |
| Hardcore interaction beat falls back to penetration/oral | `sexual_poses.json` interaction subcategory, `_role_graph`, and Krea `_is_foreplay_text` / `_hardcore_pose_anchor`. |
| Raw hardcore prompt position is vague | `sexual_poses.json` item templates and role graph templates. |
| Krea2 hardcore prompt position is vague | `_hardcore_action_sentence` or `_pov_hardcore_pose_sentence`. |
| Man appears described in POV | POV labels, `_cast_prose` omit labels, `_pov_action_phrase`. |
+56
View File
@@ -839,6 +839,17 @@ def _is_outercourse_text(*parts: Any) -> bool:
"hand stroking",
"hand wraps around",
"manual stimulation",
"fingering",
"fingers inside",
"fingers in pussy",
"hand on pussy",
"fingers on pussy",
"fingers sliding against the pussy",
"open-thigh manual",
"clit rubbing",
"clit",
"clitoris",
"mutual masturbation",
"footjob",
"soles wrap around",
"soles",
@@ -904,6 +915,51 @@ def _is_foreplay_text(*parts: Any) -> bool:
"pulling clothing",
"sliding straps",
"unbuttoning",
"body worship",
"nipple",
"mouth on skin",
"kissing down",
"ass grabbing",
"gripping the ass",
"thigh kissing",
"inner thighs",
"hair held",
"holding hair",
"hair pulled back",
"wrist",
"wrists",
"pinning",
"guided",
"guiding",
"turning the body",
"position transition",
"pulling onto the bed",
"lifting and spreading",
"spreading thighs",
"dirty talk",
"whispering",
"camera performance",
"presented directly to the camera",
"present her body",
"showing to camera",
"spread open for the camera",
"watching partner",
"waiting turn",
"group coordination",
"aftercare",
"cleanup",
"wiping",
"towel",
"post-sex",
"fingering",
"fingers inside",
"hand on pussy",
"fingers on pussy",
"clit rubbing",
"clit",
"clitoris",
"manual stimulation",
"mutual masturbation",
)
)
+265 -6
View File
@@ -300,6 +300,8 @@ HARDCORE_POSITION_FAMILY_CHOICES = [
"any",
"penetrative",
"foreplay",
"interaction",
"manual",
"oral",
"outercourse",
"anal",
@@ -311,6 +313,8 @@ HARDCORE_POSITION_FOCUS_CHOICES = [
"keep_pool",
"penetration_only",
"foreplay_only",
"interaction_only",
"manual_only",
"oral_only",
"outercourse_only",
"anal_only",
@@ -341,6 +345,22 @@ HARDCORE_POSITION_KEY_CHOICES = [
"breast_touch",
"face_touch",
"undressing",
"body_worship",
"nipple_play",
"ass_grab",
"thigh_kissing",
"hair_holding",
"wrist_pinning",
"dirty_talk",
"position_transition",
"guided_positioning",
"camera_showing",
"watching",
"aftercare",
"cleanup",
"fingering",
"clit_rubbing",
"mutual_masturbation",
"boobjob",
"testicle_sucking",
"penis_licking",
@@ -353,17 +373,34 @@ HARDCORE_POSITION_FAMILY_SUBCATEGORIES = {
"any": [
"penetrative_sex",
"foreplay_teasing",
"body_worship_touching",
"clothing_position_transitions",
"dominant_guidance",
"camera_performance",
"manual_stimulation",
"oral_sex",
"outercourse_sex",
"anal_double_penetration",
"threesomes",
"group_coordination",
"group_sex_orgy",
"cumshot_climax",
"aftercare_cleanup",
],
"penetrative": ["penetrative_sex"],
"foreplay": ["foreplay_teasing"],
"interaction": [
"foreplay_teasing",
"body_worship_touching",
"clothing_position_transitions",
"dominant_guidance",
"camera_performance",
"group_coordination",
"aftercare_cleanup",
],
"manual": ["manual_stimulation"],
"oral": ["oral_sex"],
"outercourse": ["outercourse_sex"],
"outercourse": ["outercourse_sex", "manual_stimulation"],
"anal": ["anal_double_penetration"],
"climax": ["cumshot_climax"],
"threesome": ["threesomes"],
@@ -392,6 +429,22 @@ HARDCORE_POSITION_KEY_MATCHES = {
"breast_touch": ("breast", "breasts", "nipple", "cupping breasts", "touching breasts"),
"face_touch": ("face", "cheek", "jaw", "chin", "hand on the cheek", "fingers under the chin"),
"undressing": ("undressing", "removing clothing", "removing clothes", "pulling clothing", "sliding straps", "unbuttoning"),
"body_worship": ("body worship", "worship", "kissing down", "mouth on skin", "kissing the body"),
"nipple_play": ("nipple", "nipples", "licking nipples", "sucking nipples", "nipple play"),
"ass_grab": ("ass grab", "ass-grab", "ass grabbing", "hand on the ass", "squeezing the ass"),
"thigh_kissing": ("thigh kiss", "thigh kissing", "kissing thighs", "mouth on inner thighs"),
"hair_holding": ("hair holding", "hair held", "holding hair", "hair pulled back"),
"wrist_pinning": ("wrist", "wrists", "pinning wrists", "wrists pinned", "hands pinned"),
"dirty_talk": ("dirty talk", "whispering", "mouth near the ear", "telling", "verbal teasing"),
"position_transition": ("transition", "turning around", "pulling onto the bed", "moving into position", "position change"),
"guided_positioning": ("guiding", "guided", "guides", "lifting legs", "spreading thighs", "pulling hips", "turning the body"),
"camera_showing": ("camera", "showing to camera", "presenting to camera", "spread open for camera", "creator-shot"),
"watching": ("watching", "voyeur", "waiting turn", "partner watches", "onlooker"),
"aftercare": ("aftercare", "cuddling", "kissing after", "holding close", "post-sex"),
"cleanup": ("cleanup", "wiping", "cleaning", "towel", "wet cloth"),
"fingering": ("fingering", "fingers inside", "fingers in pussy", "finger stimulation"),
"clit_rubbing": ("clit", "clitoris", "clit rubbing", "rubbing the clit", "fingers on clit"),
"mutual_masturbation": ("mutual masturbation", "both touching themselves", "masturbating together", "hands on their own bodies"),
"boobjob": ("boobjob", "titjob", "breast-sex", "breast sex"),
"testicle_sucking": ("testicle", "balls-licking", "balls licking", "balls and mouth"),
"penis_licking": ("penis-licking", "penis licking", "tongue along", "tongue licking"),
@@ -400,7 +453,23 @@ HARDCORE_POSITION_KEY_MATCHES = {
"open_thighs": ("thighs open", "legs spread", "open thighs", "legs open", "reclining with thighs open"),
"front_back": ("front-and-back", "front and back", "one behind and one in front", "between two partners"),
}
HARDCORE_POSITION_AXIS_KEYS = {"position", "body_position", "body_arrangement", "arrangement"}
HARDCORE_POSITION_AXIS_KEYS = {
"position",
"body_position",
"body_arrangement",
"arrangement",
"tease_act",
"touch_detail",
"manual_act",
"manual_detail",
"worship_act",
"transition_act",
"control_act",
"performance_act",
"coordination_act",
"aftercare_act",
"cleanup_detail",
}
CAMERA_ORBIT_FRAMING_CHOICES = [
"from_zoom",
"wide",
@@ -2347,6 +2416,8 @@ def _empty_hardcore_position_config() -> dict[str, Any]:
"allow_double": True,
"allow_penetration": True,
"allow_foreplay": True,
"allow_interaction": True,
"allow_manual": True,
"allow_oral": True,
"allow_outercourse": True,
"allow_anal": True,
@@ -2376,6 +2447,8 @@ def _parse_hardcore_position_config(value: str | dict[str, Any] | None) -> dict[
"allow_double",
"allow_penetration",
"allow_foreplay",
"allow_interaction",
"allow_manual",
"allow_oral",
"allow_outercourse",
"allow_anal",
@@ -2401,6 +2474,8 @@ def _hardcore_position_summary(config: dict[str, Any]) -> str:
("allow_double", "double"),
("allow_penetration", "penetration"),
("allow_foreplay", "foreplay"),
("allow_interaction", "interaction"),
("allow_manual", "manual"),
("allow_oral", "oral"),
("allow_outercourse", "outercourse"),
("allow_anal", "anal"),
@@ -2446,6 +2521,8 @@ def build_hardcore_action_filter_json(
allow_double: bool = False,
allow_penetration: bool = True,
allow_foreplay: bool = True,
allow_interaction: bool = True,
allow_manual: bool = True,
allow_oral: bool = True,
allow_outercourse: bool = True,
allow_anal: bool = True,
@@ -2457,6 +2534,8 @@ def build_hardcore_action_filter_json(
focus_family = {
"penetration_only": "penetrative",
"foreplay_only": "foreplay",
"interaction_only": "interaction",
"manual_only": "manual",
"oral_only": "oral",
"outercourse_only": "outercourse",
"anal_only": "anal",
@@ -2470,6 +2549,8 @@ def build_hardcore_action_filter_json(
config["allow_double"] = bool(allow_double)
config["allow_penetration"] = bool(allow_penetration)
config["allow_foreplay"] = bool(allow_foreplay)
config["allow_interaction"] = bool(allow_interaction)
config["allow_manual"] = bool(allow_manual)
config["allow_oral"] = bool(allow_oral)
config["allow_outercourse"] = bool(allow_outercourse)
config["allow_anal"] = bool(allow_anal)
@@ -2481,6 +2562,8 @@ def build_hardcore_action_filter_json(
for enabled, family in (
(config["allow_penetration"], "penetrative"),
(config["allow_foreplay"], "foreplay"),
(config["allow_interaction"], "interaction"),
(config["allow_manual"], "manual"),
(config["allow_oral"], "oral"),
(config["allow_outercourse"], "outercourse"),
(config["allow_anal"], "anal"),
@@ -2493,6 +2576,12 @@ def build_hardcore_action_filter_json(
if focus == "foreplay_only":
config["allow_foreplay"] = True
config["allow_interaction"] = True
elif focus == "interaction_only":
config["allow_interaction"] = True
config["allow_foreplay"] = True
elif focus == "manual_only":
config["allow_manual"] = True
elif focus == "oral_only":
config["allow_oral"] = True
config["allow_penetration"] = False
@@ -2530,6 +2619,20 @@ def _hardcore_allowed_subcategory_slugs(config: dict[str, Any]) -> set[str]:
allowed.difference_update({"penetrative_sex", "anal_double_penetration", "threesomes", "group_sex_orgy"})
if not config.get("allow_foreplay", True):
allowed.discard("foreplay_teasing")
if not config.get("allow_interaction", True):
allowed.difference_update(
{
"foreplay_teasing",
"body_worship_touching",
"clothing_position_transitions",
"dominant_guidance",
"camera_performance",
"group_coordination",
"aftercare_cleanup",
}
)
if not config.get("allow_manual", True):
allowed.discard("manual_stimulation")
if not config.get("allow_oral", True):
allowed.discard("oral_sex")
if not config.get("allow_outercourse", True):
@@ -2582,7 +2685,7 @@ def _hardcore_text_blocked_by_action(text: str, axis_name: str, config: dict[str
return True
if not config.get("allow_anal", True) and (
axis_name == "anal_act"
or any(term in text for term in (" anal", "ass", "rear-entry anal"))
or any(term in text for term in (" anal", "anal sex", "anal penetration", "anus", "rear-entry anal", "penis entering ass", "thrusts into her ass", "thrusts into his ass"))
):
return True
if not config.get("allow_oral", True) and (
@@ -2626,6 +2729,68 @@ def _hardcore_text_blocked_by_action(text: str, axis_name: str, config: dict[str
)
):
return True
if not config.get("allow_interaction", True) and (
axis_name
in (
"tease_act",
"touch_detail",
"clothing_detail",
"foreplay_detail",
"face_detail",
"body_contact",
"mood_detail",
"worship_act",
"transition_act",
"control_act",
"performance_act",
"coordination_act",
"aftercare_act",
"cleanup_detail",
)
or any(
term in text
for term in (
"kiss",
"kissing",
"caress",
"body worship",
"nipple",
"ass grab",
"thigh",
"hair holding",
"wrists",
"dirty talk",
"whispering",
"undressing",
"position transition",
"guided",
"camera",
"watching",
"aftercare",
"cleanup",
"wiping",
)
)
):
return True
if not config.get("allow_manual", True) and (
axis_name in ("manual_act", "manual_detail")
or any(
term in text
for term in (
"fingering",
"fingers inside",
"clit",
"clitoris",
"manual stimulation",
"mutual masturbation",
"masturbating together",
"fingers on pussy",
"fingers on clit",
)
)
):
return True
if not config.get("allow_climax", True) and (
axis_name in ("climax_act", "climax_hint", "climax_detail", "fluid_detail", "fluid_location")
or any(term in text for term in ("climax", "cum", "semen", "ejaculat", "creampie", "post-orgasm", "post-penetration"))
@@ -6067,6 +6232,74 @@ def _role_graph(
f"hands caressing skin while clothing is pulled aside."
)
def interaction_text() -> str:
return " ".join(
str(part or "").lower()
for part in (
item_text,
*((item_axis_values or {}).values()),
)
)
def manual_position_graph(primary: str, partner: str = "") -> str:
text = interaction_text()
if not partner:
if "mutual" in text:
return f"{primary} faces the camera with thighs open, both hands on her body for solo mutual-style masturbation framing."
return f"{primary} reclines with thighs open, one hand between her legs and fingers visibly stimulating her pussy."
if "mutual" in text:
return f"{primary} and {partner} sit close facing each other, both touching themselves while keeping hands, faces, and bodies visible."
if "clit" in text or "clitoris" in text:
return f"{primary} reclines with thighs open while {partner}'s hand is between her legs, fingers rubbing her clit as her hips tilt toward the touch."
if "toy" in text or "vibrator" in text:
return f"{primary} reclines with thighs open while {partner} holds a vibrator or toy against her clit, one hand keeping her thigh open."
return f"{primary} reclines with thighs open while {partner}'s hand is between her legs, fingers visibly stimulating her pussy."
def interaction_position_graph(primary: str, partner: str, third: str = "") -> str:
text = interaction_text()
if "aftercare" in slug or any(term in text for term in ("aftercare", "cleanup", "wiping", "towel", "post-sex", "cuddle")):
if "cleanup" in text or "wiping" in text or "towel" in text:
return f"{primary} reclines after sex while {partner} kneels close and wipes her skin with a towel, hands and relaxed body contact visible."
return f"{primary} and {partner} lie close together after sex, bodies relaxed and hands resting on skin in a post-sex cuddle."
if "camera_performance" in slug or any(term in text for term in ("camera", "presenting", "showing", "viewer", "creator-shot")):
if third:
return f"{primary} faces the camera while {partner} and {third} hold and present her body, hands framing the exposed skin for the viewer."
return f"{primary} faces the camera and presents her body while {partner}'s hands hold her hips or thighs open for a clear creator-shot reveal."
if "body_worship" in slug or any(term in text for term in ("body worship", "nipple", "thigh", "mouth on skin", "kissing down", "ass grabbing")):
if "ass" in text:
return f"{primary} stands or kneels with hips angled back while {partner}'s hands grip her ass, fingers pressing into skin."
if "thigh" in text:
return f"{primary} reclines with thighs open while {partner} kneels close and kisses along her inner thighs, hands holding her legs in place."
if "nipple" in text or "breast" in text:
return f"{primary} arches toward {partner} while {partner}'s mouth is on her breast and one hand cups or squeezes the other breast."
return f"{primary} reclines or leans back while {partner} kisses down her body, hands tracing breasts, waist, hips, and thighs."
if "clothing_position" in slug or any(term in text for term in ("transition", "turning", "pulling onto", "lifting", "guided backward", "clothing", "garment")):
if "turn" in text or "rear-facing" in text:
return f"{partner}'s hands turn {primary} around by the hips, clothing partly moved aside as her body rotates into the next pose."
if "legs" in text or "thigh" in text:
return f"{primary} lies back while {partner} lifts and spreads her legs into position, hands and clothing movement clearly visible."
return f"{primary} and {partner} are mid-transition, with {partner}'s hands moving clothing aside and guiding {primary}'s hips toward the next pose."
if "dominant" in slug or any(term in text for term in ("hair", "wrist", "wrists", "jaw", "chin", "guided", "dominant", "control", "dirty talk", "whisper", "mouth near the ear", "verbal teasing")):
if "dirty talk" in text or "whisper" in text or "mouth near the ear" in text or "verbal teasing" in text:
return f"{partner} leans close to {primary}'s ear for dirty talk while holding her waist and keeping their bodies pressed close."
if "wrist" in text or "wrists" in text:
return f"{primary} lies back while {partner} pins her wrists above her head, both bodies close and the consensual control gesture clearly visible."
if "hair" in text:
return f"{partner} holds {primary}'s hair back while guiding her body closer, face and hair-hold gesture visible."
if "thigh" in text or "spread" in text:
return f"{primary} reclines with thighs open while {partner}'s hands spread her legs and hold the position for the camera."
return f"{partner} guides {primary}'s body with hands on her jaw, waist, and hips, keeping the consensual control gesture readable."
return foreplay_position_graph(primary, partner)
def group_coordination_graph(primary: str, partner: str, third: str) -> str:
observer = third or any_person({primary, partner})
text = interaction_text()
if "camera" in text or "hold" in text or "present" in text:
return f"{primary} is centered while {partner} and {observer} hold and present the body for the camera, each role clearly visible."
if "watch" in text or "waiting" in text:
return f"{primary} is centered while {partner} touches her body and {observer} watches close beside them, hands and faces readable."
return f"{primary} is centered while {partner} touches her body and {observer} stays close as the watching or guiding partner."
def mentions_ass(text: str) -> bool:
return bool(
re.search(
@@ -6346,6 +6579,10 @@ def _role_graph(
if people_count == 1:
solo = people[0]
if women_count == 1:
if "manual_stimulation" in slug:
return manual_position_graph(solo)
if "camera_performance" in slug:
return f"{solo} faces the camera and presents her body with hands framing the exposed skin in a solo creator-shot pose."
if "cumshot" in slug or "climax" in slug:
return f"{solo} is shown in a solo explicit orgasm pose with thighs open, one hand on her body, and visible arousal on skin and sheets."
return f"{solo} is shown in a solo explicit adult pose with self-touch, open body framing, and direct camera awareness."
@@ -6357,7 +6594,16 @@ def _role_graph(
a, b = _pick_distinct(rng, women, 2)
c = any_woman({a, b}) if len(women) >= 3 else ""
used = {a, b}
if "foreplay" in slug:
if "manual_stimulation" in slug:
graph = manual_position_graph(a, b)
elif "group_coordination" in slug and c:
graph = group_coordination_graph(a, b, c)
used.add(c)
elif any(token in slug for token in ("foreplay", "body_worship", "clothing_position", "dominant_guidance", "camera_performance", "aftercare")):
graph = interaction_position_graph(a, b, c)
if c and "camera_performance" in slug:
used.add(c)
elif "foreplay" in slug:
graph = foreplay_position_graph(a, b)
elif "outercourse" in slug:
graph = f"{a} kneels close to {b}'s body and uses mouth, hands, breasts, or feet for explicit non-penetrative contact."
@@ -6379,7 +6625,14 @@ def _role_graph(
a, b = _pick_distinct(rng, men, 2)
c = any_man({a, b}) if len(men) >= 3 else ""
used = {a, b}
if "foreplay" in slug:
if "manual_stimulation" in slug:
graph = f"{a} and {b} sit or recline close together with hands visibly stimulating bodies in a manual sex setup."
elif "group_coordination" in slug and c:
graph = group_coordination_graph(a, b, c)
used.add(c)
elif any(token in slug for token in ("foreplay", "body_worship", "clothing_position", "dominant_guidance", "camera_performance", "aftercare")):
graph = f"{a} and {b} press close together, kissing and caressing skin while clothing is pulled aside."
elif "foreplay" in slug:
graph = f"{a} and {b} press close together, kissing and caressing skin while clothing is pulled aside."
elif "outercourse" in slug:
graph = f"{a} and {b} keep explicit non-penetrative penis contact visible with hands, mouth, or feet."
@@ -6401,7 +6654,13 @@ def _role_graph(
woman = any_woman()
man = any_man()
third = any_person({woman, man}) if people_count >= 3 else ""
if "foreplay" in slug:
if "manual_stimulation" in slug:
graph = manual_position_graph(woman, man)
elif "group_coordination" in slug:
graph = group_coordination_graph(woman, man, third)
elif any(token in slug for token in ("foreplay", "body_worship", "clothing_position", "dominant_guidance", "camera_performance", "aftercare")):
graph = interaction_position_graph(woman, man, third)
elif "foreplay" in slug:
graph = foreplay_position_graph(woman, man)
elif "outercourse" in slug:
graph = outercourse_position_graph(woman, man)