Пример #1
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
 def set_player_md_ids(value: List[u16], overlay13: bytearray, config: Pmd2Data) -> None:
     """
     Sets the monster.md indices of the player partner choices (in place, total index, with gender form!)
     The length of the list must exactly match the original ROM's length (see get_player_md_ids).
     """
     block = config.binaries['overlay/overlay_0013.bin'].symbols['StartersHeroIds']
     expected_length = int((block.end - block.begin) / 2)
     if len(value) != expected_length:
         raise ValueError(f"The ID list must have exactly the length of {expected_length} entries.")
     for i, v in enumerate(value):
         write_u16(overlay13, v, block.begin + (i * 2))
Пример #3
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
Пример #4
0
def corrupt341():
    """Corrupt 341: Dungeon tiles Beach cave 2? -- No? Tiles -> Chunk mappings or similar?"""
    img341 = dungeon_bin[341].decompress()
    img341new = bytearray(img341)

    # Decode XOR
    #XOR_ROW_LEN = 7200#18 * 7
    #rows_decoded = []
    #row_before = bytes(XOR_ROW_LEN)
    #for chunk in iter_bytes(img341, XOR_ROW_LEN):
    #    xored = bytearray(a ^ b for (a, b) in zip(chunk, row_before))
    #    row_before = xored
    #    rows_decoded.append(xored)

    dummy_map = [
        TilemapEntry(10, False, False, 0),
        TilemapEntry(10, True, False, 0),
        TilemapEntry(10, False, True, 0),
        TilemapEntry(5, False, False, 0),
        TilemapEntry(5, True, False, 0),
        TilemapEntry(5, False, True, 0),
        TilemapEntry(10, False, False, 6),
        TilemapEntry(10, True, False, 6),
        TilemapEntry(10, False, True, 6)
    ]

    for j in range(1, 300):
        for i, m in enumerate(dummy_map):
            write_u16(img341new, m.to_int(), (j * 18) + 2 * i)

    all_tilemaps = []
    for bytes2 in iter_bytes(img341new, 2):
        all_tilemaps.append(TilemapEntry.from_int(read_u16(bytes2, 0)))

    # Encode XOR
    #rows_encoded = []
    #row_before = bytes(XOR_ROW_LEN)
    #for row in rows_decoded:
    #    xored = bytes(a ^ b for (a, b) in zip(row, row_before))
    #    row_before = row
    #    rows_encoded.append(xored)
    #img341new = bytes(itertools.chain.from_iterable(rows_encoded))
    #assert img341 == img341new

    with open('/tmp/corrupt.bin', 'wb') as f:
        f.write(img341new)
    dungeon_bin[341] = FileType.COMMON_AT.compress(img341new)
Пример #5
0
    def save_to_rom(self) -> None:
        data = bytearray(ICON_BANNER_SIZE)

        write_u16(data, self.version, 0x0)

        data[0x20:0x20 + 0x200] = self.icon.bitmap
        data[0x220:0x220 + 0x20] = self.icon.palette

        data[0x240:0x240 + 0x100] = _utf16_encode_fixed(self.title_japanese)
        data[0x340:0x340 + 0x100] = _utf16_encode_fixed(self.title_english)
        data[0x440:0x440 + 0x100] = _utf16_encode_fixed(self.title_french)
        data[0x540:0x540 + 0x100] = _utf16_encode_fixed(self.title_german)
        data[0x640:0x640 + 0x100] = _utf16_encode_fixed(self.title_italian)
        data[0x740:0x740 + 0x100] = _utf16_encode_fixed(self.title_spanish)

        calculated_checksum = nds_crc16(data, 0x20, 0x820)
        write_u16(data, calculated_checksum, 0x2)

        self.rom.iconBanner = data
Пример #6
0
    def sir0_serialize_parts(self) -> Tuple[bytes, List[int], Optional[int]]:
        string_codec.init()

        out_data = bytearray()
        # 1. Write strings
        pointer_offsets = []
        for entry in self.list:
            pointer_offsets.append(u32_checked(len(out_data)))
            out_data += bytes(entry.name, string_codec.PMD2_STR_ENCODER) + b'\0'

        # Padding
        self._pad(out_data)

        # Write table
        sir0_pointer_offsets = []
        pointer_data_block = len(out_data)
        for i, entry in enumerate(self.list):
            entry_buffer = bytearray(LEN_LEVEL_ENTRY)
            write_u16(entry_buffer, entry.mapty, 0)
            write_u16(entry_buffer, entry.nameid, 2)
            write_u16(entry_buffer, entry.mapid, 4)
            write_i16(entry_buffer, entry.weather, 6)
            sir0_pointer_offsets.append(len(out_data) + 8)
            write_u32(entry_buffer, pointer_offsets[i], 8)
            out_data += entry_buffer
        out_data += PADDING_END

        # Padding
        self._pad(out_data)

        # 4. Write sub-header
        # sir0_pointer_offsets.append(len(out_data))
        # out_data += pointer_data_block.to_bytes(4, byteorder='little', signed=False)
        # out_data += len(self.list).to_bytes(4, byteorder='little', signed=False)

        return out_data, sir0_pointer_offsets, pointer_data_block
Пример #7
0
 def set_stolen_spawn_rate(value: u16, ov10: bytearray,
                           config: Pmd2Data) -> None:
     block = config.binaries['overlay/overlay_0010.bin'].symbols[
         'SpawnDelayStealing']
     write_u16(ov10, value, block.begin)
Пример #8
0
 def set_oran_berry_hp(value: u16, ov10: bytearray,
                       config: Pmd2Data) -> None:
     block = config.binaries['overlay/overlay_0010.bin'].symbols[
         'ORAN_BERRY_HP_RESTORATION']
     write_u16(ov10, value, block.begin)
Пример #9
0
 def set_life_seed_hp(value: u16, ov10: bytearray,
                      config: Pmd2Data) -> None:
     block = config.binaries['overlay/overlay_0010.bin'].symbols[
         'LIFE_SEED_HP_BOOST']
     write_u16(ov10, value, block.begin)
Пример #10
0
 def to_mappa(self):
     data = bytearray(50)
     for i in range(0, 25):
         write_u16(data, self.weights[MappaTrapType(i)], i * 2)
     return data