| Разработка и ромхакинг > Переводы игр |
| [DC] Рус. переводы и ромхакинг игр на Dreamcast. |
| << < (24/24) |
| cptPauer:
--- Цитата: e2e41 от Вчера в 16:51:44 ---This plugin can be used for Magic the Gathering DC??? там вреде deflate, хз не работает вроде --- Конец цитаты --- Да. Почему не работает? Fully supported, блин. На распаковку и запаковку. Хорошо работает. Что нужно делать, что бы оно не работало? Открываю pac, извлекает и запаковывает. Можно вообще любые файлы паковать в pac. Автоматически показывает pvr текстуры и str музыку в этих pac по заголовкам. Кстати, если кто-то хочет помочь это перевести на русский, то помогайте. Я сам не осилю это доперевести. Больше чем два года прошло. Ситуация такая: в игре есть английский язык для описания карт, но он не активен. Можно переключить японский на английский, все описания карт станут на английском. Менюшки все на японском, английского перевода небыло для них. Статут проекта: я сделал русскую озвучку Яндексом. Как по мне, то достаточно нормально перевелось. Lin нарисовал пробный шрифт, но шрифт кривоватый, доделывать шрифт некому. Есть проект для Круптара. Лично мне в Круптаре неудобно, но Круптар пересчитывает поинтеры и можно текст любого размера писать. Весь текст можно редактировать свободно, тот который не текстурами. Туторы я перевёл (обучающие ролики), но озвучки для них не делал на русский. На английский есть.. Сейчас вроде бы перевели игру на английский, но я не смотрел что там, этот перевод был начат раньше и с японского могу перевести сам. Я переводил без нейронок, для этого я сделал на английский eTypist OCR и им распознавал текстуры. Патч с переводом для eTypist я выкладывал. eTypist забытая, но очень мощная японская OCR. Изначатально интерфейс там на японском полностью. Часто распознаёт лучше нейронок, но они уже близко подобрались. ----- Можно попробовать натравить нейронку перевести на русский текст. Но, это тоже не так просто как кажется и не бесплатно. Я бы даже сказал, что описания карт полюбому нужно переводить нейронкой, их там вроде около 300. Но делать вычитку и меню надёжнее переводить вручную. ----- Я делал на два языка. На английский там относительно просто, потому что описания карт уже есть на английском (не активно), ролики есть на английском (но субтитры к ним японские, на английском голосом, но сабы я сделал), шрифт английский уже есть. Там только меню на японском, текстуры (магазин). В целом, тоже достаточно много текстур. Картинки карт на японском, но они продублированы текстом и на таком разрешении их всё равно толком не видно. Там не рассчитано, что с карт будут читать текст. Игра планировалась на два языка, наверное. Там английский есть, но не до конца. Да, Deflate без заголовка. Я оговорился, наверное. Алгоритм не мой, я просто портировал c Python тот скрипт, с которым со мной поделились. --- Код: ---import sys import zlib from pathlib import Path from struct import unpack, pack import argparse import json def read_u32le(f): return unpack("<I", f.read(4))[0] def pack_u32le(u32): return pack("<I", u32) def ceil4(n): return ((n + 3) // 4) * 4 def unpack_pac(input_file, output_dir): p_in = Path(input_file).resolve() if output_dir: p_out = Path(output_dir).resolve() / p_in.stem else: p_out = p_in.parent / p_in.stem p_out.mkdir(parents=True, exist_ok=True) file_info = [] with open(p_in, "rb") as f: magic = f.read(4) if magic != b"PAC\x00": print("magic != PAC\x00") sys.exit(1) file_count = read_u32le(f) for i in range(file_count): off = 8 + i * 4 f.seek(off) file_off = read_u32le(f) file_off_end = read_u32le(f) file_size = file_off_end - file_off f.seek(file_off) data = f.read(file_size) file_entry = {"index": i, "size": file_size} file_name = f"{i:08d}" if data[:4] == b"NZIP": try: u = zlib.decompress(data[8:], wbits=-15) if u[:4] == b"GBIX": p = p_out / (file_name + ".pvr") p.write_bytes(u) file_entry["type"] = "pvr" elif u[:4] == b"SDCP": p = p_out / (file_name + ".sdcp") p.write_bytes(u) file_entry["type"] = "sdcp" else: p = p_out / (file_name + ".bin") p.write_bytes(u) file_entry["type"] = "bin" except zlib.error: p = p_out / (file_name + ".nzip") p.write_bytes(data) file_entry["type"] = "nzip" elif data[:4] == b"SDCP": p = p_out / (file_name + ".sdcp") p.write_bytes(data) file_entry["type"] = "sdcp" else: p = p_out / (file_name + ".bin") p.write_bytes(data) file_entry["type"] = "bin" file_info.append(file_entry) info_json_path = p_out / "info.json" with info_json_path.open("w") as info_json_file: json.dump(file_info, info_json_file, indent=4) def pack_pac(input_folder, output_file): input_folder = Path(input_folder) output_file = Path(output_file) info_json_path = input_folder / "info.json" if info_json_path.exists(): with info_json_path.open("r") as info_json_file: file_info = json.load(info_json_file) else: print("No info.json found. Processing files as usual.") file_info = None files = [] if file_info: for entry in file_info: file_path = input_folder / f"{entry['index']:08d}.{entry['type']}" if file_path.exists(): data = file_path.read_bytes() if entry['type'] == 'pvr': c = zlib.compress(data, level=9, wbits=-15) c = b"NZIP" + pack_u32le(len(data)) + c files.append(c) elif entry['type'] == 'nzip': u = file_path.read_bytes() c = zlib.compress(u, level=9, wbits=-15) c = b"NZIP" + pack_u32le(len(u)) + c files.append(c) else: files.append(data) else: print(f"File {file_path} not found. Skipping.") else: file_paths = sorted(input_folder.glob('*')) for file_path in file_paths: if file_path.suffix in ['.pvr', '.nzip', '.bin', '.sdcp']: data = file_path.read_bytes() if file_path.suffix == '.pvr': c = zlib.compress(data, level=9, wbits=-15) c = b"NZIP" + pack_u32le(len(data)) + c files.append(c) elif file_path.suffix == '.nzip': u = file_path.read_bytes() c = zlib.compress(u, level=9, wbits=-15) c = b"NZIP" + pack_u32le(len(u)) + c files.append(c) else: files.append(data) else: print(f"Skipping {file_path.name}") with open(output_file, "wb") as f: f.write(b"PAC\x00") f.write(pack_u32le(len(files))) off = 8 + len(files) * 4 + 4 for i in range(len(files)): f.write(pack_u32le(off)) off += ceil4(len(files[i])) f.write(pack_u32le(off)) for i in range(len(files)): padded = files[i].ljust(ceil4(len(files[i])), b"\x00") f.write(padded) def main(): parser = argparse.ArgumentParser( description="Unpack or pack a PAC file.", epilog="Examples:\n" " python script.py unpack example.pac -d ./uncompressed\n" " python script.py unpack example.pac\n" " python script.py pack ./uncompressed/example example.new.pac", formatter_class=argparse.RawTextHelpFormatter ) subparsers = parser.add_subparsers(dest="command", required=True) unpack_parser = subparsers.add_parser("unpack", help="Unpack a PAC file.") unpack_parser.add_argument("input_file", type=str, help="The input PAC file to unpack.") unpack_parser.add_argument("-d", "--directory", type=str, default=None, help="The output directory for unpacked files.") pack_parser = subparsers.add_parser("pack", help="Pack files into a PAC file.") pack_parser.add_argument("input_folder", type=str, help="The input folder containing files to pack.") pack_parser.add_argument("output_file", type=str, help="The output PAC file.") args = parser.parse_args() if args.command == "unpack": unpack_pac(args.input_file, args.directory) elif args.command == "pack": pack_pac(args.input_folder, args.output_file) if __name__ == "__main__": main() --- Конец кода --- Автор один из местных, но я не уверен кто. Сделано было до нейронок, несколько лет назад. Это MTF был в LZSS. Просто MTF запарил меня, теперь оговариваюсь. Там тоже запаковка поддерживается. И инфы как сделать правильно небыло, данные смещались и игра крашилась. Поэтому LZSS застрял у меня в голове, оговариваюсь, моральная травма)). А в Магике был Deflate. Я проверял на игре, работало. Но, если какие-то косяки, то скрипт на Python тогда наверняка работает, проверено. --- Цитата: Roosya от Вчера в 08:54:41 ---Хорошее дело, а то для пс1 держал в chd только из-за многофайловой структуры куебин. А для пс2 мог бы и в исо. А тут поголовно куча форматов ужато в этот новый. Старые эмули с ним не работают. Хотя вот epsxe читал вроде обновили. но в анберниках и ретроидах его нет. --- Конец цитаты --- Кстати, можно было сделать для PS1, что бы из CHD обратно получался многобин. Но, сейчас там извлекается одним файлом + cue. Поэтому, если игру PS1 из Редампа запаковать в CHD, а этим плагином извлечь, то она из многобина редампа превратится в однобин. Сама игра останется точно такой же, но формат изменится. --- Цитата ---Хотя вот epsxe читал вроде обновили. но в анберниках и ретроидах его нет. --- Конец цитаты --- Кстати, в epsxe наверное без zstd, не уверен. Раньше же был просто пятой версии chd, хотя часто встречались четвёртой для первой соньки. А теперь переходят на zstd компрессию и такие вообще мало где открываются, эмуляторы не поддерживают. Redream не поддерживает, например. |
| Навигация |
| Главная страница сообщений |
| Предыдущая страница |