A save state/password generator for the original Metroid.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

metroidgen.py 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. # This uses http://games.technoplaza.net/mpg/password.txt as a basis for its password algorithm
  2. import random
  3. class MetroidState:
  4. def __init__(self):
  5. self.alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz?-"
  6. self.itemsCollected = {
  7. "Maru Mari": False,
  8. "Bombs": False,
  9. "Long Beam": False,
  10. "Ice Beam": False,
  11. "Wave Beam": False,
  12. "High Jump Boots": False,
  13. "Varia": False,
  14. "Screw Attack": False
  15. }
  16. self.samusHas = {
  17. "Maru Mari": False,
  18. "Bombs": False,
  19. "Long Beam": False,
  20. "Ice Beam": False,
  21. "Wave Beam": False,
  22. "High Jump Boots": False,
  23. "Varia": False,
  24. "Screw Attack": False
  25. }
  26. self.missileTanks = {
  27. 1: False,
  28. 2: False,
  29. 3: False,
  30. 4: False,
  31. 5: False,
  32. 6: False,
  33. 7: False,
  34. 8: False,
  35. 9: False,
  36. 10: False,
  37. 11: False,
  38. 12: False,
  39. 13: False,
  40. 14: False,
  41. 15: False,
  42. 16: False,
  43. 17: False,
  44. 18: False,
  45. 19: False,
  46. 20: False,
  47. 21: False
  48. }
  49. self.energyTanks = {
  50. 1: False,
  51. 2: False,
  52. 3: False,
  53. 4: False,
  54. 5: False,
  55. 6: False,
  56. 7: False,
  57. 8: False
  58. }
  59. self.zebetitesDestroyed = {
  60. 1: False,
  61. 2: False,
  62. 3: False,
  63. 4: False,
  64. 5: False
  65. }
  66. self.doors = {
  67. "Brinstar": {
  68. 1: False,
  69. 2: False,
  70. 3: False,
  71. 4: False,
  72. 5: False
  73. }, "Norfair": {
  74. 1: False,
  75. 2: False,
  76. 3: False,
  77. 4: False
  78. }, "Kraid": {
  79. 1: False,
  80. 2: False,
  81. 3: False,
  82. 4: False,
  83. 5: False
  84. }, "Ridley": {
  85. 1: False,
  86. 2: False
  87. }, "Tourian": {
  88. 1: False,
  89. 2: False,
  90. 3: False
  91. }
  92. }
  93. self.kraidKilled = False
  94. self.ridleyKilled = False
  95. self.motherBrainKilled = False
  96. self.kraidStatue = False
  97. self.ridleyStatue = False
  98. self.swimsuit = False
  99. self.missileCount = 0
  100. self.gameAge = 0
  101. self.locations = ["Brinstar", "Norfair", "Kraid's Lair", "Ridley's Lair", "Tourian"]
  102. self.startLocation = 0
  103. self.bitfield = []
  104. for _ in range(128):
  105. self.bitfield.append(0)
  106. def toggleItem(self, itm):
  107. if itm in self.itemsCollected.keys():
  108. self.itemsCollected[itm] = not self.itemsCollected[itm]
  109. self.samusHas[itm] = not self.samusHas[itm]
  110. else:
  111. print("Couldn't find item: {}".format(str(itm)))
  112. def toggleMissileTank(self, num):
  113. try:
  114. num = int(num)
  115. except:
  116. print("{} is not a number".format(num))
  117. return
  118. if num in self.missileTanks.keys():
  119. self.missileTanks[num] = not self.missileTanks[num]
  120. else:
  121. print("Couldn't find missile tank: {}".format(num))
  122. def toggleEnergyTank(self, num):
  123. try:
  124. num = int(num)
  125. except:
  126. print("{} is not a number".format(num))
  127. return
  128. if num in self.energyTanks.keys():
  129. self.energyTanks[num] = not self.energyTanks[num]
  130. else:
  131. print("Couldn't find energy tank: {}".format(num))
  132. def toggleZebetite(self, num):
  133. try:
  134. num = int(num)
  135. except:
  136. print("{} is not a number".format(num))
  137. return
  138. if num in self.zebetitesDestroyed.keys():
  139. self.zebetitesDestroyed[num] = not self.zebetitesDestroyed[num]
  140. else:
  141. print("Couldn't find Zebetite: {}".format(num))
  142. def toggleKraid(self):
  143. self.kraidKilled = not self.kraidKilled
  144. self.kraidStatue = self.kraidKilled
  145. def toggleKraidStatue(self):
  146. self.kraidStatue = not self.kraidStatue
  147. if self.kraidKilled and not self.kraidStatue:
  148. print("WARNING: Kraid has been killed but his statue has not been raised.")
  149. def toggleRidley(self):
  150. self.ridleyKilled = not self.ridleyKilled
  151. self.ridleyStatue = self.ridleyKilled
  152. def toggleRidleyStatue(self):
  153. self.ridleyStatue = not self.ridleyStatue
  154. if self.ridleyKilled and not self.ridleyStatue:
  155. print("WARNING: Ridley has been killed but his statue has not been raised.")
  156. def toggleMotherBrain(self):
  157. self.motherBrainKilled = not self.motherBrainKilled
  158. def toggleDoor(self, area, door):
  159. try:
  160. area = str(area)
  161. door = int(door)
  162. except:
  163. print("Area must be string, door must be a positive integer")
  164. return
  165. if area in self.doors.keys() and int(door) in self.doors[area].keys():
  166. self.doors[area][door] = not self.doors[area][door]
  167. else:
  168. print("Couldn't find door {} in area {}".format(door, area))
  169. def toggleSwimsuit(self):
  170. self.swimsuit = not self.swimsuit
  171. def newLocation(self, loc):
  172. try:
  173. loc = str(loc)
  174. except:
  175. print("Location must be a string")
  176. return
  177. if loc in self.locations:
  178. self.startLocation = self.locations.index(loc)
  179. else:
  180. print("Couldn't find location: {}".format(loc))
  181. def collectedItems(self):
  182. o = []
  183. for k,v in self.itemsCollected.items():
  184. if v == True:
  185. o.append(k)
  186. if len(o) == 0:
  187. return "None"
  188. else:
  189. return ", ".join(o)
  190. def collectedMissiles(self):
  191. o = []
  192. for k, v in self.missileTanks.items():
  193. if v == True:
  194. o.append(k)
  195. if len(o) == 0:
  196. return "None"
  197. else:
  198. return ", ".join([str(b) for b in o])
  199. def collectedEtanks(self):
  200. o = []
  201. for k, v in self.energyTanks.items():
  202. if v == True:
  203. o.append(k)
  204. if len(o) == 0:
  205. return "None"
  206. else:
  207. return ", ".join([str(b) for b in o])
  208. def killedZebetites(self):
  209. o = []
  210. for k, v in self.zebetitesDestroyed.items():
  211. if v == True:
  212. o.append(k)
  213. if len(o) == 0:
  214. return "None"
  215. else:
  216. return ", ".join([str(b) for b in o])
  217. def killedBosses(self):
  218. o = []
  219. if self.kraidKilled:
  220. o.append("Kraid")
  221. if self.ridleyKilled:
  222. o.append("Ridley")
  223. if self.motherBrainKilled:
  224. o.append("Mother Brain")
  225. if len(o) == 0:
  226. return "None"
  227. else:
  228. return ", ".join(o)
  229. def raisedStatues(self):
  230. o = []
  231. if self.kraidStatue:
  232. o.append("Kraid")
  233. if self.ridleyStatue:
  234. o.append("Ridley")
  235. if len(o) == 0:
  236. return "None"
  237. else:
  238. return ", ".join(o)
  239. def inBailey(self):
  240. if self.swimsuit:
  241. return "Yes"
  242. else:
  243. return "No"
  244. def openedDoors(self):
  245. d = {"Brinstar": 0, "Norfair": 0, "Kraid": 0, "Ridley": 0, "Tourian": 0}
  246. o = []
  247. for k,v in self.doors["Brinstar"].items():
  248. if v == True:
  249. d["Brinstar"] = d["Brinstar"] + 1
  250. for k,v in self.doors["Norfair"].items():
  251. if v == True:
  252. d["Norfair"] = d["Norfair"] + 1
  253. for k,v in self.doors["Kraid"].items():
  254. if v == True:
  255. d["Kraid"] = d["Kraid"] + 1
  256. for k,v in self.doors["Ridley"].items():
  257. if v == True:
  258. d["Ridley"] = d["Ridley"] + 1
  259. for k,v in self.doors["Tourian"].items():
  260. if v == True:
  261. d["Tourian"] = d["Tourian"] + 1
  262. for k, v in d.items():
  263. o.append("{} {}".format(k, v))
  264. return ", ".join(o)
  265. def getBits(self):
  266. o = []
  267. word = []
  268. for i in range(128):
  269. word.append(str(self.bitfield[i]))
  270. if len(word) == 8:
  271. o.append("".join(word))
  272. word = []
  273. o1 = " ".join(o[:8])
  274. o2 = " ".join(o[8:])
  275. return o1 + "\n" + o2
  276. def toString(self):
  277. ic = "Items Collected: {}".format(self.collectedItems())
  278. mt = "Missile Tanks Collected: {}".format(self.collectedMissiles())
  279. et = "Energy Tanks Collected: {}".format(self.collectedEtanks())
  280. zb = "Zebetites Killed: {}".format(self.killedZebetites())
  281. kb = "Bosses Killed: {}".format(self.killedBosses())
  282. rs = "Statues Raised: {}".format(self.raisedStatues())
  283. sw = "Swimsuit?: {}".format(self.inBailey())
  284. sl = "Start Location: {}".format(self.locations[self.startLocation])
  285. dr = "Unlocked Doors: {}".format(self.openedDoors())
  286. ms = "Missiles: {}".format(self.missileCount)
  287. bf = "Bitfield:\n{}".format(self.getBits())
  288. return "\n".join([ic, mt, et, zb, kb, rs, sw, sl, dr, ms, bf])
  289. def randomize(self):
  290. # Items
  291. if random.randint(0,1) == 1:
  292. self.toggleItem("Maru Mari")
  293. if random.randint(0,1) == 1:
  294. self.toggleItem("Bombs")
  295. if random.randint(0,1) == 1:
  296. self.toggleItem("Varia")
  297. if random.randint(0,1) == 1:
  298. self.toggleItem("High Jump Boots")
  299. if random.randint(0,1) == 1:
  300. self.toggleItem("Screw Attack")
  301. if random.randint(0,1) == 1:
  302. self.toggleItem("Long Beam")
  303. beam = random.randint(0,2)
  304. if beam == 1:
  305. self.toggleItem("Ice Beam")
  306. elif beam == 2:
  307. self.toggleItem("Wave Beam")
  308. # Missile Tanks
  309. for i in range(21):
  310. if random.randint(0,1) == 1:
  311. self.toggleMissileTank(i+1)
  312. # Energy Tanks
  313. for i in range(8):
  314. if random.randint(0,1) == 1:
  315. self.toggleEnergyTank(i+1)
  316. # Zebetites
  317. for i in range(5):
  318. if random.randint(0,1) == 1:
  319. self.toggleZebetite(i+1)
  320. # Bosses killed
  321. if random.randint(0,1) == 1:
  322. self.toggleKraid()
  323. if random.randint(0,1) == 1:
  324. self.toggleRidley()
  325. if random.randint(0,1) == 1:
  326. self.toggleMotherBrain()
  327. # Statues raised
  328. if not self.kraidKilled and random.randint(0,1) == 1:
  329. self.toggleKraidStatue()
  330. if not self.ridleyKilled and random.randint(0,1) == 1:
  331. self.toggleRidleyStatue()
  332. # Doors
  333. # Brinstar 5, Norfair 4, Kraid 5, Ridley 2, Tourian 3
  334. for i in range(5):
  335. if random.randint(0,1) == 1:
  336. self.doors["Brinstar"][i+1] = True
  337. for i in range(4):
  338. if random.randint(0,1) == 1:
  339. self.doors["Norfair"][i+1] = True
  340. for i in range(5):
  341. if random.randint(0,1) == 1:
  342. self.doors["Kraid"][i+1] = True
  343. for i in range(2):
  344. if random.randint(0,1) == 1:
  345. self.doors["Ridley"][i+1] = True
  346. for i in range(3):
  347. if random.randint(0,1) == 1:
  348. self.doors["Tourian"][i+1] = True
  349. # Swimsuit
  350. if random.randint(0,2) == 2:
  351. self.toggleSwimsuit()
  352. # Start Location
  353. self.startLocation = random.randint(0,4)
  354. self.missileCount = random.randint(0,255)
  355. self.createBitfield()
  356. def createBitfield(self):
  357. # Doing this in order, which is dumb and tedious but accurate.
  358. if self.itemsCollected["Maru Mari"]:
  359. self.bitfield[0] = 1
  360. if self.missileTanks[1]:
  361. self.bitfield[1] = 1
  362. if self.doors["Brinstar"][1]:
  363. self.bitfield[2] = 1
  364. if self.doors["Brinstar"][2]:
  365. self.bitfield[3] = 1
  366. if self.energyTanks[1]:
  367. self.bitfield[4] = 1
  368. if self.doors["Brinstar"][3]:
  369. self.bitfield[5] = 1
  370. if self.itemsCollected["Bombs"]:
  371. self.bitfield[6] = 1
  372. if self.doors["Brinstar"][4]:
  373. self.bitfield[7] = 1
  374. if self.missileTanks[2]:
  375. self.bitfield[8] = 1
  376. if self.energyTanks[2]:
  377. self.bitfield[9] = 1
  378. if self.doors["Brinstar"][5]:
  379. self.bitfield[10] = 1
  380. if self.itemsCollected["Varia"]:
  381. self.bitfield[11] = 1
  382. if self.energyTanks[3]:
  383. self.bitfield[12] = 1
  384. if self.missileTanks[3]:
  385. self.bitfield[13] = 1
  386. if self.missileTanks[4]:
  387. self.bitfield[14] = 1
  388. if self.doors["Norfair"][1]:
  389. self.bitfield[15] = 1
  390. if self.missileTanks[5]:
  391. self.bitfield[16] = 1
  392. if self.missileTanks[6]:
  393. self.bitfield[17] = 1
  394. if self.missileTanks[7]:
  395. self.bitfield[18] = 1
  396. if self.missileTanks[8]:
  397. self.bitfield[19] = 1
  398. if self.missileTanks[9]:
  399. self.bitfield[20] = 1
  400. if self.missileTanks[10]:
  401. self.bitfield[21] = 1
  402. if self.missileTanks[11]:
  403. self.bitfield[22] = 1
  404. if self.doors["Norfair"][2]:
  405. self.bitfield[23] = 1
  406. if self.itemsCollected["High Jump Boots"]:
  407. self.bitfield[24] = 1
  408. if self.doors["Norfair"][3]:
  409. self.bitfield[25] = 1
  410. if self.itemsCollected["Screw Attack"]:
  411. self.bitfield[26] = 1
  412. if self.missileTanks[12]:
  413. self.bitfield[27] = 1
  414. if self.missileTanks[13]:
  415. self.bitfield[28] = 1
  416. if self.doors["Norfair"][4]:
  417. self.bitfield[29] = 1
  418. if self.energyTanks[4]:
  419. self.bitfield[30] = 1
  420. if self.missileTanks[14]:
  421. self.bitfield[31] = 1
  422. if self.doors["Kraid"][1]:
  423. self.bitfield[32] = 1
  424. if self.missileTanks[15]:
  425. self.bitfield[33] = 1
  426. if self.missileTanks[16]:
  427. self.bitfield[34] = 1
  428. if self.doors["Kraid"][2]:
  429. self.bitfield[35] = 1
  430. if self.energyTanks[5]:
  431. self.bitfield[36] = 1
  432. if self.doors["Kraid"][3]:
  433. self.bitfield[37] = 1
  434. if self.doors["Kraid"][4]:
  435. self.bitfield[38] = 1
  436. if self.missileTanks[17]:
  437. self.bitfield[39] = 1
  438. if self.missileTanks[18]:
  439. self.bitfield[40] = 1
  440. if self.doors["Kraid"][5]:
  441. self.bitfield[41] = 1
  442. if self.energyTanks[6]:
  443. self.bitfield[42] = 1
  444. if self.missileTanks[19]:
  445. self.bitfield[43] = 1
  446. if self.doors["Ridley"][1]:
  447. self.bitfield[44] = 1
  448. if self.energyTanks[7]:
  449. self.bitfield[45] = 1
  450. if self.missileTanks[20]:
  451. self.bitfield[46] = 1
  452. if self.doors["Ridley"][2]:
  453. self.bitfield[47] = 1
  454. if self.energyTanks[8]:
  455. self.bitfield[48] = 1
  456. if self.missileTanks[21]:
  457. self.bitfield[49] = 1
  458. if self.doors["Tourian"][1]:
  459. self.bitfield[50] = 1
  460. if self.doors["Tourian"][2]:
  461. self.bitfield[51] = 1
  462. if self.doors["Tourian"][3]:
  463. self.bitfield[52] = 1
  464. if self.zebetitesDestroyed[1]:
  465. self.bitfield[53] = 1
  466. if self.zebetitesDestroyed[2]:
  467. self.bitfield[54] = 1
  468. if self.zebetitesDestroyed[3]:
  469. self.bitfield[55] = 1
  470. if self.zebetitesDestroyed[4]:
  471. self.bitfield[56] = 1
  472. if self.zebetitesDestroyed[5]:
  473. self.bitfield[57] = 1
  474. if self.motherBrainKilled:
  475. self.bitfield[58] = 1
  476. # 59-63 unknown
  477. # if self.:
  478. # self.bitfield[59] = 1
  479. # if self.:
  480. # self.bitfield[60] = 1
  481. # if self.:
  482. # self.bitfield[61] = 1
  483. # if self.:
  484. # self.bitfield[62] = 1
  485. # if self.:
  486. # self.bitfield[63] = 1
  487. # not 64, 65, or 66 = Brinstar
  488. # 64 = Norfair
  489. # 65 and not 66 = Kraid's Lair
  490. # 66 and not 65 = Ridley's Lair
  491. # 65 and 66 = Tourian
  492. if self.startLocation == 1:
  493. self.bitfield[64] = 1
  494. if self.startLocation == 2 or self.startLocation == 4:
  495. self.bitfield[65] = 1
  496. if self.startLocation == 3 or self.startLocation == 4:
  497. self.bitfield[66] = 1
  498. # 67 is the reset bit, I want all passwords to be valid
  499. # if self.:
  500. # self.bitfield[67] = 1
  501. # 68-70 are unknown
  502. # if self.:
  503. # self.bitfield[68] = 1
  504. # if self.:
  505. # self.bitfield[69] = 1
  506. # if self.:
  507. # self.bitfield[70] = 1
  508. if self.swimsuit:
  509. self.bitfield[71] = 1
  510. if self.samusHas["Bombs"]:
  511. self.bitfield[72] = 1
  512. if self.samusHas["High Jump Boots"]:
  513. self.bitfield[73] = 1
  514. if self.samusHas["Long Beam"]:
  515. self.bitfield[74] = 1
  516. if self.samusHas["Screw Attack"]:
  517. self.bitfield[75] = 1
  518. if self.samusHas["Maru Mari"]:
  519. self.bitfield[76] = 1
  520. if self.samusHas["Varia"]:
  521. self.bitfield[77] = 1
  522. if self.samusHas["Wave Beam"]:
  523. self.bitfield[78] = 1
  524. if self.samusHas["Ice Beam"]:
  525. self.bitfield[79] = 1
  526. # Missile count
  527. # +2^n from 0 to 7
  528. binMissiles = bin(self.missileCount).replace('0b','')[::-1]
  529. while len(binMissiles) < 8:
  530. binMissiles += "0"
  531. if int(binMissiles[0]) == 1:
  532. self.bitfield[80] = 1
  533. if int(binMissiles[1]) == 1:
  534. self.bitfield[81] = 1
  535. if int(binMissiles[2]) == 1:
  536. self.bitfield[82] = 1
  537. if int(binMissiles[3]) == 1:
  538. self.bitfield[83] = 1
  539. if int(binMissiles[4]) == 1:
  540. self.bitfield[84] = 1
  541. if int(binMissiles[5]) == 1:
  542. self.bitfield[85] = 1
  543. if int(binMissiles[6]) == 1:
  544. self.bitfield[86] = 1
  545. if int(binMissiles[7]) == 1:
  546. self.bitfield[87] = 1
  547. # 88-119 are game age, leaving at 0
  548. # if self.:
  549. # self.bitfield[88] = 1
  550. # if self.:
  551. # self.bitfield[89] = 1
  552. # if self.:
  553. # self.bitfield[90] = 1
  554. # if self.:
  555. # self.bitfield[91] = 1
  556. # if self.:
  557. # self.bitfield[92] = 1
  558. # if self.:
  559. # self.bitfield[93] = 1
  560. # if self.:
  561. # self.bitfield[94] = 1
  562. # if self.:
  563. # self.bitfield[95] = 1
  564. # if self.:
  565. # self.bitfield[96] = 1
  566. # if self.:
  567. # self.bitfield[97] = 1
  568. # if self.:
  569. # self.bitfield[98] = 1
  570. # if self.:
  571. # self.bitfield[99] = 1
  572. # if self.:
  573. # self.bitfield[100] = 1
  574. # if self.:
  575. # self.bitfield[101] = 1
  576. # if self.:
  577. # self.bitfield[102] = 1
  578. # if self.:
  579. # self.bitfield[103] = 1
  580. # if self.:
  581. # self.bitfield[104] = 1
  582. # if self.:
  583. # self.bitfield[105] = 1
  584. # if self.:
  585. # self.bitfield[106] = 1
  586. # if self.:
  587. # self.bitfield[107] = 1
  588. # if self.:
  589. # self.bitfield[108] = 1
  590. # if self.:
  591. # self.bitfield[109] = 1
  592. # if self.:
  593. # self.bitfield[110] = 1
  594. # if self.:
  595. # self.bitfield[111] = 1
  596. # if self.:
  597. # self.bitfield[112] = 1
  598. # if self.:
  599. # self.bitfield[113] = 1
  600. # if self.:
  601. # self.bitfield[114] = 1
  602. # if self.:
  603. # self.bitfield[115] = 1
  604. # if self.:
  605. # self.bitfield[116] = 1
  606. # if self.:
  607. # self.bitfield[117] = 1
  608. # if self.:
  609. # self.bitfield[118] = 1
  610. # if self.:
  611. # self.bitfield[119] = 1
  612. # 120-123 are unknown
  613. # if self.:
  614. # self.bitfield[120] = 1
  615. # if self.:
  616. # self.bitfield[121] = 1
  617. # if self.:
  618. # self.bitfield[122] = 1
  619. # if self.:
  620. # self.bitfield[123] = 1
  621. if self.ridleyKilled:
  622. self.bitfield[124] = 1
  623. if self.ridleyStatue:
  624. self.bitfield[125] = 1
  625. if self.kraidKilled:
  626. self.bitfield[126] = 1
  627. if self.kraidStatue:
  628. self.bitfield[127] = 1
  629. def generatePassword(self):
  630. # not gonna do the bit-shifting yet
  631. # shiftbit = random.randint(0,7)
  632. bitfield = self.bitfield
  633. # for _ in range(shiftbit):
  634. # [bitfield[127]] + bitfield[:127]
  635. # binShift = bin(shiftbit).replace('0b','')
  636. # while len(binShift) < 8:
  637. # binShift = "0" + binShift
  638. # for bit in binShift:
  639. # bitfield.append(int(bit))
  640. bitfield = bitfield + [0,0,0,0,0,0,0,0]
  641. checking = []
  642. for i in range(16):
  643. checking.append(int("".join([str(x) for x in bitfield[i:i+8]]), 2))
  644. decChecksum = sum(checking)
  645. print(decChecksum)
  646. binChecksum = bin(decChecksum).replace('0b','')
  647. print(binChecksum)
  648. checksum = binChecksum[-8:]
  649. while len(checksum) < 8:
  650. checksum = checksum + "0"
  651. print(checksum)
  652. for bit in checksum:
  653. bitfield.append(int(bit))
  654. print("Full Bitfield: {}".format("".join([str(x) for x in bitfield])))
  655. print(len(bitfield))
  656. letters = []
  657. letter = []
  658. for bit in bitfield:
  659. letter.append(str(bit))
  660. if len(letter) == 6:
  661. print(letter)
  662. letters.append(self.alphabet[int("".join(letter),2)])
  663. letter = []
  664. print(letters)
  665. words = []
  666. word = []
  667. print(letters)
  668. print(len(letters))
  669. for lt in letters:
  670. word.append(lt)
  671. if len(word) == 6:
  672. words.append("".join(word))
  673. word = []
  674. words.append("".join(word))
  675. return " ".join(words)
  676. def main():
  677. gs = MetroidState()
  678. gs.randomize()
  679. gs.createBitfield()
  680. print(gs.toString())
  681. print(gs.generatePassword())
  682. if __name__ == "__main__":
  683. main()