Noëlle Anthony 4 роки тому
джерело
коміт
dd4ab487bf
1 змінених файлів з 59 додано та 17 видалено
  1. 59
    17
      metroidgen.py

+ 59
- 17
metroidgen.py Переглянути файл

@@ -1,6 +1,6 @@
# This uses http://games.technoplaza.net/mpg/password.txt as a basis for its password algorithm

import random
import random, sys

class MetroidState:
def __init__(self):
@@ -104,6 +104,7 @@ class MetroidState:
self.startLocation = 0
self.bitfield = []
self.initializeBitfield()
self.fullbitfield = []

def initializeBitfield(self):
self.bitfield = []
@@ -312,8 +313,9 @@ class MetroidState:
sl = "Start Location: {}".format(self.locations[self.startLocation])
dr = "Unlocked Doors: {}".format(self.openedDoors())
ms = "Missiles: {}".format(self.missileCount)
bf = "Bitfield:\n{}".format(self.getBits())
return "\n".join([ic, mt, et, zb, kb, rs, sw, sl, dr, ms, bf])
pw = "Password: {}".format(self.password)
# bf = "Bitfield:\n{}".format(self.getBits())
return "\n".join([ic, mt, et, zb, kb, rs, sw, sl, dr, ms, pw])

def randomize(self):
# Items
@@ -672,43 +674,83 @@ class MetroidState:
# checking = []
# for i in range(16):
# checking.append(int("".join([str(x) for x in bitfield[i:i+8]]), 2))
decChecksum = sum(bitfield)
# print("Full Bitfield: {}".format("".join([str(x) for x in bitfield])))
self.fullbitfield = "".join([str(x) for x in bitfield])
newBitfield = []
for i in range(17):
j = i * 8
k = j + 8
word = self.fullbitfield[j:k][::-1]
newBitfield.append(word)
decChecksum = sum([int(x, 2) for x in newBitfield])
bitfield = "".join(newBitfield)
binChecksum = bin(decChecksum).replace('0b','')
checksum = binChecksum[-8:]
while len(checksum) < 8:
checksum = checksum + "0"
print(checksum)
checksum = "0" + checksum
# print(checksum)
for bit in checksum:
bitfield.append(int(bit))
print("Full Bitfield: {}".format("".join([str(x) for x in bitfield])))
print(len(bitfield))
bitfield += bit
# print("Real Bitfield: {}".format(bitfield))
letters = []
letter = []
for bit in bitfield:
letter.append(str(bit))
letter.append(bit)
if len(letter) == 6:
print(letter)
letters.append(self.alphabet[int("".join(letter),2)])
letter = []
print(letters)
words = []
word = []
print(letters)
print(len(letters))
for lt in letters:
word.append(lt)
if len(word) == 6:
words.append("".join(word))
word = []
words.append("".join(word))
return " ".join(words)
self.password = " ".join(words)
return self.password

def decodePassword(self, pwd):
densePwd = pwd.replace(" ","")
numPwd = []
for chr in densePwd:
numPwd.append(self.alphabet.index(chr))
bitPwd = [bin(x).replace("0b","") for x in numPwd]
longBitPwd = []
for word in bitPwd:
longword = word
while len(longword) < 6:
longword = "0" + longword
longBitPwd.append(longword)
# print(self.fullbitfield)
newBitfield = "".join(longBitPwd)
# print(newBitfield)
# print(newBitfield == self.fullbitfield)
# print(len(newBitfield[:136]))
# print(newBitfield[:136])
csm = sum([int(x) for x in newBitfield[:136]])
print(csm)
# print(bin(csm).replace("0b",""))
for i in range(len(newBitfield)):
print(newBitfield[i], end="")
if i%8 == 7:
print(" ", end="")
if i%64 == 63:
print()

def main():
gs = MetroidState()
gs.randomize()
gs.createBitfield()
pwd = gs.generatePassword()
print(gs.toString())
print(gs.generatePassword())
# print(pwd)
# gs.decodePassword(pwd)

if __name__ == "__main__":
main()
if len(sys.argv) == 2:
gs = MetroidState()
gs.decodePassword(sys.argv[1])
else:
main()

Завантаження…
Відмінити
Зберегти