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


import os
import json
import struct

# Создаем понятную структуру папок прямо там, где запущен скрипт
ORIGINALS_DIR = "1_ORIGINAL_FILES"
JSON_DIR = "2_TRANSLATED_JSON"
OUTPUT_DIR = "romfs/SCRIPT"

os.makedirs(ORIGINALS_DIR, exist_ok=True)
os.makedirs(JSON_DIR, exist_ok=True)
os.makedirs(OUTPUT_DIR, exist_ok=True)

# Проверяем, положил ли пользователь файлы
originals_list = [f for f in os.listdir(ORIGINALS_DIR) if os.path.isfile(os.path.join(ORIGINALS_DIR, f))]
json_list = [f for f in os.listdir(JSON_DIR) if f.lower().endswith(".json")]

if not originals_list or not json_list:
    print("\n=== ВНИМАНИЕ! КУДА ПОЛОЖИТЬ ФАЙЛЫ: ===")
    print(f"1. Сложи все ОРИГИНАЛЬНЫЕ файлы игры в папку: '{ORIGINALS_DIR}'")
    print(f"2. Сложи все твои переведенные .JSON файлы в папку: '{JSON_DIR}'")
    print("\nКак только перенесешь файлы в эти папки, ЗАПУСТИ СКРИПТ ЕЩЕ РАЗ!")
    exit()

print("=== ЗАПУСК АВТОМАТИЧЕСКОЙ СБОРКИ ===")
total_built = 0

# Создаем карту JSON файлов по их чистым именам (без расширений)
json_map = {}
for j_name in json_list:
    clean_name = os.path.splitext(j_name)[0]
    json_map[clean_name] = os.path.join(JSON_DIR, j_name)

# Перебираем оригинальные файлы
for file_name in originals_list:
    clean_name = os.path.splitext(file_name)[0]
    
    if clean_name in json_map:
        orig_path = os.path.join(ORIGINALS_DIR, file_name)
        json_path = json_map[clean_name]
        
        with open(orig_path, "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 {file_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))
            
        # Сортировка с конца к началу
        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
            
            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_file_name = f"{clean_name}.DAT"
        with open(os.path.join(OUTPUT_DIR, 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}")
print(f"Они уже лежат в идеальной структуре в папке: '{OUTPUT_DIR}'")