There's a specific kind of silence that falls over a room when two people are on the Waterfall stage of Contra and one of them is climbing too fast. If you grew up with an NES, you probably know it. Konami's run-and-gun is hard, it's fast, one hit kills you, and it's still one of the best co-op games ever made. You can play Contra (NES) in your browser here with no download, and below is why it's worth another look in 2026.
Background: From Arcade Cabinet to Living Room
Contra started as a Konami arcade game in 1987. The NES version came out in 1988, and it wasn't a cut-down port. Konami reworked it for home play, and it became the version most people remember.
The setup is simple, with a lot of '80s action movie in it. Two commandos, Bill Rizer and Lance Bean, are sent in to stop an alien force called Red Falcon. You fight through jungle, enemy bases, waterfalls, snowfields and machinery, and eventually reach something very organic and very alien. The story is thin, and that's fine, because Contra is about the next three seconds of survival.
Gameplay: Eight Stages, One Hit
The NES version has eight stages:
- Jungle
- Base 1
- Waterfall
- Base 2
- Snow Field
- Energy Zone
- Hangar
- Alien's Lair
Most of them are side-scrolling run-and-gun. You run, jump, fall through platforms and shoot in eight directions. The Waterfall stage scrolls vertically instead. The two Base stages switch to a behind-the-back view, where you push forward into the screen, destroy wall cores and dodge rolling grenades.
One hit costs a life, every time. There's no health bar, so learning each stage is the whole game. At first enemies seem to show up at random, but by the third attempt you know exactly where the next sniper is hiding.
Highlights: What Still Holds Up
The weapons. Flying capsules and pillbox sensors drop power-ups marked with a letter:
- M: Machine Gun (hold to auto-fire)
- F: Fire Ball (slow, curving shots)
- L: Laser (a single piercing beam)
- S: Spread Gun (five shots in a fan)
- R: Rapid Fire (makes your bullets faster)
- B: Barrier (brief invincibility)
The Spread Gun is legendary for a reason. It covers so much of the screen that it changes how the game plays. When you die you drop back to the basic rifle, so losing an S at the wrong moment hurts.
Two-player simultaneous co-op. Contra was built for two people on one couch. You share the screen and the scrolling, so you're working together and quietly competing at the same time. That's where the Waterfall stage tension comes from.
The Konami Code. On the title screen, enter ↑ ↑ ↓ ↓ ← → ← → B A, then press Start, and you begin with 30 lives instead of 3. It's arguably the most famous cheat code in gaming, and Contra is where a lot of players first learned it. No shame in using it.
Beginner Tips
- Use the Konami Code. Seriously. Get through the stages first, then go for a clean run.
- Protect the Spread Gun. Once you have S, play more carefully. Hanging onto it makes the later stages much more manageable.
- Shoot diagonally. Many enemies sit above or below you. Holding up or down while moving lets you fire at angles without stopping.
- Don't rush the screen. Enemies often spawn from the edge you're moving toward. Moving a little slower gives you time to react.
- On the Waterfall, climb together. In co-op, the player who climbs ahead can scroll the screen and leave their partner behind. Agree on a pace.
- In the Base stages, watch for the grenades. The rolling ones are easy to miss while you're focused on the core. Jump them, then fire.
Under the Hood (for the Devs Here)
Full disclosure: I built OnlineClassicGame, the site the links above point to. The previous posts covered the overall stack, arcade romsets and PS1 core fallback. This time I want to talk about something less glamorous: working out what file you've actually got before you hand it to an emulator.
The emulation itself runs on Nostalgist.js, which wraps RetroArch's WASM cores. In my SYSTEM_TO_CORES mapping, NES goes to nestopia. The hard part isn't running the core. It's that ROM files in the wild are a mess. The same game can arrive as a raw ROM, a zip or a 7z archive, and the extension doesn't always tell the truth.
So my rom-loader.js doesn't trust the filename. It reads the first few bytes and sniffs the magic number. These are the kinds of signatures involved:
-
50 4B 03 04(PK..) means a zip container -
37 7A BC AF 27 1Cmeans 7z -
4E 45 53 1A(NES+0x1A) is the iNES header, so it's a raw NES ROM
Based on that, the file gets routed. Zips are extracted with fflate, 7z archives go through 7z-wasm, and raw ROMs pass straight through. One painful lesson: 7z-wasm uses an in-memory filesystem (MEMFS), and if you don't clean it up between loads, files from a previous game can leak into the next extraction. Keeping every load isolated from the last one had to be handled explicitly.
The other rule is that the sniffing logic must know when not to decompress. Arcade cores like FBNeo need the romset zip intact (that was the Metal Slug post). An NES cartridge like Contra, though, is happiest as a bare .nes file.
Your Turn
Contra on NES was many players' first taste of real difficulty, and it still holds up. If you give Contra a run in your browser, I'd love to know: did you beat it without the Konami Code, and which stage gave you the most trouble?
Top comments (0)