class Animation(Composite): images = array(AnimImage) frames = array(Frame) def load_in_place(self, byte_array, pre_generate_images=False): Composite.load_in_place(self, byte_array) names_to_image = {} for anim_image in self.images: names_to_image[anim_image.name] = anim_image if pre_generate_images: window = tk.Toplevel() progress = ttk.Progressbar(window, orient=tk.HORIZONTAL, maximum=len(self.frames) - 1, length=200, mode='determinate') ttk.Label(window, text='Loading Animation', style='Title.TLabel').pack() progress.pack(expand=tk.YES, fill=tk.X, padx=(10, 10), pady=(0, 10)) for ind, frm in enumerate(self.frames): for drawn in frm.images: drawn.set_image(names_to_image[drawn.name]) if pre_generate_images: frm.pre_generate_images() progress.step(1) window.update() if pre_generate_images: window.destroy()
class Trainer(Composite): name = SaveableString animation = SaveableString before_convo = SaveableString after_convo = SaveableString lose_message = SaveableString playlist = SaveableString background_image = SaveableString sight_range = U8 peoplemon = array(Peoplemon) items = array(U16, U8) ai_type = U8 behavior = Behavior
class Options(Composite): line = SaveableString options = array(Option) def __str__(self): return '<Option> Line: {}, Options: {}'.format( self.line.get(), [option.line.get() for option in self.options])
class Peoplemon(Composite): id = U16 name = SaveableString description = SaveableString type = U8 special_ability_id = U8 base_stats = Stats valid_moves = array(AvailableMove) learn_moves = array(LearnMove) evolve_level = U8 evolve_id = U8 base_xp_yield = U16 xp_group = U8 ev_stats = Stats def __str__(self): return 'ID: {:^3} | Name: "{}" | Desc: {}'.format( self.id.get(), self.name.get(), self.description.get()[:20])
def __init__(self, parent=None): self.gui = ItemEditorGUI(parent) self.sort_connector = SortConnector(self.gui.items, self.gui.sort.combo, SORT_MAP) self.items = array(Item)() self.main_saveable = self.items self.item_connector = ArrayConnector(self.items, self.gui.items, self.gui.add_button, self.gui.id, self.gui.name, self.gui.price, self.gui.description) self.gui.items.signal_select.connect(self.on_select)
def __init__(self, parent=None): self.gui = MoveEditorGUI(parent) self.moves = array(Move)() self.main_saveable = self.moves self.sort_var = tk.StringVar(parent) self.sort_var.trace('w', lambda *args: self.gui.items.set_key(SORT_MAP[self.sort_var.get()])) self.sort_var.set('Move ID') self.gui.sort.combo.config(values=list(SORT_MAP.keys()), textvariable=self.sort_var) gui = self.gui self.item_connector = ArrayConnector(self.moves, self.gui.items, self.gui.add_button, gui.name, gui.id, gui.classification, gui.attack, gui.accuracy, gui.effect, gui.priority, gui.pp, gui.type, gui.chance, gui.intensity, gui.score, gui.attacker_anim, gui.defender_anim, gui.is_special, gui.targets_self, gui.description) self.gui.items.signal_select.connect(self.on_select)
class FollowPathBehavior(Composite): reverse_loop = U8 nodes = array(Node) def to_byte_array(self): data = bytearray() num_nodes = U8(len(self.nodes)) data += num_nodes.to_byte_array() data += self.reverse_loop.to_byte_array() for item in self.nodes: data += item.to_byte_array() return data def load_in_place(self, byte_array): num_nodes = U8 num_nodes.load_in_place(byte_array) self.reverse_loop.load_in_place(byte_array) self.nodes.clear() for i in range(num_nodes): self.nodes.append(Node.from_byte_array(byte_array))
def __init__(self, parent=None): self.gui = PeoplemonEditorGUI(parent) self.peoplemon_array = array(Peoplemon)() self.main_saveable = self.peoplemon_array gui = self.gui self.learn_move_connector = None self.available_move_connector = None self.item_connector = ArrayConnector( self.peoplemon_array, self.gui.items, self.gui.add_button, gui.description, gui.id, gui.name, gui.base_xp, gui.xp_group, gui.special_id, gui.type, gui.evolve_level, gui.evolve_id, gui.base_stats, gui.ev_stats, gui.learn_list, gui.learn_move_id, gui.learn_level, gui.available_list, gui.available_move_id, gui.add_available_button, gui.add_learn_move) self.gui.items.signal_select.connect(self.on_select) self.sort_connector = SortConnector(gui.items, gui.sort.combo, SORT_MAP) gui.learn_list.set_key(lambda learn: learn.learn_level.get()) gui.available_list.set_key(lambda move: move.get())
class Frame(Composite): RETURN_GET = True length = saveable_int('u32') images = array(DrawnImage) def __init__(self): Composite.__init__(self) self.length = 30 self.last_selected = None self.half_transparent_images = [] def pre_generate_images(self): for img in self.images: img.create_image() img.create_half_transparent() def draw(self, canvas): _ids = {} for ind, img in enumerate(self.images): img.level = ind _id = img.draw(canvas) _ids[_id] = img return _ids def pre_generate_half_transparent(self): for img in self.images: img.pre_generate_half_transparent() def draw_half_transparent(self, canvas): for img in self.images: img.draw_half_transparent(canvas) def copy(self): new = Frame() new.length = self.length for image in self.images: new.images.append(image.copy()) if self.last_selected: new.last_selected = new.images[self.images.index( self.last_selected)] return new
class TravelEditor: MapType = array(Location) def __init__(self, parent=None): self.gui = TravelEditorGUI(parent) self.maps = self.MapType() self.main_saveable = self.maps for entry in self.gui.entries: entry.state(('disabled', )) self.cur_selected = None self.array_connector = ArrayConnector(self.maps, self.gui.maps, self.gui.add_button, *self.gui.entries) self.gui.maps.signal_select.connect(self.select_override) self.gui.maps.set_key(lambda map: map.spawn_id.get()) def select_override(self, ind): if ind is not None: current = self.array_connector.cur_selection int_map = { self.gui.entry_x: current.x, self.gui.entry_y: current.y, self.gui.entry_spawn: current.spawn_id } str_map = { self.gui.entry_display: current.display_name, self.gui.entry_ref: current.reference_name, self.gui.entry_map: current.map_name } for entry, saveable in int_map.items(): entry.entry.config(textvariable=make_int_var(saveable)) for entry, saveable in str_map.items(): entry.entry.config(textvariable=make_str_var(saveable)) def pack(self, **kwargs): self.gui.pack(**kwargs)
class Bar(Composite): a = saveable_int('u32') b = array(saveable_int('u16')) c = SaveableString
class AnimationOld(Composite): texture = SaveableString images = array(AnimImageOld) frames = array(Frame)
class Bar(Union): a = U32 b = U16 c = SaveableString d = array(U32)
class FrameExport(Composite): length = saveable_int('u32') pieces = array(PieceExport)
class WildPeoplemon(Composite): id = U16 min_lvl = U16 max_lvl = U16 rarity = U16 overrides = array(Override)
class AnimationExport(Composite): texture = SaveableString loop = saveable_int('u8') frames = array(FrameExport)
class Playlist(array(Song)): pass