下载 App

《气味之城》开发日志4 亲眼看着系统自己长出来的东西,一共六件

修改于10/2015 浏览综合
这几天我一直在做一件很无聊的事:什么都不干,盯着街区看。
因为这是一篇"涌现"主题的游戏,如果我只贴自己设计的东西,那就等于什么都没证明。所以这篇我想反过来写:我只写我没设计的东西。 六件事,每件都按同一个格式拆给你——我做了什么、代码里哪几行在算、街区最后变成了什么样。
如果你想自己复现,文末有命令。

① 橙色撞上橙色

我做了什么: 我在一块墙角连按空格蹭地盘,那块地在气味视觉里变成了亮橙色。十分钟后,一只路过的猫走进了那片橙色。
底层怎么算: 领地信息素沉积时会顺便记下"这是谁留下的"(scripts/pheromone_grid.gd:deposit()),读取靠 owner_at()(同文件 :109-113)。每只猫每 0.4 秒做一次决策,第一件事就是查脚下格子的归属(scripts/cat_base.gd:_think() 开头的领地冲突检测):归属者不是自己,且(双方好感 < -15 或 这只猫胆量 > 0.65 且掷出 12% 的骰子)——才进入对峙,同时往脚下写一圈危险气味,冷却 40 秒。
街区最后变成什么样: 事件日志里多了一行"×× 撞见 ×× 的地盘,压低身子对峙",配一声压得很低的低吼。两秒两秒后如果还在对峙状态机里,就进入结算。
写这段的时候我又确认了一遍:代码里没有任何一行叫"两猫开战"。 全部条件就是上面那三个判断。

② 有时候它不打

我做了什么: 什么都不做。看着两只猫对峙,一方是块头最大的大橘(胆量 0.9),一方是最小的煤球(胆量 0.2)。
底层怎么算: 结算的时候先算"是不是欺软"(scripts/cat_base.gd:_resolve_confront() 里那句 absf(boldness - other.boldness) > 0.25):两只猫的胆量差 > 0.25,就不动手。胆小的一方安全值 -30,转身进逃跑状态跑出 260 像素(lose_confront());胆大的一方安全值只 -10,继续待在原地。
街区最后变成什么样: 日志写的是"煤球压低耳朵退让了,大橘抖了抖毛守住地盘"。
这条规则是上期日志里说的"调参三处收紧"里加的。改之前,同样的 soak 测试里猫群 3 个游戏日打了 71 场架;加上它之后是 17 场,其中 10 场被这条退让规则消化掉了。打架从背景噪音变回了事件。README.md 里记着这两个数。
(口径:Godot 4.7 无头模式跑 3 个游戏日,统计事件日志里"打了一架"的行数;命令见文末。这一对数字在 README.md 和 docs/TASK-BOARD.md 里都有记录。)

③ 迁徙不是事件,是余烬熄灭的样子

我做了什么: 什么都不做,只看那只清洁工走到垃圾桶旁边。
底层怎么算: 三段拼起来:
  • 垃圾桶每 3 秒按自己剩余的饭量往外散一次食物气味,量 = 0.15 × 存量 + 0.1(scripts/food_source.gd:103-110);
  • 清洁工每隔 70 秒随机挑一个还有剩饭的垃圾桶,清空它,并在原地写一圈危险气味(scripts/human_npc.gd:74-81 与 :88-93);
  • 正在赶路的猫并不认识"清洁工"这个概念,它只是每帧算一次周围 8 个格子的浓度,往上坡走(scripts/pheromone_grid.gd:gradient() + scripts/cat_base.gd:_move() 的 SEEK_FOOD 分支)。
街区最后变成什么样: 垃圾桶一空,食物气味开始衰减,"上坡"没了,走在半路的猫在原地转圈;等气味彻底散掉,它就放弃目标,散开去别处找方向。
再往另一半看,投喂阿姨是 45 秒一趟(scripts/human_npc.gd:69-74),到了投喂点补 5 份饭,并散一大圈友好气味(:83-87)。所以你会看到饭来猫聚、饭走猫散——这段迁徙在任何一行代码里都不存在,它只是两股气味此消彼长。

④ 老鼠带来的生态位分化

我做了什么: 什么都不做,就数谁抓到过老鼠。
底层怎么算: 猫饿了超过 72、胆量不低于 0.4、掷 30% 的骰子、并且 240 像素内正好有老鼠,才会去追(scripts/cat_base.gd:_hunt_check());贴到 22 像素内就算抓住,饥饿 -55(_move() 里 State.HUNT 的捕获分支);抓住后 18 秒补种一只(scripts/main.gd:catch_mouse())。
街区最后变成什么样: 胆量 0.2 的煤球几乎抓不到,胆量 0.9 的大橘常年蹲在鼠的路上。同一件事——抓老鼠——在不同猫身上长出了完全不同的行为模式。没人分工,是性格参数自己分出来的。

⑤ 你被记住了

我做了什么: 我叼着食物(Q 键)走了一路,一份一份分给路边的猫。
底层怎么算: 一份食物让对方饥饿 -40、对你的好感 +26(scripts/cat_base.gd:on_player_action() 的 "food" 分支)。好感过 30 这只猫就进入"信任玩家"状态。回头看它找谁社交:社交需求过 68 且合群度高于 0.4 才会主动找人(scripts/cat_base.gd:_think() 的 State.WANDER 分支),而它挑人的时候只挑已经有好感的对象,对玩家是按好感 ×1.5 打分、打分要高于 5 分才上门(scripts/main.gd:nearest_friend())。
街区最后变成什么样: 日志开始出现"×× 主动过来蹭你,给你舔了舔手"。而声望是十只猫对你好感值的平均值(scripts/main.gd:_update_hud()),跨过 40 就是「猫王候选」,全街播报、给你戴皇冠、播那段猫王 BGM(同函数后半段)。
反过来也成立,而且我试过:G 键哈气会在身边写一圈危险气味,130 像素内的猫安全感直接 -28、好感 -8、全部逃跑(scripts/player_cat.gd:_try_hiss() + scripts/cat_base.gd:on_player_action() 的 "hiss" 分支)。哈几天,你的声望会一路掉到「孤僻的独行者」。
结论很土,但很真:猫不认人,只认你做过的事。

⑥ 我碰翻了一只花盆

我做了什么: 按 C。
底层怎么算: 55 像素内有没被碰倒的花盆就碰倒它,换上倒花盆贴图,在原地写一圈危险气味,并让 110 像素内的猫安全值 -12(scripts/player_cat.gd:_try_knock() + scripts/flower_pot.gd:knock())。
街区最后变成什么样: 安全值掉到 30 以下就会切换到躲藏状态,目标是最近的纸箱(scripts/cat_base.gd:_think() 的 safety < 30.0 与 _enter(State.HIDE),纸箱查询在 scripts/main.gd:nearest_shelter())。所以你看到的是一排猫同时往纸箱里钻。
一只花盆,搅动了半径 110 像素内的所有猫——然后什么都没留下,花盆不会复原到原位(knocked 是单向的),但街区记得刚才那一瞬间。
horizontal linehorizontal line

顺带说说:声望是怎么算的

顺手交代一下,HUD 上那个称号不是表演,是十只猫的好感平均值过了三道线(scripts/main.gd:_update_hud() 里的 var title := "孤僻的独行者" 往下三行):
称号条件
孤僻的独行者平均好感 < 0
脸熟的流浪猫≥ 0
街区红猫≥ 15
猫王候选≥ 40(触发全街加冕)
旁边的领地格数是实时数你名下有多少个格子(scripts/main.gd:_update_hud())——那也是涌现出来的,你蹭多少次,它就多多少。

想自己复现的话

游戏自带开发用启动参数,命令行加在 -- 之后:
bash
"D:/godot/4.7/Godot_v4.7-stable_win64_console.exe" --headless --path . --quit-after 7200 -- --evlog --fast
  • --evlog:涌现事件同步打印到控制台(scripts/event_log.gd 的 verbose,由 _ready() 读命令行参数打开);
  • --fast:游戏时间 10 倍速,用于 soak;
  • 一个游戏日 = 240 秒(scripts/main.gd 的 day_len)。
打开它,你就和我看到的是同一条街。

最后,帮我个忙

在评论区告诉我:这六件事里,哪一件是你自己跑出来过的?
我特别想知道——如果你实测出来的现象和这里写的不一样,那才是最有价值的一条。把你看到的原样发上来(包括截图和事件日志),点赞最高的那条我会写进 docs/GDD.md 的规则清单和游戏里的行为。
还有个小问题:如果只能加一个新行为进游戏,你希望是什么? 上期到现在,社区给我的答案我已经攒了一堆,但还没塞进代码——因为我想先把上面这六件事讲完。
下期预告:安卓双端适配踩坑。这是我最不想写、但必须写的一篇——一个人把游戏送上手机屏幕,中间卡了多少步。写完这篇,上传就在倒计时里了。
#聚光灯gamejam #涌现 #猫咪游戏 #独立开发 #游戏开发 #独立游戏#聚光灯gamejam开发者日志
猜你想搜
气味之城 涌现机制
【童谣镇】聚光灯第二次开发日志截图
【童谣镇】聚光灯第二次开发日志
开发进度: 美术 1、主角人物立绘已细化完成 2、所有NPC的QQ人形象与呼吸动画已设计完成 3、大部分UI界面已设计完成 4、面包房建模与树屋建模以及基础房屋、路灯、树木模型已完成。 5、制作过场动效,制作通用动效材质ing 6、广场资产替换、永续桥和植被的资产替换、房屋资产替换,河流制作 7、学校模型的材质完成 8、石墩子、小道具模型制作ing 9、NPC正比胸像绘制ing 策划 1、任务系统
16 赞
10 回复
目前个人认为目前聚光灯值得一玩的游戏截图
目前个人认为目前聚光灯值得一玩的游戏
T0是美术风格优秀,并且以玩法为主。 T1是玩法或者美术稍微弱一点,但也很推荐一玩。 排名不分先后: 1️⃣寂静园:复古像素风格的横版解密游戏,关卡设计精妙,很好的运用了"金币"这一关键机制,初解密会感到有些困难,不过当熟练机制之后,便会茅塞顿开 2️⃣spectreX:运用光影折射的横版解密,通关方式多样,不同的光影运用会有意想不到的效果。 3️⃣光与影:同样也是光影解密,和spectreX不同
11 赞
5 回复
00:07
雨天決行 开发者日志02-人工智能的自我修养截图
雨天決行 开发者日志02-人工智能的自我修养
又和大家见面啦!第二篇日志,说实话一开始不知道该怎么编排,但团队里惊喜的成果越来越多,我们已经迫不及待把更新的内容端上来给大家啦!那么事不宜迟,快来看看都有什么新情报吧ദ്ദി˶ー̀֊ー́ )✧ 一.美术(重磅升级) 以主美小为的生命力作为燃料(bushi)本次美术组取得了大进程!首先是各个ui界面的优化和细化,上次大家看到时还只是初具雏形的草稿,现在大多都完整起来了哦! 同时,随着配色的补全,手
43 赞
39 回复
00:34
《荒原复苏指南》开发日志④:关卡演示堂堂袭来!!截图
《荒原复苏指南》开发日志④:关卡演示堂堂袭来!!
- 人类曾因掌握元素合成技术而一度辉煌,又因滥用元素能量而逐渐从内里衰败。 - 30世纪80年代。社会文化充斥着激进乐观主义与庞大机械美学,在这里,污染和能源共生,幸福与痛苦并存。官方广播和宣传画里依旧在宣扬“科学将战胜一切”、“元素能量将再造新农田”的口号,而世界主城却已经因为污染过度而濒临崩溃、空间挤压严重。为了寻找新的生存空间与无污染能源,官方启动了“重构拓荒计划”。 - 玩家将作为前线拓展
18 赞
6 回复
00:30
《失心》游戏开发者日志01|游戏UI迭代及实机演示截图
《失心》游戏开发者日志01|游戏UI迭代及实机演示
进入《失心》之前,玩家首先看到的是我们工作室 UNLOOK 的标识。我们将原来的标识转成 SVG,并让其中的红色瞳点转动、观察,再逐步显露完整字形,希望这个短暂的开场能带出一点好奇和不安。 这次《失心》的开局 UI,我们围绕小灵通(因为游戏的主要交互道具就是小灵通)做了几轮调整,希望玩家从打开游戏开始,就能感受到故事里的年代和气氛(故事年代背景为2000s)。 早期版本先确定了一个方向:把菜单放进
15 赞
10 回复
开发者日志02 ---------- 玩法确定好了?那就直接冲!!截图
开发者日志02 ---------- 玩法确定好了?那就直接冲!!
书接上回,我们已经定了游戏的基础玩法,接下来就是正式搭建框架和往里面填内容了。来自程序的话:我认为做游戏就两步:第一步,先创造这个世界,指定它的规则,创作它的样貌。第二部,往里面增添内容,创造生命,创造天气,地貌河流。(像是个创世神) 接下来隆重介绍一下玩法: 左侧是玩家的飞船背包,所有的道具和捡的垃圾都会装在这里,右侧则是飞船的模块系统,玩家可以往里面填充飞船的模块,一次来规划自己的飞船。 例如
5 赞
开发日志01截图
开发日志01
“涌现” 1.读作 ‌yǒng xiàn‌,意思是(人或事物)在同一时期大量出现,或者突然出现。‌‌ 2.科学含义‌:在复杂性科学里,涌现指大量简单个体相互作用后,整体产生了单个个体不具备的新特性,也就是“整体大于部分之和”,比如蚁群表现出的智慧、人工智能大模型的推理能力。 刚看见这个题目的时候,有一点点懵。看了词语解释之后,才有了一点想法。 考虑到时间还有个人开发的能力限制,目前决定做一个纯粹的
2 赞
《源墨名出》开发者日志 01|情绪会变成颜色,也会淤成一团墨截图
《源墨名出》开发者日志 01|情绪会变成颜色,也会淤成一团墨
大家好,这里是脑洞俱乐部,很高兴能够站在这里与大家一同参加本次聚光灯大赛。 10 月 1 号题目公布 ——「涌现」。我们盯着这两个字沉默了三分钟,然后有人说:要不,我们聊聊情绪吧。 于是就有了《源墨名出》 我们是怎么理解 "涌现" 的? 我们觉得,情绪这东西本来是看不见的。但当它被你看见、被你说出口、被人接住的时候,它就 "涌现" 成了具体的样子 —— 我们让它涌现成了颜色。 红是愤怒,橙是喜悦,
19 赞
13 回复
个人向TapTap聚光灯GameJam经验分享截图
个人向TapTap聚光灯GameJam经验分享
首先简单介绍下我们的项目。 《机类Botkind》,名字借鉴于人类humankind。 核心玩法:编辑指令来控制机器人个体行为,进而在工厂中实现自动化产线 游戏类型:模拟经营,自动化,增量(存疑),编程启蒙(雾) 如题所示,这是一篇个人向GJ经验分享,面向对GJ流程好奇想要尝试或已经在尝试的同学,可能会包含很多主观见解。笔者在这次GJ里作为新人队长和主策划带领了一支十一人的新人为主的学生队伍完成了
4 赞
1 回复
00:07
首曝!来《灵栖工坊》探索灵魂和魔法涌现的故事~【开发日志01】截图
首曝!来《灵栖工坊》探索灵魂和魔法涌现的故事~【开发日志01】
【游戏介绍】扮演魔女栖栖,从魔女之家出发,去不同的世界结识不同的友人,学习和组合各种魔法,开办自己的工坊,创造、满足生灵们的需求,体验各种故事~ 是不是想到了Noita? 当然,玩法还没做出来呢,所以,先看看美术吧。这一次,我们实现了2DHD的效果,spine小人的动画也更加丰富了——就是手搓起来好累好累就是了。(策划:累嘛……还有有十几个NPC) 伊迪雅克,一所建造在人和灵两个世界之间位面的魔法
12 赞
6 回复