Metropolis
Member-
Posts
201 -
Joined
-
Last visited
Content Type
Profiles
Pokédex
Portal
Technical Documentation
Pages
Tutorials
Forums
Events
Downloads
Gallery
Blogs
Everything posted by Metropolis
-
Thanks Kanto locations, and various others like the Sevii isles exist as possibile caught locations and are recognised by Fire Red and later games. Emerald added further locations like Mirage Tower and Artisan Cave. You can see a full list by editing the caught location of a Gen 3 Poke under the Misc screen in my editor. Note that Johto locations like Slowpoke Well do not exist in any Gen 3 game, and there actually wouldn't be enough space in the locations list even if they were supported! (Since location is one byte and there would be over 256 locations). My editor attempts to recognise Gen 2 locations using an elaborate matchup - for example Lavender Radio Tower becomes the Pokemon Tower. But there are still locations it can't match. Similarly going Gen 3 to Gen 2, some locations like Virdian City can be matched but others like Littleroot Town obviously cannot.
-
I'm still supporting this, but not actively working on new features. Gen 1/2 -> 3 Pokemon are legal for in-game purposes, but will never be competitively legal. What caught location should a Slowpoke caught in Slowpoke Well have in Gen 3? There is no 'legal' possibility in the Gen 3 location data. If you wish to hack the PID etc to be legal in the cases where you can find a legal catch location, feel free to do so but there's no point implementing any form of 'legal' generator when the Pokemon are not and cannot be legal. Now deleting Gen 2-exclusive moves in the Gen 3 transfer could be possible, but were Nintendo to have supported Gen 2 to Gen 3, then as with every other bridge, the gen 2 moves would not have been deleted. Perhaps a 'Make Legal for Gen 4 on' option could be viable. My first thoughts are to use a massive lookup table of [neutral] PIDs and caught locations, but getting that to match the trainer ID would be hard. It would be a huge task that wouldn't be worth the end result, whereas Gen 2 to 3 I feel is, since this has never been possible before. If someone would like to collate a huge collection of valid PIDs, or suggest an alternative I'm open to ideas and happy to share API and codebase, but it's not as easy as just saying 'Make it Work for Gen 4' as the program supports Gen 1, 2 and 3 exclusively and that's all I'm prepared to do for free lol.
-
Incidentally, the formula appears to be the same for the Magikarp checker just south of Lavender Tower. My Editor now has an action to maximise size for Gen 3 Magikarp and Heracross. I've also implemented this formula for the gen 2 Lake of Rage Magikarp checker. The action adjusts IVs to the (unique) combination for that Magikarp's trainer ID. ie it computes the best Magikarp for your trainer ID. There is a unique Magikarp with max size and max IVs - the ID must be 0. Conversely the ID must be 65535 to get max size with minimum IVs. Another corollary of the formula is that only eight trainer IDs allow for a shiny and largest-possible magikarp. Where defense, speed and special DVs are each 10, these combinations are: ID: 60074, attack IV: 2 ID: 58026, attack IV: 3 ID: 51882, attack IV: 6 ID: 49834, attack IV: 7 ID: 43690, attack IV: 10 ID: 41642, attack IV: 11 ID: 35498, attack IV: 14 ID: 33450, attack IV: 15
-
The bit should be set if and only if the species is Mew or Deoxys. There's more info here: http://www.pokecommunity.com/archive/index.php/t-228036.html
-
Wow great work! Cool that they used a normal distribution :-) Are you sure you mean metres, not millimetres? I'm playing an EU ROM, where the pokedex is displayed as feet and inches. Is the result of a conversion calculation too? The reading the woman gave my Heracross is 44.0 inches. The values I get just before the *100/254 conversion range from 1677 to 2586. After that, they range from 640 to 1018, so not sure exactly how to get the 44 figure out. Here's the Java code I used to iterate through all the values: public static void main(String[] args) { for (int heracrossValue = 0; heracrossValue < 0xFFFF; heracrossValue++) { int size = calculateHeracrossSize(heracrossValue); System.out.println(size); } } private static int calculateHeracrossSize(int heracrossValue) { int index = 0; while (index < 15 && HERACROSS_MIN[index + 1] < heracrossValue) { index++; } int ret = heracrossValue; ret -= HERACROSS_MIN[index]; ret /= HERACROSS_SIZE[index]; ret += HERACROSS_BASE[index]; ret *= 15; ret /= 10; ret *= 100; ret /= 254; return ret; } This verifies that the result increases with hvalue. There's no dips and the highest value is when hval is 0xFFFF. This allows for generation of the (unique) lower half of the PID that will give the max height for any given IVs. These are PIDs for max-IV Heracross of each nature, in order from Hardy (0) to Quirky (24) that will give maximum height when shown to the Six Island woman: 1048575 458751 1507327 917503 327679 1376255 786431 196607 1245183 655359 65535 1114111 524287 1572863 983039 393215 1441791 851967 262143 1310719 720895 131071 1179647 589823 1638399
-
Download Metropolis Editor version 1.2
-
Anyone know the algorithm that produces the size of Heracross for the woman on Six Island in FireRed/LeafGreen?
-
Bulbapedia claims the two bytes at offset 9 and 10 represent the Pokemon's language: Note these are listed in reverse order byte10 followed by byte 9 due to little endian format. Hex Language 0x0201 Japan Flag.png Japanese 0x0202 England Flag.png English 0x0203 France Flag.png French 0x0204 Italy Flag.png Italian 0x0205 Germany Flag.png German 0x0206 South Korea Flag.png Korean 0x0207 Spain Flag.png Spanish Actually it is only byte 9 that represents language. A Lapras egg I bred using a Lapras and Ditto had 01 as byte 9 and 06 as byte 10, which changed to 02 as byte 9 and 02 as byte 10 upon hatching. The nickname is Japanese for eggs, so it's understandable the language would begin as Japanese. I think only byte 9 is language and byte 10 has a different purpose relating to eggs. I'm going to try breeding different species and see if it appears differently for a Pokemon that hatches slower than lapras. So far a Charmander egg and Weedle egg have had the same 0x06 and 0x01 combination. I can't deduce any more than: 0x02 = Not egg 0x06 = Egg Perhaps it relates to sprite, ie whether to draw the Pokemon with the egg sprite. All this was in FireRed. It's worth testing changing this value for Pokemon without the egg flag amongst the IDs. Since Pokerus is stored twice (one inside and once outside the encrpyted block) it's possible this is the same here and it's just so the game can load the sprite without having to decrypt the blocks. Amazing 10 years later there's till mysteries in these games!
-
Metropolis 1.2 is in development and will feature: Sprites matching Trainer and Pokemon species on relevant screens. Improved algorithm for faster reading and writing of files. Ensures files are not locked whilst using the editor (only for the short time when a save is being run). Multiple window support for PKM files, save files and pokemon in storage. Internal cut/copy/paste that auto-converts Pokemon from different generations, even working across multiple loaded save files. Single Load button on menu for both SAV and PKM. Various small bug fixes, such as closing the windows out of sequence will now cascade through dependent windows. Proper Pokerus editing, validation and preservation between Gen2 and Gen3 conversion both ways.
-
Newest version 1.1 with full readme, three example Gengar PKM files, various bug fixes and new features. Hidden Power IVs now preserved by Max.
-
The pokemon skips learning any level up/evolution moves if it already knows them; there's no such thing as a legitimate duplicate move. Coming soon is full edit support for Gen 2 UnownDex, Items and some bug fixes. There's a bug where the caught level is sometimes set to 1 because the validation is done out of order due to block shuffling. The sleep status update for gen1/2 is included and new error handling into a list instead of dialog boxes. New also is the Train menu option - something I've liked to see on other emulators. It will maximise attainable ribbons (ie not the L50 tower ribbon if pokemon was caught at a high level or battle tower ribbons for banned pokemon), contest stats, experience and other volatile stats while preserving IVs, PID and other fixed values. In both this new option and the existing Max option, EVs are set smartly - either left alone if a 510 spread exists, or set 252/252/6 to the 2 highest base stats. It means you can run Train from the main screen to level up and EV train all your boxes ensuring Pokemon like Mewtwo are the best they could be for the fixed IV spread. There's pokemon like Ho-oh and Gyarados where you don't get the spread you might like but it's better than an all 85 spread. Shedinja is overriden to get the 255-255 in attack speed.
-
No, I don't know how to work out the offsets or have the time to. If someone produced a table of offsets, I'd implement it.
-
Since it's a minor fix and nothing else is affected, the fix will be included in the next main update. Your Zapdos has 0x01 status byte. Turns out Bulbapedia is inaccurate - the least three bits affect sleep not just the third bit as in the article. Blastoise won't cause problems. In the meantime just ignore the error and let Metropolis clear the status.
-
In crystal, status data exists only for party Pokemon; any status errors are due to party Pokemon. Had tested status but not rigorously, will see what byte is getting read and if it matches the Bulbapedia entry for sleep. The Blastoise shouldn't cause a problem.
-
Gen 3 Pokedex now supported, see post above.
-
Attached is latest version. Features fixes for .sav instead of .pkm; opening directories for Export; now makes a first guess at the version using the filename. Experience is now recalculated when the species is changed using the drop down box. Basically once you've decided the level you can change the species freely without the level sometimes dropping.
-
There's a few known issues. Coming soon will be a list of known issues and help files. Remember this is all still in beta and the first real release will be version 1 not 0.73.
-
Replies in bold, thanks for your feedback.
-
4195096 in hex is 40 03 18. The value it should be 202955 is 03 18 CB in hex. Looking at offset 0x23DB, the values go 40 03 18 CB 01... In other words, the correct offset is in fact 0x23DC. Bulbapedia was wrong on that one, a simple typo, thanks! Metropolis Editor has been updated with the new offset and now reads your money in correctly :grog: These are the (decimal) values that Metropolis couldn't match a Gen 2 item to: 137 145 142 45 45 141 136 142 A quick lookup on bulbapedia: http://bulbapedia.bulbagarden.net/wiki/List_of_items_by_index_number_(Generation_II) These are indeed illegal arguments, but why your save would have so many I don't know. Could be a problem with the editor, could be whatever you did to your save left junk bytes around in the item slots. The most obvious solution is that these lie in the corrupted data for box 6. I'll look into what's causing that. Held items count as items for that error not just items in bag, so it's probably the held items that got corrupted.
-
One more thing - next version will have a bug fix for the missing . in the filename. It's currently saving pokemon as bulbasaursav instead of bulbasaur.sav Little things like that you don't see first time!
-
Responses in bold. The point of the program is in-game conversion for casual players not tournament-legal conversion which is a contradiction in terms. Gen3 Johto locations don't exist, so what should the caught location be set to - it doesn't make sense. The point is that the Pokemon are functionallly identical - same moveset, nickname even stats etc, 99% perfect but due to the 1% of made-up data, they're not legal. Does that make sense?
-
Gen1 and 2 games are stored big endian which means byte-for-byte your write it as it is as if you were writing it down pen on paper. In Gen3 you have reverse the order of the bytes. In Java, I defined two methods for Gen1/2 read/writing: public static int extractBytes(RandomAccessFile fileInput, final int numBytes) throws IOException { int readData = 0; for (int index = 0; index < numBytes; index++) { readData <<= 8; readData |= fileInput.read(); } return readData; } public static void insertBytes(RandomAccessFile fileOutput, final int writeData, final int numBytes) throws IOException { for (int index = 1; index <= numBytes; index++) { fileOutput.write((writeData >> 8 * (numBytes - index)) & 0xFF); } } Then in the rest of the code I can make calls like extractBytes(fileInput, 2); to read in two bytes of data as an integer. Java primitives are always signed, which annoyingly means things in the range 0 to 255 like friendship can't be stored as bytes in the memory, so I've simplified by making everything ints. Expect for actual 8-bits signed integers which need an unsigned long to store. For Gen3 you'll need code like this to reverse the bytes: public static int extractBytes(RandomAccessFile fileInput, int numBytes) throws IOException { int readData = 0; for (int index = 0; index < numBytes; index++) readData |= fileInput.read() << (index * 8); return readData; } There might be code libraries out there to do the right type of endian writing for you. The block-shuffling is a pain, but you'd need to get read/write for the unecrypted part first anyhow. My implementation uses the RandomAccessFile package, which is a standard in Java, there will be similar read/write functionality in C++ but I don't know it. You're best starting small and working up one step at a time, ie get "Hello World" written to a text file before thinking about how to handle PKM files. There's lots of good info on Bulbapedia about how the files are encrypted.
-
Please see the new thread for full Windows and Mac OS X download links.
-
Odd eggs have been entirely 'solved': check this page out. I've read in some odd eggs before hatching and the Trainer is actually "ODD" and the ID number is the number in the last column of that table. Both of these get replaced when the egg hatches. Incidentally, this means the event eggs distributed by Nintendo may have had special invisible OT and ID, but we'll never know what those were (probably PCNYa like the visible IDs).
-
Could you attach the save file? I've only tested it on English Crystal saves (for which it works fine).