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


import os
import json
import struct

# Путь к вашей папке с переведенными JSON-файлами
JSON_FOLDER = os.path.expanduser("~/Downloads/files/original/json_output")
OUTPUT_FOLDER = "romfs/SCRIPT"
os.makedirs(OUTPUT_FOLDER, exist_ok=True)

if not os.path.exists(JSON_FOLDER):
    JSON_FOLDER = "files/original/json_output"
    if not os.path.exists(JSON_FOLDER):
        print("ОШИБКА: Не удалось найти папку с твоими JSON-файлами!")
        exit()

print("=== ЗАПУСК СБОРКИ ИЗ ТЕКСТОВЫХ ФАЙЛОВ ===")
total_built = 0

# Составляем карту переведенных файлов JSON
json_map = {}
for j_name in os.listdir(JSON_FOLDER):
    if j_name.lower().endswith(".json"):
        clean_num = os.path.splitext(j_name)[0]
        json_map[clean_num] = os.path.join(JSON_FOLDER, j_name)

# Сканируем файлы в текущей папке
for file_name in os.listdir("."):
    # Читаем файлы, которые стали .txt (но игнорируем сам скрипт)
    if file_name.endswith(".txt") and file_name != "README.txt" and not file_name.startswith("build"):
        # Получаем чистый номер файла (например, '203' из '203.txt' или '203.stcm2l.txt')
        clean_num = file_name.split('.')[0]
        
        if clean_num in json_map:
            json_path = json_map[clean_num]
            
            # Читаем файл как бинарный, несмотря на то, что у него расширение .txt
            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_name}: {e}")
                    continue
            
            items = []
            for addr_str, text in translations.items():
                addr_hex = addr_str.replace("[0x", "").replace("]", "")
                offset = int(addr_hex, 16)
                items.append((offset, text))
                
            # Сортируем с конца к началу, чтобы не сломать HEX-структуру
            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 (offset + orig_len) < len(data) and data[offset + orig_len] != 0:
                    orig_len += 1
                orig_len += 1 
                
                if (offset + orig_len) <= len(data):
                    data[offset : offset + orig_len] = new_bytes
                    
                    # Пересчитываем HEX-числа и указатели смещения для Nintendo Switch
                    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
            out_name = f"{clean_num}.DAT"
            with open(os.path.join(OUTPUT_FOLDER, out_name), "wb") as out:
                out.write(data)
                
            total_built += 1
            print(f"[{total_built}] Успешно собран игровой файл: {out_name}")

print(f"\n=== СБОРКА ИЗ ТЕКСТОВЫХ ФАЙЛОВ ЗАВЕРШЕНА! ===")
print(f"Успешно создано файлов в папке '{OUTPUT_FOLDER}': {total_built}")