Форма входа
 
Приветствуем тебя, корсар Юнга!

Гость, мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизуйтесь!
Логин:
Пароль:


Купить игры
 



Чат
 
500


Статистика
 
Пользователи, посетившие сайт за текущий день:
ВИТар, Andrey__3010, Badgert, prelesty, Hornigold05, ukdouble1
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

  • Страница 1 из 16
  • 1
  • 2
  • 3
  • 15
  • 16
  • »
Модератор форума: NikK  
Форум » Ад-доны для игр серии Корсары » FAQ по модам - "Сделай мод сам" » Урок № 3. Пишем диалоги персонажам
Урок № 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
    int iTest, iTemp;

Тело файла диалога. Содержит кейсы диалога.

Вид кейс диалога:

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
string  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.


Прикрепления: 7949458.jpg (158.0 Kb) · 4093792.jpg (233.8 Kb) · 4377100.jpg (16.0 Kb) · 7650138.jpg (51.5 Kb) · 3366198.jpg (287.6 Kb)



Единственное, что можно сказать об удаче с уверенностью — она изменит.
--------
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
Статус: В открытом море
примите мою благодарность -give_rose- без вас бы ничего не получилось

Добавлено (10.06.2010, 12:51)
---------------------------------------------
korsary4, незнаешь где лежит фаил в котором описание как приобщить на секс хозяйку борделя ?

зарание спосибо -give_rose-


Лучше иметь повернутую психику, безумные идеи, быть непонятным и немного странным, чем не отличаться от тумбочки, что стоит возле постели....
СумракДата: Четверг, 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
Статус: В открытом море
-give_rose- мое почтение милейший) -give_rose-

Лучше иметь повернутую психику, безумные идеи, быть непонятным и немного странным, чем не отличаться от тумбочки, что стоит возле постели....
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 нету) может кто нибудь скинет мне её???? ЗАРАНЕЕ СПАСИБО!!!!!!!!!!!!!!!!!

- ナルト -
Форум » Ад-доны для игр серии Корсары » FAQ по модам - "Сделай мод сам" » Урок № 3. Пишем диалоги персонажам
  • Страница 1 из 16
  • 1
  • 2
  • 3
  • 15
  • 16
  • »
Поиск:

Copyright Pirates-Life.Ru © 2008-2024


Семь Футов под Килем - Бухта Корсаров и Пиратов!