Author SHA1 Message Date
magges a840db9b41 release: target GE-Proton10-34 with latest DXVK
build-elsword-ge / build (push) Has been cancelled
2026-07-19 21:34:43 +02:00
magges 43099ccbd4 test: document latest DXVK release resolution 2026-07-19 21:21:51 +02:00
magges fc4f4db89b README.md aktualisiert
build-elsword-ge / build (push) Has been cancelled
2026-06-27 17:43:10 +02:00
magges 7f44ea0fae README.md aktualisiert
build-elsword-ge / build (push) Has been cancelled
2026-06-27 17:42:43 +02:00
6 changed files with 80 additions and 115 deletions
+13 -107
View File
@@ -2,14 +2,14 @@
This repository builds two custom Proton-GE 11 compatibility tools for Elsword on Linux/Steam:
- `Elsword-GE-11-1`
- `Elsword-GE-11-1+dxvk-git`
- `Elsword-GE-10-34`
- `Elsword-GE-10-34+dxvk-git`
It is designed for NixOS and for hosting on a private or public Gitea server with Gitea Actions.
## What this project does
- Builds a Proton-GE 11 / Wine 11 based compatibility tool for Elsword.
- Builds a Proton-GE 10-34 / Wine 10 based compatibility tool for Elsword.
- Uses Steam Linux Runtime 4 (`soldier`, appid `4183110`).
- Builds DXVK for both x86 and x64.
- Produces release archives that other users can install into Steam.
@@ -30,11 +30,11 @@ It is designed for NixOS and for hosting on a private or public Gitea server wit
## Variant difference
- `Elsword-GE-11-1`
- `Elsword-GE-10-34`
- Proton-GE 11 base
- DXVK stable/latest release tag
- DXVK newest stable release at build time
- `Elsword-GE-11-1+dxvk-git`
- `Elsword-GE-10-34+dxvk-git`
- Proton-GE 11 base
- DXVK from current upstream Git
@@ -127,9 +127,9 @@ nix develop -c ./scripts/create-release-archive.sh
After packaging, the main release files are:
```text
dist/Elsword-GE-11-1.tar.zst
dist/Elsword-GE-11-1+dxvk-git.tar.zst
dist/Elsword-GE-11-1-dxvk-git.tar.zst
dist/Elsword-GE-10-34.tar.zst
dist/Elsword-GE-10-34+dxvk-git.tar.zst
dist/Elsword-GE-10-34-dxvk-git.tar.zst
dist/SHA256SUMS.txt
dist/release-notes.md
```
@@ -137,13 +137,13 @@ dist/release-notes.md
If `+` causes issues in a filesystem or upload target, the safe alias is:
```text
Elsword-GE-11-1-dxvk-git.tar.zst
Elsword-GE-10-34-dxvk-git.tar.zst
```
The Steam compatibility tool name still remains exactly:
```text
Elsword-GE-11-1+dxvk-git
Elsword-GE-10-34+dxvk-git
```
## Install into Steam
@@ -151,8 +151,8 @@ Elsword-GE-11-1+dxvk-git
Install a built archive:
```bash
./scripts/install-to-steam.sh dist/Elsword-GE-11-1.tar.zst
./scripts/install-to-steam.sh dist/Elsword-GE-11-1+dxvk-git.tar.zst
./scripts/install-to-steam.sh dist/Elsword-GE-10-34.tar.zst
./scripts/install-to-steam.sh dist/Elsword-GE-10-34+dxvk-git.tar.zst
```
Generic installer for release archives, including Flatpak Steam users:
@@ -175,34 +175,6 @@ After install:
2. Open Elsword properties in Steam.
3. Select the matching compatibility tool.
## Recommended Elsword launch options
The documented profiles live in [profiles/elsword-launch-options.md](/home/magges/git/Elsword-GE/profiles/elsword-launch-options.md:1).
Safe / GameGuard test:
```bash
LD_PRELOAD="" PROTON_DISCORD_BRIDGE=0 PROTON_USE_OPTISCALER=0 PROTON_USE_D7VK=0 LOW_LATENCY_LAYER=0 MANGOHUD=0 ENABLE_VKBASALT=0 VK_INSTANCE_LAYERS="" DXVK_HUD=0 %command%
```
Performance / low-latency test:
```bash
LD_PRELOAD="" PROTON_DISCORD_BRIDGE=0 PROTON_USE_OPTISCALER=0 PROTON_USE_D7VK=0 LOW_LATENCY_LAYER=1 MANGOHUD=0 ENABLE_VKBASALT=0 VK_INSTANCE_LAYERS="" DXVK_STATE_CACHE=1 DXVK_LOG_LEVEL=none %command%
```
Operational advice:
- Disable Steam Overlay for Elsword if possible.
- Do not launch with `gamemoderun`.
- Keep MangoHud disabled.
- Keep vkBasalt disabled.
- Keep Discord Bridge disabled.
- Keep OptiScaler disabled.
- Keep D7VK disabled.
- Test `LOW_LATENCY_LAYER=1` separately.
- If GameGuard kicks the game, go back to the Safe profile first.
## Debugging
For Proton logs:
@@ -211,72 +183,6 @@ For Proton logs:
PROTON_LOG=1 %command%
```
## Gitea Actions behavior
Workflow file:
- [.gitea/workflows/build.yml](/home/magges/git/Elsword-GE/.gitea/workflows/build.yml:1)
Behavior:
- Push to `main`: builds both variants and stores build artifacts.
- Tag matching `v*`: builds both variants, packages them, generates checksums, and creates or updates a Gitea release with uploaded assets.
Expected secrets:
- `GITEA_TOKEN`
- `GITEA_SERVER_URL`
- `GITEA_REPOSITORY`
No tokens or passwords are stored in the repository.
## Manual fallback if release upload needs to be done by hand
If your Gitea release upload path differs or the API step needs adjustment for your instance, build locally or through Actions and upload these files manually in the release UI:
- `dist/Elsword-GE-11-1.tar.zst`
- `dist/Elsword-GE-11-1+dxvk-git.tar.zst`
- `dist/Elsword-GE-11-1-dxvk-git.tar.zst`
- `dist/SHA256SUMS.txt`
- `dist/*.sha256`
- `dist/release-notes.md`
## Push to Gitea
```bash
git init
git add .
git commit -m "Initial Elsword-GE build project"
git remote add origin ssh://git@DEIN-GITEA-SERVER/USER/elsword-ge.git
git push -u origin main
```
## Create a release by tag
```bash
git tag v11-1
git push origin v11-1
```
## Gitea attachment size note
Built Proton archives are usually much larger than 50 MB. Your Gitea instance may need larger release attachment limits.
Example configuration hint only; exact keys can vary by Gitea version:
```ini
[repository.upload]
FILE_MAX_SIZE = 2048
MAX_FILES = 20
[attachment]
MAX_SIZE = 2048
MAX_FILES = 20
[actions]
ENABLED = true
```
## Security and anti-cheat note
This project intentionally avoids:
+11
View File
@@ -7,9 +7,20 @@
let
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; };
mingwPthreadRoot = pkgs.runCommand "elsword-ge-mingw-pthread" { } ''
mkdir -p "$out/x32" "$out/x64"
ln -s ${pkgs.pkgsCross.mingw32.windows.mcfgthreads}/lib/libmcfgthread.a "$out/x32/libpthread.a"
ln -s ${pkgs.pkgsCross.mingw32.windows.mcfgthreads}/lib/libmcfgthread.a "$out/x32/libmcfgthread.a"
ln -s ${pkgs.pkgsCross.mingw32.windows.mcfgthreads}/bin/libmcfgthread-2.dll "$out/x32/libmcfgthread-2.dll"
ln -s ${pkgs.pkgsCross.mingwW64.windows.mcfgthreads}/lib/libmcfgthread.a "$out/x64/libpthread.a"
ln -s ${pkgs.pkgsCross.mingwW64.windows.mcfgthreads}/lib/libmcfgthread.a "$out/x64/libmcfgthread.a"
ln -s ${pkgs.pkgsCross.mingwW64.windows.mcfgthreads}/bin/libmcfgthread-2.dll "$out/x64/libmcfgthread-2.dll"
'';
in
{
devShells.${system}.default = pkgs.mkShell {
MINGW_PTHREAD_ROOT = mingwPthreadRoot;
packages = with pkgs; [
bash
binutils
+16 -5
View File
@@ -10,11 +10,11 @@ DXVK_CACHE_DIR="${DXVK_CACHE_DIR:-$CACHE_DIR/dxvk}"
METADATA_DIR="${METADATA_DIR:-$DIST_DIR/metadata}"
STEAM_COMPAT_DIR_DEFAULT="${STEAM_COMPAT_DIR_DEFAULT:-$HOME/.local/share/Steam/compatibilitytools.d}"
UPSTREAM_REPO="${UPSTREAM_REPO:-GloriousEggroll/proton-ge-custom}"
ELSWORD_GE_VERSION="${ELSWORD_GE_VERSION:-11-1}"
ELSWORD_GE_VERSION="${ELSWORD_GE_VERSION:-10-34}"
PROTON_TAG="${PROTON_TAG:-GE-Proton${ELSWORD_GE_VERSION}}"
PROTON_ASSET="${PROTON_ASSET:-x86_64}"
RUNTIME_APPID="${RUNTIME_APPID:-4183110}"
WINE_SERIES="${WINE_SERIES:-Wine 11}"
WINE_SERIES="${WINE_SERIES:-Wine 10}"
DXVK_STABLE_TAG_DEFAULT="${DXVK_STABLE_TAG_DEFAULT:-latest}"
DXVK_GIT_REF="${DXVK_GIT_REF:-origin/master}"
MINGW_PTHREAD_ROOT="${MINGW_PTHREAD_ROOT:-}"
@@ -259,7 +259,7 @@ PY
resolve_runtime_dll_path() {
local arch="$1"
local dll="$2"
local compiler result nix_attr store_path
local compiler result nix_attr store_path arch_dir
case "$arch" in
x86_64) compiler="x86_64-w64-mingw32-g++" ;;
@@ -275,9 +275,20 @@ resolve_runtime_dll_path() {
if [[ "$dll" == "libmcfgthread-2.dll" ]]; then
case "$arch" in
x86_64) nix_attr="pkgsCross.mingwW64.windows.mcfgthreads" ;;
x86) nix_attr="pkgsCross.mingw32.windows.mcfgthreads" ;;
x86_64)
nix_attr="pkgsCross.mingwW64.windows.mcfgthreads"
arch_dir="x64"
;;
x86)
nix_attr="pkgsCross.mingw32.windows.mcfgthreads"
arch_dir="x32"
;;
esac
result="${MINGW_PTHREAD_ROOT:-}/$arch_dir/$dll"
if [[ -f "$result" ]]; then
printf "%s\n" "$result"
return 0
fi
store_path="$(NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1 nix path-info --impure "nixpkgs#${nix_attr}")"
result="$(find "$store_path" -name "$dll" -type f | head -n1 || true)"
if [[ -n "$result" && -f "$result" ]]; then
+2 -2
View File
@@ -7,8 +7,8 @@ STEAM_COMPAT_DIR="${STEAM_COMPAT_DIR:-$HOME/.local/share/Steam/compatibilitytool
usage() {
cat <<'EOF'
Usage:
./scripts/install-to-steam.sh dist/Elsword-GE-11-1.tar.zst
./scripts/install-to-steam.sh dist/Elsword-GE-11-1+dxvk-git.tar.zst
./scripts/install-to-steam.sh dist/Elsword-GE-10-34.tar.zst
./scripts/install-to-steam.sh dist/Elsword-GE-10-34+dxvk-git.tar.zst
EOF
}
+1 -1
View File
@@ -8,7 +8,7 @@ source "$SCRIPT_DIR/common.sh"
usage() {
cat <<'EOF'
Usage:
./scripts/validate-build.sh dist/Elsword-GE-11-1 Elsword-GE-11-1
./scripts/validate-build.sh dist/Elsword-GE-10-34 Elsword-GE-10-34
EOF
}
+37
View File
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
source "$REPO_ROOT/scripts/common.sh"
if [[ "$ELSWORD_GE_VERSION" != "10-34" || "$PROTON_TAG" != "GE-Proton10-34" ]]; then
printf 'expected GE-Proton10-34 default, got version=%s tag=%s\n' "$ELSWORD_GE_VERSION" "$PROTON_TAG" >&2
exit 1
fi
printf 'Proton base is pinned to %s\n' "$PROTON_TAG"
expected_tag="latest"
actual_tag="$(dxvk_tag_for_variant stable)"
if [[ "$actual_tag" != "$expected_tag" ]]; then
printf 'expected stable DXVK tag %s, got %s\n' "$expected_tag" "$actual_tag" >&2
exit 1
fi
printf 'stable DXVK tag resolves dynamically as %s\n' "$actual_tag"
flake_file="$REPO_ROOT/flake.nix"
if ! rg -Fq 'MINGW_PTHREAD_ROOT = mingwPthreadRoot;' "$flake_file"; then
printf 'Nix shell must provide the MinGW pthread compatibility directory\n' >&2
exit 1
fi
if ! rg -Fq '${MINGW_PTHREAD_ROOT:-}/$arch_dir/$dll' "$REPO_ROOT/scripts/common.sh"; then
printf 'runtime dependency lookup must use the Nix shell MinGW directory\n' >&2
exit 1
fi
printf 'Nix shell provides the MinGW pthread compatibility directory\n'