www.mudconnector.su
https://forum.mudconnector.su/

Триггеры и прочие специальные действия
https://forum.mudconnector.su/viewtopic.php?f=14&t=23
Страница 1 из 3

Автор:  andrej_andreev [ Сб июн 07, 2008 1:48 pm ]
Заголовок сообщения:  Триггеры и прочие специальные действия

Иногда хочется, чтобы монстры были устроены чуть сложнее, чем мешок с песком.
Для добавления нового поведения я использую модули, подключаемые при необходимости. Выглядит это примерно так:
в описании прототипа монстра:
Код:
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 (если есть). Таким образом можно создавать практически любое поведение. Главное, написать при каждом событии, которое имеет отношение к монстру, метод-реакцию. Так же можно сложно описать поведение в бою или использование умений: подмешивать их при наличии. Или разные флаги типа лутер или агро.

Автор:  KadVar [ Сб июн 07, 2008 1:53 pm ]
Заголовок сообщения:  Re: Триггеры и прочие специальные действия

Немножко непонятно кто где и как что подмешивает.
В частности на какие события и как могут реагировать билдеры.

Автор:  andrej_andreev [ Сб июн 07, 2008 2:05 pm ]
Заголовок сообщения:  Re: Триггеры и прочие специальные действия

Из файла прототипа вынимается хэш с данными монстра: имя, пол, статсы -- все. После чего в базу, хранящуюся в памяти сервера, добавляется вот такой объект: Monster.new(hash). Есть в этом хэше есть указание на специальный модуль, то он подключается и все его методы "встраиваются" в этого монстра.

Билдер пишет модуль, в котором может использовать заранее известный набор методов. Этот модуль он может прикреплять к монстру, вещи или даже комнате -- не важно.

При взаимодействии двух объектов любой природы, у того, над которым производится действие (создание над комнатой, создание над вещью, создание над созданием), вызывается соотвествующий метод on_действие. Вошли люди в комнату, у нее вызвался метод on_enter(who), а тем, кто в этой комнате был и видел, как вошла группа, не только отправили сообщение, но и вызвали тот же метод on_enter(who). Просто у некоторых объектов он определен (модулем), но у большинства -- нет. Сообщать можно и предметам, в принципе, если надо.

"Заранее известный набор методов" описан в движке. В общем говоря, на каждый метод акции (сказать, войти, взять и т.д.) есть метод реакции.

P.s.: для ознакомления с руби вот книжка хорошая: http://www.ruby-doc.org/docs/ProgrammingRuby/

Автор:  KadVar [ Сб июн 07, 2008 2:23 pm ]
Заголовок сообщения:  Re: Триггеры и прочие специальные действия

В чем эээ революционность ? Мне казалось в предыдущем поколении все именно так и организованно...

Автор:  andrej_andreev [ Сб июн 07, 2008 2:29 pm ]
Заголовок сообщения:  Re: Триггеры и прочие специальные действия

Была претензия на революционность? :)

Писать, по-моему, несколько удобней. Может, плохо искал, но в циркле где-то триггеры спрятаны, неочевидны. Не подскажете, как они цепляются к монстру?

Автор:  KadVar [ Сб июн 07, 2008 2:49 pm ]
Заголовок сообщения:  Re: Триггеры и прочие специальные действия

andrej_andreev писал(а):
Была претензия на революционность? :)

Писать, по-моему, несколько удобней. Может, плохо искал, но в циркле где-то триггеры спрятаны, неочевидны. Не подскажете, как они цепляются к монстру?


В том варианте что я видел в монстре указаны номера всех триггеров к этому монстру.
Они хранятся отдельно в отдельном файле. К каждому триггеру указано на что он
срабатывает и что делает.

Автор:  andrej_andreev [ Сб июн 07, 2008 2:55 pm ]
Заголовок сообщения:  Re: Триггеры и прочие специальные действия

А на каком языке это написано? Как вызываются эти функции?

Автор:  KadVar [ Сб июн 07, 2008 3:04 pm ]
Заголовок сообщения:  Re: Триггеры и прочие специальные действия

andrej_andreev писал(а):
А на каком языке это написано? Как вызываются эти функции?

Мы пользуемся DG scripts
http://www.a-mud.ru/builder/Script_Russian/index.htm

Автор:  andrej_andreev [ Сб июн 07, 2008 3:12 pm ]
Заголовок сообщения:  Re: Триггеры и прочие специальные действия

спасибо, изучаю

Автор:  Дворак [ Сб июн 07, 2008 3:47 pm ]
Заголовок сообщения:  Re: Триггеры и прочие специальные действия

ну что же ... вполне нормально...
есть слабое место ...
скрипт, которое описывает какое-то стандартное поведение моба...
его нужно писать для всех мобов или есть что-то типа библиотеки скриптов ?

Страница 1 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/