A save state/password generator for the original Metroid.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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()