#!/usr/bin/env bash # DroidDeck/ARM64 + Proton:Steam 版星露谷 SMAPI 一键修复 # bash fix-smapi.sh # 交互选择启动方式 # bash fix-smapi.sh rename # Harmony 2.4.3 + 改名法 # bash fix-smapi.sh launchopt # Harmony 2.4.3 + 启动选项法(不改 exe) # bash fix-smapi.sh rollback # 全部还原 set -euo pipefail HARMONY_VER="2.4.3" GAME="${GAME_DIR:-/root/.local/share/Steam/steamapps/common/Stardew Valley}" SMAPI="$GAME/smapi-internal" MODE="${1:-}" print_launchopt() { cat <<'EOF' 把下面这一整行粘到 Steam → Stardew Valley → 属性 → 启动选项: bash -c 'a=("$@"); for i in "${!a[@]}"; do a[$i]="${a[$i]//Stardew Valley.exe/StardewModdingAPI.exe}"; done; exec "${a[@]}"' -- %command% EOF } # ---- 交互选择(只在终端里有 stdin 时)---- if [ -z "$MODE" ] && [ -t 0 ]; then echo "请选择启动方式:" select opt in "改名法(推荐,最稳)" "启动选项法(不改 exe)" "回滚到原版" "退出"; do case "$opt" in 改名法*) MODE=rename; break ;; 启动选项法*) MODE=launchopt; break ;; 回滚*) MODE=rollback; break ;; 退出|*) echo "已取消"; exit 0 ;; esac done elif [ -z "$MODE" ]; then MODE=rename # 非交互场景走默认 fi # ---- 定位游戏目录 ---- if [ ! -f "$GAME/StardewModdingAPI.exe" ]; then found="$(find /root -maxdepth 7 -type d -name "Stardew Valley" 2>/dev/null | head -n1 || true)" [ -n "$found" ] && GAME="$found" && SMAPI="$GAME/smapi-internal" fi [ -f "$GAME/StardewModdingAPI.exe" ] || { echo "找不到游戏目录,请先安装 SMAPI 或设置 GAME_DIR"; exit 1; } # ---- 回滚 ---- if [ "$MODE" = rollback ]; then [ -f "$SMAPI/0Harmony.dll.2.2.2.bak" ] && cp -f "$SMAPI/0Harmony.dll.2.2.2.bak" "$SMAPI/0Harmony.dll" [ -f "$GAME/Stardew Valley.exe.bak" ] && cp -f "$GAME/Stardew Valley.exe.bak" "$GAME/Stardew Valley.exe" echo "已还原 Harmony 2.2.2 + 原版 exe。若用过启动选项法,请把 Steam 启动选项清空。" exit 0 fi # ---- 1) 替换 Harmony(核心修复)---- tmp="$(mktemp -d)"; trap 'rm -rf "$tmp"' EXIT echo "下载 Harmony $HARMONY_VER ..." curl -fsSL -o "$tmp/h.zip" \ "https://api.nuget.org/v3-flatcontainer/lib.harmony/$HARMONY_VER/lib.harmony.$HARMONY_VER.nupkg" unzip -oq "$tmp/h.zip" "lib/net6.0/0Harmony.dll" -d "$tmp" [ -f "$SMAPI/0Harmony.dll.2.2.2.bak" ] || cp -p "$SMAPI/0Harmony.dll" "$SMAPI/0Harmony.dll.2.2.2.bak" cp -f "$tmp/lib/net6.0/0Harmony.dll" "$SMAPI/0Harmony.dll" chmod 644 "$SMAPI/0Harmony.dll" # ---- 2) 启动方式 ---- if [ "$MODE" = launchopt ]; then [ -f "$GAME/Stardew Valley.exe.bak" ] && cp -f "$GAME/Stardew Valley.exe.bak" "$GAME/Stardew Valley.exe" print_launchopt else cd "$GAME" [ -f "Stardew Valley.exe.bak" ] || cp -p "Stardew Valley.exe" "Stardew Valley.exe.bak" cp -f "StardewModdingAPI.exe" "Stardew Valley.exe" chmod 755 "Stardew Valley.exe" echo "已启用改名法:直接从 Steam 启动 Stardew Valley 即可(启动选项请留空)。" fi echo ls -l "$SMAPI/0Harmony.dll"* "$GAME/Stardew Valley.exe"*