Work-in-Progress NES / Famicon Image Editor & Map Creator

Overview

NESImg

An extremely work-in-progress tool for making NES/Famicom-compatible images.

screenshotSources screenshotMetatiles screenshotMetatilesets screenshotMaps

When faced with the challenge of formatting artwork in a way that it can be rendered on the NES, you run into many different limitations. For instance:

  • You have two different kinds of rendering, background, and sprites.
  • For either one, you only have 13 colors you can use.
  • For each 8x8 tile in the background, you can only use 4 colors.
  • Furthermore, you can't just pick any four colors out of your 13 background colors: you have to organize your background colors into 4 sets of 4 color pallets, each one which shares the same first color, and each background tile has to use one of those pallets.
  • To make things more complicated, each set of 16x16 pixels in your background has to use the same pallet.
  • Now you have to fit all of of your background tiles into a 128x128 pixel space, because that's all the video memory you have for the background.

With all of these rules, you are now faced with building, for instance, a map for your game. And our modern editing tools don't take any of these rules into account. What's to make sure that the person who makes your background tiles only ever uses four colors? What's to make sure that the person who creates your map makes sure they use the same pallet for each 16x16 tile of pixels?

That's the challenge that NESImg ( pronounced NES-image ) seeks to solve.

Editing Workflow

NESImg will use a simple workflow:

  1. Take Source Images created with any image editing software, such as Aseprite or Pixelorama, and add them to your NESImg project.
    • Each source image must use only four colors, this is enforced by NESImg when importing.
    • All source images are hot reloaded, meaning you can keep your pixel editor open and watch the changes update live in NESImg without restarting.
  2. You then create Metatiles out of your source images.
    • A metatile is a 16x16 pixel square made out of 4 8x8 squares.
    • If your source image is already made out of 16x16 squares, you can all your metatiles at once.
  3. You organize your metatiles into Metatilesets.
    • Metatilesets are a collection of metatiles.
    • You select 13 colors to use for the metatileset pallet.
    • You can colorize each of your metatiles in the pallet, with NESImg making sure you follow all the color rules.
    • NESImg will generate an NES pattern table and attribute table that can be uploaded to the NES CHR ROM/RAM for rendering.
    • NESImg will make sure that your metatiles are able to fit into the 128x128 pixel NES pattern table.
  4. You build Maps out of your Metatiles.
    • Maps can have multiple levels
    • For each level you must select exactly one Metatileset which may be used to build the level background.
    • The map levels can be exported to a binary format that can be read on the NES to render the map.

Current Status

NESImg is currently experimental. Currently working and non-working features:

  • Selecting source images
  • Creating metatiles from source images
  • Collecting metatiles into metatilesets
  • Coloring metatiles in metatilesets
  • Generating pattern tables
  • Creating map levels
  • De-duplicating tiles in the pattern table ( easy )
  • Exporting pattern tables, attribute tables, and map levels ( easy )
  • NES library for loading maps ( hard )
  • Sprite/animation editor ( hard )
  • Placeable entities such as enemies, doors, etc. ( moderate )

In summary, it can be used for designing maps that follow all the restrictions and rules of the NES, but there isn't a library for loading the maps in an NES game yet.

License

This project is licensed under the Katharos License which places restrictions on what you may use the project to create.

Sponsorship

This is currently just a random side-project of mine. If this is something you are interested in using let me know by opening a discussion, and consider Sponsoring development. Any small amount helps, and even if you don't sponsor, I'd like to know if this is something you are interested in!

You might also like...
Reads files from the Tiled editor into Rust

rs-tiled Read maps from the Tiled Map Editor into rust for use in video games. It is game engine agnostic and pretty barebones at the moment. Document

A simple extension for `bevy-editor-pls` to support tilemap editing right inside the bevy app.

What is this This is a simple tilemap editor plugin, that hooks right into bevy_editor_pls to work with bevy_ecs_tilemap. It works completely within i

DragonOS/Linux Termial text editor

Held DragonOS/Linux Termial text editor 面向DragonOS和Linux系统的终端文本编辑器。 作者:Heyicong [email protected] 安装 默认安装路径为./install/bin/held Linux: make install

The study of a simple path tracer implementation (image raytracing in shorts)
The study of a simple path tracer implementation (image raytracing in shorts)

The study of a simple path tracer implementation (generate a raytraced image, in shorts).

Simple image transforms for embedded-graphics

Embedded graphics transformations This crate provides generic implementations of simple transformations - rotate by 90 degree increments, mirroring an

A cross-platform image (texture) viewer
A cross-platform image (texture) viewer

img_maniac A cross-platform image (texture) viewer Features Drag and drop images: Users can easily add as many images as they want to the main window

enum-map enum-map xfix/enum-map [enum-map] — An optimized map implementation for enums using an array to store values.

enum-map A library providing enum map providing type safe enum array. It is implemented using regular Rust arrays, so using them is as fast as using r

a work-in-progress NES emulator written in rust.
a work-in-progress NES emulator written in rust.

sayaka-rs a work-in-progress NES emulator, written in Rust. the project image is an edit of a frame from the Mahou Shoujo Madoka Magica manga. the Mik

Nes-emulator - A NES emulator made to learn the Rust programming language

nes-emulator Building $ rustc --version rustc 1.32.0 (9fda7c223 2019-01-16) $ cargo --version cargo 1.32.0 (8610973aa 2019-01-02) $ cargo build --rel

A cross platform classic RPG game creator written in Rust.
A cross platform classic RPG game creator written in Rust.

Eldiron - Classic RPG Creation Create RPGs for every platform with Eldiron. Eldiron v1 will be able to create games similar to the classic Ultima seri

rewrite of hosts-creator in rust

hc-rs - hosts-creator-rust fetch and merge multiple hosts files this is a WIP whats done fetching hosts files merging hosts files removing duplicate

A creator library for procedural 2D noises and patterns in Rust.
A creator library for procedural 2D noises and patterns in Rust.

A curated list of common 2D noises and patterns in computer graphics. Mostly taken from implementations on Shadertoy. All implementations are under th

A work-in-progress, open-source, multi-player city simulation game.
A work-in-progress, open-source, multi-player city simulation game.

Citybound is a city building game with a focus on realism, collaborative planning and simulation of microscopic details. It is independently developed

Bell is a work in progress programming language that compiles to MCfunction (Minecraft's language for creating datapacks).

Bell is a work in progress programming language that compiles to MCfunction (Minecraft's language for creating datapacks). It provides a higher level,

Work-in-progress Nintendo Switch emulator, written in Rust and slightly less focused on gaming

pegasus Work-in-progress Nintendo Switch emulator, written in pure Rust and slightly less focused on gaming Information This project aims to be a diff

An experimental, work-in-progress PAM module for Tailscale

Experimental Tailscale PAM Module This is a very very experimental Tailscale PAM module that allows you to SSH using your Tailscale credentials. This

Work-in-progress Rust application that converts C++ header-only libraries to single self-contained headers.

unosolo Work-in-progress Rust application that converts C++ header-only libraries to single self-contained headers. Disclaimer This is my first Rust p

Morphosis is a work-in-progress set of tools to deal with Minecraft metadata, mainly for use with PolyMC.

Morphosis Morphosis is a work-in-progress set of tools to deal with Minecraft metadata, mainly for use with PolyMC. It consists of a library (metamorp

Owner
Katharos Technology
Pure Innovation
Katharos Technology
Bell is a work in progress programming language that compiles to MCfunction (Minecraft's language for creating datapacks).

Bell is a work in progress programming language that compiles to MCfunction (Minecraft's language for creating datapacks). It provides a higher level,

Yoav 17 Aug 25, 2022
Work-in-progress Nintendo Switch emulator, written in Rust and slightly less focused on gaming

pegasus Work-in-progress Nintendo Switch emulator, written in pure Rust and slightly less focused on gaming Information This project aims to be a diff

XorTroll 21 Nov 22, 2022
Morphosis is a work-in-progress set of tools to deal with Minecraft metadata, mainly for use with PolyMC.

Morphosis Morphosis is a work-in-progress set of tools to deal with Minecraft metadata, mainly for use with PolyMC. It consists of a library (metamorp

cozyGalvinism 3 May 3, 2022
Work-in-Progress, opinionated game framework built on Bevy.

Bones A work-in-progress, opinionated game meta-engine built on Bevy. Under development for future use in the Jumpy game, and possibly other FishFolk

Fish Folk 9 Jan 3, 2023
Example implementation of a 3d hexagon tile-based map editor using bevy

bevy-hex-sandbox Example implementation of a 3d hexagon tile-based map editor using bevy v0.10. smol.mov This is not a maintained project. Instead, th

David M. Lary 4 Aug 5, 2023
play NES rpgs with fceux, lua, and rust

rpg-bot play NES rpgs with fceux, lua, and rust running server

Jonathan Strickland 4 May 21, 2022
🚀 A universe in progress

Verse Download Get the latest release! Controls Action Keyboard Controller Thrust W, ↑ RT Turn left A, ← LS ← Turn right D, → LS → Fire Space A/X Paus

Thom Bruce 4 Oct 28, 2023
A Bevy plugin for loading the LDtk 2D tile map format.

bevy_ldtk ( Tileset from "Cavernas" by Adam Saltsman ) A Bevy plugin for loading LDtk tile maps. Usage use bevy::prelude::*; use bevy_ldtk::*; fn mai

Katharos Technology 23 Jul 4, 2022
Quake .map files for the Bevy game engine.

Qevy A plugin that adds Quake .map file support for the Bevy game engine Supported Bevy Versions: 0.12 Supported Physics Engines: XPBD (Rapier coming

Brian Howard 8 Nov 12, 2023
A feature-rich, production-ready, general purpose 2D/3D game engine written in Rust with a scene editor.

A feature-rich, production-ready, general purpose 2D/3D game engine written in Rust with a scene editor.

rg3d engine 5.4k Jan 4, 2023