О питомцах и славе
Ключевая и уникальная фишка Dusk World в переплетении сайтового и игрового функционала. Когда-то давно писал про механику кристаллов светлого эфира, которые будут покупаться за карму, и которые можно будет вставлять предметы и получать бонусы против монстров.
Сегодня расскажу о другой подобной механике — славе, которую игрок будет получать за подписчиков на свои сообщества и лайки играм, которые он добавил, за которую можно будет приобрести питомцев.
Но прежде чем переходить к подробностям, давайте начнем с проблемы.
Б значит баланс
В первой и второй демо-версии было одно подземелье и его сложность была никакая, соответственно любой класс немного подкачавшись мог пройти это подземелье. Но в реальной игре такое будет только в первых локациях на обычной сложности, а вот дальше будет жестко.
И возникнет проблема — магу будет очень сложно «держать» удар, и было бы хорошо иметь какого-то танка. Танку будет сложно убивать врагов, и хорошо бы за спиной иметь какого-то дд. Мили-дд будет не хватать выживаемости, и хорошо бы в тылу иметь какого-то хила и т.д.
Изначально концепция по спутникам была такая:
Наемники
Вводятся в игру первыми. Это просто одноразовые спутники разного типа, которые живут до первой смерти. Нанимаются за золото.
Союзники
Затем появляются союзники. Это городские NPC с которыми отношения прокачены до такого уровня, что они готовы составить компанию в приключениях. Они изначально сильнее наемников, плюс их можно дополнительно прокачивать.
Питомцы
И в конце самый сильный тип спутников — питомцы. Их будет несколько градаций редкости (и мощности), а также их можно прокачивать и усиливать. Они сильнее союзников, но и получить их сложнее.
Но… Сообщества уже есть, база игр уже есть, уже начисляется слава за подписчиков и лайки. И имеет смысл как можно раньше дать игрокам возможность получать бонусы за созданные сообщества и добавленные игры. Соответственно питомцы появятся раньше всех, еще до полноценного релиза с локациями — уже этой весной.
Подробнее о питомцах и их получении
Будет отдельный NPC Закан, который специализируется на ловли и приручением всяких диких животных.
За небольшое количество славы он расставит сети и ловушки и попробует вам поймать кого-то. Кто это будет — заранее неизвестно. Может быть простой черный волк, а может быть редкая ониксовая черепаха.
После того, как вы увидите, кто был пойман — будет выбор, или отпустить за ненадобностью, или приручить. Приручение также требует славы, и чем более редкий и мощный зверь пойман — тем больше сил (и соответственно славы) нужно для его приручения.
При этом, если нужного количества славы пока нет — можно вернуться позже, когда слава появится. Главное не говорить Закану поймать кого-то еще, тогда он отпустит пойманного зверя.
Будет существовать три градации редкости/мощности питомцев:
- Обычные
- Редкие
- Легендарные
В каждой градации питомцы будут делиться на разную специализацию:
- Танки
- Мили-ДД
- Рейндж-ДД
- Хил/поддержка
- Необычные гибриды
Соответственно вы сможете подобрать себе того питомца, который будет идеально дополнять ваш класс.
Примеры питомцев | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Хотя, возможно, сделаю 4 градации спутников, что позволит последний сделать прямо действительно редким-редким.
Также нужно будет еще хорошенько подумать над вариантами спутников и их особенностями. Нужно будет сделать штук 30-40 минимум. Если есть интересные идеи — пишите.
Прокачка и тренировка питомцев
Если вы берете питомца с собой в локации — он будет получать 30% от вашего опыта и прокачиваться. При этом количество необходимого опыта для получения новых уровней отличается для питомцев разной редкости отличается:
Обычные питомцы качаются с той же скоростью что и персонаж: т.е. Взяв питомца 1 уровня на 1 уровне персонажа, он будет получит 15 уровень одновременно с вашим персонажем.
Редкие питомцы качаются в два раза медленнее. А легендарные — в 5 раз медленнее. Соответственно их прокачка будет весьма и весьма трудной. Но и пользу они дадут существенную.
Помимо прокачки питомцев их можно тренировать:
- Тренировать злость: +1% глобального урона за 1 тренировку
- Тренировать живучесть: +1% здоровья за 1 тренировку
- Тренировать скорость: +0.01% скорости атаки и создания заклинаний за 1 тренировку
- Тренировать меткость: +1.5% обычной и магической меткости за 1 тренировку
- Тренировать верткость: +1.5% обычной и магической защиты за 1 тренировку
- Тренировать стойкость к огню: +2% сопротивления за 1 тренировку
- Тренировать стойкость к воде: +2% сопротивления за 1 тренировку
- Тренировать стойкость к воздуху: +2% сопротивления за 1 тренировку
- Тренировать стойкость к земле: +2% сопротивления за 1 тренировку
- Тренировать стойкость к магии: +1% сопротивления к магии жизни и магии смерти
Всего можно сделать по 30 тренировок на каждый тип. Для тренировки также требуется слава.
Суммируя все вышеописанное можно сказать что питомцы — это почти бесконечный потенциал для усиления своего персонажа:
- Найти идеальный вариант легендарного питомца для своего класса уже само по себе сложно
- Прокачка его до максимального уровня займет неимоверное количество времени
- В дополнение к прокачке его характеристики можно усилить тренировками, и чтобы усилить все характеристики на максимум потребуется огромное количество славы.
Но и труды себя многократно окупят — станут доступны для прохождения более высокие уровни сложностей, а побеждать в пвп станет заметно проще.
Подводя итог
Питомцы — важная часть игры, которая будет помогать вам как в прохождении подземелий, так и в пвп схватках с другими игроками. Но чтобы получить редких и прокаченных питомцев — нужно будет много времени уделять сайтовой составляющей проекта.
Впрочем, питомцами можно будет торговать, так что можно будет просто нафармить много золота, а потом купить нужного легендарного питомца с рук. И каждый сам выберет что ему удобнее — кому-то пополнять базу игр или создать интересное сообщество, кому-то просто проходить локации с утра до ночи.
О группе «Dusk World Team»
Не знаю как вы, но я обожаю рейтинги в онлайн играх. Но важно, чтобы эти рейтинги были честными, иначе весь азарт соревнования исчезает.
Но будет ли рейтинг, например, по карме, честным, если там буду я, написавший 3000+ страниц на сайте? Ведь я буду там на вечном первом месте, с громадным отрывом от остальных. Будет ли он честный, если там будет JustNeedCoffee или Gattling у которых также куча статей и которые получали деньги за их написание? Очевидно, что нет.
Думал над тем как решить эту проблему, и решил добавить специальную группу Dusk World Team. И добавить туда себя и всех пользователей, которые пишут материалы за деньги.
Участники этой группы:
- Не будут отображаться в рейтингах
- Их показатели не будут влиять на рейтинг рас
- Не смогут участвовать в турнирах и рейтинговых PvP
Правда возникает другая проблема — а что делать с JustNeedCoffee, у которого часть старых материалов была написана «на энтузиазме»? Что делать, если он захочет участвовать в проекте как обычный игрок со всеми возможностями?
Для таких людей мы сделаем исключение из правила «один человек может иметь только один аккаунт», и они смогут иметь два аккаунта:
- Один «рабочий» для написания материалов за деньги. При этом важно понимать, что с такими людьми я четко обговариваю, что они пишут и в каком формате. Никакой свободы там нет.
- Другой «свой» — для полноценной игры и для написания чего-либо на свое усмотрение, не получая за это деньги.
При этом я буду следить за тем, чтобы с таких аккаунтов не было лайков самому себе. Нарушителям заблокирую аккаунты и перестану сотрудничать.
«А пусть все будет только на энтузиазме»
Нельзя не упомянуть о варианте, когда все пишут посты только на энтузиазме, и вообще никто ни за что не получает денег. Размышлял над таким вариантом, и в нем вот какая проблема:
Представьте себе, что Dusk World уже реализован, есть активная аудитория, допустим в 200 человек, и мы между собой играем и общаемся.
Хочется ли нам, чтобы нас было больше? Разумеется хочется. А теперь представьте, что выходит The Elder Scrolls 6 и тысячи игроков ищут по ней гайды, описания предметов, заданий и прочего. И представим, что у меня есть лишние 100-200 тысяч рублей. Логично же потратить их на актуальный контент по новой игре, который опосредованно приведет и новых игроков в Dusk World.
Отказываться от такой возможности глупо.
И глупо надеяться, что кто-то на чистом энтузиазме возьмет и будет монотонно писать 200 статей о заданиях, потом 100 статей об уникальных предметах, где их найти и т.д. При создании базы знаний очень много рутинной работы.
По этому возможность платить кому-то, кто будет делать эту монотонную работу, а мы вместе — получать новых игроков, нужно оставить.
Ачивка за участие в бета-тесте
Время идет, и все ближе релиз Dusk World. Пускай пока с сильно урезанным функционалом, но все же релиз. Времена бесконечных демо-версий, которых было аж 4 штуки навсегда останутся в прошлом, хотя я и не буду их удалять и можно будет зайти и вспомнить с чего все начиналось.
Чтобы выделить и наградить всех тех, кто принимал участие в тестировании, давал фидбек, находил ошибки и просто морально поддерживал своим неравнодушием к проекту, я решил добавить уникальное достижение:
Чтобы получить это достижение необходимо:
- зарегистрироваться до 1 января 2025 года на dwdemo.ru, dwdemo2.ru или demo.duskworld.ru (достаточно на каком-то одном);
- указать тот же почтовый ящик, на который вы потом будете регистрировать основной аккаунт — привязка будет именно к email, а не к нику;
- проявить какую-либо активность (просто регистрации недостаточно);
- ждать релиза, после чего зарегистрироваться уже на основном проекте duskworld.ru и сразу, автоматически, получить достижение.
Важно! То, что сейчас можно сделать потратив 10 минут — потом нельзя будет получить никаким способом. Имейте ввиду — оставшийся месяц пролетит незаметно.
Если вы участвовали в демо-версиях но не помните на какую почту регистрировались — лучше перестраховаться и зарегистрироваться еще раз, и, напомню, проявить какую-то активность — покачать персонажа, написать что-либо.
И еще раз, чтобы не было недопонимания, чего недостаточно для получения достижения:
- Просто зарегистрироваться;
- Зарегистрироваться после 31 декабря 2024;
- Зарегистрироваться на чужой email;
- Допустить ошибку в написании email. Подтверждение email добавлено только в последней демо-версии — demo.duskworld.ru, если вы там зарегистрировались — то с почтой точно все ок.
Я заранее знаю что потом мне будут писать и говорить «ой, а я не знал», «ой, а я не заметил» - но будет уже поздно. Вы предупреждены, и у вас есть целый месяц чтобы перестраховаться и зарегистрироваться еще раз.
Потом пеняйте на себя.
P.S.
Других достижений пока нет вообще. Конечно, они потом появятся, но, во первых, будет много других более приоритетных вещей, во вторых, не хочется делать какую-то банальщину, а идей чего-то интересного пока нет.
Так что данное достижение не только уникальное, оно еще и долгое время будет единственным на проекте, что будет придавать ему еще большую ценностью.
О внутриигровой валюте
Ну что, пора поговорить про бабосы. Как и в любой другой free-to-play игре в Dusk World будет внутриигровой магазин за dusk coin.
Думаю не нужно объяснять, что разработка требует много времени и денег, и заниматься этим на голом энтузиазме конечно можно, но не долго. А чтобы проект жил и развивался — нужна какая-то монетизация.
В этом выпуске дневников разработки расскажу что можно будет купить за внутриигровую валюту и какие будут способы её получения, помимо покупки за реальные деньги.
Что можно будет купить
Аватары
Первое что появится в игровом магазине — это аватары. По умолчанию на каждую расу+пол будет 12 аватаров на выбор. Но разумеется этого мало, и разумеется игрокам захочется как-то выделиться.
Я сейчас осваиваю Midjourney и получается очень много хороших вариантов. По этому добавить большее количество аватаров не составит проблем.
Фоновые рисунки инвентаря
Второе, чем можно будет украсить и выделить своего персонажа — это покупкой фоновой картинки для инвентаря:
Те фоновые рисунки что вы видите сейчас на demo.duskworld.ru — делались на заказ в далеком 2017/2018 году, за каждый рисунок (всего их 12) платил по 200-300$, но выглядит это сейчас весьма… скромно.
Знал бы что в 2024 году генерация рисунков ии дойдет до такого высокого уровня — не тратил бы столько денег впустую.
Дополнительные вкладки в сундуке
По-умолчанию личный сундук имеет 3 вкладки. Разумеется по мере накопления игровых ништяков захочется иметь больше. Можно заморачиваться с хранением большего количества предметов на персонажах-твинках, а можно просто купить дополнительные вкладки в сундуке.
При этом можно будет купить или простые вкладки, или изменяемые вкладки, которые можно будет переименовать и выделить нужным цветом.
Дополнительные слоты для персонажей
По-умолчанию можно будет создавать 10 персонажей. Это ограничение можно будет расширить, купив дополнительные слоты для персонажей.
Рамки для аватар
Все что было до этого — будет за приемлемую цену которую сможет позволить себе каждый школьник. Но будет и что-то такое, что будет стоить значительно дороже, и позволит показать, что у тебя много лишних денег — это рамки для аватар:
Они будут разного цвета за разную цену. А чтобы такие рамки были редкими, а комментарии не выглядели как новогодняя елка — они будут покупаться на месяц.
(в далекой перспективе) Расширенная статистика
Но что более интересно, но потребует большого количества времени на разработку — это покупка расширенной статистики по аккаунту и персонажу:
- график получение опыта и уровней аккаунтов по дням;
- график получения опыта и уровней по каждому игровому персонажу по дням;
- статистика по участию в эвентах и их результаты;
- возможность посмотреть кто вам больше всего лайкал и дизлайкал;
- всякого рода полезная информация, аля «вы входите в 32% самых популярных авторов, месяц назад показатель был 36% (+4%)»;
- возможно что-то еще.
Способы получения dusk coin
Dusk coin можно будет купить за реальные деньги, но это лишь один из способов. Их можно будет получить за:
- попадание в топ авторов недели
- победы на турнирах
- в качестве бонусов за реферальную систему, т.е. за приглашение новых пользователей
- в качестве бонуса за работу модераторам
- за сообщение об ошибке с помощью которой можно получить игровое преимущество
- покупка на игровом рынке
- покупкой за реальные деньги
Игровой рынок
На проекте будут существовать следующие типы валюты:
- золото — тут все понятно, добывается игровым фармом.
- карма — за счет неё можно будет покупать светлые камни эфира, вставлять в экипировку и получать бонусы против монстров
- слава — за счет неё можно будет получать и усиливать питомцев (про неё скоро напишу отдельный выпуск дневников разработки)
- dusk coin — валюта внутриигрового магазина.
При этом всей этой валютой можно будет торговать. Соответственно тот, у кого какой-то одной валюты много сможет обменять её на другую валюту. Рынок будет абсолютно свободный, и только он решит что ценно и на сколько.
В торговле кармой и славой будет особенность — напрямую её покупать или продавать будет нельзя, но можно будет покупать и продавать камни светлого эфира и самих питомцев. Но сути это не меняет.
Приоритеты реализации
Первое что появится довольно быстро — это возможность получать и копить dusk coin. Думаю уже через 1-2 месяца после релиза. Чтобы те пользователи, которые проявляют активность уже получали за это бонусы, пусть их еще и нельзя будет на что-то потратить.
Потом появится внутриигровой магазин. Вначале с минимумом возможностей, например, только с аватарами. И будет постепенно пополняться.
Затем будет добавлена возможность обменивать dusk coin на другие виды валюты.
И только потом, в последнюю очередь будет возможность купить dusk coin за реальные деньги.
Т.е. к моменту, когда можно будет закинуть денег и выделиться за счет этого — уже будет много игроков с игровой валютой, уже будет её рынок и те, кто будет покупать её за реальные деньги — просто вольются в уже существующую экосистему. Просто смогут догнать тех, кто начал играть раньше.
И еще важный момент, что так как получение реальных денег — это и работа над соответствующим функционалом, и
юридические заморочки, и ответственность (не смогу сказать, мол вы мне ничего не заплатили — по этому радуйтесь
тому, что есть) — я буду добавлять эту возможность только когда буду уверен, что она принесет какие-то заметные
деньги. Потратить кучу времени и получить больше ответственности, а взамен получить пару тысяч рублей и сходить на
них разок в макдональдс вкусно и точка — это бессмысленно.
А до этого проект будет существовать без вливания денег. Сказать плохо это или хорошо сложно — с одной стороны, игроки получат «чистую» экосистему без влияния кошельков. С другой стороны, тот запас денег на который я живу, и который позволяет заниматься Dusk World целыми днями, скоро закончится, и мне нужно будет опять выходить на работу. И разработка Dusk World сильно замедлиться.
Подводя итог
Что можно сказать в завершении — ассортимент игрового магазина никак не будет влиять на игровой баланс, а саму валюту, которая покупается за реальные деньги можно будет получить и игровым путем.
На мой взгляд это будет максимально справедливая и сбалансированная система для игроков.
Переезд на DuskWorld.ru и новая демо-версия
Ну что господа, двигаемся в соответствии с планом, а по плану на конец октября у нас переезд на новый домен DuskWorld.ru (заодно наконец-то сайт переехал на https) и выход новой, четвертой демо-версии Dusk World. Вы только подумайте, четвертая версия! У меня при мыслях об этом сразу такая ассоциация:
Потрогать новую версию матрицы Dusk World
(вспомнить старые версии: первая, вторая, третья)
В общем, смотрите как будет выглядеть наш сайт в будущем, трогайте, ломайте пишите свое мнение.
Важное замечание: это не полностью готовый функционал, по мелочам там еще много всего дорабатывать, но в целом, визуально и концептуально это уже то, что задумано и особо меняться не будет.
Хотя с точки зрения визуала в новом движке заложен функционал смены шаблонов, и когда у меня будет свободное время (интересно бы знать когда) можно будет сделать совершенно новые дизайны сайта, например светлый, или минималистично темный.
Из важного, чего еще нет, но добавится в ближайшие 2 месяца:
- Будут обновлены все аватары;
- Функционал редактирование своих комментариев/постов/сообществ/игр;
- Функционал восстановления/смены пароля;
- Больше опций при создании постов (например, голосования);
- И прочие мелочи.
Эпоха Diablo1.ru заканчивается, начинается эпоха Dusk World!
Часть 19: Что нового
Просто красивая картинка с просторов еще не запрещенного интернета
Вы не представляете, как долго я ждал момента, когда можно будет вновь рассказать новости по разработке Dusk World и показать что-то новое.
Предыдущий выпуск начался с хронологии того, что было. Этот выпуск начну аналогично. Тем более что самому приятно потом перечитать и вспомнить как оно было.
2022 год — сложный для всех год, для меня он не был исключением — рухнули все планы по поиску более высокооплачиваемой работы, в итоге год в основном отдыхал, только по выходным понемногу переписывал на нормальный код модуль боевки.
апрель 2023 — наконец-то нашел новую, более высокооплачиваемую работу, половину с которой можно было откладывать. Соответственно с этого момента можно было засекать год, по итогу которого у меня будут деньги на год жизни без необходимости работать, и можно будет год полноценно позаниматься разработкой своего проекта.
декабрь 2023 — дописана новая версия боевки. Визуально и по механикам там (пока) все как в старой, но внутри всё переписано и намного больше просторов для реализации интересных механик. Подробнее о ней писал в предыдущем выпуске дневников.
январь-март 2024 — дорабатывал свой фреймворк, на котором написана вторая демо-версия.
апрель 2024 — возвращаюсь к попыткам развивать проект дальше на основе второй демо-версии, но там все сложно (подробности ниже).
июнь 2024 — деньги на год жизни накоплены и я увольняюсь. Наконец-то. Но прежде чем плотно приступать к разработке решаю, что нужно хорошо отдохнуть и разгрузить мозги, и на месяц зависаю в 7 сезоне Diablo 2.
1 июля 2024 — отдохнув приступаю к написанию новой версии проекта.
Итак, новая версия проекта
Да-да, знаю, что при этих словах у всех кто всё еще ждет проект будет примерно такая реакция:
Но, как бы ни было много сделано во второй демо-версии, её пришлось отложить, и делать новую. Причин несколько:
- отсутствие авто-тестов, соответственно при изменении старого кода постоянно что-то отваливается. А правки старого кода там приходится делать постоянно.
- фундаментальные архитектурные косяки, например числовые айдишники, которые нельзя оставлять как есть: когда посты имеют url вида domain.ru/post/10 то легко написать скрипт, который будет каждую секунду запрашивать новые посты, и в туже секунду, как они добавлены на сайт — копировать их себе. И поисковики могут подумать, что именно сайт-вор это источник контента.
- много недоработок, с которыми невозможно было мириться, например, не было миграций для базы данных
Все это в сумме приводило к тому, что занимаешься второй демо-версией месяц, второй, а никакого прогресса с точки зрения пользователя нет. Просто бесконечные правки/доработки/отлавливание ошибок/добавление тестов. И это морально угнетает.
Плюс к этому была еще одна задача, которую нужно решить. Как уже писал ранее — я не хочу просто сделать Dusk World, а потом «выстрелит или не выстрелит», я хочу сделать фундамент, на котором потом смогу делать сайты по любым другим тематикам, например по программированию, фильмам, и прочему.
И размышления на эту тему привели к тому, что проект нужно делать так, чтобы парой небольших правок в настройках, не затрагивая код, проект можно было переключать между разными тематиками.
Ну и как вы догадываетесь, на базе второй демо-версии это сделать было невозможно, нужны были фундаментальные правки.
Новая версия проекта
Давайте пройдемся по новой версии проекта, покажу что сделано за 3.5 месяца. Пока занимаюсь пока только «сайтовой» частью проекта.
Регистрация. Здесь пока все также, но в будущем все аватары будут заменены.
Обратите внимание, что появились иконки слева — это ссылки на базы знаний, которые сейчас находятся в верхнем меню. Верхнее меню теперь другое.
Теперь нужно подтверждать регистрационный email — это усложнит создание твинков.
В посте добавились теги, а комментарии отображаются не простым списком, а в виде дерева.
Добавлена база игр.
Игру может добавить любой желающий (ограниченное количество, которое будет расти с ростом уровня аккаунта), после модерации она будет добавлена. Для добавления игры необходимо будет также написать обзор на неё. Если несколько человек в одно и тоже время добавили игру — автором игры будет тот, у кого лучше обзор. Обзор же второго человека также будет добавлен, но уже просто как обзор.
Так выглядит страница игры. На её дизайн потратил 3 дня, и это пока единственное, что визуально меня полностью устраивает в новом функционале.
Игру можно добавить в любимые, и тогда она появится на странице профиля.
Есть и страница разработчика игр, тут пока все просто — небольшое описание и список игр выпущенных данной компанией.
В будущем можно будет добавить «лайки» компаниям игр и можно будет сделать рейтинг самых любимых компаний по версии игроков.
Добавлены сообщества.
Текущие базы знаний по играм это будут именно сообщества.
И на этом же скрине видно небольшое улучшение по уведомлениям — если их 3 или более появляется кнопка «закрыть все». Не нужно кликать на каждый отдельно.
За добавленные игры и созданные сообщества пользователь будет получать игровые бонусы — за каждый новый лайк игре или подписку на сообщество будет даваться определенная валюта, за которую можно будет купить и усилить питомца, которые будут помогать вам в бою. Питомцы будут разных типов: танк, дд, саппорт и позволят балансировать своих персонажей: дд может взять себе питомца-саппорта, чтобы лечил, саппорт — питомца-танка, чтобы танковал.
Подробнее о спутниках и питомцах расскажу в будущих выпусках дневников.
Сами сообщества пока предельно простые — это список постов, с возможностью отфильтровать по рейтингу, и меню.
По сообществам еще много работы.
Профиль пользователя не изменился, но теперь на нем отображаются любимые игры пользователя и сообщества, в которых он участвует.
Также небольшое изменение по характеристикам: теперь очки за новые уровни можно потратить на увеличение доступного места на диске.
Эволюция понимания как надо делать
Много вечеров размышлял над тем, как можно ускорить разработку такого большого проекта. И наконец до меня дошло (на 8 год разработки), что такой крупный проект надо релизить по частям.
При этом поделить проект нужно так, чтобы каждая его опубликованная часть была самодостаточной. Первое очевидное решение: вначале опубликовать сайтовую часть, потом игровую. Еще немного подумав пришел к 4 стадиям:
План по релизам | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
Если по первой и последней стадии всё понятно, промежуточные нужно пояснить:
Стадия II: «тихий» релиз сайтового функционала — когда функционал будет готов, нельзя будет просто взять и переключить сайт на новую версию. Потому что постов 0, игр 0, сообществ 0, и пользователи подумают, что привычный им сайт куда-то исчез.
По этому релиз будет «тихий»: с одной стороны появится возможность регистрироваться, добавлять игры, создавать сообщества и прочее. С другой стороны, внешне, сайт еще какое-то время будет оставаться старым. Только когда постов накопится какое-то количество — переключу главную страницу на отображение новых постов.
Тоже самое с базами игр и сообществами — буду добавлять их в интерфейс когда там что-то будет.
Ну и конечно же будет огромный объем работы по переносу ~5000 старых страниц на новый движок, с комментариями. Т.е. какое-то время на сайте одновременно будут старые страницы, с комментариями как сейчас от гостей, и новые страницы, с комментариями только от зарегистрированных пользователей.
В общем это специфика обновления крупных и старых проектов.
Стадия III: релиз «кликера» и PvP — разработка новых локаций займет много времени, и чтобы пользователям было чем заняться, весной будет условный релиз «кликера»: когда на странице персонажа будут просто кнопки «добавить x опыта (10 энергии)», «добавить предмет (5 энергии)» и за счет этого можно будет прокачивать и одевать своего персонажа, а потом учавствовать в PvP с другими персонажами.
Тем кто участвовал во второй демо-версии с её самых первых дней анонса помнит, что там также был аналогичный период, и на мое удивление пользователи вполне себе серьезно зависали в этом кликере и с азартом соревновались.
Так что и в релизной версии, эта стадия позволит скрасить ожидание выхода полноценной игровой части. Плюс обкатаем новый модуль боевки и баланс в PvP.
P.S.
В общем планы такие. Самое главное — что я уволился и могу полноценно заниматься проектом. Ближайший год будет веселым!
Часть 18: Пять лет разработки
Ну что, не ждали новой части дневников по разработке Dusk World? Думали, забил Diablo на свою игру? Нет, ни разу не забил, хотя жизнь в последние годы и добавила геморроя.
Но давайте обо всем по порядку. Восстановим хронологию событий с момента последнего дня разработки — августа 2019 года.
12 августа 2019 — Выпуск предыдущего дня дневников, в котором объявляю о предварительном релизе второй демо-версии. Это не полноценный релиз демо-версии, а просто публикация текущих наработок, которые любой желающий может потрогать своими руками. И обо всех обновлениях писал там же.
5 октября 2019 — В демо-версию добавлена прокачка боевых способностей и PvP
6 ноября 2019 — Добавлен личный сундук и бонусы от полных наборов определенного типа брони
11 мая 2020 — Добавлена механика локаций (модуль локаций переписан полностью с нуля, на что ушло 5 месяцев) — визуально это та же одна локация, что и в первой демо-версии, но под капотом все совершенно по другому — качественней и лучше.
31 мая 2020 — Добавлены уведомления и статусы постов
Июнь 2020 — К болям в пояснице, которые меня беспокоят с 2014 года, добавляются боли в шее. И надо отметить, проблем они доставляют намного больше, чем боли в пояснице, с которыми, в той или иной степени, сталкиваются многие.
14 июня 2020 — Добавлена механика дропа и два новых типа эпизодов: Алхимическая лаборатория, где можно найти несколько зелий, и Магическая комната, где можно найти несколько книг заклинаний.
Июль 2020 — Боли в шее не проходят уже месяц, и начинаю ходить по врачам. Т.е. вместо того, чтобы после работы сесть за разработку Dusk World, приходится идти к врачу, и так по несколько раз в неделю. Разумеется, все это тормозит разработку.
6 июля 2020 — Добавлена механика отключения возможности написания постов при низкой карме . Проект делаю таким, чтобы он был минимально завязан на ручное модерирование (хотя и оно будет).
13 июля 2020 — На двенадцатилетие сайта делаю полноценный релиз второй демо версии. Для тех, кто следил за всеми изменениями, ничего особо нового не было, только удаление всех старых персонажей и возможность еще раз побороться за первые места в рейтингах.
14 июля 2020 — Из забавного: первый пользовательский гайд о том, как положить в сундук предметов больше допустимого
29 июля 2020 — Добавлены турниры; пока игроков немного — лишь самые маленькие на 8 участников. В будущем будут турниры на 16/32/64 участника с более ценными призами.
2 сентября 2020 — Добавлена механика торговцев и первый NPC-алхимик. Это последнее значительное обновление демо-версии. Боли в шее так и не проходят и начинают отравлять жизнь все больше.
17 ноября 2020 — Пишу пост дела житейские в которых рассказываю, что из-за проблем со здоровьем возможности заниматься Dusk World уменьшились.
Декабрь 2020 — Черный месяц, когда я пошел в очередную клинику, занимающуюся исключительно проблемами с позвоночником (кажется, что все подобные клиники — исключительный лохотрон и развод на деньги), где я плачу 80 тысяч, хожу в течении 4 недель на процедуры, т.е. каждый будний день в 8:00 выехал на работу, а домой вернулся в 23:00, т.е. свободного времени в принципе 0, и по итогу всего этого мне стало только значительно хуже — и боли стали острее, и грыжа в шее стала больше.
В этот момент меня окончательно выбивает из процесса разработки Dusk World, и сил хватает только на работу, хождение по врачам и сон.
2 января 2021 — Обновлена генерация монстров. В текущей одной локации ничего принципиально не изменилось, это изменение на будущее — когда понадобится заполнять монстрами другие локации, и когда один и тот же монстр может быть разного уровня, соответственно, нужно, чтобы характеристики прогрессировали с ростом уровня.
20 февраля 2021 — Blizzard анонсируют Diablo 2 Resurrected, и становится понятно, что надо будет обновить раздел Diablo 2 на сайте. Учитывая, что релиз анонсировали на сентябрь этого же года — заниматься обновлением надо прямо сейчас, за что и берусь. К счастью, с обновлением помогают JustNeedCoffee и Gattling.
8 марта 2021 — Параллельно с обновлением раздела Diablo 2 начинаю активно писать новый модуль боевки. Старая боевка писалась еще в 2017 году, на костылях, и добавлять в неё новые механики стало очень сложно. Плюс в ней есть плавающие хитрые баги, которые сложно отловить: например, ситуации, когда урон от атаки не наносится в принципе. Случается такой баг раз в месяц, и сколько не пробовал — даже воспроизвести его не удавалось, не говоря уже о том, чтобы исправить.
В таких ситуациях проще написать с нуля, с хорошим ООП, с юнит-тестами, чем мучить дохлую старую лошадь.
Новую боевку пишу сразу на github, чтобы убивать сразу двух зайцев — и делать свою игру, и прокачивать профиль на github, который в теории должен помочь находить новые, более оплачиваемые, работы.
27 мая 2021 — Второй пост дела житейские, в котором пишу, что наконец-то нашел врача, который помог найти причину болей, и что процесс выздоровления наконец-то пошел. За год хождения по врачам было потрачено 650 тысяч, и если бы не врачи — уже на тот момент можно было увольняться, и 8-10 месяцев спокойно сидеть и целыми днями заниматься игрой.
28 октября 2021 — Третий пост дела житейские, в котором рассказываю о том, что, несмотря на улучшившееся здоровье, время уходит на обновление раздела Diablo 2, написание новой боевки, и на подготовку к будущим собеседованиям. А на развитие демо-версии Dusk World времени не остается.
14 января 2022 — Глобальное обновление раздела Diablo 2 на сайте. По сути весь 21 год ушел именно на это.
«Спецоперация» и умерший рынок труда
Казалось бы, худшее позади, «но расслабляться погоди, ведь много ждет нас впереди» (c)
Вся разработка Dusk World шла в свободное от работы время — после работы, на выходных, на праздниках, в отпусках. Получается этакая жизнь 24/7 за компьютером и кодом. Во-первых, это изматывает, во-вторых, даже в таком режиме игра разрабатывается медленно. Решение, которое напрашивалось — это поиск новой работы с большей зарплатой и откладывание 50% зарплаты в заначку, а потом, после года такого накопления — можно будет уволиться и год жить на накопленные деньги. И именно такие планы у меня были на весну 22 года — пойти по собеседованиям и найти работу получше. Тем более, что весь 21 год из каждого утюга рассказывали, какая острая нехватка программистов на рынке труда, и как у них необоснованно растут зарплаты (и то, и другое – полная чушь, не ведитесь и не несите свои деньги в айти-курсы).
И вот в феврале 22 года все надежды на поиск лучшей работы накрылись. Вакансий стало значительно меньше, а кандидатов, наоборот, больше, т.к. многие западные компании закрывали свои филиалы в России. Стало понятно, что разработкой придется заниматься так же, как и раньше — по вечерам, на выходных.
Все это, вкупе с проблемами со здоровьем, которые пришлось пережить, демотивировало вообще чем-либо заниматься, и захотелось пожить как обычный человек, когда ты только работаешь, а в свое свободное от работы время отдыхаешь.
Вспомнил про игры. Побегал по просторам старинного Morrowind (давно строю планы сделать о нем раздел на сайте), божественного Скайрима (тешу планы как-нибудь перезапустить хроники по скайриму), вспомнил старушку Lineage 2, которая, как оказалась, несмотря на свой почти 20-летний возраст, собирает онлайн на фришках больше, чем было в нулевые годы на официальных серверах.
Более того, если раньше фри-сервера предлагали ту же игру, что и на официальных серверах, только бесплатно и худшего качества, то теперь они вносят свои изменения и улучшения в игру, которые воспринимаются намного лучше, чем то, что делают родные корейские разработчики.
Lineage 2 — это какой-то феномен игровой индустрии, столько лет прошло, а так и не встретил никакой другой MMORPG, которая бы настолько затягивала, и где можно было бы увидеть настолько массовые сражения — замес 300 на 300 это абсолютно рядовая ситуация.
В общем, в 22 году, пока в России царили хаос и паника, я, наоборот, хорошо отдохнул и отвлекся от жизненных проблем.
Конечно, продолжал постепенно пилить новый модуль боевки, постепенно заниматься самой демо-версией, но не в таком активном темпе, как это было в период 2016-2020 годов.
Изменения в новой боевой системе
Я уже несколько раз упоминал о новой боевой системе. Пора рассказать о ней подробней. Визуально и концептуально она полностью как старая, и на первый взгляд может показаться, что изменений нет никаких. Но «под капотом» разница огромная, как между трактором и ламборджини.
Работа способностей полностью переделана
Если раньше были 3 способности, жестко завязанные на три характеристики: концентрацию, хитрость и ярость, то теперь способности могут активироваться при любых параметрах.
Например, если раньше пассивная способность людей «воля к победе» работала как «костыль», и просто с 20% шансом при смерти восстанавливала 50% здоровья (что визуально могло сбить нового игрока), то теперь это именно способность, и визуально персонаж вначале умирает, потом активируется способность и применяется – происходит анимация воскрешения. То же самое и с расовой способностью орков, увеличивающей урон в 2 раза при здоровье меньше 30%
Пока есть только 2 способности, завязанные не на концентрацию, хитрость и ярость, но уже нет никаких проблем добавлять новые, с самыми причудливыми условиями, вроде «здоровье меньше 50%, мана больше 50%, концентрация и ярость 100%»
Также способности применяются с умом – больше не будет ситуаций, когда персонаж накладывает на себя эффект до того, как закончился аналогичный старый.
И есть еще глобальное изменение по способностям, которое в процессе реализации – это отвязка от жесткой привязки на 3 способности завязанных на класс персонажа.
Персонаж будет просто иметь какой-то набор способностей, которые добавляются от:
- расы
- класса
- предметов (да, будет механика, когда какие-то уникальные предметы будут добавлять боевые способности)
При этом способностей от класса может быть больше, чем 3, и будет возможность включать/отключать способности.
Добавлена статистика по бою
Она будет особенно интересна в боях «группа на группу» – можно будет посмотреть, кто больше урона нанес, кто больше урона принял, кто на сколько вылечил союзников и т.д.
Добавлена механика призыва новых существ на поле боя
Один класс (пока размышляю, какой) будет иметь уникальную способность призыва существ на поле боя, а также будут боссы, которые будут призывать себе слуг.
Плюс вместе с механикой активацией способности при смерти можно будет добавить такого уникального босса, который при смерти делится на 2 более мелкие части, каждая из которых при смерти также делится на 2 части.
Добавлена механика воскрешения юнитов
Эту способность получат некоторые классы поддержки. Плюс аналогичную способность можно будет получить с редкого уникального посоха – чтобы классы, ориентированные на поддержку, но не имеющие воскрешения от класса смогли добавить себе такую способность.
Улучшена механика эффектов
Не буду расписывать технические особенности, просто скажу, что теперь можно создавать какие угодно эффекты (как ранее была расширена система эффектов от заклинаний в локациях). Хоть эффекты, которые на каждом ходу будут добавлять другие эффекты, хоть призывать каждый ход юнита – что угодно. Это не значит, что в новой боевке появится куча новых интересных эффектов, это значит, что заложен фундамент, чтобы такие способности появлялись.
Например, размышляю над новой способностью для класса берсерк:
- Способность активируется при здоровье > 70% (т.е. активируется со старта боя)
- Каждый ход юнит теряет здоровье
- Каждый ход увеличивается урон и скорость атаки
Получается этакий берсерк (кэп), который сам себе наносит повреждения, но с каждым ходом становится все более опасным.
И можно будет добавить босса с аналогичной способностью, которого важно будет убить быстро, пока он не разогнался.
И таких интересных механик можно будет придумать и добавить массу.
Ну и, конечно же, классов у рас будет больше, чем сейчас по 5 штук на расу.
Добавлены особые эффекты от критических ударов с оружия
Как вы помните, каждый тип оружия имеет свои особенности. При этом у некоторых типов эта особенность проявляется при критическом ударе:
- дробящее оружие может оглушить (одноручное – на 1 ход, двуручное – на 2 хода, тяжелое двуручное – на 3 хода)
- кинжалы накладывают кровотечение на 3 хода
- жезлы снимают один положительный эффект с цели (в отличие от двух предыдущих – эта механика еще в разработке)
Добавлена механика удара сразу по всем вражеским юнитам
Звучит просто, но на деле добавление такой механики заставило изрядно потрудиться. В старой боевке, написанной на костылях без юнит-тестов, её было бы практически невозможно добавить.
Что это дает на практике – возможность создавать боссов, которые будут атаковать всю группу игроков, возможность добавлять способности, которые лечат/бафают/дебафают сразу всю группу.
В будущем планирую добавить способности, которые будут применяться по всему ближнему или дальнему ряду.
Добавлена мультиязычность
Изменение на долгую перспективу, чтобы, когда проект будет запускаться на зарубежные аудитории, добавление нового языка делалось просто добавлением одного файла.
Что еще в процессе разработки:
- Механика клонирования себя с % от исходных характеристик. Можно будет добавить уникальный класс «Иллюзионист», ультимативная способность которого будет создавать иллюзии, имеющие 15-25% характеристики хозяина. И уникального босса с аналогичной способностью.
- Механика рефлекта урона
- Механика снятия положительных/отрицательных эффектов
- Есть еще идея интересной механики, когда класс суккуб сможет переманивать в свою команду вражеского юнита и заставлять несколько ходов воевать на своей стороне. Но это уже изыски, посмотрим, на сколько будет время
- Также есть еще интересная (но сложная) механика: расширить количество сражающихся команд с 2 до любого количества. Это позволит устраивать, например, групповые бои в формате «каждый сам за себя».
Также есть вещи, которые существуют в старой боевой системе, но пока не реализованы в новой:
- Все 150 способностей классов
- Расовая способность эльфов уклонения от любой атаки/заклинания с шансом 20% (никак не зависящая от меткости атакующего)
- Добавление способностям требование по типу оружия
- Рандомизатор урона
- Увеличение урона в долгих боях
- Механика активации способностей через хитрость
Планы на будущее
Разработка идет уже 6 год, а конца-края не видно. Очевидно, что-то с этим надо делать, и очевидно, что – убирать часть запланированного функционала, оставляя его на обновление уже после релиза.
Еще мотивирует к скорейшему релизу то, что даже в текущий супер-урезанный функционал демо-версии несколько человек задротили месяцами. Tieru так и вовсе сделал что-то невозможное и взял максимально возможный уровень. Напрашивается вывод – просто улучши то, что уже есть, просто добавь локаций, просто добавь игроков (для этого даже в рекламу вкладываться не нужно – просто перенести функционал на diablo1.ru) – и будет уже сильно веселее.
К тому же я сам давно уже хочу публиковать новости через простой редактор на сайте, без необходимости делать физические странички с html-разметкой и загружать их на сервер – и геморройно, и долго, и подход такой устарел больше, чем говно мамонтов.
И все, кто помогает с наполнением контента, также просят добавить уже какой-то редактор на сайт.
В общем, надо безжалостно резать запланированный функционал и запускать то, что есть, но с доработками.
Итак, от чего принято решение отказаться:
От открытого мира
C массой разнообразных зон и локаций, которые, мало того, запланированы в различных климатических зонах – леса, степи, пустыни, тундры, тропики, скалы и т.д.
Что будет – один город и цепочка подземелий под ним. Почти как в первой Diablo, но это исключительно совпадение – мир, в который попадает игрок, находится на краю уничтожения, оставшиеся в живых укрылись в главном торговом городе за магическим барьером, который не дает особо крупным тварям подобраться к городу.
По изначальному плану игрок довольно быстро начинал выходить в открытый мир, за границы магического барьера, разбираться, что происходит, а заодно крошить толпы нежити, демонов и других монстров.
Но была запланирована еще одна небольшая сюжетная линия, в которой игрок выяснял, как же так произошло, что в целом процветающий мир оказался на грани уничтожения.
И именно эта небольшая сюжетная линия станет основным сюжетом в первой релизной версии. Потом можно будет добавлять локации открытого мира, со своими сюжетными линиями, и это будет органично сочетаться с существующим большим подземельем.
От замков, осад, контроля над территорией и королей рас
Если отказаться от открытого большого мира на старте, то автоматически нужно убрать замки, их осады, механика контроля над территорией и механика выбора королей рас, которые могут управлять осадами и замками.
Это интересный хай-лвл контент, которым игроки смогут заниматься бесконечно, но придется отложить его реализацию до лучших времен.
От механик темного и светлого эфира
Одна из ключевых и уникальных механик проекта, которая позволяет конвертировать карму от постов и комментариев в полезные игровые предметы, также будет отложена на будущее, чтобы не тормозить релиз.
Но будет максимально быстро добавлена после, т.к. это все же интересная и ключевая механика.
От турниров
Да, казалось бы, уже работающие турниры тоже нужно будет отложить, потому что сбалансированное пвп также требует доработок.
От крафта предметов и добычи ресурсов
Аналогично – интересная механика, но требует значительного времени даже не на реализацию, а на продумывание и балансировку.
Может быть, дроп ресурсов добавлю, чтобы можно было заранее начинать их копить на будущий крафт.
От более сложных версий подземелий
Так как их тоже нужно балансировать, и самые сложные из них возможно будет пройти, только усилив экипировку кристаллами светлого эфира, а этой механики на релизе не будет.
От навороченной системы спутников
Изначально планировалась очень навороченная система NPC и спутников, когда, например, вы можете помогать и улучшать отношения с обычным торговцем в городе, потом, при определенном уровне прокачанности отношений он становится вам доступен как спутник (на ограниченное количество локаций, потом ему нужно будет «отдохнуть»), и потом его еще можно прокачивать – усиливать его характеристики.
Все это пока откладывается. Останутся только случайные спутники, которые могут присоединиться в локации.
Что же будет? Кажется, что удаляется просто все
В том-то и дело, что даже то, что есть сейчас в демо-версии требует значительных доработок. И разрываться на добавление новых механик и доработку старых можно бесконечно.
Пройдемся также по пунктам:
Регистрация
Казалось бы, ну просто регистрация, уже же сделана и работает. Но это только на первый взгляд. Нужно дорабатывать:
- Капчу, чтобы ограничить регистрацию новых пользователей простым скриптом
- Подтверждение регистрации через email. Самая простая и элементарная защита от регистрации твинков
- Защита аккаунтов от перебора паролей
- Восстановление пароля
- Система для выявления твинков и борьбы с ними
Как видите – даже элементарный и уже работающий функционал требует доработок. Идем дальше.
Посты и комментарии
Их также необходимо доработать:
- Редактирование постов
- Редактирование комментариев
- Возможность добавления картинок в комментариях
- Возможность анонимных комментариев (все текущие комментарии на сайте будут перенесены на новый движок как анонимные)
- Систему тегов: возможность добавление постам тегов, поиск постов по тегам
- (может быть) Черновик – когда можно написать пост, сохранить его как черновик и позже вернуться к дописыванию. Если не на релизе, то потом так и так нужно будет делать такую механику
Прочий «сайтовый» функционал
Еще есть то, чего в демо-версии нет вообще, но нужно будет сделать уже в релизной части:
- Сообщества
- Базу по играм (которая будет завязана на механику сообществ)
Игровая часть
Здесь еще куча работы:
- Механика диалогов с NPC
- Механика заданий
- Локация города, его торговцы и сюжетные NPC
- Одно глубокое подземелье будет состоять из 3-4 визуально разных подземелий и суммарно состоять из 8-10 локаций. Сделать такое количество подземелий в сотню раз проще, чем сделать целый открытый мир, но все равно это немалый объем работы
- Доработать механику генерации предметов
- Добавить больше различных заклинаний
- Добавить больше монстров и боссов
- Добавить несколько заданий – одно основное и несколько побочных
- Доделать и интегрировать новую боевую систему
Как видно, необходимого функционала даже для очень сильно урезанной версии проекта нужно будет сделать немало.
Но и это не все (вы еще не устали читать, да?)
После релиза будет большой объем работы, который никак не связан ни с добавлением нового функционала, ни с доработкой старого, а будет связан с необходимостью переносить старые страницы на «новый движок», т.е. в страницы, которые можно будет лайкать, нормально комментировать, которые смогут отображаться в сообществах. А на старых статичных страницах добавлять редиректы на новые страницы.
А так как старых страниц тысячи – это очень немаленький объем работы.
При этом можно было бы заморочиться и написать сложный парсер, который все старые страницы разом переделает в новые, но все такие глобальные переделки сайтов чреваты тем, что поисковые системы могут «глюкнуть» и подумать, что по старому домену теперь расположен новый сайт (пусть и с похожим содержимым), и, соответственно, все его позиции в запросах нужно рассчитать по-новой. А «по-новой» – это значит, что текущие позиции в топе по запросам просто исчезнут.
В общем, чтобы посещаемость с поисковых систем внезапно не исчезла – нужно делать это постепенно, в полуручном режиме.
Но…
Реалистичные планы на перспективу построены, мотивации делать (доделать) Dusk World вагон, но вы же не думали, что не будет никакого подвоха?
Не бывает так, чтобы без подвоха...
А подвох заключается в том, что через 3 месяца релиз Diablo 4, и в первую очередь мне нужно сделать раздел по этой игре на сайте. И все ближайшие 3 месяца уйдут на это. И в начале лета, если все сложится, смогу активно вернуться к разработке Dusk World.
Разбавим скепсис
- Ну вот опять! Еще десять лет ждать будем! А потом и вовсе забьет! (кто-то из читателей)
В заключение давайте разбавлю скепсис, что разработка может затянуться еще очень надолго или вообще быть заброшена.
И дело здесь даже не в какой-то суперидейности или супермотивации (хотя и это тоже есть) и даже не в том, что мне проект по-прежнему нравится, и нравится им заниматься.
А в том, что просто нет другого варианта:
Например, я хочу получать больше денег. Банальное такое желание. Но на хорошие и оплачиваемые позиции большая конкуренция. Чтобы выделиться среди кандидатов, хочу сделать свой блог о программировании. И изучая что-то новое из программирования, не просто запоминать это в голове, а сразу оформлять в виде новых статей в этом блоге. А что нужно для создания блога? Регистрация, посты, комментарии – в общем, базовый функционал. Т.е. мне так и так нужен проект, который я смогу использовать как фундамент для создания любых других сайтов.
К тому же, что diablo1.ru, что Dusk World, что блог о программировании – это не единственные сайты, которыми хочется заниматься. Есть идеи и других проектов, и везде мне понадобится базовый функционал.
Поэтому, как ни крути, даже если я вдруг (вдруг!) потеряю интерес к Dusk World – мне так и так нужно будет доделывать эту регистрацию, посты, комментарии, теги, сообщества.
А сделав это, останется доделать еще немного (немного здесь должно быть в жирных кавычках) – и вот уже урезанная, но релизная версия Dusk World.
Так что все будет.
Часть 17: Потрогать текущие наработки
Мужской и женский образы расы орков. Посмотреть полноразменые рисунки можно в группе вконтакте
Еще пару багов, еще пару правок верстки, еще доработки по функционалу, и по новой… Кажется, это не закончится никогда.
По этому, я тут подумал-подумал, и решил забить разбавить ваши ожидания выложить текущие, очень
сырые наработки, которые можно потрогать своими руками, и посмотреть прогресс.
Напомню, что план стоит в создании второй демо-версии, которая состоит из:
- Функционала сайта: посты, комментарии, чат, и т.д.
- Функционала игры: локации и боевки
То, что я публикую сейчас это примерно ~90% от первой части. Или ~45% от всей второй демо-версии.
Попробовать:
Что доделываю прямо сейчас информацию по классам. Еще не всем классам придумал их боевые способности, плюс нужно немного подправить характеристики, плюс дополнить описание там у некоторых классов есть уникальные особенности (например алхимик имеет бонус к количеству маны, но штраф к регенерации маны), которые сейчас не отображаются, и может показаться, что классы отличаются только стартовыми характеристиками и боевыми способностями.
Помимо этого там еще несколько крупных и пару сотен небольших правок и доработок.
P.S.
Обратите внимание, что первая и вторая демо-версии будут находиться на разных доменах, соответственно, даже после выхода второй демки желающие смогут посмотреть первую, и сравнить прогресс.
P.P.S.
Фоновые изображения в инвентаре у гномов, ангелов и демонов сильно затемнены они еще не готовы, и пока отображаются темным силуэтом.
Часть 16: Над чем идет работа в данный момент
Это будет короткая часть дневников, в которой просто хочу показать, над чем сейчас идет работа.
Напомню, что сейчас делаю вторую демо-версию, которая будет состоять из двух больших (с точки зрения разработки, а не с точки зрения игрового контента) частей:
- Функционал сайта посты, комментарии, всевозможные страницы.
- Игровой функционал локации, бои и т.д.
Сейчас занимаюсь сайтовым функционалом.
Страница регистрации
Вот так выглядит страница регистрации. Логин/пароль/почта + выбор расы, класса и пола.
Профиль
Профиль пользователя, где собрана основная информация о нем.
В будущем добавлю настройки профиля, и можно будет, например, скрыть почту.
Страница персонажа
При просмотре своего персонажа:
При просмотре чужого персонажа:
Дерево пассивных способностей
Пока оно сделано наброском исключительно проработать (и проверить в работе) саму механику дерева способностей. Красная точка в центре это стартовая позиция, откуда идет изучение. Пока не придумал подходящую иконку.
Также, дерево способностей пока одно для всех классов, но в будущем у каждого класса будет свое дерево это позволит точечно править баланс по классам + добавлять особые пассивные свойства каждому классу.
Ну и конечно же, оно будет значительно больше.
Чат
На всех страницах, справа внизу будет небольшая иконка чата нажал на неё и открывается окно чата, в котором можно пообщаться с другими игроками. В чате пока только сделал верстку, функционал в процессе.
Как видно по скриншоту будет несколько каналов. Общие + расовые + отдельные каналы для более высокоуровневых игроков (точнее для игроков с высоуровневыми персонажами)
Рейтинги
Ну и рейтинги, куда без них. Пока сделано три по уровню аккаунта, по уровню персонажей и по карме.
В будущем их будет больше по расам, по классам, рейтинги рас и т.д.
Посты, комментарии
Это одна из частей, над которой еще работать и работать. Больше всего работы над редактором не смотря на то, что есть масса готовых решений они все перегружены функционалом, и проще сделать с нуля, чем разгребать чужие десятки тысяч строк.
Админка
Разумеется, делаю и админку, с управлением пользователями, модерацией постов, комментариев и прочим.
Показывать не буду =Р
P.S.
Доделаю чат и форму создания постов (плюс еще несколько десятков мелких правок разной степени сложности) опубликую текущий функционал в открытый доступ, можно будет попробовать. Конечно, никакого «игрового» процесса пока нет, но, по крайней мере, поможете выявить баги, чтобы их было меньше, на момент анонса второй демо-версии.
Часть 15: Эволюция боевой системы
В данный момент активно занимаюсь разработкой второй демо-версии, значительно более насыщенной, чем первая. Что-то показать можно будет через месяц, а пока, чтобы вы не скучали немного о том, как шла разработка боевой системы.
Зная наперед, что спустя годы будет интересно взглянуть «как оно все начиналось», с самого начала разработки боевки делал скриншоты.
Давайте по ним и пройдемся :)
22 февраля 2017 года
Первый вечер, какогда начал делать боевку. Никакого понимания как её писать нет сделал два массива, цикл, в котором «игроки» бьют друг друга по очереди первая версия готова :)
24 февраля 2017 года
Добавлены расовые способности эльф уклоняется, у орка вырастает урон, когда его здоровье падает ниже 30%. Плюс небольшой случайный множитель урона, чтобы не было одних и тех же повторяющихся цифр.
16 апреля 2017 года
Но, очень быстро стало понятно, что бой 1 на 1 это тупиковый путь. Нужно сразу делать командный бой, при чем с любым количеством сражающихся.
И спустя полтора месяца был готов такой вариант. С точки зрения характеристик все предельно просто, но добавилась механика ближнего и дальнего ряда, а также правило, что милишники не могут бить дальний ряд, пока есть живые в первом ряду.
17 апреля 2017 года
Добавил немного оформления.
20 апреля 2017 года
Первая «анимированная» версия. Описывать как делалась анимация не буду крайне убого и печально.
21 апреля 2017 года
Еще немного работы над дизайном.
27 июня 2017 года
Пришло понимание, что с первоначальной системой характеристик ничего интересного в плане боя не сделать нужно делать расширенную версию характеристик различные типы урона и сопротивления к ним, меткость, защита, шанс и сила критического удара, скорость атаки, блок и т.д.
Также, отказался от первой версии анимации.
3 сентября 2017 года
Начал делать механику навыков, и концентрацию/хитрость/ярость, которые на них завязаны. На скриншоте применение навыков не видно, но парочка из них уже была сделана.
18 декабря 2018 года
Здесь происходит резкий скачок в будущее забыл делать скриншоты. Впрочем, за прошедший год в основном занимался механикой локации, боевку делал уже между делом.
Что изменилось:
- Сделана новая версия анимации. Простая, но в 100 раз лучше первой;
- Обновлен дизайн сражающихся юнитов;
- Добавлен чат;
- Добавлена механика энергетического щита и воровства здоровья;
- Значительный рефакторинг кода;
- Механика «сохранения» боев, с возможностью их пересмотреть.
14 мая 2019 года
Скриншот сделан 14 мая, но готова данная версия была еще 1 января. В ней доделана система навыков, и эффектов от них.
На данный момент это актуальная версия боя, но как минимум еще нужно добавить:
- Эффекты от разных типов оружия;
- Уменьшенный вариант иконок юнитов, для массивных боев 15 на 15 и больше;
- Добавление новых навыков и эффектов;
- Другие небольшие улучшения.
Планы на будущее
И несколько слов о том, чего ждать в перспективе. Без сроков потому что какие сроки не называй, все равно все получится дольше, чем планировалось.
- 16 часть дневников скриншоты того, что сделано и над чем идет работа по второй демо-версии;
- 17 часть дневников выкладываю часть реализованного функционала из второй демо-версии, чтобы любой желающий мог поискать там баги;
- 18 часть дневников будет промежуточной, перед анонсом второй демо-версии. Есть две небольших темы для рассказа монетизация проекта и классы у рас (их будет 30 штук, по 5 на расу);
- 19 часть дневников анонс второй демо-версии.
Часть 14: О генерации предметов
С начала января занимаюсь разработкой второй демо-версии, которая, как уже говорил, будет отличаться от текущей наличием полноценной системы характеристик, прокачки, инвентарем и предметами.
Для этого, помимо прочего, мне нужно сделать модуль, который будет отвечать за генерацию предметов экипировки. Ну а в процессе его создания сделать саму базу предметов, материалов и магических свойств.
В этой части как раз об этом и расскажу, чтобы было понимание, какой будет экипировка, и от чего будут зависеть её характеристики и магические свойства.
А перед этим покажу финальный вариант, где можно посмотреть варианты генерации:
Чертеж
Основа предмета — это чертеж. Он определяет базовые характеристики и параметры предмета, и выглядит так (на примере кинжала):
Чертеж кинжала | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Часть параметров имеет фиксированное значение, например скорость атаки, а часть — плавающие, например урон, и зависят от того, из какого материала они сделаны.
Последняя колонка указывает, какие параметры меняются от материала.
Материал
Предмет обязательно создается из какого-то материала, которых 4 вида:
- Дерево (посохи, луки, арбалеты)
- Кожа (легкие доспехи)
- Ткань (роба)
- Металлы (все остальное)
Материалы имеют следующие параметры (на примере металла Верит):
Метал Верит | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
Соответственно, если мы делаем кинжал из Верита, то он получит следующие параметры:
Веритовый Кинжал | ||||||||||||||||||||
|
||||||||||||||||||||
Качество
Но, помимо этого накладывается дополнительный множитель качества:
- Множитель 0.7 — Сломанный
- Множитель 0.8 — Низкокачественный
- Множитель 0.9 — Грубый
- Множитель 1
- Множитель 1.1 — Добротный
- Множитель 1.15 — Качественный
- Множитель 1.2 — Превосходный
В текущей генерации он берется случайно, а в игре будет зависеть от навыка, и, соответственно, чем выше навык, тем более качественный предмет будет получаться.
Магические свойства
Но это еще не все. Каждый предмет имеет определенную магическую редкость, от которой зависит, сколько магических свойств на нем будет сгенерировано:
- Обычный предмет — 0
- Магический предмет — 1
- Зачарованный предмет — 2
- Редкий предмет — 3
- Мистический предмет — 4
- Легендарный предмет — 5
- Эпический предмет — 6
- Артефакт — 7
- Реликвия — 8
В текущем примере генерации предмета магическая редкость выбирается случайно, в игре, разумеется, будет по другому:
Правила применения магических свойств
Применение магических свойств к предметам происходит не случайно, а с применением нескольких «фильтров»:
1. Фильтр по уровню
Каждое магическое свойство имеет несколько вариаций, у каждой - свое ограничение по минимальному уровню предмета. Например, свойства на дополнительный урон огнем следующие:
- 1+ уровень: Урон огнем +1-3
- 5+ уровень: Урон огнем +4-6
- 10+ уровень: Урон огнем +7-10
- 15+ уровень: Урон огнем +11-15
- 20+ уровень: Урон огнем +16-19
- 25+ уровень: Урон огнем +20-28
Соответственно, если предмет 17 уровня, то свойства на 20 и 25 уровень будут исключены, и случайным образом будет выбран вариант из оставшихся.
2. Фильтр по типу предмета
Сейчас в базе 63 типа магических свойств, но на каждый тип предмета указан отдельный список свойств, которые на нем могут быть получены. Где-то по 20-30 на каждый.
3. Дополнительные фильтры
Допустим, у нас есть двуручный меч, и двуручный посох. Оба они относятся к типу двуручного оружия.
Но дальше получаются некорректные ситуации — например когда на двуручном оружии появляется бонус к скорости создания заклинаний, а на посохе, бонус к скорости атаки.
Чтобы таких ситуаций не было, была добавлена механика дополнительных фильтров, в соответствию с которой:
- На оружии с типом урона огонь, может сгенерироваться только свойство на % увеличение огня (все остальные % увеличения стихийного урона будут фильтроваться);
- На оружии с типом урона «атака» не может сгенерироваться бонус к скорости создания заклинаний или магической меткости;
- На оружии с типом урона «заклинание» не может сгенерироваться бонус к скорости атаки и меткости;
- На броне без защиты не может сгенерироваться бонус к защите;
- На броне без магической защиты не может сгенерироваться бонус к магической защите.
4. Фильтр по редкости или особые свойства
Вы еще не устали читать про правила генерации магических свойств? Надеюсь, что нет, потому что все описанное выше это еще не все.
У каждого (почти каждого) типа предмета есть свои, особые магические свойства, которые могут сгенерироваться только на нем, это:
- Бонус к максимальным сопротивлениям — только на нагрудных доспехах
- Бонус к блоку — только на щитах
- Бонус к регенерации здоровья — только на кольцах
- Бонус к регенерации маны — только на амулетах
- Бонус к находимому золоту — только на шлемах
- Дополнительные слоты в поясе — только на штанах/поясах
- Уменьшение расхода выносливости — только на обуви
- Бонус к шансу быть незамеченным — только на обуви
- Бонус к общему наносимому урону — только на перчатках
Для того, чтобы выделить их особую значимость и редкость, добавлена дополнительная механика редкости, которая добавляет дополнительную проверку на то, может ли это свойство быть применено к предмету.
У обычных свойств этот параметр равен 100%, т.е. Выбрался, к примеру, из 20 доступных типов свойств бонус к здоровью — он и применяется. А вот если на кольце выбирается бонус к регенерации здоровья, который имеет параметр редкости 40%, то будет сделана дополнительная проверка, и с 60% вероятности это свойство не применится, и будет выбираться следующее.
В будущем редкие свойства на предмете будут выделены цветом.
Список предметов и материалов
Кому интересны детали:
Сразу скажу, что это не финальные варианты — все еще будет 10 раз обновляться, балансироваться и дополняться.
P.S.
Что по итогу — механику генерации предметов начал писать еще в далеком 17 году, за пару выходных сделал основной прототип. Потом возвращался к ней в 18 году, и сделал почти готовый вариант.
А в этом году, в январе, начал доделывать, как я тогда думал, почти готовый вариант. И на доделку ушло два с половиной месяца (на выходных). Не думал, что генерация предметов окажется такой сложной задачей.
При этом, это только генерация экипировки. А мне нужно будет сделать генерацию дропа, которая будет определять, при убийстве, например, скелета, что с него выпадет:
- Ничего
- Золото
- Расходники
- Материалы для крафта
- Экипировка
Если экипировка — то какая. Будет много фильтров с разными вероятностями, плюс нужно будет придумать формулу, и какое-то значение «крутости» противника, который будет передаваться в генератор дропа, и, соответственно, если убили крысу — получить «ничего» будет 80%, а если убили босса — то это будет несколько предметов, в том числе какая-то экипировка.
И еще один модуль нужно будет сделать для новой демо-версии, это модуль отвечающий за пассивные навыки классов. Или, попросту — дерево способностей.
Набросок уже сделал — получается легко и просто, посмотрим как пойдет дальше. Когда его сделаю — также дам попробовать своими руками и расскажу свое видение того, по каким принципам будет сделано дерево навыков у классов.
Часть 13: Аккаунты, персонажи и сезоны
Алтарь восстанавливающий ману, который будет введен в будущем.
Кости вокруг алтаря намекают, что бесплатной мана не будет…
Пришло время рассказать о такой важной, но на первый взгляд обычной вещи — аккаунте игрока.
Расскажу о том, как подход к этому эволюционировал по ходу разработки.
Аккаунт и персонажи
Изначально все планировалось просто — один аккаунт = один персонаж (что и реализовано в самой первой версии). Он же получает опыт за убийство монстров и написание постов.
Но сразу возникает проблема — а если игрок захочет попробовать поиграть за другой класс — регистрировать новый аккаунт? Как-то это не очень здорово…
Даем возможность иметь несколько персонажей на одном аккаунте:
Но следом возникает другая проблема — а как быть с опытом за написание постов? Какому персонажу её добавлять?
Можно добавлять тому, кто в данный момент «выбран».
Допустим. Но есть другая проблема — это баланс получения опыта за убийство монстров и написание постов.
Во первых, нельзя давать фиксированное количество опыта за написание постов — потому что получаемый опыт за убийство монстров будет расти, по мере роста уровня персонажа и убиваемых им монстров, а опыт, получаемый за посты, будет оставаться старым — и в итоге от него будет ни тепло, ни холодно.
Ладно, добавим получаемому опыту за написание постов какой-нибудь множитель от уровня, т.е. Получаемый опыт = 500 * уровень персонажа.
Но тут возникает другая проблема — если какой-то пользователь, зарегистрировавшись на сайте, только писал комментарии (за которые тоже будут давать опыт) и писал посты — то его уровень будет расти, и зайдя в игру он обнаружит, что: 1) его персонаж всех убивает, и ему банально все легко и неинтересно 2) опыта за игровой процесс дают крайне мало — что тоже минус к интересу.
Опять плохо.
А хорошо бы придумать такую систему, в которой не только не будет таких проблем, но которая наоборот, будет мотивировать людей, только играющих, или только общающихся на сайте — попробовать другую часть проекта.
И размышления привели к следующему варианту:
- Аккаунт — это «основной персонаж» и у него есть такие характеристики как уровень, сила, ловкость, интеллект и прочие.
- Персонажи (один или несколько) — это «классические персонажи» — те, за которых будет происходить игра.
При этом все персонажи будут получать бонус от характеристик основного персонажа — прокачали вы ему силу на +20 — все ваши «игровые» персонажи получат +20 к силе.
Что это дает:
- Визуальное понимание — увидели, что у пользователя 1 уровень аккаунта, и 50 уровень персонажа — значит он только играет, и ничего не пишет и не комментирует. Увидели, что у пользователя 20 уровень аккаунта, но персонаж 1 уровня — соответственно это наоборот любитель писать и общаться, а не играть;
- Если кто-то сконцентрировался лишь на одной части проекта — такая система будет мотивировать его попробовать другую часть;
- Система, где персонажи усиливают друг друга — это мечта любого задрота, а проект создается именно таким и для таких — будь то форумные задроты, которые годами набивают тысячи комментариев, или классические игровые задроты, убивающие миллионы монстров.
Сезоны и эры
С персонажами разобрались, но это еще не все.
Размышляя о таких играх как Diablo 2, Path of Exile, Lineage 2, в которые играл много лет, думал над тем, что мотивировало раз за разом, с интересом возвращаться к ним.
А ответ прост — это возможность «начать с нуля» вместе со всеми. Посоревноваться.
- В Diablo 2 — это рестарт ладдера
- В Path of Exile — новые сезоны
- В Lineage 2 — новые серверы
Стало очевидно, что и в нашем проекте нужно вводить систему сезонов, где будет один постоянный сезон (аналог лиги «Стандарт» в Path of Exile), и какой-то новый сезон, по окончанию которого все персонажи из него будут переводиться в старый, а затем стартовать новый, где все желающие смогут еще раз начать все с начала, и посоревноваться с другими.
В этом плане, фактор основного аккаунта и его характеристик будет играть интересную роль:
- Игроки, которые будут прокачивать только игровых персонажей (и игнорировать прокачку основного персонажа), будут стартовать с обычными характеристиками;
- А те, кто прокачкой основного персонажа занимался — будут иметь значительные бонусы за счет него, и стартовать «усиленными» персонажами.
В целом, считаю, довольно справедливо. Впрочем, тем, кто сайтовую сторону проекта будет совсем игнорировать, немного поможем — основной аккаунт будет получать опыт не только за написание постов и комментариев, но и за получение значительных уровней игровыми персонажами. Т.е. прокачали игрового персонажа до 10 уровня — основной аккаунт получил 1000 опыта, прокачали до 20 уровня — еще опыт, и т.д. Прокачали 10 персонажей до 100 уровня — получили… очень много опыта.
Также к такой системы появляется один плюс, но и один минус.
Представим, что проект существует 5 лет. И есть часть пользователей, которые играют и общаются на нем все это время. За это время они прокачают себе значительный уровень основного персонажа, и будут получать очень солидный бонус к характеристикам игровых персонажей, который особенно будет чувствоваться на старте новых сезонов.
Это, с одной стороны плюс — система дает бонус тем, кто провел в проекте столько лет. С другой стороны — будет нарушать принцип «все с нуля» при старте новых лиг.
И здесь два решения:
- Первое — постепенное снижение количества очков характеристик, которые получает основной аккаунт при получении нового уровня аккаунта. Вначале это будет 5 очков за уровень, и постепенно будет снижаться до 1-2. Соответственно чем выше уровень — тем не только будет сложнее получать новый, но и бонус к характеристикам будет незначительный;
- Второе — это введение Эр
Эра — это аналог сезона, только для основных аккаунтов. Если сезоны будут продолжаться 5-10 месяцев, то эры могут длиться 5-10 лет.
Скажу даже более того — не факт, что эры вообще будут сменяться (не знаю, как отреагируют игроки, если их «прогресс», который они копили годами, вдруг обнулится), но заложить в фундамент проекта такой функционал я обязан. Потому что если его не заложить сразу — вводить «в процессе» будет значительно сложнее.
Итого
Механика аккаунта и персонажей значительно усложнилась. Но все «навороты» считаю нужными и полезными, и их обязательно нужно заложить с самого начала, потому что добавлять это потом, «на ходу», будет значительно сложнее.
Часть 12: Новогодние подарки
Всем привет. Приближается новый год, и содержание этого выпуска дневников разработки можно считать моим маленьким новогодним подарком :)
Обновление демо-версии
Последний месяц занимался добавлением навыков и эффектов в бою. Теперь, как и изначально задумывалось, каждый класс имеет собственные 3 способности, которые он может использовать в бою.
Также добавлено получение опыта за убийство монстров. Прокачки в текущей версии по-прежнему нет, но теперь в рейтинге, по количеству опыта, можно понять, кто проходя локацию убегал от всех монстров, а кто шел по трупам поверженных врагов.
Также незначительно подправлен баланс и сделан «вайп» — удалены все персонажи и обнулены рейтинги.
Это небольшое обновление, но только сделав его я могу переходить к более значимым обновлениям, которыми займусь в следующем году.
Опробовать обновленную демо-версию:
dwdemo.ru
А это сохраним для истории — рейтинг пользователей и отзывы:
Самая первая версия
В 4 выпуске дневников показывал скриншоты самой первой версии Dusk World, которую разрабатывал осенью 2016 года.
Эта версия была полностью заброшена и отправилась «в архив», т.к. там было допущено несколько фундаментальных ошибок и примитивных подходов.
Но… удалена она не была. И доступа к ней не давал.
А на днях подумал — а почему бы и не дать потрогать всем желающим эту первую версию? Не смотря на то, что там конечно все очень примитивно и урезано — посмотреть есть на что.
При этом, в противоположность существующей демо-версии, где представлена механика локации и боя, в той самой первой версии наоборот, была реализована система характеристик (в первой их версии), экипировки, магазина, страница профиля.
Там даже есть прокачка, только опыт дается за написание постов.
Оценить раритет:
dwdemo0.ru
Домен NightWorld.ru
Еще одна небольшая, но хорошая новость — купил домен NightWorld.ru
Именно название Night World и этот домен хотел взять изначально, два с половиной года назад, но владелец домена взял и поднял цену с 5 000р. до 125 000р. Слишком дорого, для моего бюджета, по этому пришлось выбирать другое название для проекта.
А на днях проверил домен NightWorld.ru — смотрю, он опять за 5000р. продается. Почему бы и не купить.
Впрочем, название проекта пока не меняется (хотя оно с 80% вероятностью сменится в будущем) — так как нужно сделать еще некоторые вещи, перед тем как делать однозначный выбор названия.
В любом случае, напишите в комментариях, какое название вам нравится больше — Dusk World или Night World?
Что дальше?
Для меня в разработке сейчас начинается самое интересное — модуль локации и боевки более-менее готов, за два с половиной года разработки мои навыки программирования сильно выросли, и теперь, с новым опытом, и более широким размахом «хотелок» приступаю к написанию того же, что когда-то начал делать осенью 2016 года.
И уже на базе этого будет размещен текущий функционал локации и боевки. Получится тоже самое, что и сейчас в демо-версии, но с инвентарем, предметами, прокачкой, и прочим.
Конечно, на этом пути будет еще много всяких «мелочей». Например — генерация предметов и их магических свойств. Этим генератором уже занимался раньше, и половина функционала там уже сделана, но другую половину еще предстоит сделать.
Также, нужно будет полностью переделать систему заклинаний, от текущей, примитивной, до той, которая планируется — со школами заклинаний, с их прокачкой, с повышением уровней самих заклинаний и прочими фишками.
В общем, интересного впереди — масса. Еще бы научиться не спать, чтобы по ночам тоже сидеть и заниматься разработкой :)
Всех с Новым Годом!
Часть 11: Концепция боевой системы
Все иллюстрации к сегодняшнему выпуску взяты на просторах интернета
Ну-с, пришло время очередного выпуска дневников разработки MMORPG Dusk World, в котором расскажу о концепции боевой системы — основных принципах, типах навыков, брони и оружия.
Но, перед этим, несколько слов о том, как прошло открытие первой демо-версии 21 октября.
Учитывая, что демо-версия крайне урезанная, результатом очень доволен — на 63 созданных персонажа (аккаунтов) пройдено 359 локаций, т.е. в среднем каждый персонаж прошел 6 локаций. Опять же, для такой урезанной демо-версии это очень много. Я был готов к тому, что будет банально по одной локации на персонажа, и отзывы типа «ну, чет ни о чем».
Так как обычно публикация демо-версии выглядит так:
В общем, полон энтузиазма делать проект дальше.
Концепция боевой системы
А теперь к главной теме сегодняшнего выпуска — концепции боевой системы.
Рассмотрим задачи, которые поставил перед «боевкой»:
- Разнообразие классов;
- Возможность свободной прокачки — никакого «автоматического» роста параметров силы/ловкости/выносливости как в Diablo 3;
- Возможность свободной экипировки — опять же, игры, где класс лучника не может взять в руки двуручный топор — считаю морально кастрированными;
- Большие просторы для экспериментов с прокачкой/экипировкой;
- Возможность реализации всех задумок при ограниченных человеческих ресурсах.
А вот, перед самими боями (о PvP-составляющей подробно поговорим в других выпусках):
- Свободное (с небольшими ограничениями) PvP;
- Отсутствие ограничения на количество юнитов в бою — всем, кто играл в браузерные MMORPG знакомы классические баталии 6 на 6;
- Мотивированность PvP-составляющей.
Над тем, какую систему реализовать, чтобы она отвечала всем требованиям — размышлял (и делал) все 2.5 года разработки. И вот что получилось.
Навыки
Навыки — одна из самых трудоемких частей любой RPG или MMORPG — обычно каждый класс имеет несколько десятков навыков, большинство из которых являются «проходными» - персонаж перестает ими пользоваться, когда докачивается до более «крутых». И в энд-гейме остается 2-3 используемых навыков.
Учитывая ограниченность человеческих ресурсов (95% делается одним человеком), вариант с несколькими десятками навыков на класс отпадает точно, учитывая, что самих классов будет минимум… 6 рас * 4 класса = 24 штуки. Хотя, 4 класса на расу — это скорее «стартовый» вариант, который потом обязательно нужно будет, и будет расширяться, где-то до 10 классов на расу.
Долгие размышления привели к следующему варианту:
- Каждый класс имеет 3 активные способности (те, что могут быть использованы в бою): основная, вспомогательная и ультимативная;
- Класс имеет собственный набор пассивных навыков, некоторые из них усиливают активные способности;
- Существуют дополнительные предметы (возможно это будут руны), которые могут изменять работу навыков.
При этом, для использования способностей нужен определенный ресурс:
- Основная способность требует заполненную на 100% шкалу концентрации;
- Вспомогательная способность зависит от такого параметра, как хитрость, и может быть использована в любой ход, с вероятностью этой самой хитрости (20 хитрости = 20% использования вспомогательной способности);
- Ультимативная способность требует заполненную на 100% шкалу ярости.
Получается, что помимо 3 способностей, и возможности их прокачки, игрок может сделать упор на определенном ресурсе, чтобы нужная ему способность использовалась чаще. А может этого и не делать.
На примере
Чтобы было понятнее, давайте рассмотрим эту систему на примере класса Паладин, он имеет следующие способности:
- Основная — Сокрушающий удар: паладин делает мощный удар оружием, наносящий 20 физического урона и 20 урона магией света;
- Вспомогательная — Удар щитом: паладин делает удар щитом, который наносит 20 физического урона, и с 50% вероятностью оглушает врага на 1 ход;
- Ультимативная — Авангард: призывая высшие силы на помощь, паладин восстанавливает 60 здоровья, и получает бонус ко всем сопротивляемостям +30 в течении 5 ходов.
Игрок может прокачивать своего персонажа равномерно — тем самым его паладин будет иногда использовать сокрушающий удар, иногда — удар щитом, а если бой затянется (ярость для ультимативной способности накапливается долго) — используется аванрагд.
Но, игрок может захотеть сделать из своего паладина «дамагера» и тогда он большую часть пассивных навыков вкладывает в прокачку Сокрушающего удара, а на предметах подбирает бонусы к получаемой концентрации — соответственно концентрация будет накапливаться быстрее, и, соответственно, основная способность будет использоваться чаще.
Дальше, игрок может захотеть сделать из своего паладина «стан-машину» - тогда он прокачивает удар щитом, увеличивающего шанс оглушения, одевает предметы с бонусом к хитрости, которая увеличивает вероятность использования вспомогательной способности. И, в довесок, использует дробящее оружие, которое также, с небольшой вероятностью может оглушить противника (о типах оружия и их особенностях написано ниже) — получится такой паладин, который вроде и не сильно бьет, и не особо танк, но постоянно оглушает и тем самым обездвиживает противника. Это, опять же, хорошо сработает против другого танка, стоящего в первом ряду, а если такой паладин встретится с магом, у которого будет спутник-милишник (о спутниках тоже будет отдельный выпуск в будущем), то все оглушение уйдет в милишника, а маг в это время расстреляет самого паладина. В общем, в одной ситуации такой паладин будет хорошим, в другой — нет.
Ну и в конце концов, паладин может подумать, что хочу быть несокрушимым танком — и тогда он прокачивает ультимативную способность, у которой увеличивается восстанавливаемое здоровье, бонус к сопротивляемостям, и подбирает предметы, дающие бонус к накоплению ярости — чтобы ультимативная способность срабатывала чаще (а то ведь могут убить прежде, чем она сработает).
А для чего нужны руны?
Представьте, что вы знаете, что вам предстоит бой с паладином, с которым вы уже бились, и вы знаете, что он прокачен на урон, и что основная атака будет наносить урон стихией физики и магии жизни. Что вы сделаете? Оденетесь под этот бой так, чтобы ваши сопротивления к этим типам стихий были максимальны.
Это будет «перекашивать» баланс в сторону того, кто нападает — он знает, на кого нападает, и к чему готовиться.
Руны же изменяют стихию урона — и физический урон превращается в урон огнем или водой. А учитывая, что их можно менять в любом месте (за исключением локаций) — получится, что атакующий никогда не будет знать наверняка, какими стихиями будет атаковать его соперник, соответственно сопротивления придется или распределять равномерно, или идти «ва-банк», ожидая, что вы знаете, какими стихиями сейчас будет биться этот противник.
Типы брони
Теперь переходим к типам брони.
Механику игр, в которых легкая броня от тяжелой отличается лишь показателями защиты/брони — я считаю плохой. Мне хочется, чтобы каждый тип брони, помимо очевидных для него параметров, обладал и еще какой-то принципиальной особенностью.
В Dusk World будет именно так.
Типы Доспехов | ||||||||||||
|
||||||||||||
Вы уже подумали о том, что будет, если мага одеть в тяжелые доспехи? Кто-нибудь обязательно это попробует, а мы посмотрим, что у него получится :)
В дополнение
Конечно же, каждый класс будет иметь пассивные навыки, дающие бонусы за ношение «родного» типа доспехов для него. И не получится так, что маг будет носить тяжелые доспехи также эффективно, как и воин.
Но в тоже время, прямого ограничения на ношение какого-либо типа доспехов (и оружия) не будет — соответственно мы сможем увидеть и магов в тяжелых доспехах с двуручным молотом, и паладинов в робе, с посохом в руке.
Типы оружия
Оружие имеет несколько классификаций, разберем их.
Во первых, оружие делится на:
- Оружие ближнего боя
- Оружие дальнего боя
Здесь важно отметить, что ряд (ближний/дальний), который будет занимать персонаж зависит не от его класса, а от типа оружия, которое он использует.
Т.е. маг с посохом будет стоять во втором ряду, а если он возьмет в руки меч — переместится в ближний ряд.
Также, оружие делится на тип атаки:
- Атака — мечи, луки, и т.д.
- Заклинание — посохи, жезлы и т.д.
Переходим к типам оружия. Каждый тип оружия имеет какие-то свои особенности:
- Мечи — увеличенная меткость
- Топоры — шанс вызвать кровотечение
- Дробящее оружие — шанс оглушить противника на 1 ход
- Кинжалы — увеличенный базовый шанс критического удара
- Копья — бонус к защите
- Луки — бонус к скорости атаки
- Посохи — бонус к получаемой концентрации
- Жезлы — бонус к хитрости
И существует особый тип оружия — тяжелое оружие. Это особый класс оружия, который:
- Имеет заниженную скорость атаки (0.65 - 0.7), и нередко бывают случаи, когда владелец тяжелого оружия пропускает несколько ходов, «готовясь к атаке»;
- Имеет увеличенный урон;
- Имеет крайне высокий показатель множителя критического удара, что в купе с высоким уроном может с одного критического удара убить противника;
- Игнорирует блок — удары от тяжелого оружия настолько мощные, что щиты от них просто не защищают.
В целом, тяжелое оружие это «экзотическое оружие» для тех, кто любит необычные подходы, и кто готов терпеть недостатки, ради того, чтобы в редкие моменты удивлять противников сокрушительными критическими ударами.
Тяжелое оружие бывает следующих видов:
- Двуручные тяжелые мечи
- Двуручные тяжелые топоры
- Двуручные тяжелые молоты
- Пики
- Арбалеты
Какие-то типы тяжелого оружия имеют аналогичные бонусы обычным видам оружия — например мечи, топоры, молоты. А вот пики и арбалеты имеют бонус к итак немалому множителю критического удара.
Над тяжелыми версиями магического оружия еще размышляю. И в целом, касательно бонусов у оружия еще могут быть изменения.
О классах
Когда мы говорим о разнообразии боевой системы, конечно же нельзя обойти стороной и классы.
Пока у меня нет четкого списка классов и всех их способностей, но в общем основные архетипы классов следующие:
- Танк
- Дамагер ближнего боя
- Дамагер дальнего боя
- Маг
- Саппорт/Хиллер
- Суммонер
Конечно, классы будут органично вписываться в расу, членами которой они являются, и танк орков будет отличаться от танка у эльфов. А, например, у ангелов не будет такого класса как Rogue — т.к. они считают ремесло «вора» недостойным.
Плюс к этому будут особые классы, с какой-то узкой специальностью или особенностью — например ассасин, специализацией которого является убийство магов.
Подводя итог
Возвращаемся к поставленным требованиям, которые можно свести к одному слову — разнообразию.
Что получается:
- 6 рас
- 4 класса в каждой
- 8 базовых характеристик
- 3 способности
- 4 типа брони
- 9 основных типов оружия
- 5 (условно) вариантов распределения пассивных навыков у класса
- 5 (условно) вариантов подбора магических свойств на предметах (например, сделать упор на скорости атаки)
Итого: 6 * 4 * 8 * 3 * 4 * 9 * 5 * 5 = 518 400 вариантов создания/прокачки персонажа.
Даже с учетом того, что 99% из этих вариантов окажутся полностью бесперспективными, останется 2 592 вариантов.
Поделим на количество рас — получается 432 вариантов на расу. А учитывая, что 4 класса на расу это очень мало, и, как уже говорил, буду стремиться где-то к 10 классам на расу — вариативность получится значительно большей.
P.S.
И конечно же, не могу не рассказать о том, чем занимаюсь на данный момент.
Сейчас это три больших параллельных задачи:
- Механика способностей/эффектов/баффов/дебаффов в боевке
- Продолжаю (уже сколько месяцев) разрабатывать систему характеристик. Сейчас уперся в то, что чтобы корректно связать их между собой, т.е. вывести формулы, насколько сила влияет на урон с оружия, или телосложение на размер здоровья и выносливости — нужно сделать (точнее уже делаю) калькулятор (на JavaScript), и уже экспериментируя с этим калькулятором можно будет вывести первые, более-менее адекватные формулы взаимосвязей характеристик.
- И доработка своего фреймворка. Для этого сейчас прорабатываю один курс лекций на ютубе плюс осваиваю Unit-тесты, которые хоть и увеличивают сроки на разработку в 2 раза, значительно сокращают время на тестирование (что на больших дистанциях разработки дает выигрыш по времени) и сильно повышают качество проекта.
При этом, по последнему пункту можно добавить следующее — готовиться к «правильному старту» можно сколько угодно, и уже чувствую, что хочется взять и начать делать, а там уж как пойдет.
В общем, как-то так. Процесс движется, работы много, банально много вариантов с какой стороны эту работу начинать делать. Есть крайне правильный вариант, есть крайне неправильный вариант (по нему прошелся в конце 2016 года), возможно где-то с середины в итоге и зайду :-)
*Пояснения по характеристикам:
- Защита влияет на вероятность уклонения от атак
- Магическая защита влияет на вероятность уклонения от заклинаний
- Сопротивления снижают получаемый урон от атак/заклинаний
Часть 10: Два года разработки – первая демо-версия
Неужели этот день настал – день, когда могу не только рассказывать о разработке, но и предложить всем желающим самим опробовать часть геймплея.
Сразу надо сделать примечание – то, что вы увидите – это не демо всего проекта, а лишь небольшой его части: одна локация + боевка
Чтобы понимать, насколько это мало по сравнению со всем проектом просто покажу рисунком:
И еще – баланс никакой. И в целом, ошибок, которые ускользнули от моего внимания, думаю много. Я бы даже сказал это не демо, а пре-пре-пре альфа-демо-версия локации.
Ну-с, после небольшого, но важного вступления, собственно ссылка на демо:
На ближайшую доработку
Теперь о функционале, который запланирован, но еще не реализован (зеленым отмечено то, что уже добавлено на текущий момент):
Локации
- Возможность указания, что такой-то эпизод (например, боя с боссом) может встречаться только один раз за всю локацию;
- Механика спутников;
- Эпизод со случайным путником – можно будет взять его в спутники на одну локацию, и пока он живой – игрок будет получать половину лута;
- Класс гномов. Его классовое заклинание завязано на призыв спутников - соответственно пока эта механика не реализована, класс недоступен;
- Эпизод с бандитами – их отличие между обычными монстрами в том, что от них можно откупиться. А также, если персонаж противоположного пола бандиту, и у него высокая харизма – бандит передумает нападать;
- Механика лута и его «взятия»;
- Множество других небольших улучшений и доработок.
Боевка
- Механика эффектов – всякие там оглушения, отравления, бафы, дебафы и прочее – все, что может длиться в течении нескольких раундов боя;
- Добавление навыков. Их нельзя добавить, пока не сделана механика эффектов;
- Добавление специальных эффектов у оружия;
- Добавление новых анимаций;
- Множество других небольших улучшений и доработок.
Прочее
- Аватары классов и монстров временные (взяты на просторах Интернета), позже будут заменены на собственные.
Это, а также исправление найденных ошибок и багов займет несколько ближайших месяцев. Плюс, параллельно с добавлением функционала напишу несколько новых частей дневников посвященных бою, оружию и доспехам – чтобы была понята идея самой боевой системы.
После этого, начнется новый, большой эпизод в разработке – полноценная разработка на фреймворке (текущая демо-версия сделана без фреймворка, по этому с технической точки зрения там все примитивно), с проработкой всех параметров персонажа. А их там 250+
И уже после этого – создание такой же демо-версии как и сейчас, но где будет прокачка, инвентарь, предметы, лут, энергия и прочее. Собственно то, что останется лишь расширять (новые зоны, новые локации), углублять (пассивные навыки, крафт, торговля, и т.д.) и доводить до релизного вида.
Ничего по срокам говорить не буду – ну его нафиг :)
Самое главное, и приятное, что с этого дня, любые добавления механик смогу сразу заливать на существующую демку, и вы их сможете сразу опробовать.
И да, разумеется, периодически будут проводиться обнуления всех персонажей и статистики.
Итоги второго года по финансам
В итогах первого года рассказывал о финансовой стороне разработки – сколько и на что потрачено.
Пришло время подвести итоги второго года разработки:
Ассеты графики:
- Beautify
- RPG Cursor Pack
- Park Photo Scanned Assets
- The Big Castle Kit
- Temple of Ancient India
- Royal Heroes Pack
- Stronghold Village
- Forbidden Dungeons
- Demoness / Succubus
- RPG Fantasy (Pack)
- Stone Fountain
- Dungeon Trap - Spear Ejector
- Dungeon Trap - Saw Blade Slit
- PBR Statues Pack
- Dungeon statues and pillars
- Wild Life - Spider
- Army of Skeletons
- Medieval Environment Pack
- Demon Mace - Weapon
- Vampire Girl
- 4 Medieval Chests
- PBR Graveyard and Nature Set 2.0
- Rome: Fantasy Pack I
- Nature Pack
- Old Media
На все – 49 500р.
2D графика на заказ:
- 3 «пробных» рисунка человека-женщины разным художникам: 34 000р.
- Рисунок человека-мужчины, эльфа-мужчины, эльфа-женщины, орка-мужчины: 32 500р.
Итого: 66 500р.
Тексты:
Новых текстов от FaceR'а было мало, по этому 5600р.
По железу:
- Видеокарта (для работы в Unity) ASUS GeForce GTX 1060 6GB: 27 500р.
- Второй компьютер для web-разработки на Ubuntu: 35 000р.
Итого: 62 500р.
Кто-то может сказать, что это «лишние расходы», что можно в Unity и на слабой видеокарте делать большие локации с насыщенной графикой, с FPS 3-5. И что можно веб-разработкой заниматься и на винде – оно конечно можно, только не особо приятно. В разработке и так возникает много сложностей, и так много поводов опустить руки, а когда еще и в техническом плане постоянные проблемы (например, при работе на винде, у меня в Git появляются ошибки, которых я на Linux вообще никогда не видел) – то это лишь добавит повода опустить руки.
Конечно, забить на начатое это не в моем духе, но категорически не согласен с тем, что расходы на «фундамент» (а компы – это именно фундамент разработки) – это лишние расходы.
Итого все вместе: 184 100р.
Суммарно за первый и второй год разработки: 38 000 + 184 100 = 222 100р.
Еще раз напомню, что эту сумму ни в коем случае нельзя считать полным бюджетом на разработку, так как самые главные расходы – 2 года Full-Stack Web-программиста (пусть и в свободное от основной работы время - где-то четверть ставки), т.е. мое потраченное время – остается за кадром.
А на самом деле, человека, который бы как и я, занимался не только веб-разработкой, но еще и в Unity локации собирал, еще и тексты писал, и над сценарием думал, и еще менеджером проекта и геймдизайнером был бы по совместительству – такого на рынке в принципе не найти.
О чем скажет эта сумма (через n-количество лет, когда проект будет закончен) – так это о том, что если вы собрались делать браузерную MMORPG, с аналогичным уровнем графики, и где вы 95% работы будете делать сами – вот столько денег нужно будет готовить на оставшиеся 5%. Чтобы не было иллюзий :)
Вообще о финансовой стороне проекта, и своих мыслях об этом (ну и о донате конечно) много что хочется сказать, какую-нибудь часть дневников посвящу именно этому.
А на этом, сегодняшняя часть дневников разработки заканчивается. Еще о многом хочется и нужно написать, но это – в будущем.
Буду стараться делать новые выпуски чаще, но в меньшем объеме.
Часть 9: Эволюция графония
Посетители заметили, что последние два месяца ничего нового на сайте не появляется, и даже на форум за это время заходил очень редко.
Причина в том, что вот уже три месяца все свободное время трачу на доделку демо-версии с одной локацией Dusk World, которую планировал опубликовать еще на день рожденье сайта.
В общем, осталось совсем чуть-чуть (о том, что именно осталось, написано в конце), но сейчас, отдельной частью дневников хотел бы показать, как эволюционировала графика за прошедший год.
Слева – как было раньше, справа – как выглядит теперь:
Улучшить графику позволило:
- Использование пост-обработки, за счет чего, помимо прочего, получилось победить «эффект пластелиновости»
- Принцип «реалистичного» освещения, когда источники освещения привязаны к «реальным» источникам света. В старой версии было много источников света «из ниоткуда», которые, конечно, повышают видимость в локации, но портят реалистичность.
В тоже время, это еще не предел «красоты». Как минимум есть один неприятный баг с тенями, который пока не удалось исправить. Плюс, создание красивых локаций – это отдельный скилл, который у меня только начинает прокачиваться, и в будущем, должно получаться лучше.
P.S.
Что осталось доделать в демо-версии, чтобы её можно было публично анонсировать:
- Написать 336 коротких текстовых описаний к эпизодам
- Сделать описание интерфейса боя
- Залить демо-версию на публичный домен
- Протестировать еще раз работу локации, удалить тестовые аккаунты их статистику
- Написать новую часть дневников, в которой рассказать о том, какой функционал присутствует в демо-версии, что остается за кадром. А также поделиться планами по доработки как системы локации и боя, так и дальнейшими планами.
Еще раз предупрежу, что сейчас готовится к анонсу не демо-версия всего проекта, а лишь локации с боями. Без прокачки, без предметов, без много чего еще.
Никаких сроков говорить не буду, но, по сравнению с пройденным путем – осталось совсем-совсем немного.
Часть 8: Как прошли последние пол года
Месяцы летят, пора рассказать что было сделано за прошедшее с последнего выпуска время.
Пройдусь прямо по месяцам, затем расскажу, чем занимаюсь сейчас и какие планы на ближайшее будущее.
Отправной точкой возьмем декабрь 2017 года — на начало декабря уже была первая, рабочая версия локации, которую демонстрировал в 6 части дневников разработки.
Дальше были планы доработать модуль локаций (в том числе соединить с боевкой) и сделать демо-версию, которую любой желающий сможет попробовать своими руками.
А еще нужно было значительно увеличить количество «картинок» для эпизодов, с существовавших ~50 до ~500, а для этого, в свою очередь, нужно было создать полностью с нуля свою локацию в Unity3D.
Думал, что управлюсь с этим за месяц, но получилось по другому:
Декабрь 2017
Уже к моменту публикации шестой части дневников меня сильно раздражал один аспект в модуле локаций — что он был написан на «классических» функциях, и было много переменных и массивов, которые приходилось передавать из объекта в объект, из функции в функцию.
Было принято решение переписать все на не популярную в кругах программистов статику (статичные свойства и статичные методы) — для этого пришлось значительно переделать код — изменения были не сложные, но их было очень много.
И, надо сказать, переход на «фулл статику» сильно облегчило и ускорило дальнейшую разработку.
Затем достал из дальней полки модуль боевки (который писал весну-лето 2017), ужаснулся от его кода, и решил его также переписать на «фулл статику».
И в конце декабря начал писать регистрацию, а также приболел — не на столько сильно, чтобы брать больничный (который, на той старой работе, не оплачивался), но в тоже время самочувствие и продуктивность стала очень не очень...
Январь 2018
Начались новогодние праздники, которые встретил также больным и понял, что надо давать себе отдыхать. Работа с утра до ночи, семь дней в неделю сильно изматывает организм.
По этому, не смотря на то, что на праздники у меня были планы посидеть в Unity3D и сделать новую локацию (на этот как раз ушли бы все 10 выходных) — решил просто отлежаться и отдохнуть.
Отдыхая, вспомнил про старое желание сделать новые видео-хроники по Скайриму, по очень суровым правилам и сказал себе «хватит откладывать» - и сделал.
Затем началась работа, и приходя домой продолжил делать демку:
- Дописал регистрацию
- Объединил модуль локации с регистрацией
- Начал писать небольшой модуль регенерации энергии
А затем, в конце января снова заболел (также работал без больничного). Настроение и самочувствие было отвратительным.
Февраль 2018
В феврале продолжал по мелочи допиливать модуль локации (по мелочи там вообще бесконечный объем работы), регистрации, доделал регенерацию энергии.
А потом с грустью взглянул на свой план, составленный вначале 2017 года, в котором было:
- Первая половина 2017 года — написание модуля боевки
- Вторая половина 2017 года — написание модуля локации
- Первая половина 2018 года — написание своего фреймворка, объединение его с локацией и боевкой. Доработка остального функционала: посты, комментарии, рейтинги, характеристики и т.д.
- Июль 2018 — анонс проекта
И понял, что никак не укладываюсь… боевка есть, но она не доделанная, модуль локации есть, но он также не доделан, а к написанию своего фреймворка (почему именно свой фреймвор, а не использование готового — это тема на отдельную часть дневников) еще даже не приступал…
Вздохнув и оглянувшись на текущую кучу дел — добавил к ней еще одно (написание своего фреймворка) — и начал делать.
Куча разнообразных дел это конечно плохо в плане времени их реализации, но хорошо в плане выбора чем заняться — хочешь допиливай боевку, хочешь — локации, хочешь — пиши фреймворк, надоел код — открывай Unity3D и собирай локацию, и много-много других разнообразных дел на выбор.
Март 2018
Продолжая делать все те задачи, что перекочевали из февраля, осознал что нужно сделать еще одно — найти новую работу.
Потому что… расходов много. Даже если делать все очень бюджетно, и 80% делать самому — расходов все равно много. Например, прошло уже полтора года с момента начала разработки, а создание образов персонажей, аватар, иконок даже не начиналось, по причине того, что не было денег на 2D художника.
(кому интересна финансовая сторона разработки — смотрите 4 часть, где подводил итог расходов за первый год, и в сентябре этого года подведу такой же итог за второй год разработки)
Во второй половине марта у меня был отпуск, на который поставил цель — найти работу.
Еще за неделю до отпуска, приходя после работы домой открывал hh.ru и отбирал подходящие вакансии (соответственно времени после работы заниматься проектом уже не было), ну а когда начался «отпуск» - началась полная жара — по 2-3 собеседования в день + постоянные звонки + ведение плана по всем собеседованиям — куда идти, кому тестовое задание сделать, у кого обязательно о результате спросить и т.д.
В общем, в «отпуске» упарился больше, чем во время работы. И сил на свой проект также не оставалось, но цель была достигнута — получил предложение о работе, со значительно большей зарплатой, чем на старой.
К слову, для одной из компаний сделал тестовое задание — игру в крестики-нолики, в браузере, с ботом — желающие могут попробовать.
Апрель 2018
Первая половина апреля — отрабатывал 2 недели на старой работе, а дома активно закрывал пробелы в знаниях, чтобы «не ударить в грязь лицом» на новой работе.
Вторая половина апреля — выход на новую работу, которая меня встретила просто адовым геморроем, из-за которого очень сильно уставал, и сил чем-то заниматься после работы уже не было.
Единственное, что было сделано за весь месяц — в самописный фреймворк добавлена капча.
За все время апрель оказался самым непродуктивным месяцем :)
Май 2018
Жопа на новой работе продолжается, про это можно будет как-то отдельно написать. Только к концу месяца дела стали как-то налаживаться, и начал возвращаться к разработке.
Из сделанного — обновление дизайна википедии по проекту и систематизация параметров и характеристик аккаунта и персонажей — их оказалось огромное количество.
Также, получив зарплату на новой работе, начал искать 2D художников для создания образов персонажей. Из более 50-ти отписавшихся кандидатов отобрал трех лучших и дал им оплачиваемое тестовое задание написать по одному образу.
Июнь 2018
В июне рабочий процесс на новой работе наконец-то вошел в нормальное русло, и моя жизнь тоже. Теперь, приходя с работы не чувствовал себя в конец уставшим и были силы и желание продолжать разработку.
Оставшиеся задачи, которые нужно сделать, для анонса демо-локации:
- Объединить модуль локации с модулем боевки (на удивление сложная задача)
- Сделать локацию подземелья в Unity3D и в ней сделать новые скриншоты эпизодов в количестве ~500 штук
- По-мелочи (бесконечной «мелочи») доделать модуль локации, модуль боевки, регистрацию и прочее...
Чем я и сейчас и занимаюсь.
Художники прислали свои работы — был выбран лучший вариант и сейчас этот человек продолжает рисовать следующий образ. Ориентируемся на 2 недели на образ — соответственно за 6 месяцев будет сделано 12 требуемых образов.
А потом еще рисовать аватары, иконки, карту, интерфейс… в общем, работы в одной только 2D графике тоже навалом.
Мысли об отказе от анонса демо-версии локации
За прошедшие полгода понял, что за кажущейся «мелочью» находится просто огромный пласт работы.
Плюс к этому, сделав свой микрофреймворк (на 80%) и более-менее систематизировав параметры и характеристики подошел к моменту, когда надо, с нуля, но наконец-то по-нормальному писать проект, и уже к нему добавлять модули локации и боевки.
Потому что готовящаяся к анонсу демо-локации — это модуль локации, к которому с боку прикручена регистрация, потом также костылем приделывается боевка, но все это с архитектурной точки зрения очень убого и все равно как структура отправится на помойку.
Уже подумывал отказаться от анонса демо-локации, про которую, к счастью, никто не пишет и не спрашивает «Ну когда там? Ты же обещал!», но…
Но ведь тогда получится, что еще n-количество месяцев никто из посетителей сайта, из тех немногих людей, что следят за разработкой — ничего не увидят.
Конечно, текущая демо-локации очень недоделанная (в ней где-то 10% функционала от планируемого). Даже боевки в ней сейчас нет, но! Она рабочая. В ней можно зарегистрироваться, пройти локацию пару раз, своими руками попробовать её механику, затем посмотреть свое место в рейтингах, а потом еще и оставить отзыв, там же в демо-версии.
Т.е. с одной стороны — мне совершенно не нравится текущая демо-версия, она очень недоделанная и очень урезанная, но, с другой стороны — её можно показать, в неё можно сыграть, и даже по ней можно составить какое-то понятие о том, что будет в будущем.
Тем более, что скоро день рожденье сайта — на который, по традиции, показываю что-то значимое в развитии проекта.
В общем, решил остудить свой максимализм, и потратить оставшиеся дни (до дня рожденья сайта) на доделку демки и подготовку её к анонсу на день рожденье сайта — 17 июля.
В заключение
Внимательные читатели дневников разработки помнят, что год назад, на 9-ти летие сайта, я говорил о планах к 10-летию сделать полностью готовый проект и обновить сайт.
Как не сложно догадаться — все эти планы (а точнее «хотелки») разбились о реальность.
Вообще, оглядываясь назад, забавно получается: когда начинал разработку в сентябре 2016 года, думал что успею к лету 2017. К лету 2017 понял, что объем работы сильно больше, «но вот к лету 2018 точно успею». Пришло лето 2018 и знаете, мне даже страшно думать и говорить о каких-либо сроках на будущее.
Объемы работы очень большие (и поэтому новые MMORPG не появляются каждый день).
План теперь следующий: анонсировать хоть какую-то демо-версию, затем, в процессе разработки, выпускать новые версии демки и когда демо будет более менее похоже на готовый проект — перенос сайта на неё.
Учитывая, что на сайте сейчас 4000+ страниц — один только перенос всего этого контента (без правок обойтись не получится) займет несколько месяцев.
Впрочем, что меня радует — мотивация делать проект ни на сколько не уменьшилась.
P.S.
Кто-то мог удивиться, как автор так подробно помнит про весь процесс разработки по месяцам — на самом деле не помню, а записываю. Записываю все: что сделано, что в планах. Даже мелкие дела и все это с датами по дням.
Благодаря такому списку, во первых, есть четкое понимание необходимых дел на будущее, и такое же понимание что было сделано за прошедший месяц-два-три.
Последнее очень помогает не опустить руки. Потому что получается как — делаешь-делать-делаешь что-то пол года, потом оглядываешься назад «а что сделано то?» кажется, что ничего и не сделано.
А открываешь ежедневник — и видишь, практически по дням, когда и что было сделано. Понимаешь, что процесс идет — просто дел 100500 тысяч.
Такой ежедневник/план начал вести в сентябре 2017 года, сейчас в нем 314 задач, из которых 261 сделана.
Как сделать регенерацию энергии (здоровья или маны) в браузерной MMORPG игре
Прежде чем переходить к руководству, хочу поделиться своим удивлением. Рунет существует ~20 лет. Браузерные игры почти столько же. Система регенерации энергии/здоровья/маны используется практически в каждой. И нет ни одной инструкции как её сделать с примером кода (по крайней мере, я найти не смог). Как?! Вопросы как это сделать встречаются, но вот примера реализации нет. При этом в обсуждениях встречаются какие-то феерические сложные советы «используй node.js», «используй CRON» и т.д.
К чему такие сложности, когда с задачей справится и обычный PHP с MySQL (+ JS на фронте).
Мой пример, возможно, не идеальный, но предупрежу сразу за критику буду кидать тапками, потому что Если вы такие умные, почему я первый, кто сделал пример подобного функционала?. Ответ, конечно, напрашивается сам-собой потому что у нас на одного человека, который что-то делает, приходится десятки экспертов-критиков, которые критикуют того, кто что-то сделал, но вот сами не спешат сделать что-то для окружающих.
Ладно, это были эмоции, надо было высказаться :)
Конструктивная критика, конечно, приветствуется.
Для кого это руководство
- Для тех, кто уже знает основы PHP, ООП, MySQL и хоть чуть-чуть знаком с JS
- Для тех, кто делает свою браузерную игру (возможно MMORPG) на PHP и MySQL
- Для тех, кто хочет реализовать механику регенерации энергии/здоровья/маны, но не может сделать её своими силами.
Руководство не для тех, кто работает в веб-разработки 10+ лет вы сами все сделаете, возможно лучше, чем у меня.
О подходе к задаче
При написании данного примера ставил перед собой задачу сделать нужный функционал с минимальным количеством кода. Я мог бы сделать его на Yii2 или Laravel, добавить к этому AJAX, но тогда новичку было бы сложно во всем этом разобраться понять, где код самого фреймворка, а где код скрипта. Да и тот же фреймворк еще надо уметь поставить.
В итоге вышло ~400 строк кода, с комментариями практически к каждой строчке. Даже новичок должен разобраться. А кто не сможет разобраться даже в этих 400 строк кода с подробными комментариями, должен задуматься а сможет ли он вообще сделать свою браузерную MMORPG. Это довольно сложная и многогранная задача, которая требует некоторого уровня профессионализма.
Демо
Хорошим тоном считаю вначале показать что мы собственно будем делать:
Примечание: в демо все посетители «управляют» энергией одного пользователя, и это может создавать иллюзию «бага»: когда два посетителя будут одновременно увеличивать или уменьшать энергию будут учитываться все действия (вы нажали «-30 энергии», а кто-то в этот момент нажал «+30 энергии» в итоге изменения энергии не произойдет вовсе). Можно было бы под каждого уникального посетителя создавать отдельного пользователя, но это излишние навороты. Учитывая крайне низкую вероятность, что два посетителя зайдут на страницу демо одновременно этим можно пренебречь.
Необходимые параметры
Вначале пройдемся по параметрам, которые нужны для работы (использую теже названия, что и в коде):
-
$cost базовый параметр, который будет храниться отдельно (один для всех) необходимое количество
секунд, для восстановления одной энергии. В примере скрипта, указанного ниже он равен 20. Т.е. за 20 секунд
пользователь восстанавливает 1 энергию
Примечание: если в вашей игре вы планируете, к примеру, добавить предметы, которые будут уменьшать требуемое количество секунд на восстановление одной энергии то данный параметр надо хранить у каждого пользователя отдельно; - id id пользователя. Я буду работать с одним пользователем, и id, в общем-то, не нужен, но закладывать его нужно сразу;
- name имя пользователя, чтобы мы определяли энергию не абстактного нечто, а конкретного пользователя с именем;
- energy текущая энергия;
- energy_max максимальное количество энергии;
- time время последнего обновления энергии - именно по разнице между этим временем и текущим мы будем считать, нужно ли пользователю пополнить энергию и на сколько;
- residue остаток времени - необходимость этого параметра опишу ниже;
- eweight длина полоски энергии мы же хотим видеть полоску энергии, и наблюдать как она заполняется со временем, верно?;
- sweight длина полоски секунд
- time_actual текущее время;
- efull параметр отвечающий за то, полная ли энергия у пользователя или нет. Если энергия полная то никаких дополнительных расчетов делать не нужно;
- difference разница между текущим временем и временем последнего обновления энергии;
- addenergy количество энергии которое мы должны добавить пользователю (может быть 0, 1 или больше);
- residue_new новый остаток времени;
Для реализации нам нужно будет реализовать бек-энд и фронт-энд. Задача бек-энда по запросу выдавать количество текущей энергии пользователя (и дополнительные параметры). Задача фронт-энда визуально эмулировать восстановление энергии (здоровья/маны) в браузере пользователя. Дергать постоянно сервер мы не будем это не нужно.
Стркуткра БД
Базовых параметров, которые требуются для рассчета энергии и которые нужно хранить в базе всего 4: текущая энергия, максимум энергии, время последнего обновления энергии и остаток секунд. Чтобы пример был более приближен к реальности добавил еще два: id пользователя и его имя
MySQL-таблица будет выглядеть так:
SQL код для её создания наполнения
CREATE TABLE `energy` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `uname` varchar(255) NOT NULL, `energy` INT(11) DEFAULT '100', `energy_max` INT(11) DEFAULT '100', `time` decimal(20,4) NOT NULL, `residue` INT(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `energy` (`id`, `uname`, `energy`, `energy_max`, `time`, `residue`) VALUES (1, 'Andariel', 94, 120, '1517230970.1444', 12);
Логика работы бек-энда
Ну что ж, давайте начнем. Что такое «энергия» в браузерных играх объяснять думаю не нужно все с ней сталкивались. Наша задача создать её, и сделать механику её «регенерации».
Вариант №1: Энергия полная
- Получаем данные о пользователе из БД
- Узнаем, полная ли у пользователя энергия
- Если да ничего дополнительно делать не нужно
Вариант №2: Энергия не полная
Вначале опишу на примере конкретных цифр, чтобы было проще понять, затем логикой самого скрипта.
К примеру, у нас есть пользователь с 50 энергии из 100. Последнее обновление было 30 секунд назад, а на восстановление одной энергии требуется 20 секунд.
- Узнав, что энергия не полная, нам нужно узнать разницу между текущим временем и временем последнего обновления получаем 30 секунд;
- Считаем, какое количество энергии можем восстановить, на основе прошедшего времени 30 делим на 20 и округляем до меньшего. Получаем 1;
-
Дальше нам нужно рассчитать количество секунд, которые остались после расчетов:
остаток секунд = разница времени (количество восстанавливаемой энергии * количество секунд на восстановление)
В нашем случае остаток будет 10 секунд; - Итак, мы рассчитали, что игроку надо восстановить 1 энергию, и записать остаток секунд 10, чтобы учитывать их при следующем обновлении страницы (и, соответственно, следующем рассчете текущего количества энергии). Записываем все это в бд: новое количество энергии, остаток, и время обновления энергии обновится само;
Теперь перейдем к реальной логике скрипта
- Получаем базовые данные о пользователе из БД (id пользователя, имя, количество энергии, максимальное количество энергии, время последнего обновления и остаток секунд)
- Рассчитываем дополнительные параметры пользователя. Для этого первым делом узнаем, полная ли у пользователя энергия.
- Если энергия не полная, необходимо рассчитать дополнительные параметры:
- Разница времени в сек. = (текущее время - время последнего обновления энергии) + остаток секунд
-
Добавляемая энергия = разница времени в сек. / количество времени на восстановление одной энергии
Полученное значение округляем в меньшую сторону - Новый остаток в сек. = разница времени в сек. - (добавляемая энергия * количество времени на восстановление одной энергии)
- Далее проверяем, можем ли мы добавить одну или более энергии пользователю
- Если да добавляем энергию (попутно проверяя, не стала ли она выше максимальной) и записываем новые параметры
- Так как базовые параметры изменились по новой рассчитываем дополнительные параметры
- Выводим информацию на страницу
Логика работы фронт-энда
Теперь переходим к фронт-энду. Так как у нас не реал-тайм геймплей (PHP для данной цели вообще плохо подходит, я бы смотрел в сторону NodeJS), то знать количество энергии пользователя нужно только в момент отображения (обновления) страницы и каких-либо действий например пользователь хочет войти в локацию, вход в которую стоит 20 энергии, и только в этот момент нам нужно узнать реальное количество энергии пользователя.
В остальных случаях, когда пользователь просто открыл страницу и смотрит на неё нам достаточно сделать эмуляцию восстановления энергии, которая, в тоже время, будет соответствовать реальной энергии.
Для этого пишется довольно простой JS-скрипт-таймер, который каждую секунду (в моем примере это секунды, хотя можно сделать и другие промежутки времени) добавлять «по секунде», а когда накопится нужное количество секунд для восстановления одной энергии увеличивает количество энергии на 1, а счетчик секунд сбрасывает.
Когда энергия полная (или если она полная изначально) таймер останавливается.
Как бек-энд и фронт-энд работают в паре
При запросе к серверу (открытии страницы, или изменении энергии) бек-энд считает все данные, проверяет возможность изменения энергии и формирует html страницу вместе с нужными параметрами для js скрипта.
Когда страница загрузилась начинает работать js, который запускает функцию timer(). Он в свою очередь запускает функцию step(), которая обрабатывает логику счетчика, а он в свою очередь запускает функцию view(), которая обновляет информацию на странице.
Примечания
- Точность: При расчетах остаток секунд округляются до целых, соответственно может теряться до 0.5 секунд. Если игра не подразумевает частых расходов энергии, и частого обновления страницы то это нормально. Иначе нужно будет дорабатывать точность: окгуллять не до целых, а, например, до десятых или сотых.
- AJAX: Сейчас при изменении энергии обновляется страница, и, соответственно, перезапускается js-скрипт. Если вы будете изменять энергию AJAX-ом, то js-таймер нужно будет запускать отдельно.
- Безопасность: В текущей версии все реальные расчеты происходят на бек-энде. Пользователь может со своей стороны что угодно делать с html/js (рисовать какие угодно цифры) это никак не повлияет на реальные значения энергии пользователя.
Часть 6: Локации
С момента написания последней части дневников прошло больше двух месяцев - пора рассказать, как идет процесс разработки.
Все это время разрабатывал механику прохождения локаций, поэтому об этом элементе геймплея сегодня и расскажу.
Для тех, кто предпочитает смотреть, а не читать проматывайте в конец, там видео.
Примеры реализации локаций в других MMORPG
Прежде чем создавать что-то свое, разумеется, стоит посмотреть как это сделано у других.
Лига ангелов 2 (и аналоги)
Классический пример локации в браузерной MMORPG это цепочка «мест», где игроку предстоит сразиться с монстром. Победил - открывается следующее «место», где игрока ждет такой же монстр, но чуть посильнее.
Крайне примитивно и скучно.
Осклоки Снов
Еще один вариант локаций это полноценная 2D локация, с видом сверху. Такой вариант значительно интереснее предыдущего варианта, но очень трудоемкий в плане реализации. По сути, нужно делать полноценную (и качественную) 2D графику, стоимость которой весьма высока. Поэтому отпадает.
Пароград
Полноценные 3D локации. Высокая цена графики и анимации + большая нагрузка на сервер, за счет реал-тайм геймплея. При этом, не смотря на затраты графика будет выглядеть весьма примитивно т.к. текстуры с высоким разрешением весят много - передавать каждый раз через браузер невозможно (никто не будет ждать 10 минут для загрузки локации).
Поэтому, полноценное 3D в браузере я считаю самым печальным - расходы на разработку будут значительны, а картинка будет значительно уступать клиентским MMORPG.
Оглядываясь на настольные игры
Делать совсем просто и примитивно, как в Лиге Ангелов 2 (и бесконечных аналогах) не хотелось. В тоже время ресурсы на графику и серверные мощности ограничены, поэтому варианты полноценных 2D и 3D локаций отпадают (подробнее об этом писал здесь). В размышлениях обратил внимание на настольные игры. У них также весьма ограниченные возможности, но их разработчики умеют придумывать интересный, а главное реиграбельный геймлпей.
Одна из основных механик настольных игр - это «колода событий». Рассмотрим на примере простой игры «Манчикин»:
У игры есть всего две колоды - первая, «дверь» - это то, что игрок встречает. Чаще всего это какой-то монстр, проклятье или что-либо еще. И есть вторая колода - «сокровища» - это то, что игрок получает при убийстве монстров.
Карты тянутся случайным образом. И значительная часть интереса игры завязана на том, что никто не знает, какую карту двери или карту сокровищ он вытянет. Сделай выбор карт фиксированным - и игра станет совершенно неинтересной.
Пример из другой игры - Аркхем
Здесь также многое завязано на случайные события из колод карт. Например в игре есть локации - попав на них игрок тянет случайную карту из соответствующей колоды.
При этом, в отличие от Манчикина, в Аркхеме есть свобода действий – в какую локацию пойти, на что потратить деньги, убивать монстров на карте или закрывать порталы и т.д. И за счет выбора у каждого игрока появляется своя стратегия.
Выбранная концепция
После долгих размышлений решил остановиться именно на варианте, в чем-то схожим с «колодой событий» из настольных игр.
Они имеют два больших преимущества:
1) Реиграбельность, которая очень важна в жанре MMORPG, подразумевающий перепрохождение одних и тех же локаций множество
раз - каждый раз вы будете получать уникальную цепочку событий.
2) Свобода действий. Если в классической 2D/3D игре все, что вы хотите донести до игрока нужно показывать ему визуально, то формат
событий-карточек позволяет ограничиться простым текстом. В Dusk World, события будут сопровождаться скриншотами сделанными
в полноценной 3D локации в Unity, что, конечно, сложнее, чем просто написать текст, но в любом случае это в сотни раз проще,
чем делать полноценную 2D/3D анимированную сцену.
Итак: Локации в Dusk World - это набор определенных эпизодов, которые появляются (в основном) случайным образом. Они уникальны для каждой локации, хотя, такие эпизоды, как встреча с монстрами, или нахождение чего-то ценного актуальны всех локаций.
Скриншот, показывающий как сейчас выглядит прохождение локации:
В левом верхнем углу - параметры персонажа: здоровье, мана, выносливость, ужас (подробнее о них ниже). В правом верхнем углу - текущие эффекты. Визу - описание текущего эпизода и варианты действий. Над описанием есть две иконки - левая открывает доступные зелья, правая - доступные заклинания.
Ресурсы игрока
Рассмотрим ресурсы, от которых будет зависеть геймплей локаций:
- Здоровье Всем понятный ресурс. Тратится на сражения с монстрами, при попадании в ловушки. Восстанавливается с помощью зелий или заклинаний. Если здоровье персонажа упало до нуля - он погибает.
- Мана Тут тоже все понятно. Тратится на использование заклинаний. Постепенно регенерируется.
-
Выносливость Расходуется на каждый «ход» по локации. При этом расход зависит от типа брони, и, иногда, сам
эпизод может дополнительно расходовать выносливость (сделано для возможности создавать локации типа болот, где каждые
5 метров будут даваться сложнее, чем на обычной, твердой земле. При достижении нуля персонаж получает дебаф «Предельная
усталость» - весь получаемый урон увеличен в два раза.
В будущем планирую добавить вес и максимальный переносимый вес - которые также будут влиять на расход выносливости. Персонаж налегке будет тратить меньше выносливости, чем нагруженный под завязку (что логично). -
Ужас Персонажи в Dusk World не супер-герои, поэтому, когда они видят мертвецов, мутантов, и прочих тварей размерами с трех этажные дома,
они, разумеется, испытывают страх. Ужас - это ресурс, который увеличивается при встрече с монстрами, или какими-либо другими, пробирающих до костей
событиями. Таким образом, ужас постепенно накапливается в течении прохождении локации, а при достижении максимума - персонаж впадает в
безумие и убегает из локации с широко раскрытыми глазами. Чтобы не допустить безумия, уровень ужаса нужно уменьшать с помощью
специальных заклинаний и зелий, держа его на безопасном уровне.
Здесь надо сделать небольшое отступление, и уточнить, чем именно отличается смерть от безумия. В текущей демо-версии они ничем не отличаются, но в релизной версии будет так: за смерть персонаж теряет часть набранного опыта на текущем уроне, а в случае с безумием - несколько случайных предметов из сумки (не одетых). -
Заклинания в текущей версии все классы получают по 3 базовых заклинания (восстановление здоровья, восстановление выносливости и снижение ужаса)
и одно классовое. В релизной версии, разумеется, ассортимент заклинаний будет значительно большим.
Вообще по развитию заклинаний есть очень большие планы - сделать различные школы магии, разные уровни заклинаний, и, главное - навык работы с той или иной школой заклинаний. Персонажи с низким навыком в магии не смогут даже со 100% вероятностью создавать заклинания, а те, кто потратил годы на тренировки смогут не только использовать самые мощные заклинания, но и будут иметь бонус к эффекту, и сниженный расход маны. - Зелья если ресурсы на исходе, маны нет, то выручить могут зелья. В релизной версии игрок сам будет выбирать, какие зелья ему взять (а лимит зелий будет определять пояс), в отдельной альфа-версии локаций все игрок получают стандартный набор: 2 зелья восстановления здоровья и по одному зелью восстановления выносливости, маны, и снижения ужаса.
Характеристики персонажа и их влияние на механику
Другие параметры персонажа, такие как сила, ловкость, интеллект и другие также будут оказывать влияние на прохождение:
- Сила иногда вам будут встречаться эпизоды, проверяющие силу. В перспективе планирую добавить переносимый вес, который будет зависеть от силы. Чем больше нагружен персонаж - тем сильнее расходуется его выносливость.
- Ловкость влияет на шанс уклониться от ловушки. А также на шанс подкрасться незаметным к монстрам. Вероятность подкрасться незаметным к монстрам зависит от разницы между вашей ловкостью и ловкостью монстров. Также существуют навыки (в демо такой навык имеет охотник) увеличивающие вероятность скрытности.
- Интеллект иногда вы будете встречать загадки, с вариантами доступных действий. Персонажи с высоким интеллектом получат подсказку к правильному ответу.
- Выносливость при встрече с монстрами, которые вас заметили и не испугались, можно попытаться убежать от них. Шанс успешного бегства от монстров зависит от разницы между вашей выносливостью и выносливостью монстров.
- Тип доспеха влияет на количество расходуемой выносливости при исследовании локации (переходе с одного эпизода на другой) и шанс подойти к монстрам незамеченным.
-
Уровень влияет на вероятность того, что монстры испугаются и убегут. При этом стоит отметить, что монстры имеют два уровня - обычный,
и так называемый power level. При расчете вероятности бегства монстров уровень игрока сравнивается с power level монстра. Сделано это
для того, чтобы можно было делать сильных монстров, которые не будут пугаться даже сильно превосходящего в уровне персонажа. Здесь
стоит также отметить, что в расчете вероятности бегства учитывается суммарный power level монстров, а значит один волк убежит со значительно большей
вероятностью, чем 10 таких же волков.
Также существуют способности, позволяющие выглядеть более грозным, а следовательно, увеличивающие вероятность бегства монстров.
Примечание: локации будут иметь строгое ограничение по максимальному уровню, поэтому не получится зайти в такие локации, где все монстры будут от вас убегать.
Рейтинги
MMORPG и рейтинги это как инь и янь. Лично я рейтинги люблю, и в Dusk World их будет много. Например на каждую (!) локацию будет четыре рейтинга:
- Первопроходцы: рейтинг игроков, которые успешно прошли данную локацию раньше всех.
- Дальше всех: рейтинг игроков, которые прошли максимально глубоко. Здесь нужно добавить, что чем глубже проходит игрок по локации, тем более многочисленных монстров он будет встречать. А также, начиная с 35 глубины, с 10% вероятностью он встретит тупик (дальше идти нельзя). Поэтому, чтобы побороться за топ первопроходцев, нужно будет иметь не только прокаченного персонажа, но и удачу. Учитывая, что у локаций будет довольно строгое ограничение по максимальному уровню борьба за данный рейтинг будет весьма интересной.
- Удачный заход: рейтинг игроков, собравших больше всего богатств за одно прохождение (с учетом всех предметов в рейтинг будет засчитываться их базовая стоимость)
- Доминация: рейтинг игроков, раньше всех победивших босса локации.
Соревноваться с бездушными мобами или ботами – скучно. Рейтинги в этом плане показывают достижения других игроков, и предлагают попробовать обойти их.
Dusk World: Пре-пре-пре-альфа версия локации
Ну-с, и собственно пример того, как это выглядит вживую. Напомню, это пока очень сырая ранняя версия, как в плане графики, так и в плане механики:
Ближайшие планы
В конце декабря/начале января выпустить вторую часть дневников разработки по локациям. Расскажу какие варианты эпизодов сделаны, какие в планах, возможно покажу что-то свежее с боевой.
В конце января подготовить демо-версию локации, которую уже сможет попробовать любой желающий. Но, это планы. Ничего не обещаю.
Как сделать систему уровней в браузерной MMORPG
Почитывая Toster.ru наткнулся на вопрос, о том, как сделать систему уровней в браузерной MMORPG. Вначале хотел найти какое-нибудь руководство (вопрос-то стандартный, каждый разработчик браузерной игры сталкивается с ним), и сказать мол «держи, учись пользоваться гуглом», но оказалось, что руководства с примерами на эту тему в общем-то и нет.
И тут подумал, а почему бы не сделать рунет чуточку полезнее – добавить руководство на эту тему, плюс написать новую часть дневников. А главное – сделать дневники разработки не просто рассказом о том, как разрабатывалась очередная браузерная MMORPG, но и добавлять в него практичные руководства о том, как сделать тот или иной элемент игры.
В общем, решение принято поехали.
Примечание: руководство подразумевает, что вы имеете базовое знание php, sql и ООП. Если даже базовых знаний нет браться за разработку своей браузерной MMORPG вам еще рано.
Результат, который получим
Считаю хорошим тоном в руководствах, когда вначале показывают результат руководства, и только затем, рассказывается, как такой результат получен. По этому:
Пример реализованной системы уровней | Код на github
Руководство: Как сделать систему уровней в браузерной MMORPG
Постановка задачи
Вначале, как профессиональные разработчики, давайте четко озвучим задачу, которую собственно будем решать:
1. Есть пользователь и его опыт (по сути, один параметр)
2. На основании опыта пользователя необходимо получать:
а) Уровень пользователя
б) Количество опыта, которое ему необходимо набрать до следующего уровня
в) Количество опыта на текущем уровне
г) % величина набранного опыта на текущем уровне – нам эти % потребуются для отображения классической полоски,
заполняющейся по мере получения опыта, и визуально показывающая игроку, сколько осталось до уровня.
3. Что будем хранить в БД, что рассчитывать на ходу:
в БД будем хранить:
а) опыт
б) уровень
Оставшиеся параметры будем рассчитывать на ходу.
Хранить уровень в БД или рассчитывать?
Спорный вопрос, который встает перед разработчиком, при создании системы уровней – в том, хранить ли уровень в базе данных, или рассчитывать каждый раз при необходимости.
Единственный ответ на тостере был в формате «рассчитывайте каждый раз» - я с таким советом не согласен. Уровень игрока может много где использоваться – например различные проверки на использование предметов (ограничение по уровню), доступ в локации (опять же, ограничение по уровню) и тому подобное. Если уровень хранится в базе – он просто берется как один из параметров. Если рассчитывать его на ходу – то это придется делать каждый раз, когда нужен уровень, а все эти вычисления расходуют процессорные мощности.
Конечно, если в вашей игре никогда не будет больше 10 игроков одновременно – то на оптимизацию можно забить. Но, по-хорошему, о ней нужно задумываться заранее.
Впрочем, оптимальное решение зависит от самой игры. Если уровень игрока практически нигде не используется, и отображается только текущему пользователю – тогда да, его логичнее будет рассчитывать на ходу.
Составляем таблицу уровней
Когда только начинал делать систему уровней, не долго думая набросал табличку в формате:
1 уровень дается сразу
2 уровень требует 500 опыта
3 уровень требует 1000 опыта
4 уровень требует 2000 опыта
5 уровень требует 3000 опыта
и т.д.
Но, согласитесь, такой подход, когда требуемый опыт берется «с потолка» - не серьезен. К тому же, он не дает представления о том, как растут наши требования к уровню – резко, плавно, с постепенным увеличением прогрессии, или наоборот, с замедлением?
Чтобы создавать систему уровней не «с потолка», а где мы четко будем понимать, какая у нас прогрессия – необходимо строить функции. Да, те самые «бестолковые» функции вида «y=2x+3», которые мы проходили в школе.
Открываем сайт desmos.com и строим тот график, который ходим, например, с постепенно возрастающей прогрессией:
А затем, на основе функции составляем таблицу уровней.
Я использовал простую функцию: y = (x * 10) ^ 1,4
И вот таким php-кодом, составлял таблицу:
<html> <head> <title>Создаем таблицу уровней и требуемого опыта</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <?php $lvl = 1; $a = 1.4; $totalexp = 0; echo '<table border="1"><tr><td>Уровень</td><td>Всего опыта</td><td>Опыта до<br />следующего уровня</td></tr>'; while ($lvl < 11) { $y = round(pow(($lvl * 10), $a)); echo '<tr><td>'.$lvl.'</td><td>'.$totalexp.'</td><td>'.$y.'</td></tr>'; $totalexp += $y; $lvl++; } echo '</table>';
Получается такая таблица:
В таком виде мы и создадим таблицу в MySQL (ниже будет указан SQL код для генерации и заполнения MySQL-таблиц). При этом, если вы передумаете, или получите отзывы от игроков, что уровни идут слишком быстро, или, наоборот, слишком медленно – достаточно будет только изменить формулу, и вы сразу получите обновленную таблицу уровней.
Можно (точнее нужно) пойти еще дальше – сделать так, чтобы php скрипт не только отображал таблицу, но и сам, на основе новых значений, заполнял MySQL-таблицу. Чтобы «ребаланс» прокачки менялся нажатием парой кнопкой и все. В текущем примере этого не делается, чтобы не перегружать руководство информацией.
Создаем MySQL таблицы
Теперь переходим к созданию таблиц. Для текущего примера с уровнями нам потребуется две простых таблицы:
1. Таблица пользователей
id – id пользователя
name – имя пользователя
lvl – уровень пользователя
exp – общий опыт пользователя
2. Таблица уровней
lvl – уровень
exp_to_lvl – необходимый опыт для получения следующего уровня
exp_total – общий опыт на текущем уровне
SQL-код, который создаст таблицы и заполнит их информацией:
-- Таблица Users CREATE TABLE `users` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255), `lvl`INT DEFAULT 1, `exp` INT DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- Таблица Levels CREATE TABLE `levels` ( `lvl` INT DEFAULT NULL, `exp_to_lvl` INT DEFAULT NULL, `exp_total` INT DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- Заполняем таблицу User INSERT INTO `users` (`id`, `name`, `lvl`, `exp`) VALUES (NULL, 'Diablo', '1', '0'); -- Заполняем таблицу Levels INSERT INTO `levels` (`lvl`, `exp_total`, `exp_to_lvl`) VALUES ('1', '0', '25'), ('2', '25', '66'), ('3', '91', '117'), ('4', '208', '175'), ('5', '383', '239'), ('6', '622', '309'), ('7', '931', '383'), ('8', '1314', '462'), ('9', '1776', '544'), ('10', '2320', '1000000');
На 10-том уровне игрок увидит, что на следующий уровень ему потребуется 1 000 000 опыта. Таким образом я сделал простой «блок прокачки». В вашей реальной игре, конечно же, нужно будет сделать более человечный способ.
Переходим к коду
Примечание: при написании этого примера был выбор – или писать его на каком-нибудь Фреймворке,
вроде Yii2 или Laravel, или писать «кривой-велосипед». Учитывая, что данное руководство ориентированно на
новичков в программировании новички, могут банально не суметь поставить Yii2 или Laravel, и понять,
где там код фреймворка, а где код, относящийся к уровням – решил писать «велосипед» (в котором даже MVC-паттерна
нет).
Я поставил перед собой задачу минимальным количеством кода написать рабочую систему уровней.
Так как финальный код доступен на github, пройдусь только по ключевым аспектам.
Вернемся к тем значениям, которые нам нужно получить, и рассмотрим логику их вычисления:
Уровень пользователя
По умолчанию, при создании пользователя, он имеет 0 опыта и 1 уровень. Измениться уровень может только при изменении опыта.
Получать мы его будем таким вот хитрым запросом:
SELECT MAX(t.lvl) FROM (SELECT lvl FROM levels WHERE exp_total - ? <= 0) t
Вместо ? подставляется текущий общий опыт пользователя. И на основе данных из таблицы уровней (levels) сразу возвращается текущий уровень пользователя.
Чтобы руководство не разрослось на 100500 страниц, не буду описывать логику работы этого запроса, скажу лишь, что польза текущего руководства на 50% именно в нем. В качестве домашнего задания можете разобраться, как он работает.
Год назад, когда впервые сталкивался с необходимостью создания системы уровней, мне этот запрос подсказала Няш – опытный программист. Не думаю, что даже сейчас, спустя год, догадался бы о таком простом и элегантном решении.
Количество опыта до следующего уровня
SELECT `levels`.`exp_to_lvl` FROM levels JOIN users ON users.lvl = levels.lvl users.id = ?
Здесь мы делаем простой запрос, на основе уровня пользователя, который получается на основе его id.
В написанном примере используется лишь один пользователь, и можно было бы обойтись и без id вообще, но, на мой взгляд, заложить работу с id пользователей это необходимый минимум. На MVC можно плюнуть, на подключение к БД через синглтон можно забить, а вот если код написан так, что может работать только с одним игроком – это ниок.
Количество опыта на текущем уровне
Для получения этого параметра мы должны из общего опыта пользователя вычесть общий опыт для данного уровня:
SELECT ? - exp_total FROM levels WHERE lvl = ?
Вместо первого ? подставляется общий опыт пользователя
Вместо второго ? подставляется уровень
И на основе данных в таблице уровней получаем количество опыта на текущем уровне.
% величина набранного опыта на текущем уровне
Рассчитывается по следующей формуле: % = («Опыт на тек. уровне»/«Опыта до след. уровня») * 100
В php коде это выглядит так:
$this->userinfo['expbar'] = round(($this->userinfo['exp_at_lvl']/$this->userinfo['exp_to_lvl']) * 100);
Что касается самой логики, то она довольно проста:
1) Если опыт пользователя изменился, то:
2) Делаем проверку на то, изменился ли уровень пользователя, для этого делаем запрос на нового текущего уровня (на основе нового опыта), и сравниваем его с текущим – если они не сходятся – значит:
3) Необходимо перезаписать уровень пользователя в БД
4) Выполнить необходимые действия, в зависимости от того, увеличился уровень или уменьшился. В текущем примере такого функционала нет, но в рабочей MMORPG он обязательно будет – например, игрок получает очко навыка, на каждом уровне (при этом, важно не забыть, рассчитать на сколько именно изменился уровень – вдруг игрок получил сразу 2 или 3 уровня – значит и награду он должен получить *2 либо *3 соответственно.
Выше описаны основные механики. Посмотреть общий код можно на github:
level.sql – SQL запрос для создания таблиц;
model.php – модель работы с БД. Не забудьте изменить данные для подключения к БД;
lvl.php – вид и контроллер. Здесь то, что отвечает за обработку и отображение данных;
index.php – точка входа, просто подгружает lvl.php;
lvl_table.php – скрипт построения таблицы уровней;
/img/ - папка с аватаром пользователя (по-хорошему, информация об аватаре должна храниться в БД, своя для каждого
пользователя).
Пару слов о безопасности
Безопасность (отсутствие уязвимостей) в браузерной MMORPG – один из важнейших элементов. Можно создать отличную игру, но если уровень, золото, взламывается на раз-два – играть в такой проект никто не будет.
В существующем коде специально сделал небольшую уязвимость, чтобы каждый мог почувствовать себя хакером, и знать, как делать не стоит.
Посмотрим на код, который добавляет опыт:
<form method="post" action=""> <input type="hidden" name="exp" value="5"> <button type="submit">Добавить 5 опыта</button> </form> <form method="post" action=""> <input type="hidden" name="exp" value="20"> <button type="submit">Добавить 20 опыта</button> </form> <form method="post" action=""> <input type="hidden" name="exp" value="50"> <button type="submit">Добавить 50 опыта</button> </form> <form method="post" action=""> <input type="hidden" name="exp" value="zero"> <button type="submit">Обнулить опыт</button> </form>
Как не сложно догадаться, value="" – это и есть тот опыт, который добавляется персонажу. Можно открыть редактор страницы, прямо в браузере (F12 в Google Chrome), изменить значение на 75, нажать на кнопку «добавить опыт» и вы увидите, что вместо старого значения, добавится то, которое вы прописали (но, не больше 99 - в коде сделано ограничение).
Как было бы более защищено? Сделать в формах лишь название типа добавляемого опыта:
- addsmallexp
- addmediumexp
- addbigexp
И уже на основании этих названий добавлять 5/20/50 опыта. Тем самым, вы ставите варианты добавляемого опыта в жесткие рамки.
Хотя, и это далеко не все. Есть еще стандартная csrf уязвимость и многое другого. Описыванить их все – не входит в задачи данного руководства.
Но в целом, проверка надежности браузерной MMORPG сводится к следующему:
- Публикация игры на различных форумах программистов/хакеров с просьбой попробовать взломать (практика показывает, что желающих взломать хватает)
- Ведение логов на все значимые действия и события – чтобы даже если какой-то читер и завелся в вашей игре, вы смогли отследить его по логам, и узнать на какой именно механике он читерит.
P.S.
Надеюсь, что данное руководство поможет молодым разработчикам браузерных MMORPG. Лично мне, вначале пути, очень не хватало именно примеров реализованного функционалов. Не документации, не умных слов «как надо», а простой банальный пример, который работает.