{ lib, stdenv, fetchurl, pkg-config, unzip, zlib, libpng, bzip2, SDL, SDL_mixer , buildEnv, config, runtimeShell }: let # Choose your "paksets" of objects, images, text, music, etc. paksets = config.simutrans.paksets or "pak64 pak64.japan pak128 pak128.britain pak128.german"; result = with lib; withPaks ( if paksets == "*" then attrValues pakSpec # taking all else map (name: pakSpec.${name}) (splitString " " paksets) ); ver1 = "121"; ver2 = "0"; ver3 = ""; version = "${ver1}.${ver2}${lib.optionalString (ver3 != "") ".${ver3}"}"; ver_dash = "${ver1}-${ver2}${lib.optionalString (ver3 != "") "-${ver3}"}"; binary_src = fetchurl { url = "mirror://sourceforge/simutrans/simutrans/${ver_dash}/simutrans-src-${ver_dash}.zip"; sha256 = "1f463r6kr5ig0zd3mncc74k93xbjywsq3d06j5r17831jyc9bzb9"; }; # As of 2021/07, many of these paksets have not been updated for years, so are on old versions. pakSpec = lib.mapAttrs (pakName: attrs: mkPak (attrs // {inherit pakName;})) { pak64 = { srcPath = "${ver_dash}/simupak64-${ver_dash}"; sha256 = "1k335kh8dhm1hdn5iwn3sdgnrlpk0rqxmmgqgqcwsi09cmw45m5c"; }; "pak64.japan" = { # No release for 121.0 yet! srcPath = "120-0/simupak64.japan-120-0-1"; sha256 = "14swy3h4ij74bgaw7scyvmivfb5fmp21nixmhlpk3mav3wr3167i"; }; pak128 = { srcPath = "pak128%20for%20ST%20120.4.1%20%282.8.1%2C%20priority%20signals%20%2B%20bugfix%29/pak128"; sha256 = "0z01y7r0rz7q79vr17bbnkgcbjjrimphy1dwb1pgbiv4klz7j5xw"; }; "pak128.britain" = { srcPath = "pak128.Britain%20for%20120-1/pak128.Britain.1.18-120-3"; sha256 = "1kyb0s54kysvdr0zdln9106yx75d71j4lbw3v87k3i440cj3r1d3"; }; "pak128.cs" = { # note: it needs pak128 to work url = "mirror://sourceforge/simutrans/Pak128.CS/pak128.cz_v.0.2.1.zip"; sha256 = "008d8x1s0vxsq78rkczlnf57pv1n5hi1v5nbd1l5w3yls7lk11sc"; }; "pak128.german" = { url = "mirror://sourceforge/simutrans/PAK128.german/" + "pak128.german_1.2_for_ST_121.0/PAK128.german_1.2_for_ST_121-0.zip"; sha256 = "1cv1rzl1a3i5dvk476zq094wawk9hhdh2f0y4xrdny5gn17mb2xi"; }; /* This release contains accented filenames that prevent unzipping. "pak192.comic" = { srcPath = "pak192comic%20for%20${ver2_dash}/pak192comic-0.4-${ver2_dash}up"; sha256 = throw ""; }; */ }; mkPak = { sha256, pakName, srcPath ? null , url ? "mirror://sourceforge/simutrans/${pakName}/${srcPath}.zip" }: stdenv.mkDerivation { name = "simutrans-${pakName}"; dontUnpack = true; preferLocalBuild = true; installPhase = let src = fetchurl { inherit url sha256; }; in '' mkdir -p "$out/share/simutrans/${pakName}" cd "$out/share/simutrans/${pakName}" "${unzip}/bin/unzip" "${src}" chmod -R +w . # some zipfiles need that set +o pipefail # no idea why it's needed toStrip=`find . -iname '*.pak' | head -n 1 | sed 's|\./\(.*\)/[^/]*$|\1|'` echo "Detected path '$toStrip' to strip" mv ./"$toStrip"/* . rm -f "$toStrip/.directory" #pak128.german had this rmdir -p "$toStrip" ''; }; /* The binaries need all data in one directory; the default is directory of the executable, and another option is the current directory :-/ */ withPaks = paks: buildEnv { inherit (binaries) name; paths = [binaries] ++ paks; postBuild = '' rm "$out/bin" && mkdir "$out/bin" cat > "$out/bin/simutrans" < config.default # Use ~/.simutrans instead of ~/simutrans substituteInPlace simsys.cc --replace '%s/simutrans' '%s/.simutrans' # use -O2 optimization (defaults are -O or -O3) sed -i -e '/CFLAGS += -O/d' Makefile export CFLAGS+=-O2 ''; enableParallelBuilding = true; installPhase = '' mkdir -p $out/share/ mv simutrans $out/share/ mkdir -p $out/bin/ mv build/default/sim $out/bin/simutrans ''; meta = with lib; { description = "Simulation game in which the player strives to run a successful transport system"; mainProgram = "simutrans"; longDescription = '' Simutrans is a cross-platform simulation game in which the player strives to run a successful transport system by transporting goods, passengers, and mail between places. Simutrans is an open source remake of Transport Tycoon. ''; homepage = "http://www.simutrans.com/"; license = with licenses; [ artistic1 gpl1Plus ]; maintainers = [ ]; platforms = with platforms; linux; # TODO: ++ darwin; }; }; in result