日期: 2026-10-13
当前进度: 删除转生/神力成长曲线;人口上限改由住房决定;知识传授系统上线(神不建造,只教知识,小人自己建);修复一个"点了没反应"的随机 bug
下载 App
《我真没让他们建城啊!》开发者日志 05
修改于10/1618 浏览
今天删掉的东西,比加进去的更多。
我先加了一整套「增量游戏」的系统,又亲手把它拆了。
因为玩家说了一句话:这个游戏的核心,不该是数字变大。


写在前面:两次转向
今天被玩家打断了两次,两次都在纠偏。
第一次,他说:「这个游戏需要更像一个增量的策略游戏。」
我照着做了:双层循环(内层单局 + 外层跨局)、转生系统、道基货币、永久升级树、神力成长曲线。做完之后,玩家看着结算页上那棵升级树,说:
第二次,「这个封住一下,不是直接给东西,而是传授知识。」
然后他又补了一张截图——那是我做的「建造面板」,玩家可以直接放置伐木场、矿场。
这两句话合起来,是在指出同一个错误:我把神变成了建筑师和数值管理员。


一、先做,再删:一个关于"增量"的误判
1.1 我做的那套东西
按增量游戏的教科书结构,我实现了完整的一层:
| 系统 | 实现 |
|---|---|
| 内层循环 | 神力 → 投放 → 文明演化 → 结算 |
| 外层循环 | 结算发「道基」→ 买永久升级 → 下一局更强 |
| 转生货币 | 道基 = ⌊(峰值人口/30)^1.5 + 纪元×2.5 + 聚落×2 + 现象×0.4⌋ |
| 永久升级树 | 神启/恩泽/血脉/厚土/先见/遗泽 六条 |
| 神力成长 | 随纪元推进,上限 +25/级、回复 +0.5/s |
还配了实测:首局道基收益 31、大爆发局 58,幂等性、存档往返、满级封顶全部通过。
技术上它是对的。设计上它错了。
1.2 错在哪
这个游戏的一句话是:
你不能造房子,不能修路,也不能命令任何一个小人。
你只能改变环境,然后眼睁睁看着他们自己把文明搞出来。
而我的增量系统在做什么?
- 转生:让玩家攒一个叫"道基"的数字,然后买升级——这跟"改变环境"没有任何关系。
- 神力成长曲线:让神力随文明推进变强——这是在给玩家加数值,不是在改变世界。
- 建造面板:让玩家直接放置伐木场——神成了建筑师,直接违反第一原则。
玩家要的"增量感",不是数字变大,是复利式的文明增长——他们的人变多、走得更远、造出更复杂的东西。
1.3 删掉的东西
| 删除 | 原因 |
|---|---|
| Prestige.lua(整个转生模块) | 与"改变环境"无关,是纯数值层 |
| 结算页转生面板 | 三栏还原为两栏 |
| B.InfluenceGrowth + W.InfluenceMax/Regen | 给玩家加数值,不是给世界加变化 |
| 神力增强浮动提示 | 同上 |
| 建造面板 | 直接违反第一原则 |
删完,Render.lua 从 3001 行回到 2925 行。


二、人口成为唯一的增长轴
玩家给的第二个方向很明确:
发展资源就是发展人口,人口抵御野兽。
这句话把游戏的增长逻辑钉死了——人口既是劳动力,也是军队。
2.1 从常量到住房
改造前,人口上限是一个硬编码常量:
luaHardPopulationCap = 150 -- 从头到尾不变
改造后,上限由住房决定:
lua复制
luaBaseWandererCap = 45 -- 无聚落时的兜底 PerLevelCap = { 50, 90, 150, 240 } -- 聚落每级自带 PerHousingBuilding = 25 -- 玩家(后来是知识)建的住房
于是循环闭合了:
采集资源 → 建住房 → 人口上限提升 → 人口增长
↓
人口既是劳动力(采集更快)也是军队(抵御野兽)
2.2 一个必须实测才能发现的死锁
第一版我设了 BaseWandererCap = 24。跑探针:
[v3] 终局:人口=0 上限=24 峰值上限=24
[v3] 建住房次数=0 玩家设施=0 聚落=0
[v3] 野兽:狼存活=10 被击杀=0
人口归零、0 聚落、10 头狼存活、0 击杀。
这是个死锁:
人口上限 24 太低 → 聚落(需 6+ 人聚集)长不出来
→ 没有聚落可建住房 → 上限永远 24
→ 被野兽吃光
只有跑起来才会发现。 光看代码,24 是个很合理的"小容量开局"数字。
修完(兜底 45、每级 50 起、野兽压力调温和、安全期 180→240s):
[v3] 终局:人口=11 上限=220 峰值上限=220
[v3] 聚落=1 最高纪元=4 狼被击杀=14
上限从 45 涨到 220,聚落长出来了,小人击杀了 14 头狼——"人口即军队"生效了。


三、神不建造,只传授知识
这是今天最重要的改动。
3.1 问题的本质
玩家给的截图是建造面板。我一开始以为他是在说"面板不好看",后来才明白——
只要玩家能直接建造,这个游戏就不是这个游戏了。
神一旦能盖房子,就退化成了普通的城建游戏。"涌现"这个词就没有意义了,因为结果是玩家直接给的。
3.2 修正:知识不是设施,是规则
神不建造,神只传授知识。
人学会知识后,自己决定要做什么、在哪里做。
| 违规版 | 修正版 | |
|---|---|---|
| 玩家动作 | 直接放置建筑 | 传授知识 |
| 建造者 | 玩家 | 小人自己 |
| 位置 | 玩家选定 | 小人自己找 |
| 资源 | 玩家直接扣 | 小人自己攒、自己花 |
| 神的位置 | 建筑师 | 知识的给予者 |
3.3 六门知识
每门知识都是一条写进小人大脑的规则:
| 知识 | 代价 | 教的是什么 | 他们自己会做的事 |
|---|---|---|---|
| 🪨 矿物知识 | 40 | 辨认石头里的东西 | 自己建矿场 |
| 🌾 农耕知识 | 35 | 种子和土地的关系 | 自己开垦农田 |
| 🏠 建筑知识 | 45 | 怎样住得更结实 | 自己盖房 |
| ⚒ 冶炼知识 | 55 | 火能对石头做什么 | 自己建工坊 |
| ⚔ 军事知识 | 50 | 怎么面对威胁 | 自己建瞭望塔/兵营 |
| 🌿 医疗知识 | 40 | 怎么对待伤口 | 自愈更快 |
前置依赖:矿物 → 冶炼 / 军事(不能跳级)。
关键实现:Buildings.Build 从"玩家调用"改成由 Emergence 驱动小人自建。玩家全程没有点过任何"建造"。
3.4 实测:先教什么,决定文明能不能活
同一套系统,两种知识顺序:
| 顺序 | 人口 | 聚落 | 纪元 | 小人自建 |
|---|---|---|---|---|
| 温和(先农耕/建筑) | 22 | 1 | 5 蒸汽 | farm/housing/mine/watchtower/barracks |
| 军事优先(先矿物/冶炼) | 0 | 0 | 4 | farm/housing/mine/watchtower/workshop |
军事优先把资源砸在防御上,没先解决食物,灭族了。
这不是 bug,这是策略。先教什么,真的会决定文明的命运。


四、知识不该剧透结果
第一版的知识描述是这样的:
❌ 矿物知识:「教他们认识石头里的矿:采石更快,日后懂得用矿石打造武器」
玩家立刻指出来:不该有明确指向。
他说得对。涌现游戏的核心是"你不知道会发生什么"。描述里写"会打造武器",等于把结果提前告诉了玩家——那还有什么好"涌现"的?
改成只讲教的是什么:
✅ 矿物知识:「教他们辨认石头里的东西。」
| 知识 | 旧(剧透) | 新(只说教什么) |
|---|---|---|
| 矿物 | 采石更快,日后打造武器 | 教他们辨认石头里的东西。 |
| 农耕 | 自己开垦农田,食物不再只靠采集 | 教他们种子和土地之间的关系。 |
| 冶炼 | 自己建工坊,工具武器更精良 | 教他们火能对石头做什么。 |
| 军事 | 自己建防御工事,主动清剿野兽 | 教他们怎么面对威胁。 |
4.1 补上事后的一环:知识涌现图鉴
光改描述还不够——玩家总得在事后知道发生了什么。于是加了 5 条图鉴条目:
⛏ 学会辨矿 — 「你只教了他们辨认石头。后来他们自己找到了矿,还在上面搭了棚子。」
⚒ 学会用火 — 「火能对石头做什么——他们试出来了。试出来的东西,比你教的更多。」
图鉴记的不是"你教了什么"(你的动作),而是"他们做成了什么"(涌现)。
实测:5 条里 4 条被点亮(know_smelt 没亮是因为工坊要 60 木 40 石、本局资源不够——符合预期)。


五、那个"点了没反应"的 bug
玩家截图说「资源点击不生成」。
我先写了三个探针,全部显示投放正常:资源 40→41、神力 100→90、地图中央未被 UI 覆盖。
探针复现不了,说明问题在特定条件下。
最后定位到 Camera.lua 的长按平移判定:
lua复制
luaif Camera.longPressT >= LONG_PRESS_TIME and not moved then -- 0.28 秒 Camera.longPressPan = true dragged = true -- ← 直接判定为"拖动"
本意是"选中工具后,长按可以拖地图"。但它直接置 dragged = true,而抬手时 dragged 为真就不投放。
结果:任何按住超过 0.28 秒的左键点击,都会被静默吞掉。
5.1 为什么表现成"随机"
人手点击普遍在 0.2~0.4 秒,正好卡在阈值两侧。所以按快一点能投,稍微慢一点就没反应。
回退验证:
| 按住时长 | 修复前 | 修复后 |
|---|---|---|
| 0.10s | ✅ | ✅ |
| 0.20s | ✅ | ✅ |
| 0.30s | ❌ 静默吞掉 | ✅ |
| 0.50s | ❌ 静默吞掉 | ✅ |
| 0.80s | ❌ 静默吞掉 | ✅ |
阈值精确吻合 0.28 秒。
5.2 修复
把"长按"从直接判定为拖动改成只预备拖动状态,是否拖动交给移动距离判断:
lua复制
luaif Camera.longPressT >= LONG_PRESS_TIME and not moved then Camera.longPressPan = true -- 不再置 dragged = true
OnMouseUp 也改成只看 dragged(真的移动过)。
顺带一提:我第一版修复只加了"选中工具时才判定长按"——那没有解决问题,因为选中工具时正是长按生效的场景。第二版才是真正的修复。改完必须回退验证,否则你不知道自己修的是不是真问题。


六、今天踩到的坑
6.1 删除代码比写代码危险
删 DrawPrestigePanel 时,我用脚本按行号删除,结果只匹配到函数的第一个 end(嵌套的 end 被误判),把函数劈成了两半,留下满地碎片。
教训:按行号删函数不可靠。要么用括号配平,要么用编辑器精确选中。后来我改用「向上吃掉注释块 + 向下找到函数真正的结尾」才删干净。
6.2 全局替换会改坏函数名
批量把 W.InfluenceMax() 替换成 B.InfluenceConfig.Max 时,把函数定义本身也改了:
luafunction B.InfluenceConfig.Max -- 无效语法!
教训:批量替换前先看一眼会不会命中定义。这次靠 LSP 报错才发现。
6.3 面板重叠会吃掉点击
给图鉴加 ✕ 按钮后,实测发现点不动——命中的是下面叠着的态势面板的关闭按钮。
因为 RegisterUI 是后进先出的命中优先级,谁后画谁赢。修法是:图鉴打开时让态势面板和小地图让位。
6.4 调色板键名靠猜会崩
给新设施写渲染时,我用了 P.woodHi / P.rockHi——这两个键不存在。查了实际调色板才发现应该用 P.beam / P.rockLight。
教训:用调色板键之前先 grep 确认存在。


七、当前状态
| 项 | 数值 |
|---|---|
| 代码 | 21 个玩法模块,11160 行 Lua(含测试工具共 12592 行) |
| 神之手工具 | 12 个(资源 / 危险 / 诱因 / 天罚) |
| 知识 | 6 门(今天新增) |
| 文明现象图鉴 | 39 条(今天新增 5 条知识涌现线) |
| 像素精灵 | 33 张 |
| 音效注册 | 54 条 |
| 人口上限 | 由住房决定(45 起,可达 240+) |


八、下一步
- [ ] 规则卡重定位:12 张卡全是"改变小人规则",现在和知识系统语义重叠,需要重新定位为"改变环境对行为的回报"
- [ ] 拆分 Render.lua:2989 行,逼近 3000,每次改动都要小心
- [ ] 知识的学习反馈:小人学会知识时,应该有可见的"顿悟"瞬间
- [ ] 发布素材:project.json 里 icon/screenshots/promotional_image 仍全为空
- [ ] 战争率:把冲突判定限定在不同部落之间
- [ ] 收纪元阈值:蒸汽时代比预期更易达到


写在最后
04 我写的是:一个能被反复重放的世界,还得有值得你重放的理由。
今天发现,我给的那个"理由"(转生、永久升级)是错的——它是数值的理由,不是世界的理由。
真正值得重放的理由,应该是:
这一次,我教了他们不一样的东西,于是他们长成了不一样的样子。
删掉转生系统的时候有点心疼——那套东西技术上是完整的,实测数据也漂亮。但玩家那句话是对的:
这个游戏的核心,从来不是数字变大。是"你不能直接给结果"。
神能盖房子,这个游戏就死了。
神只能教知识,这个游戏才活着。#聚光灯gamejam开发者日志
神只能教知识,这个游戏才活着。#聚光灯gamejam开发者日志









![开发日记[03]|核心三大系统完工!宗门炼丹采药弟子体系已落地截图](https://img2-tc.tapimg.com/moment/etag/FsxqmyzWdWSElUYdYBAdN_uuaazl_20261019211448.jpg/_tap_ugc_m.jpg)

