В общем-то с детства было у меня желание создавать компьютерные игры и даже как-то в бытность школьником сделал пару поигрушек на Game Maker’е. И тут как-то одногруппник мне предлагает: «давай замутим игрушку, ты будешь программером, а я художником». Придумали идею: платформер(?) про летучую мышку. Осталось выбрать игровой движок, и по первости я решил посмотреть, чего там с Game Maker’ом. Game Maker как был убогим, так и остался, ничего толкового с ним не получилось. Стал искать другой дивжок и обнаружил, что бесплатная версия Unity с некоторых пор практически не имеет ограничений по сравнению с платной. И куча обучающих материалов есть, так что не придётся смотреть на него тупым взглядом как баран на новые ворота. На Unity всё пошло более гладко и вот уже я замутил такую физику движения летучей мыши, что сам был в шоке, нахрена это в простом платформере, зато вспомнил геометрию… но в итоге художник от меня сбежал, решив, что создание графики для игр – это не его. Поэтому та игра была отложена в долгий ящик, а я решил, чтобы усилия на освоение движка не прошли зря, замутить на нём что-нибудь другое, чтобы художник не требовался.
А что можно сделать из простых фигур? Разве что тетрис какой-нибудь. И тут я вспомнил одну из своих любимых игр на Dendy – Magic Jewelry и решил воссоздать её, только в космическом антураже. Летит, мол, корабль по космосу, а двигатели его запутываются радужной энергией, которая получается в радужном реакторе от реакций радужных элементов. А чтобы запустить реакцию, нужно собрать критическую массу – три элемента одного цвета в горизонтальный, вертикальный или диагональный ряд.
Ну а чтобы играть было веселее, нужно придумать какие-нибудь дополнительные правила, чтобы какие-то интересные ситуации позволяли игроку эффективнее расчищать игровое поле и получать больше очков, а значит и больше положительных эмоций от игры. Начал я с того, что составил список – какие особые ситуации могут возникать. А именно:
1. Несколько результативных ходов подряд.
2. Цепная реакция (когда после уничтожения собранной линии образуется ещё одна линия и тоже уничтожается).
3. Одновременное уничтожение двух или более линий разных цветов.
4. Уничтожение пересекающихся линий одного цвета.
5. Переход на новый уровень.
В ситуации 1 я решил добавлять небольшие надбавки к очкам, так, если за уничтожение обычной линии из трёх блоков даётся 300 очков, то за два результативных хода подряд +1 очко. Заодно появляется хоть какой-то смысл в наличии двух младших разрядов в числе очков. А чтобы было интереснее, и та и другая последовательность нелинейны: за линии из более, чем трёх блоков, количество очков возрастает согласно последовательности Фибоначчи, умноженной на сто. Т.е. за четыре блока – 500 очков, за пять – 800 и т.д. (теоретически в результате цепной реакции можно попробовать составить линии из большего числа блоков, но помимо этого есть и другой способ уничтожить сразу много блоков, о котором ниже). А бонусные очки за идущие подряд результативные ходы – это простые числа: 1, 2, 3, 5, 7, 11 и так далее. Так четыре результативных хода подряд дадут на одно очко больше, чем две отдельных последовательности из двух. Мелочь, а приятно.
В ситуации 2 решение было довольно очевидно: умножать все очки за ход на длину цепной реакции. Так, если игрок уничтожил линию из четырёх блоков, что повлекло уничтожение ещё одной из трёх, то за весь ход он получает (300+500)*2 = 1600 очков. Тут уже прирост множителя линейный, но зато это множитель, а не прибавка, и касается он всех очков, заработанных за ход, а значит отлично комбинируется с другими методами, описанными ниже.
В ситуации 3 нужно было что-то связанное с разноцветностью, подумал я, и решил выдавать за неё игроку группу («группа» – это те 3 блока, которыми игрок управляет) блоков «разноцветного» цвета, т.е. которые могут вступать в реакцию с любым другим цветом. Первоначально графически такой разноцветный блок представлялся блоком, каркас которого циклически меняет цвета, а внутри была «капсула» (т.е. такое геометрическое тело, выглядящее как капсула с лекарством) радужной раскраски.
Что касается ситуации 4, тут я рассудил так: ситуация эта определяется, во-первых, одним конкретным цветом пересёкшихся линий, во-вторых, конкретным блоком, в котором они пересеклись. Значит, нужно заспаунить на месте пересечения некий особый блок, причём связанный с этим конкретным цветом. Сначала я обозвал его «заряженным» блоком и выглядел он, как блок такого же цвета, только кристалл внутри пульсировал. Уничтожался он как обычный блок – построением в линию с таким же цветом, а результатом было уничтожение всех блоков такого же цвета на игровом поле (при этом количество получаемых очков всё также вычисляется по последовательности Фибоначчи, это и есть способ уничтожить много блоков, не выстраивая их в линию, о котором я упоминал ранее). Но потом я решил, что так от блока будет мало пользы: для его появления нужно уничтожить порядочно блоков определённого цвета, а для активации – ещё немножко того же цвета, да после этого такого цвета, наверное, и так на поле мало осталось. Поэтому я решил смягчить по крайней мере условия активации и позволить «заряженному» блоку активироваться, как и «капсуле» реакцией с любым другим цветом.
Тут, раз у «капсулы» и «заряженного» блока появилась общая черта, нужно было как-то это выразить, и очевидным решением было сделать каркас «заряженного» блока тоже циклически меняющим цвета. Но выглядело это так себе, и если для «капсулы» это можно было позволить, потому что она в любом случае не жила дольше игрового хода, то «заряженный» блок мог находиться на игровом поле достаточно долго. Так что для начала это переливание разными цветами я заменил каркасом белого цвета. Но сам пульсирующий кристалл внутри тоже смотрелся убого, честно говоря. Поэтому я подумал-подумал, да и поменял его на чёрную дыру. Постойте, скажете вы, но ведь у заряженного блока важной характеристикой является его цвет, а чёрная дыра – она того… ну… чёрная. Верно, но это не значит, что ей нельзя выразить цвет: ведь у неё есть ещё и аккреционный диск, а вот его как раз можно сделать вполне красочным. Ну или по крайней мере цветным. Да и к легенде неплохо подходит: большое превышение критической массы создаёт в реакторе микроскопическую чёрную дыру. Ну а раз «капсула» – это по эффекту своему практически то же самое, только без отдельного эффекта на конкретный цвет, то я вернулся к ней и тоже сделал чёрной дырой, только с бесцветным (серым) аккреционным диском.
Комбинируя эффекты от ситуаций 2, 3 и 4 порой можно за один-несколько ходов собрать неприлично много очков или по крайней мере капитально почистить игровое поле. Но цель моей игры – вызвать у игрока положительные эмоции, а не отрицательные, как сейчас модно (ну там всякие Dark Souls и прочие «это такая крутая игра, что вы в гневе на неё разобьёте свою клавиатуру»… нафиг мне это надо, мне клавиатура моя ещё пригодится, да и психика тоже). А с доставлением положительных эмоций такие моменты справляются лучше всего, и, значит, игрок будет продолжать играть в надежде получить их ещё.
Наконец, случай номер 5. В Magic Jewelry на денди в этом случае давалась группа блоков-черепов, поставив их на блок определённого цвета можно было уничтожить все блоки этого цвета на поле. Но у меня нечто подобное уже происходит в случае номер 4, а повторятся я не хотел. Честно говоря, я уже было решил, что ничего тут больше не придумать, и хотел оставить этот случай без отдельной награды. Но почти в последний момент, когда вся остальная игра была уже готова, меня осенило, и я сделал «звёздные блоки» (рабочее название: «блоки-дрели»). Они должны были уничтожать весь свой столбец и ряд (а так как они идут группой, то 3 ряда). Но от этого было бы мало пользы, если верхняя граница наполненности реактора у игрока более-менее плоская. Поэтому в итоге я сделал, чтобы «дрель» сначала просверливалась до низа игрового поля, а потом уже уничтожала три нижних ряда. Выглядят звёздные блоки как трёхмерные звёздочки, у которых каждый лучик своего цвета, с каркасом чёрного цвета. Почему чёрного? Сначала я хотел сделать белый, но, во-первых, белый каркас у чёрных дыр символизирует, что их нужно поставить в ряд с каким-нибудь другим цветом, а дрель ни с чем в ряд ставить не надо – она сама работает. Во-вторых, как белый контур создал хороший контраст для чёрных дыр, так чёрный контур создал хороший контраст для разноцветных звёздочек. Наконец, в-третьих, уничтоженные дрелью блоки не приносят никаких очков и не активируют свои способности (это касается чёрных дыр с цветными аккреционными дискам), и с этим чёрный цвет тоже неплохо сочетается.
На картинке, слева направо и сверху вниз: маджентвоый блок, синий блок, чёрная дыра с красным аккреционным диском, жёлтый блок, звёздный блок, циановый блок, чёрная дыра с бесцветным аккреционным диском, красный блок, зелёный блок.
А ещё, раз мы в космосе, там должны встречаться всякие космические явления. То цветная туманность по пути встретится (изображена на заднем плане), увеличивая шанс спауна блоков определённого цвета, то корабль пролетает мимо цветной звезды (выражается цветом освещения), удваивая количество очков за уничтожение блоков этого цвета. Бывают и скопления астероидов, бомбардирующие корабль и уничтожающие случайные блоки на игровом поле, и гравитационные аномалии, двигающие блоки на поле куда попало и ломая игроку все планы… но если повезёт, то наоборот – создавая линии даже без его участия. Всё это призвано вносить в игру разнообразие.
Но тупо выдавать подобные явления случайно было бы скучно, поэтому вероятность всех этих событий меняется от уровня к уровню, являясь произведением квадратного корня и синусоиды с разным периодом для разных явлений, которое у меня в коде так и называется BigScaryFormula. По-русски смысл формулы в том, что на каких-то уровнях будет много астероидов, но мало аномалий, на других – наоборот, на третьих – и того и другого навалом, на четвёртых – ни того, ни другого, но при всём этом в целом тенденция к увеличению вероятностей с увеличением номера уровня.
А ещё в Magic Jewelry была классная музыка, ради которой я в своё время в неё и играл. Но то была китайская подделка, и им не надо было заморачиваться с авторскими правами. А я собирался публиковаться (и таки опубликовался) в Google Play, так что не мог позволить себе пойти против закона. Пришлось искать бесплатную музыку. Это, конечно, не это, но что есть, то есть. Вроде удалось подобрать по крайней мере не раздражающую и как будто даже более-менее подходящую. В крайнем случае её громкость регулируется в настройках.
Там же, в настройках, можно включить Google Play Services, чтобы получать ачивки и возможность заливать свои результаты в онлайновую таблицу рекордов. Ведь всем известно, что самое крутое – не проходить игры, а показывать всем в онлайне, что ты это сделал!
И в итоге всё это выглядит как-то так (на самом деле на телефонах и планшетах игра работает в портретном режиме, а видео снято под виндой, потому что хз как на андроиде снимать. Но вы этого гугл-плею не говорите, ок? Это будет наш маленький секрет):