Как работает код колоды?

Мне вот интересно, как работает код колоды? По какому принципу? Я пробовал меня пару символов, в надежде что некоторые карты поменяются, но код просто не читался.

Лайков: 1

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

мамкин хакер :blonde_man:

3 лайка

Причём тут хакерство? Мне интересен сам принцип

2 лайка

Попробуй поменять буковки, только правильно, может получится :3

2 лайка

Очередная юзлесс-тема.
Если не работает редактирование шифра, значит, это не шифр, а учётная единица.

ну это я по рофлу написал, просто любой чел с дефолтной логикой бы взял код деки поменял там 1 карту несколько раз, чтобы понять коды карт и систему. А ты вместо такого простого действия начал подбирать символы, хотя там по самому виду кода понятно, что так просто не попадёшь в код карты.

Лайков: 1

Так тот код, что копируется из игры, это строка в формате Base64.

https://ru.wikipedia.org/wiki/Base64

Разумеется, если нарушить её целостность, шифротекст перестанет преобразовываться обратно.

Лайков: 1

То есть нагуглить https://hearthsim.info/docs/deckstrings/ это уже не дефолтная логика…

Принцип достаточно сложный! Знаешь игру Borderlands2/3?

Так вот там есть редакторы сохранений (читерство) и там система схожа, пример:

№1
AwAAAAC2M4A8V2NBE3QaEMfjZ0AcLBqP6ASUuyuEAAAAAAAAZ0AA

№2
AwAAAACy5IA8V2NBE3waEMfjZ0AcLBqP6HQCyt0VQgAAAAAAgDMgAA==

Если ты заметишь то тут отличий хватает но при этом это 1н и тот-же предмет но различается он тем что во 2м случае у этого дробовика продублирован прицел, да их тут целых джва!

Тут простая смена символов не поможет…

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

Код колоды это закодированная в Base64 последовательность байт. Менять “шифр” напрямую, конечно же не стоит, это ни к чему не приведёт. Сначала нужно его раскодировать и получить оригинальные байты. А о структуре данных в этих байтах можно почитать здесь: https://hearthsim.info/docs/deckstrings/

Подробный разбор на примере

Возьмём код колоды для примера
AAEBAf0GAo+CA9a5Aw4w9wTOB8II2RXUswK8tgLy0AL9pAO1uQO2uQPXzgPV0QPQ4QMA
Base64 это просто способ записать бинарные данные с помощью букв латинского алфавита и некоторых спецсимволов. Суть в том, что такую строку можно передавать в виде текста во всевозможных чатах, постах и т.д. и с лёгкостью обмениваться данными даже там, где их передача не предусмотрена. Более подробно о Base64 рассказывать не буду, у меня цель другая. Нужно раскодировать Base64 обратно в оригинальную последовательность байт. Получается вот такое:

Последовательность

[0] => 0
[1] => 1
[2] => 1
[3] => 1
[4] => 253
[5] => 6
[6] => 2
[7] => 143
[8] => 130
[9] => 3
[10] => 214
[11] => 185
[12] => 3
[13] => 14
[14] => 48
[15] => 247
[16] => 4
[17] => 206
[18] => 7
[19] => 194
[20] => 8
[21] => 217
[22] => 21
[23] => 212
[24] => 179
[25] => 2
[26] => 188
[27] => 182
[28] => 2
[29] => 242
[30] => 208
[31] => 2
[32] => 253
[33] => 164
[34] => 3
[35] => 181
[36] => 185
[37] => 3
[38] => 182
[39] => 185
[40] => 3
[41] => 215
[42] => 206
[43] => 3
[44] => 213
[45] => 209
[46] => 3
[47] => 208
[48] => 225
[49] => 3
[50] => 0

Как видите, каждое число довольно маленькое. В одном байте можно записать число от 0 до 255. Но карт же в игре гораздо больше, да? Прикол в том, некоторые числа занимают сразу несколько байт. Конкретно в данном случае используется VarInt. Это особый тип данных с динамическим числом байт. Конкретное число байт, занимаемое числом, зависит от размера самого числа. Если интересно, можете загуглить про это. Проходимся по массиву и считываем VarInt. Получается такое:

Последовательность

[0] => 0
[1] => 1
[2] => 1
[3] => 1
[4] => 893
[5] => 2
[6] => 49423
[7] => 56534
[8] => 14
[9] => 48
[10] => 631
[11] => 974
[12] => 1090
[13] => 2777
[14] => 39380
[15] => 39740
[16] => 43122
[17] => 53885
[18] => 56501
[19] => 56502
[20] => 59223
[21] => 59605
[22] => 61648
[23] => 0

Всё, теперь у нас есть исходные данные, и с ними можно работать. Читаем далее инфу о структуре данных.
Первое число - резервный байт. На данный момент не используется и должен быть равен 0.
Второе число - версия. С момента введения не менялась и должна быть равна 1.
Третье число - формат. 1 - вольный, 2 - стандарт. Возможно со введением классики появится и значение 3 - классика.
Четвёртое число - количество героев. На данный момент всегда равно 1.
Пятое число - ID героя. По нему узнаётся класс колоды. При чём ID указывается конкретного скина. Так что по коду колоды можно узнать каким скином вы играете.
Шестое число - количество карт в колоде, которых по одной копии. Далее идёт перечисление их ID.
Седьмое (+число карт из шестого) число - количество карт в колоде, которых по две копии. Далее идёт перечисление их ID.
Восьмое (+число карт из седьмого+число карт из шестого) число - количество карт в колоде, которых более 2 копий. Далее идёт перечисление по 2 числа. Первое - ID карты, второе - количество копий.

Последовательность с подписью значений

[0] => 0 (Резервный байт. Должен быть равен 0.)
[1] => 1 (Версия. Должна быть равна 1.)
[2] => 1 (Формат колоды. 1 = вольный, 2 = стандарт.)
[3] => 1 (Размер массива с героем. Должен быть равен 1.)
[4] => 893 (ID героя колоды. По нему узнаётся класс.)
[5] => 2 (Количество карт в колоде, которых в ней по одной копии. Далее перечисление их ID.)
[6] => 49423
[7] => 56534
[8] => 14 (Количество карт в колоде, которых в ней по две копии. Далее перечисление их ID.)
[9] => 48
[10] => 631
[11] => 974
[12] => 1090
[13] => 2777
[14] => 39380
[15] => 39740
[16] => 43122
[17] => 53885
[18] => 56501
[19] => 56502
[20] => 59223
[21] => 59605
[22] => 61648
[23] => 0 (Количество карт в колоде, которых в ней более двух копий. Далее их перечисление, сначала ID затем количество копий.)

5 лайков

Ссылку на источник бы дал для приличия.

Ctrl c/ctrl f больше не модно и молодёжно?)

Источник чего? Ссылку на инфу по структуре данных я дал.

Источник статьи.

Всё что под спойлером я писал сам.
Ну оке, для раскодировки использовал сайт http://somepony.space/hsdeck/ с добавлением доп. параметра в адрес debug=1. Но текст сам писал.