Add sensual location background assets

This commit is contained in:
2026-06-13 02:09:00 +09:00
parent c11da3530f
commit 55f417c9e1
26 changed files with 203 additions and 1 deletions

View File

@@ -57,10 +57,12 @@ def validate_asset_image(path: Path, min_width: int, min_height: int, label: str
def main() -> None:
characters_doc = load_json(DATA / "characters.json")
locations_doc = load_json(DATA / "locations.json")
assets_doc = load_json(DATA / "character_assets.json")
character_ids = [character["id"] for character in characters_doc["characters"]]
character_id_set = set(character_ids)
location_ids = {location["id"] for location in locations_doc["locations"]}
asset_entries = assets_doc["assets"]
asset_ids = [entry["character_id"] for entry in asset_entries]
@@ -158,12 +160,64 @@ def main() -> None:
f"{cg_set['set_id']} revision candidate {affection_min}",
)
location_asset_path = DATA / "location_assets.json"
location_accepted = 0
location_revision_count = 0
if location_asset_path.exists():
location_assets_doc = load_json(location_asset_path)
location_minimum = location_assets_doc["minimum_dimensions"]
location_min_width = location_minimum["width"]
location_min_height = location_minimum["height"]
contact_sheet = ROOT / location_assets_doc["contact_sheet"]
if not contact_sheet.exists():
fail(f"location contact sheet is missing: {contact_sheet}")
png_dimensions(contact_sheet)
location_asset_entries = location_assets_doc["assets"]
asset_location_ids = [entry["location_id"] for entry in location_asset_entries]
if set(asset_location_ids) != location_ids:
missing = sorted(location_ids.difference(asset_location_ids))
extra = sorted(set(asset_location_ids).difference(location_ids))
fail(f"location asset manifest mismatch; missing={missing}, extra={extra}")
if len(asset_location_ids) != len(set(asset_location_ids)):
fail("location asset manifest contains duplicate location ids")
for entry in location_asset_entries:
status = entry["status"]
if status not in {"accepted", "needs_revision", "pending", "rejected"}:
fail(f"{entry['location_id']} has invalid location asset status {status}")
path_value = entry.get("path")
if status == "accepted":
location_accepted += 1
if not path_value:
fail(f"{entry['location_id']} accepted location asset lacks a path")
validate_asset_image(
ROOT / path_value,
location_min_width,
location_min_height,
entry["location_id"],
)
elif status == "needs_revision":
location_revision_count += 1
if path_value:
validate_asset_image(
ROOT / path_value,
location_min_width,
location_min_height,
f"{entry['location_id']} revision candidate",
)
print(
"Validated character asset manifest: "
f"{accepted}/{len(asset_entries)} accepted, "
f"{revision_count} needs revision, "
f"{date_cg_accepted} accepted date CG tiers, "
f"{date_cg_revision_count} date CG tiers need revision."
f"{date_cg_revision_count} date CG tiers need revision, "
f"{location_accepted} accepted location backgrounds, "
f"{location_revision_count} location backgrounds need revision."
)