我想要透明地说道:当我开始这一项目时,我 никогда没有使用过AI API,既没有创建过游戏,也只有对基本的web开发有一个理解。Aethermoor: The Chronicles今天正式发布。本篇文章将讲述整个旅程,以及失败的经历。
它是什么
Aethermoor: The Chronicles 是一种基于浏览器的幻想RPG,Claude AI作为一个活生生的叙述者工作。每个反响、战斗结果、故事高潮和NPC对话都是在实时生成的。没有预写的故事分支——这个世界对实际的行动进行回应。有四个职业、12个子职业、一个程序生成的大陆、同伴、派系、一个地下城、新游戏+、30个成就以及AI叫用的令牌经济。
阶段1 — shouldn’t工作的原型
第一版是一个单一的HTML文件和一个Node.js文件。 AI 的调用是简单的:发送玩家最后的消息,获取一条回复并显示。当时没有跟踪状态,没有规则,也没有游戏系统。只是感觉。
它工作得足够好,以致于令人兴奋,也足够糟糕以至于让人尴尬。AI会:
- 在情景中忘记玩家的名字
- 每次玩家移动时都会发明一个新城镇
- 描述玩家无需旅行间隔在不同地理位置
- 给玩家无缘无故的金钱或重生死去的角色
- 每个回复都以“肯定!下一个故事高潮如下:”开始
这个最后一个才是最大的教训: Claude 不是叙述者。它是一位助手。你必须教导它成为一个叙述者。
阶段2 — 巡逻系统
这是实际工作的大部分时间都发生在这里。 每个问题都变成了系统推广的问题。 某些例子:
地点问题 。 AI会生成一个新的铁匠商店当玩家进入城镇时——不同名字、不同个人性格、不同城镇位置。玩家们会立即注意到。一系列-fix:在推广中加入一个已建立的位置规则。任何已提出名字的位置、商店或NPC都是不可变的。AI必须参考已有的配件,绝不发明替代品。
命名问题 。 相关————AI称首都城镇三个不同名字,三次转变。修复:在系统推广中直接注入所有已知地理名称和NPC名字。 不作为背景。作为法律。
NPC的一致性问题 。即使注入了名称,NPC们仍然感觉虚弱。修复:在世界创建时将玩家名字和角色seed到一个名字池中。 ~50个名字,总是与玩家自己的世界相关。叙述家从这个池子中抽取。人物感觉像是在一个世界中活动,而不是每个转变时重新被生成。
时间问题 。 AI对游戏时间毫无概念。它会描述一次旅程“在几天里”完成,然后下一次行动时会像游戏时间没有过去一样。一系列-fix:在玩家状态中跟踪gameDay作为一个硬定数,将其注入系统推广作为一个事实,而不是建议:Day:14。叙述家被指示把这当作最终的当前日期,只有当玩家在游戏中休息或旅行长途时才会推进。
建议问题 。 AI会给玩家建议,如“在这里的市场,你可以访问 Thornhaven”——即使玩家站在Thornhaven的市场。一开始就打破了沉浸感。一系列-fix:明确的规则-叙述家永远不会建议当前位置作为目的地。
马问题 。 玩家可以拥有马。 AI会喃喃自语地说玩家“牵着马来到马具店了”。一系列-fix:在状态块中加入一个专门的 MOUNT 行,一个 HORSE规则来解释,如果玩家以马行则马会随之在一起。看似明显了。
所有这些都没有是华丽的。每个项目都来源于一个玩家(或我)注意到的事情然后在系统推广中写了一个规则来停止它发生。
阶段3——迁移
原型已经扩大了。一个 server.js 文件,保持所有游戏逻辑、所有AI调用的所有、路由和数据库查询的原始文件已变得过于庞大而不可维持。决定迁移到 Next.js——全栈,React前端,API路由作为服务器,Railway 的PostgreSQL,部署到 Vercel。
这是一次痛苦的过程。不是因为 Next.js 很难,但因为迁移一个工作(尽管杂乱)的系统到一个新结构的架构同时保持可用性意味着必须调动所有东西。
移植过程中犯的最大的错误——没有在迁移时先思考数据模型。原始使用一个扁平的 JSON blob 来存储玩家状态,放在单独一列上。对于包含装备、任务、新物种、成就、同伴、子职业和地下城状态的大型游戏是可行的。移植需要重新设计架构,而不是在一次迁移中。
教训:原型在任何事物中。以真实的架构交付。不要试图在没有一致而清晰的数据设计下演变。
评论 (0)