dfhack/plugins/ruby/item.rb

68 lines
2.8 KiB
Ruby

2012-06-24 09:30:26 -06:00
module DFHack
class << self
# return an Item
# arg similar to unit.rb/unit_find; no arg = 'k' menu
def item_find(what=:selected, y=nil, z=nil)
2012-06-24 09:30:26 -06:00
if what == :selected
2012-09-24 07:40:35 -06:00
case curview._rtti_classname
when :viewscreen_itemst
if ref = curview.entry_ref[curview.cursor_pos]
ref.item_tg if ref.kind_of?(GeneralRefItem)
else
# not a container
curview.item
end
2012-09-24 07:40:35 -06:00
when :viewscreen_storesst # z/stocks
if curview.in_group_mode == 0 and curview.in_right_list == 1
curview.items[curview.item_cursor]
end
else
case ui.main.mode
when :LookAround
k = ui_look_list.items[ui_look_cursor]
case k.type
when :Item
k.item
when :Building
# hilight a constructed bed/coffer
mats = k.building.contained_items.find_all { |i| i.use_mode == 2 }
mats[0].item if mats.length == 1
end
when :BuildingItems
bld = world.selected_building
bld.contained_items[ui_building_item_cursor].item if bld
when :ViewUnits
u = world.units.active[ui_selected_unit]
u.inventory[ui_look_cursor].item if u and u.pos.z == cursor.z and
ui_unit_view_mode.value == :Inventory and u.inventory[ui_look_cursor]
else
ui.follow_item_tg if ui.follow_item != -1
end
2012-06-24 09:30:26 -06:00
end
elsif what.kind_of?(Integer)
# search by id
return world.items.all.binsearch(what) if not z
# search by position
x = what
2012-07-05 06:15:34 -06:00
world.items.all.find { |i| i.pos.x == x and i.pos.y == y and i.pos.z == z }
2012-06-24 09:30:26 -06:00
elsif what.respond_to?(:x) or what.respond_to?(:pos)
world.items.all.find { |i| same_pos?(what, i) }
else
raise "what what?"
end
end
# check item flags to see if it is suitable for use as a job input material
def item_isfree(i)
!i.flags.trader and
!i.flags.in_job and
(!i.flags.in_inventory or i.general_refs.grep(GeneralRefContainedInItemst).first) and
!i.flags.removed and
!i.flags.in_building and
!i.flags.owned and
!i.flags.forbid
end
2012-06-24 09:30:26 -06:00
end
end