À la demande de l'utilisateur (validation de la refonte visuelle du widget Personnage), deux ajustements : - Bibliothèque de sprites Forge étendue aux 6 personnages du pack Kenney "Toon Characters" (aventurier/aventurière, personnage homme/femme, robot, zombie), avec TOUTES leurs poses (45 par personnage) plutôt que 3 — regroupées en 31 animations nommées par personnage (poses numérotées type walk0..walk7 fusionnées en un seul cycle "walk", les autres restant des poses figées à une image). ~1,2 Mo au total, toujours un sous-ensemble curé du pack source (assets/characters/, non versionné) — HD/Parts/Tilesheet/Vector toujours exclus. - Import de sprites personnalisés retiré pour le moment : plus de tuile "➕ Sprite personnalisé" dans la galerie d'ajout, plus de section d'import dans les propriétés d'un personnage — seuls les personnages Forge restent proposés. La résolution serveur de _personnage_data garde son support générique de la source "custom" (aucune migration requise si cette possibilité revient plus tard), mais plus aucune UI ne permet de la créer. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
40 lines
1.8 KiB
JavaScript
40 lines
1.8 KiB
JavaScript
// ---------- Panneau de propriétés "🎭 Personnage" (Phase 8) ----------
|
|
// Panneau sur-mesure (custom_panel, voir registry.py) : PAS de soumission
|
|
// générique via #propsForm — chaque changement s'enregistre en AJAX vers
|
|
// POST /game/<slug>/elements/<id>/personnage (element_set_personnage_data.py),
|
|
// qui renvoie les animations résolues pour relancer immédiatement l'aperçu
|
|
// animé (voir personnage-preview.js) sans recharger la page. L'import de
|
|
// sprites personnalisés est retiré pour le moment — seuls les personnages
|
|
// Forge (SPRITE_LIBRARY) sont proposés.
|
|
|
|
function _personnageElementId() {
|
|
var body = document.getElementById('personnagePanelBody');
|
|
return body ? parseInt(body.dataset.elementId, 10) : null;
|
|
}
|
|
|
|
function _savePersonnageData(data) {
|
|
var elementId = _personnageElementId();
|
|
if (!elementId) return Promise.resolve();
|
|
return fetch('/game/' + GAME_SLUG + '/elements/' + elementId + '/personnage', {
|
|
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data),
|
|
})
|
|
.then(function (r) { return r.json(); })
|
|
.then(function (json) {
|
|
if (json.animations) {
|
|
// Reste en phase avec le sélecteur d'animation du nœud de flow/clip
|
|
// de Timeline (voir flow-editor.js/animation-timeline.js), sans
|
|
// recharger la page.
|
|
ELEMENT_ANIMATIONS_MAP[elementId] = json.animations;
|
|
restartPersonnageIdlePreview(elementId, json.animations);
|
|
}
|
|
return json;
|
|
});
|
|
}
|
|
|
|
function swapPersonnageCharacter(forgeCharacter) {
|
|
document.querySelectorAll('#personnageGallerySwap .iconGalleryTile').forEach(function (tile) {
|
|
tile.classList.toggle('selected', tile.getAttribute('onclick') === "swapPersonnageCharacter('" + forgeCharacter + "')");
|
|
});
|
|
_savePersonnageData({ source: 'forge', forge_character: forgeCharacter });
|
|
}
|