感谢你愿意帮助改进 Moonward。无论是一行代码、一份翻译、一条 Bug 反馈,还是功能建议,都对项目很有价值。
Moonward 是 Windows 平台的米哈游游戏启动器(WinUI 3 / .NET 10),支持原神、星穹铁道、绝区零、崩坏 3 等 PC 端游戏。
本仓库(TurmoilZoom/Moonward)基于上游 Scighost/Starward 维护,并包含额外的功能与修复。发布渠道见本仓库 Releases。
| 分支 | 用途 |
|---|---|
main |
仅跟踪上游 Scighost/Starward 的 main,由 CI 定时同步,不要在此分支提交开发代码 |
rebase/develop |
日常集成分支,承载本 fork 的定制改动 |
dev/* |
功能或修复的短期开发分支,完成后合并回 rebase/develop |
若你的改动属于上游通用问题(与 fork 定制无关),也可以考虑向上游 Scighost/Starward 提交 Issue 或 Pull Request。
反馈请从 Issue 模板选择页 进入,不要开空白 Issue。闲聊与经验分享可走 Discussions。
优先在软件内 设置 → 关于 → 反馈问题 提交(会自动填写诊断信息并打开日志文件夹)。也可使用 Bug Report 模板,并尽量提供:
- 清晰的问题描述
- 诊断信息与当天日志
提交前请先搜索已有 Issue,避免重复。
使用 Feature Request 模板,先写要解决的问题,再写建议做法。对于较大改动,建议先在 Issue 中讨论方案,再开始编码。
使用 Question 模板。不确定是否为缺陷时,也可以先发 Discussions。
- 应用内文案:在 Crowdin 上参与翻译与校对。详见 本地化指南。
- 仓库文档:Markdown 译文放在
docs/目录,文件名追加语言标签(如Localization.zh-CN.md),并在原文开头添加指向译文的链接。
开发阶段若新增 Lang.* 字符串,需同时修改 Lang.resx、Lang.zh-CN.resx 和 Lang.Designer.cs 三处(dotnet build 不会自动更新 Designer 文件)。
- Fork 本仓库,从
rebase/develop创建分支(命名建议:feat/xxx、fix/xxx、docs/xxx)。 - 在本地完成改动,确保构建通过(见下文)。
- 向
rebase/develop(或约定的dev/*集成分支)发起 Pull Request。 - 在 PR 描述中说明改动动机、测试方式,并关联相关 Issue(如有)。
- Windows 10 1809(17763)或更高版本
- WebView2 Runtime
- WebP 映像扩展(系统通常已预装)
安装 Visual Studio 2022 并勾选以下工作负载:
- .NET 桌面开发
- 使用 C++ 的桌面开发
- 通用 Windows 平台开发
.NET SDK 版本由仓库根目录 global.json 锁定(当前 10.0.301)。请勿擅自升级 SDK 或 NuGet 包版本。
也可仅安装 .NET SDK 后通过命令行构建。
仓库没有 .sln 文件,直接编译主项目即可(会自动带上所有 ProjectReference):
# 日常开发验证(推荐)
dotnet build src/Starward/Starward.csproj -c Debug -p:Platform=x64
# Release 自包含构建
dotnet build src/Starward/Starward.csproj -c Release -p:Platform=x64 -p:RuntimeIdentifier=win-x64改完代码后至少保证 0 error 构建通过。项目目前没有单元测试,也没有编译类 CI,构建通过 + 必要时手动运行应用即为主要验证手段,请在提交前本地跑一遍。
注意:开发版可能损坏个人数据库
StarwardDatabase.db,测试前请备份。
src/Starward/ 主程序:UI、Features、DI(AppConfig.*)
src/Starward.Core/ API Client、DTO、JsonContext(禁止引用 WinUI)
src/Starward.Language/ 应用文案(Lang.resx)
src/Starward.RPC/ 独立 gRPC 服务进程(需提权的安装等操作)
src/Starward.Setup.Core/ GitHub Release 发行说明拉取
更详细的架构说明见 AGENTS.md 及其按任务引用的 .agents/rules/(面向维护者与 AI 编码助手)。
以「每日签到(SignIn)」为参考,按以下顺序逐层改动:
DTO → JsonContext → Client → GameRecordService → Feature Service → UI → GameFeatureConfig → DI → Lang
| 层 | 位置 | 职责 |
|---|---|---|
| DTO | Starward.Core/GameRecord/<功能>/*.cs |
API 请求/响应模型、返回码枚举 |
| 活动配置 | *ActivityConfig.cs(按需) |
按游戏与区服映射 act_id、接口主机等常量 |
| JsonContext | GameRecordJsonContext.cs |
新 DTO 类型必须注册 |
| Client | HyperionClient(CN) / HoyolabClient(OS) |
HTTP;平台差异放在子类 |
| Service 门面 | Features/GameRecord/GameRecordService.cs |
按区服选择 Client |
| 业务服务 | Features/GameRecord/<功能>/<功能>Service.cs |
缓存、错误映射 |
| UI | 对应 XAML 控件,挂到 GameLauncherPage 等 |
用户交互 |
| 开关 | GameFeatureConfig.Support* |
按 GameBiz 启用 |
| DI / 设置 | AppConfig.ServiceProvider.cs、AppConfig.Setting.cs |
注册服务与用户设置 |
| 文案 | Lang.resx + Lang.zh-CN.resx |
用户可见字符串 |
- 开启
Nullable;异步方法带CancellationToken cancellationToken = default。 - JSON 序列化使用
*JsonContext.Default,不要无 context 反序列化。 - API 请求走
GameRecordClient.CommonSendAsync;CN/OS 平台差异放在 Client 子类,不要散落在 UI。 - 日志用
ILogger<T>;跨组件通信用CommunityToolkit.Mvvm.Messaging。 - 页面继承
PageBase,导航参数为GameId/GameBiz。 x:Bind绑定的ObservableObject属性必须在 UI 线程赋值(ConfigureAwait(false)或Task.Run后直接赋值会触发COMException)。
- 每个方法写 XML 文档注释(
/// <summary>、<param>、<returns>)。 - 关键分支、平台差异、线程切换等不显然处用行内
//注释说明为什么。 - 注释语言与文件现有风格保持一致(多为中文)。
- 主视觉为亚克力背景;动画优先使用 Composition(见
Helpers/FluentAnimations.cs)。 DropDownButton弹出层在独立视觉树,无法做亚克力,不要强行改造。- 不要升级
CommunityToolkit.WinUI.Controls.Segmented(csproj 中有说明)。
用户数据使用 SQLite,迁移定义在 Features/Database/DatabaseSqls。修改 schema 时:
- 新增
Sql_vN常量(不要修改已发布的旧迁移)。 - 追加到
DatabaseSqls列表。 - 以
PRAGMA USER_VERSION = N结尾。
从上游 Starward 导入:上游每多一个 Sql_vN,先补 StarwardOnlyRollbacks(或 // import-keep: N),再提高 KnownMaxStarwardUserVersion。GitHub Actions「Check Starward Import Compat」只对照上游 main 做检查,不自动改代码。本地:python .github/scripts/check-starward-import-compat.py。
Starward.Core引用 WinUI。- 在
Program.Main里 Velopack 之前插入逻辑。 - 无迁移地修改 SQLite schema。
- 与当前任务无关的大范围重构。
- 提交
bin/、obj/、日志文件。
提交 PR 前请确认:
- 基于最新的
rebase/develop(或目标集成分支)创建分支 -
dotnet build通过,0 error - 用户可见字符串已写入
Lang.resx,未硬编码 - 新 DTO 已注册到对应
JsonContext - 未包含
bin/、obj/、日志等无关文件 - PR 描述清晰,说明了测试方式
建议使用简洁的祈使句,说明「做了什么」而非「做了什么改动」:
fix: 修复自定义背景在分辨率变化后回退的问题
feat: 为首页添加功能图钉
docs: 补充 URL 协议说明
若一次提交包含多个不相关改动,请拆分为多个 commit 或 PR。
参与贡献即表示你同意将改动以 MIT License 发布。提交代码时保留上游与当前维护者的版权声明。
再次感谢你的贡献。如有疑问,欢迎在 Issue 中提问。