Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- checksum_storage = [0, 0, 0, 0, 0, 0]
- password_char_codes = [0, 0, 0, 0, 0, 0]
- valid_chars = ['B', 'C', 'D', 'F', 'G', 'H', 'J', 'K',
- 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
- 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4',
- '5', '7', '8', '9', '+', '$', '%', '#']
- # Completed levels are stored in a bitwise method: 17 in binary is 0b00010001
- # The first and fifth bits are on, so 17 means the player has completed Lewa and Kopaka's levels
- toa_names = ['Lewa', 'Pohatu', 'Kopaka', 'Onua', 'Gali', 'Tahu', 'Takanuva']
- def init_password_char_codes(password):
- invalid_chars = [ch for ch in password if ch not in valid_chars]
- if invalid_chars:
- raise Exception
- password_char_codes[0] = valid_chars.index(password[0])
- password_char_codes[1] = valid_chars.index(password[1])
- password_char_codes[2] = valid_chars.index(password[2])
- password_char_codes[3] = valid_chars.index(password[3])
- password_char_codes[4] = valid_chars.index(password[4])
- password_char_codes[5] = valid_chars.index(password[5])
- def init_checksum_storage():
- checksum_storage[0] = 25 - password_char_codes[0] # Magic number - no idea why 25 is used specifically on the first char
- checksum_storage[1] = 0
- checksum_storage[2] = 0
- checksum_storage[3] = 0
- checksum_storage[4] = 0
- checksum_storage[5] = 0
- def get_checksum_step_1():
- for idx in range(1, 6):
- for idx2 in range(5):
- r3 = password_char_codes[idx]
- r3 = r3 // (2 ** idx2)
- r1 = idx
- if r3 % 2 != 0:
- r3 = checksum_storage[0] + idx2
- while r3 > 4:
- r1 = (r1 % 5) + 1
- r3 -= 5
- r3 = 2 ** r3
- checksum_storage[r1] = (r3 | checksum_storage[r1])
- def overwrite_password_char_codes():
- for i in range(1, 6):
- password_char_codes[i] = checksum_storage[i]
- def build_completed_level_string(byte_values, allow_takanuva=False):
- completed_levels = []
- binary_string = bin(byte_values)
- for idx, bit in enumerate(binary_string[::-1]):
- if bit == '1' and idx < len(toa_names):
- if toa_names[idx] == 'Takanuva' and not allow_takanuva:
- continue
- completed_levels.append(toa_names[idx])
- return ', '.join(completed_levels) if completed_levels else '-'
- def set_completed_levels():
- checksum_byte = 0
- for i in range(5):
- for subloop in range(5):
- r3 = password_char_codes[i]
- r3 = r3 // (2 ** subloop)
- if r3 & 1:
- checksum_byte += 1
- print(f'>> checksum: {str(checksum_byte)} char code: {password_char_codes[-1]}')
- if checksum_byte != password_char_codes[-1]:
- print('Invalid checksum, clearing password')
- clear_password()
- return
- r0 = password_char_codes[2]
- r1 = password_char_codes[3]
- r3 = 3 & r1 # 3 and 15 = 3
- r4 = 3 & r0 # 3 and 15 = 3
- r4 = (r3 * 4) | r4 # 12 | 3 = 15
- r5 = password_char_codes[4]
- r0 = r0 & 12 # 15 and 12 = 12
- r1 = r1 & 12 # 15 and 12 = 12
- r2 = 3 & r5 # 3 and 15 = 3
- r3 = 12 & r5 # 12 and 15 = 12
- r2 *= 16 # 3 * 16 = 48
- r0 = (r0 // 4) | r1 # 3 | 12 = 15
- r3 = r3 * 4 # 12 * 4 = 48
- r4 = r4 | r2 # 15 | 48 = 63
- r0 = r0 | r3 # 15 | 48 = 63
- toa_status = r4
- nuva_status = r0
- print(r4)
- print(r0)
- print(f'Toa: {build_completed_level_string(r4, False)}')
- print(f'Nuva: {build_completed_level_string(r0, False)}')
- if nuva_status == 0 or toa_status == 63:
- clear_password()
- else:
- print('Illegal checksum state - cannot have any nuva status without completed toa status')
- def clear_password():
- for idx in range(len(password_char_codes)):
- password_char_codes[idx] = 0
- def input_password(*args):
- init_password_char_codes(*args)
- init_checksum_storage()
- get_checksum_step_1()
- print(checksum_storage)
- print(password_char_codes)
- print("---")
- overwrite_password_char_codes()
- print(checksum_storage)
- print(password_char_codes)
- set_completed_levels()
- if __name__ == '__main__':
- # input_password('BBBBBB')
- # input_password('WWWWWW')
- # input_password('3QQQGC')
- input_password('J+B%%%')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement