本文整理汇总了Python中coilsnake.model.eb.graphics.EbGraphicTileset.from_block方法的典型用法代码示例。如果您正苦于以下问题:Python EbGraphicTileset.from_block方法的具体用法?Python EbGraphicTileset.from_block怎么用?Python EbGraphicTileset.from_block使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类coilsnake.model.eb.graphics.EbGraphicTileset
的用法示例。
在下文中一共展示了EbGraphicTileset.from_block方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: EbCreditsFont
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
class EbCreditsFont(object):
def __init__(self):
self.tileset = EbGraphicTileset(num_tiles=192, tile_width=8, tile_height=8)
self.palette = EbPalette(num_subpalettes=2, subpalette_length=4)
def from_block(self, block, tileset_asm_pointer_offset, palette_offset):
with EbCompressibleBlock() as compressed_block:
compressed_block.from_compressed_block(block=block, offset=from_snes_address(
read_asm_pointer(block=block, offset=tileset_asm_pointer_offset)))
self.tileset.from_block(block=compressed_block, bpp=2)
self.palette.from_block(block=block, offset=palette_offset)
def to_block(self, block, tileset_asm_pointer_offset, palette_offset):
tileset_block_size = self.tileset.block_size(bpp=2)
with EbCompressibleBlock(tileset_block_size) as compressed_block:
self.tileset.to_block(block=compressed_block, offset=0, bpp=2)
compressed_block.compress()
tileset_offset = block.allocate(data=compressed_block)
write_asm_pointer(block=block, offset=tileset_asm_pointer_offset, pointer=to_snes_address(tileset_offset))
self.palette.to_block(block=block, offset=palette_offset)
def to_files(self, image_file, image_format="png"):
image = _CREDITS_PREVIEW_ARRANGEMENT.image(self.tileset, self.palette)
image.save(image_file, image_format)
del image
def from_files(self, image_file, image_format="png"):
image = open_indexed_image(image_file)
self.palette.from_image(image)
self.tileset.from_image(image, _CREDITS_PREVIEW_ARRANGEMENT, self.palette)
del image
示例2: EbFont
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
class EbFont(object):
def __init__(self, num_characters=96, tile_width=16, tile_height=8):
self.num_characters = num_characters
self.tileset = EbGraphicTileset(num_tiles=num_characters, tile_width=tile_width, tile_height=tile_height)
self.character_widths = None
def from_block(self, block, tileset_offset, character_widths_offset):
self.tileset.from_block(block=block, offset=tileset_offset, bpp=1)
self.character_widths = block[character_widths_offset:character_widths_offset + self.num_characters].to_list()
def to_block(self, block, tileset_offset, character_widths_offset):
self.tileset.to_block(block=block, offset=tileset_offset, bpp=1)
block[character_widths_offset:character_widths_offset + self.num_characters] = self.character_widths
def to_files(self, image_file, widths_file, image_format="png", widths_format="yml"):
image = _FONT_IMAGE_ARRANGEMENT.image(self.tileset, _FONT_IMAGE_PALETTE)
image.save(image_file, image_format)
del image
character_widths_dict = dict(enumerate(self.character_widths))
if widths_format == "yml":
yml_dump(character_widths_dict, widths_file, default_flow_style=False)
def from_files(self, image_file, widths_file, image_format="png", widths_format="yml"):
image = open_indexed_image(image_file)
self.tileset.from_image(image, _FONT_IMAGE_ARRANGEMENT, _FONT_IMAGE_PALETTE)
del image
if widths_format == "yml":
widths_dict = yml_load(widths_file)
self.character_widths = map(lambda i: widths_dict[i], range(self.tileset.num_tiles_maximum))
示例3: EbFont
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
class EbFont(object):
def __init__(self, num_characters=96, tile_width=16, tile_height=8):
self.num_characters = num_characters
self.tileset = EbGraphicTileset(num_tiles=num_characters, tile_width=tile_width, tile_height=tile_height)
self.character_widths = None
def from_block(self, block, tileset_offset, character_widths_offset):
self.tileset.from_block(block=block, offset=tileset_offset, bpp=1)
for i in range(96, self.num_characters):
self.tileset.clear_tile(i, color=1)
self.character_widths = block[character_widths_offset:character_widths_offset + self.num_characters].to_list()
def to_block(self, block):
tileset_offset = block.allocate(size=self.tileset.block_size(bpp=1))
self.tileset.to_block(block=block, offset=tileset_offset, bpp=1)
character_widths_offset = block.allocate(size=self.num_characters)
block[character_widths_offset:character_widths_offset + self.num_characters] = self.character_widths
return tileset_offset, character_widths_offset
def to_files(self, image_file, widths_file, image_format="png", widths_format="yml"):
if self.num_characters == 96:
image = _FONT_IMAGE_ARRANGEMENT_96.image(self.tileset, FONT_IMAGE_PALETTE)
elif self.num_characters == 128:
image = _FONT_IMAGE_ARRANGEMENT_128.image(self.tileset, FONT_IMAGE_PALETTE)
image.save(image_file, image_format)
del image
character_widths_dict = dict(enumerate(self.character_widths))
if widths_format == "yml":
yml_dump(character_widths_dict, widths_file, default_flow_style=False)
def from_files(self, image_file, widths_file, image_format="png", widths_format="yml"):
image = open_indexed_image(image_file)
if self.num_characters == 96:
self.tileset.from_image(image, _FONT_IMAGE_ARRANGEMENT_96, FONT_IMAGE_PALETTE)
elif self.num_characters == 128:
self.tileset.from_image(image, _FONT_IMAGE_ARRANGEMENT_128, FONT_IMAGE_PALETTE)
del image
if widths_format == "yml":
widths_dict = yml_load(widths_file)
self.character_widths = [widths_dict[i] for i in range(self.tileset.num_tiles_maximum)]
def image_size(self):
if self.num_characters == 96:
arr = _FONT_IMAGE_ARRANGEMENT_96
elif self.num_characters == 128:
arr = _FONT_IMAGE_ARRANGEMENT_128
return arr.width * self.tileset.tile_width, arr.height * self.tileset.tile_height
示例4: test_from_block_4bpp
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
def test_from_block_4bpp(self):
block = Block()
block.from_list(
[
0b01010110,
0b00001011,
0b11001110,
0b10010110,
0b01110001,
0b00111011,
0b00001011,
0b10011110,
0b00011000,
0b00000011,
0b10000001,
0b11101011,
0b00000100,
0b01000101,
0b01010110,
0b10001111,
0b00101100,
0b10110000,
0b01010110,
0b10110010,
0b01010000,
0b11000000,
0b00111000,
0b10010111,
0b00101101,
0b11111100,
0b01111101,
0b11101010,
0b10101111,
0b10110111,
0b01100000,
0b11101110,
]
)
tileset = EbGraphicTileset(num_tiles=1, tile_width=8, tile_height=8)
tileset.from_block(block, offset=0, bpp=4)
assert_list_equal(
tileset[0],
[
[8, 1, 12, 9, 6, 5, 3, 2],
[11, 5, 8, 14, 1, 7, 15, 0],
[8, 13, 3, 7, 2, 0, 2, 3],
[10, 0, 4, 14, 7, 10, 11, 9],
[8, 8, 12, 9, 13, 12, 2, 6],
[11, 14, 14, 4, 14, 4, 10, 7],
[12, 2, 12, 8, 4, 15, 12, 14],
[10, 13, 12, 1, 10, 11, 11, 2],
],
)
示例5: test_from_block_1bpp
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
def test_from_block_1bpp(self):
block = Block()
block.from_list(
[
0b00000011,
0b01110000,
0b01001001,
0b11110000,
0b01001010,
0b11001000,
0b01110001,
0b00000001,
0b00100000,
0b00110000,
0b00101000,
0b00101000,
0b01100000,
0b11100000,
0b11000000,
0b00000001,
]
)
tileset = EbGraphicTileset(num_tiles=2, tile_width=8, tile_height=8)
tileset.from_block(block, offset=0, bpp=1)
assert_list_equal(
tileset[0],
[
[0, 0, 0, 0, 0, 0, 1, 1],
[0, 1, 1, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 1, 0, 0, 1],
[1, 1, 1, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 1, 0, 1, 0],
[1, 1, 0, 0, 1, 0, 0, 0],
[0, 1, 1, 1, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 1],
],
)
assert_list_equal(
tileset[1],
[
[0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0],
[0, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1],
],
)
示例6: read_from_rom
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
def read_from_rom(self, rom):
self.bg_table.from_block(block=rom, offset=from_snes_address(BACKGROUND_TABLE_OFFSET))
self.scroll_table.from_block(block=rom, offset=from_snes_address(SCROLL_TABLE_OFFSET))
self.distortion_table.from_block(block=rom, offset=from_snes_address(DISTORTION_TABLE_OFFSET))
self.graphics_pointer_table.from_block(
block=rom,
offset=from_snes_address(read_asm_pointer(block=rom,
offset=GRAPHICS_POINTER_TABLE_ASM_POINTER_OFFSETS[0])))
self.arrangement_pointer_table.from_block(
block=rom,
offset=from_snes_address(read_asm_pointer(block=rom,
offset=ARRANGEMENT_POINTER_TABLE_ASM_POINTER_OFFSETS[0])))
self.palette_pointer_table.from_block(
block=rom,
offset=from_snes_address(read_asm_pointer(block=rom,
offset=PALETTE_POINTER_TABLE_ASM_POINTER_OFFSETS[0])))
self.backgrounds = [None for i in range(self.graphics_pointer_table.num_rows)]
self.palettes = [None for i in range(self.palette_pointer_table.num_rows)]
for i in range(self.bg_table.num_rows):
graphics_id = self.bg_table[i][0]
color_depth = self.bg_table[i][2]
if self.backgrounds[graphics_id] is None:
# Max tiles used in rom: 421 (2bpp) 442 (4bpp)
tileset = EbGraphicTileset(num_tiles=512, tile_width=8, tile_height=8)
with EbCompressibleBlock() as compressed_block:
compressed_block.from_compressed_block(
block=rom,
offset=from_snes_address(self.graphics_pointer_table[graphics_id][0]))
tileset.from_block(compressed_block, offset=0, bpp=color_depth)
arrangement = EbTileArrangement(width=32, height=32)
with EbCompressibleBlock() as compressed_block:
compressed_block.from_compressed_block(
block=rom,
offset=from_snes_address(self.arrangement_pointer_table[graphics_id][0]))
arrangement.from_block(block=compressed_block, offset=0)
self.backgrounds[graphics_id] = (tileset, color_depth, arrangement)
palette_id = self.bg_table[i][1]
if self.palettes[palette_id] is None:
palette = EbPalette(num_subpalettes=1, subpalette_length=16)
palette.from_block(block=rom, offset=from_snes_address(self.palette_pointer_table[palette_id][0]))
self.palettes[palette_id] = palette
示例7: SoundStoneModule
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
class SoundStoneModule(EbModule):
NAME = "Sound Stone"
FREE_RANGES = [(0x0EDD5D, 0x0EF805)] # Sound stone graphics
def __init__(self):
super(SoundStoneModule, self).__init__()
self.tileset = EbGraphicTileset(num_tiles=352, tile_width=8, tile_height=8)
self.palette = EbPalette(num_subpalettes=6, subpalette_length=16)
def read_from_rom(self, rom):
graphics_offset = from_snes_address(read_asm_pointer(
block=rom, offset=GRAPHICS_ASM_POINTER_OFFSET))
with EbCompressibleBlock() as compressed_block:
compressed_block.from_compressed_block(block=rom, offset=graphics_offset)
self.tileset.from_block(block=compressed_block, bpp=4)
self.palette.from_block(block=rom, offset=PALETTE_OFFSET)
def write_to_rom(self, rom):
tileset_block_size = self.tileset.block_size(bpp=4)
with EbCompressibleBlock(tileset_block_size) as compressed_block:
self.tileset.to_block(block=compressed_block, offset=0, bpp=4)
compressed_block.compress()
tileset_offset = rom.allocate(data=compressed_block)
write_asm_pointer(block=rom, offset=GRAPHICS_ASM_POINTER_OFFSET, pointer=to_snes_address(tileset_offset))
self.palette.to_block(block=rom, offset=PALETTE_OFFSET)
def read_from_project(self, resource_open):
with resource_open("Logos/SoundStone", "png") as image_file:
image = open_indexed_image(image_file)
self.palette.from_image(image)
self.tileset.from_image(image, SOUND_STONE_ARRANGEMENT, self.palette)
def write_to_project(self, resource_open):
image = SOUND_STONE_ARRANGEMENT.image(self.tileset, self.palette)
with resource_open("Logos/SoundStone", "png") as image_file:
image.save(image_file, "png")
def upgrade_project(self, old_version, new_version, rom, resource_open_r, resource_open_w, resource_delete):
if old_version < 8:
self.read_from_rom(rom)
self.write_to_project(resource_open_w)
示例8: WindowGraphicsModule
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
class WindowGraphicsModule(EbModule):
NAME = "Window Graphics"
FREE_RANGES = [(0x200000, 0x20079f)] # Graphics
def __init__(self):
super(WindowGraphicsModule, self).__init__()
self.graphics_1 = EbGraphicTileset(num_tiles=416, tile_width=8, tile_height=8)
self.graphics_2 = EbGraphicTileset(num_tiles=7, tile_width=8, tile_height=8)
self.flavor_palettes = [EbPalette(8, 4) for i in range(7)]
self.flavor_names = dict()
def read_from_rom(self, rom):
with EbCompressibleBlock() as compressed_block:
compressed_block.from_compressed_block(
block=rom,
offset=from_snes_address(read_asm_pointer(rom, GRAPHICS_1_ASM_POINTER_OFFSET)))
self.graphics_1.from_block(block=compressed_block, bpp=2)
with EbCompressibleBlock() as compressed_block:
compressed_block.from_compressed_block(
block=rom,
offset=from_snes_address(read_asm_pointer(rom, GRAPHICS_2_ASM_POINTER_OFFSET)))
self.graphics_2.from_block(block=compressed_block, bpp=2)
# Read palettes
offset = FLAVOR_PALETTES_OFFSET
for palette in self.flavor_palettes:
palette.from_block(block=rom, offset=offset)
offset += 64
# Read names
for asm_pointer_offset in FLAVOR_NAME_ASM_POINTER_OFFSETS:
self.flavor_names[asm_pointer_offset] = FLAVOR_NAME_ENTRY.from_block(
block=rom,
offset=from_snes_address(read_asm_pointer(block=rom, offset=asm_pointer_offset)))
def write_to_rom(self, rom):
graphics_1_block_size = self.graphics_1.block_size(bpp=2)
with EbCompressibleBlock(graphics_1_block_size) as compressed_block:
self.graphics_1.to_block(block=compressed_block, offset=0, bpp=2)
compressed_block.compress()
graphics_1_offset = rom.allocate(data=compressed_block)
write_asm_pointer(block=rom, offset=GRAPHICS_1_ASM_POINTER_OFFSET,
pointer=to_snes_address(graphics_1_offset))
graphics_2_block_size = self.graphics_2.block_size(bpp=2)
with EbCompressibleBlock(graphics_2_block_size) as compressed_block:
self.graphics_2.to_block(block=compressed_block, offset=0, bpp=2)
compressed_block.compress()
graphics_2_offset = rom.allocate(data=compressed_block)
write_asm_pointer(block=rom, offset=GRAPHICS_2_ASM_POINTER_OFFSET,
pointer=to_snes_address(graphics_2_offset))
# Write palettes
offset = FLAVOR_PALETTES_OFFSET
for palette in self.flavor_palettes:
palette.to_block(block=rom, offset=offset)
offset += 64
# Write names
for asm_pointer_offset in FLAVOR_NAME_ASM_POINTER_OFFSETS:
name = self.flavor_names[asm_pointer_offset]
offset = rom.allocate(size=FLAVOR_NAME_ENTRY.size)
FLAVOR_NAME_ENTRY.to_block(block=rom, offset=offset, value=name)
write_asm_pointer(block=rom, offset=asm_pointer_offset, pointer=to_snes_address(offset))
def write_to_project(self, resource_open):
for i, palette in enumerate(self.flavor_palettes):
with resource_open("WindowGraphics/Windows1_" + str(i), "png") as image_file:
image = ARRANGEMENT_1.image(tileset=self.graphics_1, palette=palette)
image.save(image_file, "png")
with resource_open("WindowGraphics/Windows2_" + str(i), "png") as image_file:
image = ARRANGEMENT_2.image(tileset=self.graphics_2, palette=palette.get_subpalette(7))
image.save(image_file, "png")
# Write names
with resource_open("WindowGraphics/flavor_names", "txt", True) as f:
for asm_pointer_offset in FLAVOR_NAME_ASM_POINTER_OFFSETS:
print(self.flavor_names[asm_pointer_offset], file=f)
def read_from_project(self, resource_open):
# Read graphics. Just use the first of each image.
with resource_open("WindowGraphics/Windows1_0", "png") as image_file:
image = open_indexed_image(image_file)
self.graphics_1.from_image(image=image,
arrangement=ARRANGEMENT_1,
palette=self.flavor_palettes[0])
with resource_open("WindowGraphics/Windows2_0", "png") as image_file:
image = open_indexed_image(image_file)
self.graphics_2.from_image(image=image,
arrangement=ARRANGEMENT_2,
palette=self.flavor_palettes[0].get_subpalette(7))
# Read pals from Windows1 of each flavor.
# Read subpal 7 from Windows2 of each flavor.
for i, palette in enumerate(self.flavor_palettes):
# Read all the palette data from Windows1
with resource_open("WindowGraphics/Windows1_" + str(i), "png") as image_file:
#.........这里部分代码省略.........
示例9: EbTileset
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
class EbTileset(object):
def __init__(self):
self.minitiles = EbGraphicTileset(num_tiles=896, tile_width=8, tile_height=8)
self.arrangements = [None for i in range(1024)]
self.collisions = [None for i in range(1024)]
self.palettes = []
def from_block(self, block, minitiles_offset, arrangements_offset, collisions_offset):
self.minitiles_from_block(block, minitiles_offset)
self.arrangements_from_block(block, arrangements_offset)
self.collisions_from_block(block, collisions_offset)
def minitiles_from_block(self, block, offset):
with EbCompressibleBlock() as compressed_block:
compressed_block.from_compressed_block(block=block, offset=offset)
self.minitiles.from_block(block=compressed_block, bpp=4)
def arrangements_from_block(self, block, offset):
with EbCompressibleBlock() as compressed_block:
compressed_block.from_compressed_block(block=block, offset=offset)
num_arrangements = len(compressed_block) / 32
j = 0
for i in range(num_arrangements):
arrangement = [[0 for x in range(4)] for y in range(4)]
for y in range(4):
for x in range(4):
arrangement[y][x] = compressed_block.read_multi(key=j, size=2)
j += 2
self.arrangements[i] = arrangement
def collisions_from_block(self, block, offset):
for i, arrangement in enumerate(self.arrangements):
if arrangement is not None:
collision_offset = 0x180000 | block.read_multi(key=offset + i * 2, size=2)
self.collisions[i] = block[collision_offset:collision_offset + 16]
def minitiles_to_block(self, block):
with EbCompressibleBlock(self.minitiles.block_size(bpp=4)) as compressed_block:
self.minitiles.to_block(block=compressed_block, offset=0, bpp=4)
compressed_block.compress()
return block.allocate(data=compressed_block)
def arrangements_to_block(self, block):
with EbCompressibleBlock(1024 * 16 * 2) as compressed_block:
i = 0
for arrangement in self.arrangements:
for y in range(4):
for x in range(4):
compressed_block.write_multi(key=i, item=arrangement[y][x], size=2)
i += 2
compressed_block.compress()
return block.allocate(data=compressed_block)
def add_palette(self, map_tileset, map_palette, palette):
self.palettes.append((map_tileset, map_palette, palette))
def has_map_tileset(self, map_tileset):
for mt, mp, p in self.palettes:
if mt == map_tileset:
return True
return False
def get_palettes_by_map_tileset(self, map_tileset):
return [(mp, p) for (mt, mp, p) in self.palettes if mt == map_tileset]
def minitile_string_rep(self, n):
if n >= 896:
return "0000000000000000000000000000000000000000000000000000000000000000"
else:
s = str()
tile = self.minitiles[n]
for y in xrange(8):
for x in xrange(8):
s += CHARACTERS[tile[y][x]]
return s
def minitile_from_string(self, n, string_rep):
if n < 896:
minitile = [[0] * self.minitiles.tile_width for x in range(self.minitiles.tile_height)]
i = 0
for y in xrange(8):
for x in xrange(8):
minitile[y][x] = int(string_rep[i], 32)
i += 1
self.minitiles.tiles[n] = minitile
def arrangement_collision_string_rep(self, n):
arrangement = self.arrangements[n]
if arrangement is None:
return "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
else:
s = str()
collision = self.collisions[n]
for y in xrange(4):
for x in xrange(4):
s += "{:04x}{:02x}".format(arrangement[y][x], collision[y*4 + x])
return s
def arrangement_collision_from_string(self, n, string_rep):
#.........这里部分代码省略.........
示例10: DeathScreenModule
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
class DeathScreenModule(EbModule):
"""Extracts the death screen data from EarthBound."""
NAME = "Death Screen"
FREE_RANGES = [
(0x21cfaf, 0x21d4f3), # Tileset
(0x21d4f4, 0x21d5e7), # Palette
(0x21d5e8, 0x21d6e1) # Arrangement
]
def __init__(self):
super(DeathScreenModule, self).__init__()
self.tileset = EbGraphicTileset(
num_tiles=NUM_TILES, tile_width=TILE_WIDTH, tile_height=TILE_HEIGHT
)
self.arrangement = EbTileArrangement(
width=ARRANGEMENT_WIDTH, height=ARRANGEMENT_HEIGHT
)
self.palette = EbPalette(
num_subpalettes=NUM_SUBPALETTES,
subpalette_length=SUBPALETTE_LENGTH
)
def read_from_rom(self, rom):
with EbCompressibleBlock() as block:
# Read the tileset data
block.from_compressed_block(
block=rom, offset=from_snes_address(
read_asm_pointer(rom, TILESET_POINTER)
)
)
self.tileset.from_block(block=block, offset=0, bpp=TILESET_BPP)
# Read the arrangement data
block.from_compressed_block(
block=rom, offset=from_snes_address(
read_asm_pointer(rom, ARRANGEMENT_POINTER)
)
)
self.arrangement.from_block(block=block, offset=0)
# Read the palette data
block.from_compressed_block(
block=rom, offset=from_snes_address(
read_asm_pointer(rom, PALETTE_POINTER)
)
)
self.palette.from_block(block=block, offset=0)
def write_to_rom(self, rom):
# Write the tileset data
block_size = self.tileset.block_size(bpp=TILESET_BPP)
with EbCompressibleBlock(block_size) as block:
self.tileset.to_block(block=block, offset=0, bpp=TILESET_BPP)
self._write_compressed_block(rom, block, TILESET_POINTER)
# Write the tile arrangement data
block_size = self.arrangement.block_size()
with EbCompressibleBlock(block_size) as block:
self.arrangement.to_block(block=block, offset=0)
self._write_compressed_block(rom, block, ARRANGEMENT_POINTER)
# Write the palette data
block_size = self.palette.block_size()
with EbCompressibleBlock(block_size) as block:
self.palette.to_block(block=block, offset=0)
self._write_compressed_block(
rom, block, PALETTE_POINTER
)
def read_from_project(self, resource_open):
with resource_open(DEATH_SCREEN_PATH, "png") as f:
image = open_indexed_image(f)
self.arrangement.from_image(image, self.tileset, self.palette)
with resource_open(DEATH_SCREEN_SUBPALETTES_PATH, "yml", True) as f:
subpalettes = yml_load(f)
for subpalette, tiles in subpalettes.items():
for x, y in tiles:
self.arrangement[x, y].subpalette = subpalette
def write_to_project(self, resource_open):
with resource_open(DEATH_SCREEN_PATH, "png") as f:
image = self.arrangement.image(self.tileset, self.palette, True)
image.save(f)
with resource_open(DEATH_SCREEN_SUBPALETTES_PATH, "yml", True) as f:
subpalettes = {}
for x in range(ARRANGEMENT_WIDTH):
for y in range(ARRANGEMENT_HEIGHT):
subpalette = self.arrangement[x, y].subpalette
if subpalette not in subpalettes:
subpalettes[subpalette] = []
subpalettes[subpalette].append((x, y))
yml_dump(subpalettes, f, None)
def upgrade_project(
self, old_version, new_version, rom, resource_open_r,
resource_open_w, resource_delete):
if old_version < 9:
self.read_from_rom(rom)
#.........这里部分代码省略.........
示例11: TitleScreenModule
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
class TitleScreenModule(EbModule):
"""Extracts the title screen data from EarthBound.
This module allows for the editing of the background and characters
of the title screen. The slide-in animation for the characters is
controlled through assembly, while the rest of the animation works
by changing between several palettes (one for each new frame of
animation) and keeping the same tileset for each frame.
"""
NAME = "Title Screen"
FREE_RANGES = [
(0x21B211, 0x21C6E4), # Background Tileset
(0x21AF7D, 0x21B210), # Background Arrangement
(0x21CDE1, 0x21CE07), # Background Palette
(0x21AEFD, 0x21AF7C), # Background Animated Palette
(0x21C6E5, 0x21CDE0), # Characters Tileset
(0x21AE7C, 0x21AE82), # Characters Palette
(0x21AE83, 0x21AEFC), # Characters Animated Palette
(0x21CE08, 0x21CF9C) # Animation Data
]
def __init__(self):
super(TitleScreenModule, self).__init__()
# Background data (includes the central "B", the copyright
# notice and the glow around the letters)
self.bg_tileset = EbGraphicTileset(
num_tiles=BG_NUM_TILES, tile_width=TILE_WIDTH,
tile_height=TILE_HEIGHT
)
self.bg_arrangement = EbTileArrangement(
width=BG_ARRANGEMENT_WIDTH, height=BG_ARRANGEMENT_HEIGHT
)
self.bg_anim_palette = EbPalette(
num_subpalettes=BG_NUM_ANIM_SUBPALETTES,
subpalette_length=ANIM_SUBPALETTE_LENGTH
)
self.bg_palette = EbPalette(
num_subpalettes=NUM_SUBPALETTES,
subpalette_length=BG_SUBPALETTE_LENGTH
)
# Characters data (the title screen's animated letters)
self.chars_tileset = EbGraphicTileset(
num_tiles=CHARS_NUM_TILES, tile_width=TILE_WIDTH,
tile_height=TILE_HEIGHT
)
self.chars_anim_palette = EbPalette(
num_subpalettes=CHARS_NUM_ANIM_SUBPALETTES,
subpalette_length=ANIM_SUBPALETTE_LENGTH
)
self.chars_palette = EbPalette(
num_subpalettes=NUM_SUBPALETTES,
subpalette_length=CHARS_SUBPALETTE_LENGTH
)
self.chars_layouts = [[] for _ in range(NUM_CHARS)]
def read_from_rom(self, rom):
self.read_background_data_from_rom(rom)
self.read_chars_data_from_rom(rom)
self.read_chars_layouts_from_rom(rom)
# Add the characters palette to the background data.
self.bg_palette[0, CHARS_ANIM_SLICE] =\
self.chars_anim_palette.get_subpalette(
CHARS_NUM_ANIM_SUBPALETTES - 1
)[0, :]
def read_background_data_from_rom(self, rom):
with EbCompressibleBlock() as block:
# Read the background tileset data
self._decompress_block(rom, block, BG_TILESET_POINTER)
self.bg_tileset.from_block(
block=block, offset=0, bpp=BG_TILESET_BPP
)
# Read the background tile arrangement data
self._decompress_block(rom, block, BG_ARRANGEMENT_POINTER)
self.bg_arrangement.from_block(block=block, offset=0)
# Read the background palette data
# The decompressed data is smaller than the expected value,
# so it is extended with black entries.
self._decompress_block(rom, block, BG_PALETTE_POINTER)
block.from_array(
block.to_array() + [0]*(BG_SUBPALETTE_LENGTH*2 - len(block))
)
self.bg_palette.from_block(block=block, offset=0)
# Read the background animated palette data
# Each subpalette corresponds to an animation frame.
self._decompress_block(rom, block, BG_ANIM_PALETTE_POINTER)
self.bg_anim_palette.from_block(block=block, offset=0)
def read_chars_data_from_rom(self, rom):
with EbCompressibleBlock() as block:
# Read the characters tileset data
#.........这里部分代码省略.........
示例12: test_from_block_2bpp
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import from_block [as 别名]
def test_from_block_2bpp(self):
block = Block()
block.from_list(
[
0b01010101, # Tile 1
0b10111010,
0b01100100,
0b11001111,
0b10100000,
0b10111101,
0b11100001,
0b01101011,
0b10110111,
0b00000111,
0b11111010,
0b01111101,
0b00110010,
0b11101100,
0b00110110,
0b10111100,
0b11111001, # Tile 2
0b01101010,
0b10011000,
0b11111111,
0b11001011,
0b00111000,
0b01000001,
0b01110001,
0b11001010,
0b11000000,
0b01111010,
0b11011101,
0b00011011,
0b00001111,
0b00100001,
0b11110000,
]
)
tileset = EbGraphicTileset(num_tiles=2, tile_width=8, tile_height=8)
tileset.from_block(block, offset=0, bpp=2)
assert_list_equal(
tileset[0],
[
[2, 1, 2, 3, 2, 1, 2, 1],
[2, 3, 1, 0, 2, 3, 2, 2],
[3, 0, 3, 2, 2, 2, 0, 2],
[1, 3, 3, 0, 2, 0, 2, 3],
[1, 0, 1, 1, 0, 3, 3, 3],
[1, 3, 3, 3, 3, 2, 1, 2],
[2, 2, 3, 1, 2, 2, 1, 0],
[2, 0, 3, 3, 2, 3, 1, 0],
],
)
assert_list_equal(
tileset[1],
[
[1, 3, 3, 1, 3, 0, 2, 1],
[3, 2, 2, 3, 3, 2, 2, 2],
[1, 1, 2, 2, 3, 0, 1, 1],
[0, 3, 2, 2, 0, 0, 0, 3],
[3, 3, 0, 0, 1, 0, 1, 0],
[2, 3, 1, 3, 3, 2, 1, 2],
[0, 0, 0, 1, 3, 2, 3, 3],
[2, 2, 3, 2, 0, 0, 0, 1],
],
)