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 !


Tags :

Catégories :

Mis à jour :