Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def handle_events(self, events):
global mark_counter, marked_tiles
self.tilemap.refresh_lcdc()
# Feed events into the loop
events = BaseDebugWindow.handle_events(self, events)
for event in events:
if event == WindowEvent._INTERNAL_MOUSE and event.window_id == self.window_id:
if event.mouse_button == 0:
tile_x, tile_y = event.mouse_x // self.scale // 8, event.mouse_y // self.scale // 8
tile_identifier = self.tilemap.tile_identifier(tile_x, tile_y)
logger.info(f"Tile clicked on {tile_x}, {tile_y}")
marked_tiles.add(
MarkedTile(tile_identifier=tile_identifier, mark_id="TILE", mark_color=MARK[mark_counter])
)
mark_counter += 1
mark_counter %= len(MARK)
elif event.mouse_button == 1:
marked_tiles.clear()
elif event == WindowEvent._INTERNAL_MARK_TILE:
marked_tiles.add(event.tile_identifier)
return events
This should only be called when the game has started.
Args:
amount (int): The wanted number of lives
"""
if not self.game_has_started:
logger.warning("Please call set_lives_left after starting the game")
if 0 <= amount <= 99:
tens = amount // 10
ones = amount % 10
self.pyboy.set_memory_value(ADDR_LIVES_LEFT, (tens << 4) | ones)
self.pyboy.set_memory_value(ADDR_LIVES_LEFT_DISPLAY, tens)
self.pyboy.set_memory_value(ADDR_LIVES_LEFT_DISPLAY + 1, ones)
else:
logger.error(f"{amount} is out of bounds. Only values between 0 and 99 allowed.")
def set_lives_left(self, amount):
"""
Set the amount lives to any number between 0 and 99.
This should only be called when the game has started.
Args:
amount (int): The wanted number of lives
"""
if not self.game_has_started:
logger.warning("Please call set_lives_left after starting the game")
if 0 <= amount <= 99:
tens = amount // 10
ones = amount % 10
self.pyboy.set_memory_value(ADDR_LIVES_LEFT, (tens << 4) | ones)
self.pyboy.set_memory_value(ADDR_LIVES_LEFT_DISPLAY, tens)
self.pyboy.set_memory_value(ADDR_LIVES_LEFT_DISPLAY + 1, ones)
else:
logger.error(f"{amount} is out of bounds. Only values between 0 and 99 allowed.")
def flush(self):
if self.zeros > 0:
chunks = self.zeros // 0xFF
rest = self.zeros % 0xFF
for i in range(chunks):
FixedAllocBuffers.write(self, 0)
FixedAllocBuffers.write(self, 0xFF)
if (rest != 0):
FixedAllocBuffers.write(self, 0)
FixedAllocBuffers.write(self, rest)
self.zeros = 0
FixedAllocBuffers.flush(self)
return False
# Increment the active section and fetch its pointer position
tail = self.sections[self.current_section]
self.current_section += 1
head = self.sections[self.current_section]
# Refine the new head and tail
self.section_tail, self.section_head = tail, head
# Seeks the section to 0, ready for reading
self.section_pointer = self.section_tail
return True
class CompressedFixedAllocBuffers(FixedAllocBuffers):
def __init__(self):
FixedAllocBuffers.__init__(self)
self.zeros = 0
def flush(self):
if self.zeros > 0:
chunks = self.zeros // 0xFF
rest = self.zeros % 0xFF
for i in range(chunks):
FixedAllocBuffers.write(self, 0)
FixedAllocBuffers.write(self, 0xFF)
if (rest != 0):
FixedAllocBuffers.write(self, 0)
FixedAllocBuffers.write(self, rest)
def flush(self):
if self.zeros > 0:
chunks = self.zeros // 0xFF
rest = self.zeros % 0xFF
for i in range(chunks):
FixedAllocBuffers.write(self, 0)
FixedAllocBuffers.write(self, 0xFF)
if (rest != 0):
FixedAllocBuffers.write(self, 0)
FixedAllocBuffers.write(self, rest)
self.zeros = 0
FixedAllocBuffers.flush(self)
self.sprite = SpriteWindow(
pyboy,
mb,
pyboy_argv,
scale=3,
title="Sprite Data",
width=8 * 10,
height=16 * 4,
pos_x=window_pos,
pos_y=self.spriteview.height * 2 + 68
)
window_pos += (constants.COLS * self.spriteview.scale)
tile_data_width = 16 * 8 # Change the 16 to however wide you want the tile window
tile_data_height = ((constants.TILES * 8) // tile_data_width) * 8
self.tiledata = TileDataWindow(
pyboy,
mb,
pyboy_argv,
scale=3,
title="Tile Data",
width=tile_data_width,
height=tile_data_height,
pos_x=window_pos,
pos_y=0
)
def post_tick(self):
tile_cache0 = self.renderer._tilecache
for t in range(constants.TILES):
xx = (t*8) % self.width
yy = ((t*8) // self.width) * 8
self.copy_tile(tile_cache0, t, xx, yy, self.buf0)
self.draw_overlay()
BaseDebugWindow.post_tick(self)
def post_tick(self):
tile_cache0 = self.renderer._tilecache
# Updating screen buffer by copying tiles from cache
mem_offset = self.tilemap.map_offset - constants.VRAM_OFFSET
for n in range(mem_offset, mem_offset + 0x400):
tile_index = self.mb.lcd.VRAM[n]
# Check the tile source and add offset
# http://problemkaputt.de/pandocs.htm#lcdcontrolregister
# BG & Window Tile Data Select (0=8800-97FF, 1=8000-8FFF)
if self.mb.lcd.LCDC.tiledata_select == 0:
# (x ^ 0x80 - 128) to convert to signed, then add 256 for offset (reduces to + 128)
tile_index = (tile_index ^ 0x80) + 128
tile_column = (n-mem_offset) % 32
tile_row = (n-mem_offset) // 32
self.copy_tile(tile_cache0, tile_index, tile_column * 8, tile_row * 8, self.buf0)
self.draw_overlay()
def handle_events(self, events):
global mark_counter, marked_tiles
# Feed events into the loop
events = BaseDebugWindow.handle_events(self, events)
sprite_height = 16 if self.mb.lcd.LCDC.sprite_height else 8
for event in events:
if event == WindowEvent._INTERNAL_MOUSE and event.window_id == self.window_id:
if event.mouse_button == 0:
tile_x, tile_y = event.mouse_x // self.scale // 8, event.mouse_y // self.scale // sprite_height
sprite_identifier = tile_y * (self.width // 8) + tile_x
if sprite_identifier > constants.SPRITES:
# Out of bounds
continue
sprite = Sprite(self.mb, sprite_identifier)
marked_tiles.add(
MarkedTile(
tile_identifier=sprite.tile_identifier,
mark_id="SPRITE",
mark_color=MARK[mark_counter],
sprite_height=sprite_height,
sprite=True,
)
)
mark_counter += 1
mark_counter %= len(MARK)
elif event.mouse_button == 1:
marked_tiles.clear()