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) if what == :selected 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 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 end elsif what.kind_of?(Integer) # search by id return world.items.all.binsearch(what) if not z # search by position x = what world.items.all.find { |i| i.pos.x == x and i.pos.y == y and i.pos.z == z } 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 end end