diff --git a/constants.py b/constants.py new file mode 100644 index 0000000..4ba1588 --- /dev/null +++ b/constants.py @@ -0,0 +1,41 @@ +# Constants for default values used throughout the application + +# Default frame ranges +DEFAULT_MIN_FRAME = 1000 +DEFAULT_MAX_FRAME = 2000 + +# Default IV values +DEFAULT_MIN_IVS = "0/0/0/0/0/0" +DEFAULT_MAX_IVS = "31/31/31/31/31/31" + +# Default ability value +DEFAULT_ABILITY = 0 + +# Default hidden power values +DEFAULT_MIN_HIDDEN_POWER = 60 + +# Default item determinator values +DEFAULT_MIN_ITEM_DETER = 0 +DEFAULT_MAX_ITEM_DETER = 100 + +# Default encounter rates +DEFAULT_ENC_RATE = 30 +DEFAULT_MOVEMENT_RATE = 70 + +# Default water level values +DEFAULT_MIN_LEVEL_WATER = 20 +DEFAULT_MAX_LEVEL_WATER = 40 +DEFAULT_MIN_AVAIL_LEVEL_WATER = 20 +DEFAULT_MAX_AVAIL_LEVEL_WATER = 40 + +# Default nature examples +DEFAULT_NATURES = "Adamant/Modest" + +# Default hidden power types +DEFAULT_HIDDEN_POWER_TYPES = "Fire/Psychic" + +# Default placeholder names +DEFAULT_POKE_NAME = "Poke name :)" + +# Default encounter area +DEFAULT_ENCOUNTER_AREA = "Surfing" \ No newline at end of file diff --git a/gui_helpers.py b/gui_helpers.py new file mode 100644 index 0000000..2f4d3f7 --- /dev/null +++ b/gui_helpers.py @@ -0,0 +1,64 @@ +import tkinter as tk +from constants import * + +def create_entry_with_default(master, default_value): + """Create an Entry widget with a default value.""" + entry = tk.Entry(master) + entry.insert(0, str(default_value)) + return entry + +def create_boolean_checkbutton(master): + """Create a BooleanVar and associated Checkbutton.""" + variable = tk.BooleanVar(master) + button = tk.Checkbutton(master, variable=variable) + return button, variable + +def create_encounter_area_menu(master, default_area=DEFAULT_ENCOUNTER_AREA): + """Create an OptionMenu for encounter areas.""" + variable = tk.StringVar(master) + variable.set(default_area) + menu = tk.OptionMenu(master, variable, "Grass", "Surfing", "FishingOld", "FishingGood", "FishingSuper") + return menu, variable + +def create_standard_entries(master): + """Create common entry widgets used in both Method1 and MethodJ.""" + entries = {} + + # Common entries with default values + entries['natures'] = create_entry_with_default(master, DEFAULT_NATURES) + entries['hidden_power_types'] = create_entry_with_default(master, DEFAULT_HIDDEN_POWER_TYPES) + entries['min_hidden_power'] = create_entry_with_default(master, DEFAULT_MIN_HIDDEN_POWER) + entries['min_ivs'] = create_entry_with_default(master, DEFAULT_MIN_IVS) + entries['max_ivs'] = create_entry_with_default(master, DEFAULT_MAX_IVS) + entries['ability'] = create_entry_with_default(master, DEFAULT_ABILITY) + entries['min_frame'] = create_entry_with_default(master, DEFAULT_MIN_FRAME) + entries['max_frame'] = create_entry_with_default(master, DEFAULT_MAX_FRAME) + + # Boolean checkbuttons + entries['is_shiny'], entries['is_shiny_var'] = create_boolean_checkbutton(master) + entries['has_pokerus'], entries['has_pokerus_var'] = create_boolean_checkbutton(master) + + return entries + +def create_methodj_specific_entries(master): + """Create MethodJ-specific entry widgets.""" + entries = {} + + entries['enc_slots'] = create_entry_with_default(master, "0-11") + entries['synchronize_target'] = create_entry_with_default(master, DEFAULT_NATURES) + entries['min_item_deter'] = create_entry_with_default(master, DEFAULT_MIN_ITEM_DETER) + entries['max_item_deter'] = create_entry_with_default(master, DEFAULT_MAX_ITEM_DETER) + entries['enc_rate'] = create_entry_with_default(master, DEFAULT_ENC_RATE) + entries['movement_rate'] = create_entry_with_default(master, DEFAULT_MOVEMENT_RATE) + entries['min_level_water'] = create_entry_with_default(master, DEFAULT_MIN_LEVEL_WATER) + entries['max_level_water'] = create_entry_with_default(master, DEFAULT_MAX_LEVEL_WATER) + entries['min_avail_level_water'] = create_entry_with_default(master, DEFAULT_MIN_AVAIL_LEVEL_WATER) + entries['max_avail_level_water'] = create_entry_with_default(master, DEFAULT_MAX_AVAIL_LEVEL_WATER) + + # Encounter area menu + entries['encounter_area'], entries['encounter_area_var'] = create_encounter_area_menu(master) + + # Ignore encounter check + entries['ignore_encounter_check'], entries['ignore_encounter_check_var'] = create_boolean_checkbutton(master) + + return entries \ No newline at end of file diff --git a/main.py b/main.py index e5a4c79..05ec904 100644 --- a/main.py +++ b/main.py @@ -11,6 +11,8 @@ from benchmark import Benchmark from search import search_details from tests import Test +from constants import * +from gui_helpers import * import multiprocessing @@ -183,183 +185,93 @@ def load_file(): def add_method_j(): - entry14 = tk.Entry(master) - entry14.insert(0, "Poke Name :)") - - entry1 = tk.Entry(master) - entry1.insert(0, "1/3/5/7/9") - - entry2 = tk.Entry(master) - entry2.insert(0, "Adamant/Modest") - - entry15 = tk.Entry(master) - entry15.insert(0, "PokeLabel/Nature1/Nature2") - - entry3 = tk.Entry(master) - entry3.insert(0, "Fire/Psychic") - - entry4 = tk.Entry(master) - entry4.insert(0, "60") - - entry5 = tk.Entry(master) - entry5.insert(0, "0/0/0/0/0/0") - - entry6 = tk.Entry(master) - entry6.insert(0, "31/31/31/31/31/31") - - entry7 = tk.Entry(master) - entry7.insert(0, 0) - - entry8 = tk.Entry(master) - entry8.insert(0, 100) - - entry9 = tk.Entry(master) - entry9.insert(0, 0) - - entry10 = tk.Entry(master) - entry10.insert(0, 1000) - - entry11 = tk.Entry(master) - entry11.insert(0, 2000) - - entry12 = tk.Entry(master) - entry12.insert(0, 30) - - entry13 = tk.Entry(master) - entry13.insert(0, 70) - - variable3 = tk.StringVar(master) - variable3.set("Surfing") # default value - menu3 = tk.OptionMenu(master, variable3, "Grass", "Surfing", "FishingOld", "FishingGood", "FishingSuper") - - variable4 = tk.BooleanVar(master) - button4 = tk.Checkbutton(master, variable=variable4) - - variable5 = tk.BooleanVar(master) - button5 = tk.Checkbutton(master, variable=variable5) - - variable6 = tk.BooleanVar(master) - button6 = tk.Checkbutton(master, variable=variable6) - - entry16 = tk.Entry(master) - entry16.insert(0, 20) - - entry19 = tk.Entry(master) - entry19.insert(0, 40) - - entry17 = tk.Entry(master) - entry17.insert(0, 20) - - entry18 = tk.Entry(master) - entry18.insert(0, 40) + # Create label entry + label_entry = create_entry_with_default(master, "Poke Name :)") + + # Create standard entries common to both methods + standard_entries = create_standard_entries(master) + + # Create MethodJ-specific entries + methodj_entries = create_methodj_specific_entries(master) + + # Create specific entries for MethodJ + enc_slots_entry = create_entry_with_default(master, "1/3/5/7/9") + synchronize_target_entry = create_entry_with_default(master, "PokeLabel/Nature1/Nature2") new_query = { "type": "MethodJ", - "label": entry14, - "enc_slots": entry1, - "natures": entry2, - "synchronize_target": entry15, - "hidden_power_types": entry3, - "min_hidden_power": entry4, - "min_ivs": entry5, - "max_ivs": entry6, - "min_item_deter": entry7, - "max_item_deter": entry8, - "ability": entry9, - "min_frame": entry10, - "max_frame": entry11, - "enc_rate": entry12, - "movement_rate": entry13, - "encounter_area": menu3, - "encounter_area_var": variable3, - "ignore_encounter_check": button4, - "ignore_encounter_check_var": variable4, - "is_shiny": button5, - "is_shiny_var": variable5, - "has_pokerus": button6, - "has_pokerus_var": variable6, - "min_level_water": entry16, - "max_level_water": entry19, - "min_avail_level_water": entry17, - "max_avail_level_water": entry18 + "label": label_entry, + "enc_slots": enc_slots_entry, + "natures": standard_entries['natures'], + "synchronize_target": synchronize_target_entry, + "hidden_power_types": standard_entries['hidden_power_types'], + "min_hidden_power": standard_entries['min_hidden_power'], + "min_ivs": standard_entries['min_ivs'], + "max_ivs": standard_entries['max_ivs'], + "min_item_deter": methodj_entries['min_item_deter'], + "max_item_deter": methodj_entries['max_item_deter'], + "ability": standard_entries['ability'], + "min_frame": standard_entries['min_frame'], + "max_frame": standard_entries['max_frame'], + "enc_rate": methodj_entries['enc_rate'], + "movement_rate": methodj_entries['movement_rate'], + "encounter_area": methodj_entries['encounter_area'], + "encounter_area_var": methodj_entries['encounter_area_var'], + "ignore_encounter_check": methodj_entries['ignore_encounter_check'], + "ignore_encounter_check_var": methodj_entries['ignore_encounter_check_var'], + "is_shiny": standard_entries['is_shiny'], + "is_shiny_var": standard_entries['is_shiny_var'], + "has_pokerus": standard_entries['has_pokerus'], + "has_pokerus_var": standard_entries['has_pokerus_var'], + "min_level_water": methodj_entries['min_level_water'], + "max_level_water": methodj_entries['max_level_water'], + "min_avail_level_water": methodj_entries['min_avail_level_water'], + "max_avail_level_water": methodj_entries['max_avail_level_water'] } queries.append(new_query) - fill_queries() def add_method_1(): - entry13 = tk.Entry(master) - entry13.insert(0, "Poke name :)") - - entry2 = tk.Entry(master) - entry2.insert(0, "Adamant/Modest") - - entry3 = tk.Entry(master) - entry3.insert(0, "Fire/Psychic") - - entry4 = tk.Entry(master) - entry4.insert(0, "60") - - entry5 = tk.Entry(master) - entry5.insert(0, "0/0/0/0/0/0") - - entry6 = tk.Entry(master) - entry6.insert(0, "31/31/31/31/31/31") - - entry9 = tk.Entry(master) - entry9.insert(0, 0) - - variable = tk.BooleanVar(master) - button = tk.Checkbutton(master, variable=variable) - - variable6 = tk.BooleanVar(master) - button6 = tk.Checkbutton(master, variable=variable6) - - entry10 = tk.Entry(master) - entry10.insert(0, 1000) - - entry11 = tk.Entry(master) - entry11.insert(0, 2000) + # Create label entry + label_entry = create_entry_with_default(master, DEFAULT_POKE_NAME) + + # Create standard entries common to both methods + standard_entries = create_standard_entries(master) new_query = { "type": "Method1", - "label": entry13, - "natures": entry2, - "hidden_power_types": entry3, - "min_hidden_power": entry4, - "min_ivs": entry5, - "max_ivs": entry6, - "ability": entry9, - "is_shiny": button, - "is_shiny_var": variable, - "has_pokerus": button6, - "has_pokerus_var": variable6, - "min_frame": entry10, - "max_frame": entry11 + "label": label_entry, + "natures": standard_entries['natures'], + "hidden_power_types": standard_entries['hidden_power_types'], + "min_hidden_power": standard_entries['min_hidden_power'], + "min_ivs": standard_entries['min_ivs'], + "max_ivs": standard_entries['max_ivs'], + "ability": standard_entries['ability'], + "is_shiny": standard_entries['is_shiny'], + "is_shiny_var": standard_entries['is_shiny_var'], + "has_pokerus": standard_entries['has_pokerus'], + "has_pokerus_var": standard_entries['has_pokerus_var'], + "min_frame": standard_entries['min_frame'], + "max_frame": standard_entries['max_frame'] } queries.append(new_query) - fill_queries() def add_pokerus(): - entry1 = tk.Entry(master) - entry1.insert(0, 0) - - entry2 = tk.Entry(master) - entry2.insert(0, 1000) + min_frame_entry = create_entry_with_default(master, 0) + max_frame_entry = create_entry_with_default(master, 1000) new_query = { "type": "PKRS", - "min_frame": entry1, - "max_frame": entry2 + "min_frame": min_frame_entry, + "max_frame": max_frame_entry } queries.append(new_query) - fill_queries() diff --git a/models/queries.py b/models/queries.py index 45e3fae..bbcf3d1 100644 --- a/models/queries.py +++ b/models/queries.py @@ -5,6 +5,21 @@ class VerifiableQuery: + def __init__(self): + # Common attributes shared by all query types + self.min_frame = 0 + self.max_frame = 0 + self.natures = [] + self.hidden_power_types = [] + self.min_hidden_power = 0 + self.min_ivs = [] + self.max_ivs = [] + self.ability = 0 + self.is_shiny = False + self.gives_pokerus = False + self.tid = 0 + self.sid = 0 + @abc.abstractmethod def verify_frames(self, seed_engine: PearlPlatSeedEngine) -> []: return @@ -12,8 +27,7 @@ def verify_frames(self, seed_engine: PearlPlatSeedEngine) -> []: class PKRS(VerifiableQuery): def __init__(self): - self.min_frame = 0 - self.max_frame = 0 + super().__init__() self.label = "PKRS" def verify_frames(self, seed_engine: PearlPlatSeedEngine): @@ -29,19 +43,8 @@ def verify_frames(self, seed_engine: PearlPlatSeedEngine): class Method1(VerifiableQuery): def __init__(self): - self.min_frame = 0 - self.max_frame = 0 - self.natures = [] - self.hidden_power_types = [] - self.min_hidden_power = 0 - self.min_ivs = [] - self.max_ivs = [] - self.ability = 0 - self.is_shiny = False - self.gives_pokerus = False + super().__init__() self.label = "Method1" - self.tid = 0 - self.sid = 0 def verify_frames(self, seed_engine: PearlPlatSeedEngine): good = False @@ -89,16 +92,8 @@ def verify_frames(self, seed_engine: PearlPlatSeedEngine): class MethodJ(VerifiableQuery): def __init__(self): - self.min_frame = 0 - self.max_frame = 0 - self.natures = [] - self.hidden_power_types = [] - self.min_hidden_power = 0 - self.min_ivs = [] - self.max_ivs = [] - self.ability = 0 - self.is_shiny = False - self.gives_pokerus = False + super().__init__() + # MethodJ-specific attributes self.enc_slots = [] self.min_item_deter = 0 self.max_item_deter = 100 @@ -113,8 +108,6 @@ def __init__(self): self.synchronize_target = [] self.synchronize_natures = [] self.label = "MethodJ" - self.tid = 0 - self.sid = 0 def verify_frames(self, seed_engine: PearlPlatSeedEngine): good = False