Перейти к содержимому
Zone of Games Forum

Рекомендованные сообщения

очень при очень кривой перевод , и ладно если бы где то английские были слова, так там иероглифы (((лучше пока что чисто на английском поторчать!

Поделиться сообщением


Ссылка на сообщение

Классная у Китая технология, если кто стримы смотрел, налету будто переводит, налету копируется в “translate_words_map_en (переименован)” и сразу кодируется. Странные они люди, они знают как у них закодирован файл, но всё равно по-человечески сделать не могли, чтобы хотя бы не было китайских иероглифов.

Поделиться сообщением


Ссылка на сообщение

Есть у кого возможно открыть файл через https://atom-editor.cc/ или Sublime Text или Visual Studio Code (VS Code) ? Notepad++ как-то не особо справляется...

Изменено пользователем Develuk

Поделиться сообщением


Ссылка на сообщение

На просторах интернета найден скрипт для распаковки в .dat, далее текст вытаскивается без проблем.

Скрытый текст

import re
import os
import struct
import pyzstd
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTextEdit, QVBoxLayout, QHBoxLayout, QFileDialog, QLabel
from PyQt5.QtCore import Qt, QThread, pyqtSignal


def extract_patch_file(input_file, output_dir, log_callback):
    try:
        base_name = os.path.splitext(os.path.basename(input_file))[0]
        output_subdir = os.path.join(output_dir, base_name)
        os.makedirs(output_subdir, exist_ok=True)

        with open(input_file, 'rb') as f:
            if f.read(4) != b'\xEF\xBE\xAD\xDE':
                return False

            f.read(4)  # Skip version
            offset_count_bytes = f.read(4)
            offset_count = struct.unpack('<I', offset_count_bytes)[0]
            f.read(4)  # Skip padding

            if offset_count == 1:
                comp_block_len = struct.unpack('<I', f.read(4))[0]
                comp_block = f.read(comp_block_len)

                if len(comp_block) < comp_block_len:
                    return False

                header = comp_block[:9]
                comp_data_part = comp_block[9:]

                if len(header) < 9:
                    return False

                comp_type, comp_size, decomp_size = struct.unpack('<BII', header)

                if comp_type == 0x04:
                    try:
                        decomp_data = pyzstd.decompress(comp_data_part)
                        output_path = os.path.join(output_subdir, f"{base_name}_0.dat")
                        with open(output_path, 'wb') as out_f:
                            out_f.write(decomp_data)
                        log_callback(f"{base_name}_0.dat {comp_block_len} {decomp_size}")
                    except Exception:
                        pass
            else:
                offsets = [struct.unpack('<I', f.read(4))[0] for _ in range(offset_count)]
                data_start = f.tell()

                for i in range(offset_count - 1):
                    current_offset = offsets[i]
                    next_offset = offsets[i + 1]
                    block_len = next_offset - current_offset

                    f.seek(data_start + current_offset)
                    comp_block = f.read(block_len)

                    if len(comp_block) < block_len:
                        continue

                    if len(comp_block) < 9:
                        continue

                    header = comp_block[:9]
                    comp_data_part = comp_block[9:]
                    comp_type, comp_size, decomp_size = struct.unpack('<BII', header)

                    if comp_type == 0x04:
                        try:
                            decomp_data = pyzstd.decompress(comp_data_part)
                            output_path = os.path.join(output_subdir, f"{base_name}_{i}.dat")
                            with open(output_path, 'wb') as out_f:
                                out_f.write(decomp_data)
                            log_callback(f"{os.path.basename(output_path)} {current_offset} {decomp_size}")
                        except Exception:
                            pass

            return True

    except Exception:
        return False


class WorkerThread(QThread):
    log_signal = pyqtSignal(str)

    def __init__(self, input_path, output_dir):
        super().__init__()
        self.input_path = input_path
        self.output_dir = output_dir

    def run(self):
        if os.path.isdir(self.input_path):
            for filename in os.listdir(self.input_path):
                full_path = os.path.join(self.input_path, filename)
                if os.path.isfile(full_path):
                    extract_patch_file(full_path, self.output_dir, self.log_signal.emit)
        elif os.path.isfile(self.input_path):
            extract_patch_file(self.input_path, self.output_dir, self.log_signal.emit)


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Where_winds_meet_data_Extractor")
        self.setGeometry(100, 100, 800, 600)
        self.init_ui()

    def init_ui(self):
        layout = QVBoxLayout()

        button_layout = QHBoxLayout()

        # Select File Button
        self.select_file_btn = QPushButton("Select File")
        select_file_label = QLabel("选择文件")
        select_file_label.setAlignment(Qt.AlignCenter)
        select_file_label.setStyleSheet("font-size: 10px; color: gray;")
        file_box = QVBoxLayout()
        file_box.addWidget(self.select_file_btn)
        file_box.addWidget(select_file_label)

        # Select Folder Button
        self.select_folder_btn = QPushButton("Select Folder")
        select_folder_label = QLabel("选择文件夹")
        select_folder_label.setAlignment(Qt.AlignCenter)
        select_folder_label.setStyleSheet("font-size: 10px; color: gray;")
        folder_box = QVBoxLayout()
        folder_box.addWidget(self.select_folder_btn)
        folder_box.addWidget(select_folder_label)

        # Output Folder Button
        self.output_folder_btn = QPushButton("Output Folder")
        output_folder_label = QLabel("输出文件夹")
        output_folder_label.setAlignment(Qt.AlignCenter)
        output_folder_label.setStyleSheet("font-size: 10px; color: gray;")
        output_box = QVBoxLayout()
        output_box.addWidget(self.output_folder_btn)
        output_box.addWidget(output_folder_label)

        # Start Processing Button
        self.start_btn = QPushButton("Start Processing")
        start_label = QLabel("开始处理")
        start_label.setAlignment(Qt.AlignCenter)
        start_label.setStyleSheet("font-size: 10px; color: gray;")
        start_box = QVBoxLayout()
        start_box.addWidget(self.start_btn)
        start_box.addWidget(start_label)

        # Merge Files Button
        self.merge_btn = QPushButton("Merge Files")
        merge_label = QLabel("合并文件")
        merge_label.setAlignment(Qt.AlignCenter)
        merge_label.setStyleSheet("font-size: 10px; color: gray;")
        merge_box = QVBoxLayout()
        merge_box.addWidget(self.merge_btn)
        merge_box.addWidget(merge_label)

        # Add buttons to layout
        button_layout.addLayout(file_box)
        button_layout.addLayout(folder_box)
        button_layout.addLayout(output_box)
        button_layout.addLayout(start_box)
        button_layout.addLayout(merge_box)

        layout.addLayout(button_layout)

        self.log_box = QTextEdit()
        self.log_box.setReadOnly(True)
        layout.addWidget(self.log_box)

        self.setLayout(layout)

        self.input_path = None
        self.output_dir = None

        # Connect buttons
        self.select_file_btn.clicked.connect(self.select_input_file)
        self.select_folder_btn.clicked.connect(self.select_input_folder)
        self.output_folder_btn.clicked.connect(self.select_output_dir)
        self.start_btn.clicked.connect(self.start_processing)
        self.merge_btn.clicked.connect(self.merge_dat_files)

    def log(self, message):
        self.log_box.append(message)

    def select_input_file(self):
        file_path, _ = QFileDialog.getOpenFileName(self, "Select Patch File")
        if file_path:
            self.input_path = file_path
            self.log(f"Selected input file: {file_path}")

    def select_input_folder(self):
        folder_path = QFileDialog.getExistingDirectory(self, "Select Input Folder")
        if folder_path:
            self.input_path = folder_path
            self.log(f"Selected input folder: {folder_path}")

    def select_output_dir(self):
        folder_path = QFileDialog.getExistingDirectory(self, "Select Output Folder")
        if folder_path:
            self.output_dir = folder_path
            self.log(f"Selected output folder: {folder_path}")

    def start_processing(self):
        if not self.input_path:
            self.log("Please select input file or folder")
            return
        if not self.output_dir:
            self.log("Please select output folder")
            return

        self.worker = WorkerThread(self.input_path, self.output_dir)
        self.worker.log_signal.connect(self.log)
        self.worker.start()

    def merge_dat_files(self):
        folder_path = QFileDialog.getExistingDirectory(self, "Select Folder to Merge .dat Files")
        if not folder_path:
            return
    
        output_file = os.path.join(folder_path, "merged_output.bin")
    
        try:
            files = [f for f in os.listdir(folder_path) if f.endswith('.dat')]
    
            def extract_number(filename):
                match = re.search(r'(\d+)\.dat$', filename)
                return int(match.group(1)) if match else float('inf')
            files.sort(key=extract_number)
    
            with open(output_file, 'wb') as outfile:
                for filename in files:
                    file_path = os.path.join(folder_path, filename)
                    with open(file_path, 'rb') as infile:
                        outfile.write(infile.read())
                    self.log(f"Merged: {filename}")
    
            self.log(f"✅ Merging completed. Output saved to: {output_file}")
        except Exception as e:
            self.log(f"❌ Error during merging: {str(e)}")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

 

 

Поделиться сообщением


Ссылка на сообщение
Только что, Pavelstop сказал:

На просторах интернета найден скрипт для распаковки в .dat, далее текст вытаскивается без проблем.

  Код (Показать содержимое)


import re
import os
import struct
import pyzstd
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTextEdit, QVBoxLayout, QHBoxLayout, QFileDialog, QLabel
from PyQt5.QtCore import Qt, QThread, pyqtSignal


def extract_patch_file(input_file, output_dir, log_callback):
    try:
        base_name = os.path.splitext(os.path.basename(input_file))[0]
        output_subdir = os.path.join(output_dir, base_name)
        os.makedirs(output_subdir, exist_ok=True)

        with open(input_file, 'rb') as f:
            if f.read(4) != b'\xEF\xBE\xAD\xDE':
                return False

            f.read(4)  # Skip version
            offset_count_bytes = f.read(4)
            offset_count = struct.unpack('<I', offset_count_bytes)[0]
            f.read(4)  # Skip padding

            if offset_count == 1:
                comp_block_len = struct.unpack('<I', f.read(4))[0]
                comp_block = f.read(comp_block_len)

                if len(comp_block) < comp_block_len:
                    return False

                header = comp_block[:9]
                comp_data_part = comp_block[9:]

                if len(header) < 9:
                    return False

                comp_type, comp_size, decomp_size = struct.unpack('<BII', header)

                if comp_type == 0x04:
                    try:
                        decomp_data = pyzstd.decompress(comp_data_part)
                        output_path = os.path.join(output_subdir, f"{base_name}_0.dat")
                        with open(output_path, 'wb') as out_f:
                            out_f.write(decomp_data)
                        log_callback(f"{base_name}_0.dat {comp_block_len} {decomp_size}")
                    except Exception:
                        pass
            else:
                offsets = [struct.unpack('<I', f.read(4))[0] for _ in range(offset_count)]
                data_start = f.tell()

                for i in range(offset_count - 1):
                    current_offset = offsets[i]
                    next_offset = offsets[i + 1]
                    block_len = next_offset - current_offset

                    f.seek(data_start + current_offset)
                    comp_block = f.read(block_len)

                    if len(comp_block) < block_len:
                        continue

                    if len(comp_block) < 9:
                        continue

                    header = comp_block[:9]
                    comp_data_part = comp_block[9:]
                    comp_type, comp_size, decomp_size = struct.unpack('<BII', header)

                    if comp_type == 0x04:
                        try:
                            decomp_data = pyzstd.decompress(comp_data_part)
                            output_path = os.path.join(output_subdir, f"{base_name}_{i}.dat")
                            with open(output_path, 'wb') as out_f:
                                out_f.write(decomp_data)
                            log_callback(f"{os.path.basename(output_path)} {current_offset} {decomp_size}")
                        except Exception:
                            pass

            return True

    except Exception:
        return False


class WorkerThread(QThread):
    log_signal = pyqtSignal(str)

    def __init__(self, input_path, output_dir):
        super().__init__()
        self.input_path = input_path
        self.output_dir = output_dir

    def run(self):
        if os.path.isdir(self.input_path):
            for filename in os.listdir(self.input_path):
                full_path = os.path.join(self.input_path, filename)
                if os.path.isfile(full_path):
                    extract_patch_file(full_path, self.output_dir, self.log_signal.emit)
        elif os.path.isfile(self.input_path):
            extract_patch_file(self.input_path, self.output_dir, self.log_signal.emit)


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Where_winds_meet_data_Extractor")
        self.setGeometry(100, 100, 800, 600)
        self.init_ui()

    def init_ui(self):
        layout = QVBoxLayout()

        button_layout = QHBoxLayout()

        # Select File Button
        self.select_file_btn = QPushButton("Select File")
        select_file_label = QLabel("选择文件")
        select_file_label.setAlignment(Qt.AlignCenter)
        select_file_label.setStyleSheet("font-size: 10px; color: gray;")
        file_box = QVBoxLayout()
        file_box.addWidget(self.select_file_btn)
        file_box.addWidget(select_file_label)

        # Select Folder Button
        self.select_folder_btn = QPushButton("Select Folder")
        select_folder_label = QLabel("选择文件夹")
        select_folder_label.setAlignment(Qt.AlignCenter)
        select_folder_label.setStyleSheet("font-size: 10px; color: gray;")
        folder_box = QVBoxLayout()
        folder_box.addWidget(self.select_folder_btn)
        folder_box.addWidget(select_folder_label)

        # Output Folder Button
        self.output_folder_btn = QPushButton("Output Folder")
        output_folder_label = QLabel("输出文件夹")
        output_folder_label.setAlignment(Qt.AlignCenter)
        output_folder_label.setStyleSheet("font-size: 10px; color: gray;")
        output_box = QVBoxLayout()
        output_box.addWidget(self.output_folder_btn)
        output_box.addWidget(output_folder_label)

        # Start Processing Button
        self.start_btn = QPushButton("Start Processing")
        start_label = QLabel("开始处理")
        start_label.setAlignment(Qt.AlignCenter)
        start_label.setStyleSheet("font-size: 10px; color: gray;")
        start_box = QVBoxLayout()
        start_box.addWidget(self.start_btn)
        start_box.addWidget(start_label)

        # Merge Files Button
        self.merge_btn = QPushButton("Merge Files")
        merge_label = QLabel("合并文件")
        merge_label.setAlignment(Qt.AlignCenter)
        merge_label.setStyleSheet("font-size: 10px; color: gray;")
        merge_box = QVBoxLayout()
        merge_box.addWidget(self.merge_btn)
        merge_box.addWidget(merge_label)

        # Add buttons to layout
        button_layout.addLayout(file_box)
        button_layout.addLayout(folder_box)
        button_layout.addLayout(output_box)
        button_layout.addLayout(start_box)
        button_layout.addLayout(merge_box)

        layout.addLayout(button_layout)

        self.log_box = QTextEdit()
        self.log_box.setReadOnly(True)
        layout.addWidget(self.log_box)

        self.setLayout(layout)

        self.input_path = None
        self.output_dir = None

        # Connect buttons
        self.select_file_btn.clicked.connect(self.select_input_file)
        self.select_folder_btn.clicked.connect(self.select_input_folder)
        self.output_folder_btn.clicked.connect(self.select_output_dir)
        self.start_btn.clicked.connect(self.start_processing)
        self.merge_btn.clicked.connect(self.merge_dat_files)

    def log(self, message):
        self.log_box.append(message)

    def select_input_file(self):
        file_path, _ = QFileDialog.getOpenFileName(self, "Select Patch File")
        if file_path:
            self.input_path = file_path
            self.log(f"Selected input file: {file_path}")

    def select_input_folder(self):
        folder_path = QFileDialog.getExistingDirectory(self, "Select Input Folder")
        if folder_path:
            self.input_path = folder_path
            self.log(f"Selected input folder: {folder_path}")

    def select_output_dir(self):
        folder_path = QFileDialog.getExistingDirectory(self, "Select Output Folder")
        if folder_path:
            self.output_dir = folder_path
            self.log(f"Selected output folder: {folder_path}")

    def start_processing(self):
        if not self.input_path:
            self.log("Please select input file or folder")
            return
        if not self.output_dir:
            self.log("Please select output folder")
            return

        self.worker = WorkerThread(self.input_path, self.output_dir)
        self.worker.log_signal.connect(self.log)
        self.worker.start()

    def merge_dat_files(self):
        folder_path = QFileDialog.getExistingDirectory(self, "Select Folder to Merge .dat Files")
        if not folder_path:
            return
    
        output_file = os.path.join(folder_path, "merged_output.bin")
    
        try:
            files = [f for f in os.listdir(folder_path) if f.endswith('.dat')]
    
            def extract_number(filename):
                match = re.search(r'(\d+)\.dat$', filename)
                return int(match.group(1)) if match else float('inf')
            files.sort(key=extract_number)
    
            with open(output_file, 'wb') as outfile:
                for filename in files:
                    file_path = os.path.join(folder_path, filename)
                    with open(file_path, 'rb') as infile:
                        outfile.write(infile.read())
                    self.log(f"Merged: {filename}")
    
            self.log(f"✅ Merging completed. Output saved to: {output_file}")
        except Exception as e:
            self.log(f"❌ Error during merging: {str(e)}")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

 

 

Ахах, это я на форуме у ребят спрашивал как раз про распаковку файла

И мне в ответ скинули этот скрипт ))
 

  • Лайк (+1) 1

Поделиться сообщением


Ссылка на сообщение

Вот сделал скрипт на Python`е Яндекс.Диск для распаковки файлов translate_words_map. Пока на что время хватило. Как раз переделал сверху, но он умеет распаковывать и собирать обратно

Изменено пользователем suncrash66
  • Лайк (+1) 2

Поделиться сообщением


Ссылка на сообщение

как сделал я , взял оригинальный translate_words_map_en его переименовал в translate_words_map_zh_cn и заменил в папке HD\oversea\locale. потом взял переведённый translate_words_map_de и его переименовал в translate_words_map_en. закинул тоже в папку. Теперь если слова не хватает он превращает его в Английский, а не в китайский . 
 

image.png?ex=691d9adb&is=691c495b&hm=791

Изменено пользователем MultiArhat
  • Лайк (+1) 2
  • +1 1

Поделиться сообщением


Ссылка на сообщение
41 минуту назад, suncrash66 сказал:

Вот сделал скрипт на Python`е Яндекс.Диск для распаковки файлов translate_words_map. Пока на что время хватило. Как раз переделал сверху, но он умеет распаковывать и собирать обратно

Это все же QT оказалась) Я вчера в лаунчере обнаружил qm файлы) Думаю надо в эту область копать) правда ушел спать) Игра же вроде на Qt framework...

Изменено пользователем DOG729
  • Лайк (+1) 1

Поделиться сообщением


Ссылка на сообщение

На скорую руку скрипт достающий из dat файлов из прошлого скрипта текст.Нужно дорабатывать,но результат есть.Так же по ссылке пример того что получается,из файла Лагофаста.

https://disk.yandex.ru/d/gTZFZZX6oOHIQw

Поделиться сообщением


Ссылка на сообщение

пользуясь случаем хочу передать привет всем девушкам ,кто пользуется процессорами ryzen.

Поделиться сообщением


Ссылка на сообщение
15 минут назад, Мих@лыч сказал:

На скорую руку скрипт достающий из dat файлов из прошлого скрипта текст.Нужно дорабатывать,но результат есть.Так же по ссылке пример того что получается,из файла Лагофаста.

https://disk.yandex.ru/d/gTZFZZX6oOHIQw

OFFSET=8728

LENGTH=24345

 

Проблема в том что в данном случае мы привязаны к длине текста. Нужно реверсить бинарную таблицу
чтоб получить `id → text` 

 

Поделиться сообщением


Ссылка на сообщение
8 минут назад, DOG729 сказал:

OFFSET=8728

LENGTH=24345

 

Проблема в том что в данном случае мы привязаны к длине текста. Нужно реверсить бинарную таблицу
чтоб получить `id → text` 

 

Согласен.Это больше для посмотреть что там вообще есть.

Поделиться сообщением


Ссылка на сообщение
2 минуты назад, Мих@лыч сказал:

Согласен.Это больше для посмотреть что там вообще есть.

В этом не было нужды можно было просто файл вскрыть в txt редакторе и со скролить в низ))

Поделиться сообщением


Ссылка на сообщение

Написал через нейронку GUI для распаковки\запаковки и перевода, может найдутся умельцы кто доделает что бы было удобнее. Не уверен что все работает, но может кому-то пригодится. Если что, то совсем не шарю за всю эту тему, просто решил попробовать, ну и помочь.

https://disk.yandex.ru/d/U04E8E3BdpeTbQ

  • +1 1

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: SerGEAnt
      Wild Blue Skies

      Метки: Рельсовый шутер, Приключение, Аркада, Шутер, Полёты Платформы: PC Разработчик: Chuhai Labs Издатель: Humble Games Серия: Balor Games Дата выхода: 13 августа 2026 года Отзывы Steam: 239 отзывов, 59% положительных
    • Автор: SerGEAnt
      Allumeria

      Метки: Симулятор выживания и крафтинга в открытом мире, Песочница, Выживание, Цветастая, Для нескольких игроков Платформы: PC Разработчик: Infinimelon Издатель: Infinimelon Дата выхода: 28.08.2026 Ранний доступ: Да Отзывы Steam: 192 отзывов, 94% положительных

  • Сейчас популярно

  • Продвигаемые темы

  • Последние сообщения

    • @piton4 Ну чО ты там соберешь свои манатки.) когда домой то уже?
    • Ага, тоже в закладке. Не люблю о криминале, но трейлер заинтересовал, как раз тем, что эта опг решила действовать в обратку и всем помогать  . Каст хороший.   Надо же, видимо много жалоб, достучались. Такие задержки наоборот отталкивают, а не удерживают в сервисе. Идиотизм.
    • Не, вот такое вообще не в моём вкусе. Я тут на выходных открыл для себя очередной Святой Грааль в виде сериала от Okko — ОПГ. Ребята, это просто бомба. Очень интересно, комично и просто приятно смотреть. Уже доступны 5 серий, средней продолжительности около 45 минут. Всего будет 9 эпизодов, и что самое замечательное, они не будут тянутся по 1 серии в неделю — финальная появится уже 9 сентября.  
    • Предлагаю на перевод вот steam https://store.steampowered.com/app/4833450/Money_for_Girls_Amortized/ "Ты выглядишь на миллион долларов в десятиунцовой банке для штрафов за ругательства." Девушке-детективу предстоит разгадать свою самую сложную загадку: спасти маму от непосильных долгов. Но будьте осторожны: за прекрасным тропическим пейзажем скрывается мир греха. Популярная школьница проявляет к вам тревожный интерес, а хищнический кредит вашей матери выглядит сногсшибательно. Сможет ли ваше сладкое сердце выжить, или муравьи устроят вам пир? ✦ ужасы/романтика | "повседневная жизнь" 
      визуальная новелла | плохие концовки | наряды | стикеры  ✦ Украсьте свою девочку 16 стикерами. Обсессивно-компульсивное расстройство, Девочка-лошадь, Эндометриоз и даже загадочный Мальчик — это лишь некоторые из липких друзей или пятен позора, которые вы приобретете на своем пути… ✦ Откройте для себя 7 завораживающих образов! Ваш стиль, ваши правила! ✦ Раскройте свой финансовый потенциал, унизив себя ради мизерных денег! Качинг! ✦ Поддерживайте хорошее настроение и соблюдайте гигиену, иначе вас ждут серьезные последствия. ✦ Многие сцены являются необязательными или нелинейными. Как вы проведете лето? ✦ Множество вариантов! Будете ли вы следовать холодной жадности или теплу любви? Или чему-нибудь действительно глупому? ✦ Множество ужасных концовок может постигнуть девушку, которая шпионит и сует свой нос не по назначению. Соберите их в своей галерее и рассматривайте, чтобы усвоить моральный урок! ✦ Категорически никаких девушек-монстров. НИ ОДНОЙ. НЕ ИЩИТЕ ИХ. ✦ Фотографируйте стильных девушек по интересным причинам. ✦ Приобретайте секретные произведения искусства на Розовом рынке, где представлены работы одних из величайших приглашенных художников, когда-либо работавших в закрытом подвале. ✦ Откройте для себя красоту полуострова Соррал, с его захватывающими дух местами, которые словно очаруют вас с экрана! ✦ Испытайте вейкбординг, прыжки с парашютом и полеты на воздушном шаре! Но не в этой игре. ✦ Приключения, злоба и даже романтика…                                   ДАМЫ
                                          Рак Ты, дурачок!! Отважная девушка-детектив лет двадцати с небольшим! Судебный фотограф? Впервые учится в школе с настоящими людьми.                                                                                                                                       Агнел Твой одноклассник -задира . Совершенно нормальный. Никаких секретов.                                                                    Сахарная мамочка  А что, если бы хищническим займом пользовалась женщина?                        Твоя мама  Блестящий бывший специалист в области моды. В огромных долгах.                          Сахарная кукла Сотрудница года навсегда . Одна из тех второстепенных героинь, которые появляются нечасто... но она очень старается! Менее пятисот тысяч слов. Менее 8000 уникальных маршрутов .  Менее двух триллионов  произведений искусства. 

      Длительность:
      несколько часов веселья, или больше, если вы извращенец. Полно картинок, жутких историй и милых девушек. Чего вы от меня хотите?                                                                                                                       КРЕДИТНАЯ КАРТА Сценарий/программирование/режиссура/дополнительное аудио: Xrafstar 
      Иллюстрации: Vich 
      Саундтрек: Lauren Bousfield, песни: Ada Rook, ESPer99 и Ash Nerve 
      Иллюстрации: Chey, Dash и Demi ✦ Я включил в игру несколько ужасных вариантов выбора. Я надеюсь, что игрок не выберет ни один из них.
    • там ужас, а не озвчука, даже не старались, то есть звук то нет, то один голос, то другой, ну произношение тоже беда
    • Там только катсцены озвучены 
    • есть же нейроный https://www.zoneofgames.ru/games/star_wars_zero_company/files/12836.html
    • @piton4 со строительством? Бе..    Игру спасают только няши с большими глазами
    • Всем привет ,озвучку ждать стоит?
    • я выбыл из проекта - но в демо вообще не было русификатора, и я его не обновлял. возможно автор интегрировал что то туда.. все превратилось в работу за бесплатно... куча свободных правок как ему вздумаеться . я закончил на 0.5.17 — далее 0он хочет что бы народ переводил строки за строками через гит из за оплаченного обзора в рус сегменте. желаю удачи в проекте...
  • Изменения статусов

    • axe66  »  SerGEAnt

      здравствуйте. можете добавить на сайт раздел для игры She’s Leaving и русификатор к нему? и как и куда вам скинуть фото и сам русификатор?
      [h2] Версия: 1.0.1 (от 22.05.2026)
      Совместимость: для сборки 20909321 [/h2]
       Информация:
      Машинный перевод моделью gemma2:9b-instruct с несколькими этапами автоматической перепроверки (модель "самопроверялась") и финальными ручными правками.
      Это не финальная версия — по мере нахождения ошибок перевода будут выходить обновления.
      Известные нюансы:
      * Возможны неточности и ошибки в переводе.
      * Некоторые элементы интерфейса остались без перевода.
       Установка:
      1. Запустить Russifier.exe
      2. Нажать "Выбрать папку"
      3. Выбрать папку с игрой и нажать ОК
      4. Нажать "Установить"
      5. Дождаться завершения установки и закрыть программу.
      После установки запустите игру и наслаждайтесь!
      Если заметили ошибки или некорректные формулировки — оставляйте комментарии, будем исправлять!
       
      Автор: Serjik Sokolov История изменений:   Версия 1.0.1 от 22.05.2026 - Установщик теперь автоматически определяет корневую папку игры, даже если случайно выбрана вложенная папка.   Версия 1.0.0 от 03.12.2025 - Релиз
      · 1 ответ
    • Perfect End Strange  »  SerGEAnt

      Привет, озвучку для Silent Hill 4: The Room выпустил энтузиаст под ником Perfect End Strange, а вы написали совсем другую студию, пожалуйста, исправьте эту оплошность
      · 0 ответов
    • Jimmi Hopkins  »  SerGEAnt

      я его уже открыл в свободный доступ, чтобы не потерялось среди новинок
      · 0 ответов
    • NekoNya  »  Onzi

      https://www.dropbox.com/scl/fi/4xncxr2tqy77vz4644q08/text_RU_FINAL.json?rlkey=xckxss3jkql4gjmc1ah6qjb5e&st=k5ql651f&dl=0 
       
      Вот, то что вышло. Извинюсь, что зря говорил, что помогу (
      · 2 ответа
    • serfly  »  SerGEAnt

      Доброго времени! Недавно столкнулся с проблемой автоперевода XUnity AutoTranslator BeplnEx iL2cc. Пару последних лет часто пользовался, теперь консольные команды виснут на стадии загрузки библиотек, хотя они есть там изначально. На GitHub есть подобные вопросы, но ни одного рабочего ответа я не нашел. А Вы что можете посоветовать?
      · 0 ответов
  • Лучшие авторы


×