下载 App
《气味之城》开发日志:一条五级的长期阶梯
10/3110 浏览综合 包含 AI 合成内容
【涌现瞬间】上图是今天实机拍的一屏:屏幕正下方那行写着「春 · 在这座城住满 7 天 1/7」。那不是任务栏,是这个项目里唯一一条会一直陪着你走的进度线——这篇开发日志讲它是怎么设计的,以及为什么它不发任何奖励。
一、它只有五级,写在一张表里(scripts/life_goal.gd:106-113):住满 7 天 / 拥有 3 处常去的地方 / 让 3 只猫愿意靠近你 / 看着这座城走过三个季节 / 成为猫王。每一级都有 kind(读哪个进度源)和 need(达成线)两个字段,所以五级的判定口径完全不同。
二、它是**严格逐级**的,不是五个可以并行打勾的任务。progress() 每次只认当前这一级,越级条件达成了也不算完成(scripts/life_goal.gd:324-343、346-352)。测试里专门钉了这一条:把三处地方和三只猫全都喂到位,第一级没过之前级数纹丝不动(tests/test_life_goal.gd:158-170)。理由写在注释里——阶梯教的是一条时间线,不是一个可以跳着点的清单。
三、每一级的进度源都是**游戏里真实在涨的量**,不是新造出来的计数器。第 2 级「3 处常去的地方」靠停留判定:同一个地方连续待够 2.5 秒才记一次(PLACE_DWELL,scripts/r10_wiring.gd:73、589-609),路过不算;分区是四块真实地面矩形(scripts/r10_wiring.gd:59-63)。第 3 级「3 只猫愿意靠近你」读的是猫对你的 favor,阈值 40.0(FRIEND_FAVOR,scripts/r10_wiring.gd:69、612-629)。
四、记下来之后**立刻回写存档**,不等下一个事件。注释里写了原因:玩家在这个游戏日结束前退出是常态,崩一次或 onKill 一次,刚记下的地方就没了,而界面上它已经算进「3 处常去的地方」——所以 note_place() / note_friend() 记完马上 _push_save()(scripts/life_goal.gd:277-299)。
五、最关键的一条:**只给肯定,不给奖励、不给解锁**(scripts/life_goal.gd:10-20)。完成一级只做三件事——推进级数、发一个信号、显示一句肯定的话,没有第四步(scripts/life_goal.gd:385-391)。这个类上刻意没有任何 reward / unlock / grant / bonus / add_exp / set_cat_king 之类的方法,也没有金币、经验、体力字段,测试逐个名字断言它们不存在(tests/test_life_goal.gd:200-214)。
为什么这么克制?因为这个项目的核心是「涌现」——玩家是猫群的一员,不是养成场的上帝。一旦阶梯发奖励,它就变成了任务列表,而任务列表会把「我今天该干什么」重新按到玩家头上,正好抵消掉引导建立起来的东西。
六、每完成一级,给玩家看的只有一句话(scripts/life_goal.gd:115-121):「你在这座城里住下来了」「有几个地方,已经算是你的了」「有几只猫,愿意走近你一点」「你看着这座城换了几轮」「整条街,开始以你为中心」。换季时也只有一句,不发任何数值:「季节换了,街巷也跟着换了个样子」(scripts/life_goal.gd:124、372-382)。
七、最后一级「成为猫王」不另造一个字段,直接读既有口径 is_cat_king——加冕是别处的事,这个文件只读(scripts/life_goal.gd:310-317)。第 4 级「看过三个季节」读的是 seasons_seen(),也就是季节表算出的下标(scripts/life_goal.gd:270-272)。HUD 上那行字是 status_text() 拼出来的:季节名 · 当前级文案 · 进度(scripts/life_goal.gd:411-414)。
写这类长期系统,我最想听的是另一家的做法:你的阶梯是发奖励还是发一句话?如果是发奖励,你是怎么让它不变成任务清单的?
助力入口:https://www.taptap.cn/poster/NIKiDS1YShdA(在活动页找到《气味之城》的卡片点「助力」,玩满 10 分钟这一票才有效)
游戏页:https://www.taptap.cn/app/955418(免费试玩,安卓免安装)
本游戏内含有使用 AI 生成的游戏资产。(美术资产中 AI 生成 15/62 项、24.2%,已在商店页「合规声明」栏与素材声明动态如实申报:https://www.taptap.cn/moment/860654227951715441 )











