Есть у меня одно правило, не связываться с ранним доступом. И это правило я редко нарушал, были исключения только для «Elite Dangerous», «Astroneer» и «Subnautica». Ах да, еще есть «Planet Explorers» и «Starbound», но они скорее причина правила, а не исключения. Сейчас список пополнился. В данной статье хочу описать одну из самых необычных концепций, которые мне доводилось видеть. Однако, так как данная игра не имеет полноценного релиза, этот пост я назвать обзором не решусь, потому так и обозначим — «Не-обзор».
Давайте представим мир, природа которого подчиняется некоему скриптовому языку программирования, местные люди мистифицировали его и открыли «школу магии». Данную концепцию попытались реализовать учителя школы программирования «ThoughtSTEM» из Сан-Диего в своем проекте «CodeSpells».
Разработка игры началась еще в 2015 году, собрав на Kickstarter сумму в 164 014 $. В 2017 году, когда деньги закончились, работа над проектом приостановилась. Но в 2020 создатели смогли наладить финансирование через Patreon и продажи ранней версии в Steam, после чего процесс разработки возобновился. К сожалению, непосредственно как полноценная игра, на данный момент, проект из себя практически ничего не представляет: сюжет отсутствует, вместо него небольшие наброски в блоге авторов, описывающие мир игры; каких-либо персонажей или квестов вообще нет, только болванчик, которым управляет игрок. В принципе это не удивительно, фактически её разрабатывают два человека и задачи они ставили себе другие. После перерыва все силы были направлены на проработку инструментария с открытым исходным кодом (CodeSpells Authoring Tools) для своего небольшого сообщества. По словам авторов, с их помощью каждый сможет собирать мини-игры в стиле «CodeSpells». Некоторые примеры таких игр можно скачать бесплатно на
Однако вернемся к самой Steam-версии. Несмотря на незаконченность и заморозку её развития, в игре отлично реализована основная её механика: при помощи логических блоков схожих с операторами в языках программирования создавать собственные заклинания. Кроме этого, в игре есть текстовый редактор, в котором игра интерпретирует использованные игроком блоки в код на JavaScript. К слову, уже опытные игроки могут сразу начать писать новые заклинания на этом языке. Такая механика может стать отличной возможностью для игрока понять принцип программирования и поднять компьютерную грамотность. На практике, конечно не все гладко. В своих изысканиях я напоролся на хоть и преодолимую, но серьёзную трудность. Игра позиционируется как пособие по программированию для непосвящённых. Однако, есть один недостаток — это полное отсутствие документации. Полагаю, связано это с тем, что авторы еще не закончили саму разработку и рано переходить к инструкциям, да и сообщество проекта, разумеется, не велико и как заметил состоит, в основном, из состоявшихся IT-шников. По этой причине можно найти кучу статей и роликов где они хвастают своими заклинаниями, но при этом практически полностью отсутствуют инструкции для новичков. А в Рунете и того, ничего нет, даже русификатора. Отсюда и вытекает трудность, игра имеет высокий порог вхождения для тех, к кому по замыслу разработчиков она предназначена. Потому, «юному падавану» лучше запускать её в присутствии преподавателя.
Еще пару слов следует добавить по поводу отсутствия русского языка. Так как нет сюжета, диалогов и даже руководства с инструкциями, неимение локализации в недостатки записывать не стоит. Изучая программирование нужно хоть малость, но владеть английским, так как сам код пишется на нем, да и чаще всего программные комплексы для разработки (IDE) удобней использовать без локализации. Собственно, саму игру можно воспринимать как некую «детскую» IDE.
Изучая механику игры, я планировал написать этакий «Мини-гайд», однако его текст в итоге стал раздуваться на столько, что может потянуть на свой отдельный пост на сайте. Понимая вышеописанную трудность, позднее постараюсь дописать и выложить уже полноценный «Гайд» к игре. А сейчас кратко рассмотрим, что предлагает механика игры.
Пока доступен только один режим — песочница (sandbox). В ней дается небольшой парящий остров, на котором расположены различные активности, движимые и недвижимые объекты, NPC-враги в виде фантастических тварей и т.п. Еще вы можете найти четыре храма стихий, между которыми можно мгновенно перемещаться. Но сначала каждый храм придется посетить. Каждый раз при входе в игру генерируется новый остров, но есть возможность сохранить числовую последовательность понравившегося и вернуться к нему позднее. Как таковых сохранений нет, игра запоминает только ваши заклинания.
В распоряжении игрока персонаж-маг с запасом здоровья в 50 единиц и четырьмя видами маны (земля, вода, огонь, воздух) по 200 единиц. Если быть точнее, то это не совсем запас, а скорее порог, который можно использовать на одно заклинание. Персонаж неуязвим к падению с большой высоты, здоровье может тратиться из-за нападения враждебных существ и от собственных экспериментов с магией. Смерть персонажа не несет каких-либо штрафов, он снова появится в центре карты. В арсенале мага уже будет ряд заготовленных стандартных заклинаний: огненный шар, толчок, телепортация и т.п. Они отсортированы в группы, между этими группами можно переключаться клавишами «Q» и «E», сами заклинания переключаются клавишами от «1-0». Чтобы использовать заклинание необходимо зажать ЛКМ, в этот момент начнут накапливаться необходимые очки маны, чем больше требуется, тем дольше подготовка заклинания. Как только заклинание будет готово, отпустив ЛКМ, персонаж создаст сферу, её поведение будет зависеть от конкретного заклинания. Так «огненный шар» заставит сферу сформировать тот самый шар и отправить его вперед, после чего он взорвется при прикосновении с каким-либо объектом. А если применено заклинание «источник воды», то сфера застынет на одном месте и из нее начнет струиться вода. У некоторых заклинаний есть дополнительное событие, активирующееся после нажатия клавиши «F». Например, огненный шар взорвется в полете, а в заклинании левитации данное действие отпускает схваченный сферой движимый объект.
С управлением разобрались, теперь рассмотрим ту самую возможность создания своих заклинаний. Нажатие «Esc» откроет меню с картой, полным списком уже имеющихся заклинаний и редактором. Редактор предлагает набор инструментов, с помощью которых можно составить блок-схему заклинания.
Стоит отметить, что основой любого заклинания лежит создание сферы, она является основным триггером исполнения корневых функций. А корневыми функциями являются три блока:
- своеобразной «точкой входа в код заклинания» обозначена функция «OnCreate», она исполняется первой, в момент создания сферы;
- еще одна функция «OnHit» выполняется при соприкосновении сферы с каким-либо объектом или поверхностью ландшафта;
- третья функция «OnActivate» исполняется после создания сферы в момент использования клавиши действия «F».
Остальные блоки расположены во вложенных списках в левой части рабочей области. На первый взгляд, блоков не очень много, но их возможности крайне разнообразны. Углубляться в подробности не будем, только кратко рассмотрим, как из них строятся заклинания на примере того же огненного шара.
Как видим, в функции «OnCreate» первым блоком задается скорость сферы «stopped», это обозначает что сфера должна замереть. Следующий блок говорит сформировать на месте сферы огненный шар. Для его поддержания потребуется одна единица маны огня в секунду. Следовательно, указанное число 20 в верхней части экрана, позволит существовать шару 20 секунд. Данный параметр можно самостоятельно поменять, но не забываем, что чем больше маны зададим, тем дольше будет чтение заклинания. Следующий за шаром блок уже интересней. Он расшифровывается так: вызвать функцию с именем «move» через 2 секунды. Что это за функция? И почему через две секунды? Давайте разберемся.
Справа от «OnCreate» расположен еще один блок с именем «move», это как раз та функция к которой обращается блок «SetTimeout». В программировании крайне полезно часть кода выводить в подобные отдельные функции, к которым позднее можно обратиться из любого другого места. Они помогают избежать повторения кода, облегчают поиск ошибок и вообще крайне полезные. В данном случае функция задает скорость движения огненного шара, а вывели её отдельно для того, чтобы обратиться к ней извне через две секунды после создания оного. Ну а причина почему две секунды проста, столько длится время анимации формирования шара.
После выполнения блока «OnCreate», заряженный шар летит по направлению, куда смотрел маг в момент прочтения. Кода шар коснется какого-либо объекта, сработает блок «OnHit». В данном заклинании его функция проста, уничтожить шар и закончить выполнение алгоритма. Того же касается и третий блок «OnActive», при нажатии на «F», шар взорвется в воздухе, не долетев до преграды.
На основании полученных знаний сейчас можно попробовать собрать что-то свое. Допустим нас не устраивает это стандартное заклинание, хорошо бы, если стало возможно корректировать снаряд в полете. Для этого попробуем составить новое, нажав кнопку «New» на левой панели редактора.
Дадим заклинанию название, выберем способ построения блочный (Blockly) и тип «Fire». Держа в голове схему построения стандартного огненного шара, сделаем свой вариант. Установим необходимое количество огненной маны на те же 20 единиц. Но функцию «OnCreate» перестроим: вместо установки для сферы нулевой скорости, можно закрепить её на определенном расстоянии перед магом и заставить поворачиваться вместе с его взглядом. Поставив нужный блок «LockOrb», сфера будет следовать за курсором держась на расстоянии пяти метров, это минимальное безопасное расстояние в случае, если шар взорвётся «в руках». Далее, реализуем запуск снаряда по нажатию «F». Для этого, в функции «OnActive» добавим блоки из стандартного заклинания: формирование огненного шара и вызов функции через две секунды. Но сейчас, так как мы хотим корректировать снаряд в полете, между блоком функции «move» и блоком «OnActive» должна появиться функция посредник «StratMove». Именно её в нашем заклинании через две секунды должен вызвать блок «SetTimeout». А далее, уже функция посредник начнет вызывать «move», но уже не один, а множество раз с периодом в 0.1 секунду. В самой «move» вместо указания скорости полета снаряда, мы изменяем расстояние, на котором должен держаться огненный шар. Итого: после вызова «StartMove», функция «move» будет раз в 0.1 секунду отдалять огненный шар от персонажа на один метр, при этом не отвязывая сам снаряд от курсора. Таким образом мы запускаем снаряд, но при этом можем корректировать его полет. И последнее, чтобы снаряд взорвался и заклинание завершилось, нужно добавить в функцию «OnHit» блок уничтожения шара «DestroyOrb».
Проделав вышеуказанные шаги, получаем нужный результат: корректирование полета огненного шара. Но что если, подготовив заклинание, при прицеливании вы наткнётесь сферой на препятствие? Она ведь исчезнет так и не запустив снаряд. Кроме этого, вдруг мы захотим, как и в случае стандартного заклинания, досрочно взорвать шар клавишей «F». Но её мы уже применили для старта снаряда. Более того, при повторном нажатии на «F» снова сработают блоки для запуска, что чревато неожиданными побочными эффектами (side effects). Чтобы этого избежать, а заодно добавить вышеуказанные дополнительные возможности, создадим переменную и одно условие. В функции «OnCreate» добавим блок переменной, назовем его «isPush» и присвоим значение ложь (false). Следующим шагом внутри функции «StratMove» присвоим этой же переменной значение истина (true). Теперь можно отслеживать был ли запущен снаряд или еще нет. Далее, создадим еще одну функцию с названием «DestroyBall» и поместим в неё блок «если» (if), чтобы выполнялось следующее условие: «если: isPush равна истине, то: уничтожить сферу». Последним шагом нужно убрать все лишнее из функции «OnHit» и установить только один блок, который вызывает нашу новую «DestroyBall». Кроме этого, в функции «OnActive» нужно поставить такой же блок самым первым в списке. Теперь алгоритм заклинания способен понять запущен огненный шар или нет, и в зависимости от этого применять нужные действия: в момент прицеливания сфера не исчезнет, так как условие для её уничтожения не выполнится, а при повторном нажатии на «F», шар взорвется в полете и последующие события после вызова функции «DestroyBall» в блоке «OnActive» уже не повторятся, так как с уничтожением сферы выполнение кода прекращается.
Такими несколько хитрыми действиями и создаются заклинания в игре. Кто уже знаком с программированием, думаю, заметили насколько близко данный процесс походит на настоящее написание кода, а сами блоки повторяют типичные операторы из языков программирования. И это только малая часть, в арсенале еще имеются циклы, логические и математические операторы, возможна работа с векторами, текстовыми сообщениями и даже списками. Все в совокупности, дает возможность реализовать уникальные и интересные заклинания в игре. А игроки, которые до этого были далеки от программирования, разобравшись с данной блоковой системой, буквально, смогут осознать принцип программирования (по крайней мере императивное) и в будущем им станет проще обучаться далее уже на серьезных курсах.
Я же считаю, что на таком пусть и блоковом уровне, но должны учиться и дети в школах на уроке информатики, пусть это будет не полноценная игра, а допустим программа, выполняющая несложные арифметические действия. По моему мнению, в современное время понимание программирования на таком уровне обязано быть у каждого, как в свое время стало массовым чтение и письмо. Человеку не обязательно самому писать программы, но знать основы для лучшего понимания их работы, лишним точно не будет.
Итак, поскольку это «не-обзор» выносить вердикт я не буду, как и рекомендовать или наоборот, предостерегать от ознакомления. Вместо этого, я лишь хочу познакомить с малозаметным, но крайне необычным проектом. Ну и немного порефлексировать на избитую тему деградации индустрии видеоигр. Ведь описанная тут механика отлично может сочетаться в более дорогих и крупных проектах. Самый очевидный вариант, который приходит в голову — TES 5 Skyrim.
Те, кто знаком со «Свитками» со времен Моровинда, полагаю, помнят его систему создания своих заклинаний, потом был тот огрызок от неё в Обливион, ну а в Скайриме нас лишили этой возможности вовсе. А как хорошо могла бы внедриться блок-схемная механика в ней. Конечно поверхностно, но я знаком с «Creation Kit» для TES’ов, в них используется похожий механизм составления заклинаний, только вместо скриптов или блоков, работа с ним напоминает добавление записей в базу данных. Завернуть эти сущности в похожие блоки, как мне кажется, не составило бы громоздкого труда. Например, существует мод с заклинанием телепортации на небольшое расстояние куда смотрит игрок. На сколько помню, составлено оно на основе призыва Атронахов и довольно простое:
- применение - на цель;
- цель –ровная поверхность;
- эффект – призыв существа/объекта;
- объект – существующий: персонаж игрока.
Получается, заменив создание нового объекта «существо Атронах» на вызов существующего «персонаж игрока», вместо призыва получаем телепортацию. А если список свойств расширить, добавив функцию с условием: «если: режим боя = истина, то: повернуть объект на 180 градусов», тогда игрок сможет телепортироваться за спину врага и не терять его из виду. Ну а для ограничения силы заклинаний, вместо разных очков маны в CodeSpells, могут служить очки навыков магических школ.
Согласитесь, такая механика неплохо дополнила бы игру, при этом, так как это второстепенная возможность, игрокам что не захотят в ней возиться она не помешает играть. Но, к сожалению, во времена, когда крупные студии боятся лишнюю копейку вложить в необычный эксперимент, создать и популяризировать что-то новое крайне проблематично. Остается надеется, что авторам «CodeSpells» все же удастся довести свой проект до приемлемого вида, и тогда возможно их концепция «выстрелит» а популярность программирования повысится.