import os
import json
import struct
OUTPUT_FOLDER = "STCM2L_RUSSIAN"
os.makedirs(OUTPUT_FOLDER, exist_ok=True)
print("Сборка файлов .stcm2l из переведенных JSON...")
total_built = 0
for file_name in os.listdir("."):
if file_name.endswith(".stcm2l"):
json_name = file_name.replace(".stcm2l", ".json")
json_path = os.path.join("json_output", json_name)
if os.path.exists(json_path):
with open(file_name, "rb") as f:
data = bytearray(f.read())
with open(json_path, "r", encoding="utf-8") as jf:
translations = json.load(jf)
# Парсим адреса и переводы
items = []
for addr_str, text in translations.items():
addr_hex = addr_str.replace("[0x", "").replace("]", "")
offset = int(addr_hex, 16)
items.append((offset, text))
# Сортируем с конца файла к началу, чтобы сдвиги байт не ломали адреса
items.sort(key=lambda x: x[0], reverse=True)
for offset, text in items:
new_bytes = text.encode('utf-8') + b'\x00'
orig_len = 0
while data[offset + orig_len] != 0:
orig_len += 1
orig_len += 1
data[offset : offset + orig_len] = new_bytes
# Корректируем указатели смещения движка Otomate
diff = len(new_bytes) - orig_len
if diff != 0:
for i in range(0, len(data) - 4, 4):
val = struct.unpack("<I", data[i:i+4])[0]
if val > offset and val < len(data): # Защита от выхода за границы
data[i:i+4] = struct.pack("<I", val + diff)
with open(os.path.join(OUTPUT_FOLDER, file_name), "wb") as out:
out.write(data)
total_built += 1
print(f"Собран файл: {file_name}")
print(f"Готово! Все русские файлы собраны в папке '{OUTPUT_FOLDER}'")