Sujet n°12422
Posté par Astox le 23 Fév - 23:21 (2013)
Titre : Fuite : Bug de la division par zéro
J'ai trouvé un bug fort peu agréable à avoir qui se produit lors de la fuite contre un Pokémon sauvage sous PSP5G 0.5

Voici le Log : 


Spoiler
---------- Erreur de script : Pokemon_Battle_Core 2 ----------
----- Type
FloatDomainError

----- Message
Infinity

----- Position dans Pokemon_Battle_Core 2
Ligne 99

----- Backtrace
Script : Pokemon_Battle_Core 2 | Ligne : 99 | Méthode : in `Integer'
Script : Pokemon_Battle_Core 2 | Ligne : 99 | Méthode : in `run_able?'
Script : Pokemon_Battle_Wild* | Ligne : 577 | Méthode : in `end_battle_check'
Script : Pokemon_Battle_Core 1* | Ligne : 799 | Méthode : in `update'
Script : Pokemon_Battle_Core 1* | Ligne : 256 | Méthode : in `main'
Script : Pokemon_Battle_Core 1* | Ligne : 241 | Méthode : in `loop'
Script : Pokemon_Battle_Core 1* | Ligne : 260 | Méthode : in `main'
Script : Main | Ligne : 58


Les lignes concernés :
Code:


#------------------------------------------------------------ 
    # Capacité de fuite
    #------------------------------------------------------------           
    def run_able?(runner, opponent)
      x = (Integer(opponent.spd/4) / 255.0)
      rate = Integer(runner.spd*32/x)+(30*($battle_var.run_count))
 
      if not(flee_able(runner, opponent))
        return false
      end
      if opponent.spd <= runner.spd
        return true
      elsif x == 0
        return true
      elsif rate > 255
        return true
      elsif rand(256) <= rate
        return true
      else
        return false
      end
    end


Je ne suis pas encore un expert en ce qui concerne les bug mais si je ne me trompe pas il s'aggit d'une division par zéro de :
Code:

 rate = Integer(runner.spd*32/x)+(30*($battle_var.run_count))


Voici un correctif qui semble fonctionner :
Code:

#------------------------------------------------------------ 
    # Capacité de fuite
    #------------------------------------------------------------           
    def run_able?(runner, opponent)
      x = (Integer(opponent.spd/4) / 255.0)
      if x == 0
        x = 1
      end
      rate = Integer(runner.spd*32/x)+(30*($battle_var.run_count))
      if not(flee_able(runner, opponent))
        return false
      end
      if opponent.spd <= runner.spd
        return true
      elsif x == 0
        return true
      elsif rate > 255
        return true
      elsif rand(256) <= rate
        return true
      else
        return false
      end
    end


Cela semble fonctionner mais je ne sais pas si ce que j'ai fait est stable dans tous les cas.

Posté par Nuri Yuri le 25 Fév - 10:00 (2013)
Tu peux nous donner les conditions de la fuite (pokémon sur le terrain, data de ceux-ci au niveau base de donnée et fichier (juste eux pas tout !)).
Après peut être qu'il y avait une capacité spéciale qui a du fortement influer la valeur de x...
Bref, sans informations complémentaire on ne peut que te dire de mettre x=1 if x==0 après x = (Integer(opponent.spd/4) / 255.0) mais c'est la pire des solutions.

Posté par Astox le 25 Fév - 13:07 (2013)
Nyagato Nyuky a écrit:
Tu peux nous donner les conditions de la fuite (pokémon sur le terrain, data de ceux-ci au niveau base de donnée et fichier (juste eux pas tout !)).
Après peut être qu'il y avait une capacité spéciale qui a du fortement influer la valeur de x...
Bref, sans informations complémentaire on ne peut que te dire de mettre x=1 if x==0 après x = (Integer(opponent.spd/4) / 255.0) mais c'est la pire des solutions.


C'est totalement aléatoire, je n'ai pas trouvé de lien direct entre un combat qui bug et un qui ne bug pas si ce n'est que cela se produit si on fuit apres essayer d'en capturer : Pokémon cibles différents ( si je me souvient bien il avait eu lieu sur un Ratata et un Pikachu ), dans la même zone ( tag 1 ) sur une même carte quand aux data de ces pokémon ce sont ceux de psp5G 0.5 par défaut, je n'y ai pas touché. Le meilleur c'est que pour un même pokémon, parfois ça bug et parfois ça ne bug pas.