Unverified Commit 117b2045 authored by Wolfgang Walther's avatar Wolfgang Walther
Browse files

keen4: modernize

It all starts with fixing the broken download URL and then simplifies
from there. The file is short and old enough to basically just rewrite
it once.
parent 367c15cf
Loading
Loading
Loading
Loading
+28 −41
Original line number Diff line number Diff line
{
  lib,
  stdenv,
  fetchurl,
  dosbox,
  unzip,
  fetchzip,
  lib,
  writeShellApplication,
}:

stdenv.mkDerivation {
  name = "keen4";

  src = fetchurl {
    url = "http://tarballs.nixos.org/keen4.zip";
    sha256 = "12rnc9ksl7v6l8wsxvr26ylkafzq80dbsa7yafzw9pqc8pafkhx1";
let
  zip = fetchzip {
    name = "keen4.zip";
    url = "https://archive.org/download/msdos_Commander_Keen_4_-_Secret_of_the_Oracle_1991/Commander_Keen_4_-_Secret_of_the_Oracle_1991.zip";
    hash = "sha256-vVfBQArNH1JPUxM5suMe8NK54a+NAMnDhLKxVUOzUgA=";
  };
in
writeShellApplication {
  name = "keen4";

  nativeBuildInputs = [ unzip ];

  installPhase = ''
    mkdir -p $out/share/keen4
    mv * $out/share/keen4

    mkdir -p $out/bin
    cat > $out/bin/keen4 <<EOF
    #! $SHELL -e
    if test -z "\$HOME"; then
        echo "HOME directory not set"
        exit 1
    fi
  runtimeInputs = [ dosbox ];

  # Game wants to write in the current directory, but of course we can't
  # let it write in the Nix store.  So create symlinks to the game files
  # in ~/.keen4 and execute game from there.
    mkdir -p \$HOME/.keen4
    cd \$HOME/.keen4

    ln -sf $out/share/keen4/* .

    ${dosbox}/bin/dosbox ./KEEN4E.EXE -fullscreen -exit || true

    # Cleanup the symlinks.
    for i in *; do
        if test -L "\$i"; then
            rm "\$i"
        fi
    done
    EOF
    chmod +x $out/bin/keen4
  text = ''
    mkdir -p "''${HOME:-.}/.keen4"
    cd "''${HOME:-.}/.keen4"
    # avoid linking CONFIG.CK4, which must be writable
    ln -sft . ${zip}/{AUDIO.CK4,EGAGRAPH.CK4,GAMEMAPS.CK4,KEEN4E.EXE}
    trap 'find . -type l -delete' EXIT

    dosbox ./KEEN4E.EXE -fullscreen -exit
  '';

  meta = {
    description = "Commander Keen Episode 4: Secret of the Oracle";
    license = lib.licenses.unfree;
    homepage = "https://web.archive.org/web/20141013080934/http://www.3drealms.com/keen4/index.html";
    downloadPage = "https://archive.org/details/msdos_Commander_Keen_4_-_Secret_of_the_Oracle_1991";
    license = lib.licenses.unfreeRedistributable;
    platforms = dosbox.meta.platforms;
    sourceProvenance = with lib.sourceTypes; [ binaryBytecode ]; # emulated by dosbox, so "bytecode" in a way
    maintainers = with lib.maintainers; [ wolfgangwalther ];
    mainProgram = "keen4";
  };
}