Example #1
0
    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')
Example #4
0
 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)
Example #5
0
 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()
Example #6
0
 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()
Example #7
0
 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
Example #8
0
 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
Example #9
0
    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)
Example #10
0
 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
         ])
Example #11
0
 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
Example #12
0
    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)
Example #13
0
 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()
Example #14
0
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))
Example #15
0
 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
Example #16
0
    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)
Example #17
0
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)
Example #18
0
 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()
Example #19
0
    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()
Example #20
0
    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
Example #21
0
    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()
Example #22
0
    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()
Example #23
0
    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()
Example #24
0
 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()
Example #25
0
 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))
Example #26
0
 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)))
Example #27
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)