Генерування паролів на серію ігор Prince of Persia

Добрий день, шановні користувачі.

Сьогодні я хотів би розповісти про одну чудову серію ігор. Багато познайомилися з нею, завдяки версії на NES, деякі бачили перського принца на DOS, хто грав в Принц Персії на Sega Genesis і… ніби все, але немає! Перша частина була портована на велику кількість різних ігрових платформ. А скільки систем паролів було придумано з цього приводу? А скільки портів було у другій частині? А які паролі були там?
Про це я і хотів би Вам розповісти.

Prince of Persia (Sega Master System/Sega Game Gear)

image

Теорія

Пароль складається з 6 позицій. Ці позиції зберігають дані ігрові параметри:
  • рівень (1-14)
  • час (0-99)
  • життя (0-7)
  • рандом (0-25)
Генерація
1 позиція = ((рівень -1) + рандом) mod26
2 позиція = ((час div10) + рандом) mod26
3 позиція = ((час mod10) + рандом) mod26
4 позиція = (життя + рандом) mod26
5 позиція = рандом
6 позиція = ((сума позицій з 1 по 5) + 10) mod26

Кодування
Символи в позиціях приймають значення «ABCDEFGHIJKLMNOPQRSTUVWXYZ», де A=0, B=1… Y=24, Z=25.

Приклад генерації пароляСтворимо пароль, який зберігає дані параметри:
  • (12)
  • життя (6)

  • час (59)
  • рандом (18)
Обчислюємо:
1)
1 позиція = ((12 -1) + 18) mod26
2 позиція = ((59 div10) + 18) mod26
3 позиція = ((59 mod10) +18) mod26
4 позиція = (6+18) mod26
5 позиція = 18
6 позиція = 10

2)
1 позиція = 3
2 позиція = 23
3 позиція = 1
4 позиція = 24
5 позиція = 18
6 позиція = (3+23+1+24+18+10) mod26 = 1

Тепер кодуємо отримані значення:
DXBYSB

Цікавий баг
У грі є баг, за допомогою якого можна отримати безсмертя. Але перед поясненням, я хотів би обговорити архітектуру рівнів.
Умовно розділимо екран на 3 поверхи.
Поверхиimage

Якщо у принца життя від 1 до 7, то при падінні з 2 поверху на 1, життя не тратяться. А при падінні з 3 поверху на 1, витрачатися 1 життя.
Якщо життів 0, то відбувається все навпаки. При падінні з 2 поверху на 1, принц вмирає, а при падінні з 3 поверху на 1, відбувається баг: гра дасть принцу 8 життів (не забуваємо, що максимум дорівнює семи).
8 життівimage

Після виконаної операції, принц зможе зістрибувати з 3 і 2 поверхи, не завдаючи собі шкоди (якщо взяти 4 поверх, то принц помре).
Також принц буде невразливим для ворожих атак (якщо зброя буде в руках).
Після проходження рівня, баг зникає і у принца знову стане 0 життів.
А якщо з нулем життів напасти на охоронця, то він просто проігнорує і вбити його стане неможливо.
Принц-привидimage

Ось так ось.

Prince of Persia (Game Boy/Game Boy Color)

image

Теорія

Пароль складається з 8 позицій. Ці позиції зберігають дані ігрові параметри:
  • рівень (2-14)
  • час (1-59)
  • життя (3-9)
Примітка: на 7 рівень не можна створити пароль.

Генерація
1 позиція = (4 позиція + 7 позиція + 8 позиція) mod10
2 позиція = (5 позиція + 6 позиція) mod10
3 позиція = (7 позиція + 8 позиція) mod10
4 позиція = життя
5 позиція = час mod10
6 позиція = час div10
7 позиція = рівень mod10
8 позиція = рівень div10

Кодування
До всіх позицій застосовується операція: XOR 5. Якщо після виконання цієї операції вийшло двухзначное число, то треба відняти 4.

Приклад генерації пароляСтворимо пароль, який зберігає дані параметри:
  • (9)
  • життя (7)

  • час (35)


Обчислюємо:
1)
1 позиція = 0
2 позиція = 0
3 позиція = 0
4 позиція = 7
5 позиція = 35 mod10
6 позиція = 35 div10
7 позиція = 9 mod10
8 позиція = 9 div10

2)
1 позиція = (7+9+0) mod10 = 6
2 позиція = (5+3) mod10 = 8
3 позиція = (9+0) mod10 = 9
4 позиція = 7
5 позиція = 5
6 позиція = 3
7 позиція = 9
8 позиція = 0

Тепер кодуємо отримані значення:
6 XOR 5 = 3
8 XOR 5 = 13-4 = 9
9 XOR 5 = 12-4 = 8
7 XOR 5 = 2
5 XOR 5 = 0
3 XOR 5 = 6
9 XOR 5 = 12-4 = 8
0 XOR 5 = 5

Готовий пароль:
39820685

Prince of Persia (Sega Genesis)

image

Теорія

Пароль складається з 6 позицій. Ці позиції зберігають дані ігрові параметри:
US version:
  • рівень (1-13)
  • час (0-60)
  • життя (1-8)

EU version:
  • рівень (1-13)
  • час (0-60)
  • життя (0-8)
Якщо будете грати в цю гру, то краще вибирайте EU версію, так як:
  • EU версії додали 4 додаткових рівня
  • EU версії є музичний супровід на рівнях
  • EU версії є баг-безсмертя

Генерація
Умовно розділимо пароль на дві частини (кожна частина складається з трьох позицій).

Перша частина зберігає час:
(10545*час)mod 17576
Отримане число з 10 CC переводиться в 26 СС (СС — система числення).
Потім отримане значення потрібно дзеркально відобразити. Якщо довжина отриманого пароля» менше 3 символів, то праворуч дописується необхідну кількість нулів.

Друга частина зберігає час, кількість життів і рівень:
((10545*час) + (14157*(рівень-1)) + (5145*життя))mod 17576
Отримане число з 10 CC переводиться в 26 СС.
Потім отримане значення потрібно дзеркально відобразити. Якщо довжина отриманого пароля» менше 3 символів, то праворуч дописується необхідну кількість нулів.

Кодування
Символи в позиціях приймають значення «ABCDEFGHIJKLMNOPQRSTUVWXYZ», де A=0, B=1… Y=24, Z=25.

Приклад генерації пароляСтворимо пароль, який зберігає дані параметри:
  • (12)
  • життя (6)

  • час (39)


Обчислюємо:

Перша частина пароля:
(10545*39)mod 17576 = 411255 mod 17576 = 7007
7007 (10 СС) = 10,9,13 (26 СС)
Дзеркально відображаємо отримане значення:
10,9,13 =13,9,10

Друга частина пароля:
((10545*39) + (14157*(12-1)) + (5145*6))mod 17576 = (411255+155727+30870)mod 17576 = 268
268 (10 СС) = 10,8 (26 СС)
Дзеркально відображаємо отримане значення:
10,8 = 8,10
Дописуємо праворуч нуль:
8,10,0

Тепер кодуємо отримані значення:
13,9,10,8,10,0 = NJKIKA

Цікавий баг
У грі є баг, за допомогою якого можна отримати безсмертя. Щоб її активувати, потрібно EU версії ввести пароль з нульовим кількістю життів. Тепер принцу не страшні вороги (головне — не прибирати зброю). Але з активацією бага, гравець отримує одну проблему. Якщо впасти з великої висоти, яка загрожує втратою всіх життів, то нічого не станеться. Але якщо впасти з висоти, при якій у принца повинна витратитися життя, то гра зависне, а екран забарвиться в червоні тони.

Prince of Persia (SNES)

image

Ось і настав час поговорити про найкращої реалізації першого перського принца (на мою скромну думку).
Порівняно з усіма попередніми версіями, для SNES зробили більш барвисті локації, поліпшили відбивання, частково змінили початкові рівні і додали багато нових стадій (разом 20). А щоб гравець не мучився, час збільшили до 120 хвилин (грай скільки влізе).

Теорія

Пароль складається з 7 позицій, кожна позиція складається з 5 бітів, разом 7*5= 35 бітів. Ці біти зберігають дані ігрові параметри:
  • рівень (1-20)
  • витрачений на гру час (0-7200) (в секундах)
  • життя (0-15)
Тепер подивимося, з чого складається сирої пароль:

(?(0),S(0),L(3),T(0),T(7)) (C1(0),S(1),L(2),T(1),T(6)) (C2(0),S(2),L(1),T(2),T(5)) (C3(0),S(3),L(0),T(3),T(4))

(C4(0),S(4),U(0),T(8),T(9)) (C4(1),T(10),T(11),T(12),T(13)) (C4(2),C4(3),C4(4),T(14),T(15))

* в дужках вказано номер біта.

Позначення
S — номер рівня ((1-20)-1) в двійковій C. C.
L — кількість життів (0-15) в двійковій C. C.
U — невикористані біти.
? — завжди дорівнює нулю.
T — витрачений на гру час (0-7200).
Час записується в паролі, у відповідності зі спеціальною формулою:
(*7) + (5, якщо час mod60≠0) + (5*((час div60)-1)) + рандом (0-6 + ((5, якщо час mod60=0) або (14534, якщо час div 7200=1)))

C1 = S(1) XOR S(4) XOR L(0) XOR L(1) XOR T(0) XOR T(1) XOR T(2) XOR T(5) XOR T(7) XOR T(8) XOR T(10) XOR T(13) XOR T(15) XOR U(0) XOR 1

C2 = S(1) XOR S(2) XOR S(3) XOR L(0) XOR L(2) XOR L(3) XOR T(1) XOR T(4) XOR T(5) XOR T(8) XOR T(9) XOR T(10) XOR T(12) XOR T(14) XOR T(15)

C3 = S(0) XOR S(1) XOR S(3) XOR L(2) XOR T(2) XOR T(3) XOR T(5) XOR T(6) XOR T(7) XOR T(8) XOR T(9) XOR T(11) XOR T(14) XOR U(0)

C4 = S(0),L(3),T(0),T(7)
+ S(1),L(2),T(1),T(6)
+ S(2),L(1),T(2),T(5)
+ S(3),L(0),T(3),T(4)
+ S(4),U(0),T(8),T(9)
+T(10),T(11),T(12),T(13)
+ 0, 0,T(14),T(15)

Кодування
US/EU: «BTL3GY7Q9CVM4HZ8R+DWN5J12S!FXP6K».
JP: «AIQYEMU34BJRZFNVW5CKS1GOPX6DLT2H».

Приклад генерації пароляСтворимо пароль, який зберігає дані параметри:
  • рівень (15)
  • життя (13)

  • час (95.00) або (5700 секунд)

  • невикористаний біт активований

Переводимо значення в двійкову систему числення:
Рівень = 15-1 =14 = 01110
Життя = 13 = 1101

Обчислюємо час:
Час = 7200-5700=1500
(1500*7) + (0, т. к. 1500 mod 60 = 0) + (5*(25-1)) + рандом (т. к. 1500 mod 60 = 0, то рандом = 0-6+5 = 0-11. Я вибираю рандом = 11.)
10500 + 120 + 11 = 10631 = 0010100110000111

Обчислюємо контрольні суми:
C1 = 1 XOR 0 XOR 1 XOR 0 XOR 1 XOR 1 XOR 1 XOR 0 XOR 1 XOR 1 XOR 0 XOR 1 XOR 0 XOR 1 XOR 1 = 0
C2 = 1 XOR 1 XOR 1 XOR 1 XOR 1 XOR 1 XOR 1 XOR 0 XOR 0 XOR 1 XOR 0 XOR 0 XOR 0 XOR 0 XOR 0 = 0
C3 = 0 XOR 1 XOR 1 XOR 1 XOR 1 XOR 0 XOR 0 XOR 0 XOR 1 XOR 1 XOR 0 XOR 1 XOR 0 XOR 1 = 0
C4 = 0111 + 1110 + 1010 + 1100 + 0110 +0101 + 0000 = 110110

Записуємо отриманий пароль в двійковій С. С.:
(00111) (01110) (01010) (01100) (00110) (10101) (10100)

Записуємо отриманий пароль в десятковій С. С.:
(7) (14) (10) (12) (6) (21) (20)

Тепер кодуємо отримані значення:
US/EU: QZV475N
JP: 3NJZU1S


Prince of Persia 2: The Shadow & The Flame

Перша частина знайшла величезну популярність. Вихід сиквела було лише питанням часу. І через чотири роки з'явилося продовження. Але нова частина не знайшла бурхливих оплесків, якими нагородили першу частину. І портувати її на невелику кількість ігрових платформ. А шкода! Я вважаю, що друга частина вийшла краще першої. Тепер принц подорожує не за одноманітним темним локаціях, а по цілій Персії. Але досить лірики, пора переходити до справи.
Гра обзавелася двома портами, які зберігають ігровий процес з допомогою паролів. Ці порти жахливі (краще грайте в DOS версії). SNES версія вийшла кострубата: музика дребезжащая, противні звуки, геймплей убитий і до всього цього, в грі вирізаний 14 рівень, якому повинна відбутися битва з Джаффаром.
Версія для Sega Genesis не краще. Так як цю гру офіційно не випустили, то я зміг побачити тільки за допомогою піратського картриджа на Сегу. І якого виявилося моє розчарування, коли я дійшов до 9 рівня і дізнався, що через бага зі статуєю коня, цей рівень непрохідний. Гру можна пройти, але для цього потрібен пароль на 10 рівень… а в книзі, паролів, цієї гри не було.

Prince of Persia 2: The Shadow & The Flame (SNES)

image

Теорія

Пароль складається з 6 позицій, кожна позиція складається з 4 бітів, разом 6*4= 24 біта. Ці біти зберігають дані ігрові параметри:
US/EU versions:
  • рівень (1-13)
  • час (0-164)
  • життя (1-15)
Тепер подивимося, з чого складається сирої пароль:

(S(3),S(2),S(1),S(0)) (L(3),L(2),L(1),L(0)) (T1(3),T1(2),T1(1),T1(0)) (T2(3),T2(2),T2(1),T2(0))

(C1(3),C1(2),C1(1),C1(0)) (C2(3),C2(2),C2(1),C2(0))

Позначення
S — (рівень — 1) в двійковій С. С.
L — кількість життів (1-15) в двійковій С. С.
T1 — 1 значення (0-15) в двійковій С. С.
T2 — 2 значення (0-15) в двійковій С. С.
1 значення — кількість одиниць часу (число десятків з 1 значення переходить у 2 значення).
2 значення — кількість десятків часу (число десятків з 2 значення переходить у кількість сотень).
C1 = (сума позицій з 1 по 3) mod16
C2 = ((сума позицій з 1 по 3) div16) + 4 позиція

Кодування
Символи в позиціях приймають значення «BCDFGHJKLMNPRTVW», де B=0… W=15.

Особливості збереження часу і працездатності пароля:
Якщо подумати, то все просто — одна позиція відповідає за час mod10, а інша за час div10 і максимальну кількість часу дорівнює 99. Але не все так просто. В паролі не перевіряється максимальне значення одиниць і десятків. Що це означає? В паролі можна встановити кількість десятків і одиниць від 0 до 15. Якщо я створю пароль, де кількість одиниць дорівнює 15, то одиниць буде 5, а 1 перейде в кількість десятків, анологично, якщо я створю пароль, де кількість десятків дорівнює 15, то десятків буде 5, а 1 перейде в кількість сотень.
Виходить, максимальну кількість часу дорівнює:
150
+015
=
165
Але вище, я вже описав, що максимальне значення = 164. А чому?
Це відбувається через контрольної суми. Якщо С2≥16, пароль не буде працювати. Цей аспект я поясню трохи пізніше, а зараз перейдемо до генерації пароля (щоб зрозуміти подальше оповідання, я раджу прочитати приклад генерації пароля).

Приклад генерації пароляСтворимо пароль, який зберігає дані параметри:
  • рівень (2)
  • життя (1)

  • час (163)
Переводимо значення в двійкову систему числення:
Рівень = 2-1 =1 = 0001
Життя = 1= 0001

Обчислюємо час:
163= 150+13
1 значення = 13 = 1101
2 значення = 15 = 1111

Записуємо сирої пароль і обчислюємо 2 контрольні суми:
(0001) (0001) (1101) (1111) (****) (****)

C1 = 0001+0001+1101 = 1111
C2 = (0001+0001+1101)mod16 + 1111 = 0000 + 1111 = 1111

(0001) (0001) (1101) (1111) (1111) (1111)

Записуємо отриманий пароль в десятковій С.С.:
(1) (1) (13) (15) (15) (15)

Тепер кодуємо отримані значення:
CCTWWW


Підсумок
Я створив пароль CCTWWW. Якщо збільшити рівень на 1, то пароль не буде працювати, оскільки C2 стане дорівнює 16. Непрацюючий пароль буде мати вигляд: DCTWBB. А тепер перевіримо гру «на вошивість». Другий рівень дуже короткий, тому його можна пройти без втрати часу. Якщо я пройду рівень, який пароль видасть мені гра?
Раптом в системі паролів є секрет, який я не розкрив? А що, якщо…

Парольimage

… ось зараза. У грі не тільки геймплей жахливий, але і система паролів недороблена.

Prince of Persia 2: The Shadow & The Flame (Sega Genesis)

image

Теорія

Пароль складається з 5 позицій. Ці позиції зберігають дані ігрові параметри:
  • рівень (1-14)
  • час (0-99)
  • життя (1-12)
Генерація
1 позиція = (рівень) або (рівень (1-7) +15)
2 позиція = (час mod10) або (час mod10 + 10) або (час mod10 (0-2) + 20)
3 позиція = (1 позиція + 2 позиція + 4 позиція + 5 позиція) mod23
4 позиція = (час div10) або (час div10 + 10) або (час div10 (0-2) + 20)
5 позиція = (життя -1) або (життя (1-11) + 11)

Кодування
Символи в позиціях приймають значення «HFMGRANBPWTEIZVQDLYSKCX», де H=0, F=1… C=21, X=22.

Приклад генерації пароляСтворимо пароль, який зберігає дані параметри:
  • (11)
  • життя (10)

  • час (92)


Обчислюємо:

Перший крок:
1 позиція = рівень зберігається за однією з двох формул. Так як рівень більше 7, то зберегти дані можна тільки по першій формулі (11).
2 позиція = час зберігається за однією з трьох формул. 92 mod10 = 2. Це значення можна закодувати за будь-якою формулою і я вибираю третю (2+20 = 22)
3 позиція = 0
4 позиція = час зберігається за однією з трьох формул. 92 div10 = 9. Це значення можна закодувати тільки по першій і другій формулі, і я вибираю другу (9+10 = 19)
5 позиція = житті зберігаються за однією з двох формул. Це значення можна закодувати за будь-якою формулою і я вибираю другу (10+11 = 21).

Другий крок:
1 позиція = 11
2 позиція = 22
3 позиція = (11 + 22 + 19 + 21)mod 23 = 4
4 позиція = 19
5 позиція = 21

Тепер кодуємо отримані значення:
EXRSC


Висновок

Ось і підійшов список ігор до кінця. Ну що ж, удачі, спасибі за прочитання.Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.