Archipelago/worlds/yugioh06/fusions.py

73 lines
2.3 KiB
Python

from typing import List, NamedTuple
class FusionData(NamedTuple):
name: str
materials: List[str]
replaceable: bool
additional_spells: List[str]
fusions = {
"Elemental Hero Flame Wingman": FusionData(
"Elemental Hero Flame Wingman",
["Elemental Hero Avian", "Elemental Hero Burstinatrix"],
True,
["Miracle Fusion"]),
"Elemental Hero Madballman": FusionData(
"Elemental Hero Madballman",
["Elemental Hero Bubbleman", "Elemental Hero Clayman"],
True,
["Miracle Fusion"]),
"Elemental Hero Rampart Blaster": FusionData(
"Elemental Hero Rampart Blaster",
["Elemental Hero Burstinatrix", "Elemental Hero Clayman"],
True,
["Miracle Fusion"]),
"Elemental Hero Shining Flare Wingman": FusionData(
"Elemental Hero Shining Flare Wingman",
["Elemental Hero Flame Wingman", "Elemental Hero Sparkman"],
True,
["Miracle Fusion"]),
"Elemental Hero Steam Healer": FusionData(
"Elemental Hero Steam Healer",
["Elemental Hero Burstinatrix", "Elemental Hero Bubbleman"],
True,
["Miracle Fusion"]),
"Elemental Hero Wildedge": FusionData(
"Elemental Hero Wildedge",
["Elemental Hero Wildheart", "Elemental Hero Bladedge"],
True,
["Miracle Fusion"])
}
fusion_subs = ["The Dark - Hex-Sealed Fusion",
"The Earth - Hex-Sealed Fusion",
"The Light - Hex-Sealed Fusion",
"Goddess with the Third Eye",
"King of the Swamp",
"Versago the Destroyer",
# Only in All-packs
"Beastking of the Swamps",
"Mystical Sheep #1"]
def has_all_materials(state, monster, player):
data = fusions.get(monster)
if not state.has(monster, player):
return False
if data is None:
return True
else:
materials = data.replaceable and state.has_any(fusion_subs, player)
for material in data.materials:
materials += has_all_materials(state, material, player)
return materials >= len(data.materials)
def count_has_materials(state, monsters, player):
amount = 0
for monster in monsters:
amount += has_all_materials(state, monster, player)
return amount