我目前正在研究Ruby中的基於文本的遊戲引擎,應用程序分爲Ruby代碼和/數據中的/ lib和YAML數據,在遊戲需要時加載。我想允許數據文件包含基本腳本,主要是在事件/觀察者模型中。不過,我也希望用戶能夠生成和共享自定義場景,而不必擔心嵌入腳本中的惡意代碼。我最初的計劃是將用戶創建的內容分爲兩種類型,「模塊」是僅數據(因此是安全的)和插件,增加了額外的功能(但顯然不安全)。爲了類比桌面遊戲,模塊將像發佈的冒險場景和內容一樣,插件將是包含附加規則和系統的規則手冊。Ruby沙盒與集成腳本語言
示例腳本(當然受到的語法更改基於溶液):
---
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中實現數據文件。
優點:簡單而簡單。
缺點:沒有用戶創建的數據是可信的。
我也開放給其他建議,不在列表中,我可能沒有想到。安全地實現嵌入數據文件中的腳本的最佳解決方案是什麼?
編輯2011年12月23日:添加了DSL的第四個選項,在頂部添加了「addendum」以及其他想法/上下文。
嗯,我不是很熟悉遊戲腳本,但爲什麼不使用V8和Javascript?它閃電般快速,大多數人都會很喜歡JS的工作。 – omninonsense 2011-12-23 19:53:03
大家節日快樂! – 2011-12-25 20:35:23
這真的取決於你想達到什麼,如果插件是在ruby中,很難阻止其中一個重新打開一個核心類,並以同樣的方式做任何他們想做的事情,一個Ruby插件可以做任何事情。除了使用任何其他語言作爲插件語言是矯枉過正之外,你會做比它更多的工作;) – Schmurfy 2011-12-26 15:38:14