Показать сообщение отдельно
Старый 19.12.2008, 10:17   #779
Korvin59

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: G3a: Oтвeргнутыe Бoги – Oбсуждeниe

Цитата:
Сообщение от Semen Semenych link=board=gothic&t=1227254247&goto=4656443 date=12/19/08, в 06:16:09
2odin68:
Вы, уважаемый Один, уже много заявлений сделали, которые не соответвуют действительности, и как мне кажестя, были лишь нацелены на привлечение внимания.
odin68: Нет необходимости привлекать тут внимание!
В отличие от вас, его тут и без этого хорошо знают.

Но сейчас уже другое время, и после выхода патча 1.06, все содержимое стринга было переведено, за исключением тех строк, что осмыслить так и не удалось (на подобии невменяемого английского текста и ничего не значащих ID)
А это утверждение - не соответствует действительности.
Специально для проверки (у меня уже была английская версия лицензионного диска), мной был куплен диск с локализованной игрой (GFI, Руссобит-М) и пропатчен официальным русским патчем, после чего мной - практически не было замечено особых изменений, кроме появившихся недостающих строчек у статуй богов.

Все верно, зачем вам нужен русский текст в открытом виде?.. В игре он отображается, и этого вполне достаточно
Хотя бы для исправления грамматических ошибок.

Тут же всплывает еще одно ваше фейковое заявление о невозможности создавать моды. Если вы такой уж увлеченный и толковый создатель модов Готики 3, то могли бы сразу догадаться, что ни издатель, ни локализатор, ничем не помешали модострою. Моды как и прежде можно создавать, даже без адаптированного не вами фикса, который вы выложили не так давно (со скрытым, кстати, стрингом - ущемленный модострой!).
Конечно можно, что и будет сделано непременно!
А фикс конечно же был сделан вами, раз вы так утверждаете?! :lol:
Способ его получения не оставляет выбора в каком виде его выкладывать. odin68 достал из игры (воспользовавшись легальным документированным свойством движка) скомпилированный stringtable.bin, а не stringtable.ini :)
Так в чем тут ущемление модостроя?

Кстати скоро появится Extractor.exe, который позволит достать из Старфорс - контейнера нативный stringtable.ini *;)

Английский текст на первом скрине к стрингу вообще не относится. На втором скрине, это сложно назвать косяком, но ничего не имею против мелкого недочета.
Да и к чему же он относится? С этим stringtable - этого нет!
А насчет второго, согласен - мелочь, но портит впечатление от игры.

Я несколько раз говорил, что на данный момент осталось незначительное количество текста на английском языке, того текста, что зашит в исполняемый код.
Вранье, он зашит не в исполняемый код, а просто положен в зашифрованный StarForc-container, откуда его скоро непременно достанут!
Cпойлер(щелкните, чтобы прочесть):
sf file system (sffs):
--------------------------------------------------------------------------------
sffs consists of 2 major parts: the container files that contain the game
content and a filesystem filter driver (sfvfs02.sys) that handles all file-io.
when a game has sffs'ed files and uses some file-io api like CreateFile, the
sffs filterdriver sees this request and handles it if needed. that way, sffs is
totally transparent to the game, since it never knows if the data is coming from
real file api or from the sffs filterdriver. during sf initialization, the
sf-process registers itself as a sffs process in a processid list, maintained
from the filterdriver. part of that registration are the names of the
containerfiles, the process uses and an application key, that is needed to
decrypt headerinfos. note that sffs itself is completly vm-free.



SFFS container structure:
--------------------------------------------------------------------------------
containerlayout:

4byte 'SFFS'

4byte version (0x00000001)

8byte number of files in the container (encrypted with application key)
* * *minimal number here is usually 65h, so its not real file count
* * *in some cases, more like index size

for each file (24bytes):
16bytes md5 hash of filename (not encrypted, plz)
8bytes index of fileheader (encrypted with filename)

for each fileheader (56bytes):
8byte start of filecontent (encrypted with filename)
48bytes fileinfo (timestamps, size, data position, encrypted)

filecontent.

// as you can see, the filename itself is key of some decryptions, so there is no
// way to extract a file without valid filename.



decryption
--------------------------------------------------------------------------------
to decrypt data, sffs uses a 0x1048byte big decryption key buffer. this key
buffer is always derrived from a key. sample (decryption of number of files
info):

BYTE keyBuf[0x1048];
makeKeyBuf(keyBuf, appKey, 8);
decryptBuf(keyBuf, header + 8, 8, 0, 0, 0);
DWORD64 numFiles = *(DWORD64 *)(header + 8);


to decrypt filecontents:
wchar_t nameCopy[1024];
wcscpy(nameCopy, name); * * * * * *<------ name = name of file beeing accessed, relative to gamedir
wcsupr(nameCopy);

int nameLen = wcslen(nameCopy);
reverseName(nameCopy, nameLen); * * * * * *<---- reverses the now uppercase name: GFX.GTL -> LTG.XFG

BYTE keyBuf[0x1048];
makeKeyBuf(keyBuf, nameCopy, nameLen * 2); * * *<---- as already mentioned, keyBuf is needed

first lets decrypt index of fileinfos:
ULARGE_INTEGER index; * * * * * *<--- index is very same val as mentioned in header, but it was encrypted, remember?
index.QuadPart = header->index;
decryptBuf(keyBuf, &index, 8, 0, 0, 0);

LARGE_INTEGER fileInfoPos;
fileInfoPos.QuadPart = 0x10 + header->container->numFiles * 0x18 + index.QuadPart * 0x38;

SetFilePointer(containerFile, fileInfoPos.LowPart, &fileInfoPos.HighPart, FILE_BEGIN);

DWORD read;
BYTE fileInfo[0x38];
ReadFile(containerFile, fileInfo, 0x38, &read, NULL);
CloseHandle(containerFile);



now decryption of 0x38 fileinfo header (2 parts, to make it extra super duper secure):

decryptBuf(keyBuf, fileInfo, 0x38, 0, 0, 0);
for (DWORD i = 0; i < 0x38; i++)
* * *fileInfo[i] ^= appKey[i & 7]; * * * * * *<----- whoohoo
decryptBuf(keyBuf, fileInfo, 0x38, 0, 0, 0);

now fileInfos are decrypted and ready to use:

DWORD64 fileSize = *(DWORD *)(fileInfo + 8);

FILETIME writeTime;
writeTime.dwLowDateTime = *(DWORD *)(fileInfo + 32);
writeTime.dwHighDateTime = *(DWORD *)(fileInfo + 36);




decryption of filedata:

memcpy(outBuf, file->info->data + file->readPos, len);
DWORD64 containerPos = file->info->dataPos + file->readPos;
decryptBuf(file->info->keyBuf, outBuf, len, 0, (DWORD)containerPos, (DWORD)(containerPos >> 32));
file->readPos += len;

note: fileposition affects decryption

see included source for details


И последнее: Для чего издателю понадобилось использовать часть нашего перевода?
Уж пользовались бы своим! ;)

Засим, позвольте откланяться.
Не чихайте и не кашляйте, Semen Semenych! *:evil:


Добавление от 12/19/08, в 09:17:09
Цитата:
Сообщение от SergeyS link=board=gothic&t=1227254247&goto=4656525 date=12/19/08, в 08:52:50
Извините за повтор.
Не удалось отредактировать ссылку:
С этим stringtable: http://www.ag.ru/gamebase/game/1392/
Правда перевод там - неважный.

Добавление от 12/19/08, в 09:18:22
Цитата:
Сообщение от SergeyS link=board=gothic&t=1227254247&goto=4656525 date=12/19/08, в 08:57:10

Добавление от 12/19/08, в 09:37:17
Извините еще раз, но правильную ссылку запостить не удается!
Ответить с цитированием