Иногда хочется, чтобы монстры были устроены чуть сложнее, чем мешок с песком.
Для добавления нового поведения я использую модули, подключаемые при необходимости. Выглядит это примерно так:
в описании прототипа монстра:
Код:
4:
:long_name: Часовой следит за путниками
[...]
:special_module: Agressive
А в модели монстра написано примерно вот так:
Код:
class Monster < Creature
def initialize(hash)
super(hash)
if sm = hash[:special_module]
self.extend eval("#{sm}")
end
end
[...]
То есть при создании нового монстра из прототипа, к нему подмешивается модуль.
А в самом модуле (в данном случае: Agressive) вот что:
Код:
module Agressive
def on_say(who, what)
say "Молчать!!!"
attack(who)
end
end
А есть еще такой, более дружелюбный вид:
Код:
module Greeting
def on_say(who, what)
if what=~/^привет/
say "Привет, #{who.name}. Не желаешь ли чего-нибудь купить?"
end
end
end
Кроме того, при отправке сообщений всем в комнате командой say(str) у каждого, кто это видит, вызывается on_say (если есть). Таким образом можно создавать практически любое поведение. Главное, написать при каждом событии, которое имеет отношение к монстру, метод-реакцию. Так же можно сложно описать поведение в бою или использование умений: подмешивать их при наличии. Или разные флаги типа лутер или агро.