Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a840db9b41 | ||
|
|
43099ccbd4 | ||
|
|
fc4f4db89b | ||
|
|
7f44ea0fae |
@@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
This repository builds two custom Proton-GE 11 compatibility tools for Elsword on Linux/Steam:
|
This repository builds two custom Proton-GE 11 compatibility tools for Elsword on Linux/Steam:
|
||||||
|
|
||||||
- `Elsword-GE-11-1`
|
- `Elsword-GE-10-34`
|
||||||
- `Elsword-GE-11-1+dxvk-git`
|
- `Elsword-GE-10-34+dxvk-git`
|
||||||
|
|
||||||
It is designed for NixOS and for hosting on a private or public Gitea server with Gitea Actions.
|
It is designed for NixOS and for hosting on a private or public Gitea server with Gitea Actions.
|
||||||
|
|
||||||
## What this project does
|
## 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`).
|
- Uses Steam Linux Runtime 4 (`soldier`, appid `4183110`).
|
||||||
- Builds DXVK for both x86 and x64.
|
- Builds DXVK for both x86 and x64.
|
||||||
- Produces release archives that other users can install into Steam.
|
- 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
|
## Variant difference
|
||||||
|
|
||||||
- `Elsword-GE-11-1`
|
- `Elsword-GE-10-34`
|
||||||
- Proton-GE 11 base
|
- 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
|
- Proton-GE 11 base
|
||||||
- DXVK from current upstream Git
|
- DXVK from current upstream Git
|
||||||
|
|
||||||
@@ -127,9 +127,9 @@ nix develop -c ./scripts/create-release-archive.sh
|
|||||||
After packaging, the main release files are:
|
After packaging, the main release files are:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
dist/Elsword-GE-11-1.tar.zst
|
dist/Elsword-GE-10-34.tar.zst
|
||||||
dist/Elsword-GE-11-1+dxvk-git.tar.zst
|
dist/Elsword-GE-10-34+dxvk-git.tar.zst
|
||||||
dist/Elsword-GE-11-1-dxvk-git.tar.zst
|
dist/Elsword-GE-10-34-dxvk-git.tar.zst
|
||||||
dist/SHA256SUMS.txt
|
dist/SHA256SUMS.txt
|
||||||
dist/release-notes.md
|
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:
|
If `+` causes issues in a filesystem or upload target, the safe alias is:
|
||||||
|
|
||||||
```text
|
```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:
|
The Steam compatibility tool name still remains exactly:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
Elsword-GE-11-1+dxvk-git
|
Elsword-GE-10-34+dxvk-git
|
||||||
```
|
```
|
||||||
|
|
||||||
## Install into Steam
|
## Install into Steam
|
||||||
@@ -151,8 +151,8 @@ Elsword-GE-11-1+dxvk-git
|
|||||||
Install a built archive:
|
Install a built archive:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./scripts/install-to-steam.sh dist/Elsword-GE-11-1.tar.zst
|
./scripts/install-to-steam.sh dist/Elsword-GE-10-34.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+dxvk-git.tar.zst
|
||||||
```
|
```
|
||||||
|
|
||||||
Generic installer for release archives, including Flatpak Steam users:
|
Generic installer for release archives, including Flatpak Steam users:
|
||||||
@@ -175,34 +175,6 @@ After install:
|
|||||||
2. Open Elsword properties in Steam.
|
2. Open Elsword properties in Steam.
|
||||||
3. Select the matching compatibility tool.
|
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
|
## Debugging
|
||||||
|
|
||||||
For Proton logs:
|
For Proton logs:
|
||||||
@@ -211,72 +183,6 @@ For Proton logs:
|
|||||||
PROTON_LOG=1 %command%
|
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
|
## Security and anti-cheat note
|
||||||
|
|
||||||
This project intentionally avoids:
|
This project intentionally avoids:
|
||||||
|
|||||||
@@ -7,9 +7,20 @@
|
|||||||
let
|
let
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
pkgs = import nixpkgs { inherit system; };
|
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
|
in
|
||||||
{
|
{
|
||||||
devShells.${system}.default = pkgs.mkShell {
|
devShells.${system}.default = pkgs.mkShell {
|
||||||
|
MINGW_PTHREAD_ROOT = mingwPthreadRoot;
|
||||||
|
|
||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
bash
|
bash
|
||||||
binutils
|
binutils
|
||||||
|
|||||||
+16
-5
@@ -10,11 +10,11 @@ DXVK_CACHE_DIR="${DXVK_CACHE_DIR:-$CACHE_DIR/dxvk}"
|
|||||||
METADATA_DIR="${METADATA_DIR:-$DIST_DIR/metadata}"
|
METADATA_DIR="${METADATA_DIR:-$DIST_DIR/metadata}"
|
||||||
STEAM_COMPAT_DIR_DEFAULT="${STEAM_COMPAT_DIR_DEFAULT:-$HOME/.local/share/Steam/compatibilitytools.d}"
|
STEAM_COMPAT_DIR_DEFAULT="${STEAM_COMPAT_DIR_DEFAULT:-$HOME/.local/share/Steam/compatibilitytools.d}"
|
||||||
UPSTREAM_REPO="${UPSTREAM_REPO:-GloriousEggroll/proton-ge-custom}"
|
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_TAG="${PROTON_TAG:-GE-Proton${ELSWORD_GE_VERSION}}"
|
||||||
PROTON_ASSET="${PROTON_ASSET:-x86_64}"
|
PROTON_ASSET="${PROTON_ASSET:-x86_64}"
|
||||||
RUNTIME_APPID="${RUNTIME_APPID:-4183110}"
|
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_STABLE_TAG_DEFAULT="${DXVK_STABLE_TAG_DEFAULT:-latest}"
|
||||||
DXVK_GIT_REF="${DXVK_GIT_REF:-origin/master}"
|
DXVK_GIT_REF="${DXVK_GIT_REF:-origin/master}"
|
||||||
MINGW_PTHREAD_ROOT="${MINGW_PTHREAD_ROOT:-}"
|
MINGW_PTHREAD_ROOT="${MINGW_PTHREAD_ROOT:-}"
|
||||||
@@ -259,7 +259,7 @@ PY
|
|||||||
resolve_runtime_dll_path() {
|
resolve_runtime_dll_path() {
|
||||||
local arch="$1"
|
local arch="$1"
|
||||||
local dll="$2"
|
local dll="$2"
|
||||||
local compiler result nix_attr store_path
|
local compiler result nix_attr store_path arch_dir
|
||||||
|
|
||||||
case "$arch" in
|
case "$arch" in
|
||||||
x86_64) compiler="x86_64-w64-mingw32-g++" ;;
|
x86_64) compiler="x86_64-w64-mingw32-g++" ;;
|
||||||
@@ -275,9 +275,20 @@ resolve_runtime_dll_path() {
|
|||||||
|
|
||||||
if [[ "$dll" == "libmcfgthread-2.dll" ]]; then
|
if [[ "$dll" == "libmcfgthread-2.dll" ]]; then
|
||||||
case "$arch" in
|
case "$arch" in
|
||||||
x86_64) nix_attr="pkgsCross.mingwW64.windows.mcfgthreads" ;;
|
x86_64)
|
||||||
x86) nix_attr="pkgsCross.mingw32.windows.mcfgthreads" ;;
|
nix_attr="pkgsCross.mingwW64.windows.mcfgthreads"
|
||||||
|
arch_dir="x64"
|
||||||
|
;;
|
||||||
|
x86)
|
||||||
|
nix_attr="pkgsCross.mingw32.windows.mcfgthreads"
|
||||||
|
arch_dir="x32"
|
||||||
|
;;
|
||||||
esac
|
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}")"
|
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)"
|
result="$(find "$store_path" -name "$dll" -type f | head -n1 || true)"
|
||||||
if [[ -n "$result" && -f "$result" ]]; then
|
if [[ -n "$result" && -f "$result" ]]; then
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ STEAM_COMPAT_DIR="${STEAM_COMPAT_DIR:-$HOME/.local/share/Steam/compatibilitytool
|
|||||||
usage() {
|
usage() {
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
Usage:
|
Usage:
|
||||||
./scripts/install-to-steam.sh dist/Elsword-GE-11-1.tar.zst
|
./scripts/install-to-steam.sh dist/Elsword-GE-10-34.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+dxvk-git.tar.zst
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ source "$SCRIPT_DIR/common.sh"
|
|||||||
usage() {
|
usage() {
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
Usage:
|
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
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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'
|
||||||
Reference in New Issue
Block a user