MCPcopy Create free account
hub / github.com/DFHack/dfhack / getValue

Method getValue

library/modules/Items.cpp:1649–1752  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1647}
1648
1649int 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();

Callers

nothing calls this directly

Calls 6

get_war_multiplierFunction · 0.85
getTypeMethod · 0.80
findFunction · 0.50
sizeMethod · 0.45

Tested by

no test coverage detected