Just a reminder that providing specifics on, sharing links to, or naming websites where ROMs can be accessed is against the rules. If your post has any of this information it will be removed.
Ever thought it'd be cool to have your art, writing, or challenge runs featured on PokéCommunity? Click here for info - we'd love to spotlight your work!
Our weekly protagonist poll is now up! Vote for your favorite Conquest protagonist in the poll by clicking here.
Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.
Hi, everyone. I've been working on a full disassembly of Pokémon Pinball (GBC), and a lot of progress has been made on it. It's not as complicated as the traditional Pokémon games, so I think it won't be hard to get the entire ROM disassembled and reasonably well-labeled.
I put way too much time into it as a kid, too! I'm pushing a commit or two to the repository every day. At this point I've pretty much all of the routines that aren't part of the actual Pinball gameplay, meaning all of the menus, pokedex, high scores, etc. are all dumped. Most need labeling and documentation, though.
Currently, I'm dumping the actual Pinball gameplay routines bit by bit.
At this point, all of the code in the game has been dumped, including lots of data/graphics. Many routines have been labeled, as well as a good chunk of RAM addresses. I'm always looking for people to help. Eventually, I'd like to make a "Pokemon Pinball Gold & Silver" hack using this disassembly.
Here's a video of adding Chikorita to the game, using the disassembly:
This project made me discover there was a gba remake of this game and so I've started a disassembly project for that. Not sure if I'll finish it but still its an interesting game and I loved playing the gbc one as a child, so I hope you complete the gbc disassembly.
I've been slowly going through all of the unlabeled static pointers and dumping/labeling the data they point to. This is basically "the plan" until everything has been labeled. Unfortunately, there are still about 800 unlabeled pointers.
I also discovered that each pokemon has its own collision mask when trying to catch it in Catch'em mode. I expected all of the pokemon to simply share a circular collision mask. If you want to take a look, you can find those here: https://github.com/huderlem/pokepinball/tree/master/data/collision/mon_masks
In Pokemon Pinball, there is a bonus reward where two Pikachus can save your ball in the bottom corners of the stage. When they are in the act of propelling the ball upward, a raw audio clip is played that sounds like "Piiiiii-Kaaaaaaa". It turns out that both Pokemon Pinball and Pokemon Yellow Version share the same code that plays audio clips. Additionally, Pokemon Pinball borrows two Pikachu sound clips from Yellow Version.
In the ROM, the actual sound data is stored as 1-bit pcm. "pcm" stands for pulse-code-modulation, which is a fancy way of saying "sound wave amplitudes". Since the pcm is only 1-bit, each sample in wave is either maximum or minimum amplitude--"on or off". Of course, this results in a very low-quality sound. That's okay, because the GameBoy wasn't designed to play pcm audio.
Then how does Pokemon Pinball/Yellow play the pcm data? The playback routine writes volume data to the GameBoy's wave channel (channel 3). The logic goes like this:
Read single 1-bit pcm sample
Write either 100% or 0% volume to the wave channel
Wait a set number of CPU cycles
Repeat until the pcm data is over
Now that we know the audio's data structure (1-bit pcm) and how the game interprets that data, we should be able to do two things:
Convert the 1-bit pcm data from the game into a .wav file
Convert an arbitrary .wav file into 1-bit pcm data tha the game can understand
Converting 1-bit pcm data into a .wav file is trivial, and it turns out converting a .wav into a 1-bit pcm stream is also pretty straightforward. This allows us to use .wav files in the pokepinball and pokeyellow projects. At compile time, the .wav files are converted into the 1-bit pcm format using a python script.
In Pokemon Pinball, there is a bonus reward where two Pikachus can save your ball in the bottom corners of the stage. When they are in the act of propelling the ball upward, a raw audio clip is played that sounds like "Piiiiii-Kaaaaaaa". It turns out that both Pokemon Pinball and Pokemon Yellow Version share the same code that plays audio clips. Additionally, Pokemon Pinball borrows two Pikachu sound clips from Yellow Version.
In the ROM, the actual sound data is stored as 1-bit pcm. "pcm" stands for pulse-code-modulation, which is a fancy way of saying "sound wave amplitudes". Since the pcm is only 1-bit, each sample in wave is either maximum or minimum amplitude--"on or off". Of course, this results in a very low-quality sound. That's okay, because the GameBoy wasn't designed to play pcm audio.
Then how does Pokemon Pinball/Yellow play the pcm data? The playback routine writes volume data to the GameBoy's wave channel (channel 3). The logic goes like this:
Read single 1-bit pcm sample
Write either 100% or 0% volume to the wave channel
Wait a set number of CPU cycles
Repeat until the pcm data is over
Now that we know the audio's data structure (1-bit pcm) and how the game interprets that data, we should be able to do two things:
Convert the 1-bit pcm data from the game into a .wav file
Convert an arbitrary .wav file into 1-bit pcm data tha the game can understand
Converting 1-bit pcm data into a .wav file is trivial, and it turns out converting a .wav into a 1-bit pcm stream is also pretty straightforward. This allows us to use .wav files in the pokepinball and pokeyellow projects. At compile time, the .wav files are converted into the 1-bit pcm format using a python script.
That's pretty cool, good find. But you are right about the low quality. It might be a good replacement for the Pokemon cries, at least. The originals always seemed off for me anyway...
That's pretty cool, good find. But you are right about the low quality. It might be a good replacement for the Pokemon cries, at least. The originals always seemed off for me anyway...
I wonder that your technique can work on GSC roms also... I mean to imput oryginal cries from Generation III to VI on the place of oryginals. I know it would been in very low quality. But Why not to heard Xerneas cry in Pokemon Gold hack XD
I wonder that your technique can work on GSC roms also... I mean to imput oryginal cries from Generation III to VI on the place of oryginals. I know it would been in very low quality. But Why not to heard Xerneas cry in Pokemon Gold hack XD
It would definitely work. You'd just need to copy the audio playback function from pokepinball or pokeyellow. That being said, raw 1-bit audio data takes up a lot of space. You would only be able to fit about 4 cries in a single ROM bank. Also, I believe that the audio really won't be high enough quality for cries... But someone should try it out, just to see how it sounds.
That was amazing.... I know that someone found method to make 8mb gbc rom.
This and your findings <With my idea which start Cries portings> Can start new era in GBC and GB hacking.
If the Yellow cry engine can be expanded for all Pokemons. It would be great to make Oryginal cries for further than Kanto and Johto pokemons actual cries in game.
That was amazing.... I know that someone found method to make 8mb gbc rom.
This and your findings <With my idea which start Cries portings> Can start new era in GBC and GB hacking.
If the Yellow cry engine can be expanded for all Pokemons. It would be great to make Oryginal cries for further than Kanto and Johto pokemons actual cries in game.
I know some people want to try and recreate future-gen pokemon cries with the normal method that all of the cries are implemented. While that would be ideal, it would also take a lot longer and be more difficult than using raw audio data, like the video above.
But by raw media... I wonder how would work Arceus cry. Since Arceus Cry is problematic in GBA games... So IDK how it would work with this method. If it would work. It would be great to make table of cries like gen 3 games.
Wow dude, this its so nice. It's this game easier to hack than GBA pinball? I like to hack one of this pinball to make a Digimon Pinball so Im so happy to see at least I could do the hack on the GBC game :)
Wow dude, this its so nice. It's this game easier to hack than GBA pinball? I like to hack one of this pinball to make a Digimon Pinball so Im so happy to see at least I could do the hack on the GBC game :)