Простая коллекционная карточная игра

Всем привет! Меня зовут Вадим, и я разработчик игр - любитель. Инди разработчиком меня назвать нельзя, так как я на играх не зарабатываю. А PRO я был (работал в игровой студии) - последний раз больше 15ти лет назад. С тех пор и мир поменялся, и игры…

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

Но иногда, появляется желание, с которым уже не возможно бороться. Так случилось, что неделей ранее у меня начался отпуск. Очередная партия в Master of Orion II на уровне impossible закончилась сокрушительным поражением компьютера.

Master of Orion II, Impossible, Silicoids, Large
Master of Orion II, Impossible, Silicoids, Large

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

Первым делом был написан диздок. Какая же игра без диздока? Он включал в себя описание правил игры и занял полстраницы. Если коротко - то я собрался делать довольно простую карточную коллекционную онлайн игру со следующими правилами:

  • У Игрока есть колода из 20 карт из них 3 карты на руке.
  • Каждый раунд игроки играют по одной карте с руки.
  • Выигрывает раунд игрок сыгравший сильнейшую карту. Она возвращается ему в колоду. Проигравшая карта из игры выбывает.
  • Сила карты определяется ее природой и различными бонусами.

Выглядит достаточно просто, не так ли?

Неприятности, поджидающие разработчика с диздоком в пол-страницы
Неприятности, поджидающие разработчика с диздоком в пол-страницы

В качестве платформы для разработки была выбрана Unity (бесплатно, стильно, модно, молодежно, работает всюду - по крайней мере мне так казалось). Сервер решено было делать на Node.js (С\С++ подзабыл, Java не знаю, да и с хостингом для Node.js как показала последующая практика - проблем нет).

Разработка пары классов поверх TCP\IP протокола, которые подружили C # от Unity и node.js не заняла много времени. И вот, к концу первого дня разработки между клиентом и сервером забегали первые пакетики.

Доброе Привидение
Доброе Привидение

Следующим шагом я заставил двух ботов играть на сервере друг против друга, и только потом начал реализацию клиента. Тут на помощь мне пришел великолепный Арт от Сергея Кныша:

Раз на Арт приятно смотреть - значит и работать с ним - приятно :) Карты придумывал и балансировал исходя из нарисованных картинок. Крыса сильнее Скелета, который сильнее Разбойника, который сильнее Шакала, который (вы не поверите) сильнее Крысы. Драконы самые сильнее и всех победят... почти.

Так как времени было совсем мало (одна неделя), а сделать предстояло достаточно много то приходилось следовать некоторым простым правилам:

  • Как можно реже запускать игру. Любой запуск для проверки написаного когда удлиняет срок разработки. Поэтому пишем код фичи от начала и до конца. На клиенте, на сервере. Запуск только после того, как фича полностью готова.
  • Не тратить время на отладку. Т.е. писать как можно более простой код, в котором, даже если и будут ошибки - их природа ясна будет сразу.
  • Срезать углы где только можно. Если рассматривать любую игру ААА класса - то можно увидеть с какой любовью там сделаны анимации любого вашего действия - будь то клик по кнопке или переход между менюшкам. В моей игре этого пока не будет.
  • Если где-то случался затык, переключаться на другую, задачу. Проблему “затыка” обдумывать в свободное от программирование время - например лежа на пляже и глядя на закат.
  • Стараться не изобретать велосипеды, гуглить и копипастить решения типичных вопросов.

Следуя своим же правилам, первый раз поиграть в игру я смог где-то день на третий после начала разработки. Попробовал, понравилось, но второй раз играть не стал, а продолжил разрабатывать!

cкриншот карты из игры: Шакал - карта природы, +2 при атаке магических существ и -1 против Войнов. Т.е. любой завалящий парень с дубиной его победит, в то же время маги - разбегутся в панике!
cкриншот карты из игры: Шакал - карта природы, +2 при атаке магических существ и -1 против Войнов. Т.е. любой завалящий парень с дубиной его победит, в то же время маги - разбегутся в панике!

Первая серьезная проблема меня ждала, когда я попытался запустить сервер в интернете. Дело в том, что я криворукий программист, а вовсе не DevOps. Последний раз линуксом баловался 20 лет назад. К счастью, Google меня до сих пор не забанил за нубские запросы, поэтому я смог “купить” сервер на Digital Ocean, подключить базу данных (Postgress), проапгрейдить версию node.js до последней, организовать забор исходного кода с GitLab. Наверное, стоило заморочиться с Kubernetes и continuous deployment - но это уже совсем высший пилотаж.

Естественно, игровой сервер не заработал :) Вернее он заработал, но был не доступен. Разумеется, я тут же полез настраивать файрволл и минут через 15 мне стал недоступен еще и сам сервер. Гугл помог и в этот раз. Дополнительный час танцев с бубном и оказывается что дело на в файерволе, а в том, что игровой сервер работает только с локальными подключениями. Одна строчка когда, а столько проблем…

Но беда не бывает одна: в WebGL нельзя работать напрямую с TCP\IP. Наверное, если бы я думал, прежде чем делать - то и сам бы догадался, что чудес в мире не бывает, но непоколебимая вера в кроссплатформенность Unity затмила мой разум. К моему счастью есть WebSockets. Опять Гугл. Опять поиск подходящего решения. Сотня дополнительных строк кода, несколько часов и вот, наконец, моя игра заработала в браузере и присоединилась к удаленному серверу.

Чем ответить на Летучую Мышь? Грабитель ее победит, у Скелета будет ничья, а Крыса проиграет...
Чем ответить на Летучую Мышь? Грабитель ее победит, у Скелета будет ничья, а Крыса проиграет...

Сегодня ровно неделя как я начал разработку этой игры и в нее уже можно поиграть здесь http://taucraft.com/wwc/index.html

Еще остались ошибки и множество недочетов, но есть рабочая платформа, которую можно будет потихоньку развивать в свободное время под настроение.

что дальше:

  • попробую запустить игру под какую-либо платформу. Чтобы был постоянный поток новых игроков.
  • ВСЕГДА есть идеи по развитию геймплея (мета игра, больше контента, гильдии, рэйдбоссы, квесты)
  • Может быть наконец соберусь монетизировать игру, чтобы гордо называться Инди :)

с удовольствием отвечу на ваши вопросы в комментариях.

Спасибо, что прочли!

Тролль
Тролль
6262
19 комментариев

Молодец, Вадим! Очень грустно когда игры идут в стол и не видят белого света. Желаю успеха и, самое главное, радости от процесса и конечного результата =)

5
Ответить

Интересно, каким вообще людям нравится имя «Вадик»?

3
Ответить

Отлично, Hearthstone больше не нужна.

2
Ответить

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

1
Ответить

Поиграл, работает норм. А в чем фишка? На первый взгляд, игры как таковой - нет. Можно подсвечивать карты, которые побьют (или сыграют вничью) с картой противника и тогда от игрока вообще ничего не потребуется, практически. Это, кстати, было бы хорошее UI-решение.

Ответить
Автор

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

1
Ответить

Зависла игра.

Ответить