From 578515acd1d4e048268de33d7b1f599fe14f2be2 Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Wed, 16 Oct 2024 14:35:14 +1100 Subject: [PATCH 1/7] Classification field, as an alternative to boolean fields for each --- src/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/__init__.py b/src/__init__.py index f7b4c6b7..03b3d82e 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -221,6 +221,9 @@ def create_item(self, name: str) -> Item: if "progression_skip_balancing" in item and item["progression_skip_balancing"]: classification = ItemClassification.progression_skip_balancing + if "classification" in item: + classification = ItemClassification[item["classification"]] + item_object = ManualItem(name, classification, self.item_name_to_id[name], player=self.player) From 79293afe8d17b26a78d973a47a4c78ddf32b25be Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Tue, 10 Dec 2024 11:59:41 +1100 Subject: [PATCH 2/7] Update schema to include classification field --- schemas/Manual.items.schema.json | 6 ++++++ src/__init__.py | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/schemas/Manual.items.schema.json b/schemas/Manual.items.schema.json index 999f57a1..fe4eed70 100644 --- a/schemas/Manual.items.schema.json +++ b/schemas/Manual.items.schema.json @@ -54,6 +54,12 @@ } } }, + "classification": { + "description": "(Optional) The classification of this item.", + "type": "string", + "enum": ["filler", "trap", "useful", "progression", "progression_skip_balancing"], + "default": "filler" + }, "progression": { "description": "(Optional) Is this item needed to unlock locations? For more information on item classifications, see: https://github.com/ArchipelagoMW/Archipelago/blob/main/docs/world%20api.md#items", "type": "boolean", diff --git a/src/__init__.py b/src/__init__.py index 6481b16a..265a5309 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -214,6 +214,9 @@ def create_item(self, name: str) -> Item: item = self.item_name_to_item[name] classification = ItemClassification.filler + if "classification" in item and item["classification"]: + classification |= ItemClassification[item["classification"]] + if "trap" in item and item["trap"]: classification |= ItemClassification.trap @@ -225,9 +228,6 @@ def create_item(self, name: str) -> Item: elif "progression" in item and item["progression"]: classification |= ItemClassification.progression - if "classification" in item: - classification = ItemClassification[item["classification"]] - item_object = ManualItem(name, classification, self.item_name_to_id[name], player=self.player) From 1f7b980200df84265ffb11b8f1420978e55bc7d4 Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Thu, 16 Oct 2025 08:57:27 +1100 Subject: [PATCH 3/7] Allow multiple values in the "classification" field --- .gitignore | 3 ++- src/__init__.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index f52c87f6..671f0a20 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .vscode/ .vs/ /*.code-workspace -.idea \ No newline at end of file +.idea +.venv/ diff --git a/src/__init__.py b/src/__init__.py index 265a5309..402092ed 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,4 +1,5 @@ from base64 import b64encode +from functools import reduce import logging import os import json @@ -215,7 +216,7 @@ def create_item(self, name: str) -> Item: classification = ItemClassification.filler if "classification" in item and item["classification"]: - classification |= ItemClassification[item["classification"]] + classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification] for str_classification in item["classification"].split(",")}) if "trap" in item and item["trap"]: classification |= ItemClassification.trap From 65d221a54bdea38016c85e647cd36e6336e01b0b Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Thu, 16 Oct 2025 09:02:12 +1100 Subject: [PATCH 4/7] Add relevant combinations to schema --- schemas/Manual.items.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/Manual.items.schema.json b/schemas/Manual.items.schema.json index 1b15b1b6..9d8f2736 100644 --- a/schemas/Manual.items.schema.json +++ b/schemas/Manual.items.schema.json @@ -57,7 +57,7 @@ "classification": { "description": "(Optional) The classification of this item.", "type": "string", - "enum": ["filler", "trap", "useful", "progression", "progression_skip_balancing"], + "enum": ["filler", "trap", "useful", "progression", "progression_skip_balancing", "trap,useful", "trap,progression", "trap,progression_skip_balancing"], "default": "filler" }, "progression": { From 8b80a40f6dfa3fe4d93375550a672e2277431195 Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Sat, 6 Dec 2025 20:00:22 +1100 Subject: [PATCH 5/7] Trim whitespace, and update schema to use whitespace --- schemas/Manual.items.schema.json | 2 +- src/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/schemas/Manual.items.schema.json b/schemas/Manual.items.schema.json index a4f72a06..97896af6 100644 --- a/schemas/Manual.items.schema.json +++ b/schemas/Manual.items.schema.json @@ -57,7 +57,7 @@ "classification": { "description": "(Optional) The classification of this item.", "type": "string", - "enum": ["filler", "trap", "useful", "progression", "progression_skip_balancing", "trap,useful", "trap,progression", "trap,progression_skip_balancing"], + "enum": ["filler", "trap", "useful", "progression", "progression, skip_balancing", "trap, useful", "trap, progression", "trap, progression, skip_balancing"], "default": "filler" }, "progression": { diff --git a/src/__init__.py b/src/__init__.py index 3106b4ca..2e49b1de 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -284,7 +284,7 @@ def create_item(self, name: str, class_override: Optional['ItemClassification']= classification = ItemClassification.filler if "classification" in item and item["classification"]: - classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification] for str_classification in item["classification"].split(",")}) + classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification.strip()] for str_classification in item["classification"].split(",")}) if "trap" in item and item["trap"]: classification |= ItemClassification.trap From 2d1587f5573d0b77d1e32a87e74a5901fb8cba47 Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Fri, 2 Jan 2026 15:52:36 +1100 Subject: [PATCH 6/7] Fix indentation for new code --- src/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/__init__.py b/src/__init__.py index 2e49b1de..30c8180d 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -283,8 +283,8 @@ def create_item(self, name: str, class_override: Optional['ItemClassification']= else: classification = ItemClassification.filler - if "classification" in item and item["classification"]: - classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification.strip()] for str_classification in item["classification"].split(",")}) + if "classification" in item and item["classification"]: + classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification.strip()] for str_classification in item["classification"].split(",")}) if "trap" in item and item["trap"]: classification |= ItemClassification.trap From a345562e2c510d19639bb1ce97966dbe01045325 Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Mon, 19 Jan 2026 14:24:04 +1100 Subject: [PATCH 7/7] Adjust DataValidation test to allow for new field --- src/DataValidation.py | 8 ++++++++ src/data/items.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/DataValidation.py b/src/DataValidation.py index 3782c7fc..8fb85048 100644 --- a/src/DataValidation.py +++ b/src/DataValidation.py @@ -1,3 +1,4 @@ +from functools import reduce import logging import re import json @@ -217,6 +218,13 @@ def checkItemsThatShouldBeRequired(): # progression_skip_balancing is also progression, so no check needed if item.get("progression_skip_balancing"): continue + + # if the string classification contains progresion then no check needed + if item.get("classification"): + classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification.strip()] for str_classification in item["classification"].split(",")}) + if ItemClassification.progression in classification: + continue + # if any of the advanced type is already progression then no check needed if item.get("classification_count"): has_progression = False diff --git a/src/data/items.json b/src/data/items.json index 681e3ae4..97bc46dc 100644 --- a/src/data/items.json +++ b/src/data/items.json @@ -74,7 +74,7 @@ "Characters", "Right Side" ], - "progression": true, + "classification": "progression", "sort-key": "row-1-6" }, {