Système de dresseurs répétables façon PokéNav de Rubis et Saphir

Discussion dans 'Tutos évent-making RPG Maker XP' créé par Amras Anárion, 18 Janvier 2020.

  1. Amras Anárion

    Amras Anárion Roi Mythique Membre du personnel Team Phoenix

    Mécanisme de dresseurs répétables à la RSE


    Compatibilité PSDK : Oui
    Compatibilité PSP : Non, mais une ruse permet de s'en rapprocher. (Confer post suivant.)

    Après un premier tuto sur un système de baies à la 2G, voici un second qui vous montrera comment créer des dresseurs répétables basé sur les mécanismes du PokéNav de Ruby, Saphir et Émeraude.

    Prérequis :

    • Autant d'évènements dresseurs que souhaités. Pour les rendre répétables, chaque dresseur devra impérativement avoir au moins 3 onglets :

    (Facultatif mais très courant) L'onglet n°1 en Processus parallèle qui permet de détecter le passage du joueur devant les yeux du PNJ (trainer_spotted). Si trigger, il active l'interrupteur local A.
    L'onglet n°2 en mode Automatique conditionné à l'interrupteur local A. C'est lui qui impose au joueur le combat. Si le PNJ est "amical" et ne propose un combat que si le joueur lui parle, cet onglet sera en "Touche action", rendant le premier en Processus Parallèle et l'usage de l'interrupteur local A inutiles. Si le dresseur est vaincu, l'interrupteur local B sera activé (ou A si dresseur amical). Facultativement, en cas de victoire du PNJ, vous pourrez activer l'interrupteur local C à la place de la désactivation du A si vous souhaitez qu'il vous propose une revanche amicalement dès votre retour.
    L'onglet n°3 en "Touche action" conditionné à l'interrupteur local B (ou A pour un dresseur amical). Cela correspond à la phase où le dresseur a été vaincu et fait son blabla "Je ne suis pas prêt de te réaffronter". Cet évent ne change aucun interrupteur local.
    L'onglet n°4 en "Touche action" conditionné à l'interrupteur local C. Cela correspond à la phase où le dresseur est prêt à vous réaffronter.

    • Un évènement "Processus Parallèle" sans sprite placé n'importe où sur votre map où il y a des dresseurs. (La commande clé utilisée offre ceci dit la possibilité de mettre cet évent PP sur une autre map que celle des dresseurs.)

    • Une variable dédiée pour vos tirages aléatoires...

    ... et c'est tout. C'est la force de cette fonctionnalité (et pourquoi il fut adopté pour les jeux GBA à Hoenn) : nul besoin de dédier un interrupteur global ou une variable pour chaque dresseur, ni de devoir faire à des variables de temps ou de timer.


    Préparation des dresseurs répétables :

    Par rapport à la procédure classique de la création d'un dresseur de PSDK, il n'y presque aucun changement à faire.
    La seule différence, c'est qu'il faudra créer un onglet de plus. (C'est déjà de base le cas sur les dresseurs exemples de PSDK où en cas de défaite du joueur, ils sont programmés pour proposer amicalement une revanche).
    Cet onglet servira à distinguer l'état du dresseur fraichement battu et pas prêt de se rebattre de celui prêt à prendre sa revanche et qui a déjà été affronté une fois. (Ce dernier point étant testé par l'activation de l'interrupteur local A.)

    ~ L'interrupteur local A, ou le marqueur que le dresseur a déjà été croisé une fois ~



    Oui, je le souligne, car c'est un point important. Sans cette petite précaution, l'onglet n°1 du dresseur pourrait se retrouver "court-circuité" par le script de sa répétabilité et ne plus engager le joueur de son propre chef lors de leur première rencontre. (Vous comprendrez pourquoi en fin de tuto.)
    (Normalement, c'est aussi le cas dans le cadre d'un dresseur "amical" qui propose le combat seulement si vous lui parlez : quel que soit l'issue du combat, l'interrupteur A sera lui aussi activé à la fin du match.)

    ~ Onglet du dresseur au repos ~



    Rien de compliqué... Ça correspond à l'état du dresseur fraichement battu et qui n'est pas chaud à l'idée de recombattre...

    ~ Onglet du dresseur paré à la revanche ~



    La particularité, c'est que cette onglet est activé grâce à l'Interrupteur Local C (le D dans mon image, car j'ai utilisé le C pour autre chose), interrupteur qui aura été activé grâce à un évènement externe. (On en viendra juste après.)

    Après avoir proposé le choix de la revanche, vous pouvez au choix :
    • (Mode flemme) Si le joueur répond "Oui" pour une revanche, désactiver l'interrupteur B comme j'ai fait, sans oublier de désactiver aussi l'Interrupteur local C ou D. (Sans ce détail, le dresseur voudra déjà se rebattre dès le combat fini.) Cela renverra alors directement sur l'Onglet n°2 automatique avec un combat identique au premier match.
    • Si le joueur répond "Oui" pour une revanche, faire suivre l'évent des commandes habituelles pour initier un combat de dresseur. Vous pourrez alors en profiter pour changer l'ID du dresseur, permettant ainsi de lui offrir une équipe plus forte que la première fois), voire des conditions pour proposer une équipe différente en fonction du nombre de badges possédés. (Mécanisme adopté dans Rubis et Saphir avec 3 ou 4 paliers pour le niveau de la revanche.)

    Dans les 2 cas, vous aussi pouvez être cash et ne même pas poser la question : dès l'interaction avec la touche action, le dresseur vous engage tout de suite au combat comme dans comme dans Rubis / Saphir.
    :confused: Voire jouer au maso et désactiver carrément via l'évent de reset du dresseur les interrupteur locaux B et A à la fois pour remettre le dresseur en mode "Trainer Spotted".

    Dans tous les cas, pensez à désactiver l'interrupteur local C (ou D) si la revanche se termine par une victoire du joueur.

    Astuce : Vous pouvez donner un indice visuel au joueur que ce PNJ est prêt à la revanche en changeant la direction de son regard, en faisant varier son orientation voir même en changeant son apparence. Aucune ressource supplémentaire ne sera consommée, l'apparence et la routine de l'évent étant géré indépendamment sur chaque onglet par RPG Maker.


    Évent de reset des dresseurs :



    On en vient au plus intéressant ! :cool: Pour ceux qui se posent la question, dans R/S/E, les dresseurs listés dans le PokéNav ont une chance (probabilité de l'ordre de 1/8) de passer en mode "prêts à combattre" dès que le joueur entre sur leur map. (D'où l'astuce de faire plein de va-et-viens à la frontière entre leur map et une voisine pour forcer les revanchards à recombattre.)
    On va donc imiter ce comportement de la GameBoy Advance en créant un évent "Processus Parallèle" qui ne s'enclenchera qu'une seule fois à chaque entrée sur la map, ce dernier point étant assuré par la commande d'event "Effacer cet évènement" tout à la fin.
    (Et surtout pas "Delete this event forever" : c'est la mort assurée de votre évent pour l'éternité sans possiblité de ressurection :confused: )

    Pour chaque dresseur répétable dont vous souhaitez donner une chance de reset, la structure sera toujours le même en sachant que tout tient sur un seul onglet :

    • Étape 1 : Tester la condition si l'interrupteur A du dresseur est activé.
    Condition : Script : get_self_switch("A",27,49) == true
    Ou plus optimisé : Condition : Script : get_self_switch("A",27,49) == true && get_self_switch("C",27,49) == false
    – "A" =l'interrupteur local activé lors de la première rencontre du dresseur
    – "C" = l'interrupteur local activé lorsque le dresseur est prêt à la revanche.
    – 27 = L'ID de l'évent de votre dresseur répétable.
    – 49 = L'ID de la map où se situe votre dresseur répétable.


    Cette commande permet d'éviter aux commandes qui vont suivre de s'exécuter si le dresseur n'a pas été croisé (épargnant le traitement de ces lignes de code), mais surtout au dit dresseur de ne pas avoir son interrupteur local "prêt à la revanche" activé alors qu'il n'a encore jamais croisé le regard du joueur. Les onglets d'évent étant classés par ordre croissant de priorité, celui lié à l'interrupteur local C ou D se retrouverait forcément exécuté avant le premier onglet du dresseur, celui du "trainer_spotted".
    Rajouter la seconde condition permet aussi aux commandes suivantes de ne pas être exécutées si le dresseur concerné est déjà prêt à la revanche. (Et d'éviter d'activer inutilement l'étape 2 avec son jet de dés.)
    Cette condition se fera sans "else", c'est-à-dire qu'il ne sera rien fait si l'une des conditions est fausse. (Sur la condition de l'évent, décocher la case "Excécuter autre chose si la condition n'est pas respectée".)

    • Étape 2 : Faire un tirage d'un nombre aléatoire
    Si les conditions testées ci-dessus donnent le feu vert, alors il devient utile de faire un petit jet de dés. Pour cela, on utilise sa variable dédiée qu'on rend égal à un nombre aléatoire compris entre un minimum et un maximum grâce à la commande d'évent dédiée.
    Variable [0118: Jet d'un D100] = Valeur aléatoire entre 1 et 100
    – [0118: Jet d'un D100] = Le n° et le libéllé de votre variable que vous dédierez pour votre tirage aléatoire.
    – Valeur aléatoire entre 1 et 100 : La fourchette de votre choix pour votre tirage aléatoire. (Si vous voulez une chance sur 4, vous pouvez très bien mettre "entre 0 et 3", que vous testerez à "Si égal 0" dans l'étape 3.)


    • Étape 3 : Tester le tirage d'un nombre aléatoire
    Condition : Variable [0118: Jet d'un D100] <= 30
    – <= 30 : Équivaut pour moi à 30 chances sur 100 que la condition soit bonne. À adapter selon votre probabilité souhaitée.
    Là aussi, cette condition se fera sans "else".

    • Étape 4 : Activer l'interrupteur local correspond à l'onglet de revanche du joueur.
    Script : set_self_switch(true,"C",27,49)
    – "C" = l'interrupteur local activé lorsque le dresseur est prêt à la revanche.
    – 27 = L'ID de l'évent de votre dresseur répétable.
    – 49 = L'ID de la map où se situe votre dresseur répétable.

    Ceci ne sera donc exécuté que si toutes les conditions précédentes ont été exaucées.

    Recommencer la procédure pour chaque dresseur réaffrontable. Copier-coller le fragment d'évent depuis la première condition accéléra beaucoup les choses : vous aurez juste qu'à modifier l'argument dans get/set_self_switch pour le faire correspondre à l'ID de l'évent du dresseur répétable suivant.

    Astuce : Si vous souhaitez que cet évent PP de map ne s'active qu'une fois un nombre de badges atteints (sur R/S/E, c'est à partir du 5ème badge), il vous suffira de cocher la case "La variable (Nom de Variable) est égale ou supérieure à x" (la variable étant celle liée à votre nombre de badge et x le nombre de badges requis).
    Si vous souhaitez appliquer cette restriction individuellement sur chaque dresseur, cochez cette même case sur l'onglet correspondant au stade où le dresseur veut sa revanche (là où l'interrupteur local C/D doit être activé.)

    Bonus : Le PokéNav (affichage de l'état du dresseur sur un menu)

    L'idéal serait à la manière de R/S/E d'avoir un menu où est affichés le statut "prêt à la revanche" de chaque dresseur.
    Il faudra alors coder un nouveau menu listant les dresseurs répétables croisés une fois et comprenant une suite de get_self_switch("arg1",arg2,arg3) (une ligne pour chaque dresseur répétable) qui si elle est vraie affchera une icône sur la ligne correspondant au dit dresseur. C'est gérable si le nombre de dresseurs répétable n'est pas trop élévés (les cartouches Rubis / Saphir comprenaient 69 dresseurs répétables), déconseillé si vous souhaitez rendre tous vos dresseurs répétables (Coucou Bugfix )
    Malheureusement c'est hors de mes compétences de script. Donc si quelqu'un veut expliquer comment créer un tel menu, je le linkerai avec plaisir.
     
    Dernière édition: 18 Janvier 2020
  2. Amras Anárion

    Amras Anárion Roi Mythique Membre du personnel Team Phoenix

    Pour PSP

    Pour les utilisateurs PSP
    , il existe une ruse pour profiter de cette fonctionnalité. Elle fera appel à divers interrupteurs (ou variables) + un onglet en processus parallèle sur chaque dresseur répétable qui s'enclenchera si l'interrupteur en question est vrai.

    Pré-requis :

    – 1 évent PP par map où des dresseurs répétables sont présents et qui proc qu'une fois par entrée (grâce à la commande "effacer cet évènement" tout à la fin)
    Au moins 1 variable temporaire servant pour le tirage aléatoire
    – De 1 à autant d'interrupteurs qu'il y a de dresseurs répétables sur votre map qui en possède le plus. (Ça peut fonctionner avec qu'un seul - dans ce cas là, tous les dresseurs seront reset ensemble. Fractionner les interrupteurs permet d'avoir des resets plus indépendants entre chaque dresseur répétable.)

    Dans l'évent "Processus parallèle" de la map qui proc qu'une seule fois par entrée sur une map...

    Tirer un nombre aléatoire pour votre ou vos variables aléatoires. (Plage à votre discrétion).
    • Créer plusieurs conditions qui permettent à l'un ou plusieurs de vos interrupteurs de passer sur "true" si la variable aléatoire a une certaine valeur ou plage de valeur.
    Attendre : 4 frames. (Cela laissera le temps aux dresseurs répétables de se réinitialiser si les conditions sont bonnes mais suffisamment peu pour qu'ils puissent être désactives si le joueur fait demi-tour tout de suite sur la map d'avant et ainsi éviter un exploit.)*
    • Remettre tous les switchs sur "false" et la variable random à 0.
    • Commande : Effacer cet évènement.

    * Il est possible d'éviter cet exploit en mettant une condition sur l'ensemble des lignes de commande "si Variable random différent de 0". Tant que cette variable n'aura pas été remis à zéro par le script de la map d'avant, celui de la nouvelle map sera mis en attente.

    Sur les évents de vos dresseurs répétables :

    Dans vos dresseurs répétables, un dernier onglet Processus parallèle qui aura comme condition d'activation :
    Interrupteur global X : activé (l'interrupteur global étant l'un qui peut être passé potentiellement en true par l'évènt de map PP)
    Interrupteur local A/B/C ou D : activé (l'interrupteur qui correspond à l'état du dresseur déjà battu - cela empêchera un reset sur un dresseur qui n'a pas encore été combattu.)

    Et l'évènement comprendra une unique ligne de commande : Interrupteur local A/B/C ou D : désactiver (pour remettre le dresseur dans son état d'alerte ou prêt à la revanche.)

    Activation des switchs globaux selon conditions multiples :

    Émettons que vous utilisez 4 switchs nommés 1, 2, 3 et 4 et tirez un chiffre aléatoire compris entre 1 et 8.
    - Si variable aléatoire =< 2, switch 1 activé (2 chance sur 8)
    - Si variable aléatoire = 3, switch 2 activé (1 chance sur 8)
    - Si variable aléatoire = 4, switch 3 activé (1 chance sur 8)
    - Si variable aléatoire =< 6, switch 4 activé (3 chances sur 8)
    (Donc aucun switch activé si = 5, puisqu'aucune des 4 conditions ne sera bonne).

    Puis à vos dresseurs répétables, la switch conditionnel lié au l'onglet de reset sera :
    • Le switch 2 et 3 si vous voulez 1 chance sur 8 de reset.
    • Le switch 1 si vous voulez 2 chance sur 8 de reset.
    • Le switch 3 si vous voulez 3 chance sur 8 de reset.

    (Avec qu'un seul switch, un seul test conditionnel suffira, mais tout reset de dresseur répétable sera linké - c'est tout ou rien.)

    Inconvénients par rapport à la mécanique PSDK :
    (Du fait de l'absence d'une commande permettant de modifier à distance l'interrupteur local d'un autre évent)

    • si des dresseurs d'une même map partagent le même switch global d'activation, leur reset sera linké.
    • Au moins de complexifier les tests conditionnels (utilisation d'une seconde variable calculée sur la première avec une opération modulo), le tirage est fait sans remise. Seul un seul switch sera activé par entrée en map (donc une seule partie des dresseurs sera potentiellement resetée par passage).

    Vous pouvez utiliser n'importe quelle comparaison mathématique : inférieur, supérieur, strictement égal... Vous pouvez même utiliser une seconde variable temporaire utilisée pour vos tests conditionnels qui dépendra d'une opération mathématique faite à partir de la première variable, tel que modulo, division. Le but est de tenter d'avoir un résultat le plus aléatoire possible sur vos switchs.
     
    Dernière édition: 18 Janvier 2020