Я предпочитаю инди игры и иногда пишу о них тут. Обычно в них можно найти нестандартные механики или сюжеты, не подходящие для больших продуктов. Пощупал игру Санёк. Мне кажется это идеальный пример, масса эмоций и нестандартного опыта всего за 2 игровых часа, но целых $ 8.5.
Добавил в желаемое давно, когда попробовал демку, купил только сейчас. Игра ставит себя как приключение в детство. Рекомендую посмотреть трейлер по ссылке выше перед чтением текста, чтобы уловить посыл игры. Я хочу перечислить личные неравнодушные моменты:
- Трейлер и демо настроили меня на крайнюю ностальгию и сведение олд скулл самым сильным образом. Почему-то сюжет после демо (то есть основная игра) много слабее, не знаю чего не хватило, возможно, я заскучал в длинных диалогах и долгих утомительных хождениях в поисках точек интерактива. По впечатлениям игра не ностальгическая, а детская. Можно провести время с ребенком лет 5-7: включаете игру, даете ему мышку и клаву, себе наливаете чай, далее он играет, а вы ему за жизнь рассказываете, как папа-мама жили, а не то что он теперь.
- Игра не поддерживает джойстик. Для меня это жирный минус. Но было бы можно это простить, если игра игралась бы только мышкой. Но нет, клава + мышь. Поддержать геймпад можно было на изи.
- Экстра неожиданная находка. Я нашел блокнотик с спискомнаших секретиков упражений, которые мы используем для разминки на работе. Привожу скрин из рабочего спец-чата, где бот напоминает что делать, а все кто сделал — ставят реакции.
-Игру пройти не смог. У меня поучилась уникальная концовка. Здесь спойлер: ближе к концу игры главного героя байтят пойти в страшный лес ночью на 100 шагов в глубину. По доброй логике игры ясно, что надо сгонять в лес, затем вернуться и получить звиздюлей от матери. Так вот я пошел, шагал минут 10, честно плутал во обе стороны и далее… ничего не произошло! Представьте как это долго (10 минут) с точки зрения геймплея, просто смотреть на идущего перса по лесу. Успел заучить визуальные паттерны этого леса. Думаю глюк, какой-то триггер не отработал. Получается, моя концовка: ослушался мать, повелся на байт других детей во дворе и напрочь заблудился в лесу с потерей перспектив, конец. Потрясное и неожиданное завершение, за 10 минут я как раз пережил все стадии выгорания надежд выбраться и принял неизбежное.
- Есть и киллер-фича игры — это внутриигровая консоль UnityIngameDebugConsole, которая открывается клавишей тильды. У меня даже форк на нее есть, как-то очень надо было чтобы она еще FPS выводила. Так я узнал, что я прошел 3238 шагов, что есть нул рефы в диалогах, дофига ворнингов на аудио и дотвин.
- Может быть жестко сужу, но игра не стоит 8.5 баксов, ни по каким критериям.
#игры
Добавил в желаемое давно, когда попробовал демку, купил только сейчас. Игра ставит себя как приключение в детство. Рекомендую посмотреть трейлер по ссылке выше перед чтением текста, чтобы уловить посыл игры. Я хочу перечислить личные неравнодушные моменты:
- Трейлер и демо настроили меня на крайнюю ностальгию и сведение олд скулл самым сильным образом. Почему-то сюжет после демо (то есть основная игра) много слабее, не знаю чего не хватило, возможно, я заскучал в длинных диалогах и долгих утомительных хождениях в поисках точек интерактива. По впечатлениям игра не ностальгическая, а детская. Можно провести время с ребенком лет 5-7: включаете игру, даете ему мышку и клаву, себе наливаете чай, далее он играет, а вы ему за жизнь рассказываете, как папа-мама жили, а не то что он теперь.
- Игра не поддерживает джойстик. Для меня это жирный минус. Но было бы можно это простить, если игра игралась бы только мышкой. Но нет, клава + мышь. Поддержать геймпад можно было на изи.
- Экстра неожиданная находка. Я нашел блокнотик с списком
-
- Есть и киллер-фича игры — это внутриигровая консоль UnityIngameDebugConsole, которая открывается клавишей тильды. У меня даже форк на нее есть, как-то очень надо было чтобы она еще FPS выводила. Так я узнал, что я прошел 3238 шагов, что есть нул рефы в диалогах, дофига ворнингов на аудио и дотвин.
- Может быть жестко сужу, но игра не стоит 8.5 баксов, ни по каким критериям.
#игры
😁4🔥2👀2
Ubisoft анонсировали первый шутер в игровой серии Assassin’s Creed.
Игра получит название «Assassin’s Creed: DON».
Простите, не удержался 😅
Игра получит название «Assassin’s Creed: DON».
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9😱2❤1
Случай на работе. Пример из очень старой системы, далеко неидеального подхода, но тем интереснее. Кусок кода для загрузки данных пользователя.
Есть промежуточный класс-родитель, который сетапит загруженные сохранения у своих наследников.
Пример класса-наследника:
В LoadBit приходит obj — это уже загруженные данные или null если их не было, далее мы их либо сетапим в SetLoaded, либо ставим дефолтные значения через метод Reset. Что пошло не так написано ниже, но кому интересно, можете сначала подумать, как сломать метод LoadBit.
Изначально, было запланировано, что в метод может приходить object ожидаемого типа или null. И все было хорошо, пока не пришла пустая string (с таким успехом метод можно ломать любым другим типом, главное чтобы он был не такой как у Т). Возникает исключение и уход в catch на строке с жестким приведением типа var elem = (T) obj; без выполнения одного из методов — Reset или SetLoaded.
Кто пофиксит?)
#техничка
Есть промежуточный класс-родитель, который сетапит загруженные сохранения у своих наследников.
public abstract class Bit<T> : UserBit
{
protected sealed override void LoadBit(object obj)
{
try
{
var elem = (T)obj;
if (elem == null)
{
Reset();
return;
}
SetLoaded(elem);
}
catch (Exception e)
{
throw new Exception($"F");
}
}
protected abstract void SetLoaded(T elem);
protected abstract void Reset();
}
Пример класса-наследника:
public class ProfileBit : Bit<ProfileBit>
{
// поля дата-калсса
protected override void SetLoaded(ProfileBit elem)
{
// сетап загруженными значениями
}
protected override void Reset()
{
// сетап дефолтными значениями
}
}
В LoadBit приходит obj — это уже загруженные данные или null если их не было, далее мы их либо сетапим в SetLoaded, либо ставим дефолтные значения через метод Reset. Что пошло не так написано ниже, но кому интересно, можете сначала подумать, как сломать метод LoadBit.
Кто пофиксит?)
#техничка
👍1🤯1🐳1
Пример кода, который стреляет в ногу. Такая подстава называется “Null trap”. В данном случае есть класс, который хранит данные и имеет серию методов Get…что-то. Все написаны в стиле, попробуй найти данные, иначе верни null.
Вызывающий код не ждет, что метод может иметь наглость вернуть null. Отсюда и неочевидные ошибки. Конкретно эту мы поймали уже на релизе, когда игроки с определенным набором данных об нее дедлочились.
Как не делать таких подстав своим коллегам? Вариант для ленивых жопошников — атрибут CanBeNull. Так хотя бы IDE подсветит такой метод ворнингом и напишет “Possible 'System.NullReferenceException”. Его тоже можно не заметить, так как все не “красное” — часто пропускается взглядом.
Нормальный вариант, сделать метод явно указывающий, что данных может не быть, например так:
#техничка
public IEnumerable<int> GetFamily(string familyId)
{
return _monsterFamilies.Contains(familyId) ? _monsterFamilies[familyId] : null;
}
Вызывающий код не ждет, что метод может иметь наглость вернуть null. Отсюда и неочевидные ошибки. Конкретно эту мы поймали уже на релизе, когда игроки с определенным набором данных об нее дедлочились.
Как не делать таких подстав своим коллегам? Вариант для ленивых жопошников — атрибут CanBeNull. Так хотя бы IDE подсветит такой метод ворнингом и напишет “Possible 'System.NullReferenceException”. Его тоже можно не заметить, так как все не “красное” — часто пропускается взглядом.
[CanBeNull]
public IEnumerable<int> GetFamily(string familyId)
{…}
Нормальный вариант, сделать метод явно указывающий, что данных может не быть, например так:
public bool TryGetFamily(string familyId, out IEnumerable<int> result)
{
result = null;
if (_monsterFamilies.Contains(familyId))
result = _monsterFamilies[familyId];
return result != null;
}
#техничка
101🔥5❤🔥2
В прошлом посте я получил первую платную звезду и получается — первый доход с блога. И даже не смотря на то, что у меня нет конкретной цели с которой я его веду, теперь я не могу сказать, что делаю это бесплатно 😎
А поэтому как на счёт небольшого расширения тем на канале? Говорить про код это хорошо, но периодами скучно-душно. Иногда меня посещают вроде как хорошие мысли, но не очень вписываются в тематику канала. Давайте сделаем такой вот необычный опрос... У меня есть несколько интересных мне информационных полей и еще мне с большим усилием дается написание постов нейтральных по эмоциональному окрасу. В опросе можно выбрать НЕСКОЛЬКО вариантов, тыкните все самые неприемлемые.
А поэтому как на счёт небольшого расширения тем на канале? Говорить про код это хорошо, но периодами скучно-душно. Иногда меня посещают вроде как хорошие мысли, но не очень вписываются в тематику канала. Давайте сделаем такой вот необычный опрос... У меня есть несколько интересных мне информационных полей и еще мне с большим усилием дается написание постов нейтральных по эмоциональному окрасу. В опросе можно выбрать НЕСКОЛЬКО вариантов, тыкните все самые неприемлемые.
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳2🤔1
Я ОТПИШУСЬ, если автор начнет писать:
Anonymous Poll
10%
Про свои технические хобби и эстетику быта технаря (выходим за рамки программирования)
45%
Добавит легкий флёр политики и намеков, что во всем плохом виноват Темнейший
62%
Добавит легкий флер политики и намеков, что во всем плохом виноваты англосаксы и иже с ними
21%
Про жизненные штуки, как не выгореть программисту, жить нормальной жизнью и не стать алкоголиком
20%
Если будет сарказм и тупые шутки
62%
Если будут шит-посты (как в инсту выкладывают все подряд)
👍1
У меня есть классная штука из разряда «сделай сам» - домашнее NAS-хранилище. По сути это небольшой слабый комп с кучей HDD и дистрибутивом линукса на борту. Называется XigmaNAS (на базе FreeBSD). Устройство умеет:
- Качать торренты. Кушает торрент-файл, сам скачивает и кладёт в нужную папку.
- Файловое хранилище с поддержкой всех видов рейдов. Самое то хранить фотки, проекты и всякие бекапы. Безопаснее чем на HDD в шкафу и дешевле и подконтрольное чем в облаках.
- Обмен медиаконтентом (DLNA) в локальной сети. То есть все скаченное через торренты доступно, например, на телевизоре.
- Virtual box
- FTP-сервер
- Web-server
И много чего еще. Если вы когда-либо интересовались темой таких устройств, то можете представить сколько может стоить девайс в готовом виде с таким функционалом и 12 TB на борту. А в данном случае собранный из того, что было.
Я сделал его примерно 7 лет назад, а сейчас решил провести апгрейд - расширить объём дисков, новая мать, проц, память и плата интеграции с Алисой Яндекса. Отдельное счастье, что Линуксы спокойно переезжают с старого железа на новое без переустановки. Это не виндувс.
В общем огонь-коробка, всем рекомендую сделать себе такую из старых компьютерных запчастей, которых в избытке на антресолях. Если интерес есть - могу пошарить инструкцию.
- Качать торренты. Кушает торрент-файл, сам скачивает и кладёт в нужную папку.
- Файловое хранилище с поддержкой всех видов рейдов. Самое то хранить фотки, проекты и всякие бекапы. Безопаснее чем на HDD в шкафу и дешевле и подконтрольное чем в облаках.
- Обмен медиаконтентом (DLNA) в локальной сети. То есть все скаченное через торренты доступно, например, на телевизоре.
- Virtual box
- FTP-сервер
- Web-server
И много чего еще. Если вы когда-либо интересовались темой таких устройств, то можете представить сколько может стоить девайс в готовом виде с таким функционалом и 12 TB на борту. А в данном случае собранный из того, что было.
Я сделал его примерно 7 лет назад, а сейчас решил провести апгрейд - расширить объём дисков, новая мать, проц, память и плата интеграции с Алисой Яндекса. Отдельное счастье, что Линуксы спокойно переезжают с старого железа на новое без переустановки. Это не виндувс.
В общем огонь-коробка, всем рекомендую сделать себе такую из старых компьютерных запчастей, которых в избытке на антресолях. Если интерес есть - могу пошарить инструкцию.
2🔥16👍3
Попался вот этот мемасик, а на нем код . Может кому-то будет интересно в чем суть этого кода куска?
Это пример оптимизации из Quake III Arena, служит для быстрого извлечения обратного квадратного корня, который можно использовать для нормализации вектора. Таким образом предполагается, что код будет вызваться крайне часто.
На несколько строчек тут есть пара крутых трюков. Вот можно посмотреть на него поближе:
1. Во-первых тут есть магическое число 0x5f3759df, которое подобрали эмпирическим путем, записано в представлении IEEE 754 (статья о том что это). Так что магические числа — это нормально, особенно если получится такой же эффективный результат.
2. Вот как работает первая часть. Аргумент number после приведения к long сдвигается на 1 бит, что эквивалентно делению числа на 2 с отбрасыванием остатка. После происходит вычитание из магического числа. Уже на данном этапе получается значение приближенное к обратному корню.
Почему использовали побитовую операцию, а не простую запись деления? На процах того времени не было инструкций для быстрого деления дробных чисел, поэтому было бы медленно. Побитовый сдвиг же выполняется за 1 такт. Используя спец запись в формате IEEE 754 операция работает не как простое деление. Сдвиг вправо на 1 бит по сути делит экспоненту на 2, что эффективно приближает к нужному значению, а не просто разделяет число по полам.
3. Далее, чтобы сделать результат более точным используется метод Ньютона, это численный способ итеративного поиска более точных решений. В предыдущем пункте мы уже нашли приближенное значение, теперь делаем его еще точнее.
Повторяя этот процесс, можно было бы получить всё более точные значения, но в данном коде он применяется 1 раз. После этого шага получается значение обратного корня с точностью до третьего знака после запятой.
Вот так вкратце, оптимизируются частые вычисления. Крутое тонкое понимание работы с числами.
#техничка
Это пример оптимизации из Quake III Arena, служит для быстрого извлечения обратного квадратного корня, который можно использовать для нормализации вектора. Таким образом предполагается, что код будет вызваться крайне часто.
На несколько строчек тут есть пара крутых трюков. Вот можно посмотреть на него поближе:
float Q_rsqrt(float number)
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = *(long *)&y;
i = 0x5f3759df - (i >> 1);
y = *(float *)&i;
y = y * (threehalfs - (x2 * y * y));
return y;
}
1. Во-первых тут есть магическое число 0x5f3759df, которое подобрали эмпирическим путем, записано в представлении IEEE 754 (статья о том что это). Так что магические числа — это нормально, особенно если получится такой же эффективный результат.
2. Вот как работает первая часть. Аргумент number после приведения к long сдвигается на 1 бит, что эквивалентно делению числа на 2 с отбрасыванием остатка. После происходит вычитание из магического числа. Уже на данном этапе получается значение приближенное к обратному корню.
i = *(long *)&y;
i = 0x5f3759df - (i >> 1);
y = *(float *)&i;
Почему использовали побитовую операцию, а не простую запись деления? На процах того времени не было инструкций для быстрого деления дробных чисел, поэтому было бы медленно. Побитовый сдвиг же выполняется за 1 такт. Используя спец запись в формате IEEE 754 операция работает не как простое деление. Сдвиг вправо на 1 бит по сути делит экспоненту на 2, что эффективно приближает к нужному значению, а не просто разделяет число по полам.
3. Далее, чтобы сделать результат более точным используется метод Ньютона, это численный способ итеративного поиска более точных решений. В предыдущем пункте мы уже нашли приближенное значение, теперь делаем его еще точнее.
y = y * (threehalfs - (x2 * y * y));
Повторяя этот процесс, можно было бы получить всё более точные значения, но в данном коде он применяется 1 раз. После этого шага получается значение обратного корня с точностью до третьего знака после запятой.
Вот так вкратце, оптимизируются частые вычисления. Крутое тонкое понимание работы с числами.
#техничка
103🤓13🔥7🤯3👌1🤨1
Как вы относитесь к порно играм? А с профессиональной точки зрения, есть разница над каким проектом работать?
Anonymous Quiz
39%
Не играю в такое и не делаю
9%
Не играю, но делаю на работе порно игры
8%
Иногда только играю
17%
Иногда играю и хотел бы делать (уже делаю) порно игры
19%
Смерился бы если пришлось бы работать над такими проектами
9%
Уволился или отказался бы делать такие игры
😁6😱2
Про checked и unchecked думаю многие слышали? Недавно у unsafecsharp вышел пост про то что это. Я перечитал этот пост, пожал плечами, с ностальгией вспомнил, что на собесах это бывает звучит как дополнительный вопрос и все на этом. Отложил как очень интересное знание, которое еще ни разу не пригождалось.
И о чудо! Не далее как вчера попался в проекте баг с ошибкой на переполнение типа. Я видимо подсознательно ждал этого момента. Так что вот реальный пример. В данном проекте никто особо не запаривается на счет подбора типов значений, в основном все в int и float. Если у вас проект, где этому уделяется больше внимания, все типы ужимаются до минимально подходящего, то вероятность встретить ошибку OverflowException возрастает.
Вот так выглядит метод с ошибкой:
#техничка
И о чудо! Не далее как вчера попался в проекте баг с ошибкой на переполнение типа. Я видимо подсознательно ждал этого момента. Так что вот реальный пример. В данном проекте никто особо не запаривается на счет подбора типов значений, в основном все в int и float. Если у вас проект, где этому уделяется больше внимания, все типы ужимаются до минимально подходящего, то вероятность встретить ошибку OverflowException возрастает.
Вот так выглядит метод с ошибкой:
public int GetBundlesSize(List<BundleInfo> bundles)
{
if (bundles.Count == 0)
return 0;
return bundles.Sum(a => a.Size);
}
#техничка
3🔥3👍2🤔1
Еще одна сисадминская история. Когда заблокировали соц. сеть с квадратными фотографиями — было пофиг, но когда замедлился ютуб — стало некомфортно. Для меня это стало красной линией и я завел свой Wireguard VPN-сервер. Оказалось актуально, так как чуть позже заблокировался Notion, потом подъехал Discord, JetBrains блокирует лицензию.
Что дает свой сервер?
- Его не заблокируют, так как он не публичный, не принадлежит к популярному сервису.
- Вы точно знаете, что на уровне VPN никто не мониторит ваши данные.
- Свой сервер дешевле, чем любой покупной, можно найти хостинг от 150 рублей в мес.
- Моментальное подключение без рекламы и прочего.
- Минимального по характеристикам сервера хватит на всю семью и друзей.
В общем время требует от всех нас стать немного сисадминами, так что не будем противиться. Статей на эту тему тоже много, например вот — без воды и по делу.
Что дает свой сервер?
- Его не заблокируют, так как он не публичный, не принадлежит к популярному сервису.
- Вы точно знаете, что на уровне VPN никто не мониторит ваши данные.
- Свой сервер дешевле, чем любой покупной, можно найти хостинг от 150 рублей в мес.
- Моментальное подключение без рекламы и прочего.
- Минимального по характеристикам сервера хватит на всю семью и друзей.
В общем время требует от всех нас стать немного сисадминами, так что не будем противиться. Статей на эту тему тоже много, например вот — без воды и по делу.
⚡7🔥3❤1
Media is too big
VIEW IN TELEGRAM
Наконец-то нормальный маркетинг для отечественного геймдева подъехал. Обязательно смотреть со звуком.
2😁8💩6🔥3
Скачал DLC Инстинкт истребления к Atomic Heart и там невоспитанный гусь начал ругаться, обзывался даже пиздоблядской хлаёбиной . При этом догнать его и дать люлей не получилось. После этого на время была потеряна воля к написанию новых постов, но потом я вспомнил, что примерно так же мы называли читеров, которые атаковали один из наших проектов.
В общем будет несколько постов про античит меры, кратко расскажу какие есть способы и что от чего помогает. Тема громадная, поэтому какие-то моменты я буду опускать, но если что велком в комментарии с вопросами.
Главное, что нужно понимать и с чем сложно смириться — серебряной пули нет, все равно любую систему можно взломать. Единственное на что мы можем влиять — это сложность, на сколько игра или приложение устойчиво к взлому. Таким образом можно сильно сужать круг хацкеров, чтобы вам докучали только самые мотивированные и прокаченные по технической части оппоненты.
Почему вообще стоит бороться с хакерами? Потому, что они создают читы, активно их распространяют и которыми пользуются обычные игроки, превращаясь из платящих в не платящих или в целом не дают стать платящим игроком. Убытки от этого могут быть огромными.
Стоит ли в свою игру сходу имплементировать все, что мы обсудим — нет, только некоторые штуки. В новом проекте стоит же организовать некоторые вещи таким образом, чтобы потом было возможно накрутить нужный функционал. Конкретика будет походу.
И так, нас интересует две области — локальные меры в билде и защита сетевого трафика. Начнем с второго.
Незашифрованный запрос можно перехватить, подменить в нем данные и передать игре. Исходящие запросы тоже самое. Таким образом прощупывая чувствительную информацию можно влиять на поведение игры и сервера. Что можно сделать?
- Валидация запросов — здесь все понятно, это база, останавливаться на этом не будем.
- Шифрование запросов. Если у вас их много, то лучше шифровать часть запросов, которые содержат чувствительные данные. Делается это асимметричным способом, например, с помощью RSA. Сервер шифрует данные публичным ключом, клиент расшифровывает приватным и читает данные. В обратную сторону аналогично.
Тут возникает 2 проблемы:
1. Что если запросы очень объемные? Ассиметричные способы шифрования имеют свой минус — ими можно шифровать небольшие объемы. Тот же RSA ключ 2048 бит сможет зашифровать максимум 245 байт. Таким способом историю покупок не передать. Поэтому в подобных случаях нужно использовать гибридный способ шифрования. Данные шифруются симметричным алгоритмом, например, AES. Ключ от AES шифруется с помощью RSA и все передается в запросе. Чтобы расшифровать такой запрос, сначала распаковывается ключ с помощью RSA, затем с помощью AES расшифровывается контентная часть.
2. Где хранить приватный ключ в клиенте, чтобы его не нашли? Об этом в следующем посте, потому что речь в целом пойдет о локальной части игры.
Замечу в начале, что наиболее надежный способ защиты — это дублирование логики на сервере. До клиента добраться гораздо проще чем до сервера. Поэтому важную логику там нужно дублировать. Это относится к тому, что лучше делать в начале нового проекта и сразу выстраивать архитектуру соответсвенно. Если у вас так, то большая часть проблем вас не коснется.
#техничка@cat_and_code
В общем будет несколько постов про античит меры, кратко расскажу какие есть способы и что от чего помогает. Тема громадная, поэтому какие-то моменты я буду опускать, но если что велком в комментарии с вопросами.
Главное, что нужно понимать и с чем сложно смириться — серебряной пули нет, все равно любую систему можно взломать. Единственное на что мы можем влиять — это сложность, на сколько игра или приложение устойчиво к взлому. Таким образом можно сильно сужать круг хацкеров, чтобы вам докучали только самые мотивированные и прокаченные по технической части оппоненты.
Почему вообще стоит бороться с хакерами? Потому, что они создают читы, активно их распространяют и которыми пользуются обычные игроки, превращаясь из платящих в не платящих или в целом не дают стать платящим игроком. Убытки от этого могут быть огромными.
Стоит ли в свою игру сходу имплементировать все, что мы обсудим — нет, только некоторые штуки. В новом проекте стоит же организовать некоторые вещи таким образом, чтобы потом было возможно накрутить нужный функционал. Конкретика будет походу.
И так, нас интересует две области — локальные меры в билде и защита сетевого трафика. Начнем с второго.
Незашифрованный запрос можно перехватить, подменить в нем данные и передать игре. Исходящие запросы тоже самое. Таким образом прощупывая чувствительную информацию можно влиять на поведение игры и сервера. Что можно сделать?
- Валидация запросов — здесь все понятно, это база, останавливаться на этом не будем.
- Шифрование запросов. Если у вас их много, то лучше шифровать часть запросов, которые содержат чувствительные данные. Делается это асимметричным способом, например, с помощью RSA. Сервер шифрует данные публичным ключом, клиент расшифровывает приватным и читает данные. В обратную сторону аналогично.
Тут возникает 2 проблемы:
1. Что если запросы очень объемные? Ассиметричные способы шифрования имеют свой минус — ими можно шифровать небольшие объемы. Тот же RSA ключ 2048 бит сможет зашифровать максимум 245 байт. Таким способом историю покупок не передать. Поэтому в подобных случаях нужно использовать гибридный способ шифрования. Данные шифруются симметричным алгоритмом, например, AES. Ключ от AES шифруется с помощью RSA и все передается в запросе. Чтобы расшифровать такой запрос, сначала распаковывается ключ с помощью RSA, затем с помощью AES расшифровывается контентная часть.
2. Где хранить приватный ключ в клиенте, чтобы его не нашли? Об этом в следующем посте, потому что речь в целом пойдет о локальной части игры.
Замечу в начале, что наиболее надежный способ защиты — это дублирование логики на сервере. До клиента добраться гораздо проще чем до сервера. Поэтому важную логику там нужно дублировать. Это относится к тому, что лучше делать в начале нового проекта и сразу выстраивать архитектуру соответсвенно. Если у вас так, то большая часть проблем вас не коснется.
#техничка@cat_and_code
5🔥10👍2
А вы видели анонс третей части Мора? "Мор. Утопия."
Наконец-то можно будет обчисть все урны в городе за Данковского.
https://youtu.be/Zb0C2WYUjkI?si=1qZDqiLT57wsC3A_
Наконец-то можно будет обчисть все урны в городе за Данковского.
https://youtu.be/Zb0C2WYUjkI?si=1qZDqiLT57wsC3A_
YouTube
Pathologic 3 Announce Trailer
Pathologic 3. Coming 2025. Wishlist Now:
https://store.steampowered.com/app/3199650/
https://store.steampowered.com/app/3199650/
😁3
Мы небольшой командой работаем над артхаусным проектом о девочке, которая в силу обстоятельств подменяет маму на почте и разносит письма по деревне, называется А Горюшко вслед собакою… Действие игры проходит в военное время, но в мирной деревни в дали от фронта. История основана на реальных воспоминаниях главной героини. Проект уже давно томится и наверное мог бы потерять актуальность, если бы не был таким необычным по визуальному стилю и сюжету.
Даже странно писать это, но игра выйдет до нового года, Стим уже апрувнул билд, осталось только дочинить самыесамые-самые последние баги.
За время разработки проект по сто раз откладывался и вытаскивался из ящика. Бывало, что в ящик кладет один член команды, а чуть позже достает другой и продолжает пилить. Так вот и сейчас Николай допиливает баги, а другой тиммейт пишет посты в бложек и делает мотивирующие локальные мемы, чтобы поддержать команду.
Если игра понравится — добавьте в желаемое, нам это важно. Игра в Steam
#девлог
Даже странно писать это, но игра выйдет до нового года, Стим уже апрувнул билд, осталось только дочинить самые
За время разработки проект по сто раз откладывался и вытаскивался из ящика. Бывало, что в ящик кладет один член команды, а чуть позже достает другой и продолжает пилить. Так вот и сейчас Николай допиливает баги, а другой тиммейт пишет посты в бложек и делает мотивирующие локальные мемы, чтобы поддержать команду.
Если игра понравится — добавьте в желаемое, нам это важно. Игра в Steam
#девлог
11🔥12❤5👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Приятная викторина незадолго до Нового Года. Мы решили разыграть ключики от А Горюшко вслед собакою... на Steam. А также хотим познакомить вас с нашими каналами. Перешлите этот пост друзьям, которым будет интересно поучаствовать.
Разыгрываем 3 ключа, бот случайно выберет 3х участников, итоги будут тут на канале 28 декабря в 15:00.
Для участия подписаться на:
1. Кот и Код - здесь про разработку игр
2. Сволоч и Борщ - здесь про геймдизайн
3. Клик на кнопку “Участвовать”
Разыгрываем 3 ключа, бот случайно выберет 3х участников, итоги будут тут на канале 28 декабря в 15:00.
Для участия подписаться на:
1. Кот и Код - здесь про разработку игр
2. Сволоч и Борщ - здесь про геймдизайн
3. Клик на кнопку “Участвовать”
🔥9
Листал ленту, захотел поделиться каналом @tochno_kesha Автор сильно изворачивается с стилизацией под PS1 и пикселизацию припудрив щепоткой крипоты.
Ну и в целом не боится экспериментов, в подборке скринов на последних 2х, он распечатал uv-карту, затем раскрасил цветными карандашами и отсканировал обратно. Результат вау. Сколько всего интересного можно так сделать. Взял себе на вооружение, воспользуюсь когда захочется сделать что-то еще вроде нашего Марево
Ну и в целом не боится экспериментов, в подборке скринов на последних 2х, он распечатал uv-карту, затем раскрасил цветными карандашами и отсканировал обратно. Результат вау. Сколько всего интересного можно так сделать. Взял себе на вооружение, воспользуюсь когда захочется сделать что-то еще вроде нашего Марево
🔥9 1