Archipelago/worlds/zillion/gen_data.py

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"])
)