Système de baies à la 2G avec horloge interne et saisons

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

  1. Amras Anárion

    Amras Anárion Roi Mythique Membre du personnel Team Phoenix

    Hello,

    Après avoir fait parti des Padawans demandant enseignement en Making, il est désormais temps pour moi de passer du côté Jedi et de commencer à partager mon savoir dans ce domaine.

    Ce premier tuto vous montrera comment instaurer un système de Baies & Noigrumes à la 2G en utilisant les OW de base des baies (autant profiter des avancées graphiques de la 4G) tout en gérant les saisons façon 5G.

    Le résultat :
    --- Compatible PSP et PSDK --- (car full Event-making)




    Prérequis :

    ~ Partie Horlogerie ~

    Un système d'horloge interne (aka une variable "Secondes" ou "Tick" qui s'incrémente de 1 à chaque boucle du script et qui retombera à 0 au bout d'une valeur qui déterminera la vitesse de défilement du temps in-game).
    Deux variables "Minutes" et "Heure" qui retomberont à zéro lorsqu'elles auront atteint respectivement 60 et 24.
    • Si vous gérez les saisons, il faudra en plus rajouter à minima deux variables "Jour du mois" et "Mois" (qui retomberont à 1 dès que le nombre maximum de jours par mois ou de mois par année est dépassé de 1.) + une troisième variable "Saison" si le nombre de mois est différent du nombre de saisons.
    • Au moins une variable dédiée au nombre de minutes / heures / jours écoulées selon la précision avec laquelle vous souhaitez que vos plantes croissent. Contrairement aux variables "Minutes" et "Heure" qui reviennent de manière cyclique à 0, cette variable ne fera que croitre. C'est en quelque sort le cumul du temps écoulé.
    • Si vous gérez les saisons : 4 Interrupteurs (nombre à ajuster selon votre nombre de saisons) qui permettront de gérer avec plus de finesse les onglets d'évent.
    Un Event Commun dédié à toute cette horlogerie qui sera activé en Processus Parallèle selon un Interrupteur "Calendrier activé".

    ~ Partie Baies ~

    Une Variable dédiée par Arbre à Baie / Noigrumier / Herbe récoltable.
    Un Event "Touche Action" dédié par Arbre à Baie / Noigrumier / Herbe récoltable.
    Un Event "Processus Parallèle" dédié par Arbre à Baie / Noigrumier / Herbe récoltable et qui sera sur la même map que l'Event "Touche Action" correspondant.
    Une spritesheet 4x4 pour chaque plante différente. Voici celle de mon Noigrumier blanc :

    (Les 4 lignes représentent respectivement : arbre en hiver / arbre tout juste récolté / arbre en fleur / arbre prêt à la récolte.)

    À noter que ce mécanisme peut s’utiliser aussi pour un système de quêtes ou de dresseurs répétables se réinitialisant après un timer défini.


    Implémentation de l'Horloge interne :

    Créer un Évent commun comme suit :



    En toute dernière ligne, rajouter une commande "Attendre : 1 frame". (Ça permet de reposer le script.)

    Pour ma part, comme j'ai fait un système complet de calendrier en parallèle de la pousse des baies, j'ai dédié plusieurs variables et interrupteurs :
    • Six variables pour les Ticks (secondes) / Minutes / Heures / Jours / Mois (confondu avec les saisons chez moi) / Année
    • Deux variables "Minutes écoulées" et "Jours écoulés". Pour les baies, souhaitant une réinitialisation à minuit dans le pur style Or et Argent, c'est cette variable que j’appellerai. Si vous préférez un timer sur une durée "glissante" (cooldown), vous utiliserez votre variable "Minutes écoulées" (en sachant que 1 jour = 1440 minutes).
    • Un interrupteur pour activer l'évent-commun (le n°105 pour moi).

    !!! Tous les n° de Variables et Interrupteurs sont à ajuster selon les vôtres !!! Ne recopiez pas aveuglément. :)

    Vous noterez que pour les unités de temps supérieures à la seconde, j'ai utilisé une commande "Soustraire de 60" (pour les minutes) / "Soustraire de 24" (pour les heures), etc... au lieu d'une commande de style "Si minutes (heures) supérieures ou égales à 60 (24), les mettre à 0" Ceci afin de ne pas dérégler l'horlogerie lorsque j’appellerai des évènements de type "Nuit à l'auberge" ou "Voyage dans le temps". (Car oui, c'est l'un des grands avantages d'une horloge interne : il devient possible d'agrémenter son scénario par des actions qui font écouler le temps.)

    Concernant mon calendrier kelte (plus d'info sur ce topic), il est très simple :
    • 60 minutes = 1 heure
    • 24 heures = 1 jour
    • 6 jours = 1 semaine
    • 30 jours = 5 semaines = 1 mois = 1 saison (comme à Unys pour le lien mois = saison)
    • 4 mois = 4 saisons = 1 année
    Ainsi, mes jours de semaines tombent toujours au mêmes jours de mois (30 est un multiple de 6) et tous les mois et années font exactement le même nombre de jours (30 et 120 respectivement). Cela simplifiera pas mal de choses pour la gestion des saisons et leur procession (durée du jour / nuit différent selon moment de l'année comme dans Pokémon Black & White).


    Implémentation des saisons (facultatif) :
    (Deux variables pour le n° de jour et le n° du mois en cours sont requis.)

    Vous pouvez soit rajouter ceci à la suite de votre évent (ou dans autre évent commun avec les mêmes conditions de déclenchement) :



    Soit insérer ce script directement à la suite de l'évent. Copiez le contenu de :
    Ce Script interrupteur saisons pour avoir la gestion simple des saisons (4 saisons)
    Ou ce script interrupteur & procession des saisons pour avoir la gestion des saisons et en plus une variable permettant de définir la procession des saisons. (Il faudra régler vos tons via un autre script en appelant la nouvelle variable paramétrée. Voici le mien : Lien du script)
    Bonus : Pour gérer les formes saisonières de Vivaldaim et Haydaim : Lien du script

    ! Comme d'habitude, tous les n° de Variables et Interrupteurs sont à ajuster selon les vôtres !

    Voilà, votre Horloge Interne (du moins, tout ce qui est nécessaire pour les baies) est désormais prête ! Il est temps d'aller sur vos maps pour planter vos arbres à travers des Events !


    Implémentation des plantes (baies, noigrumes, herbes médicinales...) sur la map :

    Créer un Événement "Touche Action" comme suit à l'endroit où vous souhaitez planter un arbre. Pour un arbre à Baies Oran, ça donnera ceci :



    Cet évent gère l'aspect "stade de pousse" de la plante et peut donc fonctionner seul (mais l'apparence de l'arbre ne sera pas mis à jour automatiquement sans son second évent "Processus Parallèle").

    Afin de modifier automatiquement l'apparence de l'arbre en fonction de son stage de poussée, on n'oubliera donc pas de lui associer un Event Processus Parallèle que j'ai nommé "Scheduler - Baie x" (x étant le numéro de l'arbre)
    !!! Cochez bien "Direction fixe" sur les deux évents pour éviter un changement inopiné d'apparence de l'arbre au moment de lui "parler" !!!





    L'évent est court et tient de base sur un seul onglet.
    Si les saisons sont gérées et que la vitesse de pousse diffère, il faudra rajouter autant d'onglets qu'il y a de cas différents avec leurs conditions adéquates. Dans cet exemple : deux onglets avec le second qui est vide avec comme condition "Interrupteur Hiver : activé" afin de désactiver le scheduler en hiver).
    Pensez juste à synchroniser les timers avec l'évent en "Touche action". Ça serait débile d'avoir un arbre visuellement mûr alors que les baies ne sont pas encore prêtes (ou inversement).
    J'ai rajouté un "Attendre : 20 Frames" à la fin, car une actualisation de cet évènement 2 ou 3 fois par seconde suffit amplement.

    ~ Ressources utilisées ~
    • La variable 1001 pour la poussée de cette arbre
    • La variable 112 gérant le nombre de jours écoulées (donc une mise à jour à minuit vu que j'incrémente selon des jours écoulés)
    • La spritesheet de l'Arbre Oran.
    • Facultatif : un mugshot de baie Oran (ça, c'est parce que je veux comme ça pour mon fan-game^^)


    Comment ça marche ?

    Lorsqu'il est récolté, la variable liée à l'arbre est fixée à la même valeur que le nombre de jours, heures ou minutes écoulés depuis le début de votre partie. C'est en quelque sorte le "Timestamp" de votre plante.
    Puis le temps va s'écouler et donc la variable "Temps écoulé depuis le début" va augmenter, tandis que le Timestamp restera fixe tant qu'il n'y aura pas récolte. Il suffira de comparer en différence ces deux variables pour en déduire le stade de l'arbre.

    Néanmoins, les conditions sur variable n'offrent pas une précision suffisante en commande d'Event-Making. Il faudra donc passer par une condition scriptée. La ligne à insérer sera toujours de cette forme :

    Code:
    Condition : Script : $game_variables[1001] +1 > $game_variables[112]
    (Lignes d'évents pour le stade 1 de la plante...)
    Sinon
    Condition : Script : $game_variables[1001] +1 > $game_variables[112]
    (Lignes d'évents pour le stade 2 de la plante...)
    Sinon
    etc...
    Où :
    • 1001 correspond au numéro de variable dédiée à votre arbre
    • 112 correspond à votre variable utilisée pour déterminer le temps écoulé depuis le début
    • "+1 / + 2, etc" le nombre d'unités de temps qui doivent s'être écoulées selon celle utilisée dans la variable précédente
    Dans cet exemple : des jours sous la variable n°112, ce qui donne donc "Si moins de 1 jour écoulé, stade sans fleurs de la Baie. Sinon et si moins de 2 jours écoulés, stade fleur, etc...".

    Au début, toutes les conditions sont vraies, donc seule la première s'exécute (vu qu'il y a une succession de "sinon"), ce qui correspond au stade 1 de la plante. Puis au fur et à mesure que la variable "temps écoulé (112)" va croitre, les conditions les plus en amont deviendront fausses les une après les autres, permettant de descendre la cascade conditionnelle et donc de déterminer le stade de croissance de la plante. Et si toutes sont fausses – signe que le maximum de temps s'est écoulé – le dernier "sinon" sera exécuté et la plante aura la récolte maximale.

    Lorsque l'arbre est récolté, son timestamp est réaligné sur le temps écoulé, le réinitialisant au stade 1. La commande "Déplacer cet évènement : apparence" permet d'avoir le changement d'apparence synchronisé avec la récolte. C'est une commande facultative, car purement esthétique. (Sans cela, l'apparence de l'arbre sera mis à jour avec environ une demi-seconde de retard.)

    Le temps entre chaque stage est entièrement paramétrable, et vous pouvez même mixer des périodes différentes d'un arbre à un autre.
    Pour créer un nouvel arbre, il suffira juste :
    • De copier cet évènement
    • De le coller
    • D'en faire de même avec l'évènement Processus parallèle attitré (copier l’Évent PP puis coller en tant que nouvel évent lui aussi en PP)
    • Sur les 2 évents jumelés : remplacer toutes les variables du précédent arbre par celle de votre nouvel arbre + éventuellement ajuster la durée entre chaque stage si celle-ci diffère.
    • Sur les 2 évents jumelés : De remplacer les apparences si l'espèce végétale est différente.
    • Modifier les textes de récolte si l'espèce récoltée ou si les récoltes pour un même temps écoulé diffèrent.


    Gestion des saisons sur l'arbre (facultatif) :

    Si vous souhait est d'avoir des récoltes plus ou moins rapides ou abondantes selon la saison en cours, c'est très facile, déroulez le spoiler :

    Mon onglet Event en Été, avec l'interrupteur adéquat en condition :



    Mon onglet Event en Hiver, avec l'interrupteur adéquat en condition :



    Si la plante produit selon les mêmes mécanismes que dans une saison classique, copiez le premier onglet, collez en tant que nouvel onglet et ajustez délai, nombre de fruits récoltés et textes de récolte.

    Si vous souhait est de stopper la pousse de l'arbre (en hiver par exemple), changez l'apparence de l'évent par la plante en apparence hivernale et mettez une simple ligne de texte du style "Les plantes ne produisent rien en hiver." sans oublier de créer un second onglet vide sur le scheduler (onglet assorti de l'interrupteur "hiver" pour s'activer) afin de le neutraliser.

    Bonus : le voyage dans le temps !

    Si vous instaurez des events du genre voyage dans le temps ou nuit à l'auberge, voici la forme que devront prendre vos modifications de variables selon le choix fait par le joueur :



    Augmentant directement l'heure du calendrier à travers mon évent, il faut donc que je rajoute autant de minutes à la variable "minutes écoulées (depuis le début)" 60 fois que j'ai rajouté d'heures.
    En effet, la variable "minutes écoulées" dépend de l'incrémentation de la variable "Tick / secondes" pour se mettre à jour dans l'évent commun et se retrouverait donc court-circuitée sans cette précaution.*
    Même remarque lorsque mon évent fait sauter des jours entiers. Ici, je dois incrémenter manuellement les "minutes écoulées (depuis le début)" et les "jours écoulés (depuis le début)" de la bonne valeur pour éviter tout déphasage entre "la date calendrier" et "la date temps écoulé depuis le début".
    * Après, rien ne vous empêche de ne volontairement pas modifier cette variable mais juste celle du calendrier afin d'éviter un exploit à la "j'enchaine les nuits à l'auberge pour m'enchainer les quêtes répétables et récoltes", le calendrier ne faisant pas appel aux mêmes variables.

    Une fois cette petite précaution prise, votre PNJ test de voyage dans le temps vous permettra d'admirer la poussée des baies quasi instantanément (et donc tester si tout fonctionne bien).
     
    yyyyj et Bugfix aiment ça.
  2. yyyyj

    yyyyj Dresseur reconnu

    Je verrai pour passer ça en script quand j'aurais le temps et la motivation. merci à toi d'avoir recopié ce tutoriel comme à l'origine :-).
     
  3. Amras Anárion

    Amras Anárion Roi Mythique Membre du personnel Team Phoenix

    Figures toi que je vais encore optimiser mon système de baies (la partie des arbres - celles de l'horlogerie ne changera pas), en faisant jouer 3 des atouts de PSDK :
    • Appel sur les CSV pour internationaliser les textes.
    • Utilisation de l'appel d'un CSV dans une variable temporaire pour intégrer à mes "phrases globales" le nom de ce qui est récolté.
    • Utilisation de la commande script permettant de changer l'interrupteur local d'un autre évènement. (Changer l'apparence d'un évent en modifiant l'onglet actif est plus optimisé).

    Mais à noter que cette v1 – qui est full Event making est compatible PSP – donc je laisserai cette version disponible.