{ description = "Westgate Urban Foundation MVP — Blender 4.0.2 tileset generator kit"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; # Reuse the machine's pinned Blender 4.0.2 + NWN toolchain via the repo overlay. theorem.url = "git+file:///nix/nixos"; }; outputs = { self, nixpkgs, theorem, }: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; overlays = [ theorem.overlays.default ]; }; blender = pkgs.blender-402-bin; # /bin/blender-4.0.2 (NWN needs 4.0.x, not 5.x) py = pkgs.python3.withPackages (ps: [ ps.mcp ]); gen = ./generator; # whole dir so tiles.py sits beside each script for import build = pkgs.writeShellApplication { name = "wgt-build"; runtimeInputs = [ blender ]; text = '' out="''${1:-westgate_urban_foundation_mvp.blend}" exec blender-4.0.2 --background --python ${gen}/build.py -- "$out" ''; }; mkset = pkgs.writeShellApplication { name = "wgt-set"; runtimeInputs = [ py ]; text = ''exec python ${gen}/make_set.py "$@"''; }; mkwok = pkgs.writeShellApplication { name = "wgt-wok"; runtimeInputs = [ py ]; text = ''exec python ${gen}/make_wok.py "$@"''; }; # Real .mdl + .wok export via the Neverblender addon (must be enabled in # this Blender's user config — confirmed working headless). mkmdl = pkgs.writeShellApplication { name = "wgt-export"; runtimeInputs = [ blender ]; text = '' blend="''${1:?usage: wgt-export [CODE...]}" outdir="''${2:-mdl}" shift 2 || true exec blender-4.0.2 --background "$blend" --python ${gen}/export_mdl.py \ --python-exit-code 1 -- "$outdir" "$@" ''; }; # One shot: build -> export -> .set, then stage the loose files into the # toolset's development/ folder (no .hak). Work dir defaults to ./build. mkdev = pkgs.writeShellApplication { name = "wgt-dev-install"; runtimeInputs = [ blender py ]; text = '' work="''${1:-$PWD/build}" dev="$HOME/Documents/Neverwinter Nights/development" mkdir -p "$work/mdl" "$dev" blend="$work/westgate_urban_foundation_mvp.blend" blender-4.0.2 --background --python ${gen}/build.py --python-exit-code 1 -- "$blend" blender-4.0.2 --background "$blend" --python ${gen}/export_mdl.py --python-exit-code 1 -- "$work/mdl" python ${gen}/make_set.py "$work/twu01.set" # replace only our own prefix in development/, leave everything else alone rm -f "$dev"/twu01_*.mdl "$dev"/twu01_*.wok "$dev"/twu01.set cp "$work"/mdl/twu01_*.mdl "$work"/mdl/twu01_*.wok "$work"/twu01.set "$dev"/ n=$(find "$work/mdl" -name 'twu01_*.mdl' | wc -l) echo "installed $n tiles + twu01.set -> $dev" ''; }; in { packages.${system}.default = build; apps.${system} = { default = { type = "app"; program = "${build}/bin/wgt-build"; }; build = { type = "app"; program = "${build}/bin/wgt-build"; }; set = { type = "app"; program = "${mkset}/bin/wgt-set"; }; wok = { type = "app"; program = "${mkwok}/bin/wgt-wok"; }; export = { type = "app"; program = "${mkmdl}/bin/wgt-export"; }; dev-install = { type = "app"; program = "${mkdev}/bin/wgt-dev-install"; }; }; devShells.${system}.default = pkgs.mkShell { packages = [ blender py pkgs.neverwinter-nim pkgs.cleanmodels ]; shellHook = '' export BLENDER_BIN=${blender}/bin/blender-4.0.2 echo "wgt01 dev shell — build: blender-4.0.2 --background --python generator/build.py -- out.blend" >&2 ''; }; }; }