Files
nuzlocke-tracker/backend/src/app/services/families.py
Julian Tabel 48b56f9360 Implement Retire HoF (Gauntlet) rule enforcement for genlockes
When retireHoF is enabled, surviving HoF Pokemon and their evolutionary
families are retired at leg advancement and treated as duplicates in all
subsequent legs — both in the encounter modal and bulk randomize.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:05:03 +01:00

32 lines
1.1 KiB
Python

from collections import deque
from app.models.evolution import Evolution
def build_families(evolutions: list[Evolution]) -> dict[int, list[int]]:
"""Build pokemon_id -> family members mapping using BFS on evolution graph."""
adj: dict[int, set[int]] = {}
for evo in evolutions:
adj.setdefault(evo.from_pokemon_id, set()).add(evo.to_pokemon_id)
adj.setdefault(evo.to_pokemon_id, set()).add(evo.from_pokemon_id)
visited: set[int] = set()
pokemon_to_family: dict[int, list[int]] = {}
for node in adj:
if node in visited:
continue
component: list[int] = []
queue = deque([node])
while queue:
current = queue.popleft()
if current in visited:
continue
visited.add(current)
component.append(current)
for neighbor in adj.get(current, set()):
if neighbor not in visited:
queue.append(neighbor)
for member in component:
pokemon_to_family[member] = component
return pokemon_to_family