Razi Опубликовано 5 июня, 2018 Поделиться Опубликовано 5 июня, 2018 (изменено) Как считывать/записывать значения на 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). Изменено 5 июня, 2018 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 5 июня, 2018 Поделиться Опубликовано 5 июня, 2018 на луа не подскажу, но общий алгоритм примерно такой: 1. Взять старшую часть (QQQQQQQX), сдвинуть ее на бит вправо с дополнением нулями (нулем). Получится количество в байтовом эквиваленте 2. Занулить старшие 7 бит исходного числа, получится 2 байтный индекс айтема. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 5 июня, 2018 Поделиться Опубликовано 5 июня, 2018 Не тестил, может не работать -- "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) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 6 июня, 2018 Поделиться Опубликовано 6 июня, 2018 13 часов назад, MasterGH сказал: Не тестил, может не работать Вправо на 9 - это понятно. А вот влево на 7 работать не будет, так какXXXXXXXXX0000000 и 0000000XXXXXXXXX - разные числа. Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 6 июня, 2018 Автор Поделиться Опубликовано 6 июня, 2018 (изменено) 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 Изменено 6 июня, 2018 пользователем Razi Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения