Pokémon Script Project Forum Index

Manuel | Search
 Information des admins 
Si vous désirez parler de PSP ou obtenir du soutient là dessus, merci d'aller faire un tour sur https://pokemonworkshop.com/forum/index.php Imbécile heureux

[Tuto] Récapitulatif : Evolutions de pokémons
Goto page: 1, 2  >
 
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Tutoriels
Previous topic :: Next topic   
Author Message
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Mon 4 Aug - 01:57 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

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]]

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"]

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)

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)

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 ]

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.

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)

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.

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.




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.


Last edited by Sphinx on Mon 4 Aug - 19:41 (2008); edited 3 times in total
Back to top
Publicité






PostPosted: Mon 4 Aug - 01:57 (2008)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Mon 4 Aug - 09:25 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

maj & ajout du système jour / nuit de GraphDP
Back to top
Zelda
Ex-staff


Joined: 29 Apr 2008
Posts: 2,442
Localisation: Nantes (44)

PostPosted: Mon 4 Aug - 12:43 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

Waaaaw ! Ca va en aider plus d'un ! Bravo !
Back to top
Visit poster’s website
Alex
Ex-staff


Joined: 01 Jun 2008
Posts: 2,632
Localisation: Demain

PostPosted: Mon 4 Aug - 12:50 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

:shock: COOL :shock:
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Mon 4 Aug - 12:55 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

^_^ 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 =))
Back to top
Newtiteuf
Membre


Joined: 22 May 2008
Posts: 5,090
Localisation: Sur PC (enfin devant ...)

PostPosted: Mon 4 Aug - 13:36 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

Ok merci, c'est super , vraiment ! Et les explications aussi !
Back to top
Visit poster’s website
Tiplouf
Guest





PostPosted: Mon 4 Aug - 14:53 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

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
Back to top
Newtiteuf
Membre


Joined: 22 May 2008
Posts: 5,090
Localisation: Sur PC (enfin devant ...)

PostPosted: Mon 4 Aug - 14:59 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

Oui tiplouf tu as raison !
Back to top
Visit poster’s website
Speed
Ex-staff


Joined: 04 Jan 2008
Posts: 1,701
Localisation: Marseille (13)
Masculin

PostPosted: Mon 4 Aug - 16:45 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

Et bien très beau travail à tout le monde ! Tout ça me donne des idées pour des Pokémon !
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Mon 4 Aug - 18:32 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

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
Back to top
Newtiteuf
Membre


Joined: 22 May 2008
Posts: 5,090
Localisation: Sur PC (enfin devant ...)

PostPosted: Sat 30 Aug - 20:31 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

franchement sphinx, c'est super !
J'integre tous ca dans mon jeu dé demain !
Back to top
Visit poster’s website
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Sat 30 Aug - 20:52 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

Clin d'œil foireux merci beaucoup NT Clin d'œil foireux
Back to top
Empire1601
Ex-staff


Joined: 01 May 2008
Posts: 3,216
Localisation: La haut sur la montagne ...

PostPosted: Sat 30 Aug - 22:44 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

Tu vas vraiment tout mettre  :shock: ?
Back to top
Flash
Guest





PostPosted: Sun 31 Aug - 09:25 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

On n'en sait rien mais tout est bien ^^

Ça vaut le coup !
Back to top
Wescoeur
Membre


Joined: 04 May 2008
Posts: 3,522
Localisation: Chez l'Ankou

PostPosted: Sun 31 Aug - 10:25 (2008)    Post subject: [Tuto] Récapitulatif : Evolutions de pokémons

Je me poses une question: Comment va t'on faire pour Barpeau? :cry:
Sinon c'est toujours aussi bien rédigé sphinx! Bouche extensiblek:
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Tutoriels All times are GMT + 1 Hour
Goto page: 1, 2  >
Page 1 of 2

 
Jump to:  

Index | Free forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Thème par Thomas et l'équipe de la refonte PSP 2012 (version 1.0)