Merge remote-tracking branch 'origin/master'

# Conflicts:
#	docs/technical/README.md
#	server-rs/crates/spacetime-client/src/module_bindings/mod.rs
This commit is contained in:
2026-05-01 01:14:04 +08:00
601 changed files with 19836 additions and 4468 deletions

View File

@@ -72,7 +72,7 @@
1. 不复用 RPG 的世界、角色、章节、剧情推进结构。
2. 不复用拼图的网格切图、交换、合并块和下一关推荐算法。
3. 不复用大鱼吃小鱼的实时吞噬、实体等级和摇杆移动规则。
4. 不把 Match3D 运行规则写成前端本地真相源。
4. 不把 Match3D 运行规则写成前端本地真相源,但局内即时反馈效果由前端负责呈现
5. 不使用 `server-node` 或 PostgreSQL 作为新增玩法后端。
## 3.3 独立玩法域要求
@@ -110,7 +110,7 @@ Match3D 必须形成独立玩法域,后续技术方案至少需要覆盖:
13. 清空圆形空间中全部物品即胜利。
14. 倒计时结束或备选栏满即失败。
15. 胜利 / 失败后展示结算界面。
16. 点击判定、入槽、消除、失败、胜利必须由后端裁决
16. 点击、入槽、消除、失败、胜利的即时反馈效果由前端先行呈现,后端负责权威确认、状态落库和成绩可信性
---
@@ -128,7 +128,7 @@ Match3D 必须形成独立玩法域,后续技术方案至少需要覆盖:
8. 不做真实物理碰撞结算。
9. 不做必须试玩通关才能发布的门槛。
10. 不把玩法规则说明长文默认写入 UI 面板。
11.前端即时完成规则裁决
11.前端即时反馈当作最终规则真相
12. 不使用 `server-node` 或 PostgreSQL 新增实现。
---
@@ -292,31 +292,36 @@ totalItemCount = clearCount * 3
圆形空间里的物品可以重叠、遮挡、堆叠。
首版使用 2D 逻辑实现遮挡和点击判定
首版使用 2D 逻辑实现遮挡和点击反馈
1. 被完全遮挡的物品不允许点击。
2. 如果物品有局部露出,且露出区域可被点击选中,则允许点击。
3. 具体露出区域判定使用 2D 逻辑的最优方案,不做真实 3D 遮挡
3. 前端基于后端下发的物品层级、位置、半径和可点击快照,执行即时命中检测与选中反馈
4. 后端收到点击意图后做权威确认;如果确认失败,前端必须回滚本次即时反馈。
5. 具体露出区域判定使用 2D 逻辑的最优方案,不做真实 3D 遮挡。
## 8.8 点击入槽
玩家点击通过后,后端裁决该物品可选中
前端播放飞行动画,把物品放入下方备选栏。
玩家点击可见物品后,前端立即播放按压、选中和飞行动画,把物品表现为飞入下方备选栏
飞行动画过程中,物品不再与其他物品产生碰撞。
前端播放即时反馈的同时,必须向后端提交点击意图。后端确认后固化入槽结果;后端拒绝时,前端恢复物品位置和备选栏表现。
## 8.9 备选栏
下方备选栏固定为 `7` 个格子。
1. 每次成功点击后,物品进入备选栏。
2. 备选栏中每出现 `3` 个相同物品 id自动消除并腾出格子。
3. 如果备选栏满且无法消除,则判定关卡失败
1. 每次点击进入即时反馈流程后,前端先把物品表现为进入备选栏。
2. 备选栏中每出现 `3` 个相同物品 id前端立即播放自动消除效果并腾出格子。
3. 后端确认后固化真实备选栏和消除结果;若后端返回状态不一致,前端必须以最新后端快照校正
4. 如果备选栏满且无法消除,前端可以立即展示失败过渡,最终失败状态以后端确认为准。
## 8.10 胜利
圆形空间内全部物品被消除后,播放胜利动画并展示胜利界面
圆形空间内全部物品被消除后,前端立即播放胜利动画。
正式胜利界面、使用时间和成绩记录以后端确认的运行态为准。
胜利结算页至少展示:
@@ -332,6 +337,8 @@ totalItemCount = clearCount * 3
1. 倒计时结束。
2. 备选栏满。
倒计时归零或备选栏满时,前端立即展示失败过渡;正式失败原因和完成进度以后端确认的运行态为准。
失败结算页至少展示:
1. 失败原因。
@@ -378,33 +385,38 @@ totalItemCount = clearCount * 3
1. 创建玩法草稿。
2. 编译运行时初始局面。
3. 生成物品序列与布局。
4. 判断物品是否可点击
5. 处理点击入槽
6. 判断 `3` 个相同物品 id 消除
7. 判断备选栏满失败
8. 判断倒计时结束失败。
9. 判断清空空间胜利
10. 记录成绩所需的基础数据
4. 下发前端即时反馈所需的物品位置、层级、半径、可点击快照和版本号
5. 权威确认玩家点击意图是否合法
6. 权威确认入槽结果
7. 权威确认 `3` 个相同物品 id 消除
8. 权威确认备选栏满失败。
9. 权威确认倒计时结束失败
10. 权威确认清空空间胜利
11. 记录成绩所需的基础数据。
## 10.2 前端职责
前端负责:
前端负责所有游戏过程中需要即时呈现的反馈效果
1. 展示 Agent 创作界面。
2. 展示结果页和基础编辑表单。
3. 上传参考图片。
4. 展示运行态场景、物品、倒计时和备选栏。
5. 发送玩家点击意图
6. 播放点击、飞入、消除、胜利和失败动画
7. 展示结算界面
5. 基于最新后端快照执行 2D 命中检测、悬停、按压和选中反馈
6. 发送玩家点击意图
7. 在等待后端确认期间,先行播放飞入、入槽、三消、腾格、胜利和失败过渡效果
8. 收到后端确认后,把本地表现校正到权威快照。
9. 展示结算界面。
前端不得自行完成规则裁决
前端可以做即时表现预判,但不得把预判结果作为最终规则真相或成绩来源
## 10.3 防作弊要求
首版即按正式版本搭建规则裁决链路。
首版即按正式版本搭建“前端即时反馈 + 后端权威确认”的链路。
前端不可信任本地点击、消除、胜利或成绩结果;所有关键状态必须后端裁决后下发
前端不可信任本地点击、消除、胜利或成绩结果;所有关键状态必须后端确认后的快照为准
为了保证手感,前端可以先行展示操作反馈;为了防作弊,发布成绩、结算状态、消除计数和运行态持久化必须以后端确认为准。
---
@@ -484,6 +496,8 @@ interface Match3DItemSnapshot {
}
```
`Flying` 可以作为前端表现态使用,不要求后端把飞行动画过程逐帧落库。后端只需要确认物品是否从 `InBoard` 进入 `InTray``Cleared`
## 11.5 备选栏快照
```ts
@@ -672,7 +686,7 @@ Agent 每轮优先追问最影响 demo 生成的一个问题。
13. 倒计时结束或备选栏满后失败。
14. 胜利结算展示使用时间。
15. 失败结算展示完成进度和重新开始按钮。
16. 关键规则由后端裁决,前端不本地判定胜负
16. 局内即时反馈由前端先行呈现,关键状态以后端确认快照校正
17. 相关中文文档通过编码检查。
---
@@ -696,14 +710,15 @@ Agent 每轮优先追问最影响 demo 生成的一个问题。
1. 新增 `module-match3d` 规则。
2. 新增 SpacetimeDB 运行态表和 procedure。
3. 实现开始、点击、消除、失败、胜利。
3. 实现开始、点击确认、消除确认、失败确认、胜利确认
## 阶段 D前端运行态
1. 展示圆形空间和 2D 物品。
2. 展示 `7` 格备选栏。
3. 接入点击接口和后端快照。
4.飞入、消除、胜负动画
4.点击命中、飞入、入槽、消除、腾格、胜负过渡等即时反馈
5. 补后端确认失败时的前端回滚和快照校正。
## 阶段 E分发与成绩预留
@@ -715,4 +730,4 @@ Agent 每轮优先追问最影响 demo 生成的一个问题。
## 17. 一句话结论
Match3D 首版不是临时前端 demo而是以“抓大鹅”模板为外壳、以后端规则裁决为真相源、以独立玩法域为工程边界的单局经典消除玩法链路;首轮先跑通题材创作、结果页、试玩、发布和单局清空胜负闭环。
Match3D 首版不是临时前端 demo而是以“抓大鹅”模板为外壳、以前端即时反馈保证手感、以后端权威确认保证规则可信、以独立玩法域为工程边界的单局经典消除玩法链路;首轮先跑通题材创作、结果页、试玩、发布和单局清空胜负闭环。