本文整理汇总了Python中coilsnake.model.eb.graphics.EbGraphicTileset.block_size方法的典型用法代码示例。如果您正苦于以下问题:Python EbGraphicTileset.block_size方法的具体用法?Python EbGraphicTileset.block_size怎么用?Python EbGraphicTileset.block_size使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类coilsnake.model.eb.graphics.EbGraphicTileset
的用法示例。
在下文中一共展示了EbGraphicTileset.block_size方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: EbCreditsFont
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import block_size [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 block_size [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
示例3: SoundStoneModule
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import block_size [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)
示例4: WindowGraphicsModule
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import block_size [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:
#.........这里部分代码省略.........
示例5: EbTileset
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import block_size [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):
#.........这里部分代码省略.........
示例6: DeathScreenModule
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import block_size [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)
#.........这里部分代码省略.........
示例7: TitleScreenModule
# 需要导入模块: from coilsnake.model.eb.graphics import EbGraphicTileset [as 别名]
# 或者: from coilsnake.model.eb.graphics.EbGraphicTileset import block_size [as 别名]
#.........这里部分代码省略.........
lda_instruction = rom[CHARS_LAYOUT_BANK]
chars_layout_pointer_offset = CHARS_LAYOUT_POINTER_OFFSET_DEFAULT
# Check if we are dealing with the modified Rom,
# If we are, we need to recalculate the offset to the
# character layouts
if lda_instruction == 0xA9:
bank = rom[CHARS_LAYOUT_BANK + 1]
chars_layout_pointer_offset = from_snes_address(bank << 16)
self.chars_layouts = [[] for _ in range(NUM_CHARS)]
for char in range(NUM_CHARS):
# Get the location of a character's data
offset = chars_layout_pointer_offset + rom.read_multi(
CHARS_LAYOUT_TABLE + char*2, 2
)
# Read entries until a final entry is encountered
while True:
entry = TitleScreenLayoutEntry()
entry.from_block(rom, offset)
self.chars_layouts[char].append(entry)
offset += 5
if entry.is_final():
break
def write_to_rom(self, rom):
self.write_background_data_to_rom(rom)
self.write_chars_data_to_rom(rom)
self.write_chars_layouts_to_rom(rom)
def write_background_data_to_rom(self, rom):
# Write the background tileset data
block_size = self.bg_tileset.block_size(bpp=BG_TILESET_BPP)
with EbCompressibleBlock(block_size) as block:
self.bg_tileset.to_block(block=block, offset=0, bpp=BG_TILESET_BPP)
self._write_compressed_block(rom, block, BG_TILESET_POINTER)
# Write the background tile arrangement data
block_size = self.bg_arrangement.block_size()
with EbCompressibleBlock(block_size) as block:
self.bg_arrangement.to_block(block=block, offset=0)
self._write_compressed_block(rom, block, BG_ARRANGEMENT_POINTER)
# Write the background palette data
# There is an additional pointer to this location, so change that one
# too
block_size = self.bg_palette.block_size()
with EbCompressibleBlock(block_size) as block:
self.bg_palette.to_block(block=block, offset=0)
new_offset = self._write_compressed_block(
rom, block, BG_PALETTE_POINTER
)
write_asm_pointer(
block=rom, offset=BG_PALETTE_POINTER_SECONDARY,
pointer=to_snes_address(new_offset)
)
# Write the background animated palette data
block_size = self.bg_anim_palette.block_size()
with EbCompressibleBlock(block_size) as block:
self.bg_anim_palette.to_block(block=block, offset=0)
self._write_compressed_block(rom, block, BG_ANIM_PALETTE_POINTER)
def write_chars_data_to_rom(self, rom):
# Write the characters tileset data