about summary refs log tree commit diff
path: root/pkgs/games/maptool/default.nix
blob: eed8bac656be00fcb4af828a3cf13f459eafc969 (plain) (blame)
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
{ lib
, copyDesktopItems
, fetchurl
, ffmpeg
, gitUpdater
, jre
, libarchive
, makeDesktopItem
, openjfx
, stdenvNoCC
, wrapGAppsHook
}:
let
  pname = "maptool";
  version = "1.13.2";
  repoBase = "https://github.com/RPTools/${pname}";
  src = fetchurl {
    url = "${repoBase}/releases/download/${version}/MapTool-${version}.jar";
    hash = "sha256-14ULI1OAk0V4DqiL5IF7DK6pw0NRfmU+omrFP72PblA=";
  };

  icon = fetchurl {
    url = "https://raw.githubusercontent.com/RPTools/${pname}/${version}/package/linux/MapTool.png";
    hash = "sha256-xkVYjMprTanHu8r4b9PHORI8E1aJp+9KDSP5mqCE8ew=";
  };

  meta = with lib; {
    description = "Virtual Tabletop for playing roleplaying games with remote players or face to face";
    homepage = "https://www.rptools.net/toolbox/maptool/";
    sourceProvenance = with sourceTypes; [
      binaryBytecode
      binaryNativeCode
    ];
    license = licenses.agpl3;
    maintainers = with maintainers; [ rhendric ];
  };

  javafxModules = [ "base" "controls" "media" "swing" "web" "fxml" "graphics" ];

  classpath =
    lib.concatMap (mod: [
      "${openjfx}/modules_src/javafx.${mod}/module-info.java"
      "${openjfx}/modules/javafx.${mod}"
      "${openjfx}/modules_libs/javafx.${mod}"
    ]) javafxModules ++
    [ src ];

  jvmArgs = [
    "-cp" (lib.concatStringsSep ":" classpath)
    "-Xss8M"
    "-Dsun.java2d.d3d=false"
    "-Dfile.encoding=UTF-8"
    "-Dpolyglot.engine.WarnInterpreterOnly=false"
    "-XX:+ShowCodeDetailsInExceptionMessages"
    "--add-opens=java.desktop/java.awt=ALL-UNNAMED"
    "--add-opens=java.desktop/java.awt.geom=ALL-UNNAMED"
    "--add-opens=java.desktop/sun.awt.geom=ALL-UNNAMED"
    "--add-opens=java.base/java.util=ALL-UNNAMED"
    "--add-opens=javafx.web/javafx.scene.web=ALL-UNNAMED"
    "--add-opens=javafx.web/com.sun.webkit=ALL-UNNAMED"
    "--add-opens=javafx.web/com.sun.webkit.dom=ALL-UNNAMED"
    "--add-opens=java.desktop/javax.swing=ALL-UNNAMED"
    "--add-opens=java.desktop/sun.awt.shell=ALL-UNNAMED"
    "--add-opens=java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED"

    # disable telemetry (the empty DSN disables the Sentry library, setting the
    # environment to Development disables some logic inside MapTool)
    "-Dsentry.dsn"
    "-Dsentry.environment=Development"
  ];

  binName = pname;
  rdnsName = "net.rptools.maptool";
in
stdenvNoCC.mkDerivation {
  inherit pname version src meta;

  dontUnpack = true;
  dontBuild = true;
  dontWrapGApps = true;

  nativeBuildInputs = [
    copyDesktopItems
    libarchive
    wrapGAppsHook
  ];

  desktopItems = [
    (makeDesktopItem {
      name = rdnsName;
      desktopName = "MapTool";
      icon = rdnsName;
      exec = binName;
      comment = meta.description;
      categories = [ "Game" ];
    })
  ];

  installPhase = ''
    runHook preInstall

    mkdir -p $out/bin
    makeWrapper ${jre}/bin/java $out/bin/${binName} \
      "''${gappsWrapperArgs[@]}" \
      --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ ffmpeg ]} \
      --add-flags '${lib.concatStringsSep " " jvmArgs} net.rptools.maptool.client.LaunchInstructions'

    dest=$out/share/icons/hicolor/256x256/apps
    mkdir -p "$dest"
    ln -s ${icon} "$dest/${rdnsName}.png"

    runHook postInstall
  '';

  passthru.updateScript = gitUpdater {
    url = "${repoBase}.git";
    ignoredVersions = "-";
  };
}