Добавлен , опубликован

Диалоги

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

Функции для работы с диалогами

В ходе работы над диалогом люди встречаются с одними и теми же вопросами: как разнообразить повторяющиеся диалоги, как динамически подтягивать нужную информацию в генераторные квесты и т.д.
И большинство этих задач уже решили ваши предшественники. Вам остаётся лишь ознакомиться с доступным арсеналом ф-ций и использовать их в своей работе.
В предыдущем уроке мы видели функцию, которая открывает окно найма команды. Я тогда сказал, что существуют аналогичные ф-ции и для других интерфейсов. С них и начнём:
void LaunchCharacter(ref refCharacter); // информация о персонаже
void LaunchStore(int storeNum);         // магазин
void LaunchShipyard(ref shipmaster);    // покупка/продажа/ремонт корабля
void LaunchMainMenu();  // игровое меню
void LaunchCannons();   // смена пушек
void LaunchHireCrew();  // найм людей в команду
void LaunchShipHold();  // трюм корабля
Это основные интерфейсы, которые могут пригодиться вам в диалогах.
Ознакомиться с остальными вы можете в файле ..\PROGRAM\INTERFACE\interface.c

Каждый раз, обращаясь к тавернщику в игре, он говорит вам однотипные, но все же разные реплики. А ведь в предыдущем уроке мы точно убедились, что открывающий диалог там один:
Dialog.Text = RandPhrase("Эй, " + GetAddress_Form(NPChar) + " " + PChar.name + "! " + TimeGreeting() + ".",
                    "О, какие у нас гости! Рад видеть вас, " + GetAddress_Form(NPChar) + " " + PChar.name + ".",
                    "Хорошо, что вы заглянули ко мне, " + PChar.name + ". Каков будет сегодня ваш заказ?", &dialog, dialog.snd1, dialog.snd2, dialog.snd3);
Это достигается за счет функций для обработки текста. Их довольно много. Я приведу основные, которые смогу вспомнить, но вы должны проверять, есть ли они в той версии игры, с которой вы работаете. Аддонов достаточно много и в каждом разработчики что-то удаляли/добавляли/изменяли.
string GetSexPhrase(string StrMan, string StrWoman);                    // фраза от пола ГГ
string NPCharSexPhrase(ref character, string StrMan, string StrWoman);  // фраза от пола НПЦ
string PCharRepPhrase (string good, string bad);                        // фраза от репутации ГГ
string NPCharRepPhrase(ref pchar, string bad, string good);             // фраза от репутации НПЦ
string GetAddress_FormTitle(int nation, int num);                       // обращение по титулу
string RandPhraseSimple(string Var1, string Var2);                      // случайная реплика из двух
string LinkRandPhrase (string Var1, string Var2, string Var3);          // случайная реплика из трёх
string RandPhrase (string Var1, string Var2, string Var3, ref Diag, string Sound1, string sound2, string sound3); // то же самое, но с подключением соотв. файла озвучки к каждой реплике (ПКМ)
string RandSwear();                     // случайное ругательство ("Якорь мне в ..!", "Тысяча акул!" и т.п.)
string SelectRumour();                  // случайный слух
string TimeGreeting();                  // приветствие по времени суток (доброе утро/вечер)
string GetAddress_Form(ref NPChar);     // обращение по национальному признаку НПЦ (сеньор, мсье, сэр и т.д.)
string NationKingsCrown(ref Character); // "Английскому престолу", "Французской короне" и т.п.
string NationKingsName(ref NPChar);     // "Его Величества Карла II Стюарта" и т.п.
string NationNameMan(int pNation);      // национальность ("англичанин", "француз")
string NationNamePeople(int pNation);   // национальность ("англичане", "французы")
string NationNameAblative(int iNation); //творительный падеж ("Англией", "Францией")
string NationNameNominative(int iNation); //именительный падеж ("Англия", "Франция")
string NationNameGenitive(int iNation); // родительный падеж ("Англии", "Франции")
string NationEuropaTown(int iNation);   // в столицу ("Севилью", "Тортугу")
int RandSum(string Amount);             // Сгенерировать случайное число (Sum) с определенным Amount. Где Amount:
    // Few - в пределах 400
    // Some - в пределах 2000
    // Medium - в пределах 4000
    // Large - в пределах 6000
    // Huge - в пределах 10000
Также вам постоянно нужно будет узнавать какую-то информацию о персонажах. Будь то имя, корабль или что угодно.
Помимо прямого обращения к атрибутам персонажа существует также множество полезных методов:
// атрибуты
ch.Money;           //Деньги
ch.Experience;      // Опыт
ch.Rank;            // Ранг
ch.Model;           // Модель
ch.Model.Animation; // Анимация
ch.Model.Entity;    // Тип модели
ch.Dead;            // Мертвый или живой (true - мертвый, false - живой)
ch.FaceId;          // Лицо (при виде [F1] - только для главного героя)
сh.Location;        // Локация
ch.Location.group;  // Тип локации
ch.Location.locator; // Место локации
ch.Dialog.Filename; // Файл диалога
ch.Reputation;      // Репутация
ch.Name;            // Имя персонажа
ch.Lastname;        // Фамилия персонажа
ch.Ship.Name;       // Название корабля
ch.Ship.Type;       // Тип корабля
ch.Ship.Cannon.Type; // Тип пушек
ch.Nation;          // Нация

// для аддонов на базе ВМЛ
ch.skill.Leadership; // Навык: Лидерство
ch.skill.Fencing;   // Навык: Фехтование
ch.skill.Sailing;   // Навык: Навигация
ch.skill.Accuracy;  // Навык: Меткость
ch.skill.Cannons;   // Навык: Пушки
ch.skill.Grappling; // Навык: Абордаж
ch.skill.Repair;    // Навык: Починка
ch.skill.Defence;   // Навык: Защита
ch.skill.Commerce;  // Навык: Коммерция
ch.skill.Sneak;     // Навык: Шпион

// функции
string GetFullName(ref chref);                      // полное имя+фамилия персонажа
string GetNPCInformation(string chID);              // информация о персонаже по ID
string GetCityName(string city);                    // город по аттрибуту char.city
string GetPortByCityName(string city);              // порт города по аттрибуту char.city
string GetIslandByCityName(string city);            // остров где расположен город по аттрибуту char.city
string GetCityNameByIsland(string IslandId);        // главный город острова с портом
ref GetFortCharRefByCity(string cityId);            // начальник форта по городу
int ChangeContrabandRelation(ref pchar, int val);   // изменить отношение с контрабандистами
string SelectShoreLocation();                       // случайный пляж на острове, где сейчас находится ГГ
void QuestSetCurrentNode(string chID, string Node); // задать по ID персонажа ноду диалога
string LastSpeakDate();                             // строковая дата (в формате день_месяц)

Безусловно, невозможно перечислить всё необходимое, особенно учитывая потенциальную разницу от аддона к аддону.
Лучшим учителем все равно остаётся изучение имеющихся в игре файлов диалогов.
Если есть какие-то полезные часто используемые ф-ции, которые я не упомянул - обязательно напишите в комментариях - я добавлю их в статью.

Содержание
Остались вопросы? Задайте их сообществу! Задать вопрос
`
ОЖИДАНИЕ РЕКЛАМЫ...