Synthoel's Blog

К списку статей »

О проекте - NetShag

Привет! Вот и пришло время рассказать о проекте, который я замышляю, и который уже начал потихоньку воплощать в жизнь. Нооо, вот так вот сразу я вам не скажу, что же это за проект такой xD. Сперва придётся немного потерпеть и окунуться в предысторию.

Итак, хотя по складу ума я и технарь, меня всегда тянуло на разнообразное творчество. И, как, возможно, и многие в детстве, будучи ребёнком я мечтал однажды прославиться благодаря этому творчеству. Ещё в пятом классе я мечтал когда-нибудь написать книгу, которая станет супер-популярной, и моё имя будет известно каждому. Я даже начал её писать (прямо тогда, в пятом классе), и, конечно, очень быстро понял, что на самом деле это ой как непросто. Поэтому со временем мои амбиции малость поуменьшились, я был согласен даже на умеренную известность. А ещё позже я и вовсе пришёл к выводу, что не особо-то мне эта слава и нужна. Но мне понравилось писать, поэтому я продолжил это занятие, хотя и писал преимущественно “в стол”.

В старшей школе и на первых курсах универа я пытался сочинять рассказы. Получалось, конечно, довольно графоманисто - я ещё тогда это смутно подозревал, а сейчас-то и подавно отчётливо вижу xD. Продумывать характеры героев, их мотивацию, окружающий их мир? Не-а, зачем, это же малая форма прозы. Вдобавок, как подмечали немногочисленные комментаторы, у меня ещё и слог прихрамывал. Однако, лично мне эти рассказы нравились, а некоторые из них нравятся и сейчас. Оно и неудивительно: ведь писал я, по большому счёту, для себя. Кроме того, пара занятных мыслей в этих произведениях, по-моему, всё-таки была.

Если вдруг у вас возникло желание ознакомиться с моими опусами, то сделать это можно здесь. Будьте готовы к тому, что чтиво это, в лучшем случае, по-юношески наивное и максималистское, а в худшем… ну, просто бе-е-е xD. А ещё там за 6 лет разметка отсырела и поплыла местами. Может быть, когда нибудь я перетащу всё сюда, но это неточно.

Примерно в то же время я пробовал ещё и рисовать. Опять же, делалось это абсолютно непрофессионально, рисовать я никогда не учился. Закономерно, что изобразить что-либо “из головы” у меня не получалось - я только срисовывал (в основном персонажей аниме и игр). Конечно, не премину “похвастаться”:

Безымянный инквизиторЭ-э-э, а это из какого аниме?

Чуть побольше примеров здесь. Если вам кажется, что я просто обводил чужие картинки в пейнте, то знайте, что это не так: я обводил свои картинки! Да-да, мне хотелось видеть свои рисунки в цифре, но рисовать сразу на компьютере неудобно, графического планшета у меня не было, поэтому я рисовал на бумаге, фотографировал, и… да, обводил в пейнте xD. Вот так, например, инквизитор сверху выглядел до оцифровки:

Тот же дядька, но нарисованный от руки

Примерно в то же время (ага, снова, вот такое было насыщенное время) я пытался исследовать настоящую компьютерную графику. В универе нам показали пару формул по преобразованию координат, научили рисовать что-то на canvas-е с помощью плюсов. Конечно же, я попробовал запилить какую-нибудь простенькую анимацию, получилось, как по мне, весьма мило:

ДождьЗаценили фирменную иконку? Да, это было сделано в Borland C++ Builder 6

В движении можно посмотреть даже и сейчас, на десятой Винде, при наличии необходимых dll (которые я специально для вас сложил в архив, вместе с непосредственно самой программой). Потом я делал ещё много чего, но именно эта, такая простая, самая первая моя анимация запала мне в душу. Да настолько, что спустя 7 лет, уже будучи более-менее состоявшимся разработчиком, я повторил её, уже на более привычном мне теперь веберском стеке. Будете смотреть - не забудьте посвайпать влево-вправо, а если смотрите с телефона - протестируйте возможность смены персонажа путём потряхивания девайса. “Смена персонажа… путём потряхивания девайса? Почему… зачем?” - спросите вы. Потому, что я мог, ну и ещё

Кумамон знает толк в развлеченияхВо славу Сатане, конечно

И вот, в итоге все эти увлечения, приправленные тягой к творчеству, превратились / эволюционировали / мутировали в желание создать свою собственную игру. Собственно, оно всегда было - ведь в программисты же идут обычно люди, которые хотят делать игры.

Я просто хотел делать игры

Но вот это желание, наконец, полностью оформилось в осознанную мысль. Идей, как к этому прийти, было несколько. Сперва я хотел устроиться в геймдев компанию. В моём городе даже были такие, но им требовались разработчики на C++. Увы, C++ я знал не особенно хорошо, да и вообще ближе к концу универа я решил для себя, что буду прокачиваться в направлении веб-разработки. Геймдев компании, которые делали бы именно браузерные игры, были, конечно, но те, которые я знал, занимались преимущественно всякой, кгхм… ерундой, да, пусть будет это слово, ерундой вроде “колёс Фортуны” и шаблонных “три в ряд”, что было мне не по душе. Можно было бы поискать компании подальше, в других городах, но на тот момент я не был готов к релокации. Так что, эта идея заглохла. Но, может, оно и к лучшему, ведь, судя по моему нынешнему опыту, все девелоперские компании примерно одинаковые - везде могут случиться такие неприятности, как менеджер-мудак, переработки / кранчи, меняющиеся по 100 раз на дню требования… Кто знает, сейчас я мог бы выглядеть, например, так:

Как мокрая соль - не высыпаюсьГарольд Марчин, скрывающий боль

Я, в принципе, примерно так и выгляжу, только ещё и волосы выпали xD. Но работай я в геймдеве - вдобавок и тягу к играм себе отбил бы.

Был этап, когда я пробовал делать игру вместе со своими друзьями. Увы, мы увязли в том же болоте, в котором увязают многие подобные начинания: отсутствии организации. У нас не было лидера, который распределял бы задачи и следил за их выполнением (того самого пресловутого проджект-менеджера). В итоге, хоть личная дисциплина у всех и была на приличном уровне, но дело практически не двигалось. Сказывалось и то, что чёткой и незыблемой идеи у нас не было, и концепция могла поменяться лишь потому, что кто-то из нас увидел какую-то крутую штуку и загорелся идеей добавить её в проект. Были и другие проблемы (несовершенство знаний, отсутствие ассетов, личные обстоятельства). В общем, энтузиазм заглох.

В конечном счёте я пришёл к тому, что делать игру надо самому. На этом пути тоже не обошлось без проблем, но о них пока не будем (там материала столько, что впору отдельную статью написать, а у нас тут и так уже стена текста здоровенная). Ладно, думаю, можно уже наконец и к главной теме перейти, а именно - рассказать о моей игре.

Это будет rogue-like игра (скорее даже rogue-lite, хотя некоторые механики там из классических rogue-like, но в наше время даже саму Rogue классифицируют как rogue-lite, так что, наверное, безопаснее называть свою игру rogue-lite… короче, я запутался). В наличии рандомная генерация лабиринтов и их наполнения, перманентная смерть, вот это вот всё. Но что ещё стоит отметить сразу…

Это будет порно-игра.

Да, именно так. Одна из моих особенностей, о которой я забыл упомянуть в статье о себе - это то, что я, ах и ох, похотливое животное, которому место в horny jail. Не будем вдаваться в подробности, как так вышло, просто примем как данность. Если сейчас вы сидите в недоумении: “Что за фигня, автор? Ты устроил экскурс в своё прошлое на битых полчаса, чтобы потом рассказать, что делаешь порно-игру?”, то… что ж, извините. Извините, что потратил ваше время. Мне правда жаль. Ну а если ваша реакция была ближе к этой:

Отвратительно!Ну-ка, что там ещё…

То продолжим!

Как я уже сказал, игра представляет из себя rogue-li(k/t)e. Сеттинг - типичный фентезийный, но в лоре будут особенности, о которых расскажу потом (как придумаю xD). Персонаж игрока спускается в подземелье, населённое девушками-монстрами. Игрок может взаимодействовать с ними, как с монстрами (например, подраться) либо как с девушками (например, попробовать заняться сексом).

Что уже есть в игре?

1) Генерация комнат

Тут я основательно считерил и использовал готовое решение, предоставленное чудесной библиотекой ROT.js. Она вообще много чего умеет, и существенно сэкономила мне время.

2) Отрисовка лабиринта и его содержимого

ROT.js имеет средства для отрисовки карты и сущностей на ней, но лично мне их не хватило. Поэтому за визуальную часть игры отвечает другая чудесная библиотека - Phaser. Выглядит оно на данный момент как-то так:

Скриншот из игры

Я использую тайлсет из игры Dungeon Crawl Stone Soup - спасибо её авторам за свободную лицензию! Когда-нибудь я закажу свой собственный тайлсет у какого-нибудь художника, но пока вот так (тайлы окружения я, может, ещё и оставлю, но монстров и предметы обязательно заменю, а то сейчас угадать, что это за монстр, по одному его внешнему виду решительно невозможно). Для UI-элементов я прикрутил замечательный CSS-фреймворк RPGUI.

3) Взаимодействие

Вы можете:

  • перемещаться по уровню (1-2-3-4-6-7-8-9 на NumPad-е);
  • переходить на следующий уровень (5, при условии, что вы находитесь на клетке с выходом);
  • поднимать, снаряжать и использовать предметы (снимать снаряжённые предметы или выбрасывать их из инвентаря пока нельзя xD); поднимаются предметы, как обычно, просто перемещением на клетку с ними, а используются клавишей U (use) - нажатие покажет список доступных предметов в консоли, после чего можно будет выбрать один из них, нажав соответствующую клавишу, или отменить выбор через Escape;
  • атаковать монстров (H - hit) или совершать в их отношении действия эротического характера ( ͡° ͜ʖ ͡°) (F - fondle / S - sex); при этом можно выбрать определённую зону - например, ударить в торс или в голову; можно выбрать действие по умолчанию, и персонаж будет выполнять его при попытке движения в клетку, занятую монстром.

Управлять можно только с клавиатуры.

4) Подобие ролевой системы

Я долго изучал различные варианты в надежде использовать какую-нибудь из существующих ролевых систем. Ну, знаете, чтобы не придумывать с нуля расы, классы, характеристики, заклинания и т. д., чтобы не заботиться о балансе, в общем - чтобы не изобретать велосипед. Присматривался к Tiny d10, The Black Hack, даже подумывал про d20 SRD. Потратил кучу времени на изучение разных игровых лицензий. Всё это оказалось либо слишком громоздким, либо совершенно не подходило для одиночного прохождения (а то и для формата компьютерной игры вообще). Как итог - я начал сочинять свою систему. Особой глубины не ждите, но, как по мне, она тут и не нужна.

Итак, у персонажа есть пять основных характеристик:

  • внешность - влияет на поведений некоторых монстров (уродливых персонажей девушки с большей вероятностью будут атаковать - или убегать от них, а с симпатичными охотно займутся сексом);
  • выносливость - влияет на максимальное значение и скорость восстановления жидкостей организма (о жидкостях чуть позже);
  • сила - влияет на физический урон / защиту;
  • либидо - влияет на сексуальный “урон” (количество доставляемого удовольствия) / стойкость;
  • интеллект - влияет на способность к магии (чем выше интеллект - тем более высокоуровневые свитки персонаж может читать).

Текущее состояние персонажа отображается через жидкости его организма:

  • кровь - основной показатель жизненной энергии (можно воспринимать попросту как хитпоинты: если кровь закончится - персонаж умрёт);
  • лимфа - необходима для использования магии (можно воспринимать как ману);
  • сперма - расходуется при эякуляции, её полное истощение тоже ничем хорошим не закончится.

Количество жидкостей в организме может пополняться с помощью предметов, а кроме этого, они постепенно восстанавливаются и сами по себе.

Рас / классов в игре нет, как и уровней - по плану, увеличение силы персонажа должно происходить за счёт предметов, которые он будет находить.

Бой проходит по такой схеме:

  • пусть персонаж А атакует персонажа Б;
  • к показателю атаки персонажа А прибавляется результат броска d20; если получившееся значение больше показателя защиты персонажа Б - это попадание, иначе - промах;
  • если атака попала в цель, персонаж Б получает урон; получаемый урон снижается пропорционально показателю сопротивляемости персонажа (точную формулу давать не буду, но отмечу, что показатель сопротивляемости для каждой зоны свой).

ДнД-шные уши у боёвки не сильно видны? Сильно? Ну и ладно xD.

Может показаться странным то, что выбранная для атаки зона не влияет на шанс попадания, а только на наносимый урон. Я счёл, что этого будет достаточно, так как если бы случилось такое, что у монстра выпадут такие статы, что в определённую зону и попасть будет сложно, и урон туда будет наноситься слабый - это было бы нечестно по отношению к игроку. В любом случае, я слежу за этой составляющей боёвки, и оставил возможность изменить её в будущем.

Кстати, если персонаж бьёт противника по рукам, тот может выронить оружие. А если по ногам - противник с некоторым шансом будет замедлен (станет пропускать часть ходов).

5) Генерация персонажа

Покупать статы за очки - это как-то скучно. Так что я реализовал систему, которую встречал в какой-то из классических rogue-like игр (мне казалось, что это была Omega, но потом я переиграл в Омегу и не обнаружил там такого). Суть такова: перед каждым забегом игроку задаётся один вопрос на тему, никак не связанную с игрой, и предоставляется 4 варианта ответа на этот вопрос. В зависимости от выбора, сделанного игроком, его персонаж получит бонус (или штраф) к определённым характеристикам. Вопросов в наличии пока всего 5, но план в том, чтобы их было что-то около сотни. Игра запоминает, что она уже спрашивала, и не будет задавать эти вопросы повторно, пока не задаст все остальные. Если желания возиться с вопросами нет - игрок может отказаться от них, и тогда его характеристики просто будут набрасываться случайным образом.

6) Монстры (девушки-монстры… монстро-девы?)

Хотя они и не являются полностью разумными, каждой из них я стараюсь (и буду стараться) задавать уникальное поведение. Пока что видов монстров всего два:

6.1) Кошко-девочка. Если её не трогать, она будет просто бродить по подземелью. Если игрок её атакует, или если она увидит, как кого-то атакуют (да-да, тут уже есть просчёт поля зрения - опять-таки спасибо ROT.js) - кошечка покажет когти. Если же проявить к ней ласку, она ответит взаимностью.

6.2) Вампир. Отличается особенной похотью, поэтому, завидев игрока, будет спешить к нему и пытаться заняться с ним сексом. До крови она, правда, тоже весьма охоча, так что, отвлёкши героя своим телом, будет эту самую кровь из него пить. И конечно, если её ударить - сдачи она непременно даст.

Я постарался организовать код так, чтобы добавлять новых монстров и настраивать их поведение было максимально легко, поэтому дальше, как говорится, дело техники.

7) Предметы

Сейчас все предметы в игре делятся на две категории.

7.1) Экипируемые. Сюда относятся, в первую очередь, оружие и броня. Каждый предмет может быть экипирован в один из шести слотов: голова (шлемы), торс (доспехи), руки (оружие), ноги (поножи), стопы (сапоги) и “прочее” (бижутерия). В каждый из слотов может быть помещён только один предмет (так что носить в каждой руке по оружию пока нельзя). Исключением является слот для прочего - колец и ожерелий на себя можно напялить сколько угодно.

7.2) Активируемые. На данный момент из активируемых предметов задумана еда и свитки. При активации дают одно- или многократный эффект. Ах да, забыл упомянуть - как на игрока, так и на монстров могут действовать “эффекты”. Пока что они только влияют на характеристики персонажа, но теоретически могут изменять состояние игры как угодно. Эффекты могут быть как временными, так и постоянными.

Особое внимание следует уделить свиткам. Вся магия, доступная игроку в игре, творится именно с их помощью. В зависимости от того, насколько у персонажа высокий интеллект, свитки будут работать по разному (их эффект может применяться полностью, частично, вообще не применяться, или даже искажаться). Например, Свиток Лечения, будучи прочитанным неправильно, может наоборот нанести увечье.

Число предметов в игре на текущем этапе закрепилось на впечатляющей (нет) отметке в 4 штуки. Не ахти, но опять же, я потратил много времени на масштабируемость - добавлять новые предметы с какими угодно эффектами должно быть достаточно просто, и (смею надеяться) не потребует переписывания половины приложения.

8) Возможность сохранять / загружать игру

Nuff said!

9) Возможность проиграть

Внезапно, да? xD Пока что единственный способ проиграть - это потратить всю свою кровь (и окочуриться вследствие этого). Я ещё не добавил даже какого-либо сообщения о смерти - игра просто выбросит вас в главное меню.

Чего в игре пока нет (но точно будет)

1) Возможность выиграть

Э-э-э, как-то упустил, что это тоже нужно! Пока что просто бродим по подземельям до тех пор, пока не помрём (или пока не надоест, что случится раньше). Но цель (условие победы) в игре будет (нет, не найти амулет Йендора). И цель эта будет непосредственно связана со следующим пунктом.

2) Поименованные неигровые персонажи (NPC)

Гипотетически, это будет так называемая “киллер-фича” моей игры. Помните персонажей из Hades? Они хорошо выглядят (более того, они горячи), они хорошо звучат (ох, Мегера, скажи ещё что-нибудь), они реагируют абсолютно на всё (какое у тебя оружие, кто тебя убил в прошлый раз, чьи дары ты принял) - и при этом их фразы не повторяются (по крайней мере, в первые 30 часов игры)! Представьте себе, что эти персонажи (все, а не только боссы) появляются непосредственно в игре, и с ними можно взаимодействовать не только в диалогах - например, их можно убить… или трахнуть! Да, признаю, я дегенерат, но мне нравится эта идея. Конечно, далеко не факт, что у меня выйдет создать таких же крутых персонажей, как те, что получились у Supergiant Games; более того, слишком самоуверенно с моей стороны будет даже претендовать на этот уровень. Но я буду стараться!

Ну и о том, как финал (цель) игры будет связан с NPC. После того, как игрок пройдёт некоторое количество уровней (скажем, 20), он встретит одну из “девушек с именем”. Её необходимо будет сразить (причём, необязательно делать это именно грубой силой), после чего игрок должен будет решить, как поступить с ней (например, казнить, или, кгхм, “удовлетворить”). NPC будут реагировать на различные параметры игрока и стиль его игры, а также будут запоминать решения игрока, принятые им в прошлых прохождениях. Собственно, встреча с таким персонажем и будет финалом каждого забега.

3) “Взрослый” контент

Естественно, как иначе-то xD. Собственно, он уже присутствует в игре, но только в текстовом виде, а я-то по себе знаю, что всем игрокам хотелось бы картиночек. Картиночки будут, но потом.

В изначальных планах - одна картинка на каждого рядового монстра (с самой знаковой, с моей точки зрения, позицией) и 10 картинок для “боссов” (которые будут открываться по одной-две за каждое успешное прохождение).

Я понимаю, что сейчас это звучит как пустой трёп, и вы думаете: “Да ладно, наобещать можно чего угодно”. Извините, но сейчас мне нечего показать. Штука в том, что, хоть я пытался рисовать, но художником нормальным не стал; в своей игре я хотел бы видеть арты более высокого качества, чем те, что я могу произвести на свет. Кроме того, я хотел бы видеть там оригинальных персонажей, а рисовать таких мне вообще не под силу. Всё это ведёт к тому, что арты нужно заказывать у художника (что я, уверяю, уже совсем скоро сделаю).

4) Больше возможностей взаимодействия

Обязательно появится такое действие, как “бросок”, а вместе с ним и дальнобойное оружие. Улучшится менеджмент инвентаря (предметы можно будет снимать и выбрасывать).

5) Название

Эта статья называется “О проекте - NetShag”, из чего наблюдательный читатель мог бы сделать вывод, что игра будет носить имя “NetShag”. На самом деле, это всего лишь отсылка к великой NetHack, а также к одному видео (что также напоминает о сути игры). Кто знает, может, это действительно станет названием (ведь нет ничего более постоянного, чем временное), а может, я придумаю что-то получше.

Кстати, внутренним именем проекта является Kumano - просто потому, что она моя вайфу (да, я кораблефил). Делайте с этой информацией, что хотите, просто держу в курсе.

Чего в игре не будет вообще (ну, если сильно-сильно захотеть, то, может, и будет, но это вряд ли случится)

1) Локализация

Технически, возможность добавить её есть. И изначально я вообще-то планировал добавить и поддерживать хотя бы два языка (английский и русский), а также предоставить инструменты для добавления других локализаций пользователями. Но на пути к реализации этой затеи возникло несколько проблем:

1.1) Шрифт, который я сейчас использую (“Press Start 2P”, шёл в комплекте с RPGUI), не поддерживает кириллицу. Я искал другие шрифты в похожей стилистике и с поддержкой этой самой кириллицы, но не нашёл (скорее всего, просто плохо искал).

1.2) Извечная проблема с запихиванием текста в предназначенные для него контейнеры (главным образом - кнопки). Не всё можно масштабировать, не везде можно добавить полосу прокрутки, обрезать текст тоже не вариант… С двумя языками ещё можно справиться, но если давать игрокам возможность добавлять свои переводы - наверняка что-то где-то полезет не туда.

1.3) Самое, пожалуй, сложное - “динамические” сообщения. Иногда мне нужно использовать в тексте, скажем, название монстра, с которым игрок взаимодействует. Более того, иногда мне нужно не просто название, а название во множественном числе или в притяжательном падеже. В английском образовать программно нужную мне форму слова не так и сложно - как правил, так и исключений из них не особо много, благодаря чему люди уже давно запилили подходящие библиотеки. В русском же… всё малость сложнее. И не дай Бог вам понадобится просклонять слово…

Короче говоря, сложностей оказалось слишком много уже на начальном этапе, поэтому затея с локализацией отправляется в утиль.

2) Поддержка мобильных устройств

Очень хотелось, честно говоря (как минимум, чтобы расширить потенциальную аудиторию). Но тоже очень сложно. Не технически, нет, скорее с точки зрения пользовательского опыта (UX). Во-первых, уместить все элементы интерфейса в мобильном экранчике, не делая их при этом микроскопическими, весьма проблематично. Во-вторых, действий в игре уже немало (включая контекстные), а будет ещё больше, и как сделать управление с телефона удобным - я не представляю (а делать игру похожей на один из портов Nethack, в котором для любого действия надо открывать виртуальную клавиатуру - я, понятное дело, не хочу).

Итог

Фууух, кажется, я наворотил прямо-таки чёртову гору текста! Честно говоря, я не собирался писать так много, просто поток сознания включился и не пожелал выключаться. Наверняка чему-то я уделил слишком много времени, а о чём-то важном забыл - ничего, вспомню к следующему посту. Да, что ещё нужно отметить: поскольку в этой статье я открыл часть неудобной правды о себе (а именно то, что я извращенец), а я не хотел бы быть horny on main, мне пришлось отретконить предыдущие статьи, убрав из них ссылки на социальные сети, по которым меня можно было легко идентифицировать. Ссылку на репозиторий этого блога я оставил, но сам репозиторий сделал приватным. Помните, как я обещал, что вы сможете оставлять свои пулл-реквесты?

Я лгал

Что касается игры: она далека даже от версии “альфа”, но всё же, я оставлю здесь ссылку на скачивание текущего билда (исключительно для любознательных потомков). Она также уже есть на itch.io (где я впоследствии планирую её зарелизить), но ссылку я не дам, потому что ещё слишком сыро.

Я постарался описать, что в игре уже есть, и что там когда-нибудь будет. Как и было сказано в прошлом посте, над этим проектом я собираюсь работать ещё достаточно долго, и мне очень хотелось бы довести его до конца. Пока что я не могу посвятить игре всё своё время (мне всё ещё приходится зарабатывать на жизнь и поддержку семьи кодингом в вебдев-конторе), из-за чего дело движется крайне медленно. Но, как говорится, тише едешь - дальше будешь, так ведь? Когда-нибудь я надеюсь устроить себе крупный творческий отпуск - тогда-то можно будет и заняться проектом “full-time”, но пока это всё лишь мечты.

На сегодня у меня всё.