{ description = "Wii game decompilation dev environment"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; decomp-toolkit = pkgs.stdenv.mkDerivation rec { pname = "decomp-toolkit"; version = "1.8.4"; src = pkgs.fetchurl { url = "https://github.com/encounter/decomp-toolkit/releases/download/v${version}/dtk-linux-x86_64"; sha256 = "086k0cxspfhjmii51k1w8n2mxdnc9k0fc26ks75f1g818jcv31kw"; }; dontUnpack = true; nativeBuildInputs = [ pkgs.autoPatchelfHook ]; buildInputs = [ pkgs.stdenv.cc.cc.lib ]; installPhase = '' mkdir -p $out/bin cp $src $out/bin/dtk chmod +x $out/bin/dtk ''; }; objdiff = pkgs.stdenv.mkDerivation rec { pname = "objdiff"; version = "3.8.1"; src = pkgs.fetchurl { url = "https://github.com/encounter/objdiff/releases/download/v${version}/objdiff-linux-x86_64"; sha256 = "1wf0y42w04v0cl3bpwc23wdvyylkqhv3jxbw4iwl8wlkbvrrqlkf"; }; dontUnpack = true; nativeBuildInputs = [ pkgs.autoPatchelfHook ]; buildInputs = [ pkgs.stdenv.cc.cc.lib pkgs.fontconfig pkgs.libGL pkgs.libxcb pkgs.libx11 pkgs.libxkbcommon pkgs.wayland ]; installPhase = '' mkdir -p $out/bin cp $src $out/bin/objdiff chmod +x $out/bin/objdiff ''; }; wibo = pkgs.stdenv.mkDerivation rec { pname = "wibo"; version = "1.0.3"; src = pkgs.fetchurl { url = "https://github.com/decompals/wibo/releases/download/${version}/wibo-x86_64"; sha256 = "f99iCxUXRClrm7kzGNjEAJ09PpjiNxim7an77Ezvuyo="; }; dontUnpack = true; nativeBuildInputs = [ pkgs.autoPatchelfHook ]; buildInputs = [ pkgs.stdenv.cc.cc.lib ]; installPhase = '' mkdir -p $out/bin cp $src $out/bin/wibo chmod +x $out/bin/wibo ''; }; in { devShells.default = pkgs.mkShell { name = "steamboat-willie-decomp"; packages = [ # Decomp project tools decomp-toolkit objdiff wibo ] ++ (with pkgs; [ # Reverse engineering ghidra radare2 # Wii/GC disc tools wiimms-iso-tools # Build tools ninja cmake gnumake pkg-config # Utilities git python3 wget curl jq patchelf unzip ]); shellHook = '' echo "=== Steamboat Willie Decomp Dev Shell ===" echo "" echo "Tools available:" echo " dtk - decomp-toolkit v1.8.4" echo " objdiff - objdiff v3.8.1" echo " wibo - Win32 wrapper v1.0.3 (runs CodeWarrior exes)" echo " ghidra - reverse engineering IDE" echo " radare2 - CLI disassembler" echo " wit - Wiimms ISO Tools" echo "" # Point DEVKITPPC at a devkitPro install if one exists. if [ -d "/opt/devkitpro/devkitPPC" ]; then export DEVKITPRO=/opt/devkitpro export DEVKITPPC=/opt/devkitpro/devkitPPC echo "DEVKITPPC found: $DEVKITPPC" else echo "Note: devkitPPC is not installed." echo " - For Metrowerks CodeWarrior games (most GC + many Wii)," echo " devkitPPC is NOT required. dtk + wibo handle everything." echo " - For GCC-compiled games (needing powerpc-eabi-gcc), install" echo " devkitPro first:" echo " wget https://apt.devkitpro.org/install-devkitpro-pacman" echo " sudo ./install-devkitpro-pacman" echo " sudo dkp-pacman -S devkitPPC" fi echo "" echo "Quick start:" echo " wit EXTRACT game.iso -o ./disc/" echo " dtk disc info game.iso" echo " dtk dol config sys/main.dol -o config.yml" echo " python configure.py" echo " ninja" ''; }; } ); }