|
Урок № 3. Пишем диалоги персонажам
| |
korsary4 | Дата: Воскресенье, 02.05.2010, 12:32 | Сообщение # 1 |
Адмирал
Группа: Администратор
Сообщений: 5204
Награды: 496
Репутация: 1935
Статус: В открытом море
| Урок № 3. Пишем диалоги персонажам. Из предыдущего урока мы усвоили добавление нового НПС. Пришло время для написания диалога для него. Что потребуется: все тот же блокнот с подсветкой синтаксиса( Notepad++) и фантазия, именно ей ограничены диалоги. Старайтесь писать интересные диалоги. Диалоги НПС хранятся в папке PROGRAM\dialogs\russian Стандартное содержимое файла: Code 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 "Exit": NextDiag.CurrentNode = NextDiag.TempNode; DialogExit(); break; } } Обязательная часть диалога. Написанные строки не удалять, так же там можно объявить переменные, если используются в диалоге. Например, Тело файла диалога. Содержит кейсы диалога. Вид кейс диалога: Code case "First time": dialog.text = ""; link.l1 = ""; link.l1.go = "dialog1"; link.l2 = ""; link.l2.go = "dialog2"; break; dialog.text - слова НПС. link.l1 - слова ГГ, 1 – можно менять, добавив новые ветки ответа ГГ. link.l1.go - указывает какой кейс будет запущен, после ответа по этой ветке. Кейс First time стандартный, именно с него начинается диалог НПС, если не указанно через квест другая ветка. Например, Code sld = CharacterFromID("SoldMoney_3"); sld.dialog.currentnode = "Dialog_test"; С помощью этого мы поменяли кейс диалога для НПС с id SoldMoney_3. Вернемся обратно, к нашему написанию диалогу. Пример заполнения тела диалога кейсами. Code void ProcessDialogEvent() { ref NPChar, sld; aref Link, NextDiag; DeleteAttribute(&Dialog,"Links"); makeref(NPChar,CharacterRef); makearef(Link, Dialog.Links); makearef(NextDiag, NPChar.Dialog); switch(Dialog.CurrentNode) { case "Exit": NextDiag.CurrentNode = NextDiag.TempNode; DialogExit(); break; case "First time": dialog.text = LinkRandPhrase("Здраствуйте, капитан. Меня зовут "+ GetFullName(NPchar)+".", "Добро пожаловать в Порт Рояль. Мое имя"+ GetFullName(NPchar)+".", "Здравствуйте, " + GetAddress_Form(NPChar) + "! Мое имя " + GetFullName(npchar) + ". Могу я узнать ваше имя?"); link.l1 = "Здравствуй, мое имя "+ GetFullName(Pchar)+". Я капитан судна " + PChar.Ship.Name + "."; link.l1.go = "dialog1"; break; case "dialog1": dialog.text = "Я очень известная персона в Порт Рояле...Я самый лучший сыщик...Хех...Я вижу вы тоже не промах, сэр. Буду рад вас увидеть снова у меня в резиденции."; link.l1 = "Сочту за честь, "+ GetFullName(NPchar)+"."; link.l1.go = "exit"; break; } } Итак, надеюсь, структура диалога Вам стала немного понятна. --------------------------------------------------------- Пройдемся по функциям, которые можно использовать в текстах диалога. Функции: " + PChar.Name + " – выводит имя ГГ. "+ GetFullName(NPchar)+" - выводит фамилию и имя НПС. "+ GetFullName(Pchar)+" - выводит фамилию и имя ГГ. " + PChar.Ship.Name + " - имя судна ГГ. "+NPCharSexPhrase(PChar,"","а")+" - переключатель ветки в зависимости от пола ГГ. например, "Я готов"+NPCharSexPhrase(PChar,"","а")+" помочь вам." При ГГ мужского пола выведет = «Я готов», а женского – «Я готова». LinkRandPhrase - выводит рандомно из трех вариантов веток диалога. Например, LinkRandPhrase ("Извольте откланяться, "+ GetFullName(NPchar)+".","До встречи, "+ GetFullName(NPchar)+".","До свидания, сэр "+ GetFullName(NPchar)+".") RandPhraseSimple – выводит рандомно из двух вариантов веток диалога. Например, RandPhraseSimple("Еще нет, скоро. Я уже туда направляюсь.", "Еще нет, но я этим занимаюсь.") Примеры использования функций в диалогах: Code dialog.text = "Меня зовут "+ GetFullName(NPchar)+". "; Code dialog.text = RandPhraseSimple("Еще нет, скоро. Я уже туда направляюсь.", "Еще нет, но я этим занимаюсь."); Не забывайте, что функции, кроме двух последних, заключены в ". Не забывайте проверять достаточность их, при ошибках. --------------------------------------------------------------------- В ГПК также есть прекрасная функция ввода текста, чисел с клавиатуры самим пользователь. Вот как это делается: Объявив переменную Islandpers1 в обязательной части диалога. Кейсы пример: Code
case "pers_vopros": dialog.text = "О ком ты хочешь узнать, "+ GetFullName(Pchar) +"?"; Link.l1.edit = 1; Link.l1 = ""; Link.l1.go = "pers_vopros_good"; Link.l2 = "Я передумал, до встречи, "+ GetFullName(NPchar) +"."; Link.l2.go = "exit"; break;
case "pers_vopros_good": Islandpers1 = GetStrSmallRegister("Блейк"); if (Islandpers1 == GetStrSmallRegister(dialogEditStrings[1])) { dialog.text = "Блейк говорите…."; link.l1 = "…."; link.l1.go = "exit"; } else { dialog.text = "Увы, я не знаю такого человека."; link.l1 = "Извините, "+ GetFullName(NPchar) +". Простите за беспокойство."; link.l1.go = "exit"; } break; if (Islandpers1 == GetStrSmallRegister(dialogEditStrings[1])) - проверка соответствия введенной строки и нужного текста. Если нужно проверят не текст, а цифры то вместо Link.l1.edit = 1; нужно написать Link.l1.edit = 3; Как запустить квест через диалог. Квест запускается с помощью функции AddDialogExitQuest. Например, Code AddDialogExitQuest("QuestTest_Korsary4"); Запускаемый кейс квеста должен быть прописан, например, в quests_reaction.c. Урок подготовил korsary4. Вы уже научились писать диалоги. Должно быть все понятно, если возникнут вопросы - пишите в теме. Урок написан специально для сайта Korsary4.uCoz.Ru.
Единственное, что можно сказать об удаче с уверенностью — она изменит. --------
|
|
| |
diversant | Дата: Воскресенье, 16.05.2010, 19:59 | Сообщение # 2 |
Капитан II ранга
Группа: Корсар
Сообщений: 372
Награды: 6
Репутация: 5
Статус: В открытом море
| korsary4, вот эту часть вообще не трогать? void ProcessDialogEvent() { ref NPChar; aref Link, NextDiag; DeleteAttribute(&Dialog,"Links"); makeref(NPChar,CharacterRef); makearef(Link, Dialog.Links); makearef(NextDiag, NPChar.Dialog); switch(Dialog.CurrentNode) { Добавлено (16.05.2010, 19:59) --------------------------------------------- и еще вопрос чтоб диолог делать нада новый текст документ создовать или можно туда куда я NPS опридилил?
Лучше иметь повернутую психику, безумные идеи, быть непонятным и немного странным, чем не отличаться от тумбочки, что стоит возле постели....
|
|
| |
korsary4 | Дата: Воскресенье, 16.05.2010, 22:23 | Сообщение # 3 |
Адмирал
Группа: Администратор
Сообщений: 5204
Награды: 496
Репутация: 1935
Статус: В открытом море
| Quote (diversant) korsary4, вот эту часть вообще не трогать? Да, также как и в низу есть пара скобок. Quote (diversant) и еще вопрос чтоб диолог делать нада новый текст документ создовать или можно туда куда я NPS опридилил? В каталоге \PROGRAM\dialogs\russian в любом месте(только правильно указать в ch.Dialog.Filename) Формат файла не текст документ (*.txt) а должен быть .c
Единственное, что можно сказать об удаче с уверенностью — она изменит. --------
|
|
| |
diversant | Дата: Понедельник, 17.05.2010, 19:07 | Сообщение # 4 |
Капитан II ранга
Группа: Корсар
Сообщений: 372
Награды: 6
Репутация: 5
Статус: В открытом море
| Quote (korsary4) Формат файла не текст документ (*.txt) а должен быть .c ну там так и естьДобавлено (17.05.2010, 17:52) --------------------------------------------- korsary4, какою именно сторочку вставлять НПСу чтоб этот диолог он говорил? Добавлено (17.05.2010, 19:07) --------------------------------------------- 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 = "Да буть прокляты мои глаза это же "+ GetFullName(Pchar)+", помница я уж думал что тебя и в живых то нет"; link.l1 = "Про глаза это ты хорошо подметил"; link.l1.go = "exit"; break; case "Exit": NextDiag.CurrentNode = NextDiag.TempNode; DialogExit(); break; } } что здесь не правильно подскажите когда к НПСу подходишь и разговор начинаешь там написано что фаил такой то не может быть открыт
Лучше иметь повернутую психику, безумные идеи, быть непонятным и немного странным, чем не отличаться от тумбочки, что стоит возле постели....
|
|
| |
korsary4 | Дата: Понедельник, 17.05.2010, 21:47 | Сообщение # 5 |
Адмирал
Группа: Администратор
Сообщений: 5204
Награды: 496
Репутация: 1935
Статус: В открытом море
| Quote (diversant) что здесь не правильно подскажите когда к НПСу подходишь и разговор начинаешь там написано что фаил такой то не может быть открыт В начале забыл void ProcessDialogEvent() { ref NPChar; Должно быть примерно так: Проверь. Code 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 = "Да буть прокляты мои глаза это же "+ GetFullName(Pchar)+", помница я уж думал что тебя и в живых то нет"; link.l1 = "Про глаза это ты хорошо подметил"; link.l1.go = "exit"; break;
case "Exit": NextDiag.CurrentNode = NextDiag.TempNode; DialogExit(); break; } }
Единственное, что можно сказать об удаче с уверенностью — она изменит. --------
|
|
| |
diversant | Дата: Четверг, 10.06.2010, 12:51 | Сообщение # 6 |
Капитан II ранга
Группа: Корсар
Сообщений: 372
Награды: 6
Репутация: 5
Статус: В открытом море
| примите мою благодарность без вас бы ничего не получилось Добавлено (10.06.2010, 12:51) --------------------------------------------- korsary4, незнаешь где лежит фаил в котором описание как приобщить на секс хозяйку борделя ? зарание спосибо
Лучше иметь повернутую психику, безумные идеи, быть непонятным и немного странным, чем не отличаться от тумбочки, что стоит возле постели....
|
|
| |
Сумрак | Дата: Четверг, 10.06.2010, 13:03 | Сообщение # 7 |
Мичман
Группа: Корсар
Сообщений: 169
Награды: 6
Репутация: 3
Статус: В открытом море
| Quote (diversant) korsary4, незнаешь где лежит фаил в котором описание как приобщить на секс хозяйку борделя ? если ты про диалог, то он в папке с диалогами. можно приобщаться её как захочется, если редактировать файл с её диалогами :)
|
|
| |
diversant | Дата: Четверг, 10.06.2010, 13:04 | Сообщение # 8 |
Капитан II ранга
Группа: Корсар
Сообщений: 372
Награды: 6
Репутация: 5
Статус: В открытом море
| Сумрак, там нет самого диолога чтоб ее приобшить только начало и все
Лучше иметь повернутую психику, безумные идеи, быть непонятным и немного странным, чем не отличаться от тумбочки, что стоит возле постели....
|
|
| |
Сумрак | Дата: Четверг, 10.06.2010, 13:08 | Сообщение # 9 |
Мичман
Группа: Корсар
Сообщений: 169
Награды: 6
Репутация: 3
Статус: В открытом море
| ну там идёт запуск квеста на секс в комнате таверны. то есть можно отредактировать диалог, чтобы она никогда не отказывала или например деньги не воровала. ну или даже попробовать это делать в другой локации :)
|
|
| |
diversant | Дата: Четверг, 10.06.2010, 13:11 | Сообщение # 10 |
Капитан II ранга
Группа: Корсар
Сообщений: 372
Награды: 6
Репутация: 5
Статус: В открытом море
| а при чем секс в таверне мне именно нужно найти где лижит текст сам который пишится когда хозяйку барделя разводишь на секс а в диологах только вот этот кусочек и все //-->> дача развода на секс if (rand(3) == 1 && pchar.questTemp.different == "free" && GetNpcQuestPastDayWOInit(npchar, "questSex") > 180 && !CheckAttribute(npchar, "quest.selected") && !CheckAttribute(npchar, "quest.NotGoneToSex.over")) { if (!CheckAttribute(npchar, "quest.NotGoneToSex")) { dialog.text = "Ах, как скучно в нашем городишке. Может быть, такой видный капитан как вы, развеет мою скуку?"; link.l5 = "Безусловно! С радостью развлеку такую прекрасную даму."; link.l5.go = "toHostessSex"; link.l8 = "К сожалению, мне некогда, " + npchar.name + ". Как-нибудь в другой раз..."; link.l8.go = "exit"; pchar.questTemp.different = "HostessSex"; SetTimerFunction("SmallQuests_free", 0, 0, 1); //освобождаем разрешалку на миниквесты SaveCurrentNpcQuestDateParam(npchar, "questSex"); } else { dialog.text = "В прошлый раз, когда я ждала тебя в комнате наверху, ты не пришел... Ты упустил свой шанс."; link.l1 = "Эх, жаль..."; link.l1.go = "exit"; npchar.quest.NotGoneToSex.over = true; //больше вообще не говоить } break;
Лучше иметь повернутую психику, безумные идеи, быть непонятным и немного странным, чем не отличаться от тумбочки, что стоит возле постели....
|
|
| |
Сумрак | Дата: Четверг, 10.06.2010, 13:42 | Сообщение # 11 |
Мичман
Группа: Корсар
Сообщений: 169
Награды: 6
Репутация: 3
Статус: В открытом море
| ааа, извини пожалуйста, я перепутал с сексом официантки в таверне :) щас гляну где там секс с хозяйкой борделя ) Добавлено (10.06.2010, 13:42) --------------------------------------------- вот это case "SpeakHistory_10": dialog.text = "Ах, как вы благородны! Я даже на мгновение забыла, хозяйкой какого заведения являюсь. Наверное, вы действительно немного грубоваты и... прямолинейны, но в вас есть нечто влекущее... И потом, мне все-таки любопытно посмотреть на ваши шрамы, пойдемте наверх, в комнату, там нас никто не побеспокоит... И там, возможно, вы тоже захотите что-нибудь посмотреть..."; link.l1 = "Хм, это как водится!.."; link.l1.go = "exit"; pchar.questTemp.different.HostessSex = "toRoom"; pchar.questTemp.different.HostessSex.city = npchar.city; AddDialogExitQuestFunction("SexWithHostess_goToRoom"); pchar.quest.SmallQuests_free.over = "yes"; SetTimerFunction("SexWithHostess_null", 0, 0, 1); //возврат хозяйки на место, если ГГ не прийдет в комнату break; case "Hostess_inSexRoom": dialog.text = "Ах, вот и ты..."; link.l1 = "Так точно, моя королева!"; link.l1.go = "exit"; pchar.quest.SexWithHostess_null.over = "yes"; //нулим таймер на не пришел NextDiag.TempNode = "First time"; AddDialogExitQuestFunction("SexWithHostess_fack"); break; и это case "SpeakHistoryTwo_14": dialog.text = "Быть может... Здесь слишком душно, давай пройдем наверх, там прохладней, там и продолжим... разговор."; link.l1 = "С превеликим удовольствием!"; link.l1.go = "exit"; pchar.questTemp.different.HostessSex = "toRoom"; pchar.questTemp.different.HostessSex.city = npchar.city; AddDialogExitQuestFunction("SexWithHostess_goToRoom"); pchar.quest.SmallQuests_free.over = "yes"; SetTimerFunction("SexWithHostess_null", 0, 0, 1); //возврат хозяйки на место, если ГГ не прийдет в комнату break; больше там ничего нет чтобы править, кроме самих веток диалогов. сам процесс секса только в виде красной надписи поперек экрана, сопровождающейся оханием и аханием :)
|
|
| |
diversant | Дата: Четверг, 10.06.2010, 13:46 | Сообщение # 12 |
Капитан II ранга
Группа: Корсар
Сообщений: 372
Награды: 6
Репутация: 5
Статус: В открытом море
| ты все правильно понял мне сам диолог нужен хочу свой вставить Добавлено (10.06.2010, 13:46) --------------------------------------------- Сумрак, так где мне его найти?
Лучше иметь повернутую психику, безумные идеи, быть непонятным и немного странным, чем не отличаться от тумбочки, что стоит возле постели....
|
|
| |
Сумрак | Дата: Четверг, 10.06.2010, 13:48 | Сообщение # 13 |
Мичман
Группа: Корсар
Сообщений: 169
Награды: 6
Репутация: 3
Статус: В открытом море
| файл Common_Brothel.c по пути директория игры/PROGRAM/dialogs
|
|
| |
diversant | Дата: Четверг, 10.06.2010, 13:49 | Сообщение # 14 |
Капитан II ранга
Группа: Корсар
Сообщений: 372
Награды: 6
Репутация: 5
Статус: В открытом море
| мое почтение милейший)
Лучше иметь повернутую психику, безумные идеи, быть непонятным и немного странным, чем не отличаться от тумбочки, что стоит возле постели....
|
|
| |
Ford22 | Дата: Воскресенье, 20.02.2011, 12:48 | Сообщение # 15 |
Пороховая обезьяна
Группа: Корсар
Сообщений: 19
Награды: 1
Репутация: 0
Статус: В открытом море
| как выполнить проверку действительно ли я убил перса которого мне заказывали. Например: 1.НПС дал мне задание убить определенного перса. 2.Я убил его и прибыл к НПС за предметом который он мне обащал дать после выполнения задания. 3.КАК В ДИАЛОГЕ ПРОВЕРИТЬ ЖИВ ПЕРС ИЛИ НЕТ. 4.ЕСЛИ МЕРТВ ТО КАК ПОЛУЧИТЬ ПРЕДМЕТ КОТОРЫЙ ОН МНЕ ОБЕЩАЛ ДАТЬ.
|
|
| |
korsary4 | Дата: Воскресенье, 20.02.2011, 13:18 | Сообщение # 16 |
Адмирал
Группа: Администратор
Сообщений: 5204
Награды: 496
Репутация: 1935
Статус: В открытом море
| Quote (Ford22) как выполнить проверку действительно ли я убил перса которого мне заказывали. Например: Запускаешь квест из диалога, с таким содержанием кейса Code pchar.quest.Quest_6.win_condition.l1 = "npc_death"; pchar.quest.Quest_6.win_condition.l1.character = GetCharacterIndex("Villemstad_usurer"); pchar.quest.Quest_6.win_condition = "Quest_6" Где Villemstad_usurer - id перса. Quest_6 - кейс который запустится после смерти НПС, и в нем пропиши смену ветки диалогу, тому кто дал задание.
Единственное, что можно сказать об удаче с уверенностью — она изменит. --------
|
|
| |
Ford22 | Дата: Понедельник, 21.02.2011, 15:59 | Сообщение # 17 |
Пороховая обезьяна
Группа: Корсар
Сообщений: 19
Награды: 1
Репутация: 0
Статус: В открытом море
| Cпасибо корсарыч, вроде понял. а как сделать так чтобы после диалога мой НПС в порт рояле побежал к кокому-нибудь дому в городе.
|
|
| |
korsary4 | Дата: Понедельник, 21.02.2011, 17:22 | Сообщение # 18 |
Адмирал
Группа: Администратор
Сообщений: 5204
Награды: 496
Репутация: 1935
Статус: В открытом море
| Quote (Ford22) Cпасибо корсарыч, вроде понял. а как сделать так чтобы после диалога мой НПС в порт рояле побежал к кокому-нибудь дому в городе. так все понятно.... ничего ты не понял. Хочешь научиться делать квесты - изучай скрипты ГПК! Самостоятельно, а так толку не будет! Я же не буду тебе все функции постоянно писать. Хочешь чему-нибудь научиться - учись сам! :)
Единственное, что можно сказать об удаче с уверенностью — она изменит. --------
|
|
| |
Ford22 | Дата: Среда, 23.02.2011, 12:07 | Сообщение # 19 |
Пороховая обезьяна
Группа: Корсар
Сообщений: 19
Награды: 1
Репутация: 0
Статус: В открытом море
| А есть где-нибудь список всех этих функций?
|
|
| |
Aztec | Дата: Воскресенье, 13.03.2011, 21:59 | Сообщение # 20 |
Пороховая обезьяна
Группа: Пират
Сообщений: 6
Награды: 0
Репутация: 0
Статус: В открытом море
| У меня нет папки dialogs (имеется в виду она должна находится в папке PROGRAMS, PROGRAMS у меня есть, а вот папки dialogs нету) может кто нибудь скинет мне её???? ЗАРАНЕЕ СПАСИБО!!!!!!!!!!!!!!!!!
- ナルト -
|
|
| |
|