Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Город Мастеров _ Neverwinter Nights Aurora Toolset _ Другой подход к созданию диалогов

Автор: san Jan 3 2008, 20:03

Недавно была необходимость сделать диалоги для большого кол-ва NPC. Понял наскоко это неудобно(надо каждого НПС создавать диалог, а что если ему надо сказать просто "Здрасте", а игрок всего лишь должен ответить "Здраствуй"). Или надо использовать скрипты, а в них что-то вроде:

Neverwinter Script Source
if( GetTag( OBJECT_SELF=="1" ) ) {
    return TRUE;
} else if ...

Думаю вы знаете как это делается=). А что если нужно создать диалог с проверками/действиями? Приходится использовать скрипты... причем коль-во скриптов может резко увеличится, в зависимости от кол-ва проверок/действий.
Пример создать диалог в котором в зависимости от лвл игрока давалась 100 или 300 или 400 экспы, при этом были бы разные ответы НПС и игрока. Экспа должна даваться при ответе игрока. Это довольно простой пример, но даже здесь надо создать больше чем 1 скрипт. А что если я вообще не знаю как обращаться со скриптами?
Я предлагаю создавать диалоги иначе. Как, смотрите http://nwn.omsktele.com/stat/cd.txt. Все что приведено, - работает и проверено. Для того чтобы добавить систему к вашему модулю, надо включить в него 1 erf. Если тем что здесь описано заинтересуется кто нить(прошу напишите об этом), то добавлю эту .erf'ку, буду объяснять непонятные моменты и совершенствовать систему. На данный момент тестил в НВН1, но легко можно перенести и в НВН2.
зы
сори за грамотность.

Добавлено через 13 минуты 30

Добавил ссылку, а то читать так не удобно... пройдите по ссылке, там тепереь все что надо=)

Автор: Lex Jan 3 2008, 20:14

имхо слишком сложно, проще разобраться со скриптами, тем более в диалогах они простые.
на НВН2 нет смысла переносить, там появились скрипты с параметрами, которые можно прямо из диалога вносить, так что теперь любой диалог может обслуживаться 10-15 скриптами без проблем. А если очень захотеть, то и 2-3 можно решить все задачи.

и похоже система не подразумевает то, что НПС может дать 2-3 ответа на фразу игрока. По крайней мере в структуре об этом ни слова.

текст, как я понял, ты в диалог вносишь через КастомТокены?

Автор: san Jan 3 2008, 21:26

Подразумевает, просто действительно об этом не написано. А сложно кажется, имхо лишь на первый взгляд. Просто когда стока всего написано, все кажется сложным.
Посмотри примеры. Что там сложного? Да, текст вносится ч/з CustomToken'ы.
Вот еще 1 пример диалога, с проверкой и "действием". Цель дать игроку квест, и если он выполнен, награду:

Neverwinter Script Source
    StartCD( GetObjectByTag( "CR_caerpost_GUARDIAN1" ) ); //это просто объект, который вызывает диалог

        SetHeaderCD( "Эта фраза появится если игрок берет квест#IF={( PL[quest]=0 )}", TRUE );
            SetAnswerCD( "Да, я беру квест#A=( PL[quest]=1 )" );
            SetAnswerCD( "Не, не хачу брать", TRUE );

        SetHeaderCD( "Эта фраза появится если игрок взял квест, но не выполнил#IF={( PL[quest]=1 )}", TRUE );
            SetAnswerCD( "Хорошо, хорошо, бегу выполнять", TRUE );

        SetHeaderCD( "Эта фраза появится если выполнил квест#IF={( PL[quest]=2 )}", TRUE );
            SetAnswerCD( "Круто, давай награду#A=( PL[quest]=0 );A=( XP=1000 )", TRUE );
//и. т. д
//а в конце
StopCD( );

Теперь просто сравни с тем же, но с использованием скриптов. Мало того ты знаешь скритпы... а те кто не знают=)?

Автор: Lex Jan 3 2008, 21:46

SetHeaderCD( "Эта фраза появится если игрок взял квест, но не выполнил#IF={( PL[quest]=1 )}", TRUE );
ты думаешь такая конструкция покажется проще тому, кто скрипты не знает? имхо нет smile.gif Фактически ты заменил скриптовой синтаксис своим, ввел пару правил, убрал ненужный для диалогов функционал, слил простенькие скрипты с диалогами. Имхо это замена шила на мыло.

+ такая схема позволяет сделать только совсем простенькие диалоги. Циклы внутри тут тоже не предусмотрены? (банальный пример: у игрока 4 вопроса, которые он может задавать в произвольном порядке. Ну обычный вариант распроса прохожего. Как это у тебя будет выглядеть? В редакторе диалогов это делается линковкой.)
да и когда текст диалога в скрипте, это имхо не очень способствует наглядности.
Вопрос, нужно ли юзеру изучать не простую схему, новый синтаксис для того, чтобы делать простенькие диалоги, при том, что остальные ему придется делать по старинке? честно говоря я хз.

Автор: san Jan 3 2008, 22:09

QUOTE
Циклы внутри тут тоже не предусмотрены?

Да, можно сделать зацикленные диалоги. Там есть опция GOTO=. И что значит "тоже"? Множество вариантов ответов NPC - предусмотрено. Об остальном ты еще пока не говорил.
QUOTE
"SetHeaderCD( "Эта фраза появится если игрок взял квест, но не выполнил#IF={( PL[quest]=1 )}", TRUE );"

Я думаю да. Что надо сделать чтобы сделать такую проверку? Примерно вот что:
Neverwinter Script Source

object oPC = GetPCSpeker( );
int l = GetLocalInt( oPC, "quest" );
if ( l == 1 ) {
    return TRUE;
}

Разве это сравнимо с "#IF={( PL[quest]=1 )}"?
QUOTE
да и когда текст диалога в скрипте, это имхо не очень способствует наглядности.

Согласен. Не очень наглядно - это минус. Если кому то будет интересно, что я тут сделал, обязательно исправлю=) Мне просто нужно чтобы хотябы 2-3 человека, сказали, да мы будем это юзать(иначе, нах мне оно надо=)?, для себя я уже сделал все что мне нужно и буду пользоваться). Тогда сделаю чтобы все было удобно и наглядно, и вообще без знания скриптов.
QUOTE
Вопрос, нужно ли юзеру изучать не простую схему, новый синтаксис для того

Новый синтаксис, это сильно сказано, так пару правил=). И насчет сложности, сделать можно очень сложные диалоги. В том и прикол чтобы делать все диалоги из 1ого скрипта, без использования дополнительно скриптинга.
ps
Я действительно старался упростить создание диалогов, если первый же человек говорит, что это нафиг некому не надо... фигово. Просто жалко, что зря делал.

Автор: Lex Jan 3 2008, 23:11

Цитата(san @ Jan 3 2008, 22:09) *
object oPC = GetPCSpeker( );
int l = GetLocalInt( oPC, "quest" );
if ( l == 1 ) {
return TRUE;
}

вообще то вот скриптовой вариант:
Neverwinter Script Source

return ( GetLocalInt( GetPCSpeker( ), "quest" )==1 );

и вот твой:
Neverwinter Script Source
"#IF={( PL[quest]=1 )}"

имхо сравнимо.

Цитата(san @ Jan 3 2008, 22:09) *
Там есть опция GOTO=.

ок, есть. Но проблема наглядности остается. Чтобы разобраться в диалоге (что после чего и в какой момент) потребуется время. В то время как в редакторе диалогов оно визуально (да и кликнуть на ссылку можно) очень понятно.

Цитата(san @ Jan 3 2008, 22:09) *
В том и прикол чтобы делать все диалоги из 1ого скрипта, без использования дополнительно скриптинга.

я боюсь размеры будут поражать воображение. + такой диалог будет труден для разбора автору спустя пару недель. Стороннего обозревателя он вообще в кому вгонит biggrin.gif

Автор: azathoth Jan 3 2008, 23:12

хм, а почему бы не делать диалоги через диалоги? если весь смысл в том, чтобы заменить несколько мелких скриптов одним о-хо-хо и с ним возиться на уровне некомпилицо\строкиперепутал, когда в диалоге всё видно. а модмейкеру проще разобраться в скриптах, а не сначала в скриптах и потом в какой-то системе.

зы: у меня есть похожая система для квестов smile.gif

Автор: Lex Jan 3 2008, 23:15

Цитата(san @ Jan 3 2008, 22:09) *
Мне просто нужно чтобы хотябы 2-3 человека, сказали, да мы будем это юзать

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

зы: кстати это гоуту в твоей структуре понятно, а в диалоге оно как обеспечено? Неужели линковка от каждой фразы есть во все узлы? wacko.gif

Добавлено через 46 секунд

Цитата(azathoth @ Jan 3 2008, 23:12) *
зы: у меня есть похожая система для квестов

у меня такая же для условных триггеров biggrin.gif biggrin.gif Тока синтаксис чуть другой, а идея та же. Условие в текстовые локалки/имени триггера, а в скрипте парсер и проверка smile.gif

Автор: azathoth Jan 3 2008, 23:29

а вот .ерф интересно посмотреть на предмет метода парсинга строк.

Автор: san Jan 4 2008, 02:08

QUOTE
зы: кстати это гоуту в твоей структуре понятно, а в диалоге оно как обеспечено? Неужели линковка от каждой фразы есть во все узлы?

Нет. Все работает несколько иначе. Вы ведь поняли что можно создавать диалоги любого уровня вложенности? То что дано в структуре лишь пример. Я бы не смог описать полную структуру, т.к вложенность бесконечна=). От каждого ответа может быть скоко угодно хидеров, и от каждого из хидеров может быть скоко угодно ответов(только есть ограничение на максимальное кол-во одновременно отображаемых ответов = 4, не знаю почему я выбрал 4, но число это можно легко увеличить, просто мне кажется что хватает и 4ых вариантов(ОТОБРАЖАЕМЫХ!)).
Neverwinter Script Source
return ( GetLocalInt( GetPCSpeker( ), "quest" )==1 );

Тут ты прав, почти что сравнимо. Но я предпочитаю так не делать. И во вторых мы оба указали лишь 1 скрипт, а нужно то 3=) Пусть в НВН2 можно обойтись 1 скриптом, но тогда он точно будет выглядеть не так просто=)
QUOTE
зы: у меня есть похожая система для квестов
у меня такая же для условных триггеров biggrin.gif biggrin.gif Тока синтаксис чуть другой, а идея та же. Условие в текстовые локалки/имени триггера, а в скрипте парсер и проверка smile.gif

Тут все зависит от задач... если игроку юзеру нафиг не нужны диалоги, то ему не зачем что-то придумывать. И пользоваться тем что есть. Я поэтому и назвал тему "Другой подход к созданию диалогов". Я назвал преимущества данного метода, вы назвали главный недостаток(ненаглядность). У стандартного метода тоже куча недостатков. Если вы прочитали про Шаблоны, то могли бы заметить как легко вставить какой-то параметр в текст диалога... Раз вам удобно делать так как вы привыкли, я не буду(да и не смогу) вас переубеждать. Но раз уж вы обратили на этот топик внимание(а это значит что тема вам в каком то образе близка) я просто прошу посмотреть на плюсы данного способа, и если они перевешивают минусы(а я в этом уверен=)) вседаки попробывать им пользоваться(уж для вас то это не проблема).
QUOTE
хм, а почему бы не делать диалоги через диалоги? если весь смысл в том, чтобы заменить несколько мелких скриптов одним о-хо-хо и с ним возиться на уровне некомпилицо\строкиперепутал, когда в диалоге всё видно. а модмейкеру проще разобраться в скриптах, а не сначала в скриптах и потом в какой-то системе

Я еще раз говорю, если кто нить захочет юзать эту систему, то ее тоже можно сделать наглядной. И ведь прикол даже не в том чтобы модмейкеру проще разобраться в скриптах, а в том что приходится создавать кучу "ненужных" скриптов. Я привел пример, диалога, посчитай скоко в нем должно быть скриптов, чтобы он работал как надо(по моим подсчетам 4). Хорошо, если такой диалог 1, а если их много? Количество "лишних" скриптов очень сильно возрастает, и немудрено, как вы правильно говорите "запутаться" уже в них=) Так же, вы почему то не хотите обращать внимание, на другую функцию этой "системы", это то когда надо, создать много мелких диалогов. Например дилаог для всех второстепенных NPC в городе. Удобно ли для каждой пустяковой фразы создовать по диалогу? Или опять таки надо юзать скрипты... "некомпилицо\строкиперепутал", такая возможность есть и когда вы создаете диалог с помощью скриптов и редактора диалогов. А разобраться в "какой-то системе" можно за минут 20(если вы знаете на хотябы минимальном уровне скрипты, даже не скрипты, а просто логику), врядли нужно больше времени. Имо, ничего сложного тут нет. Если в НВН2 есть диалоги с параметрами, то это несколько уменьшает проблему, но все равно, она есть.
QUOTE
я боюсь размеры будут поражать воображение. + такой диалог будет труден для разбора автору спустя пару недель. Стороннего обозревателя он вообще в кому вгонит

С чего ты взял что он будет большим? 1) То что все диалоге будут находится в одном скрипте удобно для меня. Если кто-то захочет использовать больше чем 1 скрипт, он легко сможет это сделать, если он хочет чтобы даже каждый диалог находился в отдельном скрипте, он сможет это сделать. Можно также, например, несложные диалоги помещать в 1 скрипт, а сложные в отдельные. 2)Даже если все диалоге в одном скрипт разобраться в них будет так же просто как в отдельно взятом диалоге. Ведь начало и конец диалога легко узнаваемы. Пример:
Neverwinter Script Source

//Вот первый диалог его будет говорить НПС с тагом CR_caerpost_GUARDIAN1.
StartCD( GetObjectByTag( "CR_caerpost_GUARDIAN1" ) );
        SetHeaderCD( "Эта фраза НПС с тагомCR_caerpost_GUARDIAN1", TRUE );
              SetAnswerCD( "А это ответ НПС", TRUE );

//А это уже диалог для НПС с тагом ANOTHER_DIALOG
StartCD( GetObjectByTag( "ANOTHER_DIALOG" ) );
        SetHeaderCD( "Эта фраза НПС с тагомCR_caerpost_GUARDIAN1", TRUE );
              SetAnswerCD( "А это ответ НПС", TRUE );
//И что, здесь разве можно спутать кто из NPC какой диалог говорит?

QUOTE
зы: у меня есть похожая система для квестов
у меня такая же для условных триггеров biggrin.gif biggrin.gif Тока синтаксис чуть другой, а идея та же. Условие в текстовые локалки/имени триггера, а в скрипте парсер и проверка smile.gif

Может не стоит прятать подобные системы? А наоборот, стараться чтобы народ узнал о них, и если они облегчают жизнь начал использовать? Забавно, вы сами придумываете кое-что чтобы облегчить себе жизнь, а я вам предлагаю, что-то чтобы облегчить вам жизнь, а вы отказываетесь=) Вместо того чтобы поддержать говорите что вам это не надо=)

Автор: Lex Jan 4 2008, 02:45

Цитата(san @ Jan 4 2008, 02:08) *
но тогда он точно будет выглядеть не так просто=)

ты немного неправ
Neverwinter Script Source
return ( GetLocalInt( GetPCSpeker( ), sName )==nLocal );

sName и nLocal - передаваемые из диалога параметры. таким образом этот один скрипт может проверить любую локалку игрока на любое нужное значение.

Цитата(san @ Jan 4 2008, 02:08) *
Забавно, вы сами придумываете кое-что чтобы облегчить себе жизнь, а я вам предлагаю, что-то чтобы облегчить вам жизнь, а вы отказываетесь=)

я от той системы в итоге отказался из-за нецелесообразности и громоздкости (ну и ненаглядности конечно). В модуле потребовалось проверок 10-15, ради них городить такой геморой не стоило и я написал по старинке, сделав лишь типовые упрощения.

Цитата(san @ Jan 4 2008, 02:08) *
С чего ты взял что он будет большим?

прикинул. Ты вот сам возьми не пример на 10-15 фраз, а приличный диалог фраз на 100. И попробуй потом спустя неделю в нем ногу не сломать. Неявность переходов по гоуту (метки искать нужно - а в редактре просто клик), лишний служебный текст (команды), который отвлекает от анализа. Если даже в удобном древовидном редакторе начинаешь путаться когда диалог большой, то что же будет тут, я даже представить боюсь. + я пока вижу, как не странно, в том что все перемешано. Те доступ к уловиям/действиям диалога есть прямо сразу, не нужно никуда кликать. Но имхо этот + не перевешивает проблемы с навигацией по диалогу.

Цитата(san @ Jan 4 2008, 02:08) *
Может не стоит прятать подобные системы? А наоборот, стараться чтобы народ узнал о них, и если они облегчают жизнь начал использовать?

дело в том, что все подобные системы зачастую очень специфичны и удобны только автору. Проверено годами smile.gif Все что пользователь более-менее может переварить, мы кидаем или в Базу скриптов или в виде ерефок на сайт ( http://www.wrg.ru/site_plugins/content/content.php?content.84).

Цитата(san @ Jan 4 2008, 02:08) *
а я вам предлагаю, что-то чтобы облегчить вам жизнь, а вы отказываетесь=)

веришь, нет, но мы можем оценить что нам нужно, а что нет smile.gif Провозившись с диалогами в НВН больше 4х лет я могу точно сказать, что такой системой пользоваться не просто смогу.
другим может быть пригодится, я хз smile.gif
Цитата(san @ Jan 4 2008, 02:08) *
Вместо того чтобы поддержать говорите что вам это не надо=)

а что нам говорить, если *нам* действительно не надо? Ждем других smile.gif

Добавлено через 2 минуты 17 секунд

Цитата(san @ Jan 4 2008, 02:08) *
Я еще раз говорю, если кто нить захочет юзать эту систему, то ее тоже можно сделать наглядной.

каким образом?

Автор: san Jan 4 2008, 12:17

Самый элементарный способ сделать приложение на AJAX'e(если кто не знает, то это, вкратце, просто html страничка с Javascript'ами, приложение можно сделать как офлайновое так и онлайновое, как удобно, возможно и то и то), которое будет выдавать удобную древовидную структуру, возможно даже удобней чем в стандартном редакторе. После того как диалог будет сделан нужно будет вставить готовый код в файл скрипта. Чтобы открыть диалог нужно будет скопировать нужный диалог в AJAX приложение. Второй способ сделать плагин к тулсету НВН2, но этим я заниматься вряд ли буду, ибо нужны новые знания, и для НВН1 этот способ не подходит(а я то работаю с НВН1). В дальнейшем можно даже сделать возможность создать базу диалогов=) (ну это просто как продолжение идеи=))
"веришь, нет, но мы можем оценить что нам нужно, а что нет" Поэтому я и говорю, что я не смогу вас убедить=).

QUOTE
sName и nLocal - передаваемые из диалога параметры. таким образом этот один скрипт может проверить любую локалку игрока на любое нужное значение.

Понятно, посмотрел как это будет выглядеть в НВН2=)
QUOTE
дело в том, что все подобные системы зачастую очень специфичны и удобны только автору. Проверено годами smile.gif Все что пользователь более-менее может переварить, мы кидаем или в Базу скриптов или в виде ерефок на сайт

Ясно.
И еще приведу пример. В нашем стром модуле порядка 500 скриптов, из них 200 - для диалогов.
ps
И все даки главным образом, то что я сделал нужно для НВН1, для НВН2, проблема уже не так остра... там гораздо больше возможностей.
ps
А в НВН2 случаем нет регулярных выражений?

Автор: Белатрис Jan 4 2008, 13:13

Я написал за все свое время с тулсетом кучу разных диалогов и самые простые, как раз-таки для горожан были типа:
Как дела?
_______Да так, неплохо и т.д. и т.п.
_____________НАЗАД
Как тут живется?
_______Полный отстой... работать много нужно и т.д. и т.п.
_____________НАЗАД
Где губернатор?
_______А он в загоне со свиньями... играется там... и т.д. и т.п.
_____________НАЗАД
ЗАКОНЧИТЬ РАЗГОВОР

Для неквестовых персонажей вполне нетрудно и недолго сделать. Такой стиль гораздо информативнее и не оказывает сильного давления на психику при создании диалога.
В моем модуле002 такие диалоги юзают НПС без имен, т.е. внесюжетные; их около 20 и на каждый вопрос(которые тоже звучат по разному) уникальный ответ, иногда даже разветвляющийся.
В общем, ты зря убил время. declare.gif Не думаю, что многие заинтересуются nea.gif

Автор: Lex Jan 4 2008, 13:38

Цитата(Белатрис @ Jan 4 2008, 13:13) *
В общем, ты зря убил время.

но-но. не надо столь категорично. Сам автор пользуется - значит время потрачено не зря.

Автор: virusman Jan 4 2008, 13:48

Цитата(san @ Jan 4 2008, 12:17) *
Самый элементарный способ сделать приложение на AJAX'e(если кто не знает, то это, вкратце, просто html страничка с Javascript'ами, приложение можно сделать как офлайновое так и онлайновое, как удобно, возможно и то и то), которое будет выдавать удобную древовидную структуру, возможно даже удобней чем в стандартном редакторе. После того как диалог будет сделан нужно будет вставить готовый код в файл скрипта. Чтобы открыть диалог нужно будет скопировать нужный диалог в AJAX приложение.
http://data.virusman.ru/ax20/conv_editor/conv_editor_demo.htm
(недоделано; можно драг-н-дропить, редактировать и т.д. если выделение не работает - надо нажать на кнопку внизу)

Автор: san Jan 4 2008, 14:29

QUOTE
В общем, ты зря убил время.

В целом, по ходу, ты права. Но*с маниакальным блеском в глазах*вы будите дальше тратить свое время делая диалоги так как делаете(я имею ввиду, главным образом, тех, кто делает диалоги для НВН1, и некого не хочу обидеть=)).
QUOTE
http://data.virusman.ru/ax20/conv_editor/c...editor_demo.htm
(недоделано; можно драг-н-дропить, редактировать и т.д. если выделение не работает - надо нажать на кнопку внизу)

Раз это не надо никому, я не хочу тратить на это время. Я честно попробовал вас заинтересовать... не получилось, чтож значит не судьба. Но все равно, если че есть с чего начинать=)
QUOTE
В общем, ты зря убил время. declare.gif Не думаю, что многие заинтересуются nea.gif

Да мне многих и не надо, 2-3 человека - достаточно =) И имхо, ты вот говоришь информативно. И скоко же у тебя твоих диалогов было? И че прикольно искать, какой то диалог в куче других, чтобы исправить 1-2 буквы? Я просто представляю имена диалогов dlg_npc1, dlg_npc2... dlg_npcN. Я привел пример скоко надо самых простых скриптов на диалоги, 200(!!!) из 500, тоесть почти половина, скриптов без которых можно обойтись.

Автор: virusman Jan 4 2008, 14:40

Цитата(san @ Jan 4 2008, 14:29) *
Раз это не надо никому, я не хочу тратить на это время. Я честно попробовал вас заинтересовать... не получилось, чтож значит не судьба. Но все равно, если че есть с чего начинать=)
Это, кстати, зачатки системы для управления диалогами прямо в БД. Т.е. можно составить диалог с простыми псевдоскриптами в веб-интерфейсе, затем прицепить этот диалог к NPC - и диалог сразу появится на сервере. Ни отдельные скрипты, ни отдельные диалоги не используются.

Автор: Lex Jan 4 2008, 14:53

Цитата(san @ Jan 4 2008, 14:29) *
И скоко же у тебя твоих диалогов было? И че прикольно искать, какой то диалог в куче других, чтобы исправить 1-2 буквы?

у меня больше 70 сюжетных/квестовых диалогов было - никаких проблем с поиском нужного - нормальная система именования диалогов. Более того, у меня скриптов больше 2300 было, где-то четверть - диалоговые. и тоже никаких проблем с поиском нужного (опять выручила система имен). Чтобы поправить какое-то скриптовое место в диалоге мне зачастую не нужно было его (диалог) открывать, я и так знал какие скрипты там стоят.
проблемы с диалогами были в их архитектуре. Грамотно линковать между собой разные линии, чтобы по тексту не было нестыковок. И вот в такой работе ненаглядность - ну очень помешает.
большая часть времени при работе с диалогом уходит на текст и на структуру. Скрипты занимают очень скромное место. И это при том, что у меня диалоги содержали скрипты в среднем на каждой третьей фразе, а некоторые диалоги (прохожего обычного), так вообще по 1-2 скрипта на каждой фразе имели.

имхо больше работу упростит не совмещение диалог-скрипт, а написание удобных систем для квестов (установка/проверка состояний квестов + работа с журналом) и для диалогов (ввод основных, общих для всех НПС локалок и работа с ними. На этих общих/системных локалках я сэкономил несколько сотен скриптов как минимум)

Автор: azathoth Jan 4 2008, 15:23

san, если ты это писал для себя -- молодец, а вот если писал специально для новичков -- то зря конечно. в НВН2 с диалоговыми скриптами вообще проблем нет, и можно проверять тег неписи всего одним. и ничего плохого в дереве диалоговом нету, если хочешь -- можно хоть одно на всех создать, а насчёт того что будет много скриптов в НВН1 боятся явно не стоит smile.gif имхо проще найти нужный .dlg, чем рыть rawcode.

Вот ежели ты напишешь привычный на вид редактор диалогов которым будет наглядно и удобно пользоваться, генерящий втихомолку ужасные скрипты (+экспорт в .dlg), то ищи-свищи недобитых нвн1 стоителей -- много ли их наберётся? кто-то решит, что ради 15 фраз оно того не стоит, кто-то захочет полного контроля над скриптами и сложные катсцены.

зы: регулярных выражений в НВН2 нет, раз ты спрашиваешь, но никто не мешает заскриптить нужные функции, да и на обсидианцев может вдруг найти, и они побиндят нужные функции, но это уже вряд ли...

Автор: Белатрис Jan 5 2008, 03:39

Цитата(san @ Jan 4 2008, 22:29) *
И че прикольно искать, какой то диалог в куче других, чтобы исправить 1-2 буквы? Я просто представляю имена диалогов dlg_npc1, dlg_npc2... dlg_npcN. Я привел пример скоко надо самых простых скриптов на диалоги, 200(!!!) из 500, тоесть почти половина, скриптов без которых можно обойтись.

Проще нажать на нужного персонажа и выбрать разговор. Ибо что-то исправить хочется при тестировании(90%), а при нем ты помнишь нужного героя. К тому же, диалоги сюжетным НПС желательно называть по их именам(например, у Бэна диалог будет называться "ben)". Да и вот, что я тебе скажу, чел, работающий над модом и пишущий диалоги знает, где располагается каждая строчка, а если и позабыл, быстро сориентируется. У меня много раз были ситуации, когда приходилось изменять одну буковку или сместить какой-то скрипт на другую строчку - особых проблем никогда не возникало. Впрочем, это дело вкуса. Я тебя не отговариваю, просто высказываю свое ИМХО, которое ты не обязан слушать smile.gif

Автор: gennady Jan 5 2008, 09:12

San, для уменьшения количества скриптов нужно просто написать несколько универсальных, вот и все… Не стоит подменять редактор диалога еще какой-то системой. Редактор и без того удобен и всех устраивает, все что нужно для построения диалога там есть.
Мне кажется, твоя затея отлично подойдет для создания полностью автоматических небольших квестов. Тут на форуме уже один мечтатель поднимал тему по этому вопросу, мне кажется ты сделал шаг к этому! Как ты думаешь, твоей системе это по силам? Мог бы оказать посильную помощь… rolleyes.gif


Автор: Aiwan Jan 5 2008, 12:02

Пять юаней. Периодически у многих возникает желание "изобрести велосипед". И дело даже не в КПД полезных свойств системы, а главное хочется решить поставленную перед (самим) собой задачу. Даже я, грешил иногда такими вещами. Надо доделать что-то, а вот нет. Сижу пишу какой то скрипт, который никто и не поймет что он ноу-хау! Главное в таком деле получить позитив от сделанного. Автор поставил задачу, выполнил. РЕСПЕКТ. smile.gif Остальное, ИМХО не важно.

Простой пример, скрипт закрываняи дери написан ввиду того, что при закрывании дерей РС смещался постоянно и выглядело не очень эстетично:

Neverwinter Script Source

//:://////////////////////////////////////////////
//:: OnOpen am_dop_close
//:: Copyright © 2006 WRG!  www.wrg.ru
//:://////////////////////////////////////////////
/*
      Универсальный скрипт для всех дверей.
  Закрывается дверь, только когда РС отошел от нее
  дальше 5 метров. Связано с глюками закрывания.
*/
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 22.09.2006
//:://////////////////////////////////////////////
#include "am_inc_common"

void main( )
{
  object oDoor = OBJECT_SELF;
  object oPC = GetLastOpenedBy( );
  object oTarget = GetTransitionTarget( oDoor );

  AssignCommand( oDoor, ClearAllActions( ) );
  AssignCommand( oDoor, ActionWait( 15.0 ));

  if( oTarget == OBJECT_INVALID || !GetIsPC( oPC ))
  {
      AssignCommand( oDoor, ActionCloseDoor( oDoor ));
  }
    else
        {
          AssignCommand( oDoor, ActionDoCommand( ExecuteScript( "am_exe_door", oDoor )) );
        }
}


Neverwinter Script Source

//:://////////////////////////////////////////////
//:: OnOpen am_exe_door
//:: Copyright © 2006 WRG!  www.wrg.ru
//:://////////////////////////////////////////////
/*
      Универсальный скрипт для всех дверей.
  Закрывается дверь, только когда РС отошел от нее
  дальше 5 метров. Связано с глюками закрывания.
*/
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 22.09.2006
//:://////////////////////////////////////////////
#include "am_inc_common"

void main( )
{
  object oDoor = OBJECT_SELF;
  object oPC = GetFirstPC( );
  object oTarget = GetTransitionTarget( oDoor );

  if( GetIsOpen( oDoor ) == FALSE ) return;
  if( GetIsOpen( oTarget ) == FALSE ) return;

  AssignCommand( oDoor, ClearAllActions( ) );

  if( GetDistanceBetween( oDoor, oPC ) > 5.0 ) // Если РС отошел от двери
  {
    if( GetDistanceBetween( oTarget, oPC ) > 5.0 ) // И не переместился
    {
        Debug( "РС отошел от двери, мы ее закрываем." );
        AssignCommand( oDoor, ClearAllActions( ) );
        AssignCommand( oDoor, ActionCloseDoor( oDoor ));
        return;
    }
    // Если переместился и стоит теперь рядом с другой дверью
    else
        {
          if( GetObjectType( oTarget ) == OBJECT_TYPE_DOOR )
          {
              Debug( "РС совершил переход и стоит рядом с одверью, мы ее не закрываем." );
              AssignCommand( oTarget, ClearAllActions( ) );
              AssignCommand( oTarget, ActionWait( 12.0 ));
              AssignCommand( oTarget, ActionDoCommand( ExecuteScript( "am_exe_door", oTarget )) );
              return;
          }
          else
              {
                  Debug( "Объект перемещения РС не был дверью. Закрываем первую дверь." );
                  AssignCommand( oDoor, ClearAllActions( ) );
                  AssignCommand( oDoor, ActionCloseDoor( oDoor ));
                  return;
              }
        }
    }
    else // Если стоит рядом то повторим все...
      {
          Debug( "РС стоит рядом с дверью, мы ее не закрываем." );
          AssignCommand( oDoor, ClearAllActions( ) );
          AssignCommand( oDoor, ActionWait( 12.0 ));
          AssignCommand( oDoor, ActionDoCommand( ExecuteScript( "am_exe_door", oDoor )) );
      }
}


Нужен этот скрипт кому-нибудь? ОСмневаюсь. smile.gif А мне ну оооочень надо было! pardon.gif

Добавлено через 4 минуты 11 секунду

Поставь я такой скрипт разницу мало кто заметит.
Neverwinter Script Source

void main( )
{
   object oDoor = OBJECT_SELF;
    AssignCommand( oDoor, ClearAllActions( ) );
    AssignCommand( oDoor, ActionWait( 12.0 ) );
    AssignCommand( oDoor, ActionCloseDoor( oDoor ) );
}

Автор: Sairilias Jan 5 2008, 12:24

У нас в сейчас активно используется около 30 универсальных скриптов в диалогах (простых и сложных) всех НПСей, которых около сотни, получается что не на каждого НПС есть хотя бы 1 отдельный скрипт. Уже просто комбинируя порядок следования строк условий можно существенно разнообразить диалоги, расстановка может и сократить скриптовую базу обслуживающую диалоги.

Автор: Lex Jan 5 2008, 12:56

Цитата(gennady @ Jan 5 2008, 09:12) *
Мне кажется, твоя затея отлично подойдет для создания полностью автоматических небольших квестов.

ну не сказал бы, что так прям отлично, но после модернизации - вполне. Всетаки полностью кастомный диалог там не нужен. Там удобнее использовать кастомные вставки (имя, цель задания, награда). И вот они + проверки должны генериться будут. Или браться из внешней 2дашки, так наверное получше.

Автор: san Jan 5 2008, 13:12

QUOTE
Пять юаней. Периодически у многих возникает желание "изобрести велосипед". И дело даже не в КПД полезных свойств системы, а главное хочется решить поставленную перед (самим) собой задачу. Даже я, грешил иногда такими вещами. Надо доделать что-то, а вот нет. Сижу пишу какой то скрипт, который никто и не поймет что он ноу-хау! Главное в таком деле получить позитив от сделанного. Автор поставил задачу, выполнил. РЕСПЕКТ. smile.gif Остальное, ИМХО не важно.

Ты отчасти прав. Вот токо скрипт для открывание дверей гораздо более простой тем те, что используются у меня=) Да я уже понял что это не надо никому, потому не спорю. Сделал и ладно, еще и +1 получил=) Авось кто нить зайдет да скажет, что ему этого как раз не хватало, а тут раз и будет=)
зы
Сейчас я говорю про НВН1! Вседаки мне кажется, что те кто говорит, что удобней юзать стандартные диалоги не правы. Просто инертность мышления... привыкли и будем дальше клипать по 100 скриптов, и 100 диалогов. Но это мне так кажется, а вам иначе, и тут уже спорить бессмыслено.

Автор: Lex Jan 5 2008, 20:07

Цитата(san @ Jan 5 2008, 13:12) *
что удобней юзать стандартные диалоги не правы. Просто инертность мышления.

улыбнуло. Я думаю что стандартная система достаточно удобна, чтобы за 5 лет никто и не подумал ее менять. В отличие от многих других аспектов, подвергшихся переработке со стороны фанатов smile.gif Самое главное она делает - функционал, наглядность, быстрота освоения редактора, быстрота в разборе чужого материала. От редактора диалогов другого и не нужно.

уменьшение количества скриптов как самоцель - штука бесполезная. Уменьшать их надо за счет систематизации имен, универсальности и параметризации самих кодов, системном решении проблемы. (делать не затычки на каждый случай, а 1-2 общих системы, которые бы решали 90% задач. С диалогами это сделать можно.)

В приведенных тобой примерах всетаки очень просты и сами диалоги и скрипты. Как я выше говорил, попробуй ею сделать диалог на 100+ фраз, со скриптами более 4-5 строк (ну банальный вариант: выдача награды в зависимости от класса игрока. Тебе для такого придется плодить ответы НПС, так как скрипты более чем в 1 строку в твоей структуре сделать трудно, а я в обычном редакторе делаю простой скрипт с switch и лишь 1 строку НПС smile.gif ) Или действие в ролике (НПС отходит к ящику, открывает его, что-то берет - возвращается. В это на диалоговой паузе.), или появление другого НПС в диалоге (открылась дверка, там появился новый НПС, подошел, вклинился в диалог). И так далее, примеров куча smile.gif
Да простейший отбор у игрока скажем 5 принесенных по квесту бутылочек, когда их у него ХЗ сколько и ХЗ в какой конфигурации (толи 1 предмет со стеком 10, толи 10 предметов со стеком 1). В общем в диалогах проверки/постановки локалок - задача конечно массовая и самая распространенная, но далеко не единственная.

Автор: darkrain Jan 11 2011, 10:25

Всем здрасте)
Извините что не в тему,просто я обычный юзер,и наверно самый последний человек втыкающий в Тулсет.
Так вот проблема у меня по диалогам....все никак решение немогу найти...
как сделать что бы НПС говорил по разному.То есть сегодня Привет я там Валера,а завтра О привет давно не виделись..
А то у меня получается всегда так как будто н только представляется и так каждый раз,я уже много чего перебровал...чего вроде не додумался как такое сотворить...так вот помогите пожалуйста.
Заранее большое спасибо)

Автор: Griffon Jan 11 2011, 10:44

darkrain,

Попробуй поискать ответ в разделе скриптов. Твой НПС будет настолько "живым", насколько ты его таким сделаешь. Проблему можно решить созданием ряда диалогов и скрипта, запускающего каждый раз следующий диалог при попадании героя на триггер.

Автор: darkrain Jan 11 2011, 10:55

Спасибо)

Цитата(darkrain @ Jan 11 2011, 10:49) *
Спасибо)

А вот еще может кто нибудь обьяснить чтобы нужно сделать что бы при смерти игрока он появлялся где ниубдь там в городе а не тут же....просто не понимаю как это сделать,или это через скрипты?

Автор: Griffon Jan 11 2011, 12:30

Цитата(darkrain @ Jan 11 2011, 10:55) *
или это через скрипты?

именно так. возрождение и даешь точку переноса ГГ

Автор: darkrain Jan 11 2011, 15:20

А по подробнее можно?)
и можешь пожалуйста обьяснить значение
OnExit
OnEnter
и тому подобное)
Если конечно не трудно)
заранее благодарю)

Автор: Griffon Jan 11 2011, 16:38

Цитата(darkrain @ Jan 11 2011, 15:20) *
OnEnter

скрипт запускается в момент вхождения игрока в локацию

Цитата(darkrain @ Jan 11 2011, 15:20) *
OnExit

скрипт запускается в момент покидания локации

Вот здесь все функции и скрипты - http://nwn1.nwn2lexicon.com/



Автор: darkrain Jan 13 2011, 18:06

А вот еще один вопрос...тоже не втему но мне очень интересно узнать..
Есть ли руссификатор к Obsidian Toolset?

Автор: wirTUS May 24 2011, 19:16

Руссификатор, имхо, не нужен (ибо гораздо менее удобно), но существует патч Dumbo, позволяющий работать в редакторе на русском без "кракозябриков".
Но т.к. вопрос был про руссификатор, то таких не встречал по отдельности, встречал только руссифицированную полную игру , в которой тулсет, собственно, был также руссифирован

могу дать .torrent

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)