实施MMO任务机制的提示?


14

您将建议使用哪些工具,模式或最佳实践来实现下面列出的要求中给出的任务机制?

我正在谈论软件体系结构(应该是多么通用)以及对象连接,事件订阅和条件表示的选择。欢迎提及您成功使用的工具/库。 编辑:如果您正在使用脚本,您推荐什么设置?

要求:

  • 简单的2D mmo(rpg)
  • 所有游戏数据(包括任务)都存储在关系数据库中
  • 游戏中的任何事件都可能触发玩家的新任务或推进现有任务
  • 任务可以具有任意数量的条件,玩家可以使用该任务
  • 一个任务可以包含任意数量的具有任意条件的子任务/步骤
  • 任务范围很简单:

    与A交谈-杀死5 B-与A交谈-永久增加健康

  • 相当投入:

    使用X区域中的物品-转到Y区域-机器人会产生-杀死机器人而不会造成超过10%的伤害-机器人掉落物品-拾取物品-传送门解锁-将物品传送到传送门后面的J-获得金钱和经验-允许再次通过传送门-锁定此玩家的传送门

  • 可能存在关卡实例(玩家可以团队或孤立地完成某些任务,这只会为那些参与者生成关卡位置)

  • 最好使用世界编辑器来管理任务,而无需脚本或编程知识(编辑:不过,通常不提倡脚本)
  • 我假设C ++是实现的语言

我当时在想,如果我可以将事件和条件的任何链条结合起来,我们就可以对更复杂的模型进行建模,从而可能进行更具吸引力的探索。我尝试过使用自己的ECA(事件,条件,动作)引擎进行滚动实验,但这可能有点过分。在不使用任何脚本的情况下对通用条件进行建模特别困难。


您为什么选择跳过任何脚本有任何特定原因吗?(例如lua / gamemonkey等)。
西蒙

主要是由于缺乏经验,以及(可能是不合理的)关于这可能会对性能产生负面影响的假设。我也想使世界编辑尽可能简单。但是,我愿意使用脚本。
jmp97 2010年

1
我同意,如果没有脚本支持,在没有引擎程序员参与的情况下,很难为任务增加种类。
drxzcl 2010年

1
脚本语言往往足够快,所以这不是问题。我强烈建议您使用它们。也就是说,《魔兽世界》的大部分脚本都基于触发咒语和事件。在后台,“与A对话”会导致A在玩家身上“施放法术”,而实际上该任务将被编码为“当在玩家身上施放法术#55728时成功”。然后,您只需要一点AI编码就可以使生物在玩家身上施放咒语,然后就可以开始了。
ZorbaTHut 2010年

1
现代脚本语言(例如Lua Vm)可能足够快。它们易于使用,易于实现,您可以在运行时重新加载脚本,可以在运行时调试和步进脚本,并且可以在制作内容时更快地迭代。我强烈建议研究脚本引擎(例如:lua和gamemonkey)以编写任务脚本。
西蒙(Simon)2010年

Answers:


6

首先是警告,然后是一些建议。

上一次我需要实现这样的系统时,我没有使用最初用于类似MMO的应用程序的引擎。它附带的任务系统适用于单人游戏,因此无法使用。

我最终不得不用手或多或少地在与任务相关的所有对象上填充脚本,如下所示(伪代码):

Lever004_on_activate() {
    if isOnQuest(player, QUEST_0012) do_something();
    if isOnQuest(player, QUEST_0015) do_something_else();
}

这是一场完整的噩梦。如果没有在整个游戏中进行清除,就无法弄清楚任务的工作方式。不要这样做。

我建议创建一个系统,其中整个任务(行)都表示为有限状态机,并带有用于检查转换的事件和对转换进行响应的脚本。这样可以轻松跟踪给定任务(行)中的位置,并使所有任务状态保持整齐的封装。

如果需要,您可以在世界编辑器中建立一个脚本/脚本模板库,用于常见事件(玩家与NPC交谈,玩家杀死暴民等)。

只要您不经常触发事件脚本,我就不会太担心脚本性能。根据经验,脚本应比“核心”游戏逻辑(动画,物理等)少发射至少一个数量级。他们应该对事件做出反应,而不是定期触发以检查是否满足条件。


3
但是请注意,如果您希望任务路径受到外界因素的影响,或者您的任务相对复杂,那么状态机就会变得非常复杂。多个任务状态机(如果可以激活多个任务)也可能是一场噩梦。但是,由于实质上每个程序都是状态机,因此可以完成。但是,无论如何封装,复杂的问题仍然很复杂。一个很好的例子(imo)是Oblivion,其中某些mod阻止了其他mod的工作-状态的前提和条件必须非常扎实,或者必须非常宽容/容错。
Kaj 2010年

是的,kaj是对的。现在就去魔兽世界论坛,了解人们抱怨无法完成的任务。它一直在发生,即使在大联盟中也是如此。很难正确解决所有问题。
drxzcl 2010年

3

我们的系统基本上涉及在每个任务步骤的每个服务器框架中运行一个表达式(自定义微型脚本语言,但tcl / lua / python也可以正常工作,或者自己制作东西)。这是针对与特定玩家相关联的“个人任务”。然后,每个子步骤都是任务本身的FSM(有限状态机)的一部分(可能只是另一个任务的子步骤)。还有一些“地图任务”具有单个FSM,并且绑定到地图而不是玩家身上(请考虑WAR的公共任务),但是子步骤的工作原理基本相同。

这些表达式实际上是由系统广播的事件,例如“ NPC死亡”或“交互完成”。这意味着您可以在某种程度上分离各个部分,游戏系统仅根据需要发送事件,任务脚本仅侦听事件,而不必担心它们来自何处。如果您还可以使任务FSM与世界状态交互(仅在处于任务状态X时显示此联系),则可以从系统中获得很多能量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.