Unverified Commit d0fc3089 authored by Fernando Rodrigues's avatar Fernando Rodrigues Committed by GitHub
Browse files

perfect_dark: init at 0-unstable-2025-08-25 (#306767)

parents 23e0867c cad17194
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -19664,6 +19664,13 @@
    githubId = 81905706;
    name = "Pau Kaifler";
  };
  PaulGrandperrin = {
    name = "Paul Grandperrin";
    email = "paul.grandperrin@gmail.com";
    github = "PaulGrandperrin";
    githubId = 1748936;
    keys = [ { fingerprint = "FEDA B009 17FA A574 F536 ED52 4AB1 3530 3377 4DA3"; } ];
  };
  paulsmith = {
    email = "paulsmith@pobox.com";
    github = "paulsmith";
+130 −0
Original line number Diff line number Diff line
{
  lib,
  stdenv,
  fetchFromGitHub,
  SDL2,
  cmake,
  libGL,
  pkg-config,
  python3,
  zlib,
  romID ? "ntsc-final",
}:
let
  roms = [
    "ntsc-final"
    "pal-final"
    "jpn-final"
  ];
in
assert lib.assertOneOf "romID" romID roms;

stdenv.mkDerivation (finalAttrs: {
  pname = "perfect_dark";
  version = "0-unstable-2025-08-25";

  src = fetchFromGitHub {
    owner = "fgsfdsfgs";
    repo = "perfect_dark";
    rev = "bb4fcffeb5dc382fce4c609897a2e82590d7d709";
    hash = "sha256-XLmAjwEzz4fPpHuk3IBmhhDfiuudwMTnYgVe6Wcfdsg=";
  };

  enableParallelBuilding = true;

  # Fails to build if not set:
  hardeningDisable = [ "format" ];
  hardeningEnable = [ "pie" ];

  cmakeFlags = [
    (lib.cmakeFeature "ROMID" romID)
  ];

  nativeBuildInputs = [
    cmake
    pkg-config
    python3
  ];

  buildInputs = [
    SDL2
    libGL
    zlib
  ];

  postPatch =
    # The project uses Git to retrieve version informations but our
    # fetcher deletes the .git directory, so we replace the commands
    # with the correct data directly.
    ''
      substituteInPlace CMakeLists.txt \
        --replace-fail "git rev-parse --short HEAD" \
                       "echo ${builtins.substring 0 9 finalAttrs.src.rev}" \
        --replace-fail "git rev-parse --abbrev-ref HEAD" \
                       "echo port"
    ''
    # Point toward the compiled binary and not the shell wrapper since
    # the rom auto-detection logic is not needed in this build.
    + ''
      substituteInPlace dist/linux/io.github.fgsfdsfgs.perfect_dark.desktop \
        --replace-fail "Exec=io.github.fgsfdsfgs.perfect_dark.sh" \
                       "Exec=io.github.fgsfdsfgs.perfect_dark"
    '';

  preConfigure = ''
    patchShebangs --build .
  '';

  installPhase = ''
    runHook preInstall

    pushd ..
    install -Dm755 build/pd.* $out/bin/io.github.fgsfdsfgs.perfect_dark
    install -Dm644 dist/linux/io.github.fgsfdsfgs.perfect_dark.desktop \
            -t $out/share/applications
    install -Dm644 dist/linux/io.github.fgsfdsfgs.perfect_dark.png \
            -t $out/share/icons/hicolor/256x256/apps
    install -Dm644 dist/linux/io.github.fgsfdsfgs.perfect_dark.metainfo.xml \
            -t $out/share/metainfo
    popd

    runHook postInstall
  '';

  meta = {
    description = "Modern cross-platform port of Perfect Dark";
    longDescription = ''
      This is a port of Ryan Dywer's decompilation of classic N64
      shooter Perfect Dark to modern systems.

      You will need to provide a copy of the ROM at
      `$HOME/.local/share/perfectdark/data/pd.${romID}.z64` to launch
      the game.

      Though `ntsc-final` is the recommended default, you can change
      the ROM variant of this game with an expression like this:

      ```nix
        perfect_dark.override { romID = "jpn-final"; }
      ```

      Supported romIDs are `${lib.generators.toPretty { } roms}`.
    '';
    homepage = "https://github.com/fgsfdsfgs/perfect_dark/";
    license = with lib.licenses; [
      # perfect_dark, khrplatform.h, port/fast3d
      mit
      # Vendored source code and binaries of 'gzip'.
      gpl3Plus
      # Derivative work of "Perfect Dark" © 2000 Rare Ltd.
      unfree
    ];
    maintainers = with lib.maintainers; [
      PaulGrandperrin
      normalcea
      sigmasquadron
    ];
    mainProgram = "io.github.fgsfdsfgs.perfect_dark";
    platforms = lib.platforms.linux;
  };
})