Copied from Kelly Martin's code
| 226 | |
| 227 | // Copied from Kelly Martin's code |
| 228 | static inline bool can_melt(df::item* item) |
| 229 | { |
| 230 | |
| 231 | df::item_flags bad_flags; |
| 232 | bad_flags.whole = 0; |
| 233 | |
| 234 | #define F(x) bad_flags.bits.x = true; |
| 235 | F(dump); F(forbid); F(garbage_collect); F(in_job); |
| 236 | F(hostile); F(on_fire); F(rotten); F(trader); |
| 237 | F(in_building); F(construction); F(artifact); F(melt); |
| 238 | #undef F |
| 239 | |
| 240 | if (item->flags.whole & bad_flags.whole) |
| 241 | return false; |
| 242 | |
| 243 | df::item_type t = item->getType(); |
| 244 | |
| 245 | if (t == df::enums::item_type::BOX || t == df::enums::item_type::BAR) |
| 246 | return false; |
| 247 | |
| 248 | if (!is_metal_item(item)) return false; |
| 249 | |
| 250 | for (auto g = item->general_refs.begin(); g != item->general_refs.end(); g++) |
| 251 | { |
| 252 | switch ((*g)->getType()) |
| 253 | { |
| 254 | case general_ref_type::CONTAINS_ITEM: |
| 255 | case general_ref_type::UNIT_HOLDER: |
| 256 | case general_ref_type::CONTAINS_UNIT: |
| 257 | return false; |
| 258 | case general_ref_type::CONTAINED_IN_ITEM: |
| 259 | { |
| 260 | df::item* c = (*g)->getItem(); |
| 261 | for (auto gg = c->general_refs.begin(); gg != c->general_refs.end(); gg++) |
| 262 | { |
| 263 | if ((*gg)->getType() == general_ref_type::UNIT_HOLDER) |
| 264 | return false; |
| 265 | } |
| 266 | } |
| 267 | break; |
| 268 | default: |
| 269 | break; |
| 270 | } |
| 271 | } |
| 272 | |
| 273 | if (item->getQuality() >= item_quality::Masterful) |
| 274 | return false; |
| 275 | |
| 276 | return true; |
| 277 | } |
| 278 | |
| 279 | |
| 280 | /* |
nothing calls this directly
no test coverage detected