Перейти к содержимому


Фотография
- - - - -

gta_sa.set


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 30

#1 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 13 June 2011 - 17:55

Это тема для обсуждения статьи: gta_sa.set

#2 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 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 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 14 June 2011 - 07:05

А что именно ты хочешь сделать?
You think your day was surreal? Try mine.

#4 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 14 June 2011 - 09:14

Ридер SET файла, написал же сразу.
Я только не пойму что означает
0xB3A - [byte]
Смещение или адрес в памяти файла (о_о)?

#5 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 14 June 2011 - 11:00

Смещение относительно начала файла.
You think your day was surreal? Try mine.

#6 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 14 June 2011 - 17:42

Тогда что не правильно в моём приведённом коде?

#7 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 15 June 2011 - 09:53

а в чем собственно проблема? код выглядит нормально вроде-бы и какого типа переменная int1 ?

#8 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 15 June 2011 - 11:54

Я уже исправил немного. Теперь она BYTE. Но код до сих пор работает не правильно.
Провёл эксперимент: запустил программу - там управление стоит как "М+К", зашёл в игру, исправил на джойпад, зашёл в прогу (выйдя из игры перед этим) управление осталось таким же - "М+К".
Код:
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 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 15 June 2011 - 13:28

я сам лично перепроверил, этот код рабочий,
может не тот файл открываешь?
Изображение

и при смене настроек в игре, вот этот байт меняется с 0 на 1 и наоборот

#10 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 15 June 2011 - 14:12

А какой файл надо читать? Меня терзают смутные сомнения потому, что есть два места на диске где есть папка User Files. Это: (1) C:\Пользователи\Михаил\Documents\GTA San Andreas User Files\gta_sa.set (именно её я и читаю) и (2) C:\Пользователи\Public\Documents\GTA San Andreas User Files\gta_sa.set. Судя по всему, изменяется не 1, а 2, т.к. после закрытия игры в файле изменений не нашёл. EDIT: Опытным путём выяснил, что игра читает именно файл из папки Public\Documents\... В чём проблема?

Сообщение отредактировал Sweet: 15 June 2011 - 14:13


#11 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 15 June 2011 - 14:17

ну просто читает этот да и все, в чем проблема, вот и редактируй тот что в Моих Документах лежит и будет счастье

#12 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 15 June 2011 - 14:22

Ну этого-то по-идее не должно быть. Игра должна читать файл конфигурации из папки пользователя, а не общей папки. Щас переустанавливаю игру, снова проверю. Может из-за мода такое началось.

#13 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 15 June 2011 - 14:24

у меня тоже игра читает настройки с Моих Документов и что с того)

#14 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 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 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 15 June 2011 - 16:59

Проблема возникла снова.
Stream.Seek($0B14, 0); // Здесь располагается чувствительность мыши
Stream.Read(MouseSensivity, sizeof(DWORD)); // Читаем в MouseSensivity (DWORD) найденное
label2.Caption := 'Чувствительность мыши: ' + MouseSensivity; // здесь ошибка - несовместимость типов: кардинал и строка
Вопрос таков: как мне DWORD преобразовать в строку?

#16 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 15 June 2011 - 17:04

label2.Caption := 'Чувствительность мыши: ' + IntToStr(MouseSensivity);


#17 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 15 June 2011 - 17:43

EDIT:
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 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 16 June 2011 - 10:31

EDIT:

Stream.Seek($0B2A, 0);
Stream.Seek(TextureQ, 1);
Не читает значение по этому адресу. При запуске программы всегда почему-то остаётся этот лейбл без текста. Хотя я проверил 010 editorом что по данному смещению значение типа byte и равняется (у меня) 2.


А Read вызвать?
You think your day was surreal? Try mine.

#19 Sweet

Sweet

    Активный участник

  • Пользователи
  • PipPipPip
  • 418 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 16 June 2011 - 10:52

Ой точно, не заметил что написал фигню :D
Тут ещё столкнулся с тем, о чём написал в самой статье. Это разрешение экрана.
Оно, как я собственно там и написал, всегда разное в зависимости от монитора и его макс. разрешения.
Так вот, стоит-ли делать считывание разрешения монитора как-то по другому (брать макс. разрешение экрана и т.д) или дорабатывать что есть? Т.к. вот этот код определяет неверно (и в 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 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 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 анонимных