1{ stdenv, fetchurl, pkgconfig, unzip, zlib, libpng, bzip2, SDL, SDL_mixer
2, buildEnv, config
3}:
4
5let
6 # Choose your "paksets" of objects, images, text, music, etc.
7 paksets = config.simutrans.paksets or "pak64 pak64.japan pak128 pak128.britain pak128.german";
8
9 result = with stdenv.lib; withPaks (
10 if paksets == "*" then attrValues pakSpec # taking all
11 else map (name: pakSpec.${name}) (splitString " " paksets)
12 );
13
14 ver1 = "120";
15 ver2 = "2";
16 ver3 = "2";
17 version = "${ver1}.${ver2}.${ver3}";
18 ver_dash = "${ver1}-${ver2}-${ver3}";
19
20 binary_src = fetchurl {
21 url = "mirror://sourceforge/simutrans/simutrans/${ver_dash}/simutrans-src-${ver_dash}.zip";
22 sha256 = "1yi6rwbrnfd65qfz63cncw2n56pbypvg6cllwh71mgvs6x2c28kz";
23 };
24
25
26 # As of 2015/03, many packsets still didn't have a release for version 120.
27 pakSpec = stdenv.lib.mapAttrs
28 (pakName: attrs: mkPak (attrs // {inherit pakName;}))
29 {
30 pak64 = {
31 srcPath = "120-2/simupak64-120-2";
32 sha256 = "1s310pssar4s1nf6gi9cizbx4m75avqm2qk039ha5rk8jk4lzkmk";
33 };
34 "pak64.japan" = {
35 # No release for 120.2 yet!
36 srcPath = "120-0/simupak64.japan-120-0-1";
37 sha256 = "14swy3h4ij74bgaw7scyvmivfb5fmp21nixmhlpk3mav3wr3167i";
38 };
39
40 pak128 = {
41 srcPath = "pak128%20for%20ST%20120.2.2%20%282.7%2C%20minor%20changes%29/pak128";
42 sha256 = "1x6g6yfv1hvjyh3ciccly1i2k2n2b63dw694gdg4j90a543rmclg";
43 };
44 "pak128.britain" = {
45 srcPath = "pak128.Britain%20for%20120-1/pak128.Britain.1.17-120-1";
46 sha256 = "1nviwqizvch9n3n826nmmi7c707dxv0727m7lhc1n2zsrrxcxlr5";
47 };
48 "pak128.cs" = { # note: it needs pak128 to work
49 url = "mirror://sourceforge/simutrans/Pak128.CS/pak128.cz_v.0.2.1.zip";
50 sha256 = "008d8x1s0vxsq78rkczlnf57pv1n5hi1v5nbd1l5w3yls7lk11sc";
51 };
52 "pak128.german" = {
53 url = "mirror://sourceforge/simutrans/PAK128.german/"
54 + "PAK128.german_0.10.x_for_ST_120.x/PAK128.german_0.10.3_for_ST_120.x.zip";
55 sha256 = "1379zcviyf3v0wsli33sqa509k6zlw6fkk57vahc44mrnhka5fpb";
56 };
57
58 /* This release contains accented filenames that prevent unzipping.
59 "pak192.comic" = {
60 srcPath = "pak192comic%20for%20${ver2_dash}/pak192comic-0.4-${ver2_dash}up";
61 sha256 = throw "";
62 };
63 */
64 };
65
66
67 mkPak = {
68 sha256, pakName, srcPath ? null
69 , url ? "mirror://sourceforge/simutrans/${pakName}/${srcPath}.zip"
70 }:
71 stdenv.mkDerivation {
72 name = "simutrans-${pakName}";
73 unpackPhase = "true";
74 preferLocalBuild = true;
75 installPhase = let src = fetchurl { inherit url sha256; };
76 in ''
77 mkdir -p "$out/share/simutrans/${pakName}"
78 cd "$out/share/simutrans/${pakName}"
79 "${unzip}/bin/unzip" "${src}"
80 chmod -R +w . # some zipfiles need that
81
82 set +o pipefail # no idea why it's needed
83 toStrip=`find . -iname '*.pak' | head -n 1 | sed 's|\./\(.*\)/[^/]*$|\1|'`
84 echo "Detected path '$toStrip' to strip"
85 mv ./"$toStrip"/* .
86 rmdir -p "$toStrip"
87 '';
88 };
89
90 /* The binaries need all data in one directory; the default is directory
91 of the executable, and another option is the current directory :-/ */
92 withPaks = paks: buildEnv {
93 inherit (binaries) name;
94 paths = [binaries] ++ paks;
95 postBuild = ''
96 rm "$out/bin" && mkdir "$out/bin"
97 cat > "$out/bin/simutrans" <<EOF
98 #!${stdenv.shell}
99 cd "$out"/share/simutrans
100 exec "${binaries}/bin/simutrans" -use_workdir "\''${extraFlagsArray[@]}" "\$@"
101 EOF
102 chmod +x "$out/bin/simutrans"
103 '';
104
105 passthru.meta = binaries.meta // { hydraPlatforms = []; };
106 passthru.binaries = binaries;
107 };
108
109 binaries = stdenv.mkDerivation rec {
110 name = "simutrans-${version}";
111
112 src = binary_src;
113
114 sourceRoot = ".";
115
116 nativeBuildInputs = [ pkgconfig ];
117 buildInputs = [ zlib libpng bzip2 SDL SDL_mixer unzip ];
118
119 configurePhase = let
120 # Configuration as per the readme.txt and config.template
121 platform =
122 if stdenv.isLinux then "linux" else
123 if stdenv.isDarwin then "mac" else throw "add your platform";
124 config = ''
125 BACKEND = mixer_sdl
126 COLOUR_DEPTH = 16
127 OSTYPE = ${platform}
128 VERBOSE = 1
129 '';
130 #TODO: MULTI_THREAD = 1 is "highly recommended",
131 # but it's roughly doubling CPU usage for me
132 in ''
133 echo "${config}" > config.default
134
135 # Use ~/.simutrans instead of ~/simutrans
136 substituteInPlace simsys.cc --replace '%s/simutrans' '%s/.simutrans'
137
138 # use -O2 optimization (defaults are -O or -O3)
139 sed -i -e '/CFLAGS += -O/d' Makefile
140 export CFLAGS+=-O2
141 '';
142
143 enableParallelBuilding = true;
144
145 installPhase = ''
146 mkdir -p $out/share/
147 mv simutrans $out/share/
148
149 mkdir -p $out/bin/
150 mv build/default/sim $out/bin/simutrans
151 '';
152
153 meta = with stdenv.lib; {
154 description = "A simulation game in which the player strives to run a successful transport system";
155 longDescription = ''
156 Simutrans is a cross-platform simulation game in which the
157 player strives to run a successful transport system by
158 transporting goods, passengers, and mail between
159 places. Simutrans is an open source remake of Transport Tycoon.
160 '';
161
162 homepage = http://www.simutrans.com/;
163 license = with licenses; [ artistic1 gpl1Plus ];
164 maintainers = with maintainers; [ kkallio vcunat phile314 ];
165 platforms = with platforms; linux; # TODO: ++ darwin;
166 };
167 };
168
169in result
170