From 7a5acfeceb99c66a6e2f6933ef80f2ca42f0448b Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Sat, 9 May 2026 08:59:05 -0600 Subject: [PATCH] Core: Make manifest accessible as a world attribute (#6122) --- worlds/AutoWorld.py | 2 ++ worlds/__init__.py | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index ddc8ff2d2a..468706a347 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -353,6 +353,8 @@ class World(metaclass=AutoWorldRegister): """path it was loaded from""" world_version: ClassVar[Version] = Version(0, 0, 0) """Optional world version loaded from archipelago.json""" + manifest: ClassVar[dict[str, Any]] = {} + """Mapping of the world's archipelago.json manifest. Use game and world_version attrs instead for those values.""" def __init__(self, multiworld: "MultiWorld", player: int): assert multiworld is not None diff --git a/worlds/__init__.py b/worlds/__init__.py index 1907100688..8684b74249 100644 --- a/worlds/__init__.py +++ b/worlds/__init__.py @@ -11,7 +11,7 @@ import json from pathlib import Path from types import ModuleType from typing import List, Sequence -from zipfile import BadZipFile +from zipfile import ZipFile, BadZipFile from NetUtils import DataPackage from Utils import local_path, user_path, Version, version_tuple, tuplize_version, messagebox @@ -119,6 +119,7 @@ for world_source in world_sources: game = manifest.get("game") if game in AutoWorldRegister.world_types: AutoWorldRegister.world_types[game].world_version = tuplize_version(manifest.get("world_version", "0.0.0")) + AutoWorldRegister.world_types[game].manifest = manifest if apworlds: # encapsulation for namespace / gc purposes @@ -200,6 +201,15 @@ if apworlds: # world could fail to load at this point if apworld.world_version: AutoWorldRegister.world_types[apworld.game].world_version = apworld.world_version + + assert apworld.path + with ZipFile(apworld.path, "r") as zf: + manifest = apworld.read_contents(zf) + # version/compatible_version shouldn't be needed by world, makes it consistent with folder world + manifest.pop("version", None) + manifest.pop("compatible_version", None) + AutoWorldRegister.world_types[apworld.game].manifest = manifest + load_apworlds() del load_apworlds