Import campagne : narration et notes MJ accumulees au lieu de premier-gagne

Une scene coupee entre deux morceaux perdait la moitie de ses gm_notes /
player_narration (la regle premier-non-vide-gagne jetait la suite). Les deux
champs sont desormais CONCATENES, avec dedoublonnage (overlap relu) et
remplacement si un morceau apporte une version plus complete.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 15:19:42 +02:00
parent 8369886f42
commit c1811b0040

View File

@@ -163,8 +163,12 @@ class _TreeMerger:
{"name": sname, "description": "", "player_narration": "", {"name": sname, "description": "", "player_narration": "",
"gm_notes": "", "rooms": {}}) "gm_notes": "", "rooms": {}})
self._fill_desc(s, sc) self._fill_desc(s, sc)
self._fill_field(s, sc, "player_narration") # Narration/notes : CONCATÉNATION (pas premier-gagne) — une
self._fill_field(s, sc, "gm_notes") # scène coupée entre deux morceaux apporte la suite de son
# contenu dans le morceau suivant ; la jeter perdrait la
# moitié du donjon. Le doublon exact (overlap) est filtré.
self._append_field(s, sc, "player_narration")
self._append_field(s, sc, "gm_notes")
for rm in sc.get("rooms", []) or []: for rm in sc.get("rooms", []) or []:
rname = str(rm.get("name", "")).strip() rname = str(rm.get("name", "")).strip()
if not rname: if not rname:
@@ -186,6 +190,23 @@ class _TreeMerger:
if not node[field_name]: if not node[field_name]:
node[field_name] = str(src.get(field_name) or "").strip() node[field_name] = str(src.get(field_name) or "").strip()
@staticmethod
def _append_field(node: dict, src: dict, field_name: str) -> None:
"""Accumule la valeur de `src` à la suite de l'existante (scène coupée
entre deux morceaux). Ignore le vide et le contenu déjà présent (un
morceau redondant — relecture d'overlap — ne duplique rien)."""
new = str(src.get(field_name) or "").strip()
if not new:
return
current = node[field_name]
if not current:
node[field_name] = new
elif new not in current and current not in new:
node[field_name] = current + "\n\n" + new
elif current in new:
# Le nouveau contenu ENGLOBE l'ancien (version plus complète) → on le prend.
node[field_name] = new
def result(self) -> list[ArcProposal]: def result(self) -> list[ArcProposal]:
arcs: list[ArcProposal] = [] arcs: list[ArcProposal] = []
for a in self._arcs.values(): for a in self._arcs.values():