Sujet n°1409
Posté par Sphinx le 4 Aoû - 01:57 (2008)
Titre : [Tuto] Récapitulatif : Evolutions de pokémons
Evolution par niveau / sexe par by Drakhaine
Dans le script Pokemon, ajoutez avant :
Code:

        # Evolution naturelle
        if evolve_list[i][1].type == Fixnum and @level >= evolve_list[i][1]
          name = evolve_list[i][0]
          id = id_conversion(name)
          return id
        end


ceci :
Code:

        #Evolution par niveau / sexe
        if evolve_list[i][1] == "niveausexe"
          if @level == evolve_list[i][2][0] and @gender == evolve_list[i][2][1]
            name = evolve_list[i][0]
            id = id_conversion(name)
            return id
          end
        end


@gender est égal à 1 si le pokémon est un mâle et à 2 si c'est une femelle.

puis, dans le fichier datta_pokemon.txt, pour permettre à un pokémon d'évoluer en fonction de son sexe & niveau, insérez la commande d'évolution suivante :
Code:

["{NOM DE L'EVOLUTION}", "niveausexe", [{NIVEAU}, {SEXE}]]


exemple avec CHENITI qui peut évoluer en CHENISELLE au lv20 si c'est une femelle :
Code:

["CHENISELLE", "niveausexe", [20,2]]

Evolution par l'apprentissage d'une attaque by Drakhaine
Dans le script Pokemon, ajoutez avant :
Code:

        # Evolution naturelle
        if evolve_list[i][1].type == Fixnum and @level >= evolve_list[i][1]
          name = evolve_list[i][0]
          id = id_conversion(name)
          return id
        end


ceci :
Code:

        if evolve_list[i][1] == "attaque"
          id = $skill.id(evolve_list[i][2])
          if skills.include?(id)
            name = evolve_list[i][0]
            id = id_conversion(name)
            return id
          end
        end


puis, dans le fichier data_pokemon.txt, pour permettre à un pokémon d'évoluer grâce à l'apprentissage d'une attaque, insérez la commande d'évolution suivante :
Code:

["{NOM DE L'EVOLUTION}", "attaque", "{NOM DE L'ATTAQUE}"]


exemple avec EXCELANGUE qui peut évoluer en COUDLANGUE s'il apprend ROULADE :
Code:

["COUDLANGUE", "attaque", "ROULADE"]

Evolution par loyauté / période by Drakhaine
Dans le script Pokemon, ajoutez avant :
Code:

        # Evolution naturelle
        if evolve_list[i][1].type == Fixnum and @level >= evolve_list[i][1]
          name = evolve_list[i][0]
          id = id_conversion(name)
          return id
        end


ceci :
Code:

        if evolve_list[i][1] == "loyalperiode"
          if $time != nil
            if @loyalty > 220 and $time.dn == evolve_list[i][2]
              name = evolve_list[i][0]
              id = id_conversion(name)
              return id
            end
          end
        end


puis, dans le fichier data_pokemon.txt, pour permettre à un pokémon d'évoluer en fonction de son bonheur et de la période, insérez la commande d'évolution suivante :
Code:

["{NOM DE L'EVOLUTION}", "loyalperiode", "{PERIODE}"]


exemple avec KORILLON qui peut évoluer en EOKO s'il est heureux la nuit :
Code:

["EOKO", "loyalperiode", "Nuit"]


/!\ Attention, ce script nécessite une adaptation selon votre moyen de gestion des heures dans votre jeu ! /!\

Pour le script de MoussPSP, il faut remplacer $time et $time.dn par $game_variables[VarNuitJour] (remplacez VarNuitJour par le numéro de la variable correspondante dans le script Temps réel) et il faut remplacer {PERIODE} par une valeur de la variable VarJourNuit, à savoir Matin, Jour, Crépuscule et Nuit pour le script de base.

Pour le système de Pokémon Graph DP, il faut ajouter avant :
Code:

          if $time != nil


ceci :
Code:

          if $game_switches[30]
            @periode_jour = "Matin"
          elsif $game_switches[31]
            @periode_jour = "Jour"
          elsif $game_switches[32]
            @periode_jour = "Soir"
          elsif $game_switches[33]
            @periode_jour = "Nuit"
          else
            @periode_jour = ""
          end


@periode_jour contient donc la période de la journée. C'est ce qui va nous servir pour la suite. Après remplacez :
Code:

$time != nil


par :
Code:

@periode_jour != ""



et :
Code:

$time.dn


par :
Code:

@periode_jour


Ensuite, dans le fichier data_pokemon.txt, {PERIODE} devra être remplacé par l'une des 4 valeurs possibles de @periode_jour, à savoir Matin, Jour, Soir et Nuit.


Pour tout autre système, il me faudrait l'étudier pour dire, et en l'état actuel il se fait tard et je n'ai pas retrouvé d'autres systèmes présentés sur ce board (pourtant il y en a au moins un autre xD)

Evolution par objet tenu / période by Drakhaine
Dans le script Pokemon, ajoutez avant :
Code:

        # Evolution naturelle
        if evolve_list[i][1].type == Fixnum and @level >= evolve_list[i][1]
          name = evolve_list[i][0]
          id = id_conversion(name)
          return id
        end


ceci :
Code:

        if evolve_list[i][1] == "objettenuperiode"
          if $time != nil
            id = $item.id(evolve_list[i][2][0])
            if @item_hold == id and $time.dn == evolve_list[i][2][1]
              name = evolve_list[i][0]
              id = id_conversion(name)
              return id
            end
          end
        end


puis, dans le fichier data_pokemon.txt, pour permettre à un pokémon d'évoluer en fonction de l'objet qu'il tient et de la période, insérez la commande d'évolution suivante :
Code:

["{NOM DE L'EVOLUTION}", "objettenuperiode", ["{NOM DE L'OBJET}", "{PERIODE}"]]


exemple avec PTIRAVI qui peut évoluer en LEVEINARD s'il tient une PIERRE OVALE quand il est heureux
Code:

["LEVEINARD", "objettenuperiode", ["PIERRE OVALE","Jour"]]


/!\ Attention, ce script nécessite une adaptation selon votre moyen de gestion des heures dans votre jeu ! /!\

Pour le script de MoussPSP, il faut remplacer $time et $time.dn par $game_variables[VarNuitJour] (remplacez VarNuitJour par le numéro de la variable correspondante dans le script Temps réel) et il faut remplacer {PERIODE} par une valeur de la variable VarJourNuit, à savoir Matin, Jour, Crépuscule et Nuit pour le script de base.

Pour le système de Pokémon Graph DP, il faut ajouter avant :
Code:

          if $time != nil


ceci :
Code:

          if $game_switches[30]
            @periode_jour = "Matin"
          elsif $game_switches[31]
            @periode_jour = "Jour"
          elsif $game_switches[32]
            @periode_jour = "Soir"
          elsif $game_switches[33]
            @periode_jour = "Nuit"
          else
            @periode_jour = ""
          end


@periode_jour contient donc la période de la journée. C'est ce qui va nous servir pour la suite. Après remplacez :
Code:

$time != nil


par :
Code:

@periode_jour != ""


et :
Code:

$time.dn


par :
Code:

@periode_jour


Ensuite, dans le fichier data_pokemon.txt, {PERIODE} devra être remplacé par l'une des 4 valeurs possibles de @periode_jour, à savoir Matin, Jour, Soir et Nuit.


Pour tout autre système, il me faudrait l'étudier pour dire, et en l'état actuel il se fait tard et je n'ai pas retrouvé d'autres systèmes présentés sur ce board (pourtant il y en a au moins un autre xD)

Evolution par fusion de deux pokémons by Drakhaine
Dans le script Pokemon, ajoutez avant :
Code:

        # Evolution naturelle
        if evolve_list[i][1].type == Fixnum and @level >= evolve_list[i][1]
          name = evolve_list[i][0]
          id = id_conversion(name)
          return id
        end


ceci :
Code:

        if evolve_list[i][1] == "fusion"
          if $pokemon_party.got_pokemon(evolve_list[i][2])
            name = evolve_list[i][0]
            id = id_conversion(name)
            return id
          end
        end


puis, dans le fichier data_pokemon.txt, pour permettre à un pokémon d'évoluer en fusionnant avec un autre pokémon, insérez la commande d'évolution suivante :
Code:

["{NOM DE L'EVOLUTION}", "fusion", {ID du pokémon fusionné}]


exemple avec BABIMANTA qui peut évoluer en DEMANTA si un REMORAID est dans l'équipe :
Code:

["DEMANTA", "fusion", 223 ]

Evolution par stats by Drakhaine
Dans le script Pokemon, ajoutez avant :
Code:

        # Evolution naturelle
        if evolve_list[i][1].type == Fixnum and @level >= evolve_list[i][1]
          name = evolve_list[i][0]
          id = id_conversion(name)
          return id
        end


ceci :
Code:

        data1 = [] # Contiendra toutes les conditionnelles dans l'ordre
        data2 = [] # Contiendra toutes les valeurs dans l'ordre
        for stat in 0...evolve_list[i][2].size
          data1[stat] = evolve_list[i][2][stat].split(' ')[0].to_s # Contient la conditionnel en String
          data2[stat] = evolve_list[i][2][stat].split(' ')[1].to_i # Contient la valeur en FixNum
        end
          table = [@hp,@atk,@def,@spd,@ats,@dfs]
          for i in 0...data1.size
            if data1[i] == ">="
              if table[i] >= data2[i]
                next
              else
                break
              end
            elsif data1[i] == "=="
              if table[i] == data2[i]
                 next
               else
                 break
               end
            elsif data1[i] == "<="
               if table[i] <= data2[i]
                  next
                else
                  break
                end
            elsif data1[i] == "<"
                if table[i] < data2[i]
                   next
                 else
                   break
                 end
            elsif data1[i] == ">"
                if table[i] > data2[i]
                   next
                 else
                   break
                 end
            else
              break
            end
            name = evolve_list[i][0]
            id = id_conversion(name)
            return id
          end
          return false


puis, dans le fichier data_pokemon.txt, pour permettre à un pokémon d'évoluer selon ses statistiques, insérez la commande d'évolution suivante :
Code:

["{NOM DE L'EVOLUTION}", "stats", ["{HP}", "{ATK}", "{DFE}", "{SPD}", "{ATS}", "{DFS}"]]


les valeurs entre {} sont à remplacer par un opérateur conditionnel (==, >=, <=, >, <) et une valeur qui correspond au comparé.
HP correspond aux PVs
ATK correspond à l'attaque
DFE correspond à la défense
SPD correspond à la vitesse
ATS correspond à l'attaque spéciale
DFS correspond à la défense spéciale

Etant donné qu'aucun pokémon des 4 premières générations n'évolue par stats (ce système ne permet pas de faire évoluer DEBUGANT !) je vais donner un exemple fictif :
Code:

["TESTA", "stats", ["> 0", "> 0", "> 200", "< 100", "> 0", ">= 300"]]

Ce pokémon évoluera en TESTA si les 3 conditions sont remplies :
sa défense est strictement supérieure à 200
sa vitesse est strictement inférieure à 100
sa défense spéciale est supérieure ou égale à 300

les "> 0" sont là uniquement pour combler le vide... En effet, toutes les stats seront toujours supérieures à 0 ^_^

Code:

        data1 = [] # Contiendra toutes les conditionnelles dans l'ordre
        data2 = [] # Contiendra toutes les valeurs dans l'ordre

Cette partie sert à créer 2 tableaux, "data1" et "data2".

Code:

        for stat in 0...evolve_list[i][2].size
          data1[stat] = evolve_list[i][2][stat].split(' ')[0].to_s # Contient la conditionnel en String
          data2[stat] = evolve_list[i][2][stat].split(' ')[1].to_i # Contient la valeur en FixNum
        end

Cette boucle (car la méthode for sert à faire une boucle) sert à intégrer les données dans le tableau précédemment créé. La valeur "> 0" (comme toutes les valeurs contenues dans ce second niveau de crochets) est coupée en 2 au niveau de l'espace. Ainsi on obtient ">" qui est enregistré tel quel dans "data1" et "0" qui est d'abord converti en nombre (0) puis enregistré dans "data2".

Code:

          table = [@hp,@atk,@def,@spd,@ats,@dfs]

Une fois que la boucle a traité les 6 statistiques du second niveau de crochets, le bout de code ci dessus enregistre dans un nouveau tableau, "table", les 6 stats du pokémon qui évolue.

Code:

            if data1[i] == ">="
            elsif data1[i] == "=="
            elsif data1[i] == "<="
            elsif data1[i] == "<"
            elsif data1[i] == ">"

Ces 5 conditionnelles (notez que j'ai retiré ce qu'il y avait avant entre et après ces lignes) servent à tester "data1", le premier tableau qui contient les opérateurs de conditions un peu plus haut. Le sert de variable à la boucle
Code:

          for i in 0...data1.size
qui encadre ces lignes.

Code:

              if table[i] >= data2[i]
                next
              else
                break
              end

Pour chaque opérateur de conditionnelle, on retrouve ce même schéma, avec pour seule différence ceci :
Code:

>=
qui est remplacé par l'opérateur de condition contenu dans "data1". table représente la valeur de la stat testée. data2 représente la valeur comparée à la stat du pokémon. Dans le cas de "> 0", ca signifie que si la stat est supérieure à 0, le système continue et vérifie la stat suivante ("next"). Dans le cas contraire (ici si la stat était inférieure ou égale à 0 donc ne serait pas supérieure à 0) alors les vérifications s'arrêteraient ("break") et l'évolution n'aurait pas lieu.

Code:

            name = evolve_list[i][0]
            id = id_conversion(name)
            return id

"name" représente le nom de l'évolution du pokémon. "id_conversion(name)" sert à extraire l'ID du dit pokémon. "return id" sert juste à renvoyer la valeur qui sera utilisée pour l'évolution, ici l'ID de l'évolution du pokémon.

Evolution par saison by Empire1601 & Krosk
Dans le script Pokemon, ajoutez avant :
Code:

        # Evolution naturelle
        if evolve_list[i][1].type == Fixnum and @level >= evolve_list[i][1]
          name = evolve_list[i][0]
          id = id_conversion(name)
          return id
        end


ceci :
Code:

        # Evolution par saison
        if evolve_list[i][1] == "saison"
          if Time.now.month >= 6 and Time.now.month < 9 # si le jeu se déroule en été
            saisonloc = "ete"
            end
          if Time.now.month >= 9 and Time.now.month < 12 # si le jeu se déroule en automne
              saisonloc = "automne"
                 end
          if Time.now.month >= 1 and Time.now.month < 3 # si le jeu se déroule en hiver
              saisonloc = "hiver"
                 end
          if Time.now.month >= 3 and Time.now.month < 6 # si le jeu se déroule au printemps
              saisonloc = "printemps"
          end
          if @level == evolve_list[i][2][0] and saisonloc == evolve_list[i][2][1]
            name = evolve_list[i][0]
            id = id_conversion(name)
            return id
          end
        end


puis, dans le fichier data_pokemon.txt, pour permettre à un pokémon d'évoluer selon la saison, insérez la commande d'évolution suivante :
Code:

["{NOM DE L'EVOLUTION}", "saison", "{NOM DE LA SAISON}"]

Ce système (autonome) se base sur l'heure réelle de Windows (en en extrayant les mois) et selon le mois, ce système interprète la saison. Etant donné qu'aucun pokémon des 4 premières générations n'évoluant par saison, l'exemple qui suit est fictif :
Code:

["TESTA", "saison", "ete"]

Ce pokémon évoluera en TESTA s'il évolue entre Juin et Aout (inclus)

Evolution aléatoire par niveau v1.0 by Sphinx
Dans le script Pokemon, ajoutez avant :
Code:

        # Evolution naturelle
        if evolve_list[i][1].type == Fixnum and @level >= evolve_list[i][1]
          name = evolve_list[i][0]
          id = id_conversion(name)
          return id
        end


ceci :
Code:

        # Evolution aleatoire
        if evolve_list[i][1] == "aleatoire" and @level >= evolve_list[i][2]
          if @evo_calculee == false or @evo_calculee == nil
            @evoalea = rand(evolve_list[i][0].size)
            @evo_calculee = true
            @name = evolve_list[i][0][@evoalea]
            @evo_compteur = 0
          elsif @evo_calculee == true and @evo_compteur >= 1
            @evo_calculee = false
          else
            @evo_compteur += 1
          end
          name = @name
          id = id_conversion(name)
          return id
       end


puis, dans le fichier data_pokemon.txt, pour permettre à un pokémon d'évoluer aléatoirement, insérez la commande d'évolution suivante :
Code:

[["{NOM DE L'EVOLUTION 1}", "{NOM DE L'EVOLUTION 2}", ..., "{NOM DE L'EVOLUTION N}"], "aleatoire", {NIVEAU}]


Etant donné qu'aucun pokémon des 4 premières générations n'évoluant par saison, l'exemple qui suit est fictif :
[["YANMA", "YMPHECT", "RAIKOU", "CHENIPAN", "ASPICOT", "ENTEI", "MELODELFE", "ONIX", "MALOSSE", "MEDHYENA"], "aleatoire", 20]
Ce pokémon aura donc une chance sur 10 d'évoluer en YANMA, autant d'évoluer en CHENIPAN. Le système se contente de sélectionner au hasard un des pokémons qui se trouve dans le premier sous crochet. Vous pouvez ajouter / enlever autant de pokémons que vous le souhaitez, le tout est qu'il y ait au minimum un pokémon. Enfin 2 pour que l'évolution soit aléatoire.
Le principe de l'évolution aléatoire est simple, elle sert à faire évoluer un pokémon en une forme sélectionnée au hasard parmi plusieurs disponibles dans la commande d'évolution.

Code:

@evoalea = rand(evolve_list[i][0].size)

@evoalea contient donc une valeur aléatoire comprise entre 0 et le nombre d'évolutions possibles - 1 (et ce, quelque soit le nombre d'évolutions possibles, qu'il y en ait 2 ou 500.) Cela est possible grace à la fonction size qui, appliquée à la liste des évolutions possibles (evolve_list[0]), renvoie le nombre de termes de la liste. Dans l'exemple fictif donné au dessus, il y en a 10.

L'évolution aléatoire pose cependant un lourd problème qu'aucune autre forme d'évolutions ne pose. En effet, le script d'évolution est lu 3 fois (2 fois avant l'animation de l'évolution et une fois après) aussi un random n'avait qu'une chance sur 4 de ressortir 3 fois la même valeur (et ce, quelque soit le nombre de pokémons possibles). Aussi, sans un moyen de contourner ce problème, la première lecture aurait pu faire ressortir un YANMA, la seconde un RAIKOU (que l'animation aurait alors affiché) et enfin la dernière lecture un ONIX (qui serait apparu dans l'équipe). Ce qui posait ensuite un problème de cohérence... Ce sont les lignes ci-dessous qui servent à enrayer ce soucis :

Code:

          if @evo_calculee == false or @evo_calculee == nil
            @evoalea = rand(evolve_list[i][0].size)
            @evo_calculee = true
            @name = evolve_list[i][0][@evoalea]
            @evo_compteur = 0
          elsif @evo_calculee == true and @evo_compteur >= 1
            @evo_calculee = false
          else
            @evo_compteur += 1
          end

@evo_compteur compte le nombre de lecture, @evo_calculee renvoie true dès lors que le random a été lu.

Code:

          if @evo_calculee == false or @evo_calculee == nil

cette ligne sert à tester si @evo_calculee est désactivé (false) ou inexistant (nil) auquel cas cela indique que l'évolution n'a pas encore été sélectionnée. Une fois le rand calculé, @evo_calculee est activé (true) et le compteur @evo_compteur est mis à 0. Le script a fait sa première lecture.
Seconde lecture, @evo_calculee = true et @evo_compteur = 1. Aussi ces paramètres ne répondent ni à la conditionnelle
Code:

          if @evo_calculee == false or @evo_calculee == nil
ni à la conditionnelle
Code:

          elsif @evo_calculee == true and @evo_compteur >= 1
donc ce sont les commandes contenues après (entre else et end) qui sont exécutées. @evo_compteur augmente donc de 1.
Troisième lecture, @evo_calculée = true et @evo_compteur = 1, ce qui correspond à la seconde condition
Code:

          elsif @evo_calculee == true and @evo_compteur >= 1
aussi ce sont ces commandes qui sont exécutées, @evo_calculee est désactivé.

Le rand n'est donc calculé qu'une seule fois...

Code:

            name = evolve_list[i][0]
            id = id_conversion(name)
            return id

"name" représente le nom de l'évolution du pokémon. "id_conversion(name)" sert à extraire l'ID du dit pokémon. "return id" sert juste à renvoyer la valeur qui sera utilisée pour l'évolution, ici l'ID de l'évolution du pokémon.

Evolution aléatoire par niveau v2.0 by Sphinx
Dans le script Pokemon, ajoutez avant :
Code:

        # Evolution naturelle
        if evolve_list[i][1].type == Fixnum and @level >= evolve_list[i][1]
          name = evolve_list[i][0]
          id = id_conversion(name)
          return id
        end


ceci :
Code:

        # Evolution aleatoire 2
        if evolve_list[i][1] == "aleatoirebis" and @level >= evolve_list[i][2]
          if @evo_calculee_bis == false or @evo_calculee_bis == nil
            @evoaleabase_bis = 0
            for j in 0..evolve_list[i][0].size - 1
              @evoaleabase_bis += evolve_list[i][0][j][1]
            end
            @evoalea_bis = rand(@evoaleabase_bis)
            @evo_calculee_bis = true
            for k in 0..evolve_list[i][0].size - 1
              @pr100evo = 0
              evolve_list[i][0][k][1] += @pr100evo
              @pr100evo = evolve_list[i][0][k][1]
            end
            for l in 0..evolve_list[i][0].size - 1
              if @evoalea_bis < evolve_list[i][0][l][1]
                @name = evolve_list[i][0][l][0]
                break
              end
            end
          elsif @evo_calculee_bis == true and @evo_compteur_bis >= 1
            @evo_calculee_bis = false
            @evo_compteur_bis = 0
          else
            @evo_compteur_bis += 1
          end
          name = @name
          id = id_conversion(name)
          return id
        end


puis, dans le fichier data_pokemon.txt, pour permettre à un pokémon d'évoluer aléatoirement, insérez la commande d'évolution suivante :
Code:

[[["{NOM DE L'EVOLUTION 1}", {CHANCE D'EVOLUTION}], ["{NOM DE L'EVOLUTION 2}", {CHANCE D'EVOLUTION}], ..., ["{NOM DE L'EVOLUTION N}", {CHANCE D'EVOLUTION}]], "aleatoire", {NIVEAU}]


Etant donné qu'aucun pokémon des 4 premières générations n'évoluant par saison, l'exemple qui suit est fictif :
[[["YANMA", 50], ["YMPHECT", 20], ["RAIKOU", 10], ["CHENIPAN", 100], ["CARAPUCE", 20]], "aleatoirebis", 20]
Contrairement à la version v1.0 où le pokémon avait exactement les même chances d'évoluer sous l'une ou l'autre de ses formes possibles, ici ce pokémon aura 50 chances sur 200 d'évoluer en YANMA (1 chance sur 4) contre 100 chances sur 200 (1 chance sur 2) d'évoluer en CHENIPAN, ou encore 10 chances sur 200 (1 chance sur 20) d'évoluer en RAIKOU.
Le système fait la somme des chances, et le résultat peut sans problème différer de 200... Ce total pourrait être 5, comme 10.000... ^_^
Autre chose, ici YMPHECT et CARAPUCE ont le même nombre de chances, à savoir 20 (soit 1 chance sur 10), il y a donc la même probabilité que ce pokémon évolue en YMPHECT ou en CARAPUCE.
Le principe de l'évolution aléatoire est simple, elle sert à faire évoluer un pokémon en une forme sélectionnée au hasard parmi plusieurs disponibles dans la commande d'évolution. Cette seconde version ajoute cependant une particularité, les chances d'évoluer sous telle ou telle forme peuvent désormais être régies par le maker lui même. Une forme peut donc ainsi être plus rare qu'une autre.

Le pokémon aura x chances (où x représente les chances d'évolutions) sur y (où y est la somme des chances d'évolutions de toutes les formes disponibles) d'évoluer sous cette forme.

Exemple : si le pokémon a 495 chances d'évoluer en COQUILPERLE et 5 d'évoluer en SERPANG, cela voudra dire qu'il aura 495 chances sur (495 + 5) d'évoluer en COQUILPERLE et seulement 5 sur (495 + 5) d'évoluer en SERPANG.

Cette somme, contenue ensuite dans la variable @evoaleabase_bis est réalisée grace à ces lignes :
Code:

            @evoaleabase_bis = 0
            for j in 0..evolve_list[i][0].size - 1
              @evoaleabase_bis += evolve_list[i][0][j][1]
            end


La boucle
Code:

for j in 0..evolve_list[i][0].size - 1
sert à répéter l'addition autant de fois qu'il y a d'évolutions possibles.
Code:

evolve_list[i][0][j][1]
contient les chances d'évolutions sous la forme j (j représentant l'occurrence de la boucle for)


Code:

@evoalea_bis = rand(@evoaleabase_bis)

@evoalea_bis contient donc une valeur aléatoire comprise entre 0 et la somme totale des chances d'évolutions (et ce, quelque soit le nombre d'évolutions possibles, qu'il y en ait 2 ou 500.)

L'évolution aléatoire pose cependant un lourd problème qu'aucune autre forme d'évolutions ne pose. En effet, le script d'évolution est lu 3 fois (2 fois avant l'animation de l'évolution et une fois après) aussi un random n'avait qu'une chance sur 4 de ressortir 3 fois la même valeur (et ce, quelque soit le nombre de pokémons possibles). Aussi, sans un moyen de contourner ce problème, la première lecture aurait pu faire ressortir un YANMA, la seconde un RAIKOU (que l'animation aurait alors affiché) et enfin la dernière lecture un ONIX (qui serait apparu dans l'équipe). Ce qui posait ensuite un problème de cohérence... Ce sont les lignes ci-dessous qui servent à enrayer ce soucis :

Code:

          if @evo_calculee_bis == false or @evo_calculee_bis == nil
            @evoaleabase_bis = 0
            for j in 0..evolve_list[i][0].size - 1
              @evoaleabase_bis += evolve_list[i][0][j][1]
            end
            @evoalea_bis = rand(@evoaleabase_bis)
            @evo_calculee_bis = true
            for k in 0..evolve_list[i][0].size - 1
              @pr100evo = 0
              evolve_list[i][0][k][1] += @pr100evo
              @pr100evo = evolve_list[i][0][k][1]
            end
            for l in 0..evolve_list[i][0].size - 1
              if @evoalea_bis < evolve_list[i][0][l][1]
                @name = evolve_list[i][0][l][0]
                break
              end
            end
          elsif @evo_calculee_bis == true and @evo_compteur_bis >= 1
            @evo_calculee_bis = false
            @evo_compteur_bis = 0
          else
            @evo_compteur_bis += 1
          end

@evo_compteur_bis compte le nombre de lecture, @evo_calculee_bis renvoie true dès lors que le random a été lu.

Code:

          if @evo_calculee_bis == false or @evo_calculee_bis == nil

cette ligne sert à tester si @evo_calculee_bis est désactivé (false) ou inexistant (nil) auquel cas cela indique que l'évolution n'a pas encore été sélectionnée. Une fois le rand calculé, @evo_calculee est activé (true) et le compteur @evo_compteur est mis à 0. Le script a fait sa première lecture.
Seconde lecture, @evo_calculee_bis = true et @evo_compteur_bis = 1. Aussi ces paramètres ne répondent ni à la conditionnelle
Code:

          if @evo_calculee_bis == false or @evo_calculee_bis == nil
ni à la conditionnelle
Code:

          elsif @evo_calculee_bis == true and @evo_compteur_bis >= 1
donc ce sont les commandes contenues après (entre else et end) qui sont exécutées. @evo_compteur_bis augmente donc de 1.
Troisième lecture, @evo_calculée_bis = true et @evo_compteur_bis = 1, ce qui correspond à la seconde condition
Code:

          elsif @evo_calculee_bis == true and @evo_compteur_bis >= 1
aussi ce sont ces commandes qui sont exécutées, @evo_calculee_bis est désactivé.

Le rand n'est donc calculé qu'une seule fois...

Code:

            name = evolve_list[i][0]
            id = id_conversion(name)
            return id

"name" représente le nom de l'évolution du pokémon. "id_conversion(name)" sert à extraire l'ID du dit pokémon. "return id" sert juste à renvoyer la valeur qui sera utilisée pour l'évolution, ici l'ID de l'évolution du pokémon.




Forcer l'évolution
Dans le script Pokemon_Evolve vers la ligne 104, recherchez ceci :
Code:

        if Input.trigger?(Input::B)
          @cancel = true
          break
        end


remplacez la 1° ligne du code ci dessus par :
Code:

        if Input.trigger?(Input::B) and $game_switches[2000] == false


Vous l'aurez compris (ou pas mais peu importe, ca ne change rien donc je continue :mrgreen: ) l'interrupteur 2000 va nous servir à déterminer si l'évolution est forcée (switch 2000 activé) ou non (switch 2000 désactivé) Bien sur vous pouvez remplacer le 2000 par n'importe quel autre interrupteur, mais il ne faudra pas oublier de changer tous les $game_switches[2000] =) Rassurez-vous, il n'y en a pas tant que ca ^_^

Aux alentours de la ligne 170, on trouve ce passage :
Code:

        Audio.me_play("Audio/ME/PkmRS-Caught.mid")
        draw_text("Félicitations! "+@pokemon.given_name, 
          "a évolué en "+$pokemon_info.name(@evolve_id)+"!")
        wait(40)
        wait_hit
        draw_text("", "")
        print($game_switches[2000])
        if @forcing
          @pokemon.evolve(@evolve_id)
        else
          @pokemon.evolve
        end


En dessous de :
Code:

        draw_text("", "")


ajoutez :
Code:

        $game_switches[2000] = false


sans oublier de remodifier $game_switches[2000] si vous l'avez fait à l'étape précédente

^_^ Voilà, c'est tout pour ce script


Passons au script Pokemon...

Code:

    def evolve_check
      # Pas d'évolution
      if evolve_list[1][0] == ""
        return false
      end
     
      for i in 1..evolve_list.length-1

Après ces quelques lignes, vous trouvez toutes vos méthodes d'évolution.

Ajoutez simplement ceci :

Code:

          if $game_switches[2000] == false
            $game_switches[2000] = true
            @evo_compteur = 0
          elsif $game_switches[2000] == true and @evo_compteur >= 1
            $game_switches[2000] = false
          else
            @evo_compteur += 1
          end

sans oublier de modifier le n° de l'interrupteur si vous n'avez pas voulu garder le 2000 =)

dans la méthode d'évolution, par exemple, avant :
Code:

            name = evolve_list[i][0]
            id = id_conversion(name)
            return id



^_^ Vous savez maintenant comment forcer l'évolution... Faut activer le switch correspondant avant l'évolution via un évent pour forcer ponctuellement l'évolution, ou alors l'activer via les lignes de scripts ci-dessus pour forcer en permanence un type d'évolution...

Pour une évolution forcée ponctuelle (donc via un évent quelconque) pensez bien à activer l'interrupteur avant l'évolution ! En outre il se désactive automatiquement à la fin d'une évolution =)




Cette liste des évolutions créées par des membres de la communauté contient toutes les évolutions que j'ai trouvé sur le forum mais elle ne se prétend pas être complète. Si vous utilisez l'une ou l'autre de ces évolutions, il serait préférable que l'auteur (ou les auteurs) soi(en)t intégré(s) à vos crédits.

Si l'une de ces évolutions bug, ou si vous avez une autre évolution (déjà scriptée et fonctionnelle) à proposer, ou encore si vous utilisez un système différent pour gérer le jour/nuit, n'hésitez pas à poster à la suite de ce tuto et soyez le plus clair possible afin que je le maj en fonction.

Normalement, toutes ces évolutions sont fonctionnelles.

Posté par Sphinx le 4 Aoû - 09:25 (2008)
maj & ajout du système jour / nuit de GraphDP

Posté par Zelda le 4 Aoû - 12:43 (2008)
Waaaaw ! Ca va en aider plus d'un ! Bravo !

Posté par Alex le 4 Aoû - 12:50 (2008)
:shock: COOL :shock:

Posté par Sphinx le 4 Aoû - 12:55 (2008)
^_^ en dehors des 2 évos aléatoires, je n'ai fait que copier / coller =)


(^_^ j'ai ajouté tout à l'heure, avant de partir manger, des explications pour apprentis scripteurs sur l'évo par stats & les 2 évos aléatoires =))

Posté par Newtiteuf le 4 Aoû - 13:36 (2008)
Ok merci, c'est super , vraiment ! Et les explications aussi !

Posté par Tiplouf le 4 Aoû - 14:53 (2008)
Et Sphinx ses pas pour te dire je te verrai bien en modo du forum, parce que tu est la toujour la a expliquer et a faire avancer le forum sans un soucis.
Sinon bravo pour ses récapitulatif

Posté par Newtiteuf le 4 Aoû - 14:59 (2008)
Oui tiplouf tu as raison !

Posté par Speed le 4 Aoû - 16:45 (2008)
Et bien très beau travail à tout le monde ! Tout ça me donne des idées pour des Pokémon !

Posté par Sphinx le 4 Aoû - 18:32 (2008)
Problème de l'évolution aléatoire : si on l'annule, au niveau suivant le rand est de nouveau lu (logique ^_^) donc l'évolution pourra être différente


Solution : rendre l'évolution aléatoire non annulable =)


Moyen de procéder :

Dans le script Pokemon_Evolve vers la ligne 104, recherchez ceci :
Code:
        if Input.trigger?(Input::B)
          @cancel = true
          break
        end


remplacez la 1° ligne du code ci dessus par :
Code:
        if Input.trigger?(Input::B) and $game_switches[2000] == false


Vous l'aurez compris (ou pas mais peu importe, ca ne change rien donc je continue :mrgreen:) l'interrupteur 2000 va nous servir à déterminer si l'évolution est forcée (switch 2000 activé) ou non (switch 2000 désactivé) Bien sur vous pouvez remplacer le 2000 par n'importe quel autre interrupteur, mais il ne faudra pas oublier de changer tous les $game_switches[2000] =) Rassurez-vous, il n'y en a pas tant que ca ^_^

Aux alentours de la ligne 170, on trouve ce passage :
Code:
        Audio.me_play("Audio/ME/PkmRS-Caught.mid")
        draw_text("Félicitations! "+@pokemon.given_name,
          "a évolué en "+$pokemon_info.name(@evolve_id)+"!")
        wait(40)
        wait_hit
        draw_text("", "")
        print($game_switches[2000])
        if @forcing
          @pokemon.evolve(@evolve_id)
        else
          @pokemon.evolve
        end


En dessous de :
Code:
        draw_text("", "")


ajoutez :
Code:
        $game_switches[2000] = false


sans oublier de remodifier $game_switches[2000] si vous l'avez fait à l'étape précédente

^_^ Voilà, c'est tout pour ce script


Passons au script Pokemon...

Code:
    def evolve_check
      # Pas d'évolution
      if evolve_list[1][0] == ""
        return false
      end
     
      for i in 1..evolve_list.length-1

Après ces quelques lignes, vous trouvez toutes vos méthodes d'évolution.

Ajoutez simplement ceci :

Code:
          if $game_switches[2000] == false
            $game_switches[2000] = true
            @evo_compteur = 0
          elsif $game_switches[2000] == true and @evo_compteur >= 1
            $game_switches[2000] = false
          else
            @evo_compteur += 1
          end

sans oublier de modifier le n° de l'interrupteur si vous n'avez pas voulu garder le 2000 =)

dans la méthode d'évolution, par exemple, avant :
Code:
            name = evolve_list[i][0]
            id = id_conversion(name)
            return id



^_^ Vous savez maintenant comment forcer l'évolution... Faut activer le switch correspondant avant l'évolution via un évent pour forcer ponctuellement l'évolution, ou alors l'activer via les lignes de scripts ci-dessus pour forcer en permanence un type d'évolution...

>> ajouté dans mon premier post

Posté par Newtiteuf le 30 Aoû - 20:31 (2008)
franchement sphinx, c'est super !
J'integre tous ca dans mon jeu dé demain !

Posté par Sphinx le 30 Aoû - 20:52 (2008)
Clin d'œil foireux merci beaucoup NT Clin d'œil foireux

Posté par Empire1601 le 30 Aoû - 22:44 (2008)
Tu vas vraiment tout mettre  :shock: ?

Posté par Flash le 31 Aoû - 09:25 (2008)
On n'en sait rien mais tout est bien ^^

Ça vaut le coup !

Posté par Wescoeur le 31 Aoû - 10:25 (2008)
Je me poses une question: Comment va t'on faire pour Barpeau? :cry:
Sinon c'est toujours aussi bien rédigé sphinx! Bouche extensiblek:

Posté par Newtiteuf le 31 Aoû - 11:30 (2008)
Sphinx j'ai un problème , je n'ai pas tres bien compris le principe de l'évolution forcée ! Pourrait tu expiquer avec un ou 2 screen comment forcer l'évolition ?

Posté par Sphinx le 31 Aoû - 20:01 (2008)
^_^ ouaip Wesker =) J'ai tout mis :mrgreen:


NT : remplace ton script Pokemon_Evolve par celui-ci :

Code
Code:
#==============================================================================
# ■ Pokemon_Evolve
# Pokemon Script Project - Krosk
# 01/08/07
#-----------------------------------------------------------------------------
# Scène à ne pas modifier de préférence
#-----------------------------------------------------------------------------
# Scène appelée en cas de evolve
#-----------------------------------------------------------------------------

Swi_Evo_Forcee = 2000 # Reglez ici le numero de l'interrupteur qui servira
# a forcer l'evolution du pokemon reçu. Attention ! Ce doit etre le même
# interrupteur que precedemment !

module POKEMON_S
  class Pokemon_Evolve
    def initialize(pokemon, evolve_id, z_level = 400, forcing = false)
      Graphics.freeze
      @z_level = z_level
      @forcing = forcing
      @cancel = false
      #$game_system.bgm_play($game_temp.map_bgm)
      $game_temp.map_bgm = $game_system.playing_bgm
      Audio.bgm_play("Audio/BGM/PkmRS-Evolving.mid")
     
      @pokemon = pokemon
      @evolve_id = evolve_id
      @background = Sprite.new
      @background.bitmap = RPG::Cache.battleback($game_map.battleback_name + ".png")
      @background.z = @z_level
      @background.color = Color.new(0, 0, 0, 0)
     
      @text_window = Window_Base.new(4, 340, 632, 136)
      @text_window.opacity = 0
      @text_window.z = @z_level + 2
      @text_window.contents = Bitmap.new(600 + 32, 104 + 32)
      @text_window.contents.font.name = $fontface
      @text_window.contents.font.size = $fontsizebig
     
      @message_background = Sprite.new
      @message_background.y = 336
      @message_background.z = @z_level + 1
      @message_background.bitmap = RPG::Cache.battleback("dummy1.png")
     
      @pokemon_sprite = Sprite.new
      @pokemon_sprite.bitmap = RPG::Cache.battler(@pokemon.battler_face, 0)
      @pokemon_sprite.ox = @pokemon_sprite.bitmap.width / 2
      @pokemon_sprite.oy = @pokemon_sprite.bitmap.height / 2
      @pokemon_sprite.x = 320
      @pokemon_sprite.y = 240
      @pokemon_sprite.z = @z_level + 5
      @pokemon_sprite.color = Color.new(255,255,255,0)
     
      @evolved_sprite = Sprite.new
      @evolved_sprite.x = 320
      @evolved_sprite.y = 240
      @evolved_sprite.bitmap = RPG::Cache.battler(evolved_sprite_generation, 0)
      @evolved_sprite.ox = @evolved_sprite.bitmap.width / 2
      @evolved_sprite.oy = @evolved_sprite.bitmap.height / 2
      @evolved_sprite.z = @z_level + 6
      @evolved_sprite.zoom_x = 0
      @evolved_sprite.zoom_y = 0
      @evolved_sprite.color = Color.new(255,255,255,255)
      Graphics.transition(20)
    end
   
   
    def main
      draw_text("Quoi?", @pokemon.given_name + " évolue!")
      wait(40)
     
      # Blanchissement
      until @pokemon_sprite.color.alpha >= 255
        @pokemon_sprite.color.alpha += 20
        @background.color.alpha += 10
        Graphics.update
      end
     
      # Oscillement
      t = 0
      loop do
        t += 1
        if t > 100
          t +=1
        end
        if t > 250
          t += 1
        end
        if t > 450
          t += 1
        end
        pi = 3.14159265
        @pokemon_sprite.zoom_x = (Math.cos(t*2*pi/50)+1)/2
        @pokemon_sprite.zoom_y = (Math.cos(t*2*pi/50)+1)/2
        @evolved_sprite.zoom_x = (Math.cos(t*2*pi/50+pi)+1)/2
        @evolved_sprite.zoom_y = (Math.cos(t*2*pi/50+pi)+1)/2
        Input.update
        Graphics.update
        if t >= 650
          break
        end
        if Input.trigger?(Input::B) and $game_switches[Swi_Evo_Forcee] == false
          @cancel = true
          break
        end
      end
     
      if @cancel
        until @pokemon_sprite.zoom_x >= 1
          @evolved_sprite.zoom_x -= 0.05
          @evolved_sprite.zoom_y -= 0.05
          @pokemon_sprite.zoom_x += 0.05
          @pokemon_sprite.zoom_y += 0.05
          Graphics.update
        end
        @pokemon_sprite.zoom_y = 1
        @pokemon_sprite.zoom_x = 1
        @evolved_sprite.zoom_x = 0
        @evolved_sprite.zoom_y = 0
        Graphics.update
        until @pokemon_sprite.color.alpha <= 0
          @pokemon_sprite.color.alpha -= 20
          @background.color.alpha -= 10
          Graphics.update
        end
        Graphics.update
        draw_text("Que...! "+@pokemon.given_name, "n'a pas évolué!")
        wait(40)
        wait_hit
        draw_text("", "")
      else
        # Rétablissement
        until @evolved_sprite.zoom_x >= 1
          @evolved_sprite.zoom_x += 0.05
          @evolved_sprite.zoom_y += 0.05
          @pokemon_sprite.zoom_x -= 0.05
          @pokemon_sprite.zoom_y -= 0.05
          Graphics.update
        end
       
        @evolved_sprite.zoom_x = 1
        @evolved_sprite.zoom_y = 1
        @pokemon_sprite.zoom_x = 0
        @pokemon_sprite.zoom_y = 0
        Graphics.update
       
        # Colorisation
        until @evolved_sprite.color.alpha == 0
          @evolved_sprite.color.alpha -= 20
          @background.color.alpha -= 10
          Graphics.update
        end
       
        loop do
          if @pokemon_sprite.color.alpha == 255 and @pokemon_sprite.zoom_x > 0
            @pokemon_sprite.zoom_x -= 0.05
            @pokemon_sprite.zoom_y -= 0.05
            @evolved_sprite.zoom_x += 0.05
            @evolved_sprite.zoom_y += 0.05
          end
          if @evolved_sprite.zoom_x >= 1
            @evolved_sprite.color.alpha -= 20
            @background.color.alpha -= 10
          end
          Graphics.update
          if @evolved_sprite.color.alpha == 0
            break
          end
        end
       
        Audio.me_play("Audio/ME/PkmRS-Caught.mid")
        draw_text("Félicitations! "+@pokemon.given_name,
          "a évolué en "+$pokemon_info.name(@evolve_id)+"!")
        wait(40)
        wait_hit
        draw_text("", "")
        $game_switches[Swi_Evo_Forcee] = false
        if @forcing
          @pokemon.evolve(@evolve_id)
        else
          @pokemon.evolve
        end
        $data_pokedex[@pokemon.id] = [ true, true ]
      end
     
      Graphics.freeze
      $game_system.bgm_play($game_temp.map_bgm)
      Audio.me_stop
      @text_window.dispose
      @message_background.dispose
      @background.dispose
      @pokemon_sprite.dispose
      @evolved_sprite.dispose
      @text_window = nil
    end
   
    def evolved_sprite_generation
      ida = sprintf("%03d", @evolve_id)
      if @pokemon.gender == 1 or @pokemon.gender == 0
        string = "Front_Male/" + ida + ".png"
      elsif @pokemon.gender == 2
        string = "Front_Female/" + ida + ".png"
        #if not(FileTest.exist?("Graphics/Battlers/" + string))
        if not($picture_data["Graphics/Battlers/" + string])
          string = "Front_Male/" + ida + ".png"
        end
      end
     
      if @pokemon.shiny
        string2 = "Shiny_" + string
        #if FileTest.exist?("Graphics/Battlers/" + string2)
        if $picture_data["Graphics/Battlers/" + string2]
          string = string2
        end
      end
     
      return string
    end
   
    def draw_text(line1 = "", line2 = "")
      Graphics.freeze
      @text_window.contents.clear
      @text_window.draw_text(12, 0, 460, 50, line1)
      @text_window.draw_text(12, 55, 460, 50, line2)
      Graphics.transition(5)
    end
   
    def wait_hit
      loop do
        Graphics.update
        Input.update
        if Input.trigger?(Input::C)
          $game_system.se_play($data_system.decision_se)
          break
        end
      end
    end
     
    def wait(frame)
      i = 0
      loop do
        i += 1
        Graphics.update
        if i >= frame
          break
        end
      end
    end
  end
end


Clin d'œil foireux Et lis en haut du script, tu as quelques infos sur l'utilisation Clin d'œil foireux

Posté par Empire1601 le 31 Aoû - 21:58 (2008)
Tien tien tien je crois que je vais me lancer dans une évolution à la Barpeau  :mrgreen:
Je te tiens au courant Wesker Clin d'œil foireux

Posté par Sphinx le 31 Aoû - 22:00 (2008)
^_^ Barpau évolue s'il est content, non ?

Posté par Empire1601 le 31 Aoû - 22:10 (2008)
XD franchement Sphinx retourne à l'école pokémon ^^

Il évolue si sa beauté (avec les pokéblocs) est au maximum (et qu'il gagne un niveau Clin d'œil foireux )

Posté par Wescoeur le 31 Aoû - 22:30 (2008)
Ou grâce aux poffins de d/p^^