Jour 014 : Structuration des données
Structure globale
Pour l’instant, je suis toujours sur l’idée de faire ça au format HTML/JS. Du coup j’envisage de générer des fichiers statiques qui pourront être lancés offline. Idéalement, des fichiers bien optimisés qui ne contiennent que le stricte nécessaire.
Build
… Pour ce faire, j’envisage un système de build. J’aurais d’un côté des fichiers JS qui contiennent chacun des fonctions necessaires à une partie du jeu. D’un autre côté des fichiers CSS chacun pour une partie de l’interface ou de monde. Des fichiers HTML. Des scènes Blender qui vont générer des centaines de fichiers, de calques, d’animations.
Le but serait donc d’avoir un script qui builderait tout ça sous une forme parfaitement optimisée en se basant sur des fichiers de configuration qui lui diront quoi prendre et où le mettre.
Fichiers de configuration.
Je pense à trois types de fichiers de configurations pour l’instant :
- La configuration du jeu globale (nom du jeu, configurations des couleurs principales, des éléments du menu, etc.)
- La configuration des scènes du jeu (les écrans qui vont composer l’aventure)
- Les évènements et interactions qui se déroulent dans chacune de ces scènes.
Je n’ai pas encore réfléchi au fichier de configuration globale. Je pense qu’il se remplira au fur et à mesure qu’on composera l’interface du jeu.
Par contre, je me suis concentrés sur les scènes et les évènements.
En effet, maintenant qu’on a l’histoire, j’ai envie qu’on puisse transformer cette histoire dans un format lisible par un programme, et qu’on puisse écrire quelque part les dialogues.
Le but serait que Clément puisse être autonome là dessus pendant que moi je peux avancer sur la partie code.
Au départ, j’ai envisager de faire taper Clément directement des fichiers YAML (un format de stockage de données). Je lui ai montré, et il a l’air de comprendre. Mais je pense qu’il ne sera pas aussi productif que s’il a une vraie interface pour visualiser ce qu’il fait.
Alors je vais quand même conserver le format YAML, parce que je trouve que c’est une format lisible et pratique. Mais je vais lui réaliser un petit outil HTML/JS pour l’aider à éditer les fichiers de config sans avoir à se prendre la tête avec la syntaxe.
Mais pour l’instant, voici comment j’imagine la structure des données de configuration.
Les scènes
--- name: NomDeLaScene # Nom de la scène qui pourra # être appeler par les actions. positionX: 1 # Position visuelle de l'écran positionY: 1 # dans le monde. Sera utilisé pour # determiner automatiquement dans # quelle scène on va quand on se # dirige vers un bord de l'écran. type: glace # permettra de choisir le type # d'environnement. Ca sera surtout # utile pour l'éditeur characters: # liste des personnages de la scène - Hugo: # onKill: Permet de définir l'action qui # se lance quand ce personnage tue # quelqu'un ou quelque chose. onKill: hugoAimeTuerDesMonstres # isPlayable: Permet de définir si le # joueur pour switcher sur ce personnage # pour le jouer. isPlayable: true # onClick: Permet de définir l'action # qui se lance quand on clique sur le # personnage ou l'objet # onDead: Permet de définir l'action # qui se lance quand le personnage meur # Area: Permet de définir la zone # du personnage ou l'objet. Rayon en # nombre de cases # onNearby: Permet de définir l'action # qui se lance quand le joueur s'approche # dans la zone du personnage. # onTouch: Permet de définir l'action # qui se lance quand le joueur touche le # personnage. - Spencer: isPlayable: false npc: # les personnages non joueurs - monstre: onClick: attaque onDead: monstreDitQueCaFaitBobo objects: # les objets - statue: onClick: statueOnClick onNearby: onTouch: - arbre: - porte: sides: # les côtés de la scènes # côté supérieur de la scène - top: isOpen: true onTouch: actionOnMonteAuNord # par defaut, un onTouch goToScene # automatique sera programmée en fonction # des coordonnées de la scènes # positionX positionY # si isOpen est à true # côté gauche de la scène - left: onNearby: actionQuandOnVaAGauche isOpen: false # côté droit de la scène - right: isOpen: false # côté bas de la scène - bottom: isOpen: false places: # liste des endroits de la scène # ces endroits pourront être utilisés # pour déplacer un personnage vers # un endroit particulier. # La position exacte de ces endroits # seront configurés par la mise en scène - devantLaStatue: actionInit: initialisationScene052 metadata: noteDiverses: je note des trucs pour m'en rappeler parce que j'ai pas de cerveau chocolat: boooon champignons: paaaas bon
Les Actions et évènements qui les composent.
--- actions: # liste de toutes les actions du jeu - # nom de l'action. Elle pourra être appeler depuis # la scène ou depuis une autre action name: NomAction-1 # conditions pour que l'action puisse se réaliser # Toutes les conditions doivent être remplies conditions: # nom d'une variable ou d'une fonction à contrôler variable: NomVariable # Il peut s'agir d'une variable globale ou d'une # fonction JS qui sera lancée pour contrôler son # retour callJSFunction: false # opérateur utilisé pour vérifier la valeur # #equals, greaterThan, lowerThan, contains, # containsNot operator: equals #valeur attendue value: valeur # Par défaut, la condition automatique de # numérotation est vérifiée à n-1 # Exemple, si on est dans l'action, NomAction-2, # alors je vérifie que NomAction-1 a été # lancée # La condition peut être une liste de condition # qui seront alors vérifiées ensemble. # Une seule d'entre elles pourra alors suffir. # Si la condition n'est pas remplie, alors une autre # action peut être lancée en fallback fallback: nomAutreAction # La liste des évènements qui se lancent les uns à la # suite des autres. events: # un event peut être une liste d'events qui se # déclenchent en même temps. - # Qui ou quoi fait l'action who: Hugo # Que dit il. Possible de mettre des parties # *en valeur*. says: Coucou # A qui le dit-il (objet ou personnage vers qui le # personnage va se tourner) saysTo: Rayan # Vers quoi se déplace-t'il (nom du personnage # ou de l'objet) movesTo: fondDeLaPiece # Vers qui se tourne-t'il (rotation simple) turnsTo: Stella # Le personnage se mettre à suivre un autre # objet tant que follows n'est pas à null follows: Spencer # Patienter avant de lancer la suite des événements # Valeur en nombre de secondes wait: 2 # Changer l'état de visibilité de l'objet # true ou false setVisibility: true # vitesse du déplacement du personnage qui sera # appliquée à son prochain dépalcement. # valeur entre 0 et 5 setSpeed: 3 # changement d'état du personnage setState: NomEtat # Diriger le joueur vers une autre scène. goToScene: nomAutreScene # Lancer une autre séquence d'action à l'intérieur # de celle-ci # Automatique dans le cas des events numérotés playAction: NomAutreAction # Définir la valeur d'une variable setVariable: variable: nomVariable value: valeur increment: false # par défaut, la variable automatique de # numérotation est déclarée # Si l'action s'appelle nomAction-1, alors la # variable nomAction_played = 1 # Empecher la sortie de la scène car l'action # automatique sera jouée juste après celle-ci. preventExit: true
Un exemple simple
--- name: HugoSeLaPete events: - who: Hugo says: Je suis Hugo et je suis le meilleur - - who: Stella turnsTo: Hugo - who: Spencer turnsTo: Hugo - who: Rayan turnsTo: Hugo - who: Rayan saysTo: Hugo says: Quoi ? Mais pas du tout ! - who: Hugo saysTo: Rayan says: Mais si ! En tous cas... bien plus que toi ! - who: Rayan movesTo: Hugo - wait: 2s - who: Hugo saysTo: Rayan says: Quoi ? - who: Rayan saysTo: Hugo says: Rien... je regarde à quel point je suis meilleur que toi. Et c`est bon. C`est large. - who: Hugo saysTo: Rayan says: pfffff - - who: Hugo saysTo: Rayan says: T'es trop nul ! - who: Rayan saysTo: Hugo says: T'es trop moche ! - who: Rayan setState: toutRouge
Dans cette courte scène, Hugo frime, les autres enfants le regarde et Rayan le contre-dit. Hugo maintient. Rayan s’approche de Hugo, le regarde 2 secondes puis lui dit que c’est lui qui frime finalement. Les deux se disputent et Rayan devient rouge de rage.
Conclusion
Je pense qu’avec ça, je couvre une très grande partie des cas qu’on a imaginé. Je pense qu’il y aura quelques petites choses à rajouter au fur et à mesure de la saisie. Des choses auxquelles je n’ai pas pensé. Mais avec ça, on devrait couvrir 99% des scènes du jeu.
J’ai donc ce qu’il me faut pour commencer à réaliser un petit éditeur pour Clément afin qu’il puisse bosser de son côté sur cette grooosse partie, fun mais compliquée : les dialogues !