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


import os
import json
import struct
import re
import tkinter as tk
from tkinter import filedialog

def get_file_number(name):
    match = re.search(r'\d+', name)
    return match.group(0) if match else None

# Создаем скрытое окно для выбора папок мышкой
root = tk.Tk()
root.withdraw()

print("=== НАСТРОЙКА ПАПОК ДЛЯ СБОРКИ ===")

# 1. Выбираем папку с оригиналами
print("\n[1/2] Сейчас откроется окно. Выбери папку, где лежит твоя 1000 файлов игры (текстовые или .stcm2l)...")
orig_dir = filedialog.askdirectory(title="ВЫБЕРИ ПАПКУ С ОРИГИНАЛЬНЫМИ ФАЙЛАМИ ИГРЫ")
if not orig_dir:
    print("Выбор отменен.")
    exit()

# 2. Выбираем папку с JSON
print(f"Выбрана папка оригиналов: {orig_dir}")
print("\n[2/2] Сейчас откроется второе окно. Выбери папку 'json_output', где лежат твои русские JSON-файлы...")
json_dir = filedialog.askdirectory(title="ВЫБЕРИ ПАПКУ JSON_OUTPUT С ПЕРЕВОДОМ")
if not json_dir:
    print("Выбор отменен.")
    exit()
print(f"Выбрана папка JSON: {json_dir}")

# Создаем папку для готового мода прямо на Рабочем столе, чтобы не потерять
desktop = os.path.join(os.path.expanduser("~"), "Desktop")
output_folder = os.path.join(desktop, "RUSSIAN_MOD_DONE", "romfs", "SCRIPT")
os.makedirs(output_folder, exist_ok=True)

print("\n=== ЗАПУСК УМНОЙ СБОРКИ РУСИФИКАТОРА ===")
total_built = 0

# Карта JSON
json_map = {}
for j_name in os.listdir(json_dir):
    if j_name.lower().endswith(".json"):
        num = get_file_number(j_name)
        if num:
            json_map[num] = os.path.join(json_dir, j_name)

# Перебираем файлы игры
for file_name in os.listdir(orig_dir):
    orig_path = os.path.join(orig_dir, file_name)
    if os.path.isfile(orig_path) and not file_name.endswith(".py") and file_name != "README.txt":
        num = get_file_number(file_name)
        
        if num and num in json_map:
            json_path = json_map[num]
            
            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 {num}: {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 (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
                    
                    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"{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"Всего создано файлов: {total_built}")
print(f"Ищи готовую структуру папок для игры на своем Рабочем столе в папке 'RUSSIAN_MOD_DONE'!")