Aller au contenu
quest'n'click

CréerRéférencePour auteursS'applique de 4.3.0

Personnages

This page in EnglishCette page sur le wiki GitHub

Un personnage se déclare une fois, dans game.ts (characters, en général depuis cast.ts), et se place dans une salle comme acteur. Cette page liste les champs d'un personnage, ses poses et ses bouches, les variantes que choisit son état, les changements de palette, et les personnages que l'on voit sans pouvoir agir dessus.

Un personnage

characters: {
  grandma: {
    name: 'Grand-mère', color: '#f0c040', height: 124, kind: ['person'],
    portrait: 'grandma/r1c2',
    sprites: { idle: ['grandma/r3c3'], talk: ['grandma/r3c4', 'grandma/r3c3'], walk: ['grandma/r2c1', 'grandma/r2c2', …] },
    refuse: 'C’est gentil, mon chat. Mais garde-le, tu en auras besoin pour ta course.',
    hug: 'Toujours. Même avec un panier dans les bras.',
  },
  talkie: { name: 'le talkie-walkie', color: '#ff6fb5', offscreen: true },   // parle dans un cadre, sans corps
},
ChampContenu
nameLe nom affiché.
colorLa couleur de ses répliques. Donnez à chacun la sienne (dialogues).
heightTaille à l'écran en unités logiques, au premier plan (par défaut skin.heights : acteur 110, héros 84).
spritesLes poses : nom de pose → liste d'images, jouées en boucle (au moins idle).
fpsImages par seconde de l'animation (8 par défaut).
mouthsLes images de bouche par pose (ci-dessous).
portraitPour la carte, les appels et les menus de conversation.
kindSes sortes, pour les réactions par sorte (['person'], ['cat'] ; réactions).
refuseLa réponse à tout Donner sans règle.
hugLa réponse au sujet global « câlin » (globalTalk.hug) ; sans lui, « ♥ ».
offscreenParle dans un cadre en haut de l'écran, sans corps (narrateur, peluche, téléphone).
glowUn halo doux autour du personnage (une couleur CSS), par exemple une apparition.
roomLa salle de départ d'un personnage qui se déplace d'une salle à l'autre (faire bouger les personnages).
variants, palette, paletteToleranceDes apparences qui dépendent de l'état (ci-dessous).
descriptionSon apparence, en mots, pour les prompts d'images (npm run prompts). Jamais affiché en jeu.

Le héros est un personnage aussi (hero dans game.ts) ; plusieurs personnages jouables et le choix du héros sont dans héros. Un personnage ne parle dans une salle qu'à travers un acteur, sauf dans un appel téléphonique (commandes).

Poses

Par convention : idle, talk, walk (de profil, tourné vers la droite ; le moteur retourne l'image pour la gauche), walk_front, walk_back, point, use, plus toute pose spéciale voulue (sleep, sit, celebrate…). Une pose est une liste d'images jouées en boucle. Une pose manquante retombe sur idle (validate signale un acteur dont la pose manque). Le cast.ts du modèle a des aides pour les planches standard : human(id) et cat(id) font correspondre une planche de 6 × 4 à ces poses (images). { pose: ['cat', 'sleep'] } pose une pose durable ; { anim: ['hero', 'use'], ms: 600 } en joue une un moment (commandes).

Parole : seule la bouche bouge

Un personnage qui a une planche de parole déclare ses bouches par pose. Pendant une réplique, le corps ne change jamais : les images de bouche ouverte tournent au hasard (de 160 à 220 ms), et un clignement passe de temps en temps au repos. L'image « bouche fermée » remplace l'image de repos de la pose : repos et parole viennent du même dessin.

import { human, mouths } from './cast';
grandpa: { …, mouths: mouths('talk_grandpa', { idle: 'profile', front: 'face', seated: 'seated' }) },

mouths(dossier, { pose: rangée }) lit <dossier>/<rangée>/t1…t6 (t1 fermée, t2 à t4 ouvertes, t5 clignement, t6 sourire), les images que produit tools/talk-apply.py. Sans bouche pour une pose, le personnage garde la même image et rebondit d'un pixel en parlant ; une longue réplique commence par un geste (la pose talk) joué une fois.

Variantes selon l'état

import { cat } from './cast';
hero: { …, sprites: cat('hero'), variants: [{ if: { has: 'bucket' }, sprites: cat('hero_bucket'), mouths: … }] },

La première variante dont la condition est vraie remplace sprites, mouths et portrait, et name quand elle en a un (4.3.0 : le héros que le joueur a choisi, un personnage renommé après une révélation ; héros). Le changement se voit tout de suite (par exemple dès que le seau est ramassé).

Changement de palette (palette, aussi sur les variantes)

Une planche, plusieurs apparences : palette fait correspondre des couleurs sources à des couleurs cibles, toutes deux en #rrggbb. La vue de la salle recolore une fois chaque image de pose et de bouche du personnage, dans un canvas hors écran (mis en cache, transparence gardée). La palette d'une variante remplace celle du personnage tant que sa condition tient (une variante sans palette garde celle du personnage).

biscuit: { …, sprites: cat('cat'),
  palette: { '#2c1818': '#7a3416', '#492a25': '#b0592a', '#543329': '#c4703a' }, paletteTolerance: 14,
  variants: [{ if: 'muddy', palette: { '#492a25': '#5a4a3a' } }] },

Par défaut, la correspondance est exacte au RGB près : cela convient au style pixel, dont le découpeur donne à chaque matière une valeur exacte. Les planches peintes (cel) et le WebP avec perte ont beaucoup de tons voisins : paletteTolerance (une distance RGB ; 10 à 16 est un bon début, sous la distance à la couleur du contour) recolore chaque pixel proche d'une couleur source, en gardant son écart avec elle ; la couleur source la plus proche l'emporte. Prenez les couleurs sources dans le PNG découpé (les couleurs opaques les plus fréquentes d'une case). Le Biscuit de la démo s'en sert pour devenir un chat roux tigré.

Choses à plusieurs états

Une mouette qui regarde ou gobe, un vieux chien qui dort, boude ou bâille, l'œil d'un chat qui brille sur un écran : une zone cliquable n'a qu'un nom et une forme, donc pour une chose dessinée qui change, prenez un accessoire à états :

props: { seagull: { name: 'mouette', states: { watch: 'obj_yard/r2c4', snap: 'obj_yard/r2c5' }, initial: 'watch' } }

avec une position par état dans le layout (props.seagull.states.snap) ; la zone cliquable suit l'image. Changez l'état avec { prop: ['seagull', 'snap'] } et réagissez-y avec if: { prop: ['seagull', 'snap'] }. Pour un morceau du fond qui change de nom ou de forme, prenez deux zones cliquables aux conditions visible opposées (visible: 'x' / visible: '!x'), chacune avec sa forme ; une règle peut viser les deux (a: ['h1', 'h2']).

Présence sans interaction

actors: { ghost: { char: 'ghost', interactive: false, visible: 'ghost_seen' } } : visible, mais ni cliquable ni nommé. À combiner avec { show: 'ghost', fade: 1500 } / { hide: 'ghost', fade: 1500 } et glow sur la fiche du personnage.