diff --git a/pkgs/games/forge-mtg/default.nix b/pkgs/games/forge-mtg/default.nix
new file mode 100644
index 000000000000..5d88e8777e63
--- /dev/null
+++ b/pkgs/games/forge-mtg/default.nix
@@ -0,0 +1,95 @@
+{ coreutils
+, fetchFromGitHub
+, gnused
+, lib
+, maven
+, makeWrapper
+, openjdk
+, stdenv
+}:
+
+let
+ version = "1.6.53";
+
+ src = fetchFromGitHub {
+ owner = "Card-Forge";
+ repo = "forge";
+ rev = "forge-${version}";
+ sha256 = "sha256-tNPG90mw8HZjp37YJ9JQlOBiVNPRo6xuNur651Adva8=";
+ };
+
+ # launch4j downloads and runs a native binary during the package phase.
+ patches = [ ./no-launch4j.patch ];
+
+ mavenRepository = stdenv.mkDerivation {
+ pname = "forge-mtg-maven-repository";
+ inherit version src patches;
+
+ nativeBuildInputs = [ maven ];
+
+ buildPhase = ''
+ runHook preBuild
+ # Tests need a running Xorg.
+ mvn package -Dmaven.repo.local=$out -DskipTests
+ runHook postBuild
+ '';
+
+ installPhase = ''
+ runHook preInstall
+ find $out -type f \( \
+ -name \*.lastUpdated \
+ -o -name resolver-status.properties \
+ -o -name _remote.repositories \) \
+ -delete
+ runHook postInstall
+ '';
+
+ outputHashAlgo = "sha256";
+ outputHashMode = "recursive";
+ outputHash = "sha256-6FTbYXaF3rBIZov2WJxjG/ovmvimjXFPaFchAduVzI8=";
+ };
+
+in stdenv.mkDerivation {
+ pname = "forge-mtg";
+ inherit version src patches;
+
+ nativeBuildInputs = [ maven makeWrapper ];
+
+ buildPhase = ''
+ runHook preBuild
+ # Tests need a running Xorg.
+ mvn --offline -Dmaven.repo.local=${mavenRepository} -DskipTests package;
+ runHook postBuild
+ '';
+
+ installPhase = ''
+ runHook preInstall
+ mkdir -pv $out/{bin,share/forge}
+ cp -av \
+ forge-gui-desktop/target/forge.sh \
+ forge-gui-desktop/target/forge-gui-desktop-${version}-jar-with-dependencies.jar \
+ forge-adventure/target/forge-adventure.sh \
+ forge-adventure/target/forge-adventure-${version}-jar-with-dependencies.jar \
+ forge-gui/res \
+ $out/share/forge
+ runHook postInstall
+ '';
+
+ preFixup = ''
+ for commandToInstall in forge forge-adventure; do
+ chmod 555 $out/share/forge/$commandToInstall.sh
+ makeWrapper $out/share/forge/$commandToInstall.sh $out/bin/$commandToInstall \
+ --prefix PATH : ${lib.makeBinPath [ coreutils openjdk gnused ]} \
+ --set JAVA_HOME ${openjdk}/lib/openjdk \
+ --set SENTRY_DSN ""
+ done
+ '';
+
+ meta = with lib; {
+ description = "Magic: the Gathering card game with rules enforcement";
+ homepage = "https://www.slightlymagic.net/forum/viewforum.php?f=26";
+ platforms = openjdk.meta.platforms;
+ license = licenses.gpl3Plus;
+ maintainers = with maintainers; [ eigengrau ];
+ };
+}
diff --git a/pkgs/games/forge-mtg/no-launch4j.patch b/pkgs/games/forge-mtg/no-launch4j.patch
new file mode 100644
index 000000000000..ea4d674be170
--- /dev/null
+++ b/pkgs/games/forge-mtg/no-launch4j.patch
@@ -0,0 +1,333 @@
+diff --git a/forge-adventure/pom.xml b/forge-adventure/pom.xml
+index 4d81b150e0..80dd1e04cb 100644
+--- a/forge-adventure/pom.xml
++++ b/forge-adventure/pom.xml
+@@ -41,131 +41,6 @@
+
+
+
+-
+- com.akathist.maven.plugins.launch4j
+- launch4j-maven-plugin
+- 1.7.25
+-
+-
+- l4j-adv
+- package
+-
+- launch4j
+-
+-
+- gui
+- ${project.build.directory}/forge-adventure-java8.exe
+- ${project.build.finalName}-jar-with-dependencies.jar
+- true
+- forge
+- src/main/config/forge-adventure.ico
+-
+- forge.adventure.Main
+- false
+- anything
+-
+-
+- 1.8.0
+- 4096
+-
+- -Dfile.encoding=UTF-8
+-
+-
+-
+-
+- 1.0.0.0
+-
+-
+- 1.0.0.0
+-
+- Forge
+- Forge
+-
+- 1.0.0.0
+-
+-
+- 1.0.0.0
+-
+- forge-adventure
+- forge-adventure
+- forge-adventure-java8.exe
+-
+-
+-
+-
+-
+- l4j-adv2
+- package
+-
+- launch4j
+-
+-
+- gui
+- ${project.build.directory}/forge-adventure.exe
+- ${project.build.finalName}-jar-with-dependencies.jar
+- true
+- forge
+- https://www.oracle.com/java/technologies/downloads/
+- src/main/config/forge-adventure.ico
+-
+- forge.adventure.Main
+- false
+- anything
+-
+-
+- 11.0.1
+- jdkOnly
+- 4096
+-
+- -Dfile.encoding=UTF-8
+- --add-opens java.base/java.lang=ALL-UNNAMED
+- --add-opens java.base/java.math=ALL-UNNAMED
+- --add-opens java.base/jdk.internal.misc=ALL-UNNAMED
+- --add-opens java.base/java.nio=ALL-UNNAMED
+- --add-opens=java.base/sun.nio.ch=ALL-UNNAMED
+- --add-opens java.base/java.util=ALL-UNNAMED
+- --add-opens java.base/java.lang.reflect=ALL-UNNAMED
+- --add-opens java.base/java.text=ALL-UNNAMED
+- --add-opens java.desktop/java.awt=ALL-UNNAMED
+- --add-opens java.desktop/java.awt.font=ALL-UNNAMED
+- --add-opens java.desktop/java.awt.image=ALL-UNNAMED
+- --add-opens java.desktop/java.awt.color=ALL-UNNAMED
+- --add-opens java.desktop/sun.awt.image=ALL-UNNAMED
+- --add-opens java.desktop/javax.swing=ALL-UNNAMED
+- --add-opens java.desktop/javax.swing.border=ALL-UNNAMED
+- --add-opens java.desktop/javax.swing.event=ALL-UNNAMED
+- --add-opens java.desktop/sun.swing=ALL-UNNAMED
+- --add-opens java.desktop/java.beans=ALL-UNNAMED
+- --add-opens java.base/java.util.concurrent=ALL-UNNAMED
+- --add-opens java.base/java.net=ALL-UNNAMED
+- -Dio.netty.tryReflectionSetAccessible=true
+-
+-
+-
+-
+- 1.0.0.0
+-
+-
+- 1.0.0.0
+-
+- Forge
+- Forge
+-
+- 1.0.0.0
+-
+-
+- 1.0.0.0
+-
+- forge-adventure
+- forge-adventure
+- forge-adventure.exe
+-
+-
+-
+-
+-
+-
+-
+
+ com.google.code.maven-replacer-plugin
+ replacer
+diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml
+index 218e641096..e8d0905a3d 100644
+--- a/forge-gui-desktop/pom.xml
++++ b/forge-gui-desktop/pom.xml
+@@ -231,60 +231,6 @@
+ windows-linux-release
+
+
+-
+- com.akathist.maven.plugins.launch4j
+- launch4j-maven-plugin
+- 2.1.2
+-
+-
+- l4j-gui
+- package
+-
+- launch4j
+-
+-
+- gui
+- ${project.build.directory}/forge-java8.exe
+- ${project.build.finalName}-jar-with-dependencies.jar
+- true
+- forge
+- src/main/config/forge.ico
+-
+- forge.view.Main
+- false
+- anything
+-
+-
+- 1.8.0
+- 4096
+-
+- -Dfile.encoding=UTF-8
+-
+-
+-
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+- Forge
+- Forge
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+- Forge
+- forge
+- forge-java8.exe
+-
+-
+-
+-
+-
+-
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+@@ -396,131 +342,6 @@
+ windows-linux
+
+
+-
+- com.akathist.maven.plugins.launch4j
+- launch4j-maven-plugin
+- 2.1.2
+-
+-
+- l4j-gui
+- package
+-
+- launch4j
+-
+-
+- gui
+- ${project.build.directory}/forge-java8.exe
+- ${project.build.finalName}-jar-with-dependencies.jar
+- true
+- forge
+- src/main/config/forge.ico
+-
+- forge.view.Main
+- false
+- anything
+-
+-
+- 1.8.0
+- 4096
+-
+- -Dfile.encoding=UTF-8
+-
+-
+-
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+- Forge
+- Forge
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+- Forge
+- forge
+- forge-java8.exe
+-
+-
+-
+-
+-
+- l4j-gui2
+- package
+-
+- launch4j
+-
+-
+- gui
+- ${project.build.directory}/forge.exe
+- ${project.build.finalName}-jar-with-dependencies.jar
+- true
+- forge
+- https://www.oracle.com/java/technologies/downloads/
+- src/main/config/forge.ico
+-
+- forge.view.Main
+- false
+- anything
+-
+-
+- 11.0.1
+- jdkOnly
+- 4096
+-
+- -Dfile.encoding=UTF-8
+- --add-opens java.base/java.lang=ALL-UNNAMED
+- --add-opens java.base/java.math=ALL-UNNAMED
+- --add-opens java.base/jdk.internal.misc=ALL-UNNAMED
+- --add-opens java.base/java.nio=ALL-UNNAMED
+- --add-opens=java.base/sun.nio.ch=ALL-UNNAMED
+- --add-opens java.base/java.util=ALL-UNNAMED
+- --add-opens java.base/java.lang.reflect=ALL-UNNAMED
+- --add-opens java.base/java.text=ALL-UNNAMED
+- --add-opens java.desktop/java.awt=ALL-UNNAMED
+- --add-opens java.desktop/java.awt.font=ALL-UNNAMED
+- --add-opens java.desktop/java.awt.image=ALL-UNNAMED
+- --add-opens java.desktop/java.awt.color=ALL-UNNAMED
+- --add-opens java.desktop/sun.awt.image=ALL-UNNAMED
+- --add-opens java.desktop/javax.swing=ALL-UNNAMED
+- --add-opens java.desktop/javax.swing.border=ALL-UNNAMED
+- --add-opens java.desktop/javax.swing.event=ALL-UNNAMED
+- --add-opens java.desktop/sun.swing=ALL-UNNAMED
+- --add-opens java.desktop/java.beans=ALL-UNNAMED
+- --add-opens java.base/java.util.concurrent=ALL-UNNAMED
+- --add-opens java.base/java.net=ALL-UNNAMED
+- -Dio.netty.tryReflectionSetAccessible=true
+-
+-
+-
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+- Forge
+- Forge
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+-
+- ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-
+- Forge
+- forge
+- forge.exe
+-
+-
+-
+-
+-
+-
+-
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index b6c66d3d7b1e..7cbf3ace0d0d 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -32890,6 +32890,8 @@ with pkgs;
flock = callPackage ../development/tools/flock { };
+ forge-mtg = callPackage ../games/forge-mtg { };
+
freecell-solver = callPackage ../games/freecell-solver { };
freeciv = callPackage ../games/freeciv {