Files
ichni_Official/Assets/Scripts/Game/clean_bm.py
SoulliesOfficial 7580c4d87c 大更
2026-03-14 03:13:10 -04:00

102 lines
4.0 KiB
Python

import os
import re
directory = r"d:\Projects\ichni Official\Assets\Scripts\Game"
skip_dir = r"d:\Projects\ichni Official\Assets\Scripts\Game\BeatmapEditor" # Skip if there's any Editor specific directory. But user said "Game文件夹".
def clean_file(filepath):
# Do not process BM format classes if they contain definitions of SaveBM or something, but realistically BM classes use ExecuteBM.
# The user instruction: "把没有实际作用的SaveBM和ConvertToBM的函数剔除"
try:
with open(filepath, 'r', encoding='utf-8') as f:
lines = f.readlines()
except Exception as e:
print("Error reading", filepath, e)
return
out_lines = []
i = 0
changed = False
deleting_method = False
brace_depth = 0
has_seen_open_brace = False
while i < len(lines):
line = lines[i]
if not deleting_method:
# We look for SaveBM or ConvertToBM declarations.
# E.g. `public override void SaveBM()` or `public FlexibleFloat_BM ConvertToBM()`
if re.search(r'\bvoid\s+SaveBM\s*\(', line) or re.search(r'\b\w+_BM\b\s+ConvertToBM\s*\(', line) or re.search(r'\bBaseElement_BM\b\s+ConvertToBM\s*\(', line) or re.search(r'\bFlexible[a-zA-Z]*_BM\b\s+ConvertToBM\s*\(', line) or "public void SaveBM()" in line or "public override void SaveBM()" in line or "ConvertToBM()" in line:
# if there is a doc comment before this line, we'd ideally remove it too.
# Let's remove the previous lines if they are '///' or '[Button]'
idx = len(out_lines) - 1
while idx >= 0:
prev_line = out_lines[idx].strip()
if prev_line.startswith('///') or prev_line.startswith('[') or prev_line == "":
out_lines.pop(idx)
idx -= 1
else:
break
deleting_method = True
brace_depth = 0
has_seen_open_brace = False
if '{' in line:
brace_depth += line.count('{')
has_seen_open_brace = True
if '}' in line:
brace_depth -= line.count('}')
if brace_depth == 0 and has_seen_open_brace:
deleting_method = False
# Check for one-liner interface without braces
if ';' in line and not has_seen_open_brace:
deleting_method = False
changed = True
i += 1
continue
else:
if '{' in line:
brace_depth += line.count('{')
has_seen_open_brace = True
if '}' in line:
brace_depth -= line.count('}')
if brace_depth <= 0 and has_seen_open_brace:
deleting_method = False
i += 1
continue
out_lines.append(line)
i += 1
if not changed:
return
text = "".join(out_lines)
# Remove empty partial classes
# e.g. public partial class TrackTotalTimeChange { }
text = re.sub(r'(public|protected|private)?\s*partial\s+class\s+\w+\s*\{[\s\n]*\}', '', text)
# Remove empty Region blocks
text = re.sub(r'#region\s+\[存档转换\]\s*Beatmap Data Conversion[\s\n]*#endregion', '', text)
# Clean up excess newlines
text = re.sub(r'\n\s*\n\s*\n', '\n\n', text)
with open(filepath, 'w', encoding='utf-8') as f:
f.write(text)
print("Cleaned:", filepath)
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.cs'):
filepath = os.path.join(root, file)
# Do not touch files in Base/Beatmap if they are definitions of the BM format themselves, unless they have ConvertToBM which they dont
clean_file(filepath)