gta_sa.set
#1
Отправлено 13 June 2011 - 17:55
#2
Отправлено 13 June 2011 - 19:33
0xB3A - [byte]
Я пытаюсь реализовать при помощи TFileStream и никак не пойму откуда начать.
Stream := TFileStream.Create(FileName, fmOpenRead); Stream.Seek(2874 , 0); Stream.Read(int1, 1); if int1 = 0 then label1.Caption := 'M+K' else label1.Caption := 'gamepad';На сколько я понял, 0xB3A (2874) это либо смещение, либо адрес по которому находится данное значение. Но если это адрес, то как его прочитать? (до этого никогда не читал из памяти файла в delphi)
#3
Отправлено 14 June 2011 - 07:05
#4
Отправлено 14 June 2011 - 09:14
Я только не пойму что означает
0xB3A - [byte]Смещение или адрес в памяти файла (о_о)?
#5
Отправлено 14 June 2011 - 11:00
#6
Отправлено 14 June 2011 - 17:42
#7
Отправлено 15 June 2011 - 09:53
#8
Отправлено 15 June 2011 - 11:54
Провёл эксперимент: запустил программу - там управление стоит как "М+К", зашёл в игру, исправил на джойпад, зашёл в прогу (выйдя из игры перед этим) управление осталось таким же - "М+К".
Код:
procedure TForm2.FormActivate(Sender: TObject); var FileName : String; int1 : BYTE; begin FileName := Form1.Edit1.Text; Stream := TFileStream.Create(FileName, fmOpenRead); Stream.Seek($0B3A, 0); Stream.Read(int1, 1); if int1 = 0 then label1.Caption := 'Устройство: KeyBoard + Mouse'; if int1 = 1 then label1.Caption := 'Устройство: Joypad'; end;
Сообщение отредактировал Sweet: 15 June 2011 - 11:54
#9
Отправлено 15 June 2011 - 13:28
может не тот файл открываешь?

и при смене настроек в игре, вот этот байт меняется с 0 на 1 и наоборот
#10
Отправлено 15 June 2011 - 14:12
Сообщение отредактировал Sweet: 15 June 2011 - 14:13
#11
Отправлено 15 June 2011 - 14:17
#12
Отправлено 15 June 2011 - 14:22
#13
Отправлено 15 June 2011 - 14:24
#14
Отправлено 15 June 2011 - 14:35
function GetSpecialPath(CSIDL: word): string; var s: string; begin SetLength(s, MAX_PATH); if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, true) then s := ''; result := PChar(s); end; ... procedure TForm1.FormCreate(Sender: TObject); var s1 : string; begin s1 := GetSpecialPath($0005); s1 := s1 + '\GTA San Andreas User Files\gta_sa.set'; Edit1.Clear; Edit1.Text := s1;
#15
Отправлено 15 June 2011 - 16:59
Stream.Seek($0B14, 0); // Здесь располагается чувствительность мыши Stream.Read(MouseSensivity, sizeof(DWORD)); // Читаем в MouseSensivity (DWORD) найденное label2.Caption := 'Чувствительность мыши: ' + MouseSensivity; // здесь ошибка - несовместимость типов: кардинал и строкаВопрос таков: как мне DWORD преобразовать в строку?
#16
Отправлено 15 June 2011 - 17:04
label2.Caption := 'Чувствительность мыши: ' + IntToStr(MouseSensivity);
#17
Отправлено 15 June 2011 - 17:43
Stream.Seek($0B2A, 0); Stream.Seek(TextureQ, 1); if TextureQ = 0 then label22.Caption := 'Качество текстур: низкое'; if TextureQ = 1 then label22.Caption := 'Качество текстур: среднее'; if TextureQ = 2 then label22.Caption := 'Качество текстур: высокое'; if TextureQ = 3 then label22.Caption := 'Качество текстур: наилучшее'; if TextureQ = 4 then label22.Caption := 'Качество текстур: ололо';Не читает значение по этому адресу. При запуске программы всегда почему-то остаётся этот лейбл без текста. Хотя я проверил 010 editorом что по данному смещению значение типа byte и равняется (у меня) 2.
Сообщение отредактировал Sweet: 16 June 2011 - 10:16
#18
Отправлено 16 June 2011 - 10:31
EDIT:
Stream.Seek($0B2A, 0); Stream.Seek(TextureQ, 1);Не читает значение по этому адресу. При запуске программы всегда почему-то остаётся этот лейбл без текста. Хотя я проверил 010 editorом что по данному смещению значение типа byte и равняется (у меня) 2.
А Read вызвать?
#19
Отправлено 16 June 2011 - 10:52
Тут ещё столкнулся с тем, о чём написал в самой статье. Это разрешение экрана.
Оно, как я собственно там и написал, всегда разное в зависимости от монитора и его макс. разрешения.
Так вот, стоит-ли делать считывание разрешения монитора как-то по другому (брать макс. разрешение экрана и т.д) или дорабатывать что есть? Т.к. вот этот код определяет неверно (и в set файле макс. значение далеко не 14, а 22, например).
Stream.Seek($0B36, 0); Stream.Read(Resolution, 1); if Resolution = 1 then label25.caption := 'Разрешение экрана: 640x480x16'; if Resolution = 2 then label25.caption := 'Разрешение экрана: ?x?x16'; if Resolution = 3 then label25.caption := 'Разрешение экрана: 720x576x16'; if Resolution = 4 then label25.caption := 'Разрешение экрана: 800x600x16'; if Resolution = 5 then label25.caption := 'Разрешение экрана: ?x?x16'; if Resolution = 6 then label25.caption := 'Разрешение экрана: ?x?x16'; if Resolution = 7 then label25.caption := 'Разрешение экрана: 1024x768x16'; if Resolution = 8 then label25.caption := 'Разрешение экрана: 640x480x32'; if Resolution = 9 then label25.caption := 'Разрешение экрана: ?x?x32'; if Resolution = 10 then label25.caption := 'Разрешение экрана: 720x576x32'; if Resolution = 11 then label25.caption := 'Разрешение экрана: 800x600x32'; if Resolution = 12 then label25.caption := 'Разрешение экрана: ?x?x32'; if Resolution = 13 then label25.caption := 'Разрешение экрана: ?x?x32'; if Resolution = 14 then label25.caption := 'Разрешение экрана: 1024x768x32'; if Resolution = 22 then label25.Caption := 'Разрешение экрана: 1280x1024x32';
Сообщение отредактировал Sweet: 16 June 2011 - 10:55
#20
Отправлено 17 June 2011 - 06:11
а еще, вот именно для таких случаев, есть такой оператор как case
например:
function ResolutionToStr(Value: Byte): String; begin case Value of 1: Result := 'Разрешение экрана: 640x480x16'; 2: Result := 'Разрешение экрана: ?x?x16'; ... 22: Result := 'Разрешение экрана: 1280x1024x32'; else Result := 'Unknown resolution'; end;и в коде пишешь что-то типа
label25.caption := ResolutionToStr(Resolution);
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных















