Improve POV outercourse positioning
This commit is contained in:
+30
-15
@@ -468,29 +468,37 @@ def _pov_hardcore_pose_sentence(
|
||||
details = _pov_clean_detail(action_text.split(";", 1)[1], f"{context} {base}", detail_density)
|
||||
return f"{base}; {details}" if details else base
|
||||
|
||||
def outercourse_sentence(base: str) -> str:
|
||||
return _clean(base).rstrip(".")
|
||||
|
||||
if _is_outercourse_text(context, action_lower):
|
||||
if any(term in context for term in ("boobjob", "titjob", "breast sex", "breast-sex")):
|
||||
return sentence(
|
||||
"POV breast-sex position: the viewer reclines with his hips in the foreground while the woman kneels between his thighs; "
|
||||
"her hands press both breasts around the viewer's penis with the glans near her mouth"
|
||||
return outercourse_sentence(
|
||||
"The woman kneels low between the viewer's thighs, chest directly over his pelvis; "
|
||||
"both hands press her breasts tightly around the viewer's penis, with the shaft vertical in the lower foreground and the glans just below her lips"
|
||||
)
|
||||
if any(term in context for term in ("testicle", "balls licking", "balls-licking", "balls and mouth")):
|
||||
return sentence(
|
||||
"POV testicle-sucking position: the viewer reclines with thighs open while the woman kneels low between his legs; "
|
||||
"her mouth and tongue stay at the viewer's balls with his penis visible above her face"
|
||||
return outercourse_sentence(
|
||||
"The woman kneels very low between the viewer's thighs, face below the shaft at testicle height; "
|
||||
"her mouth and tongue contact the viewer's balls while his penis points upward above her forehead in the lower foreground"
|
||||
)
|
||||
if any(term in context for term in ("penis licking", "penis-licking", "tongue along", "tongue licking")):
|
||||
return sentence(
|
||||
"POV penis-licking position: the viewer's hips and penis are in the foreground while the woman kneels close; "
|
||||
"her tongue moves along the shaft and glans with her hands steadying the base"
|
||||
return outercourse_sentence(
|
||||
"The woman kneels close at the viewer's pelvis, face just above his hips; "
|
||||
"her tongue runs along the underside of the penis from shaft to glans while one hand steadies the base in the lower foreground"
|
||||
)
|
||||
if any(term in context for term in ("handjob", "hand job", "hand wrapped", "hand stroking", "manual stimulation")):
|
||||
return outercourse_sentence(
|
||||
"The woman kneels close at the viewer's pelvis with her face behind the shaft; "
|
||||
"one hand wraps around the penis and the other steadies the base as she strokes toward the glans in the lower foreground"
|
||||
)
|
||||
if any(term in context for term in ("footjob", "soles", "toes curled", "feet stroking")):
|
||||
return sentence(
|
||||
"POV footjob position: the viewer reclines with his penis in the foreground while the woman faces him; "
|
||||
"her soles wrap around the shaft and stroke it with the contact point centered"
|
||||
return outercourse_sentence(
|
||||
"The woman faces the viewer with both legs raised toward the camera; "
|
||||
"her soles wrap around the penis in the lower foreground, toes curled around the shaft with her face visible beyond the contact"
|
||||
)
|
||||
return sentence(
|
||||
"POV non-penetrative outercourse position: the viewer's hips stay in the foreground while the woman keeps the visible contact point centered"
|
||||
return outercourse_sentence(
|
||||
"The woman stays close to the viewer's pelvis, keeping the non-penetrative contact centered in the lower foreground with her face visible behind the contact"
|
||||
)
|
||||
penetrative_tokens = (
|
||||
"penetrat",
|
||||
@@ -687,7 +695,7 @@ def _clothing_access_phrase(action_text: Any) -> str:
|
||||
text = _clean(action_text).lower()
|
||||
if any(term in text for term in ("cumshot", "ejaculat", "semen", "cum on", "cum across", "post-orgasm", "aftermath")):
|
||||
return "leaving the body exposed for visible semen and aftermath"
|
||||
if any(term in text for term in ("boobjob", "titjob", "breast sex", "footjob", "testicle", "balls", "penis licking", "non-penetrative")):
|
||||
if any(term in text for term in ("boobjob", "titjob", "breast sex", "handjob", "hand job", "footjob", "testicle", "balls", "penis licking", "non-penetrative")):
|
||||
return "leaving the contact point unobstructed"
|
||||
if any(term in text for term in ("oral", "blowjob", "fellatio", "mouth", "tongue")):
|
||||
return "leaving the oral contact unobstructed"
|
||||
@@ -791,6 +799,11 @@ def _is_outercourse_text(*parts: Any) -> bool:
|
||||
"penis licking",
|
||||
"penis-licking",
|
||||
"tongue along",
|
||||
"handjob",
|
||||
"hand job",
|
||||
"hand wrapped",
|
||||
"hand stroking",
|
||||
"manual stimulation",
|
||||
"footjob",
|
||||
"soles",
|
||||
"toes curled",
|
||||
@@ -849,6 +862,8 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
|
||||
return "testicle-sucking outercourse pose"
|
||||
if any(term in text for term in ("penis licking", "penis-licking", "tongue along", "tongue licking")):
|
||||
return "penis-licking outercourse pose"
|
||||
if any(term in text for term in ("handjob", "hand job", "hand wrapped", "hand stroking", "manual stimulation")):
|
||||
return "handjob outercourse pose"
|
||||
if any(term in text for term in ("footjob", "soles", "toes curled", "feet stroking")):
|
||||
return "footjob outercourse pose"
|
||||
return "non-penetrative outercourse pose"
|
||||
|
||||
Reference in New Issue
Block a user