Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> Дивный новый метод, Parser для НВН
Chimeric
сообщение Aug 28 2009, 13:13
Сообщение #1


Пушкин
Иконки Групп

Класс: Обыватель
Характер: Chaotic Neutral
Раса: Гигант
NWN: Тексты



Во всяком случае, используется этот метод нечасто. Для кого-то он может быть совсем в новинку.

Функции SetListening, SetListenPattern и иже с ними предназначены для проверки реакций, главным образом, NPC на те или иные реплики. PC могут узнавать через них пароли и т.п. - очень ограниченная функциональность, которую обычно оставляют, как она есть. Но подумаем, что такое система "слушания" вообще, если она позволяет игре отмечать "сказанные", то есть напечатанные, слова и реагировать на них? Это клавишный интерфейс, - по сути, parser, как назывались в текстовых квестах системы, позволявшие набрать в DOS-строчке, к примеру, TAKE SWORD - и персонаж брал меч. Клавишный интерфейс сложнее использовать, чем графический, но и возможности у него шире. В NWN мы можем использовать эту функцию для разного рода настроек.

Меня интересует прежде всего магия. Вот один случай: как нам указать, кого именно мы хотим получить, употребив чары Monster Summoning? Случайный выбор или, наоборот, никакого выбора - это не по мне, но и радиальные кнопки для стольких вариантов завести нереально. Делаем для Monster Summoning скрипт по образцу следующего, который управляет вызыванием элементалов.


Neverwinter Script
/// Пример чар, вызывающих элементала нужной стихии.


void Summon(string sElemental);

{
effect eSummon = EffectSummonCreature(sElemental, ЭФФЕКТ ПОЯВЛЕНИЯ, 0.5f); /// или другая функция вызова
location lTarget = GetLocation(OBJECT_SELF);
float fDuration = GetCasterLevel() * 18; /// длится 3 раунда за уровень мага

if (GetMetaMagicFeat() = METAMAGIC_EXTEND) /// метамагия

{
fDuration * 2;
}

ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, fDuration);
}


void main()

{

effect eStun = SupernaturalEffect(EffectStun()); /// контролируя элементала, маг выключен из происходящего

SignalEvent(OBJECT_SELF, EventSpellCastAt(OBJECT_SELF, SPELL_CONJURE_ELEMENTAL, FALSE));
ApplyEffectTObject(DURATION_TYPE_TEMPORARY, eStun, OBJECT_SELF, fDuration);
string sPattern = "(**зем**|**почв**|**камен**|**песк**|**песч**
|**песо**|**глин**)|(**огонь**|**огн**|**плам**|**у
голь**|**зол**|**жар**|**дым**)|(**вод**|**мор**|**
рек**|**реч**|**рек**|**океан**|**дожд**)|(**возду*
*|**ветр**|**вихр**|**бриз**|**ураган**|**бур**)"
;


/// желательно сделать struct с индексами всех схем для ListenPattern

/// любая группа этих слов даст игре знать, какой элемент мага интересует. Фраза может варьироваться от простого "камень" до "Явись, порождение песка!"


SetListenPatternNumber(OBJECT_SELF, 2); /// ставим схему
SetListening(oPC, TRUE); /// начинаем слушать
DelayCommand(5.0, SetListening(oPC, FALSE)); /// у мага пять секунд на то, чтобы напечатать команду

string sCall = GetMatchedSubstring(0)); /// следим за ЛЮБЫМИ словами мага
int nTheElement = GetMatchedSubstringsCount(sCall); /// считаем совпадения со схемой

while (nTheElement > 0) /// если они нашлись, то где именно?

{

if (TestStringAgainstPattern("**зем**|**почв**|**камен**|**песк**|**песч**|
**песо**|**глин**"
, sCall) = TRUE) /// если призыв к земле, то...

{
Summon("Земной элементал");
break;
}
}

else if (TestStringAgainstPattern("**огонь**|**огн**|**плам**|**уголь**|**зол**|
**жар**|**дым**"
, sCall) = TRUE) /// если призыв к огню, то...

{
Summon("Огненный элементал");
break;
}
}

else if (TestStringAgainstPattern("**вод**|**мор**|**рек**|**реч**|**рек**|**оке
ан**|**дожд**"
, sCall) = TRUE) /// если призыв к воде, то...

{
summon("Водный элементал");
break;
}
}

else if (TestStringAgainstPattern("**возду**|**ветр**|**вихр**|**бриз**|**ураган
**|**бур**"
, sCall) = TRUE) /// если призыв к воздуху, то...

{
Summon("Воздушный элементал");
break;
}
}
}

Не исключено, что я допустил ошибки в коде. Тогда прошу меня поправить, тем более, что он писался для Авроры. Но идея верна. Известно во всяком случае, что можно получить PC через GetLastSpeaker и можно записать его слова в string - а остальное, как говорится, дело техники. Вы в состоянии сами домыслить, для чего еще хорош этот слуховой аппарат. В голову приходят варианты:

1) С его помощью можно отвечать на простые вопросы NPC напрямую, без диалогового окна. Стражник спрашивает "Сдаешься?" и если через пять секунд игрок не напечатает "Да" или "Сдаюсь", то -

2) Можно отдавать персонажу несложные команды, как то: "Следи за (имя NPC или игрока)". Эту команду необходимо предварить "командным словом", в ответ на которое игра будет фиксировать следующие реплики по заданным схемам. Слово, разумеется, игрок должен знать наперед. Тогда, при правильных настройках, персонаж автоматически включит Stealth и будет ходить за объектом по пятам. Другое командное слово выключит режим записи. Так как все функции слушания проверяются через общий для всего шарда GetLastSpeaker, на крупных шардах полезно давать знать игроку, что его команда услышана. Кстати, Функции SetListening все равно, кричит персонаж на весь сервер или шепчет, поэтому лишние сообщения не будут качаться над головами. Точно так же можно приказать самому себе "Делай зелья невидимости" - и персонаж займется алхимией. Эти автоматические действия было бы не так сложно прописать. По сути функция открывает дорогу макросам.

3) Система аукционов. NPC или PC говорит командное слово, объявляет лот, говорит другое командное слово и внимает выкрикам. Максимальное услышанное значение автоматически забирает у покупателя деньги и вручает ему товар.

4) Всякого рода численные параметры теперь могут быть указаны точно. Предположим, какое-то заклинание создает nLevel * 5 HD нежити любого рода, а игроку нужна конкретная смесь. Теперь он может напечатать "3 гуля, 1 гаст и 5 зомби" - и вуаля!

4) Чары наподобие Sequencer.

5) Завещания!

6) Новые возможности контроля для Dungeon Master, который теперь может просто напечатать, к примеру, "дождь"...

И так далее, и так далее, и так далее.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28th March 2024 - 21:19