Эксперт — это человек, который совершил все возможные ошибки в очень узкой специальности.
Нильс Бор
В первой части статьи мы добавили в таверну «Дурное знамение» нового постояльца — Бродягу, сделали ему уникальную внешность, одели, выдали на руки ключ от погреба и прописали режим суточного поведения. Сегодня мы пойдем дальше: нарисуем с нуля винный погреб, завершим квест и расскажем немного о том, как сделать задания в Oblivion более разнообразными и интересными, для чего вкратце пройдемся по основным скриптам игры.
Входит-выходит...
Любое помещение в Oblivion является отдельным элементом игры, отдельной «ячейкой» (Cell), которую игровой движок всякий раз должен подгружать при переходе из внутреннего помещения на улицу. Точно так же построены и большие подземелья: они состоят из нескольких ячеек, каждая из которых содержит определенный кусок уровня. Таким образом, игра потребляет гораздо меньше ресурсов, но донимает игроков постоянными «подзагрузками» областей. Винный погреб, который мы создаем, будет состоять из одной ячейки, но создавать ее надо точно так же, как и любую другую: сначала — на программном уровне, затем — визуально.
В главном меню выберите World Cells... и перейдите к Interiors в свитке World Space (самый первый пункт). Затем щелкните правой кнопкой в окне снизу и выберите в контекстном меню New. Перед вами появится окно New Form Editor ID. Введите в поле уникальное имя для нашего погреба. Назовем его WineCellar, то есть винный погреб. Напоминаем вам, что Editor ID — это лишь «кодовое» обозначение предмета или области, которое не будет отображаться в игре и нужно редактору и нам с вами, чтобы найти предмет в таблице объектов среди сотен однотипных WindCave.
Теперь перейдем во вкладку Interior Data, расположенную неподалеку. В поле Name введите игровое имя локации: Винный погреб. Не трогая остальные поля, щелкаем Apply и закрываем окно Cells.
Это важно: если вы — обладатель английской версии TES IV: Oblivion, возможны сложности с отображением русских букв. В таком случае назовите нашу локацию Wine Cellar или как душе угодно, но — латиницей.
Самое время расположить вход в погреб на карте. Проще всего попасть в нужную нам локацию, щелкнув дважды в Render Window на большой маркер-стрелку возле выхода из таверны «Дурное знамение». Но можно просто выбрать в окне Cell View в свитке World Space — Tamriel, а затем дважды щелкнуть по местности InnOfIllOmenExterior. В окне визуализации отобразятся окрестности таверны. Теперь приблизьте камеру к ее правому дальнему углу относительно входа. Там вы увидите два небольших камня, возле которых мы и поставим вход в погреб.
Это интересно: на самом деле таверна расположена в очень неудачном месте — на склоне гор, что в реальности привело бы к крайне печальным последствиям после первого же дождя.
При выборе места для входа следует руководствоваться не столько визуальной красотой, сколько элементарной логикой. Поставив дверь под скатом крыши, мы на самом деле сильно рискуем, потому что эта самая дверь скорехонько разбухнет от влаги и погреб превратится в замурованный бассейн. Единственным приемлемым решением станет правый дальний угол дома, поскольку туда не попадает вода с крыши, к тому же там погреб не заметит случайный прохожий-воришка.
В качестве двери мы выбрали стандартный вариант — ChorrolTrapDoor01. Напомним, что для того, чтобы поместить любой предмет на локацию, следует найти его в таблице объектов (Object Window), а затем перетащить на окно визуализации. Не забывайте, что комбинация клавиш Shift+Z позволит ограничить перемещение и поворот предметов вдоль оси Z, а кнопка F «роняет» выделенный объект на пол.
Замечательно выходит!
Теперь можно переходить к обустройству нашего помещения. Дважды щелкаем по WineCellar в окне Cell View. Теперь в окне визуализации пусто, и можно начать эксперименты по обустройству внутреннего помещения погреба.
Тут можно пойти по одному из двух путей — начать с нуля или воспользоваться одним из готовых подвалов и изменять его. Мы бы рекомендовали вам воспользоваться вторым вариантом хотя бы потому, что таким образом гораздо легче начать строительство погреба.
В качестве основы мы подобрали ChorrolRimalusBruiantsBasement. Это помещение, во-первых, создано в одном архитектурном стиле с самой таверной, а во-вторых, имеет небольшой размер и легко редактируется. Давайте подгрузим его в окне визуализации, выделим все объекты и скопируем их комбинацией клавиш Ctrl+C.
Переходим к нашему погребу — WineCellar — и щелкаем Ctrl+V. Теперь в ячейке WineCellar есть внутреннее убранство, но оно не связано с той дверью, которую мы создали. Пройдясь по нашему помещению, вы заметите, что дверь-то нам совсем не подходит, ведь в погреб будут забираться сверху. Смело удаляем объект Ungrddoor, точно так же, как и стену, в которую она была вписана, — Ungrdexitdoorway. Мы посчитали, что два этажа для небольшого погреба таверны «Дурное знамение» — это многовато, поэтому убирайте с уровня все лестничные площадки.
Думаем, вы уже поняли, как строился мир Oblivion. Художники 3D заготовили большое количество блоков — кусочков помещений в разных стилях, а дизайнеры помещений лишь соединяли их, получая конечный уровень. Такая система позволяет реализовать очень сложные и запутанные подземелья, не загружая до смерти художников и очень сильно упрощая жизнь дизайнерам уровней.
Строительство помещений напоминает игру в кубики или сборку конструктора — все элементы идеально подходят друг к другу, если только вы «собираете» кусочки одного и того же комплекта, в нашем случае это так называемые «подземные помещения». Все элементы такого типа можно найти в таблице объектов: WorldObjects Static Architecture BasementSections.
Один из самым главных аспектов строительства уровней — правильная подгонка высоты объектов. Ввод неверных значений грозит самыми разнообразными ошибками по ходу игры. Поскольку у нас образовалась дыра в стене, стоит удалить ячейку с «дыркой» и поставить на ее место угловую секцию UngrdlLroom. Чтобы идеально выровнять новый элемент по высоте, надо дважды щелкнуть по ячейке и в разделе 3D Data выставить значение Z равным 7022.0000.
Теперь поставим на уровень люк, через который и можно будет попасть в погреб. Возьмем для этого ChorrolTrapDoor02. Эта та же самая дверь, что стоит у нас на поверхности, но перевернутая и немного измененная. Поставим ее на потолок в новой ячейке, как можно ближе к стене.
Теперь у нас есть двери с одной и с другой стороны, но они еще не соединены друг с другом. Перейдем к окрестностям таверны, InnOfIllOmenExterior. Дважды щелкните по двери в погреб, ChorrolTrapDoor01 и в появившемся окне перейдите к вкладке Teleport. Ставим галочку напротив одноименного пункта Teleport и в свитке Cell ставим WineCellar. Reference свяжите с дверью в погребе: ChorrolTrapDoor02. Дважды щелкните по появившемуся маркеру над дверью на улице и согласитесь перейти в помещение, с которым он соединен. Теперь выделите маркер ChorrolTrapDoor02, который будет расположен прямо над дверью, и опустите его вниз, на пол, с помощью комбинации клавиш Shift+Z. Отныне в наш винный погреб уже можно зайти. Советуем вам на данном этапе проверить работоспособность нашей модификации в игре.
Давайте закроем эту дверь на ключ. Для этого вновь зайдем в свойства ChorrolTrapDoor01 и перейдем во вкладку Lock, поставим галочку напротив переключателя Lock, а в свитке Level выберем «нужен ключ». Таким образом мы не оставляем шанса игроку взломать погреб без выданного ему на руки Бродягой ключа. Это не совсем честно, но таким образом мы обезопасим наш погреб от случайных посягательств. В свитке Key выберите тот ключ, который уже лежит у Бродяги в вещмешке, WineCellarKey. Отныне дверь заперта, и ключ есть только у одного человека во всем Киродииле.
Осталось дело за малым: прописать наш квест и оборудовать погреб всем необходимым — вином, вином и еще раз вином. Ах да, и еще запиской, в которой будет указано расположение всех вин. Чтобы реализовать квест, в погребе уже должно находиться вино Барбареско, поэтому давайте провернем с ним ровно то же самое, что мы делали с ключом, то есть возьмем какое-нибудь дорогое вино, скажем, «Вино Тамики 399 года», расположившееся по адресу Magic Potion Clutter DrinkWine6TamikaBest. Заходим в его свойства, меняем ID на что-то вроде Barbaresco, а имя — на Вино Барбареско. Убираем галочку с Food Item, дабы игрок не мог его случайно выпить, и ставим крестик напротив Quest Item. Нажимаем OK и соглашаемся создать новый объект в базе данных.
Стильные штучки
Сегодня существует восемь основополагающих стилей интерьера. Дело в том, что пытаться классифицировать интерьер — идея всесторонне утопичная, ведь многие интерьеры подразделяются еще на несколько направлений. К тому же интерьер — это в первую очередь отражение психотипа человека и его финансовых возможностей и лишь потом — его чувства вкуса и меры. А стало быть, двух одинаковых интерьеров не существует по определению.
Модерн — стиль, характерный уходом от прямых линий и углов в пользу более плавных, «природных» линий. Этому стилю присуще яркое проявление характеристик материала, его фактуры. Считается, что модерн раскрывает индивидуальность владельца, его утонченный вкус.
Ар-деко — популярный в 1920-1930-х годах прошлого столетия стиль, для которого характерны геометрические узоры, нарочитая роскошь, шик и необычные детали в мебели.
Классицизм предполагает полное соответствие канонам. Во многом этот стиль схож с ар-деко, но отличается от него использованием усложненных форм, более насыщенных цветов. Сегодня классицизм ассоциируется со стариной, вычурной дороговизной и роскошью.
Хай-тек, один из наиболее актуальных стилей в наши дни. Ему присуще использование в отделке очень необычных современных материалов, красивых и практичных.
Минимализм — еще один популярный сегодня стиль. Для него отсутствует как таковой декор, поскольку основа этого стиля — отказ от ненужного в пользу самого необходимого. Яркий пример минимализма — любой магазин IKEA.
Кантри — интерьер, максимально приближенный к деревенскому. Кантри стремится передать все особенности менталитета определенной страны. В этом стиле используются только натуральные материалы: камень, дерево и прочие.
Техно обусловливает главенство круглых или квадратных отверстий, прорезей, современных технологий. Этот стиль создает атмосферу светопреставления, в нем обязательно используются металл и стекло.
Кич — нигилизм от мира интерьерного дизайна. Сочетание несочетаемых цветов и предметов интерьера, например, позолота на карнизе, синие звезды на потолке, горшки с кактусами в углах и пол, выложенный плиткой в восточном стиле.
Что интересно, если перенести современную классификацию на TES IV Oblivion, окажется, что в Имперском городе главенствует классицизм, а во всем остальном Киродииле балом правит кантри, хотя интерьеры повсюду в целом однотипные — это кантри с небольшими заимствованиями из всех трех самых популярных стилей: модерна, ар-деко и классицизма.
Давайте теперь оборудуем погреб: уберем весь тот мусор, который остался от прежней комнаты, наставим вин, причем в определенном порядке, и не забудем положить в самый дальний угол бутылку Барбареско.
Первое помещение мы заставили бочками с вином: LowerBarrelKeg01 и MiddleBarrelKeg01. Во второй комнате расставили барные столы, расположившиеся в WorldObjects Static Furniture LowerClass, и по часовой стрелке (относительно входа, довольно узкого коридора) расположили вина.
Возьмем пустую записку Items Book Clutter BlankSheet и зайдем в ее свойства. Изменим ID на WineNotes, а имя — на «Классификация вин». Теперь запишем текст заметки. Написание текстов в книгах очень похоже на редактирование HTML-страниц, и любой веб-дизайнер сразу почувствует себя как дома. Мы создадим элементарную заметку такого плана:
Иными словами, по центру будет помещена надпись «Классификация вин», а затем, начиная с левого края страницы, основной текст. Теперь следует положить эту записку на стол и увеличить ее размер в два раза; для этого зайдем в ее свойства и в поле Scale выставим значение 2.0. Это нужно просто потому, что оригинальный вариант заметки слишком мал и незаметен на большом столе с вином. Самое время заняться нашим квестом, ведь все необходимое у нас есть. Если вам интересно посмотреть на то, что получилось у нас на данном этапе, ищите на DVD в подборке по TES IV: Oblivion файл lki2.esp. Каждый квест в мире Oblivion начинается так: ищем в главном меню Character Quests, затем правой кнопкой мыши щелкаем в левой области окна заданий и выбираем New из контекстного меню. В поле ID пишем «DrunkNordQuest» и переходим к заполнению полей основного окна. Quest Name — «игровое» имя задания, которое можно будет увидеть в журнале заданий, назовем его «Вино для бродяги». Приоритет выставляем равный 100. Нажимаем на кнопку New, расположенную снизу. Скрипты «AddItem Yabloko, 2» — добавить в указанную ячейку 2 «Yabloko». Если вы хотите добавить игроку в инвентарь отмычку, следует написать: «player.additem 00000A 1». 00000A1 — это FormID (не путайте с EditorID) отмычки. «player.EquipItem CursedHelm 1» — надеть на игрока CursedHelm. Единица означает, что этот предмет нельзя снять. Если этот параметр не нужен, после CursedHelm ничего не пишется. В случае ... «IsCloudy» — облачной погоды, «IsPleasant» — солнечной погоды, «IsRaining» — дождя, продолжить (или начать) выполнение кода. GetButtonPressed — очень популярный оператор, определяющий, какую кнопку нажал игрок в текстовом сообщении (Message Box). Drop — бросить себе под ноги предмет. Например, команда «Player.Drop Torch02 3» заставляет игрока выбросить на пол три объекта типа «Torch02». SetNoRumors [0/1] — крайне полезный оператор, позволяющий исключить тему «слухи» из диалога с NPC. OnDeath — часто используемый оператор, запускающий код после смерти того или иного персонажа. Скажем, «begin OnDeath SuperChampion» начнет дальнейшее выполнение команд сразу после того, как Великий чемпион безвременно скончается. GetIsSex — необходимый оператор, определяющий пол персонажа. Именно на этом операторе построены диалоги Oblivion. Например, код If GetIsSex Male == 1 Message «Привет, парень!» endif If Player.GetIsSex Female Message «Привет, красавица!» Endif позволяет вывести два совершенно разных сообщения для персонажей мужского и женского пола. RemoveAllItems — уничтожить или переместить все предметы из ячейки. Например, «RemoveAllItems TreasureChest, 1» переместит все предметы из заданной ячейки в TreasureChest. Команда «RemoveAllItems FriendlyJailer» попросту уничтожит все содержимое FriendlyJailer. Перечисленные нами операторы — малая часть всего того многообразия, которое предлагает игра. Однако, даже используя лишь те операторы, что мы перечислили, можно создавать очень интересные и разнообразные квесты. Теперь в свитке Condition Function выбираем GetisID, щелкаем на кнопку, расположенную ниже Function Parameters, и выбираем в свитке Object ID нашего Бродягу: DrunkNord. Тем самым мы задаем условие: если игрок подошел к персонажу DrunkNord, начинает работать код задания. Сразу щелкните правой кнопкой мыши по нашему условию в окне Quest Conditions и выберите пункт Copy Condition из контекстного меню. Это поможет вам избежать постоянного поиска нашего NPC в здоровенном списке всех объектов игры. Переходим во вкладку Topics. Откройте контекстное меню ниже поля Editor ID (слева), щелкнув по нему правой кнопкой мыши, и выберите пункт Add Topic. Пролистайте список и выберите пункт GREETING. Щелкаем правой кнопкой мыши в окошке справа, под надписью Info, и выбираем пункт New. В поле Response Text запишем приветствие: «П-привет, дружище!» Набирать текст надо без кавычек, здесь и далее они приведены только для удобства. Теперь нам нужно добавить еще семь диалоговых опций для нашего задания. Чтобы не повторять из раза в раз одни и те же действия, мы расскажем, как добавить одну, а остальные вы сделаете сами по аналогии, мы лишь дадим вам необходимые фразы. Итак, каждая тема для разговора является вместе с тем и ответом игрока, то есть вас, на реплики собеседника- Бродяги. Щелкаем правой кнопкой мыши ниже поля Editor ID (не самого первого, а второго слева), выбираем пункт Add Topic. Затем вновь щелкаем правой кнопкой мыши, но уже по списку в окне Select Topic, из контекстного меню выбираем пункт New. Набираем имя первой темы: NordHello. В самом верху в поле Topic Text пишем: «Ну здравствуй, коли не шутишь...» Вызываем контекстное меню под строкой Info и щелкаем New. В появившемся окне заполняем поле Response Text ответом Бродяги: «С-слушай, у тебя найдется минутка, чтобы провернуть для м-меня одно пус... пустяковое дельце?» В поле Conditions, внизу, вставляем наше условие, вызывав из контекстного меню пункт Paste Conditions. Если ничего не произошло, возвращаемся на два абзаца назад и читаем о том, как скопировать условия квеста. Так, одна тема разговоров есть. Теперь надо добавить ее в качестве единственного варианта ответа после GREETING. Для этого переходим к пункту GREETING и в небольшом окошке справа, Add Topics, щелкаем правой кнопкой мыши, выбирает пункт Add Topic. Выбираем NordHello в качестве единственного варианта ответа. Editor ID Response Text Result Script Topic Text Choices NordEnd Н-не может быть!.. Друг, ты меня выручил!.. Я этого не забуду!.. У м-меня ничего нет, но все равно спасибо! SetStage DrunkNordQuest 20 Вот оно! - NordNo Ну и проваливай! - Отстань, бродяга. - NordOK Мне н-нужна б-бутылка редкого вина... Ты найд-д-дешь... найдешь его в подвале за т-таверной... Называется... - Я слушаю... NordOkNo NordOkOk NordOkOk60 NordOkNo Тогда отвали от меня, щ-щенок! - Ха, еще чего! - NordOkOk Д-друг, я не помню... Вот тебе кл... ключ, там сам раз... разберешься. SetStage DrunkNordQuest 10 Player.AddItem WineCellarKey 1 Я готов. А как оно хоть называется-то? NordEnd NordOkOk60 Я гл... гляжу, ты хороший малый... Н-названия в-вина я не помню, но это точно с-сухое ит... итальянское вино... Кажется, б... бр... Не, не вспомнить. - Слушай, ну неужели совсем не помнишь? - Все последующие темы расписаны в соответствующей таблице, стоит лишь добавить, что темам NordNo и NordOkNo следует добавить галочку напротив пункта Goodbye, расположенного по центру окна Topics, слева от раздела Add Topics. Также следует увеличить количество условий в темах NordOkOk60 и NordEnd. В поле Conditions первым добавьте следующее условие: GetDisposition [TARGET] >= 60 — то есть если вы сумели поднять уважение Бродяги к вам до 60, он сообщит дополнительные сведения о задании. В поле Conditions к NordEnd следует добавить GetItemCount Barbaresco = = 1. Таким образом, если игрок приносит вино, квест заканчивается. Это интересно: в этом материале мы постарались свести использование скриптов к минимуму и поэтому пошли окольными путями. В случае разработки более сложного задания без использования скриптов не обойтись, поэтому рекомендуем вам ознакомиться с ними. Часть скриптов приведена в этой статье. Перейдем к окну Quest, во вкладку Quest Stages. Создадим там всего две стадии задания: щелкнем правой кнопкой мыши по пустому полю под Index и выберем New. Первый раз установим значение 10, второй — 20. Щелкните на первую стадию и в поле Log Entry наберите текст, который развернется перед игроком в дневнике заданий: «Я встретил какого-то пьяницу в таверне «Дурное знамение», он дал мне ключ от погреба и попросил принести ему вино. Что за вино, я так и не понял, но, судя по всему, самое крепкое». Переходим к стадии 20. В Log Entry запишем лаконично: «Задание выполнено». Ставим галочку напротив пункта «Complete Quest» — и пожалуйста, наше задание готово. В деталях наше задание не идеально: на карте не отмечено, куда надо идти, возможны проблемы после прохождения миссии: мы не выставляли «одноразовость» первой фразы и в скриптах не прописывали уничтожение всяких упоминаний о вине после окончания квеста. Но теперь, пользуясь тем, что мы создали, как стартовой площадкой, вы можете модифицировать, дополнять и усложнять задание. В этом материале мы постарались пойти по пути наименьшего сопротивления, но те, кто не ищет легких путей, могут превратить этот квест в целое приключение, состоящее из нескольких миссий.
Программирование квеста
Темы для разговора