Новые приключения в Project Nomads. Дар рожденному летать
Огненное светило посылает прощальные лучи золотым облакам и медленно тонет за далеким островом. Мир погружаются во тьму. Над головой перемигиваются звезды… Вы включаете турбо-ранец и летите осматривать свои владения. Мановение руки — и вы взлетели на верхушку навигационной башни. Включаются древние механизмы, и остров несется навстречу неизведанному… Project Nomads — это кладезь захватывающих приключений. И если одно закончилось — не беда. На основе движка Project Nomads мы создадим свое приключение, полное тайн и чудесных открытий. Мы перепишем сюжет, населим мир новыми персонажами, изменим интерфейс, сделаем врагов умнее, а друзей мудрее, и приправим все это сочным звуком. Захватывающее приключение гарантировано. В путь! От винта! Зайдите в папку Run , находящуюся в корневой директории игры. Здесь мы видим много подпапок и один большой файл в неизвестном формате. В этом файле содержатся все графические ресурсы игры. Они нам пока не интересны, потому что изменять графику без соответствующих конвертеров нельзя, а их пока не создали, ждем поступлений. Направляйтесь в папку Bin. Здесь хранится святая святых игры — главные скрипты. Лучше не изменять их, если только вы не программист со стажем. А вот посмотреть стоит. Откройте, например, в текстовом редакторе файл nsh.tcl. Что-то знакомое, не находите? Конечно, ведь точно такая же скриптовая система применялась в " Гномах " (смотрите подробное вскрытие игры с разбором принципа написания скриптов, опубликованное в 7 номере “Игромании” за 2002 год, на нашем компакт-диске ). Разработчики у игр разные, идею тоже никто ни у кого не воровал. Все объясняется проще. В Project Nomads, как и в “Гномах”, используется мощнейшая бесплатная скриптовая система Tcl/Tk , которая может быть использована не только для скриптов, но и для создания полноценных отдельных программ и игр. И Project Nomads из этой системы выжали все, что можно. Читатели, знакомые с программированием, могут детально изучить скрипты игры. Здесь найдется множество ценных идей, которые можно использовать для создания собственных игр. Ну а тем же, кто не умеет самостоятельно читать и понимать сложные скрипты, что называется, навскидку, лучше сразу перейти в папку Book. Посмотри налево, направо посмотри В каталоге Book содержатся пять подпапок, каждая из которых посвящена одной из пяти глав игры. Две оставшиеся папки будут интересны любителям ресурсов. В папке Music лежит игровая музыка и эффекты, а в папке Feedback — остальные звуки и надписи в незашифрованном графическом формате. Названия файлов соответствуют названиям событий. Например, когда атакуют ваш остров, на экран выводится надпись if_island_attacked.bmp и проигрывается звук islandattacked.wav. Заменяя эти файлы, можно русифицировать игру. Только следите, чтобы размеры надписей на русском и английском языках совпадали. Вернемся в папку Book. Здесь лежит три интереснейших скриптовых файла: character.n , defaultevents.tcl и story.tcl. Структура файлов с расширением .n отличается от файлов с расширением .tcl, но это те же самые скрипты. В файлах с расширением .n чаще всего содержатся команды инициализации. Давайте откроем, например, скрипт character.n. Сначала задаются параметры нового клана. Обратите внимание на эти три строчки: .setrealname “Anton Guenther” .setcurrentenergy 35 .setbasemaximum 35 Вам не нравится имя вашего персонажа? Разработчики не предусмотрели возможности его сменить. Измените его в этом скрипте. Первая строчка отвечает за имя персонажа. А цифры во второй и третьей строчках — за текущую и за максимально возможную энергию игрока. Хотите стать бессмертным? Поставьте число побольше. Следующая группа команд: .createandselvehiclewithname meta_char meta_char1 .setposition -2.495641568 31.7738441 -18.34972835 .setdirection 0 0 0 .setrelenergy 1 .announcestate “normal” .setvisible true .setartefactmode false .setsymbolicname “player” .setthrowevents true sel … Они создают самого игрока. Первая строчка создает игрока как объект — ее лучше не менять. А вот со второй можно поэкспериментировать. Установите новые координаты, и ваш игрок появится в совершенно другой точке уровня. Следующая строчка задает направление взгляда игрока. Если будете ее менять, учтите, что каждое число должно лежать в интервале от -1 до 1. Можно даже сделать игрока невидимым. Просто напишите .setvisible false. Следующая группа команд отвечает за создание острова. Параметры очень похожи на параметры для модели игрока. Можете, оставив игрока видимым, сделать невидимым остров. Тогда игрок и все здания будут как бы парить над облаками. Выглядит очень красиво. Следующие команды создают три дерева и добавляют их на остров. Почему на острове только три деревца? Сделаем целую рощу. Главное — не забудьте указать для каждого дерева уникальное имя. Скрипт defaultevents.tcl отвечает за обработку событий. Он состоит из нескольких десятков подобных строк: on _islandattacked { playfeedbacksound book:feedback/islandattacked.wav textmessage island_attacked } Ничего не замечаете? Здесь задается, какой должен играть звук и какое текстовое сообщение должно появляться при определенном событии. Последний файл содержит команды загрузки всех пяти глав игры. Если вы будете добавлять свою главу, не забудьте изменить этот файл. Дело за малым — понять, как организованы главы игры, тогда мы сможем создать собственную полноценную игру на основе Project Nomads. Основы игрового действа Зайдите в папку Chapter00. В ней собраны файлы, отвечающие за вступительную часть игры. Корневой файл каждой главы содержит скрипт story.tcl , в котором находятся команды загрузки всех частей данной главы (в игре глава подразделяется на части, а не наоборот). В первой главе всего одна часть, которую разработчики поместили в папку part01. Рассмотрим, что содержится в story.tcl. Скрипт построен на событиях. Например, самое первое событие — on part_activated — происходит в самом начале игры, по сути это запуск уровня. Команда resetplayerat помещает игрока в указанную позицию. Не забудьте скорректировать эту позицию, когда будете создавать свою карту игры (о картостроении мы поговорим попозже). Командой daytime устанавливается текущее время (влияет на освещенность и положение солнца), а wind задает скорость ветра. Корректируя только эти параметры, уже можно создавать простенькие моды. В моей модификации царит ночь. Точнее — полночь. Луны нет. Звезды чуть мерцают. Остров на огромной скорости несется навстречу неведомому. Порывы ветра заставляют гнуться хлипкие деревца. И вся эта атмосфера создается изменением всего двух параметров. Командой loadencounter загружаются игровые скрипты из папки encounters. В данном случае это скрипт intro.n. Это один из важнейших скриптов каждой части игры. Поэтому о нем мы поговорим особо. Команда startpart задает начало игры, а setplayerpos перемещает игрока в нужную позицию. Командой playanimation задается анимация персонажа. Файлы анимации — это тоже скрипты. Команду playsound вы уже знаете. Оставшаяся часть этого файла задает разнообразные реакции игры на стандартные события. Например, вот событие, которое обрабатывается, когда игрок строит первую оборонительную башню: on navtowergebaut { setvar navtowerbuildcount [expr [getvar navtowerbuildcount] + 1] if { [getvar navtowerbuildcount] == 1 } { loadencounter cam_navbuild.n playanimation basaltface_cinedummy3 oneshottimer 17.5 zumnavstart } } Первой командой приращивается на единицу значение переменной navtowerbuildcount, которая показывает число построенных оборонительных башен. Далее следует условие. Если эта башня — первая построенная (if { [getvar navtowerbuildcount] == 1 }), происходят следующие действия: запускается внешний скрипт cam_navbuild.n (он отвечает за то, чтобы камера красиво показала только что построенную башню), проигрывается анимация basaltface_cinedummy3 и создается таймер события. За это отвечает команда oneshottimer. Ее первый параметр — время задержки, а второй — имя события, которое должно сработать по истечении заданного времени. А где же само событие? Да вот оно, чуть ниже: on zumnavstart { islandmoveto navpoint_start enablenavpoint navpoint1 } Первая команда этого обработчика события перемещает остров в навигационную точку navpoint_start, вторая — делает активной навигационную точку navpoint1. Таким образом вы можете построить любой скрипт. Шальной полет с заплечным ранцем В папке Cinematics хранятся все анимационные скрипты. Скрипты, начинающиеся с префикса cam_ , относятся к камере. Каждый такой скрипт состоит из очень простых команд, например .addtranslate 0.2 -7746.367861 -166.9116924 -6270.469975. Такая команда заставляет камеру или объект переместиться на определенные координаты с **
**
Кто выключил свет? Это мы всего-навсего заменили объект Skybox на… дерево.
определенной скоростью. Немного поэкспериментировав с параметрами, вы сможете написать даже самый сложный анимационный скрипт. Единственная проблема — команд в таком скрипте очень много, и процесс создания анимации долог. Но результат того стоит. __ В папке encounters хранятся скрипты событий, а также крайне интересный скрипт intro.n. В Project Nomads нет специальных файлов-карт. Игровые пространства и объекты создаются здесь через скрипты. Если вы захотите создать свою собственную карту, скрипт intro.n послужит вам образцом. Он состоит из большого числа однотипных блоков, каждый из которых создает какой-то объект. Например: .createandselvehiclewithname weather_normal weather_normal1 .setposition 0 0 0 .setdirection 0 0 0 .announcestate “normal” .setvisible true .setartefactmode false .setareaofeffect 500 **
Летающие деревья - феерическое зрелище!.setthrowevents true sel …Здесь создается виртуальный объект “погода”. Область действия этого объекта задается командой setareaofeffect. А вот так выглядит скрипт для создания облака:.createandselvehiclewithname wolke10 wolke1014 .setposition -8056.97505 -312.4202724 -5261.262293 .setdirection -16.98896475 601.7249387 -178.4645352 .setrelenergy 1 .announcestate “normal” .setvisible true .setartefactmode false .setcharges 10 .setthrowevents true sel …Команды у облака почти такие же, как и у “погоды”. Заменитеwolke10наtree14**— и по небу будут летать… деревья. Добавляя подобные блоки, вы можете создать любые объекты. Но где же взять названия этих самых объектов? Ведь пока непонятно, что подставить вместо названия облака.Слева — дерево, справа — самолетОбратите внимание на файлloadlist.txt. Это и есть список объектов, задействованных на уровне. Его нельзя изменять (об этом предупреждает соответствующая надпись), но вот позаимствовать из него названия объектов — можно. Когда будете создавать свою кампанию, не забудьте в папкуObjectiveпоместить картинку с надписью, описывающей цель миссии. В папкуSoundпоместите задействованные на уровне звуки, а в папкуSubtitle— игровые сообщения. Мы с вами изучили принцип построения типичной главы. Корректируя имеющиеся скрипты, можно полностью изменить главу.Сквозь гущу облаковКампанию мы создали. Двигаемся дальше по дорожке сотворения новой игры. Выходите в папкуRun. В папкеLocaleлежат графические образы всех надписей и кнопок в игре. Если хотите русифицировать игру, то начинать надо именно отсюда. Но нам сейчас больше интересна папкаScripts. В ней хранятся игровые скрипты. Если раньше мы имели дело со скриптами, отвечающими за миссии, события и сюжет, то теперь перед нами — глобальные скрипты, которые контролируют работу ядра игры. В файлеalias.tclможно посмотреть, каким игровым объектам какие символические имена соответствуют. Для этого же пригодится скриптcommands.tcl. В commands.tcl также собрано множество функций и процедур, с помощью которых можно оперировать ядром движка. Если хотите заняться созданием модов всерьез, обязательно изучите этот файл. Вы сможете найти такую полезную процедуру, какfx. Она запускает любой игровой спецэффект (напомню, что названия спецэффектов можно посмотреть в alias.tcl) Процедураsetfullenergyустанавливает для выделенного объекта 100% энергии (она зависит от максимально допустимой энергии этого объекта, которую можно узнать с помощью процедурыgetmaxenergy). В этом файле есть еще много интересных процедур, разобраться с которыми очень легко самостоятельно по описанному образцу. Тем же нехитрым способом можно изучить скриптыscriptlib.tcl. Это целая библиотека, отвечающая за обработку миссий.Батон! Еще батон!В Project Nomads нельзя переназначить управление (“батон” — значит клавиша), которое нравится далеко не всем. Редактируя скриптinput.tcl, отвечающий за карту ввода,клавишиуправления можно переназначить. Каждому программному прерыванию (нажатие кнопки, клик мыши и т.д.) назначается соответствующая процедура-обработчик. Обратите внимание, что в скрипте по умолчанию прописаны несколько раскладок клавиатур — для игрока, для разработчика. Чтобы переназначить управление, нужно изменять строчки вида:.map keyb0:f2.down "script:/sys/servers/menuhandler.showhelpscreen"В этой строке записано, что по нажатию клавишиF2запускается скрипт, который выводит на экран справку об игре. Вы можете легко изменить строчку, чтобы то же действие выводилось по нажатию клавишиF1:.map keyb0:f1.down "script:/sys/servers/menuhandler.showhelpscreen"Но ведь на клавише F1 в Project Nomads изначально “висит” главное меню. Его надо куда-нибудь переопределить. Самая подходящая для этого кнопка —Esc. Ищите строчку.map keyb0:f1.down "script:ingame_menu"и меняйте ее на.map keyb0:esc.down “script:ingame_menu”. Точно так же можно переназначить все управление в игре. Обратите внимание, что в скрипте может быть несколько строчек, отвечающих за одну и ту же команду. Соответственно, если хотите “повесить” эту команду на другую кнопку, ищите все места в скрипте, где эта команда попадается (легко находится, через функцию “Поиск” в любом текстовом редакторе).Новый интерфейс налицоВ файлеnewmenu.tclхранится скрипт, отвечающий за создание и обработку игрового меню. Изменяя скрипты в этом файле, вы сможете полностью изменить игровое меню, добавить свои элементы или удалить ненужные пункты, переназначить команды… Давайте на простом примере посмотрим, как это сделать. Помните, при попытке выхода из игры она услужливо спрашивает подтверждение? Уберем это сообщение и организуем прямой выход из игры. Загружайте скрипт в текстовый редактор и ищите словоquit. Найдите процедуру-обработчик, которая вызывается, как только игрок щелкнет по пункту меню “Выход”:proc nm_killgame {last} { global confirmedMenu set confirmedMenu $last /sys/servers/menuhandler.openmenu “really_abort” }Две первые команды подготавливают создание окошка-вопроса, а третья его вызывает. Функция, отвечающая за обработку этого окна, должна называтьсяreally_abort. Через поиск находим участок текста:new nguistandardmenu really_abort sel really_abort .settitlerect -0.4 0.4 0.3 0.0 .settitle really_abort .setabortable true new nroot entries sel entries new nguistandardmenuentry no sel no .setrect -0.8 0.0 0.0 -0.3 .setcommand “nm_goback” sel … new nguistandardmenuentry yes sel yes .setrect 0.0 0.8 0.0 -0.3 .setcommand “nm_reallykillgame” sel … sel … sel …Эта процедура создает окошко и две кнопки в нем. Обратите внимание, как это происходит, — по образу и подобию можно сделать любое окошко. Для кнопки “Yes” командой .setcommand “nm_reallykillgame” создается обработчик события кнопки. Опять открываем наше верное окошко поиска и вводимnm_reallykillgame. Находим еще одну процедуру. В ней много команд, но нам больше всего интересна**/world.killgame**. Теперь можно быть уверенным — именно процедура nm_reallykillgame закрывает игру. Вставим ее напрямую в процедуру-обработчик nm_killgame:proc nm_killgame {last} { global confirmedMenu set confirmedMenu $last .nm_reallykillgame}И все премудрости.Этот новый заоблачный мирОбратим внимание на скриптыstatewatch_scripts.tclиcommandlist_lib.tclи соответствующие им папкиstatewatcherиcommandlists. Скрипт commandlist_lib.tcl — это список инициализации для скриптов из папки commandlists. Аналогично, в statewatch_scripts.tcl содержатся команды инициализации скриптов из папки statewatcher. В папкеstatewatcherхранятся скрипты-обработчики объектов, например бомбы, самолета, облака, электростанции. Систему команд Project Nomads мы с вами изучили, вы можете изменить любой объект и даже создать новые. Только не забудьте добавить их в скрипт statewatch_scripts.tcl. Давайте для примера сделаем что-нибудь забавное. Откройте скрипт silo.tcl. Он отвечает за бункер. Найдите процедуру:proc silowatch_explode {} { if {[.isanimfinished] == “true”} { if {[.getcharges] <= 0} { .setremoveable true } else { .announcestate normal .removefromisland } } } Удалите строчку.removefromisland. Теперь, если ваш бункерпо несчастной случайности взорвут, он… останется цел.Асы на хвостеПерейдем в папкуCommandlists. Здесь
Вражеские самолеты с отключенным интеллектом несутся на мою пушку, словно слепые котята.
хранятся скрипты, отвечающие за искусственный интеллект самолетов, турелей и прочих тех. средств. Мы можем полностью переписать интеллект вражин. Например, чуть-чуть изменив скрипт airplane_avoidcollision.tcl , можно заставить вражеские самолеты врезаться в скалы. Вот как это можно сделать. Скрипт состоит из нескольких десятков процедур вида: proc aacdownsmall_test {} { if {[.getavoidcollisionkind] == “small”} { if {[.getavoidcollisiondirection] == “down”} { return 1.0 } else { return 0.0 } } else { return 0.0 } } Они не уводят самолет от опасного объекта, **
**
Обратите внимание на правую нижнюю часть картинки. Как вы думаете, что это такое гигантское и серое? Да это наша тень! Как она там оказалась? Доэкспериментировался со скриптами…
а просто проверяют, есть ли опасность и где она. Значит, где-то есть скрипт, который, пользуясь этими процедурами, уводит самолет от столкновения. Можно, конечно, найти этот скрипт и редактировать его, но мы сделаем проще. Если наводчик будет давать стрелку ложные данные о целях, то стрелок наверняка промахнется. Эта процедура как раз выступает в роли “наводчика”. **Посмотрите на нее внимательнее. Если тип объекта — “маленький” и для уклонения надо снизиться, возвращается 1, иначе возвращается 0. Если возвращается 1, самолет уклоняется от препятствия. Давайте изменим в строчке return 1.0 единицу на ноль. Теперь, если опасность маленькая и находится сверху, самолет будет лететь на нее. Если же вы хотите сделать вражин слепыми младенцами, везде в этом файле измените в строчках return единицу на ноль. Первая же скала станет могилой для неприятеля. Сохрани меня с собой Project Nomads почти вся создана на скриптах. Мало того, что разработчики сделали все игровые карты скриптами, так еще и… сохраненки тоже записываются в виде скриптов! Они хранятся в папке Save. Там же хранятся и скрипты для сохранения и загрузки. Структура этих файлов — список однотипных команд для создания объектов и присвоения им типовых свойств. Хотите починить не вовремя взорвавшуюся турель? ** Сохраняйтесь и идите в папку Save. Ищите файл с именем-номером слота сохранения и расширением .n. Открывайте его в текстовом редакторе, ищите строку, соответствующую вашей турели, и изменяйте цифру рядом с параметром setenergy. Так же просто меняются и другие параметры. *** Ночь-чародейка накинула на мир свое звездное покрывало. Попутный ветер дует прямо в лицо. А значит, вам снова пора в путь, навстречу новому приключению. Вашему приключению. Вы пройдете через тернии собственного сюжета, мир вам откроют ваши персонажи, и их разум будет подчиняться вашей воле.