Files
dockipelago/worlds/gw2/items.py
Jonathan Tinney 7971961166
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
add schedule I, sonic 1/frontiers/heroes, spirit island
2026-04-02 23:46:36 -07:00

219 lines
7.4 KiB
Python

import enum
from BaseClasses import Item
from typing import Dict, Optional
from Utils import parse_yaml
from . import data
from importlib.resources import files
from .types import Profession, Race, Gw2ItemData, StorylineEnum, Spec
from .regions import map_data
from .storylines import storyline_from_str
class Gw2Item(Item):
game: str = "Guild Wars 2"
def create_item_data(name: str, quantity=1, storyline=None):
item = Gw2ItemData()
item.name = name
item.code = Gw2ItemData.next_id_val
item.quantity = quantity
item.specs = set()
item.race = None
item.storyline = storyline
Gw2ItemData.next_id_val += 1
item_data[item.code] = item
return item
def create_trait_data(name: str, tier: int, spec_name: str, quantity=1, storyline=None):
trait_data = create_item_data(name, quantity, storyline)
trait_data.tier = tier
trait_data.spec_name = spec_name
return trait_data
class TraitData(Gw2ItemData):
tier: int
spec_name: str
item_data: dict[int, Gw2ItemData] = {}
weapons_by_slot: dict[str, [Gw2ItemData]] = {}
item_groups: dict[str, [Gw2ItemData]] = {}
elite_specs: dict[str, StorylineEnum] = {}
core_specs: set[str] = set()
def load_weapons():
weapons_items = []
item_groups["Weapons"] = []
with files(data).joinpath("Weapons.yaml").open() as f:
weapons = parse_yaml(f.read())
for weapon_name in weapons:
weapon_slots = weapons[weapon_name]
for weapon_slot in weapon_slots:
professions = weapon_slots[weapon_slot]
specs = set()
for profession_data in professions:
elite_spec = None
profession = profession_data
if isinstance(profession_data, dict):
for profession_name in profession:
elite_spec = (profession_data[profession_name])
profession = profession_name
spec = Spec(profession=Profession[profession.upper()], elite_spec=elite_spec)
specs.add(spec)
item_name = weapon_slot + " " + weapon_name
weapon = create_item_data(item_name)
weapon.specs = specs
weapons_items.append(weapon)
item_groups["Weapons"].append(weapon)
if weapon_slot in weapons_by_slot.keys():
weapons_by_slot[weapon_slot].append(weapon)
else:
weapons_by_slot[weapon_slot] = [weapon]
return weapons_items
def load_skill_group(skills_data, spec: Optional[Spec] = None,
race: Optional[Race] = None,
storyline: Optional[StorylineEnum] = None):
skills = []
skill_types = ["Healing", "Utility", "Elite", "Legend"]
for skill_type in skill_types:
if skill_type not in skills_data.keys():
continue
if skill_type not in item_groups.keys():
item_groups[skill_type] = []
for skill_name in skills_data[skill_type]:
skill = create_item_data(name=skill_name + " " + skill_type + " Skill", quantity=1, storyline=storyline)
if spec is not None:
skill.specs.add(spec)
skill.race = race
skills.append(skill)
item_groups[skill_type].append(skill)
return skills
def load_skills():
skills = []
with files(data).joinpath("Skills.yaml").open() as f:
skill_data = parse_yaml(f.read())
for profession in Profession:
spec = Spec(profession)
skills.extend(load_skill_group(skill_data[profession.name]["Core"], spec=spec))
for group in skill_data[profession.name].keys():
if group in elite_specs:
spec = Spec(profession=profession, elite_spec=group)
skills.extend(
load_skill_group(skill_data[profession.name][group], spec=spec, storyline=elite_specs[group]))
for race in Race:
skills.extend(load_skill_group(skill_data[race.name], race=race))
return skills
def load_traits():
traits_items = []
item_groups["Traits"] = []
item_groups["Core Traits"] = []
item_groups["Elite Spec Traits"] = []
elite_specs.clear()
with files(data).joinpath("Traits.yaml").open() as f:
trait_data = parse_yaml(f.read())
for profession_name in trait_data:
profession_data = trait_data[profession_name]
for spec_name in profession_data:
spec_data = profession_data[spec_name]
storyline = None
if "storyline" in spec_data:
storyline = storyline_from_str(spec_data["storyline"])
elite_specs[spec_name] = storyline
else:
core_specs.add(spec_name)
traits = spec_data["traits"]
for index, trait in enumerate(traits):
item = create_trait_data(name=trait + " " + spec_name + " Trait",
tier=index // 3,
spec_name=spec_name,
storyline=storyline)
spec = Spec(Profession[profession_name.upper()])
item.specs.add(spec)
traits_items.append(item)
if storyline is None:
item_groups["Core Traits"].append(item)
else:
item_groups["Elite Spec Traits"].append(item)
# traits = profession_traits["Core"]
# traits.extend(profession_traits["Elite"])
# for trait in traits:
# storyline = storyline_from_str(trait)
# if storyline is not None:
# trait = profession_traits["Elite"][trait]
# elite_specs[trait] = storyline
# item = Gw2ItemData(name="Progressive " + trait + " Trait", quantity=9, storyline=storyline)
# spec = Spec(Profession[profession_name.upper()])
# item.specs.add(spec)
# traits_items.append(item)
# if trait in elite_specs:
# item_groups["Elite Spec Traits"].append(item)
# else:
# item_groups["Core Traits"].append(item)
item_groups["Traits"].extend(traits_items)
return traits_items
def load_gear():
armor_items = []
armor_slots = ["Head", "Shoulders", "Chest", "Gloves", "Legs", "Boots", "Back", "Ring 1", "Ring 2", "Amulet",
"Accessory 1", "Accessory 2", "Relic", "Aqua Breather"]
for slot in armor_slots:
item = create_item_data(slot)
armor_items.append(item)
item_groups["Gear"] = armor_items
return armor_items
def create_map_item_data():
map_items = []
for gw2_map in map_data.values():
item = create_item_data(gw2_map.name)
map_items.append(item)
gw2_map.item = item
item_groups["Maps"] = map_items
return map_items
item_table: Dict[str, Gw2ItemData] = {}
def load_items():
items = []
items.extend(load_weapons())
items.extend(load_traits())
items.extend(load_skills())
items.extend(load_gear())
items.extend(create_map_item_data())
items.append(create_item_data("Mist Fragment")) # Quantity will get set after options have been loaded
for item in items:
item_table[item.name] = item
load_items()