| 
									
										
										
										
											2024-03-03 13:10:14 -08:00
										 |  |  | from dataclasses import dataclass | 
					
						
							|  |  |  | import json | 
					
						
							|  |  |  | from typing import Dict, Tuple | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from zilliandomizer.game import Game as ZzGame | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @dataclass | 
					
						
							|  |  |  | class GenData: | 
					
						
							|  |  |  |     """ data passed from generation to patcher """ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     multi_items: Dict[str, Tuple[str, str]] | 
					
						
							|  |  |  |     """ zz_loc_name to (item_name, player_name) """ | 
					
						
							|  |  |  |     zz_game: ZzGame | 
					
						
							|  |  |  |     game_id: bytes | 
					
						
							|  |  |  |     """ the byte string used to detect the rom """ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def to_json(self) -> str: | 
					
						
							|  |  |  |         """ serialized data from generation needed to patch rom """ | 
					
						
							|  |  |  |         jsonable = { | 
					
						
							|  |  |  |             "multi_items": self.multi_items, | 
					
						
							|  |  |  |             "zz_game": self.zz_game.to_jsonable(), | 
					
						
							|  |  |  |             "game_id": list(self.game_id) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return json.dumps(jsonable) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def from_json(gen_data_str: str) -> "GenData": | 
					
						
							|  |  |  |         """ the reverse of `to_json` """ | 
					
						
							|  |  |  |         from_json = json.loads(gen_data_str) | 
					
						
							| 
									
										
										
										
											2024-07-10 23:11:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # backwards compatibility for seeds generated before new map_gen options | 
					
						
							|  |  |  |         room_gen = from_json["zz_game"]["options"].get("room_gen", None) | 
					
						
							|  |  |  |         if room_gen is not None: | 
					
						
							|  |  |  |             from_json["zz_game"]["options"]["map_gen"] = {False: "none", True: "rooms"}.get(room_gen, "none") | 
					
						
							|  |  |  |             del from_json["zz_game"]["options"]["room_gen"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-03 13:10:14 -08:00
										 |  |  |         return GenData( | 
					
						
							|  |  |  |             from_json["multi_items"], | 
					
						
							|  |  |  |             ZzGame.from_jsonable(from_json["zz_game"]), | 
					
						
							|  |  |  |             bytes(from_json["game_id"]) | 
					
						
							|  |  |  |         ) |