diff options
Diffstat (limited to 'pkgs/games/gog/albion/default.nix')
-rw-r--r-- | pkgs/games/gog/albion/default.nix | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/pkgs/games/gog/albion/default.nix b/pkgs/games/gog/albion/default.nix new file mode 100644 index 00000000..a7493712 --- /dev/null +++ b/pkgs/games/gog/albion/default.nix @@ -0,0 +1,187 @@ +{ stdenv, lib, buildSandbox, fetchGog, gogUnpackHook, fetchzip +, SDL2, SDL2_mixer, bchunk, p7zip, alsaLib, writeText, makeWrapper, libGL + +# For static recompilation +, fetchFromGitHub, scons, judy, python, nasm, autoreconfHook + +, language ? "en" +}: + +let + version = "1.6.1"; + + staticRecompilerSource = fetchFromGitHub { + owner = "M-HT"; + repo = "SR"; + rev = "albion_v${version}"; + sha256 = "0yspgssfk5xbrs5krq0sin561rgb0fva4hk7mlxlcrvs0xpqf5z8"; + }; + + mkPatchedWildMidi = variant: stdenv.mkDerivation { + name = "${variant}-0.2.3.5patched"; + src = "${staticRecompilerSource}/midi-libs/${variant}-0.2.3.5svn"; + nativeBuildInputs = [ autoreconfHook ]; + buildInputs = [ alsaLib ]; + patches = [ ./wildmidi-build-fixes.patch ]; + postPatch = '' + sed -i -e '/^CFLAGS/s/-pedantic//' configure.ac + sed -i -e '/^wildmidi_libs *=/s!\$(top_builddir)/src/!!' src/Makefile.am + ''; + }; + + compileMidiPlugin = variant: let + commonDrvAttrs = rec { + name = "midi-plugin-${variant}"; + soname = "midi-${variant}"; + sourceFile = "${soname}.c"; + midiLib = "WildMidi"; + + src = "${staticRecompilerSource}/midi-plugins"; + + buildInputs = lib.singleton (mkPatchedWildMidi variant); + + timidityCfg = let + gusPatches = lib.overrideDerivation (fetchzip { + url = "http://sebt3.openpandora.org/pnd/timidity_midi_installer.pnd"; + sha256 = "0nznac8lxcbj0fwbg0njlnh3ysa3d3c5i24n2cw0yv5yqji4cdsb"; + stripRoot = false; + }) (lib.const { unpackCmd = "${p7zip}/bin/7z x \"$curSrc\""; }); + in writeText "timidity-albion.cfg" '' + dir ${gusPatches}/eawpats + source ${gusPatches}/eawpats/sounds.cfg + ''; + + postPatch = '' + sed -i -e 's!getenv("TIMIDITY_CFG")!"'"$timidityCfg"'"!' \ + midi-wildmidi.c + ''; + + buildPhase = '' + gcc -shared -Wl,-soname,"$soname.so" -I. \ + -o "$soname.so" -fpic -m32 -O2 -Wall \ + "$sourceFile" -l"$midiLib" + ''; + + installPhase = '' + install -vD "$soname.so" "$out/lib/$soname.so" + ''; + }; + + extraAttrs = lib.optionalAttrs (variant == "wildmidiA") { + soname = "midiA-wildmidi"; + sourceFile = "albion/midiA-wildmidi.c"; + midiLib = "WildMidiA"; + }; + + in stdenv.mkDerivation (commonDrvAttrs // extraAttrs); + + udis86 = stdenv.mkDerivation { + name = "udis86"; + src = "${staticRecompilerSource}/SR/udis86-1.6"; + postPatch = "chmod +x configure mkinstalldirs"; + preInstall = "mkdir -p \"$out/lib\" \"$out/bin\""; + }; + + gameData = stdenv.mkDerivation rec { + name = "albion-game-data-${version}"; + version = "3"; + + src = fetchGog { + productId = 1436955815; + downloadName = "${language}1installer1"; + sha256 = ({ + de = "0ylhma70kcj255i03gy5xa3adb8hfw2xpk1m2pp5880aqkmr06k7"; + en = "0x0s2q0x7kjz6qfhb9qs5d959caijiinpc7xv4rx9n7mmb7xlh5m"; + }).${language}; + }; + + outputs = [ "out" "dev" ]; + + nativeBuildInputs = [ gogUnpackHook ]; + innoExtractOnly = [ "game.gog" "game.ins" "MAIN.EXE" "SETUP.INI" ]; + innoExtractKeepCase = true; + + phases = [ "unpackPhase" "patchPhase" "installPhase" ]; + + patchPhase = '' + sed -i -e ' + s,^SOURCE_PATH=.*,SOURCE_PATH=C:\\, + s/^\(MODE_[^=]*=\)N$/\1Y/ + ' SETUP.INI + ''; + installPhase = '' + ${bchunk}/bin/bchunk game.gog game.ins game_cd + ${p7zip}/bin/7z x game_cd01.iso ALBION + mv ALBION "$out" + install -vD -m 0644 SETUP.INI "$out/setup.ini" + install -vD -m 0644 MAIN.EXE "$dev/albion_main.exe" + ''; + }; + +in buildSandbox (stdenv.mkDerivation { + name = "albion-${version}"; + inherit version; + + src = staticRecompilerSource; + + patches = [ + ./scons.patch ./xdg-paths.patch ./config.patch ./sdl2.patch + ./error-log-stderr.patch ./cdpath-is-gamedir.patch + ./storepaths.patch + ]; + + wildmidi = compileMidiPlugin "wildmidi"; + wildmidiA = compileMidiPlugin "wildmidiA"; + + postPatch = '' + substituteInPlace games/Albion/SR-Main/main.c \ + --subst-var-by GAME_CONFIG_FILE "$out/etc/albion.cfg" \ + --subst-var-by GAME_DATA_PATH ${lib.escapeShellArg gameData.out} + + substituteInPlace games/Albion/SR-Main/virtualfs.c \ + --subst-var-by SETUP_INI_PATH "${gameData.out}/setup.ini" + + substituteInPlace games/Albion/SR-Main/Albion-music-midiplugin.c \ + --replace ./midi-wildmidi.so "$wildmidi/lib/midi-wildmidi.so" \ + --replace ./midiA-wildmidi.so "$wildmidiA/lib/midiA-wildmidi.so" \ + ''; + + nativeBuildInputs = [ scons judy python nasm udis86 makeWrapper ]; + buildInputs = [ SDL2 SDL2_mixer ]; + + NIX_CFLAGS_COMPILE = "-I${lib.getDev SDL2}/include/SDL2"; + + buildPhase = '' + scons -C SR debug=1 + + mkdir tmp + pushd tmp + cp ../SR-games/Albion/SR/x86/*.sci . + ../SR/SR.exe ${gameData.dev}/albion_main.exe Albion-main.asm + rm *.sci + python ../SR-games/Albion/SR/compact_source.py + nasm -felf -dELF -O1 -w+orphan-labels -w-number-overflow \ + -i../SR-games/Albion/SR/x86/ Albion-main_linux.asm 2> a.a || : + python ../SR-games/Albion/SR/repair_short_jumps.py + popd + + mv tmp/seg*.inc tmp/Albion-main.asm tmp/Albion-main_linux.asm \ + games/Albion/SR-Main/x86 + rm -r tmp + + scons -C games/Albion/SR-Main debug=1 device=pc-linux sdl2=1 + ''; + + installPhase = '' + install -vD -m 0644 games/Albion/release/linux/Albion.cfg \ + "$out/etc/albion.cfg" + install -vD games/Albion/SR-Main/SR-Main "$out/bin/albion" + + # XXX: Temporary workaround, because SDL tries to dlopen() libGL. + wrapProgram "$out/bin/albion" \ + --set SDL_OPENGL_LIBRARY ${lib.escapeShellArg "${libGL}/lib/libGL.so"} + ''; +}) { + paths.required = [ "$XDG_DATA_HOME/albion" "$XDG_CONFIG_HOME/albion" ]; + paths.runtimeVars = [ "LD_LIBRARY_PATH" ]; +} |