Разработка и ромхакинг > Переводы игр
[PSX] Crash Bandicoot - сжатые текстуры
(1/1)
Nik Pi:
На протяжении последних нескольких лет- я, SlavaVlasov, и MFS пытались распознать и взломать сжатие в первом бандикуте с целью перевода (чтобы так сказать, завершить трилогию). Но всё увы тщетно. Даже Энди Гэвин (один из разработчиков) ответил лишь "непомню, лол".
Много где вопрос поднимал, но никто не смог помочь.
Вся соль в том, что сжатые фрагменты сжаты не полностью, видны хвостики букв.
Может хоть тут смогут помочь?
Sharpnull:
Я открыл шрифт через https://github.com/cbhacks/CrashEdit, хранится как кусок для записи в framebuffer. Texture Chunk 3 (Fon0T) выглядит так:
UPD: При открытии были ошибки, я их пропускал.
UPD2: Сам NSF имеет сжатие, код из редактора.
paul_met:
Нет там никакого сжатия.
Nik Pi:
--- Цитата: Sharpnull от 29 Июнь 2022, 19:38:14 ---Я открыл шрифт через https://github.com/cbhacks/CrashEdit, хранится как кусок для записи в framebuffer. Texture Chunk 3 (Fon0T) выглядит так:
(Ссылка на вложение)
UPD: При открытии были ошибки, я их пропускал.
UPD2: Сам NSF имеет сжатие, код из редактора.
--- Конец цитаты ---
Хе-хе. Нееееет. Не всё так просто :)
Там дубликаты всего и вся. Есть сжатые текстуры, и несжатые сразу в одном архиве. Этот несжатый тоже используется, но сжатый используется чаще
Там есть даже сжатые дубликаты звуков, при том, что несжатые находятся прям рядом
Sharpnull:
--- Цитата: Nik Pi от 29 Июнь 2022, 19:57:28 ---Там дубликаты всего и вся. Есть сжатые текстуры, и несжатые сразу в одном архиве. Этот несжатый тоже используется, но сжатый используется чаще
--- Конец цитаты ---
Почему сразу нельзя было написать? Код на разжатие кусков NSF я указал. Он не подходит и там отдельное сжатие? Тогда, зная формат NSF, можно получить сжатый кусок (если это не NSF сжатие) и несжатый кусок уже есть, остаётся сравнить и попытаться выяснить код декомпрессии или разобрать код игры.
Вы просите помощи, но не говорите что выяснили сами, это плохо.
UPD: По началу несжатой текстуры (34 12 01 00 6F E0 C2 52 05 00 00 00 DD DC AF 72) находится несжатый кусок - 0x230800- (paul_met его показал, в начале 34 12, что говорит о несжатии) и сжатый - 0xA000- (35 12 говорит о сжатии). Я проверил начало вручную и сжатие совпадает с указанным ранее (https://github.com/cbhacks/CrashEdit/blob/5662fce6c0694b855b40ca99c6b2da8718e54fcf/Crash/Formats/Crash Formats/NSF.cs). Простое сжатие. Вот файлы, сжатый (я взял с запасом) и несжатый, можно быстро отделить код и проверить наверняка.
UPD2: Переписал на Python декомпрессию и подтвердил, что с 0xA000 сжатый по алгоритму NSF кусок совпадает с несжатым 0x230800. Вот код:
--- Код: ---#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from pathlib import Path
from struct import unpack
data = Path("font_comp.bin").read_bytes()
dataLength = len(data)
ChunkLength = 65536
result = bytearray(ChunkLength)
length, = unpack("<i", data[4:8])
offset = 12
pos = 0
while pos < length:
if dataLength < offset + 1:
print("NSF.ReadChunk: Data is too short")
prefix = data[offset]
offset += 1
if (prefix & 0x80) != 0:
prefix &= 0x7F
if dataLength < offset + 1:
print("NSF.ReadChunk: Data is too short")
seek = data[offset]
offset += 1
span = seek & 7
seek >>= 3
seek |= prefix << 5
if span == 7:
span = 64
else:
span += 3
if pos - seek < 0:
print("NSF.ReadChunk: Repeat begins out of bounds")
if pos + span > ChunkLength:
print("NSF.ReadChunk: Repeat ends out of bounds")
# Do NOT use Array.Copy as
# overlap is possible i.e. span
# may be greater than seek
for i in range(span):
result[pos + i] = result[pos - seek + i]
pos += span
else:
if dataLength < offset + prefix:
print("NSF.ReadChunk: Data is too short")
result[pos:pos+prefix] = data[offset:offset+prefix]
offset += prefix
pos += prefix
#if dataLength < offset + skip:
# print("NSF.ReadChunk: Data is too short")
#offset += skip
#if dataLength < offset + (ChunkLength - length):
# print("NSF.ReadChunk: Data is too short")
prefix = ChunkLength - length
result[pos:pos+prefix] = data[offset:offset+prefix]
#offset += (ChunkLength - length)
Path("font_uncomp.bin").write_bytes(result)
--- Конец кода ---
Тайна разгадана, остаётся просто разобрать формат NSF и написать элементарное сжатие.
lupus:
Я когда-то смотрел эту игру, году в 2008-2010, тоже хотел нормальный перевод сделать.
Помню, что находил шрифты 100500 раз в разных файлах. Скорее всего, сделано, чтобы читать ближайший к текущим данным, а не елозить лазером по диску для загрузки данных.
Но, это чисто моё предложение)
paul_met:
--- Цитата: Sharpnull от 29 Июнь 2022, 20:17:43 ---Тайна разгадана, остаётся просто разобрать формат NSF и написать элементарное сжатие.
--- Конец цитаты ---
Разобрать по адресам, но можно обойтись и без сжатия, так как в файле уже есть дубликаты несжатых блоков. Надо просто заставить игру грузить несжатые блоки. Но для этого придётся ещё найти файл конфигурации, где прописаны сектора и их кол-во.
Впрочем вот для теста - грузится несжатый блок со шрифтом менюшки в начале игры (помедленнее сжатого, но тем не менее):
--- Код: ---Файл: S0000019.NSD
Адрес: 424h
Значение: 60180100
--- Конец кода ---
Nik Pi:
Извините, что не написал сразу про дубликаты. Совсем про них забыл :(
Но спасибо за ответы! Будем смотреть, разбираться
boomerf90777:
--- Цитата: paul_met от 29 Июнь 2022, 22:26:01 ---Разобрать по адресам, но можно обойтись и без сжатия, так как в файле уже есть дубликаты несжатых блоков. Надо просто заставить игру грузить несжатые блоки. Но для этого придётся ещё найти файл конфигурации, где прописаны сектора и их кол-во.
Впрочем вот для теста - грузится несжатый блок со шрифтом менюшки в начале игры (помедленнее сжатого, но тем не менее):
--- Код: ---Файл: S0000019.NSD
Адрес: 424h
Значение: 60180100
--- Конец кода ---
--- Конец цитаты ---
Здарова можешь кинуть адреса и значения на все NSD файлы (Crash Bandicoot 1) чтобы он грузил несжатые шрифты)
Навигация
Перейти к полной версии