Часть 1.
Журналы
Краткая статья о журналах.
Что это такое, для чего, как использовать и немного про динамические журналы.
Начнем с примеров. Отрываем тулсет, заходим в редактор журнала (tools->Journal Editor , или жмем CTRL-ALT-J)
рисунок 1.1
Структура журнала – двухуровневая. Первый уровень – название записи, т.е. то что будет видно в игре когда запись не раскрыта, так сказать заголовок конкретного под-журнала.
Второй уровень добавляется к указанной записи, обычное использование – шаги выполнения квеста.
\(корень журнала)
+запись 1 – квест (уровень 1)
+квест 1, шаг 1 (уровень 2)
+квест 1, шаг 2 (уровень 1)
…
+ запись 2, (уровень 1)
…
Давайте для простоты договоримся о том, как что будем называть.
Есть журнал, он один. Есть редактор журнала, тоже один.
Есть множество записей в журнале – так и буду их называть, запись журнала или сокращенно просто запись. Синонимы – поджурнал, квест.
Для каждой записи можно задать сколько угодно шагов, каждый будет иметь свой номер, название и возможно статус завершения квеста.
Пока вернемся к рисунку 1.1, разберем все что там есть.
Category: Тут описываются основные параметры записи.
Name: Название записи, отображается в игре
Tag Тег записи, используется для управления из диалога/из скрипта . Тег надо делать уникальным в пределах модуля.
Priority Приоритет записи. Если будут активны более одной записи, можно менять порядок отображения квестов в игре, задавая больший приоритет записи (квесту).
XP Тут можно задать количество опыта, получаемого за квест. Это значение можно получить из скрипта, используя функцию GetJournalQuestExperience(string sTag), где sTag – тег нужной записи.
рисунок 1.2
Добавляем шаги квеста. Каждый шаг имеет свое название (поле text), которое будет показываться игроку, когда он раскроет запись в журнале, ID – обычно номер шага и флажок – является ли этот шаг завершающим. Если достигнут этот шаг – запись переходит из категории «активные квесты» в категорию «выполненные квесты» в журнале игрока в игре.
Собственно на этом вся работа по журналу и заканчивается, дальше посмотрим как можно управлять журналом из диалогов и из скриптов.
Напомню про «цвета», как их можно использовать. НВН понимает теги цветов, т.е. можно кусок текста покрасить в нужный цвет. Делается это примерно так:
<cRGB>text</c>
т.е. парным тегом <c> задается область текста, которая будет окрашена в цвет RGB. Вся сложность в задании параметров. Каждый символ имеет свой код, его числовое значение и используется в качестве параметра.
рисунок 1.3
Не любой символ можно задать напрямую через тулсет, но выбрать «близко» к 0 или к 255 можно, обычно использую символ “ ” (код 32) и русскую “ю” (код 224).
Т.е. если мы хотим выбрать красный цвет – задаем <cю >text</c>. Полученный RGB цвет будет иметь значение R:224,G:32,B:32, что довольно близко к красному цвету.
Для «продвинутых»: Если есть желание – можно сделать библиотеку и в ней после компиляции попробовать поменять цвета на близкие к 0 и к 255
Добавлено в 20:12
Часть 2.
Как редактировать журнал – разобрались, посмотрим как ими управлять. Т.е. зачем вообще нам нужны записи в журнале.
Для примера создадим примерно такую запись в журнале:
рисунок 2.1
Создадим простой диалог, в котором можно будет получить наш «квест»
Открываем редактор диалогов (tools->Converstion Editor, или CTRL-ALT-V)
Создаем простой диалог, используя кнопку “add”-добавить.
рисунок 2.2
В ответе игрока «Да» переходим на закладку «Other Action» (Другие действия) и в поле Journal выбираем нашу запись и начальный шаг квеста.
Теперь, если игрок поговорит с НПС, которому назначен этот диалог и ответит «Да» - у него в журнале появится новая запись, текст которой будет содержать информацию из шага номер 1 (именно его мы задали в диалоге)
Если вы еще не знаете, что такое «скрипты» - дальше можно не читать, вся работа с журналом требует как минимум умения работы с помощником.
Посмотрим, как можно организовать проверку условий выполнения «квеста», проверить выполнение «шагов» и перейти на следующий шаг.
Пусть у нас все тот-же НПС в том же диалоге должен
1) выдать квест,
2) проверить выполнение «шага 1».,
3) выдать задание «шаг 2» и так далее до конца.
Основная «трудность» при работе с журналом – нельзя получить из скриптов\диалогов номер активного в данный момент шага. Т.е. нам приходится помнить это самим.
Давайте заведем локальную переменную для игрока, которая будет отображать, какой сейчас шаг активен. (расмотрим вариант для сингл-модуля, с шардами чуть сложнее из-за необходимости идентифицирования игрока)
Вернемся к нашему диалогу (рисунок 2.2). Перейдем на закладку “Action Taken” (Пункт был выбран), т.е. какой скрипт запустить в случае, если игрок выбрал данный пункт диалога.
Пишем имя скрипт, пусть будет «my_q001_taken01» (my_ - преффикс, чтобы не пересечься случайно со скриптами bioware или любыми другими, q001- номер квеста, taken01 –номер «взятого» шага. Уже по имени нам будет понятно, что примерно скрипт делает.
Жмем кнопку редактировать, тулсет скажет нам что такого скрипта нет, жмем ОК и пишем скрипт.
Neverwinter Script Source |
void main() { SetLocalInt(GetModule(),"my_q001_step",1); } |
Neverwinter Script Source |
int StartingConditional() { int iResult; iResult = GetLocalInt(GetModule(),"my_q001_step") == 0; return iResult; } |
Neverwinter Script Source |
void SetCustomToken( int nCustomTokenNumber, // номер метки string sTokenValue // текст ); |
Neverwinter Script Source |
int StartingConditional() { object oPC = GetPCSpeaker(); if (GetGender(oPC)==GENDER_MALE) { SetCustomToken(2001, "он"); SetCustomToken(2002, "его"); SetCustomToken(2003, "ему"); SetCustomToken(2004, "друг"); SetCustomToken(2005, "мужчина"); SetCustomToken(2006, "мой"); SetCustomToken(2007, "Ясень копий"); SetCustomToken(2008, "ся"); SetCustomToken(2009, ""); SetCustomToken(2010, "Хозяин"); SetCustomToken(2011, "пришел"); SetCustomToken(2012, "ел"); SetCustomToken(2013, "мог"); SetCustomToken(2014, "приятель"); SetCustomToken(2015, "гость"); SetCustomToken(2016, "ый"); SetCustomToken(2017, ""); SetCustomToken(2018, "ец"); SetCustomToken(2019, "господин"); SetCustomToken(2020, "человек"); } else { SetCustomToken(2001, "она"); SetCustomToken(2002, "ее"); SetCustomToken(2003, "ей"); SetCustomToken(2004, "подруга"); SetCustomToken(2005, "женщина"); SetCustomToken(2006, "моя"); SetCustomToken(2007, "Фрейя обручий"); SetCustomToken(2008, "ась"); SetCustomToken(2009, "а"); SetCustomToken(2010, "Хозяйка"); SetCustomToken(2011, "пришла"); SetCustomToken(2012, "ла"); SetCustomToken(2013, "могла"); SetCustomToken(2014, "красавица"); SetCustomToken(2015, "гостья"); SetCustomToken(2016, "ая"); SetCustomToken(2017, "ла"); SetCustomToken(2018, "ка"); SetCustomToken(2019, "госпожа"); SetCustomToken(2020, "женщина"); } return TRUE; } |
CODE |
Добрый день <CUSTOM2006> <CUSTOM2019> |
Отлично, а нельзя назначать опыт за выполнение отдельных шагов квеста? Если это ступени, то было бы логично капать по чуть-чуть XP, а в конце дать большой куш. Или обязательно оформлять это как отдельные квесты?
Второй вопрос: что там с перепиской уже существующих записей?
Великолепный туториал.
Опыт дается с помощью скрипта который на ветвь диалога вешаем
кинуть что ли в "кузницу слов"?..
QUOTE (Chimeric @ Oct 7 2005, 07:25) |
Отлично, а нельзя назначать опыт за выполнение отдельных шагов квеста? Если это ступени, то было бы логично капать по чуть-чуть XP, а в конце дать большой куш. Или обязательно оформлять это как отдельные квесты? |
QUOTE |
Второй вопрос: что там с перепиской уже существующих записей? |
Neverwinter Script Source |
void AddJournalQuestEntry( string sCategoryTag, int nEntryID, object oCreature, int bAllPartyMembers = TRUE, int bAllPlayers = FALSE, int bAllowOverrideHigher = FALSE ); |
Стерто
Медаль за ОФИГЕННО КЛАСНУЮ статтю получает _kaa_....
Благодарю за это тебя....З большой буквы Т....
Ню это видимо давно кому то надо было сделать, и наш Каа честно справился с задачей
QUOTE |
Попозже допишу про динамические диалоги, как сделать один диалог для множества действий. |
http://www.wrg.ru/forums/index.php?showtopic=1853
Поскольку уже не для "зеленых" новичков и больше нужно для шардов (хотя и для развитых модулей пригодится)
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)