diff options
Diffstat (limited to 'src/tool.cpp')
-rw-r--r-- | src/tool.cpp | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/tool.cpp b/src/tool.cpp index 66bd84a8e..d911c518f 100644 --- a/src/tool.cpp +++ b/src/tool.cpp @@ -56,7 +56,10 @@ void ToolGroupCap::fromJson(const Json::Value &json) void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const { - writeU8(os, 4); // protocol_version >= 37 + if (protocol_version >= 38) + writeU8(os, 5); + else + writeU8(os, 4); // proto == 37 writeF32(os, full_punch_interval); writeS16(os, max_drop_level); writeU32(os, groupcaps.size()); @@ -79,6 +82,9 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const os << serializeString(damageGroup.first); writeS16(os, damageGroup.second); } + + if (protocol_version >= 38) + writeU16(os, rangelim(punch_attack_uses, 0, U16_MAX)); } void ToolCapabilities::deSerialize(std::istream &is) @@ -111,6 +117,9 @@ void ToolCapabilities::deSerialize(std::istream &is) s16 rating = readS16(is); damageGroups[name] = rating; } + + if (version >= 5) + punch_attack_uses = readU16(is); } void ToolCapabilities::serializeJson(std::ostream &os) const @@ -118,6 +127,7 @@ void ToolCapabilities::serializeJson(std::ostream &os) const Json::Value root; root["full_punch_interval"] = full_punch_interval; root["max_drop_level"] = max_drop_level; + root["punch_attack_uses"] = punch_attack_uses; Json::Value groupcaps_object; for (auto groupcap : groupcaps) { @@ -144,6 +154,8 @@ void ToolCapabilities::deserializeJson(std::istream &is) full_punch_interval = root["full_punch_interval"].asFloat(); if (root["max_drop_level"].isInt()) max_drop_level = root["max_drop_level"].asInt(); + if (root["punch_attack_uses"].isInt()) + punch_attack_uses = root["punch_attack_uses"].asInt(); Json::Value &groupcaps_object = root["groupcaps"]; if (groupcaps_object.isObject()) { @@ -227,16 +239,20 @@ HitParams getHitParams(const ItemGroupList &armor_groups, const ToolCapabilities *tp, float time_from_last_punch) { s16 damage = 0; - float full_punch_interval = tp->full_punch_interval; + float result_wear = 0.0f; + float punch_interval_multiplier = + rangelim(time_from_last_punch / tp->full_punch_interval, 0.0f, 1.0f); for (const auto &damageGroup : tp->damageGroups) { s16 armor = itemgroup_get(armor_groups, damageGroup.first); - damage += damageGroup.second - * rangelim(time_from_last_punch / full_punch_interval, 0.0, 1.0) - * armor / 100.0; + damage += damageGroup.second * punch_interval_multiplier * armor / 100.0; } - return {damage, 0}; + if (tp->punch_attack_uses > 0) + result_wear = 1.0f / tp->punch_attack_uses * punch_interval_multiplier; + + u16 wear_i = U16_MAX * result_wear; + return {damage, wear_i}; } HitParams getHitParams(const ItemGroupList &armor_groups, |