demo
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
# 美术与字体来源
|
||||
|
||||
## 论坛原始资产
|
||||
|
||||
`Art/ForumOriginal/` 中的纸张、卡面、牌序示意和结算图来自原策划页面:[Game14 - 被替代之人](https://forum.crash.work/d/22-game14-bei-ti-dai-zhi-ren)。这些文件用于复现该策划的 Demo 视觉,后续发行前应由项目方再次确认原作者授权范围。
|
||||
|
||||
示例 Mod 的 `icon.png` 由同目录反击卡面裁取复用,因此遵循相同授权边界。
|
||||
|
||||
## 字体
|
||||
|
||||
中文界面使用 Noto Sans SC Variable:
|
||||
|
||||
- 项目文件:`Art/NotoSansSC-Variable.ttf`
|
||||
- 许可证:`Art/OFL-NotoSansSC.txt`
|
||||
- 上游:[Google Fonts - Noto Sans SC](https://fonts.google.com/noto/specimen/Noto+Sans+SC)
|
||||
|
||||
字体采用 SIL Open Font License 1.1。Unity 生成的 `NotoSansSC SDF.asset` 是动态 TMP 字体资产。
|
||||
|
||||
## 音效
|
||||
|
||||
战斗与界面音效取自本机提供的 `C:\Users\im\Downloads\Soundpack`,Demo 内副本位于
|
||||
`Resources/ReplacedPersonAudio/`。当前使用了 `UI`、`Card and Board`、`Environment`、
|
||||
`Combat and Gore` 与 `Musical Effects` 分类中的按钮、纸牌、锁、骰子、打击和结算短音效。
|
||||
|
||||
该本地素材包未附带可识别的许可证文件;当前仅用于 Demo 验证。正式分发前需要由项目方补充来源与授权证明,或替换为许可证明确的音效。
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 30d059b0300835a4d95851bd9615f14f
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,50 @@
|
||||
# Mod 开发
|
||||
|
||||
## 公共接口
|
||||
|
||||
纯规则层位于 `ReplacedPerson.Core`,可在 Unity 和 .NET 8 独服中使用:
|
||||
|
||||
- `IReplacedPersonMod`
|
||||
- `IReplacedPersonRegistry`
|
||||
- `IReplacedPersonEffectResolver`
|
||||
- `ReplacedPersonModManifest`
|
||||
|
||||
可注册卡牌、结束牌、敌人、奖励、剧情、规则效果和命令。联网规则不得依赖 Unity 类型。Unity 适配层通过 ShrinkModFramework 生命周期把规则实现注册到 `replaced-person.mods`;`AutoApplyHarmonyPatches` 应保持关闭。
|
||||
|
||||
## 审计训练 Mod
|
||||
|
||||
示例位于 `Assets/Demos/ReplacedPerson/Mods/ExampleGreedMod/`,包含:
|
||||
|
||||
- 普通牌“审计”:反击类型,触发正式效果解析器后恢复 1 COST。
|
||||
- 训练敌人“训练用审计员”。
|
||||
- 奖励、短剧情和 `example audit` 命令。
|
||||
- 纯规则程序集和可选 Unity 适配程序集。
|
||||
- 内容 JSON、PNG 图标和严格文件哈希清单。
|
||||
|
||||
构建并打包:
|
||||
|
||||
```powershell
|
||||
./GeneratedServers/ExampleGreedMod.Rules/pack-mod.ps1
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
Artifacts/ReplacedPersonMods/ExampleGreedMod-1.0.0.zip
|
||||
GeneratedServers/ReplacedPerson.ServerHost/Mods/ExampleGreedMod/
|
||||
```
|
||||
|
||||
## 包结构
|
||||
|
||||
```text
|
||||
ExampleGreedMod/
|
||||
manifest.json
|
||||
content.json
|
||||
icon.png
|
||||
ExampleGreedMod.Rules.dll
|
||||
ExampleGreedMod.Unity.dll # 可选,仅 Unity 端需要
|
||||
```
|
||||
|
||||
`manifest.json` 的 `files` 必须覆盖包内所有参与联网兼容判断的文件,并写入小写 SHA-256。独服启动时先校验文件,再加载纯规则 DLL;当前房间保留不可变内容快照,`reload-mods` 只影响之后创建的房间。
|
||||
|
||||
不可信 DLL 不在本 Demo 的安全边界内。服务器管理员只应安装可信来源的规则程序集。
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e94c9c61703afeb43a2339f08b037ec1
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,38 @@
|
||||
# 联网协议
|
||||
|
||||
## 传输
|
||||
|
||||
- TCP:默认端口 `18140`。
|
||||
- KCP:默认端口 `18141`。
|
||||
- UDP 房间发现:默认端口 `18142`。
|
||||
- 直接 IP 在端口可达时可用于局域网或公网;不提供匹配、NAT 穿透或账号系统。
|
||||
|
||||
Unity 内置 Host 与 .NET 独服使用同一个 `ReplacedRoomAuthority` 和 `ReplacedMatchEngine`。消息体是 UTF-8 JSON,底层 TCP/KCP 传输负责完整包边界。
|
||||
|
||||
## 消息
|
||||
|
||||
| Kind | 用途 |
|
||||
| --- | --- |
|
||||
| `Create` | 创建房间并占用席位 |
|
||||
| `Join` | 加入房间;房间为空时独服可按配置创建 |
|
||||
| `Ready` | 设置准备状态 |
|
||||
| `Deck` | 提交并校验 12+4 牌组 |
|
||||
| `MatchCommand` | 提交回合指令 |
|
||||
| `MatchSnapshot` | 玩家裁剪快照、房间状态和状态哈希 |
|
||||
| `MatchEvent` | 成功、重复包等权威结果 |
|
||||
| `Reconnect` | 在 30 秒席位保留期内重新绑定 |
|
||||
| `Error` | 结构化错误码和差异详情 |
|
||||
|
||||
所有对局指令包含玩家序号和幂等令牌。已接受令牌的重发返回 `Duplicate=true`,不会重复结算。快照只保留对手隐藏区的数量,不暴露卡牌 ID。
|
||||
|
||||
## Mod 握手
|
||||
|
||||
加入请求携带所有启用 Mod 的 ID、版本及文件 SHA-256。权威端逐文件比较,报告 `missing-mod`、`unexpected-mod`、`version`、`missing-file`、`unexpected-file` 或 `hash` 差异,并拒绝准备。
|
||||
|
||||
房间创建时冻结内容快照。热重载只更新之后创建的房间或下一场单机对局,不修改进行中的状态机。
|
||||
|
||||
## 断线和超时
|
||||
|
||||
- 断线后席位保留 30 秒。
|
||||
- 连续两个回合超时判负。
|
||||
- 客户端重连后以权威快照和状态哈希恢复,不在客户端补算遗漏骰点。
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7824b0b1c4c6ebd45bc397fd2302a6ce
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,48 @@
|
||||
# 对局规则
|
||||
|
||||
## 牌组与资源
|
||||
|
||||
- 每套牌固定 12 张普通牌和 4 张结束牌。
|
||||
- 普通牌同名最多 2 张,结束牌同名最多 1 张。
|
||||
- 初始 30 HP、10 COST。首次抽 4 张普通牌和 1 张结束牌,此后每回合抽 2+1。
|
||||
- 普通手牌上限 9。抽牌堆耗尽时,权威 PCG32 将弃牌堆洗回。
|
||||
- 锁牌时支付 COST。回合末恢复 `1 + floor(本回合消耗 / 2)`,最多恢复到 10。
|
||||
- 跳过不支付 COST;未弃掉的结束牌会使下一回合跳过结束牌抽取。
|
||||
|
||||
## 回合顺序
|
||||
|
||||
1. 权威端投先手骰并确定先手。
|
||||
2. 双方抽牌。
|
||||
3. 先手公开锁定 1 至 4 张普通牌和 1 张结束牌,或跳过。
|
||||
4. 后手看到牌序与效果范围后进行针对性锁定。
|
||||
5. 每方可预先标记一个效果槽;该槽初骰不高于 2 时自动重掷一次。
|
||||
6. 三个效果槽从左到右执行继承、合成、拼点、联锁和资源结算。
|
||||
|
||||
结束牌提供三个效果槽。单槽值为 `始数 + 因数 x D6`。平点继续由权威随机源重掷,直到分出胜负。
|
||||
|
||||
## 基础克制
|
||||
|
||||
- 攻击胜出:造成差值伤害,单槽最多 8。
|
||||
- 反击胜出:取消攻击并反伤差值,单槽最多 6。
|
||||
- 闪避胜出:取消攻击,并使成功方下一回合多抽 1 张普通牌。
|
||||
|
||||
## 两牌合成
|
||||
|
||||
| 组合 | 结果 |
|
||||
| --- | --- |
|
||||
| 攻+攻 | 合并值乘 1.5 |
|
||||
| 攻+闪 | 成功后抽 1 张牌并恢复 1 COST |
|
||||
| 攻+反 | 成功后追加 3 伤害 |
|
||||
| 反+反 | 返还首次伤害的 50%,最多 5 |
|
||||
| 闪+反 | 获得 2 点当回合 DEF |
|
||||
| 闪+闪 | 获得一次必定闪避 |
|
||||
|
||||
## 孤注一掷
|
||||
|
||||
双方在同一次结算中同时归零时,只进入一次孤注一掷:各抽 4 张普通牌和主、副两张结束牌,恢复量转为伤害。仍平局时先比较本回合有效果数,最后才使用权威骰决定胜负。
|
||||
|
||||
## 贪婪
|
||||
|
||||
第一场使用 20 HP 的教学形态;第二场使用 30 HP 的完整形态。Boss 牌包括“势利眼”“扭亏为盈”“降薪”。完整形态胜利可获得金色势利眼、金链、褶皱西装和三张对应卡牌。
|
||||
|
||||
AI 的输入是裁剪后的可见对局状态;评分考虑期望值、存活、COST 效率、合成收益和公开对位,不读取未来骰点或隐藏抽牌。
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa254a4eee4dd4e4e9e72373bf0f1ec6
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,18 @@
|
||||
# 与论坛原案的差异
|
||||
|
||||
本 Demo 保留原案的牌序反制、结束牌继承、三个效果槽拼点、骰子、合成和“孤注一掷”。以下内容为了可验证性与首章节奏做了明确化或平衡调整。
|
||||
|
||||
| 项目 | 论坛原案 | Demo 实现 |
|
||||
| --- | --- | --- |
|
||||
| 随机源 | 未限定实现 | 单一 PCG32 权威随机源,可回放并跨端复现 |
|
||||
| 单槽掷骰 | 可有多种解释 | 每侧每槽初掷一次;只允许一个预标记的低点重掷 |
|
||||
| 平点 | 继续掷骰 | 保留,并由权威端持续到分胜负 |
|
||||
| 攻击伤害 | 差值 | 差值,单槽封顶 8 |
|
||||
| 反击反伤 | 差值 | 差值,单槽封顶 6 |
|
||||
| COST 恢复 | 原案数值未完全封闭 | `1 + floor(本回合消耗/2)`,上限 10 |
|
||||
| 合成 | 以概念描述为主 | 六种组合使用固定表,避免客户端解释分歧 |
|
||||
| 同时归零 | 孤注一掷 | 只触发一次;有效果数后才用权威骰决胜 |
|
||||
| 内容范围 | 论坛概念和部分牌面 | 首版只完成“贪婪”第一章两战,并补齐四张结束牌 |
|
||||
| 联网 | 未指定 | 权威状态机、序号、幂等令牌、状态哈希与严格 Mod 清单 |
|
||||
|
||||
原案来源:[Game14 - 被替代之人](https://forum.crash.work/d/22-game14-bei-ti-dai-zhi-ren)。
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f0d9cba143ca12748867116ba01261f8
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user