Pokemon Emerald Ported to WebAssembly (100k FPS)

(pokeemerald.com)

222 points | by tripplyons 10 hours ago

23 comments

  • wis 3 hours ago
    Cool! I like the speeding up feature. I suggest making the UI indicate that you can press the keys `z` and `x` on the keyboard to trigger the A and B buttons respectively, I figured that out by pressing on my keyboard the A and B keys and then all the letter keys.

    Btw, it seems there's a crash when you choose "Pokemon" in the "Fight/Bag/Pokemon/Run" menu:

    https://i.ibb.co/tpVV8q83/poke-fight-menu.png

    • tripplyons 2 hours ago
      Thanks for the info! I will collect all these reports today and get these issues fixed in the next few days when I can.
    • sergiotapia 2 hours ago
      Z and X are old school emulator keys. I knew right away to use them from the visual boy advance / zsnes days. :D
  • astlouis44 1 hour ago
    Really exciting to see more games ported to WASM. For anyone interested, I just did a HN post detailing a port I spent the last 5 days on - Xonotic, an arena FPS. Includes a technical writeup too:

    https://news.ycombinator.com/item?id=48428133

    • potsandpans 54 minutes ago
      This is super cool. Do you have any code up in a public repo that I could peek at? I've been working on and off on a static recompiler for playstation games, wasm was kind of my end goal.
  • hawkice 8 hours ago
    Confirming that saving genuinely works. Interesting stuff. Wonder if we can get trades working too.
    • tripplyons 7 hours ago
      Yeah, I made sure saving worked correctly
    • ceroxylon 5 hours ago
      First thing I checked as well! I've been Poke-sniped, there goes a few hours.
  • theowaway213456 2 hours ago
    Certain entities seem to be displayed as numbers for me, like "You received a 6" etc when getting my first potion. Anyone else seeing this bug?
    • tripplyons 2 hours ago
      I have not encountered this, but I will note it down as something to look into. Which potion was it?
  • wild_pointer 4 hours ago
    There should be 2 options for speed, regular and sped up. Then there should be a key to speed the game up. When I was a kid, it was the space key for GBA. You could have the normal game and skip the boring parts fast.
  • Luc 8 hours ago
    • fc417fc802 7 hours ago
      How long until this is DMCA'd? How has the project it's based on stuck around for so long? Do I perhaps misunderstand what this is? https://github.com/pret/pokeemerald
      • orlp 3 hours ago
        Copyright being as long as it is is a theft of our culture. I (and many of our generation) grew up with Pokemon, it's a common experience for many of us. A classic of our culture. Except we're not allowed to use it, remix it, build our own versions, etc. We still do, of course, but it's all illegal.

        It didn't used to be this way.

        I think 20-30 years of copyright should be plenty to extract whatever profits you deserve from the fruits of your labor. Anything beyond that is just holding culture hostage for the benefit of a few. It doesn't serve society in any meaningful way.

      • mathgeek 7 hours ago
        It's a port of a disassembly that requires you to provide your own ROM. The legality of such things is a tangled web that anyone producing them needs to navigate very, very carefully.
        • yw3410 7 hours ago
          Interesting; but the GitHub project linked seems to have the original animations from the ROM.
          • mathgeek 7 hours ago
            It's mostly argued around or against the application of fair use. I suggest consulting a lawyer if you're truly interested, as it quickly gets into legalese around what constitutes ownership, distribution, etc. Throw in a lack of extensive case law and you quickly get into opinions rather than legal bases.
          • derefr 4 hours ago
            I get the sense that these disassembly/decompilation projects believe that some types of IP-laden asset data can be shipped embedded into the project — not necessarily "legally", but in that they'll likely get away with doing so indefinitely — as long as:

            1. those assets are stored in proprietary formats that only the game code itself understands, and

            2. no tool exists in the project to extract the assets from these proprietary formats into open formats, unless that tool itself exists only in source-code form in the codebase, and requires the ROM as an input to compile it (even if in the case of such a tool, the ROM is doing nothing but serving as a "key" to unlock compilation.)

            Basically, if you have to prove you have your own copy of the IP in order to make their embedded copy of the IP "legible", then it's very hard to construct an evidence-based DMCA takedown order that actually makes any coherent point about the project "distributing" said IP.

            That being said, shipping assets like this at all, even if you "can get away with it", is ultimately just a kind of laziness / shortcut-taking. They do it because there's either no clear/simple/obvious way to automatically extract the given asset data from the ROM (e.g. because the relevant data is split up into various data planes + metadata bits that are stored "exploded" all over the ROM), so they just did it once by hand, committing the results; or because there's no clear/simple/obvious way to store the extracted asset data such that a regular compiler/assembler natively understands how to embed it into the binary in the particular form it was found in the original ROM. (Remember, re-assembling/compiling to the original ROM is always the test these projects use to ensure their disassembly/decompilation is preserving semantics. So they need to replicate every weird layout quirk the original dev tooling imposed upon the original ROM. And sometimes the original dev tooling included special-purpose domain-specific asset-codegen tools that aren't part of regular compiler toolchains.)

            What these projects should actually be doing, is taking on the schlep: writing the extract tooling anyway, even if it's just "copy these bytes from here and these bytes from there, and spit them out as hex in an .asm file with this header"; and/or writing matching asset-codegen tooling to the tooling that likely existed in the platform SDK, to run before compile/assemble time, converting the extracted ROM asset files into a form (probably a bunch of little assembly files) that will land in the right places when linked back together to form the original ROM.

            And, to be clear, they mostly do do this! These projects are very good at doing this!

            But sometimes — especially on a larger project with many contributors — one or two things like this aren't audited properly, and fall through the cracks. Or they start out as temporary "bootstrap" approaches made during a private phase of development to get things working + compiling to a correct image; and then not all of those get cleaned up before the repo gets made public.

            • yw3410 3 hours ago
              Perhaps I'm mistaken but the project doesn't need a copy of the original ROM at all right?

              To be clear; I don't really understand the law around this - my own country is based on case law which means that even if I wanted to open source some of my reverse engineered games (I have a few private partial implementations of some old defunct game engines in-progress), the distinct lack of prior cases means, sadly, it's prudent not to release them at all while the companies are still active.

        • Lplololopo 4 hours ago
          How is this a port which requires you to provide my own ROM?
          • giancarlostoro 4 hours ago
            Its not requiring you to provide your own ROM so this demo very sell could get DMCAd but Nintendo layers are surprisingly asleep.
      • oompydoompy74 6 hours ago
        I’m of the opinion that projects like this should start hosting Forgejo instances in countries with favorable laws and just mirroring to Github for exposure.
  • weird-eye-issue 7 hours ago
    I did a Pokémon Crystal playthrough several months ago, still great games!

    I used an emulator on my laptop with increased speed so it made everything like walking and combat way faster which was really nice and I probably would have given up if it wasn't for that

    • t0bia_s 1 hour ago
      Currently playing Pokémon Unbound, that is probably best ROM hack ever made. I grow up on 1st and 2nd GB and GBC games so Unbound feels a little bit bloated to me with 8 generations of monsters but man... This project is completely new experience, especially playing on retro hand-held like Trimui Brick Hammer.

      Then I start to explore another Pokémon hacks and find out that those project has big fan community that are very enthusiastic about bringing new features to classical Pokémon formula. Documents/wiki on web are more detailed than original games has!

      For example R.O.W.E mix all kind of modes that you can select, connect Johto and Kanto maps togather, gives you options to limit avalible generations of Pokémon's, so as veteran you can feel more like home.

      Another hacks that I need to explore more - Pokémon Gaia and Pokémon Odyssey.

    • nosioptar 3 hours ago
      I use the cheat engine in zsnes to get rid of the grinding in final fantasy games.

      I find it improves the game when I don't have to spend a bunch of time leveling up or earning gold for equipment.

  • vesche 2 hours ago
    This is awesome! It would be neato if you could export and reload your save file, I clear my browser data a lot.
    • tripplyons 2 hours ago
      Yes, this has been a highly requested feature! This will be the next feature for me to add after addressing the bug reports.
  • arthurcolle 2 hours ago
    This is amazing. Are the left right up down controls a bit wonky? If I cycle through the letters in the name select menu it seem to buggily not actually go through it?
  • gobdovan 7 hours ago
    Any way to get sound?
    • tripplyons 7 hours ago
      I have not added that yet, but it would probably be quite easy to throw a few prompts to Codex to do so.
  • firefax 6 hours ago
    Why Emerald -- is classic already done?

    If anyone has emulator suggestions, I recently attempted a playthrough and found that midway through my copy of red, the game was corrupted? Oddest thing -- hadn't reading the point where you do the "Missingno trick" near cinnebar.

    Anyways, I suspect the save got corrupted somehow but it made me swear off emulation and try a physical copy. (Which had the battery I replaced fail... it's been a comedy of errors).

    • jeremyloy_wt 5 hours ago
      Emerald is well regarded as the best of Generation 3, which is the final of the traditional 2D games and can trade with Fire Red/Leaf Green (remakes of the classic)

      So you have available all of the original Pokémon

    • tripplyons 5 hours ago
      I chose Pokemon Emerald because it is my favorite of the games that have been disassembled!
    • giancarlostoro 4 hours ago
      Maybe the internal battery died. I honestly recommend you look at GBC style handhelds or if you like the GBA style, Anbernic made one that looks insanely close to a GBA.

      There also a craze of DS style emulators popping up. They all give you comfort knowing that your saves will be fine forever if you back them up, even if the device dies.

    • patrickcorrigan 6 hours ago
      Try https://afterplay.io it’s cross platform, saves every 20 seconds and keeps your last 50 saves which you can recover from if anything goes wrong
  • ianm218 3 hours ago
    What are considered the best games in WASM? I recently got into playing around with WASM - it would've been great if this technology was prevalent during the Flash games era
    • prinny_ 3 hours ago
      WASM is not for games specifically, it's for anything that needs native performance but also needs to run on the web.
  • simianwords 35 minutes ago
    Question to WASM and low level nerds: is this the sort of things LLMs are good at? Since the end verification is stable and conclusive and you can just "goal" this project into existence until this somewhat objective verification is met.
  • oceansky 7 hours ago
    Next step: 100% browser javascript pokémon emerald.
  • Navaie 3 hours ago
    Crashed when using a potion vs May :(
    • tripplyons 3 hours ago
      Thanks for the info, I will look into this! I got past that battle and further into the game in my testing, but I don't think I've tried using an item in battle yet.
  • dmitrygr 8 hours ago
    Ok. So what’s interesting here, presumably, is that this isn’t a wasm GBA emulator (which also exist and work). This is the game itself compiled to wasm. Even though no official source code was ever published, there was a community based decompilation.
    • tripplyons 7 hours ago
      Yes, it a recompilation of a community decompilation!
    • rootsudo 2 hours ago
      I think the official source code was leaked, several times.
  • eigenspace 9 hours ago
    Very cool. Too bad this doesnt seem to work as a PWA, or am I jusr missing the button on Android Firefox?
  • danielrmay 6 hours ago
    Super neat. I'd love to see what it would be like to play with more modern &intuitive touch controls instead of just the D-pad and A/B.
  • Innittech 6 hours ago
    29 FPS for me, what hardware are you using to get a hundred thousand FPS?
    • _vertigo 6 hours ago
      iPhone 13. Did you change the slider at the bottom?
      • Innittech 4 hours ago
        Yeah, just found that. Now I'm getting 3000+FPS on my ancient Thinkpad T520.
  • deadbabe 4 hours ago
    What kind of mods and new features could be added?
  • zuzululu 4 hours ago
    Nintendo lawyers intensifi
  • itsthecourier 7 hours ago
    some weeks ago I made a Gameboy emulator from zero in rust and then exported it to wasm

    https://holy-lake-f6df.sdreyesg.workers.dev/

    took me 3 hours with Opus. Opus knew the whole ISA, clock, bus quirks, etc. from their training without any external docs

    • BearOso 3 hours ago
      Alternatively, you could have downloaded an existing one. What you did is just a roundabout way of acquiring one of the many WASM Rust GB emulators in the training set. Except it probably now has several problems from reconstruction. You didn't learn anything new from the process. It's just wasteful in several ways.
      • itsthecourier 1 hour ago
        bro, I learned a lot, I did it step by step and discussed everything with Claude, then used the knowledge to build an emulator at work for a rtos machine (WIP)
    • mathgeek 7 hours ago
      Likely because all of the external docs were already in its training set.
    • tripplyons 7 hours ago
      Yes, this project was made in around 15 hours of Codex.