矮人要塞塔恩·亚当斯谈论游戏开发

图片

长期以来,使用功能强大的处理器进行娱乐的最佳方法之一是矮人要塞Dwarf Fortress) ,该游戏中的整个世界都由ASCII字符组成,并且很高兴会占用1 GB的内存和很大一部分处理器时间。

但是与其他游戏不同的是,在DF的情况下玩家觉得她确实需要她所需要的一切。 她的详细计算创建了一个包含建筑物,城市,商人,河流,火山,怪物和地精的整个世界。 如果一个人创造了所有这一切,那将是一个了不起的成就; 矮人要塞是一个程序,可以自己创建所有这些对象。

游戏的作者塔恩·亚当斯(Tarn Adams)同意回答我们有关其创作的问题,尽管存在许多模仿,但仍然是一款完全独特的游戏。

Gamasutra:我们听说矮人要塞将在Steam和itch.io上以简化版的付费版本出现。 他们说,这是由于您即将支付的治疗费用。 独立开发者很难生存吗?

亚当斯(Adams):是的,您必须付出很多努力才能不离开公司,几乎所有开发商都被迫发明创造性的方式来支付房租和其他主要需求。 有时您遇到无法解决的问题。 到目前为止,我们很幸运,但是我们必须随着时间的变化而改变:辞职并找到新工作,切换到Patreon,现在带着痒痒来到Steam上,或者画铅笔素描,这与创建视频游戏相去甚远。

您对矮人要塞的日常代码构建工作是什么样的? 您使用什么语言? 什么图书馆? 如果使用IDE,该使用哪些IDE? 您在什么计算机上开发游戏?

我使用的是Windows 10普通,不起眼的Toshiba笔记本电脑。我在MSVC Community中糟糕的C / C ++混合环境中编写代码。 对于旧版本,我使用OpenGL,对于主要版本,我使用SDL,对于声音,我使用FMod。 除了在Windows上使用了几十年的MSVC(及之前版本)的标头外,我在Windows上不使用其他任何东西。 我不完全了解Linux / Mac版本中发生的情况,因为我没有定期进行开发。


矮人要塞已经开发了将近17年,其代码库必须达到巨大的比例。 在我的计算机上,使用标准设置创建世界需要超过1.2 GB的RAM。 此类大型项目的问题在于它们变得太大而无法完全容纳在大脑中。 您使用什么策略使项目易于理解和理解?

我有一个严格的命名系统,而且我不会省去长名称的变量和函数,因此即使几年后,所有内容仍然可读。 总的来说,我会自己照顾未来。 我在代码中的所有注释都针对此。 我积极使用“在文件中查找”功能。 但是在某些情况下,我又不得不弄清楚会发生什么情况,例如,在扩展旧系统或修复错误时; 在这种情况下,可能只需要一个小时或更长时间来进行研究。 这使我可以留下我最初没有想到的其他有用的评论。

我记得,Threetoe(塔恩公司游戏开发的合作伙伴)写过故事,然后您尝试创建一个可以实现它们的游戏引擎。 在我看来,这仍然是一种鼓舞人心的工作方式。 您拒绝的故事太复杂而难以实施吗? 在游戏中是否完全重复了其中之一的情节?

哈,我认为它们在某种程度上太复杂了。 角色动机,设定目标等 一直落后于故事的发生方式。 但是,这仍然是一个有用的过程,因为总是有更轻的元素来生成历史记录。 此外,即使我们从未接触过角色,我们也可以研究角色的基本机制。

维基百科说,游戏的版本号(现在为.44)显示了您离完成日期有多远(即44%)。 未来会有什么等待矮人要塞 您对即将发生的事情有任何预感吗? 您还有哪些重要方面需要实施?

我正在用小人来完成发布,它将在接下来的几个月中发布。 他应该很好奇。 然后,我们将实现这些图形并提高Steam / itch版本上游戏的可用性。 然后,我们将改善攻城过程并做更多工作,然后继续进行“大等待”。 这是DF历史上最大的重组和扩张。 这将使我们产生关于创造的神话,创建完整的魔术程序系统,并打开几个窗口以查看世界的不同部分,等等。 这将是一个很大的补充。 然后会有财产/法律/海关的放行。 之后,订单尚未确定,但我们将致力于经济,船舶和其他尚不可用的重要组件的工作。 我们还有很多事情要做! 我们甚至还没有完成1.0版本的一半。 但是1.0版游戏的开发实际上并不会结束……也许,在发布之时,我们根本就没有多少时间。


在游戏中,情节和模拟之间,大多数游戏中预先编写的故事与具有一组规则的深度世界之间存在平衡,规则可以使许多不同的故事出现。 我要说的是, 矮人要塞是支持模拟的最严肃的论据之一。 在创造世界的阶段或游戏过程中,角色会做出令您惊讶的事情吗? 您能举任何有趣/吸引人的例子吗?

是的,这种情况一直在发生! 部分原因是您在玩游戏时很难牢记所有规则。 但是,我所有令人难忘的故事都是bug,因为我很少有足够长的时间来玩游戏,所以从独立发生的游戏玩法的角度来看,它们几乎没有兴趣(即使它们使我感到惊讶)。 好的故事可以在论坛,彩带等上找到。

微观与宏观之间的界线:为什么要像侏儒可以做到的那样与玩家命令要塞要做的事情之间那样?

这是一个困难的平衡,而且并不总是那么容易维护,但目前的概念是,玩家是“要塞意志的官方代言人”,而矮人则表现出自治权,应在其公职范围之外行使。 这使他们可以在自己的故事中成为演员,而故事是新兴(新兴)叙事的主要来源。 同时,玩家应该能够控制自己游戏的主要流程(实际上,这并不重要,但通常比观察模拟更有趣)。

这两个目标可能会发生冲突,这通常是由于玩家继续享受游戏的乐趣-例如,如果确实需要降低紧急控制杆,则任务优先级系统实际上可以使gnome自主地或不自主地做到这一点,具体取决于他是否应该“知道”它。 过去,例如在我们的军需小矮人参与设备交付时,我们在增加过多的官僚主义方面遇到了问题。 但是这个系统太慢了,容易出现错误和玩家困惑。 考虑每个游戏机制如何添加潜在故事非常重要,军需官几乎在其中没有扮演任何角色。

该计划采取什么步骤来建立世界?

她为卡分配内存。 然后,她选择要拥有哪个杆(例如,北,南)(或考虑玩家传递的参数)。 随机数生成器的种子为可变大小的网格设置地图字段的基本值(海拔,降水,温度,排水,火山活动,野生生物),并考虑了各种参数(海洋,岛屿大小,其他可变性),然后程序将它们分形填充。 温度变化取决于极点,程序会选择最高峰的点。 她在这里进行了第一遍操作,以了解该过程的执行方式,并尝试更改高度以使地图适合所需的参数。 在这个阶段,如果世界无法纠正,它将被丢弃,一切都会重新开始。

然后设置第一个导出字段-植被-取决于高度,降水量,温度等。 程序检查生物群系是否对应于参数中指定的间隔。 在此阶段,对中层的高度进行平滑处理以创建更多的平坦区域,并根据火山活动领域放置火山。

然后我们进入侵蚀和河流阶段。 小海洋被排干了,程序会找到山坡的边缘,从中可以运行测试河。 此外,她在其中一个相机上有一个摄像头,因此玩家可以按照此过程进行操作。 如果找不到通往大海的通道,许多假河就会从这些点流下来,中断河道。 有时过高的高度会展平,以致整个地图不会变成峡谷。 理想情况下,为此必须使用矿物质的类型,但到目前为止我们还没有使用它们。 湖泊在河流的几个地方生长。


从高山到大海的高度再次变得平滑,对山峰和火山进行了局部调整。 完成创建高度后,该程序会根据雨影和山区的降水量来调整降水量。 根据海拔高度和降水量以及森林的抑制效果,重新设置温度,然后程序使用新值最终设置植被水平。 为海洋及其邻近的瓷砖设置了盐度值。

做出所有决定后,我们现在可以找到生物群落最终区域的边界,以赋予它们名称和个性。 在这里,我们还添加了地质层和地下层,尽管如上所述,应该早些时候添加地质信息。 接下来,执行最后的验证过程以确保符合参数,以确保我们不会偏离玩家的需求。 完成此操作后,该程序将为每个区域生成动物世界的初始种群并设置天气变量。

故事本身就是从这一刻开始的。 然后找到文明和洞穴。 很难解释接下来会发生什么,但是主要思想是,要根据一个历史记录,以零参与者,相当随意的移动规则和较差的AI(但要有成千上万的特工)来模拟一个巨大的战略游戏。 使用模拟日志记录来故事的程序生成是一种完全可行的方法,但是它也有其缺点。 这是一项繁重的工作,有必要执行后处理和研究才能找到您想要强调的要点,并且如果动态和机制不够,那么结果可能很无聊。

我最喜欢DF的地方是游戏不包含任何明确的生命值系统,与角色的力量和伤害相关的一切都是复杂的人体模型的一部分。 这样的系统有什么优势? 如果有人决定创建类似的东西,那么他们会遇到什么障碍?

该模型创建了更详细的绘图时刻,长期后果,并提供了更好的系统连接性。 很容易走得太远,而且至少在目前阶段,我们确实在某些地方走得太远–某些材料的特性未在其他地方使用。 此外,还有缓解系统的方法,例如可以在游戏中看到这样的示例,例如在游戏中有一个共同的快门速度/能量/命中点池,但是由于严重命中或池中达到零或接近零值的结果而产生了特定的伤口。 正确的系统选择取决于游戏。 我们努力使用尽可能少的数字,因为数字通常不适合故事。

主游戏循环是什么样的?

以gnome模式为例。 首先检查广告并阅读自动保存等。 周期的其余大部分时间并不是在每种情况下都发生。 例如,每隔一百个时钟后,程序就会检查分配的任务和“奇怪的心情”。 军队在世界地图上移动。 每隔一百个时钟后,程序将处理赋予矮人的任务。 这是一种无形拍卖,用于管理不同的冲突优先级。 每隔10刻,季节就会变化,这会影响天气和地图(包括本地和世界各地),还会检查情节要素(外交官,围城等)的发展并检查堡垒是否还活着。

然后,该程序将执行每个度量中要执行的操作。 流体移动且地图图块的其他信息发生变化(但是,进行了各种优化,因此不必每次移动都检查每个图块;此外,有些标记允许您跳过地图的整个区域(如果其中未发生任何变化)。)更新并处理掠食者的移动地图的其他“事件”,例如,主动射击。

如果设置了标记,则无法照顾自己的受伤/口渴/饥饿的侏儒将得到更新。 死灵会“思考”他们的葬礼,以便将这些任务分配给其他人。 被囚禁在牢房和锁链中的生物会定期更新其思想和处境。

然后,如果这些生物越过地图的边缘,则将其从地图上删除。


每五十个小节,所有小酒馆,庙宇,图书馆等的信息,都会根据其他小节进行更新。 耗材也依赖于其他措施,其工作方式类似。 同样,创建用于存储的任务。 尽管该过程得到了各种优化的补充,但它仍然相当缓慢,并且在某些时候超过5万块宝石会引起问题。

每隔一千个小节,标记为要从游戏中删除的对象实际上都会被删除,并为其分配的内存被释放。 这通常发生在对象上,每五十次测量一次,并检查建筑物的使用情况(基本上是对水井的更新和一些其他需要经常检查的标志)。

接下来,我们执行另一个适用于所有度量的更新。 从武器发射的炮弹被移走。 根据需要更新动作(从跳舞和武术训练到讲故事)。 矮人和其他生物做出决定并执行其即时动作(移至相邻的瓷砖上,在车间中工作等)-他们的AI的主要部分(选择任务除外)在此处执行。

每百小节损坏物品。 会执行每一项植被生长的度量(即使存在许多依赖关系和标志)。如有必要,会在每种度量中更新建筑物的状态,并移动手推车。 推进运输路线。 温度会更新(这里有很多优化标志,但是到目前为止这仍然是一个相当缓慢的过程。)

最后,相机会随着玩家观看的生物而更新。

矮人要塞使用基于网格的瓦片地图来表示世界,这是一种简单有效的表示方法。 我注意到有很多绘制瓷砖的方法,这取决于生物的行为或感觉,瓷砖上有多少元素,瓷砖上方是否有东西,瓷砖是在流水还是被埋在石头下。 DF决定如何显示图块时,它会做什么? 您如何优化此过程?

这只是一个符号(字节),带有更多的颜色字节,因此系统一点也不昂贵,我们可以在屏幕上显示选定的解决方案之前简单地替换选定的解决方案,而不是尝试同时解决所有问题,对于大多数瓷砖而言,仅一个土/墙符号就足够了。 从某种意义上说,该程序使用“高度”(生物在物体之上,物体在地球之上)从下至上运行,从而不时更改决策。 尽管如此,尽管存在各种标志和辅助数组,但是可以做更多的事情。 每个图块中都可以显示一小部分可能的单位,因此该程序可以实现逐帧动画,即使在游戏暂停的情况下,您也可以看到图块上的每个元素。

Source: https://habr.com/ru/post/zh-CN454912/


All Articles