![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
Siberian GRemlin |
![]() ![]()
Сообщение
#1
|
![]() Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 222 раз(а) ![]() |
Итак, пока есть время перед экзаменами и играть поднадоело + зависоны, я решил поковырять четвёртых Поселенцев, о чём давно мечтал. А точнее начал пока с формата [.LIB]. Но, вот? незадача, я думал, там обычный ZLib, но разжать не смог =( Порылся в файлах, нашёл RTComp.dll логично подумал, что Comp от Compress и, кажется, был прав в этом файле видны строчки с "zlib". Но почему-то у меня не получилось разжать файл. Погуглил на RT Compression и сокращения, нашёл только какую-то чушь (вроде) про Real-Time Compression.
Работаю с последней английской версией игры и версией от 1С. Демку можно скачать с AG.ru CODE program Settlers4_LIB_Info; {$APPTYPE CONSOLE} uses SysUtils, Windows, Classes; type TFAT = record Unknown1, Unknown2, Unknown3, FolderCount, Unknown5, FilesCount: Dword; end; TFileInfo = record Offset, PackedSize, UnPackedSize, FolderNum, IsPacked, CheckSum: Dword; end; TFile = record Name:String; Info:TFileInfo; end; var MSTR: TMemoryStream; FATOffset: Dword; F:TFAT; Folders: array of string; Files: array of TFile; i,j: dword; outf: textfile; begin Assign(outf,'D:\Games\The Settlers IV\gfx.txt'); ReWrite(outf); MSTR:=TMemoryStream.Create; Mstr.LoadFromFile('D:\Games\The Settlers IV\gfx.lib'); Mstr.Position:=Mstr.Size-4; Mstr.ReadBuffer(FATOffset,4); WriteLn(outf,'Header Offset: '+IntToHex(FATOffset,4)); Mstr.Position:=FATOffset; Mstr.ReadBuffer(F,sizeof(f)); WriteLn(outf); WriteLn(outf,'Unknown1: '+IntToStr(F.Unknown1)); WriteLn(outf,'Unknown2: '+IntToStr(F.Unknown2)); WriteLn(outf,'Unknown3: '+IntToStr(F.Unknown3)); WriteLn(outf,'Folder Count: '+IntToStr(F.FolderCount)); WriteLn(outf,'Unknown5: '+IntToStr(F.Unknown5)); WriteLn(outf,'Files Count: '+IntToStr(F.FilesCount)); //папки SetLength(Folders,F.FolderCount); for i:=1 to F.FolderCount do begin j:=1; SetLength(Folders[i-1],1); Repeat Mstr.ReadBuffer(Folders[i-1][j],1); inc(j); SetLength(Folders[i-1],Length(Folders[i-1])+1); Until ord(Folders[i-1][j-1])=0; SetLength(Folders[i-1],Length(Folders[i-1])-2); end; //файлы SetLength(Files,F.FilesCount); for i:=1 to F.FilesCount do begin j:=1; SetLength(Files[i-1].Name,1); Repeat Mstr.ReadBuffer(Files[i-1].Name[j],1); inc(j); SetLength(Files[i-1].Name,Length(Files[i-1].Name)+1); Until ord(Files[i-1].Name[j-1])=0; SetLength(Files[i-1].Name,Length(Files[i-1].Name)-2); end; //данные for i:=1 to F.FilesCount-1 do begin Writeln(outf); Mstr.ReadBuffer(Files[i-1].Info,sizeof(Files[i-1].Info)); if F.FolderCount>1 then WriteLn(outf,IntToStr(i)+': '+Folders[Files[i-1].Info.FolderNum]+'\'+Files[i-1].Name) else WriteLn(outf,IntToStr(i)+': '+Folders[0]+'\'+Files[i-1].Name); WriteLn(outf,Format('Offset: %s Packed Size: %s UnPacked Size: %s Compressed: %s ?ChekSum?: %s',[IntToHex(Files[i-1].Info.Offset,8),IntToHex(Files[i-1].Info.PackedSize,8), IntToHex(Files[i-1].Info.UnPackedSize,8),IntToHex(Files[i-1].Info.IsPacked,1), IntToHex(Files[i-1].Info.CheckSum,8)])); end; Mstr.Free; CloseFile(outf); WriteLn('Complete!'); Readln; end. |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Проверил. Закинул твой файл в демку, меню стало на русском, прошёл первое обучение, там тоже всё на русском, проблем не заметил. Русский Windows XP SP3 + все дополнения (официальные, POS Ready не ставил).
Может на другом ПК что-то перекосило, вот русский шрифт и не грузится? А ещё заглянул в упомянутый тобой guiengine2.dll от demo в IDA, там в IGuiEngine::Init такой код: CODE <...> nCharSet = 0; // ANSI_CHARSET switch (a7) { case 16: nCharSet = 204; // RUSSIAN_CHARSET break; case 5: case 11: case 13: nCharSet = 238; // EASTEUROPE_CHARSET break; default: break; } v9 = &h; pFntData = (BYTE *)&unk_18809900; do { if (*v9) { DeleteObject(*v9); } v11 = CreateFontA( *((_DWORD *)pFntData - 8), *((_DWORD *)pFntData - 7), 0, 0, *((_DWORD *)pFntData - 6), 0, 0, 0, nCharSet, 0, 0, *pFntData != 0 ? 4 : 0, 0, (LPCSTR)pFntData + 2); *v9 = v11; if (!v11) { BBSupportTracePrintF(0, aGuiEngineCan_2); } pFntData += 84; v9++; } while ( (signed int)pFntData < (signed int)&unk_18809F3C ); <...> Как я понимаю ANSI_CHARSET = RUSSIAN_CHARSET, если в системе установлен русский язык. Можно попробовать либо 238 на 204 заменить, либо сделать так, чтобы всегда 204 было. А ещё можно посмотреть откуда лезет параметр a7 входной со значениями 5, 11 или 13 - может в ресурсах где-то язык задаётся, а потом этот номер в эту функцию уходит. Спасибо сказали:
|
![]() ![]() |
Упрощённая версия | Сейчас: 1st May 2025 - 01:12 |