diff --git a/krea_formatter.py b/krea_formatter.py index 29e3b6b..8807c11 100644 --- a/krea_formatter.py +++ b/krea_formatter.py @@ -471,6 +471,16 @@ def _pov_hardcore_pose_sentence( def outercourse_sentence(base: str) -> str: return _clean(base).rstrip(".") + if ( + "face-sitting" in context + or "face sitting" in context + or ("straddles" in context and "face" in context and "pussy" in context) + ): + return outercourse_sentence( + "The woman is above the camera in a close first-person underview, straddling the viewer's face with her thighs on both sides of his head; " + "her pussy is directly over the viewer's mouth in the lower foreground, tongue contact visible from below" + ) + if _is_outercourse_text(context, action_lower): if any(term in context for term in ("boobjob", "titjob", "breast sex", "breast-sex")): return outercourse_sentence( @@ -1763,6 +1773,11 @@ def _composition_phrase( action_lower = _clean(action).lower() composition_lower = composition.lower() detail_density = _normalize_hardcore_detail_density(detail_density) + if "first-person underview" in action_lower or "straddling the viewer's face" in action_lower: + if any(token in composition_lower for token in ("mirror-reflected", "oral scene", "face and body visible")): + return ( + f"{prefix} close first-person underview with the woman's thighs framing the camera and the oral contact centered" + ) oral_pose_tokens = ( "kneeling oral", "side-lying oral", @@ -1833,7 +1848,11 @@ def _expression_phrase(expression: Any) -> str: expression = _clean(expression) if not expression: return "" - if ";" in expression or re.search(r"\b(?:Woman|Man) [A-Z] has\b|\bthe (?:woman|man) has\b", expression): + if ";" in expression or re.search( + r"\b(?:Woman|Man) [A-Z] has\b|\bthe (?:woman|man) has\b", + expression, + flags=re.IGNORECASE, + ): return f"Expressions: {expression}" return f"with {expression}" diff --git a/prompt_builder.py b/prompt_builder.py index c499269..26b01a5 100644 --- a/prompt_builder.py +++ b/prompt_builder.py @@ -5198,6 +5198,7 @@ def _role_graph( *((item_axis_values or {}).values()), ) ) + man_is_pov = man in pov_set woman_gives = any( term in text for term in ( @@ -5232,6 +5233,11 @@ def _role_graph( if "sixty-nine" in position_text or ("sixty-nine" in text and not position_text): return f"{woman} and {man} lie head-to-hips in a sixty-nine position, with {woman}'s mouth on {man}'s penis and {man}'s mouth on {woman}'s pussy." if "face-sitting" in position_text or ("face-sitting" in text and not position_text): + if man_is_pov: + return ( + f"{woman} is above the POV camera, straddling the POV viewer's face with thighs on both sides of his head, " + "pussy directly over the POV viewer's mouth for close first-person underview tongue contact." + ) return f"{man} lies on his back while {woman} straddles his face with her thighs around his head and {man}'s mouth pressed to her pussy." if "straddled oral" in position_text or ("straddled oral" in text and not position_text): if woman_gives and not man_gives: