Files
dockipelago/worlds/spyro2/Locations.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

683 lines
47 KiB
Python

from enum import IntEnum
from typing import Optional, NamedTuple, Dict
from BaseClasses import Location, Region
from .Items import Spyro2Item
class Spyro2LocationCategory(IntEnum):
TALISMAN = 0,
ORB = 1,
EVENT = 2,
GEM_25 = 3,
GEM_50 = 4,
GEM_75 = 5,
GEM_100 = 6,
SKILLPOINT = 7,
SKILLPOINT_GOAL = 8,
TOTAL_GEM = 9,
SHORES_TOKEN = 10,
MONEYBAGS = 11,
LIFE_BOTTLE = 12,
GEM = 13,
SPIRIT_PARTICLE = 14
class Spyro2LocationData(NamedTuple):
name: str
default_item: str
category: Spyro2LocationCategory
class Spyro2Location(Location):
game: str = "Spyro 2"
category: Spyro2LocationCategory
default_item_name: str
def __init__(
self,
player: int,
name: str,
category: Spyro2LocationCategory,
default_item_name: str,
address: Optional[int] = None,
parent: Optional[Region] = None
):
super().__init__(player, name, address, parent)
self.default_item_name = default_item_name
self.category = category
self.name = name
@staticmethod
def get_name_to_id() -> dict:
base_id = 1230000
table_offset = 1000
# Order follows the in-memory order of talismans and orbs.
table_order = [
"Summer Forest","Glimmer","Idol Springs","Colossus","Hurricos","Aquaria Towers","Sunny Beach","Ocean Speedway","Crush's Dungeon",
"Autumn Plains","Skelos Badlands","Crystal Glacier","Breeze Harbor","Zephyr","Metro Speedway","Scorch","Shady Oasis","Magma Cone","Fracture Hills","Icy Speedway","Gulp's Overlook",
"Winter Tundra","Mystic Marsh","Cloud Temples","Canyon Speedway","Robotica Farms","Metropolis","Dragon Shores","Ripto's Arena",
"Inventory"
]
output = {}
for i, region_name in enumerate(table_order):
if len(location_tables[region_name]) > table_offset:
raise Exception("A location table has {} entries, that is more than {} entries (table #{})".format(len(location_tables[region_name]), table_offset, i))
output.update({location_data.name: id for id, location_data in enumerate(location_tables[region_name], base_id + (table_offset * i))})
return output
def place_locked_item(self, item: Spyro2Item):
self.item = item
self.locked = True
item.location = self
# To ensure backwards compatibility, do not reorder locations or insert new ones in the middle of a list.
location_tables = {
# Homeworld 1
"Summer Forest": [
Spyro2LocationData("Summer Forest: Hunter's Challenge", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Summer Forest: On a secret ledge", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Summer Forest: Atop a ladder", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Summer Forest: Behind the door", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Summer Forest: Moneybags Unlock: Swim", "Moneybags Unlock - Swim", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Summer Forest: Moneybags Unlock: Door to Aquaria Towers", "Moneybags Unlock - Door to Aquaria Towers", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Summer Forest: First Life Bottle Near Glimmer", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
Spyro2LocationData("Summer Forest: Second Life Bottle Near Glimmer", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
Spyro2LocationData("Summer Forest: Life Bottle Near Sunny Beach", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Glimmer": [
Spyro2LocationData("Glimmer: Talisman", "Summer Forest Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Glimmer: Lizard hunt", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Glimmer: Gem Lamp Flight outdoors", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Glimmer: Gem Lamp Flight in cave", "Orb", Spyro2LocationCategory.ORB),
# The following leads to too restrictive a start.
#Spyro2LocationData("Glimmer: Moneybags Unlock: Glimmer Bridge", "Moneybags Unlock - Glimmer Bridge", Spyro2LocationCategory.MONEYBAGS),
],
"Idol Springs": [
Spyro2LocationData("Idol Springs: Talisman", "Summer Forest Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Idol Springs: Foreman Bud's puzzles", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Idol Springs: Hula Girl rescue", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Idol Springs: Land on Idol (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Idol Springs: Land on Idol (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
Spyro2LocationData("Idol Springs: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Colossus": [
Spyro2LocationData("Colossus: Talisman", "Summer Forest Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Colossus: Hockey vs. Goalie", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Colossus: Hockey one on one", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Colossus: Evil spirit search", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Colossus: Perfect in Hockey (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Colossus: Perfect in Hockey (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
Spyro2LocationData("Colossus: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Hurricos": [
Spyro2LocationData("Hurricos: Talisman", "Summer Forest Talisman", Spyro2LocationCategory.TALISMAN),
# This is the in-memory order.
Spyro2LocationData("Hurricos: Factory Glide 2", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Hurricos: Stone thief chase", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Hurricos: Factory Glide 1", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Hurricos: All Windmills (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Hurricos: All Windmills (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
Spyro2LocationData("Hurricos: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Aquaria Towers": [
Spyro2LocationData("Aquaria Towers: Talisman", "Summer Forest Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Aquaria Towers: Seahorse Rescue", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Aquaria Towers: Manta ride I", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Aquaria Towers: Manta ride II", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Aquaria Towers: Moneybags Unlock: Aquaria Towers Submarine", "Moneybags Unlock - Aquaria Towers Submarine", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Aquaria Towers: All Seaweed (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Aquaria Towers: All Seaweed (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
Spyro2LocationData("Aquaria Towers: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Sunny Beach": [
Spyro2LocationData("Sunny Beach: Talisman", "Summer Forest Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Sunny Beach: Blasting boxes", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Sunny Beach: Turtle soup I", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Sunny Beach: Turtle soup II", "Orb", Spyro2LocationCategory.ORB),
],
"Ocean Speedway": [
Spyro2LocationData("Ocean Speedway: Follow Hunter", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Ocean Speedway: Under 1:10 (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Ocean Speedway: Under 1:10 (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
],
"Crush's Dungeon": [
Spyro2LocationData("Crush's Dungeon: Crush Defeated", "Crush Defeated", Spyro2LocationCategory.EVENT),
Spyro2LocationData("Crush's Dungeon: Perfect (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Crush's Dungeon: Perfect (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
],
# Homeworld 2
"Autumn Plains": [
Spyro2LocationData("Autumn Plains: The end of the wall", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Autumn Plains: Long glide!", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Autumn Plains: Moneybags Unlock: Zephyr Portal", "Moneybags Unlock - Zephyr Portal", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Autumn Plains: Moneybags Unlock: Climb", "Moneybags Unlock - Climb", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Autumn Plains: Moneybags Unlock: Shady Oasis Portal", "Moneybags Unlock - Shady Oasis Portal", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Autumn Plains: Moneybags Unlock: Icy Speedway Portal", "Moneybags Unlock - Icy Speedway Portal", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Autumn Plains: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Skelos Badlands": [
Spyro2LocationData("Skelos Badlands: Talisman", "Autumn Plains Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Skelos Badlands: Lava lizards I", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Skelos Badlands: Lava lizards II", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Skelos Badlands: Dem bones", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Skelos Badlands: All Cacti (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Skelos Badlands: All Cacti (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
Spyro2LocationData("Skelos Badlands: Catbat Quartet (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Skelos Badlands: Catbat Quartet (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
Spyro2LocationData("Skelos Badlands: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Crystal Glacier": [
Spyro2LocationData("Crystal Glacier: Talisman", "Autumn Plains Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Crystal Glacier: Draclet cave", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Crystal Glacier: George the snow leopard", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Crystal Glacier: Moneybags Unlock: Crystal Glacier Bridge", "Moneybags Unlock - Crystal Glacier Bridge", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Crystal Glacier: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Breeze Harbor": [
Spyro2LocationData("Breeze Harbor: Talisman", "Autumn Plains Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Breeze Harbor: Gear grab", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Breeze Harbor: Mine blast", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Breeze Harbor: Life Bottle by Final Bonfire", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
Spyro2LocationData("Breeze Harbor: Life Bottle by Final Cannon", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Zephyr": [
Spyro2LocationData("Zephyr: Talisman", "Autumn Plains Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Zephyr: Cowlek corral I", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Zephyr: Cowlek corral II", "Orb", Spyro2LocationCategory.ORB),
# This is the in-memory order.
Spyro2LocationData("Zephyr: Sowing seeds II", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Zephyr: Sowing seeds I", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Zephyr: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Metro Speedway": [
Spyro2LocationData("Metro Speedway: Grab the Loot", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Metro Speedway: Under 1:15 (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Metro Speedway: Under 1:15 (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
],
"Scorch": [
Spyro2LocationData("Scorch: Talisman", "Autumn Plains Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Scorch: Barrel of Monkeys", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Scorch: Capture the flags", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Scorch: All Trees (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Scorch: All Trees (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
Spyro2LocationData("Scorch: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Shady Oasis": [
Spyro2LocationData("Shady Oasis: Talisman", "Autumn Plains Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Shady Oasis: Catch 3 thieves", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Shady Oasis: Free Hippos", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Shady Oasis: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Magma Cone": [
Spyro2LocationData("Magma Cone: Talisman", "Autumn Plains Talisman", Spyro2LocationCategory.TALISMAN),
Spyro2LocationData("Magma Cone: Crystal geysers I", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Magma Cone: Crystal geysers II", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Magma Cone: Party crashers", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Magma Cone: Moneybags Unlock: Magma Cone Elevator", "Moneybags Unlock - Magma Cone Elevator", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Magma Cone: Life Bottle by Moneybags", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
Spyro2LocationData("Magma Cone: Life Bottle on Ledge 1", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
Spyro2LocationData("Magma Cone: Life Bottle on Ledge 2", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
Spyro2LocationData("Magma Cone: Life Bottle on Ledge 3", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Fracture Hills": [
Spyro2LocationData("Fracture Hills: Talisman", "Autumn Plains Talisman", Spyro2LocationCategory.TALISMAN),
# This is the in-memory order.
Spyro2LocationData("Fracture Hills: Earthshaper bash", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Fracture Hills: Free the faun", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Fracture Hills: Alchemist escort", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Fracture Hills: 3 Laps of Supercharge (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Fracture Hills: 3 Laps of Supercharge (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
Spyro2LocationData("Fracture Hills: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Icy Speedway": [
Spyro2LocationData("Icy Speedway: Parasail through Rings", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Icy Speedway: Under 1:15 (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Icy Speedway: Under 1:15 (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
],
"Gulp's Overlook": [
Spyro2LocationData("Gulp's Overlook: Gulp Defeated", "Gulp Defeated", Spyro2LocationCategory.EVENT),
Spyro2LocationData("Gulp's Overlook: Perfect (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Gulp's Overlook: Perfect (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
Spyro2LocationData("Gulp's Overlook: Hit Ripto (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Gulp's Overlook: Hit Ripto (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
],
# Homeworld 3
"Winter Tundra": [
Spyro2LocationData("Winter Tundra: On the tall wall", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Winter Tundra: Top of the waterfall", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Winter Tundra: Smash the rock", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Winter Tundra: Moneybags Unlock: Canyon Speedway Portal", "Moneybags Unlock - Canyon Speedway Portal", Spyro2LocationCategory.MONEYBAGS),
Spyro2LocationData("Winter Tundra: Moneybags Unlock: Headbash", "Moneybags Unlock - Headbash", Spyro2LocationCategory.MONEYBAGS),
],
"Mystic Marsh": [
Spyro2LocationData("Mystic Marsh: Fix the fountain", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Mystic Marsh: Very versatile thieves!", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Mystic Marsh: Retrieve professor's pencil", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Mystic Marsh: Life Bottle by Basil", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
Spyro2LocationData("Mystic Marsh: Life Bottle by Cooking Pot", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Cloud Temples": [
Spyro2LocationData("Cloud Temples: Agent Zero's secret hideout", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Cloud Temples: Ring tower bells", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Cloud Temples: Break down doors", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Cloud Temples: Life Bottle", "Filler", Spyro2LocationCategory.LIFE_BOTTLE),
],
"Canyon Speedway": [
Spyro2LocationData("Canyon Speedway: Shoot down balloons", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Canyon Speedway: Under 1:10 (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Canyon Speedway: Under 1:10 (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
],
"Robotica Farms": [
Spyro2LocationData("Robotica Farms: Switch on bug light", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Robotica Farms: Clear tractor path", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Robotica Farms: Exterminate crow bugs", "Orb", Spyro2LocationCategory.ORB),
# There is a memory address for a skill point here, but it is not implemented.
],
"Metropolis": [
Spyro2LocationData("Metropolis: Conquer invading cows", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Metropolis: Shoot down sheep saucers I", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Metropolis: Shoot down sheep saucers II", "Orb", Spyro2LocationCategory.ORB),
Spyro2LocationData("Metropolis: Ox bombing", "Orb", Spyro2LocationCategory.ORB),
],
"Dragon Shores": [
Spyro2LocationData("Dragon Shores: Tunnel o' Love", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
Spyro2LocationData("Dragon Shores: Shooting Gallery I", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
Spyro2LocationData("Dragon Shores: Shooting Gallery II", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
Spyro2LocationData("Dragon Shores: Shooting Gallery III", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
Spyro2LocationData("Dragon Shores: Rollercoaster I", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
Spyro2LocationData("Dragon Shores: Rollercoaster II", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
Spyro2LocationData("Dragon Shores: Rollercoaster III", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
Spyro2LocationData("Dragon Shores: Dunk Tank I", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
Spyro2LocationData("Dragon Shores: Dunk Tank II", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
Spyro2LocationData("Dragon Shores: Dunk Tank III", "Dragon Shores Token", Spyro2LocationCategory.SHORES_TOKEN),
],
"Ripto's Arena": [
Spyro2LocationData("Ripto's Arena: Ripto Defeated", "Ripto Defeated", Spyro2LocationCategory.EVENT),
Spyro2LocationData("Ripto's Arena: Perfect (Skill Point)", "Filler", Spyro2LocationCategory.SKILLPOINT),
Spyro2LocationData("Ripto's Arena: Perfect (Goal)", "Skill Point", Spyro2LocationCategory.SKILLPOINT_GOAL),
],
"Inventory": [
Spyro2LocationData("Total Gems: 500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 1000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 1500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 2000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 2500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 3000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 3500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 4000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 4500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 5000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 5500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 6000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 6500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 7000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 7500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 8000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 8500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 9000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 9500", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Total Gems: 10000", "Filler", Spyro2LocationCategory.TOTAL_GEM),
Spyro2LocationData("Summer Forest: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Summer Forest: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Summer Forest: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Summer Forest: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Glimmer: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Glimmer: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Glimmer: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Glimmer: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Idol Springs: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Idol Springs: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Idol Springs: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Idol Springs: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Colossus: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Colossus: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Colossus: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Colossus: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Hurricos: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Hurricos: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Hurricos: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Hurricos: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Aquaria Towers: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Aquaria Towers: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Aquaria Towers: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Aquaria Towers: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Sunny Beach: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Sunny Beach: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Sunny Beach: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Sunny Beach: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Ocean Speedway: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Ocean Speedway: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Ocean Speedway: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Ocean Speedway: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Autumn Plains: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Autumn Plains: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Autumn Plains: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Autumn Plains: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Skelos Badlands: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Skelos Badlands: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Skelos Badlands: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Skelos Badlands: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Crystal Glacier: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Crystal Glacier: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Crystal Glacier: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Crystal Glacier: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Breeze Harbor: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Breeze Harbor: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Breeze Harbor: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Breeze Harbor: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Zephyr: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Zephyr: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Zephyr: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Zephyr: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Metro Speedway: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Metro Speedway: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Metro Speedway: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Metro Speedway: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Scorch: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Scorch: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Scorch: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Scorch: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Shady Oasis: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Shady Oasis: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Shady Oasis: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Shady Oasis: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Magma Cone: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Magma Cone: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Magma Cone: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Magma Cone: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Fracture Hills: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Fracture Hills: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Fracture Hills: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Fracture Hills: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Icy Speedway: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Icy Speedway: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Icy Speedway: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Icy Speedway: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Winter Tundra: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Winter Tundra: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Winter Tundra: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Winter Tundra: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Mystic Marsh: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Mystic Marsh: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Mystic Marsh: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Mystic Marsh: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Cloud Temples: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Cloud Temples: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Cloud Temples: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Cloud Temples: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Canyon Speedway: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Canyon Speedway: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Canyon Speedway: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Canyon Speedway: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Robotica Farms: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Robotica Farms: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Robotica Farms: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Robotica Farms: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
Spyro2LocationData("Metropolis: 25% Gems", "Filler", Spyro2LocationCategory.GEM_25),
Spyro2LocationData("Metropolis: 50% Gems", "Filler", Spyro2LocationCategory.GEM_50),
Spyro2LocationData("Metropolis: 75% Gems", "Filler", Spyro2LocationCategory.GEM_75),
Spyro2LocationData("Metropolis: All Gems", "Filler", Spyro2LocationCategory.GEM_100),
]
}
summer_gems = []
for i in range(60):
summer_gems += [Spyro2LocationData(f"Summer Forest: Gem {i + 1}", "Summer Forest Red Gem", Spyro2LocationCategory.GEM)]
for i in range(40):
summer_gems += [Spyro2LocationData(f"Summer Forest: Gem {i + 61}", "Summer Forest Green Gem", Spyro2LocationCategory.GEM)]
for i in range(27):
summer_gems += [Spyro2LocationData(f"Summer Forest: Gem {i + 101}", "Summer Forest Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(10):
summer_gems += [Spyro2LocationData(f"Summer Forest: Gem {i + 128}", "Summer Forest Gold Gem", Spyro2LocationCategory.GEM)]
for i in range(1):
summer_gems += [Spyro2LocationData(f"Summer Forest: Gem {i + 138}", "Summer Forest Pink Gem", Spyro2LocationCategory.GEM)]
location_tables["Summer Forest"] = location_tables["Summer Forest"] + summer_gems
glimmer_gems = []
for i in range(32):
glimmer_gems += [Spyro2LocationData(f"Glimmer: Gem {i + 1}", "Glimmer Red Gem", Spyro2LocationCategory.GEM)]
for i in range(59):
glimmer_gems += [Spyro2LocationData(f"Glimmer: Gem {i + 33}", "Glimmer Green Gem", Spyro2LocationCategory.GEM)]
for i in range(34):
glimmer_gems += [Spyro2LocationData(f"Glimmer: Gem {i + 92}", "Glimmer Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(8):
glimmer_gems += [Spyro2LocationData(f"Glimmer: Gem {i + 126}", "Glimmer Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Glimmer"] = location_tables["Glimmer"] + glimmer_gems
idol_gems = []
for i in range(60):
idol_gems += [Spyro2LocationData(f"Idol Springs: Gem {i + 1}", "Idol Springs Red Gem", Spyro2LocationCategory.GEM)]
for i in range(45):
idol_gems += [Spyro2LocationData(f"Idol Springs: Gem {i + 61}", "Idol Springs Green Gem", Spyro2LocationCategory.GEM)]
for i in range(38):
idol_gems += [Spyro2LocationData(f"Idol Springs: Gem {i + 106}", "Idol Springs Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(6):
idol_gems += [Spyro2LocationData(f"Idol Springs: Gem {i + 144}", "Idol Springs Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Idol Springs"] = location_tables["Idol Springs"] + idol_gems
colossus_gems = []
for i in range(39):
colossus_gems += [Spyro2LocationData(f"Colossus: Gem {i + 1}", "Colossus Red Gem", Spyro2LocationCategory.GEM)]
for i in range(53):
colossus_gems += [Spyro2LocationData(f"Colossus: Gem {i + 40}", "Colossus Green Gem", Spyro2LocationCategory.GEM)]
for i in range(39):
colossus_gems += [Spyro2LocationData(f"Colossus: Gem {i + 93}", "Colossus Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(6):
colossus_gems += [Spyro2LocationData(f"Colossus: Gem {i + 132}", "Colossus Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Colossus"] = location_tables["Colossus"] + colossus_gems
hurricos_gems = []
for i in range(37):
hurricos_gems += [Spyro2LocationData(f"Hurricos: Gem {i + 1}", "Hurricos Red Gem", Spyro2LocationCategory.GEM)]
for i in range(29):
hurricos_gems += [Spyro2LocationData(f"Hurricos: Gem {i + 38}", "Hurricos Green Gem", Spyro2LocationCategory.GEM)]
for i in range(35):
hurricos_gems += [Spyro2LocationData(f"Hurricos: Gem {i + 67}", "Hurricos Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(13):
hurricos_gems += [Spyro2LocationData(f"Hurricos: Gem {i + 102}", "Hurricos Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Hurricos"] = location_tables["Hurricos"] + hurricos_gems
aquaria_gems = []
for i in range(41):
aquaria_gems += [Spyro2LocationData(f"Aquaria Towers: Gem {i + 1}", "Aquaria Towers Red Gem", Spyro2LocationCategory.GEM)]
for i in range(57):
aquaria_gems += [Spyro2LocationData(f"Aquaria Towers: Gem {i + 42}", "Aquaria Towers Green Gem", Spyro2LocationCategory.GEM)]
for i in range(32):
aquaria_gems += [Spyro2LocationData(f"Aquaria Towers: Gem {i + 99}", "Aquaria Towers Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(6):
aquaria_gems += [Spyro2LocationData(f"Aquaria Towers: Gem {i + 131}", "Aquaria Towers Gold Gem", Spyro2LocationCategory.GEM)]
for i in range(1):
aquaria_gems += [Spyro2LocationData(f"Aquaria Towers: Gem {i + 137}", "Aquaria Towers Pink Gem", Spyro2LocationCategory.GEM)]
location_tables["Aquaria Towers"] = location_tables["Aquaria Towers"] + aquaria_gems
sunny_gems = []
for i in range(22):
sunny_gems += [Spyro2LocationData(f"Sunny Beach: Gem {i + 1}", "Sunny Beach Red Gem", Spyro2LocationCategory.GEM)]
for i in range(49):
sunny_gems += [Spyro2LocationData(f"Sunny Beach: Gem {i + 23}", "Sunny Beach Green Gem", Spyro2LocationCategory.GEM)]
for i in range(38):
sunny_gems += [Spyro2LocationData(f"Sunny Beach: Gem {i + 72}", "Sunny Beach Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(9):
sunny_gems += [Spyro2LocationData(f"Sunny Beach: Gem {i + 110}", "Sunny Beach Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Sunny Beach"] = location_tables["Sunny Beach"] + sunny_gems
autumn_gems = []
for i in range(41):
autumn_gems += [Spyro2LocationData(f"Autumn Plains: Gem {i + 1}", "Autumn Plains Red Gem", Spyro2LocationCategory.GEM)]
for i in range(22):
autumn_gems += [Spyro2LocationData(f"Autumn Plains: Gem {i + 42}", "Autumn Plains Green Gem", Spyro2LocationCategory.GEM)]
for i in range(32):
autumn_gems += [Spyro2LocationData(f"Autumn Plains: Gem {i + 64}", "Autumn Plains Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(8):
autumn_gems += [Spyro2LocationData(f"Autumn Plains: Gem {i + 96}", "Autumn Plains Gold Gem", Spyro2LocationCategory.GEM)]
for i in range(3):
autumn_gems += [Spyro2LocationData(f"Autumn Plains: Gem {i + 104}", "Autumn Plains Pink Gem", Spyro2LocationCategory.GEM)]
location_tables["Autumn Plains"] = location_tables["Autumn Plains"] + autumn_gems
skelos_gems = []
for i in range(22):
skelos_gems += [Spyro2LocationData(f"Skelos Badlands: Gem {i + 1}", "Skelos Badlands Red Gem", Spyro2LocationCategory.GEM)]
for i in range(24):
skelos_gems += [Spyro2LocationData(f"Skelos Badlands: Gem {i + 23}", "Skelos Badlands Green Gem", Spyro2LocationCategory.GEM)]
for i in range(38):
skelos_gems += [Spyro2LocationData(f"Skelos Badlands: Gem {i + 47}", "Skelos Badlands Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(9):
skelos_gems += [Spyro2LocationData(f"Skelos Badlands: Gem {i + 85}", "Skelos Badlands Gold Gem", Spyro2LocationCategory.GEM)]
for i in range(2):
skelos_gems += [Spyro2LocationData(f"Skelos Badlands: Gem {i + 94}", "Skelos Badlands Pink Gem", Spyro2LocationCategory.GEM)]
location_tables["Skelos Badlands"] = location_tables["Skelos Badlands"] + skelos_gems
crystal_gems = []
for i in range(28):
crystal_gems += [Spyro2LocationData(f"Crystal Glacier: Gem {i + 1}", "Crystal Glacier Red Gem", Spyro2LocationCategory.GEM)]
for i in range(26):
crystal_gems += [Spyro2LocationData(f"Crystal Glacier: Gem {i + 29}", "Crystal Glacier Green Gem", Spyro2LocationCategory.GEM)]
for i in range(41):
crystal_gems += [Spyro2LocationData(f"Crystal Glacier: Gem {i + 55}", "Crystal Glacier Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(9):
crystal_gems += [Spyro2LocationData(f"Crystal Glacier: Gem {i + 96}", "Crystal Glacier Gold Gem", Spyro2LocationCategory.GEM)]
for i in range(1):
crystal_gems += [Spyro2LocationData(f"Crystal Glacier: Gem {i + 105}", "Crystal Glacier Pink Gem", Spyro2LocationCategory.GEM)]
location_tables["Crystal Glacier"] = location_tables["Crystal Glacier"] + crystal_gems
breeze_gems = []
for i in range(19):
breeze_gems += [Spyro2LocationData(f"Breeze Harbor: Gem {i + 1}", "Breeze Harbor Red Gem", Spyro2LocationCategory.GEM)]
for i in range(28):
breeze_gems += [Spyro2LocationData(f"Breeze Harbor: Gem {i + 20}", "Breeze Harbor Green Gem", Spyro2LocationCategory.GEM)]
for i in range(35):
breeze_gems += [Spyro2LocationData(f"Breeze Harbor: Gem {i + 48}", "Breeze Harbor Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(15):
breeze_gems += [Spyro2LocationData(f"Breeze Harbor: Gem {i + 83}", "Breeze Harbor Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Breeze Harbor"] = location_tables["Breeze Harbor"] + breeze_gems
zephyr_gems = []
for i in range(49):
zephyr_gems += [Spyro2LocationData(f"Zephyr: Gem {i + 1}", "Zephyr Red Gem", Spyro2LocationCategory.GEM)]
for i in range(53):
zephyr_gems += [Spyro2LocationData(f"Zephyr: Gem {i + 50}", "Zephyr Green Gem", Spyro2LocationCategory.GEM)]
for i in range(23):
zephyr_gems += [Spyro2LocationData(f"Zephyr: Gem {i + 103}", "Zephyr Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(8):
zephyr_gems += [Spyro2LocationData(f"Zephyr: Gem {i + 126}", "Zephyr Gold Gem", Spyro2LocationCategory.GEM)]
for i in range(2):
zephyr_gems += [Spyro2LocationData(f"Zephyr: Gem {i + 134}", "Zephyr Pink Gem", Spyro2LocationCategory.GEM)]
location_tables["Zephyr"] = location_tables["Zephyr"] + zephyr_gems
scorch_gems = []
for i in range(47):
scorch_gems += [Spyro2LocationData(f"Scorch: Gem {i + 1}", "Scorch Red Gem", Spyro2LocationCategory.GEM)]
for i in range(29):
scorch_gems += [Spyro2LocationData(f"Scorch: Gem {i + 48}", "Scorch Green Gem", Spyro2LocationCategory.GEM)]
for i in range(39):
scorch_gems += [Spyro2LocationData(f"Scorch: Gem {i + 77}", "Scorch Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(10):
scorch_gems += [Spyro2LocationData(f"Scorch: Gem {i + 116}", "Scorch Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Scorch"] = location_tables["Scorch"] + scorch_gems
shady_gems = []
for i in range(35):
shady_gems += [Spyro2LocationData(f"Shady Oasis: Gem {i + 1}", "Shady Oasis Red Gem", Spyro2LocationCategory.GEM)]
for i in range(35):
shady_gems += [Spyro2LocationData(f"Shady Oasis: Gem {i + 36}", "Shady Oasis Green Gem", Spyro2LocationCategory.GEM)]
for i in range(39):
shady_gems += [Spyro2LocationData(f"Shady Oasis: Gem {i + 71}", "Shady Oasis Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(10):
shady_gems += [Spyro2LocationData(f"Shady Oasis: Gem {i + 110}", "Shady Oasis Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Shady Oasis"] = location_tables["Shady Oasis"] + shady_gems
magma_gems = []
for i in range(33):
magma_gems += [Spyro2LocationData(f"Magma Cone: Gem {i + 1}", "Magma Cone Red Gem", Spyro2LocationCategory.GEM)]
for i in range(36):
magma_gems += [Spyro2LocationData(f"Magma Cone: Gem {i + 34}", "Magma Cone Green Gem", Spyro2LocationCategory.GEM)]
for i in range(41):
magma_gems += [Spyro2LocationData(f"Magma Cone: Gem {i + 70}", "Magma Cone Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(9):
magma_gems += [Spyro2LocationData(f"Magma Cone: Gem {i + 111}", "Magma Cone Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Magma Cone"] = location_tables["Magma Cone"] + magma_gems
fracture_gems = []
for i in range(36):
fracture_gems += [Spyro2LocationData(f"Fracture Hills: Gem {i + 1}", "Fracture Hills Red Gem", Spyro2LocationCategory.GEM)]
for i in range(32):
fracture_gems += [Spyro2LocationData(f"Fracture Hills: Gem {i + 37}", "Fracture Hills Green Gem", Spyro2LocationCategory.GEM)]
for i in range(37):
fracture_gems += [Spyro2LocationData(f"Fracture Hills: Gem {i + 69}", "Fracture Hills Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(9):
fracture_gems += [Spyro2LocationData(f"Fracture Hills: Gem {i + 106}", "Fracture Hills Gold Gem", Spyro2LocationCategory.GEM)]
for i in range(1):
fracture_gems += [Spyro2LocationData(f"Fracture Hills: Gem {i + 115}", "Fracture Hills Pink Gem", Spyro2LocationCategory.GEM)]
location_tables["Fracture Hills"] = location_tables["Fracture Hills"] + fracture_gems
winter_gems = []
for i in range(32):
winter_gems += [Spyro2LocationData(f"Winter Tundra: Gem {i + 1}", "Winter Tundra Red Gem", Spyro2LocationCategory.GEM)]
for i in range(29):
winter_gems += [Spyro2LocationData(f"Winter Tundra: Gem {i + 33}", "Winter Tundra Green Gem", Spyro2LocationCategory.GEM)]
for i in range(18):
winter_gems += [Spyro2LocationData(f"Winter Tundra: Gem {i + 62}", "Winter Tundra Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(22):
winter_gems += [Spyro2LocationData(f"Winter Tundra: Gem {i + 80}", "Winter Tundra Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Winter Tundra"] = location_tables["Winter Tundra"] + winter_gems
mystic_gems = []
for i in range(54):
mystic_gems += [Spyro2LocationData(f"Mystic Marsh: Gem {i + 1}", "Mystic Marsh Red Gem", Spyro2LocationCategory.GEM)]
for i in range(38):
mystic_gems += [Spyro2LocationData(f"Mystic Marsh: Gem {i + 55}", "Mystic Marsh Green Gem", Spyro2LocationCategory.GEM)]
for i in range(40):
mystic_gems += [Spyro2LocationData(f"Mystic Marsh: Gem {i + 93}", "Mystic Marsh Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(7):
mystic_gems += [Spyro2LocationData(f"Mystic Marsh: Gem {i + 133}", "Mystic Marsh Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Mystic Marsh"] = location_tables["Mystic Marsh"] + mystic_gems
cloud_gems = []
for i in range(36):
cloud_gems += [Spyro2LocationData(f"Cloud Temples: Gem {i + 1}", "Cloud Temples Red Gem", Spyro2LocationCategory.GEM)]
for i in range(27):
cloud_gems += [Spyro2LocationData(f"Cloud Temples: Gem {i + 37}", "Cloud Temples Green Gem", Spyro2LocationCategory.GEM)]
for i in range(37):
cloud_gems += [Spyro2LocationData(f"Cloud Temples: Gem {i + 64}", "Cloud Temples Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(10):
cloud_gems += [Spyro2LocationData(f"Cloud Temples: Gem {i + 101}", "Cloud Temples Gold Gem", Spyro2LocationCategory.GEM)]
for i in range(1):
cloud_gems += [Spyro2LocationData(f"Cloud Temples: Gem {i + 111}", "Cloud Temples Pink Gem", Spyro2LocationCategory.GEM)]
location_tables["Cloud Temples"] = location_tables["Cloud Temples"] + cloud_gems
robotica_gems = []
for i in range(29):
robotica_gems += [Spyro2LocationData(f"Robotica Farms: Gem {i + 1}", "Robotica Farms Red Gem", Spyro2LocationCategory.GEM)]
for i in range(53):
robotica_gems += [Spyro2LocationData(f"Robotica Farms: Gem {i + 30}", "Robotica Farms Green Gem", Spyro2LocationCategory.GEM)]
for i in range(37):
robotica_gems += [Spyro2LocationData(f"Robotica Farms: Gem {i + 83}", "Robotica Farms Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(8):
robotica_gems += [Spyro2LocationData(f"Robotica Farms: Gem {i + 120}", "Robotica Farms Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Robotica Farms"] = location_tables["Robotica Farms"] + robotica_gems
metropolis_gems = []
for i in range(39):
metropolis_gems += [Spyro2LocationData(f"Metropolis: Gem {i + 1}", "Metropolis Red Gem", Spyro2LocationCategory.GEM)]
for i in range(38):
metropolis_gems += [Spyro2LocationData(f"Metropolis: Gem {i + 40}", "Metropolis Green Gem", Spyro2LocationCategory.GEM)]
for i in range(41):
metropolis_gems += [Spyro2LocationData(f"Metropolis: Gem {i + 78}", "Metropolis Blue Gem", Spyro2LocationCategory.GEM)]
for i in range(8):
metropolis_gems += [Spyro2LocationData(f"Metropolis: Gem {i + 119}", "Metropolis Gold Gem", Spyro2LocationCategory.GEM)]
location_tables["Metropolis"] = location_tables["Metropolis"] + metropolis_gems
# To ensure backwards compatibility, do not move gem location IDs.
for level in location_tables.keys():
if level not in ["Summer Forest", "Ocean Speedway", "Crush's Dungeon", "Autumn Plains", "Metro Speedway", "Icy Speedway", "Gulp's Overlook", "Winter Tundra", "Canyon Speedway", "Dragon Shores", "Ripto's Arena", "Inventory"]:
location_tables[level] = location_tables[level] + [Spyro2LocationData(f"{level}: All Spirit Particles", "Filler", Spyro2LocationCategory.SPIRIT_PARTICLE)]
location_dictionary: Dict[str, Spyro2LocationData] = {}
for location_table in location_tables.values():
location_dictionary.update({location_data.name: location_data for location_data in location_table})