Пример #1
0
 def save(self):
     with self.game.open('overlays_dez',
                         'overlay_{0:04}.bin'.format(
                             self.game.overworld_sprite_table[0]),
                         mode='r+') as handle:
         writer = BinaryIO.writer(handle)
         writer.seek(self.game.overworld_sprite_table[1])
         Editable.save(self, writer)
Пример #2
0
    def save(self, writer):
        self.flag_ = 0
        if self.scale_s_fx32 == self.scale_t_fx32 == 4096:
            self.flag_ |= self.FLAG_NO_SCALE
        if self.rot_sin_fx32 == self.rot_cos_fx32 == 0:
            self.flag_ |= self.FLAG_NO_ROTATE
        if self.trans_s_fx32 == self.trans_t_fx32 == 0:
            self.flag_ |= self.FLAG_NO_TRANSLATE
        if self.effect:
            if len(self.effect) != 16:
                raise ValueError('Effect matrix must be 4x4 as 16 entries')
            self.flag_ |= self.FLAG_EFFECT_MATRIX

        writer = Editable.save(self, writer)

        if not self.flag_ & self.FLAG_NO_SCALE:
            writer.writeInt32(self.scale_s_fx32)
            writer.writeInt32(self.scale_t_fx32)

        if not self.flag_ & self.FLAG_NO_ROTATE:
            writer.writeInt32(self.rot_sin_fx32)
            writer.writeInt32(self.rot_cos_fx32)

        if not self.flag_ & self.FLAG_NO_TRANSLATE:
            writer.writeInt32(self.trans_s_fx32)
            writer.writeInt32(self.trans_t_fx32)

        if self.flag_ & self.FLAG_EFFECT_MATRIX:
            for value in self.effect:
                writer.writeInt32(value)

        return writer
Пример #3
0
    def save(self, writer):
        start = writer.tell()
        writer = Editable.save(self, writer)

        writer = self.nodes.save(writer)

        ofs = writer.tell() - start
        with writer.seek(start + self.get_offset('sbc_offset')):
            writer.writeUInt32(ofs)
        for command in self.sbc:
            writer.writeUInt8(command)

        ofs = writer.tell() - start
        with writer.seek(start + self.get_offset('mat_offset')):
            writer.writeUInt32(ofs)
        writer = self.materials.save(writer)

        ofs = writer.tell() - start
        with writer.seek(start + self.get_offset('shp_offset')):
            writer.writeUInt32(ofs)
        writer = self.shapes.save(writer)

        ofs = writer.tell() - start
        with writer.seek(start + self.get_offset('size_')):
            writer.writeUInt32(ofs)
        return writer
Пример #4
0
 def save(self, writer):
     old_datasize = self.datasize
     if self.cgr.encryption != NCGR.ENCRYPTION_NONE:
         self.encrypt(self.cgr.encryption)
     self.datasize = len(self.data)
     self.size_ += self.datasize - old_datasize
     writer = Editable.save(self, writer)
     writer.write(self.data)
     return writer
Пример #5
0
 def save(self, writer=None):
     idx = 1
     blocks = [0] * 4
     for block_id in range(4):
         for bit in range(32):
             if idx in self.tms:
                 blocks[block_id] |= 1 << bit
             idx += 1
     return Editable.save(self, writer)
Пример #6
0
 def save(self, writer=None):
     writer = BinaryIO.writer(writer)
     start = writer.tell()
     writer = Editable.save(self, writer)
     if self.game.is_hgss():
         writer.write(self.block1)
         self.ublock1_size = len(self.block1)
     writer = self.permissions.save(writer)
     self.permission_size = self.permissions.get_size()
     writer = self.objects.save(writer)
     self.objects_size = self.objects.get_size()
     writer.write(self.bmd)
     self.bmd_size = len(self.bmd)
     writer.write(self.bdhc)
     self.bdhc_size = len(self.bdhc)
     with writer.seek(start):
         Editable.save(self, writer)
     return writer
Пример #7
0
 def save(self, writer=None):
     self.namelen = len(self.name)
     writer = Editable.save(self, writer)
     writer.write(self.name)
     if self.has_map_definition_ids:
         writer = self.map_definitions.save(writer)
     if self.has_mystery_zone:
         writer = self.mystery_details.save(writer)
     writer = self.land_data_maps.save(writer)
     return writer
Пример #8
0
 def save(self, writer):
     writer = Editable.save(self, writer)
     if self.trainer.hold_items:
         writer.writeUInt16(self.item)
     if self.trainer.movesets:
         for move in self.moves:
             writer.writeUInt16(move)
     if self.trainer.game.is_hgss():
         writer.writeUInt16(self.seal_capsule)
     return writer
Пример #9
0
 def save(self, writer=None):
     writer = BinaryIO.writer(writer)
     start = writer.tell()
     writer = Editable.save(self, writer)
     writer = self.char.save(writer)
     if self.cpos.loaded:
         writer = self.cpos.save(writer)
     size = writer.tell() - start
     with writer.seek(start + self.get_offset('size_')):
         writer.writeUInt32(size)
     return writer
Пример #10
0
 def save(self, writer):
     start = writer.tell()
     self._data.num = self.num
     writer = Editable.save(self, writer)
     for entry in self.entries:
         writer.writeUInt32(entry.start)
         writer.writeUInt32(entry.stop)
     writer.writeAlign(4)
     size = writer.tell() - start
     with writer.seek(start + self.get_offset('size_')):
         writer.writeUInt32(size)
     return writer
Пример #11
0
 def save(self, writer=None):
     writer = BinaryIO.writer(writer)
     start = writer.tell()
     writer = Editable.save(self, writer)
     writer = self.fatb.save(writer)
     writer = self.fntb.save(writer)
     writer = self.fimg.save(writer)
     writer.writeAlign(4)
     size = writer.tell() - start
     with writer.seek(start + self.get_offset('size_')):
         writer.writeUInt32(size)
     return writer
Пример #12
0
 def save(self, writer=None):
     writer = BinaryIO.writer(writer)
     start = writer.tell()
     self.mdldict.num = len(self.models)
     writer = Editable.save(self, writer)
     writer = self.mdldict.save(writer)
     for i in range(self.mdldict.num):
         writer = self.models[i].save(writer)
     size = writer.tell() - start
     with writer.seek(start + self.get_offset('size_')):
         writer.writeUInt32(size)
     return writer
Пример #13
0
 def save(self, writer):
     start = writer.tell()
     writer = Editable.save(self, writer)
     rel = writer.tell()
     for file_id, entry in enumerate(self.narc.fatb.entries):
         writer.writePadding(entry.start + rel)
         writer.write(self.files[file_id])
     writer.writeAlign(4)
     size = writer.tell() - start
     with writer.seek(start + self.get_offset('size_')):
         writer.writeUInt32(size)
     return writer
Пример #14
0
 def save(self, writer=None):
     writer = BinaryIO.writer(writer)
     start = writer.tell()
     writer = Editable.save(self, writer)
     for record_idx, record_name in enumerate(self.record_names):
         self.record_offsets[record_idx] = writer.tell() - start
         if record_name == 'SEQARC':
             prefixes = set()
             offsets = []
             for entry in self.records[record_name]:
                 if entry[0] == record_name:
                     prefixes.add(entry[1])
             writer.writeUInt32(len(prefixes))
             ofs_ofs = writer.tell()
             for i in range(len(prefixes) * 2):
                 writer.writeUInt32(0)
             for name in prefixes:
                 offsets.append(writer.tell() - start)
                 writer.writeString(name)
                 writer.writeAlign(8)
                 offsets.append(writer.tell() - start)
                 num, text_writer = self.save_entries(
                     self.records[record_name],
                     writer.tell() - start + 4, (record_name, name))
                 writer.writeUInt32(num)
                 writer.write(text_writer.getvalue())
             with writer.seek(ofs_ofs):
                 writer.write(array.array('I', offsets).tostring())
         else:
             num, text_writer = self.save_entries(self.records[record_name],
                                                  writer.tell() - start + 4,
                                                  (record_name, ))
             writer.writeUInt32(num)
             writer.write(text_writer.getvalue())
         writer.writeAlign(8)
     self.size = writer.tell() - start
     with writer.seek(start):
         writer = Editable.save(self, writer)
     return writer
Пример #15
0
 def save(self, writer=None):
     for name, data in self.files.iteritems():
         name = os.path.splitext(name)[0]
         name_parts = name.split('/')
         record_name = name_parts.pop(0)
         if name_parts not in self.symb.records[record_name]:
             self.symb.records[record_name].append(name_parts)
             # TODO: handle new info entries?!
     writer = BinaryIO.writer(writer)
     start = writer.tell()
     writer = Editable.save(self, writer)
     for block_ofs, block in zip(
             self.block_offsets,
         [self.symb, self.fat, self.info, self.file]):
         block_ofs.block_offset = writer.tell() - start
         writer = block.save(writer)
         writer.writeAlign(4)
         block_ofs.block_size = writer.tell(
         ) - start - block_ofs.block_offset
     with writer.seek(start):
         writer = Editable.save(self, writer)
     return writer
Пример #16
0
 def save(self, writer):
     start = writer.tell()
     writer = Editable.save(self, writer)
     writer = self.matdict.save(writer)
     ofs = writer.tell() - start
     with writer.seek(start + self.get_offset('texmatdict_offset')):
         writer.writeUInt32(ofs)
     writer = self.texmatdict.save(writer)
     ofs = writer.tell() - start
     with writer.seek(start + self.get_offset('palmatdict_offset')):
         writer.writeUInt32(ofs)
     writer = self.palmatdict.save(writer)
     return writer
Пример #17
0
 def save(self, writer=None):
     writer = BinaryIO.writer(writer)
     start = writer.tell()
     self.num = len(self.glyphs)
     base_glyph = Glyph()
     self.footer_offset = base_glyph.get_size() * self.num + self.headersize
     writer = Editable.save(self, writer)
     writer = self.glyphs.save(writer)
     self.widths = [0] * self.num
     for i, glyph in enumerate(self.glyphs):
         self.widths[i] = width = glyph.get_bbox()[0]
         writer.writeUInt8(width)
     return writer
Пример #18
0
 def save(self, writer=None):
     if self.tex.loaded:
         self.numblocks = 2
     else:
         self.numblocks = 1
     writer = BinaryIO.writer(writer)
     start = writer.tell()
     writer = Editable.save(self, writer)
     offset_offset = writer.tell()
     for i in range(self.numblocks):
         writer.writeUInt32(0)
     block_ofs = writer.tell() - start
     with writer.seek(offset_offset):
         writer.writeUInt32(block_ofs)
     writer = self.mdl.save(writer)
     if self.tex.loaded:
         block_ofs = writer.tell() - start
         with writer.seek(offset_offset + 4):
             writer.writeUInt32(block_ofs)
         writer = self.tex.save(writer)
     size = writer.tell() - start
     with writer.seek(start + self.get_offset('size_')):
         writer.writeUInt32(size)
     return writer
Пример #19
0
 def save(self, writer=None):
     self.num = len(self.entries)
     writer = Editable.save(self, writer)
     writer = self.entries.save(writer)
     return writer
Пример #20
0
 def save(self, writer=None):
     self.update()
     return Editable.save(self, writer)