Skip to content

NoahCodeGG/scbox-app

Repository files navigation

scbox-app

StarCraft 2 实时战术语音助手 — 一个 Tauri 2 + React + TypeScript 桌面应用,在游戏中通过语音播报和悬浮窗提示引导你完成精准的 build order 和战术时机。

灵感来源于手机应用 SCBox,但作为原生桌面应用运行在 SC2 旁边,无需额外设备。

🤖 AI 开发申明 — 本项目在开发过程中大量借助 AI 编程工具辅助实现。


✨ 核心特性

  • 🎯 自动同步游戏时钟 — 通过 SC2 Client API(127.0.0.1:6119)实时读取游戏状态,无需手动计时
  • 🗣️ 多层语音播报 — 跨平台语音支持(Web Speech → 原生 TTS → 安装提示),中文语音自动回退
  • 📊 精确时间插值 — ~100ms 粒度的平滑倒计时,暂停时冻结,亚秒级提示精度
  • 🎮 自动对阵识别 — 根据你的种族和对手种族自动选择对应的 build order,流程列表按当前对阵过滤并提供完整步骤预览
  • 📝 52 个内置 build — 随版本更新下发的只读默认流程,可一键「复制为我的流程」或新建生成可编辑副本(存于用户目录)
  • 🪟 智能悬浮窗 — 可拖动定位、可选穿透模式(不抢游戏焦点)、显示未来 3 步、可自定义全局快捷键逃生
  • ⚙️ 灵活配置 — 提前播报时间、API 端口、语音开关/速度、主题、窗口位置全部可调
  • 🔄 自动更新 — 启动时及设置内「检查更新」自动获取签名新版本

📦 安装

Windows(推荐)

  1. GitHub Releases 下载最新的 .msi.exe 安装包(已签名 + 支持自动更新)
  2. 运行安装程序
  3. 开发构建可在 GitHub Actions(ci.yml) 获取

macOS

release.yml 现也构建 macOS .dmgApple Silicon / 未公证)。首次打开需右键「打开」,或执行:

xattr -dr com.apple.quarantine /Applications/scbox-app.app

本地开发(macOS / Linux / Windows)

# 安装依赖
pnpm install

# 开发模式运行
pnpm tauri dev

# 构建生产版本
pnpm tauri build

🚀 使用指南

1️⃣ 启用 SC2 Client API

在 SC2 启动选项中添加:

-clientapi 6119

或在 Battle.net 客户端 → SC2 设置 → 游戏启动参数中添加上述选项。

2️⃣ 准备 Build Order

应用内置 52 个只读默认 build(随版本更新下发),无需手动准备即可使用。要定制,请在主窗口左侧导航「流程」页:

  • 选中某个只读默认流程,点击「复制为我的流程」生成可编辑副本
  • 或直接新建一个流程

用户的可编辑 build 保存在用户目录:

Windows: %APPDATA%\com.scbox-app.app\builds\
macOS: ~/Library/Application Support/com.scbox-app.app/builds/

应用永远不会覆盖你的用户 build;开始新一局时会自动重载。

Build Order JSON 格式:(示例文件名如 tvz-两船兵.json

{
  "name": "TvZ 两船兵",
  "matchup": "TvZ",
  "race": "Terran",
  "leadTimeSec": 4,
  "steps": [
    { "time": 14, "say": "补给站" },
    { "time": 16, "say": "兵营" },
    { "time": 19, "say": "气矿" }
  ]
}
  • name: 人类可读的流程名称
  • matchup: 对阵匹配(如 TvPTvZTvX = 任意对手)
  • race: 你的种族(Terran / Protoss / Zerg
  • leadTimeSec: 提前几秒播报(可在设置中覆盖)
  • steps: 时间点(游戏秒数)+ 播报内容;编辑器以 mm:ss 输入,磁盘仍存为秒(number)

3️⃣ 配置设置

在主窗口左侧导航点击 设置(仪表盘 / 流程 / 设置)打开设置面板:

设置项 说明 默认值
Client API 端口 SC2 API 端口,匹配启动参数 6119
提前播报时间 覆盖 build order 的 leadTimeSec null(使用 build 自带)
语音播报 开关语音提示 开启
语音速度 播报速度(0.5–2.0) 1.0
穿透模式 点击穿透到游戏(不抢焦点) 关闭
穿透快捷键 解除穿透的全局快捷键(可自定义) Ctrl+Shift+S
主题 界面主题(深色 / 浅色 / 跟随系统) 跟随系统

设置面板内还提供 「检查更新」 按钮,可手动触发自动更新检查(应用启动时也会自动检查)。

4️⃣ 悬浮窗操作

  • 拖动: 鼠标拖动窗口顶部条移动位置
  • 穿透模式: 开启后窗口变透明点击,按穿透快捷键解除(默认 Ctrl+Shift+S,可在设置自定义,防锁死)
  • 多步显示: 同时显示接下来 3 步,最近的高亮 + 倒计时,后两步灰显

🛠️ 开发

技术栈

  • 前端: React 18 + TypeScript + Vite
  • 桌面: Tauri 2(Rust + WebView2/WKWebView)
  • 测试: Vitest(前端单元测试)+ cargo test(Rust)
  • 自动更新: tauri-plugin-updater(启动 + 手动检查)
  • CI/CD: GitHub Actions — ci.yml(push/PR 测试+构建)+ release.yml(tag 触发签名发布 + 自动更新,Win+Mac)

项目结构

scbox-app/
├── src/                    # React 前端代码
│   ├── components/         # UI 组件(SettingsPanel、流程编辑器页 等)
│   ├── hooks/             # React hooks(useGameSnapshot, useBuildOrderVoice 等)
│   ├── lib/               # 纯函数逻辑(schedule, clock, matchup, speech)
│   ├── types/             # TypeScript 类型定义
│   └── App.tsx            # 主应用(悬浮窗)
├── src-tauri/             # Tauri 后端(Rust)
│   ├── src/
│   │   ├── data/builds/   # 内置默认 build(编译期只读嵌入)
│   │   ├── builds.rs      # Build order 磁盘 IO
│   │   ├── sc2.rs         # SC2 Client API 轮询
│   │   ├── settings.rs    # 用户设置持久化
│   │   ├── tts.rs         # 原生 TTS 封装(tts crate)
│   │   └── lib.rs         # 主入口 + 命令注册
│   ├── capabilities/      # Tauri 权限配置
│   └── tauri.conf.json    # Tauri 配置(窗口、打包)
└── .trellis/              # Trellis 任务管理 + 规范文档

本地运行

# 1. 安装依赖
pnpm install

# 2. 开发模式(热重载)
pnpm tauri dev

# 3. 运行测试
pnpm test              # 前端单元测试
cd src-tauri && cargo test  # Rust 测试

# 4. 类型检查
npx tsc --noEmit

# 5. 构建生产版本
pnpm tauri build       # 输出到 src-tauri/target/release/bundle/

关键设计决策

  1. 游戏时钟同步
    每秒轮询 http://127.0.0.1:6119/game,前端插值到 ~100ms 粒度(useInterpolatedClock),暂停时冻结。

  2. 敌我识别
    取第一个 type:"user" 玩家为"我"(SC2 API 通常把本地玩家列在最前),无 user 时回退第一个玩家;对手为 2 人局中的另一方。

  3. 语音分层回退
    Web Speech(浏览器)→ 原生 TTS(Rust tts crate,WinRT/AVFoundation)→ 安装提示。中文语音是 OS 级功能,需用户自行安装语音包。

  4. 窗口控制
    data-tauri-drag-region 拖动、setIgnoreCursorEvents 穿透、全局快捷键(tauri-plugin-global-shortcut)解除穿透,位置持久化到 settings。

  5. Build Order 选择
    matchup 字段格式 <我的种族字母>v<对手种族字母>(如 TvP),精确匹配优先,vX 作为通配符。


📋 已知问题

  • 多屏位置 — 多显示器时窗口位置持久化可能不准确
  • Windows 语音 — 需要系统安装中文语音包,否则无声(会提示)
  • macOS 未公证 — 应用未经 Apple 公证,首次打开需右键「打开」或 xattr -dr com.apple.quarantine 绕过 Gatekeeper

🤝 贡献

欢迎提 issue 和 PR!开发流程:

  1. Fork 本仓库
  2. 创建 feature 分支(git checkout -b feature/xxx
  3. 提交改动(git commit -m 'feat: xxx'
  4. Push 到分支(git push origin feature/xxx
  5. 提交 Pull Request

代码规范遵循 .trellis/spec/ 下的文档。


📄 License

MIT License


🙏 致谢

About

StarCraft 2 实时战术语音助手 — 一个 Tauri 2 + React + TypeScript 桌面应用,在游戏中通过语音播报和悬浮窗提示引导你完成精准的 build order 和战术时机。

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors