Show the starter adventure the artwork of the demo it came from
An adventure has no cover art of its own and inherits its scenario's, and a bundle carries no scenario id, because an id means nothing in another database. The starter card therefore fell back to a monogram tile while the demo beside it showed the Pokeball. The starter file names its source under `scenarioTitle`, and the copy is linked to the seeded scenario with that title. If no seed answers to the name, the adventure keeps a NULL `scenario_id`, which is the state every imported bundle is in and costs only the artwork. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PacdRuPXSkQQy4ZYdH32hF
This commit is contained in:
co-authored by
Claude Opus 5
parent
ef4da7fda2
commit
c2d3f0d8b9
+25
-2
@@ -23,7 +23,7 @@ from pathlib import Path
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from . import bundle, models
|
||||
from . import bundle, models, seed
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -63,7 +63,30 @@ def give(db: Session, user: models.User) -> models.Adventure | None:
|
||||
# flush whatever part of the adventure the session still held.
|
||||
with db.begin_nested():
|
||||
story = bundle.plan(payload, bundle.check_format(payload))
|
||||
return bundle.materialize(db, payload, story, user.id)
|
||||
adventure = bundle.materialize(db, payload, story, user.id)
|
||||
_link_scenario(db, adventure, payload)
|
||||
return adventure
|
||||
except Exception:
|
||||
logger.exception("Could not give user %s the starter adventure.", user.id)
|
||||
return None
|
||||
|
||||
|
||||
def _link_scenario(db: Session, adventure: models.Adventure, payload: dict) -> None:
|
||||
"""Points the copy at the demo scenario it came from, when that seed exists.
|
||||
|
||||
A bundle does not carry a scenario id, because the id is local to one
|
||||
database and an export outlives it. The link matters anyway: an adventure
|
||||
has no cover art of its own, and inherits the scenario's. Without it the
|
||||
starter shows a monogram tile while the demo it came from shows its own
|
||||
artwork.
|
||||
|
||||
The name is read from `scenarioTitle` in the file. If no seeded scenario
|
||||
answers to it, the adventure keeps a NULL `scenario_id`, which is the same
|
||||
state an imported bundle is in and costs only the artwork.
|
||||
"""
|
||||
title = str(payload.get("scenarioTitle") or "").strip()
|
||||
if not title:
|
||||
return
|
||||
scenario = seed.find_seeded(db, title)
|
||||
if scenario is not None:
|
||||
adventure.scenario_id = scenario.id
|
||||
|
||||
Reference in New Issue
Block a user