dfhack/plugins/Dfusion/luafiles/items/plugin.lua

212 lines
6.0 KiB
Lua

items={} --> first lets make a menu table
items.menu=MakeMenu()
function items.dest()
myoff=offsets.getEx("Items") -- first find out where "item vector" is
vector=engine.peek(myoff,ptr_vector) -- get list of items
for i=0,vector:size()-1 do --look at each item
flg=engine.peek(vector:getval(i),ptr_item.flags)
flg:set(17,1)
engine.poke(vector:getval(i),ptr_item.flags,flg)
end
end
function items.eggs()
myoff=offsets.getEx("Items") -- first find out where "item vector" is
vector=engine.peek(myoff,ptr_vector) -- get list of items
for i=0,vector:size()-1 do --look at each item
rti=engine.peek(vector:getval(i),ptr_item.RTI)
if ptr_item.getname(nil,rti)=="item_eggst" then
egg=engine.peek(vector:getval(i),ptr_subitems["item_eggst"])
egg.isfertile=1
egg.hatchtime=0xffffff
--egg.race=123 -- change race for fun times
engine.poke(vector:getval(i),ptr_subitems["item_eggst"],egg)
end
end
end
function editFlags(offset)
while true do
flags=engine.peek(offset,ptr_item.flags)
for i=0,8*8-1 do
if flags:get(i) then
print(i.." is true")
else
print(i.." is false")
end
end
print(" enter number to switch flag or not a number to quit:")
q=tonumber(io.stdin:read())
if q==nil then return end
flags:flip(q)
engine.poke(offset,ptr_item.flags,flags)
end
end
function editCovering(offset)
off=engine.peek(offset,ptr_item.ptr_covering)
if off == 0 then
print("No coverings found.")
end
vec=engine.peek(off,ptr_vector)
print("Covering list:")
for i=0,vec:size()-1 do
cov=engine.peek(vec:getval(i),ptr_cover)
print(string.format("%d. mat=%d submat=%d state=%d",i,cov.mat,cov.submat,cov.state))
end
print("To edit type number:")
q=tonumber(io.stdin:read())
if q==nil then return end
if q>=vec:size() or q<0 then return end
off=vec:getval(q)
cov=engine.peek(off,ptr_cover)
print("Enter mat:")
q=tonumber(io.stdin:read())
if q==nil then q=0xffff end
print("Enter submat:")
v=tonumber(io.stdin:read())
if v==nil then v=0xffff end
print("Enter state:")
y=tonumber(io.stdin:read())
if y==nil then y=0 end
cov.mat=q
cov.submat=v
cov.state=y
engine.poke(off,ptr_cover,cov)
end
function editMaterial(offset)
print("Mat id 0 to 18 is in normal materials (inorganic, amber etc...) after that creature mat (with submat2 being race)")
print("from 219 with submat2=0xffffffff (type not a number) it reads legends id, from 419 submat2 means plant id")
print("Probably submat is not used :? ")
mat=engine.peek(offset,ptr_item.mat)
submat=engine.peek(offset,ptr_item.submat)
submat2=engine.peek(offset,ptr_item.submat2)
lid=engine.peek(offset,ptr_item.legendid)
print(string.format("Now is mat=%d, submat=%d submat2=%d legend id=%d",mat,submat,submat2,lid))
print("Enter mat:")
q=tonumber(io.stdin:read())
if q==nil then return end
print("Enter submat:")
v=tonumber(io.stdin:read())
if v==nil then v=0xffff end
print("Enter submat2:")
z=tonumber(io.stdin:read())
if z==nil then z=0xffffffff end
print("Enter legendid:")
y=tonumber(io.stdin:read())
if y==nil then y=0xffffffff end
engine.poke(offset,ptr_item.mat,q)
engine.poke(offset,ptr_item.submat,v)
engine.poke(offset,ptr_item.legendid,y)
engine.poke(offset,ptr_item.submat2,z)
print("Done")
end
function items.select()
myoff=offsets.getEx("Items")
vector=engine.peek(myoff,ptr_vector)
tx,ty,tz=getxyz()
T={}
for i=0,vector:size()-1 do --this finds all item offsets that are on pointer
itoff=vector:getval(i)
x=engine.peek(itoff,ptr_item.x)
y=engine.peek(itoff,ptr_item.y)
z=engine.peek(itoff,ptr_item.z)
if x==tx and y==ty and z==tz then
table.insert(T,itoff)
end
end
print("Items under cursor:")
i=1
for _,v in pairs(T) do
RTI=engine.peek(v,ptr_item.RTI)
print(i..". "..ptr_item.getname(nil,RTI))
i=i+1
end
print("Type number to edit or 'q' to exit")
while true do
q=io.stdin:read()
if q=='q' then return end
if tonumber(q) ~=nil and tonumber(q)<i then break end
end
return T[tonumber(q)]
end
function items.select_creature(croff)
vector=engine.peek(croff,ptr_Creature.itemlist2)
print("Vector size:"..vector:size())
T={}
for i=0,vector:size()-1 do
table.insert(T,vector:getval(i)) -- item list is itemptr+location?
end
print("Items in inventory:")
i=1
for _,v in pairs(T) do
RTI=engine.peek(engine.peekd(v),ptr_item.RTI)
print(i..". "..ptr_item.getname(nil,RTI).." locations:"..engine.peekw(v+4).." "..engine.peekw(v+6))
i=i+1
end
print("Type number to edit or 'q' to exit")
while true do
q=io.stdin:read()
if q=='q' then return end
if tonumber(q) ~=nil and tonumber(q)<i then break end
end
return engine.peekd(T[tonumber(q)])
end
function items.edit(itoff)
if itoff==nil then
itoff=items.select()
end
print(string.format("Item offset:%x",itoff))
print("Type what to edit:")
print("1. material")
print("2. flags")
print("3. covering")
Z={}
Z[1]=editMaterial
Z[2]=editFlags
Z[3]=editCovering
name=ptr_item.getname(nil,engine.peek(itoff,ptr_item.RTI))
if name~=nil and ptr_subitems[name]~=nil then
print("4. Item specific edit")
--Z[4]=items.fedit[name]
Z[4]="dummy"
end
while true do
q=io.stdin:read()
if q=='q' then return end
if tonumber(q) ~=nil and tonumber(q)<#Z+1 then break end
end
if Z[tonumber(q)]=="dummy" then
ModPattern(itoff,ptr_subitems[name])
else
Z[tonumber(q)](itoff)
end
end
function items.printref()
itoff=items.select()
vec=engine.peek(itoff,ptr_item.ref)
for i=0, vec:size()-1 do
toff=vec:getval(i)
print(RTTI_GetName(engine.peekd(toff)))
end
print("Decorations:")
vec=engine.peek(itoff,ptr_item.decorations)
for i=0, vec:size()-1 do
toff=vec:getval(i)
print(ptr_decoration_gen.getname(nil,engine.peek(toff,ptr_decoration_gen.RTI)))
end
end
function items.edit_adv()
vec=engine.peek(offsets.getEx("CreatureVec"),ptr_vector)
items.edit(items.select_creature(vec:getval(0)))
end
if not(FILE) then -- if not in script mode
items.menu:add("Destroy all",items.dest)
items.menu:add("Hatch eggs",items.eggs)
items.menu:add("Edit item",items.edit)
items.menu:add("Print ref",items.printref)
items.menu:add("Edit adventurer's items",items.edit_adv)
items.menu:display()
end