diff --git a/ui/workers/gather_encounter_locations.py b/ui/workers/gather_encounter_locations.py index 8931d03..66b16a1 100644 --- a/ui/workers/gather_encounter_locations.py +++ b/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: 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: return False diff --git a/ui/workers/gather_evolutions_worker.py b/ui/workers/gather_evolutions_worker.py index 76dd369..c17b21a 100644 --- a/ui/workers/gather_evolutions_worker.py +++ b/ui/workers/gather_evolutions_worker.py @@ -9,7 +9,7 @@ from db import db import re 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): finished = pyqtSignal(dict) @@ -131,6 +131,20 @@ class GatherEvolutions(QRunnable): } 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é": def fix_form(node, new_form): node["form"] = new_form @@ -408,7 +422,7 @@ class GatherEvolutions(QRunnable): results = gender_filtered_results results.sort(key=lambda x: parse_pfic(x["pfic"])) - + if form is None and gender is None: if len(results) > 1: 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) else: return results[0]["pfic"] # Return the PFIC of the first result if no form is specified - + if form is None and gender: gendered_form = self.get_pokemon_form_by_name(name, gender, threshold=100) if gendered_form: diff --git a/ui/workers/gather_pokemon_forms_worker.py b/ui/workers/gather_pokemon_forms_worker.py index 444bf03..01200fb 100644 --- a/ui/workers/gather_pokemon_forms_worker.py +++ b/ui/workers/gather_pokemon_forms_worker.py @@ -187,6 +187,11 @@ class GatherPokemonFormsWorker(QRunnable): if not record_female_form and not record_male_form: 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: pokemon_form = { "pfic":format_pokemon_id(national_dex_number, generation, form_index, gender), diff --git a/ui/workers/generate_plan_worker.py b/ui/workers/generate_plan_worker.py index bbda6b0..0476304 100644 --- a/ui/workers/generate_plan_worker.py +++ b/ui/workers/generate_plan_worker.py @@ -5,7 +5,7 @@ from cache import cache from db import db 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): finished = pyqtSignal(dict) @@ -66,11 +66,11 @@ class GeneratePlanWorker(QRunnable): games_in_group.extend(db.get_games_by_generation(generation)) pokemon_in_generation = db.get_pokemon_by_generation(generation) for pokemon in pokemon_in_generation: + pfic = pokemon["PFIC"] + if pokemon["storable_in_home"] == False: continue - pfic = pokemon["PFIC"] - testing = [ "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", @@ -89,7 +89,40 @@ class GeneratePlanWorker(QRunnable): encounters.extend(random) encounters.extend(static) 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: game_pokemon[game['id']] = set() for encounter in encounters: @@ -117,8 +150,10 @@ class GeneratePlanWorker(QRunnable): for game in available_games: 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 = cache[best_game['id']] + pokemon_covered = {} + if cache: + best_game = max(available_games, key=lambda g: len(cache[g["id"]])) + pokemon_covered = cache[best_game['id']] if not pokemon_covered: 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']}") 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: temp = [] for pfic in catch_in_game[game["id"]]: @@ -154,6 +190,14 @@ class GeneratePlanWorker(QRunnable): exclusive_groups = self.get_exclusive_groups(game['id']) 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_predecessors = {} all_pokemon = needed_pokemon | available_pokemon diff --git a/utility/data.py b/utility/data.py index 3f88145..4633c48 100644 --- a/utility/data.py +++ b/utility/data.py @@ -358,7 +358,6 @@ default_forms = [ "Red-Striped Form", "Spring Form", "Incarnate Forme", - "Meadow Pattern", "Red Flower", "Average Size", "50% Forme", @@ -397,7 +396,11 @@ POKEMON_PROPER_NOUNS = { "Pa'u", "Sensu", "Debutante", - "Douse" + "Douse", + "Red-Striped", + "Blue-Striped", + "White-Striped", + "Ash-Greninja" } POKEMON_PROPER_NOUNS = POKEMON_PROPER_NOUNS | set(regions) @@ -509,4 +512,27 @@ alcremie_forms = [ "Salted Cream Ribbon Sweet", "Salted Cream Star 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" ] \ No newline at end of file diff --git a/utility/functions.py b/utility/functions.py index 9fdb8c3..9128a5b 100644 --- a/utility/functions.py +++ b/utility/functions.py @@ -16,8 +16,8 @@ def compare_pokemon_forms(a, b): if a == None or b == None: return False - temp_a = a.lower().replace("forme", "").replace("form", "").replace("é", "e").replace("-", " ").strip() - temp_b = b.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").strip() # Common spelling mistakes 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"]: forms.append(form_pair) 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 diff --git a/utility/pokemon_word_ninja.py b/utility/pokemon_word_ninja.py index 55b16df..2f471ea 100644 --- a/utility/pokemon_word_ninja.py +++ b/utility/pokemon_word_ninja.py @@ -31,7 +31,7 @@ class PokemonWordNinja: def split(self, text: str) -> str: working_text = text - working_text = working_text.replace("-", " ") + #working_text = working_text.replace("-", " ") # First handle exact custom words to preserve capitalization for word in self.custom_words: