• Stars
    star
    302
  • Rank 137,201 (Top 3 %)
  • Language
    Python
  • License
    GNU General Publi...
  • Created over 4 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

research into the internals of Animal Crossing: New Horizons

Tools for researching the internals of Animal Crossing: New Horizons. More to come later...

Licensing/Usage

Documentation and code here (except where specified) is (c) 2020 Ash Wolf ("Ninji"), and available under the GNU General Public License 3.0 as provided in the LICENSE file.

Feel free to build upon the tools here and release anything you discover, but please link back to me if you do - here on GitHub, or @_Ninji on Twitter!

Update notes

  • No BCSV changes in v1.1.2

General Tools

debug_tools.py + pynoexs.py

Basic Python port of the Noexes client for poking the game's memory on a running Switch: https://github.com/mdbell/Noexes

BCSVs (Binary CSV data tables)

bcsv.py

Minimal library for reading AC:NH's binary CSV files.

### specs.py

Auto-generated specifications (using build_specs.py and the enumerations JSON) for the BCSV schema. Most names are missing right now...

### dump_all_to_html.py

Outputs a batch of HTML files containing crude table views of all the BCSV files.

Message Data

msbt.py

Minimal library for reading the MSBT format used inside the game's message archives.

scrape_item_names.py

Dumps the names of all items to item_names.json.

Island Map Data

pbc.py

Minimal library for reading AC:NH's collision and heightmap files.

display_pbc.py

Crudely renders the contents of a single PBC file to a PNG using Pillow.

render_map.py

Renders a map from a decrypted savefile, using the collision data as a source for the layout data (because the actual maps in the game are based off the 3D geometry, and I'm not writing a BFRES renderer). Pretty incomplete at the moment. Depends on zstandard, sarc and Pillow.

render_mystery_island.py

Generates the data for my famed Mystery Tour Island guide.

EventFlow

evfl/eventflow_actor_info.json

A list of every single EventFlow action/query that gets called in the game's EventFlow files.

evfl/eventflow_vtables.json

Addresses in v1.1.4 for the vtables for all EventFlow actions/queries.

Savefiles

savefile/parse_smmh.py

Parses the schema files present in /System/Smmh/ on the game's RomFS (except for v1.0.0!) and outputs information.

savefile/dump_save_io_structs.py

Talks to a Switch running ACNH under Noexs to extract information about the SaveIO class hierarchy that the game uses when accessing savefile data.

savefile/all_save_field_keys.json

A list of all hashes present for type and field names in the savefile schema.

savefile/save_keys.json

A manually curated list of field names. May contain a couple of inaccuracies due to hash collisions, but I've tried to eliminate as many as possible!

savefile/bruteforce_save_fields3.py

Various strategies for trying to figure out as many of the hashes as possible.

savefile/save_io_structure.json

Pre-generated SaveIO structure for v1.1.4.

savefile/save_schema_*.json

Pre-generated schemas for the savefile format, including original type/field names from save_keys.json.

savefile/save_schema_*_pseudoC.h

Vaguely readable pseudo-C output. Not usable in its direct form due to missing information on types not included in the schema (primitive types that haven't been figured out, Switch SDK stuff, etc).

savefile/editor/*, captureData.py

Browser-based editor for savefiles. Right now it's really just a viewer, to be honest... Built in TypeScript with Bootstrap and Fancytree.

Ghidra Scripts

ACEnumScraper2.py

Analyses the game's executable to find all the enumerations used in BCSV files (which helpfully come with both English names and Japanese descriptions) and generates a JSON file containing them.

ACNHSaveSchemaV3.py

Imports all the structures from the savefile schema into a Ghidra database.

FunHelper.py

Various things I used while analysing the v1.1.4 executable to make it more amenable to reverse-engineering in Ghidra (forcing all functions to be discovered, etc).

BuildRTTIHierarchy.py

Introspects the RTTI information for a class to build out the inheritance chain and name all of the vtables and their methods. Slightly limited, right now it's specialised towards the EventFlow receptors.

IntrospectBCSVs.py

An older version of the RTTI code specialised towards the classes that read BCSV files.

Other helpful projects/tools

More Repositories

1

MeteoNook

weather prediction tool for Animal Crossing: New Horizons
Vue
251
star
2

libxbr-standalone

Library implementing the xBR pixel art scaling algorithm
C
104
star
3

WindEmu

experimental emulator for Psion Series 5mx (Windermere)
C++
70
star
4

Reggie

Editor for New Super Mario Bros. Wii data files
Arc
66
star
5

Kamek

a nice code injection engine for Wii games
C#
64
star
6

robert.js

javascript tools for working with Microsoft Bob data files
JavaScript
55
star
7

BirdBridge

shoving a twitter API-shaped peg into a mastodon API-shaped hole
TypeScript
54
star
8

MarioUnmaker

simple viewer for level files from Super Mario Maker
C++
41
star
9

mpw-emu

tries to emulate the command-line tools from MPW for classic PowerPC Macs
Rust
40
star
10

PocketWordle

Wordle for Pocket PC 2003
C++
38
star
11

FlicksForAll

iOS 13 tweak: brings iPad keyboard flicks to iPhone
Objective-C
28
star
12

SMM2Reversing

reverse-engineering Super Mario Maker 2
Python
25
star
13

LayoutStudio

Graphical viewer/editor for Wii 2D screen layouts (brlyt/brlan files) written in C++ using Qt
C++
13
star
14

bitBoard

forum software written with Python/Flask/SQLAlchemy
Python
11
star
15

legacybrowse

a http proxy that downgrades TLS down to SSLv2 for really, really old browsers
Rust
11
star
16

atrac3tool

encoder for LP2 ATRAC3 files
C++
9
star
17

TM155-tools

bits and bobs for hacking on certain variants of the TM155 mouse (mainly TeckNet M009-V2)
Swift
9
star
18

SimplePaste

Quick and dirty pastebin script that generates and uploads static HTML using Pygments
Python
8
star
19

RandomStuff

Random stuff which is too small to deserve its own repo. Just a couple of decompression tools atm.
C
7
star
20

darkgram

A dark theme for Telegram on iOS!
Logos
6
star
21

unofficial-twrp-cosmo

a really junky, experimental, unofficial port of TWRP to the Cosmo Communicator
Makefile
6
star
22

OpenCodi

an attempt to create custom firmware for the Cosmo Communicator's STM32 cover display
C
5
star
23

midihackery.js

javascript binding to libtimidity for hot midi action on your website
JavaScript
5
star
24

iBlame

figure out how much money your iCloud Family members owe you
Python
5
star
25

CMap

a soon-to-be-great alternative map editor for the online game Furcadia
C++
4
star
26

Causson

a programming language experiment
TeX
3
star
27

twitlog

a simple Twitter stream event logger
Python
3
star
28

t2

abandoned attempt to decompile an old Mac game
C++
3
star
29

VulpIRC

Hybrid IRC client/bouncer designed for mobile platforms
C++
3
star
30

GenericIRC

IRC client for Android
Java
2
star
31

Nelumbo

advanced Ruby library for creating bots for the MMOSG Furcadia
C
2
star
32

myplace-timetable-export

export class timetables from Strathclyde University's MyPlace to .ics
Python
2
star
33

rjis-experiment

trying to make sense of National Rail open data feeds using Haskell
Haskell
2
star
34

fake-kasa

adjusting the IoT lights in my flat using some hand-built Rust code
Rust
1
star
35

JoytechFFDWrapper

an awful, awful hack for the Joytech Neo S force feedback driver and 64-bit
C#
1
star
36

ubar-crimes

patches to make uBar work more good with WINE applications
Objective-C
1
star
37

JanetterApiKeyInjector

sticks new api keys into Janetter (Twitter client for Windows)
C#
1
star
38

dotfiles

trying to standardise my config across machines
Vim Script
1
star
39

p5-poe-component-pastebin

(Perl 5) POE component for creating posts on pastebins
Perl
1
star