1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
{ 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 = withPaks (
if paksets == "*" then lib.attrValues pakSpec # taking all
else map (name: pakSpec.${name}) (lib.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" <<EOF
#!${runtimeShell}
cd "$out"/share/simutrans
exec "${binaries}/bin/simutrans" -use_workdir "\$@"
EOF
chmod +x "$out/bin/simutrans"
'';
passthru.meta = binaries.meta // { hydraPlatforms = []; };
passthru.binaries = binaries;
};
binaries = stdenv.mkDerivation {
pname = "simutrans";
inherit version;
src = binary_src;
sourceRoot = ".";
nativeBuildInputs = [ pkg-config unzip ];
buildInputs = [ zlib libpng bzip2 SDL SDL_mixer ];
configurePhase = let
# Configuration as per the readme.txt and config.template
platform =
if stdenv.isLinux then "linux" else
if stdenv.isDarwin then "mac" else throw "add your platform";
config = ''
BACKEND = mixer_sdl
COLOUR_DEPTH = 16
OSTYPE = ${platform}
VERBOSE = 1
'';
#TODO: MULTI_THREAD = 1 is "highly recommended",
# but it's roughly doubling CPU usage for me
in ''
echo "${config}" > 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 = {
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 lib.licenses; [ artistic1 gpl1Plus ];
maintainers = [ ];
platforms = lib.platforms.linux; # TODO: ++ darwin;
};
};
in result
|