def get_string(self, offset): end = self.data.find(b'\x00', offset) if end == -1: end = offset + 64 return self.data[offset:end].decode('utf-8', errors='ignore')
def set_int(self, offset, value): self.data[offset:offset+4] = struct.pack('<I', int(value)) Titan Quest Android Save Editor
def show_info(self): name = self.get_string(0x04) level = self.get_int(0x44) gold = self.get_int(0x4C) self.name_label.config(text=f"Name: name") self.level_label.config(text=f"Level: level") self.gold_label.config(text=f"Gold: gold") # Populate entries with current values self.entries["Level"].delete(0, tk.END) self.entries["Level"].insert(0, str(level)) self.entries["Gold"].delete(0, tk.END) self.entries["Gold"].insert(0, str(gold)) self.entries["Strength"].delete(0, tk.END) self.entries["Strength"].insert(0, str(self.get_int(0x50))) self.entries["Dexterity"].delete(0, tk.END) self.entries["Dexterity"].insert(0, str(self.get_int(0x54))) self.entries["Intelligence"].delete(0, tk.END) self.entries["Intelligence"].insert(0, str(self.get_int(0x58))) self.entries["Skill Points"].delete(0, tk.END) self.entries["Skill Points"].insert(0, str(self.get_int(0x64))) self.entries["Attr Points"].delete(0, tk.END) self.entries["Attr Points"].insert(0, str(self.get_int(0x68))) def get_string(self, offset): end = self
def get_string(self, offset, max_len=64): end = self.data.find(b'\x00', offset, offset+max_len) if end == -1: end = offset + max_len return self.data[offset:end].decode('utf-8', errors='ignore') offset): end = self.data.find(b'\x00'
def backup(self): """Create a backup before editing""" self.backup_path = self.filepath.with_suffix('.que.bak') shutil.copy2(self.filepath, self.backup_path) print(f"Backup created: self.backup_path")