2012-03-17 17:57:50 -06:00
|
|
|
function getTypename(object)
|
|
|
|
local tbl
|
|
|
|
local ret={}
|
|
|
|
if getmetatable(object)~=nil then
|
|
|
|
local tbl=getmetatable(object)
|
|
|
|
for k,v in pairs(xtypes) do
|
|
|
|
if v==tbl then
|
|
|
|
return k
|
|
|
|
end
|
|
|
|
end
|
|
|
|
for k,v in pairs(xtypes.containers) do
|
|
|
|
if v==tbl then
|
|
|
|
return k
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if object.name~= nil then
|
|
|
|
return object.name
|
|
|
|
end
|
|
|
|
return "?"
|
|
|
|
end
|
|
|
|
function getFields(object)
|
|
|
|
local tbl
|
|
|
|
local ret={}
|
|
|
|
if getmetatable(object)==xtypes["struct-type"].wrap then
|
|
|
|
tbl=rawget(object,"mtype")
|
|
|
|
elseif getmetatable(object)==xtypes["struct-type"] then
|
|
|
|
tbl=object
|
|
|
|
else
|
|
|
|
error("Not an class_type or a class_object")
|
|
|
|
end
|
|
|
|
for k,v in pairs(tbl.types) do
|
|
|
|
table.insert(ret,{k,v[2],getTypename(v[1])})
|
|
|
|
--ret[v[2]]=k
|
|
|
|
--print(string.format("%s %x",k,v[2]))
|
|
|
|
end
|
|
|
|
table.sort(ret,function (a,b) return a[2]>b[2] end)
|
|
|
|
return ret
|
|
|
|
end
|
|
|
|
function editField(tbl,field,typename)
|
|
|
|
if EditType[typename] ~= nil then
|
|
|
|
EditType[typename](tbl[field])
|
|
|
|
else
|
|
|
|
print("Cur value:"..tostring(tbl[field]))
|
|
|
|
val=getline("Enter newvalue:")
|
|
|
|
tbl[field]=val
|
|
|
|
end
|
|
|
|
end
|
|
|
|
EditType={}
|
|
|
|
EditType["df-flagarray"]=function(trg)
|
|
|
|
local fields=rawget(trg,"mtype").index.names
|
|
|
|
print("Flag count:"..trg.size)
|
|
|
|
print("Name count:"..#fields)
|
|
|
|
for i=0,#fields do
|
|
|
|
print(string.format("%3d %20s %s",i,fields[i],tostring(trg[i-1])))
|
|
|
|
end
|
|
|
|
number=getline("enter flag id to flip:")
|
|
|
|
number=tonumber(number)
|
|
|
|
if number then
|
|
|
|
trg[fields[number]]= not trg[fields[number]]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
EditType["enum-type"]=function(trg)
|
|
|
|
local fields=rawget(trg,"mtype").names
|
|
|
|
local typename=getTypename(rawget(trg,"mtype").etype)
|
|
|
|
for k,v in pairs(fields) do
|
|
|
|
print(string.format("%3d %s",k,v))
|
|
|
|
end
|
|
|
|
local cval=trg:get()
|
|
|
|
if fields[cval]~= nil then
|
|
|
|
print(string.format("Current value:%d (%s)",cval,fields[cval]))
|
|
|
|
else
|
|
|
|
print(string.format("Current value:%d",cval))
|
|
|
|
end
|
|
|
|
number=getline("enter new value:")
|
|
|
|
number=tonumber(number)
|
|
|
|
if number then
|
|
|
|
trg:set(number)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
EditType["static-array"]=function(trg)
|
|
|
|
local item_type=rawget(trg,"mtype").item_type
|
|
|
|
local typename=getTypename(item_type)
|
|
|
|
number=getline(string.format("Select item (max %d, item-type '%s'):",trg.size,typename))
|
|
|
|
number=tonumber(number)
|
|
|
|
if number then
|
|
|
|
EditType[typename](trg[number])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
EditType["stl-vector"]=EditType["static-array"]
|
2012-03-18 04:24:28 -06:00
|
|
|
EditType["df-array"]=EditType["static-array"]
|
2012-03-17 17:57:50 -06:00
|
|
|
EditType["struct-type"]=function(trg)
|
|
|
|
local mtype=rawget(trg,"mtype")
|
|
|
|
local fields=getFields(trg)
|
|
|
|
for k,v in pairs(fields) do
|
|
|
|
print(string.format("%4d %25s %s",k,v[1],v[3]))
|
|
|
|
end
|
|
|
|
number=getline("Choose field to edit:")
|
|
|
|
number=tonumber(number)
|
|
|
|
if number then
|
|
|
|
local v=fields[number]
|
|
|
|
editField(trg,v[1],v[3])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
EditType["pointer"]=function(trg)
|
|
|
|
local mtype=rawget(trg,"mtype").ptype
|
|
|
|
local typename=getTypename(mtype)
|
2012-03-18 04:24:28 -06:00
|
|
|
if(trg:tonumber()==0) then
|
|
|
|
print("pointer points to nowhere!")
|
|
|
|
return
|
|
|
|
end
|
2012-03-17 17:57:50 -06:00
|
|
|
print("Auto dereferencing pointer! type:"..typename)
|
|
|
|
if EditType[typename] ~= nil then
|
|
|
|
EditType[typename](trg:deref())
|
|
|
|
else
|
|
|
|
print("Cur value:"..tostring(trg:deref()))
|
|
|
|
val=getline("Enter newvalue:")
|
|
|
|
trg:setref(val)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function EditDF()
|
|
|
|
local i=1
|
|
|
|
local tbl={}
|
|
|
|
for k,v in pairs(rawget(df,"types")) do
|
|
|
|
print(string.format("%4d %25s %s",i,k,getTypename(v)))
|
|
|
|
tbl[i]={k,getTypename(v)}
|
|
|
|
i=i+1
|
|
|
|
end
|
2012-07-18 12:07:27 -06:00
|
|
|
number=dfhack.lineedit("select item to edit (q to quit):")
|
2012-03-17 17:57:50 -06:00
|
|
|
if number and tonumber(number) then
|
|
|
|
local entry=tbl[tonumber(number)]
|
|
|
|
if entry==nil then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
editField(df,entry[1],entry[2])
|
|
|
|
--[=[
|
|
|
|
if EditType[entry[2]] ~= nil then
|
|
|
|
EditType[entry[2]](df[entry[1]])
|
|
|
|
else
|
|
|
|
print("Cur value:"..tostring(df[entry[1]]))
|
|
|
|
val=getline("Enter newvalue:")
|
|
|
|
df[entry[1]]=val
|
|
|
|
end
|
|
|
|
--]=]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function EditObject(obj)
|
|
|
|
EditType[getTypename(obj)](obj)
|
|
|
|
end
|