Внимание! Рисунок интерактивный, можно кликать по обведенным секторам.
Редактор журнала
Думаю, что проблем с журналом у всех начинающих почти не бывает. Редактор журнала удобен и прост, достаточно ввести в слот «Имя» название квеста и добавить требуемое количество шагов. Нужно так же присвоить квесту уникальный тэг, для того чтобы можно было к нему обращаться в скриптах. Можно т.ж. задать и уровень сложности, например для сюжетных, поставить самый высокий, тогда в игре выбрав опцию «По очередности», все сюжетные квесты окажутся вверху журнальных записей. Если вы не задали в скрипте опыт за выполнение квеста, то можно просто поставить нужный в слоте «ХР».
Все записи рекомендую делать в редакторе “Word” для избежания ошибок и опечаток. Набранный текст хорошо переносится в поле просмотра «Текст», или можно внести в «Редактор строки», кликнув нужную кнопку. Хочу просто напомнить, что обратно текст нужно переносить, сделав раскладку в редакторе журнала и редакторе “Word” в русскоязычном варианте. Иначе вы увидите абру-катабру…
В последней записи всегда нужно ставить галку завершить. Если у вас в квесте будет несколько окончаний, то следите за тем, чтобы после завершения квеста не вылезли незавершенные хвосты, иначе квест опять появится в категории незавершенных.
Как задать скриптом запись в журнале? Возьмем, для примера момент, когда герой находит нужный предмет и у него в журнале появляется запись об этом событие. Вам нужно записать в слоте «OnAqcuireItem» модуля, такой код:
void main()
{
object oPC = GetFirstPC();
object oMod = GetModule();
object oItem = GetModuleItemAcquired();
string sTag = GetTag(oItem);
if(sTag == "TAG")
{
if(GetLocalInt(oMod, sTag) ==0 && GetItemPossessor(oItem) == oPC)
{
AddJournalQuestEntry("vampir", 2, oPC); // журнал
SetLocalInt(oMod, sTag,1);
}
}
} |
Получим что, взяв определенный предмет, в журнал пойдет запись №2 квеста с тэгом “vampir”. Обычно же отметки о заданиях журнала, ставятся в редакторе диалога, но об этом см. раздел “Редактор диалога”.
Бывает необходимость записать в журнал квесты, в зависимости от их очередности выполнения. У нас в журнале, если выполнили запись с большим номером, то с меньшим, записи мы уже не увидим. Как же быть? Журнал поддерживает использование токенов (<CUSTOM2000>), этим методом можно и записать очередность квестов. Токены нужно брать с большими номерами, выше 2000, т.к. многие записаны уже в базовых скриптах. Записи в журнале будут выглядеть примерно так:
Вы выполнили первое задание. <CUSTOM3001> <CUSTOM3002>
Вы выполнили второе задание. <CUSTOM3001> <CUSTOM3002>
В поле журнальной записи должен обязательно находиться текст, а не одни токены, иначе запись не обновиться… Чтобы обнулить токены, при старте модуля в слоте модульных свойств OnModulLoad, добавьте запись о ваших токенах:
void main()
{
if (GetLocalInt(GetModule(), "My_TOKEN") != 1) // Проверить
{
SetCustomToken(3001, "");
SetCustomToken(3002, "");
SetLocalInt(GetModule(),"My_TOKEN",1);
}
// ========== ЦВЕТОВАЯ ПAЛИТРА =========
SetCustomToken(2030, "</c>"); // (color end TAG)
SetCustomToken(2036, "<c у >"); // Зеленый
SetCustomToken(2038, "<c aю>"); // Синий
SetCustomToken(2039, "<cу !>"); // Красный
} |
При выполнение квеста, добавьте в скрипт, значение вашего токена. Например:
void main()
{
object oMod = GetModule();
object oPC = GetFirstPC();
SetLocalInt(oMod, "Quest_Feniks", GetLocalInt(oMod, "Quest_Feniks") + 1);
int iQuest = GetLocalInt(oMod, "Quest_Feniks");
if(iQuest == 1) // Определим номер квеста в журнале
{
SetLocalInt(oMod, "Quest_Feniks", 5); // Цифра номер квеста в журнале
iQuest = GetLocalInt(oMod, "Quest_Feniks");
}
if (GetTag(OBJECT_SELF)=="TAG") // Проверим с кем говорим
SetCustomToken(3001, "<c у >Задание некромантов\n</c> Некроманты поручают вам…");
else
SetCustomToken(3002, "<c у >Задание церкви\n</c> Церковь поручает вам…");
DelayCommand(1.0, AddJournalQuestEntry("ZZ_Feniks", iQuest, oPC)); // журнал
} |
Чтобы разделить строки используем тэг: \n
Если журнал поддерживает токены, значит вы можете добавить цвета для ваших журнальных записей. Все о цветах описано в разделе “Редактор диалога”.
Если выполнение заданий идет непоследовательно, то можно обойтись и без токенов. Просто нужно стереть всю запись квеста и записать нужную строку журнала с этим квестом. Правда в панели отчета тогда будет 2 сообщения о журнальной записи, но зато не нужно мудрить с токенами. Стоит учесть, что функция стирает как уже выполненное задание, так и текущее… Вот пример такого скрипта для задания с тегом Quest_ 1:
void main()
{
object oPC = GetFirstPC();
RemoveJournalQuestEntry("Quest_1", oPC); // Стираем журнальную запись
AddJournalQuestEntry("Quest_1", 5, oPC); // Записываем новую т.е. 5 строку
} |
При записи задания в журнал функцией AddJournalQuestEntry у нас еще идет запись трех локальных переменных для героя. Название этиз локалок:
- NW_JOURNAL_ENTRY*
- NW_JOURNAL_DATE*
- NW_JOURNAL_TIME*
Где звездочка в конце названия локалки есть название тега квеста, а её значение равно для NW_JOURNAL_ENTRY номеру журнальной записи для квеста. Например для записи:
AddJournalQuestEntry("Quest_1", 5, oPC); // Записываем новую т.е. 5 строку
Название локалки будет NW_JOURNAL_ENTRYQuest_1 а её значение равно 5.
Для второй, т.е. временной локалки NW_JOURNAL_DATEQuest_1 значение берется как сумма всех дней в модуле и её можно подчитать функцией:
// Текущий день
int Day()
{
int nDay = GetCalendarDay();
int nMes = 28*GetCalendarMonth()-29;
int nYear = GetCalendarYear();
int iDay = 336*nYear+nMes+nDay;
return iDay;
}
|
Зная значение локалки NW_JOURNAL_ENTRY можно отследить очередность записей в журнале, и исходя из этого корректировать порядок записи журнальных строк. Причем функция:
RemoveJournalQuestEntry("Quest_1", oPC); // Стираем журнальную запись
обнуляет все записанные локалки NW_JOURNAL_ по этому квесту с тегом Quest_1.
При работе над модулем нескольких человек, бывает необходимость переноски диалогов. Если вы переносите диалоги из одного модуля в другой, то у вас теряются все журнальные записи. Их можно восстановить… Для этого открыв первый модуль, откройте временную папку temp0 которая создается в папке modules (см. корневую папку игры). Скопируйте файл: module.jrl Откройте второй модуль, куда вы перенесли свой диалог и открыв папку temp0 замените файл - module.jrl Теперь сохранив второй модуль, все журнальные записи первого, окажутся во втором.
|