3 3 — Création des évènements
Shadow15510 edited this page 2022-07-16 11:06:35 +02:00
This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Création des évènements

Principes généraux

Les évènements sont des listes formatées qui ont cette forme : [xp_gagnee, "Texte de l'évènement", nb, ...].

  • xp_gagnee : correspond à l'expérience que le joueur gagne lors de l'évènement.
  • le texte est ce qui est affiché à l'écran lors de l'évènement.
  • nb : est une variable utilisée lors de dialogues. C'est une manipulation un peu plus délicate sur laquelle je reviens juste après.
  • les ... correspondent à des modificateurs sur les statistiques. J'y reviendrais également.

Précisions sur les dialogues

Les dialogues permettent au joueur de choisir sa réponse. Si le joueur ne peux pas choisir de réponse, mettez nb à 0, sinon mettez nb sur le nombre de réponse possible. Les différentes réponses sont à afficher avec un numéro dans le corps du message. Par exemple : [0, "Ceci est une question ? 1.Première réponse. 2.Seconde réponse.", 2]. Le numéro de la question correspond alors au nombre de points d'expérience gagnée par le joueur (il est, de se fait, conseillé de ne pas donner de points d'expérience au joueur lors d'un dialogue). Si il n'y a pas de réponses possible, vous pouvez omettre cet argument. Attention, cette astuce n'est valable que si vous ne comptez pas modifier les statistiques.

Stockage des évènements et mise en place de la fonction

Ces évènements sont stockés dans des dictionnaires dont les clefs correspondent aux points d'expériences, c'est peut-être pas très clair, mais avec un exemple, ça ira mieux.

Par simplicité, j'utiliserai un dictionnaire par PnJ, vous faites bien comme vous voulez, du moment que vous obtenez un truc qui marche… Ces dictionnaires d'évènements doivent être placés dans une fonction qui doit respecter certaines règles :

  • la fonction doit prendre en argument la liste data (qui contient dans l'ordre : l'expérience, l'indice de la carte actuelle, et les coordonnées du joueur), les statistiques, le dictionnaire des entites (objets) de la carte courante ainsi que l'identifiant de l'entité activée.
  • la fonction doit renvoyer un dictionnaire d'évènements ou un évènement.

Concrètement, votre fonction va ressembler à :

def evenements(data, stat, entites, identifiant):
    xp, carte_actuelle, x, y, derniere_touche = data
    coords = (x, y)

    # Si on dans la première map
    if carte_actuelle == 0:
        if coords == (X1, Y1): return {
            xp_1: [...],
            xp_2: [...],
            ...
            "base": [...]
            }

        elif coords == (X2, Y2): return ...
    
    # Si on est dans la seconde map
    elif carte_actuelle == 1:
        ...

    # Si on a pas encore renvoyé d'évènement, il faut prévoir un "cas par défaut" (notez que c'est optionnel)
    return [0, "Hmm ?"]

Les tests conditionnels testent quel PnJ le joueur regarde (sur quelle carte, et à quelles coordonnées).

Ici, on voit peut-être un peu mieux le fonctionnement : les clefs du dictionnaires d'évènements correspondent à des points d'expérience : si le joueur à xp_1 points d'expérience, alors c'est ce dialogue là qui sera lu, et si aucun évènement ne correspond, mais que le PnJ a quand même un texte à dire à un moment, l'évènement "base" sera lu.

On peut également choisir de discriminer les cas par rapport à l'identifiant de l'entité activée ce qui est plus agréable :

def evenements(data, stat, entites, identifiant):
    # Si on dans la première map
    if carte_actuelle == 0:
        if identifiant == "nom_entite_1": return {
            xp_1: [...],
            xp_2: [...],
            ...
            "base": [...]
            }

        elif idenfifiant == "nom_entite_2": return ...
    
    # Si on est dans la seconde map
    elif carte_actuelle == 1:
        ...

    # Si on a pas encore renvoyé d'évènement, il faut prévoir un "cas par défaut" (notez que c'est optionnel)
    return [0, "Hmm ?"]

Modification manuelle des données et des statistiques

Vous pouvez modifier les listes data et stat par effet de bord.

Si l'évènement doit faire changer une de vos statistique de valeur, vous pouvez préciser ces modifications dans l'évènements lui-même. Notez toutefois que cette méthode repose sur une simple addition, elle est valable sur les entiers, les flottants et est comptabible avec les chaînes de caractères. Cette méthode peut permettre d'ajouter un élément à une liste, mais si possible préférez List.append conçu dans cette optique.

Cela dit, passons au fonctionnement à proprement parler, la liste qui correspond à un évènement est de cette forme : [xp_gagnee, texte, nb_reponse, (0, stat_0), (1, stat_1)...]

stat_0 sera ajouté à stat[0]. stat_1 sera ajouté à stat[1]. ...

Les modificateurs de statistiques sont donc des tuples, le premier élément est l'indice qu'il faut modifier, le second la valeur à ajouter.

La structure de la liste data est : [xp, index_carte, x, y, derniere_touche] où :

  • xp est un dictionnaire : {nom_quete: xp_correspondante}
  • index_carte est l'indice de la carte courante
  • x, y, les coordonnées du joueur sur cette carte
  • derniere_touche la dernière touche pressée par le joueur

Système de quêtes parallèles

Lors du développement de votre jeu, vous serez peut-être amené à vouloir introduire des quêtes parallèles. Ces quêtes pourraient ainsi être démarrées à n'importe quel moment dans le jeu et s'effectuer sans aucune interférence avec d'autres quêtes. Asci gère cette possibilité. Il suffit alors de modifier un tout petit peu la fonction : au lieu de retourner simplement l'évènement (respectivement, un dictionnaire d'évènements), il faut renvoyer un tuple qui a pour premier élément le nom de la quête parallèle; le deuxième élément étant l'évènement en lui-même (respectivement, le dictionnaire d'évènements).

Les points d'expériences sont en fait en stockés dans un dictionnaire, les clefs sont les noms des quêtes (seule la quête principale est forcée sur "main", et est automatiquement gérée par le moteur) et les items associés sont les nombres de points d'expérience du joueur pour la quête.

Si vous faites référence à la quête principale, vous pouvez préciser "main" en premier argument, mais il est conseillé de ne rien mettre ce qui simplifie l'écriture. Autre chose, si vous renvoyez un évènement lié à une quête qui n'existe pas, la quête est créée automatiquement et initialisée à 0 point.

Un petit exemple :

def pnj(data, stat, entites, identifiant):
    coords = data[2], data[3]
    xp = data[0]
    
    if coords == (...):
        return "quete_annexe", {
            "base": [],
            1: [],
            ...
        }
    
    elif ...