给《植物大战僵尸杂交版》里禁忌咖啡豆(TABOOBEAN)施加的「禁忌效果」加一个头顶读秒倒计时。 纯显示 Mod:不改任何玩法数值、不动原版资源。
| 需求 | 实现 |
|---|---|
| 禁忌效果加读秒倒计时 | 托管插件给每个带 TabooBean buff 的角色挂一个 Label,每帧显示 ceil(time - currentTime) |
| 最后 5 秒强化提示 | 剩余 ≤5 秒文本变红(与原版闪烁阶段 currentTime >= time-5 对齐) |
| 不破坏联机确定性 | 插件只读 buff 字段、只画 UI,不调用任何影响模拟的 API;只读端靠 SyncDeserialize 同步的 currentTime 显示 |
- 禁忌咖啡豆爆炸 →
TowerDefensePlantTabooBean.Explode()给同格植物挂TowerDefenseCharacterBuffTabooBean(buff key ="TabooBean")。 - buff:
time = 35.0秒;期间植物timeScaleInit = 5.0(5 倍速工作); 最后 5 秒精灵 shader 闪烁;到期Exit()→ 植物被炸毁并留弹坑。 - 原版没有把剩余时间显示出来 —— 本 Mod 补的就是这个显示。
- 注:
Refresh()为空 ⇒ 同格再次吃到禁忌咖啡豆不会重置计时(原版行为),倒计时按内部currentTime显示,天然准确。
TabooCountdown/
├── README.md # 本文档
├── build_pmod.py # 编译 + 打包 + 自检(--check 幂等 / --install 装机)
├── check_pmod.py # 离线闸门(Python 半场 + 负向测试 + 调 C# 半场)
├── check_gates/ # C# 闸门:编译期 + 反射期断言入口类型/接口/方法
├── runtime_src/ # 托管插件源码(csproj + 入口类)
├── Runtime/ModAssembly.dll # 编译产物
└── dist/TabooCountdown.pmod # ★ 成品
# 构建(字节幂等,含 --check 双跑比对)
python build_pmod.py --check
# 装机(复制 .pmod 到游戏 Mods 目录 + 合并 enabled_mods.json)
python build_pmod.py --install
# 离线闸门(正场 P1-P5 + 负场 N1-N5)
python check_pmod.py游戏内:F3 → Mod 工具 → 确认 taboocountdown 已启用 → 「应用已安装 Mod 到当前游戏」或重启。
种下禁忌咖啡豆引爆后,同格受影响植物头顶出现读秒(35 → 0),最后 5 秒变红。
runtimeAssembly= 字面量"Runtime/ModAssembly.dll";runtimeApiVersion = 1;runtimeAssemblyPolicy = "optional";入口类 FullName =TabooCountdownRuntimeEntry(无命名空间)。- 包内无
.cs(IsExecutablePackageFile白名单外可执行文件会拒整包);mod.json是第 0 个 zip 条目。 - 入口三方法全程 try/catch,不抛异常(
TryInitializeRuntimeEntry失败 → 整包回滚)。 - Label 用
Control.TopLevel:不继承角色 scale/rotation,世界坐标定位,免受精灵缩放变形影响。
- 显示位置是固定偏移(角色原点上方 115px):大体格植物可能字稍低、小体格稍高 —— 观感问题,不影响功能。
- 首次扫描间隔 5 帧(约 0.08s):buff 挂上后 Label 最多延迟几帧出现,读秒本身每帧刷新。
- 暂停时
process_frame仍触发,但 buff 的currentTime不走 ⇒ 读秒冻结,与游戏一致。 - 实机验收(游戏内观感、加载日志
[TabooCountdown])待用户确认:装机后打一局用禁忌咖啡豆即可看到。 enabled_mods.json由--install合并写入;若游戏内手动禁用后,重复--install不会强行改回(保留用户选择)。