Browse Source

- Fix up most missing pokemon from the plan

- Vivillon, Rotom and Aegislash to go
plan_generation
Quildra 1 year ago
parent
commit
4746debb95
  1. 27
      ui/workers/gather_encounter_locations.py
  2. 20
      ui/workers/gather_evolutions_worker.py
  3. 5
      ui/workers/gather_pokemon_forms_worker.py
  4. 56
      ui/workers/generate_plan_worker.py
  5. 30
      utility/data.py
  6. 11
      utility/functions.py
  7. 2
      utility/pokemon_word_ninja.py

27
ui/workers/gather_encounter_locations.py

@ -394,6 +394,33 @@ class GatherEncountersWorker(QRunnable):
if form.lower() in ["spring form", "summer form", "autumn form", "winter form"] and main_form == None: if form.lower() in ["spring form", "summer form", "autumn form", "winter form"] and main_form == None:
return True return True
if form.lower() in ["plant cloak", "sandy cloak", "trash cloak"] and main_form == None:
return True
if form.lower() in [
"meadow pattern",
"archipelago pattern",
"continental pattern",
"elegant pattern",
"garden pattern",
"high plains pattern",
"icy snow pattern",
"jungle pattern",
"marine pattern",
"meadow pattern",
"modern pattern",
"monsoon pattern",
"ocean pattern",
"polar pattern",
"river pattern",
"sandstorm pattern",
"savanna pattern",
"sun pattern",
"tundra pattern",
"fancy pattern"
]:
return True
if form and main_form is None: if form and main_form is None:
return False return False

20
ui/workers/gather_evolutions_worker.py

@ -9,7 +9,7 @@ from db import db
import re import re
from utility.functions import get_form_name, get_display_name, parse_pfic from utility.functions import get_form_name, get_display_name, parse_pfic
from utility.data import non_evolution_forms, alcremie_forms from utility.data import non_evolution_forms, alcremie_forms, vivillon_patterns
class GatherEvolutionsWorkerSignals(QObject): class GatherEvolutionsWorkerSignals(QObject):
finished = pyqtSignal(dict) finished = pyqtSignal(dict)
@ -131,6 +131,20 @@ class GatherEvolutions(QRunnable):
} }
evolution_tree["evolves_to"].append(node) evolution_tree["evolves_to"].append(node)
if evolution_tree["pokemon"] == "Scatterbug":
spewpa_node = evolution_tree["evolves_to"][0]
spewpa_node["evolves_to"] = []
for form in vivillon_patterns:
node = {
"pokemon": "Vivillon",
"form": form,
"requirement": None,
"method": "Level 12 →",
"evolves_to": [],
"stage": 2
}
spewpa_node["evolves_to"].append(node)
if evolution_tree["pokemon"] == "Flabébé": if evolution_tree["pokemon"] == "Flabébé":
def fix_form(node, new_form): def fix_form(node, new_form):
node["form"] = new_form node["form"] = new_form
@ -408,7 +422,7 @@ class GatherEvolutions(QRunnable):
results = gender_filtered_results results = gender_filtered_results
results.sort(key=lambda x: parse_pfic(x["pfic"])) results.sort(key=lambda x: parse_pfic(x["pfic"]))
if form is None and gender is None: if form is None and gender is None:
if len(results) > 1: if len(results) > 1:
if results[0]["form_name"] == None: if results[0]["form_name"] == None:
@ -417,7 +431,7 @@ class GatherEvolutions(QRunnable):
return self.get_pokemon_form_by_name(name, "Male", threshold=100, gender=gender) return self.get_pokemon_form_by_name(name, "Male", threshold=100, gender=gender)
else: else:
return results[0]["pfic"] # Return the PFIC of the first result if no form is specified return results[0]["pfic"] # Return the PFIC of the first result if no form is specified
if form is None and gender: if form is None and gender:
gendered_form = self.get_pokemon_form_by_name(name, gender, threshold=100) gendered_form = self.get_pokemon_form_by_name(name, gender, threshold=100)
if gendered_form: if gendered_form:

5
ui/workers/gather_pokemon_forms_worker.py

@ -187,6 +187,11 @@ class GatherPokemonFormsWorker(QRunnable):
if not record_female_form and not record_male_form: if not record_female_form and not record_male_form:
record_genderless_form = True record_genderless_form = True
if pokemon_name == "Basculin" and form_name.lower() == "white-striped form":
generation = 8
elif pokemon_name == "Burmy":
gender_relevant = True
if gender_relevant or record_genderless_form: if gender_relevant or record_genderless_form:
pokemon_form = { pokemon_form = {
"pfic":format_pokemon_id(national_dex_number, generation, form_index, gender), "pfic":format_pokemon_id(national_dex_number, generation, form_index, gender),

56
ui/workers/generate_plan_worker.py

@ -5,7 +5,7 @@ from cache import cache
from db import db from db import db
from utility.data import exclusive_choice_pokemon from utility.data import exclusive_choice_pokemon
from utility.functions import get_shiftable_forms, parse_pfic from utility.functions import get_shiftable_forms, get_shiftable_forms_bidirectional, parse_pfic, sanitize_filename
class GeneratePlanWorkerSignals(QObject): class GeneratePlanWorkerSignals(QObject):
finished = pyqtSignal(dict) finished = pyqtSignal(dict)
@ -66,11 +66,11 @@ class GeneratePlanWorker(QRunnable):
games_in_group.extend(db.get_games_by_generation(generation)) games_in_group.extend(db.get_games_by_generation(generation))
pokemon_in_generation = db.get_pokemon_by_generation(generation) pokemon_in_generation = db.get_pokemon_by_generation(generation)
for pokemon in pokemon_in_generation: for pokemon in pokemon_in_generation:
pfic = pokemon["PFIC"]
if pokemon["storable_in_home"] == False: if pokemon["storable_in_home"] == False:
continue continue
pfic = pokemon["PFIC"]
testing = [ testing = [
"0140-01-000-1", "0138-01-000-1", "0140-01-000-2", "0138-01-000-2", "0140-01-000-1", "0138-01-000-1", "0140-01-000-2", "0138-01-000-2",
"0141-01-000-1", "0139-01-000-1", "0141-01-000-2", "0139-01-000-2", "0141-01-000-1", "0139-01-000-1", "0141-01-000-2", "0139-01-000-2",
@ -89,7 +89,40 @@ class GeneratePlanWorker(QRunnable):
encounters.extend(random) encounters.extend(random)
encounters.extend(static) encounters.extend(static)
encounters.extend(starter) encounters.extend(starter)
"""
def thingy(current_pfic):
evolution_chains = db.get_full_evolution_paths(current_pfic)
if evolution_chains and (len(evolution_chains["predecessors"]) > 0 or len(evolution_chains["successors"]) > 0):
for chains in evolution_chains["predecessors"]:
for evolved_pfic, method in chains:
if evolved_pfic in needed_pokemon:
game_pokemon[game['id']].add(evolved_pfic)
for shiftable_form in get_shiftable_forms_bidirectional(evolved_pfic):
game_pokemon[game['id']].add(shiftable_form["to_pfic"])
game_pokemon[game['id']].add(shiftable_form["from_pfic"])
for chains in evolution_chains["successors"]:
for evolved_pfic, method in chains:
if evolved_pfic in needed_pokemon:
game_pokemon[game['id']].add(evolved_pfic)
for shiftable_form in get_shiftable_forms_bidirectional(evolved_pfic):
game_pokemon[game['id']].add(shiftable_form["to_pfic"])
game_pokemon[game['id']].add(shiftable_form["from_pfic"])
for game in games_in_group:
game_pokemon[game['id']] = set()
for encounter in encounters:
current_pfic = encounter['PFIC']
if game["id"] == encounter["game_id"]:
game_pokemon[game['id']].add(current_pfic)
for shiftable_form in get_shiftable_forms_bidirectional(current_pfic):
game_pokemon[game['id']].add(shiftable_form["to_pfic"])
game_pokemon[game['id']].add(shiftable_form["from_pfic"])
thingy(shiftable_form["from_pfic"])
thingy(pfic)
"""
for game in games_in_group: for game in games_in_group:
game_pokemon[game['id']] = set() game_pokemon[game['id']] = set()
for encounter in encounters: for encounter in encounters:
@ -117,8 +150,10 @@ class GeneratePlanWorker(QRunnable):
for game in available_games: for game in available_games:
cache[game['id']] = self.get_covered_pokemon(game, remaining_pokemon, game_pokemon[game['id']]) cache[game['id']] = self.get_covered_pokemon(game, remaining_pokemon, game_pokemon[game['id']])
best_game = max(available_games, key=lambda g: len(cache[g["id"]])) pokemon_covered = {}
pokemon_covered = cache[best_game['id']] if cache:
best_game = max(available_games, key=lambda g: len(cache[g["id"]]))
pokemon_covered = cache[best_game['id']]
if not pokemon_covered: if not pokemon_covered:
print("No more Pokémon can be covered. Breaking loop.") print("No more Pokémon can be covered. Breaking loop.")
@ -138,7 +173,8 @@ class GeneratePlanWorker(QRunnable):
print(f"Removed {game['name']} as it's covered by {best_game['name']}") print(f"Removed {game['name']} as it's covered by {best_game['name']}")
for game in selected_games: for game in selected_games:
output_file = "./temp/"+game["name"]+".json" file_name = sanitize_filename(game["name"])
output_file = "./temp/"+file_name+".json"
with open(output_file, 'w', encoding='utf-8') as f: with open(output_file, 'w', encoding='utf-8') as f:
temp = [] temp = []
for pfic in catch_in_game[game["id"]]: for pfic in catch_in_game[game["id"]]:
@ -154,6 +190,14 @@ class GeneratePlanWorker(QRunnable):
exclusive_groups = self.get_exclusive_groups(game['id']) exclusive_groups = self.get_exclusive_groups(game['id'])
pokemon_covered = set() pokemon_covered = set()
search_value = "0412-04-002-2"
if search_value in needed_pokemon:
pass
if search_value in available_pokemon:
pass
evolution_paths = {} evolution_paths = {}
evolution_predecessors = {} evolution_predecessors = {}
all_pokemon = needed_pokemon | available_pokemon all_pokemon = needed_pokemon | available_pokemon

30
utility/data.py

@ -358,7 +358,6 @@ default_forms = [
"Red-Striped Form", "Red-Striped Form",
"Spring Form", "Spring Form",
"Incarnate Forme", "Incarnate Forme",
"Meadow Pattern",
"Red Flower", "Red Flower",
"Average Size", "Average Size",
"50% Forme", "50% Forme",
@ -397,7 +396,11 @@ POKEMON_PROPER_NOUNS = {
"Pa'u", "Pa'u",
"Sensu", "Sensu",
"Debutante", "Debutante",
"Douse" "Douse",
"Red-Striped",
"Blue-Striped",
"White-Striped",
"Ash-Greninja"
} }
POKEMON_PROPER_NOUNS = POKEMON_PROPER_NOUNS | set(regions) POKEMON_PROPER_NOUNS = POKEMON_PROPER_NOUNS | set(regions)
@ -509,4 +512,27 @@ alcremie_forms = [
"Salted Cream Ribbon Sweet", "Salted Cream Ribbon Sweet",
"Salted Cream Star Sweet", "Salted Cream Star Sweet",
"Salted Cream Strawberry Sweet", "Salted Cream Strawberry Sweet",
]
vivillon_patterns =[
"Meadow Pattern",
"Archipelago Pattern",
"Continental Pattern",
"Elegant Pattern",
"Garden Pattern",
"High plains Pattern",
"Icy snow Pattern",
"Jungle Pattern",
"Marine Pattern",
"Meadow Pattern",
"Modern Pattern",
"Monsoon Pattern",
"Ocean Pattern",
"Polar Pattern",
"River Pattern",
"Sandstorm Pattern",
"Savanna Pattern",
"Sun Pattern",
"Tundra Pattern",
"Fancy Pattern"
] ]

11
utility/functions.py

@ -16,8 +16,8 @@ def compare_pokemon_forms(a, b):
if a == None or b == None: if a == None or b == None:
return False return False
temp_a = a.lower().replace("forme", "").replace("form", "").replace("é", "e").replace("-", " ").strip() temp_a = a.lower().replace("forme", "").replace("form", "").replace("é", "e").strip()
temp_b = b.lower().replace("forme", "").replace("form", "").replace("é", "e").replace("-", " ").strip() temp_b = b.lower().replace("forme", "").replace("form", "").replace("é", "e").strip()
# Common spelling mistakes # Common spelling mistakes
temp_a = temp_a.replace("deputante", "debutante").replace("p'au", "pa'u").replace("blood moon", "bloodmoon") temp_a = temp_a.replace("deputante", "debutante").replace("p'au", "pa'u").replace("blood moon", "bloodmoon")
@ -137,3 +137,10 @@ def get_shiftable_forms(pfic):
if pfic == form_pair["from_pfic"]: if pfic == form_pair["from_pfic"]:
forms.append(form_pair) forms.append(form_pair)
return forms return forms
def get_shiftable_forms_bidirectional(pfic):
forms = []
for form_pair in shiftable_forms:
if pfic == form_pair["from_pfic"] or pfic == form_pair["to_pfic"]:
forms.append(form_pair)
return forms

2
utility/pokemon_word_ninja.py

@ -31,7 +31,7 @@ class PokemonWordNinja:
def split(self, text: str) -> str: def split(self, text: str) -> str:
working_text = text working_text = text
working_text = working_text.replace("-", " ") #working_text = working_text.replace("-", " ")
# First handle exact custom words to preserve capitalization # First handle exact custom words to preserve capitalization
for word in self.custom_words: for word in self.custom_words:

Loading…
Cancel
Save