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



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


Оглавление
  1. Предпосылки
  2. Выбор платформы и инструментов взаимодействия
  3. Начало разработки
  4. Баланс ресурсов
  5. Военный баланс
  6. Выгрузка на живые сервера и обновление
  7. Спустя 5 месяцев
  8. Техническая часть
  9. Ответы на вопросы
  10. Итог



Предпосылки


После нового года я был в поисках интересного проекта. В свободное время я почитывал joyreactor, и наткнулся на интересную игру, которую проводил с аудиторией всего сайта один парень, под ником AlanWake. Игра представляла из себя комикс с вариантами развития, за которые голосовали посетители + свои варианты в комментариях. Победивший вариант получал развитие. После пары выпусков появились «фанатские» версии этой вселенной, и в итоге всё вышло из-под контроля. К седьмому выпуску уже сам автор запутался в том, что происходит, т.к. не было никакого контроля, а фанаты хотели, чтобы дополнительные истории так же учитывались.
В восьмом выпуске «Канал связи закрылся».
За всего пару недель игра собрала больше четырёх тысяч подписчиков. Я написал автору с предложением разработать полноценную игру и посмотреть, что из этого выйдет.


Выбор платформы и инструментов взаимодействия


Перед нами стоял выбор: браузер, мобильное приложение, Steam (или любая другая площадка) игра.
Взвесив все за и против, выбор пал на браузерный вариант: работает на большинстве устройств примерно одинаково, впоследствии игру можно конвертировать в приложение (как мобильное, так и настольное), да и для начала игры требуется минимальное количество действий.
В качестве инструмента взаимодействия друг с другом выбрали realtimeboard — онлайн доску, на которой можно писать текст, размещать картинки, рисовать и всё это удобно связывать друг с другом. Файлы же синхронизировали через папку в дропбоксе.
Игра начала обретать структуру.



Мы довольно быстро определились с требованиями и форматом игры.
Обсудили массу схожих игр, постаравшись выделить самое лучшее, убрав неприятные моменты.
Требования:
  • Это PvE игра.
  • Игра циклична (цикл примерно год). За это время игроки либо побеждают, либо проигрывают (все)
  • Игра должна идти размеренно, что бы было время рисовать комиксы между событиями
  • Игра не должна требовать постоянного присутствия и поднятия по будильнику, при этом снабжая контентом тех, кто хочет больше.
  • Пожертвования не должны значительно влиять на геймплей, приоритетно декоративные
  • Дополнительные аккаунты не дают преимуществ
  • Игра должна нравится нам самим



Начало разработки


За пару дней был сделан прототип на node с bootstrap’ом, в котором была возможность зарегистрироваться, строить шахты и радоваться притоку ресурсов. Когда стало ясно, что двигаемся в нужном направлении, я решил, что буду разрабатывать всё на новом для меня meteor (как оказалось впоследствии, не зря), аргументировав это тем, что даже если с игрой будут проблемы, то, как минимум, будут хорошие знания новой технологии.
Развернул рабочее окружение, поставил метеор и начал писать.
Метеор мне сразу понравился:
  • Развёртка одной командой
  • Множество готовых библиотек, подключаемых легче, чем когда либо (в прочем, на ноду не сильно сложнее)
  • Автоматическое обновление страниц, при изменении контента (даже картинок)
  • Бьютифаер/углифаер кода, в зависимости от окружения
  • Средства для дебага
  • Возможность писать в БД из консоли браузера (отключаемое для продакшена)
  • Разбиение кода на Клиент, Сервер и Общее.
  • «Реактивность». Моментальное отображение изменений в базе у всех клиентов.


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


Баланс ресурсов


Спустя какое-то время пришло время просчитать баланс. Со «сроком» игры мы определились сразу, так что именно это время бралось за основу. Максимально через год у пользователя уже должно быть «всё». В принципе капа можно достичь и значительно быстрее, но в целом расчёт был на обычных пользователей.
Для расчёта стоимости строений они были выписаны в таблицу, им был указан максимальный уровень указаны стоимости «от балды». Написал простенькую экспоненциальную формулу для расчёта добычи. Были пожелания по начальной и конечной (на последнем уровне) добычи — их брали просто из головы, как «комфортные» цифры.



После того как всё было занесено в таблицу хоть в каком-то виде, начал подбирать коэффициенты для стоимости и добычи, смотря как меняются цены и время строительства (от первого до последнего уровня), подбирая примерно так, чтобы требовали около 4 месяцев вне зависимости от других факторов.
Как только коэффициенты были подобраны, получился ожидаемый график развития. Ещё немного подкрутили цены, формулу и можно внедрять!
Я сразу же постарался заложить возможность варьировать баланс, в зависимости от тестов, т.е. увеличивать/уменьшать количество уровней влияя на «плавность» развития, при этом сохраняя начальные и конечные значения.
У нас есть три основных ресурса (люди, металл, кристалл), и два дополнительных (честь, грязные галактические кредиты). В зависимости от стадии игры ощущается нехватка тех или иных ресурсов (кроме кредитов), но, если грамотно спланировать всё (что удалось некоторым нашим тестерам) можно развиваться практически без простоев.


Военный баланс


Битвы у нас разделяются на два типа: наземные и космические.
В наземных напрямую поучаствовать нельзя — это прямая сюжетная линия. На Землю можно отправлять войска, они присоединяются к объединённой армии всех игроков. Передвижения этой армии контролируются ежедневными опросами всего сервера.
На текущий момент есть по 10 видов юнитов с каждой стороны. У каждого юнита есть параметры атаки, защиты, приоритеты атаки, а также особые характеристики (атакует/не атакует воздушные цели, триггерные способности и т.п.). Для успешных операций необходима хотя бы минимальная координация игроков сервера, чтобы отсылать необходимые для ближайших боёв подкрепления, в зависимости от типа точки и видов противников.
Космические же наоборот, индивидуальны для каждого игрока.
На текущий момент есть по 4 вида кораблей + флагман, а также торговое судно.
Баланс высчитывался схожим образом. Т.е. за основу брали стоимость, и снабжали её характеристиками, добавляя бонусы.
Так же в космосе сделали разделение по миссиям. Можно выбрать тип и уровень миссии, посмотреть примерное количество войск (как в третьих героях) и в бой.

Ах, да. Как решить вопрос со вставанием по будильнику что бы спасти флот? Легко. Сделайте так, чтобы флоту игрока так или иначе был Конец, и, конечно же впишите это в геймплей.


Выгрузка на живые сервера и обновление


После создания файла настроек для Meteor Up выгрузка обновления представляет из себя всего 1 команду:
mup deploy

Всё. Метеор сам загружается на продакшен, обновляет файлы, запускает нужное количество процессов, сам перезапускается, если упал и обновляет всё на клиентах.


Спустя 5 месяцев


В игру уже можно более-менее играть. Здания строятся, ресурсы капают, задания выдаются, флоты летают, армия строится. Пришло время заявить о себе.
Было решено в качестве старта запуститься на бумстартере, т.к. аудитория изначально исключительно русскоговорящая. Пару недель готовили, склепали ролик на коленке и запустились.



Первые два дня это пост о новости для ключевой аудитории — «конверсия» 1 к 5. Т.е. каждый 5 посетивший страницу на бумстартере сделал вклад.
Дальше интересно, но, в принципе, ожидаемо. Публикации на различных новостных ресурсах, в игровых пабликах и т.п. — конверсия близка к нулю. Т.е. основной эффект был от заранее подготовленной аудитории. От остальных — почти нет.
Всплеск через пять дней — выход очередного комикса на реакторе.



На текущий день зарегистрировано 365 пользователей. Онлайн, в среднем, держится в районе 75-150 человек.



Загрузка превышает 5% только в момент обновления. Высокие скачки потребления и времени ответа — обновление игры, равносильно тому что все разом нажали F5 со сбросом кеша. По предварительным подсчетам сервер должен выдерживать до 5 000 человек онлайн без сбоев, при условии, что обновления будут приходится на малый онлайн.
Буквально вчера в результате сбоя процессы падали в течении секунды и вновь поднимались, загрузка выросла до 50%, но при этом на саму игру это не повлияло никак, за исключением пустого списка участников в чате. Т.е. даже в критической ситуации система достаточно стабильна.

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



Кстати, вот эта большая часть справа — правки и предложения от пользователей. Хотя, вероятно, не корректно сравнивать, т.к. тексты и описания мы не размещали на доске, но всё же.


Техническая часть


В метеоре очень удобно разделение кода: клиентская часть (client), общая часть (lib) и серверная (server). Общая часть доступна в обоих частях проекта равнозначно, что позволяет положить в неё все основные объекты игры, которые требуются и там и там.



CSS

Для стилей я использовать Stylus, потому что он мне очень нравится. Во-первых, у него приятный синтаксис, из которого убрано всё лишнее, а во-вторых он собирается в css на ноде, без каких-либо дополнительных языков. Ну и готовый модуль пересобирает и подгружает на страницу стили прямо на лету. Стили разбиты по релевантным файлам, но самый «жирный» main, из него ещё не всё разнесено — время рефакторинга ещё придет.

HTML

Все шаблоны пишутся для шаблонизатора Spacebars, встроенного в метеор. Я не очень люблю logicless шаблонизаторы, и пришлось мириться с рядом моментов. Я считаю что должна быть возможность описывать всё, относящееся исключительно к внешнему виду прямо в шаблонах. Для каждого простейшего сравнения необходимо заводить хелпер. Даже для обычного сравнения:
UI.registerHelper('eq', function (a, b) {
	return a === b;
});

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

Роутер

Для определения путей приложения использовал iron router. Довольно удобный и добротно сделаный роутер, позволяет навесить определённые действия на переход по ссылке, достаточно гибко позволяет описывать пути, даёт возможность передать нужные данные сразу в шаблон, а не только через хелперы.
Router.route('/logout', function () {
	Meteor.logout();
	this.redirect('index');
});


Контроллеры

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

Игровые объекты

Есть класс Item, содержащие совсем базовые данные, которые есть/могут быть у каждого объекта: имя, описание, требования, эффекты. Так же содержит базовые методы, такие как price(), currentLevel(), meetConditions(), has() и т.п.
От него уже наследуются объекты с дополнительным/изменённым поведением: GlobalItem, Building, Unit, EnemyUnit, Hero, Research, GlobalResearch.
Объекты с приставкой Global являются общими на весь сервер, и реализуют соответствующие механики общих вложений в исследование/героя.

Система эффектов

Мне крайне нравится система эффектов, которую удалось сделать. Каждый объект может обладать одним, или несколькими эффектами. Эффекты разделаются на 4 типа: влияющие на добычу, влияющие на цену (и время), влияющие на боевые характеристики, а также специальные эффекты, которые уникальны.
Вот пример описания эффекта одного из улучшений:
new Game.Effect.Military({
	pretext: '+',
	aftertext: '% к броне пехоты',
	condition: {
		type: 'unit',
		group: 'ground',
		special: 'infantry'
	},
	priority: 2,
	affect: 'life',
	result: function(level) {
		level = level || this.currentLevel(); 
		return level * 30;
	}
})


Можно описать текст до и после значения, описать объект, к которому применим эффект по ряду критериев (если не указывать ни одного критерия — эффект действует на всё, на что применим). Приоритет — порядок при вычислениях итогового значения: нечетные приоритеты имеют фиксированые значения, четные процентные. Т.е. если у нас есть эффект, который дает +10 брони с приоритетом 1, а потом эффект, который дает 30% с приоритетом 2, и после него ещё один +5 с приоритетом 3, то в итоге получим (базовая броня + 10) * 1.3 + 5.
Если есть несколько эффектов с одинаковым приоритетом — они сперва суммируются, и уже затем применяются. Например, 2 эффекта по 10% дадут множитель (1 + (0.1 + 0.1)).
Специальные эффекты могут влиять на уникальные параметры игры, например, снижая время перезарядки гипердвигателей (встречается всего в 1 месте).

Таким образом мы реализовали гибкую систему взаимодействий строений, улучшений и всего остального.
Можно получить список эффектов, применимых к объекту, и работать с ними как вздумается. Например, вывести из чего составляется приток населения.
Задания
Мы разделили задания на: линейка заданий, тригерное задание, ежедневное задание. Крутейшей особенностью в плане реализации является то, что я могу привязаться абсолютно к любому событию в игре, как-то на выдачу задания так и условия выполнения.
Достигалось это простым способом — задание имеет функцию, возвращающую true/false, выполнено ли задание. Например:
isDone: function() {
	return Game.Buildings.has('residential', 'house');
}

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

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

Работа с базой

По умолчанию метеор поставляется с MongoDB. Это очень удобная документо-ориентированная бд. Легко масштабируется, легко писать запросы, легко модифицировать. Хранит все данные в JSON, и, не имея строгой структуры, позволяет добавлять/убирать поля на лету, благодоря чему, по сути, миграции не требуются (за исключением случаев, когда новые поля старых записей надо заполнить значениями).
Для работы с определённой коллекцией я заводил отдельный класс, и всё что требовалось — гнал через него. Например, для списания ресурсов достаточно вызвать Game.Resources.spend(price);


Ответы на вопросы


Почему браузерная? Я думал браузерные игры вымерли.

1) Я знаю возможности браузера лучше чем других платформ
2) Работает на большинстве устройств без дополнительной доработки.
3) Возможность собрать полноценные приложения в будущем без больших трудозатрат

Вам хватит 200 000 рублей что бы сделать игру?

Игра уже на стадии бета тестирования. Этих средств нам хватит что бы выпустить все запланированные компоненты.

Что будет если вы не соберете средства?

Будем искать инвестора.
По сути без рекламы мы собрали неплохую стартовую аудиторию, а это уже что-то да стоит.

Когда полноценный запуск и что там будет?

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


Итог


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

Спец код для тех, кому он нужен: «Habrahabr». потрачено

Буду очень рад ответить на любые вопросы касательно разработки и дополнить статью.
Если у вас нет хабра-аккаунта, но есть вопросы:
Почта: zav.work@gmail.com
Skype: Zav_39

Спасибо за внимание.

Комментарии (72)


  1. berezuev
    25.08.2015 16:37
    +2

    Поражен вашим упорством. Надеюсь, у вас все получится. Хотя, особо в этом и не сомневаюсь.
    Но, сразу небольшой фидбэк:
    1) Выделите из 200к денюжку на нормальную верстку: шрифты нормальные, убрать треш типа такого https://habrastorage.org/files/277/f71/ebc/277f71ebc6284b5bbd78686f0afda00b.png (для непосвещенных, красная рамку я НЕ дорисовывал)
    2) Сделайте при первом входе некую обучалку (типа, нажмите сюда, затем сюда, и т.д.)


    1. Zav
      25.08.2015 16:44

      1) Верстку я сам поправлю. Т.к. следить надо было сразу за всеми частями, некоторые моменты сделаны хуже, чем хотелось бы.
      2) К релизу будет, уже в планах

      Спасибо!


  1. Anstak
    25.08.2015 18:05
    +1

    К сожалению не нашел ссылку на игру, можно как-то посмотреть?


    1. aleks_raiden
      25.08.2015 18:11
      +4

      я не автор, но — consulwar.ru


      1. Arkham
        26.08.2015 03:41

        И на всякий случай, если захотите поддержать авторов: boomstarter.ru/projects/zav/57753


    1. Zav
      25.08.2015 18:17

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


      1. aleks_raiden
        25.08.2015 18:23

        признаюсь я заботливо статью сразу сохранил в PDF ибо каждый такой материал на вес золота и очень нужен. А уж с остальным разберемся )


        1. Zav
          25.08.2015 18:54

          Спасибо


      1. tas
        26.08.2015 10:00

        За ссылку меня в бан уже отправили :-) Еле упросил что бы без ссылок опубликовать после этого.


        Сталкивался с такой-же ситуацией. Мне пояснили следующее:

        Если хотите разместить ссылку на свой сайт в тексте публикации — то это можно сделать в категории «Я пиарюсь». Если категория другая — делаете публикацию без ссылки и добавляете ссыль в комментарии.

        Так что за комментатора выше можно быть спокойным :)


  1. AtomKrieg
    25.08.2015 18:30
    +1

    Крокодил за заставке — копия ренектона из лола практически 1 в 1. Как так получилось?


    1. MuhaMed
      25.08.2015 18:41
      +1


    1. Zav
      25.08.2015 18:41

      У нас много чего так получилось с отсылкой к другим вселенным :-)


  1. MuhaMed
    25.08.2015 18:37
    +12


    Отношение к пользователям…


    1. Zav
      25.08.2015 18:40
      +5

      Извините если это оскорбило лично вас.
      В целом вся игра в таком стиле, присутствует ненормативная лексика и остальное.
      Так что если пользователю не нравится сначала — экономит время нам обоим :-)
      Спасибо.


      1. Duke565
        25.08.2015 20:15
        -4

        Промахнулся…


      1. Duke565
        25.08.2015 20:15
        -3

        Да блин, второй раз промахнулся.


    1. Duke565
      25.08.2015 20:16
      -5

      У них своя тема.


    1. stychos
      25.08.2015 21:17
      +2

      Отличное отношение! Сразу видно, что игра делается людьми и для людей, официоз в играх бесит.


    1. Grammidin
      26.08.2015 09:24
      +2

      Тут явно виден стеб над современными лэндингами, какие могут быть обиды?
      Мне больше понравились «отзывы игроков» :)


    1. leMar
      26.08.2015 09:56

      На странице support разместите «Нам наплевать на вас. Нет, правда.»


      1. Zav
        26.08.2015 09:57
        +1

        В техподдержке вас всегда поддержат или дадут ответ (я).
        Отвечаю 100% всем.


  1. webhamster
    25.08.2015 21:19

    Скажите, где вы всему этому научились? Весь проект в одиночку/вдвоём — это очень круто.

    Картинка со схемой игры — это то что вы держите в онлайне рисовалке через которую синхронизируете работу?


    1. Zav
      25.08.2015 22:27

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

      Картинка со схемой — да, по ней смотрим основные изменения и проверяем связанность частей.


      1. Temirkhan
        25.08.2015 23:22

        Судя по Вашему резюме, Вы полный псих. Это не просто мимикрия — Вы прекрасно понимаете, что и зачем делаете в стеке тесно и не очень связанных технологий. Sad but true: specialization is for insects. Я в востороге


        1. Zav
          26.08.2015 00:32

          Спасибо :-)


      1. MaxFactor
        25.08.2015 23:25

        Выложи побольше принскринов игры, чтобы людям посмотреть, что получилось.


        1. Zav
          26.08.2015 00:26

          Меня за это забанили как раз :-) Иначально в после были
          Может отдельный пост в «Я пиарюсь» сделаю. Этот хотел более техническим сделать.


  1. vvnick
    25.08.2015 23:31

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


    1. Zav
      26.08.2015 00:29

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

      Хочешь скрипт? Да пожалуйста. Скажи нам — мы постараемся включить этот функционал в проект и так :-) Или изменим механику.
      Игра, всё же, для удовольствия, а не для рутины.


      1. HomoLuden
        26.08.2015 14:09

        ZPG классная тема тема, ИМХО. Нужно лишь создать условия, в которых и ботоводам и очным игрокам было одинаково интересно.


  1. aylo
    26.08.2015 08:25

    Meteor! Отлично! Для своего проекта тоже использовал метеор и нисколько не пожалел. Удачи вашему проекту.


  1. n0ne
    26.08.2015 09:43

    Вы — молодец (-:
    Хотелось бы ещё какое-то описание серверной части, железячной стороны
    А для шаблонизатора гляньте на handlebar-helpers…


    1. Zav
      26.08.2015 09:54

      Spacebars это тот же handlebars, только подкрученный под метеор :-)
      По серверной части всё просто — VPS'ка 4 ядра, 4гб оперативы. Я тут не так силён что бы что-то расписать хорошо.
      А по серверной части что узнать бы хотели?


      1. n0ne
        26.08.2015 10:05

        Так и я о том же, просто там уже полно хелперов и не надо свои писать, типа Вашего «eq», я об этом (-:
        Собственно это я и хотел узнать — примерные параметры сервера, который должен выдержать 5000 он-лайн (-:


        1. Zav
          26.08.2015 10:16

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


  1. NeX
    26.08.2015 12:07

    подскажите, а какой софт используется для мониторинга сессий, CPU, Response time (на скриншоте)?


    1. Zav
      26.08.2015 12:11
      +1

      kadira.io
      Я использую бесплатную версию.
      Но, судя по всему, она мне выдает не совсем корректную информацию.
      На скриншотах написано 21 session/host — я не совсем понимаю что имеется ввиду.
      Приложение запущено на 4 ядрах, т.е. 4 инстанса. На момент снятия скриншота онлайн был около 90 человек.
      Вероятно показывает нагрузку только одного ядра, а остальное платно :-(
      Выбрал его, т.к. подключался за пару команд.
      А так для ноды очень удобен keymetrics.io например. Он круто интегрируется с PM2 и позволяет свои метрики выплевывать в реальном времени.


  1. yparah
    26.08.2015 13:14
    -1

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


    1. Beltoev
      26.08.2015 13:27

      Учитывая, что статья не в хабе «Я пиарюсь», всё довольно-таки логично. Описывается ведь не сама игра, а процесс.

      Ну, а если появилось желание попробовать — разве жалко отдать 100 рублей для доступа к бета-тесту?


      1. ruslanys
        26.08.2015 16:13
        +1

        уже 1000 %(


        1. Beltoev
          26.08.2015 16:26

          Это как же не внимательно нужно читать, чтобы такое не заметить:


          1. ruslanys
            26.08.2015 16:30

            Что-то поменяли. По указанной ссылке предлагали купить акции, 1 за 1000р.

            UPD. А, ясно, предлагали купить акции Boomstarter. А переход на страницу описанной браузерной игры был недоступен, что ли.


            1. Beltoev
              26.08.2015 16:31
              +1

              Не путайте акции бумстартера с вложениями в проект игры


              1. ruslanys
                26.08.2015 16:32

                Да, так и есть. Почему-то до этого не открывалась страница поддержки описанного проекта(


    1. Zav
      26.08.2015 13:57

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


  1. domix32
    26.08.2015 13:22

    А texic вам что-то рисовал или просто помогает с рекламой?


    1. Zav
      26.08.2015 13:58

      Он размещал информацию о нас у себя и так же играет :-)


  1. gigimon
    26.08.2015 13:24
    +1

    Расскажите, как вы делаете анимацию с метеором? Или вы не исопльзуете реактивность для анимации?


    1. Zav
      26.08.2015 13:59

      А в чем проблема?
      Я не пытаюсь потролить или ещё что то.
      Просто скажите какой-нибудь более конкретный момент, а я отвечу как можно сделать анимации в нем.


      1. gigimon
        26.08.2015 14:14

        Я сам не делал, но почитав ru.discovermeteor.com/chapters/animations мне показалось, что анимации достаточно сложны в реализации, если дело касается реактивности. Ну и с spacebar я слабо представляю, как добавлять новый полученый элемент в шаблон с анимацией (если читать только оф доку)


        1. Zav
          26.08.2015 14:17

          Я такие анимации не использовал.
          На самом деле тут особо не отличается от других подходов — отловил событие — заанимировал :-)
          Просто по умолчанию сразу идет отрисовка. Это, так сказать, отключается.


          1. gigimon
            26.08.2015 14:19

            мм, а как вы отключаете? Или вы в iron-router и before action делаете манипуляции?


            1. Zav
              26.08.2015 14:24

              Банально можно не писать реактивно, то, что не должно быть реактивно.
              Т.е. если есть часть страницы, которая заполняется с анимациями, в шаблоне мы можем оставить её пустой.
              Далее в коде повесить событие на получение/изменение данных на странице — и уже работать с этим так же как и без метеора.


  1. ruslanys
    26.08.2015 17:02

    Ну теперь я обязан попробовать Meteor...)


  1. ruslanys
    26.08.2015 17:25

    Расскажите про аппаратную часть, пожалуйста. У вас все на одном сервере размещено? Какая конфигурация сервера? Или может облако? В связи с последними законами, сервера должны быть в России. Какую компанию выбрали, в качестве платформы?
    Это интересно.


    1. Zav
      26.08.2015 17:31
      +1

      Ещё рано по аппаратной говорить.
      Да, на одном.
      FirstVDS, 4 ядра, 4гб оперативы. Там довольно легко тарифы веперед-назад сменять, так что, в принципе, как облако.
      Если нагрузки вырастут что хватать не будет, арендуем сервер у них же, вероятно.
      Но, как говорил, должно хватит на 5 000 онлайн человек, что довольно много. Главное что бы канал не проседал.


      1. ruslanys
        26.08.2015 17:35

        Спасибо за ответ!

        У нас был сервер на FirstVDS совсем недавно…
        19 августа сервер был недоступен 37 минут, перешли на vscale.io.


        1. Zav
          26.08.2015 18:03

          Я раньше размещался у vps.net, бывало несколько раз в год лежали. Даже при том что вроде как «облако».
          Проблемы случаются в любых отказоустойчивых системах :-)
          Ну и пока у нас нет требования 100% аптайма.


          1. ruslanys
            26.08.2015 18:05
            +1

            В любом случае, желаю вам 100% аптайма и широкого канала)


            1. Zav
              26.08.2015 18:06

              Спасибо!


      1. ruslanys
        26.08.2015 17:39

        И еще, на сколько мне известно, тарифный план там изменить нельзя. Только создав новый сервер с новым тарифом.


        1. Zav
          26.08.2015 18:02

          Если KVM то нельзя.
          А так я уже перезжал, всё быстро и удобно.


          1. ruslanys
            26.08.2015 18:04

            Вы используете OpenVZ виртуализацию? Она ведь не гарантирует, что у вас будет проплаченное количество ресурсов системы.


            1. Zav
              26.08.2015 18:06

              Ну и? :-)
              У меня загрузка сейчас 5%. Если она будет хотя бы 50% в пиках — я задумаюсь.


              1. ruslanys
                26.08.2015 18:09

                Мы пишем на Java, и техподдержка FirstVDS сразу нам указана на то, что с Java приложениями либо используйте KVM, либо переезжайте: мол на OpenVZ запрещено размещать Java приложения…

                Трудно представляю почему. А у вас нет проблем на этот счет? (node.js)


                1. Zav
                  26.08.2015 18:17

                  Ещё рано по аппаратной говорить.

                  Пока проблем нет.


  1. likerRr
    27.08.2015 00:27

    Спасибо за статью, отличная работа! И да, вы псих ещё раз)

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


    1. Zav
      27.08.2015 00:37

      Сейчас да. В целом вы правы — потом что-нибудь такое сделаем.


  1. Dominis
    27.08.2015 11:47

    Zav, а почему был выбран iron-router а не flow-router? Iron уже не поддерживается длительное время, в итоге если возникнут какие-то проблемы с очередным релизом Метеора, то придётся форкать пакет и править самому.

    Ты написал среди плюсов метеора — средство для дебага, можешь как-то расширить описание?

    Ну и вопрос исключительно «о себе». Ты написал что это был первый проект на метеоре, нет ли после запуска ощущения, что многое можно было сделать иначе и лучше? Просто у меня после запуска первого проекта на метеоре было ощущение, что я многое сделал не правильно. И сейчас подправляю многие вещи. Вот и интересно, есть ли такое же впечатление? Просто метеор немного не обычен и думать в разработке на нём надо порой иначе.


    1. Zav
      27.08.2015 13:17

      Касательно роутера. Я взял первый, который решал задачу хорошо.
      По сути у меня сейчас всего 1 роут: '/game/:menu?/:side?/:item?'
      Дальше, по сути, контроллер решает что делать. Переехать на любой другой роутер не займет много времени, если возникнут проблемы.

      По дебагу — имел ввиду что есть уже готовые решения. Например: github.com/kadirahq/meteor-debug

      нет ли после запуска ощущения, что многое можно было сделать иначе и лучше?

      Лучше можно сделать всегда. Первые две недели разработки я узнавал как делать привычные мне действия на метеоре — принципиально оно не отличается от разработки на чем угодно другом, просто позволяет некоторые моменты отдать на волю движка. Например 2 way data binding довольно хорош. При желании можно получить больше контроля, но если не надо, то метеор берёт на себя задачу полностью.

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

      Выбором я доволен, в целом. Метеор — удобный инструмент.


      1. Dominis
        27.08.2015 14:52

        Кстати, вот еще вопрос о котором сразу не подумал.
        А как сделан механизм постройки зданий? Т.е. вот я пользователь нажал «построить», дальше постройка должна быть готова через Х минут. setTimeout тут может принести множество неожиданностей, например обновили/перезагрузили сервак и таймауты потерялись. Просто timestamp-подобный флаг времени, когда можно начать использовать здание?


        1. Zav
          27.08.2015 15:26
          +2

          Создается новый документ в коллекции query (очередь строительства), в котором указан тип, название, время старта и время окончании строительства.
          Когда клиент запрашивает какое-то действие, проиходит актуализация информации — проверяется очередь, и если вермя прошло, создается запись в коллеции buildings.