Add default visible male hardcore clothing
This commit is contained in:
+68
-4
@@ -6386,6 +6386,28 @@ LOWER_BODY_CLOTHING_TERMS = (
|
|||||||
"blanket",
|
"blanket",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
INSTA_OF_HARDCORE_MEN_CLOTHING_LOWER_ACCESS = [
|
||||||
|
"wears an open button shirt with jeans lowered below the hips for sexual contact",
|
||||||
|
"wears a fitted tee pushed up with trousers lowered below the hips",
|
||||||
|
"keeps a dark shirt on while pants and underwear are pulled down enough for penetration",
|
||||||
|
"wears an open overshirt with jeans pushed down at the thighs",
|
||||||
|
"wears a hoodie lifted at the waist with sweatpants lowered below the hips",
|
||||||
|
"wears gym shorts pulled down enough for sexual contact with his shirt still on",
|
||||||
|
"keeps a casual shirt on with belt open and pants lowered below the hips",
|
||||||
|
"wears a half-open shirt with lower garments pushed down for clear sexual contact",
|
||||||
|
]
|
||||||
|
|
||||||
|
INSTA_OF_HARDCORE_MEN_CLOTHING_VISIBLE = [
|
||||||
|
"wears an open button shirt with jeans unfastened",
|
||||||
|
"wears a fitted tee with pants opened at the waist",
|
||||||
|
"keeps a dark shirt on with trousers loosened",
|
||||||
|
"wears an open overshirt with jeans partly lowered",
|
||||||
|
"wears gym shorts lowered enough for sexual contact with a towel nearby",
|
||||||
|
"wears a hoodie lifted at the waist with sweatpants loosened",
|
||||||
|
"wears a casual shirt with belt open and pants partly lowered",
|
||||||
|
"wears a half-open shirt with underwear waistband visible",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def _hardcore_row_needs_lower_access(row: dict[str, Any]) -> bool:
|
def _hardcore_row_needs_lower_access(row: dict[str, Any]) -> bool:
|
||||||
axis_values = row.get("item_axis_values")
|
axis_values = row.get("item_axis_values")
|
||||||
@@ -6454,6 +6476,30 @@ def _insta_of_hardcore_clothing_state(mode: str, softcore_outfit: str, needs_low
|
|||||||
return f"Clothing state: {base}; teaser outfit detail: {outfit}."
|
return f"Clothing state: {base}; teaser outfit detail: {outfit}."
|
||||||
|
|
||||||
|
|
||||||
|
def _default_man_hardcore_clothing_entries(
|
||||||
|
men_count: int,
|
||||||
|
pov_labels: list[str] | None,
|
||||||
|
configured_entries: list[str],
|
||||||
|
rng: random.Random,
|
||||||
|
needs_lower_access: bool,
|
||||||
|
) -> list[str]:
|
||||||
|
pov_set = set(pov_labels or [])
|
||||||
|
configured_labels = {
|
||||||
|
match.group(1)
|
||||||
|
for entry in configured_entries
|
||||||
|
for match in [re.match(r"^\s*(Man [A-Z])\b", str(entry or ""))]
|
||||||
|
if match
|
||||||
|
}
|
||||||
|
pool = INSTA_OF_HARDCORE_MEN_CLOTHING_LOWER_ACCESS if needs_lower_access else INSTA_OF_HARDCORE_MEN_CLOTHING_VISIBLE
|
||||||
|
entries = []
|
||||||
|
for index in range(max(0, int(men_count))):
|
||||||
|
label = f"Man {chr(ord('A') + index)}"
|
||||||
|
if label in pov_set or label in configured_labels:
|
||||||
|
continue
|
||||||
|
entries.append(_hardcore_clothing_sentence(label, g.choose(rng, pool)))
|
||||||
|
return entries
|
||||||
|
|
||||||
|
|
||||||
def _insta_of_partner_styling(
|
def _insta_of_partner_styling(
|
||||||
seed_config: dict[str, int],
|
seed_config: dict[str, int],
|
||||||
seed: int,
|
seed: int,
|
||||||
@@ -6732,14 +6778,31 @@ def build_insta_of_pair(
|
|||||||
pov_character_labels,
|
pov_character_labels,
|
||||||
hard_content_rng,
|
hard_content_rng,
|
||||||
)
|
)
|
||||||
|
needs_lower_access = _hardcore_row_needs_lower_access(hard_row)
|
||||||
|
default_man_hardcore_clothing_entries = _default_man_hardcore_clothing_entries(
|
||||||
|
hard_men_count,
|
||||||
|
pov_character_labels,
|
||||||
|
character_hardcore_clothing_entries,
|
||||||
|
hard_content_rng,
|
||||||
|
needs_lower_access,
|
||||||
|
)
|
||||||
has_primary_hardcore_clothing = any(entry.startswith("Woman A") for entry in character_hardcore_clothing_entries)
|
has_primary_hardcore_clothing = any(entry.startswith("Woman A") for entry in character_hardcore_clothing_entries)
|
||||||
fallback_hard_clothing_state = "" if has_primary_hardcore_clothing else _insta_of_hardcore_clothing_state(
|
fallback_hard_clothing_state = "" if has_primary_hardcore_clothing else _insta_of_hardcore_clothing_state(
|
||||||
options["hardcore_clothing_continuity"],
|
options["hardcore_clothing_continuity"],
|
||||||
soft_row["item"],
|
soft_row["item"],
|
||||||
needs_lower_access=_hardcore_row_needs_lower_access(hard_row),
|
needs_lower_access=needs_lower_access,
|
||||||
)
|
)
|
||||||
hard_clothing_parts = [part for part in (fallback_hard_clothing_state, *character_hardcore_clothing_entries) if part]
|
hard_clothing_parts = [
|
||||||
hard_clothing_state = " ".join(hard_clothing_parts)
|
part.strip().rstrip(".")
|
||||||
|
for part in (
|
||||||
|
fallback_hard_clothing_state,
|
||||||
|
*character_hardcore_clothing_entries,
|
||||||
|
*default_man_hardcore_clothing_entries,
|
||||||
|
)
|
||||||
|
if str(part or "").strip()
|
||||||
|
]
|
||||||
|
hard_clothing_state = "; ".join(hard_clothing_parts)
|
||||||
|
hard_clothing_sentence = f"{hard_clothing_state}. " if hard_clothing_state else ""
|
||||||
if "body is fully exposed" in hard_clothing_state.lower() or "bare skin unobstructed" in hard_clothing_state.lower():
|
if "body is fully exposed" in hard_clothing_state.lower() or "bare skin unobstructed" in hard_clothing_state.lower():
|
||||||
hard_scene = _body_exposure_scene_text(hard_scene)
|
hard_scene = _body_exposure_scene_text(hard_scene)
|
||||||
hard_row["source_scene_text"] = hard_row.get("source_scene_text") or hard_row.get("scene_text", "")
|
hard_row["source_scene_text"] = hard_row.get("source_scene_text") or hard_row.get("scene_text", "")
|
||||||
@@ -6776,7 +6839,7 @@ def build_insta_of_pair(
|
|||||||
f"Cast descriptors: {cast_descriptor_text}. "
|
f"Cast descriptors: {cast_descriptor_text}. "
|
||||||
f"{pov_directive + ' ' if pov_directive else ''}"
|
f"{pov_directive + ' ' if pov_directive else ''}"
|
||||||
f"{'Keep Woman A visually central from the POV camera. ' if pov_character_labels else 'Keep Woman A visually central. '}"
|
f"{'Keep Woman A visually central from the POV camera. ' if pov_character_labels else 'Keep Woman A visually central. '}"
|
||||||
f"{hard_clothing_state} "
|
f"{hard_clothing_sentence}"
|
||||||
f"Role graph: {hard_row['role_graph']} Sexual scene: {hard_row['item']}. "
|
f"Role graph: {hard_row['role_graph']} Sexual scene: {hard_row['item']}. "
|
||||||
f"Setting: {hard_scene}. "
|
f"Setting: {hard_scene}. "
|
||||||
f"{_labeled_expression_sentence('Facial expressions', hard_row.get('expression'))}"
|
f"{_labeled_expression_sentence('Facial expressions', hard_row.get('expression'))}"
|
||||||
@@ -6829,6 +6892,7 @@ def build_insta_of_pair(
|
|||||||
"pov_prompt_directive": pov_directive,
|
"pov_prompt_directive": pov_directive,
|
||||||
"softcore_partner_styling": soft_partner_styling,
|
"softcore_partner_styling": soft_partner_styling,
|
||||||
"character_hardcore_clothing": character_hardcore_clothing_entries,
|
"character_hardcore_clothing": character_hardcore_clothing_entries,
|
||||||
|
"default_man_hardcore_clothing": default_man_hardcore_clothing_entries,
|
||||||
"hardcore_clothing_state": hard_clothing_state,
|
"hardcore_clothing_state": hard_clothing_state,
|
||||||
"hardcore_detail_density": hard_detail_density,
|
"hardcore_detail_density": hard_detail_density,
|
||||||
"hardcore_position_config": hard_row.get("hardcore_position_config", {}),
|
"hardcore_position_config": hard_row.get("hardcore_position_config", {}),
|
||||||
|
|||||||
Reference in New Issue
Block a user