Skip to content

fix(profile): 启动时不再关掉在 CeleMod 之外启用的 Mod - #101

Open
std-external wants to merge 1 commit into
std-microblock:masterfrom
std-external:fix/profile-keeps-mods-enabled-outside-celemod
Open

std-external wants to merge 1 commit into
std-microblock:masterfrom
std-external:fix/profile-keeps-mods-enabled-outside-celemod

Conversation

@std-external

Copy link
Copy Markdown
Contributor

问题

玩家反馈:在游戏里启用某个 Mod(例:体力条显示)后关掉 CeleMod,再重新启动,这个 Mod 又被自动禁用了,需要每次手动再打开。

原因

预设模式下,reloadBlacklistState(主页/管理页加载时触发)会先 apply_mod_profiles,也就是把 blacklist.txt 按预设重建成白名单。Everest 只用 Mods/blacklist.txt 记录禁用项,游戏里的 Toggle Mods 菜单也只改这个文件。

selectAdoptableModNames 的收养逻辑原本只针对 CeleMod「没见过」的 Mod:CeleMod 见过的 Mod 如果是在游戏里被重新启用的,knownNames 会把它跳过,随后重建白名单时它就被写回禁用。所以「在游戏里启用过的已知 Mod」每次启动都会被关掉。

修改

  • selectAdoptableModNames 增加 allProfileEnabledNames(所有预设启用的 Mod 名),并把「Mod 是否新加入」和「Mod 当前是否被 blacklist.txt 加载」分开判断:
    • 当前仍被 blacklist.txt 加载、且没有任何预设启用它 → 这次启用来自 CeleMod 之外,按当前状态收养进正在应用的预设;
    • 有别的预设启用它 → 保持原行为,不收养,预设切换的语义不变;
    • alwaysOnMods、被 CeleMod 主动禁用的 Mod、同名重复文件的行为不变。
  • 「Mod 下载后默认行为」现在只决定新加入 Mod 的状态,不再连带影响这种外部启用(原实现是 !enableNewMods 直接整体返回空)。
  • 只改了前端收养逻辑,后端 apply_mod_blacklist_profiles 未动。

验证

src/modAdoption.test.ts 新增两条回归用例(旧实现下失败,修改后通过):

$ node --import tsx --test src/modAdoption.test.ts
✔ adopts a Mod that was copied into the Mods folder
✔ adopts a known Mod that was enabled outside CeleMod
✔ adopts a known Mod enabled outside CeleMod whatever the download default is
✔ keeps a known Mod another profile enables out of the adoption
✔ leaves new Mods disabled when the default says so
✔ does not adopt Mods that CeleMod disabled on purpose
✔ ignores always-on Mods and duplicate files
ℹ pass 7  ℹ fail 0

在修改前跑同一份用例,两条新用例失败(expected: ["Copied"] actual: [])。

pnpm typecheck 通过。pnpm lint 仍有 5 个与本 PR 无关的既有 TS6133 报错(catalogDownload.test.ts、SteamLaunchProgress.test.tsx、SteamSyncProgress.test.tsx、stores/download.ts、themePreview.tsx)。

备注

  • 未修复(也不打算改)的方向:在游戏里禁用 Mod、而预设启用它时,下次应用预设仍会把它重新启用——这是当前预设模式的既定行为(见 建议在打开程序时,自动从blacklist.txt同步最新的禁用列表 #34 的讨论)。本 PR 只处理「外部启用被白名单吞掉」。
  • 未能确认报告者卡在哪种组合(Mod 是否为 zip、是否在游戏内打的勾、CeleMod 版本),所以修复范围收在「任何在 CeleMod 之外被启用、且没有预设启用的 Mod」这一条上。

来源:Celeste 玩家交流群里的反馈。

预设模式在每次启动时都会把 blacklist.txt 重建成白名单。之前的修复只
收养 CeleMod「没见过」的 Mod,而 CeleMod 见过的 Mod 若是在游戏里的
Toggle Mods 菜单(或别的启动器)里被重新启用,下一次启动应用预设时
又会被关掉。

现在区分两种情况:当前 blacklist.txt 仍加载、且没有任何预设启用的
Mod,说明这次启用来自 CeleMod 之外,按当前状态收养进正在应用的预设;
若另一个预设本来就启用它,则保持预设切换的语义不变。「下载后默认
行为」只决定新加入的 Mod 的状态,不再影响这种外部启用。
@std-external
std-external force-pushed the fix/profile-keeps-mods-enabled-outside-celemod branch from 042034e to 3df6eca Compare October 31, 2026 11:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant