diff --git a/pkgs/games/uqm/3dovideo.nix b/pkgs/games/uqm/3dovideo.nix new file mode 100644 index 000000000000..ca5a1197a327 --- /dev/null +++ b/pkgs/games/uqm/3dovideo.nix @@ -0,0 +1,60 @@ +{ stdenv, requireFile, writeText, fetchurl, haskellPackages }: + +with stdenv.lib; + +let + makeSpin = num: let + padded = (optionalString (lessThan num 10) "0") + toString num; + in "slides.spins.${padded} = 3DOVID:" + + "addons/3dovideo/spins/ship${padded}.duk:" + + "addons/3dovideo/spins/spin.aif:" + + "addons/3dovideo/spins/ship${padded}.aif:89"; + + videoRMP = writeText "3dovideo.rmp" ('' + slides.ending = 3DOVID:addons/3dovideo/ending/victory.duk + slides.intro = 3DOVID:addons/3dovideo/intro/intro.duk + '' + concatMapStrings makeSpin (range 0 24)); + + helper = with haskellPackages; mkDerivation { + pname = "uqm3donix"; + version = "0.1.0.0"; + + src = fetchurl { + url = "https://github.com/aszlig/uqm3donix/archive/v0.1.0.0.tar.gz"; + sha256 = "0d40gpc3bqkw68varjxwgbdzxw0dvwqksijmvij5ixmlcspbjgvb"; + }; + + isLibrary = false; + isExecutable = true; + + buildDepends = [ base binary bytestring filepath tar ]; + + description = "Extract video files from a Star Control II 3DO image"; + license = stdenv.lib.licenses.bsd3; + }; + +in stdenv.mkDerivation { + name = "uqm-3dovideo"; + + src = requireFile rec { + name = "videos.tar"; + sha256 = "044h0cl69r0kc43vk4n0akk0prwzb7inq324h5yfqb38sd4zkds1"; + message = '' + In order to get the intro and ending sequences from the 3DO version, you + need to have the original 3DO Star Control II CD. Create an image from the + CD and use uqm3donix* to extract a tarball with the videos from it. The + reason for this is because the 3DO uses its own proprietary disk format. + + Save the file as videos.tar and use "nix-prefetch-url file://${name}" to + add it to the Nix store. + + [*] ${helper}/bin/uqm3donix CDIMAGE ${name} + ''; + }; + + buildCommand = '' + mkdir -vp "$out" + tar xf "$src" -C "$out" --strip-components=3 + cp "${videoRMP}" "$out/3dovideo.rmp" + ''; +} diff --git a/pkgs/games/uqm/default.nix b/pkgs/games/uqm/default.nix new file mode 100644 index 000000000000..9d233d383384 --- /dev/null +++ b/pkgs/games/uqm/default.nix @@ -0,0 +1,108 @@ +{ stdenv, fetchurl +, pkgconfig, mesa +, SDL, SDL_image, libpng, zlib, libvorbis, libogg, libmikmod, unzip + +, use3DOVideos ? false, requireFile ? null, writeText ? null +, haskellPackages ? null + +, useRemixPacks ? false +}: + +assert use3DOVideos -> requireFile != null && writeText != null + && haskellPackages != null; + +with stdenv.lib; + +let + videos = import ./3dovideo.nix { + inherit stdenv requireFile writeText fetchurl haskellPackages; + }; + + remixPacks = imap (num: sha256: fetchurl rec { + name = "uqm-remix-disc${toString num}.uqm"; + url = "mirror://sourceforge/sc2/${name}"; + inherit sha256; + }) [ + "1s470i6hm53l214f2rkrbp111q4jyvnxbzdziqg32ffr8m3nk5xn" + "1pmsq65k8gk4jcbyk3qjgi9yqlm0dlaimc2r8hz2fc9f2124gfvz" + "07g966ylvw9k5q9jdzqdczp7c5qv4s91xjlg4z5z27fgcs7rzn76" + "1l46k9aqlcp7d3fjkjb3n05cjfkxx8rjlypgqy0jmdx529vikj54" + ]; + +in stdenv.mkDerivation rec { + name = "uqm-${version}"; + version = "0.7.0"; + + src = fetchurl { + url = "mirror://sourceforge/sc2/uqm-${version}-source.tgz"; + sha256 = "08dj7fsvflxx69an6vpf3wx050mk0ycmdv401yffrrqbgxgmqsd3"; + }; + + content = fetchurl { + url = "mirror://sourceforge/sc2/uqm-${version}-content.uqm"; + sha256 = "1gx39ns698hyczd4nx73mr0z86bbi4q3h8sw3pxjh1lzla5xpxmq"; + }; + + voice = fetchurl { + url = "mirror://sourceforge/sc2/uqm-${version}-voice.uqm"; + sha256 = "0yf9ff5sxk229202gsa7ski6wn7a8hkjjyr1yr7mjdxsnh0zik5w"; + }; + + music = fetchurl { + url = "mirror://sourceforge/sc2/uqm-${version}-3domusic.uqm"; + sha256 = "10nbvcrr0lc0mxivxfkcbxnibwk3vwmamabrlvwdsjxd9pk8aw65"; + }; + + + /* uses pthread_cancel(), which requires libgcc_s.so.1 to be + loadable at run-time. Adding the flag below ensures that the + library can be found. Obviously, though, this is a hack. */ + NIX_LDFLAGS="-lgcc_s"; + + buildInputs = [SDL SDL_image libpng libvorbis libogg libmikmod unzip pkgconfig mesa]; + + postUnpack = '' + mkdir -p uqm-${version}/content/packages + mkdir -p uqm-${version}/content/addons + ln -s "$content" "uqm-${version}/content/packages/uqm-0.7.0-content.uqm" + ln -s "$music" "uqm-${version}/content/addons/uqm-0.7.0-3domusic.uqm" + ln -s "$voice" "uqm-${version}/content/addons/uqm-0.7.0-voice.uqm" + '' + optionalString useRemixPacks (concatMapStrings (disc: '' + ln -s "${disc}" "uqm-$version/content/addons/${disc.name}" + '') remixPacks) + optionalString use3DOVideos '' + ln -s "${videos}" "uqm-${version}/content/addons/3dovideo" + ''; + + /* uqm has a 'unique' build system with a root script incidentally called + * 'build.sh'. */ + + configurePhase = '' + echo "INPUT_install_prefix_VALUE='$out'" >> config.state + echo "INPUT_install_bindir_VALUE='$out/bin'" >> config.state + echo "INPUT_install_libdir_VALUE='$out/lib'" >> config.state + echo "INPUT_install_sharedir_VALUE='$out/share'" >> config.state + PREFIX=$out ./build.sh uqm config + ''; + + buildPhase = '' + ./build.sh uqm + ''; + + installPhase = '' + ./build.sh uqm install + sed -i $out/bin/uqm -e "s%/usr/local/games/%$out%g" + ''; + + meta = { + description = "Remake of Star Control II"; + longDescription = '' + The goals for the The Ur-Quan Masters project are: + - to bring Star Control II to modern platforms, thereby making a lot of people happy + - to make game translations easy, thereby making even more people happy + - to adapt the code so that people can more easily make their own spin-offs, thereby making zillions more people happy! + ''; + homepage = http://sc2.sourceforge.net/; + license = stdenv.lib.licenses.gpl2; + maintainers = with maintainers; [ jcumming aszlig ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index f08ecfeb5bd9..6bac3bfc57bf 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -13126,6 +13126,8 @@ let unvanquished = callPackage ../games/unvanquished { }; + uqm = callPackage ../games/uqm { }; + urbanterror = callPackage ../games/urbanterror { }; ue4demos = recurseIntoAttrs (callPackage ../games/ue4demos { });