Skip to main content

The sm64-random-assets module

Project description

Generates non-copyrighted randomized assets so sm64 and sm64-port can be used for educational purposes.

This has only been tested for building the US variant, and only on Linux.

For each asset it generates a random texture, except in special cases like text where it was possible to generate reasonable textures with open source tools. The result is surprisingly playable.

Future work will support configurable and procedural generation of assets.

https://i.imgur.com/iiMPSTZ.png https://i.imgur.com/5OsOH1F.png https://i.imgur.com/yFI8WV2.png https://i.imgur.com/jlXDyMJ.png

Python Requirements

To run the asset generation script, the following requirements are needed.

pip install kwimage opencv-python-headless ubelt numpy ruamel.yaml PyYAML scriptconfig rich parse

PC Port Example Usage

The following instructions were written on an Ubuntu 22.04 PC

# PC Port Dependencies
sudo apt install -y git build-essential pkg-config libusb-1.0-0-dev libsdl2-dev

# You can set your "code" directory path - the place where you will clone
# this repo - to be somewhere convenient for you
CODE_DPATH=$HOME/code

# Ensure your code directory exists
mkdir -p $CODE_DPATH

# Clone this repo
git clone https://github.com/Erotemic/sm64-random-assets.git $CODE_DPATH/sm64-random-assets

# Move into the root of this repo and initialize the sm64-port submodule,
# which will clone the official PC port repo.
cd $CODE_DPATH/sm64-random-assets
git submodule update --init tpl/sm64-port

# Run the asset generator
python $CODE_DPATH/sm64-random-assets/generate_assets.py --dst $CODE_DPATH/sm64-random-assets/tpl/sm64-port

# Move into the PC port directory
cd $CODE_DPATH/sm64-random-assets/tpl/sm64-port

# Compile
make NOEXTRACT=1 VERSION=us -j16

The compiled executable can now be run directly:

# Run the executable
build/us_pc/sm64.us

Headless ROM Usage

# ROM-only dependencies
sudo apt install -y binutils-mips-linux-gnu build-essential git libcapstone-dev pkgconf python3

# You can set your "code" directory path - the place where you will clone
# this repo - to be somewhere convenient for you
CODE_DPATH=$HOME/code

# Ensure your code directory exists
mkdir -p $CODE_DPATH

# Clone this repo
git clone https://github.com/Erotemic/sm64-random-assets.git $CODE_DPATH/sm64-random-assets

# Move into the root of this repo and initialize the sm64 submodule,
# which will clone the official ROM-only sm64 repo.
cd $CODE_DPATH/sm64-random-assets
git submodule update --init tpl/sm64

# Run the asset generator
python $CODE_DPATH/sm64-random-assets/generate_assets.py --dst $CODE_DPATH/sm64-random-assets/tpl/sm64

# Move into the ROM-only sm64 directory
cd $CODE_DPATH/sm64-random-assets/tpl/sm64

# Compile
NUM_CPUS=$(nproc --all)
NOEXTRACT=1 COMPARE=0 NON_MATCHING=0 VERSION=us make -j$NUM_CPUS

# The compiled ROM is: build/us/sm64.us.z64

This ROM can now be flashed on an N64 cartage, copied onto an Everdrive, or run using an N64 emulator (like Mupen64Plus). For instance, if you have Mupen64Plus installed (e.g. sudo apt install mupen64plus-qt) you can run:

mupen64plus build/us/sm64.us.z64

N64 Limitations

On real N64 hardware truly randomizing all textures will cause the system to lock up. This is because the N64 has 4 megabytes of RAM, and many of the original PNG textures are optimized to reduce their memory usage by having large continuous sections of the same color. Naively randomizing every pixel does not generate data well suited for PNG compression.

I have verified that I cen enter every major stage and complete every bowser fight, so I think all of the crashes have been resolved by reducing texture sizes. I have completed a 16 star run on real N64 hardware with this.

Development

While I’ll try to keep the above instructions working / maintained, the build.sh script is the end-to-end entry point for developers. Starting from a fresh repo, the build.sh script will take care of the entire process from initializing submodules, generating assets, compiling the binaries, and even running them with the pc-port, in an emulator, or copying ROMs to an EverDrive. Environment variables can be used to control the build.sh behavior.

The following are several common examples:

# Build and run the PC port
TEST_LOCALLY=1 TARGET=pc ./build.sh

# Build and run the ROM in an emulator (m64py)
TEST_LOCALLY=1 TARGET=rom EMULATOR=m64py ./build.sh

Resources

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sm64_random_assets-0.0.1.tar.gz (51.7 kB view details)

Uploaded Source

Built Distribution

sm64_random_assets-0.0.1-py3-none-any.whl (50.4 kB view details)

Uploaded Python 3

File details

Details for the file sm64_random_assets-0.0.1.tar.gz.

File metadata

  • Download URL: sm64_random_assets-0.0.1.tar.gz
  • Upload date:
  • Size: 51.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.2

File hashes

Hashes for sm64_random_assets-0.0.1.tar.gz
Algorithm Hash digest
SHA256 5a7ae8a725dfdd3867440524975b020d320eb98bba601a07c27cabf9c75b5374
MD5 b7a30119d69eb2d63fd18c0d7771db12
BLAKE2b-256 999a9ad4733a675b530d16fe171a04fdfbcc634a67a399cbf73c7abf85c1a99b

See more details on using hashes here.

File details

Details for the file sm64_random_assets-0.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for sm64_random_assets-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 300049974279ceab917ba80a524e68ea50fae814ad8dc78c50d76e46aedd8c8f
MD5 aee4237e4239dd84e420259b37053fac
BLAKE2b-256 eef23c08006911659eb4b83eadfdc21c26a28e8e34c89266f3840a099b65afcc

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page