Ejemplo n.º 1
0
 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()
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
 def get_default_config(self):
     with open(os.path.join(data_dir(), 'default.json')) as f:
         return f.read()
Ejemplo n.º 6
0
    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