PyQt6 桌面工具:多帳號權杖管理、近零磁碟成本的同時多開、啟動前預先更新 (下載一次、多副本共用)、群組批次啟動(2×2 / 3×3)與併框嵌入。
一般使用者:執行 install.bat 安裝環境,之後雙擊 start.bat 啟動
(以 pythonw 啟動,主畫面執行期間背後不會有主控台視窗)。
開發:
cd C:\X-Legend\MultiLss
uv sync # 安裝相依(Python 3.14 + PyQt6 + httpx)
uv run python main.py # 開啟 GUI(無參數 = GUI)- 「帳號」→「建立空白副本」命名新帳號(或「匯入 .ini」帶入既有權杖)。
- 選取 →「▶ 啟動」:空白帳號會彈出遊戲登入框,登入成功後權杖自動保存, 之後啟動免再登入。已在執行中的帳號按啟動 = 直接聚焦視窗。
- 管理器啟動時會自動掃描並接管已在執行的遊戲(依副本資料夾歸屬), 不會重複啟動觸發遊戲的 single-instance 警告。
帳號權杖以 base64 存於 config.json —— 帶著一個 config.json 就能整包搬家
(舊版 accounts\*.ini 首次啟動會自動遷移進 config,原檔保留作備份)。
群組格位可留「未指定」,該格啟動後保持空白。
uv run python build.py # 產生 dist\(multilss 全為 .pyc、無原始碼)把 dist\ 整包給使用者,執行 install.bat(自動安裝 uv → uv sync 還原
Python 3.14 + PyQt6 環境),之後以 uv run python main.py 或程式內建立的
桌面捷徑啟動。後續更新只需重發 multilss\*.pyc(相依有變時加上 uv.lock)。
4. 「群組」把 4 或 9 個帳號指派到 2×2 / 3×3 格位 →「▶▶ 啟動群組」。
- 勾選「併框嵌入」= 四窗併成單一視窗;取消 = 平鋪獨立視窗。
- 已在執行的帳號會被「接管」直接嵌入(關群組不關遊戲 → 再開 = 秒回)。
- 每格右上角「彈出」可把該遊戲窗臨時變回獨立視窗(仍受管),按「收回」一鍵送回格位。
- 執行中的併框群組會鎖定:不能重複啟動同群組,也不能啟動與其共用帳號的其他群組。
視窗標題:單開 = 風之國度 - {帳號名};群組 = 風之國度 - {格號} {帳號名}
(前綴可在設定頁修改/停用;帳號可另設「視窗標題覆寫」)。
獨立運行(單開/還原/彈出)視窗大小可於設定頁選擇(預設 960×540)。
「遊戲更新」頁:「檢查更新(快速)」= 檢查+下載一鍵完成;「檢查更新(完整)」= 逐檔重算 磁碟 md5 再比對(慢,最嚴謹)。有副本執行中時 master 一律鎖定不可更新(強制保護)。
啟動時自動向 GitHub Releases 檢查新版(設定頁也有「檢查管理器更新」按鈕)。
發現新版會列出目前版本到最新版之間所有版本的更新說明(越新越上面);
確認後自動:下載發布包 → 關閉管理器(需先關閉所有遊戲)→ 覆蓋檔案 →
uv sync 更新環境 → 重新啟動。發布時把 dist\ 壓成 zip 附加到 GitHub Release
即可(無 zip 資產時退回下載原始碼 zipball)。暫存於 updates\。
uv run python main.py --only-update # 只更新 master,不啟動遊戲
uv run python main.py --account "帳號名" # 啟動單一帳號(--profile 為相容別名)
uv run python main.py --group "Test1" # 批次啟動群組
uv run python main.py --no-update ... # 跳過啟動前自動更新
uv run python main.py --restore-windows # 救援當機殘留的嵌入視窗
uv run python main.py --list # 列出帳號與群組GUI 的「建立桌面捷徑」會產生對應 --account / --group 的桌面 .lnk(以 venv 的
pythonw.exe 啟動,無主控台視窗)。
- 多開隔離:每個副本在
instances\下 materialize —— 大目錄(app_ab、Managed、 MonoBleedingEdge…)用 NTFS junction 共用 master,零散檔用 hardlink(皆免系統管理員)。 每副本「私有」的只有res\(帳號權杖)、Log\、patches\(hardlink 鏡像 + 私有cache_bundle_md5.txt台帳)與spb\。實測每副本獨有磁碟成本約 1 MB(整包 複製為 10.2 GB)。 - 私有台帳的必要性:遊戲每次啟動都會重寫台帳(即使 0 下載),且遊玩中會下載 DLC
寫入
patches\——共用會互搶,私有鏡像徹底解決。 - 預先更新:Python 複製遊戲原生 patcher 流程(bootstrap → cfg.json →
ab_cfg.json.zip → 逐 bundle md5 比對 → 下載 → 更新台帳),把差異下載進 master 的
patches\一次;各副本啟動前以 hardlink 差量重連(約 1 秒、不重新下載), 進遊戲時 patch-check 即為bundle 0:0 need to download!直接進遊戲。 - 併框:Win32
SetParent把遊戲窗重掛進容器視窗網格 + 去邊框,QTimer 保活 (Unity 會自行重設樣式),關閉時必還原;狀態檔支援當機救援 (技術重現自「新版遊戲框架」C++ 工具)。
uv run pytest tests -q # 核心單元測試(junction 安全刪除、台帳格式、diff、群組驗證)程式結構:multilss/core/(零 Qt、可 headless 測試)、multilss/gui/(PyQt6)、
multilss/cli.py。核心安全原則:刪除副本一律走 safe_remove_tree
(junction 不下探,絕不用 shutil.rmtree)。