我一直对RPG(角色扮演游戏)中涉及的数据结构感兴趣.特别是,我对基于对话和事件的行为感到好奇.
例如:如果我在游戏中的第x点接近NPC ,使用项目y和任务z,我将如何计算出NPC需要说的内容?分支对话和响应玩家输入似乎与定义脚本一样微不足道,并且用户输入使脚本阅读器跳转到脚本中的特定行,该行具有相应的响应行集(非常类似于选择自己的冒险)
然而,如果玩家拥有某些物品并且完成某些任务似乎真的破坏了这个基于脚本的模型,那么将逻辑联系起来.
我正在寻找如何处理所有这些对话和逻辑的想法(不一定是编程语言示例),并将其分离出来,以便添加新的分支内容非常容易,而无需深入研究太多代码.
这真是一个悬而未决的问题.我不相信有一个单一的解决方案,但是用一些想法来推动这个问题是件好事.作为一名设计师而非程序员,我总是对分离内容和代码的方式感兴趣.
例如:如果我在游戏中的第x点接近NPC,使用项目y和任务z,我将如何计算出NPC需要说的内容?分支对话和响应玩家输入似乎与定义脚本一样微不足道,并且用户输入使脚本阅读器跳转到脚本中的特定行,该行具有相应的响应行集(非常类似于选择自己的冒险)
然而,如果玩家拥有某些物品并且完成某些任务似乎真的破坏了这个基于脚本的模型,那么将逻辑联系起来.
一点也不.您只需将条件因素纳入数据.
假设您有对话列表,编号为1到400或类似于选择您自己的冒险书籍示例.我假设每个对话可能包含NPC所说的文本,然后是播放器可用的回复列表.
因此,下一步是在那里添加条件,只需在每个响应中附加条件即可.最简单的方法是使用脚本语言执行此操作,因此,如果此响应可供播放器使用,则返回True的简短代码,如果不是,则返回False.
例如.(XML格式,但可以是任何东西)
Couldst thou venture forth and kill me 10 rats, perchance? Verily! Naught could be better than slaying thy verminous foes. Ten ratty carcasses shall I bring unto thee. Nay, brother! Had thou but ten rats remaining, my sword would be thine, but tis not to be.
在您的脚本语言中,您需要一个'rats_left_in_world'函数,您可以调用该函数来检索有问题的值.
如果您没有脚本语言怎么办?好吧,你可以让程序员代码成为你对话中每种情况的个别条件 - 有点单调乏味,如果你的对话是预先写好的话,并不是那么困难.然后在对话脚本中按名称引用条件.
一个更高级的方案,仍然不需要脚本语言,可能会为每个条件使用标记,如下所示:
Sadly squire, my time is too valuable for the likes of thee. Get thyself a farm hand or stable boy to do thy bidding!
您可以根据需要在其中添加任意数量的条件,只要可以使用一个或两个值轻松指定它们.如果满足所有条件,则响应可用.
有趣的是,这里似乎错过了一个核心理念.我们正在讨论与执行任务的程序员有关.实际上,上面的代码示例与代码耦合,而不是内容.
在游戏开发中,我们的程序员希望赋予内容开发人员权力.他们不会(这非常重要)看代码.期.你不时会得到一位技术艺术家或技术设计师,他们很棒,不介意; 但是,大多数内容作者在技术上并不倾向于.
我理解这个问题是为了你自己的启发; 但是,应该指出的是,在工业中,当我们解决这些类型的问题时,我们的最终用户(利用我们正在开发的技术的人)不是工程师.
像这样的系统(分支对话)需要在工具中使用相对直观的表示.例如,可以使用Unreal的Kismet可视化脚本系统.
从本质上讲,数据结构(很可能是分支树,因为它易于表示/调试/等)将由程序员精心制作,代表脚本中的对象的节点也是如此.该系统能够链接到世界对象(很可能也是由可视化脚本中的节点代表)等,然后制作出来,整个小猫可以用一些优雅的代码链接在一起.
毕竟,设计师实际上能够在可视化脚本语言中构建对话分支的可视化表示.这可能是地图遇到的特定情况.当然,你可以在程序上产生这些; 但是,这更像是程序员的愿望,而不是设计师的愿望.
只是想我会添加一点知识和洞察力.
编辑:注意到有一个XML示例.我不确定其他设计师/艺术家/等等.感受到它; 但是,那些我曾经工作过的人对触摸文本文件的想法感到畏缩.
我敢说,大多数现代游戏(无论是角色扮演游戏,动作游戏,基本卡/棋盘游戏以外的任何游戏)通常都包含几个组件:显示引擎,核心数据结构,以及通常的辅助脚本引擎.一段时间流行的例子(可能仍然是;我多年来甚至没有与游戏开发者交谈)是Lua.
您正在谈论的决策(事件,会话分支等)通常由辅助脚本引擎处理,因为脚本语言更灵活,通常更容易用于游戏设计者.同样,大多数真实的故事驱动或游戏驱动逻辑实际上都会在这里发生,它可以相对容易地换出和更改.(至少,与运行完整版本的所有代码相比!)
主要游戏引擎结合了与世界相关的数据结构(几何等),与玩家相关的数据结构和所需的其他角色,以及用于驱动遭遇的脚本,并使用所有这些来完成显示最终的集成环境.