def __init__(self, level_name: str, layout_address: int, enemy_data_offset: int, object_set_number: int): super(Level, self).__init__(object_set_number, layout_address) self._signal_emitter = LevelSignaller() self.attached_to_rom = True self.object_set = ObjectSet(object_set_number) self.undo_stack = UndoStack() self.name = level_name self.header_offset = layout_address self.enemy_offset = enemy_data_offset self.objects: List[LevelObject] = [] self.jumps: List[Jump] = [] self.enemies: List[EnemyObject] = [] rom = ROM() self.header_bytes = rom.bulk_read(Level.HEADER_LENGTH, self.header_offset) self._parse_header() self.object_offset = self.header_offset + Level.HEADER_LENGTH object_data = ROM.rom_data[self.object_offset:] enemy_data = ROM.rom_data[self.enemy_offset:] self._load_level_data(object_data, enemy_data) self.changed = False
def __init__(self, world: int, level: int, layout_address: int, enemy_data_offset: int, object_set_number: int): super(Level, self).__init__(object_set_number, layout_address) self._signal_emitter = LevelSignaller() self.attached_to_rom = True self.object_set = ObjectSet(object_set_number) self.undo_stack = UndoStack() level_index = Level.world_indexes[world] + level level_data: Mario3Level = Level.offsets[level_index] if world == 0: self.name = level_data.name else: self.name = f"Level {world}-{level}, '{level_data.name}'" # TODO get rid of this; only used for naming and M3L header self.world = world self.level_number = level self.header_offset = layout_address self.enemy_offset = enemy_data_offset self.objects: List[LevelObject] = [] self.jumps: List[Jump] = [] self.enemies: List[EnemyObject] = [] rom = ROM() self.header_bytes = rom.bulk_read(Level.HEADER_LENGTH, self.header_offset) self._parse_header() self.object_offset = self.header_offset + Level.HEADER_LENGTH object_data = ROM.rom_data[self.object_offset:] enemy_data = ROM.rom_data[self.enemy_offset:] self._load_level_data(object_data, enemy_data) self.changed = False