<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Swakin</title><description>在次元中旅行的观光客</description><link>https://swakinx.github.io/</link><language>zh_CN</language><item><title>使用Gitee实现免费的软件更新服务</title><link>https://swakinx.github.io/posts/gitee-software-update/</link><guid isPermaLink="true">https://swakinx.github.io/posts/gitee-software-update/</guid><description>记录将Gitee用作软件自动更新的完整方案，包括GitHub Actions部署、版本控制、文件下载等实现细节</description><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在开发桌面应用时，软件更新是一个必不可少的功能。本文记录了一套将 Gitee 作为软件更新服务的完整方案，利用 GitHub Actions 实现自动部署，通过 Gitee API 实现版本检测和文件下载。
:::warning
&lt;code&gt;本文只提供思路，代码均由AI生成，仅供参考。&lt;/code&gt;
:::&lt;/p&gt;
&lt;h2&gt;整体架构&lt;/h2&gt;
&lt;p&gt;整个更新流程分为三个主要部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GitHub Actions 构建部署&lt;/strong&gt;：编译项目，将产物上传到专门的文件仓库，并创建对应版本的 release&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gitee 仓库同步&lt;/strong&gt;：同步文件仓库到 Gitee，利用标签来追踪版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;客户端更新检测&lt;/strong&gt;：通过 Gitee API 获取最新版本信息，对比本地版本，下载并安装更新&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;GitHub 源码仓库
    |
    v
GitHub Actions (编译)
    |
    v
GitHub 文件仓库 (release)
    |
    v
Gitee 文件仓库 (同步)
    |
    v
客户端检测更新 → 下载 → 安装
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;GitHub Actions 配置&lt;/h2&gt;
&lt;p&gt;首先需要在 GitHub 上创建一个专门用于存放编译产物的仓库（如 &lt;code&gt;my-app-releases&lt;/code&gt;），然后在源码仓库配置 Actions 工作流。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Deploy Release

on:
  push:
    tags:
      - &apos;v*&apos;

jobs:
  build:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: &apos;3.12&apos;

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Build application
        run: python build.py

      - name: Upload to release repo
        uses: EndBug/add-and-commit@v9
        with:
          args: &apos;-m &quot;chore: release ${{ github.ref_name }}&quot;&apos;
          add: &apos;dist/my-app-v${{ github.ref_name }}.7z&apos;
          cwd: &apos;../my-app-releases&apos;

      - name: Create tag
        uses: mathieudutour/github-tag-action@v6.1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          tag: ${{ github.ref_name }}
          repo: username/my-app-releases
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键要点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件名必须包含版本号，如 &lt;code&gt;my-app-v1.0.0.7z&lt;/code&gt;，方便客户端匹配&lt;/li&gt;
&lt;li&gt;使用 7z 压缩可以显著减小文件体积&lt;/li&gt;
&lt;li&gt;通过 tag 触发部署，确保版本号与 tag 一致&lt;/li&gt;
&lt;li&gt;文件直接上传到仓库而非 release，这样 Gitee 同步时可以包含文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;仓库清理机制&lt;/h2&gt;
&lt;p&gt;Gitee 仓库有大小限制，随着版本迭代，编译文件会不断累积，导致仓库体积过大。因此需要在文件仓库中配置一个清理 Actions，定期清理旧版本文件，只保留最新的几个版本。&lt;/p&gt;
&lt;h3&gt;清理策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;触发条件&lt;/strong&gt;：当仓库中的文件数量超过 1 个时触发清理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清理方式&lt;/strong&gt;：只保留最新的 1 个版本文件和对应的 tag，删除所有旧版本文件和 tag&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实现方式&lt;/strong&gt;：新建 git 仓库，只保留需要的文件，然后强制覆盖远程仓库&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;清理 Actions 配置&lt;/h3&gt;
&lt;p&gt;在文件仓库（&lt;code&gt;my-app-releases&lt;/code&gt;）中创建清理工作流：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Cleanup Old Releases

on:
  push:
    branches:
      - main

jobs:
  cleanup:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: List files
        id: list_files
        run: |
          files=$(ls *.7z 2&amp;gt;/dev/null | wc -l)
          echo &quot;file_count=$files&quot; &amp;gt;&amp;gt; &quot;$GITHUB_OUTPUT&quot;

      - name: Cleanup if needed
        if: steps.list_files.outputs.file_count &amp;gt; 1
        run: |
          git checkout --orphan new_main
          git rm -rf .
          
          latest_file=$(ls *.7z 2&amp;gt;/dev/null | sort -V | tail -1)
          git add &quot;$latest_file&quot;
          
          git commit -m &quot;Cleanup: keep only latest version&quot;
          git push origin new_main --force
          
          for tag in $(git tag -l); do
            file=&quot;my-app-${tag}.7z&quot;
            if [ ! -f &quot;$file&quot; ]; then
              git push origin :refs/tags/&quot;$tag&quot;
              git tag -d &quot;$tag&quot;
            fi
          done

      - name: Reset main branch
        if: steps.list_files.outputs.file_count &amp;gt; 1
        run: |
          git checkout main
          git reset --hard new_main
          git push origin main --force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;清理流程详解：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;统计文件数量&lt;/strong&gt;：检查仓库中 &lt;code&gt;.7z&lt;/code&gt; 文件的数量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建新分支&lt;/strong&gt;：使用 &lt;code&gt;git checkout --orphan&lt;/code&gt; 创建一个没有历史记录的新分支&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清空文件&lt;/strong&gt;：删除所有文件，只保留最新的 1 个版本文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提交并强推&lt;/strong&gt;：提交新分支并强制推送到远程仓库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清理旧标签&lt;/strong&gt;：删除那些没有对应文件的旧标签&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重置主分支&lt;/strong&gt;：将主分支重置到新分支并强制推送&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;--force&lt;/code&gt; 参数会强制覆盖远程仓库，确保清理生效&lt;/li&gt;
&lt;li&gt;只删除没有对应文件的标签，保留与最新版本对应的标签&lt;/li&gt;
&lt;li&gt;Gitee 同步会自动同步清理后的仓库状态，但需要注意同步延迟&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;文件大小优化&lt;/h2&gt;
&lt;p&gt;Gitee 的仓库文件和 release 都限制 100MB，因此需要对编译产物进行大小优化：&lt;/p&gt;
&lt;h3&gt;编译时排除不必要的导入&lt;/h3&gt;
&lt;p&gt;在编译前分析项目依赖，只导入实际使用的模块，避免打包未使用的库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import sys
import os
from pathlib import Path

def analyze_imports(source_dir):
    used_modules = set()
    
    for py_file in Path(source_dir).rglob(&apos;*.py&apos;):
        with open(py_file, &apos;r&apos;, encoding=&apos;utf-8&apos;) as f:
            content = f.read()
            for line in content.split(&apos;\n&apos;):
                if line.startswith(&apos;import &apos;) or line.startswith(&apos;from &apos;):
                    parts = line.split()
                    if len(parts) &amp;gt;= 2:
                        module = parts[1].split(&apos;.&apos;)[0]
                        used_modules.add(module)
    
    return used_modules

def filter_requirements(requirements_path, used_modules):
    with open(requirements_path, &apos;r&apos;) as f:
        lines = f.readlines()
    
    filtered = []
    for line in lines:
        line = line.strip()
        if not line or line.startswith(&apos;#&apos;):
            filtered.append(line)
            continue
        
        pkg_name = line.split(&apos;=&apos;)[0].split(&apos;&amp;gt;&apos;)[0].split(&apos;&amp;lt;&apos;)[0].strip()
        if pkg_name.lower() in [m.lower() for m in used_modules]:
            filtered.append(line)
    
    with open(requirements_path, &apos;w&apos;) as f:
        f.write(&apos;\n&apos;.join(filtered) + &apos;\n&apos;)

if __name__ == &apos;__main__&apos;:
    used_modules = analyze_imports(&apos;src&apos;)
    filter_requirements(&apos;requirements.txt&apos;, used_modules)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 这种方式需要谨慎使用，因为有些模块可能是动态导入的，分析工具无法检测到。建议在测试环境中验证后再使用。&lt;/p&gt;
&lt;h3&gt;编译后清理不必要的运行库文件&lt;/h3&gt;
&lt;p&gt;以 PyInstaller 为例，可以通过配置文件排除不必要的运行库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;block_cipher = None

a = Analysis(
    [&apos;main.py&apos;],
    pathex=[&apos;src&apos;],
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[
        &apos;tkinter&apos;,
        &apos;matplotlib&apos;,
        &apos;numpy&apos;,
        &apos;scipy&apos;,
        &apos;pandas&apos;,
        &apos;PyQt5.QtWebEngine&apos;,
        &apos;PyQt5.QtWebKit&apos;,
    ],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name=&apos;my-app&apos;,
    debug=False,
    bootloader_ignore_signals=False,
    strip=True,
    upx=True,
    console=False,
)

coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=True,
    upx=True,
    upx_exclude=[],
    name=&apos;my-app&apos;,
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键优化项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;excludes&lt;/code&gt;：排除不需要的模块，如 &lt;code&gt;tkinter&lt;/code&gt;、&lt;code&gt;matplotlib&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;strip=True&lt;/code&gt;：去除二进制文件中的符号表，减小体积&lt;/li&gt;
&lt;li&gt;&lt;code&gt;upx=True&lt;/code&gt;：使用 UPX 压缩可执行文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;清理运行库文件&lt;/h3&gt;
&lt;p&gt;编译完成后，可以手动清理一些不必要的文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import os
import shutil

def cleanup_dist(dist_dir):
    remove_patterns = [
        &apos;*.pdb&apos;,
        &apos;*.pyc&apos;,
        &apos;*.pyo&apos;,
        &apos;__pycache__&apos;,
        &apos;*.dll&apos;,
        &apos;*.so&apos;,
    ]
    
    for root, dirs, files in os.walk(dist_dir):
        for file in files:
            file_path = os.path.join(root, file)
            for pattern in remove_patterns:
                if file.endswith(pattern.strip(&apos;*&apos;)):
                    os.remove(file_path)
                    break
        
        for dir_name in dirs:
            if dir_name == &apos;__pycache__&apos;:
                dir_path = os.path.join(root, dir_name)
                shutil.rmtree(dir_path)

if __name__ == &apos;__main__&apos;:
    cleanup_dist(&apos;dist/my-app&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 需要根据实际使用的库来决定删除哪些文件，避免删除程序运行必需的 DLL 或 SO 文件。&lt;/p&gt;
&lt;h3&gt;压缩为 7z 文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import subprocess
import os

def compress_with_7z(source_dir, output_path):
    cmd = [
        &apos;7z&apos;, &apos;a&apos;, &apos;-t7z&apos;, &apos;-mx=9&apos;, &apos;-mfb=64&apos;, &apos;-md=32m&apos;, &apos;-ms=on&apos;,
        output_path, source_dir
    ]
    subprocess.run(cmd, check=True)

if __name__ == &apos;__main__&apos;:
    compress_with_7z(&apos;dist/app&apos;, &apos;dist/my-app-v1.0.0.7z&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;分离资源文件&lt;/h3&gt;
&lt;p&gt;将资源文件（如图片、配置文件等）放到单独的 Gitee 仓库，在软件启动时检查资源更新：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import requests
import hashlib
import os

RESOURCE_REPO = &quot;https://gitee.com/username/my-app-resources/raw/main/&quot;

def check_resource_update(local_path, resource_name):
    remote_url = f&quot;{RESOURCE_REPO}{resource_name}&quot;
  
    local_hash = md5_file(local_path)
    remote_hash = get_remote_file_hash(remote_url)
  
    if local_hash != remote_hash:
        download_resource(remote_url, local_path)

def md5_file(file_path):
    md5 = hashlib.md5()
    with open(file_path, &apos;rb&apos;) as f:
        for chunk in iter(lambda: f.read(8192), b&apos;&apos;):
            md5.update(chunk)
    return md5.hexdigest()

def get_remote_file_hash(url):
    response = requests.head(url)
    return response.headers.get(&apos;ETag&apos;, &apos;&apos;).strip(&apos;&quot;&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种方式还可以实现资源的增量更新，只下载变化的文件。&lt;/p&gt;
&lt;h2&gt;Gitee 仓库同步&lt;/h2&gt;
&lt;p&gt;在 Gitee 上创建一个与 GitHub 文件仓库同名的仓库，然后配置同步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 Gitee 仓库设置中找到「仓库同步」&lt;/li&gt;
&lt;li&gt;添加 GitHub 仓库地址和访问 token&lt;/li&gt;
&lt;li&gt;设置同步方向为「从 GitHub 同步到 Gitee」&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gitee 的同步功能&lt;strong&gt;不会同步 release&lt;/strong&gt;，只会同步代码和标签（tag）&lt;/li&gt;
&lt;li&gt;需要通过添加或删除 release 来控制版本更新的发布时机&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动同步 API 可能已关闭&lt;/strong&gt;：目前 Gitee 的自动同步功能疑似出现问题，可能无法自动触发同步，需要手动到仓库页面点击「同步」按钮&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;独立更新程序设计&lt;/h2&gt;
&lt;p&gt;建议将更新功能独立编写为一个单独的程序（如 &lt;code&gt;updater.exe&lt;/code&gt;），由主程序调用执行更新。这样可以避免在更新过程中文件被占用，同时也便于维护和调试。&lt;/p&gt;
&lt;h3&gt;更新程序架构&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;主程序 (main.exe)
    |
    v
检查更新 → 发现新版本 → 启动更新程序 (updater.exe) → 退出主程序
                                    |
                                    v
                            下载更新文件 → 解压 → 替换文件 → 重启主程序
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;版本检测（使用 Gitee API + 私钥）&lt;/h3&gt;
&lt;p&gt;Gitee API 调用需要使用私钥（access_token）进行身份验证，且有调用频率限制。对于小文件（如版本信息）可以直接用 raw URL 获取，大文件下载需要使用 API：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import requests
import re
import time

class GiteeUpdater:
    def __init__(self, repo_owner, repo_name, access_token=None):
        self.repo_owner = repo_owner
        self.repo_name = repo_name
        self.api_base = &quot;https://gitee.com/api/v5&quot;
        self.access_token = access_token
        self.headers = {}
        if access_token:
            self.headers[&apos;Authorization&apos;] = f&quot;token {access_token}&quot;
    
    def _make_request(self, url, method=&apos;GET&apos;, **kwargs):
        max_retries = 3
        retry_delay = 5
        
        for attempt in range(max_retries):
            try:
                response = requests.request(method, url, headers=self.headers, **kwargs)
                if response.status_code == 429:
                    wait_time = int(response.headers.get(&apos;Retry-After&apos;, retry_delay))
                    time.sleep(wait_time)
                    continue
                response.raise_for_status()
                return response.json()
            except requests.exceptions.RequestException as e:
                if attempt &amp;lt; max_retries - 1:
                    time.sleep(retry_delay * (attempt + 1))
                    continue
                raise
    
    def get_latest_version(self):
        url = f&quot;{self.api_base}/repos/{self.repo_owner}/{self.repo_name}/tags&quot;
        tags = self._make_request(url)
        
        if not tags:
            return None
        
        version_pattern = re.compile(r&apos;^v(\d+\.\d+\.\d+)$&apos;)
        versions = []
        
        for tag in tags:
            match = version_pattern.match(tag[&apos;name&apos;])
            if match:
                versions.append((tag[&apos;name&apos;], match.group(1)))
        
        if not versions:
            return None
        
        versions.sort(key=lambda x: tuple(map(int, x[1].split(&apos;.&apos;))), reverse=True)
        return versions[0][0]
    
    def compare_versions(self, current_version, latest_version):
        current = tuple(map(int, current_version.lstrip(&apos;v&apos;).split(&apos;.&apos;)))
        latest = tuple(map(int, latest_version.lstrip(&apos;v&apos;).split(&apos;.&apos;)))
        return latest &amp;gt; current
    
    def get_file_download_url(self, version, filename):
        url = f&quot;{self.api_base}/repos/{self.repo_owner}/{self.repo_name}/contents/{filename}&quot;
        params = {&apos;ref&apos;: version}
        data = self._make_request(url, params=params)
        
        if isinstance(data, dict) and &apos;download_url&apos; in data:
            return data[&apos;download_url&apos;]
        return None
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;API 安全注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;私钥管理&lt;/strong&gt;：不要将 &lt;code&gt;access_token&lt;/code&gt; 硬编码在代码中，建议通过配置文件或环境变量传入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调用限制&lt;/strong&gt;：Gitee API 有调用频率限制（普通用户每小时 60 次），需要实现重试机制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限范围&lt;/strong&gt;：创建 access_token 时只授予必要的权限（如 &lt;code&gt;projects:read&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;文件下载与安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import shutil
import tempfile
import subprocess
import sys

def download_and_install(self, version):
    filename = f&quot;my-app-{version}.7z&quot;
    download_url = self.get_file_download_url(version, filename)
    
    if not download_url:
        raise Exception(f&quot;无法获取文件下载链接: {filename}&quot;)
    
    with tempfile.TemporaryDirectory() as temp_dir:
        download_path = os.path.join(temp_dir, filename)
        self.download_file(download_url, download_path)
        self.extract_7z(download_path, temp_dir)
        self.install_update(temp_dir)

def download_file(self, url, save_path):
    max_retries = 3
    retry_delay = 10
    
    for attempt in range(max_retries):
        try:
            response = requests.get(url, headers=self.headers, stream=True)
            if response.status_code == 429:
                wait_time = int(response.headers.get(&apos;Retry-After&apos;, retry_delay))
                time.sleep(wait_time)
                continue
            response.raise_for_status()
            
            with open(save_path, &apos;wb&apos;) as f:
                for chunk in response.iter_content(chunk_size=8192):
                    f.write(chunk)
            return
        except requests.exceptions.RequestException as e:
            if attempt &amp;lt; max_retries - 1:
                time.sleep(retry_delay * (attempt + 1))
                continue
            raise

def extract_7z(self, file_path, dest_dir):
    import py7zr
    with py7zr.SevenZipFile(file_path, mode=&apos;r&apos;) as z:
        z.extractall(dest_dir)

def install_update(self, source_dir):
    app_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
    
    for item in os.listdir(source_dir):
        s = os.path.join(source_dir, item)
        d = os.path.join(app_dir, item)
        
        if os.path.isdir(s):
            if os.path.exists(d):
                shutil.rmtree(d)
            shutil.move(s, d)
        else:
            if os.path.exists(d):
                os.remove(d)
            shutil.move(s, d)

def restart_app(self):
    app_path = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), &apos;main.exe&apos;)
    subprocess.Popen([app_path])

if __name__ == &apos;__main__&apos;:
    updater = GiteeUpdater(
        repo_owner=&quot;username&quot;,
        repo_name=&quot;my-app-releases&quot;,
        access_token=&quot;your-access-token&quot;
    )
    
    current_version = &quot;v1.0.0&quot;
    latest_version = updater.get_latest_version()
    
    if updater.compare_versions(current_version, latest_version):
        updater.download_and_install(latest_version)
        updater.restart_app()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;主程序调用更新程序&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import subprocess
import sys
import os

def check_and_update():
    updater_path = os.path.join(os.path.dirname(sys.argv[0]), &apos;updater.exe&apos;)
    
    if os.path.exists(updater_path):
        subprocess.Popen([updater_path])
        sys.exit(0)

if __name__ == &apos;__main__&apos;:
    check_and_update()
    run_main_app()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;调用流程：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;主程序启动时检测更新程序是否存在&lt;/li&gt;
&lt;li&gt;如果存在，启动更新程序并退出自身&lt;/li&gt;
&lt;li&gt;更新程序完成更新后重启主程序&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Raw URL vs API 下载&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;优点&lt;/th&gt;
&lt;th&gt;缺点&lt;/th&gt;
&lt;th&gt;适用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Raw URL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;无需认证，简单直接&lt;/td&gt;
&lt;td&gt;有下载限制，大文件可能失败&lt;/td&gt;
&lt;td&gt;小文件（如版本信息）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API 下载&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;稳定可靠，支持大文件&lt;/td&gt;
&lt;td&gt;需要认证，有调用限制&lt;/td&gt;
&lt;td&gt;大文件（如更新包）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;建议策略：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 raw URL 获取版本信息（小文件，无需认证）&lt;/li&gt;
&lt;li&gt;使用 API 下载更新包（大文件，需要认证）&lt;/li&gt;
&lt;li&gt;实现重试机制和限流处理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;为什么这样设计&lt;/h2&gt;
&lt;h3&gt;核心设计理由：文件走仓库，版本走 release&lt;/h3&gt;
&lt;p&gt;这是整个方案的核心思路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文件存储&lt;/strong&gt;：编译后的文件直接上传到 GitHub 文件仓库，通过 Gitee 同步功能同步到 Gitee 仓库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件下载&lt;/strong&gt;：通过 Gitee API 获取文件下载链接进行下载（需使用 access_token 认证）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本控制&lt;/strong&gt;：通过 Gitee release 和标签（tag）来标记和检测版本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;为什么这样设计：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;上传文件到仓库容易&lt;/strong&gt;：通过 GitHub Actions 将文件推送到 GitHub 文件仓库，再通过 Gitee 同步功能自动同步到 Gitee，无需手动操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下载不限速&lt;/strong&gt;：通过 Gitee API 获取文件下载链接进行下载，下载速度稳定，不受 release 限速影响&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取下载链接容易&lt;/strong&gt;：通过 Gitee API &lt;code&gt;/repos/{owner}/{repo}/contents/{filename}&lt;/code&gt; 可以直接获取文件下载链接，只需一次 API 调用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同步不包含 release&lt;/strong&gt;：Gitee 的仓库同步功能只同步代码和标签（tag），不会同步 release。因此文件必须放在仓库中才能被同步&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大文件不支持 raw 下载&lt;/strong&gt;：Gitee 的 raw URL 对大文件有限制，无法直接下载几十兆的文件，必须通过 API 获取下载链接&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;为什么不直接在 Actions 上传文件到 Gitee&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;上传速度慢&lt;/strong&gt;：GitHub Actions 的网络环境上传文件到 Gitee 非常慢，几十兆的文件可能需要半小时甚至更久&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gitee Release 限速&lt;/strong&gt;：通过 API 上传文件到 Gitee release 有严格的限速限制&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;为什么选择 Gitee&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;国内访问快&lt;/strong&gt;：对于国内用户来说，Gitee 的下载速度远快于 GitHub&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API 稳定&lt;/strong&gt;：Gitee API 响应稳定，适合作为客户端更新服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;免费额度高&lt;/strong&gt;：免费仓库有足够的空间存放编译产物&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仓库同步功能&lt;/strong&gt;：Gitee 提供了从 GitHub 同步仓库的功能，可以自动同步代码和标签&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;使用流程总结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;开发阶段&lt;/strong&gt;：在 GitHub 源码仓库开发，提交代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发布版本&lt;/strong&gt;：创建新的 tag（如 &lt;code&gt;v1.0.0&lt;/code&gt;），触发 GitHub Actions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建部署&lt;/strong&gt;：Actions 编译项目，压缩文件，上传到文件仓库的 release&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动同步&lt;/strong&gt;：Gitee 自动同步文件仓库的代码和标签&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建 Release&lt;/strong&gt;：在 Gitee 文件仓库手动或通过 API 创建对应版本的 release&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;客户端检测&lt;/strong&gt;：软件启动时调用 Gitee API 获取最新版本，对比本地版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下载更新&lt;/strong&gt;：检测到更新后下载文件，解压并替换现有文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完成更新&lt;/strong&gt;：重启软件完成更新&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这套方案充分利用了 GitHub Actions 的构建能力和 Gitee 的国内访问优势，实现了一套完整的软件自动更新流程。&lt;/p&gt;
</content:encoded></item><item><title>Nuitka Windows 管理员终端编译问题</title><link>https://swakinx.github.io/posts/nuitka-compilation-issue/</link><guid isPermaLink="true">https://swakinx.github.io/posts/nuitka-compilation-issue/</guid><description>解决 Nuitka 在 Windows 管理员终端下编译时出现的竞态条件问题</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题描述&lt;/h2&gt;
&lt;p&gt;在 Windows 系统上使用 Nuitka 编译 Python 程序时，发现以下差异行为：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;终端类型&lt;/th&gt;
&lt;th&gt;现象&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;管理员终端&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;多线程编译时出现 &lt;code&gt;.obj&lt;/code&gt; 文件访问错误，需要限制 &lt;code&gt;--jobs=4&lt;/code&gt; 才能成功&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;非管理员终端&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;无需限制线程数即可正常编译&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;根本原因&lt;/h2&gt;
&lt;p&gt;这是 Nuitka 在 Windows 上的一个&lt;strong&gt;已知竞态条件问题&lt;/strong&gt;，涉及以下因素：&lt;/p&gt;
&lt;h3&gt;1. clcache 竞态条件&lt;/h3&gt;
&lt;p&gt;Nuitka 内嵌的 &lt;code&gt;clcache&lt;/code&gt; (MSVC 编译缓存) 与 C 编译器之间存在文件访问竞争：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;线程 A 正在写入 &lt;code&gt;.obj&lt;/code&gt; 文件到缓存&lt;/li&gt;
&lt;li&gt;线程 B 尝试读取/访问同一文件&lt;/li&gt;
&lt;li&gt;导致 &quot;access denied&quot; 或 &quot;file not found&quot; 错误&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Windows Defender 实时保护&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;管理员权限&lt;/strong&gt;：防病毒软件进行更深入的扫描，延长文件锁定时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非管理员权限&lt;/strong&gt;：扫描强度较低，文件锁竞争减少&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 文件系统行为差异&lt;/h3&gt;
&lt;p&gt;管理员模式下 Windows 强制同步文件写入（FlushFileBuffers），增加了竞争窗口。&lt;/p&gt;
&lt;h2&gt;相关 GitHub Issues&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;#1591&lt;/td&gt;
&lt;td&gt;Windows: Random &quot;access denied&quot; on clcache objects in Scons&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Nuitka/Nuitka/issues/1591&quot;&gt;查看&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#2832&lt;/td&gt;
&lt;td&gt;FileExistsError when running multiple builds in parallel&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Nuitka/Nuitka/issues/2832&quot;&gt;查看&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#2950&lt;/td&gt;
&lt;td&gt;FATAL: Failed unexpectedly in Scons C backend compilation&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Nuitka/Nuitka/issues/2950&quot;&gt;查看&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#2823&lt;/td&gt;
&lt;td&gt;Windows Defender 锁定文件导致资源添加失败&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Nuitka/Nuitka/issues/2823&quot;&gt;查看&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;h3&gt;方案 1：限制并行任务数&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;python -m nuitka --jobs=4 your_script.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;方案 2：禁用 LTO（减少文件 I/O）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;python -m nuitka --lto=no your_script.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;方案 3：添加防病毒排除项（推荐）&lt;/h3&gt;
&lt;p&gt;将以下目录添加到 Windows Defender 排除列表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;%LOCALAPPDATA%\Nuitka&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;项目构建目录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell 命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 添加 Nuitka 缓存目录到排除项
Add-MpPreference -ExclusionPath &quot;$env:LOCALAPPDATA\Nuitka&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;环境信息&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;版本/说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nuitka&lt;/td&gt;
&lt;td&gt;4.0.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模式&lt;/td&gt;
&lt;td&gt;standalone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;操作系统&lt;/td&gt;
&lt;td&gt;Windows 10/11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;编译器&lt;/td&gt;
&lt;td&gt;MSVC (cl.exe)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nuitka.net/user-documentation/tips.html&quot;&gt;Nuitka 官方文档 - Tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Nuitka/Nuitka/issues&quot;&gt;Nuitka GitHub Issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>PySide PyQt多语言国际化翻译工作流以及相关问题</title><link>https://swakinx.github.io/posts/pyqt-translation-workflow/</link><guid isPermaLink="true">https://swakinx.github.io/posts/pyqt-translation-workflow/</guid><description>PySide PyQt使用tr()方法的一些注意事项和一个多语言国际化翻译工作流分享</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正确标记文本&lt;/h1&gt;
&lt;p&gt;这里默认你已经了解了国际化的流程和工具，具体可以&lt;a href=&quot;https://www.hawu.me/dev/3417&quot;&gt;参考&lt;/a&gt;，&lt;a href=&quot;https://runebook.dev/zh/docs/qt/qcoreapplication/translate&quot;&gt;C++版&lt;/a&gt;更底层的解释&lt;/p&gt;
&lt;h2&gt;使用.tr()&lt;/h2&gt;
&lt;p&gt;只要是使用.tr()标记的文本不管.tr()在这里能否直接访问，都会被&lt;code&gt;pyside6-lupdate&lt;/code&gt;工具（PyQt5是&lt;code&gt;pylupdate5&lt;/code&gt;）添加到.ts文件。&lt;/p&gt;
&lt;p&gt;对于类本身就继承自&lt;code&gt;QObject&lt;/code&gt;的（QT组件都是），可以直接使用&lt;code&gt;self.tr()&lt;/code&gt;标记文本，对于类没有继承&lt;code&gt;QObject&lt;/code&gt;的，使用别的继承了&lt;code&gt;QObject&lt;/code&gt;的对象调用.tr()虽然可以正常标记文本，但想要不修改文件.ts直接使用就必须让类继承&lt;code&gt;QObject&lt;/code&gt;然后调用&lt;code&gt;self.tr()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;因为生成的.ts里&lt;code&gt;context&lt;/code&gt;名称默认为类名，使用其他对象或类的.tr()方法都不能正确处理&lt;code&gt;context&lt;/code&gt;名称，要自己去修改成正确的名称才能正常生效非常麻烦。直接使用&lt;code&gt;QObject.tr()&lt;/code&gt;或&lt;code&gt;QCoreApplication.tr()&lt;/code&gt;都是不行的，这时&lt;code&gt;context&lt;/code&gt;名称直接为空，无法对应上。&lt;/p&gt;
&lt;h2&gt;使用QCoreApplication.translate()&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;QApplication.translate(context: str, sourceText: str, disambiguation: str = None, n: int = -1) -&amp;gt; str
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;context&lt;/td&gt;
&lt;td&gt;上下文名称，通常用类名（如 &apos;InfoBar&apos; ），用于区分不同模块中相同的源文本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sourceText&lt;/td&gt;
&lt;td&gt;要翻译的源文本（如 &apos;提示&apos; ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;disambiguation&lt;/td&gt;
&lt;td&gt;（可选）消歧字符串，当同一上下文中有相同源文本但不同含义时使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;（可选）用于处理复数形式， -1 表示不使用复数&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对于无法直接调用或继承QObject的情况，直接使用&lt;code&gt;QApplication.translate()&lt;/code&gt;，一般只需要传入前两项参数，虽然这样很长，但不要改写名称例如&lt;code&gt;tr=QApplication.translate&lt;/code&gt;或封装方法后使用，这样&lt;code&gt;pyside6-lupdate&lt;/code&gt;工具要么会错误理解内容要么无法识别到标记文本。&lt;/p&gt;
&lt;h2&gt;使用自定义的翻译器管理&lt;/h2&gt;
&lt;p&gt;如果不想每次都使用一长串来标记，可以放弃qt的自动托管，使用自定的翻译管理类。思路就是在需要标记的地方实例化一个&lt;code&gt;QObject&lt;/code&gt;对象，然后调用.tr()进行标记，这样&lt;code&gt;pyside6-lupdate&lt;/code&gt;工具会将对象名作为&lt;code&gt;context&lt;/code&gt;名称，需要使用对应文本时可以通过&lt;code&gt;context&lt;/code&gt;名称和原始文本从 qm 文件返回翻译文本。这里只提供简单的思路，我还未在自己的项目中实现。&lt;/p&gt;
&lt;p&gt;对于要在界面中显示的选项等配置文本，可以单独创建一个类继承自&lt;code&gt;QObject&lt;/code&gt;，单独将所有要使用的文本标记，同样在需要使用对应文本时可以通过&lt;code&gt;context&lt;/code&gt;名称和原始文本从 qm 文件返回翻译文本。在配置变更时也可以获取原始文本来写入配置。&lt;/p&gt;
&lt;h1&gt;翻译工作流说明&lt;/h1&gt;
&lt;h2&gt;翻译管理脚本&lt;/h2&gt;
&lt;p&gt;让AI写一个脚本例如 &lt;code&gt;update_i18n.py&lt;/code&gt;，具备以下功能，主要根据项目文件创建.ts文件、将.ts文件中要翻译的文本到处为JSON，将JSON文件扔给免费AI补全翻译文本，再用脚本将翻译好的内容应用到.ts文件中，最后编译成.qm文件。&lt;/p&gt;
&lt;p&gt;为什么不直接让AI翻译.ts文件，因为文件结构特殊，AI也是要先提取文本翻译了再生成文件的，这样效率低而且很容易漏掉某些文本，不如直接给结构化的文本，AI直接一对一自动翻译，校对翻译内容时直接看JSON文件也更方便，当然不用JSON，用表格也是可以的。&lt;/p&gt;
&lt;h3&gt;命令说明&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 初始化创建 .ts 文件
python devTools/update_i18n.py --init

# 更新翻译源文件
python devTools/update_i18n.py --update

# 导出待翻译文本到 JSON
python devTools/update_i18n.py --export

# 导出所有翻译（包括已完成的）
python devTools/update_i18n.py --export-all

# 从 JSON 文件读取翻译并应用到 .ts
python devTools/update_i18n.py --apply

# 编译翻译文件
python devTools/update_i18n.py --release

# 执行完整工作流（更新 + 编译）
python devTools/update_i18n.py --all

# 查看帮助
python devTools/update_i18n.py --help
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;标准翻译工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 1. 更新翻译源文件
python devTools/update_i18n.py --update

# 2. 导出所有翻译到 JSON 以便编辑
python devTools/update_i18n.py --export-all

# 3. 编辑 translations.json，添加/修改翻译

# 4. 应用翻译到 .ts 文件
python devTools/update_i18n.py --apply

# 5. 编译为 .qm 文件
python devTools/update_i18n.py --release
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;仅添加新翻译的工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 1. 更新翻译源文件
python devTools/update_i18n.py --update

# 2. 只导出未完成的翻译
python devTools/update_i18n.py --export

# 3. 在 translations.json 中为未完成的条目添加翻译

# 4. 应用翻译
python devTools/update_i18n.py --apply

# 5. 编译
python devTools/update_i18n.py --release
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;参数详解&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;别名&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;--init&lt;/td&gt;
&lt;td&gt;-i&lt;/td&gt;
&lt;td&gt;初始化创建 .ts 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--update&lt;/td&gt;
&lt;td&gt;-u&lt;/td&gt;
&lt;td&gt;从 Python/UI 代码提取可翻译字符串，更新 .ts 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--release&lt;/td&gt;
&lt;td&gt;-r&lt;/td&gt;
&lt;td&gt;将 .ts 编译为二进制 .qm 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--all&lt;/td&gt;
&lt;td&gt;-a&lt;/td&gt;
&lt;td&gt;同时执行 --update 和 --release（默认行为）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--export&lt;/td&gt;
&lt;td&gt;-e&lt;/td&gt;
&lt;td&gt;导出未完成的翻译条目到 JSON（直接覆盖）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--export-all&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;导出所有翻译条目到 JSON（直接覆盖）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--apply&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;从 translations.json 读取翻译并更新 .ts 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--help&lt;/td&gt;
&lt;td&gt;-h&lt;/td&gt;
&lt;td&gt;显示帮助信息&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;translations.json 文件格式&lt;/h2&gt;
&lt;p&gt;新的 JSON 格式是一条文本对应多个语言版本，更加直观：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[
  {
    &quot;source&quot;: &quot;源文本（可选）&quot;,
    &quot;comment&quot;: &quot;注释文本（用于匹配，优先）&quot;,
    &quot;zh_CN&quot;: &quot;简体中文翻译&quot;,
    &quot;zh_TW&quot;: &quot;繁体中文翻译&quot;,
    &quot;en_US&quot;: &quot;英文翻译&quot;,
    &quot;ja_JP&quot;: &quot;日文翻译&quot;
  },
  {
    &quot;comment&quot;: &quot;警告&quot;,
    &quot;zh_CN&quot;: &quot;警告&quot;,
    &quot;en_US&quot;: &quot;Warning&quot;
  }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;格式说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: 原始文本（可选，用于匹配）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;comment&lt;/strong&gt;: 注释文本（可选，用于匹配，优先级高于 source）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zh_CN&lt;/strong&gt;, &lt;strong&gt;zh_TW&lt;/strong&gt;, &lt;strong&gt;en_US&lt;/strong&gt;, &lt;strong&gt;ja_JP&lt;/strong&gt;: 各语言的翻译内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;匹配规则：先匹配 comment，没有则匹配 source。&lt;/p&gt;
</content:encoded></item><item><title>PySide6 QToolButton 字体Bug：setPixelSize在6.10.1+版本中的问题</title><link>https://swakinx.github.io/posts/pyside6-qtoolbutton-font-bug/</link><guid isPermaLink="true">https://swakinx.github.io/posts/pyside6-qtoolbutton-font-bug/</guid><description>详细分析PySide6 6.10.1+版本中QToolButton使用setPixelSize或样式表font-size时出现的字体错误，提供完整的复现代码和解决方案</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;PySide6 QToolButton 字体Bug分析&lt;/h1&gt;
&lt;h2&gt;问题描述&lt;/h2&gt;
&lt;p&gt;在PySide6 6.10.1+版本中，当&lt;code&gt;QToolButton&lt;/code&gt;使用&lt;code&gt;QFont.setPixelSize&lt;/code&gt;方法设置字体或在样式表中包含&lt;code&gt;font-size&lt;/code&gt;设置时，鼠标离开按钮时会触发以下错误：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;QFont::setPointSize: Point size &amp;lt;= 0 (-1), must be greater than 0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;影响范围&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;版本&lt;/strong&gt;：仅影响PySide6 6.10.1+版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件&lt;/strong&gt;：仅影响&lt;code&gt;QToolButton&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;触发条件&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;setPixelSize&lt;/code&gt;设置字体&lt;/li&gt;
&lt;li&gt;或在样式表中设置&lt;code&gt;font-size&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;鼠标悬停后离开按钮&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;复现步骤&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;创建使用&lt;code&gt;setPixelSize&lt;/code&gt;的&lt;code&gt;QToolButton&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;应用包含&lt;code&gt;font-size&lt;/code&gt;设置的样式表&lt;/li&gt;
&lt;li&gt;鼠标悬停在按钮上&lt;/li&gt;
&lt;li&gt;鼠标移出时出现错误&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;完整测试代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&quot;&quot;&quot;
PySide6 QToolButton Font Bug Test
Demonstrates the font issue with QToolButton in PySide6 6.10.1+
&quot;&quot;&quot;
import sys
import PySide6
from PySide6.QtCore import Qt
from PySide6.QtGui import QFont
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QToolButton, QLabel


class SimpleTestWidget(QWidget):
    &quot;&quot;&quot; Simple test interface for PySide6 font bug &quot;&quot;&quot;
    
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setup_ui()
        
    def setup_ui(self):
        layout = QVBoxLayout(self)
        layout.setSpacing(20)
        
        # Title with version info
        title = QLabel(&quot;PySide6 Version: &quot; + PySide6.__version__ + &quot; - QToolButton Font Bug Test&quot;)
        title.setAlignment(Qt.AlignCenter)
        title.setStyleSheet(&quot;font-size: 16px; font-weight: bold;&quot;)
        layout.addWidget(title)
        
        # QToolButton with setPixelSize (no stylesheet)
        pixel_button_no_style = QToolButton(self)
        pixel_button_no_style.setText(&quot;setPixelSize(14) - No Stylesheet&quot;)
        
        font_pixel = QFont()
        font_pixel.setFamilies([&apos;Segoe UI&apos;, &apos;Microsoft YaHei&apos;])
        font_pixel.setPixelSize(14)  # Using setPixelSize
        pixel_button_no_style.setFont(font_pixel)
        
        layout.addWidget(pixel_button_no_style)
        
        # QToolButton with setPixelSize (with stylesheet) - BUG APPEARS HERE
        pixel_button_with_style = QToolButton(self)
        pixel_button_with_style.setText(&quot;setPixelSize(14) - With Stylesheet (BUG)&quot;)
        
        font_pixel2 = QFont()
        font_pixel2.setFamilies([&apos;Segoe UI&apos;, &apos;Microsoft YaHei&apos;])
        font_pixel2.setPixelSize(14)  # Using setPixelSize
        pixel_button_with_style.setFont(font_pixel2)
        
        # Apply stylesheet (simulates the bug condition)
        style_sheet = &quot;&quot;&quot;
        QToolButton {
            background: rgba(255, 255, 255, 0.7);
            border: 1px solid rgba(0, 0, 0, 0.073);
            border-radius: 5px;
            padding: 5px 12px 6px 12px;
        }
        &quot;&quot;&quot;
        pixel_button_with_style.setStyleSheet(style_sheet)
        
        layout.addWidget(pixel_button_with_style)
        
        # QToolButton with setPointSize (with stylesheet) - WORKAROUND
        point_button_with_style = QToolButton(self)
        point_button_with_style.setText(&quot;setPointSize(10) - With Stylesheet (Workaround)&quot;)
        
        font_point = QFont()
        font_point.setFamilies([&apos;Segoe UI&apos;, &apos;Microsoft YaHei&apos;])
        font_point.setPointSize(10)  # Using setPointSize (workaround)
        point_button_with_style.setFont(font_point)
        
        point_button_with_style.setStyleSheet(style_sheet)
        layout.addWidget(point_button_with_style)

        style_sheet2 = &quot;&quot;&quot;
        QToolButton {
            background: rgba(255, 255, 255, 0.7);
            border: 1px solid rgba(0, 0, 0, 0.073);
            border-radius: 5px;
            padding: 5px 12px 6px 12px;
            font-size: 14px;
        }
        &quot;&quot;&quot;
        point_button_with_style2 = QToolButton(self)
        point_button_with_style2.setText(&quot;setPointSize(10) - With Stylesheet and set Font-size (bug)&quot;)
        
        font_point2 = QFont()
        font_point2.setFamilies([&apos;Segoe UI&apos;, &apos;Microsoft YaHei&apos;])
        font_point2.setPointSize(10)  
        point_button_with_style2.setFont(font_point2)
        
        point_button_with_style2.setStyleSheet(style_sheet2)
        
        layout.addWidget(point_button_with_style2)  
        # Instructions
        desc = QLabel(&quot;Hover mouse over buttons to test the font bug.&quot;)
        desc.setStyleSheet(&quot;color: gray; font-size: 12px;&quot;)
        layout.addWidget(desc)
        
        self.resize(500, 350)

if __name__ == &quot;__main__&quot;:
    app = QApplication(sys.argv)
    window = SimpleTestWidget()
    window.setWindowTitle(&quot;PySide6 QToolButton Font Bug Test&quot;)
    window.show()
    sys.exit(app.exec())
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;临时解决方案&lt;/h2&gt;
&lt;h3&gt;方案1：使用setPointSize替代setPixelSize&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 不安全的代码
font = QFont()
font.setPixelSize(14)  # 会触发bug

# 安全的代码
font = QFont()
font.setPointSize(10)  # 使用setPointSize作为替代
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;方案2：避免在样式表中设置font-size&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/* 不安全的样式表 */
QToolButton {
    font-size: 14px;  /* 会触发bug */
}

/* 安全的样式表 */
QToolButton {
    /* 移除font-size设置 */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;技术分析&lt;/h2&gt;
&lt;h3&gt;问题根源&lt;/h3&gt;
&lt;p&gt;这个bug似乎与PySide6 6.10.1+版本中字体处理逻辑的变化有关。当鼠标离开&lt;code&gt;QToolButton&lt;/code&gt;时，样式表的状态切换过程中，字体大小被错误地设置为-1，触发了Qt的字体验证机制。&lt;/p&gt;
&lt;h3&gt;组件特异性&lt;/h3&gt;
&lt;p&gt;为什么只影响&lt;code&gt;QToolButton&lt;/code&gt;？：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;QToolButton&lt;/code&gt;通常用于工具栏，可能有不同的样式表处理逻辑&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;社区反馈&lt;/h2&gt;
&lt;p&gt;由于Qt官方的bug跟踪系统需要商业权限，目前无法直接报告此bug。建议开发者：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用本文提供的临时解决方案&lt;/li&gt;
&lt;li&gt;在社区论坛中分享此问题&lt;/li&gt;
&lt;li&gt;关注PySide6的后续版本更新&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;虽然这个bug似乎没啥影响，只会在控制台出现提醒，但通过使用&lt;code&gt;setPointSize&lt;/code&gt;替代&lt;code&gt;setPixelSize&lt;/code&gt;和优化样式表设置或使用低于6.10.1版本的包，可以完全避免这个问题。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;本文档基于实际测试和代码分析，适用于PySide6 6.10.1+版本。如有更新或修复，请关注PySide6官方发布说明。&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>在文件夹右键菜单添加cmd管理员、终端(powershell)管理员</title><link>https://swakinx.github.io/posts/add-right-click-menu/</link><guid isPermaLink="true">https://swakinx.github.io/posts/add-right-click-menu/</guid><description>在文件夹右键菜单添加cmd管理员、终端(powershell)管理员</description><pubDate>Tue, 19 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;右键菜单创建用管理员打开cmd&lt;/h2&gt;
&lt;p&gt;将代码复制到txt，并修改后缀为.reg，然后双击执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\AdminOpenCmd]
&quot;Icon&quot;=&quot;cmd.exe&quot;
@=&quot;管理员打开命令提示符&quot;

[HKEY_CLASSES_ROOT\Directory\shell\AdminOpenCmd\command]
@=&quot;PowerShell -windowstyle hidden -Command \&quot;Start-Process cmd.exe -ArgumentList &apos;/s,/k, pushd,%V&apos; -Verb RunAs\&quot;&quot;

[HKEY_CLASSES_ROOT\Directory\Background\shell\AdminOpenCmd]
&quot;Icon&quot;=&quot;cmd.exe&quot;
@=&quot;管理员打开命令提示符&quot;

[HKEY_CLASSES_ROOT\Directory\Background\shell\AdminOpenCmd\command]
@=&quot;PowerShell -windowstyle hidden -Command \&quot;Start-Process cmd.exe -ArgumentList &apos;/s,/k, pushd,%V&apos; -Verb RunAs\&quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;右键菜单创建打开终端管理员&lt;/h2&gt;
&lt;p&gt;将代码复制到txt，并修改后缀为.reg，然后双击执行，想要图标正常显示就修改icon路径为正确的地址&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\PowerShellAdmin]
@=&quot;终端管理员&quot;
&quot;Icon&quot;=&quot;C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.22.12111.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe&quot;

[HKEY_CLASSES_ROOT\Directory\shell\PowerShellAdmin\command]
@=&quot;powershell.exe -Command \&quot;Start-Process wt.exe -ArgumentList &apos;--window 0 --startingDirectory \\\&quot;%V\\\&quot;&apos; -Verb RunAs\&quot;&quot;

[HKEY_CLASSES_ROOT\Directory\Background\shell\PowerShellAdmin]
@=&quot;终端管理员&quot;
&quot;Icon&quot;=&quot;C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.22.12111.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe&quot;

[HKEY_CLASSES_ROOT\Directory\Background\shell\PowerShellAdmin\command]
@=&quot;powershell.exe -Command \&quot;Start-Process wt.exe -ArgumentList &apos;--window 0 --startingDirectory \\\&quot;%V\\\&quot;&apos; -Verb RunAs\&quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>噬界轮回</title><link>https://swakinx.github.io/posts/devourer-of-cycles/</link><guid isPermaLink="true">https://swakinx.github.io/posts/devourer-of-cycles/</guid><description>对抗那轮回不止的吞噬。</description><pubDate>Mon, 18 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;这是我的一个梦，描述后让AI总结后的结果，可能是跑团后遗症（&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心设定：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;宇宙级威胁 - 索拉纳克斯 (Solarnax)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本质：&lt;/strong&gt; 行星寄生体，形态为熔岩血肉构成的巨花。以地核能量为食，释放孢子进行宇宙级繁殖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生命轮回：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;寄生扎根：&lt;/strong&gt; 孢子侵入行星，建立根系网络，形成遗迹节点（花雕像），缓慢吸收能量，制造熔岩魔物。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心复苏：&lt;/strong&gt; 必须取回 &lt;strong&gt;“地核之种”&lt;/strong&gt;（前轮毁灭凝聚的力量核心/钥匙）方能完全苏醒。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;毁灭形态：&lt;/strong&gt; 融合“地核之种”后，化身移动火山，释放熔岩射线，加速吞噬行星。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特性：&lt;/strong&gt; 冰冷贪婪的意识引发地质剧变、环境熔岩化、生物畸变与精神污染（低语诱发疯狂）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;地核之种 (Core Seed) - 赤红珠子&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本质：&lt;/strong&gt; 索拉纳克斯的力量核心与生命精华。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;绝对钥匙：&lt;/strong&gt; 索拉纳克斯进入毁灭形态的唯一必需品。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;禁锢之物：&lt;/strong&gt; 被行星守护力量剥离，禁锢于 CoC 侧遗迹。禁锢破坏（男主取珠）引发首次全球扰动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定位信标：&lt;/strong&gt; 索拉纳克斯持续追踪其位置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;力量增幅器：&lt;/strong&gt; 融合瞬间赋予索拉纳克斯碾压性力量（秒杀蜈蚣，引发末日）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;行星守护者 - “基岩守卫” (Bedrock Warden) - 蜈蚣巨兽&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本质：&lt;/strong&gt; 星球意志/失落文明创造的终极防御兵器。机械生物复合体，散发地脉蓝白光。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使命：&lt;/strong&gt; 绝对敌对索拉纳克斯。长期休眠封印于 DND 遗迹岩壁，与节点对峙。职责：摧毁节点、阻止核心回收、保护星球。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态：&lt;/strong&gt; 漫长岁月中严重受损。禁锢破坏与节点活化将其惊醒，进行绝望反击。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结局：&lt;/strong&gt; 为履行职责，在索拉纳克斯融合核心后仍拼死攻击，被碾压性力量重创瘫痪。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;星核回声 (Echo of the Core) - 小女孩&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;来历：&lt;/strong&gt; 星球意志/失落文明创造的“火种”与“钥匙”。星球生命能量与抗争记忆的具现化（类精灵外貌为亲和体现）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;活体抑制器：&lt;/strong&gt; 在 DND 遗迹中抑制节点完全活化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信息库：&lt;/strong&gt; 承载索拉纳克斯弱点、蜈蚣操控方法、失落知识（加密）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;守护者接口：&lt;/strong&gt; 与“基岩守卫”本源相连，是其修复、激活、增幅的唯一桥梁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;情感核心：&lt;/strong&gt; 对男女主（尤女主）的依赖是唤醒力量、打破封闭的关键。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;穿越本质：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;玩家意识与异世界角色的&lt;strong&gt;强制融合&lt;/strong&gt;。拥有&lt;strong&gt;完整&lt;/strong&gt;玩家记忆与角色记忆/能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;体验：&lt;/strong&gt; 灵魂撕裂般的痛苦，记忆混乱，角色本能深刻影响行为（非“扮演游戏”）。玩家思维体现为&lt;strong&gt;分析方式与跨世界观知识&lt;/strong&gt;，非轻浮态度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;关键 NPC (助力/世界观延伸)：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心原则：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;符合世界观：&lt;/strong&gt; 紧密贴合熔岩末世、古代文明遗迹、克苏鲁式宇宙恐怖与 DND 奇幻的融合设定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有限介入：&lt;/strong&gt; 行星吞噬者级别的威胁过于宏大，任何个体“大能”直接出手解决核心问题都会削弱主角团的牺牲和故事张力。他们的帮助应是&lt;strong&gt;间接的、有代价的、或专注于生存与重建&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;严肃基调：&lt;/strong&gt; NPC 的动机和行为应符合末日的残酷现实，避免轻浮的“冒险者”心态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务于主题：&lt;/strong&gt; 强化守护、牺牲、轮回、文明兴衰的主题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;NPC 角色设计：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“灰烬先知”伊戈·石语者 (Igor Stonespeaker) - 种族：灰矮人 (Duergar) / 职业：牧师 (地元素领域) 或 符文贤者&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;背景与动机：&lt;/strong&gt; 伊戈并非地表居民。他来自被索拉纳克斯早期活动（熔岩流、地震）严重威胁的深层地下城邦。灰矮人精通地质与锻造，对大地脉动极其敏感。伊戈是城邦中最敏锐的“石语者”，他能“聆听”岩石的痛苦和低语。他感知到了索拉纳克斯的苏醒带来的毁灭性威胁，这威胁远超地下城邦过往遭遇的任何灾难。他被迫离开安全的幽暗地域，来到危险的地表寻求线索或盟友，试图为他的族人找到一条生路。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如何出现：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;彩蛋/信息源：&lt;/strong&gt; 在男女主安顿的小镇，伊戈可能伪装成一个不起眼的矿石商人或铁匠学徒（观察男主的锻造技术）。他暗中收集关于遗迹、地震、熔岩魔物的信息，偶尔会透露一些关于“地底深处传来痛苦咆哮”、“岩石在恐惧中颤抖”的晦涩预言。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;助力：&lt;/strong&gt; 灾难爆发后，伊戈可能利用他对地质结构和地下通道的非凡知识，为男女主小队提供一条穿越熔岩地貌、避开最危险区域、甚至找到被掩埋的“基岩守卫”残骸的&lt;strong&gt;相对安全路径&lt;/strong&gt;（他知道一些古老或自然形成的地道）。他提供的帮助&lt;strong&gt;基于生存本能和对威胁的共同认知，而非无私援助&lt;/strong&gt;。他可能要求男女主在找到对抗索拉纳克斯的方法后，分享信息给他的族人。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;引入地下世界的视角，拓展世界观。&lt;/li&gt;
&lt;li&gt;提供关于索拉纳克斯活动（根系网络扰动）的早期预警或侧面印证。&lt;/li&gt;
&lt;li&gt;在逃亡和寻找蜈蚣的关键阶段提供&lt;strong&gt;实用的地理导航&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;强化“整个星球生命都在威胁下挣扎”的宏大感。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;形象：&lt;/strong&gt; 苍老、坚韧、皮肤如同被烟熏过的岩石，眼神锐利而充满忧虑，穿着实用的矿石色皮甲，随身携带刻满符文的矿石和水晶。话语简洁、直接，带着灰矮人特有的粗粝和务实。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“远行者”艾莉娅·星辉 (Aeliah Starwhisper) - 种族：月精灵 (Moon Elf) / 职业：德鲁伊 (星辰结社) 或 法师 (预言学派)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;背景与动机：&lt;/strong&gt; 艾莉娅并非本地精灵社群成员。她是一位古老的、追寻失落预言和星空指引的“远行者”。她长久以来在星象中观测到代表“生命之绿”与“毁灭之红”的星辰轨迹交织，预兆着巨大的灾难轮回。她追踪预言来到这片区域，在灾难爆发前就已在遗迹外围或偏远山林中观察。她的动机是&lt;strong&gt;理解预言、记录事件、并尽可能保存生命的火种&lt;/strong&gt;。她代表自然与星辰的秩序对混沌吞噬的抗争。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如何出现：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;信息源/观察者：&lt;/strong&gt; 可能在男女主刚到小镇时就作为一个神秘的旅人短暂出现，留下一些关于“星辰低语警示”、“古老循环即将闭合”的隐晦话语。或者在遗迹第一次震动后，出现在遗迹附近进行占卜或记录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有限助力：&lt;/strong&gt; 灾难爆发后，艾莉娅可能在逃亡人潮中运用她的自然魔法（&lt;strong&gt;非战斗型&lt;/strong&gt;），如&lt;strong&gt;安抚惊恐的动物引导逃亡路线、净化被污染的小水源、或利用星象在浓密火山灰中短暂指引方向&lt;/strong&gt;。她的帮助是&lt;strong&gt;群体性的、保护性的，而非针对主角团的核心任务&lt;/strong&gt;。她可能认出小女孩身上的星球意志气息，但无法解读或干预。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;引入预言和星象视角，暗示轮回的必然性和宇宙尺度的观测。&lt;/li&gt;
&lt;li&gt;提供&lt;strong&gt;非战斗性的生存辅助&lt;/strong&gt;（导航、净化、安抚），体现德鲁伊/预言法师在末日中的价值。&lt;/li&gt;
&lt;li&gt;作为精灵族（女主种族）的一个&lt;strong&gt;不同分支的代表&lt;/strong&gt;，展示精灵对危机的反应（不是所有精灵都是战斗法师）。&lt;/li&gt;
&lt;li&gt;她的存在本身&lt;strong&gt;强化“大能知晓但无力阻止”的无力感&lt;/strong&gt;，侧面烘托索拉纳克斯的恐怖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;形象：&lt;/strong&gt; 优雅而沧桑，穿着镶嵌星月图案的深色旅行长袍，手持星象仪或橡木法杖，眼神仿佛穿透时空，带着深深的悲悯和忧虑。行动从容但迅捷，如同林间微风。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“遗物守护者”卡扎·碎铁 (Kaza Ironshatter) - 种族：盾矮人 (Shield Dwarf) / 职业：战士 (守护者) 或 牧师 (锻造之神贡德)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;背景与动机：&lt;/strong&gt; 卡扎是附近一个顽强但规模缩小的矮人要塞的代表（可能也是唯一的幸存者代表）。要塞的职责之一是守护附近山脉中一个&lt;strong&gt;失落文明的武器试验场或能量节点遗迹&lt;/strong&gt;（可能与“基岩守卫”的制造者有关）。矮人世代相传守护此地的誓言，但对其真正意义已模糊。索拉纳克斯的活动严重破坏了山脉结构，威胁要塞和遗迹。卡扎肩负着调查威胁来源和保卫家园的双重使命。他代表&lt;strong&gt;秩序、传承与家园守护&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如何出现：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;助力/信息源：&lt;/strong&gt; 在男女主安顿期，卡扎可能因男主精湛（或独特）的锻造技术而主动接触，交流锻造心得，并透露一些关于山脉深处“不祥震动”和“古老守卫传说”的信息。他可能带来一些从遗迹外围找到的&lt;strong&gt;无法解读的古代合金碎片或能量耗尽的装置残骸&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有限战斗助力：&lt;/strong&gt; 灾难爆发时，卡扎可能在城镇外围或逃亡路上组织矮人战士进行&lt;strong&gt;小规模、悲壮的阻击战&lt;/strong&gt;，为平民争取时间（对抗熔岩魔物或小型根须）。他的主要目的是保护矮人平民撤离。在男女主寻找蜈蚣的路上，可能遭遇卡扎带领的矮人残兵，短暂汇合，&lt;strong&gt;提供一些补给、重型武器（如矮人手弩/战锤）或关于附近地形（特别是山脉结构）的实用信息&lt;/strong&gt;。他最终目标是带领族人前往一个传说中的、更深层的地下避难所。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;引入矮人势力，体现不同种族在灾难中的挣扎与抵抗。&lt;/li&gt;
&lt;li&gt;提供关于&lt;strong&gt;失落文明遗迹和“基岩守卫”可能起源的实物线索&lt;/strong&gt;（碎片、传说）。&lt;/li&gt;
&lt;li&gt;在逃亡阶段提供&lt;strong&gt;有限的、基于共同求生目标的战斗支援和物资补给&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;展现&lt;strong&gt;家园毁灭的悲壮&lt;/strong&gt;，强化灾难的破坏力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;形象：&lt;/strong&gt; 典型的坚毅矮人战士，厚重的板甲伤痕累累，胡须编成辫子，手持巨盾和战锤。眼神充满决心和家园被毁的怒火，言谈直接、粗犷、重承诺。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“无形之网”主脑 (The Unseen Weaver) - 种族：夺心魔主脑 (Illithid Elder Brain) / 存在：心灵集合体&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;背景与动机：&lt;/strong&gt; 一个隐秘的夺心魔殖民地（位于极深的地下洞穴或与幽暗地域相连的缝隙）同样受到了索拉纳克斯的威胁。熔岩流逼近、地脉能量紊乱干扰了灵能网络、索拉纳克斯的精神低语对灵吸怪也是巨大的污染。主脑的动机纯粹是&lt;strong&gt;生存和保全殖民地&lt;/strong&gt;。它对索拉纳克斯的本质（宇宙寄生体）有更理性的认知（通过吸收的地表生物记忆和灵能探测），但无力正面对抗。它代表&lt;strong&gt;冷酷理性、异形思维、信息掌控&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如何出现：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;彩蛋/信息源 (极其隐晦)：&lt;/strong&gt; 在灾难爆发前，男女主或小镇居民可能偶尔经历奇怪的&lt;strong&gt;集体性短暂失忆、毫无逻辑的噩梦片段、或听到无法理解的心灵低语&lt;/strong&gt;（被夺心魔侦察者抽取记忆或干扰）。这是主脑在收集情报。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;间接/有代价的助力：&lt;/strong&gt; 在男女主最绝望或最需要关键信息时（例如，完全不知道“蜈蚣”是什么或在哪里），他们可能&lt;strong&gt;在梦中或精神恍惚间接收到一组破碎、冰冷、非人的图像和信息流&lt;/strong&gt;：一幅模糊的蜈蚣图像、一个深埋的坐标、一句关于“星球核心共鸣”的非人理解。这种“帮助”&lt;strong&gt;伴随着剧烈的精神痛苦和潜在的理智损伤风险&lt;/strong&gt;。主脑的目的是希望男女主找到并激活/摧毁蜈蚣，干扰索拉纳克斯，为它的殖民地争取转移时间。它&lt;strong&gt;绝不现身&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;引入克苏鲁式的、异形的高等存在视角，强化宇宙恐怖的氛围。&lt;/li&gt;
&lt;li&gt;在主角团完全迷失方向时，提供&lt;strong&gt;极其关键但充满风险的信息碎片&lt;/strong&gt;，推动剧情（如确认蜈蚣的存在和大致位置）。&lt;/li&gt;
&lt;li&gt;体现索拉纳克斯的威胁是&lt;strong&gt;全域性的，连最隐秘的异形也无法幸免&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;提供的信息&lt;strong&gt;冰冷、非人、缺乏情感&lt;/strong&gt;，与小女孩承载的星球情感记忆形成鲜明对比。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;形象：&lt;/strong&gt; 永不直接出现。其影响通过精神干扰、噩梦、非人信息传递体现。代表一种纯粹的、异质的宇宙存在。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“沉眠之鳞”萨尔戈斯 (Sargoth the Slumbering Scale) - 种族：远古金龙 (Ancient Gold Dragon) / 状态：深度魔法休眠&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;背景与动机：&lt;/strong&gt; 萨尔戈斯是这片土地传说中的守护者，曾在上古时期对抗过巨大的邪恶。漫长的岁月和巨大的消耗让它陷入了&lt;strong&gt;极其深度的、近乎永恒的魔法休眠&lt;/strong&gt;，盘踞在群山之巅或地脉交汇处的次元空间内。将男女主灵魂召唤至此作为破局的变数。它代表&lt;strong&gt;古老的力量、沉睡的守护者、以及“大能并非万能”的现实&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如何出现：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;背景/彩蛋：&lt;/strong&gt; 只在传说、残破壁画或像艾莉娅·星辉这样的预言者口中被提及。“当群星泣血，大地核心被噬，沉眠之鳞或将颤动…” 是流传的古老箴言。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结局：事件平息后将男女主拉入自己的空间，解释因果，让男女主做出抉择，选择是否留下&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;满足“大能”存在的设定，但明确展示其&lt;strong&gt;无法直接介入&lt;/strong&gt;，强化主角团行动的必然性和孤立无援感。&lt;/li&gt;
&lt;li&gt;提供一种&lt;strong&gt;悲壮的史诗感&lt;/strong&gt;：古老的守护者已力不从心，新的守护者（主角团、蜈蚣、小女孩）必须挺身而出。&lt;/li&gt;
&lt;li&gt;作为世界观的深度彩蛋，暗示更古老的历史和力量层次。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;如何融入故事关键节点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;安定期 (小镇生活)：&lt;/strong&gt; 伊戈（矿石商人/铁匠）、艾莉娅（神秘旅人）可以自然融入小镇背景，提供零碎信息和世界观铺垫。卡扎可能来访交流锻造或警告震动。夺心魔的影响作为诡异事件偶尔发生。萨尔戈斯存在于传说中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灾难爆发 (逃亡初期)：&lt;/strong&gt; 卡扎和他的矮人战士可能在城镇外围或主要逃亡路线上进行悲壮的阻击战，男女主可能目睹或短暂得到其掩护。艾莉娅可能在人群中施展群体性自然魔法辅助（净化水源、安抚人群/动物）。伊戈可能主动找上男女主，提供地下通道信息（如果他认为他们知道更多内情）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;寻找蜈蚣 (关键任务)：&lt;/strong&gt; &lt;strong&gt;伊戈的地质知识&lt;/strong&gt;成为找到被掩埋蜈蚣位置的关键助力（他知道哪些熔岩流冷却快，哪些岩层可能形成庇护空间）。在完全迷失方向时，&lt;strong&gt;夺心魔主脑&lt;/strong&gt;可能送来冰冷的关键坐标或蜈蚣图像碎片（伴随精神痛苦）。&lt;strong&gt;卡扎的矮人残部&lt;/strong&gt;可能在路径上汇合，提供补给和地形信息，并分担一些小型熔岩魔物的骚扰。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最终决战/结局：&lt;/strong&gt; 所有 NPC 的助力在找到蜈蚣后基本结束。他们的命运：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;伊戈：&lt;/strong&gt; 可能在引导完路径后，选择返回地下寻找族人，或消失在混乱中，生死未卜。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;艾莉娅：&lt;/strong&gt; 继续在幸存者中运用自然魔法帮助重建和维持微弱的生态平衡，记录着这场浩劫。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;卡扎：&lt;/strong&gt; 带领幸存的矮人（可能损失惨重）前往深层避难所，延续矮人火种。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;夺心魔主脑：&lt;/strong&gt; 在送出信息后，其精神干扰消失，殖民地可能已转移或覆灭，成为永远的谜。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;萨尔戈斯：&lt;/strong&gt; 那一声遥远的龙吟或震动后，重归死寂的沉眠。它的传说增添新的篇章。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结局 (余烬新生)：&lt;/strong&gt; 男女主在重建中，可能会遇到艾莉娅在净化一片焦土，或听到关于矮人在地下建立新家园的传言。伊戈和卡扎可能再无消息。夺心魔和金龙则彻底成为背景传说的一部分。这些 NPC 的存在，让男女主知道他们并非世界上唯一的幸存者和抗争者，但核心的牺牲与守护的重任，依然沉重地落在他们肩上。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;世界更生动：&lt;/strong&gt; 展现了不同种族、势力、个体在灭世危机下的反应和挣扎。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;助力更合理：&lt;/strong&gt; NPC 的帮助是有限的、有动机的（多为自保）、且符合其能力的（地质知识、自然魔法、战斗支援、信息碎片），不喧宾夺主。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基调更严肃：&lt;/strong&gt; 所有 NPC 都笼罩在末日的阴影下，他们的行为动机严肃，没有儿戏。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题更深化：&lt;/strong&gt; 通过不同 NPC 的命运（牺牲、逃亡、坚守、隐遁），多角度展现了守护、牺牲、文明火种延续的主题。金龙的存在更凸显了主角团行动的凡人英雄主义色彩。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;彩蛋有趣：&lt;/strong&gt; 夺心魔、远古金龙等经典 DND 元素的融入，为熟悉设定的读者/玩家提供会心一笑或深度挖掘的空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;核心情节细节 (强化沉浸感与严肃性)：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;遗迹崩塌 (双线)：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CoC 侧 (男主取珠)：&lt;/strong&gt; 珠子离架 → 空间哀鸣，支架熔断，血光应急灯亮 → 花雕像内熔岩涌动，非人咆哮 → &lt;strong&gt;结构崩溃如巨兽撕咬&lt;/strong&gt;。男主搏命寻车，驾驶舱玻璃爆裂。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DND 侧 (女主)：&lt;/strong&gt; 大地抽搐如巨兽痉挛，符文明灭 → &lt;strong&gt;窒息性能量威压&lt;/strong&gt;远超魔物 → 小女孩蜷缩发光，微弱偏转落石 → 抱起时触感冰凉稳定。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;路口相遇与穿越：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错车：&lt;/strong&gt; 工程车破烟冲出，刺目车灯 → 女主&lt;strong&gt;原始恐惧&lt;/strong&gt;，刹车刺耳，尘土扑面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;穿越：&lt;/strong&gt; &lt;strong&gt;灵魂重锤&lt;/strong&gt;，记忆碎片暴力灌入 → 恶心眩晕 → 男主肌肉记忆锁死刹车，指节发白；女主护紧女孩，指尖凝冰 → 眼神交汇：&lt;strong&gt;混乱、警惕、茫然&lt;/strong&gt; → “上车！”（嘶哑求生吼）→ 女主&lt;strong&gt;逻辑求生本能&lt;/strong&gt;压倒未知恐惧，滚爬上车。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安定期 (沉重现实)：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语言/生存：&lt;/strong&gt; 男主语言挫败 → 误解、焦虑、孤立 → 打铁是&lt;strong&gt;发泄、掌控、求生技能&lt;/strong&gt;（汗、灼伤、酸痛）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;秘密/创伤：&lt;/strong&gt; 双方隐藏玩家身份 → &lt;strong&gt;角色本能与玩家思维冲突&lt;/strong&gt;（男主中文梦呓惊醒；女主英文咒骂规则）→ 异常归咎“穿越创伤”，沉默观察 → 讨论用词：“遗迹遗物”、“可怜孩子”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;照顾女孩：&lt;/strong&gt; 沉重负担 → 夜惊、无意识能量失控（物品翻飞/水结冰）、对炉火异常反应 → &lt;strong&gt;疲惫、担忧、无助&lt;/strong&gt; → 微小进步（认名）是黑暗慰藉。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;珠子异常：&lt;/strong&gt; 箱子&lt;strong&gt;周期性炽红烫手&lt;/strong&gt;，锁扣熔凝 → 男主&lt;strong&gt;灼渊噩梦与低语幻听&lt;/strong&gt; → 双方心照不宣远离。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;身份揭露 (压力下的同盟)：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;触发：&lt;/strong&gt; 女孩能量爆发 → 星球毁灭幻象 + 蜈蚣战斗碎片闪现 → 房间狼藉（冰晶焦痕）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对话 (沉重疲惫)：&lt;/strong&gt;
&lt;blockquote&gt;
&lt;p&gt;男主 (揉太阳穴，沙哑)：“…那怪物…我在更远的未来见过…只有石头…凝固岩浆。”
女主 (抱紧女孩，指尖凝寒)：“未来？…艾莉娅记忆没有。但那‘花’…感觉像规则书里最古老的邪恶。冰冷…饥饿…吞噬。”
男主 (猛抬头)：“规则书？你…？” (未言“玩家”)
女主 (疲惫点头)：“是。我们被扔进了最残酷的‘真实’游戏。为了她，也为我们…必须共享一切。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;珠子被夺 &amp;amp; 末日降临：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;突袭：&lt;/strong&gt; 存珠房间 → 地面赤红软化 → &lt;strong&gt;熔晶根须毒蛇般刺破地板箱体&lt;/strong&gt; → 硫磺窒息 → 根须卷珠。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;夺珠：&lt;/strong&gt; 珠根接触 → &lt;strong&gt;猩红爆闪&lt;/strong&gt; → 室温飙至碳化 → &lt;strong&gt;地心满足咆哮&lt;/strong&gt; → 根须缩地，留熔融深洞。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;爆发：&lt;/strong&gt; 数秒死寂 → &lt;strong&gt;大地连绵哀嚎断裂&lt;/strong&gt; → 山体被&lt;strong&gt;巨手撕开&lt;/strong&gt; → &lt;strong&gt;血肉熔岩巨花裹岩浆洪流破山&lt;/strong&gt; → 花蕊裂 → &lt;strong&gt;暗红空间扭曲射线&lt;/strong&gt;扫林化火海 → &lt;strong&gt;火山灰云蔽日&lt;/strong&gt; → 城镇瞬间地狱。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;决战：蜈蚣、连接与湮灭：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;寻蜈蚣：&lt;/strong&gt; 熔岩灰烬中 → 女主&lt;strong&gt;透支生命&lt;/strong&gt;开冰径 → 男主凭工程知识判地质 → 女孩&lt;strong&gt;透明化指引&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;蜈蚣惨状：&lt;/strong&gt; 半埋熔岩碎石 → &lt;strong&gt;躯干多处断裂，淌琉璃蓝血&lt;/strong&gt; → 关键关节熔毁 → 头甲巨大咬痕 → 独眼黯如残烛 → &lt;strong&gt;断续痛苦嗡鸣&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接修复：&lt;/strong&gt; 女孩扑触蜈蚣头甲 → &lt;strong&gt;全身翠绿/蓝白星芒爆闪&lt;/strong&gt; → 光脉延伤口 → &lt;strong&gt;碎甲弥合，水晶能构生长&lt;/strong&gt; → 核心&lt;strong&gt;重燃耀目蓝白光&lt;/strong&gt; → 女孩&lt;strong&gt;光点化自指尖始&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最终冲锋：&lt;/strong&gt; 修复蜈蚣（滞涩但决绝）→ &lt;strong&gt;撼天战吼&lt;/strong&gt; → 撞熔岩 → 载男主（携高爆/扰乱器）或掩护其装甲车 → &lt;strong&gt;迎毁灭射线冲锋&lt;/strong&gt; → 女主&lt;strong&gt;七窍流血&lt;/strong&gt; → 凝&lt;strong&gt;不断熔穿的巨型冰盾&lt;/strong&gt; + 释&lt;strong&gt;极地深寒&lt;/strong&gt;脆化索拉纳克斯。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;湮灭：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(方案 A)&lt;/strong&gt; 冰盾脆化刹那 → 蜈蚣&lt;strong&gt;蓝白光炮直击核心&lt;/strong&gt; → 核心&lt;strong&gt;蛛网裂，能量狂泄&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(方案 B)&lt;/strong&gt; 蜈蚣硬扛射线 → 男主抵近&lt;strong&gt;安装/启动装置&lt;/strong&gt; → &lt;strong&gt;能量乱流爆炸&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;牺牲：&lt;/strong&gt; 核心爆炸 → 索拉纳克斯&lt;strong&gt;崩碎哀嚎&lt;/strong&gt; → &lt;strong&gt;蜈蚣以身覆挡冲击&lt;/strong&gt; → &lt;strong&gt;汽化蓝白晶尘&lt;/strong&gt; → 男主气浪掀飞濒死 → 女孩望男女主 → &lt;strong&gt;无声“爸妈”唇形&lt;/strong&gt; → &lt;strong&gt;化星尘光点洒落焦土&lt;/strong&gt; → 女主魔力耗尽昏迷。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;结局：余烬中的守望者：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;灾难止息：&lt;/strong&gt; 索拉纳克斯残骸如崩山沉凝岩。核心&lt;strong&gt;碎屑湮灭或裂块黯淡&lt;/strong&gt;。熔岩止，灰云沉。毁灭终止。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;伤痕：&lt;/strong&gt; 男主（残躯）寻得女主（昏迷）→ 相扶立废墟 → &lt;strong&gt;面无喜色，唯余疲惫、悲怆、麻木&lt;/strong&gt; → 男主掌中紧握&lt;strong&gt;女孩所化温润绿光微晶&lt;/strong&gt; → 远方蜈蚣晶尘如蓝雾笼敌骸。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未来：&lt;/strong&gt; 为少数幸存者与真相持有者 → 男主以工程/锻造，女主以残存自然魔法/草药 → &lt;strong&gt;引领焦土求生&lt;/strong&gt; → 立营地，集物资 → 绿晶为碑，祭逝者与微光 → 索拉纳克斯残骸永为警钟 → &lt;strong&gt;肩负重建、守秘、净世之责&lt;/strong&gt;。结局定格二人立简陋营地，&lt;strong&gt;远眺敌与守护者共铸之沉默废墟群&lt;/strong&gt;。轮回破，&lt;strong&gt;代价至惨，前路维艰&lt;/strong&gt;。&lt;strong&gt;焦土嫩芽 = 微小顽强之望&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;抉择：古龙给予选择，男女主选择不得而知。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;整合要点强化：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;逻辑闭环：&lt;/strong&gt; 珠子是核心钥匙 → 取珠破禁锢 → 引节点活化/蜈蚣醒 → 夺珠归位 → 索拉纳克斯获完全体 → 末日降临 → 破局需毁珠/断链 → 借蜈蚣力 + 女孩牺牲达成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;严肃沉浸：&lt;/strong&gt; 全流程强调&lt;strong&gt;生理痛苦（头痛、灼伤、撕裂感）、心理重压（恐惧、孤立、创伤）、环境残酷（硫磺、热浪、崩塌、射线蒸发）&lt;/strong&gt;。去除游戏术语调侃。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;角色驱动：&lt;/strong&gt; 行动源于生存本能、守护责任（对女孩、彼此）、探求真相。玩家知识用于&lt;strong&gt;锻造、工程分析、魔法理解、信息整合&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NPC 定位：&lt;/strong&gt; 非救世主。提供&lt;strong&gt;有限、有偿、符合专长&lt;/strong&gt;的助力（通道、群体辅助、信息碎片、阻击补给）。深化“世界受难”感。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题凝聚：&lt;/strong&gt; &lt;strong&gt;毁灭轮回&lt;/strong&gt;（索拉纳克斯）、&lt;strong&gt;牺牲&lt;/strong&gt;（蜈蚣、女孩）、&lt;strong&gt;守护&lt;/strong&gt;（男女主、NPC）、&lt;strong&gt;沉重新生&lt;/strong&gt;（焦土嫩芽）贯穿始终。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;细节锚点：&lt;/strong&gt; 关键场景以&lt;strong&gt;感官冲击&lt;/strong&gt;（声音：金属扭曲、地心咆哮、刹车刺耳；触觉：箱子炽红、女孩冰凉、熔岩热浪；视觉：猩红爆闪、蓝白晶尘、绿光微晶）强化记忆。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Ⅰ. 核心角色设定&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;1. 穿越者主角团&lt;/strong&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;角色&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;肉身/记忆来源&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;玩家意识特质&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;能力/特质&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;创伤印记&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;男主（雷克斯）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CoC 人类调查员（肌肉猛男）&lt;/td&gt;
&lt;td&gt;工程师思维/调查员逻辑&lt;/td&gt;
&lt;td&gt;载具操控、机械维修、地质分析；强耐痛体质&lt;/td&gt;
&lt;td&gt;掌心灼伤老茧；硫磺噩梦症&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;女主（艾莉娅）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DND 高等精灵法师&lt;/td&gt;
&lt;td&gt;策略型桌游玩家&lt;/td&gt;
&lt;td&gt;冰系魔法专精（霜冻新星 → 极地深寒）、精灵植物沟通；古文字破译&lt;/td&gt;
&lt;td&gt;魔法反噬冻疮；护崽本能（对女孩）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;星核回声（无名）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;星球意志具现化（类精灵幼体）&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;抑制索拉纳克斯节点活化；修复/增幅基岩守卫；释放星球净化力场&lt;/td&gt;
&lt;td&gt;能量失控致局部结冰；索拉纳克斯恐惧症&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;&lt;strong&gt;2. 行星级存在&lt;/strong&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;存在名&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;形态&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;本质&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;核心能力&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;状态&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;索拉纳克斯&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;熔岩血肉巨花（高逾山峰）&lt;/td&gt;
&lt;td&gt;宇宙寄生体，以地核能量为食&lt;/td&gt;
&lt;td&gt;熔岩射线（物质湮灭）、根系寄生、精神污染低语&lt;/td&gt;
&lt;td&gt;核心湮灭 → 残骸化为熔岩山脉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基岩守卫&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;机械生物蜈蚣（蓝光晶体甲）&lt;/td&gt;
&lt;td&gt;星球意志锻造的终极兵器&lt;/td&gt;
&lt;td&gt;地脉能量炮、力场护盾、大地震颤&lt;/td&gt;
&lt;td&gt;终战自毁 → 残躯化蓝晶尘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;萨尔戈斯&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;鳞片剥落的远古金龙（虚影）&lt;/td&gt;
&lt;td&gt;上古守护者，执掌部分因果律&lt;/td&gt;
&lt;td&gt;时空撕裂、预知碎片、神力具现化（金钟/沙漏）&lt;/td&gt;
&lt;td&gt;沉眠将逝 → 现身耗最后神力&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Ⅱ. 世界观架构&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;1. 核心法则&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;索拉纳克斯轮回&lt;/strong&gt;：&lt;strong&gt;孢子漂流 → 寄生扎根（建遗迹节点）→ 核心复苏（需地核之种）→ 毁灭形态（灭世）→ 凝新种&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;穿越机制&lt;/strong&gt;：萨尔戈斯以&lt;strong&gt;因果律裂痕&lt;/strong&gt;抓取异界玩家灵魂，强制融合本界肉身，引发 &lt;strong&gt;“灵魂撕裂后遗症”&lt;/strong&gt;（记忆混乱、本能冲突）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能量克制&lt;/strong&gt;：
&lt;strong&gt;冰魔法&lt;/strong&gt;→ 脆化熔岩结构｜&lt;strong&gt;星球绿光&lt;/strong&gt;→ 净化污染｜&lt;strong&gt;地脉蓝光&lt;/strong&gt;→ 驱动守护兵器&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;2. 地理志&lt;/strong&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;区域&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;特征&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;关键地点&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;威胁等级&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;焦土废壤&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;索拉纳克斯肆虐后的主舞台，熔岩冷却为黑曜石地貌&lt;/td&gt;
&lt;td&gt;残破城镇“黑炉堡”、蜈蚣陨坑&lt;/td&gt;
&lt;td&gt;★★★★★&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;幽邃地脉&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;错综地下洞穴，地热紊乱&lt;/td&gt;
&lt;td&gt;灰矮人城邦“深石之喉”、夺心魔殖民地（已湮灭）&lt;/td&gt;
&lt;td&gt;★★★☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;沉龙山脉&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;萨尔戈斯沉眠地，时空畸变区&lt;/td&gt;
&lt;td&gt;时光乱流峡谷、龙鳞化石林&lt;/td&gt;
&lt;td&gt;★★☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;净化绿洲&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;绿晶影响区，生态缓慢复苏&lt;/td&gt;
&lt;td&gt;艾莉娅的祭坛“新芽林地”&lt;/td&gt;
&lt;td&gt;☆&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Ⅲ. NPC 图鉴（助力/信息网）&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;NPC&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;种族/职业&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;隶属势力&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;功能&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;终局&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;标志物&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;伊戈·石语者&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;灰矮人符文贤者&lt;/td&gt;
&lt;td&gt;深石城邦&lt;/td&gt;
&lt;td&gt;提供地脉通道/索拉纳克斯根系图谱&lt;/td&gt;
&lt;td&gt;携情报闭锁地下城&lt;/td&gt;
&lt;td&gt;晶岩地质锤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;艾莉娅·星辉&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;月精灵星辰德鲁伊&lt;/td&gt;
&lt;td&gt;自然之环&lt;/td&gt;
&lt;td&gt;群体净化/预言碎片&lt;/td&gt;
&lt;td&gt;建绿晶祭坛引导农耕&lt;/td&gt;
&lt;td&gt;星纹橡木杖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;卡扎·碎铁&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;盾矮人守护者战士&lt;/td&gt;
&lt;td&gt;山峦要塞&lt;/td&gt;
&lt;td&gt;熔岩阻击战/地形情报&lt;/td&gt;
&lt;td&gt;遁地前留《地脉异常报告》&lt;/td&gt;
&lt;td&gt;秘银塔盾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;无形之网&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;夺心魔主脑&lt;/td&gt;
&lt;td&gt;灵吸怪殖民地&lt;/td&gt;
&lt;td&gt;精神传递蜈蚣坐标（伴理智损伤）&lt;/td&gt;
&lt;td&gt;殖民地湮灭成谜&lt;/td&gt;
&lt;td&gt;脑波回响水晶&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;萨尔戈斯&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;远古金龙&lt;/td&gt;
&lt;td&gt;上古守护者&lt;/td&gt;
&lt;td&gt;揭示穿越真相/赠归乡沙漏&lt;/td&gt;
&lt;td&gt;赠沙漏后虚影消散&lt;/td&gt;
&lt;td&gt;因果金钟（虚影）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Ⅳ. 剧情全纲（关键节点细节）&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;序幕：轮回之始&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CoC 线&lt;/strong&gt;：雷克斯取赤珠 → 珠离架 →&lt;strong&gt;支架熔断喷溅火花&lt;/strong&gt;→ 遗迹穹顶裂 → 熔岩魔物苏醒 → 搏命驾工程车冲入烟尘。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DND 线&lt;/strong&gt;：艾莉娅战熔岩怪 → 地颤 → 岩壁“蜈蚣浮雕”剥落 → 基岩守卫惊醒攻节点 → 携哑孩奔逃 →&lt;strong&gt;路口车灯刺破烟幕&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;融合时刻&lt;/strong&gt;：刹车尖啸中双魂撕裂 → 雷克斯&lt;strong&gt;指骨捏碎方向盘皮套&lt;/strong&gt;→ 艾莉娅&lt;strong&gt;冰晶自发护体&lt;/strong&gt;→ 嘶吼“上车！”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;中章：暗涌之栖&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;黑炉堡日常&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;雷克斯打铁 →&lt;strong&gt;汗滴入火炉嗤响&lt;/strong&gt;→ 教矮人锻钢淬火术 → 藏珠箱锁扣周期性熔红。&lt;/li&gt;
&lt;li&gt;艾莉娅采药 →&lt;strong&gt;指尖抚过枯焦草叶结霜&lt;/strong&gt;→ 破译矮人碑文“沉鳞缚时锁”。&lt;/li&gt;
&lt;li&gt;女孩涂鸦 →&lt;strong&gt;炭笔画蜈蚣与沙漏&lt;/strong&gt;→ 夜惊冻裂陶罐 → 艾莉娅彻夜搂抱安抚。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;身份揭露&lt;/strong&gt;：珠箱异动引女孩幻象爆发 → 雷克斯冲入吼“关掉那鬼东西！”→ 艾莉娅冰封房间 →&lt;strong&gt;背抵门喘息：“你…知道规则书吗？”&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;高潮：灭世终战&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;夺珠&lt;/strong&gt;：熔晶根须&lt;strong&gt;刺穿地板如巨矛&lt;/strong&gt;→ 卷珠瞬缩 → 地洞喷硫磺蒸汽 → 全镇犬吠。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灾变&lt;/strong&gt;：死寂 →&lt;strong&gt;远山崩裂喷血色岩浆&lt;/strong&gt;→ 索拉纳克斯巨花破峰 → 暗红射线扫过 → 森林汽化火海。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;赴死之路&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;伊戈指路 → 穿越&lt;strong&gt;熔岩瀑布后的地裂&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;主脑传信 → 艾莉娅&lt;strong&gt;鼻血滴落冰径&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;见蜈蚣残躯 → 甲缝渗&lt;strong&gt;蓝光如泪&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;牺牲&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;女孩扑蜈蚣 →&lt;strong&gt;绿光脉络点亮万节&lt;/strong&gt;→ 身化星尘。&lt;/li&gt;
&lt;li&gt;蜈蚣载雷克斯 →&lt;strong&gt;撞入花心核心&lt;/strong&gt;→ 自爆蓝光吞没赤珠。&lt;/li&gt;
&lt;li&gt;艾莉娅跪地 →&lt;strong&gt;七窍流血凝百米冰盾&lt;/strong&gt;→ 挡爆炸冲击波。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;&lt;strong&gt;终幕：古龙之问&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;焦土余烬&lt;/strong&gt;：雷克斯断臂握绿晶 → 艾莉娅白发覆霜 →&lt;strong&gt;金光聚为古龙虚影&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;因果揭示&lt;/strong&gt;：
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;脑内轰鸣&lt;/em&gt;：“吾裂时空引汝魂…此为破死局唯一落子。”
（闪现画面：电脑前掷骰 → 金爪撕屏幕）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沙漏赠礼&lt;/strong&gt;：悬浮双色沙漏 →&lt;strong&gt;蓝砂（异界）/金砂（原乡）&lt;/strong&gt;→ 古龙鳞片剥落如雨。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抉择凝滞&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;雷克斯独白：“回去…当铁匠雷克斯，还是废土雷克斯？”&lt;/li&gt;
&lt;li&gt;艾莉娅&lt;strong&gt;掌心绿晶搏动&lt;/strong&gt;→ 浮现女孩残影微笑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;双手覆沙漏 → 沙悬停 → 镜头拉远&lt;/strong&gt;：蓝晶尘萦绕敌骸，窝棚炊烟没入灰雪。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Ⅴ. 核心伏笔与意象&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;要素&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;埋设点&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;回收点/象征&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;续作方向&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;绿晶搏动&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;终战女孩所化&lt;/td&gt;
&lt;td&gt;抉择时温暖搏动 → 净化地裂&lt;/td&gt;
&lt;td&gt;索拉纳克斯根系复苏预警&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;沙漏涂鸦&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;女孩安定期炭笔画&lt;/td&gt;
&lt;td&gt;呼应古龙沙漏 → 暗示其预知力&lt;/td&gt;
&lt;td&gt;时间线变动可能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;龙鳞化石&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;沉龙山脉地表散落&lt;/td&gt;
&lt;td&gt;萨尔戈斯消亡证明&lt;/td&gt;
&lt;td&gt;新守护者锻造材料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;《地脉报告》&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;卡扎遗留笔记&lt;/td&gt;
&lt;td&gt;载“熔岩下根须蠕动”&lt;/td&gt;
&lt;td&gt;地下探险主线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;冰魔法反噬&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;女主每用高阶魔法留冻伤&lt;/td&gt;
&lt;td&gt;终局白发 → 力量代价可视化&lt;/td&gt;
&lt;td&gt;能力黑化风险&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;终极主题句&lt;/strong&gt;：
&lt;em&gt;“归乡的沙漏另一端，盛满未赎之罪与未竟之责——而绿晶在焦土中的每一次搏动，都是世界对守护者的拷问。”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;Ⅵ. 设定集附录&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;索拉纳克斯生态链&lt;/strong&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;衍生物&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;特征&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;弱点&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;熔岩爬行者&lt;/td&gt;
&lt;td&gt;犬形，岩浆核心&lt;/td&gt;
&lt;td&gt;冰魔法冻结核心&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;根须穿刺者&lt;/td&gt;
&lt;td&gt;潜地突袭，晶体外壳&lt;/td&gt;
&lt;td&gt;震击破坏关节&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;低语孢云&lt;/td&gt;
&lt;td&gt;悬浮气团，诱发疯狂&lt;/td&gt;
&lt;td&gt;强风驱散&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;&lt;strong&gt;地核之种数据&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;直径&lt;/strong&gt;：3cm&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;温度&lt;/strong&gt;：常态 40℃→ 激活瞬间 ≥2000℃&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能量读数&lt;/strong&gt;：湮灭前峰值=5 颗核弹当量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精神污染&lt;/strong&gt;：接触者 SAN 值每日降 1d4&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;守护者残骸利用表&lt;/strong&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;材料&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;来源&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;用途&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;蓝晶尘&lt;/td&gt;
&lt;td&gt;基岩守卫残躯&lt;/td&gt;
&lt;td&gt;能量电池/净化器核心&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;绿晶碎片&lt;/td&gt;
&lt;td&gt;星核回声结晶&lt;/td&gt;
&lt;td&gt;治愈药剂/污染探测器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;古龙鳞粉&lt;/td&gt;
&lt;td&gt;萨尔戈斯消散落鳞&lt;/td&gt;
&lt;td&gt;时空稳定锚点&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>用Astro在github上搭建博客</title><link>https://swakinx.github.io/posts/build-blog/</link><guid isPermaLink="true">https://swakinx.github.io/posts/build-blog/</guid><description>记录一下搭建博客踩的坑和经验</description><pubDate>Mon, 18 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;想搭建博客是想做一个MoonCancer的文档，用在线文档还是有点麻烦感觉，想要一个地方能集中管理，而且也想有一个地方来放我的经验和想法，于是这个博客就成了。&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;为了搭建这个博客也是折腾了一两天，先是做功课，有什么框架模版，那些平台上能搭建种种。一开始我是想用Hexo的这个主题的，也是先尝试搭建了一下，按着步骤很快成功了
::github{repo=&quot;saicaca/hexo-theme-vivia&quot;}
但是就在这时我注意到作者说这个仓库不更新了，建议使用新的模版，看了下这个确实比老的好，虽然框架不一样
::github{repo=&quot;saicaca/fuwari&quot;}
但才刚刚开始，还是一开始就用新的比较好，于是又开始捣鼓这个模版，有了之前的经验，很快就在本地测试成功了,但部署遇到些问题，最后折腾到半夜终于成了。&lt;/p&gt;
&lt;p&gt;在这之前看了一篇博客&lt;a href=&quot;https://bxgldh.github.io/posts/how_to_build/&quot;&gt;手把手搭建 Astro + Github Pages + Github Actions&lt;/a&gt;，想看具体操作可以看一下，和我用的同一套模版也是部署在GitHub，我刚在他博客下面评论完就发现部署成功了，虽然在搭建上面没帮上忙，但里面还是提到了如何添加浏览量和评论，我也就顺便借鉴了一下。&lt;/p&gt;
&lt;p&gt;说了这么多放上我遇到的问题和一些经验吧。&lt;/p&gt;
&lt;h2&gt;部署配置&lt;/h2&gt;
&lt;p&gt;这是我踩的一个大坑，在&lt;a href=&quot;https://docs.astro.build/en/guides/deploy/github/&quot;&gt;官方文档&lt;/a&gt;中提到，&lt;code&gt;astro.config.mjs&lt;/code&gt;配置文件中&lt;code&gt;base&lt;/code&gt;字段要填仓库名称，但这里指的是GitHub项目网站要填，个人网站是不用填的，在这之前我看过视频还有一些博客说过，个人或组织网站的域名就是本身，这里官方文档没有特别说明导致我来回采坑。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig } from &apos;astro/config&apos;

export default defineConfig({
  site: &apos;https://astronaut.github.io&apos;,
  base: &apos;my-repo&apos;,
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我想搭建的也是个人网站，所以我觉得&lt;code&gt;base&lt;/code&gt;是不用填的，实际上一开始测试的时候就是没填，但我测试的时候是刚fork来的，这时部署那就是项目网站，是要填&lt;code&gt;base&lt;/code&gt;的，我部署上没有样式，给我整蒙了，怀疑是没加&lt;code&gt;basse&lt;/code&gt;导致的所以又把&lt;code&gt;base&lt;/code&gt;给加上，但同时我迁移到了个人网站仓库部署了，结果显示出来还是一样没有样式，这下给我整不会了。几经折腾还是回到原点，怀疑是&lt;code&gt;base&lt;/code&gt;设置问题，我还原回了&lt;code&gt;&apos;/&apos;&lt;/code&gt;，就推送等自动部署然后洗澡去了，洗完澡回来刷新一看，终于成功了，这时已经快凌晨两点了，好在能安心睡觉了。&lt;/p&gt;
&lt;h2&gt;草稿切换&lt;/h2&gt;
&lt;p&gt;在md文章的文件头里有一个选项&lt;code&gt;draft&lt;/code&gt;，就是用来判断是否是草稿的(吃了没有文化的亏，没查意思之前都不知道)，一开始我的文章设置的都是&lt;code&gt;true&lt;/code&gt;，测试的时候都在发布后却没有，也没用看到哪里有这个字段的说明(&lt;s&gt;其实示例文章里就有&lt;/s&gt;)，结果就是发布后文章不见了。设置成&lt;code&gt;false&lt;/code&gt;重新发布就好了。模版自带的几篇文章也不用删设置成&lt;code&gt;true&lt;/code&gt;就行了。&lt;/p&gt;
&lt;h2&gt;透明背景&lt;/h2&gt;
&lt;p&gt;可以看到我的导航栏和背景是半透明的，我觉得导航栏挡道banner了不舒服，就想调整成半透明的，但模版没有提供这个选项，只能自己想办法了。&lt;/p&gt;
&lt;p&gt;很简单，&amp;lt;kbd&amp;gt;F12&amp;lt;/kbd&amp;gt;打开开发工具，选取导航栏定位到导航栏代码，在右侧的样式里找到颜色的配置项，关闭或调整颜色值看效果就知道那个是需要修改的颜色了，我用的这个模版使用的颜色名称是&lt;code&gt;--card-bg&lt;/code&gt;
&lt;img src=&quot;../../assets/images/devtools.png&quot; alt=&quot;devtools&quot; /&gt;
然后在&lt;code&gt;src\styles\variables.styl&lt;/code&gt;中找倒这个变量名称，修改成带透明度的颜色值就行了，思路是这样，我这里修改的值为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--card-bg: white(0.8) rgba(24 29 36 0.8)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原本的&lt;code&gt;oklch&lt;/code&gt;形式加上透明度就错误，我直接转换为&lt;code&gt;agba&lt;/code&gt;了，不同模版可能不一样，黑白模式的值可能是分开存的，这里存在一起的。&lt;/p&gt;
</content:encoded></item><item><title>MoonCancer 更新记录</title><link>https://swakinx.github.io/posts/mooncancer/</link><guid isPermaLink="true">https://swakinx.github.io/posts/mooncancer/</guid><description>MoonCancer更新记录</description><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;MoonCancer相关说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;../mooncancer0&quot;&gt;BB亲小助手入门&lt;/a&gt;&amp;lt;br&amp;gt;
&lt;a href=&quot;../mooncancer1&quot;&gt;Moon界面说明&lt;/a&gt;&amp;lt;br&amp;gt;
&lt;a href=&quot;../mooncancer2&quot;&gt;Cancer界面说明&lt;/a&gt;&amp;lt;br&amp;gt;
&lt;a href=&quot;../mooncancer3&quot;&gt;Alter界面说明&lt;/a&gt;&amp;lt;br&amp;gt;
&lt;a href=&quot;../mooncancer4&quot;&gt;Eisyou界面说明&lt;/a&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2026年7月7日v2.6.1&lt;/h2&gt;
&lt;p&gt;1.新增资源更新提醒&amp;lt;br&amp;gt;
2.优化部分逻辑&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2026年7月5日v2.6.0&lt;/h2&gt;
&lt;p&gt;1.新增MuMu模拟器15和雷电模拟器14支持&amp;lt;br&amp;gt;
2.升级OCR模型和引擎&amp;lt;br&amp;gt;
3.修复任务异常处理逻辑，优化弹窗提示文案&amp;lt;br&amp;gt;
4.优化自动开机启动配置逻辑&amp;lt;br&amp;gt;
5.修复部分已知bug，优化用户交互体验&lt;/p&gt;
&lt;h2&gt;2026年6月27日v2.5.5&lt;/h2&gt;
&lt;p&gt;1.适配国服日常服冠位战切换&lt;/p&gt;
&lt;h2&gt;2026年6月24日v2.5.4&lt;/h2&gt;
&lt;p&gt;1.新增MuMu模拟器保活检测与自动关闭&amp;lt;br&amp;gt;
2.优化多血条检测&amp;lt;br&amp;gt;
3.优化活动点数检测和显示效果&amp;lt;br&amp;gt;
4.优化冠位助战选择&lt;/p&gt;
&lt;h2&gt;2026年5月22日v2.5.3&lt;/h2&gt;
&lt;p&gt;1.优化冠位助战识别&amp;lt;br&amp;gt;
2.优化脚本逻辑&amp;lt;br&amp;gt;
3.修复杀死敌人的部分问题&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2026年5月4日v2.5.2&lt;/h2&gt;
&lt;p&gt;1.新增开机自启动&amp;lt;br&amp;gt;
2.新增记住窗口位置&amp;lt;br&amp;gt;
3.优化过主线&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2026年5月1日v2.5.1&lt;/h2&gt;
&lt;p&gt;1.修复models目录不存在问题&amp;lt;br&amp;gt;
2.修复过主线在进关卡前卡住问题&amp;lt;br&amp;gt;
3.添加国际化多语言支持&amp;lt;br&amp;gt;
4.优化界面效果和文本，修复部分异常&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2026年4月13日v2.5.0&lt;/h2&gt;
&lt;p&gt;1.新增计划任务，支持关机、休眠、挂机&amp;lt;br&amp;gt;
2.新增OCR推理引擎切换&amp;lt;br&amp;gt;
3.优化消息通知，修复win10没有正常通知的问题&amp;lt;br&amp;gt;
4.优化界面效果，修复部分异常&amp;lt;br&amp;gt;
5.优化战斗结果处理逻辑&lt;/p&gt;
&lt;h2&gt;2026年3月22日v2.4.10&lt;/h2&gt;
&lt;p&gt;1.优化助战选择，不存在加成礼装时提前刷新&amp;lt;br&amp;gt;
2.连续战斗增加茶壶检测&amp;lt;br&amp;gt;
3.优化启动模拟器，避免模拟器占用MoonCancer文件夹&amp;lt;br&amp;gt;
4.优化修改，增加稳定性&lt;/p&gt;
&lt;h2&gt;2026年3月6日v2.4.9&lt;/h2&gt;
&lt;p&gt;1.优化首通关卡的关卡识别&amp;lt;br&amp;gt;
2.过主线，清理free，首通关卡可以根据设置战斗次数结束&amp;lt;br&amp;gt;
3.修复朗读失效&amp;lt;br&amp;gt;
4.优化满羁绊识别&lt;/p&gt;
&lt;h2&gt;2026年1月30日v2.4.8&lt;/h2&gt;
&lt;p&gt;1.优化MuMu模拟器检测，避免模拟器bug（MuMu最新版已修复）&amp;lt;br&amp;gt;
2.优化茶壶和风暴罐开关设置&lt;/p&gt;
&lt;h2&gt;2025年12月31日v2.4.7&lt;/h2&gt;
&lt;p&gt;1.升级rapidocr=3.4.5，PySide6-Fluent-Widgets=1.10.5&amp;lt;br&amp;gt;
2.修复国服更新导致的修改失效&lt;/p&gt;
&lt;h2&gt;2025年12月24日v2.4.6&lt;/h2&gt;
&lt;p&gt;1.优化部分逻辑&amp;lt;br&amp;gt;
2.修复日服修改失效&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年12月5日v2.4.5&lt;/h2&gt;
&lt;p&gt;1.优化MuMu连接，修复连接遗留问题&amp;lt;br&amp;gt;
2.优化助战选择和吃苹果以及部分问题&amp;lt;br&amp;gt;
3.更新主页banner&amp;lt;br&amp;gt;
4.适配日常术阶冠位战&lt;/p&gt;
&lt;h2&gt;2025年11月23日v2.4.4&lt;/h2&gt;
&lt;p&gt;1.修复修改器自动计数错误&amp;lt;br&amp;gt;
2.优化助战选择&amp;lt;br&amp;gt;
3.更改更新检测和逻辑&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年11月20日v2.4.3&lt;/h2&gt;
&lt;p&gt;1.适配弓阶冠位战，优化冠位战进入流程&amp;lt;br&amp;gt;
2.优化大量敌人时的修改逻辑，减少无效查找&amp;lt;br&amp;gt;
3.优化助战选择，可以有多个识别候选，支持冠位助战双礼装识别，具体规则请查看说明文档&amp;lt;br&amp;gt;
4.优化部分逻辑，减少可能出现的问题&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年11月09日v2.4.2&lt;/h2&gt;
&lt;p&gt;1.优化战斗逻辑、指令卡选择，避免部分情况卡死&amp;lt;br&amp;gt;
2.优化茶壶检测，一开一关也能保持一致性&amp;lt;br&amp;gt;
3.优化日常任务白纸本查找，避免部分情况卡死&amp;lt;br&amp;gt;
4.优化点击滑动操作，尽量保持不同连接方式的操作一致性&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年10月30日v2.4.1&lt;/h2&gt;
&lt;p&gt;1.更改优化ui，切换配置更方便，显示战斗数&amp;lt;br&amp;gt;
2.适配日服过主线的部分情况&amp;lt;br&amp;gt;
3.增加结束后输出战斗结果(用时、战斗数、掉落数)&amp;lt;br&amp;gt;
4.增加检测mumu后台保活是否开启&amp;lt;br&amp;gt;
5.优化助战选择，避免误判&amp;lt;br&amp;gt;
6.优化模拟器连接，避免部分错误&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年10月23日v2.4.0&lt;/h2&gt;
&lt;p&gt;1.更新主页UI，更改任务布局，优化使用体验&amp;lt;br&amp;gt;
2.新增首通关卡，清理幕间，进阶关卡，回忆关卡，以及一切需要通关拿奖励的情况&amp;lt;br&amp;gt;
3.适配日服杀阶戴冠战日常&amp;lt;br&amp;gt;
4.优化代码，解决部分卡住的情况&lt;/p&gt;
&lt;h2&gt;2025年10月18日v2.3.6&lt;/h2&gt;
&lt;p&gt;1.优化日常抽免费，适配每日抽多个友情池&amp;lt;br&amp;gt;
2.优化日常队伍确认，避免触发游戏bug&amp;lt;br&amp;gt;
3.优化连接初始化逻辑&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年10月8日v2.3.5&lt;/h2&gt;
&lt;p&gt;1.更新部分UI，主页脚本设置下方显示当前配置；更改任务消息框，显示芙芙跑动画&amp;lt;br&amp;gt;
2.日常任务默认使用1号编队，避免日常用错编队（更新后记得修改编队）&amp;lt;br&amp;gt;
3.适配两种茶壶的情况（需要保持开关一致）&amp;lt;br&amp;gt;
4.优化代码，预防部分错误&lt;/p&gt;
&lt;h2&gt;2025年10月2日v2.3.4&lt;/h2&gt;
&lt;p&gt;1.修复启动时更新会点退出，修复启动模拟器会出错&amp;lt;br&amp;gt;
2.修复暗色主题显示错误&amp;lt;br&amp;gt;
3.分离UI设置和脚本设置&amp;lt;br&amp;gt;
4.调整任务状态条，调整通知消息，优化连接流&lt;/p&gt;
&lt;h2&gt;2025年9月30日v2.3.2&lt;/h2&gt;
&lt;p&gt;1.增加多配置切换&amp;lt;br&amp;gt;
2.修复图标右键菜单不能自动影藏&amp;lt;br&amp;gt;
3.修复更新后在主页卡住，修复日服更新界面卡住&amp;lt;br&amp;gt;
4.修复过主线和清理free可能卡住无法结束&lt;/p&gt;
&lt;h2&gt;2025年9月28日v2.3.1&lt;/h2&gt;
&lt;p&gt;1.精简合并设置项&amp;lt;br&amp;gt;
2.适配日服日常冠位战&amp;lt;br&amp;gt;
3.修复抽友情卡住&amp;lt;br&amp;gt;
4.优化部分逻辑，增加日服更新补丁检测&lt;/p&gt;
&lt;h2&gt;2025年9月27日v2.3.0&lt;/h2&gt;
&lt;p&gt;1.优化部分脚本逻辑&amp;lt;br&amp;gt;
2.脚本适配日服&amp;lt;br&amp;gt;
3.增加日服助战礼装，更改礼装选择名称&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年9月25日v2.2.2&lt;/h2&gt;
&lt;p&gt;1.优化重新启动游戏和部分脚本逻辑&amp;lt;br&amp;gt;
2.优化自动扫描，新增搜索包名&amp;lt;br&amp;gt;
3.新增包名设置，渠道服和其他客户端可以修改后使用&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年9月18日v2.2.1&lt;/h2&gt;
&lt;p&gt;1.优化模拟器连接&amp;lt;br&amp;gt;
2.优化过主线&amp;lt;br&amp;gt;
3.增加是否使用茶壶&amp;lt;br&amp;gt;
4.优化多处逻辑，增加稳定性&amp;lt;br&amp;gt;
5.适配白纸化阿拉伯地区（需要通关奏Ⅲ）&lt;/p&gt;
&lt;h2&gt;2025年9月14日v2.2.0&lt;/h2&gt;
&lt;p&gt;1.增加MuMu高速连接和雷电高速连接，更快更稳定，适配更多模拟器自动搜索&amp;lt;br&amp;gt;
2.迁移战脚本设置到主页，修改更方便，活动点数限制显示逗号分隔符&amp;lt;br&amp;gt;
3.去掉控制台，改为在主页下方文本框显示日志&amp;lt;br&amp;gt;
4.优化程序启动，整合优化命令执行逻辑，优化连接逻辑，优化多处代码逻辑，增强稳定性&amp;lt;br&amp;gt;
5.增加游戏崩溃重启&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年8月31日v2.1.6&lt;/h2&gt;
&lt;p&gt;1.过主线适配部分情况&amp;lt;br&amp;gt;
2.修复日常在主页卡住&lt;/p&gt;
&lt;h2&gt;2025年8月28日v2.1.5&lt;/h2&gt;
&lt;p&gt;1.优化自动战斗，三名一下己方会直接使用清空血条，本轮战斗回合大于1时也能再次清空血条&amp;lt;br&amp;gt;
2.增加过主线标志识别率&lt;/p&gt;
&lt;h2&gt;2025年8月27日&lt;/h2&gt;
&lt;p&gt;1.优化修改器，在修改前就标记地址，确保下次不会被检索到；优化己方检测，避免错误修改&amp;lt;br&amp;gt;
2.添加暂停功能，启动任意任务后，右上角帮助旁边会出现暂停按钮，可以随时暂停了&amp;lt;br&amp;gt;
3.优化战斗和指令卡选择逻辑，会识别多血条敌人会强化己方避免暴毙&amp;lt;br&amp;gt;
4.在搜索修改地址期间也能暂停和结束，避免大量修改时只能等待结束或关闭程序&amp;lt;br&amp;gt;
5.优化多处UI相关效果&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年8月25日&lt;/h2&gt;
&lt;p&gt;1.优化修改器类增强稳定性，修复修改时某些大序号修改失败的问题&amp;lt;br&amp;gt;
2.优化eisyou布局，修复删除错误问题&amp;lt;br&amp;gt;
3.优化过剧情，修复不可跳过对话框卡住问题，移除跳过剧情设置，改为在开始前选择&amp;lt;br&amp;gt;
4.修复增强alter，增加从屏幕识别信息&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年8月22日&lt;/h2&gt;
&lt;p&gt;1.增加多模板匹配&amp;lt;br&amp;gt;
2.解耦继续战斗判断&amp;lt;br&amp;gt;
3.优化过剧情和自动free本&amp;lt;br&amp;gt;
4.在过主线开始前提示是否跳过剧情&amp;lt;br&amp;gt;
5.优化多处逻辑，增加稳定性&lt;/p&gt;
&lt;h2&gt;2025年8月21日&lt;/h2&gt;
&lt;p&gt;1.优化过剧情，解决部分环节可能卡住的问题&amp;lt;br&amp;gt;
2.优化战斗指令卡选择逻辑&amp;lt;br&amp;gt;
3.新增自动清理free本（We Are Free!）&amp;lt;br&amp;gt;
4.加强修改稳定性&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年8月20日&lt;/h2&gt;
&lt;p&gt;1.优化过剧情，采用螺旋查找&amp;lt;br&amp;gt;
2.优化战斗指令卡选择，只有一人或全是一人的卡时释放宝具&amp;lt;br&amp;gt;
3.新增活动点数停止，在设置里可以设置活动点数，达到即停，不限制时归零&amp;lt;br&amp;gt;
4.新增点击帮助弹出窗口&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年8月15日&lt;/h2&gt;
&lt;p&gt;1.优化过剧情&amp;lt;br&amp;gt;
2.优化战斗&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年8月12日&lt;/h2&gt;
&lt;p&gt;1.新增阅读界面，可以自主调节设置&amp;lt;br&amp;gt;
2.新增自动主线，部分情况可能需要手动&amp;lt;br&amp;gt;
3.优化战斗逻辑，去掉了战斗模式，现在自动选择战斗方式&amp;lt;br&amp;gt;
4.优化UI，更新部分界面图标和文字&amp;lt;br&amp;gt;
5.去掉超时自动搜索连接，新增超时设置&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年7月22日&lt;/h2&gt;
&lt;p&gt;1.增加自动更新&amp;lt;br&amp;gt;
2.优化战斗结束识别&amp;lt;br&amp;gt;
3.修复可能吃肾结石&amp;lt;br&amp;gt;
4.优化连接问题&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;2025年7月11日&lt;/h2&gt;
&lt;p&gt;1.适配白纸化第七弹，优化白纸化识别方式&amp;lt;br&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>MoonCancer Cancer界面说明</title><link>https://swakinx.github.io/posts/mooncancer2/</link><guid isPermaLink="true">https://swakinx.github.io/posts/mooncancer2/</guid><description>一个fgo的局内数值修改器，只能在战斗中使用，用来手动修改数值</description><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;表格说明&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;表格是为了记录下查找的地址为了方便二次修改，同时也可视化展示修改了哪些位置，每次进入战斗前或者战斗结束记得清除记录，每场战斗地址不一定相同不能复用，使用旧地址修改可能导致游戏异常或闪退&lt;/em&gt; &amp;lt;br&amp;gt;
&lt;code&gt;位置&lt;/code&gt;&amp;lt;br&amp;gt;
带6个从者，那1-6号位就是从者，带三个从者，那1-3就是从者，后面编号的都是敌人；敌人同时出场多名时，从右往左编号递增，不是同时出场时，先出场的编号靠前，按出场顺序递增；未出场的敌人也能检测到，但不同面的敌人无法检测，只有进入到下一面才会加载数据 &amp;lt;br&amp;gt;
&lt;code&gt;地址&lt;/code&gt;&amp;lt;br&amp;gt;
代表内存中的地址，多个地址时只有一个时候本场战斗的地址，另外的都是之前的残留，一般不会超过三个&lt;/p&gt;
&lt;h2&gt;自定义修改&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;根据具体需求修改数值；注意不要把数值修改的特别大，超过一定数值会导致错误或者伤害为0&lt;/em&gt; &amp;lt;br&amp;gt;
&lt;code&gt;修改&lt;/code&gt;&amp;lt;br&amp;gt;只修改开启项和指定的范围内的目标，例如默认的1，2就只修改1，2号位的值，要只修改一个就把值设置为一样，设置好要修改的值和范围后点击修改&amp;lt;br&amp;gt;
:::tip
将敌人生命值修改为0能不战而胜
:::&lt;/p&gt;
&lt;h2&gt;快速修改&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;没有特别需求时直接使用快速修改&lt;/em&gt; &amp;lt;br&amp;gt;
&lt;code&gt;消除&lt;/code&gt;&amp;lt;br&amp;gt;默认情况是带六个从者，根据情况修改上场从者数量即可，运行一次只能修改当前面的敌人（包括没出场的），若第一面没有修改，二三面出现无法修改的情况，把上场从者数量加上之前面敌人数量的总和即可（考验记忆力），数量设置小于自己带的从者会导致自己从者死亡 &amp;lt;br&amp;gt;
&lt;code&gt;增强&lt;/code&gt;&amp;lt;br&amp;gt;以默认值修改指定位置的从者或敌人，一般给自己用，比如2号位上光炮，每回合放宝具就行&lt;/p&gt;
&lt;h2&gt;其他说明&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;清除记录&lt;/code&gt;&amp;lt;br&amp;gt;
建议在进入画面就清除记录，每场战斗的记录不一定通用，会干扰修改；如果想要修改时已经在战斗中了，而且还存在记录，那就先尝试用现有的记录先执行修改，如果不成功那就清除记录，这种情况下直接清除记录有可能把现在的标志给清除了导致某些位修改失败 &amp;lt;br&amp;gt;
&lt;code&gt;刷新记录&lt;/code&gt;&amp;lt;br&amp;gt;
手动刷新现在的记录，某些情况下数值已经修改过并记录了地址，但表格没刷新，可以手动刷新查看情况 &amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;注意&lt;/code&gt;由于某些原因一号位不一定能修改到，遇到了修改其他位置就行了；多血条敌人一次只能破一管血，只要血条刷新就可以再次执行血量清零的任意操作，但某些关卡有特殊机制，会导致敌人身上的buff结算出错，导致无法通关；虽然已经尽量避免的会导致错误的操作，但还是可能出现闪退或其他问题，万一出错了，可以尝试重新启动游戏或模拟器，最后手动修改时记得&lt;strong&gt;清空记录&lt;/strong&gt; &amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;祝你好运！&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>MoonCancer Moon界面说明</title><link>https://swakinx.github.io/posts/mooncancer1/</link><guid isPermaLink="true">https://swakinx.github.io/posts/mooncancer1/</guid><description>MoonCaner主要功能界面</description><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;MoonCaner脚本的启动界面，点击 &lt;code&gt;会赢的&lt;/code&gt;标签会打开我的博客&lt;/em&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;基本功能&lt;/h2&gt;
&lt;p&gt;可用左右切换当前显示的功能，使用前请先在&lt;a href=&quot;#%E8%84%9A%E6%9C%AC%E8%AE%BE%E7%BD%AE&quot;&gt;&lt;code&gt;脚本设置&lt;/code&gt;&lt;/a&gt;里设置好战斗次数，礼装类型，是否要清理剩余体力，使用茶壶等&lt;/p&gt;
&lt;h3&gt;日常任务&lt;/h3&gt;
&lt;p&gt;整个流程包括打开模拟器，启动游戏，抽每日免费友情池(可关闭)，完成每日三次白纸化或冠位战(设置中的本)，&lt;code&gt;默认使用1号编队&lt;/code&gt;，使用前请设置好编队。也可以在主界面或者只运行了模拟器开始。每天可以直接点一下就下线，长草期也不麻烦，轻松攒石头&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;要自动白纸化每日，请尽量保持界面干净，保证要打的关卡已经开启，部分关卡依赖奏章Ⅱ定位（例如90⭐），所以至少要打完奏章Ⅰ，才能使用所有选项
&lt;img src=&quot;../../assets/images/mooncaner/ordercall.png&quot; alt=&quot;ordercall&quot; /&gt;&lt;/li&gt;
&lt;li&gt;日常冠位戴冠战请先完成对应的冠位认定战，默认进入最下方的关卡&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;开始战斗&lt;/h3&gt;
&lt;p&gt;自动刷各种本，主要是能连续战斗的，或是强化本(更推荐使用&lt;a href=&quot;#%E9%A6%96%E9%80%9A%E5%85%B3%E5%8D%A1&quot;&gt;&lt;code&gt;首通关卡&lt;/code&gt;&lt;/a&gt;)或者free本那样回到主界面右上角也有本可以点的情况。复杂的机制关可能不能正常通关，建议手动修改(&lt;a href=&quot;../mooncancer2&quot;&gt;Alter界面说明&lt;/a&gt;)根据机制来完成战斗。可以在进入战斗前的选择助战，队伍设置和进入战斗后开始，也可以在主界面选本列表开始，但要保证要刷的本在第一个位置。&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;过主线&lt;/h3&gt;
&lt;p&gt;自动过主线和类主线，自动完成期间的战斗，&lt;strong&gt;不要改变地图缩放，保持进入地图后的默认缩放，有缩放过的重新进图&lt;/strong&gt;，保障屏幕里表示主线任务的 &lt;code&gt;下一个&lt;/code&gt;标识存在即可点击开始，部分情况会卡住，需要手动修正，选取消跳过剧情时会自动朗读剧情，相关配置可以到Eisyou界面修改，具体说明请看&lt;a href=&quot;../mooncancer4&quot;&gt;Eisyou界面说明&lt;/a&gt;&amp;lt;br&amp;gt;
测试到的可能需要手动干涉部分：&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第四特异点&lt;/strong&gt; 雾遮挡标志 &amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第六特异点&lt;/strong&gt; 风沙遮挡标志 &amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第七特异点&lt;/strong&gt; 提亚马特遮挡标志 &amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;终局特异点&lt;/strong&gt; 柱子站之前剧情过完就没有标志了，要自己去把柱子战过了 &amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LostBelt No.2&lt;/strong&gt;  6.4关卡要求出战马修，自动编成会打乱原本编队，就不自动了，自己先编好马修吧，不想中断就一直带着&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LostBelt No.5亚特兰蒂斯&lt;/strong&gt;  11-2关卡要求出战马修，自动编成会打乱原本编队&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LostBelt No.5奥林波斯&lt;/strong&gt;  2-1、2-2、5-1、6-3、12-2关卡要求出战马修，自动编成会打乱原本编队&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LostBelt No.6阿瓦隆&lt;/strong&gt;  18-5需要手动放妖兰群体宝具，24-6需要送死&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LostBelt No.7&lt;/strong&gt;  1-2关卡要求出战马修，部分关卡会卡住，太小了找不到&lt;code&gt;下一个&lt;/code&gt;就放大地图，ort最终战建议手动，自动可能从者不够用卡关&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;奏章二&lt;/strong&gt;  中途有多选项找线索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;奏章四&lt;/strong&gt;  码头警告！！！
:::tip
这里说下我使用的方式&lt;/li&gt;
&lt;li&gt;不想看剧情直接选择跳过&lt;/li&gt;
&lt;li&gt;想慢慢听就选不跳过挂着&lt;/li&gt;
&lt;li&gt;想快点看完就自己点屏幕快速浏览剧情，期间只用在有剧情时点屏幕，或者手动拖动下一个剧情点到屏幕中央，其他流程都交给脚本自动点击即可（也可以自己点下助战），这样既能快速过剧情，还有部分句子的语音强化记忆，还能自动战斗，不用自己去点战斗。我觉得挺舒服的。
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;清理free本&lt;/h3&gt;
&lt;p&gt;自动清理free本(We Are Free!)。同样&lt;strong&gt;不要改变地图缩放，保持进入地图后的默认缩放，有缩放过的重新进图&lt;/strong&gt;，进入地图就可以点开始了，&lt;strong&gt;第七异闻带&lt;/strong&gt;  地图不适配，可以手动选关卡，固定三次战斗完成
&lt;img src=&quot;../../assets/images/mooncaner/freequest.png&quot; alt=&quot;freequest&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;首通关卡&lt;/h3&gt;
&lt;p&gt;以当前列表关卡是否已获得奖励为基准，清理幕间，进阶关卡，回忆关卡等一切需要通关拿奖励的情况&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认跳过所有剧情，想听剧情请灵活使用&lt;a href=&quot;#%E8%BF%87%E4%B8%BB%E7%BA%BF&quot;&gt;&lt;code&gt;过主线&lt;/code&gt;&lt;/a&gt;和&lt;a href=&quot;../mooncancer4&quot;&gt;&lt;code&gt;Eisyou&lt;/code&gt;&lt;/a&gt;，无奖励的周回本不适用只会浪费体力。&lt;/li&gt;
&lt;li&gt;进阶关卡狼人杀等机制关可能卡关，需要手动通关；&lt;/li&gt;
&lt;li&gt;回忆关卡部分关卡在边缘位置需要手动点一下进入关卡列表，有些关卡通关后会回到地图也需要手动点一下回到关卡列表，因为是主线关卡，所以也会遇到强制马修助战会卡住，某些自动编队的情况也可能打乱现有编队，请注意&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;脚本设置&lt;/h2&gt;
&lt;p&gt;设置主页运行任务的具体参数，可展开折叠，支持添加移除配置，右键可以重命名配置，支持多配置切换，切换后会结束当前任务并断开连接
&lt;img src=&quot;../../assets/images/mooncaner/settings2.png&quot; alt=&quot;settings2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;战斗次数&lt;/strong&gt; 如果拖动不精准可以键盘左右键微调，日常任务默认打三次，屯着多次的要一次打完可以直接用战斗设置次数打，过剧情除非开启清理剩余体力，不然会不停过，跟这里的战斗次数无关&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清理剩余体力&lt;/strong&gt; 开启后，所有战斗都会在战斗次数耗尽后，战斗到体力不足&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用茶壶&lt;/strong&gt; 每次编队界面检查茶壶使用状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;苹果和助战&lt;/strong&gt; 选择补充体力的苹果类型，选择助战礼装，支持冠位助战，具体请阅读&lt;a href=&quot;../mooncancer1#%E7%A4%BC%E8%A3%85%E8%A7%84%E5%88%99&quot;&gt;礼装规则&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;活动点限制&lt;/strong&gt; 设置活动点限制，超过就停止，不多刷浪费，不限制时设为0，没有活动点的情况不触发&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抽每日友情池&lt;/strong&gt; 开启会在日常任务打白纸化之前先抽取每日免费友情池&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日常任务&lt;/strong&gt; 选择每日刷的本，可选择白纸化地球本和冠位戴冠战，或者都不打，按需选取，但要注意是否已经开放。冠位战的情况下要把冠位认定战打了，因为默认打最后一个本，不过没打的话会自动打了，要注意一下&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;礼装规则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;礼装最多可以候选四种，检测到其中一个就会选取&lt;/li&gt;
&lt;li&gt;当包含活动礼装时，会默认选取第一个助战，也就是不挑助战，想要选活动礼装设置好筛选&lt;/li&gt;
&lt;li&gt;当检测到冠位助战时，会选取满足候选列表其中两项的助战
:::tip
不想频繁修改配置可以创建多个常用配置，例如日常一个、活动一个，新建的配置会复制当前的配置，模拟器和区服没有改变只需要更改脚本设置即可
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;日志窗口&lt;/h2&gt;
&lt;p&gt;任务结束后会输出战斗结果(用时、战斗数、掉落数)，以及结束的原因，出现问题时如果要反馈，请将完整的当前游戏画面和log截图反馈&lt;/p&gt;
</content:encoded></item><item><title>MoonCancer Alter界面说明</title><link>https://swakinx.github.io/posts/mooncancer3/</link><guid isPermaLink="true">https://swakinx.github.io/posts/mooncancer3/</guid><description>提供更灵活的方式修改局内数值，主要用来打圣杯战线</description><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
&lt;em&gt;这个界面提供了一个更灵活的方式修改局内数值，主要用来打圣杯战线，Cancer修改失败时，可以在这里修改，不过地址任然会记录到Cnacer界面的表格里，记得清理&lt;/em&gt;
:::
&lt;code&gt;添加&lt;/code&gt;新行用来记录修改参数&amp;lt;br&amp;gt;
&lt;code&gt;获取从者信息&lt;/code&gt;从屏幕识别从者名称等级生命并自动填入表格，如果识别的数字没用问题可以直接选中修改&amp;lt;br&amp;gt;
&lt;code&gt;获取敌人信息&lt;/code&gt;从屏幕识别敌人名称等级生命并自动填入表格，如果识别的数字没用问题可以直接选中修改&amp;lt;br&amp;gt;
&lt;code&gt;删除&lt;/code&gt;选中行，可以删除多行&amp;lt;br&amp;gt;
&lt;code&gt;修改&lt;/code&gt;选中的行，可以选择多行修改&amp;lt;br&amp;gt;
:::tip
识别的信息可能有误，修改失败的话请仔细检查一下是否有误
:::
名称不能为空，等级不能为空，当前攻击力和生命值选一个填就行，填进入战斗后当前显示的值，改己方填攻击，改敌方填生命值（敌人看不到攻击力），后面的攻击力、生命值、宝具发动np都是要修改的值，空就代表不修改&amp;lt;br&amp;gt;
例如：&lt;code&gt;托勒密， 80， 11677， ， 5000000， 10000000， 0&lt;/code&gt;&amp;lt;br&amp;gt;
意思是修改托勒密，根据等级和攻击力修改，攻击力修改为5000000，生命值修改为10000000，0np发动宝具&lt;/p&gt;
</content:encoded></item><item><title>MoonCancer Eisyou界面说明</title><link>https://swakinx.github.io/posts/mooncancer4/</link><guid isPermaLink="true">https://swakinx.github.io/posts/mooncancer4/</guid><description>随机分配角色朗读剧情，可以挂着当相声听</description><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
&lt;em&gt;这个功能是我突发奇想做的，实际体验只能说一般吧，角色有限，情感也不丰富，但听响足够了。有些桥段和组合反而有点搞笑。基于文字识别和edge tts都是免费白嫖的，免费方案里已经算是最好的了，像为每个角色训练模型，那工作量也太大了，是我现阶段可及的。&lt;/em&gt;
:::&lt;/p&gt;
&lt;h2&gt;表格说明&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;名称&lt;/code&gt;&amp;lt;br&amp;gt;
识别到名称会自动添加到表格中，并随机设定一个声音&amp;lt;br&amp;gt;
&lt;code&gt;声音&lt;/code&gt;&amp;lt;br&amp;gt;
从列表中选择一中声音，设置为对应名称的角色语音，有些组合非常生草，朗读中也能修改，在下次说话生效&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h2&gt;功能说明&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;速率&lt;/code&gt;&amp;lt;br&amp;gt;
调整说话的速度，朗读中也能修改&amp;lt;br&amp;gt;
&lt;code&gt;音量&lt;/code&gt;&amp;lt;br&amp;gt;
调整说话的音量，朗读中也能修改&amp;lt;br&amp;gt;
&lt;code&gt;删除&lt;/code&gt;&amp;lt;br&amp;gt;
列表中删除一个或多个角色&amp;lt;br&amp;gt;
&lt;code&gt;导出配置&lt;/code&gt;&amp;lt;br&amp;gt;
导出当前配置，可以分享给别人，最好一个章节一个配置，不然角色太多不好调整，可以传到群文件共享，最好以章节命名&amp;lt;br&amp;gt;
&lt;code&gt;导入配置&lt;/code&gt;&amp;lt;br&amp;gt;
导入保存的配置，可以用别人的配置&amp;lt;br&amp;gt;
&lt;code&gt;开始&lt;/code&gt;&amp;lt;br&amp;gt;
主要用来在剧情记录中读剧情，过主线读剧情也是在这里控制，在任意剧情中就可以点开始了，但在这里开始只能在剧情记录中不间断读到章节结束，其他情况需要手动调整，设定是回到主界面就停止&lt;/p&gt;
&lt;p&gt;&lt;em&gt;点击开始听相声吧&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>MoonCancer BB亲小助手</title><link>https://swakinx.github.io/posts/mooncancer0/</link><guid isPermaLink="true">https://swakinx.github.io/posts/mooncancer0/</guid><description>MoonCancer基础说明，快速学会如何使用MoonCaner</description><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;font size=5&amp;gt;&lt;strong&gt;配置不够？不能满羁绊？刷本太慢？&amp;lt;br&amp;gt;真拿你没办法，前辈 ❤，让 BB 亲来帮你吧&lt;/strong&gt;&amp;lt;/font&amp;gt;&lt;/p&gt;
&lt;h2&gt;功能简介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;../mooncancer1#%E6%97%A5%E5%B8%B8%E4%BB%BB%E5%8A%A1&quot;&gt;&lt;code&gt;日常任务&lt;/code&gt;&lt;/a&gt;：打开模拟器，打开游戏，抽每日友情池，打白纸化或戴冠战结束&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../mooncancer1#%E5%BC%80%E5%A7%8B%E6%88%98%E6%96%97&quot;&gt;&lt;code&gt;开始战斗&lt;/code&gt;&lt;/a&gt;：无烦恼刷各种周回或完成当前战斗&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../mooncancer1#%E8%BF%87%E4%B8%BB%E7%BA%BF&quot;&gt;&lt;code&gt;过主线&lt;/code&gt;&lt;/a&gt;：自动过主线，可以选择朗读剧情，或者跳过剧情&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../mooncancer1#%E6%B8%85%E7%90%86free%E6%9C%AC&quot;&gt;&lt;code&gt;清理free本&lt;/code&gt;&lt;/a&gt;：自动清理free本(We Are Free!)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../mooncancer1#%E9%A6%96%E9%80%9A%E5%85%B3%E5%8D%A1&quot;&gt;&lt;code&gt;首通关卡&lt;/code&gt;&lt;/a&gt;：清理幕间，进阶关卡，回忆关卡等一切需要通关拿奖励的情况&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../mooncancer2&quot;&gt;&lt;code&gt;Cancer&lt;/code&gt;&lt;/a&gt;：局内数值修改器，只能在战斗中使用，用来手动修改数值&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../mooncancer3&quot;&gt;&lt;code&gt;Alter&lt;/code&gt;&lt;/a&gt;：提供更灵活的方式修改局内数值，主要用来打圣杯战线&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../mooncancer4&quot;&gt;&lt;code&gt;Eisyou&lt;/code&gt;&lt;/a&gt;：随机分配角色朗读剧情，可以挂着当相声听&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Kidou&lt;/code&gt;：打开模拟，再打开游戏进入到主界面&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;只支持国服和日服安卓模拟器使用（能在模拟器上登录即可用，包括渠道服、IOS也可也在模拟器上登录）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;有些问题懂的都懂不要到处传播，打枪滴不要，也不要上纲上线，我只是为了轻松的玩 FGO，怕别用，用别怕。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;:::warning
&lt;a href=&quot;https://yhxy.biligame.com/&quot;&gt;&amp;lt;&amp;lt;哔哩哔哩游戏平台用户协议&amp;gt;&amp;gt;&lt;/a&gt;第 11 条第 2 款规定
用户不得通过不正当的手段或其他不公平的手段使用本平台游戏、本平台服务或参与本平台活动。
用户不得干扰本平台正常地提供游戏和服务，包括但不限于：攻击、侵入本平台的网站服务器，或集中时间段内以超出正常用户登录需求的高频率登录或尝试登录服务器从而使网站服务器过载；破解、修改本平台游戏程序；攻击、侵入本平台游戏的服务器/游戏服务器端程序或使游戏服务器过载；制作、发布、传播、使用任何形式的妨碍游戏公平性的辅助工具或程序（包括但不限于“外挂”, “外挂”是指独立于游戏软件之外的，能够在游戏运行的同时影响游戏操作的所有程序，包括但不限于模拟用户操作、改变操作环境、修改数据等一切类型）。用户不得：利用程序的漏洞和错误(Bug)破坏游戏的正常进行或传播该漏洞或错误(Bug)；不合理地干扰或阻碍他人使用本平台游戏和本平台服务；通过异常或者非法的方式使用本平台游戏(包括但不限于利用本平台游戏登录游戏私服)；使用异常的方法登录游戏（包括但不限于使用非本平台开发、授权或认可的第三方软件、系统登录游戏）、使用网络加速器等外挂软件或机器人程序等恶意破坏服务设施、扰乱正常服务秩序的行为；修改、翻译、注释、整理、汇编、演绎本平台游戏；利用本平台游戏或者本平台服务可能存在的技术缺陷或漏洞而以各种形式为自己及他人牟利（包括但不限于复制游戏虚拟物品等）或者从事其他不正当行为等。
:::&lt;/p&gt;
&lt;h2&gt;界面展示&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/images/mooncaner/main.png&quot; alt=&quot;main.png&quot; /&gt;
&lt;img src=&quot;../../assets/images/mooncaner/maindark.png&quot; alt=&quot;maindark.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;下载安装&lt;/h2&gt;
&lt;p&gt;群文件下载&lt;code&gt;Updater.exe&lt;/code&gt;，新建一个文件夹，将文件放到里面，例如&lt;code&gt;MoonCaner/Updater.exe&lt;/code&gt;，然后运行&lt;code&gt;Updater.exe&lt;/code&gt;，就会自动下载安装，同时也是更新程序&lt;/p&gt;
&lt;h2&gt;更新方式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;自动检测更新，在设置中开启自动检测更新&lt;/li&gt;
&lt;li&gt;手动检测更新，在设置-&amp;gt;关于-&amp;gt;检查更新
&lt;img src=&quot;../../assets/images/mooncaner/update.png&quot; alt=&quot;update&quot; /&gt;&lt;/li&gt;
&lt;li&gt;运行程序根目录的&lt;code&gt;Updater.exe&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;使用说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;先同时运行模拟器和Moon Cancer，在Seraph(设置)中先选中你的模拟器类型，然后点搜索，成功的话选择对应的设备，下面的设置就会自动设置完成，日服或渠道服还需要更改服务器类型然后点设置更改包名。具体设置说明请看&lt;a href=&quot;#%E8%BF%9E%E6%8E%A5%E8%AE%BE%E7%BD%AE&quot;&gt;连接设置&lt;/a&gt;，然后根据需求设置好&lt;a href=&quot;../mooncancer1#%E8%84%9A%E6%9C%AC%E8%AE%BE%E7%BD%AE&quot;&gt;脚本设置&lt;/a&gt;就可以点击&lt;a href=&quot;../mooncancer1#%E5%9F%BA%E6%9C%AC%E5%8A%9F%E8%83%BD&quot;&gt;对应功能&lt;/a&gt;运行脚本了&lt;/li&gt;
&lt;li&gt;点击下面链接可查看每个界面具体说明：&amp;lt;br&amp;gt;
&lt;a href=&quot;../mooncancer1&quot;&gt;Moon界面说明&lt;/a&gt;&amp;lt;br&amp;gt;
&lt;a href=&quot;../mooncancer2&quot;&gt;Cancer界面说明&lt;/a&gt;&amp;lt;br&amp;gt;
&lt;a href=&quot;../mooncancer3&quot;&gt;Alter界面说明&lt;/a&gt;&amp;lt;br&amp;gt;
&lt;a href=&quot;../mooncancer4&quot;&gt;Eisyou界面说明&lt;/a&gt;&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;标题栏说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;右上角的帮助图标可以打开&lt;code&gt;帮助&lt;/code&gt;弹窗，有问题随时可以查看点击跳转对应的说明书，如果觉得有帮助可以赞助我一点。&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;在启动任意任务后会出现&lt;code&gt;暂停&lt;/code&gt;按钮，可以暂停执行中的任务。&amp;lt;br&amp;gt;
&lt;img src=&quot;../../assets/images/mooncaner/planmeun.png&quot; alt=&quot;planmeun&quot; /&gt;&lt;/li&gt;
&lt;li&gt;任意时候都可以点击计划按钮选择计划或取消计划，关机会在任务结束后关机，休眠同理；挂机会在任务结束后，挂机等待体力够进入当前关卡，建议使用时开启&lt;code&gt;清理剩余体力&lt;/code&gt;选项&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;模拟器设置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用其他模拟器理论上可行，但推荐MuMu或雷电，这两个适配了高速连接，本身玩fgo也比较稳定，MuMu现在官网已经只能下载到新版了，想用旧版这里有历史版本&lt;a href=&quot;https://www.cnblogs.com/wutou/p/18165628&quot;&gt;MuMu模拟器历史版本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;模拟器用16：9的分辨率，1280x720起步，分辨率过低可能无法识别，最重要的mumu模拟器&lt;code&gt;关闭&lt;/code&gt;后台保活,一定要&lt;code&gt;关闭&lt;/code&gt;，记住是&lt;code&gt;关闭&lt;/code&gt;，如下图所示。其他模拟器可能也有一些导致无法正常截图的设置
&lt;img src=&quot;../../assets/images/mooncaner/mumusetting.png&quot; alt=&quot;mooncanermumusetting&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;连接设置&lt;/h3&gt;
&lt;p&gt;:::important
请在设置之前打开要使用的模拟器，多开的情况要保证目标模拟器先启动，不然修改数值会失败。&lt;/p&gt;
&lt;p&gt;按下图标记顺序完成设置即可连接设备，如果是mumu模拟器B服，只需要进行第2步搜索设备选择确认即可。&lt;/p&gt;
&lt;p&gt;如果是其他情况，例如雷电模拟器日服，那就要按1234的顺序设置，56只要第2步自动填入了内容就用管。
:::
&lt;img src=&quot;../../assets/images/mooncaner/settings1.png&quot; alt=&quot;settings1&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;模拟器设备&lt;/code&gt;列表里有的都支持自动搜索，没有就选other，这里选MuMu和雷电的话默认使用高速连接，切换到other时只要参数正确也能正常使用adb连接；如果高速连接出现问题可以切换到other使用默认连接方式，&lt;code&gt;如果是新版MuMu只能选mumu才能正常使用&lt;/code&gt;。&amp;lt;br&amp;gt;
可以自动搜索已经在运行的模拟器，自动搜索设备并设置好所有参数理论支持MuMu、雷电、蓝叠、逍遥、夜神，但只测试了MuMu和雷电，搜不到就自己输入对应的参数，端口上网搜XX模拟器端口，连接问题可以参考&lt;a href=&quot;https://www.bilibili.com/opus/605452889655035035?spm_id_from=333.999.0.0&quot;&gt;BBChannel&lt;/a&gt;的相关说明。&lt;strong&gt;注意，如果自动搜索成功就不要动下面的模拟器位置和虚拟机进程名称&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;服务器和包名&lt;/code&gt;可以选择国服和日服，更改后请设置包名。包名默认是B服，其他客户端要修改，设置好连接参数后，打开模拟器后能自动搜索，搜索失败就自己填了
:::warning
自动搜索并成功设置的情况下不要动&lt;code&gt;模拟器位置&lt;/code&gt;和&lt;code&gt;虚拟机进程名称&lt;/code&gt;这两项，除非你知道自己在干什么
:::&lt;/li&gt;
&lt;li&gt;&lt;code&gt;模拟器位置&lt;/code&gt;是用来启动模拟器的命令，一般选择模拟主器程序的位置就行了，也可也自己加参数，自动搜索的是带参数的&lt;/li&gt;
&lt;li&gt;&lt;code&gt;虚拟机进程名称&lt;/code&gt;是读取内存的目标，是修改的基础，&lt;strong&gt;没填或没填对脚本没法正常工作&lt;/strong&gt;，默认就是mumu模拟器的&lt;/li&gt;
&lt;li&gt;&lt;code&gt;推理引擎&lt;/code&gt;设置OCR推理引擎，onnxruntime内存占用少，openvino速度快占用内存多，如果没有问题建议朗读时追求速度再切换openvino&lt;/li&gt;
&lt;li&gt;&lt;code&gt;连接等待时间&lt;/code&gt;如果自动启动模拟器时，模拟器启动时间过长导致没连上，可以增加等待时间&lt;/li&gt;
&lt;li&gt;剩下的设置没啥好讲的了，自己看着选
:::tip
这里简单说一下怎么找到自己模拟器的虚拟机名称，打开模拟器，再打开任务管理，在进程里找到占用最高的模拟器相关进程(这里以mumu为例)，右键打开文件所在的位置，就可以直到程序，复制名称就行了，要包括.exe。
或者直接问AI一般也能得到一个比较准确的答案，可以参考着找一下，就问 &lt;strong&gt;XX模拟器的虚拟机进程名称是什么&lt;/strong&gt;
&lt;img src=&quot;../../assets/images/mooncaner/taskmanager.png&quot; alt=&quot;taskmanager&quot; /&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;游戏内设置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;记得打开&lt;strong&gt;筛选&lt;/strong&gt;（我该不会是最后一个知道的吧），&lt;strong&gt;加快敌人消失速度&lt;/strong&gt;，&lt;strong&gt;战斗二倍速&lt;/strong&gt;。筛选可以减少找到目标礼装的时间，不过现在羁绊礼装太多，午茶反而排到羁绊礼装的最后面去了
&lt;img src=&quot;../../assets/images/mooncaner/filter.png&quot; alt=&quot;filter&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;其他问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;如果开始后连接出现如下错误，而且执行的非常慢，请先卸载模拟器内的&lt;code&gt;yosemite&lt;/code&gt;应用，然后重试&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[17:16:03][ERROR]&amp;lt;airtest.core.android.cap_methods.screen_proxy&amp;gt; OSError(&apos;socket connection broken&apos;)
[17:16:03][ERROR]&amp;lt;airtest.core.android.cap_methods.screen_proxy&amp;gt; Javacap setup up failed!
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果同时使用BBChannel，反复出现上诉问题，将&lt;code&gt;MoonCancer\assets\static&lt;/code&gt;文件夹复制到BBchannel里面的&lt;code&gt;dist\BBchannel64\airtest\core\android\static&lt;/code&gt;覆盖，这个方式同样能解决BBChannel的连接问题&lt;/li&gt;
&lt;li&gt;遇到错误请在群里反馈，尽量在出现问题的地方截屏或录屏，最好用模拟器自带的方式截屏和录屏&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;碎碎念&lt;/h2&gt;
&lt;p&gt;有这个想法已经几年了终于是实现了，第一次写这么正式的项目，只能说有编程基础，摸着石头过河，写的很烂，但由于某些原因，不能公开分享。
开始这个项目快一年了，也更新到了2.0全新版本，还搭建博客，过的挺充实的&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;相关项目&lt;/h2&gt;
&lt;p&gt;使用和参考相关项目：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pur1fying/blue_archive_auto_script&quot;&gt;Blue Archive Auto Script碧蓝航线脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hgjazhgj/FGO-py&quot;&gt;FGO-py脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/AirtestProject/Airtest&quot;&gt;Airtest自动化测试库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RapidAI/RapidOCR&quot;&gt;RapidOCR文字识别&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zhiyiYo/PyQt-Fluent-Widgets&quot;&gt;PyQt-Fluent-Widgets图形界面组件库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/srounet/Pymem&quot;&gt;Pymem内存读取修改&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>