def test_frame_info(self) -> None: self.assertEqual(6, len(self.one.frame_info)) for i in range(0, 6): self.assertEqual(10, self.one.frame_info[i].duration_per_frame) self.assertEqual(0, self.one.frame_info[i].unk2) self.assertEqual(6, len(self.two.frame_info)) for i in range(0, 6): if i in (0, 1, 4, 5): self.assertEqual(5, self.two.frame_info[i].duration_per_frame) else: self.assertEqual(10, self.two.frame_info[i].duration_per_frame) self.assertEqual(0, self.two.frame_info[i].unk2) self.one.frame_info[0].duration_per_frame = u16(1) self.one.frame_info[1].duration_per_frame = u16(2) self.one.frame_info[2].duration_per_frame = u16(3) self.one.frame_info[3].duration_per_frame = u16(4) saved = self._save_and_reload_main_fixture(self.one) for i in range(0, 6): self.assertEqual(0, saved.frame_info[i].unk2) self.assertEqual(1, saved.frame_info[0].duration_per_frame) self.assertEqual(2, saved.frame_info[1].duration_per_frame) self.assertEqual(3, saved.frame_info[2].duration_per_frame) self.assertEqual(4, saved.frame_info[3].duration_per_frame) self.assertEqual(10, saved.frame_info[4].duration_per_frame) self.assertEqual(10, saved.frame_info[5].duration_per_frame)
def kind(self) -> Pmd2ScriptEntity: kind_id = self.emu_thread.emu.memory.unsigned.read_short(self.pnt + 0x02) try: return self.rom_data.script_data.level_entities__by_id[kind_id] except KeyError: return Pmd2ScriptEntity(u16(kind_id), u16(0), 'UNKNOWN', u16(0), u16(0), u16(0))
def kind(self) -> Pmd2ScriptObject: kind_id = self.emu_thread.emu.memory.unsigned.read_short(self.pnt + 0x06) try: return self.rom_data.script_data.objects__by_id[kind_id] except KeyError: return Pmd2ScriptObject(u16(kind_id), u16(0), u16(0), u8(0), 'UNKNOWN')
def _regenerate_wtu(self): wtu_store: Gtk.ListStore = self.builder.get_object('wtu_store') assert self.wtu is not None self.wtu.entries = [] for row in wtu_store: self.wtu.entries.append( WtuEntry(u16(int(row[0])), u16(int(row[1])), u16(int(row[2])), u16(int(row[3])))) self.module.mark_wte_as_modified(self.item, self.wte, self.wtu)
def on_btn_add_clicked(self, *args): self._list_store.append([len(self._list.list), "NULL", 0, 0, 0, False]) self._list.list.append( Pmd2ScriptObject(id=u16(len(self._list.list)), unk1=u16(0), unk2=u16(0), unk3=u8(0), name="NULL")) self.module.mark_objects_as_modified()
def _rebuild_level_up(self): store: Gtk.ListStore = self.builder.get_object('level_up_store') learn_set = self._waza_p.learnsets[self.item_id] learn_set.level_up_moves = [] for row in store: learn_set.level_up_moves.append( LevelUpMove(u16(int(row[1])), u16(int(row[0])))) learn_set.level_up_moves.sort(key=lambda l: l.level_id) self.queue_render_graph() self._mark_moves_as_modified()
def __init__(self, scriptdata: Pmd2ScriptData, actor_id: u16, pos: SsaPosition, script_id: i16, unkE: i16): try: self.actor = scriptdata.level_entities__by_id[actor_id] except KeyError: logger.warning(f"Unknown actor id: {actor_id}") self.actor = Pmd2ScriptEntity(actor_id, u16(0), 'UNKNOWN', u16(0), u16(0), u16(0)) self.pos = pos self.script_id = script_id self.unkE = unkE
def __init__(self, scriptdata: Pmd2ScriptData, object_id: u16, htibox_w: i16, hitbox_h: i16, pos: SsaPosition, script_id: i16, unk12: i16): try: self.object = scriptdata.objects__by_id[object_id] except KeyError: logger.warning(f"Unknown object id: {object_id}") self.object = Pmd2ScriptObject(object_id, u16(0), u16(0), u8(0), 'UNKNOWN') self.hitbox_w = htibox_w self.hitbox_h = hitbox_h self.pos = pos self.script_id = script_id self.unk12 = unk12
def on_list_store_row_changed(self, store, path, l_iter): """Propagate changes to list store entries to the lists.""" if self._loading: return a_id, level, location_id, ent_icon, entid, location_name, ent_name = store[ path][:] a_id = int(a_id) self._species[a_id] = u16(int(entid)) self._levels[a_id] = u16(int(level)) self._locations[a_id] = u8(int(location_id)) logger.debug( f"Updated list entry {a_id}: {entid}, {level}, {location_id}") self.module.set_recruitment_list(self._species, self._levels, self._locations)
def refresh_list(self): tree: Gtk.TreeView = self.builder.get_object('actor_tree') self._list_store: Gtk.ListStore = tree.get_model() self._list_store.clear() # Iterate list for idx, entry in enumerate(self._list.list): # If the entid is NOT 0 we will edit the value of entid entid_to_edit = entry.entid force_placeholder = False if entid_to_edit <= 0: force_placeholder = True # Otherwise we will edit the placeholder for this entry in the table. entid_to_edit = u16(1) standins = self._sprite_provider.get_standin_entities() if idx in standins: entid_to_edit = standins[idx] self._list_store.append([ str(idx), entry.name, str(entry.type), self._get_icon(entid_to_edit, idx, force_placeholder), entid_to_edit, str(entry.unk3), str(entry.unk4), self._ent_names[entid_to_edit], ORANGE if force_placeholder else None ])
def to_mappa(self): data = bytearray(8) write_u16(data, u16(self.level * LEVEL_MULTIPLIER), 0x00) write_u16(data, self.weight, 0x02) write_u16(data, self.weight2, 0x04) write_u16(data, self.md_index, 0x06) return data
def test_metadata(self) -> None: self.assertEqual(6, self.one.number_of_frames) self.assertEqual(12, self.one.number_of_tiles) self.assertEqual([bytearray(b'\x88\x88DH\x84DB\x14FDH\x14F\x84$\x14dHB\x12\x86H"\x12\x86DBd\x86D\x84\x18'), bytearray(b'A\xdd\xda\x00c\xd4\xdd\x00k\xd4\xad\x00\x1b\xd2\xad\x00\xbb\xde\xad\x00\xbb\xe5\xdd\x00\xbb\xe4\xad\x00\xb3\xd8\xae\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'a\x86\x88hf\x88D\x16f\x86\x841fa\x16\xb1fa\x113f\x11c\xccXQS\xc5D1\xb3\xbc'), bytearray(b'\xbb\xd4\xae\x00\xb3\xa5J\x00\xbbE$\x00\xbcA\x82\x00\xcc\x81\x88\x00\xbbch\x00\\\x11f\x00\xcc\x13a\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x86\x16\xb1\xcb\xa4b\xb1\xcc\x88\x12\xc5\xcbF"\xc5\xcc\x84"\xcb\\BfS;\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\xcb\x1b\x11\x00\xbck\x11\x00\xbc\x13\x16\x00\x15\x16\x16\x00\x11aa\x00\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x88\x88\x84\x84\x84D\x82\x84FDHVF\x84\x84\xb5dH\x82\xb5\x86H"\x12\x86DBT\x86D\x84X'), bytearray(b'\xa8\xda\xdd\x00\xa8\xda\xdd\x00\x81\xaa\xae\x00\x81\xaa\xad\x00\x81\xaa\xad\x00\xbb\xe5\xdd\x00\xb5\xe4\xad\x00\x9f\xd8\xae\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'a\x86\x88Uf\x88D\xbbf\x86\x84\xbbfa\x16\xfffa\x11\xfbf\x11\xf3\x9fXQ\xf3\x99D1\xf3\x99'), bytearray(b'\xf9\xd9\xae\x00\x99\xafJ\x00\x99I$\x00\x9fO\x82\x00\x9f\x89\x88\x00\x99oh\x00\x99\x1ff\x00\xfb\x1ca\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x86\x16\xb1\xfc\xa4b\xb1\xfb\x88\x12\xf5\xfbF"\xb5\xff\x84"\xbb\xbfBfS;\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\xff\x1b\x11\x00\xcbk\x11\x00\xbc\x13\x16\x00\x1b\x16\x16\x00\x11aa\x00\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x88\x88\x84\x84\x84D\x82\x84FDHVF\x84\x84\xb5dH\x82\xb5\x86H"\x12\x86DBT\x86D\x84X'), bytearray(b'\xa8\xda\xdd\x00\xa8\xda\xdd\x00\x81\xaa\xae\x00\x81\xaa\xad\x00\x81\xaa\xad\x00\xbb\xe5\xdd\x00\xb5\xe4\xad\x00\x9f\xd8\xae\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'a\x86\x88Uf\x88D\xbbf\x86\x84\xbbfa\x16\xfffa\x11\xfbf\x11\xf3\x9fXQ\xf3\x99D1\xf3\x99'), bytearray(b'\xf9\xd9\xae\x00\x99\xafJ\x00\x99I$\x00\x9fO\x82\x00\x9f\x89\x88\x00\x99oh\x00\x99\x1ff\x00\xfb\x1ca\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x86\x16\xb1\xfc\xa4b\xb1\xfb\x88\x12\xf5\xfbF"\xb5\xff\x84"\xbb\xbfBfS;\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\xff\x1b\x11\x00\xcbk\x11\x00\xbc\x13\x16\x00\x1b\x16\x16\x00\x11aa\x00\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x88\x88\x88\x88\x88\x88\x84\x84\x84D\x88\x84DBDVDB\x84\xb5\x88(\xb2\x9bH*XUD"8\xf5'), bytearray(b'\xa4\xdd~\x00\xa4\xed\xde\x00\xa8\xda\xdd\x00\x81\xaa\xde\x00\x81\xaa\xdd\x00e\xed\xaa\x00_\xe6\xdd\x00\xb9\xd3\xad\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'H\x86Q\x95\x88\x18\xb5\x9b\x86\x16\xb3\x9bfQ\xf5\xff\x11\xb6\xbb\xff1S\xff\x99\x13\xfb\x9f\x99\x11\xb3\x9f\xb9'), bytearray(b'\x9f\xab\xae\x00\xf9OM\x00\x99k"\x00\xf9;H\x00\x99?f\x00\xf9\x1bf\x00\xf9[\x16\x00\xcf?c\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'h\xb3\xcb\xff\x8aQ\xbb\xbf\x8aQ\xbf\xcf"V\xfb\xbfD\x14\xfb;\x84\x18S3\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\xbf\x15a\x00\xbc\x15\x81\x00\x1bch\x00\x1baf\x00\x111\x11\x00\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x88\x88\x84\x84\x84D\x82\x84FDHVF\x84\x84\xb5dH\x82\xb5\x86H"\x12\x86DBT\x86D\x84X'), bytearray(b'\xa8\xda\xdd\x00\xa8\xda\xdd\x00\x81\xaa\xae\x00\x81\xaa\xad\x00\x81\xaa\xad\x00\xbb\xe5\xdd\x00\xb5\xe4\xad\x00\x9f\xd8\xae\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'a\x86\x88Uf\x88D\xbbf\x86\x84\xbbfa\x16\xfffa\x11\xfbf\x11\xf3\x9fXQ\xf3\x99D1\xf3\x99'), bytearray(b'\xf9\xd9\xae\x00\x99\xafJ\x00\x99I$\x00\x9fO\x82\x00\x9f\x89\x88\x00\x99oh\x00\x99\x1ff\x00\xfb\x1ca\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x86\x16\xb1\xfc\xa4b\xb1\xfb\x88\x12\xf5\xfbF"\xb5\xff\x84"\xbb\xbfBfS;\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\xff\x1b\x11\x00\xcbk\x11\x00\xbc\x13\x16\x00\x1b\x16\x16\x00\x11aa\x00\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x88\x88DH\x84DB\x14FDH\x14F\x84$\x14dHB\x12\x86H"\x12\x86DBd\x86D\x84\x18'), bytearray(b'A\xdd\xda\x00c\xd4\xdd\x00k\xd4\xad\x00\x1b\xd2\xad\x00\xbb\xde\xad\x00\xbb\xe5\xdd\x00\xbb\xe4\xad\x00\xb3\xd8\xae\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'a\x86\x88hf\x88D\x16f\x86\x841fa\x16\xb1fa\x113f\x11c\xccXQS\xc5D1\xb3\xbc'), bytearray(b'\xbb\xd4\xae\x00\xb3\xa5J\x00\xbbE$\x00\xbcA\x82\x00\xcc\x81\x88\x00\xbbch\x00\\\x11f\x00\xcc\x13a\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x86\x16\xb1\xcb\xa4b\xb1\xcc\x88\x12\xc5\xcbF"\xc5\xcc\x84"\xcb\\BfS;\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\xcb\x1b\x11\x00\xbck\x11\x00\xbc\x13\x16\x00\x15\x16\x16\x00\x11aa\x00\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')], self.one.tiles) self.assertEqual(6, self.two.number_of_frames) self.assertEqual(12, self.two.number_of_tiles) self.assertEqual([bytearray(b'\xaa\xbb\xba\xaa*\xaa\xaa\xab\xba\xba\xba:\xba\xab\xab\xba\xaa\xbb\xaa;*\xba\xaa\xbb\xa2\xa3\xb3\xb3\xa3\xaa\xab:'), bytearray(b'\xa3\xaa\xaa\xba;\xaa\xbb\xbb\xbb\xab\xbb3\xbb3\xba\xa3;\xbb\xa3\xab\xbb3;237#\xa23;#\xac'), bytearray(b'wwwwwwwwwwwwwwwwwwwwwwwwswwwswww'), bytearray(b'\xba\xaa\xa3:\xaa\xab\xba\xa3\xaa*\xaa\xba\xbb\xaa\xaa\xba\xab+\xaa\xba\xab\xba\xaa\xa2\xbb\xab\xab\xaa3\xbb\xaa\xaa'), bytearray(b'\xb3s#,;7\'\xcc;w\'\xcc37\xa3\xcc3\xb3+\xc2\xba\xbb\xab\xcc\xbb3*\xc2\xba\xb3"\xcc'), bytearray(b'wwwwwww7uw\xb77sw73{w\xb3\xbbsw\xaa\xbbu7\xbb\xbb5s\xa3\xba'), bytearray(b'3\xbb\xab\xaaw:\xab\xaa;\xbb\xa3\xaaw\xba\xbb[s333z7;\xbawS\xaass\xa3\xaa\xbb'), bytearray(b'\xa2*\xc2\xcc\xa2""\xcc"\xa2\xcc\xccRR\xc5\\"\xc2\xcc\xcc*\xc2\xcc\xcc\xa7\xc2\xcc\xcc\'\xc5\xcc\xcc'), bytearray(b'2\xb7\xaa\xaa\xb2\xbb\xaa\xaa\xa2\xab+\xaa"\xaa\xaa\xaa"\xa2"\xaa,"\xaa\xa2\xac"\xa2""*\xaa\xa2'), bytearray(b'3\xba7:;w;\xb3{w7733ws;3s\xba\xaa\xaa\xba\xa5\xa5\xaa\xa5\xaaUUZ\xaa'), bytearray(b'w\xc5\xcc%w\xcc\\"\xaaR,"*""""""""""""\xa2","""\xc2'), bytearray(b'**\xa2\xaa\xa2\xa2\xaa*""""*""""\xc2""\xc2\xcc""",,"""""'), bytearray(b'\xaa\xbb\xba\xaa*\xaa\xaa\xab\xba\xba\xba:\xba\xab\xab\xba\xaa\xbb\xaa;*\xba\xaa\xbb\xa2\xa3\xb3\xb3\xa3\xaa\xab:'), bytearray(b'\xa3\xaa\xaa\xba;\xaa\xbb\xbb\xbb\xab\xbb3\xbb3\xba\xa3;\xbb\xb3;\xbb\xb3\xb3{3\xb7\xb3{3;Z\xb2'), bytearray(b'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww'), bytearray(b'\xba\xaa\xa3:\xaa\xab\xba\xa3\xaa*\xaa\xba\xbb\xaa\xaa\xba\xab+\xaa\xba\xab\xba\xaa\xa2\xbb\xab\xab\xaa3\xbb\xaa\xaa'), bytearray(b"\xb3\xb3\xc5\xb2;\xb7\xc5\xb2;w\'\xcc37S\xc53\xb3[\xcc\xba\xbbU\xcc\xbb3\xcc\xcc\xba\xb3\xcc\xcc"), bytearray(b'wwwwwww7uw\xb77sw73{w\xb3\xbb|w\xaa\xbb|7\xbb\xbb<s\xa3\xba'), bytearray(b'3\xbb\xab\xaaw:\xab\xaa;\xbb\xa3\xaaw\xba\xbb[s333z7;\xbawS\xaass\xa3\xaa\xbb'), bytearray(b'\xa2*\xcc\xcc\xa2"\xcc\xcc"\xc2\xcc\xccR\xc2\xcc\xcc"\xc2\xcc\xcc*\xc2\xcc\xcc\xa7\xc2\xcc\xcc\'\xc5\xcc\xcc'), bytearray(b'<\xb7\xaa\xaa\xbc\xbb\xaa\xaa\xac\xab+\xaa,\xaa\xaa\xaa,\xa2"\xaa,"\xaa\xa2\xac"\xa2""*\xaa\xa2'), bytearray(b'3\xba7:;w;\xb3{w7733ws;3s\xba\xaa\xaa\xba\xa5\xa5\xaa\xa5\xaaUUZ\xaa'), bytearray(b'w\xc5\xcc,w\xcc\xcc"\xaaR,"*""""""""""""\xa2","""\xc2'), bytearray(b'**\xa2\xaa\xa2\xa2\xaa*""""*""""\xc2""\xc2\xcc""",,"""""'), bytearray(b'\xaa\xbb\xba\xaa*\xaa\xaa\xab\xba\xba\xba:\xba\xab\xab\xba\xaa\xbb\xaa;*\xba\xaa\xbb\xa2\xa3\xb3\xb3\xa3\xaa\xab:'), bytearray(b'\xa3\xaa\xaa\xba;\xaa\xbb\xbb\xbb\xab\xbb3\xbb3\xba\xa3;\xbb\xb3;\xbb3;;373\xbb3;#\xac'), bytearray(b'wwwwwwwwwwwwwwwwwwwwwwwwwwwwswww'), bytearray(b'\xba\xaa\xa3:\xaa\xab\xba\xa3\xaa*\xaa\xba\xbb\xaa\xaa\xba\xab+\xaa\xba\xab\xba\xaa\xa2\xbb\xab\xab\xaa3\xbb\xaa\xaa'), bytearray(b'\xb3s\xa3%;7[,;w\xcc\\3\xb7U\xc53\xb3R\xcc\xba+U\xcc\xbbR\xcc\xcc\xaa"\xcc\xcc'), bytearray(b'{www{ww7zw\xb77\xa5w73,w\xb3\xbb\xccw\xaa\xbb\xcc3\xbb\xbb\xccz\xa3\xba'), bytearray(b'3\xbb\xab\xaaw:\xab\xaa;\xbb\xa3\xaaw\xba\xbb+s33#z7;\xbawS\xaass\xa3\xaa\xbb'), bytearray(b'"U\xcc\xcc\xa2\xcc\xcc\xcc"\xc5\xcc\xcc\xc2\xcc\xcc\xcc"\xcc\xcc\xcc*\xcc\xcc\xcc+\xc5\xcc\xcc+\xc5\xcc\xcc'), bytearray(b'\xcc\xb2\xaa\xaa\xcc\xb2\xaa\xaa\xcc\xa2+\xaa\xcc\xa5\xaa\xaa\xcc""\xaa\\"\xaa\xa2\\"\xa2""*\xaa\xa2'), bytearray(b'3\xba7:;w;\xb3{w7733ws;3s\xba\xaa\xaa\xba\xa5\xa5\xaa\xa5\xaaUUZ\xaa'), bytearray(b'\xa7\xc5\xcc\xccw\xc2\xcc"\xaa"%"*""""""""""""\xa2","""\xc2'), bytearray(b'**\xa2\xaa\xa2\xa2\xaa*""""*""""\xc2""\xc2\xcc""",,"""""'), bytearray(b'\xaa\xbb\xba\xaa*\xaa\xaa\xab\xba\xba\xba:\xba\xab\xab\xba\xaa\xbb\xaa;*\xba\xaa\xbb\xa2\xa3\xb3\xb3\xa3\xaa\xab:'), bytearray(b'\xa3\xaa\xaa\xba;\xaa\xbb\xbb\xbb\xab\xbb3\xbb3\xba\xa3;\xbb\xb3;\xbb3;;373\xbb3;#\xac'), bytearray(b'wwwwwwwwwwwwwwwwwwwwwwwwwwwwswww'), bytearray(b'\xba\xaa\xa3:\xaa\xab\xba\xa3\xaa*\xaa\xba\xbb\xaa\xaa\xba\xab+\xaa\xba\xab\xba\xaa\xa2\xbb\xab\xab\xaa3\xbb\xaa\xaa'), bytearray(b'\xb3s\xa3%;7[,;w\xcc\\3\xb7U\xc53\xb3R\xcc\xba+U\xcc\xbbR\xcc\xcc\xaa"\xcc\xcc'), bytearray(b'{www{ww7zw\xb77\xa5w73,w\xb3\xbb\xccw\xaa\xbb\xcc3\xbb\xbb\xccz\xa3\xba'), bytearray(b'3\xbb\xab\xaaw:\xab\xaa;\xbb\xa3\xaaw\xba\xbb+s33#z7;\xbawS\xaass\xa3\xaa\xbb'), bytearray(b'"U\xcc\xcc\xa2\xcc\xcc\xcc"\xc5\xcc\xcc\xc2\xcc\xcc\xcc"\xcc\xcc\xcc*\xcc\xcc\xcc+\xc5\xcc\xcc+\xc5\xcc\xcc'), bytearray(b'\xcc\xb2\xaa\xaa\xcc\xb2\xaa\xaa\xcc\xa2+\xaa\xcc\xa5\xaa\xaa\xcc""\xaa\\"\xaa\xa2\\"\xa2""*\xaa\xa2'), bytearray(b'3\xba7:;w;\xb3{w7733ws;3s\xba\xaa\xaa\xba\xa5\xa5\xaa\xa5\xaaUUZ\xaa'), bytearray(b'\xa7\xc5\xcc\xccw\xc2\xcc"\xaa"%"*""""""""""""\xa2","""\xc2'), bytearray(b'**\xa2\xaa\xa2\xa2\xaa*""""*""""\xc2""\xc2\xcc""",,"""""'), bytearray(b'\xaa\xbb\xba\xaa*\xaa\xaa\xab\xba\xba\xba:\xba\xab\xab\xba\xaa\xbb\xaa;*\xba\xaa\xbb\xa2\xa3\xb3\xb3\xa3\xaa\xab:'), bytearray(b'\xa3\xaa\xaa\xba;\xaa\xbb\xbb\xbb\xab\xbb3\xbb3\xba\xa3;\xbb\xb3;\xbb\xb3\xb3{3\xb7\xb3{3;Z\xb2'), bytearray(b'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww'), bytearray(b'\xba\xaa\xa3:\xaa\xab\xba\xa3\xaa*\xaa\xba\xbb\xaa\xaa\xba\xab+\xaa\xba\xab\xba\xaa\xa2\xbb\xab\xab\xaa3\xbb\xaa\xaa'), bytearray(b"\xb3\xb3\xc5\xb2;\xb7\xc5\xb2;w\'\xcc37S\xc53\xb3[\xcc\xba\xbbU\xcc\xbb3\xcc\xcc\xba\xb3\xcc\xcc"), bytearray(b'wwwwwww7uw\xb77sw73{w\xb3\xbb|w\xaa\xbb|7\xbb\xbb<s\xa3\xba'), bytearray(b'3\xbb\xab\xaaw:\xab\xaa;\xbb\xa3\xaaw\xba\xbb[s333z7;\xbawS\xaass\xa3\xaa\xbb'), bytearray(b'\xa2*\xcc\xcc\xa2"\xcc\xcc"\xc2\xcc\xccR\xc2\xcc\xcc"\xc2\xcc\xcc*\xc2\xcc\xcc\xa7\xc2\xcc\xcc\'\xc5\xcc\xcc'), bytearray(b'<\xb7\xaa\xaa\xbc\xbb\xaa\xaa\xac\xab+\xaa,\xaa\xaa\xaa,\xa2"\xaa,"\xaa\xa2\xac"\xa2""*\xaa\xa2'), bytearray(b'3\xba7:;w;\xb3{w7733ws;3s\xba\xaa\xaa\xba\xa5\xa5\xaa\xa5\xaaUUZ\xaa'), bytearray(b'w\xc5\xcc,w\xcc\xcc"\xaaR,"*""""""""""""\xa2","""\xc2'), bytearray(b'**\xa2\xaa\xa2\xa2\xaa*""""*""""\xc2""\xc2\xcc""",,"""""'), bytearray(b'\xaa\xbb\xba\xaa*\xaa\xaa\xab\xba\xba\xba:\xba\xab\xab\xba\xaa\xbb\xaa;*\xba\xaa\xbb\xa2\xa3\xb3\xb3\xa3\xaa\xab:'), bytearray(b'\xa3\xaa\xaa\xba;\xaa\xbb\xbb\xbb\xab\xbb3\xbb3\xba\xa3;\xbb\xa3\xab\xbb3;237#\xa23;#\xac'), bytearray(b'wwwwwwwwwwwwwwwwwwwwwwwwswwwswww'), bytearray(b'\xba\xaa\xa3:\xaa\xab\xba\xa3\xaa*\xaa\xba\xbb\xaa\xaa\xba\xab+\xaa\xba\xab\xba\xaa\xa2\xbb\xab\xab\xaa3\xbb\xaa\xaa'), bytearray(b'\xb3s#,;7\'\xcc;w\'\xcc37\xa3\xcc3\xb3+\xc2\xba\xbb\xab\xcc\xbb3*\xc2\xba\xb3"\xcc'), bytearray(b'wwwwwww7uw\xb77sw73{w\xb3\xbbsw\xaa\xbbu7\xbb\xbb5s\xa3\xba'), bytearray(b'3\xbb\xab\xaaw:\xab\xaa;\xbb\xa3\xaaw\xba\xbb[s333z7;\xbawS\xaass\xa3\xaa\xbb'), bytearray(b'\xa2*\xc2\xcc\xa2""\xcc"\xa2\xcc\xccRR\xc5\\"\xc2\xcc\xcc*\xc2\xcc\xcc\xa7\xc2\xcc\xcc\'\xc5\xcc\xcc'), bytearray(b'2\xb7\xaa\xaa\xb2\xbb\xaa\xaa\xa2\xab+\xaa"\xaa\xaa\xaa"\xa2"\xaa,"\xaa\xa2\xac"\xa2""*\xaa\xa2'), bytearray(b'3\xba7:;w;\xb3{w7733ws;3s\xba\xaa\xaa\xba\xa5\xa5\xaa\xa5\xaaUUZ\xaa'), bytearray(b'w\xc5\xcc%w\xcc\\"\xaaR,"*""""""""""""\xa2","""\xc2'), bytearray(b'**\xa2\xaa\xa2\xa2\xaa*""""*""""\xc2""\xc2\xcc""",,"""""')], self.two.tiles) self.one.number_of_frames = u16(2) self.one.frame_info = self.one.frame_info[:2] self.one.number_of_tiles = u16(3) tiles = [bytearray(32)] * 6 self.one.tiles = list(tiles) saved = self._save_and_reload_main_fixture(self.one) self.assertEqual(2, saved.number_of_frames) self.assertEqual(3, saved.number_of_tiles) self.assertEqual(tiles, saved.tiles)
def on_btn_add_clicked(self, *args): idx = len(self._list.list) self._list_store.append([ str(idx), "NEW", str(0), self._get_icon(1, idx, False), 1, str(0), str(0), self._ent_names[1], None ]) self._list.list.append( Pmd2ScriptEntity(id=u16(idx), type=u16(0), entid=u16(1), name="NEW", unk3=u16(0), unk4=u16(0))) self.module.mark_actors_as_modified()
def read_u16(data: ByteReadable, start: int = 0, *, big_endian: bool = False) -> u16: """Returns an unsigned 16-bit integer from the bytes-like object at the given position.""" return u16( int.from_bytes(data[start:(start + 2)], byteorder='big' if big_endian else 'little', signed=False))
def palette(self) -> bytes: data = bytearray(len(self._palette) // 3 * ICON_PAL_CNT // 2) cursor = 0 for (r, g, b) in chunks(self._palette, 3): r //= 8 g = (g // 8) << 5 b = (b // 8) << 10 write_u16(data, u16(r + g + b), cursor) cursor += 2 return data
def on_list_store_row_changed(self, store, path, l_iter): """Propagate changes to list store entries to the lists.""" if self._loading: return a_id, level, location_id, ent_icon, entid, location_name, ent_name, \ move1, move2, move3, move4, unk_e, iq, unk12 = store[path][:] a_id = int(a_id) self._list[a_id] = SpecialEpisodePc( u16(int(entid)), u16(int(location_id)), u16(self._get_move_id_from_display_name(move1)), u16(self._get_move_id_from_display_name(move2)), u16(self._get_move_id_from_display_name(move3)), u16(self._get_move_id_from_display_name(move4)), int(unk_e) > 0, u16(int(level)), u16(int(iq)), u16(int(unk12))) self.module.set_special_pcs(self._list)
def nds_crc16(data: bytes, offset: int, length: int) -> u16: val = [0xC0C1, 0xC181, 0xC301, 0xC601, 0xCC01, 0xD801, 0xF001, 0xA001] crc = 0xFFFF for i in range(offset, offset + length): crc = crc ^ data[i] for j in range(0, 8): carry = crc & 1 crc = crc >> 1 if carry: crc = crc ^ (val[j] << (7 - j)) return u16(crc)
def _rebuild_stats(self): assert self._level_bin_entry is not None store: Gtk.ListStore = self.builder.get_object('stats_store') for row in store: level, exp, hp, atk, sp_atk, defense, sp_def = (int(x) for x in row) level_entry = self._level_bin_entry.levels[level - 1] level_entry.experience_required = i32(exp) level_entry.hp_growth = u16(hp) level_entry.attack_growth = u8(atk) level_entry.special_attack_growth = u8(sp_atk) level_entry.defense_growth = u8(defense) level_entry.special_defense_growth = u8(sp_def) self.queue_render_graph() self._mark_stats_as_modified()
def on_btn_fix_nb_items_clicked(self, *args): md = SkyTempleMessageDialog( MainController.window(), Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, _("""This will change the number of moves to 559, in case there isn't enough moves in the list. used to fix the previous amount of move effects extracted by the previous versions of the patch.""" ), title=_("Fix Number of Moves")) md.run() md.destroy() while self.move_effects.nb_items() < 559: self.move_effects.add_item_effect_id(u16(0)) self.module.mark_move_effects_as_modified() self._init_move_list()
def run(self): """Run the dialog and return the response. If it's OK, the new model can be retrieved via get_event()""" self.window.set_title(self.title) # Fill Script IDs Combobox script_store = Gtk.ListStore(int, str) # ID, name script_store.append([-1, _('None')]) for sid, sname in self.talk_script_names.items(): script_store.append([sid, sname]) script_cb: Gtk.ComboBox = self.builder.get_object('event_script') script_cb.clear() self._fast_set_comboxbox_store(script_cb, script_store, 1) # Set Script IDs Combobox if self.edit: self._select_in_combobox_where_callback( script_cb, lambda r: self.edit.script_id == r[0]) # type: ignore else: script_cb.set_active_iter(script_store.get_iter_first()) # Fill Coroutine Combobox routine_store = Gtk.ListStore(int, str) # ID, name for routine in self.scriptdata.common_routine_info__by_id: routine_store.append([routine.id, routine.name]) routine_cb: Gtk.ComboBox = self.builder.get_object('event_coroutine') routine_cb.clear() self._fast_set_comboxbox_store(routine_cb, routine_store, 1) # Set Coroutine Combobox if self.edit: self._select_in_combobox_where_callback( routine_cb, lambda r: self.edit.coroutine.id == r[0]) # type: ignore else: routine_cb.set_active_iter(routine_store.get_iter_first()) # Clear / Set Unk2 if self.edit: self.builder.get_object('event_unk2').set_text(str(self.edit.unk2)) else: self.builder.get_object('event_unk2').set_text("") # Clear / Set Unk3 if self.edit: self.builder.get_object('event_unk3').set_text(str(self.edit.unk3)) else: self.builder.get_object('event_unk3').set_text("") response = self.window.run() self.window.hide() if response == Gtk.ResponseType.OK: script_id = script_store[script_cb.get_active_iter()][0] coroutine_id = routine_store[routine_cb.get_active_iter()][0] try: unk2 = u16_checked( int(self.builder.get_object('event_unk2').get_text())) except (ValueError, OverflowError): unk2 = u16(0) try: unk3 = u16_checked( int(self.builder.get_object('event_unk3').get_text())) except (ValueError, OverflowError): unk3 = u16(0) self.new_model = SsaTrigger(self.scriptdata, coroutine_id, unk2, unk3, script_id) return response
def on_men_palettes_ani_settings_activate(self): dialog: Gtk.Dialog = self.parent.builder.get_object( 'dialog_palettes_animated_settings') dialog.set_attached_to(MainController.window()) dialog.set_transient_for(MainController.window()) self.parent.builder.get_object( 'palette_animation11_enabled').set_active( self.parent.dpla.has_for_palette(0)) self.parent.builder.get_object( 'palette_animation12_enabled').set_active( self.parent.dpla.has_for_palette(1)) for aidx, offset in (11, 0), (12, 16): for cidx in range(0, 16): self.parent.builder.get_object( f'palette_animation{aidx}_frame_time{cidx}').set_text( str(self.parent.dpla.durations_per_frame_for_colors[ offset + cidx])) response = dialog.run() dialog.hide() if response == Gtk.ResponseType.OK: had_errors = False for palid, aidx, offset in ((0, 11, 0), (1, 12, 16)): if self.parent.builder.get_object( f'palette_animation{aidx}_enabled').get_active(): # Has palette animations! self.parent.dpla.enable_for_palette(palid) else: # Doesn't have self.parent.dpla.disable_for_palette(palid) for cidx in range(0, 16): try: time = u16_checked( int( self.parent.builder.get_object( f'palette_animation{aidx}_frame_time{cidx}' ).get_text())) except: time = u16(0) had_errors = True self.parent.dpla.durations_per_frame_for_colors[ offset + cidx] = time if had_errors: md = SkyTempleMessageDialog( MainController.window(), Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, _("Some values were invalid (not a number). " "They were replaced with 0."), title=_("Warning!")) md.set_position(Gtk.WindowPosition.CENTER) md.run() md.destroy() self.parent.reload_all() self.parent.mark_as_modified()
def on_men_map_settings_activate(self): bma = self.parent.bma bpc = self.parent.bpc dialog: Gtk.Dialog = self.parent.builder.get_object('dialog_settings') dialog.set_attached_to(MainController.window()) dialog.set_transient_for(MainController.window()) # Set dialog settings to map settings number_layers_adjustment: Gtk.Adjustment = self.parent.builder.get_object( 'dialog_settings_number_layers_adjustment') number_collision_adjustment: Gtk.Adjustment = self.parent.builder.get_object( 'dialog_settings_number_collision_adjustment') has_data_layer: Gtk.Switch = self.parent.builder.get_object( 'settings_has_data_layer') number_layers_adjustment.set_value(bma.number_of_layers) number_collision_adjustment.set_value(bma.number_of_collision_layers) has_data_layer.set_active(bma.unk6 > 0) resp = dialog.run() if resp == ResponseType.OK: has_a_change = False number_layers = number_layers_adjustment.get_value() if number_layers > 1 and bma.number_of_layers <= 1: # A LAYER WAS ADDED has_a_change = True bma.add_upper_layer() bpc.add_upper_layer() self.parent.builder.get_object( 'map_import_layer2_file').set_sensitive(True) elif number_layers <= 1 and bma.number_of_layers > 1: # A LAYER WAS REMOVE has_a_change = True bma.remove_upper_layer() bpc.remove_upper_layer() self.parent.module.remove_bpa_upper_layer(self.parent.item_id) self.parent.builder.get_object( 'map_import_layer2_file').set_sensitive(False) number_col_layers = number_collision_adjustment.get_value() if number_col_layers > 0 and bma.number_of_collision_layers <= 0: # COLLISION 1 WAS ADDED has_a_change = True bma.number_of_collision_layers = u16(1) bma.collision = [ False for _ in range( 0, bma.map_width_camera * bma.map_height_camera) ] if number_col_layers > 1 and bma.number_of_collision_layers <= 1: # COLLISION 2 WAS ADDED has_a_change = True bma.number_of_collision_layers = u16(2) bma.collision2 = [ False for _ in range( 0, bma.map_width_camera * bma.map_height_camera) ] if number_col_layers <= 1 and bma.number_of_collision_layers > 1: # COLLISION 2 WAS REMOVED has_a_change = True bma.number_of_collision_layers = u16(1) bma.collision2 = None if number_col_layers <= 0 and bma.number_of_collision_layers > 0: # COLLISION 1 WAS REMOVED has_a_change = True bma.number_of_collision_layers = u16(0) bma.collision = None has_data_layer_now = has_data_layer.get_active() if has_data_layer_now and not bma.unk6: # DATA LAYER WAS ADDED has_a_change = True bma.unk6 = u16(1) bma.unknown_data_block = [ 0 for _ in range( 0, bma.map_width_camera * bma.map_height_camera) ] if not has_data_layer_now and bma.unk6: # DATA LAYER WAS REMOVED has_a_change = True bma.unk6 = u16(0) bma.unknown_data_block = None if has_a_change: self.parent.reload_all() self.parent.mark_as_modified() dialog.hide()
def on_men_tiles_ani_settings_activate(self): dialog: Gtk.Dialog = self.parent.builder.get_object( 'dialog_tiles_animated_settings') dialog.set_attached_to(MainController.window()) dialog.set_transient_for(MainController.window()) bpas_frame_info_entries = [] for i, bpa in enumerate(self.parent.bpas): gui_i = i + 1 enabled = self.parent.builder.get_object(f'bpa_enable{gui_i}') # If there's no second layer: Disable activating the BPA # TODO: Currently when removing layers, BPAs are not removed. Is that a problem? if self.parent.bma.number_of_layers <= 1 and i > 3: enabled.set_sensitive(False) enabled.set_active(bpa is not None) dialog.resize(470, 450) this_frame_info_entries: List[Gtk.Entry] = [] bpas_frame_info_entries.append(this_frame_info_entries) bpa_duration_box: Gtk.Box = self.parent.builder.get_object( f'bpa_box{gui_i}') for child in bpa_duration_box: bpa_duration_box.remove(child) if bpa is None or len(bpa.frame_info) < 1: l = Gtk.Label.new( _("This BPA has no frames.\n" "Enable the BPA and import images for a BPA to add frames." )) l.show() bpa_duration_box.add(l) else: # Fill value for existing BPAs for frame_info in bpa.frame_info: entry: Gtk.Entry = Gtk.Entry.new() entry.set_input_purpose(Gtk.InputPurpose.NUMBER) entry.set_width_chars(4) entry.set_max_length(4) entry.set_text(str(frame_info.duration_per_frame)) entry.set_halign(Gtk.Align.START) entry.show() this_frame_info_entries.append(entry) bpa_duration_box.pack_start(entry, False, True, 5) resp = dialog.run() dialog.hide() if resp == ResponseType.OK: had_errors = False for i, (bpa, bpa_entries) in enumerate( zip(self.parent.bpas, bpas_frame_info_entries)): gui_i = i + 1 if bpa is None and self.parent.builder.get_object( f'bpa_enable{gui_i}').get_active(): # HAS TO BE ADDED map_bg_entry = self.parent.module.get_level_entry( self.parent.item_id) # Add file new_bpa_filename = f"{map_bg_entry.bpl_name}{gui_i}" new_bpa_filename_with_ext = new_bpa_filename.lower( ) + BPA_EXT try: self.parent.module.project.create_new_file( f"{DIR}/{new_bpa_filename_with_ext}", FileType.BPA.new(), FileType.BPA) except FileExistsError: # Hm, okay, then we just re-use this file. pass # Add to MapBG list map_bg_entry.bpa_names[i] = new_bpa_filename # Refresh controller state self.parent.bpas = self.parent.module.get_bpas( self.parent.item_id) new_bpa = self.parent.bpas[i] assert new_bpa is not None # Add to BPC self.parent.bpc.process_bpa_change(i, new_bpa.number_of_tiles) self.parent.module.mark_level_list_as_modified() if bpa is not None and not self.parent.builder.get_object( f'bpa_enable{gui_i}').get_active(): # HAS TO BE DELETED map_bg_entry = self.parent.module.get_level_entry( self.parent.item_id) # Delete from BPC self.parent.bpc.process_bpa_change(i, u16(0)) # Delete from MapBG list map_bg_entry.bpa_names[i] = None # Refresh controller state self.parent.bpas = self.parent.module.get_bpas( self.parent.item_id) self.parent.module.mark_level_list_as_modified() if bpa is not None: new_frame_info = [] for entry_i, entry in enumerate(bpa_entries): try: number_of_frames = int(entry.get_text()) except ValueError: number_of_frames = 0 had_errors = True new_frame_info.append( FileType.BPA.get_frame_info_model_cls()( number_of_frames, 0)) bpa.frame_info = new_frame_info if had_errors: md = SkyTempleMessageDialog( MainController.window(), Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, _("Some values were invalid (not a number). " "They were replaced with 0."), title=_("Warning!")) md.set_position(Gtk.WindowPosition.CENTER) md.run() md.destroy() self.parent.reload_all() self.parent.mark_as_modified()
def on_btn_add_sp_clicked(self, *args): self.sp_effects.add_item_effect_id(u16(0)) self._init_sp_list() self.module.mark_sp_effects_as_modified()
def to_int(self) -> u16: """Converts tile map entry back into the byte format used by game""" xf = 1 if self.flip_x else 0 yf = 1 if self.flip_y else 0 # '0010000000100101' return u16((self.idx & 0x3FF) + (xf << 10) + (yf << 11) + ((self.pal_idx & 0x3F) << 12))
def on_add_chunk_clicked(self, *args): m = self.builder.get_object(f'icon_view_chunk').get_model() m.append([len(self.edited_mappings)]) for i in range(len(self.edited_mappings), len(self.edited_mappings) + 9): self.edited_mappings.append(TilemapEntry.from_int(u16(0)))
def _save_guest_pokemon_data(self): store: Gtk.ListStore = self.builder.get_object( 'store_tree_guest_pokemon_data') guest_pokemon_list = [] for i, row in enumerate(store): guest_pokemon_list.append( GuestPokemon( u32(int(row[1])), u16(self._get_monster_id_from_display_name(row[2])), u16(int(row[3])), [ u16(self._get_move_id_from_display_name(row[4])), u16(self._get_move_id_from_display_name(row[5])), u16(self._get_move_id_from_display_name(row[6])), u16(self._get_move_id_from_display_name(row[7])) ], u16(int(row[8])), u16(int(row[9])), u16(int(row[10])), u16(int(row[11])), u16(int(row[12])), u16(int(row[13])), u16(int(row[14])), u16(int(row[15])), u32(int(row[16])))) self.module.set_guest_pokemon_data(guest_pokemon_list) # Update our copy of the binary self.arm9 = self.module.project.get_binary(BinaryName.ARM9)