Перейти к содержанию

[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
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

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

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