07:06
ОбновитьСмайлыУправление мини-чатом
Мини чат

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Rasteador, Королёв  
Форум » Любительские модификации для "Корсаров" » Уроки по созданию модификаций » Урок: Пишем диалоги
Урок: Пишем диалоги
ChernozmeyДата: Пятница, 22.11.2013, 16:45 | Сообщение # 1
 Капитан-лейтенант
Сообщений:
343
Награды:
Репутация:
Замечания:
В этом уроке мы рассмотрим, как писать диалоги и привязывать их к НПС.

Для начала, все диалоги находятся в папке program\dialogs\russian. Откроем любой текстовой редактор и сохраним файл в этой папке, назвав его как угодно, только расширение у него должно быть *.с, более простой способ, это открыть файл _shablon_dialog .с и переименовать его.

Теперь рассмотрим непосредственно кодировку диалогов. Вот так выглядит код диалога:

Код
void ProcessDialogEvent()
{
   ref NPChar;
   aref Link, NextDiag;
   DeleteAttribute(&Dialog,"Links");
   makeref(NPChar,CharacterRef);
   makearef(Link, Dialog.Links);
   makearef(NextDiag, NPChar.Dialog);
     
   switch(Dialog.CurrentNode)
   {
    case "First time":
     dialog.text = "";
     link.l1 = "";
     link.l1.go = "";     
    break;

    case "Exit":
     NextDiag.CurrentNode = NextDiag.TempNode;
     DialogExit();
    break;
   }
}


Рассмотрим все более подробно.

Часть

Код
ref NPChar;
aref Link, NextDiag;
DeleteAttribute(&Dialog,"Links");
makeref(NPChar,CharacterRef);
makearef(Link, Dialog.Links);
makearef(NextDiag, NPChar.Dialog);


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

Блок ,

Код
case "First time":
dialog.text = "";
link.l1 = "";
link.l1.go = "";     
break;


это тело самого диалога между НПС и ГГ.

"First time" – название первого блока по умолчанию. Именно с него НПС начнет первый диалог с ГГ.
dialog.text = ""; - слова НПС.
link.l1 = ""; - ответ ГГ.
link.l1.go = ""; - указывает на название case, который будет запущен после диалога.

Пример:

Код
case "First time":
dialog.text = "Здравствуй, капитан. ";
link.l1 = "И вам, не хворать.";
link.l1.go = "next_dialog_1";
break;


В приведенном диалоге НПС говорит с ГГ и после диалога запускается case "next_dialog_1" . Это может быть продолжение диалога, например:

Код
case "next_dialog_1":
dialog.text = "А вы любезны, как я посмотрю. ";
link.l1 = "А кто-то сомневался?";
link.l1.go = "exit";
break;


Или, запускается case отвечающий за развитие событий в игре, например:

Код
case "next_dialog_1":
AddDialogExitQuest("quest_case_name");
NextDiag.TempNode = "Second time";
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;


AddDialogExitQuest("quest_case_name"); - эта функция запускает case квеста (которые находятся в папке program\quests) с названием "quest_case_name".
NextDiag.TempNode = "Second time"; - указывает, что при повторном обращении ГГ к НПС запускается case диалога с названием "Second time".
NextDiag.CurrentNode = NextDiag.TempNode; - переключение текущего Node, на временный.
DialogExit(); - убирает с экрана интерфейса игры изображение диалога.

Так же, мы можем закрыть диалог, написав link.l1.go ="exit"; и прописав соответствующий case в файле диалога:

Код
case "Exit":
NextDiag.TempNode = "Second time";
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;


Примечание: название "exit" не обязательное, можно назвать как угодно, главное, чтобы совпадали названия с case, который будет выполнен; если в case "Exit":, оставить только функции:
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
то нода НПС по умолчанию будет "First time"

Несколько вариантов ответа:

Может потребоваться, что бы у ГГ был выбор между вариантами ответов. Сделать это просто. Добавляем после строчки link.l1.go = ""; еще две, точно, такие как предыдущие только с цифрой 2.
link.l2 = "";
link.l2.go = "";
Если требуется 3 или 4 вариантов ответа, то просто добавляем еще строк с соответствующими номерами. Вот пример case диалога с четырьмя вариантами ответов:

Код
case "First time":
dialog.text = "";
link.l1 = "";
link.l1.go = "";
link.l2 = "";
link.l2.go = "";
link.l3 = "";
link.l3.go = "";
link.l4 = "";
link.l4.go = "";    
break;


Запуск диалога из квеста, с определенной ветки:

При написании квеста, ГГ может встречаться с НПС несколько раз. Тогда потребуется, что бы диалог начинался после определенного события. Для этого в case квеста пишем:

Код
characters[GetCharacterIndex("id НПС")].dialog.filename = "simple.c";
characters[GetCharacterIndex("id НПС ")].dialog.currentnode = " next_dialog_3";


"simple.c"; - файл диалога, приписанный персонажу
"next_dialog_3"; - название case диалога в файле диалога simple.c

Это выражение запустит case диалога "next_dialog_3" из файла диалога. Результат увидите на экране.

Изменение диалога в зависимости от условий:

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

Код
if (условие)     
{   
link.l1 = "вариант ответа 1";
link.l1.go = "";
}
else
{
link.l1 = "вариант ответа 2";
link.l1.go = "";
}


Если (if) выполняется "условие", то запускается "вариант ответа 1", если условие не выполнено (else) то запускается "вариант ответа 2"

"условия", могут быть совершенно различными. Рассмотрим некоторые из них:
sti(PChar.money) >= 1000 – если у ГГ есть ровно или больше 1000 монет
PChar.quest.QS1 == "1" – если уже выполнен case квеста с меткой 1
PChar.location == " Tortuga_House_03 " – если ГГ находится в локации, в данном случае в доме не Тортуге
CheckCharacterItem(Pchar, "id предмета") – если у ГГ есть предмет
sti(pchar.rank) >= 5 – если у ГГ уровень равен 5 или больше

"условий" для ГГ в диалоге может быть несколько, прописываются они через знак &&, например:

if (sti(PChar.money) >= 1000 && CheckCharacterItem(Pchar, "id предмета")) – у ГГ не только должно быть минимум 1000 монет, но и предмет

И напоследок, некоторые функции, которые можно использовать в диалогах:

" + NPChar.name + " – выводит имя НПС
" + Pchar.name + " – выводит имя ГГ
" + Pchar.lastname + " – выводит фамилию ГГ
" + sItemName + " – выводит название предмета
" + sName + " – имя, не привязано

Например:

Код
dialog.text = "Что привело вас ко мне, капитан " + sName + "?";
link.l1 = "Извините, " + NPChar.name + ", но мне пора.";
link.l1.go = "exit";


Вот, пожалуй и все из того основного, что надо знать для того чтобы написать диалог между НПС и ГГ. Если возникнут вопросы, то задавайте их в этой теме.

Урок написан для форума Залив Ветров.


 
MettДата: Суббота, 23.11.2013, 02:03 | Сообщение # 2
 Гардемарин
Сообщений:
17
Награды:
Репутация:
Замечания:
Цитата
если в case "Exit":, оставить только функции:
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
то, НПС больше никогда не заговорит с ГГ.

то нода НПС по умолчанию будет First time

 
ChernozmeyДата: Суббота, 23.11.2013, 13:50 | Сообщение # 3
 Капитан-лейтенант
Сообщений:
343
Награды:
Репутация:
Замечания:
Цитата Mett ()
то нода НПС по умолчанию будет First time


Спасибо, что указал на ошибку. Я о чем-то о своем думал, не то написал.

Цитата Mett ()
могу помочь готовыми уроками собственного написания, если надо конечно


О чем разговор... Создавай посты, уроки. Свое, так свое, а если нет то просто указывай авторство и линк на сайт-источник.


 
Форум » Любительские модификации для "Корсаров" » Уроки по созданию модификаций » Урок: Пишем диалоги
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика