{
  stdenv,
  lib,
  fetchFromBitbucket,
  cmake,
  pkg-config,
  makeWrapper,
  zlib,
  bzip2,
  libjpeg,
  SDL2,
  SDL2_net,
  SDL2_mixer,
  gtk3,
  writers,
  python3Packages,
  nix-update,
  fetchpatch,
}:

stdenv.mkDerivation (finalAttrs: {
  pname = "ecwolf";
  version = "1.4.1";

  src = fetchFromBitbucket {
    owner = "ecwolf";
    repo = "ecwolf";
    rev = "refs/tags/${finalAttrs.version}";
    hash = "sha256-V2pSP8i20zB50WtUMujzij+ISSupdQQ/oCYYrOaTU1g=";
  };

  patches = [
    # Fixes build with gcc >= 14. Shouldn't be needed for ecwolf versions > 1.4.1.
    (fetchpatch {
      name = "tmemory.h-const-correctness.patch";
      url = "https://bitbucket.org/ecwolf/ecwolf/commits/400aaf96a36a14ab8eab18a670ba6439046f3bb0/raw";
      hash = "sha256-2YwHEctBPyprs0DVsazimGEgmiCba24zh2dFfw9tOnU=";
    })
  ];

  nativeBuildInputs = [
    cmake
    pkg-config
  ]
  ++ lib.optionals stdenv.hostPlatform.isDarwin [ makeWrapper ];
  buildInputs = [
    zlib
    bzip2
    libjpeg
    SDL2
    SDL2_net
    SDL2_mixer
    gtk3
  ];

  NIX_LDFLAGS = lib.optionalString stdenv.hostPlatform.isDarwin "-framework AppKit";

  # ECWolf installs its binary to the games/ directory, but Nix only adds bin/
  # directories to the PATH.
  postInstall =
    lib.optionalString stdenv.hostPlatform.isLinux ''
      mv "$out/games" "$out/bin"
    ''
    + lib.optionalString stdenv.hostPlatform.isDarwin ''
      mkdir -p $out/{Applications,bin}
      cp -R ecwolf.app $out/Applications
      makeWrapper $out/{Applications/ecwolf.app/Contents/MacOS,bin}/ecwolf
    '';

  passthru.updateScript =
    let
      updateScriptPkg =
        writers.writePython3 "ecwolf_update_script"
          {
            libraries = with python3Packages; [
              debian-inspector
              requests
            ];
          }
          ''
            from os import execl
            from sys import argv

            from debian_inspector.debcon import get_paragraphs_data
            from requests import get

            # The debian.drdteam.org repo is a primary source of information. It’s
            # run by Blzut3, the creator and primary developer of ECWolf. It’s also
            # listed on ECWolf’s download page:
            # <https://maniacsvault.net/ecwolf/download.php>.
            url = 'https://debian.drdteam.org/dists/stable/multiverse/binary-amd64/Packages'  # noqa: E501
            response = get(url)
            packages = get_paragraphs_data(response.text)
            for package in packages:
                if package['package'] == 'ecwolf':
                    latest_version = package['version']
                    break
            nix_update_path = argv[1]

            execl(nix_update_path, nix_update_path, '--version', latest_version)
          '';
    in
    [
      updateScriptPkg
      (lib.getExe nix-update)
    ];

  meta = with lib; {
    description = "Enhanched SDL-based port of Wolfenstein 3D for various platforms";
    mainProgram = "ecwolf";
    homepage = "https://maniacsvault.net/ecwolf/";
    license = licenses.gpl2Plus;
    maintainers = with maintainers; [
      jayman2000
      sander
    ];
    platforms = platforms.all;
  };
})
