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))
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 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)
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
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
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)
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)
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)
def to_mappa(self): data = bytearray(50) for i in range(0, 25): write_u16(data, self.weights[MappaTrapType(i)], i * 2) return data