| 1647 | } |
| 1648 | |
| 1649 | int Items::getValue(df::item *item, df::caravan_state *caravan) { |
| 1650 | CHECK_NULL_POINTER(item); |
| 1651 | int16_t item_type = item->getType(); |
| 1652 | int16_t item_subtype = item->getSubtype(); |
| 1653 | int16_t mat_type = item->getMaterial(); |
| 1654 | int32_t mat_subtype = item->getMaterialIndex(); |
| 1655 | |
| 1656 | // Get base value for item type, subtype, and material |
| 1657 | int value = getItemBaseValue(item_type, item_subtype, mat_type, mat_subtype); |
| 1658 | // Entity value modifications |
| 1659 | value *= get_war_multiplier(item, caravan); |
| 1660 | value >>= 8; |
| 1661 | |
| 1662 | // Improve value based on quality |
| 1663 | switch (item->getQuality()) |
| 1664 | { |
| 1665 | case 1: value *= 1.1; value += 3; break; // (-) well-crafted |
| 1666 | case 2: value *= 1.2; value += 6; break; // (+) Finely-crafted |
| 1667 | case 3: value *= 1.333; value += 10; break; // (*) superior quality |
| 1668 | case 4: value *= 1.5; value += 15; break; // (≡) exceptional |
| 1669 | case 5: value *= 2; value += 30; break; // (☼) masterful, artifact |
| 1670 | } |
| 1671 | |
| 1672 | // Add improvement values |
| 1673 | int impValue = item->getThreadDyeValue(caravan) + item->getImprovementsValue(caravan); |
| 1674 | if (item_type == item_type::AMMO) // Ammo improvements are worth less |
| 1675 | impValue /= 30; |
| 1676 | value += impValue; |
| 1677 | |
| 1678 | // Degrade value due to wear |
| 1679 | switch (item->getWear()) |
| 1680 | { |
| 1681 | case 1: value = value * 3 / 4; break; // (x) worn |
| 1682 | case 2: value = value / 2; break; // (X) threadbare |
| 1683 | case 3: value = value / 4; break; // (XX) tattered |
| 1684 | } |
| 1685 | |
| 1686 | // Magical powers have 500 value each |
| 1687 | auto magic = item->getMagic(); |
| 1688 | if (magic != NULL) |
| 1689 | value += magic->power.size() * 500; |
| 1690 | |
| 1691 | // Artifacts have 10x value |
| 1692 | if (item->flags.bits.artifact_mood) |
| 1693 | value *= 10; |
| 1694 | |
| 1695 | // Modify buy/sell prices |
| 1696 | if (caravan) { |
| 1697 | int32_t buy_multiplier = get_buy_request_multiplier(item, caravan->buy_prices); |
| 1698 | if (buy_multiplier == DEFAULT_AGREEMENT_MULTIPLIER) |
| 1699 | value *= get_sell_request_multiplier(item, caravan); |
| 1700 | else |
| 1701 | value *= buy_multiplier; |
| 1702 | value >>= 7; |
| 1703 | } |
| 1704 | |
| 1705 | // Boost value from stack size |
| 1706 | value *= item->getStackSize(); |
nothing calls this directly
no test coverage detected