{
  lib,
  stdenv,
  fetchurl,
  python312,
  SDL2,
  libvorbis,
  openal,
  curl,
  gnugrep,
  libgcc,
  makeWrapper,
  makeDesktopItem,
  autoPatchelfHook,
  copyDesktopItems,
  writeShellApplication,
  commandLineArgs ? "",
  genericUpdater,
}:
let
  archive =
    {
      x86_64-linux = {
        name = "BombSquad_Linux_x86_64";
        hash = "sha256-jrExsqaM6uhnKMGPkJJTsKt2Imek+YDI2soSP/kfPj0=";
      };
      aarch-64-linux = {
        name = "BombSquad_Linux_Arm64";
        hash = "sha256-o1Yg0C5k07NZzc9jQrHXR+kkQl8HZ55U9/fqcpe3Iyw=";
      };
    }
    .${stdenv.targetPlatform.system} or (throw "${stdenv.targetPlatform.system} is unsupported.");
in
stdenv.mkDerivation (finalAttrs: {
  pname = "bombsquad";
  version = "1.7.37";
  sourceRoot = ".";
  src = fetchurl {
    url = "https://files.ballistica.net/bombsquad/builds/${archive.name}_${finalAttrs.version}.tar.gz";
    inherit (archive) hash;
  };

  bombsquadIcon = fetchurl {
    url = "https://files.ballistica.net/bombsquad/promo/BombSquadIcon.png";
    hash = "sha256-MfOvjVmjhLejrJmdLo/goAM9DTGubnYGhlN6uF2GugA=";
  };

  nativeBuildInputs = [
    python312
    SDL2
    libvorbis
    openal
    libgcc
    makeWrapper
    autoPatchelfHook
    copyDesktopItems
  ];

  desktopItems = [
    (makeDesktopItem {
      name = "bombsquad";
      genericName = "bombsquad";
      desktopName = "BombSquad";
      icon = "bombsquad";
      exec = "bombsquad";
      comment = "An explosive arcade-style party game.";
      categories = [ "Game" ];
    })
  ];

  installPhase = ''
    runHook preInstall

    base=${archive.name}_${finalAttrs.version}

    install -m755 -D $base/bombsquad $out/bin/bombsquad
    install -dm755 $base/ba_data $out/usr/share/bombsquad/ba_data
    cp -r $base/ba_data $out/usr/share/bombsquad/

    wrapProgram "$out/bin/bombsquad" \
      --add-flags ${lib.escapeShellArg commandLineArgs} \
      --add-flags "-d $out/usr/share/bombsquad"

    install -Dm755 ${finalAttrs.bombsquadIcon} $out/usr/share/icons/hicolor/32x32/apps/bombsquad.png

    runHook postInstall
  '';

  passthru.updateScript = genericUpdater {
    versionLister = lib.getExe (writeShellApplication {
      name = "bombsquad-versionLister";
      runtimeInputs = [
        curl
        gnugrep
      ];
      text = ''
        curl -sL "https://files.ballistica.net/bombsquad/builds/CHANGELOG.md" \
            | grep -oP '^### \K\d+\.\d+\.\d+' \
            | head -n 1
      '';
    });
  };

  meta = {
    description = "Free, multiplayer, arcade-style game for up to eight players that combines elements of fighting games and first-person shooters (FPS)";
    homepage = "https://ballistica.net";
    changelog = "https://ballistica.net/downloads?display=changelog";
    license = with lib.licenses; [
      mit
      unfree
    ];
    maintainers = with lib.maintainers; [
      syedahkam
      coffeeispower
    ];
    mainProgram = "bombsquad";
    platforms = lib.platforms.linux;
  };
})
