def _get_random_room_txt(self): from skytemple_randomizer.config import data_dir i = randrange(0, 1000) with open_utf8( os.path.join(data_dir(), 'fixed_floor_layouts', f'{i}.txt')) as f: return f.read().splitlines()
def check_done(): if not randomizer.is_done(): return True self.builder.get_object('progress_close').set_sensitive(True) if randomizer.error: img: Gtk.Image = self.builder.get_object('img_portrait_duskako') img.set_from_file(os.path.join(data_dir(), 'duskako_sad.png')) traceback_str = ''.join(traceback.format_exception(*randomizer.error)) progress_label.set_text(f"Error: {traceback_str}") progress_diag.set_title('Randomizing failed!') else: rom.saveToFile(out_fn) img: Gtk.Image = self.builder.get_object('img_portrait_duskako') img.set_from_file(os.path.join(data_dir(), 'duskako_happy.png')) progress_label.set_text("Randomizing complete!") progress_diag.set_title('Randomizing complete!') return False
def main(): path = os.path.abspath(os.path.dirname(__file__)) if sys.platform.startswith('win'): # Load theming under Windows _load_theme() # Solve issue #12 try: from skytemple_files.common.platform_utils.win import win_set_error_mode win_set_error_mode() except BaseException: # This really shouldn't fail, but it's not important enough to crash over pass if sys.platform.startswith('darwin'): # Load theming under macOS _load_theme() # The search path is wrong if SkyTemple is executed as an .app bundle if getattr(sys, 'frozen', False): path = os.path.dirname(sys.executable) itheme: Gtk.IconTheme = Gtk.IconTheme.get_default() itheme.append_search_path(os.path.abspath(icons())) itheme.append_search_path(os.path.abspath(os.path.join(data_dir(), "icons"))) itheme.rescan_if_needed() # Load CSS style_provider = Gtk.CssProvider() with open(os.path.join(path, "skytemple_randomizer.css"), 'rb') as f: css = f.read() style_provider.load_from_data(css) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) # Load Builder and Window builder = Gtk.Builder() builder.add_from_file(os.path.join(path, "skytemple_randomizer.glade")) main_window: Window = builder.get_object("main_window") main_window.set_role("SkyTemple Randomizer") GLib.set_application_name("SkyTemple Randomizer") GLib.set_prgname("skytemple_randomizer") # TODO: Deprecated but the only way to set the app title on GNOME...? main_window.set_wmclass("SkyTemple Randomizer", "SkyTemple Randomizer") # Load main window + controller MainController(builder, main_window) main_window.present() main_window.set_icon_name('skytemple_randomizer') Gtk.main()
def __init__(self, builder: Gtk.Builder, window: Window): self.builder = builder Global.main_builder = builder self.window: Window = window accel = Gtk.AccelGroup() accel.connect(Gdk.KEY_space, Gdk.ModifierType.CONTROL_MASK, 0, self.on_show_debug) self.window.add_accel_group(accel) self.builder.get_object('progress').add_accel_group(accel) self.static_config = Pmd2XmlReader.load_default('EoS_EU') # version doesn't really matter for this self.chosen_file = None # Load default configuration self.ui_applier = ConfigUIApplier(self.builder, self.static_config.dungeon_data.dungeons) self.ui_reader = ConfigUIReader(self.builder) self.ui_applier.apply(ConfigFileLoader.load(os.path.join(data_dir(), 'default.json'))) ConfigDocApplier(self.window, self.builder).apply() self.builder.connect_signals(self)
def get_default_config(self): with open(os.path.join(data_dir(), 'default.json')) as f: return f.read()
def on_randomize_clicked(self, *args): if self.chosen_file is None: self.display_error("Please choose an input file.") return dialog = Gtk.FileChooserNative.new( "Output ROM filename...", self.window, Gtk.FileChooserAction.SAVE, None, None ) filter_nds = Gtk.FileFilter() filter_nds.set_name("Nintendo DS ROMs (*.nds)") filter_nds.add_mime_type("application/x-nintendo-ds-rom") filter_nds.add_pattern("*.nds") dialog.add_filter(filter_nds) response = dialog.run() out_fn = dialog.get_filename() dialog.destroy() if response == Gtk.ResponseType.ACCEPT: clear_script_cache() if '.' not in out_fn: out_fn += '.nds' try: self.builder.get_object('progress_close').set_sensitive(False) progress_bar: Gtk.ProgressBar = self.builder.get_object('progress_bar') progress_label: Gtk.Label = self.builder.get_object('progress_label') progress_diag: Gtk.Dialog = self.builder.get_object('progress') progress_diag.set_title('Randomizing...') def update_fn(progress, desc): progress_bar.set_fraction((progress - 1) / randomizer.total_steps) if desc == Status.DONE_SPECIAL_STR: progress_label.set_text("Randomizing complete!") else: progress_label.set_text(f"{floor((progress - 1) / randomizer.total_steps * 100)}%: {desc}") def check_done(): if not randomizer.is_done(): return True self.builder.get_object('progress_close').set_sensitive(True) if randomizer.error: img: Gtk.Image = self.builder.get_object('img_portrait_duskako') img.set_from_file(os.path.join(data_dir(), 'duskako_sad.png')) traceback_str = ''.join(traceback.format_exception(*randomizer.error)) progress_label.set_text(f"Error: {traceback_str}") progress_diag.set_title('Randomizing failed!') else: rom.saveToFile(out_fn) img: Gtk.Image = self.builder.get_object('img_portrait_duskako') img.set_from_file(os.path.join(data_dir(), 'duskako_happy.png')) progress_label.set_text("Randomizing complete!") progress_diag.set_title('Randomizing complete!') return False rom = NintendoDSRom.fromFile(self.chosen_file) status = Status() status.subscribe(lambda a, b: GLib.idle_add(partial(update_fn, a, b))) config = self.ui_reader.read() # Set the seed seed = get_effective_seed(config['seed']) random.seed(seed) self.builder.get_object('seed_label').set_text('Your Seed: ' + str(seed)) randomizer = RandomizerThread(status, rom, config, seed) randomizer.start() # SHOW DIALOG img: Gtk.Image = self.builder.get_object('img_portrait_duskako') img.set_from_file(os.path.join(data_dir(), 'duskako_neutral.png')) GLib.timeout_add(100, check_done) progress_diag.run() except BaseException as ex: tb = traceback.format_exc() print(tb) self.display_error(f"Error: {ex}\n{tb}") return