Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import json
- import shutil
- import tkinter as tk
- import math
- import sys
- import time
- # Функция для пересчёта путей к файлам конфигураций
- def update_config_paths():
- global BUILDINGS_FILE, PERKS_FILE, CONFIG_PATH
- global SCRIPT_PATH # Используем глобальную переменную
- # Пересчитываем пути с учётом нового пути SCRIPT_PATH
- CONFIG_PATH = os.path.join(SCRIPT_PATH, "Holly_Data", "StreamingAssets", "Data", "Configs")
- BUILDINGS_FILE = os.path.join(CONFIG_PATH, "Buildings.json")
- PERKS_FILE = os.path.join(CONFIG_PATH, "Perks.json")
- # Определяем путь к папке с игрой. Мы будем считать, что скрипт всегда находится в корне игры.
- if getattr(sys, 'frozen', False): # Проверяем, запущен ли файл как exe
- SCRIPT_PATH = os.path.dirname(sys.executable) # Получаем путь к директории, где находится .exe
- else:
- SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__)) # Для обычного Python скрипта
- # Изначально обновим пути к конфигам
- update_config_paths()
- # Функция для загрузки файла JSON
- def load_json_file(file_path, log_widget):
- if not os.path.exists(file_path):
- log_widget.insert(tk.END, f"Ошибка: Файл {file_path} не найден!\n")
- log_widget.yview(tk.END)
- return None
- with open(file_path, 'r', encoding='utf-8') as file:
- return json.load(file)
- # Функция для сохранения изменений в файл JSON
- def save_json_file(file_path, data, log_widget):
- with open(file_path, 'w', encoding='utf-8') as file:
- json.dump(data, file, indent=2, ensure_ascii=False)
- log_widget.insert(tk.END, f"Изменения успешно сохранены в {file_path}.\n")
- log_widget.yview(tk.END)
- # Функция для обработки введённого значения и конвертации его в абсолютное изменение или процент
- def parse_input(value, log_widget):
- if not value:
- return None, None
- # Проверка на процент
- if "%" in value:
- try:
- percent = int(value.replace("%", ""))
- if percent < -100 or percent > 100:
- log_widget.insert(tk.END, "Ошибка: процент должен быть от -100 до 100.\n")
- log_widget.yview(tk.END)
- return None, None
- return percent, None
- except ValueError:
- log_widget.insert(tk.END, "Ошибка: неверный формат процента.\n")
- log_widget.yview(tk.END)
- return None, None
- else:
- try:
- absolute_change = int(value)
- if absolute_change < -2147483648 or absolute_change > 2147483647: # Ограничение int32
- log_widget.insert(tk.END, "Ошибка: значение должно быть в пределах int32.\n")
- log_widget.yview(tk.END)
- return None, None
- return None, absolute_change
- except ValueError:
- log_widget.insert(tk.END, "Ошибка: неверный формат числа.\n")
- log_widget.yview(tk.END)
- return None, None
- # Функция для применения изменений в Perks.json
- def apply_study_changes(log_widget, value):
- global SCRIPT_PATH # Используем глобальную переменную
- percent, absolute_change = parse_input(value, log_widget)
- if percent is None and absolute_change is None:
- return
- data = load_json_file(PERKS_FILE, log_widget)
- if data:
- modified = False
- for key in data:
- if "duration" in data[key]:
- original_value = data[key]["duration"]
- if original_value < 0:
- log_widget.insert(tk.END, f"Перки: Ключ {key} имеет значение {original_value}. Оставляем без изменений.\n")
- continue
- if original_value == 0 and absolute_change is not None:
- new_value = absolute_change
- else:
- if percent is not None:
- new_value = int(math.floor(original_value * (1 + percent / 100)))
- elif absolute_change is not None:
- new_value = absolute_change # Применяем абсолютное изменение, а не прибавляем
- else:
- continue
- log_widget.insert(tk.END, f"Перки: Ключ {key}: {original_value} → {new_value}.\n")
- data[key]["duration"] = new_value
- modified = True
- if modified:
- save_json_file(PERKS_FILE, data, log_widget)
- # Функция для применения изменений в Buildings.json
- def apply_build_changes(log_widget, value):
- global SCRIPT_PATH # Используем глобальную переменную
- percent, absolute_change = parse_input(value, log_widget)
- if percent is None and absolute_change is None:
- return
- data = load_json_file(BUILDINGS_FILE, log_widget)
- if data:
- modified = False
- for key in data:
- if "baseDuration" in data[key]:
- original_value = data[key]["baseDuration"]
- if original_value < 0:
- log_widget.insert(tk.END, f"Здания: Ключ {key} имеет значение {original_value}. Оставляем без изменений.\n")
- continue
- if original_value == 0 and absolute_change is not None:
- new_value = absolute_change
- else:
- if percent is not None:
- new_value = int(math.floor(original_value * (1 + percent / 100)))
- elif absolute_change is not None:
- new_value = absolute_change # Применяем абсолютное изменение, а не прибавляем
- else:
- continue
- log_widget.insert(tk.END, f"Здания: Ключ {key}: {original_value} → {new_value}.\n")
- data[key]["baseDuration"] = new_value
- modified = True
- if modified:
- save_json_file(BUILDINGS_FILE, data, log_widget)
- # Функция для создания резервной копии файлов
- def handle_backup(log_widget):
- global SCRIPT_PATH # Используем глобальную переменную
- # Папка для резервных копий
- backup_dir = os.path.join(SCRIPT_PATH, "BackupFiles")
- if not os.path.exists(backup_dir):
- os.makedirs(backup_dir) # Создаём папку для бэкапов, если она не существует
- # Генерируем уникальное имя для копий (с использованием времени)
- timestamp = str(int(time.time()))
- backup_buildings = os.path.join(backup_dir, f"Buildings_{timestamp}.json")
- backup_perks = os.path.join(backup_dir, f"Perks_{timestamp}.json")
- # Копируем файлы, если они существуют
- try:
- if os.path.exists(BUILDINGS_FILE):
- shutil.copy(BUILDINGS_FILE, backup_buildings)
- log_widget.insert(tk.END, f"Резервная копия Buildings.json сохранена: {backup_buildings}\n")
- else:
- log_widget.insert(tk.END, "Ошибка: файл Buildings.json не найден для бэкапа.\n")
- if os.path.exists(PERKS_FILE):
- shutil.copy(PERKS_FILE, backup_perks)
- log_widget.insert(tk.END, f"Резервная копия Perks.json сохранена: {backup_perks}\n")
- else:
- log_widget.insert(tk.END, "Ошибка: файл Perks.json не найден для бэкапа.\n")
- log_widget.yview(tk.END) # Прокручиваем окно логов до конца
- except Exception as e:
- log_widget.insert(tk.END, f"Ошибка при создании резервной копии: {e}\n")
- log_widget.yview(tk.END)
- # Основная функция для создания интерфейса
- def create_interface():
- global SCRIPT_PATH # Используем глобальную переменную
- root = tk.Tk()
- root.title("Редактор конфигураций игры")
- # Логовое окно для вывода сообщений
- log_widget = tk.Text(root, height=10, width=50, wrap=tk.WORD, font=("Arial", 12))
- log_widget.pack(padx=10, pady=10)
- # Поля ввода и кнопки для применения изменений
- percent_label = tk.Label(root, text="Изменить время изучения улучшений на:", font=("Arial", 12))
- percent_label.pack(pady=5)
- percent_entry = tk.Entry(root, font=("Arial", 12))
- percent_entry.pack(pady=5)
- study_button = tk.Button(root, text="Применить изменения в Perks.json", font=("Arial", 12),
- command=lambda: apply_study_changes(log_widget, percent_entry.get()))
- study_button.pack(pady=5)
- build_label = tk.Label(root, text="Изменить время строительства зданий на:", font=("Arial", 12))
- build_label.pack(pady=5)
- build_entry = tk.Entry(root, font=("Arial", 12))
- build_entry.pack(pady=5)
- build_button = tk.Button(root, text="Применить изменения в Buildings.json", font=("Arial", 12),
- command=lambda: apply_build_changes(log_widget, build_entry.get()))
- build_button.pack(pady=5)
- # Кнопка для создания резервных копий
- backup_button = tk.Button(root, text="Создать резервные копии", font=("Arial", 12),
- command=lambda: handle_backup(log_widget))
- backup_button.pack(pady=5)
- # Кнопка очистки лога
- clear_button = tk.Button(root, text="Очистить лог", font=("Arial", 12), command=lambda: log_widget.delete(1.0, tk.END))
- clear_button.pack(pady=5)
- # Поле для ввода пути до папки с игрой
- game_path_label = tk.Label(root, text="Путь до папки с игрой:", font=("Arial", 12))
- game_path_label.pack(pady=5)
- game_path_var = tk.StringVar()
- game_path_var.set(SCRIPT_PATH) # по умолчанию текущая папка
- game_path_entry = tk.Entry(root, textvariable=game_path_var, font=("Arial", 12))
- game_path_entry.pack(pady=5)
- # Кнопка для применения пути
- def apply_path():
- global SCRIPT_PATH # Используем глобальную переменную
- SCRIPT_PATH = game_path_var.get()
- update_config_paths() # Обновляем пути
- log_widget.insert(tk.END, f"Новый путь до папки с игрой: {SCRIPT_PATH}\n")
- log_widget.yview(tk.END)
- # Обновляем текст с текущим путем
- current_path_label.config(text=f"Текущий путь: {SCRIPT_PATH}")
- apply_path_button = tk.Button(root, text="Применить новый путь", font=("Arial", 12), command=apply_path)
- apply_path_button.pack(pady=5)
- # Отображение текущего пути
- current_path_label = tk.Label(root, text=f"Текущий путь: {SCRIPT_PATH}", font=("Arial", 12))
- current_path_label.pack(pady=5)
- root.mainloop()
- # Запуск интерфейса
- create_interface()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement