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