def add_new_constraint(self, constraint: Constraint) -> None: # Check that constraint is valid constraint_manager = ConstraintManager({RomVariant.USA, RomVariant.DEMO, RomVariant.EU, RomVariant.JP, RomVariant.DEMO_JP, RomVariant.CUSTOM, RomVariant.CUSTOM_EU, RomVariant.CUSTOM_JP, RomVariant.CUSTOM_DEMO_USA, RomVariant.CUSTOM_DEMO_JP}) constraint_manager.add_all_constraints( get_constraint_database().get_constraints()) try: constraint_manager.add_constraint(constraint) constraint_manager.rebuild_relations() except InvalidConstraintError as e: QMessageBox.critical(self.parent(), 'Add constraint', 'Invalid Constraint') return get_constraint_database().add_constraint(constraint)
def mark_only_in_one(self, controller: HexViewerController, virtual_address: int, length: int) -> None: rom_variant = controller.rom_variant # TODO show dialog for inputs certainty = 1 author = settings.get_username() note = 'Only in ' + rom_variant enabled = True # Get the end of the section only in this variant + 1 local_address = self.constraint_manager.to_local( rom_variant, virtual_address + length) new_constraints = [] for variant in self.linked_variants: if variant != rom_variant: # Link it to the start of the selection in all other variants la = self.constraint_manager.to_local(variant, virtual_address) constraint = Constraint( rom_variant, local_address, variant, la, certainty, author, note, enabled) new_constraints.append(constraint) # Check whether the new constraint is invalid constraint_manager = ConstraintManager({RomVariant.USA, RomVariant.DEMO, RomVariant.EU, RomVariant.JP, RomVariant.DEMO_JP, RomVariant.CUSTOM, RomVariant.CUSTOM_EU, RomVariant.CUSTOM_JP, RomVariant.CUSTOM_DEMO_USA, RomVariant.CUSTOM_DEMO_JP}) constraint_manager.add_all_constraints( get_constraint_database().get_constraints()) try: constraint_manager.add_all_constraints(new_constraints) except InvalidConstraintError as e: raise e constraint_database = get_constraint_database() constraint_database.add_constraints(new_constraints) print(f'mark only in one {rom_variant} {virtual_address} {length}')
def add_pointers_and_constraints(self, pointer: Pointer) -> bool: """ Add a pointer that is the same for all variants and the resulting constraints. Returns true if the constraint changes the relations between the files. """ # Found new_pointers = [pointer] new_constraints = [] virtual_address = self.constraint_manager.to_virtual( pointer.rom_variant, pointer.address) for variant in self.linked_variants: if variant != pointer.rom_variant: address = self.constraint_manager.to_local( variant, virtual_address) points_to = get_rom(variant).get_pointer(address) # Add a corresponding pointer for this variant new_pointers.append(Pointer( variant, address, points_to, pointer.certainty, pointer.author, pointer.note)) # Add a constraint for the places that these two pointers are pointing to, as the pointers should be the same # TODO check that it's actually a pointer into rom note = f'Pointer at {pointer.rom_variant} {hex(pointer.address)}' if pointer.note.strip() != '': note += '\n' + pointer.note # TODO test that adding the added constraints are not invalid # TODO It might be that a constraint that is added with the new_constraints invalidates some other newly added # constraint which then would need to be enabled. Need to test for all new_constraints whether they are actually still valid after adding them to the constraint manager? enabled = self.constraint_manager.to_virtual( pointer.rom_variant, pointer.points_to-ROM_OFFSET) != self.constraint_manager.to_virtual(variant, points_to-ROM_OFFSET) print(f'Add constraint {enabled}') new_constraints.append(Constraint(pointer.rom_variant, pointer.points_to-ROM_OFFSET, variant, points_to-ROM_OFFSET, pointer.certainty, pointer.author, note, enabled)) # Show dialog if one constraint was new one_enabled = False for constraint in new_constraints: if constraint.enabled: one_enabled = True break if one_enabled: # TODO we cannot be sure yet that the one enabled constraint does not interfere with the disabled constraint, # so just enable all constraints again (and disable them later via the constraint cleaner plugin) for constraint in new_constraints: constraint.enabled = True # Check whether the new constraint is invalid constraint_manager = ConstraintManager({RomVariant.USA, RomVariant.DEMO, RomVariant.EU, RomVariant.JP, RomVariant.DEMO_JP, RomVariant.CUSTOM, RomVariant.CUSTOM_EU, RomVariant.CUSTOM_JP, RomVariant.CUSTOM_DEMO_USA, RomVariant.CUSTOM_DEMO_JP}) constraint_manager.add_all_constraints( get_constraint_database().get_constraints()) try: constraint_manager.add_all_constraints(new_constraints) except InvalidConstraintError as e: raise e print('Adding to database') pointer_database = get_pointer_database() pointer_database.add_pointers(new_pointers) constraint_database = get_constraint_database() constraint_database.add_constraints(new_constraints) return one_enabled