Длина пароля - 18 знаков, алфавит - троичный, т.е. всего 3^18=387420489 возможных паролей. Ёмкость достаточна для представления ~28 битов информации. Что же там хранится?
Битовая структура пароля:
HHHH HZPP PCCF FFFF FFUU UMMM MMDD
где
H - hash-сумма остальных битов пароля
Z - флаг для специальных cheat-паролей (в обычных паролях должен быть установлен в 0)
PPP - персонаж:
000 - Korr
001 - Zorn
010 - Zarak
011 - Talazia
100 - Jen-Tal
101 - Divada
110 - Bane
111 - запрещенное сочетание (пароль будет признан ошибочным)
СС - цвет персонажа, определяется нажатой кнопкой на экране выбора:
00 - START
01 - A/X
10 - B/Y
11 - C/Z
FFFFFFF - флаги, означающие что в бою с соответсвующим противником было выполнено Fatality. Порядок флагов такой же как и порядок персонажей, т.е. Korr, Zorn, Zarak, etc. Влияют на концовку.
UUU - неизвестное значение
MMMMM - карта боя, т.е. по сути игровой этап. Отведено аж 5 битов, но большинство комбинаций являются запрещёнными. Игра выдаёт пароли всего на 2 этапа - арену демонов и финальный бой, налицо избыточность. Кроме того коды карт отличаются для 2х персонажей - Jen-Tal и Bane.
00110 - Demons arena (для всех персонажей кроме Jen-Tal и Bane)
00111 - Demons arena (для Jen-Tal и Bane)
01000 - Final (для всех персонажей кроме Jen-Tal и Bane)
01001 - Final (для Jen-Tal и Bane)
DD - сложность игры
00 - adventurer
01 - warrior
10 - barbarian
11 - warlord
Алгоритм расчёта hash очень простой:
1) Берутся все информационные биты, следующие за хэшем порциями по 5 шт (для последней порции из 3х битов справа дописывается 00)
2) Полученные числа складываются
3) С результатом сложения делается битовая операция & с числом 0x1F (ну или то же самое что взятие по модулю 32)
4) Полученное 5 битное число и есть hash
Пример:
составим пароль для Talazia обычного цвета (т.е. при выборе кнопкой START) на финальный бой на сложности Warlord с условием что мы якобы сделали Fatality всем (в том числе и себе
и финальному боссу Zarak, которого ещё не убивали, игра это не запрещает и не проверяет пароль на абсурдность такой ситуации). Неизвестное значение примем равным 0.
Итак
Z=0
PPP=011
CC=00
FFFFFFF=1111111
UUU=000
MMMMM=01000
DD=11
HHHH H001 1001 1111 1100 0010 0011
Вычисляем hash (берём биты по 5 штук):
00110=6
01111=15
11100=28
00100=4
011(00)=12 //не забываем про добавочные 00
6+15+28+4+12=65
65 mod 32 = 1
HHHHH=00001
Т.е. наш пароль будет выглядеть в двоичном виде так:
0000 1001 1001 1111 1100 0010 0011
ну или в шестнадцатиричном:
099FC23 = 10091555 в десятичном
Для получения пароля в пригодном для игры виде осталось сделать несколько простых шагов:
1)Перевести полученное ранее число в троичную систему счисления
2)"Перевернуть", т.е. прочитать его справа налево
3)Заменить все 0 на A, 1 на B, 2 на C
3)При необходимости дописать в конец столько А, сколько необходимо для получения 18 символьного пароля
10091555 в десятичной системе это 200222201000022 в троичной (для перевода можно воспользоваться например
онлайн-сервисом). "Перевернём" число, получим: 220000102222002.
Заменяем цифры на буквы: CCA AAA BAC CCC AAC. Осталось дописать ААА в конец и получаем наш пароль:
CCA AAA BAC CCC AAC AAA
Теперь касательно генерации специальных cheat паролей:
1)Должен быть установлен в 1 флаг Z
2)Все остальные поля (кроме MMMMM) должны быть нулями
3)Поле MMMMM допускает значения (фактически означает номер активируемого чита от 1 до 10 включительно):
00001 - много энергии у обоих персонажей
00010 - режим нокдаунов (черепки над головой а ля звёздочки и невозможность управлять персонажем, получившим солидную порцию урона)
00011 - огонь на заставке (дождитесь появления слова Weaponlord)
00100 - пауза без затемнения экрана и слова pause (удобно для скриншотов)
00101 - особый цвет персонажа для игрока 1 (как в заставках)
00110 - особый цвет персонажа для игрока 2 (как в заставках)
00111 - демо-режим (противнику делают 25% хп и игру проходит компьютер)
01000 - демо-режим 2 (просто бои компьютер против компьютера)
01001 - возможность выбрать Zarak в режиме story
01010 - особые благодарности от разработчиков в финальных титрах (километры забавных текстов
)