diff --git a/.gitignore b/.gitignore index f8c5275..d7f4cd0 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/schemas/Manual.items.schema.json b/schemas/Manual.items.schema.json index 0298c05..97896af 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", "trap, useful", "trap, progression", "trap, 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/DataValidation.py b/src/DataValidation.py index d9c0970..06e4a99 100644 --- a/src/DataValidation.py +++ b/src/DataValidation.py @@ -1,3 +1,4 @@ +from functools import reduce import logging import re import json @@ -207,6 +208,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/__init__.py b/src/__init__.py index 4d51cd1..b427092 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,3 +1,4 @@ +from functools import reduce import logging import os from typing import Callable, Optional, ClassVar, Counter, Any @@ -269,7 +270,6 @@ def create_item(self, name: str, class_override: Optional['ItemClassification']= classification: ItemClassification = ItemClassification.filler if class_override is not None: classification = class_override - elif item.get("classification_count"): # This should only be run if create_item is called outside of create_items not_prog_classes: list[ItemClassification] = [] @@ -285,8 +285,10 @@ def create_item(self, name: str, class_override: Optional['ItemClassification']= classification |= self.random.choice(progression_classes) elif not_prog_classes: classification |= not_prog_classes[0] - else: + if item.get("classification"): + classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification.strip()] for str_classification in item["classification"].split(",")}) + if item.get("trap"): classification |= ItemClassification.trap diff --git a/src/data/items.json b/src/data/items.json index 06ebf7b..872b1d0 100644 --- a/src/data/items.json +++ b/src/data/items.json @@ -79,7 +79,7 @@ "Characters", "Right Side" ], - "progression": true, + "classification": "progression", "sort-key": "row-1-6" }, {