![](https://projectpokemon.org/home/uploads/set_resources_30/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
marcos9191
Member-
Posts
62 -
Joined
-
Last visited
Reputation
10 GoodAbout marcos9191
- Birthday 02/12/1991
-
Beta: the pokécheck legality checker for generation 5
marcos9191 replied to xfr's topic in Pokémon Legality
I know perfectly how to work the trash bytes in all generations, if you really want my help for pokecheck, send me a pm. Also I have a list of combinations id / sid invalid in 4th gen. -
Generation 4 hatch trash bytes research - help wanted for foreign games
marcos9191 replied to xfr's topic in Legality Checker
Remember that once hatched the egg, whether puts nickname or not, if you change the nicknames with nickname evaluator from the first pair of FF's the rest are pairs of 00's. And the same for the trash bytes of gba, you can change the nickname because the only requirement is the id/sid of trainer match with id/sid of pokémon. -
Beta: the pokécheck legality checker for generation 5
marcos9191 replied to xfr's topic in Pokémon Legality
To avoid create confusion, but just it's a suggestion -
Beta: the pokécheck legality checker for generation 5
marcos9191 replied to xfr's topic in Pokémon Legality
I think (only as a suggestion) you could add "provably because nick was changed after hatching" into the warning "This Pokémon is missing DPPt hatch trash bytes" and "This Pokémon is missing HG/SS hatch trash bytes", is the only legal chance to have them so if don't have DPPl or HG/SS trash bytes. -
Beta: the pokécheck legality checker for generation 5
marcos9191 replied to xfr's topic in Pokémon Legality
This pokemon is valid because when you trade an egg the game changes the OT, tid, sid and game (country not change) This pokemon is hacks because the nature, gender or iv's speed is not same of the wonder card. You see this axew and compare with the others: https://www.pokecheck.org/?p=detail&uid=3031363 note: this axew obtained in english edition and before hatch I traded into a black 2 spanish edition In this link you can see it's the same (in this case is a squirtle egg event traded into white spanish version): https://www.pokecheck.org/?p=detail&uid=3020837 -
Beta: the pokécheck legality checker for generation 5
marcos9191 replied to xfr's topic in Pokémon Legality
Lack update the world12 pikachu spanish version, missing the title of the wonder card but the pokemon could be added because the type of pid is the same for all pikachu's that event: https://www.pokecheck.org/?p=detail&uid=2397789 -
I need the trash bytes from gba games off all regions (except position 1 off hg-ss and position's 1-6 of pearl, all in spanish),ie, I need the trash bytes (including positions 1-6) from ddpl & hg-ss games in spanish, english, french, italy, german, korean and japanese except those mentioned above (If anyone has a list), To check the trash bytes from gba games with TeamChecker. Whether they serve me 4th or 5th gen, it would only replace the last 2 bytes per 0xFFFF
-
help with source code to decrypt .sav from bw
marcos9191 replied to marcos9191's topic in Saves - Research
I've solved: Method Rand: seed = (0x41C64E6D * seed + 0x6073) & 0xFFFFFFFF; return seed; and line to sequential to shuffle 0x08-0x87: temp = (long) (((pkm+(pkm[b+1]<<8)))^(rand())>>>16); Thank's to RubenPikachu and codemonkey85 for help me. Now only remains write check of team gradually and adapt it to the .sav file, in 3-4 weeks I hope to have a version with the basics checks. -
help with source code to decrypt .sav from bw
marcos9191 replied to marcos9191's topic in Saves - Research
CODE; import java.io.*; import javax.swing.JFileChooser; //TeamCheck5Gen public class PokemonTeamCheck5Gen { //variables estaticas necesarias static long seed; public static void main(String[] args)throws Exception{ //Read encrypted pkm extracted from .sav (0x18E08 - 0x18E0B = pid poke 1) JFileChooser fileopen = new JFileChooser(); fileopen.setDialogTitle("Team Checker (Written by marcos91)"); if (fileopen.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){ File file = fileopen.getSelectedFile(); FileInputStream fis = new FileInputStream(file); DataInputStream input = new DataInputStream(fis); int[] pkm = new int[136]; for (int i=0; i<136; i++){ pkm[i] = input.readUnsignedByte(); } //PID String b0 = AddZeros(Integer.toHexString(pkm[0x00])); String b1 = AddZeros(Integer.toHexString(pkm[0x01])); String b2 = AddZeros(Integer.toHexString(pkm[0x02])); String b3 = AddZeros(Integer.toHexString(pkm[0x03])); String spid = b3+b2+b1+b0; long pid = Long.parseLong(spid,16); System.out.println(pid); //Checksum String b6 = AddZeros(Integer.toHexString(pkm[0x06])); String b7 = AddZeros(Integer.toHexString(pkm[0x07])); int checksum = Integer.parseInt(b7+b6,16); System.out.println(checksum); //Ordenar bloques ABCD int num = Math.round(((pid & 0x3E000) >> 0xD) % 24); String orden = ""; orden = OrdenABCD(num, orden); String ordenCopiar = orden; System.out.println(num + "=" + orden + "Inverso="+ ordenCopiar); //Desencriptar pkm seed = checksum; //inicializa la seed con el checksum long temp = 0; int b = 8; int[] x = new int[136]; for (b=8; b<136;){ char opc = orden.charAt(0); switch(opc){ case 'A': for (int j=8; j<0x28; j+=2){ [b] temp = (long)(((pkm[b]+(pkm[b+1]<<8)))^(rand())); x[j+1] = (byte)((byte)((temp & 0xFF00)>>>8)); x[j] = (byte)((byte) temp & 0xFF); b+=2;[/b] } System.out.println("a entrado en a"); orden = orden.replace("A",""); break; case 'B': for (int j=0x28; j<0x48; j+=2){ temp = (long)(((pkm[b]+(pkm[b][b+1]<<8)))^(rand())); x[j+1] = (byte)((byte)((temp & 0xFF00)>>>8)); x[j] = (byte)((byte) temp & 0xFF); b+=2;[/b] } System.out.println("a entrado en b"); orden = orden.replace("B",""); break; case 'C': for (int j=0x48; j<0x68; j+=2){ [b] temp = (long)(((pkm[b]+(pkm[b+1]<<8)))^(rand())); x[j+1] = (byte)((byte)((temp & 0xFF00)>>>8)); x[j] = (byte)((byte) temp & 0xFF); b+=2;[/b] } System.out.println("a entrado en c"); orden = orden.replace("C",""); break; case 'D': for (int j=0x68; j<0x88; j+=2){ temp = (long)(((pkm[b]+(pkm[b][b+1]<<8)))^(rand())); x[j+1] = (byte)((byte)((temp & 0xFF00)>>>8)); x[j] = (byte)((byte) temp & 0xFF); b+=2;[/b] } System.out.println("a entrado en d"); orden = orden.replace("D",""); break; } } //exportar String nombre = file.getAbsolutePath()+"exported"; FileOutputStream fos = new FileOutputStream(nombre); DataOutputStream modificar = new DataOutputStream(fos); //copiar primeros 8 bits (pid, 2 bits sin uso y checksum) for(int c=0; c<8; c++){ x[c] = pkm[c]; modificar.write(x[c]); } for(b=8; b<136;){ char opc2 = ordenCopiar.charAt(0); switch(opc2){ case 'A': for (int j=8; j<0x28; j++){ modificar.write(x[j]); b++; } ordenCopiar = ordenCopiar.replace("A",""); break; case 'B': for (int j=0x28; j<0x48; j++){ modificar.write(x[j]); b++; } ordenCopiar = ordenCopiar.replace("B",""); break; case 'C': for (int j=0x48; j<0x68; j++){ modificar.write(x[j]); b++; } ordenCopiar = ordenCopiar.replace("C",""); break; case 'D': for (int j=0x68; j<0x88; j++){ modificar.write(x[j]); b++; } ordenCopiar = ordenCopiar.replace("D",""); break; } } } } public static String AddZeros(String b){ if(b.length() == 1){ b = "0" + b; } return b; } //Metodo Rand public static Long rand(){ seed = (0x41C64E6D * seed + 0x6073) & 0xFFFFFFFF; return seed = seed>>>16; } public static String OrdenABCD(int num, String orden){ switch(num){ case 0: orden = "ABCD"; break; case 1: orden = "ABDC"; break; case 2: orden = "ACBD"; break; case 3: orden = "ACDB"; break; case 4: orden = "ADBC"; break; case 5: orden = "ADCB"; break; case 6: orden = "BACD"; break; case 7: orden = "BADC"; break; case 8: orden = "BCAD"; break; case 9: orden = "BCDA"; break; case 10: orden = "BDAC"; break; case 11: orden = "BDCA"; break; case 12: orden = "CABD"; break; case 13: orden = "CADB"; break; case 14: orden = "CBAD"; break; case 15: orden = "CBDA"; break; case 16: orden = "CDAB"; break; case 17: orden = "CDBA"; break; case 18: orden = "DABC"; break; case 19: orden = "DACB"; break; case 20: orden = "DBAC"; break; case 21: orden = "DBCA"; break; case 22: orden = "DCAB"; break; case 23: orden = "DCBA"; break; } return orden; } } Part of getting the pid, the checksum and inicial seed works, but something is not working (I think that is the part in bold) And also tried to run the program on the first generated file and generates another as the original -
help with source code to decrypt .sav from bw
marcos9191 replied to marcos9191's topic in Saves - Research
Thank's for you help. I will try in the next days and will comment the results here. -
Use this application to correct trash bytes: http://projectpokemon.org/forums/showthread.php?19106-Release-v6-Trash-bytes-Fixer-BW-amp-BW2-(version-6) note: you need JRE to run the program.
-
I want to make a "team checker" fifth generation physical tournament but there is a part that does not work well. The part of the block itself, but to decrypt the .sav file doesn't work. First I want to try a pkm extracted directly from the .sav file and then adapt it to the team. I followed this guide but for some reason I'm god at the result, for example bit 8 = c8 (encrypted) would have to get out 83 (decryption) but does not give me that number. Link of source code and reshiram (normal pkm and encrypted extracted from bw .sav): Anyone know what is wrong? I want to learn how it works ----------- public class PokemonTeamCheck5Gen { public static void main(String[] args)throws Exception{ //block a-b-c-d (0-24) Long pid = 3621399865L; int a = Math.round(((pid & 0x3E000) >> 0xD) % 24); System.out.println(a); //Read encrypted pkm extracted from .sav (0x18E08 - 0x18E0B = pid poke 1) JFileChooser fileopen = new JFileChooser(); fileopen.setDialogTitle("Team Checker (Written by marcos91)"); if (fileopen.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){ File file = fileopen.getSelectedFile(); FileInputStream fis = new FileInputStream(file); DataInputStream input = new DataInputStream(fis); int[] pkm = new int[136]; for (int i=0; i<136; i++){ pkm = input.read(); } //checksum = 0x27dd (dd27 in little endian) //Decrypt data //x[i+1] = x ^ Math.round((0x41C64E6D * 0xdd27 + 0x6073)); int[] x = new int[136]; for (int j=8; j<136; j++){ x[j] = x[j] ^ Math.round((0x41C64E6D * 0x27dd + 0x6073)); System.out.println(x[j]); } } } } TeamChecker..zip
-
Sorry for the double post. TeamChecker..zip
-
Program re-uploaded. Not been necessary to add what I said the other day, and it was not necessary to clear thinking that if he had to. I remember that improvements: -Added checksum calculation (thank's Kazowar for help me) -Added all pokémon from bw2 -Added special Zorua from bw and Manaphy from Ranger.
-
Sorry to say need to add the location of the dream radar pokemon so remove this link and upload it again next tuesday.