Releasing on modern platforms
NES game developers who qualify can increase their audience by releasing their games through modern platforms' storefronts, such as Steam, iOS App Store, PlayStation Store, and Nintendo eShop.
Emulation middleware
It's common to port NES games written in assembly language to a modern platform using middleware consisting of an emulator locked down to run only the included game. However, modern platforms' storefronts impose restrictions on which software licenses may be distributed. If you plan to release your NES game on such a storefront, be sure to review the distribution terms and choose an emulator with a compatible license. Copyleft licenses tend to be incompatible most often. Emulators under permissive licenses, such as the BSD License, the MIT License, or the zlib License, may be used.
You should also consider the following technical aspects when evaluating emulation middleware:
- Compatibility, and accuracy to the extent that it increases compatibility with your software
- How much porting effort is needed to run a game in the emulated environment
- Runtime performance, particularly on web, mobile, and Nintendo Switch
- Download size
- Ability to map keyboard keys or modern platform buttons, such as by emulating a mouse or a controller with more buttons
- How the front end's user interface can be themed to blend in with the game
- Save states and rewinding to support rollback netcode in multiplayer games
Members of the community have proposed using these for porting from NES:
- RusticNES by Zeta, Rust, MIT License. Includes a WebAssembly front end for showing a cut-down demo version on your website.
- GGVm by Gradual Games, Java, Unlicense. Windows and Android front ends. This emulates the CPU and a subset of PPU functionality. Games must be ported. Timing is entirely fake. Sound is high-level emulated through MP3 audio. It's recommended to use conditional code (such as
.if
statements in ca65) to make builds of your game that target NES and GGVm.
High-level languages
It's also possible to write the game logic in C, use llvm-mos or cc65 to compile it, and then write front ends in assembly language that handle input and output on each platform. This lets you rely on the compiler to keep the game logic identical between the NES and modern versions, while allowing the modern version to act as a remaster with high-definition graphics. Koei's games probably use this.
Aspect ratio
Modern platforms have widescreen displays with square pixels. You'll need to decide how much you're horizontally stretching the image (see Overscan), as well as what to put in the areas off to the sides. Some suggestions:
- The Game Boy Advance ports of Super Mario Bros. 3 and Kirby's Adventure take the HUD elements out of the bottom status bar and display them over the playfield. This is easier to do in an HLE or HLL environment but can be done in emulation with color key.
- Full Quiet and Garbage Pail Kids come with a selection of borders that can be applied to the sides of the screen, much as with the Super Game Boy accessory for Super NES.
- One option is to display 256x240 pixels' worth of scrolling background on the NES or 352x240 on modern platforms (stretched to 1206x720 or 1810x1080). Center the camera 48 pixels in front of the player character on NES using dual forward focus,[1] or center the character on modern platforms. Either way, the player can see 176 pixels ahead. Tie enemy behaviors, such as respawning, to player position rather than camera position so that turning around doesn't cause enemies to get respawned repeatedly.
References
- ↑ Itay Keren. "Scroll Back: The Theory and Practice of Cameras in Side-Scrollers". Game Developer, 2015-05-11. Accessed 2024-03-23.