Staying Fresh, сражайтесь с протухшей зомби едой, создавайте кулинарных героев и оставайтесь свежими в этом пошаговом тактическом рогалике. Исследуйте, ищите новые рецепты и ингредиенты, сражайтесь и готовьте на свой вкус до победного!
Планирую выпустить в этом году в стим, Xbox One/Series, PS4/PS5
Подробнее о разработке пишу у себя в телеграме Rubel Games
Меня зовут @MorGott и я много играю в видеоигры (хлоп-хлоп, в комменты приглашаются психиатры для простановки диагноза, хотя пост не об этом). И так получилось, что за последний год я прошел как кучу игр, вышедших буквально вот недавно, так и древних, с которыми я запоздал лет на двадцать-двадцать пять, и только сейчас наконец добрался. И мне кажется, что, несмотря на весь технический прогресс, при котором моя видеокарта способна рассчитать траекторию полета на марс, игровая промышленность не стала лучше. И вот почему.
Не так давно вышла автобиография Джона Ромеро - легенды игровой индустрии, одного из основателей id Software, которая подарила нам Вульфенштейн, Дум и Квейк, в которой он много рассказал о том, как он вообще пришел в игровую индустрию ещё школотой, и как они разрабатывали игры, меняющие мир (буквально, так и есть). Это один из тех людей, благодаря которым мир компьютерных игр выглядит так, как сейчас, а не по другому.
Большая часть истории была посвящена тому, как разрабатывали игры наши отцы. Имея самый минимум ресурсов, они выжимали из них всё, что могла тогдашняя техника. Восемь килобайт памяти, процессор, количество операций в секунду в котором исчисляется тысячами, а видеопамять пока неизвестна как понятие. Что можно выжать из таких машин, в которых самые популярные игры - РПГ на статичных экранах, а Пакмен - едва ли не вершина технологического прогресса?
Команда id Software не просто стояла перед проблемой "написать 3д-движок, чего раньше никто не делал", перед ними была задача ещё и сделать так, чтобы он заработал на компьютере, в пятьдесят раз слабее моих наручных часов. Джон Кармак, гений своего времени, допиливал и оптимизировал движок неделями, чтобы он выдавал стабильную плавную картинку и 60 кадров. Ромеро пилил и перепиливал редактор, чтобы создавать уровни, каждый из которых был ограничен в объеме, а значит - нужно было не только сделать их интересными, но и компактными. Том Холл, дизайнер, пытался на этом объеме запилить оригинальные уровни и головоломки, которые никто никогда не видел, а Адриан Кармак это все пытался выразить с помощью жалких восьми бит информации.
Когда DOOM вышел в 1993 году, это был взрыв. Нет, это была ковровая атомная бомбардировка. Люди без современного интернета, буквально на зачатках сети, которая представляла собой первичный бульон, из которого только годы спустя прорежется фидонет, заражали друг друга DOOM как заразной болезнью. В первые же дни вокруг игры сложилось целое комьюнити, которое живо и сейчас, спустя 30 лет после выхода игры.
А всё для того, чтобы тридцать лет спустя, за которые автор этих строк успел сменить подгузники на трусы, вырасти, завести свою семью и ребенка, который уже и сам придумывает свои истории, мы получили это:
Игры становились все лучше всё это время. Вскоре вышел Квейк, который на этапе разработки претерпел изменения от "крутого парня с молотом, за которым летает магический куб, пожирающий души его врагов в средневековом фэнтези" до того, что мы знаем сейчас - стремительного мясного пвп-шутана, известного на весь мир. Парни из Эпик Геймс пошли своим путем, разрабатывая свой движок Unreal, что в долгосрочном периоде сделало их гегемонами игровой индустрии, пока их Фортнайт ломает все законы и становится всё популярнее. Валв выпустила свой движок Source, на котором вышла Hal-Life, которая на удивление шикарно состарилась и играбельна до сих пор, а там и вторые части игры и движка, которые прекрасны не только в техническом, но и в геймдизайнерском плане даже сейчас, более чем через 15 лет после выхода последней части.
В какой-то период индустрия испытала резкий скачок, который можно отнести примерно в район 2007 года, когда игры стали требовать гигабайт или даже два оперативы, а видеокарты ниже 512 мегабайт едва ли не в одночасье стали историей (уж я то знаю это не понаслышке, ведь в один прекрасный год я оказался отсечен чисто физическими ограничениями от всех современных игр). И правда, в тот период мы получили Фар Край, Сталкача, первую часть Асассинов, которая до сих пор смотрится очень даже достойно, последние эпизоды халвы, Биошок, короче - кучу игр, которые технологически сильно выросли, стали потреблять много наших с вами ресурсов, из-за чего игрокам пришлось идти в ногу со временем и обновлять компы. И кажется, что где-то в этот период разработчики независимо друг от друга начали говорить: отлично, продолжаем!
The Day Before, с демонстрационных видосов.
Отличить игру, выпущенную в 2013 году, от игры выпущенной в 2023, становится уже не так просто - если не сравнивать выдающиеся шедевры последнего года с проходняком прошлых лет, конечно. Я купил и прошел и прошел Алана Вейка, самого первого, не ремастер, и знаете что? Она прекрасно выглядит и играется. Сколько там ей лет? ЧЕГО? Четырнадцать, игра 2010 года.
А ещё есть скайрим, который мы покупаем из года в год, и старфилд, который те[нологически на том же движке, который позволил моддерам выпустить в первую же неделю тысячу модов, включая моды на улучшение оптимизации, графики и производительности (sic!). И вся эта красота стоит шестьдесят баксов против 150 рублей за диск в 2007 году. Сраный платформер про Голлума, который буквально убог и ужасен, кричал, что моя старая 1050ti - говно которое неспособно раскрыть весь потанцевал игры. Но раскрывать там нечего. Равно как и в большинстве современных игр. 16 гигабайт оперативы, восемь ядер процессора и минимум 8 гигов видеокарты не старше 30 поколения Нвидиа - это требования, которые предъявляются современными играми, которые, однако, даже не дают нам какого-то кардинального нового игрового опыта, как какая-нибудь HL: Alyx (ради которой валв перепиливала весь оригинальный геймдизайн, чтобы игра была заточена именно под VR).
Но при этом, что характерно, директора студий жалуются на то, что 60 баксов за игру - это критически мало! Один из руководителей Kallisto Protocol заявил, что их игра не ААА, а прям АААА (читать как крик) проект, и вообще новое поколение и новый экспириенс. За что игроки и понапихали ему в сраку, ведь даже будь игра реально мегакрутой, это всё ещё не уникальный новый игровой опыт, так ведь ещё и баги, и требования, под которые нужно покупать машину стоимостью в 150 тысяч рублей. А ещё буквально на днях гендиректор Юбисофт, которая много лет не могла родить пиратский симулятор Skull and Bones, объявил, что цена за игру занижена, ведь она тоже - ААА. При том, что все, кто играл и все кого я знаю, утверждают, что игра не стоит таких денег. И дело даже не в том, что курс доллара поднялся до 90 рублей. Дело в другом.
Метафора игровой индустрии сегодня
Отвлечемся на минуту от игр и вспомним, что значительная часть населения нашей страны ,как и я, живут в хрущевках. И это реально было просто мегапиздатое достижение, потому что я собираю рассказы старшего поколения нашей семьи о том, как они жили до этих хрущевок, и да, это был пиздец. Хрущевки позволили переселить десятки миллионов людей в нормальное жилье, пусть даже построенное неквалифицированными руками студентов и добровольцев. Однако благодаря стандартизации производства даже с косяками в таком жилье можно было жить.
Но были и минусы. Например - туалеты, в которых ты, пикабушник, со своим ростом в 190 и весом в сто килограмм, был вынужден срать с открытой дверью, ведь коленки не дадут закрыть дверь. И, начав делать ремонт, я выяснил причину такого решения. Чтобы вы понимали, во многих хрущквках санузел представлял собой фактически готовый блок, который заливали, привозили на место и тупо ставили краном. Но из-за того, что это было стандартизированно под типоразмеры, которые подойдут в большинство строящихся домов, в некоторых сериях домов эти блоки ставились так, что за ними оставалось свободное пространство (я счас не нарисую схему, просто буквально пространство между стенами до полуметра шириной). И это ни на что не влияло, туда не ставили вентиляционные шахты (они по планам в другом месте), но страдать тебе, рядовой пикабушник, приходится.
И в какой-то момент своей жизни я понял - игры, а точнее процесс их производства, представляют собой абсолютно такой же процесс. Например, посмотрите на демку даже не игры, а простой области в несколько километров, которую накидал мой близкий товарищ одним холодным вечером на Юнити:
Здесь можно ходить, бегать и прыгать. На этом всё.
В принципе, я не скажу сейчас ничего нового любому, кто занимается разработкой, но возможно, всем остальным это будет полезно. Современные движки во многом напоминают конструкторы - особенно UE4 и UE5. Собрать локацию или даже несколько, даже довольно больших - вполне себе реализуемая задача. Но тут есть нюанс.
Так же, как стандарты в строительстве накладывают ограничения или тянут за собой ряд трудностей, так и в разработке, причем не только игровой - вместо того, чтобы кодить то, что тебе нужно, поведение, которые ты планируешь и так далее, ты подключаешь нужные библиотеки в веб-разработке, например, либо берешь готовый движок, и херачишь на ней игру. Но при этом весь сопутствующий мусор, который конкретно тебе в конкретно твоей игре не нужен, остается. Лишние процессы, лишние загрузки, лишние команды - господи, ты же реально не собираешься в этом разбираться, верно?
И как результат - получается, что если ты хочешь собрать квартет музыкантов, то берешь здоровенный симфонический оркестр на 70 предметов, ставишь их на сцену, но играют в нем только четверо. И получается, что современные игры в массе своей, даже если их оптимизировать, представляют собой такие оркестры. Или даже хрущевки, которые строят таким образом, потому что это быстрее, чем кодить самим.
Вот только здесь снова что-то идет не так. Сколько разрабатывалась та же Skull and Bones? Сколько лет? Сколько сотен миллионов на стоила? А почему? То есть смотрите, в какой-то момент времени разработчикам буквально приходилось писать движок под игру и геймплей, который они хотели. Им самим приходилось создавать среду разработки и редакторы, в которых они и работали, либо допиливать чужие движки под свои нужды. При этом издание игр требовало заказать хуеву тучу дисков, потом эти диски упаковать и отправить (Ромеро об этом тоже пишет, кстати, в них был момент времени, когда им самим пришлось этим заниматься).
А сейчас мы имеем ситуацию, при которой у разработчиков есть готовые инструменты разработки, причем довольно мощные и универсальные, и при этом основная часть дистрибуции уходит в цифру, то есть издержки на печать дисков снижаются вплоть до того, что в новом поколении консолей нам обещают исключительно цифровую дистрибуцию и игры за 100 баксов.
А за что отдавать сто баксов? Я не получаю физический диск, который не пропадет из библиотеки если так решит правообладатель, я не получаю какого-то УНИКАЛЬНОГО игрового опыта. Я оплачиваю разработку игры, которая осуществляется в готовых универсальных инструментах, и на что тратятся суммы, порой превышающие сотни миллионов долларов. И я хочу спросить - за что?
Skull & Bones, игра, анонсированная в 2017 и вышедшая в бету в 2024. Стоимость разработки идет на сотни миллионов баксов.
А ответ - я не знаю. Я знаю лишь, что игры дорожают, издержки на их производство снижались с развитием сети, процесс их производства оптимизируется и упрощается, но при этом игры стоят всё больше и их разработка обходится всё дороже. И при всем этом мне говорят - чувак, а не пошел бы ты нахуй со своим компом? Окей, я собрал машину за много денег, в которой буквально топовый проц от АМД и 4060ti на 16 гигов, которая буквально в десяток раз мощнее моего предыдущего компа. Я получу в киберпанке 160 кадров в секунду с лучами и прочими извращениями в 2к? Нет, я пойду нахуй. Потому что даже купи я 4090, в 4к я не потяну тот же киберпанк 2077, он будет просаживаться и падать.
Это, пожалуй, ключевая разница между кино за 150 миллионов долларов и играми за 150 миллионов долларов. Вместо того, чтобы дать мне уникальный игровой опыт или оптимизировать игру, мне дарят открытый мир, который будет нагружать все 64 гига моей оперативной памяти. А на все мои вопросы мне просто скажут - обнови комп, бля. Нет, есть и хорошие примеры оптимизации типа того же DOOM и DOOM Eternal, которые на слабых компах на ультрах летают, а на новых вообще показывают фпс, для которых не придумано мониторов. Или тот же Атомик харт, который и на слабых компах отлично бегает даже с высокиими настройками. Но это исключение в мире игростроя, где игра представляет собой хрущевку, построенную на готовых лекалах и жрущую кучу моих ресурсов.
А современные игроделы ещё и херачат всякие открытые миры, которые иногда играм не нужны, но служат оправданием для открытых бюджетов и тому, что игра фризит даже на 4090. Они буквально делают даже не хрущевку, а гигахрущ, по самосборовскому сеттингу двачеров. И типа за это я должен платить кучу денег? Вы не даете взамен геймплея, как в Dishonored, не даете нереального сюжета как в Балдурке. Нет, вы просите 5 с лишним кусков за дополнение к киберпанку и продаете игровую валюту с лошадью в Диабло 4 по цене выше ААА-игры. Вы продаете хрущевку по цене элитного жилья, и утверждаете, что это ещё мало и вы нас жалеете. И не стыдно?
Послал душную офисную жизнь и бюрократов в ВУЗе. Самостоятельно изучил программирование и гейм-дизайн. Сделал игру «Echoes of the Abyss» (трейлер ниже) – экшн-рогалик, где мир трансформируется в зависимости от уровня Безумия героя.
Регулярно проходил по несколько этапов сомнений, подавленности, воодушевленности и вкалывал целыми сутками
Все, у кого была и есть похожая история, делитесь опытом, и как вы справлялись с трудностями? Если хотите пообщаться, можно в Дискорд https://discord.gg/gtfVhb4q
В предыдущей части статьи мы поговорили о том, как очистить текст от цифр и символов. Продолжим очищать данные и поговорим о том, как очистить цифры от букв и символов, а также выполнить проверку email. Также мы подсчитаем количество не пустых строк. В данном случае, строка будет пустой, если она содержит одно или менее значений. Ну и в завершении протестируем то, что у нас получилось.
Очистка строк от букв и символов
Если в предыдущей функции мы удаляли числа и символы, то сейчас нам нужно выполнить противоположную задачу. Например, нужно очистить номер телефона. И привести к какому-то одному виду для облегчения поиска. Чтобы информация не была неструктурированном и сыром виде. Создадим функцию phone_normalize(phone: str) -> str, которая на вход получает строку с номером телефона, очищает ее, приводит к требуемому виду и возвращает из функции. Для начала очистим строку с номером от скобок, кавычек и прочего. После проверим, не является ли строка пустой. Так как она может содержать не только номер телефона и потому будет просто очищена. Если номер есть, проверяем количество символов в нем. Для себя я определил, что если номер телефона, а речь идет о российских номерах, больше 11 символов, то такие номера учитывать не буду. Потому, проверяю, если больше, возвращаю пустую строку. Если количество символов в диапазоне от 6 до 10, проверяю, с какой цифры начинается номер. Если это девять, добавляю 7. Если нет, просто возвращаю номер. Если цифр 11, проверяю первую цифру. Если она 8, меняю на 7. Также здесь нужно учесть то, что не все 8 надо заменять. Потому, проверяем также вторую цифру. И если она девять, только тогда проводим замену. Ну и если номер начинается с 7, возвращаем его из функции как есть.
def phone_normalize(phone: str) -> str: phone = "".join(x for x in phone if x.isdecimal()) if phone: if len(phone) > 11: return "" elif 6 <= len(phone) < 10: return phone elif len(phone) == 10: if phone.startswith("9"): return f"7{phone}" else: return phone elif len(phone) == 11: if phone.startswith("8") and phone[1] == "9": return f"7{phone[1:]}" elif phone.startswith("7"): return phone else: return "" return "" return ""
Очистка и проверка email
Данная функция не нуждается в особых комментариях. Здесь мы просто проверяем наличие собаки. Если есть, будем считать мылом. Нет, тогда нет. Ну и бывают опечатки вместо точки. Потому, меняем их на нее.
def email_normalize(mail: str) -> str: return mail.strip().replace("/", ".") if "@" in mail else ""
Подсчет количества не пустых строк
В принципе, данная функция вовсе не обязательна и нужна только в примере, который я вам хочу здесь показать. Тем не менее, для полноты картины ее нужно создать. Здесь все просто. Перебираем объекты в списке. И если они не пустые, увеличиваем счетчик. Затем, если счетчик больше 1, возвращаем True, меньше False.
def count_get(items: list) -> bool: cnt = 0 for item in items: if item.strip(): cnt += 1 returnTrueif cnt > 1 elseFalse
Проверка функций очистки на примере файла «csv»
Давайте проверим, как работают созданные функции. Загрузим файл «.csv» и обчистим его с помощью них. Ну и запишем результат в отдельный файл.
Для этого нужно написать обработчик строк, который бы открывал файл, считывал его построчно и очищал.
Создадим функцию read_files(file: str, name: str, ascii_l=True) -> None. На входе она получает путь к «.csv» файлу, имя файла очищенное от расширения и параметр ascii_l со значением по умолчанию. Он нужен для того, чтобы сказать функции, стоит ли обрабатывать английские символы или нет. Ведь не всегда имена написаны по-русски.
Для начала откроем файл «.csv». В цикле будем итерироваться по строкам. В моем файле разделителем является «|». Если у вас что-то другое, запятая или точка с запятой, следует указать их. Проверяем первую строку. У меня она содержит заголовки. Потому их я сразу же добавляю в глобальный, предварительно объявленный, список.
Обратите внимание на то, что в данном случае структура файла нам известна заранее, а следовательно мы можем определить переменные.
Если нам нужно обработать файл, в котором структура столбцов бывает различно, то файл следует предварительно подготовить вручную. Так, скажем, привести к виду для обработки. Это касается однотипных наборов данных с различным количеством столбцов. Как обрабатывать их, здесь мы обсуждать не будем, но я сделал небольшой алгоритм. И если нужно, поделюсь им с вами в следующей статье. Потому, пишите в комментариях.
Распаковываем строку. Нормализуем Ф.И.О., email, телефон и имя пользователя. Также проверяем длину имени пользователя. Затем проверяем количество не пустых переменных. И если оно больше 1, то добавляем список в глобальный список rows_list. Выводим на печать полученные значения, чтобы не было скучно.
def read_files(file: str, name: str, ascii_l=True) -> None: global rows_list with open(file, "r", encoding="utf-8") as cs: for nm, row in enumerate(csv.reader(cs, delimiter="|")): if nm == 0: rows_list.append(row) continue phone, email, fio, uname = row fio = fio_normalize(fio, ascii_l) email = email_normalize(email) phone = phone_normalize(phone) uname = uname.encode().decode() if len(uname) > 50: uname = "" if count_get([phone, email, fio, uname]): rows_list.append([phone, email, fio, uname]) else: continue print(f"\r{nm+1} | {fio} | {phone} | {email} | {uname}", end="") if len(rows_list) == 100000: with open(f"{name}_clean.csv", mode="a", encoding='utf-8', newline='') as csv_f: file_writer = csv.writer(csv_f, delimiter=";") file_writer.writerows(rows_list) rows_list.clear()
Записывать большие файлы лучше по частям. Потому, проверяем количество списков в глобальном списке. И если оно равно 100 000, записываем в файл. После чего глобальный список очищаем для новой порции.
Запрос пути к файлу. Функция main
Итак, мы приближаемся к финалу данной статьи. Создадим функцию main. Запрашиваем у пользователя путь к файлу. Также запрашиваем выполнять транслитерацию или нет. В данном случае я опустил уточняющие запросы вроде да или нет. Так как в данном случае да уже по умолчанию. А нет равно вводу «n». Проверяем существует ли файл, и что это вообще файл. Следовало бы проверить, является ли он «.csv» хотя бы по расширению. Если файла не существует, выходим из скрипта. Если же все в порядке – двигаемся дальше. Замерим также время выполнения скрипта.
Получаем имя файла без расширения. Подсчитываем кол-во строк в файле и выводим его имя и кол-во в сообщении для пользователя. Проверяем нужно ли выполнять транслитерацию. Ну и передаем путь к файлу в функцию очистки. После отработки скрипта проверяем, не пуст ли глобальный список. Если нет, сохраняем остатки данных в новый файл «.csv». Выводим в терминал время выполнения скрипта.
Вот в принципе и все. Ниже я приведу полный код скрипта для очистки. То есть, то, что мы написали для тестирования функций.
Полный код скрипта:
""" pip install transliterate """ import csv import string import time from pathlib import Path
from transliterate import translit
csv.field_size_limit(2147483647)
rows_list = []
def replacer(txt: str) -> str: symbols = ("ahkbtmxcepAHKBTMXCEP", "анквтмхсерАНКВТМХСЕР") tr = {ord(a): ord(b) for a, b in zip(*symbols)} return txt.translate(tr)
def fio_normalize(fio: str, ascii_l=True) -> str: if "http" in fio or "https" in fio or "Http" in fio or "Https" in fio: return "" if fio.startswith("-") or fio.endswith("-"): fio = fio.strip("-").strip() if "-" in fio: fio = fio.replace("-", "тирре") fio = "".join(x for x in fio if x.isalpha() or x == " ").strip().replace("тирре", "-") ascii_count = 0 for xz in fio: if xz == " ": ascii_count += 1 ascii_count += sum(1 for x in xz if x in string.ascii_letters) if ascii_l and ascii_count == len(fio): fio = translit(fio, "ru") elif ascii_l: temp = [] for x in fio: temp.append(replacer(x)) if x in string.ascii_letters else temp.append(x) fio = "".join(temp) fio = " ".join(x.strip().capitalize() for x in fio.split()) lst = [] for x in fio.split(): if "-" in x: lst.append("-".join(z.capitalize() for z in x.split("-"))) else: lst.append(x) fio = " ".join(lst) if len(fio.split()) > 3: fio = " ".join(fio.split()[0:3]) if len(fio) > 50: fio = fio[:51] return fio if fio else ""
def email_normalize(mail: str) -> str: return mail.strip().replace("/", ".") if "@" in mail else ""
def phone_normalize(phone: str) -> str: phone = "".join(x for x in phone if x.isdecimal()) if phone: if len(phone) > 11: return "" elif 6 <= len(phone) < 10: return phone elif len(phone) == 10: if phone.startswith("9"): return f"7{phone}" else: return phone elif len(phone) == 11: if phone.startswith("8") and phone[1] == "9": return f"7{phone[1:]}" elif phone.startswith("7"): return phone else: return "" return "" return ""
def count_get(items: list) -> bool: cnt = 0 for item in items: if item.strip(): cnt += 1 returnTrueif cnt > 1 elseFalse
def read_files(file: str, name: str, ascii_l=True) -> None: global rows_list with open(file, "r", encoding="utf-8") as cs: for nm, row in enumerate(csv.reader(cs, delimiter="|")): if nm == 0: rows_list.append(row) continue phone, email, fio, uname = row fio = fio_normalize(fio, ascii_l) email = email_normalize(email) phone = phone_normalize(phone) uname = uname.encode().decode() if len(uname) > 50: uname = "" if count_get([phone, email, fio, uname]): rows_list.append([phone, email, fio, uname]) else: continue print(f"\r{nm+1} | {fio} | {phone} | {email} | {uname}", end="") if len(rows_list) == 100000: with open(f"{name}_clean.csv", mode="a", encoding='utf-8', newline='') as csv_f: file_writer = csv.writer(csv_f, delimiter=";") file_writer.writerows(rows_list) rows_list.clear()
Запустим скрипт и укажем путь к тестовому «csv». В нем содержаться случайно сгенерированные данные. Очистим их с помощью скрипта. Чтобы вы понимали, вот кусочек изображения с номерами телефонов.
Номера телефонов
Как видите – сборная солянка. Ну и то, что было до обработки и что стало после, на примере одной строки.
Строка до обработки
Обработали и получили:
Строка после обработки
Таким образом, мы узнали, что очистить строку вовсе не так сложно. Особенно с помощью методов самого python, без изобретения дополнительного велосипеда.
А на этом, пожалуй, все. Спасибо за внимание. Надеюсь, данная информация будет вам полезна!
Воры чужой игры решили потешить свое чсв. Оказалось, они из России. Обличаю деятельность черных миллионеров. Мне не хотелось предавать эту ситуацию огласке, но сегодняшнее очередное письмо просто выбило меня из коллеи. Мою игру за 8 дней до релиза с 12.000 вишлистов буквально уничтожили. Я не знаю, что мне делать дальше, ведь они смогут терроризировать теперь меня буквально каждую игру.
резко превращается в тыкву
Как оказалось в дальнейшем, не я один такой, пострадавший от этих недобросовестных людей, крадущих чужие игры, идеи, концепты, UI, визуальные стили и названия. Они буквально сознательно уничтожили мой релиз, ведь он был через неделю и его нельзя перенести самостоятельно. Давайте расскажу обо всем по порядку, по возможности, с холодной головой.
Котобезумие в Steam, зачем их создают
Только далекий от стима человек мог не заметить, как массово начали делать гиперказуальные игры жанра point-n-click на 5 минут игрового времени с одной простой целью - найти 100 котов на одном большом арте. Достаточно заглянуть в предстоящий Popular Upcoming, чтобы увидеть на самом верху два представителя, и теперь такое случается даже чаще, чем каждый месяц. Статья писалась раньше, но опубликована будет только после выхода из бана моей игры.
Ответ слишком очевиден и прост. Это простота, скорость и доходность. Все, что вам нужно, это один большой лайнарт, начинающий программист и много кропотливой работы в фотошопе. При этом они охватывают максимально широкую аудиторию. Все любят котов и почти все - казуальные игры, где можно почиллить в перерыве или после работы, а заодно 100 достижений в придачу. Думаете, что такие игры мало зарабатывают, а у группы людей, с которыми у меня конфликт, и вовсе бесплатны? Я посчитаю их доход, но чуть позже в статье. Уверяю вас, что получают они больше 90% инди игр как минимум.
Полминутки истории
Хочется отметить, что данная тема далеко не нова, один из ее основоположников Анатолий Логиновских со своими 100 hidden snails в 2020 аж в 2020 году, которые позже перекочевали в качестве эксперимента в 100 hidden cats. И если на других играх количество обзоров достигало 300-400, то на котах к сегодняшнему дню их число перевалило уже за 1800. Популярность именно котов была на лицо, и хотя можно привести в пример 100 hidden frogs с 5500 обзоров, это скорее исключение из правил. Но создатель не стал упарываться по котам, и до сих пор экспериментирует с различными животными и визуальными стилями, большой молодец. Вот его игры для ознакомления:
Выходили такие игры и в 2022 году, но сильного бума не получили. Пример: Hidden Cats in Paris и их серия. А полноценное кото-безумие началось только в 2023 году и нарастает до сих пор. 17 июля вышла Cats Hidden in Paris от загадочного Travellin Cats, и после коты начали путешествовать по самым разным странам, добравшись сейчас и до Грузии.
Как оказалось, сам разработчик позже связался со мной и пояснил, что его игру скопировали те самые пресловуетые 100 Asian Cats, от визуала до UI при помощи нейросетей.
И теперь стим буквально наводнен самыми различными котами всех разновидностей. Подходим к самому главному - появлению самых наглых и мерзкий разработчиков.
Списывай, только не точь-в-точь... А не то засужу!
Итак, 1 декабря выходит Cats Hidden in Jingle Jam от Travellin Cats.
И в тот же день, 1 декабря... Выходит 100 Christmas Cats, от нового издателя 100 Cozy Games. Вот уж не знаю насчет ЛУЧШЕЙ игры со скрытыми объектами, как заявлено у них в кратком описании, но хейтом ее закидали знатно. Обзоры были в районе 50% за мало того что наглое воровство стиля, тематики, схожий шрифт, UI в игре, так еще самое главное - такой же даты выхода!
Но это еще не все. Хитрая модель монетизации также была перенята у Cats Hidden in Jingle Jam. Сама игра - бесплатна, а вот чтобы сыграть во второй уровень, нужно уже купить платное DLC. И покупают много, так как игра быстрая, легкая, но сразу затягивает. Несмотря на то, что отзывы на него оставляют редко, продажи там весьма хорошие. Это я проанализирую чуть позже.
И, судя по отзывам, они запихали часть достижений именно в платное DLC. Браво.
И глядя сейчас на одинаковую дату выхода у Cats Hidden in Georgia и 100 Ninja Cats могу предположить, что они все также хотят поднасрать или урвать часть хайпа у конкурента. Но я до сих пор не понимаю, почему Travellin Cats их не страйкает, ведь можно хотя бы заморозить каждую их игру и обломать релиз, как это сделали со мной.
Каким же образом я отношусь к этой истории
На фоне моих прошлых игр новелл-триллеров мне сказали, чтобы я попробовал хоть раз сделать игру для более широкой аудитории.
Именно это я и попробовал сделать. И именно в этой тематике. Навыков программирования в Unity или Unreal у меня нет, поэтому что-то более серьезное пока пробовать не хочется. Мне тоже хотелось сделать игру про зиму, только полностью бесплатной, без бонус уровней и скрытых донатных достижений. За отдельную цену только саундтрек и артбук, которые представлены одним треком и артом, просто для поддержки разработчика. Нашел художника на фрилансе, дал ориентир по примерному стилю в лайнарте, выбрал примерную дату для релиза. Игру назвал 100 Winter Cats.
В саму игру внедрил несколько фишек, которые так или иначе встречались в других играх жанра: выбор из нескольких цветов для покраски, можно красить разных котов в разные цвета, множество мяу-звуков для отдельных котов, систему подсказок, так как зачастую в таких играх мне было проблемно найти последний десяток. По итогу она получилась простенькая, коты были прям на виду и легко искались, да и сам арт был всего 3800х3800 (сейчас я делаю новые части игры в 8к - 7680х4320, да и бонус уровень, который таки будет в игре, тоже будет громадным). Но все равно я был рад, что получилось хотя бы это.
После того, как все было готово и оформлено, я установил дату релиза на 8 февраля. Трафик от стима превзошел все мои ожидания, каждый день было 100-300к показов и до 2500 посещений страницы. По 300-1500 вишлистов в день. И эти значения только росли к приближению даты релиза. Такие значения на прошлых играх, даже после релиза, могли мне только сниться.
предрелизный трафик
Теперь я понял, в чем сила прологов для игр! Только тут схема в разы сильнее. Это не пролог, а сама игра, и ведет она на десяток еще таких же игр, подготовленных заранее. Но в своей наглости к монетизации 100 Cozy Games пошел дальше.
красивые картиночки по 10$
Уже в своей следующей игре 100 Capitalist Cats он добавил в игру систему инвентаря и предметы по 900 рублей. Которые дают... правильно, ничего. Просто донат во славу разработчика. Впрочем, в 100 Asian Cats вообще были донат паки с воздухом общей стоимостью на 7500 рублей.
учимся грамотной продаже воздуха
Но тут, видимо, разработчик понял, что это уже слишком, и в будущих играх убрал эту "фичу". Но есть ли пределы жадности? Нет! Ведь теперь все новые игры создаются исключительно под фестивали Steam. Фестивали - отличное мероприятия для пиара и раскрутки игры, если она подходит по тематике. 100 Capitalist Cats - фестиваль капитализма. 100 Ninja Cats, 100 Pirate Cats - фестиваль ниндзя против пиратов. Ну и дальше по накатанной. По правилам, туда должны попадать лишь игры, основными персонажами или механиками в которых являются как раз указанные в фестивале наименования. Не буду судить именно за это, абуз стима - проблема стима, одна из моря прочих, а не абузеров.
Однако ребята уже подготовили пути отступления на случай бана сети игр. Появляются новые разработчики с абсолютно таким же описанием, что и указанных выше ребят. Прям 1 в 1, причем закуплено и оформлено сразу 8 слотов заранее (UPD: уже 10), подписчики на страницу разраба уже накручены. Схемы все старые. И кто знает, сколько еще страниц разработчиков они успели зарегать.
массовое производство кошек готово, причем с другого аккаунта разработчика
Но я бы даже не пискнул в их сторону. Если бы не случился апогей лицемерия - они кинули DMCA жалобу на мою игру, из-за чего ее сняли из магазина для разбирательства на 10 рабочих дней.
Страшнее, чем письмо с госуслуг
За неделю до релиза я увидел на почте странно письмо с пометкой DMCA. Для тех, кто не знает DMCA - Digital Millennium Copyright Act, закон США, связанный с копирайтом в интернетах. Политика Valve в отношении него такова, что для подачи жалобы не обязательно предоставлять какие-то документы, авторские права или право на товарный знак. Достаточно просто заполнить форму, указать свои данные, адрес, причину жалобы и в общих чертах ее расписать. Подойдет буквально почти что угодно - схожий визуальный стиль, схожее название, схожая структура названия, схожее описание в игре, использование тех же эмодзи в описании игры. И достаточно, чтобы материал истца был раньше размещен, чем у обвиняемого. Все. Valve не хотят рисковать с тем, чтобы на них потом подали в суд, так что одобряют практически все жалобы, хоть немного складно написанные. То есть буквально любая собака может нажаловаться на того, кто тявкнул похожим образом. Без каких-либо юридических последствий. Что остается делать при получении жалобы?
Составить встречный акт-апелляцию, с заполнением такой же формы из имени, адреса, телефона, ваших аргументов и подписанной галочки под клятвой правды. После чего у истца будет 10 рабочих дней, чтобы обратиться в суд (именно в определенный суд США), и взыскать уже более серьезные компансации с ответчика. В противном случае контент будет восстановлен. Как оказалось, истец наш находится в Москве с обычным русским номером телефона. Естественно, ни в какую Америку он не поедет, да и никаких юридических оснований для этого бы не было: даже если можно сделать авторские права на словосочетания в описании игры, структуру названия игры и прочий бред, на это потребуются деньги и время, а сама игра создана несколько недель назад.
Так выглядит временно заблокированная игра в админке. В отличие от полноценного бана админка полностью функционирует, но в магазине игры нет
Проблема в том, что такую жалобу можно кидать неоднократно, на тот же самый контент, если я правильно понял. То есть при разблокировке процесс может повторяться до бесконечности. Я просто заполнил встречный акт за час и отослал на юридический адрес Valve. Однако, даже в самом лучшем случае релиз был уничтожен. Жалобу DMCA невозможно отозвать, это запускает процесс, который кончается либо судом, либо истечением 10 рабочих дней. И при любых раскладах я не успевал выпустить игру в срок. Очевидно, они это знали и сделали намеренно, так как дата на странице была указана. Дату релиза нельзя перенести меньше, чем за 2 недели до него, так как Steam нагоняет предрелизного трафика на игру, и в противном случае все бы таким образом и абузили его, как было раньше. Естественно, я составил тикет и попросил перенести релиз на неопределенный срок вперед с учетом обстоятельств. Ждать ответа мне пришлось 5 дней. По итогу мне повезло с агентом техподдержки, и он согласился перенести мне даты релиза на игре, саундтреке и артбуке.
Список требований для "снятия" жалобы
После чего на мою почту пришло письмо от самих 100 Cozy Games. Какая честь.
переведено с помощью встроенного переводчика
Они написали, что ценят здоровую конкуренцию, но возмущены использованием их интеллектуальной собственности и требуют ряда исправлений в игре, тогда они будут готовы снять жалобу. В противном случае у меня будут серьезные юридические проблемы, которые не ограничатся блокировкой всех игр и аккаунта разработчика. Почему же снятие в заголовке в кавычках? Потому что снять ее нельзя, только выждать срок в 10 рабочих дней и не отправляться в суд, это аннулирует ее.
Ребята не поленились сделать подробные иллюстрации с разбором схожего контента, буквально подчеркивая похожие словосочетания в описаниях, одинаковые эмодзи и нашу структуру названия.
вот это да! давайте страйковать всех, кто использует лайнарт, ведь это мы его придумали
Забавно, что у них прямо в капсулах в оформлении новых игр были коты, прямиком срисованные у Travellin Cats. Но на тот момент я предположил, что это может быть один и тот же человек, в этом и вся причина. Пока... он сам не написал мне в дискорд. И не сказал, что они буквально срисовали его игру при помощи нейросетей.
"Они использовали искусственный интеллект для клонирования одной из моих игр. Так что да, я нахожусь на тропе войны с ними.Если они угрожают вам или делают что-то глупое, например, бомбят вашу игру -> отлично, потому что у меня есть прямой контакт в Valve"
Также он написал, что если они продолжат угрожать или шантажировать, или устроять ревью бомбинг для моей игры в дальнейшем, будет даже хорошо, так как у него есть контакт прямиком в Valve и можно будет добиться наконец их тотальной блокировки.
С чего он вообще написал мне? Это было во время моей небольшой маркетинговой кампании для 100 Winter Cats, если это можно так назвать. Я устаривал раздачи и розыгрыши ключей от некоторых моих прошлых игр с условием подписаться и добавить в вишлист предстоящую игру. Из-за этого на ней скопилось достаточно много фолловеров, и Travellin Cats сам заинтересовался мной, подписался на дискорд-сервер со странички игры и там нашел в админах. Он спрашивал, как я получил так много фолловеров и мы немного пообщались.
После блокировки моей игры, он связался со мной и спросил, что случилось. По сути это был единственный человек вообще, кто заметил ее пропажу. Но на тот момент я даже не знал, какие игры он издает.
"Вау, что за ерунда, если учесть, что они содрали весь пользовательский интерфейс другой игры"
Что примечательно, он назвал такую же фамилию, что подавала на меня жалобу. Только другого человека, видимо это был ее муж, а на меня заполняла страйк женщина. Тогда он рассказал про них много интересного, про воровство стилей, копирование его игры при помощи нейросети, намеренная порча релиза.
"Это возмутительно, потому что эти ублюдки все украли."
"Не слушайте их. Они ужасные люди."
Я удивился, увидев его на новой игре Cats Hidden in Georgia в одном из ответов на обзоры на игру. Оказывается, это тот же самый человек, что писал мне.
Вернемся к требованиям. Тогда я был напуган и в смятении и не против выполнить их, чтобы они отстали. Хотя я бы сделал это и по простой просьбе, без всяких банов перед релизом. Их требования были: изменить название через техподдержку стима во всех местах, изменить структуру названия, изменить все описания, смайлики, изменить в самой игре тех котов, которые показались им идентичными к их котам. После всего этого прислать скриншоты с подтверждениями всего этого, и только тогда они "отзовут" жалобу. Требования внушительные, но я решил пойти навстречу и выполнить этот список. Путем переговоров выбрали название и структуру для будущих игр, которая устроит обе стороны - Hidden Winter Cats. После чего мне пришлось ждать около 5 дней, чтобы техподдержка одобрила смену названия, это они тоже делают неохотно и по веским причинам. Они периодически писали, напоминая, что не получили от меня ответа на изменение названия. Мне пришлось сказать, что служба поддержки, к сожалению, работает не так быстро, как я. Мне очень повезло, что дату релиза согласились перенести, иначе эта игра бы вообще прошла мимо.
Верх лицемерия случился уже в конце, когда название было изменено и я отправил им все скриншоты с доказательствами. Они НЕ ОЖИДАЛИ, что это займет столько времени. Но это и не могло занять меньше 10 рабочих дней никак.
переведено с помощью встроенного переводчика
А еще что они напишут службе поддержки Steam с запросом разблокировки. Неплохо, может к самому Гейбу на выходных заскочат? Есть один нюанс, служба поддержки не занимается юридическими вопросами DMCA. И даже тот их юридический отдел не может снимать блокировки по щелчку пальцев истца, надо выжидать требуемый срок. Они явно должны были это знать. Пишите по необходимости... Да уж, ожидаем следующую жалобу от вас, и необходимость точно появится. О каком сотрудничестве может идти речь с ноунеймом вроде меня, если даже мастодонтам жанра они пытаются насолить, ставя дату релиза день в день с ними, а первую игру даже выпустив точно такой же тематики в тот же день?
Возвращение в Steam
Наконец, прошло несколько дней, срок вышел и игра вернулась в магазин! Под новым названием Hidden Winter Cats. Раз уж произошла такая история, то релиз решил перенести на 29 февраля (все еще зима!), и украсть у них еще кое-то - донатный бонус уровень, в 2 раза больше обычного. Все достижения можно будет получить и в первом бесплатном уровне. Но эта история все еще не дает мне покоя. Ради интереса, я решил немного проанализировать игры злобных котокрадов.
На 100 Asian Cats меньше, чем за месяц, пропала плашка "Steam собирает информацию об этой игре" и появились карточки. Это происходит, когда игра собирает 10.000$ NET (доход за исключением возвратов) в Steam, для бесплатных игр там условия, на сколько мне известно, еще более жесткие. Чуть меньше миллиона рублей сейчас по курсу. Неплохо за месяц? Да это лишь с одной игры, теперь у них их под десяток, то ли еще будет. А ведь будущие игры еще будут буститься на фестивалях и получать трафик заранее с уже вышедшных игр. Напомню, что первая игра разработчика вышла только в декабре без какого-либо пиара.
дополнение с платным уровнем. даже подсказки, оказывается, платные...
И это при том, что их это DLC с бонусным уровнем собрало всего лишь 49 обзоров. Так что на них ориентироваться в играх с таким типом монетизации уж точно не стоит. Зато трафика получают вагон и все предстоящие игры будут в Popular Upcoming и в трендах висеть по неделям.
Так что причина страйков на всех потенциальных конкурентов становится проста и понятна. А вот как уберечься от этого - менее понятно. Я мог бы также закидывать их страйками на какие-нибудь новые игры, которые явно будут иметь что-то схожее с тем, что у меня уже загружено в магазин. И даже сделать это как они - под релиз, чтобы не было возможности выпуститься в срок во время действия жалобы. Но есть ли смысл? Я лично его не вижу, для их трафика и дохода лишь капля в море.
Заключение
Вот такими жестокими и алчными могут быть разработчики даже таких гиперказуальных игр про котиков, казалось бы. Причем против своих же соотечественников. Как обычно, ни один релиз у меня не происходит нормально, вечно с приключениями. Но в этот раз не так обидно - в игру вложено совсем ничего времени и сил относительно прошлых новелл. Так что сильного инфаркта не случилось, просто было неприятно. Геймдев сфера, конечно, веселая.
картинка из интернетов
Однако некоторые люди в погоде за хайпом и наживой уже переходят все границы, не гнушаясь никакими способами. Буду рад вашим советам и комментариям. Также если кому-то нравится такой расслабляющих жанр игр, буду благодарен за добавление в список желаемого. Кстати, сейчас добавил возможность для будущего интерактива с игроками - любой желающий может назвать одну ачивку в игре названием, которое будет связано со случайным котом. Это будет имя котика. Для этого достаточно оставить корректное название в комментах под последним постом в Hidden Winter Cats в Steam, но, в принципе, можно и здесь.