Перейти к содержанию
Авторизация  
Razi

[Cheat Engine] Как считывать/записывать значение на 7/9 бит?

Рекомендуемые сообщения

Как считывать/записывать значения на 7/9 бит на языке Lua? Нужно считывать/записывать значение на 9 bit с помощью CEComboBox. Нужно считывать/записывать значение на 7 bit с Edit box.

В игре, каждая вещь (item) в списке вещей (item list) хранится в виде  значения word (2 байта) с количеством, выраженным как 7-битное значение, объединенное с индексом вещи (item's index), выраженное как 9-битное значение между диапазоном 0-320. В двоичном виде: QQQQQQQXXXXXXXXX Где X - индекс, а Q - количество.

Например: 55 Potion, 55 - это количество, Potion - это индекс вещи (item's index).

Изменено пользователем Razi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на луа не подскажу, но общий алгоритм примерно такой:

1. Взять старшую часть (QQQQQQQX), сдвинуть ее на бит вправо с дополнением нулями (нулем). Получится количество в байтовом эквиваленте
2. Занулить старшие 7 бит исходного числа, получится 2 байтный индекс айтема.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не тестил, может не работать

-- "QQQQQQQXXXXXXXXX" двигаем 2-х байтовое значение вправо на 9, влево на 7  
local address = 0x00241B70
local value = readSmallInteger(address)
local firstParam = bShr(value, 9)
local secondParam = bShl(value, 7)
print("firstParam = ".. firstParam)
print("secondParam = ".. secondParam)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
13 часов назад, MasterGH сказал:

Не тестил, может не работать

Вправо на 9 - это понятно. А вот влево на 7 работать не будет, так как
XXXXXXXXX0000000 и 

0000000XXXXXXXXX - разные числа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Dark Byte на форуме подсказал:

считывать количество: (работает)

quantity=(wordvalue >> 9) & 0x7f

записывать количество: ( не работает)

wordvalue=(wordvalue & 0x1ff) | (quantity << 9)

 

считывать index: (работает)

index=wordvalue & 0x1ff

записывать index: ( не работает)

wordvalue=(wordvalue & 0xfe00) | index

 

Считывание количества и индекса работает, а запись количества и индекса не работает.

считывать индекс можно с кодом:

Спойлер

cacheTable_CEEditsiteminv = {}
for a = 1, 20 do
  cacheTable_CEEditsiteminv[a] = UDF1["CEComboBox"..a+183]
end

for x = 1, 20 do 
    local offset = x*2-2 
    cacheTable_CEEditsiteminv[x].ItemIndex = (bAnd(0xFFFF, readInteger(0x009E8ACC+offset))) & 0x1ff 
    if bAnd(0xFFFF, readInteger(0x009E8ACC+offset)) == 0xFFFF then 
    cacheTable_CEEditsiteminv[x].ItemIndex = 0x140 
    end 
end 

 

считывать количество можно с кодом:

Спойлер

cacheTable_CEEditsqtyinv = {}
for a = 1, 20 do
  cacheTable_CEEditsqtyinv[a] = UDF1["CEEdit"..a+299]
end

for x = 1, 20 do 
    local offset = x*2-2 
    cacheTable_CEEditsqtyinv[x].Text = (bAnd(0xFFFF, readInteger(0x009E8ACC+offset)) >> 9) & 0x7f 
end

 

 

Изменено пользователем Razi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.