1{
2 lib,
3 copyDesktopItems,
4 fetchurl,
5 ffmpeg,
6 gitUpdater,
7 jre,
8 libarchive,
9 makeDesktopItem,
10 openjfx,
11 stdenvNoCC,
12 wrapGAppsHook3,
13}:
14let
15 pname = "maptool";
16 version = "1.17.1";
17 repoBase = "https://github.com/RPTools/maptool";
18 src = fetchurl {
19 url = "${repoBase}/releases/download/${version}/maptool-${version}-x86_64.pkg.tar.zst";
20 hash = "sha256-yPuZUPRP0O+5Grj53xteZovowuFxOo4q6qL3mnjgIu0=";
21 };
22
23 meta = with lib; {
24 description = "Virtual Tabletop for playing roleplaying games with remote players or face to face";
25 mainProgram = "maptool";
26 homepage = "https://www.rptools.net/toolbox/maptool/";
27 sourceProvenance = with sourceTypes; [
28 binaryBytecode
29 binaryNativeCode
30 ];
31 license = licenses.agpl3Plus;
32 maintainers = with maintainers; [ rhendric ];
33 platforms = [ "x86_64-linux" ];
34 };
35
36 javafxModules = [
37 "base"
38 "controls"
39 "media"
40 "swing"
41 "web"
42 "fxml"
43 "graphics"
44 ];
45
46 appClasspath = "share/${pname}";
47
48 classpath =
49 lib.concatMap (mod: [
50 "${openjfx}/modules_src/javafx.${mod}/module-info.java"
51 "${openjfx}/modules/javafx.${mod}"
52 "${openjfx}/modules_libs/javafx.${mod}"
53 ]) javafxModules
54 ++ [ "$out/${appClasspath}/*" ];
55
56 jvmArgs = [
57 "-cp"
58 (lib.concatStringsSep ":" classpath)
59 "-Xss8M"
60 "-Dsun.java2d.d3d=false"
61 "-Dfile.encoding=UTF-8"
62 "-Dpolyglot.engine.WarnInterpreterOnly=false"
63 "-XX:+ShowCodeDetailsInExceptionMessages"
64 "--add-opens=java.desktop/java.awt=ALL-UNNAMED"
65 "--add-opens=java.desktop/java.awt.geom=ALL-UNNAMED"
66 "--add-opens=java.desktop/sun.awt.geom=ALL-UNNAMED"
67 "--add-opens=java.base/java.util=ALL-UNNAMED"
68 "--add-opens=javafx.web/javafx.scene.web=ALL-UNNAMED"
69 "--add-opens=javafx.web/com.sun.webkit=ALL-UNNAMED"
70 "--add-opens=javafx.web/com.sun.webkit.dom=ALL-UNNAMED"
71 "--add-opens=java.desktop/javax.swing=ALL-UNNAMED"
72 "--add-opens=java.desktop/sun.awt.shell=ALL-UNNAMED"
73 "--add-opens=java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED"
74
75 # disable telemetry (the empty DSN disables the Sentry library, setting the
76 # environment to Development disables some logic inside MapTool)
77 "-Dsentry.dsn"
78 "-Dsentry.environment=Development"
79 ];
80
81 binName = pname;
82 rdnsName = "net.rptools.maptool";
83in
84stdenvNoCC.mkDerivation {
85 inherit
86 pname
87 version
88 src
89 meta
90 ;
91
92 dontUnpack = true;
93 dontConfigure = true;
94 dontBuild = true;
95 dontWrapGApps = true;
96
97 nativeBuildInputs = [
98 copyDesktopItems
99 libarchive
100 wrapGAppsHook3
101 ];
102
103 desktopItems = [
104 (makeDesktopItem {
105 name = rdnsName;
106 desktopName = "MapTool";
107 icon = rdnsName;
108 exec = binName;
109 comment = meta.description;
110 categories = [ "Game" ];
111 })
112 ];
113
114 installPhase = ''
115 runHook preInstall
116
117 dest=$out/${appClasspath}
118 install -dm755 "$dest"
119 bsdtar -xf "$src" -C "$dest" --strip-components 4 opt/maptool/lib/app/{'*.jar',readme}
120
121 dest=$out/share/icons/hicolor/256x256/apps
122 install -dm755 "$dest"
123 bsdtar -xOf "$src" opt/maptool/lib/MapTool.png > "$dest"/${rdnsName}.png
124
125 dest=$out/bin
126 install -dm755 "$dest"
127 makeWrapper ${jre}/bin/java "$dest"/${binName} \
128 "''${gappsWrapperArgs[@]}" \
129 --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ ffmpeg ]} \
130 --add-flags "${lib.concatStringsSep " " jvmArgs} net.rptools.maptool.client.LaunchInstructions"
131
132 runHook postInstall
133 '';
134
135 passthru.updateScript = gitUpdater {
136 url = "${repoBase}.git";
137 ignoredVersions = "-";
138 };
139}