121 lines
4.5 KiB
Python
121 lines
4.5 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
try:
|
|
from . import cast_context as cast_context_policy
|
|
from . import character_appearance as character_appearance_policy
|
|
from . import character_profile as character_profile_policy
|
|
from . import character_slot as character_slot_policy
|
|
from . import pair_cast
|
|
from . import pov_policy
|
|
from . import seed_config as seed_policy
|
|
from . import subject_context as subject_context_policy
|
|
except ImportError: # Allows local smoke tests from the repository root.
|
|
import cast_context as cast_context_policy
|
|
import character_appearance as character_appearance_policy
|
|
import character_profile as character_profile_policy
|
|
import character_slot as character_slot_policy
|
|
import pair_cast
|
|
import pov_policy
|
|
import seed_config as seed_policy
|
|
import subject_context as subject_context_policy
|
|
|
|
|
|
def resolve_subject_route(
|
|
*,
|
|
subject_type: str,
|
|
seed_config: dict[str, int],
|
|
seed: int,
|
|
row_number: int,
|
|
ethnicity: str,
|
|
figure: str,
|
|
no_plus_women: bool,
|
|
no_black: bool,
|
|
women_count: int,
|
|
men_count: int,
|
|
character_profile: str | dict[str, Any] | None = None,
|
|
character_cast: str | dict[str, Any] | list[Any] | None = None,
|
|
) -> dict[str, Any]:
|
|
person_rng = seed_policy.axis_rng(seed_config, "person", seed, row_number)
|
|
context = subject_context_policy.subject_context(
|
|
person_rng,
|
|
subject_type,
|
|
ethnicity,
|
|
figure,
|
|
no_plus_women,
|
|
no_black,
|
|
women_count,
|
|
men_count,
|
|
)
|
|
character_slots = character_slot_policy.parse_character_cast(character_cast)
|
|
character_slot_map = cast_context_policy.character_slot_label_map(character_slots)
|
|
applied_slot: dict[str, Any] = {}
|
|
slot_status = "none"
|
|
if context.get("subject_type") in ("woman", "man"):
|
|
slot_label = "Woman A" if context["subject_type"] == "woman" else "Man A"
|
|
if slot_label in character_slot_map:
|
|
context, applied_slot = character_appearance_policy.character_context_for_label(
|
|
slot_label,
|
|
character_slot_map,
|
|
person_rng,
|
|
ethnicity,
|
|
figure,
|
|
no_plus_women,
|
|
no_black,
|
|
)
|
|
slot_status = f"applied:{slot_label}"
|
|
applied_profile, profile_status = {}, "skipped_character_slot"
|
|
else:
|
|
context, applied_profile, profile_status = character_profile_policy.apply_character_profile_to_context(
|
|
context,
|
|
character_profile,
|
|
)
|
|
else:
|
|
context, applied_profile, profile_status = character_profile_policy.apply_character_profile_to_context(
|
|
context,
|
|
character_profile,
|
|
)
|
|
|
|
resolved_subject_type = str(context.get("subject_type") or subject_type)
|
|
pov_character_labels = (
|
|
pov_policy.pov_character_labels(character_slot_map, men_count)
|
|
if resolved_subject_type == "configured_cast"
|
|
else []
|
|
)
|
|
cast_descriptors: list[str] = []
|
|
cast_descriptor_text = ""
|
|
if resolved_subject_type == "configured_cast" and character_slots:
|
|
cast_descriptors, _descriptor_slots = pair_cast.cast_descriptor_entries_from_slots(
|
|
seed_config=seed_config,
|
|
seed=seed,
|
|
row_number=row_number,
|
|
ethnicity=ethnicity,
|
|
figure=figure,
|
|
no_plus_women=no_plus_women,
|
|
no_black=no_black,
|
|
women_count=women_count,
|
|
men_count=men_count,
|
|
character_slots=character_slots,
|
|
character_slot_map=character_slot_map,
|
|
primary_descriptor="",
|
|
axis_rng=seed_policy.axis_rng,
|
|
character_context_for_label=character_appearance_policy.character_context_for_label,
|
|
slot_is_pov=pov_policy.slot_is_pov,
|
|
)
|
|
cast_descriptor_text = pair_cast.prompt_cast_descriptors("; ".join(cast_descriptors))
|
|
|
|
return {
|
|
"context": context,
|
|
"subject_type": resolved_subject_type,
|
|
"character_slots": character_slots,
|
|
"character_slot_map": character_slot_map,
|
|
"applied_slot": applied_slot or {},
|
|
"character_slot_status": slot_status,
|
|
"applied_profile": applied_profile or {},
|
|
"character_profile_status": profile_status,
|
|
"pov_character_labels": pov_character_labels,
|
|
"cast_descriptors": cast_descriptors,
|
|
"cast_descriptor_text": cast_descriptor_text,
|
|
}
|