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}'")