from level.Level import Level from level.elements.ButtonInputLevelElement import ButtonInputLevelElement from level.elements.LeverInputLevelElement import LeverInputLevelElement from level.elements.SimpleBlockLevelElement import SimpleBlockLevelElement from level.elements.UnknownTileLevelElement import UnknownTileLevelElement from physics import ConstantsParser from physics.SpriteManager import SpriteManager, DrawLayers from sprite.SpritesheetManager import SpritesheetManager TILES = { '#': SimpleBlockLevelElement, '+': SimpleBlockLevelElement, '-': SimpleBlockLevelElement, 'l': SimpleBlockLevelElement, 'r': SimpleBlockLevelElement, '~': SimpleBlockLevelElement, '|': SimpleBlockLevelElement, 'P': ButtonInputLevelElement, 'L': LeverInputLevelElement, } class LoadedLevel: def __init__(self, sprite_manager: SpriteManager, spritesheet_manager: SpritesheetManager): self.sprite_manager = sprite_manager self.spritesheet_manager = spritesheet_manager self.blocks = [] def load_level(self, level: Level): for row_number, row in enumerate(level.tiles): for tile_number, tile in enumerate(row): world_position = (tile_number, row_number) position = (tile_number * ConstantsParser.CONFIG.block_size[0], row_number * ConstantsParser.CONFIG.block_size[1]) tile['world_position'] = world_position tile['position'] = position name = tile['name'] element = None if name in TILES: element = TILES[name](tile, self) elif not name == '': print(f"Unknown tile at {position}: {name}") element = UnknownTileLevelElement(tile, self) if element: self.blocks.append(element) self.sprite_manager.add_ui_element(DrawLayers.OBJECTS, element) element.load(self.sprite_manager, self.spritesheet_manager, level) if isinstance(element, SimpleBlockLevelElement): if self.is_surrounded_by_blocks(world_position, level.tiles): element.is_collider = False element.register_collisions = False # self.sprite_manager.remove_ui_element(element) def is_surrounded_by_blocks(self, position, tiles): for i in range(-1, 2): for j in range(-1, 2): if i == 0 and j == 0: continue if position[0] + i < 0 or position[0] + i >= len(tiles[0]): continue if position[1] + j < 0 or position[1] + j >= len(tiles): continue tile = tiles[position[1] + j][position[0] + i] if not tile['name'] in ['#', '+', '-', 'l', 'r', '~', '|']: return False return True def destroy_level(self): for block in self.blocks: self.sprite_manager.remove_ui_element(block) del self.blocks