Pikachu
Pokébip Pokédex Espace Membre
Inscription

Blog
de Alpha Clément

                   


Blog de Alpha Clément

Si vous trouvez un contenu choquant cliquez ici :


Peut-on trouver par chance les 3 starters shiny en même temps sur HGSS? (pas vraiment)

Préambule

Objetifs

Le but est de cet article est de savoir si une personne jouant à HGSS pourrait tomber par hasard sur les 3 starters shiny. Pour rappel on voit si les starters sont shiny avant de les choisir. Il va falloir reproduire et étudier les algorithmes qui régissent le pseudo aléatoire dans ces jeux. Si vous voulez sautez le côté "technique, "vous pouvez aller à la conclusion, même vous ne pourrez pas comprendre comment j'en suis arrivé à ces résultats.

Vocabulaires

RNG: Random Number generator (en français générateur de nombre aléatoire) ça désigne la manière dont le jeu génère l'aléatoire.
delay: interval de temps entre un reset/lancement du jeu et le moment ou on appuie sur continuer. Il se mesure souvent en ~1/60 seconde
seed: nombre de 32 bits (8 chiffres en hexadécimal) généré par le jeu quand on démarre la partie et qui change au cours du temps
frame: nombre qui commence à 1 après le démarrage de la partie et qui augmente au fil du temps sous certaines conditions

Prérequis pour comprendre

binaire, hexadécimal et congruence
conseillé: avoir déjà fait des manipulation RNG sur des jeux Pokémon.

Langage de programmation

Python (sans module)

Introduction: FAQ

Voici une liste de questions que vous seriez susceptible de vous poser avant de renter dans le détail:

Déjà pourquoi? Quel intérêt?
Après avoir vu la vidéo d'Angeflo qui a eu les 3 straters shiny sur émulateur j'ai eu envi de le faire sur console (sans hack, par exemple modifier la seed comme il l'a fait) et je n'ai pas trouvé beaucoup de réponse sur ce sujet (ce qui d'autant plus intéressant). J'aurai quelques remarques à faire par rapport à son travail et les réactions suscitées.
C'est par cette intermédiaire que j'ai appris l'histoire d'Isaaveon, une joueuse prétendant avoir eu les 3 starters shiny en même temps. Certains joueurs en ont déjà eu 2 en même temps (sûrement sans hack ni RNG). Comme beaucoup j'étais sceptique. Mais j'ai voulu savoir si il existait une manipulation simple et rapide qui permettrait d'avoir les 3 starters shiny et ainsi de savoir si elle a éventuellement pu avoir pu avoir cette chance. Les remarques "c'est trop improbable" ou "c'est possible" ne permettent pas de répondre à la question.

Bah la proba c'est 1/(81923) donc c'est possible?
C'est plus compliqué que ça, toutes les combinaisons ne sont pas possibles. L'hypothèse d'indépendance des starters dans ce cas extrême ne marche pas. Avoir les 3 starters shiny est tout simplement impossible pour la plupart des combinaisons id/id secret (on verra plus tard pourquoi).
Pour vous montrer que le modèle pseudo aléatoire n'est pas toujours intuitif, je vais prendre un exemple. Par exemple pour les starters 6ivs, il n'y a que 4 natures possibles: modeste, docile, timide et calme (je ne vais pas détailler pourquoi ici).
On voit donc déjà les limites de ce genre de raisonnement. L'aléatoire en informatique et à fortiori dans Pokémon est totalement déterministe. Cependant on se base sur des modèles qui imitent bien un aléatoire théorique, c'est souvent utile de considérer qu'ils sont aléatoires mais il faut également connaitre leurs limites, ce qui est le cas ici.
Ici la probabilité théorique est trop faible pour qu'on puisse juste se dire "c'est possible" et utiliser des raisonnement simplistes d'indépendance. Bien sûr j'entrerai plus dans le détail par la suite, on verra que c'est possible sous certaine condition.

Forcément c'est facile si tu manipules la RNG...
La RNG dans Pokemon en 4G est humainement exploitable sur beaucoup d'aspect. Les logiciels RNG permettent de trouver une manipulation donnant un pokemon shiny si on connait son id et id secret mais ne permettent pas de trouver des seed qui donnent plusieurs shiny d'affilé. En plus ici l'id et l'id secret sont justement des inconnus du problème. Je vais me servir de mes quelques connaissances de la RNG dans HGSS , faire de la programmation et des maths. La seul chose que je peux faire avec les logiciels RNG c'est vérifier si une solution est bonne.

Les 3 manières d'obtenir les starters

Il y a 3 possibilités pour obtenir les starters shiny:
Hypothèse 1: On sauvegarde devant les (ce qui implique un reset sinon ça ne change rien).
Hypothèse 2: On sauvegarde mais pas devant les .
Hypothèse 3: On ne sauvegarde pas et récupère directement les starters.
Seul l'hypothèse 1 semble être compatible avec l'histoire d'Isaaveon mais j'ai quand même étudier les 2 autres cas.

Notation mathématique:

Notation des nombres en binaire et hexadécimal

On rajoute le préfixe 0b devant un nombre pour dire qu'il s’agit de sa notation binaire.
Exemple:
0b101101 = 45

On rajoute le préfixe 0x devant un nombre pour dire qu'il s’agit de sa notation hexadécimal.
Exemple:
0xA31DF = 668127

On numérote les bits en partant de la droite.

Opérateurs de décalage

Soit n et k deux entiers naturels.
n >> k est le nombre n auquel on a enlevé les k derniers bits.
Exemple:
428 >> 4 = 0b110101100 >> 4 = 0b11010 = 26
Remarque:
C'est le quotient de la division euclidienne de n par 2k.

n << k est le nombre n auquel on a ajouté k bits nuls à la fin.
Exemple:
2473 << 4 = 0b100110101001 << 4 = 0b1001101010010000 = 39568
Remarque:
C'est aussi le produit de n par 2k.

Opérateur xor

xor est une opération entre deux nombres comme l'addition et la multiplication. Elle prends en paramètre 2 entiers et renvoie un entier. Pour calculer le résultat il faut convertir les 2 nombres en binaire et faire en sorte que les 2 nombres aient le même nombre de bit en ajoutant éventuellement des 0 au début de l'un deux. L'écriture en binaire du résultat est défini de la façon suivante: Le k ième bit vaut 0 si les k ième bits du 1er et 2ème nombre sont identiques, sinon il vaut 1.
Le résultat de l'opération entre a et b se note a ^ b.
Exemple:
428 = 0b000110101100
2473 = 0b100110101001
428 ^ 2473 = 0b10000000101 = 2053
Remarque:
L'opérateur xor est commutatif, associatif.

Opérateur and

and est une opération entre deux nombres comme l'addition et la multiplication. Elle prends en paramètre 2 entiers et renvoie un entier. Pour calculer le résultat il faut convertir les 2 nombres en binaire et faire en sorte que les 2 nombres aient le même nombre de bits en ajoutant éventuellement des 0 au début de l'un deux. L'écriture en binaire du résultat est défini de la façon suivante: Le k ième bit vaut 1 si les k ième bits du 1er et 2ème nombre valent tous les deux 1, sinon il vaut 0.
Le résultat de la fonction entre a et b se note a & b.
Exemple:
428 = 0b000110101100
2473 = 0b100110101001
428 & 2473 = 0b000110101000 = 424
Remarque:
L'opérateur and est commutatif et associatif.

Propriétés utiles

Pour tout entier naturel a, b et c:
1) a ^ c = b ^ c <=> a = b
2) a = b <=> a ^ b = 0
3) (a ^ b) >> c = (a >> c) ^ (b >> c)
4) (a >> b) >> c = a >> (b + c)

Fonctionnement de la RNG

Génération des seeds


La RNG est calculé à partir de la seed. Juste après avoir appuyer sur continuer, la première seed s1 est généré. Elle dépends de la date, l'heure et la seconde près et d'un nombre appelé delay. C'est une mesure du temps entre le moment ou on reset ou lance le jeu et le moment ou on appuye sur continuer; 1 delay vaut environ 1/60 seconde. On l'écrit souvent hexadécimal, donc sur 8 chiffres. Par exemple E10A9E7D.
Si delay + (année - 2000) est inférieur à 0xFFFF = 65535:
En hexadécimal:
- Les 2 premiers chiffres correspondent au calcul suivant: mois*jour + minute + seconde modulo 0xFF.
- Les 2 suivants correspondent tout simplement à l'heure.
- Enfin les 4 derniers sont le résultat delay + (année - 2000).


Dans le cas général on applique la formule suivante:
  • s1 = (((mois*jour + minute + seconde) << 24) + (heure << 16) + delay + (année - 2000)) & (0xFFFFFFFF)

Toutes les seed sont donc obtenables au départ mais celle avec le troisième et quatrième chiffre formant un nombre strictement supérieur à 0x17 = 23 sont beaucoup plus longue à atteindre, il faut un très grand delay.
Exemple:
Si s1 est généré le 23 novembre 2021 à 15h30m17s avec un delay de 602:
- mois*jour + minute + seconde = 23 * 11 + 30 + 17 = 300
300 = 44 = 0x2C [0xFF]
- heure = 15 = 0x0F
- delay + (année - 2000) = 602 + 21 = 623 = 0x026F
Ainsi s1 = 0x2C0F026F

La seed est modifié au cours du jeu par la frame. La frame peut augmenter sous différentes conditions (par exemple les PNJ qui bougent, le fameux cris de Pijako modifiés, en marchant etc...).
A chaque fois que la frame augmente de 1, la nouvelle seed s'obtient en gardant les 32 derniers bits de 0x41C64E6D * seed + 0x6073.
La seed est modifié en fonction en fonction de la valeur de la frame par un algorithme de congruence linéaire.
Plus précisément, si on note sn la seed à la frame n, on a:
  • f : ⟦0 ; 0xFFFFFFFF⟧ → ⟦0 ; 0xFFFFFFFF⟧
    s → (a*s + b) & 0xFFFFFFFF
    avec a = 0x41C64E6D et b = 0x6073
    sn+1 = f(sn)

Exemple:
Si s1 = 0x2C0F026F, s2 = 0x65FC3BB6 , s3= 0xAB5B40F1
Remarque:
La relation de récurrence permet de déduire que les seed sont périodiques et de période ⩽ 232. On peut démontrer que cette période vaut exactement 232. Ainsi appliquer la fonction f à n'importe quelle seed 232-1 permet de parcourrir toutes les seed.

'& 0xFFFFFFFF ' sert à calculer le résulat modulo 232. a étant impair donc premier avec 232 il possède un inverse modulo 232. Cette inverse peut se calculer en utilisant l'algorithme d'Euclide. Cela permet de déduire que f est bijective et calculer sa réciproque:
  • f-1 : ⟦0 ; 0xFFFFFFFF⟧ → ⟦0 ; 0xFFFFFFFF⟧
    s → (a-1*s + b-) & 0xFFFFFFFF
    avec a -1 = 0xEEB9EB65 et b- = 0xA3561A1
    sn = f-1(sn+1)

Remarque:
Cette fonction réciproque permet de calculer une seed s1 connaissant la frame n et la seed sn associé.

Génération du PID

Lorsqu'un Pokémon est généré, il reçoit un numéro appelé PID. C'est un nombre de 32 bits. Pour les starters il est généré de la façon suivante:
Supposons que le Pokémon est généré à la seed sn ( à la frame n à partir de s1 comme seed de départ). Alors le PID du Pokémon sera généré de cette façon:
-la première moitié du PID sera la première moitié de sn+2
-la seconde moitié du PID sera la première moitié de sn+1

Formellement cela donne:
  • PID = ((sn+2 >> 16) << 16) + (sn+1 >> 16)

Exemple:
Prenons comme seed de départ s1 = 0x2C0F026F et calculons le PID du Pokémon à la frame 3 . Le Pokémon est généré à la seed s3 = 0xAB5B40F1
s4 = 0x2F0A7510 et s5 = 0xD17F1843
Ainsi PID = 0xD17F2F0A

Condition du caractère shiny


Pour savoir si un Pokemon est shiny on a besoin de connaitre son PID. En plus il faut connaître son id et id secret (qu'on note souvent TID et SID).
On note HID = PID >> 16 la première moitié du PID et LID = PID & 0xFFFF la seconde moitié.
Le pokemon sera shiny si et seulement si HID ^ LID ^ TID ^ SID = x avec x compris entre 0 et 7 (je le vois souvent noté ainsi).
x compris entre 0 et 7 peut s'écrire de façon équivalente x >> 3 = 0
Le Pokémon est donc shiny si et seulement si:
  • ((PID >> 16) ^ (PID & 0xFFFF) ^ TID ^ SID) >> 3 = 0

Exemple:
Si PID = 0xD17F2F0A, que l'id dresseur vaut 39553 et l'id secret vaut 25847 alors le Pokemon sera shiny.
Remarque:
Un Pokemon est shiny si et seulement si SID fait parti de l'ensemble {x+y, x = ((PID >> 16) ^ (PID & 0xFFFF) ^ TID) >> 3) << 3, y ∈ ⟦0 ; 7⟧ }

PID similaires

On dit que 2 PID sont similaires si il existe un couple d'id dresseur et d'id secret tel que les 2 PID sont shiny.
Les propositions suivantes sont équivalentes:
  • PID1 et PID2 sont similaires. (1)
    ((PID1 >> 16) ^ (PID1 & 0xFFFF) ^ (PID2 >> 16) ^ (PID2 & 0xFFFF)) >> 3 = 0 (2)
    Tout couple d'id dresseur et d'id secret qui rend un des PID shiny rend l'autre PID shiny. (3)


Démonstration:
(1) => (2)
((PID1 >> 16) ^ (PID1 & 0xFFFF) ^ TID ^ SID) >> 3 = 0 et ((PID2 >> 16) ^ (PID2 & 0xFFFF) ^ TID ^ SID) >> 3 = 0

donc: ((PID1 >> 16) ^ (PID1 & 0xFFFF) ^ TID ^ SID) >> 3 = ((PID2 >> 16) ^ (PID2 & 0xFFFF) ^ TID ^ SID) >> 3
<=> (((PID1 >> 16) ^ (PID1 & 0xFFFF)) >> 3) ^ ((TID ^ SID) >>3) = (((PID2 >> 16) ^ (PID2 & 0xFFFF)) >> 3) ^ ((TID ^ SID) >>3) grâce à la propriété 3
<=> (((PID1 >> 16) ^ (PID1 & 0xFFFF)) >> 3) = (((PID2 >> 16) ^ (PID2 & 0xFFFF)) >> 3) grâce à la propriété 1
<=> (((PID1 >> 16) ^ (PID1 & 0xFFFF)) >> 3) ^ ((PID2 >> 16) ^ (PID2 & 0xFFFF)) >> 3) = 0 grâce à la propriété 2
<=> ((PID1 >> 16) ^ (PID1 & 0xFFFF) ^ (PID2 >> 16) ^ (PID2 & 0xFFFF)) >> 3 = 0

(2) => (3)
On a ((PID1 >> 16) ^ (PID1 & 0xFFFF) ^ (PID2 >> 16) ^ (PID2 & 0xFFFF)) >> 3 = 0
<=> (((PID1 >> 16) ^ (PID1 & 0xFFFF)) >> 3) ^ (((PID2 >> 16) ^ (PID2 & 0xFFFF)) >> 3) = 0 (*)
Sans perte de généralité, soit TID et SID un couple d'id dresseur et secret tel que PID1 est shiny:

((PID1 >> 16) ^ (PID1 & 0xFFFF) ^ TID ^ SID) >> 3 = 0
<=> (((PID1 >> 16) ^ (PID1 & 0xFFFF)) >> 3) ^ ((TID ^ SID) >> 3) = 0
<=> (((PID1 >> 16) ^ (PID1 & 0xFFFF)) >> 3) = ((TID ^ SID) >> 3)

En substituant (((PID1 >> 16) ^ (PID1 & 0xFFFF)) >> 3) par ((TID ^ SID) >> 3) dans (*) on obtient après commutativité:
(((PID2 >> 16) ^ (PID2 & 0xFFFF)) >> 3 ) ^ ((TID ^ SID) >> 3) = 0
<=> ((PID2 >> 16) ^ (PID2 & 0xFFFF) ^ TID ^ SID) >> 3 = 0
Donc PID2 est shiny

(3) => (1)
trivial d'après la définition

Exemple:
Les PID 0xDB45E669 et 0x05D738F8 sont similaires.

Remarque:
- Le nombre (TID ^ SID) >> 3 compris entre 0 et 8191 est appelé TSV. Il détermine l'ensemble des PID qui sont shiny pour une partie donnée.
- On en déduit donc que pour deux PID donné, les 2 Pokemon seront soit toujours shiny ensemble soit jamais shiny ensemble sur une même partie. Cette remarque est aussi intéressante pour la chasse de Manaphy. En effet si 2 Manaphy ont des PID similaires (ce qui a 1/8192 de se produire donc certain vont négliger ce risque), alors c'est comme si vous chassiez avec deux manaphy clonés.

Génération des starters dans HGSS

Si la frame vaut n lorsque les starters sont générés.
est généré à la frame n.
est généré à la frame n+4.
est généré à la frame n+8.


sachant que sn+4 = f4(sn) et sn+8 = f4(sn+4) il est plus rapide de d'appliqer directement f4 après l'avoir calculer plutôt que d'appliquer 4 fois f.
  • f4 : ⟦0 ; 0xFFFFFFFF⟧ → ⟦0 ; 0xFFFFFFFF⟧
    s → (a4*s + b4) & 0xFFFFFFFF
    avec a4 = 0xEE067F11 et b4 = 0x31B0DDE4
    sn+4 = f4(sn)

Pour trouver les coefficients a4 et b4 on calcule les coefficients de f2, f3 puis f4:

Comment déduire une seed donnant un PID à la frame n+1 connaissant une seed donnant ce PID à la frame n

On note s1 une seed donnant le PID à la frame n.
Une seed s1' donnant le PID à la frame n+1 .

Elle devrait vérifier f(s1') = s1.
On a déjà vu que f est bijective et on connait sa réciproque f-1. Ainsi:
  • s1' = f-1(s1)

Remarque:
On en déduit qu'il y a autant de seed donnant un certain PID à chaque frame.

Manipulations pour obtenir les 3 starters shiny

Recherche de seed

Soit n > 0 un entier. On cherche toutes les seed sn tel que les PID (qu'on note PID1, PID2, PID3) aux frames n, n+4 et n+8 soient similaires.
Pour que les 3 PID soient shiny il suffira ensuite de prendre un id dresseur et secret tel que le 1er PID soit shiny.
PID1 = ((sn+2 >> 16) << 16) + (sn+1 >> 16)
PID2 = ((sn+6 >> 16) << 16)+ (sn+5 >> 16)
PID3 = ((sn+10 >> 16) << 16) + (sn+9 >> 16)

PID1 et PID2 sont similaires si et seulement si ((PID1 >> 16) ^ (PID1 & 0xFFFF) ^ (PID2 >> 16) ^ (PID2 & 0xFFFF)) >> 3 = 0
PID1 >> 16 = sn+2 >> 16, PID1 & 0xFFFF = sn+1 >> 16, PID2 >> 16 = sn+6 >> 16, PID2 & 0xFFFF = sn+5 >> 16
ainsi PID1 et PID2 sont similaires équivaut à ((sn+2 >> 16) ^ (sn+1 >> 16) ^ (sn+6 >> 16) ^ (sn+5 >> 16)) >> 3 = 0
<=> ((sn+2 ^ sn+1 ^ sn+6 ^ sn+5) >> 16) >> 3 = 0 grâce à la propriété 3
<=> grâce à la propriété 4:
  • (sn+1 ^ sn+2 ^ sn+5 ^ sn+6) >> 19 = 0


De la même façon PID1 et PID3 sont similaires si et seulement si
  • (sn+1 ^ n+2 ^ sn+9 ^ sn+10) >> 19 = 0


On recherche donc toutes les seed sn qui vérifient les 2 conditions. L'algorithme naïf est de tout simplement tester les 232 seed possibles et stocker juste celle qui vérifient les 2 conditions:
Il y a donc 48 seed donnant 3 PIDs similaires pour chaque frame. On peut donc faire une liste des 48 triplets possibles de PIDs, ivs nature etc des starters lorsque les 3 sont shiny. On en déduit que la plupart des combinaisons d'id dresseur et secret ne pourront pas donner les 3 starters shiny. Après calcul, on se rends que c'est possible pour seulement 15 TSV.

Il y a moyen de faire plus rapide en utilisant le fait que appliquer f 232-1 fois permet de parcourir toutes les seed, ce qui évite de calculer plusieurs f appliqué à une même seed. Cependant on reste dans une approche qui est de tester toutes les seeds.

La seconde méthode que je vais proposer permet d’obtenir toutes les seed sans toutes les tester. L'idée est que si on connait les i derniers bits d'une seed sn alors on peut calculer les i derniers bits des seeds sn+k. De plus si on connait les i derniers bits de 2 nombres, on peut calculer les i derniers bits de xor entre ces 2 nombres. L'intérêt de cette remarque est qu'on peut éliminer certaines seed rien qu'en connaissant ces i derniers bits et donc ne tester que les seeds avec les i derniers bits qu'on a pas éliminé.

On pose mi = 2i - 1
Les i derniers bits d'un entier s peut se noter s & mi
On note Sn,i = sn & mi
ainsi:
  • Sn,0=0
    pour tout entier i ∈ ⟦1 ; 32⟧: Sn,i = Sn,i-1 ou Sn,i = 2i-1 + Sn,i-1
    Sn,32 = sn


On note aussi Ai = a & mi, Bi = b & mi, A4i = a4 & mi et B4i = b4 & mi
En partant de sN+1 ≡ a * sN + b [232] et sN+4 ≡ a4 * sN + b4 [232]
En utilisant les propriétés:
- s1 ≡ s2 [232] => pour tout entier i ∈ ⟦1 ; 32⟧, s1 ≡ s2 [2i]
- s ≡ s & mi [2i]
- s1 ≡ s2 [2i] <=> s1 & mi = s2 & mi
On obtient:
  • Sn+1,i = (Ai * Sn,i + Bi) & mi
    Sn+2,i = (Ai * Sn+1,i + Bi) & mi
    Sn+5,i = (A4i * Sn+1,i + B4i) & mi
    Sn+6,i = (Ai * Sn+5,i + Bi) & mi
    Sn+9,i = (A4i * Sn+5,i + B4i) & mi
    Sn+10,i = (Ai * Sn+9,i + Bi) & mi

On obtiendrait le même resulat en remplaçant Ai par a, mais les calculs sont plus rapide en prenant le plus petit nombre congru à a modulo 2i, c'est à dire Ai.
(sn+1 ^ sn+2 ^ sn+5 ^ sn+6) >> 19 = 0 <=> (sn+1 ^ sn+2 ^ sn+5 ^ sn+6) & 2i-1 = 0 pour tout entier i ∈ ⟦20 ; 32⟧

(sn+1 ^ sn+2 ^ sn+5 ^ sn+6) & 2i-1 = 0
<=> ((sn+1 ^ sn+2 ^ sn+5 ^ sn+6) & 2i-1) >> (i-1) = 0
<=> ((sn+1 ^ sn+2 ^ sn+5 ^ sn+6) & mi) >> (i-1) = 0
<=> ((sn+1 & mi) ^ (sn+2 & mi) ^ (sn+5 & mi) ^ (sn+6 & mi)) >> (i-1) = 0
<=>
  • (Sn+1,i ^ Sn+2,i ^ Sn+5,i ^ Sn+6,i) >> (i-1) = 0 pour tout entier i ∈ ⟦20 ; 32⟧

De la même façon
  • (Sn+1,i ^ Sn+2,i ^ Sn+9,i ^ Sn+10,i) >> (i-1) = 0 pour tout entier i ∈ ⟦20 ; 32⟧


L'algorithme a le gros avantage de terminer en quelques secondes et peut s'adapter à d'autres système d'équations avec congruence. Il donne évidemment le même résultat que l'algorithme précédant.

Hypothèse 1: On sauvegarde devant les

pas de passage de 23h59 à 0:00 => frame = 1
Si on sauvegarde devant les , on ne peut pas sortir du laboratoire et dans le laboratoire rien ne peut augmenter la frame. Dans ce cas la frame vaudra toujours 1.
Ainsi n=1 et il suffit de prendre directement les seed obtenues précédemment.
Pour calculer le delay minimum de ces seed, en partant de l'année 2000 (2099 ne diminurait que de 99 le delay), on prends le 3ème et 4ème chiffre en hexadécimal.
Si ça forme un nombre sictrement supérieur à 0x17=23 (23 est l'heure maximal), on retire 23, sinon on prends 0 puis on multiplie le résulat par 0x10000.
On rajoute ensuite le delay formé par les 4 derniers chiffres. La formule est donc:
  • delay = max(0, (seed & 0xFF0000)-(23 << 16)) + (seed & 0xFFFF)



"1st PID est le PID" de (ce qui sert à chercher une combinaison TID/SID qui le rend shiny).
1 delay vaut environ 1/60 secondes. Le meilleur delay est de 2 350 367. Il faudrait presque 11h pour atteindre les meilleurs seed (11h entre le reset et le moment on appuie sur continuer....).

passage de 23h59 à 0:00 => frame = 3
Ce qui m'a perturbé dans la vidéo d'Angeflo, c'est la frame de départ différente de 1. Pourtant si vous posez la question ou cherchez, il y a de grande chance pour qu'on vous dise que la frame de départ vaudra toujours 1 si on ne sort pas du labo. En jouant avec le simulateur, j'ai remarqué que lorsqu'on recharge une "savestate" à une date différente, cela peut augmenter la frame. J'ai fait quelques tests sur simulateur et console. J'ai ensuite posé des questions sur certains serveur discord spécialisés en RNG. J'ai pu confirmer que la frame augmente de 2 au passage de 23:59 à 0:00.
Voici les seed pouvant donner les 3 starters shiny à la frame 3 avec leur delay:


Le meilleur delay est mieux: 593 415. Cela donne des seed qui mettent environ 2h45 à être atteintes.

Hypothèse 2: On sauvegarde mais pas devant les

On pourrait se demander l'intérêt. Comme expliqué précdemment, si on sauvegarde devant les , il n'est pas possible d'augmenter la frame. Le seul moyen à ce stade du jeu est d'utiliser le mouvement des PNJ (il est pseudo aléatoire et mais il est hors de question de calculer ce mouvement). On va faire comme les speedrunner, utiliser un simalteur pour faire plusieurs essaies rapidement avec une seed et voir s'il existe une manipulation qui permet de revenir au laboratoire avec la frame désiré à partir de cette seed (la frame ne bouge pas dans le laboratoire si ce n'est le passage de 23h59 à 0h00). On ne cherchera des seed avec des frames peu élevé (< 50)

L'idée est de trouver pour n variant de 2 à 50 une seed s1 ayant un delay pas trop élévé (on va dire delay < 3000) tel que sn soient une des seed trouvées précédamment pouvant donner les 3 starters shiny.

On sauvegardera à l'intérieur du labo devant la porte. Sinon la RNG va dépendre du moment on a sauvegarder à cause de la position des PNJ. Il va falloir trouver un manipulation qui permet d'atteindre la frame désiré (une même manipulation ne vas pas toujours augmenter du même nombre la frame, cela dépends de la seed). L'émulateur permet de reprendre le jeu à un moment précis sans perdre la seed une fois rechargé et de tester plusieurs manip rapidement tout en pouvant visualiser la frame avancer.

J'ai pris comme exemple la seed D912064F et la frame 17:
Il faut au préalable une combinaison TID/SID qui rends le PID DB45E669 shiny.
Je sors du labo, j'effectue 6 pas en bas et je reviens dans le labo sans m'arrêter (ne pas s'arrêter permet d'avoir une mesure du temps fixe). Ceci ne marche que pour cette seed.




Hypothèse 3: On ne sauvegarde pas et récupère directement les starters

L'id dresseur et secret sont générés à partir à partir de s1. Le jeu génère un nombre de 32 bits, la première moitié est l'id secret et la seconde moitié l'id dresseur. Ce nombre est deuxième résulat de l'algorithme de Mersenne Twister. Pour information c'est un meilleur générateur avec une période de 219937 -1.
Pour expliquer grossièrement comment ça marche, on initialise un tableau de 624 nombre à partir d'une seed. On applique une fonction twist pour transformer ce tableau en un nouveau tableau de 624 nombres. Si on veut plus de nombres on applique la fonction twist autant de fois que nécéssaire. Avant de renvoyer un résulat, on lui applique une autre fonction à chaque nombre en sortie. Voilà concrètement le fonctionnement de Mersenne Twister et comment est généré le n ième nombre par cet algorithme:


Le travail précédant va bien faciliter la tâche. De la même façon que l'hypothèse 2, on cherche les seeds s1 tel que sn se trouve dans la liste des seed trouvés avec n "pas trop grand" ( < 4000). De plus il faut que on démarre la partie avec un id dresseur et secret qui rende le PID de la frame n shiny .


On peut éliminer la seed 920106BD qui a un delay trop faible (en effet il faut un certain pour commencer une partie).
Sinon la meilleur seed en terme de delay est 5F021749 (le delay vaut 5691). On pourrait chercher une manipulation permettant d'atteindre la frame 3841. Je l'ai fait sur émulateur mais je ne vais pas détailler cette manipulation.
Lorsqu'on est dehors, la frame augmente environ de 3 par seconde. Il est assez peu crédible qu'un joueur passe assez de temps dehors pour atteindre cette frame (en plus de viser cette seed).

Analyse de la vidéo d'Angeflo




Angeflo a répondu très vite au drama et a pu apporter des réponses intéressantes. Voici mes quelques remarques ou correction
Concernant le pastebin, le delay n'est pas correct pour les seeds. Il semble qu'il a oublié le terme (seed & 0xFFFF) dans la formule du delay. De plus les seed sont sous forme décimale. Il aurait été mieux de les écrire en hexadécimal pour pouvoir les copier directement dans un logiciel de RNG.

Pour la vidéo:
-Oui il est possible d'obtenir les 3 starters shiny en même temps. Je l'ai fait sur console
-Concernant les seeds dont parle Angeflo, elles demandent un delay énorme. On pourrait les atteindre de manière légal mais ça prendrait des heures, un SH est sensé faire ses reset rapidement. Il n'est pas à exclure que Isaaveon ait mis son jeu en pose pendant des heures et ait ensuite appuyer sur continuer pour tomber par hasard sur une des bonnes seed en plus d'avoir le bon TSV. Mais c'est un sérieux argument contre la crédébilité d'Isaaveon.
-Pour la frame de départ, elle sera presque toujours égale à 1 (seul exception c'est le passage de 23h59 à 0h00 ou elle augmente de 2 pour passer à 3, on retrouve cette fameuse frame = 3 que j'ai d'abord trouvais bizarre). La manière dont Angeflo change la seed sur émulateur a provoqué cette augmentation de frame.

Réponses à certaines questions ou remaques que j'ai vu passé

La proba d'avoir les 3 starters shiny est d'environ 1/550 milliard?
Parmi les 2^32 seeds, on a vu que seul 48 peuvent donner les 3 starters shiny pour chaque frame (avec le TSV correspondant) ce qui donnerait une proba de 48/245. Pour que cette probabilité valle 1/81923 (c'est à dire 1/239), il faudrait qu'il y ait 26 = 64 seeds.
Je dis ça comme si toutes les seeds sont équiprobables mais c'est faux: la plupart des seeds demandent
Donc cette probabilité est fausse et donner une probabilité à cette évènement n'est pas vraiment pertinente. Si vous resetez sans attendre des heures avant d'appuyer sur continuer, vous aurez une probabilité de 0 (il faudrait en plus avoir un des bon TSV).

Il n'y a pas de seed avec 3 frames shiny consécutives?
C'est faux voici un exemple:
On ne peut pas en avoir plus de 3 d'ailleurs. Il y a 56 seed avec 3 frames shiny consécutives pour n'importe quelle frame de départ (très facile et rapide à trouver en changeant un peu mes algos).
Je ne sais pas d'où vient cette idée reçu. En plus on a vu que les frames des starters sont espacées de 4.

Conclusion

Au vu des résultats obtenu, les conditions permettant d'obtenir les 3 starters shiny sont très particulières et ne sont pas vraiment compatible avec une pratique "classique" du shiny hunting (en plus de la chance incroyable qu'il faut). Plus précisémment:
Il faut déjà une bonne combinaison id dresseur et secret (ce qui arrive environ 1 fois sur 546). C'est tout à fait possibe mais ça montre au moins que la grande majorité des parties ne peuvent pas avoir les 3 starters shiny en même temps.
Il n'y a aucune raison de penser qu'un joueur si il sauvegarde le fera ailleurs que devant les .
Cela limite énormément les frames atteignables: 1 dans la grande majorité des cas et 3 si en jeu on passe de 23h59 à 0h00.
Dans ses 2 cas les seeds demandent plusieurs heures à être atteintes (~10h55 pour les seed de frame ~ 2h45 pour les seed de frame 3)


L'hypothèse 2 était clairement la méthode la plus simple et rapide pour atteindre les 3 starters shiny. C'était avant tout pour montrer une manipulation rapide permettant d'obtenir les 3 starters shiny.
L'hypothèse 3 est plus crédible même si ça ne devrait concerner que le premier reset. La meilleur seed trouvé demande quand même d'atteindre la frame 3841. En étant dehors et avec le mouvement des PNJ la frame augmente d'environ 3 par seconde. Si vous connaissez le jeu, on est invité assez vite à entrer dans le laboratoire et ainsi à bloquer l'augmentation de la frame.
En clair il est impossible de dire dans l'absolu si Isaaveon a menti, mais elle n'est pas vraiment crédible. Il n'y a que 48 Héricendre possibles dans ces conditions, il aurait été facile de vérifier... Le but n'est évidemment pas de blâmer Isaaveon qui a déjà assez pris dans cette affaire pour au final pas grand chose (le Shiny Hunting est une affaire de confiance mais ça reste un jeu).

Source que j'ai utilisé pour reproduire la RNG du jeu

Article de smogon
Blog WorldPress
Article ajouté le Vendredi 22 Octobre 2021 à 23h16 |
1 commentaire
ghost RS
Pikachu
Jolly Nature
EVs: 4 HP / 252 Atk / 252 Spe
Play Rough 16PP
Shadow Claw 24PP
Wood Hammer 24PP
Swords Dance 32PP

Glitch
Brave Nature
EVs: 252 Atk / 252 SpD
IVs: 0 Spe
Hone Claws 24PP
Agility 48PP
Baton Pass 64PP
Shadow Sneak 48PP

ClownBeast
Timid Nature
EVs: 4 HP / 252 SpA / 252 Spe
IVs: 0 Atk
Flamethrower 24PP
Shadow Ball 24PP
Ember 24PP
Solar Beam 16PP



In lead:
: ->
: ->
: SD
: SD is the safest. You don't want Misty Explosion on when it's not the last Pokemon
: -> if not paralysed, let you spore and pp stall ofensive move by switching because clear smog release +2 speed
: -> Shadow sneak to have -70% HP Appletun (2 often but there is a chance to crit one) Baton pass when there is no sun.
: -> Baton pass stall ???
: -> Baton pass stall ???
: -> Be careful about acupressure boost. If +6 speed go on Always consider it can have boost in SpD, Speed the turn you baton pass.
: ->
: -> is safer
: -> PP stall Sucker punch
: SD
: It sucks. SD 1st turn. If electrify, SD again, else dynamax
: -> PP stall earthquake with baton pass
: SD
: SD
: -> Take burn up on
It sucks with multi hit. Dynamax without SD
->
SD
It sucks. It can rock blast 1st turn. Try SD twice if possible
































































































































Article ajouté le Vendredi 22 Janvier 2021 à 12h37 |
0 commentaire
Manipluation de la RNG dans Épée et Bouclier
C'est quoi la RNG?

RNG est l’abréviation en anglais de Random Number Generator. C'est la manière dont le jeu génère tout ce qui nous semble aléatoire. En réalité en informatique, l’aléatoire n'existe pas, tout l'aléatoire est calculé à partir de fonctions complexes. Grâce aux hackers qui peuvent lire le code du jeu, il est possible de connaître ses fonctions et de prédire ce que le jeu va générer.

A quoi ça sert?
Exploiter la RNG peut servir à beaucoup de chose (dans les speedrun par exemple), ici on va l'utiliser pour obtenir des Pokémon précis dans les Raid (caractère shiny, ivs, nature etc...).

La méthode:

1) Il faut choisir un Pokémon présent dans les Raid. Ici je vais choisir un Métamorph avec tous les IV à 31 sauf en vitesse ou l'IV vaudra 0.

2) Choisissez une antre ou se trouve le Pokemon que vous cherchez.
Liste des Pokémon et des antres ou ils sont disponibles
Liste des Pokémon et des antres ou ils ont leurs talents cachés
Liste des événements de Raid Dynamax. N'importe quel antre peut accueillir ces Raids.

3) Pour les Raids communs et événements placez un morceau voeu (au bon endroit pour les communs). Le rayon lumineux doit être rouge. Si ce n'est pas le bon raid, placez un morceau voeu dans une autre antre.

Pour les Raids rare sauvegarder devant l'antre après avoir mis le texte en vitesse Lente.
Placer un morceau voeu et fermez le jeu juste avant la fin du texte de sauvegarde tant que le faisceau lumineux est rouge.



Une fois le faisceau violet obtenu, remettez le texte en vitesse rapide et sauvegarder.

Il ne faudra plus sauvegarder jusqu'au prochain message en gras

4)Attraper le premier Pokémon de ce Raid, placer le en première position d'une boîte en afficher l'image du Pokémon.



Il va falloir maintenant obtenir un nombre qui s'appelle seed qui dépends du Pokémon attrapé. Il est possible de l'obtenir soi même mais cela demande beaucoup de temps car cette méthode ne marche pas souvent.

5) Connectez vous sur ce site depuis un support autre que le switch. Il faudra que l'onglet soit ouvert tant que vous n'avez pas obtenu votre seed.

6) Connectez vous à Internet sur le jeu. Il va falloir commencer un échange avec un robot qui s'appelle Dudu.
Pour cela il faut faire un échange réseau avec le code 9162. Il est probable que vous rencontriez d'autres joueurs à la place. Continuez les échanges jusqu'à tomber sur Dudu.



Essayez alors de lui échanger le Pokémon que vous avez attraper dans le Raid. Le robot va quitter automatiquement et un code (votre seed) apparaitra sur le site avec juste au dessus votre pseudo avec entre parenthèse le nom du Pokémon de votre Raid en anglais. Notez rapidement bien cette seed quelque part.



Fermez le jeu sans sauvegarder.

Pour augmentez les chances de tomber sur Dudu, commencer la recherche d'échange environ 3 secondes après que un des robots affichent le message "Starting Search" sur le site.



7) Télécharger le logiciel à l'adresse suivante, le premier fichier RaidFinder-win64.zip. Dézipper le fichier ouvrer le logiciel RaidFinder dans le dossier RaidFinder-windows. Vous pouvez changer la langue avec Settings->Language. Pour mettre à jour les raid évènements : Tools->Download Event data puis faîtes OK après avoir choisi.

8) Remplissez les cases suivantes. Il faut remplir la case Rarety avant la case Den. En effet le numéro du Den sur le logiciel ne correspond pas au numéro de l'antre sur Pokébip. Selectionnez le bon den en regardant la case Species.
La Seed est la numéro que vous avez obtenu sur le site.
Pour commencer mettez Initial Frame et Maximum Results à 1 et 10000 respectivement.



En sélectionnant dans Species le Pokémon que vous avez attrapez (pour un Métamorph 4 étoiles ça peut être Métamorph 3-4 ou Métamorph 4-5) et en appuyant sur Generate, vous pourrez vérifier que le Pokémon à la Frame 1 correspond bien au Pokémon attrapé.



9) Commencer par choisir les informations en haut à droite. La première valeur à côté de chaque statistiques est l'IV minimal, la deuxième l'IV maximal. Choisissez 0 ~ 31 si les IVs ne vous intéresse pas.
Si vous voulez un shiny, mais que la forme des étoiles ne vous intéresse pas, sélectionnez Stare/Square dans la case Shiny
Pour les autres cases, à vous de choisir!

Appuyer sur Generate, si il n'y a aucun résultat vous pouvez augmenter Max Results et Initial Frame. Cependant, 10 000 frames vous prendra environ 3h, ne soyez pas trop gourmand, n'hésitez pas à recommencer depuis le début dans ce cas.

Pour les raids Métamorph ou évènements, vous pouvez changer le nombre d'étoile. Mais le caractère Shiny ne dépends que de la Seed.



10) Le premier Pokémon du Raid est à la frame 1,
Le métamorph que je recherche est à la frame X=865. Il faut dans un premier temps viser la frame X-3=862.
Il faut donc augmenter de 861 la frame.

Normalement, il faut attendre minuit chaque jour pour augmenter la frame de 1. Cependant certains glitch permettent d'augmenter très rapidement les frames, le simple changement de date ne fonctionne pas directement.

11) Vu qu'on augmente les frames des centaines ou milliers de fois, une erreur est possible. Je recommande fortement de s'arrêter en cours de route.

Dans un premier je vais augmenter la frame de 850 avec la méthode rapide, je dois donc augmenter la date de 850 jours. Pour savoir à quelle date s'arrêter, ce site peut la calculer.

Je vérifie ensuite à quelle frame je suis. Je suis tombé à la frame 851.

Pour arriver à 862, je dois encore augmenter la frame de 11. Pour cela je vais utiliser la méthode moins rapide.
Je peux ensuite vérifier si je suis à la frame 862.

12) Une fois à la frame 862, j'augmente ensuite la frame de 3 avec la méthode moins rapide. Si ce n'est pas le Pokémon recherché (Pour les recherches autre que shiny attention au nombre d'étoiles pour Métamorph et les évènements), éteignez sans sauvegarder et recommencer.
Pour les recherches d'IVs de Métamorph, recommencez si le Raid est 4 étoiles.

13) Une fois que vous avez le bon Pokémon à la bonne frame (865 pour moi), sauvegardez et normalement le Pokémon en Raid a toutes les caractéristiques que vous voulez!


Article ajouté le Vendredi 23 Novembre 2018 à 12h52 |
0 commentaire
Méthode Rapide

Cette méthode vous permettra d'augmenter la frame d'environ 1 par seconde. Pour cela il faut activer un glitch:
Connectez vous à Internet puis chercher un combat réseau. Dès que vous avez trouvez quelqu'un allez dans les paramètres, activer puis désactiver le mode Avion et revenez en jeu.




Il suffit ensuite d'augmenter la date de 1 jour pour augmenter la frame de 1.
Si vous augmentez directement la date de 2 jours ou plus, la frame augmente seulement de 1.
Il n'y a pas besoin de revenir en jeu!
Une fois la date voule atteinte, sauvegardez.




Il est possible que le jeu crash pendant que vous êtes dans les paramètres. Vous devrez alors reprendre la frame depuis la dernière sauvegarde et réactiver le glitch.
Je vous conseille de sauvegarder en jeu tous les ans afin de ne pas trop perdre en cas de crash.


Article ajouté le Mardi 05 Mai 2020 à 22h00 |
1 commentaire
Méthode moins rapide mais plus sur.

Très simple, il suffit de lancer un Combat à plusieurs! à partir de votre Raid, d'aller dans les paramètres, d'augmenter la date de 1 jour, de revenir en jeu et de quitter la recherche. La frame augmente de 1.
Si vous augmentez la date de 2 jours ou plus sans revenir en jeu, la frame augmente seulement de 1.
Sauvegardez une fois la date voulu atteinte.

Article ajouté le Mardi 05 Mai 2020 à 22h01 |
0 commentaire
Calculer à quelle frame vous vous trouvez

Capturez le Pokémon. Vous ne devez sauvegarder après avoir capturé le Pokémon
Montez le au niveau 100 avec des objets et calculer ses ivs à l'aide de ce site. Appuyez sur Calculate Individual Values en bas pour obtenir les IVs en haut à droite.



Remplissez Species, les IVs et la nature dans le logiciel. Vous pouvez laisser les cases Ability, Gender, Shiny à Any.
Appuyez sur Generate et normalement votre frame apparaitra. Si il y a plusieurs résultats, c'est bien sûr le résultat le proche de la frame ou vous pensez être.



Pour un Métamorph 4 étoiles, tester Métamorph 3-4 et Métamorph 4-5 dans Species.

Article ajouté le Mardi 05 Mai 2020 à 22h01 |
0 commentaire