├── .github ├── FUNDING.yml └── images │ ├── ui.png │ └── launch-options.png ├── shell.nix ├── README.md └── elden-proton.bash /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [Cloudef] 2 | -------------------------------------------------------------------------------- /.github/images/ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cloudef/elden-proton/HEAD/.github/images/ui.png -------------------------------------------------------------------------------- /.github/images/launch-options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cloudef/elden-proton/HEAD/.github/images/launch-options.png -------------------------------------------------------------------------------- /shell.nix: -------------------------------------------------------------------------------- 1 | { pkgs ? import {} }: 2 | 3 | pkgs.mkShell { 4 | packages = with pkgs; [ curl unzip gnome.zenity ]; 5 | } 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # elden-proton 2 | 3 | Noob friendly Elden Ring mod loader for linux/proton/steam 4 | 5 | > [!NOTE] 6 | > elden-proton is currently not actively maintained 7 | > [Click here for up-to-date fork with additional features](https://github.com/VirusAlex/elden-proton) 8 | 9 | ![steam launch options](.github/images/launch-options.png) 10 | ![launcher ui](.github/images/ui.png) 11 | 12 | ## Usage 13 | 14 | - Place the `elden-proton.bash` into your preferred location and mark it as executable (`chmod +x` from shell). 15 | - Run the script once through terminal or through graphical file manager to output steam launch options. 16 | - Set the provided launch options in steam for Elden Ring 17 | - Launch Elden Ring from steam and customize settings to your liking 18 | 19 | ## Flatpak Steam 20 | 21 | - Make sure that every necessary path (wherever you put `elden-proton.bash` or the folder containing your Modengine2 mods) is accessible from the flatpak 22 | - CLI example: `flatpak override com.valvesoftware.Steam --filesystem="$HOME/dev/personal:ro"` 23 | - Flatseal example: Put `"$HOME/dev/personal:ro"` under Filesystem->Other files for the Steam application 24 | - Apart from that it should work out of the box 25 | 26 | ## Features 27 | 28 | - Run Elden Ring modded or unmodded easily 29 | - Zenity based GUI 30 | - Automatically manages EldenModLoader and ModEngine2-proton 31 | - Automatically manages and downloads popular DLL mods 32 | - Easy access to DLL mod configuration files 33 | - Run ModEngine2 compatible mods simply by choosing the mod directory 34 | 35 | ## Modengine2 mods 36 | 37 | Many mods in NexusMods come with ModEngine2 bundled. Simply choose any folder that contains a `config_eldenring.toml` file and you are all set. 38 | 39 | ## Env variables 40 | 41 | - `STEAM_PATH` control where steam is located 42 | - `ER_PATH` control where `Elden Ring/Game` is located 43 | 44 | ## Start from scratch 45 | 46 | In your `Elden Ring/Game` location, remove the `mods` and `EldenProton` folders. 47 | Remove only the `EldenProton` folder if you want to reset state and re-download everything. 48 | Note that all DLL mod settings will be reset. 49 | -------------------------------------------------------------------------------- /elden-proton.bash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | ## Noob friendly elden ring mod loader for linux/proton/steam 3 | ## If you execute the script without args it will print the launch options you should set for Elden Ring in steam 4 | ## If you want to install additional dll mods that aren't included in this script, you can do so by installing them 5 | ## in the game directory's mods folder, this script won't manage any dll mods it isn't aware of 6 | 7 | set -euo pipefail 8 | 9 | STEAM_PATH="${STEAM_PATH:-"$HOME"/.steam/steam}" 10 | ER_PATH="${ER_PATH:-$STEAM_PATH/steamapps/common/ELDEN RING/Game}" 11 | ZENITY=${STEAM_ZENITY:-zenity} 12 | UNZIP=${STEAM_UNZIP:-unzip} 13 | CURL=${STEAM_CURL:-curl} 14 | SHA256SUM=${STEAM_SHA256SUM:-sha256sum} 15 | 16 | if [[ -d "${STEAM_RUNTIME:-}" ]]; then 17 | # https://github.com/Cloudef/elden-proton/issues/4 18 | OLD_LIBRARY_PATH="$LD_LIBRARY_PATH" 19 | export LD_LIBRARY_PATH= 20 | # https://github.com/Cloudef/elden-proton/issues/6 21 | if [[ ! "${STEAM_ZENITY:-}" ]] || [[ "${STEAM_ZENITY:-}" == zenity ]]; then 22 | if [[ "${SYSTEM_PATH:-}" ]]; then 23 | ZENITY="${SYSTEM_ZENITY:-$(PATH="$SYSTEM_PATH" which zenity)}" 24 | else 25 | # last fallback 26 | ZENITY="${SYSTEM_ZENITY:-/usr/bin/zenity}" 27 | fi 28 | fi 29 | fi 30 | 31 | if [[ "x$@" == "x" ]]; then 32 | if test -t 0; then 33 | printf "%s\n" "bash \"$(realpath "$0")\" %command%" 34 | else 35 | $ZENITY --info --title "Elden Proton" --text "$(realpath "$0") %command%" 36 | fi 37 | exit 0 38 | fi 39 | 40 | # effortless nixos support, requires flakes enabled 41 | if [[ -f /etc/os-release ]]; then 42 | source /etc/os-release 43 | if [[ "$ID" == nixos ]]; then 44 | UNZIP="${STEAM_UNZIP:-$(nix shell nixpkgs#unzip -c which unzip)}" 45 | CURL="${STEAM_CURL:-$(nix shell nixpkgs#curl -c which curl)}" 46 | SHA256SUM="${STEAM_SHA256SUM:-$(nix shell nixpkgs#coreutils -c which sha256sum)}" 47 | fi 48 | fi 49 | 50 | if ! $UNZIP -v 1>/dev/null; then 51 | $ZENITY --error --title "Elden Proton" --text "Executing unzip failed... Do you have unzip installed?" 52 | exit 1 53 | fi 54 | 55 | tmpdir="$(mktemp -d)" 56 | trap 'rm -rf "$tmpdir"' EXIT 57 | 58 | elden_mod_loader_url="https://github.com/techiew/EldenRingModLoader/releases/download/Binary/EldenModLoader.zip" 59 | elden_mod_loader_sha256="41d90de7506474689fd711ac421897642a3f5ff0391c313773263a43a83af66d" 60 | 61 | mod_engine_proton_url="https://github.com/Cloudef/ModEngine2/releases/download/2.1.0.0-proton-v1/ModEngine-2.1.0.0-win64.zip" 62 | mod_engine_proton_sha256="b8c858594529be3fc428840c263ed5a367283243111d01e1d75fbb40903d95c2" 63 | 64 | read -r -d '' elden_mod_loader_mods <<'EOV' || true 65 | Adjust The Fov 66 | mods/AdjustTheFov.dll 67 | mods/AdjustTheFov/config.ini 68 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/AdjustTheFov.zip 69 | 339a27e94780c1550380d0fbc81026265da0539f95cfd004b012ec5c99c8323b 70 | Disable Rune Loss 71 | mods/DisableRuneLoss.dll 72 | 73 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/DisableRuneLoss.zip 74 | 6d69b51cde189b8ebedcd858aa5b25bb394c49e8e1df79c207a28d46ce0ccf6b 75 | Fix The Camera 76 | mods/CameraFix.dll 77 | mods/CameraFix/config.ini 78 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/FixTheCamera.zip 79 | 749174278e9147fb099c37592f98811c9e737645c913d12fe64b9b94bd03250d 80 | Increase Animation Distance 81 | mods/IncreaseAnimationDistance.dll 82 | 83 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/IncreaseAnimationDistance.zip 84 | 4a120852e5eb71e42abd2d7180a7fbf0a4eb8fbcda797d4cbba54c865b1dc4af 85 | Pause The Game 86 | mods/PauseTheGame.dll 87 | mods/PauseTheGame/pause_keybinds.ini 88 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/PauseTheGame.zip 89 | 9040fc6442d45f70c44d4a711cea6f4078b811e0761f799d36b5e133987d8928 90 | Remove Black Bars 91 | mods/UltrawideFix.dll 92 | 93 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/RemoveBlackBars.zip 94 | 905f1ebc76a411d89f9276677000a10de200951209d0eacad812c4aefc3c13e0 95 | Remove Chromatic Aberration 96 | mods/RemoveChromaticAbberation.dll 97 | 98 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/RemoveChromaticAberration.zip 99 | 2b9725dbc9c0825bb7f366bc8d01e659d62db4bc12d89ceb4d55287a3c23d13f 100 | Remove Vignette 101 | mods/RemoveVignette.dll 102 | 103 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/RemoveVignette.zip 104 | cdd9a3faf127d7f6fdf57e0e3772d1e849603b2c20ad32a41b8883fb6e3600d6 105 | Skip The Intro 106 | mods/SkipTheIntro.dll 107 | mods/SkipTheIntro/config.ini 108 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/SkipTheIntro.zip 109 | 5a23e1f1aafbf439072801f4f16cd624664f9d64761e9816fe29b597e17bef75 110 | Unlock The Fps 111 | mods/UnlockTheFps.dll 112 | mods/UnlockTheFps/config.ini 113 | https://github.com/techiew/EldenRingMods/releases/download/Binaries/UnlockTheFps.zip 114 | 116a523d858ab76ed38ca8a918c1f1e393d646f4d632ea2f692a614524b86a51 115 | EOV 116 | 117 | download_and_verify() { 118 | local fpath="$tmpdir/$(basename "$1")" 119 | if ! $CURL -sSL "$1" -o "$fpath"; then 120 | $ZENITY --error --title "Elden Proton" --text "Executing curl failed... Do you have curl installed?" 121 | exit 1 122 | fi 123 | local sum=($($SHA256SUM "$fpath")) 124 | if [[ $? != 0 ]]; then 125 | $ZENITY --error --title "Elden Proton" --text "Executing sha256sum failed... Do you have sha256sum installed?" 126 | exit 1 127 | fi 128 | if [[ "$sum" != "$2" ]]; then 129 | $ZENITY --error --title "Elden Proton" --text "Integrity check failed\n$1\ngot: $sum\nexpected: $2" 130 | exit 1 131 | fi 132 | mkdir -p "$ER_PATH"/EldenProton 133 | printf '%s' "$2" > "$ER_PATH"/EldenProton/"$3.sha256" 134 | } 135 | 136 | verify_local_resource() { 137 | if [[ -f "$ER_PATH"/EldenProton/"$1.sha256" ]] && [[ "$(cat "$ER_PATH"/EldenProton/"$1.sha256")" == "$2" ]]; then 138 | return 0 139 | else 140 | return 1 141 | fi 142 | } 143 | 144 | download_dll_mod() { 145 | if verify_local_resource "$3" "$2"; then 146 | return 0 147 | fi 148 | 149 | local fpath="$tmpdir/$(basename "$1")" 150 | download_and_verify "$1" "$2" "$3" 151 | 152 | (cd "$ER_PATH" && $UNZIP -qq -o "$fpath") 153 | } 154 | 155 | dll_mod_list() { 156 | while { 157 | read -r name 158 | read -r dll 159 | read -r config 160 | read -r url 161 | read -r sha256 162 | }; do 163 | if grep -Fx "$name" "$ER_PATH"/EldenProton/dllmods.enabled > /dev/null; then 164 | printf '%s\n%s\n' "TRUE" "$name" 165 | else 166 | printf '%s\n%s\n' "FALSE" "$name" 167 | fi 168 | done <<<"$elden_mod_loader_mods" 169 | } 170 | 171 | config_list() { 172 | printf '%s\n%s\n' "Elden Mod Loader" "mod_loader_config.ini" 173 | while { 174 | read -r name 175 | read -r dll 176 | read -r config 177 | read -r url 178 | read -r sha256 179 | }; do 180 | if [[ "x$config" != x ]] && grep -Fx "$name" "$ER_PATH"/EldenProton/dllmods.enabled > /dev/null; then 181 | printf '%s\n%s\n' "$name" "$config" 182 | fi 183 | done <<<"$elden_mod_loader_mods" 184 | } 185 | 186 | download_enabled_dll_mods() { 187 | while { 188 | read -r name 189 | read -r dll 190 | read -r config 191 | read -r url 192 | read -r sha256 193 | }; do 194 | if grep -Fx "$name" "$ER_PATH"/EldenProton/dllmods.enabled > /dev/null; then 195 | [[ -f "$ER_PATH/$dll.disabled" ]] && mv "$ER_PATH/$dll.disabled" "$ER_PATH/$dll" 196 | download_dll_mod "$url" "$sha256" "$name" 197 | elif [[ -f "$ER_PATH/$dll" ]]; then 198 | mv "$ER_PATH/$dll" "$ER_PATH/$dll.disabled" 199 | fi 200 | done <<<"$elden_mod_loader_mods" 201 | touch "$tmpdir"/integrity.ok 202 | } 203 | 204 | download_required_files() { 205 | echo "10" 206 | if ! verify_local_resource elden_mod_loader "$elden_mod_loader_sha256"; then 207 | download_and_verify "$elden_mod_loader_url" "$elden_mod_loader_sha256" elden_mod_loader 208 | (cd "$ER_PATH" && $UNZIP -qq -o "$tmpdir"/EldenModLoader.zip) 209 | sed -i 's/load_delay = 5000/load_delay = 2000/' "$ER_PATH"/mod_loader_config.ini 210 | fi 211 | echo "45" 212 | if ! verify_local_resource mod_engine_proton "$mod_engine_proton_sha256"; then 213 | download_and_verify "$mod_engine_proton_url" "$mod_engine_proton_sha256" mod_engine_proton 214 | (cd "$ER_PATH"/mods && $UNZIP -qq -jo "$tmpdir"/ModEngine-2.1.0.0-win64.zip "ModEngine-2.1.0.0-win64/modengine2/bin/*") 215 | fi 216 | echo "100" 217 | touch "$tmpdir"/integrity.ok 218 | } 219 | 220 | if [[ ! -f "$ER_PATH"/eldenring.exe ]]; then 221 | $ZENITY --error --title "Elden Proton" --text "Could not find Elden Ring installation in $ER_PATH" 222 | exit 1 223 | fi 224 | 225 | download_required_files | $ZENITY --progress --auto-close --percentage=0 --title "Elden Proton" --text "Downloading required files" || true 226 | 227 | if [[ ! -f "$tmpdir"/integrity.ok ]]; then 228 | $ZENITY --error --title "Elden Proton" --text "Required files failed to download" 229 | exit 1 230 | else 231 | rm -f "$tmpdir"/integrity.ok 232 | fi 233 | 234 | mkdir -p "$ER_PATH"/EldenProton 235 | [[ -f "$ER_PATH"/EldenProton/state ]] || printf 1 > "$ER_PATH"/EldenProton/state 236 | while :; do 237 | mods_enabled=$(cat "$ER_PATH"/EldenProton/state) 238 | if [[ $mods_enabled == 1 ]]; then 239 | option="$($ZENITY --list --title "Elden Proton" --text "" --column "Choice" <<'EOC' 240 | Launch Elden Ring 241 | Disable Mods 242 | Choose ModEngine2 mod 243 | Choose DLL mods 244 | Edit Settings 245 | EOC 246 | )" 247 | else 248 | option="$($ZENITY --list --title "Elden Proton" --text "" --column "Choice" <<'EOC' 249 | Launch Elden Ring 250 | Enable Mods 251 | EOC 252 | )" 253 | fi 254 | case "$option" in 255 | "Launch Elden Ring") 256 | if [[ -d "${STEAM_RUNTIME:-}" ]]; then 257 | export LD_LIBRARY_PATH="$OLD_LIBRARY_PATH" 258 | fi 259 | if [[ $mods_enabled == 1 ]]; then 260 | args=("$@") 261 | set -- 262 | for arg in "${args[@]}"; do 263 | set -- "$@" "$(sed 's/start_protected_game.exe/eldenring.exe/' <<<"$arg")" 264 | done 265 | mod_path= 266 | # https://github.com/Cloudef/elden-proton/issues/13 267 | [[ -f "$ER_PATH"/dinput8.dll.disabled ]] && mv "$ER_PATH"/dinput8.dll.disabled "$ER_PATH"/dinput8.dll 268 | [[ -f "$ER_PATH"/EldenProton/modengine2.modpath ]] && mod_path="$(cat "$ER_PATH"/EldenProton/modengine2.modpath)" 269 | WINEDLLOVERRIDES="dinput8.dll=n,b" MODENGINE_CONFIG="$mod_path"/config_eldenring.toml "$@" 270 | exit $? 271 | else 272 | # https://github.com/Cloudef/elden-proton/issues/13 273 | [[ -f "$ER_PATH"/dinput8.dll ]] && mv "$ER_PATH"/dinput8.dll "$ER_PATH"/dinput8.dll.disabled 274 | WINEDLLOVERRIDES="dinput8.dll=b" "$@" 275 | exit $? 276 | fi 277 | ;; 278 | "Enable Mods") 279 | printf 1 > "$ER_PATH"/EldenProton/state 280 | ;; 281 | "Disable Mods") 282 | printf 0 > "$ER_PATH"/EldenProton/state 283 | ;; 284 | "Choose ModEngine2 mod") 285 | set +e 286 | dir="$($ZENITY --file-selection --title "Elden Proton" --directory)" 287 | set -e 288 | if [[ "x$dir" != x ]]; then 289 | if [[ -f "$dir"/config_eldenring.toml ]]; then 290 | printf '%s' "$dir" > "$ER_PATH"/EldenProton/modengine2.modpath 291 | else 292 | $ZENITY --error --title "Elden Proton" --text "No config_eldenring.toml in the mod directory, is this really an ModEngine2 mod?" 293 | fi 294 | fi 295 | ;; 296 | "Choose DLL mods") 297 | set +e 298 | dll_mod_list | $ZENITY --list --checklist --title "Elden Proton" --text "" --print-column=2 --separator="\n" --column "Enabled" --column "Mod" > "$tmpdir"/dllmods.enabled 299 | [[ $? == 0 ]] && cp -f "$tmpdir"/dllmods.enabled "$ER_PATH"/EldenProton/dllmods.enabled 300 | set -e 301 | download_enabled_dll_mods | $ZENITY --progress --auto-close --pulsate --title "Elden Proton" --text "Downloading required files" || true 302 | if [[ ! -f "$tmpdir"/integrity.ok ]]; then 303 | $ZENITY --error --title "Elden Proton" --text "Required files failed to download" 304 | exit 1 305 | else 306 | rm -f "$tmpdir"/integrity.ok 307 | fi 308 | ;; 309 | "Edit Settings") 310 | set +e 311 | config="$(config_list | $ZENITY --list --title "Elden Proton" --text "" --print-column=ALL --print-column=2 --column "Title" --column "Config")" 312 | set -e 313 | if [[ -f "$ER_PATH/$config" ]]; then 314 | if [[ "x${STEAM_EDITOR:-}" != x ]]; then 315 | $STEAM_EDITOR "$ER_PATH/$config" 316 | elif ! xdg-open "$ER_PATH/$config"; then 317 | $ZENITY --error --title "Elden Proton" --text "'xdg-open $ER_PATH/$config' failed, if you do not have xdg-open set STEAM_EDITOR env variable to an graphical editor instead" 318 | fi 319 | elif [[ "x$config" != x ]]; then 320 | $ZENITY --error --title "Elden Proton" --text "File $ER_PATH/$config does not exist" 321 | fi 322 | ;; 323 | esac 324 | done 325 | --------------------------------------------------------------------------------