11 ms·
Pokemon Emerald Ported to WebAssembly (100k FPS)
- simianwords 3mo agoQuestion 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.
- gobdovan 3mo agoWASM is just a binary instruction format for a virtual stack machine. So instead of having many instruction sets for different CPUs and so on, you write for a portable VM (think of like JVM but lower level) that then can be ran on many CPUs and also on web browsers. If there's already C code (for pokemon emerald there already was a decompiled C/ASM codebase), you usually just compile it and it works, or swap a few native dependencies with portable ones. If you have some ASM code already for some old architecture, then it's a pretty straight forward translation to WASM (not really, but iterable enough with LLMs). So yeah, you can have the first target for your thing to compile, then take a screenshot of first few frames for you to check visually and some framebuffer hashes for automatic verification and use those as an oracle for if it also works correctly. Then iterate a little more, maybe implement saving/loading and load a few checkpoints and register a few deterministic inputs and see some more framebuffer hashes, crashes, state checksums and you're good.
- ironbound 3mo agoFound the Original decompiled project https://github.com/rh-hideout/pokeemerald-expansion/blob/master/CREDITS.md https://github.com/rh-hideout/pokeemerald-expansion/blob/mas...
- eigenspace 3mo agoVery cool. Too bad this doesnt seem to work as a PWA, or am I jusr missing the button on Android Firefox?
- parasti 3mo agoYou have to use "Add to home" menu item on Firefox for Android. But this web app doesn't seem to be a PWA.
- ameliaquining 3mo agoYou could send a PR. It's reasonably straightforward to add a manifest to make the app installable (https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest https://developer.mozilla.org/en-US/docs/Web/Progressive_web...), and to use Workbox to make it work offline since it's fully static (https://developer.chrome.com/docs/workbox https://developer.chrome.com/docs/workbox). The one caveat is that a PWA needs an icon but the project doesn't currently have one, so you'd have to design, find, or LLM-generate one.
- dmitrygr 3mo agoOk. 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 3mo agoYes, it a recompilation of a community decompilation!
- rootsudo 3mo agoI think the official source code was leaked, several times.
- ironbound 3mo agoThey removed the credits and copyed from this project https://github.com/rh-hideout/pokeemerald-expansion https://github.com/rh-hideout/pokeemerald-expansion
- Luc 3mo agohttps://github.com/tripplyons/pokeemerald-wasm/ https://github.com/tripplyons/pokeemerald-wasm/
- fc417fc802 3mo agoHow 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 https://github.com/pret/pokeemerald
- mathgeek 3mo agoIt'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 3mo agoInteresting; but the GitHub project linked seems to have the original animations from the ROM.
- mathgeek 3mo agoIt'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 3mo agoI 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.
- hawkice 3mo agoConfirming that saving genuinely works. Interesting stuff. Wonder if we can get trades working too.
- tripplyons 3mo agoYeah, I made sure saving worked correctly
- ceroxylon 3mo agoFirst thing I checked as well! I've been Poke-sniped, there goes a few hours.
- CSMastermind 3mo agoI couldn't get trading working but maybe I'm doing something wrong.
- oceansky 3mo agoNext step: 100% browser javascript pokémon emerald.
- vorticalbox 3mo agoNew LLM benchmark?
- itsthecourier 3mo agosome weeks ago I made a Gameboy emulator from zero in rust and then exported it to wasm https://holy-lake-f6df.sdreyesg.workers.dev/ 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
- mathgeek 3mo agoLikely because all of the external docs were already in its training set.
- tripplyons 3mo agoYes, this project was made in around 15 hours of Codex.
- itsthecourier 3mo agohow much docs did you need to supply?
- BearOso 3mo agoAlternatively, 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 3mo agobro, 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)
- gobdovan 3mo agoAny way to get sound?
- tripplyons 3mo agoI have not added that yet, but it would probably be quite easy to throw a few prompts to Codex to do so.
- Weetile 3mo agoWorking on that at the moment. I have a private branch and have something nearly working. Will hope to share soon. (Not original creator of the port!)
- weird-eye-issue 3mo agoI 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
- nosioptar 3mo agoI 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.
- t0bia_s 3mo agoCurrently 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.
- deleted 3mo ago[deleted]
- danielrmay 3mo agoSuper 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.
- firefax 3mo agoWhy 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).
- patrickcorrigan 3mo agoTry https://afterplay.io 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
- firefax 3mo agoThanks, this looks akin to what I'm looking for. Maybe a few features I don't need but looks interesting.
- jeremyloy_wt 3mo agoEmerald 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
- firefax 3mo agoAh good point. I was looking into buying a used copy of Fire Red / Leaf Green and they were surprisingly expensive. I have a copy of red, but even with a new battery the save function keeps failing. I suspect I didn't seat the battery well and I need to solder it, but I am not trained in that and reluctant to have my first project involve an expensive retro cart.
- tripplyons 3mo agoI chose Pokemon Emerald because it is my favorite of the games that have been disassembled!
- Innittech 3mo ago29 FPS for me, what hardware are you using to get a hundred thousand FPS?
- zuzululu 3mo agoNintendo lawyers intensifi
- deadbabe 3mo agoWhat kind of mods and new features could be added?
- wild_pointer 3mo agoThere 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.
- Navaie 3mo agoCrashed when using a potion vs May :(
- tripplyons 3mo agoThanks 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.
- ianm218 3mo agoWhat 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
- wis 3mo agoCool! 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 https://i.ibb.co/tpVV8q83/poke-fight-menu.png
- deleted 3mo ago[deleted]
- sergiotapia 3mo agoZ and X are old school emulator keys. I knew right away to use them from the visual boy advance / zsnes days. :D
- folkrav 3mo agoFunny, I've been emulating games for literal decades at this point, but remapping buttons is one of the first things I did in every one of them, so I never knew the defaults hehe
- tripplyons 3mo agoThanks for the info! I will collect all these reports today and get these issues fixed in the next few days when I can.
- airstrike 3mo agoPlease consider adding WASD support or alternatively allow keyboard configuration
- vesche 3mo agoThis is awesome! It would be neato if you could export and reload your save file, I clear my browser data a lot.
- tripplyons 3mo agoYes, this has been a highly requested feature! This will be the next feature for me to add after addressing the bug reports.
- theowaway213456 3mo agoCertain 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 3mo agoI have not encountered this, but I will note it down as something to look into. Which potion was it?
- chownie 3mo agoThere's an NPC who walks you to the pokemart and gives you a potion. For me that dialogue was something like "You receive a !" and it then said "You place it in the 23 pocket" -- seems related?
- Redster 3mo agoSimilarly, May gives me "8" when I think she gave pokeballs?
- theowaway213456 3mo agoYep that's the first time I noticed it. The pocket was also numbered for me as well
- CarVac 3mo agoZigzagoon using growl made it say my "hp rose"
- takakaze 3mo ago[flagged]
- arthurcolle 3mo agoThis 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?
- astlouis44 3mo agoReally 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 https://news.ycombinator.com/item?id=48428133
- potsandpans 3mo agoThis 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.
- astlouis44 3mo agoThanks man, feel free me to DM me on X if you'd like to discuss further, I am planning to push the code to a repo seeing as Xonotic is an OSS game and requires any changes to also be open sourced. And a Playstation recomp implemented in WASM is interesting to think about! X link: https://x.com/AlexStLouis10 https://x.com/AlexStLouis10
- zamadatix 3mo agoHeads up: GPLv3 dictates you deliver the source once you distribute the compiled code to someone else, not just that you plan to some time in the future.
- cadamsdotcom 3mo agoSo you’re saying I have 1900 Game Boys in my pocket everywhere I go AND don’t have to buy batteries? AND - I didn’t have to blow air on the cartridge connector for it to work? Is this the future?
- orliesaurus 3mo agoI crashed opening the Pokemon bag on the first fight
- nosioptar 3mo agoI know they're pretty standard controls, but I would suggest letting users remap keys. Enter is off by itself, so you have to move a hand to press start. Switching to space would solve that. (I prefer wasd for arrows, and h/j for b/a with y/u or u/I for start/select, but I think most b̵r̵a̵i̵n̵ ̵d̵a̵m̵a̵g̵e̵d̵ right handed people prefer arrows.)
- Joker_vD 3mo agoI'm left-handed and I prefer ZX for AB and arrows for the D-pad. Which is actually the mirror of how the real Gameboy Advance was laid out. ...Why is the D-pad always on the left on all of the controllers/handhelds anyhow, and the buttons on the right? After all, they're aimed mainly at the right-handed people, right?
- nosioptar 3mo agoThe story I heard was that early arcade games had the joystick on the right, and switched to the left to make it a bit harder so they'd make more money. Another reason I prefer wasd is I mainly use laptops, they always have tiny arrow keys.
- nrightnour 3mo agoCool but any chance of audio? That's half of the experience.
- Weetile 3mo agoWorking on an audio port at https://github.com/ottohg/pokeemerald-wasm https://github.com/ottohg/pokeemerald-wasm, and I've gotten pretty far. It's working, but there are just accuracy and instrument issues that need to be sorted out before it's in a playable state.
- Weetile 3mo agoWorking on a fork that has audio. If anyone wants to have Claude continue it, be my guest! https://github.com/ottohg/pokeemerald-wasm https://github.com/ottohg/pokeemerald-wasm
- LoganDark 3mo agoSeems the game does not pick up my A press if I release and then re-press it again quickly. There are multiple frames between my release and re-press, so I have no idea why this is -- maybe something is interpreting key repeats instead of using raw keyup/keydown events?
- shepherdjerred 3mo agoThis is beautiful! I had a project 'discord plays pokemon' written in TypeScript that allowed users to play Pokemon together. The architecture was a GPU accelerated Docker container running a full browser and desktop environment. With this it can all be done in-process. I threw Claude at the problem and it worked! https://github.com/shepherdjerred/monorepo/tree/main/packages/discord-plays-pokemon https://github.com/shepherdjerred/monorepo/tree/main/package...
- villgax 3mo agoAwesome! Now to run on my ESP33
- htshnr 3mo agoNice! FYI: It currently freezes if you attempt to go to your Pokemon from the menu, and also when your starter evolves at level 16, making it unplayable further.
- banyek 3mo agoomg, this is so good. My son keep asking me to buy it somewhere, and now he play it.
- weezing 3mo agoThis has no sound and is horribly bugged. Just get him a proper ROM on his phone or wherever.
- ironbound 3mo agoOP says they used GPT 5.5 to make this? But existing project https://x.com/skewbed/status/2063217866233479587 https://x.com/skewbed/status/2063217866233479587
- jxmorris12 3mo agoFor some reason I can't get past the start page; I press all the buttons but nothing happens. Rats.
- Frannky 3mo agoFun and pleasant. Speed up removes the chore feeling. I get bugs that make me loose the progress :(
- Frannky 3mo agopokeemerald.wasm.RunAnimScriptCommand@https://pokeemerald.com/web/app.js https://pokeemerald.com/web/app.js line 723 > WebAssembly.compile:wasm-function[1318]:0x18836f pokeemerald.wasm.OpponentDoMoveAnimation@https://pokeemerald.com/web/app.js https://pokeemerald.com/web/app.js line 723 > WebAssembly.compile:wasm-function[1611]:0x19cdc7 pokeemerald.wasm.BattleMainCB1@https://pokeemerald.com/web/app.js https://pokeemerald.com/web/app.js line 723 > WebAssembly.compile:wasm-function[2548]:0x1eee63 pokeemerald.wasm.WasmRunFrame@https://pokeemerald.com/web/app.js https://pokeemerald.com/web/app.js line 723 > WebAssembly.compile:wasm-function[7320]:0x30d5f3 runFrames@https://pokeemerald.com/web/app.js:763:22 https://pokeemerald.com/web/app.js:763:22 runFramesForTick@https://pokeemerald.com/web/app.js:846:14 https://pokeemerald.com/web/app.js:846:14 tick@https://pokeemerald.com/web/app.js:856:36 https://pokeemerald.com/web/app.js:856:36
- Justinemadock 3mo ago[flagged]