<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="21">
  <CheatEntries>
    <CheatEntry>
      <ID>1</ID>
      <Description>"Script"</Description>
      <Options moHideChildren="1"/>
      <LastState Activated="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{$lua}
--

function combox(cb,kvTbl,writeValueFn,readValueFn,readInterval,fmt)
   fmt = fmt or function(v,k)return string.format("%s: (%s)",tostring(k or '*unknown'),tostring(v or '?')) end
   local list,v2index,index2v,text,v2k,interacting = {},{},{},{fmt()},{}
   for k,v in pairs(kvTbl) do
     if type(k)=='string' then list[1+#list] = {k,v} end
   end
   table.sort(list,function(a,b)return a[1]:lower()&lt;b[1]:lower()end)
   for i=1,#list do
     local k,v = list[i][1],list[i][2]
     text[i+1],v2index[v],index2v[i],v2k[v] = fmt(v,k),i,v,k
   end
   cb.Items.Text = table.concat(text,'\n')

   if type(writeValueFn)=='function' then
     cb.OnChange = function(b)
       local idx = b.ItemIndex
       if idx &gt;0 then -- ignore unknown value, ie. index 0
         local val = index2v[idx]
         writeValueFn(val,v2k[val])
       end
     end
   end

   if type(readValueFn)=='function' then
     readInterval = readInterval or 100
     local tm = cb.Tag
     if tm==0 then tm = createTimer(cb) else tm = integerToUserData(tm)end--recall or create timer
     if type(tm)~= 'userdata' or tm.ClassName ~= 'TTimer' then error("Can't create timer") end

     tm.Interval = readInterval
     tm.OnTimer = function(me)
       if interacting then return end

       local idx,val = nil,readValueFn()
       if val~=nil then idx = v2index[val] else val = '??' end
       if idx == nil then
         cb.Items[0] = fmt(val) -- unknown value
         cb.ItemIndex = 0
       else
         cb.ItemIndex = idx
       end

       processMessages()
     end

     local OnInteractingStart,OnInteractingEnd = function()interacting = true end,function()interacting = false end
     cb.OnMouseMove = OnInteractingStart
     cb.OnMouseEnter = OnInteractingStart
     cb.OnSelect = OnInteractingStart

     cb.OnMouseLeave = OnInteractingEnd
     cb.OnEditingDone = OnInteractingEnd

     cb.Tag = userDataToInteger(tm) -- save timer
   end
end

[ENABLE]
[DISABLE]
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>0</ID>
          <Description>"Test "</Description>
          <LastState/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{$lua}
if syntaxcheck then return end
----- test
local function ceupd(t,o)
  for k,v in pairs(o) do
    local peek = t[k]
    if type(v)=='table' and type(peek)=='userdata' then t[k] = ceupd(peek,v) else t[k] = v end
  end
  return t
end

local fm = ceupd(createForm(),{
  Caption='Test Form',
  BorderStyle=bsSizeable,
  AutoSize=true,
  Constraints={MinWidth=200},
  OnClose=function(me)me.Destroy();fm=nil ;return caFree end
})

local cb = ceupd(createComboBox(fm),{
  Align=alClient,
  Font={Name='Courier New'},
})

local MyTable = { -- key is name/desc, value is index to read/write etc
  Gun = 11,
  Sword = 12,
  ["AK-47"] = 13   -- use ["..for NON lua identifier string.."]
}


local cnt = 0.0
local function writeFn(v,k) print(k,' = ',v) end
local function readFn() cnt = cnt + 0.1 ; return 10 + math.floor(cnt)%5 end



combox(cb,MyTable,writeFn,readFn)

[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
  <LuaScript>
</LuaScript>
</CheatTable>
