import math in_file_path = r"C:\Users\mzhan\OneDrive\Documents\deadcodehs\spelunker\Unknown Artist - Spelunker (IOException) [Hyper].osu" out_file_path = r"C:\Users\mzhan\AppData\Local\osu!\Songs\1145452 Unknown Artist - Spelunker\Unknown Artist - Spelunker (IOException) [Hyper].osu" radius = 62.0 CENTER_X = 256 CENTER_Y = 192 # start at (r, 0) positions = [] theta = 0.0 for i in range(6): positions.append((radius * math.cos(theta), radius * math.sin(theta))) theta += math.pi / 3 # print(positions) with open(in_file_path, "rb") as f: data = f.readlines() def correct_position(x, y): min_dist = None min_idx = None distances = [] for i, (px, py) in enumerate(positions): dx = x - px dy = y - py distance = math.sqrt(dx * dx + dy * dy) # print((x, y), (px, py), (dx, dy), distance) distances.append(distance) if min_dist is None or distance < min_dist: min_dist = distance min_idx = i # print(min_dist, min_idx, sorted(distances)) return positions[min_idx] with open(out_file_path, "wb") as f: section = b"" c = 0 for line in data: if line.startswith(b"Version"): line = line.replace(b"top-rhythm'", b"Prece Enter Key") line = line.strip() if not line: continue if line.startswith(b"[") and line.endswith(b"]"): section = line.lstrip(b"[").rstrip(b"]") # print(section, line) if section != b"HitObjects": f.write(line + b"\n") continue parts = line.split(b",") if len(parts) > 2: x, y = correct_position(int(parts[0]) - CENTER_X, int(parts[1]) - CENTER_Y) x = int(x) + CENTER_X y = int(y) + CENTER_Y parts[0] = str(x).encode("utf-8") # print(parts) parts[1] = str(y).encode("utf-8") c = (c + 1) % len(positions) if len(parts) > 3 and int(parts[3]) & 2 == 2: sliderparts = parts[5].split(b"|") ctype = sliderparts.pop(0) newpart = [ctype] for pt in sliderparts: ax, ay = pt.split(b":") ax = int(ax) ay = int(ay) ax2, ay2 = correct_position(ax - CENTER_X, ay - CENTER_Y) ax2 = int(ax2) + CENTER_X ay2 = int(ay2) + CENTER_Y newpart.append(f"{ax2}:{ay2}".encode("utf-8")) parts[5] = b"|".join(newpart) line = b",".join(parts) f.write(line + b"\n")