我目前正在使用
Ruby中的基于文本的游戏引擎,将应用程序分为/ lib中的Ruby代码和/ data中的YAML数据,在游戏需要时加载.我想允许数据文件包含基本脚本,主要是在事件/观察者模型中.但是,我也希望用户能够生成和共享自定义场景,而无需担心脚本中嵌入的恶意代码.
附录:我的原始计划是将用户创建的内容分为两种类型,即仅数据(因此是安全的)和添加附加功能(但显然不安全)的插件的“模块”.为了类比桌面游戏,模块将像发布的冒险场景和内容,插件将是包含附加规则和系统的规则书.
示例脚本(当然可以根据解决方案更改语法):
--- Location: observers: on_door_open: | monster = spawn_monster(:goblin); monster.add_item(random_item()); monster.hostile = true;
从安全的角度来看,如果脚本严格选择加入,那么这可能是理想的,可能是通过一个包含在DSL中的混合,例如:
class Frog include Scriptable def jump; ... ; end # this can be called from a script allow_scripting :jump def ribbit; ... ; end # this cannot be called from a script end
我看了三个四个选项,但我不知道最好的方法是:
>使用Ruby脚本,但在某种沙盒中.
优点:非常熟悉Ruby,不需要“粘合”代码或在语言之间集成对象的问题.
缺点:不太熟悉安全问题或沙箱,还没有找到任何似乎适合的开箱即用的解决方案.
>实现嵌入另一个脚本语言,例如Lua中.
优点:Ruby和Lua是基于C的,所以绑定应该相当简单. Lua是一种相当流行的语言,所以如果我以后遇到问题,可以提供帮助.安全,因为我没有特别绑定的任何功能将不可用于脚本.
缺点:现有的Ruby-Lua绑定似乎是单向的,旧的,维护不良的,或者两者都是.似乎是一种狡猾的诡计,将脚本语言嵌入另一种脚本语言.
使用Ruby解释器实现自定义脚本语言.我一直在尝试使用Treetop,而不应该是一个简单的语法,这对于脚本来说就足够了.
优点:不需要嵌入另一种语言.我已经专门实现的功能将可用于脚本.
缺点:过度杀伤“不建在这里”综合症.大概可怕的虫巢等待发生.
>使用特定于领域的语言完全使用Ruby实现数据文件.
优点:简单易用.
缺点:没有用户创建的数据是可信的.