Skip to content

Commit

Permalink
uqm: Bring back package and fix 3do extractor.
Browse files Browse the repository at this point in the history
It was dropped in 324719a.

The UQM package itself doesn't require Haskell, but in order to extract
contents from the 3do version of the game, we need to have a small
helper utility which I wrote in Haskell a while ago. In order to switch
it to Haskell NG, only very minor modifications were necessary, which
are now done with this commit instead of dropping the whole game.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
  • Loading branch information
aszlig committed May 7, 2015
1 parent 5454be2 commit c7e7f12
Show file tree
Hide file tree
Showing 3 changed files with 170 additions and 0 deletions.
60 changes: 60 additions & 0 deletions 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"
'';
}
108 changes: 108 additions & 0 deletions 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 ];
};
}
2 changes: 2 additions & 0 deletions pkgs/top-level/all-packages.nix
Expand Up @@ -13126,6 +13126,8 @@ let

unvanquished = callPackage ../games/unvanquished { };

uqm = callPackage ../games/uqm { };

urbanterror = callPackage ../games/urbanterror { };

ue4demos = recurseIntoAttrs (callPackage ../games/ue4demos { });
Expand Down

0 comments on commit c7e7f12

Please sign in to comment.