Если вы разрабатываете DSL, вам, вероятно, потребуется некоторое время, чтобы подумать о домене, на который вы пытаетесь отобразить язык. DSL хороши для удаления повторяющихся шаблонов, которые в противном случае вам пришлось бы писать для каждой задачи, поэтому сосредоточьтесь на этом. Для примеров ваших квестов, какие общие вещи вам нужны между квестами? Очевидно, многое будет зависеть от того, как квесты будут реализованы «за кулисами».
Я могу представить, что квест выглядит примерно так:
Qwest "Retrieve the Grail" do
given_by :pope
description "Some hethan dragon took my cup, go get it back!"
condition "Slay a dragon" do
dragon.is_dead?
end
condition "Grab the Grail" do
player.inventory.contains :grail
end
reward :phat_loot
end
Здесь DSL можно использовать для создания квеста, присвоения ему имени, условий, награды и назначения его квестодателю.
Что касается написания DSL, вы захотите узнать о метапрограммировании в ruby. Я знаю why_the_lucky_stiff написал одну или две статьи об этом, и у острого руководства есть глава об этом ( Массив Двемти в главе 6 ). Лично мне всегда было трудно понять, почему написал. Я заканчиваю тем, что покупал Metaprogramming Ruby , и я нашел это действительно полезным.