Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@CONTRIBUTING.md
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@CONTRIBUTING.md
120 changes: 118 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,119 @@
> W.I.P
欢迎为[《无名杀》](https://github.com/libnoname/noname)贡献代码!本文档帮助你了解项目结构、开发规范和提交流程。

请参考[此处](https://github.com/libnoname/noname/wiki/%E3%80%8A%E6%97%A0%E5%90%8D%E6%9D%80%E3%80%8B%E9%A1%B9%E7%9B%AE-Pull-Request-%E6%8F%90%E4%BA%A4%E8%A7%84%E8%8C%83)了解无名杀的PR规范。
## 快速开始

- 环境配置: [本地文档](docs/how-to-start.md) / [GitHub 文档](https://github.com/libnoname/noname/wiki/%E5%A6%82%E4%BD%95%E8%BF%90%E8%A1%8C%E6%97%A0%E5%90%8D%E6%9D%80%EF%BC%88%E7%A8%8B%E5%BA%8F%E5%91%98%E7%89%88%EF%BC%89)
- 本地文档: [docs/](docs/)

**技术栈**:

- **包管理**: pnpm workspace (>=9)
- **运行时**: Node.js ^20.19.0 || >=22.12.0
- **构建**: Vite (preserveModules, 不压缩, 不 treeshake)
- **类型**: TypeScript (迁移中, strict 未开启)
- **UI**: 原生JS (正在迁移到Vue 3)
- **代码风格**: ESLint + Prettier, tab缩进, 小驼峰

```bash
pnpm install # 安装依赖
pnpm dev # 启动开发服务器
```

## 项目概览

### 项目结构

```text
apps/core/ 主项目 — 游戏核心、UI、武将/卡牌/模式数据
apps/electron/ Electron 桌面端
apps/mobile/ 移动端 (Capacitor)
packages/ 工程化包
fs/ HTTP静态资源服务器 + 文件操作接口
jit/ JIT 编译
server/ 联机服务器
extension/ 工程化扩展开发 → 产物放到 apps/core/extension/
docs/ 本地文档
scripts/ 顶层构建/工具脚本
```

### 命名空间

`apps/core/noname.js` 是框架入口,导出六个全局命名空间。所有内容直接挂载在上面,无隔离、无对外接口:

| 导出 | 别名 | 职责 |
| ---- | ---- | ---- |
| `Library` | `lib` | 元素/技能/配置管理 |
| `Game` | `game` | 游戏流程/事件循环 |
| `UI` | `ui` | 界面渲染 |
| `Get` | `get` | 查询/检索 |
| `Status` | `_status` | 运行时状态 |
| `AI` | `ai` | AI 逻辑 |

命名空间非模块,是类 C++ `std::` 的全局寄存器。任何内容注册后全局可访问,修改时需注意兼容性(尤其在社区扩展生态中)。

### 目录自动导入

`apps/core/noname/init/import.ts` 按目录结构自动解析导入路径:

- **武将包**: `/character/{包名}/index.js` → 先试 `.js`,安全上下文下回退到 `.ts`
- **卡牌包**: `/card/{包名}.js`
- **模式**: `/mode/{模式名}/index.js`
- **扩展**: `/extension/{扩展名}/extension.js`

所有内容必须导出 `type` 字段标明类型 (`"character" | "card" | "mode" | "extension"`)。

旧版是单文件入口(`character/name.js`),新版是目录入口(`character/name/index.ts`),已迁移的武将通过 `game/config.json` 中的 `moderned_characters` 列表追踪。

## 开发规范

- **提交信息**: 中文 Conventional Commits (`feat:`, `fix:`, `perf:`, `docs:`, `build:`, `refactor:` 等)
- **命名**: JS 生态小驼峰,无特殊中文/拼音要求
- **分支**: 主分支 `main`
- **PR 流程**: 参考 [PR 模板](.github/PULL_REQUEST_TEMPLATE/)(功能提交 / 更新报告)
- **测试**: 项目目前没有自动化测试。修改核心逻辑(命名空间挂载、ContentCompiler、导入系统)需格外谨慎
- **"代提" PR**: 表示替不会用 git/上不了 GitHub 的贡献者提交代码

新手入门:

- [Git 下载安装指南](https://github.com/libnoname/noname/wiki/Git%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97)
- [Github 桌面版客户端使用入门](https://docs.github.com/zh/desktop/overview/getting-started-with-github-desktop)
- [如何提交代码到《无名杀》Github 仓库](https://github.com/libnoname/noname/wiki/%E5%A6%82%E4%BD%95%E6%8F%90%E4%BA%A4%E4%BB%A3%E7%A0%81%E5%88%B0%E3%80%8A%E6%97%A0%E5%90%8D%E6%9D%80%E3%80%8BGithub%E4%BB%93%E5%BA%93)

## 核心架构

### Content 系统

游戏逻辑的执行引擎,使用责任链模式统一编译为 `(event: GameEvent) => Promise<void>`:

| 写法 | 状态 | 说明 |
| ---- | ---- | ---- |
| 单 async 函数 | **推荐** | `setContent(async (event, trigger, player) => { ... })` |
| 函数数组 | 待废弃 | `setContent([fn1, fn2, fn3])` |
| step 语法 | 待废弃 | `setContent(function() { "step 0"; ... })` |

**所有新代码使用单 async 函数写法。** 项目正从旧的 step DSL 逐步迁移到 async,迁移路线详见 `docs/game-event/content.md`。

### 构建系统

`apps/core/scripts/build.ts` 是核心构建脚本:

- 本体构建使用 `preserveModules: true` 保留文件结构,`treeshake: false`,`minify: false`
- Vue 作为 external,通过 import map 运行时加载
- 武将包/卡牌包/模式包单独构建到 `dist/` 对应子目录
- 构建后通过 static copy 和 import map 组装为与旧项目兼容的物理结构

### 扩展系统

双层结构以兼容旧生态的相对路径导入:

- `packages/extension/` — 工程化扩展的**源码**
- `apps/core/extension/` — 扩展的**产物**(工程化扩展打包结果 + 未工程化扩展直接存放)

扩展生态与主仓库开发差异较大。

## 迁移状态

项目正从 **ES5 巨石应用** 迁移到 **pnpm monorepo + TypeScript**。所有迁移都是新旧并存、渐进式的:

- **JS → TS**: 类型文件集中在 `typings/`,严格度暂时放宽 (`noImplicitAny: false` 等)
- **step → async**: 旧的 step DSL(字符串标记步骤边界)正在逐步替换为单 async 函数。`docs/game-event/content.md` 详细描述了 ContentCompiler 的三种格式及迁移路线
73 changes: 31 additions & 42 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# 无名杀
# 无名杀 (noname)

开源卡牌游戏。

## 项目使用约定

Expand All @@ -8,60 +10,47 @@
1. 打包、二次分发 **请保留代码出处**:<https://github.com/libnoname/noname>
2. 请不要用于商业用途。

> 关于《无名杀十周年》破坏开源协议的违法行为的通告:
> <https://github.com/libnoname/noname/discussions/3892>

## 快速启动

### 环境要求
> **提示:** 新手请参考 [本地文档](./docs/how-to-start.md) 或 [GitHub 文档](https://github.com/libnoname/noname/wiki/%E5%A6%82%E4%BD%95%E8%BF%90%E8%A1%8C%E6%97%A0%E5%90%8D%E6%9D%80%EF%BC%88%E7%A8%8B%E5%BA%8F%E5%91%98%E7%89%88%EF%BC%89) 配置环境。

> **提示:** 请参考 [本地文档](./docs/how-to-start.md) 或 [github文档](https://github.com/libnoname/noname/wiki/%E5%A6%82%E4%BD%95%E8%BF%90%E8%A1%8C%E6%97%A0%E5%90%8D%E6%9D%80%EF%BC%88%E7%A8%8B%E5%BA%8F%E5%91%98%E7%89%88%EF%BC%89) 配置环境。
### 环境要求

- [Node.js](https://nodejs.org/) ^20.19.0 || >=22.12.0
- [pnpm](https://pnpm.io/) >= 9
Comment thread
rintim marked this conversation as resolved.
- Webview: Chromium >= 91 || Safari >=16.4.0 (暂不支持Firefox)

### 安装依赖
- Webview: Chromium >= 91 || Safari >= 16.4 (暂不支持 Firefox)

```bash
pnpm install
```

### 启动
### 安装与启动

```bash
pnpm dev
pnpm install # 安装依赖
pnpm dev # 启动开发服务器
```

---

贡献代码可阅读相关文档:

[Git 下载安装指南](https://github.com/libnoname/noname/wiki/Git%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97)
## 外部资源

[Github 桌面版客户端使用入门](https://docs.github.com/zh/desktop/overview/getting-started-with-github-desktop)
- 仓库: <https://github.com/libnoname/noname>
- 贡献指南: [CONTRIBUTING.md](CONTRIBUTING.md)

[如何提交代码到《无名杀》Github 仓库](https://github.com/libnoname/noname/wiki/%E5%A6%82%E4%BD%95%E6%8F%90%E4%BA%A4%E4%BB%A3%E7%A0%81%E5%88%B0%E3%80%8A%E6%97%A0%E5%90%8D%E6%9D%80%E3%80%8BGithub%E4%BB%93%E5%BA%93)
客户端下载:

[《无名杀》项目 Pull Request 提交规范](https://github.com/libnoname/noname/wiki/%E3%80%8A%E6%97%A0%E5%90%8D%E6%9D%80%E3%80%8B%E9%A1%B9%E7%9B%AE-Pull-Request-%E6%8F%90%E4%BA%A4%E8%A7%84%E8%8C%83)
- 安卓: <https://github.com/nonameShijian/noname-shijian-android/releases/tag/v1.6.8>
- PC: <https://github.com/nonameShijian/noname/releases/tag/v1.75>

客户端下载戳这里:
## 项目结构

安卓: <https://github.com/nonameShijian/noname-shijian-android/releases/tag/v1.6.8>

PC: <https://github.com/nonameShijian/noname/releases/tag/v1.75>

网页端推荐使用 Chrome 系内核浏览器游玩,暂不支持 Firefox 浏览器

请尽量保证游玩的 Chrome 系浏览器或手机 Webview 的`内核版本大于等于91`

---

最近有一伙人号称是《无名杀十周年》的开发团队,宣称《无名杀十周年》“全新无名杀,比旧版拥有更多武将,兼容更多扩展”,实际上:

- 《无名杀十周年》(原《无名杀清瑶版》)由无名杀 v1.9.124 修改而来,属于无名杀的一种**Fork**,并非“全新无名杀”;且《无名杀十周年》开发团队**公然违反 GPL-3.0 协议**,详情请看[这里](https://github.com/github/dmca/blob/master/2023/09/2023-09-20-noname.md)、[这里](https://tieba.baidu.com/p/8623890806)以及[这里](https://tieba.baidu.com/p/8624582238)。
- 《无名杀十周年》至今没有更新神典韦等新机制武将,且删除了部分无名杀的原创武将,导致《无名杀十周年》的武将数量远远不及无名杀前几个版本的武将数量;不仅如此,《无名杀十周年》自分裂后的部分武将源码依然来自无名杀和其他开发者开源的代码。
- 《无名杀十周年》兼容扩展的方式是不更新本体数据,从而导致《无名杀十周年》仍然在用 1.9.124 版本的代码,无法兼容使用 1.10 以后功能的扩展;而且《无名杀十周年》开发团队在使用**大量**GPL-3.0 开源的代码后对生成产物进行了**混淆加密**,在**违反开源精神**的同时,也导致扩展稳定性极具下降,更容易出问题。

《无名杀十周年》就是彻头彻尾的骗局,《无名杀十周年》的开发团队更是一群拿无名杀吸血的骗子,虽然号称“不忘初心”,却公然对最有资格论述无名杀创作初心的无名杀创始人进行侮辱谩骂,直接违背其制定的规则和开源精神,恶劣程度远超当初在多个无名杀社群“自立”的水叶之流。

先秦介子推曾言:“窃人之财,犹谓之盗,况贪天之功以为己力乎。”无名杀社区发展至今,正是因为有大量的开源代码进行参考,才能不断推陈出新。试想每个扩展开发者在成为一个扩展开发者之前,谁敢说没有大量参考社区内的源码?每个作品凝聚的都是大家的心血,而不是仅仅归属于个别人。我们相信:开放、共享、多元才是无名杀的初心,绝不是封闭、私藏与趋同。

我们在此呼吁无名杀社区正确认识《无名杀十周年》开发团队的一些行为与做法,并希望《无名杀十周年》开发团队能反省迄今以来的所作所为。**自由开源**是无名杀社区的灵魂,希望各方都能够遵循这一精神。
```text
apps/core/ 主项目 — 游戏核心、UI、武将/卡牌/模式数据
apps/electron/ Electron 桌面端
apps/mobile/ 移动端 (Capacitor)
packages/ 工程化包
fs/ HTTP静态资源服务器 + 文件操作接口
jit/ JIT 编译
server/ 联机服务器
extension/ 工程化扩展开发 → 产物放到 apps/core/extension/
docs/ 本地文档
scripts/ 顶层构建/工具脚本
```
6 changes: 6 additions & 0 deletions apps/core/character/bingshi/character.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
const characters = {
pot_lvyi: {
sex: "male",
group: "wu",
hp: 4,
skills: ["pothuilv", "potsongyan", "potshishi"],
},
pot_caoshuang: {
sex: "male",
group: "wei",
Expand Down
3 changes: 2 additions & 1 deletion apps/core/character/bingshi/characterTitle.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
//pot_lvyi: "",
pot_caoshuang: "擅政专权",
//pot_zhangren: "",
pot_sunchen: "凶竖盈溢",
Expand All @@ -7,7 +8,7 @@ export default {
//pot_chenjiao: "",
//pot_zanghong: "",
sp_zhonghui: "荡蜚缴志",
mb_chenzhi: "承担接贤",
mb_chenzhi: "承担接贤",
mb_sunjun: "横逆自固",
guoyuan: "清介有守",
mb_huangzu: "守殁枭寒",
Expand Down
1 change: 1 addition & 0 deletions apps/core/character/bingshi/intro.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading