Инди Vadim
1738

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

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

В закладки
Аудио

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

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

Master of Orion II, Impossible, Silicoids, Large

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

что дальше:

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

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

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

Тролль

#gamedev #indie #indiedev #CCG #разработка

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Vadim", "author_type": "self", "tags": ["indiedev","\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430","gamedev","indie","ccg"], "comments": 19, "likes": 66, "favorites": 31, "is_advertisement": false, "subsite_label": "indie", "id": 56650, "is_wide": false, "is_ugc": true, "date": "Sat, 29 Jun 2019 12:03:10 +0300" }
{ "id": 56650, "author_id": 19779, "diff_limit": 1000, "urls": {"diff":"\/comments\/56650\/get","add":"\/comments\/56650\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/56650"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64960, "last_count_and_date": null }
19 комментариев

Популярные

По порядку

Написать комментарий...
5

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

Ответить
2

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

Ответить
2

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

Ответить
1

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

Ответить
0

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

Ответить
1

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

Ответить
0

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

Ответить
0

Эта игра легко переносится в настолку :) Я подумаю над этой идей.

Ответить
0

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

Ответить
0

Напомнило миниигру из M&M9. Поиграл бы.

Ответить
0

Сайт не доступен.

Ответить
0

проверил. все работает.

Ответить
0

У меня нет...

Ответить
0

Работает только через VPN.

Ответить
0

Вопрос: почему PostgreSQL, а не MySQL в качестве БД?

Ответить
0

разницы нет на самом деле для моих целей. У DigitalOcean postgress

Ответить
0

Там же просто сервер устанавливается и ставь что хочешь.

Ответить
0

я выбрал вариант - когда за меня поставят и всякие бэкапы настроят :) $15 в месяц это удовольствие стоит

Ответить
0

Ясно)
Ну я у них брал сервер. Но нашел дешевле - 1тБ за 16 евро в месяц.

Ответить
0

Прямой эфир

{ "remaining": "WzAsMSwyLDMsNCw1LDYsNyw4LDld" } [ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Уве Болл вернулся в кино
и начал экранизировать flash-игры
Подписаться на push-уведомления