Игроделу | Редактор журнала | Neverwinter Nights Квест Испытание друида Первое задание Второе задание Последние задание
По сайту
Главная
Рыцарская сага
Файлы
Neverwinter Nights
Гостевая книга
Форум сайта

По теме
Игроделу
Редактор фракций
Редактор журнала
Редактор диалога
Редактор скрипта
Модуль и области
Двери
Монстры
Встречи
Предметы
Торговцы
Объекты
Триггеры
Звуки
Тайлы
Хак файлы
Скриптинг
Neverwinter Nightsредактор журналаИгроделу
Редактор журнала


Внимание! Рисунок интерактивный, можно кликать по обведенным секторам.

Редактор журнала


Думаю, что проблем с журналом у всех начинающих почти не бывает. Редактор журнала удобен и прост, достаточно ввести в слот «Имя» название квеста и добавить требуемое количество шагов. Нужно так же присвоить квесту уникальный тэг, для того чтобы можно было к нему обращаться в скриптах. Можно т.ж. задать и уровень сложности, например для сюжетных, поставить самый высокий, тогда в игре выбрав опцию «По очередности», все сюжетные квесты окажутся вверху журнальных записей. Если вы не задали в скрипте опыт за выполнение квеста, то можно просто поставить нужный в слоте «ХР».

Все записи рекомендую делать в редакторе “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 у нас еще идет запись трех локальных переменных для героя. Название этиз локалок:

  1. NW_JOURNAL_ENTRY*
  2. NW_JOURNAL_DATE*
  3. 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 Теперь сохранив второй модуль, все журнальные записи первого, окажутся во втором.

Обновление: Rambler's Top100