diff options
author | aszlig <aszlig@redmoonstudios.org> | 2014-12-31 12:43:42 +0100 |
---|---|---|
committer | aszlig <aszlig@redmoonstudios.org> | 2014-12-31 12:43:42 +0100 |
commit | 78542269f574b83e405fe7e1e31202ea97d2eac1 (patch) | |
tree | 91bba3a29a80eb49a389cdf235ed3f707bdfe7da |
Add a (broken) collection of HumbleBundle games.
This is more or less a bunch of expressions for a few HumbleBundle games. Right now none of them are working, because fetchHumbleBundle is broken. But apart from that only ftl and cavestoryplus really work. The main reason for this commit is to collect those expressions together, sort them out and refactor them to have a working set of (maybe not only HumbleBundle) games that are difficult to package in nixpkgs, because the upstream binaries are not public. Signed-off-by: aszlig <aszlig@redmoonstudios.org>
-rw-r--r-- | bastion.nix | 25 | ||||
-rw-r--r-- | cavestoryplus.nix | 39 | ||||
-rw-r--r-- | default.nix | 24 | ||||
-rw-r--r-- | fetch-humble-bundle/default.nix | 82 | ||||
-rw-r--r-- | fez.nix | 35 | ||||
-rw-r--r-- | ftl.nix | 38 | ||||
-rw-r--r-- | hammerwatch.nix | 40 | ||||
-rw-r--r-- | jamestown.nix | 55 | ||||
-rw-r--r-- | megabytepunch.nix | 18 | ||||
-rw-r--r-- | rocketbirds.nix | 11 | ||||
-rw-r--r-- | spaz.nix | 39 | ||||
-rw-r--r-- | swordsandsoldiers.nix | 43 |
12 files changed, 449 insertions, 0 deletions
diff --git a/bastion.nix b/bastion.nix new file mode 100644 index 00000000..652b8011 --- /dev/null +++ b/bastion.nix @@ -0,0 +1,25 @@ +{ stdenv, fetchHumbleBundle, lzma, mono }: + +let + arch = if stdenv.system == "i686-linux" then "x86" + else if stdenv.system == "x86_64-linux" then "x86_64" + else throw "Unsupported architecture ${stdenv.system}!"; +in stdenv.mkDerivation rec { + name = "bastion-1.4"; + + src = fetchHumbleBundle { + name = "Bastion-HIB-2012-06-20.sh"; + md5 = "aa6ccaead3b4b8a5fbd156f4019e8c8b"; + }; + + unpackCmd = '' + mkdir "${name}" + + sh "$src" --tar xf ./instarchive_all -O | ${lzma}/bin/lzcat \ + | tar x -C "${name}" Bastion.exe + ''; + + installPhase = '' + install -vD "Bastion.bin.${arch}" "$out/bin/bastion" + ''; +} diff --git a/cavestoryplus.nix b/cavestoryplus.nix new file mode 100644 index 00000000..474c8a12 --- /dev/null +++ b/cavestoryplus.nix @@ -0,0 +1,39 @@ +{ stdenv, fetchHumbleBundle, makeWrapper, SDL, mesa }: + +stdenv.mkDerivation rec { + name = "cave-story-plus-${version}"; + version = "r100"; + + src = fetchHumbleBundle { + machineName = "cavestoryplus_linux"; + downloadName = ".tar.bz2"; + suffix = "tar.bz2"; + md5 = "b7ecd65644b8607bc177d7ce670f2185"; + }; + + buildInputs = [ makeWrapper ]; + + patchPhase = let + rpath = stdenv.lib.makeLibraryPath [ + SDL "$out" stdenv.cc.gcc mesa + ]; + in '' + patchelf \ + --set-interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \ + --set-rpath "${rpath}" CaveStory+_64 + ''; + + installPhase = '' + install -vD CaveStory+_64 "$out/libexec/cave-story-plus/cave-story-plus" + mkdir -p "$out/bin" + makeWrapper \ + "$out/libexec/cave-story-plus/cave-story-plus" \ + "$out/bin/cave-story-plus" \ + --run "cd '$out/share/cave-story-plus'" + + mkdir -p "$out/share/cave-story-plus" + cp -vrt "$out/share/cave-story-plus" data + ''; + + dontStrip = true; +} diff --git a/default.nix b/default.nix new file mode 100644 index 00000000..30d341f3 --- /dev/null +++ b/default.nix @@ -0,0 +1,24 @@ +{ email, password }: + +with import <nixpkgs> {}; + +let + self = rec { + callPackage = pkgs.lib.callPackageWith (pkgs // self); + + fetchHumbleBundle = callPackage ./fetch-humble-bundle { + inherit email password; + }; + + bastion = callPackage ./bastion.nix {}; + cavestoryplus = callPackage ./cavestoryplus.nix {}; + fez = callPackage ./fez.nix {}; + ftl = callPackage ./ftl.nix {}; + hammerwatch = callPackage ./hammerwatch.nix {}; + jamestown = callPackage ./jamestown.nix {}; + megabytepunch = callPackage ./megabytepunch.nix {}; + rocketbirds = callPackage ./rocketbirds.nix {}; + spaz = callPackage ./spaz.nix {}; + swordsandsoldiers = callPackage ./swordsandsoldiers.nix {}; + }; +in self diff --git a/fetch-humble-bundle/default.nix b/fetch-humble-bundle/default.nix new file mode 100644 index 00000000..0eba8b96 --- /dev/null +++ b/fetch-humble-bundle/default.nix @@ -0,0 +1,82 @@ +{ stdenv, curl, cacert, email, password, writeText, fetchFromGitHub +, python, buildPythonPackage, pythonPackages +}: + +{ machineName, downloadName ? "Download", suffix ? "humblebundle", md5 }: let + cafile = "${cacert}/etc/ca-bundle.crt"; + + humbleAPI = buildPythonPackage rec { + name = "humblebundle-${version}"; + version = "0.1.0"; + + src = fetchFromGitHub { + owner = "saik0"; + repo = "humblebundle-python"; + rev = version; + sha256 = "04kwghlwgdrhhr8dzc7avr5banpcwcaflh1v81r35jm0yf8inzsa"; + }; + + propagatedBuildInputs = with pythonPackages; [ requests2 ]; + }; + + getDownloadURL = writeText "gethburl.py" '' + import sys, humblebundle + + def get_products(client): + gamekeys = client.get_gamekeys() + for gamekey in gamekeys: + order = hb.get_order(gamekey) + if order.subproducts is None: + continue + for subproduct in order.subproducts: + prodname = subproduct.human_name.encode('ascii', 'replace') + downloads = [(download.machine_name, download.download_struct) + for download in subproduct.downloads] + yield (prodname, downloads) + + def find_download(downloads): + for machine_name, dstruct in sum(downloads.values(), []): + if machine_name == '${machineName}': + for ds in dstruct: + if ds.name == '${downloadName}': + return ds + print >>sys.stderr, \ + 'Unable to find ${downloadName} for ${machineName}!' + print >>sys.stderr, 'Available download types:' + for ds in dstruct: + print >>sys.stderr, " " + ds.name + raise SystemExit(1) + + hb = humblebundle.HumbleApi() + hb.login('${email}', '${password}') + products = dict(get_products(hb)) + dstruct = find_download(products) + + if dstruct is None: + print >>sys.stderr, 'Cannot find download for ${machineName}!' + print >>sys.stderr, 'Available machine names:' + for name, dstructs in sorted(products.items(), key=lambda x: x[0]): + print >>sys.stderr, " * " + name + print >>sys.stderr, " " + ', '.join(map(lambda x: x[0], dstructs)) + raise SystemExit(1) + elif dstruct.md5 != '${md5}': + print >>sys.stderr, \ + 'MD5 for ${machineName} is not ${md5} but ' + dstruct.md5 + '.' + raise SystemExit(1) + else: + print dstruct.url.web + ''; +in stdenv.mkDerivation { + name = "${machineName}.${suffix}"; + outputHashAlgo = "md5"; + outputHash = md5; + + buildInputs = [ python humbleAPI ]; + + buildCommand = '' + url="$(python "${getDownloadURL}")" + header "downloading $name from $url" + ${curl}/bin/curl --cacert "${cafile}" --fail --output "$out" "$url" + stopNest + ''; +} diff --git a/fez.nix b/fez.nix new file mode 100644 index 00000000..59cda41d --- /dev/null +++ b/fez.nix @@ -0,0 +1,35 @@ +{ stdenv, fetchHumbleBundle, unzip, mono, openal, SDL2 }: + +let + version = "1.0.2"; + usVersion = stdenv.lib.replaceChars ["."] ["_"] version; +in stdenv.mkDerivation rec { + name = "fez-${version}"; + version = "09152013"; + + src = fetchHumbleBundle { + name = "${name}-bin"; + md5 = "4ac954101835311f3528f5369e1fecb7"; + }; + + unpackPhase = '' + ${unzip}/bin/unzip -qq "$src" 'data/*' || true + sourceRoot=data + ''; + + dontStrip = true; + + buildPhase = '' + patchelf \ + --set-interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \ + --set-rpath "${stdenv.lib.makeLibraryPath [ mono openal SDL2 ]}" \ + FEZ.bin.x86_64 + ''; + + installPhase = '' + ensureDir "$out/bin" "$out/libexec/fez/mono/2.0" + install -vD FEZ.bin.x86_64 "$out/libexec/fez/fez" + install -vt "$out/libexec/fez/mono/2.0" *.dll + ln -s "$out/libexec/fez/fez" "$out/bin/fez" + ''; +} diff --git a/ftl.nix b/ftl.nix new file mode 100644 index 00000000..a6fc84b2 --- /dev/null +++ b/ftl.nix @@ -0,0 +1,38 @@ +{ stdenv, fetchHumbleBundle, makeWrapper, SDL, mesa, libdevil, freetype }: + +stdenv.mkDerivation rec { + name = "ftl-${version}"; + version = "1.5.13"; + + src = fetchHumbleBundle { + machineName = "ftlfasterthanlight_soundtrack_linux"; + downloadName = ".tar.gz"; + suffix = "tar.gz"; + md5 = "791e0bc8de73fcdcd5f461a4548ea2d8"; + }; + + buildInputs = [ makeWrapper ]; + + patchPhase = let + rpath = stdenv.lib.makeLibraryPath [ + SDL "$out" stdenv.cc.gcc mesa libdevil freetype + ]; + in '' + patchelf \ + --set-interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \ + --set-rpath "${rpath}" data/amd64/bin/FTL + ''; + + installPhase = '' + install -vD "data/amd64/bin/FTL" "$out/libexec/ftl/FTL" + install -vD "data/amd64/lib/libbass.so" "$out/lib/libbass.so" + install -vD "data/amd64/lib/libbassmix.so" "$out/lib/libbassmix.so" + + mkdir -p "$out/bin" "$out/share/ftl" + cp -vrt "$out/share/ftl" data/resources + makeWrapper "$out/libexec/ftl/FTL" "$out/bin/ftl" \ + --run "cd '$out/share/ftl'" + ''; + + dontStrip = true; +} diff --git a/hammerwatch.nix b/hammerwatch.nix new file mode 100644 index 00000000..8cf65211 --- /dev/null +++ b/hammerwatch.nix @@ -0,0 +1,40 @@ +{ stdenv, fetchHumbleBundle, makeWrapper, unzip, mono, SDL2, mesa, openal +, pulseaudio +}: + +# FIXME: Dosn't support the XDG Base Directory Specification, +# so enforce it using LD_PRELOAD maybe? + +stdenv.mkDerivation rec { + name = "hammerwatch-${version}"; + version = "1.3"; + + src = fetchHumbleBundle { + machineName = "hammerwatch_linux"; + suffix = "zip"; + md5 = "7cd77e4395f394c3062322c96e418732"; + }; + + buildInputs = [ unzip makeWrapper ]; + + installPhase = let + rpath = stdenv.lib.makeLibraryPath [ SDL2 mesa openal pulseaudio ]; + monoNoLLVM = mono.override { withLLVM = false; }; + in '' + mkdir -p "$out/lib" + cp -rt "$out/lib" SDL2-CS.dll SDL2-CS.dll.config \ + TiltedEngine.dll Lidgren.Network.dll FarseerPhysicsOTK.dll \ + ICSharpCode.SharpZipLib.dll SteamworksManaged.dll NVorbis.dll + + libexec="$out/libexec/hammerwatch" + install -vD Hammerwatch.exe "$libexec/hammerwatch.exe" + cp -rt "$libexec" assets.bin editor levels + + makeWrapper "${monoNoLLVM}/bin/mono" "$out/bin/hammerwatch" \ + --add-flags "$libexec/hammerwatch.exe" \ + --set MONO_PATH "$out/lib" \ + --set LD_LIBRARY_PATH "${rpath}" + ''; + + dontStrip = true; +} diff --git a/jamestown.nix b/jamestown.nix new file mode 100644 index 00000000..4836b302 --- /dev/null +++ b/jamestown.nix @@ -0,0 +1,55 @@ +{ stdenv, fetchHumbleBundle, unzip, pkgsi686Linux, expect, makeWrapper +, SDL, openal +}: + +let + version = "1.0.2"; + usVersion = stdenv.lib.replaceChars ["."] ["_"] version; +in stdenv.mkDerivation rec { + name = "jamestown-${version}"; + + src = fetchHumbleBundle { + machineName = "jamestown_linux"; + downloadName = ".zip"; + suffix = "zip"; + md5 = "dcfb4348aba89f0f26bf5b4c7e05d936"; + }; + + buildInputs = [ makeWrapper ]; + + unpackPhase = '' + ${unzip}/bin/unzip -q "$src" + patchelf --set-interpreter "${pkgsi686Linux.glibc}"/lib/ld-linux.so.* \ + "JamestownInstaller_${usVersion}-bin" + ${expect}/bin/expect <<INSTALL + spawn "./JamestownInstaller_${usVersion}-bin" + expect "see more?" + send "n\r" + expect "Accept this license?" + send "y\r" + expect "Press enter to continue." + send "\r" + expect "Enter path" + send "$(pwd)/${name}\r" + expect eof + INSTALL + sourceRoot="$(pwd)/${name}" + ''; + + installPhase = let + rpath = stdenv.lib.makeLibraryPath [ SDL openal ]; + in '' + libexec="$out/libexec/jamestown" + install -vD Jamestown-amd64 "$libexec/jamestown" + + mkdir -p "$out/share" + mv Archives "$out/share/jamestown" + + makeWrapper "$(cat "$NIX_GCC/nix-support/dynamic-linker")" \ + "$out/bin/jamestown" \ + --add-flags "$libexec/jamestown" \ + --set LD_LIBRARY_PATH "${rpath}" + + false # Both amd64 and i686 binaries are fucking BROKEN, wait for 1.0.3... + ''; +} diff --git a/megabytepunch.nix b/megabytepunch.nix new file mode 100644 index 00000000..643e5835 --- /dev/null +++ b/megabytepunch.nix @@ -0,0 +1,18 @@ +{ stdenv, fetchHumbleBundle }: + +stdenv.mkDerivation rec { + name = "megabytepunch-${version}"; + version = "1.12"; + + src = fetchHumbleBundle { + machineName = "megabytepunch_linux"; + suffix = "tar.gz"; + md5 = "13487ae35c99817ce5f19b45fa51158b"; + }; + + patchPhase = '' + patchelf \ + --set-interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \ + + ''; +} diff --git a/rocketbirds.nix b/rocketbirds.nix new file mode 100644 index 00000000..a57d1562 --- /dev/null +++ b/rocketbirds.nix @@ -0,0 +1,11 @@ +{ stdenv, fetchHumbleBundle }: + +stdenv.mkDerivation rec { + name = "rocketbirds-${version}"; + version = "20130917"; + + src = fetchHumbleBundle { + name = "Rocketbirds${version}.sh"; + md5 = "7c5e6da4cd7fc7f2f51861f8b96a386f"; + }; +} diff --git a/spaz.nix b/spaz.nix new file mode 100644 index 00000000..7ba028d9 --- /dev/null +++ b/spaz.nix @@ -0,0 +1,39 @@ +{ stdenv, fetchHumbleBundle, unzip, pkgsi686Linux }: + +stdenv.mkDerivation rec { + name = "spaz-${version}"; + version = "09182012"; + + src = fetchHumbleBundle { + name = "spaz-linux-humblebundle-${version}-bin"; + md5 = "9b2f28009949f2dff9f3a737e46fabfd"; + }; + + buildInputs = [ pkgsi686Linux.makeWrapper ]; + + unpackCmd = '' + ${unzip}/bin/unzip -qq "$src" 'data/*' || true + ''; + + dontStrip = true; + + buildPhase = let + libs = pkgsi686Linux.stdenv.lib.makeLibraryPath [ + pkgsi686Linux.stdenv.cc.gcc pkgsi686Linux.SDL + ]; + in '' + patchelf --set-interpreter "${pkgsi686Linux.glibc}"/lib/ld-linux.so.* \ + --set-rpath "${libs}" SPAZ + ''; + + installPhase = let + libs = pkgsi686Linux.stdenv.lib.makeLibraryPath [ + pkgsi686Linux.mesa pkgsi686Linux.openal pkgsi686Linux.alsaPlugins + ]; + in '' + install -vD SPAZ "$out/libexec/spaz/spaz" + cp -rt "$out/libexec/spaz" audio.so common game mods + makeWrapper "$out/libexec/spaz/spaz" "$out/bin/spaz" \ + --set LD_LIBRARY_PATH "${libs}" + ''; +} diff --git a/swordsandsoldiers.nix b/swordsandsoldiers.nix new file mode 100644 index 00000000..f99b0db1 --- /dev/null +++ b/swordsandsoldiers.nix @@ -0,0 +1,43 @@ +{ stdenv, fetchHumbleBundle, makeWrapper +, SDL, mesa, zlib, openal, libvorbis, xorg, fontconfig, freetype, libogg +}: + +stdenv.mkDerivation rec { + name = "swordsandsoldiers-${version}"; + version = "20120325"; + + src = fetchHumbleBundle { + machineName = "swordsandsoldiers_android_and_pc_linux"; + downloadName = "x86_64.tar.gz"; + suffix = "tar.gz"; + md5 = "5f0c9789fa053cbf6bac021a338245bb"; + }; + + buildInputs = [ makeWrapper ]; + + patchPhase = let + rpath = stdenv.lib.makeLibraryPath [ + SDL mesa zlib openal libvorbis fontconfig freetype stdenv.cc.gcc libogg + xorg.libX11 xorg.libXft xorg.libXinerama xorg.libXext xorg.libXpm + ]; + in '' + for i in SwordsAndSoldiers.bin SwordsAndSoldiersSetup.bin; do + patchelf \ + --set-interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \ + --set-rpath "${rpath}" "$i" + done + ''; + + installPhase = '' + libexec="$out/libexec/swordsandsoldiers" + install -vD SwordsAndSoldiers.bin "$libexec/swordsandsoldiers" + install -vD SwordsAndSoldiersSetup.bin "$libexec/setup" + mv Data "$libexec/" + + mkdir -p "$out/bin" + ln -s "$libexec/swordsandsoldiers" "$out/bin/swordsandsoldiers" + ln -s "$libexec/setup" "$out/bin/swordsandsoldiers-setup" + ''; + + dontStrip = true; +} |