diff --git a/README.md b/README.md index 4d8a0d5..406b440 100644 --- a/README.md +++ b/README.md @@ -269,9 +269,11 @@ negative prompt outputs when wiring the sampler. `SxCP Insta/OF Options` outputs `options_json`, which can be connected to the pair node. Defaults are set so the softcore prompt is solo while the hardcore -prompt can include partners. It also defaults the camera to handheld selfie -framing. For stronger camera control, connect `SxCP Camera Control` to the pair -node's optional `camera_config` input. +prompt can include partners. Softcore defaults to handheld selfie framing; +hardcore defaults to `from_camera_config`, which emits no camera sentence unless +a camera config is connected or you select an explicit hardcore camera mode. +For stronger camera control, connect `SxCP Camera Control` to the pair node's +optional `camera_config` input. Options: @@ -300,8 +302,10 @@ Options: references the softcore outfit, uses it displaced/removed, or makes Woman A explicitly nude. - `softcore_camera_mode`: base camera mode for the softcore output. -- `hardcore_camera_mode`: `same_as_softcore` or a separate base camera mode for - the hardcore output. +- `hardcore_camera_mode`: `from_camera_config`, `same_as_softcore`, or a + separate base camera mode for the hardcore output. `from_camera_config` is + neutral with no connected camera config, and uses `SxCP Camera Control` when + one is connected. - `camera_detail`: `off`, `compact`, or `full` for the pair prompt camera text. ## Built-In Categories diff --git a/__init__.py b/__init__.py index 0ef0b05..a145c2a 100644 --- a/__init__.py +++ b/__init__.py @@ -1011,7 +1011,7 @@ class SxCPInstaOFOptions: "continuity": (["same_creator_same_room", "same_creator_new_scene"], {"default": "same_creator_same_room"}), "hardcore_clothing_continuity": (["none", "same_outfit", "partially_removed", "implied_nude", "explicit_nude"], {"default": "partially_removed"}), "softcore_camera_mode": (camera_mode_choices(), {"default": "handheld_selfie"}), - "hardcore_camera_mode": (["same_as_softcore"] + camera_mode_choices(), {"default": "same_as_softcore"}), + "hardcore_camera_mode": (["from_camera_config", "same_as_softcore"] + camera_mode_choices(), {"default": "from_camera_config"}), "camera_detail": (camera_detail_choices(), {"default": "compact"}), } } diff --git a/categories/expression_composition_pools.json b/categories/expression_composition_pools.json index 77537f9..458e4b6 100644 --- a/categories/expression_composition_pools.json +++ b/categories/expression_composition_pools.json @@ -450,7 +450,7 @@ {"text": "low-angle explicit body-contact frame", "min_people": 2}, {"text": "close crop on hips, thighs, hands, genitals, and faces", "min_people": 2, "max_people": 3}, {"text": "wide full-body explicit composition with readable anatomy", "min_people": 2}, - {"text": "creator-shot vertical frame with phone-camera intimacy", "min_people": 2}, + {"text": "creator-shot vertical frame with close subscriber-content intimacy", "min_people": 2}, {"text": "front-facing explicit frame with body contact centered", "min_people": 2}, {"text": "floor-level sex composition with sheets and bodies filling the frame", "min_people": 2}, {"text": "tight subscriber-view crop with face and explicit contact visible", "min_people": 2, "max_people": 3} @@ -471,13 +471,13 @@ {"text": "mouth-level oral-sex close-up with eyes and hands visible", "min_people": 2, "max_people": 3}, {"text": "kneeling oral composition with genitals and face centered", "min_people": 2, "max_people": 3}, {"text": "front-view oral-sex frame from bed height", "min_people": 2, "max_people": 3}, - {"text": "low phone-camera angle focused on mouth contact", "min_people": 2, "max_people": 3}, + {"text": "low close-camera angle focused on mouth contact", "min_people": 2, "max_people": 3}, {"text": "mirror-reflected oral scene with face and body visible", "min_people": 2, "max_people": 3}, {"text": "overhead oral-sex frame with thighs and mouth contact readable", "min_people": 2, "max_people": 3}, {"text": "side-profile oral composition with saliva and expression visible", "min_people": 2, "max_people": 3}, {"text": "tight crop on mouth, hands, genitals, and eyes", "min_people": 2, "max_people": 3}, {"text": "wide full-body oral-sex composition", "min_people": 2, "max_people": 3}, - {"text": "bedside kneeling oral frame with phone-shot intimacy", "min_people": 2, "max_people": 3} + {"text": "bedside kneeling oral frame with close candid intimacy", "min_people": 2, "max_people": 3} ], "anal_dp_compositions": [ {"text": "rear-view anal composition with hips and face visible", "min_people": 2, "max_people": 3}, @@ -516,16 +516,16 @@ {"text": "full-room group-sex composition with clear adult spacing", "min_people": 4} ], "climax_compositions": [ - {"text": "tight post-climax crop on face, body, hands, and visible fluids", "min_people": 1}, - {"text": "phone-flash close-up of orgasm aftermath", "min_people": 1}, - {"text": "bed-level climax frame with thighs, face, and fluid detail visible", "min_people": 1}, - {"text": "mirror-reflected post-climax composition", "min_people": 1}, + {"text": "tight post-ejaculation crop on face, body, hands, and visible fluids", "min_people": 1}, + {"text": "direct-flash close-up of orgasm aftermath", "min_people": 1}, + {"text": "bed-level ejaculation frame with thighs, face, and fluid detail visible", "min_people": 1}, + {"text": "mirror-reflected post-ejaculation composition", "min_people": 1}, {"text": "front-facing cumshot composition with body and expression centered", "min_people": 1}, {"text": "overhead post-orgasm frame on rumpled sheets", "min_people": 1}, - {"text": "kneeling climax frame with open mouth and body visible", "min_people": 1}, + {"text": "kneeling ejaculation frame with open mouth and body visible", "min_people": 1}, {"text": "wide aftermath composition with all adult bodies visible", "min_people": 2}, - {"text": "tight subscriber-view crop of climax expression and fluid detail", "min_people": 1}, - {"text": "side-profile post-climax body-line composition", "min_people": 1} + {"text": "tight subscriber-view crop of orgasm expression and fluid detail", "min_people": 1}, + {"text": "side-profile post-ejaculation body-line composition", "min_people": 1} ] } } diff --git a/categories/location_pools.json b/categories/location_pools.json index a6ce246..52d550a 100644 --- a/categories/location_pools.json +++ b/categories/location_pools.json @@ -96,11 +96,11 @@ {"slug": "black_lacquer_mirror_room", "prompt": "black lacquer mirror room with glossy furniture, velvet curtains, and sharp rim light"} ], "hardcore_mirror_scenes": [ - {"slug": "hardcore_bedroom_mirror_pair", "prompt": "large bedroom mirror placed beside a rumpled bed, reflecting explicit adult body contact and the phone-camera angle", "min_people": 2, "max_people": 3}, + {"slug": "hardcore_bedroom_mirror_pair", "prompt": "large bedroom mirror placed beside a rumpled bed, reflecting explicit adult body contact and the camera angle", "min_people": 2, "max_people": 3}, {"slug": "hardcore_hotel_mirror_pair", "prompt": "hotel suite mirror facing a messy bed, city lights behind it, and enough space for explicit adult positioning", "min_people": 2, "max_people": 3}, - {"slug": "hardcore_floor_mirror_set", "prompt": "floor mattress beside a full-length mirror with reflected bodies, warm lamps, and close creator-shot framing", "min_people": 2, "max_people": 3}, + {"slug": "hardcore_floor_mirror_set", "prompt": "floor mattress beside a full-length mirror with reflected bodies, warm lamps, and close intimate framing", "min_people": 2, "max_people": 3}, {"slug": "hardcore_shower_mirror_pair", "prompt": "private shower room with a fogged mirror wall, wet tile, and reflected explicit adult contact", "min_people": 2, "max_people": 3}, - {"slug": "hardcore_vanity_mirror_floor", "prompt": "vanity mirror floor setup with bulbs, scattered clothing, low phone-camera angle, and reflected adult bodies", "min_people": 2, "max_people": 3}, + {"slug": "hardcore_vanity_mirror_floor", "prompt": "vanity mirror floor setup with bulbs, scattered clothing, low reflected camera angle, and reflected adult bodies", "min_people": 2, "max_people": 3}, {"slug": "hardcore_lacquer_mirror_bed", "prompt": "black lacquer mirror bedroom with glossy reflections, a low bed, and warm rim light around explicit adult contact", "min_people": 2, "max_people": 3}, {"slug": "hardcore_tripod_mirror_bed", "prompt": "creator bedroom mirror setup with a phone on tripod, bed sheets, reflected bodies, and clear adult-only framing", "min_people": 2, "max_people": 3}, {"slug": "hardcore_threesome_mirror_suite", "prompt": "wide mirror-wall suite arranged for three adults, with a bed, floor cushions, and all bodies visible in direct and reflected views", "min_people": 3, "max_people": 3} @@ -132,27 +132,27 @@ "hardcore_private_scenes": [ {"slug": "hardcore_bedroom_phone_tripod", "prompt": "private bedroom sex-content setup with a phone tripod, rumpled sheets, pillows, and warm lamps"}, {"slug": "hardcore_hotel_bed_city", "prompt": "luxury hotel suite with city lights, messy satin bedding, floor clothes, and low amber light"}, - {"slug": "hardcore_mirror_bedroom", "prompt": "bedroom with a large mirror reflecting the explicit adult scene and a visible phone angle"}, - {"slug": "hardcore_low_mattress_studio", "prompt": "private photo studio with a low mattress, fabric drapes, phone tripod, and controlled warm spotlighting"}, + {"slug": "hardcore_mirror_bedroom", "prompt": "bedroom with a large mirror reflecting the explicit adult scene and a visible camera angle"}, + {"slug": "hardcore_low_mattress_studio", "prompt": "private photo studio with a low mattress, fabric drapes, tripod, and controlled warm spotlighting"}, {"slug": "hardcore_velvet_room", "prompt": "private velvet room with dark curtains, soft cushions, scattered clothes, and warm red light"}, {"slug": "hardcore_shower_room", "prompt": "large private shower room with steam, wet tile, glass reflections, and warm reflected light"}, {"slug": "hardcore_lounge_couch", "prompt": "dim private lounge with a wide couch, scattered clothing, side lamps, and soft golden shadows"}, - {"slug": "hardcore_floor_cushion_room", "prompt": "intimate room with floor cushions, silk sheets, low candles, and close vertical camera framing"}, + {"slug": "hardcore_floor_cushion_room", "prompt": "intimate room with floor cushions, silk sheets, low candles, and close vertical framing"}, {"slug": "hardcore_ring_light_bed", "prompt": "creator bedroom with ring light reflection, phone on tripod, bed sheets, and visible content setup"}, {"slug": "hardcore_bathroom_counter", "prompt": "private bathroom with counter mirror, wet towels, steam, and explicit creator-shot framing"}, {"slug": "hardcore_walk_in_closet_floor", "prompt": "mirrored walk-in closet floor with clothes scattered, warm bulbs, and a phone reflection"}, - {"slug": "hardcore_car_backseat", "prompt": "parked private car backseat with tinted windows, dashboard glow, and tight phone-camera framing"} + {"slug": "hardcore_car_backseat", "prompt": "parked private car backseat with tinted windows, dashboard glow, and tight close framing"} ], "hardcore_bed_scenes": [ - {"slug": "bed_edge_close_contact", "prompt": "edge of a rumpled bed with pillows pushed aside, sheets pulled tight, and close phone-camera framing"}, + {"slug": "bed_edge_close_contact", "prompt": "edge of a rumpled bed with pillows pushed aside, sheets pulled tight, and close body framing"}, {"slug": "low_bed_mirror_angle", "prompt": "low bed beside a full-length mirror with visible reflected bodies and warm lamps"}, - {"slug": "hotel_bed_overhead", "prompt": "hotel bed arranged for an overhead phone shot with satin sheets and city light"}, + {"slug": "hotel_bed_overhead", "prompt": "hotel bed arranged for an overhead camera shot with satin sheets and city light"}, {"slug": "floor_mattress_creator_set", "prompt": "floor mattress content setup with fabric drapes, ring light shadow, and scattered clothes"}, {"slug": "canopy_bed_explicit_set", "prompt": "canopy bed with sheer curtains, warm bedside light, and intimate full-body framing"}, {"slug": "velvet_bedroom_wide", "prompt": "velvet bedroom with wide bed, dark curtains, soft cushions, and warm red side light"} ], "hardcore_penetrative_scenes": [ - {"slug": "penetration_mirror_bedroom", "prompt": "mirror-facing bedroom setup designed to show explicit body contact and the phone angle"}, + {"slug": "penetration_mirror_bedroom", "prompt": "mirror-facing bedroom setup designed to show explicit body contact and the camera angle"}, {"slug": "penetration_edge_of_bed", "prompt": "edge-of-bed setup with hips near the camera, rumpled sheets, and warm lamp light"}, {"slug": "penetration_low_mattress", "prompt": "low mattress studio with side lighting, fabric drapes, and all bodies visible"}, {"slug": "penetration_couch_lounge", "prompt": "wide private couch with pillows pushed aside, scattered clothes, and golden shadows"}, @@ -161,10 +161,10 @@ ], "hardcore_oral_scenes": [ {"slug": "oral_bed_kneeling_close", "prompt": "bedside kneeling setup with pillows, warm lamps, and close mouth-level camera framing"}, - {"slug": "oral_mirror_floor", "prompt": "mirror-facing floor setup with bodies reflected and phone held low"}, + {"slug": "oral_mirror_floor", "prompt": "mirror-facing floor setup with bodies reflected and a low camera angle"}, {"slug": "oral_couch_front_view", "prompt": "private couch arranged for front-view oral contact with soft side lamps"}, {"slug": "oral_shower_steam", "prompt": "steamy shower room with wet tile, glass reflections, and close explicit framing"}, - {"slug": "oral_vanity_floor", "prompt": "vanity-room floor with mirror bulbs, scattered lingerie, and low phone-camera angle"}, + {"slug": "oral_vanity_floor", "prompt": "vanity-room floor with mirror bulbs, scattered lingerie, and low reflected camera angle"}, {"slug": "oral_hotel_bed_close", "prompt": "hotel bed close-up setup with satin sheets, city light, and tight vertical framing"} ], "hardcore_anal_scenes": [ @@ -198,10 +198,10 @@ {"slug": "group_lacquer_mirror_lounge", "prompt": "wide black-lacquer mirror lounge with multiple couches, glossy reflections, warm rim light, and all participants visible"} ], "hardcore_climax_scenes": [ - {"slug": "climax_bed_close_flash", "prompt": "rumpled bed close-up setup with direct phone flash, sheets, and visible fluid detail"}, - {"slug": "climax_mirror_counter", "prompt": "mirror-facing vanity counter setup with phone reflection and explicit aftermath framing"}, + {"slug": "climax_bed_close_flash", "prompt": "rumpled bed close-up setup with direct flash, sheets, and visible fluid detail"}, + {"slug": "climax_mirror_counter", "prompt": "mirror-facing vanity counter setup with reflected bodies and explicit aftermath framing"}, {"slug": "climax_floor_sheets", "prompt": "floor sheets with pillows pushed aside, low lamp light, and close body-detail framing"}, - {"slug": "climax_hotel_bed_flash", "prompt": "hotel bed with phone-flash lighting, messy satin sheets, and city light behind"}, + {"slug": "climax_hotel_bed_flash", "prompt": "hotel bed with direct-flash lighting, messy satin sheets, and city light behind"}, {"slug": "climax_shower_tile", "prompt": "wet shower tile scene with steam, reflected light, and visible fluid detail"}, {"slug": "climax_velvet_couch", "prompt": "velvet couch with dark curtains, warm red light, and close explicit aftermath framing"} ] diff --git a/categories/sexual_poses.json b/categories/sexual_poses.json index f4cad46..251e2b7 100644 --- a/categories/sexual_poses.json +++ b/categories/sexual_poses.json @@ -302,7 +302,7 @@ "cum on the belly", "visible orgasmic tension", "messy wet mouth", - "post-climax fluids on skin" + "visible sexual fluids on skin" ], "expression_detail": [ "eyes looking up", @@ -657,7 +657,7 @@ "cum on breasts and belly", "cum dripping on thighs", "messy wet mouths", - "post-climax fluids on skin", + "visible sexual fluids on skin", "visible arousal on all bodies", "cum on the ass", "wet sheets under the bodies", @@ -829,11 +829,11 @@ "climax_detail": [ "cum on breasts and bellies", "cum dripping down thighs", - "multiple post-climax expressions", + "multiple post-orgasm expressions", "wet mouths and visible arousal", "sexual fluids on sheets", "cum on ass and lower back", - "messy bodies after climax", + "messy bodies after orgasm", "visible orgasmic tension across the group" ], "contact_detail": [ @@ -854,7 +854,7 @@ "messy sexual fluids", "shiny arousal on genitals", "wet mouths and bodies", - "post-climax fluids on bellies" + "visible sexual fluids on bellies" ], "group_act": [ { @@ -955,7 +955,7 @@ } }, { - "name": "Cumshot and climax", + "name": "Ejaculation and orgasm aftermath", "slug": "cumshot_climax", "min_people": 1, "inherit_expressions": false, @@ -967,8 +967,8 @@ "item_templates": [ "{climax_act} with {fluid_location}, {body_position}, {expression_detail}, and {visibility}", "{body_position} during {climax_act}, with {hand_detail}, {fluid_location}, and {fluid_detail}", - "{angle} climax view featuring {climax_act}, {body_position}, {body_contact}, {fluid_detail}, and {visibility}", - "hardcore post-climax scene with {fluid_location}, {body_position}, {expression_detail}, and {visibility}", + "{angle} ejaculation view featuring {climax_act}, {body_position}, {body_contact}, {fluid_detail}, and {visibility}", + "hardcore post-ejaculation scene with {fluid_location}, {body_position}, {expression_detail}, and {visibility}", "{climax_act} on {surface}, with {body_position}, {body_contact}, {hand_detail}, and {fluid_detail}", "{angle} view of {fluid_location}, {body_position}, {climax_act}, and {visibility}", "explicit orgasm scene: {climax_act}, {body_position}, {fluid_detail}, {expression_detail}, and {body_contact}", @@ -1044,21 +1044,21 @@ }, "external cumshot", "visible external ejaculation", - "messy post-climax release", + "messy post-ejaculation release", { "text": "orgasm during penetration", "min_people": 2 }, - "post-orgasm hardcore climax", + "post-orgasm visible release", "visible orgasm aftermath", { - "text": "shared climax after penetration", + "text": "visible post-penetration ejaculation", "min_people": 2 }, "hardcore ejaculation scene" ], "expression_detail": [ - "eyes closed in climax", + "eyes closed during orgasm", "open mouth and flushed cheeks", "tongue out with cum on lips", "heavy-lidded satisfied gaze", @@ -1134,11 +1134,11 @@ "visibility": [ "cum clearly visible", "genitals and fluids visible", - "post-climax fluids anatomically clear", + "post-ejaculation fluids anatomically clear", "face and body covered in visible cum", "open thighs and wetness visible", - "explicit orgasm aftermath visible", - "hardcore climax detail visible", + "explicit semen aftermath visible", + "hardcore ejaculation detail visible", "sexual fluids and body contact visible" ] } diff --git a/examples/default_task_lanes_workflow.json b/examples/default_task_lanes_workflow.json index b833c19..4bcc628 100644 --- a/examples/default_task_lanes_workflow.json +++ b/examples/default_task_lanes_workflow.json @@ -219,7 +219,7 @@ {"name": "options_json", "type": "STRING", "links": [10], "slot_index": 0} ], "properties": {"Node name for S&R": "SxCPInstaOFOptions"}, - "widgets_values": ["same_as_hardcore", "couple", 1, 1, "lingerie_tease", "hardcore", 0.45, 0.85, "hybrid", "same_creator_same_room", "handheld_selfie", "same_as_softcore"] + "widgets_values": ["same_as_hardcore", "couple", 1, 1, "lingerie_tease", "hardcore", 0.45, 0.85, "hybrid", "same_creator_same_room", "partially_removed", "handheld_selfie", "from_camera_config", "compact"] }, { "id": 13, @@ -249,7 +249,7 @@ {"name": "camera_config", "type": "STRING", "links": [12], "slot_index": 0} ], "properties": {"Node name for S&R": "SxCPCameraControl"}, - "widgets_values": ["handheld_selfie", "three_quarter", "high_angle", "smartphone_wide", "arm_length", "vertical_story", "phone_visible", "locked"] + "widgets_values": ["standard", "auto", "auto", "auto", "auto", "auto", "auto", "soft_hint", "compact"] }, { "id": 15, diff --git a/krea_formatter.py b/krea_formatter.py index 4cfa312..d9da375 100644 --- a/krea_formatter.py +++ b/krea_formatter.py @@ -763,52 +763,52 @@ def _climax_role_graph(role_graph: str, hard_item: str, axis_values: Any = None) if "the woman" not in text or "the man" not in text: return role_graph if "lying between two partners" in text or "lies between" in text: - return "the woman lies between two partners, the man under her hips and another partner over her torso as the climax lands on her body" + return "the woman lies between two partners, the man under her hips and another partner over her torso as visible semen lands on her body" if "held between front-and-back partners" in text: - return "the woman is held between the man behind her and another partner in front of her as the climax lands across her body" + return "the woman is held between the man behind her and another partner in front of her as visible semen lands across her body" if "kneeling between standing partners" in text: - return "the woman kneels between standing partners gathered around her face and torso as the climax lands across her body" + return "the woman kneels between standing partners gathered around her face and torso for visible ejaculation" if "side-lying with thighs parted" in text: - return "the woman lies on her side with thighs parted while the man kneels beside her hips as the climax lands across her thighs and pussy" + return "the woman lies on her side with thighs parted while the man kneels beside her hips and ejaculates semen across her thighs and pussy" if "sitting on the edge of the bed" in text: - return "the woman sits on the edge of the bed with knees spread while the man stands close between her legs as the climax lands across her body" + return "the woman sits on the edge of the bed with knees spread while the man stands close between her legs and ejaculates semen across her body" if "lying at the bed edge with thighs open" in text: - return "the woman lies at the bed edge with thighs open while the man kneels between her legs as the climax lands across her pussy and thighs" + return "the woman lies at the bed edge with thighs open while the man kneels between her legs and ejaculates semen across her pussy and thighs" if "reclining with thighs open" in text or "lying on the back with legs spread" in text: - return "the woman lies on her back with thighs open while the man kneels between her legs as the climax lands across her pussy and thighs" + return "the woman lies on her back with thighs open while the man kneels between her legs and ejaculates semen across her pussy and thighs" if "on all fours with hips raised" in text: - return "the woman is on all fours with hips raised while the man is positioned behind her as the climax lands across her ass, thighs, and lower back" + return "the woman is on all fours with hips raised while the man is positioned behind her and ejaculates semen across her ass, thighs, and lower back" if "face-down ass-up" in text: - return "the woman lies face-down with ass raised while the man is positioned behind her as the climax lands across her lower back and ass" + return "the woman lies face-down with ass raised while the man is positioned behind her and ejaculates semen across her lower back and ass" if "bent over with ass raised" in text or "bent over" in text: - return "the woman bends forward with hips raised while the man stands behind her as the climax lands across her lower back, ass, and thighs" + return "the woman bends forward with hips raised while the man stands behind her with visible semen across her lower back, ass, and thighs" if "kneeling with mouth open" in text: - return "the woman kneels in front of the man at hip height as the climax lands across her face, lips, and chest" + return "the woman kneels in front of the man at hip height as he ejaculates semen onto her face, lips, and chest" if "kneeling in front of a standing partner" in text: - return "the woman kneels in front of the man at hip height while he stands over her for the climax" + return "the woman kneels in front of the man at hip height while he stands over her for visible ejaculation" if "standing with cum on the body" in text: - return "the woman stands braced in front of the man while he stands close at hip level as the climax lands across her body" + return "the woman stands braced in front of the man while he stands close at hip level and ejaculates semen across her body" if "squatting on top of a partner" in text: - return "the woman squats over the man's hips while the man lies on his back under her as the climax lands on her body" + return "the woman squats over the man's hips while the man lies on his back under her and ejaculates semen onto her body" if "reverse cowgirl over a partner's hips" in text: - return "the woman straddles the man's hips facing away while the man lies on his back under her as the climax lands on her body" + return "the woman straddles the man's hips facing away while the man lies on his back under her and ejaculates semen onto her body" if "straddles" in text or "straddling a partner" in text or "straddling a partner's hips" in text or "shared climax after penetration" in text: - return "the woman straddles the man's hips while the man lies on his back under her as the climax lands on her body" + return "the woman straddles the man's hips while the man lies on his back under her and ejaculates semen onto her body" if "seated in a partner's lap facing them" in text: - return "the woman sits in the man's lap facing him, legs wrapped around his hips as the climax lands across her body" + return "the woman sits in the man's lap facing him, legs wrapped around his hips as he ejaculates semen across her body" if "lower back" in text or "cum dripping from ass" in text or "cum on lower back" in text or _mentions_rear_entry(text): - return "the woman bends forward with hips raised while the man stands behind her as the climax lands across her lower back, ass, and thighs" + return "the woman bends forward with hips raised while the man stands behind her with visible semen across her lower back, ass, and thighs" if "cum on face" in text or "cum on tongue" in text or "cum on lips" in text or "cum on tongue and chin" in text: - return "the woman kneels in front of the man at hip height as the climax lands across her face, lips, and chest" + return "the woman kneels in front of the man at hip height as he ejaculates semen onto her face, lips, and chest" if ( "cum dripping from pussy" in text or "arousal dripping from pussy" in text or "open thighs" in text ): - return "the woman lies on her back with thighs open while the man kneels between her legs as the climax lands across her pussy and thighs" + return "the woman lies on her back with thighs open while the man kneels between her legs and ejaculates semen across her pussy and thighs" if role_graph: return role_graph - return "the woman lies on her back with thighs open while the man kneels between her legs as the climax lands across her body" + return "the woman lies on her back with thighs open while the man kneels between her legs and ejaculates semen across her body" def _dedupe_climax_detail(detail: str, role_graph: str) -> str: @@ -850,6 +850,10 @@ def _dedupe_climax_detail(detail: str, role_graph: str) -> str: patterns.append(r"standing with cum on the body") for pattern in patterns: detail = re.sub(rf"\b{pattern}\b,?\s*", "", detail, flags=re.IGNORECASE) + if not any(token in lower for token in ("face", "mouth", "lips", "tongue")): + detail = re.sub(r"\bsaliva and cum mixed on the mouth\b", "visible semen on skin", detail, flags=re.IGNORECASE) + detail = re.sub(r"\bcum on tongue and chin\b", "visible semen on skin", detail, flags=re.IGNORECASE) + detail = re.sub(r"\bcum on face and lips\b", "visible semen on skin", detail, flags=re.IGNORECASE) detail = re.sub(r",\s*,", ",", detail) detail = re.sub(r"\bwith\s*,\s*", "with ", detail, flags=re.IGNORECASE) detail = re.sub(r"^with\s+", "", detail, flags=re.IGNORECASE) diff --git a/prompt_builder.py b/prompt_builder.py index 7ef6489..56fe857 100644 --- a/prompt_builder.py +++ b/prompt_builder.py @@ -2560,55 +2560,55 @@ def _role_graph( def climax_position_graph(woman: str, man: str, third: str = "") -> str: if "lying between two partners" in item_text and third: - return f"{woman} lies between {man} and {third}, with {man} under her hips and {third} positioned above her torso as the climax lands on her body." + return f"{woman} lies between {man} and {third}, with {man} under her hips and {third} positioned above her torso as visible semen lands on her body." if "held between front-and-back partners" in item_text and third: - return f"{woman} is held between {man} behind her and {third} in front of her as the climax lands across her body." + return f"{woman} is held between {man} behind her and {third} in front of her as visible semen lands across her body." if "kneeling between standing partners" in item_text and third: - return f"{woman} kneels between {man} and {third} while both stand close around her face and torso for the climax." + return f"{woman} kneels between {man} and {third} while both stand close around her face and torso for visible ejaculation." if "side-lying with thighs parted" in item_text: - return f"{woman} lies on her side with thighs parted while {man} kneels beside her hips as the climax lands across her thighs and pussy." + return f"{woman} lies on her side with thighs parted while {man} kneels beside her hips and ejaculates semen across her thighs and pussy." if "sitting on the edge of the bed" in item_text: - return f"{woman} sits on the edge of the bed with knees spread while {man} stands close between her legs as the climax lands across her body." + return f"{woman} sits on the edge of the bed with knees spread while {man} stands close between her legs and ejaculates semen across her body." if "lying at the bed edge with thighs open" in item_text: - return f"{woman} lies at the bed edge with thighs open while {man} kneels between her legs as the climax lands across her pussy and thighs." + return f"{woman} lies at the bed edge with thighs open while {man} kneels between her legs and ejaculates semen across her pussy and thighs." if "reclining with thighs open" in item_text or "lying on the back with legs spread" in item_text: - return f"{woman} lies on her back with thighs open while {man} kneels between her legs as the climax lands across her pussy and thighs." + return f"{woman} lies on her back with thighs open while {man} kneels between her legs and ejaculates semen across her pussy and thighs." if "on all fours with hips raised" in item_text: - return f"{woman} is on all fours with hips raised while {man} is positioned behind her as the climax lands across her ass, thighs, and lower back." + return f"{woman} is on all fours with hips raised while {man} is positioned behind her and ejaculates semen across her ass, thighs, and lower back." if "face-down ass-up" in item_text: - return f"{woman} lies face-down with ass raised while {man} is positioned behind her as the climax lands across her lower back and ass." + return f"{woman} lies face-down with ass raised while {man} is positioned behind her and ejaculates semen across her lower back and ass." if "bent over with ass raised" in item_text or "bent over" in item_text: - return f"{woman} is bent forward with hips raised while {man} is positioned behind her, climax visible across her lower back, ass, and thighs." + return f"{woman} is bent forward with hips raised while {man} is positioned behind her, visible semen across her lower back, ass, and thighs." if "kneeling with mouth open" in item_text: - return f"{woman} kneels in front of {man} at hip height while {man} climaxes toward her face, lips, and chest." + return f"{woman} kneels in front of {man} at hip height while {man} ejaculates semen onto her face, lips, and chest." if "kneeling in front of a standing partner" in item_text: - return f"{woman} kneels in front of {man} at hip height while {man} stands over her for the climax." + return f"{woman} kneels in front of {man} at hip height while {man} stands over her for visible ejaculation." if "standing with cum on the body" in item_text: - return f"{woman} stands braced in front of {man} while he stays close at hip level and the climax lands across her body." + return f"{woman} stands braced in front of {man} while he stays close at hip level and ejaculates semen across her body." if "squatting on top of a partner" in item_text: - return f"{woman} squats over {man}'s hips while {man} lies on his back under her as the climax lands on her body." + return f"{woman} squats over {man}'s hips while {man} lies on his back under her and ejaculates semen onto her body." if "reverse cowgirl over a partner's hips" in item_text: - return f"{woman} straddles {man}'s hips facing away while {man} lies on his back under her as the climax lands on her body." + return f"{woman} straddles {man}'s hips facing away while {man} lies on his back under her and ejaculates semen onto her body." if any(term in item_text for term in ("straddling a partner", "straddling a partner's hips", "shared climax after penetration", "orgasm during penetration")): - return f"{woman} straddles {man}'s hips while {man} lies on his back under her, their bodies still aligned from penetration as the climax lands on her body." + return f"{woman} straddles {man}'s hips while {man} lies on his back under her, their bodies still aligned from penetration as he ejaculates semen onto her body." if "seated in a partner's lap facing them" in item_text: - return f"{woman} sits in {man}'s lap facing him, legs wrapped around his hips as the climax lands across her body." + return f"{woman} sits in {man}'s lap facing him, legs wrapped around his hips as he ejaculates semen across her body." if any(term in item_text for term in ("lower back", "cum dripping from ass", "cum on lower back")) or mentions_ass(item_text): - return f"{woman} is bent forward with hips raised while {man} is positioned behind her, climax visible across her lower back, ass, and thighs." + return f"{woman} is bent forward with hips raised while {man} is positioned behind her, visible semen across her lower back, ass, and thighs." if any(term in item_text for term in ("cum on face", "cum on tongue", "cum on lips", "cum on face and lips", "cum on tongue and chin")): if third: - return f"{woman} kneels in the center while {man} and {third} stand close around her face and torso for the climax." - return f"{woman} kneels in front of {man} at hip height while {man} climaxes toward her face, lips, and chest." - return f"{woman} lies on her back with thighs open while {man} kneels between her legs as the climax lands on her body." + return f"{woman} kneels in the center while {man} and {third} stand close around her face and torso for visible ejaculation." + return f"{woman} kneels in front of {man} at hip height while {man} ejaculates semen onto her face, lips, and chest." + return f"{woman} lies on her back with thighs open while {man} kneels between her legs and ejaculates semen onto her body." if people_count == 1: solo = people[0] if women_count == 1: if "cumshot" in slug or "climax" in slug: - return f"{solo} is shown in a solo explicit climax 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 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." if "cumshot" in slug or "climax" in slug: - return f"{solo} is shown in a solo explicit climax pose with one hand on his penis, body angled toward the camera, and visible ejaculation detail." + return f"{solo} is shown in a solo visible ejaculation pose with one hand on his penis, body angled toward the camera, and semen visible." return f"{solo} is shown in a solo explicit adult pose with direct camera awareness and clear body framing." if women_count > 0 and men_count == 0: @@ -2642,7 +2642,7 @@ def _role_graph( graph = f"{a} penetrates {b} anally while {helper} gives oral contact from the front." used.add(helper) elif "cumshot" in slug or "climax" in slug: - graph = f"{a} climaxes over {b}'s body while {b} keeps eye contact and one hand on his penis." + graph = f"{a} ejaculates semen over {b}'s body while {b} keeps eye contact and one hand on his penis." else: graph = f"{a} and {b} keep explicit penis and anal contact visible." return graph + support_sentence(used) @@ -3534,7 +3534,7 @@ def build_insta_of_options_json( continuity: str = "same_creator_same_room", hardcore_clothing_continuity: str = "partially_removed", softcore_camera_mode: str = "handheld_selfie", - hardcore_camera_mode: str = "same_as_softcore", + hardcore_camera_mode: str = "from_camera_config", camera_detail: str = "compact", softcore_expression_intensity: float = 0.45, hardcore_expression_intensity: float = 0.85, @@ -3573,7 +3573,7 @@ def _parse_insta_of_options(options_json: str | dict[str, Any] | None) -> dict[s "continuity": "same_creator_same_room", "hardcore_clothing_continuity": "partially_removed", "softcore_camera_mode": "handheld_selfie", - "hardcore_camera_mode": "same_as_softcore", + "hardcore_camera_mode": "from_camera_config", "camera_detail": "compact", "softcore_expression_intensity": 0.45, "hardcore_expression_intensity": 0.85, @@ -3602,7 +3602,10 @@ def _parse_insta_of_options(options_json: str | dict[str, Any] | None) -> dict[s else defaults["hardcore_clothing_continuity"] ) parsed["softcore_camera_mode"] = parsed["softcore_camera_mode"] if parsed["softcore_camera_mode"] in CAMERA_MODE_PROMPTS else defaults["softcore_camera_mode"] - if parsed["hardcore_camera_mode"] not in CAMERA_MODE_PROMPTS and parsed["hardcore_camera_mode"] != "same_as_softcore": + if ( + parsed["hardcore_camera_mode"] not in CAMERA_MODE_PROMPTS + and parsed["hardcore_camera_mode"] not in ("from_camera_config", "same_as_softcore") + ): parsed["hardcore_camera_mode"] = defaults["hardcore_camera_mode"] parsed["camera_detail"] = parsed["camera_detail"] if parsed["camera_detail"] in CAMERA_DETAIL_CHOICES else defaults["camera_detail"] parsed["softcore_expression_intensity"] = _clamped_float(