-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·158 lines (144 loc) · 8.02 KB
/
Copy pathinstall.sh
File metadata and controls
executable file
·158 lines (144 loc) · 8.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/bin/bash
# Rhythm Doctor Trainer · macOS + Linux 一键安装(原生,无需 BepInEx / Rosetta)
#
# 懒人一键(在「终端」粘贴运行):
# curl -fsSL https://raw.githubusercontent.com/Cohenjikan/RhythmDoctorTrainer/refs/heads/main/install.sh | bash
#
# 脚本会自动:装 .NET SDK(若无)→ 拉取源码 → 编译 → 备份游戏文件 → 织入加载器。
# 游戏更新或 Steam「验证文件完整性」后重跑本命令即可。
#
# 平台无关的托管代码(修改器逻辑 + Mono.Cecil 织入器)在 macOS 与 Linux 上完全一致;
# 本脚本只把「平台相关」的东西(游戏目录布局、Steam 位置、进程名、日志路径、缺包提示)
# 抽成变量,主逻辑两个平台共用。
set -euo pipefail
REPO_GIT="https://github.com/Cohenjikan/RhythmDoctorTrainer.git"
export DOTNET_ROOT="${DOTNET_ROOT:-$HOME/.dotnet}"
export PATH="$DOTNET_ROOT:$PATH"
# --- 平台检测:把所有平台相关的取值集中在这里,下面主逻辑只用这些变量 ---
# GAME_SUBPATH : "Rhythm Doctor"/ 下到 Managed/ 的相对子路径(macOS 是 .app 包,Linux 是 *_Data)
# GAME_PROC : pgrep -f 用来判断游戏是否在跑的命令行特征
# PLAYER_LOG : Unity player 日志路径(验证补丁是否加载)
# STEAM_ROOTS : Steam 安装根目录候选(之后还会叠加 libraryfolders.vdf 里的自定义库)
# GIT_HINT / CURL_HINT : 缺少 git / curl 时给当前平台的安装建议
OS="$(uname -s)"
case "$OS" in
Darwin)
GAME_SUBPATH="Rhythm Doctor.app/Contents/Resources/Data/Managed"
GAME_PROC="Rhythm Doctor.app/Contents/MacOS/Rhythm Doctor"
PLAYER_LOG="$HOME/Library/Logs/7th Beat Games/Rhythm Doctor/Player.log"
STEAM_ROOTS=("$HOME/Library/Application Support/Steam")
FONT_DIR="$HOME/Library/Fonts" # 用户级字体目录,CoreText 立即可见,无需刷新缓存
GIT_HINT="先运行:xcode-select --install"
CURL_HINT="curl 为 macOS 自带;若缺失可用 Homebrew:brew install curl"
;;
Linux)
GAME_SUBPATH="Rhythm Doctor_Data/Managed"
GAME_PROC="Rhythm Doctor.x86_64"
PLAYER_LOG="$HOME/.config/unity3d/7th Beat Games/Rhythm Doctor/Player.log"
FONT_DIR="$HOME/.local/share/fonts" # 用户级字体目录,装完用 fc-cache 刷新
# 原生 Steam、~/.steam 软链、以及 Flatpak 版 Steam 的常见安装根
STEAM_ROOTS=(
"$HOME/.local/share/Steam"
"$HOME/.steam/steam"
"$HOME/.steam/root"
"$HOME/.var/app/com.valvesoftware.Steam/.local/share/Steam"
)
GIT_HINT="用发行版包管理器安装,例如:sudo apt install git / sudo dnf install git / sudo pacman -S git"
CURL_HINT="用发行版包管理器安装,例如:sudo apt install curl / sudo dnf install curl / sudo pacman -S curl"
;;
*)
echo "ERROR: 不支持的平台:$OS(本脚本仅支持 macOS / Linux)。"
exit 1
;;
esac
# --- self-bootstrap: when piped via `curl | bash` there's no source tree, so clone it & re-exec ---
SELF="${BASH_SOURCE[0]:-$0}"
if [ -f "$SELF" ]; then HERE="$(cd "$(dirname "$SELF")" && pwd)"; else HERE=""; fi
if [ -z "$HERE" ] || [ ! -f "$HERE/mac/RDTrainerMac/RDTrainerMac.csproj" ]; then
if ! command -v git >/dev/null 2>&1; then
echo "ERROR: 需要 git。$GIT_HINT"; exit 1
fi
SRC="${RDT_SRC:-$HOME/.rdtrainer-mac/src}"
echo "==> 获取源码 -> $SRC"
# Reuse the cached clone ONLY if it points at this same repo; otherwise wipe & re-clone.
# (A leftover clone of a different fork would otherwise hijack the build via `git pull`.)
if [ -d "$SRC/.git" ] && [ "$(git -C "$SRC" remote get-url origin 2>/dev/null)" = "$REPO_GIT" ]; then
git -C "$SRC" pull --ff-only || true
else
rm -rf "$SRC"; mkdir -p "$(dirname "$SRC")"; git clone --depth 1 "$REPO_GIT" "$SRC"
fi
exec bash "$SRC/install.sh" "$@"
fi
# --- ensure .NET SDK (installs locally to ~/.dotnet, no sudo, fully removable) ---
# dotnet-install.sh 是跨平台的官方 POSIX 脚本(macOS + Linux 通用),装到 ~/.dotnet。
# 只要 `dotnet` 已在 PATH(无论本地安装还是发行版包),就跳过;不掺任何 macOS 假设。
if ! command -v dotnet >/dev/null 2>&1; then
if ! command -v curl >/dev/null 2>&1; then
echo "ERROR: 需要 curl 才能下载 .NET SDK 安装脚本。$CURL_HINT"; exit 1
fi
echo "==> 未发现 .NET SDK,自动安装到 ~/.dotnet(约 200MB,一次性)…"
curl -fsSL https://dot.net/v1/dotnet-install.sh | bash -s -- --channel 8.0 --install-dir "$HOME/.dotnet" --no-path
export DOTNET_ROOT="$HOME/.dotnet"; export PATH="$HOME/.dotnet:$PATH"
fi
# --- locate the game's Managed folder (override: MANAGED=... ) ---
# 依次尝试每个 Steam 根目录,并解析其 libraryfolders.vdf 里登记的自定义库路径。
# 不写死单一路径:默认库 = Steam 根自身,其余库 = vdf 里的 "path" 项。
CANDS=()
for root in "${STEAM_ROOTS[@]}"; do
CANDS+=("$root/steamapps/common/Rhythm Doctor/$GAME_SUBPATH")
vdf="$root/steamapps/libraryfolders.vdf"
if [ -f "$vdf" ]; then
# vdf 里每个库一行: "path"\t\t"/some/Steam Library" —— 按引号切分取第 4 段即路径。
# 只读解析,awk 在 macOS(BSD) 与 Linux(GNU/mawk) 行为一致;|| true 防止 set -e 误杀。
while IFS= read -r libpath; do
[ -n "$libpath" ] && CANDS+=("$libpath/steamapps/common/Rhythm Doctor/$GAME_SUBPATH")
done <<< "$(awk -F'"' '/"path"/{print $4}' "$vdf" 2>/dev/null || true)"
fi
done
if [ -z "${MANAGED:-}" ]; then
for c in ${CANDS[@]+"${CANDS[@]}"}; do
if [ -f "$c/Assembly-CSharp.dll" ]; then MANAGED="$c"; break; fi
done
fi
MANAGED="${MANAGED:-}"
if [ -z "$MANAGED" ] || [ ! -f "$MANAGED/Assembly-CSharp.dll" ]; then
echo "ERROR: 找不到 Assembly-CSharp.dll。已尝试以下路径:"
for c in ${CANDS[@]+"${CANDS[@]}"}; do echo " $c"; done
echo "用 MANAGED=/path/.../Managed 指定游戏路径后重试。"
exit 1
fi
# --- refuse to patch while the game is running (the DLL is mapped in memory) ---
if pgrep -f "$GAME_PROC" >/dev/null 2>&1; then
echo "ERROR: 游戏正在运行,请先退出再安装。"; exit 1
fi
echo "==> 编译修改器 DLL"
dotnet build -c Release "$HERE/mac/RDTrainerMac/RDTrainerMac.csproj" -p:Managed="$MANAGED" | tail -3
# glob 直接喂给 sort -V 取最新版本;不用 ls(避免 SC2012,也更稳)。glob 不匹配时保持字面量,下面 -f 判定会兜住。
HARMONY="$(printf '%s\n' "$HOME"/.nuget/packages/lib.harmony/*/lib/net472/0Harmony.dll | sort -V | tail -1 || true)"
if [ -z "${HARMONY:-}" ] || [ ! -f "$HARMONY" ]; then
echo "ERROR: NuGet 缓存里找不到 net472 0Harmony.dll。"; exit 1
fi
echo "==> 织入 Assembly-CSharp.dll(把 Loader.Init 织进 RDStartup.Setup)"
dotnet run -c Release --project "$HERE/mac/Patcher/Patcher.csproj" -- \
"$MANAGED" \
"$HERE/mac/RDTrainerMac/bin/Release/RDTrainerMac.dll" \
"$HARMONY"
# --- 安装菜单用的中文字体(三端统一按家族名 "Noto Sans SC" 加载)---
# Unity 的 IMGUI 只能用「操作系统已注册」的字体,没有运行时直接读取 .ttf 的接口,所以把随仓库
# 附带的 Noto Sans SC 装进当前用户的字体目录(无需 sudo)。Linux 上若有 fc-cache 顺手刷新缓存。
# 缺字体文件只警告、不致命(运行时会回退到系统已有的中文字体)。
FONT_SRC="$HERE/fonts/NotoSansSC-Regular.otf"
if [ -f "$FONT_SRC" ]; then
mkdir -p "$FONT_DIR"
cp -f "$FONT_SRC" "$FONT_DIR/NotoSansSC-Regular.otf"
command -v fc-cache >/dev/null 2>&1 && fc-cache -f "$FONT_DIR" >/dev/null 2>&1 || true
echo "==> 已安装中文字体 Noto Sans SC -> $FONT_DIR"
else
echo "WARN: 未找到随附字体 $FONT_SRC,跳过;菜单中文将回退到系统已有的中文字体。"
fi
cat <<EOF
==> 完成!正常通过 Steam 启动游戏,进任意关卡按 F3 开/关菜单。
验证: grep RDTrainerMac "$PLAYER_LOG"
卸载: curl -fsSL https://raw.githubusercontent.com/Cohenjikan/RhythmDoctorTrainer/refs/heads/main/uninstall.sh | bash
NOTE: 游戏更新或 Steam「验证文件完整性」会还原补丁 —— 重跑安装命令即可。
EOF