42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
from dataclasses import dataclass
|
|
import json
|
|
|
|
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)
|
|
|
|
# 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"]
|
|
|
|
return GenData(
|
|
from_json["multi_items"],
|
|
ZzGame.from_jsonable(from_json["zz_game"]),
|
|
bytes(from_json["game_id"])
|
|
)
|