How to tell if an item is tradeable?

zarqon

Well-known member
I'm working on an item trading script for my clan (we're building a clan treasurer, kind of like a bot to replace the stash) and looked in vain for a quick way to access whether or not an item is tradeable. I did something like this, accessing mafia's tradeitems.txt file:

Code:
print("Loading item list...");
record m_item {
   string name;             // item name
   int something;           // no idea
   string use;              // item type (possible: all, display, gift, none (=quest))
   int autosell;            // listed autosell price
};
m_item[int] itemlist;
if (!file_to_map("tradeitems.txt", itemlist)) {
   print("Unable to load item list.  Updating...");
   cli_execute("update");
   abort("We at the Society of Recommending Things recommend that you restart mafia and try this script again.");
}
if (count(itemlist) == 0) abort("Sorry, but tradeitems.txt is corrupt or empty or somesuch.");
print(count(itemlist)+" items loaded.");

m_item blank_item() { 
   m_item result; return result;
}
m_item find_item(item which) {
   string s = to_string(which);
   foreach i in itemlist
      if (itemlist[i].name == s) return itemlist[i];
   return blank_item();
}
m_item find_item(string which) { return find_item(to_item(which)); }
boolean is_tradeable(m_item which) {
   return (which.use == "all" || which.use == "gift");
}
boolean is_tradeable(item which) { return is_tradeable(find_item(which)); }

But it's quite bulky and fairly slow since it foreaches through a map of records which numbers well over 2000. It seems like an ash function buffer get_item_desc(item) which returns the HTML of the popup item description would be pretty awesome. Or since most of that pertinent information is already available via other ASH functions, how about a boolean is_tradeable(item)? And for thoroughness' sake, possibly a boolean is_discardable(item), although I'm not sure what practical use that has.

I'd be grateful to anyone who can improve my is_tradeable() or point out that this functionality already exists somewhere. Or, if not, I'd be very grateful if someone deems it worthy to add to ASH.
 

holatuwol

Developer
KoLmafia doesn't really care about discard (it never uses it), so I don't believe there's a flag for it. I can see a more efficient way to find out if an item is tradeable, but in spite of being a speed improvement, it does seem overly cludgy. I'll go ahead and add is_tradeable() to the runtime library.
 
Top