- "ℹ️ Informations" (propriétés d'un personnage) : nom éditable, réutilisé
comme "qui parle" dans l'éditeur de dialogue de quête (menu déroulant,
plus "Joueur" toujours disponible) — remplace l'ancien choix binaire
joueur/pnj. db.sanitize_quest_dialogues accepte maintenant un nom libre.
- Nouveau menu "🖥️ Interface" (palette d'objets) avec le premier widget :
"💬 Boîte de dialogue" (kind="dialogue_box", screens/rendering/
dialogue_box_style.py) — position/taille comme tout objet de scène,
panneau "🎨 Style" dédié (police, taille, épaisseur, couleur du texte,
couleur header/body/footer). Rendu en <div> à 3 zones, jamais soumis à
la collision ni à l'éditeur de collision (exclu partout : obstacles,
liste des règles, payload). Rendu côté jeu dans .sceneUI, une couche
FIXE au viewport (jamais .sceneWorld, qui défile avec la caméra).
- static/js/play/dialogue-box-controller.js : fait le lien moteur entre
l'action "quete" de l'éditeur de collision et ce widget — affiche la
réplique en cours du dialogue correspondant au STATUT ACTUEL de la
quête (gameData.quests, désormais exposé game-wide par
full_game_payload.py), avance au clic sur "Suivant" (header = qui
parle, body = texte, footer = bouton), se masque à la dernière réplique.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Deux retours utilisateur sur la boîte de collision (ajoutée précédemment) :
- Visible et réglable directement dans l'éditeur de scène : pour l'objet
sélectionné, un contour pointillé (rectangle/cercle) se superpose sur
le canevas — glisser son corps ajuste le décalage, glisser sa poignée
(coin bas-droit) ajuste la taille, les deux se répercutent dans le
panneau "🧱 Collision" et inversement (édition des champs -> aperçu à
jour). static/js/scenes/scene-editor.js::onCollisionBoxMouseDown/
onCollisionBoxResizeMouseDown, mirror des poignées de position/taille
déjà existantes pour l'objet lui-même.
- Bloque désormais RÉELLEMENT le déplacement au clavier : avant chaque
pas, personnage-controller.js teste si la position candidate
chevaucherait la boîte de collision d'un autre objet solide (jamais un
"fond", jamais un objet à collision désactivée) et annule ce pas — par
AXE séparément, pour permettre de glisser le long d'un mur en
diagonale plutôt qu'un blocage total au moindre contact. Réutilise
forgeShapesOverlap (conditions.js, factorisé depuis elementsOverlap
pour ne jamais dupliquer la règle "qu'est-ce qui se touche").
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Trois retours utilisateur sur l'éditeur de scène 2D :
- Retire l'arborescence "Objets de cette scène" (un objet reste
sélectionnable en cliquant dessus sur le canevas) et le bouton
"+ Ajouter un décor" (le type "decor" reste supporté côté serveur,
juste plus accessible depuis ce menu).
- Chaque objet de scène a désormais une boîte de collision AUTOMATIQUE
(= sa propre boîte, comportement inchangé pour une condition de
collision déjà posée) réglable dans un nouveau panneau "🧱 Collision" :
activée/désactivée, forme (rectangle/cercle), taille et décalage —
utile pour un sprite très paddé (CraftPix) dont la silhouette réelle
est bien plus petite que son canevas. elementsOverlap() (conditions.js)
applique ces réglages en restant identique par défaut.
- Nouveau champ "🏷️ Rôle" (Joueur/Ennemi/PNJ) sur un personnage : SEUL un
personnage "Joueur" est désormais déplacé/animé au clavier et suivi
par la caméra (personnage-controller.js) — "Ennemi"/"PNJ" restent
immobiles tant qu'aucune logique de flow ne les pilote (déplacement
ennemi automatique/apparition, dialogue de PNJ... hors scope de ce
réglage, qui ne fait qu'identifier "quel objet est le joueur").
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Trois retours utilisateur :
- fps d'idle/interagir/touches supplémentaires alignés sur celui de la
marche (8 i/s partout, était 4 pour idle — perçu comme "les autres
animations sont lentes à côté de la marche").
- Nouveau menu "🏞️ Images de fond" dans "Objets de cette scène" : pose
un objet kind="fond" à la taille RÉELLE de l'image choisie (pack
CraftPix intégré en galerie, admin seulement — licence, voir
core/sprite_gate.py), derrière tout le reste, insensible au clic.
- Si ce fond dépasse la scène, elle devient le "monde" : .playScreen.
playScene est désormais le viewport (overflow:hidden, taille fixe),
.sceneWorld le monde à l'intérieur — la caméra centre le premier
personnage trouvé, bornée pour ne jamais montrer au-delà des bords
(voir personnage-controller.js::forgeUpdateSceneCamera). Le personnage
peut désormais se déplacer sur tout le monde, pas seulement le petit
cadre visible (clampSceneObjectPosition, actions.js). Un jeu sans fond
XXL garde un comportement strictement identique à avant (monde ==
scène, transform vide).
Bibliothèque générée une fois par scripts/generate_background_manifest.py
(assets/background/, non versionné, licence CraftPix) vers
static/backgrounds/ (committé), même patron que
generate_animal_sprite_manifest.py.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Deux retours utilisateur sur le panneau "Commandes" (déplacement/
animation automatiques, voir précédent commit) :
- Les champs de touche (haut/bas/gauche/droite/interagir) capturent
maintenant la touche au clavier (clic puis appui — event.key, même
valeur que heldKeys/triggers.js) au lieu d'être tapés à la main,
source d'erreurs ("Espace" vs " ", "flèche haut" vs "ArrowUp"...).
- Nouvelle section "Animations supplémentaires" : un nombre illimité de
touches, chacune liée à UNE pose au choix parmi celles réellement
disponibles pour ce personnage (sauter, attaquer, courir...) — pas
seulement les 4 touches de déplacement + interagir.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Simplification demandée pour l'éditeur de jeu RPG : un personnage posé
sur une scène 2D se déplace et s'anime TOUT SEUL avec ZQSD (+ E pour
interagir) dès qu'il est posé — plus besoin de poser le moindre nœud de
flow pour un mouvement de base. Le panneau "🕹️ Commandes" du personnage
permet de remapper les 4 touches de déplacement et la touche
d'interaction, et de bloquer un axe (horizontal/vertical seulement).
Entièrement client (static/js/play/personnage-controller.js), réutilise
heldKeys (triggers.js) et applyObjectProperty/clampSceneObjectPosition/
runSpriteAnimation (actions.js) — aucune logique dupliquée, et ça
fonctionne aussi bien en ligne que dans l'export Web/SCORM (aucune
requête serveur). "walk"/"idle"/"interact" (poses déjà présentes pour
tout personnage Forge/CraftPix) sont utilisées telles quelles ; une pose
absente dégrade silencieusement (déplacement sans animation) plutôt que
de planter.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>