Anubis | Дата: Среда, 02.07.2014, 21:27 | Сообщение # 1 |
Адмирал флота
Группа: Завсегдатаи
Сообщений: 88
Статус: Offline
| Пишем диалоги
В этом уроке мы рассмотрим, как писать диалоги и привязывать их к НПС.
Для начала, все диалоги находятся в папке 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;
Несколько вариантов ответа:
Может потребоваться, что бы у ГГ был выбор между вариантами ответов. Сделать это просто. Добавляем после строчки 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";
Если у вас возникли вопросы, по поводу написаний диалогов, то можете задавать их в этой теме.
|
|
| |