воскресенье, 18 декабря 2011 г.

Прототип 8 фикс 7 бета 2

Всем привет.
Позавчера выпустил Прототип 8 фикс 7 бета 2, основная цель которого - поддержка ловушек в движке. Ловушки (они же перехваты) - позволяют перехватить любое действие, совершаемое над предметом. Т.е. можно поймать момент, когда какое-то действие (по имени) совершается с каким-то предметом (как параметр действия) - а именно: до действия (before), после действия (after), а также можно заменить действие (instead), - и выполнить свой набор инструкций.
Если при выполнении какого-то действия есть хотя бы одна замена (instead), тогда другие ловушки не работают, а выполняется только ловушка замены. Если нет, тогда выполняются все ловушки "до", затем действие, затем все ловушки "после". Если во время действия произошла ошибка, и оно не выполнилось, очередь до ловушек "после" не доходит. Это же верно, если ошибка произойдет во время выполнения любой из ловушек - следующие инструкции не будут выполняться.
Например, есть действие "взять", которое имеет шаблон "взять (что, В.П.)", в котором второй элемент (объект в В.П.) передается в процедуру Взять как параметр "предмет". В этом случае можно создать ловушки на действие "взять", совершаемое с объектом "предмет":

Предмет "Яблоко":
Ловушка на действие "взять" с объектом "предмет" до действия:
- вывести сообщение "Вы протягиваете руку, чтобы взять яблоко."
Ловушка на действие "взять" с объектом "предмет" после действия:
- вывести сообщение "Какое вкусное яблоко!"

Выглядит это примерно следующим образом:

> взять яблоко
Вы протягиваете руку, чтобы взять яблоко.
Вы взяли яблоко.
Какое вкусное яблоко!

> взять яблоко
Вы протягиваете руку, чтобы взять яблоко.
Яблоко уже у вас в инвентаре.

Или вариант с заменой:

Предмет "Яблоко":
Ловушка на действие "взять" с объектом "предмет" вместо действия:
- вывести сообщение "Яблоко оказалось приклеенным к полу!"

> взять яблоко
Яблоко оказалось приклеенным к полу!

Хотя, возможно, даже при замене действия (вместо / instead) стоит всё же выполнять ловушки "до".

Т.е. вот так:

Предмет "Яблоко":
Ловушка на действие "взять" с объектом "предмет" до действия:
- вывести сообщение "Вы протягиваете руку, чтобы взять яблоко."
Ловушка на действие "взять" с объектом "предмет" вместо действия:
- вывести сообщение "Яблоко оказалось приклеенным к полу!"

> взять яблоко
Вы протягиваете руку, чтобы взять яблоко.
Яблоко оказалось приклеенным к полу!

Как думаете?