Rob*_*ith 15 ruby scripting lua game-engine
我目前正在使用Ruby中基于文本的游戏引擎,应用程序分为/ lib中的Ruby代码和/ data中的YAML数据,在游戏需要时加载.我想允许数据文件包含基本脚本,主要是在事件/观察者模型中.但是,我还希望用户能够生成和共享自定义方案,而无需担心脚本中嵌入的恶意代码.
附录:我最初的计划是将用户创建的内容分为两种类型,"模块"只是数据(因此是安全的)和插件,它们增加了额外的功能(但显然不安全).为了类似于桌面游戏,模块就像发布的冒险场景和内容,插件将是包含附加规则和系统的规则手册.
示例脚本(当然语法可根据解决方案进行更改):
---
Location:
observers:
on_door_open: |
monster = spawn_monster(:goblin);
monster.add_item(random_item());
monster.hostile = true;
Run Code Online (Sandbox Code Playgroud)
从安全角度来看,如果脚本严格选择加入,可能是通过包含一个带有一点DSL的mixin来实现,例如:
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
Run Code Online (Sandbox Code Playgroud)
我看了三个四个选项,但我不确定哪种方法最好:
使用Ruby脚本,但在某种沙箱中.
优点:非常熟悉Ruby,不需要"粘合"代码或在语言之间集成对象的问题.
缺点:不太熟悉安全问题或沙盒,没有找到任何看似合适的开箱即用的解决方案.
实现嵌入另一种脚本语言,例如Lua.
优点: Ruby和Lua是基于C语言的,因此绑定应该相当简单.Lua是一种相当流行的语言,如果我以后遇到问题,请提供帮助.安全,因为我没有特别绑定的任何功能都将无法从脚本中获取.
缺点:现有的Ruby-Lua绑定似乎是单向的,旧的,维护不良,或两者兼而有之.似乎是一种狡猾的狡猾,将脚本语言嵌入到另一种脚本语言中.
使用Ruby解释器实现自定义脚本语言.我一直在试验 Treetop,制作一个足以满足脚本的简单语法应该不会太难.
优点:无需嵌入其他语言.只有我专门实现的功能才可用于脚本.
缺点:矫枉过正."没有建在这里"的综合症.可能是可怕的虫巢等待发生.
使用特定于域的语言完全在Ruby中实现数据文件.
优点:简单易行.
缺点:用户创建的数据不可信任.
我也对我可能没有想过的那份没有列出的建议持开放态度.安全实现嵌入数据文件的脚本的最佳解决方案是什么?
编辑2011年12月23日:在DSL中添加了第四个选项,在顶部添加了"附录"以及其他想法/背景.