Загрузка данных


import os
import json
import struct

# Папка, куда скрипт сохранит готовые русские файлы для игры
OUTPUT_FOLDER = "SCRIPT"
os.makedirs(OUTPUT_FOLDER, exist_ok=True)

print("=== ЗАПУСК СБОРКИ РУСИФИКАТОРА ===")
total_built = 0

# Перебираем оригинальные файлы в текущей папке
for file_name in os.listdir("."):
    # Проверяем файлы игры (они могут быть .stcm2l или .DAT)
    if file_name.endswith((".stcm2l", ".DAT")):
        # Ищем для него переведенный JSON (имя файла без расширения + .json)
        base_name = os.path.splitext(file_name)[0]
        json_name = base_name + ".json"
        json_path = os.path.join("json_output", json_name)
        
        # Если нашли русский JSON для этого файла — собираем его!
        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:
                try:
                    translations = json.load(jf)
                except Exception as e:
                    print(f"Ошибка чтения JSON {json_name}: {e}")
                    continue
                
            # Парсим HEX-адреса и строки перевода
            items = []
            for addr_str, text in translations.items():
                addr_hex = addr_str.replace("[0x", "").replace("]", "")
                offset = int(addr_hex, 16)
                items.append((offset, text))
                
            # Сортируем с КОНЦА файла к началу (критично для стабильности движка Otomate)
            items.sort(key=lambda x: x[0], reverse=True)
            
            for offset, text in items:
                # Кодируем русский текст в UTF-8 (стандарт для Nintendo Switch)
                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
                
                # Магия Python: автоматический пересчет скрытых указателей (Pointers) движка
                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)
            
            # Сохраняем готовый русский файл СРАЗУ с расширением .DAT в папку SCRIPT
            out_file_name = base_name + ".DAT"
            with open(os.path.join(OUTPUT_FOLDER, out_file_name), "wb") as out:
                out.write(data)
                
            total_built += 1
            print(f"[{total_built}] Успешно собран русский файл: {out_file_name}")

print(f"\n=== СБОРКА ИЗ JSON ЗАВЕРШЕНА! ===")
print(f"Всего готово файлов: {total_built}. Ищи их в папке '{OUTPUT_FOLDER}'")