Verzov Order — модификация для Command & Conquer: Red Alert 2 — Yuri’s Revenge. Действие происходит в альтернативном 1985 году: холодная война переросла в глобальный вооружённый конфликт, а два противостоящих блока сражаются по всему миру.
Мод предлагает две основные стороны, разделённые на восемь субфракций. У каждой — собственные уникальные боевые единицы и тактические особенности.
В Союзную коалицию входят США, Западноевропейский оборонный фронт, Великобритания и Восточноазиатский альянс. Всемирный социалистический союз объединяет СССР, социалистическую Восточную Европу, Югославию и Кубу.
Как-то два года назад, мы с другом подумали, а почему бы нам не попытаться создать свой собственный инди-проект, со скромным скоупом на полгода, так сказать ради спортивного интереса. И... в результате нас затянуло в сам процесс создания настолько, что игра начала разрастаться, сжирая в разы больше времени, чем до этого планировалось. Из простенького одиночного хоррора с необычными механиками, он трансформировался в мрачный, хардкорный, кооперативный сурвайвал-хоррор в ретро-стилистике, с глубокими неказуальными игровыми механиками.
Хочется немного поделиться не совсем тривиальной историей создания проекта, который не пытается держать игрока за дурака, а дает ему возможность собственного эксплоринга механик и челлендж который интересно принять с друзьями.
С чего всё началось
Идея родилась из любви к старым хоррорам и иммерсив играм вроде System Shock 2, Dead Space, Resident Evil, тайтлам от Frictional games, на самом деле список референсов просто огромен, и в связи с этим игра, можно сказать, набрала с миру по нитке в процессе развития, так как постепенно обрастала различными механиками. В качестве движка мы выбрали Unity, так как у моего друга уже был опыт работы в нем. Немного провозившись с запеченным светом, взвесив все за и против, мы решили остановиться на полном динамическом освещении, т.к. мы хотели реализовать очень быструю загрузку левела, даже на старых системах, и с определенными оптимизациями, у нас это получилось. С fps у нас проблем не было, фреймрейт был и остается стабильно высоким.
Система освещения стала полностью динамической
Дизайн-документ отсутствовал как таковой, игра была скорее экспериментальным миксом, где хаотичность только добавляла креативности. Смелые решения, на которых строилась игра, были изначально рассчитаны исключительно на нишевого любителя. Поначалу игра позиционировалась как гораздо более простое одиночное выживание, но с тактическими элементами, где нужен менеджмент ресурсов, правильное распределение своих запасов и своевременный поиск новых а также спасение сотрудников станции, которые становятся тебе подконтрольны, что в дальнейшем и раскрывает глубину стратегических решений в игре.
Инвентарь весьма ограничен, но есть способы это исправить в игре
Но все это требовало большого объема работы, и в результате незаметно переквалифицировало скромный проект, практически, в игру мечты с высокими амбициями. Сроки сдвигались все сильнее, механики рождались одна за другой, каждое новое тестирование порождало новые баги и правки на уровне геймдизайна. Например интересно было попробовать завязать на физике игровые ситуации, обыграть их применение, иногда даже получались забавные моменты.
Пошёл на боулинг с друзьями. Правда, они не знали, что будут кеглями:)
Вдохновением во многом послужили такие классические хоррор-киноленты как Чужой, Нечто и даже Хищник. Мы не ставили перед собой задачи сделать сюжетную игру, лор игры минималистичен, и больше опирается на атмосферную подачу, а основной акцент сделан на геймплее и метаигре. Сама природа проекта предполагала определенный темп поддерживающий напряжение и интерес выживания, так как читать записки сейчас попросту никому не интересно, да и к тому же опасно в таком экстремальном окружении.
Пробираться сквозь такие "заросли" - то еще удовольствие...
Акцент в игре сделан не на пресловутых скримерах, а скорее смещен на психологическое напряжение вызываемое исследованием запутанного лабиринта в экстремальных условиях. То что происходит внутри головы игрока, когда мыслительный процесс переплетается с чувством беспомощности вызываемым отсутствием у игрока вооружений способных полностью уничтожать враждебных существ, подобно играм Frictional games, добавляет напряженности в игровой процесс. Вообще, изначально механика рассудка в нашей игре и была вдохновлена непосредственно Amnesia: The Dark Descent, Call of cthulhu: Dark Corners of the Earth. Помутнение зрения, головокружение, замедление передвижения, сердцебиение и тяжелое дыхание заставляют считаться с психическим состоянием команды. Все эти эффекты мы добавляли с целью увеличения погружения игрока, иммерсивности.
Иногда лучше просто избегать встречи с некоторыми существами.
Некоторые интересные игровые элементы перекочевали напрямую из Silent Hill, одного из опаснейших монстров в игре можно засечь по радиопомехам усиливающимся по мере его приближения. Это натолкнуло нас на идею обнаружения некоторых противников при помощи специальных гаджетов: сканеров, специальных галогеновых ламп, сонаров или банально по шуму шагов, по задумке это должно было заставлять игроков быть всегда начеку и держаться в группе, разделяясь лишь по острой необходимости.
Различные комбинации перков дают разнообразные стили игры
Раздача приказов и быстрое параллельное управление юнитами вылились в систему управления отрядом, которая буквально случайно получилась почти один в один как в ghost recon advanced warfighter. Также игра унаследовала некоторые элементы от SWAT 4, например отсутствие возможности прыгать, требование к командной работе разных классов юнитов в связке все больше добавляло глубины к тактике. Например, в игре несколько играбельных классов, каждый из которых имеет уникальные способности, один может сканировать местность на угрозы, в то время как другой выполняет работы по завариванию/развариванию дверей (совсем как в Killing floor). В свою очередь, различные классы могут быть разблокированы по мере получения очков опыта, также как и перки. Очки опыта можно получать практически за любые выполнения действия или задания. Систему перков мы решили реализовать необычным образом: разблокировав и экипировав конкретный, он набирает силу в течение игровой сессии, по мере нахождения улучшающих его обновлений программного обеспечения костюма.
Сложность увеличивается...
Спустя год разработки, мы пришли к выводу, что такие механики весьма непросты в использовании, и гораздо более интересны и удобны, когда появляется кооперативный опыт, который в свою очередь умножается на многомерность различных игровых ситуаций вызванных большим количеством переменных. Несмотря на понимание сложности сетевой составляющей, мы решили рискнуть и попытаться интегрировать мультиплеер, где можно в любой момент подключиться к игре, по аналогии с Left 4 Dead.
Визуальный стиль интерфейса местами подражает C-12: Final Resistance
Определенные сложности возникли также с разработкой голосового чата - на удивление, пришлось потратить почти целый месяц на него, это был камень, на котором мы внезапно споткнулись. Мы специально отказались от модного proximity voice, чтобы ради большего погружения и тактики добавить реализма, который дает удаленная радиосвязь. Радиосигнал с его несовершенствами звукопередачи и шумами создает впечатление, что ты в каком-то остросюжетном фильме.
Возвращаясь к концу первого года разработки, когда у нас внезапно появилось совершенно спонтанное решение добавить кооперативную игру, начались бесконечные тестирования сетевой составляющей. По правде говоря, желание создать сетевой экшен было изначально, но оно было подавлено пониманием того, насколько это усложнит процесс разработки и увеличит ее сроки в дальнейшем. Но преодолев лень и страхи, мы решили все же попробовать, так как желание поиграть с друзьями стало попросту сильнее.
Моменты тестирования. Осторожно: присутствует нецензурная лексика.
Среднее время прохождения плейтестовой версии достигало 3-х часов для новичка, а то и более. Блуждание по базе могло усугубить этот процесс, но чувство потерянности и азарт исследования - это то, что дает новые эмоции, когда игра не ведет тебя за руку, а дает делать ошибки, и позволяет самому делать небольшие открытия, вдохновляющие играть дальше. Постепенное изучение карты начинает давать преимущества, и игрок получает прогрессию даже на основе знания, где что лежит или спавнится, даже вещи в ящиках это, по сути, условный лутбокс, добавляющий азарт. Относительно долгое время прохождения, заставило нас интегрировать систему сохранения на ранних этапах. Многим не хватало чекпоинтов.
Суть нашей системы внутриигрового сохранения в том, чтобы предотвратить savescumming и сформировать у игрока ощущение ответственности за свои действия, быть осторожным и продумывать свои действия, взвешивая все риски, так как игра заканчивается, если погибли все подконтрольные игрокам сотрудники станции, т.е. сохранение удаляется при смерти всех доступных юнитов. Пресловутый save and exit из Diablo 2, но с permadeath, правда облегченный тем, что можно иметь большой запас "жизней", если спасать сотрудников и оставлять их в безопасной зоне, т.е. возможность возрождения также может быть неограниченна, если заранее об этом позаботиться. Отчасти это может стимулировать игроков работать сообща, планировать маршруты, стараться быть менее заметными, применять умный подход к выживанию, различные устройства, классовые способности и комбинировать их. Кто-то использовал бы грузового дрона, т.к он менее заметен по дефолту (еще более незаметен со стелс перками), а кто-то мог бы выманивать монстра сонаром и потом заваривать за ним дверь, или просто убежать, включив экзоскелет, избавляющий от затрат выносливости. Но использование любых способностей требует энергии для костюма, которую в свою очередь можно добывать уничтожая миазмы и перерабатывая добытые при помощи бура биоматериалы в биотопливо.
Наша оригинальная «фишка», эволюция окружения
Мы понимали, что рост проекта уже было не остановить, слишком много сил уже было вложено, и довести до конца начатое хотелось бы при любом раскладе. Конечный успех стал не особо важен, потому что сам процесс разработки начал приносить все больше удовольствия. Многие механики перерабатывались из-за непонимания некоторых подводных камней геймдизайна на ходу, но один из основных концептов остался неизменным - распространение заражения. Ключевая механика - это система развития заражения базы неизвестной формой жизни, которая разрастается в миазмы и различные ткани (привет Зергам) со временем, создавая все новые препятствия и ловушки, усиливая враждебных существ и меняя их поведение в зависимости от уровня заражения. Понижение этого уровня становится одним из приоритетов выживания, и для этого существует множество различных способов: поливаете ли вы кислотными растворами ткани, используете ли таранный бур для уничтожения миазм, подключаете систему жизнеобеспечения с воздушными фильтрами или забрасываете предметами потяжелее взрывоопасные пустулы, выбор за вами.
По мере прогрессирования заражения, двери могут зарастать тканями блокируя проходы, зомби из медленных и слепых, станут куда более шустрыми и опасными, трупы ваших сотрудников со временем будут превращаться в зомби, будет спавниться все больше надоедливых клещей, преследующих игрока при отсутствии освещения, которого они так боятся. За каждой дверью может таиться опасность, а за каждой тенью угроза. Враждебные существа по-разному реагируют на стимулы: свет наведенный на одно существо привлечет его, а другое отпугнёт, кто-то из них ориентируется на шум и скорость передвижения. Если удастся найти редкий прибор ночного видения, можно попытаться отыгрывать скрытность в одиночку, не пытаясь поддерживать на базе освещение, постоянным пополнением топлива в генераторах. Вариативность прохождения, позволяла нам самим как разработчикам не уставать от тестирования собственной игры, с каждым разом играть становилось все интереснее.
Отдельно можно упомянуть случайность появления предметов, в каждом ране подавляющая часть предметов спавнится рандомно, на полках и в контейнерах (а-ля Escape from Tarkov), также как и многие проявления "эволюции базы" меняют свое расположение. Это создаёт тот самый эффект «живого лабиринта», когда нужный проход может оказаться заблокирован, или напичкан ловушками, что динамически создает непредвиденные задачи и предлагает игрокам проявить свою изобретательность в их преодолении. Многие контейнеры с большой вероятностью будут заперты, и для доступа к ним нужны коды, которые как "местная валюта" добываются путем взлома терминалов, с определенной вероятностью, поэтому в команде неплохо иметь выделенного члена группы с перком хакера, для повышения шансов успешных взломов, который будет в дальнейшем обеспечивать группу дополнительными ресурсами с более высокой вероятностью.
В текущий момент рандомизация событий будто бы наталкивает нас на дальнейшую идею реализации фриплея в игре, но бесконечно масштабировать ее нельзя (несмотря на весь потенциал) по понятным причинам, но это уже совсем другая история.
Что мы имеем в итоге
Death Imminent - это :
Кооператив со стелс-элементами: Иногда тишина и скрытность - единственный способ выжить.
Управление отрядом и тактика: нужно распределять роли, давать приказы, работать в команде, планировать действия.
Менеджмент ресурсов: кислородные баллоны, аптечки, биоматериалы - всё на счету.
Классовая система, развитие персонажа через перки и накопление опыта.
Ретро-эстетика: низкополигональная графика с мрачной цветовой гаммой и опциональной пикселизацией.
Живой лабиринт: уровни непредсказуемо меняются с течением времени, создавая динамическую систему живущую по своим правилам.
Мрачный оригинальный саундтрек: напряженный эмбиент специально написанный для создания чувства решимости в безвыходной ситуации.
Что дальше?
Мы запустили плейтест в Steam, чтобы попытаться собрать обратную связь по геймплею и балансу, если вдруг имеются желающие попробовать поиграть с друзьями или в одиночку.
Вопрос к сообществу
Какие механики, фишки в подобных и вышеупомянутых играх понравились и запомнились больше всего Вам? Также хотелось бы узнать, как воспринимается сложность процесса игры, ее освоение, какие моменты вызывают трудности или раздражение, а также чтобы Вам хотелось увидеть в игре дальнейшем?
В апреле 2023 года мы запустили необычный для нас проект - ремонтный сервис нового формата. Первого клиента нашли только в начале лета, но уже с первого проекта удалось достичь запланированной прибыли. Расскажу, как мы создали современную компанию для поколения "новых денег", которые не готовы к тому, что прораб будет класть половину стоимости ремонта себе в карман, а сроки растягиваются без ограничений и почему это оказалось прибыльным бизнесом.
Как всё начиналось
Конец 2022 года. Я работал менеджером проектов в крупной IT-компании, мой друг Антон - тимлидом в другой известной технологической компании, а Дима занимал позицию backend-разработчика в третьей. У всех стабильные зарплаты, интересные проекты - жизнь шла своим чередом, пока Антон не решил купить квартиру в новостройке.
После долгих поисков он остановился на 85-метровой квартире в ЖК около метро Саларьево - современный комплекс с подземным паркингом и зелёным двором. Как типичный программист, к поиску ремонтников он подошёл педантично: изучил десятки предложений, провёл собеседования с кандидатами. В итоге выбрал бригаду с Авито с "15-летним опытом работы".
Денис (это я:) - один из создателей сервиса
За время ремонта у Антона мы с Димой часто приезжали к нему - помочь, посоветовать, и просто поржать над очередными косяками строителей. У нас обоих за плечами был серьёзный опыт управления командами, внедрения процессов, автоматизации и контроля качества. И знаете что? Нам казалось, что главное в ремонтном бизнесе - это грамотный менеджмент и организация процессов. И на самом деле, все примерно так и есть.
День когда мы решились
Если честно, мысли о собственной ремонтной компании появились у нас задолго до этого случая. В IT-тусовке часто шутят, что в России есть три верных пути: вебкам, айти и стройка. И мы, насмотревшись на хаос в ремонтной сфере, не раз обсуждали возможность открытия своей “фирмы”.
Мы выделили основные проблемы, которые должны были исправить с помощью своего сервиса
Первое - это постоянно растущие сметы и "задранная стоимость" на работы. Ну вы серьезно? Почему для меня ремонт в квартире должен чем-то отличаться от заказа носков на Вайлдберриз? Почему-то там нет такого, что цена носков может вырасти в 2 раза за время доставки. А тут начальная смета в 1 миллион превратилась почти в 1,7! И каждый раз это "ой, тут стены кривые", "ой, а тут придется докупить", "ой, а это мы не учли".
Второе - это бесконечно растущие сроки. Это еще хуже. Как люди с опытом в менеджменте, мы прекрасно знали, что растущие сроки – это всегда раздолбайство управления и ленивые рабочие. Но тут было чуть посложнее, об этом чуть позже. У Антона обещали сделать за 4 месяца, а в итоге растянули на 8.
Третье - хитрые прорабы. Это вообще отдельная история. Когда прораб говорит "давайте я сам закуплю материалы, у меня скидки", знайте - он накинет сверху процентов 30-40. А еще есть "срочные работы", которые почему-то не были учтены в смете. И конечно, вечная классика - экономия на материалах: заказываешь одно, а привозят что-то попроще, но по той же цене.
Целевая аудитория
А параллельно с этим мы определили нашу целевую аудиторию. Чтобы выделиться на конкурентном рынке, мы решили ориентироваться на молодых IT-специалистов и представителей “современных” профессий, живущих в Москве в возрасте 30-40 лет. Тех, кто покупает квартиру в новостройке и привыкших к хорошему сервису. Кто не готов, что его будут водить за нос и разводить на деньги.
Что с ценой?
При этом очень важно было держать цены НИЖЕ, чем у других компаний, иначе на рынке просто не выжить. В премиум сегмент нужен "пропуск" в виде большого количества работ для определенного типа клиентов, поэтому нам было понятно, что "брать" много - пока что, непозволительно. Но мы нашли способ: автоматизация процессов, прямые поставки материалов, четкое планирование работ и никаких скрытых накруток. Но несбыточной мечтой это покажется только обывателю: на самом деле сервис и правда должен быть таким, вообще любой.
История первого заказа летом 2023 года
А теперь самое интересное - наш первый заказ. Это была отдельная эпопея. Начало лета 2023, звонок от потенциального клиента.
Первый клиент оказался прямо "в яблочко" - тоже айтишник (пришедший из первой контекстной рекламы в яндексе запущенной на 20 тыс.), работал в крупной компании, купил двушку в панельке 80-х годов. Причем достаточно убитую - стены местами с дырками, старый паркет, трубы помнящие еще Горбачева... Но нам, если честно, даже повезло что первый объект был не новостройкой. На старом фонде учиться легче - там хотя бы есть на что посмотреть, в отличие от новостроек, где все "сюрпризы" спрятаны в голых стенах.
Дырка в стене была ДО демонтажа. Клиент купил квартиру с "убитым" ремонтом подешевле, в надежде сэкономить
Как мы мастеров искали
Начали с поиска бригады. Вот тут был первый холодный душ - оказалось, что найти классных специалистов без своей наработанной базы очень сложно. Мастера хорошего уровня либо уже при деле, либо просят космос. А те, кто сразу соглашается - ну, вы понимаете. За две недели провели больше 10 собеседований (назовем их так😊). Причем процесс собеседования мы сразу сделали "как в айти" - тестовые задания, проверка портфолио, разбор технологий работы. Бригадиры были в шоке - некоторые прямо уходили с собеседований, когда мы начинали распрашивать про технологии укладки плитки и показывали фотографии косяков с объектов с форумов.
В итоге нашли бригаду - два брата, которые до этого работали в крупной ремонтной компании, но ушли потому что устали от "серых" схем – по отношению К НИМ ЖЕ. В основном - задержки з/п и прорабы.
В том же санузле, но уже после демонтажных и некоторых черновых работ. Братья очень помогли нам с первым ремонтом, кроме этого, они дали нам контакты проверенных рабочих, которые впоследствии делали ремонт вместе с ними
Купили первый комплект инструмента - это отдельная история на 100 тысяч рублей. Ещё сразу купили свою тепловую пушку - это из необычного. Большинство компаний привлекают "потолочников" на субподряд. Мы захотели сразу начать формировать свой инструментарий для будущих сотрудников. Зато потом эта закупка очень помогла - не зависели от того, что принесет с собой бригада. Позже, когда начали расширяться купили свою штукатурную станцию. Это, на удивление, было самой выгодной покупкой.
Первые сложности
Начали ремонт. И тут поехало... Первый сюрприз - когда начали снимать старую штукатурку, оказалось что стены буквально рассыпались. Плюс под старым линолеумом в коридоре нашли деревянный пол с насыпью под ним.
Тут был первый серьезный разговор с заказчиком. Объяснили ситуацию, показали все фотки, рассказали что сколько будет стоит в соответствии с прайс-листом. Тут очень помогло то, что мы сразу взяли за правило - фотографировать вообще все. Каждый этап, каждый слой, каждую трубу.
С материалами тоже было весело. Первый месяц я лично объездил все крупные строительные магазины в радиусе 30 км. Искал поставщиков, договаривался о скидках. Помню, как чуть не купили партию плитки по "супер-выгодной" цене, а потом выяснилось что это условно "второй сорт" - брак, который продают через "серые" схемы.
Cделали систему закупок: (Первый заказ полностью сделан из материалов, купленных в Петровиче и на маркетплейсах). Бригада присылает список - мы проверяем цены у 3-4 поставщиков и заказываем где дешевле.
Мы сразу внедрили систему ежедневных фото-отчетов и еженедельных созвонов. Плюс сделали чат в телеграме, куда скидывали все чеки, все накладные, все фотки. Такая прозрачность очень помогла - клиент видел, что мы не химичим с ценами и не пытаемся на нем нажиться.
В итоге сделали.
Братья советовали нам недостающих специалистов по ходу ремонта и постепенно, укладываясь в срок мы сдавали клиенту новый и новый этап. Честно, это было не так сложно как казалось в начале, но нужно понимать, что на самом деле, проблем по ходу ремонта и мелких трудностей было ОЧЕНЬ много, просто мы как люди привыкшие, понимали что сейчас это и есть наша работа , за которую нам платит клиент - взять на себя все заботы по ремонту. Но серьезных форс-мажоров не возникало, максимум понервничали, когда внесли предоплату потолочникам, которых нашли по объявлению, после чего они явно начали задерживать сроки, но в итоге, все обошлось. Нам и до этого было ясно, что чем быстрее мы соберем свой , хотя бы, небольшой штат, тем лучше и выгоднее. Но для этого надо быть уверенным в постоянном потоке заказов, что мы на тот момент, не могли себе позволить.
Главное - мы поняли как надо и как не надо. Все закупки только через нас. Все договоренности - только в письменном виде.
По деньгам первый проект получился условно в ноль - не считая наших вложений в инструмент и рекламу. Но мы получили бесценный опыт, наработали связи с поставщиками (если это можно назвать так пафосно) и главное - поняли, что наша модель рабочая, хотя на тот момент не были в этом до конца уверены. Наши сомнения развеяло лето 2023 года.
1/5
Наша первая работа, которую нам помогли закончить "братья", советуя недостающих мастеров на каждый этап работ. Цена работ для заказчика вышла 750 000 рублей. Летом 2023 года, за аналогичный объём работ авитовские бригады просили до миллиона(!)
Сайт и маркетинг или как мы общаемся с клиентами ещё до первого звонка
Кстати, про сайт. Первую версию мы сделали за пару вечеров на Тильде - максимально простую: фотки, цены, контакты. Знаете что? Он у нас до сих пор такой – но с значительно изменённым UI/UX. Я иногда ловлю себя на мысли - вот мы же, можем сделать что-то крутое, с личным кабинетом, онлайн-сметами... Но потом смотрю вордстат, статистику и думаю - а зачем? Клиенты находят нас, звонят, все работает. Иногда лучшее решение - самое простое.
1/2
На главной странице "в лоб" о том кто мы, наши конкурентные преимущества, специализация и примеры работ
1/2
Сразу "ярко" заявляем о действующих скидках. Кроме этого, простым текстом пытаемся общаться с клиентом и убедить его в нашем сервисе, пока что, не общаясь с ним лично - конверсия в лиды увеличилась значительно, но важно, чтобы все предложения были реальны
А вот ворд стат. За последний месяц нас искали 680 раз не считая статистики переходов по прямой ссылке. Доказательство того, что дорогой сайт не нужен. Наш стоит 6 000 рублей в год, а сделан за 20 часов
Примеры лучших работ как маркетинговый инструмент
1/4
Оставляли подобные фото с примерами работ и вотермаркой в отзывах к жилым комплексам. Отличный маркетинговый инструмент - сразу определяем нужную ЦА и бесплатно заявляем о себе. Точно знаем, что минимум один клиент был из отзывов яндекс - поэтому работает
Как мы масштабировались и разбирались в проблемах ремонта
Теперь про то, как мы начали разбираться в проблемах ремонта и потихоньку расти. Знаете, за этот год мы много думали - почему вообще ремонтные компании задерживают сроки и не могут сделать работу по первоначальной цене? И нашли несколько интересных моментов.
Первое - сроки. Тут даже копать глубоко не пришлось - сам рынок сформирован так, что клиенты просто привыкли к задержкам. "А, ну это ремонт, тут всегда так" - классическая фраза. Благо тут нам помог опыт организации процессов из айти. Четкие спринты, ежедневные отчеты, календарный план. Работает как часы, если не филонить.
Второе - вечно растущая цена. Вот это было сложнее. В новостройках еще можно точно посчитать, а во вторичке... Но благодаря наработкам этот вопрос стал гораздо яснее. При правильно организации процессов, непредвиденные работы лучше оплатить из своих средств, чем терять клиента. Только так и делается сервис.
Третье - больная тема - воровство на материалах. Тут мы конкретно закрутили гайки. Завели строгий учет, до последнего мешка штукатурки. Прорабам сразу сказали - любая жалоба от клиента на нечестность - это конец сотрудничества. Знаете что самое смешное? Когда начали работать честно, оказалось что маржа все равно хорошая. Просто многие привыкли что надо обязательно накручивать еще и еще.
Неприятные особенности прозрачного сервиса
Большинство компаний, которые начинают работать честно, быстро сдуваются. Потому что сам потребитель привык к плохому сервису. Приходишь к клиенту, говоришь "мы все сделаем четко по смете и в срок", а он смотрит с недоверием - "да ладно, так не бывает". Сейчас в 2024-м ситуация получше, но рынок все еще очень консервативный.
Продвижение или как мы брали “Новую Москву”
Наш любимый Прокшино в Новой Москве - в 2024 году, это самый перспективный район в котором покупатели - наши потенциальные клиенты
Расти начали потихоньку. Сначала сделали специальные цены для новой Москвы - там как раз много новостроек, где мы хорошо научились работать. Потом пошли заказы по рекомендациям. Когда я говорю “пошли” заказы нужно понимать, что это 1-3 заказа в месяц стабильно, что на самом деле, тогда казалось не мало. С рекламой экспериментировали забавно - оставляли визитки в подъездах (да, просто старые добрые визитки!), ставили рекламные ящики у офисов продаж в дни выдачи ключей.
Был случай, когда на одном ЖК поставили такую стойку, а через неделю риелтор оттуда сам позвонил и предложил взять себе процент, если клиент пойдет к нам.
Сейчас берем 2-5 заказов в месяц, (летом было 5 в месяц, если разделить). Большинство клиентов приходят по рекомендациям. Штат за год работы постепенно собрали свой. Трудоустроено 14 сотрудников. Если их не хватало (как летом), привлекали мастеров с которым уже работали раньше, по договору ГПХ. Просили всех регистрировать самозанятость или ИП – это было тяжело, но зато честно платим налоги по Доходы – расходы.
Как устроен процесс
Знаете, что самое сложное в ремонтном бизнесе? Нет, не поиск клиентов и не работа с материалами. Самое сложное - это выстроить систему, которая будет удовлетворять запросы клиента и при этом позволит компании зарабатывать. Мы долго думали над этим и придумали несколько интересных решений.
Начнем с оплаты. Если посмотреть на московский рынок, там забавная система - вроде бы без предоплаты, но это только за первый, самый дешевый этап. А потом - бац, и клиент должен внести 50% от всей суммы. И попробуй не внеси - бригада уйдет на другой объект. Мы сделали иначе: разбили весь ремонт на этапы (их получилось 12 для капитального ремонта), и берем предоплату только за текущий этап. То есть клиент всегда понимает, за что именно платит, и может контролировать процесс.
С договорами тоже интересно получилось. Сначала делали один стандартный, а потом поняли - люди разные, запросы разные. Сейчас у нас три варианта: просто на работы (для тех, кто сам хочет закупать материалы), на работы плюс материалы (самый популярный), и полный пакет с дизайн-проектом. Кстати, про дизайн - мы не держим штатных дизайнеров, работаем с фрилансерами. Так получается и дешевле для клиента, и качество выше - каждый дизайнер специализируется на своем стиле.
Первый образец договора, который ставили на сайт
Расчёт стоимости
Расчет стоимости работ - отдельная история. Когда начинали, было очень сложно. На рынке нет четких цен - один мастер берет 3 тысячи за квадрат стяжки, другой - тысячу, третий вообще говорит "ну давайте посмотрим по факту". Сначала работали по среднему прайсу, но часто уходили в минус по отдельным этапам - то бригада дороже встанет, то материала больше уйдет. Сейчас, когда появились постоянные сотрудники, стало проще - мы точно знаем их расценки и можем давать фиксированную цену.
Материалы
Выяснилось, что в крупных магазинах часто дешевле в сравнении с рынками стройматериалов, особенно если ловить акции. Плюс появились маркетплейсы - там вообще красота по ценам. И главное - полная прозрачность, клиент сам видит все позиции. Если находим материал дешевле - возвращаем разницу. Был случай, когда на керамограните сэкономили клиенту почти 30 тысяч - просто потому что, нашли ту же плитку в другом магазине по акции.
Как работаем сейчас
Сейчас берем 2-5 заказов в месяц, зависит от сезона и сложности объектов.
Процесс обкатан до мелочей: сначала выезд на замер, потом предварительная смета. Если клиента все устраивает - детальный расчет и договор. Дальше начинается самое интересное - согласование материалов, закупки, работа.
Особенности продвижения и подводные камни
С продвижением интересно получилось. Сначала, как все, полезли на Авито. И знаете что? Не зашло. Там своя специфическая аудитория и конкретно у нас, с Авито “ не пошло”.
Свежий пример страницы с авито в категории "Ремонт квартир". Как клиенты определяются с подрядчиком среди тысяч однотипных объявлений - хороший маркетинговый вопрос, который мы решаем, после чего полноценно "зайдём" на авито
Пробовали контекстную рекламу яндекс - тоже так себе результат. Клики дорогие, конверсия низкая. Зато отлично зашла таргетированная реклама в Instagram* (*запрещен в РФ) и реклама в районных пабликах ВКонтакте. Особенно в группах новостроек в ТГ - там как раз наша целевая аудитория.
Но главный канал - сарафанное радио. Причем работает оно интересно. Всегда знаешь , от кого пришли заказчики и проще выстраивать коммуникацию. Есть клиент - он доволен, рассказал коллегам - и понеслось. За три месяца получили еще два заказа от сотрудников той же компании. Выходит такой “корпоративный ремонт”)))
Были, конечно, и провалы в продвижении. Пытались работать с риелторами - предлагали им комиссию за клиентов. Не пошло - у них свои схемы, свои бригады. Пробовали давать рекламу в лифтах, входных группах - тоже мимо, ни одного обращения, но тут скорее из-за того что эта реклама буквально на день.
ИТОГ
Сейчас мы существуем уже чуть больше года и в целом смотрим на ремонтный рынок не так, как раньше. За это время мы сделали несколько важных заметок для себя:
Оказывается, большинство проблем в ремонте - это не технические сложности, а банальная организация процессов. Когда все четко спланировано и каждый знает что делать - даже самый сложный ремонт идет как по маслу.
Мы поняли, почему многие компании "химичат" с ценами и сроками - просто потому что не умеют нормально считать и планировать. Когда все процессы выстроены правильно, можно работать честно и все равно оставаться в плюсе.
Самое сложное - это не найти клиентов или научиться делать ремонт. Самое сложное - это переломить привычку рынка работать "по-серому". И заказчики, и исполнители настолько привыкли к непрозрачным схемам, что честный подход вызывает удивление.
Мы до сих пор учимся. Каждый объект - это новый опыт и новые вызовы (особенно по части коммуникаций с клиентами). Но главное - мы видим, что наша модель работает и пока что, нам удается держать ценник немного ниже рыночного, за счёт того что до сих пор не имеем в найме маркетологов, IT, отдела продаж и менеджеров по продажам. Стараемся нанимать именно рабочих, все остальное можно отдать на аутсорс.
Уважаемые пикабушники, были рады составить для вас эту статью! С любовью, СК Комната
Предлагаю вашему вниманию небольшое развитие прошлого нейрослопа. Сетевой шутер, сборщик ящиков :-) доступен по ссылке. Управление с клавиатуры и мыши.
Можно бегать (есть бага - англ раскладка должна быть включена), собирать ящики. Двери открываются E. Убивать друг друга и монстров.
Буду постепенно развивать (графончик от руки нарисую, интересные евенты и активности добавлю)
Пока просто тест - а такая механика вообще интересна?
Ну конечно, на четвёртой статье самое то писать про архитектуру проекта. Как раз, чёрт побери, вовремя 😁 Но, как говорится, лучше поздно, чем никогда.
Напомню, я делаю Tranza Online — симулятор транспортной компании. Игрок начинает с одной машины, выполняет заказы, зарабатывает деньги, покупает новый транспорт, обслуживает парк, строит компанию и постепенно разрастается до более серьёзного бизнеса.
На старте всё казалось достаточно простым. Есть игра, есть backend, есть база данных, есть небольшой сайт-лендинг. Ну и что тут может пойти не так?
Изначально архитектура была максимально простой:
Есть два контура: dev и prod.
Дев поднят локально на Linux-машине в Docker. Там крутится backend, база, сайт и всё, что нужно для разработки. Настроен автодеплой из PhpStorm, чтобы не пересобирать контейнеры руками после каждого чиха.
Прод живёт отдельно. Изменения выкатываются через GitHub Actions при пуше в master. Ничего сверхъестественного: собрали, доставили, перезапустили нужные сервисы.
Сайт на тот момент был просто лендингом на чистом HTML. Он никак не влиял на игровой backend, ничего не знал про игровые данные, ни с кем особо не разговаривал. Просто показывал информацию об игре, а рядом лежали файлы для скачивания.
И для такого сценария эта архитектура была нормальной.
Проблемы начались ровно в тот момент, когда сайт перестал быть просто страничкой.
Я решил доработать лендинг, который до этого был завайбокожен примерно за один запрос, и превратить его во что-то более-менее внятное:
регистрация и авторизация;
подтверждение почты;
восстановление пароля;
личный кабинет;
новости;
детальные страницы новостей;
дневник разработки;
список игровых компаний пользователя;
служебные уведомления;
минимальная админка.
И тут сразу встал вопрос: а где всё это хранить?
Первый очевидный вариант — просто добавить новые таблицы в существующую базу Game API.
Технически так сделать можно. Особенно на старте. Более того, это самый быстрый путь.
Но проблема в том, что backend игры в таком случае начинает отвечать вообще за всё:
игровую экономику;
транспорт;
компании;
заказы;
прогресс игрока;
авторизацию на сайте;
подтверждение почты;
восстановление паролей;
новости;
дев-лог;
личный кабинет;
админку;
рассылки;
служебные уведомления.
И получается не backend игры, а целый комбайн с гордым названием "потом разберёмся".
А "потом" обычно наступает в момент, когда уже больно.
Поэтому я решил разделить сайт и игровую часть хотя бы на уровне доменов и ответственности.
Новая схема для каждого стенда выглядит примерно так:
То есть теперь сайт — это не просто папка с HTML-файлом, а отдельная часть продукта.
Site Frontend отвечает за публичные страницы:
главная;
новости;
детальная страница новости;
дневник разработки;
страница авторизации;
личный кабинет;
дорожная карта.
Site Backend отвечает за всё, что относится именно к сайту:
регистрацию;
вход;
подтверждение почты;
восстановление пароля;
сессии или токены;
новости;
дев-лог;
отправку писем;
пользовательские настройки сайта;
запрос краткой игровой информации из Game API.
Site Database хранит данные сайта:
пользователей сайта;
email-токены;
password reset-токены;
новости;
записи дев-лога;
настройки профиля;
служебные данные личного кабинета.
Game API остаётся отдельным и занимается только игрой:
игровые компании;
транспорт;
гаражи;
заказы;
маршруты;
экономика;
топливо;
ремонт;
обслуживание;
прогресс;
внутриигровое время;
будущая MMO-логика.
То есть сайт не должен знать, как рассчитывается доход автомобиля за игровой день. А Game API не должен знать, как сверстать страницу новости или отправить письмо для восстановления пароля.
Это разные причины для изменений. А если причины для изменений разные — лучше не держать всё в одной куче.
Отдельная боль — авторизация.
Сейчас есть соблазн сделать так, чтобы один бэк отвечал и за регистрацию и вход Game API и хранил игровых пользователей и игровые данные. Вот только важно не напороться на дублирование пользователей. Если сайт регистрирует пользователя, а Game API тоже хранит пользователя, нужно сразу решить: кто является источником истины?
То есть пользователь как аккаунт живёт на стороне сайта/авторизации.
А Game API хранит не “пользователя сайта”, а игровой профиль, привязанный к userId.
Условно:
Сайт может спросить у Game API:
GET /profiles/me GET /companies/my GET /companies/{id}/summary
И показать в личном кабинете, например:
какие компании есть у пользователя;
сколько всего транспорта;
какой баланс;
когда была последняя активность;
есть ли активные заказы.
Но управлять игровыми сущностями сайт не должен. Он только показывает краткую информацию. Все действия с игрой остаются внутри игры и Game API.
Отдельный Auth-сервис, конечно, очень просится, тогда и сайт, и игра, и админка могли бы ходить в один центр авторизации. Но я стараюсь не устраивать микросервисный зоопарк раньше времени. Поэтому на первом этапе авторизация может жить внутри Site Backend, но проектироваться так, чтобы потом её можно было вынести отдельно без ритуального сожжения всего проекта.
Примерно так:
То есть главное — не физическое разделение с первого дня, а нормальные границы внутри кода.
То же самое с кэшем и очередями.
Можно спросить: "Зачем тебе cache и queue на таком этапе?"
Справедливый вопрос.
Кэш нужен не потому, что у меня уже миллионы игроков и сервер задыхается. Пока нет. Кэш нужен для нормальной инфраструктуры вокруг сайта и игры:
хранить временные токены;
ограничивать частоту запросов;
кэшировать публичные новости;
хранить короткоживущие данные;
ускорять часто запрашиваемые summary-данные;
не дёргать игровую базу там, где можно не дёргать.
Очередь нужна для фоновых задач:
отправить письмо подтверждения;
отправить письмо восстановления пароля;
обработать уведомление;
опубликовать новость;
пересчитать служебные данные;
подготовить статистику;
в будущем — обрабатывать игровые события.
Например, пользователь зарегистрировался.
Пользователь не должен ждать, пока где-то там отправится письмо.
Плюс очередь пригодится и в игре. Например, если потом появятся фоновые игровые события, уведомления, пересчёты, обработка завершённых заказов или отложенные операции.
Админку тоже решил заложить сразу, хотя бы в минимальном виде.
Не огромную корпоративную панель управления космическим кораблём, а простой инструмент, чтобы не лазить руками в базу.
На старте админка может уметь:
создавать и редактировать новости;
публиковать записи дневника разработки;
смотреть пользователей;
смотреть игровые профили;
видеть список компаний;
проверять служебные статусы;
включать/отключать публикации;
смотреть базовые логи.
Без админки всё это обычно заканчивается SQL-запросами руками. А SQL-запросы руками на проде — это отдельный вид эротического искусства.
В итоге целевая архитектура сейчас выглядит примерно так:
Физически это не обязательно должно быть десять разных серверов. На старте всё может спокойно жить на одной машине в Docker.
Важнее другое: логически разделить зоны ответственности.
Сайт отвечает за сайт. Game API отвечает за игру. Админка отвечает за управление. Очередь отвечает за фоновые задачи. Кэш отвечает за быстрые временные данные. База игры не превращается в склад всего подряд.
Понятно, что это всё ещё не финальная архитектура. Если проект доживёт до полноценного онлайна и MMO-механик, там появятся новые вопросы:
отдельный Auth-сервис;
матчинг или распределение игровых серверов;
обработка игровых событий;
античит;
аудит операций;
внутриигровая экономика;
очереди событий;
аналитика;
мониторинг;
централизованные логи;
миграции;
резервное копирование;
rate limiting;
разграничение прав;
модерация.
Но пытаться решить всё это прямо сейчас — верный способ не выпустить вообще ничего.
Поэтому текущая цель проще: сделать архитектуру не идеальной, а такой, чтобы через полгода не хотелось удалить репозиторий и уйти выращивать огурцы.
На старте, на мой взгляд, разумным будет такой компромисс:
Не делать огромный монолит, где сайт, игра и админка перемешаны.
Не делать полноценные микросервисы ради микросервисов.
Разделить домены и базы там, где это действительно имеет смысл.
Оставить возможность вынести Auth в отдельный сервис позже.
Сразу заложить очередь и кэш, но использовать их без фанатизма.
Держать Game API максимально чистым от логики сайта.
Возможно, я где-то перемудрил. Возможно, наоборот, где-то ещё недодумал.
Поэтому если у вас есть предложения, возражения или желание сказать “да зачем тебе всё это, сделай один Laravel-монолит и не страдай” — добро пожаловать в комментарии.
Архитектура, как известно, лучше всего проектируется коллективным спором в интернете.
Всю эту неделю занимаюсь тем, что перерабатываю игровой интерфейс. Добавляю различные украшательства и прочее. Большая часть игры нещадно вайбкодится, куда ж без этого ) Но я честно стараюсь максимально контролировать весь процесс разработки. Но иногда что-то уходит из под контроля, либо просто ещё не время для "правильного подхода". Так и с интерфейсом.
Пока внедрялись основные игровые механики, было не до красоты. Главное - чтобы работало. Но когда снова и снова запускаешь игру, интерфейс, мягко говоря, начинает надоедать. Не потому что он визуально скучный, а потому что всё какое-то типовое, одинаковое.
1/4
Одинаковые экраны
Да, наполнение различается, но структурно практически ничего не меняется. Основная область, шапка, правый сайд-бар. И так в каждом экране (( Ключевое тут именно "экраны".
Решил что пора что-то менять и менять кардинально.
В экономических играх чаще всего это не какие-то одинаковые дашборды, это множество окон, порой перекрывающих друг друга, и отображающих действительно нужную информацию. Как пример - баланс. На большинстве экранов он отображается, но эта информация не всегда необходима здесь и сейчас. Удобнее открыть вспомогательное окно с "кошельком" и, поглядывая на него, принимать те или иные экономические решения.
В целом, перевод на "окна" прошел гладко, за исключением некоторых моментов.
Выход окон за пределы области экрана
Основные проблемы с которыми я столкнулся:
выход окон за пределы области игрового экрана при изменении окна игры или при открытии новых внутриигровых окон,
реагирование перекрытого окна на скролл и нажатия,
неактивные области активного экрана, которые собой перекрывают нижележащее окно.
Чтобы окна не выезжали за пределы игрового экрана было добавлено ограничение. Теперь при перетаскивании окна оно упирается в край области и не выходит за её пределы. Тоже самое происходит и при изменении (уменьшении) окна игры. Внутриигровые окна перестраиваются. Для красоты было добавлен ещё эффект прилипания окон к границе экрана, а также выравнивание окошек относительно друг друга.
Реагирование перекрытого окна на скролл и нажатия было для меня самым интересным багом. Одно окно чинишь, другое ломается )) Так всегда, когда вайбкодишь "с закрытыми глазами". Чтобы эту проблему исправить для всех окон одним ударом, был разработан единый компонент внутриигрового окна, который просто переиспользовался. Теперь можно было чинить в одном месте.
Неактивные области также пофиксились при создании единого компонента.
Вообще, хорошая практика использовать единые компоненты, а не каждый раз создавать новые. Когда код пишешь сам, то об этом думаешь постоянно. Но когда используешь нейронку, некоторые моменты можно упустить в виду большого количества изменяемых деталей.
1/2
Итоговый результат
В целом результатом остался доволен. Перевёл все игровые экраны на систему окон и добавил сохранение положения окон при закрытии игры. Чтобы при следующем заходе не приходилось выставлять все окошки заново :)
Хоть в игре и не будет всем привычных 3д моделей, максимум 2д карта, но главный персонаж в игре присутствует. Куда ж без него. И это никто иной как директор компании. Который будет управлять собственной фирмой на ранней стадии и собственной корпорацией и/или альянсом на поздних этапах игры.
Я в своё время долго размышлял над тем как должна выглядеть прокачка игрока. В те ММОшки что я играл в своё время, там необходим было покупать различные рецепты или копить очки навыков для открытия очередной ветки прокачки. В некоторых играх это были некие книги, которые нужно покупать и потом длительно изучать от уровня к уровню, чтобы открыть очередной способ ведения огня или понизить уровень налогов.
Поэтому решил остановить свой выбор именно на книжной системе и системе сертификатов. На мой взгляд для транспортной ММО это самый разумный и приближенный к реальности вариант. Да и у нас не так много игр схожих по смыслу, которыми можно вдохновиться.
Прототип экрана прокачки. Далеко не финальный вариант.
Например: - чтобы открыть легковые авто - надо купить книгу, - чтобы открыть прицепы - надо купить книгу, - чтобы открыть найм сотрудников - надо купить книгу, - чтобы открыть контракты - надо купить книгу.
Ну вы поняли )
Так игрок формирует очередь прокачки персонажа, планируя развитие в игре, т.к. грузовыми перевозками геймплей не будет ограничен. Помимо этого у каждой книги будет несколько уровней прокачки, которые будут либо улучшать полученные возможности, либо открывать доступ к новым книгам. Кому-то это даже может показаться знакомым.
Общее количество книг до конца ещё не определено, но одно могу сказать точно - прокачаться до максимума займет достаточно длительное время. Возможно даже год... О_о Не, ну а кто сказал, что будет легко :D
Tranza Online не про легкое времяпрепровождение. Я пытаюсь собрать воедино несколько, возможно, на первый взгляд, несовместимых механик, в рамках одной, большой онлайн игры.
Если после прочтения Вам есть что добавить или спросить, милости прошу в комменты ;)
✔️Друзья, сегодня мод Red Resurrection. Давненько не играли. Кто надумает присоединиться, то в лобби название игры будет: "Kirov", пароль: 8800
🟠Для игры качаем сборку с патчем 2.2.14b (гугл диск). Игра запускается через 🎮RRLauncher.exe в корне сборки. Первым делом идем в настройки и подбираем рендер, как и в Red Alet 2. Выберите расширение экрана и ник игрока. Для игры через CnCnet переходим в раздел "Онлайн Мультиплеер"
Discord (https://discord.com/invite/r3kCQNxX5Z) для общения в голосе. Можем подтвердить ваш номер, если не приходит смс, нужен только ваш ник. В голосе быть не обязательно, можешь общаться через чат.