From 9e1c8b7ab5db33f544305c3b160ca65b6972370f Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 8 Jul 2013 13:46:07 +0300 Subject: add ability to show stats from items.xml like strings. --- src/net/eathena/generalhandler.cpp | 12 ++++++------ src/net/tmwa/generalhandler.cpp | 12 ++++++------ src/resources/itemdb.cpp | 27 ++++++++++++++++----------- src/utils/stringutils.cpp | 14 ++++++++++++++ src/utils/stringutils.h | 2 ++ src/utils/stringutils_unittest.cc | 13 +++++++++++++ 6 files changed, 57 insertions(+), 23 deletions(-) diff --git a/src/net/eathena/generalhandler.cpp b/src/net/eathena/generalhandler.cpp index b75044bb3..029b7fcd4 100644 --- a/src/net/eathena/generalhandler.cpp +++ b/src/net/eathena/generalhandler.cpp @@ -99,12 +99,12 @@ GeneralHandler::GeneralHandler() : generalHandler = this; std::vector stats; - stats.push_back(ItemDB::Stat("str", _("Strength %+d"))); - stats.push_back(ItemDB::Stat("agi", _("Agility %+d"))); - stats.push_back(ItemDB::Stat("vit", _("Vitality %+d"))); - stats.push_back(ItemDB::Stat("int", _("Intelligence %+d"))); - stats.push_back(ItemDB::Stat("dex", _("Dexterity %+d"))); - stats.push_back(ItemDB::Stat("luck", _("Luck %+d"))); + stats.push_back(ItemDB::Stat("str", _("Strength %s"))); + stats.push_back(ItemDB::Stat("agi", _("Agility %s"))); + stats.push_back(ItemDB::Stat("vit", _("Vitality %s"))); + stats.push_back(ItemDB::Stat("int", _("Intelligence %s"))); + stats.push_back(ItemDB::Stat("dex", _("Dexterity %s"))); + stats.push_back(ItemDB::Stat("luck", _("Luck %s"))); ItemDB::setStatsList(stats); } diff --git a/src/net/tmwa/generalhandler.cpp b/src/net/tmwa/generalhandler.cpp index fa625b76f..ba8f40551 100644 --- a/src/net/tmwa/generalhandler.cpp +++ b/src/net/tmwa/generalhandler.cpp @@ -102,17 +102,17 @@ GeneralHandler::GeneralHandler() : std::vector stats; // TRANSLATORS: player stat - stats.push_back(ItemDB::Stat("str", _("Strength %+d"))); + stats.push_back(ItemDB::Stat("str", _("Strength %s"))); // TRANSLATORS: player stat - stats.push_back(ItemDB::Stat("agi", _("Agility %+d"))); + stats.push_back(ItemDB::Stat("agi", _("Agility %s"))); // TRANSLATORS: player stat - stats.push_back(ItemDB::Stat("vit", _("Vitality %+d"))); + stats.push_back(ItemDB::Stat("vit", _("Vitality %s"))); // TRANSLATORS: player stat - stats.push_back(ItemDB::Stat("int", _("Intelligence %+d"))); + stats.push_back(ItemDB::Stat("int", _("Intelligence %s"))); // TRANSLATORS: player stat - stats.push_back(ItemDB::Stat("dex", _("Dexterity %+d"))); + stats.push_back(ItemDB::Stat("dex", _("Dexterity %s"))); // TRANSLATORS: player stat - stats.push_back(ItemDB::Stat("luck", _("Luck %+d"))); + stats.push_back(ItemDB::Stat("luck", _("Luck %s"))); ItemDB::setStatsList(stats); } diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 379b79e58..ff417d36e 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -59,15 +59,15 @@ static int parseDirectionName(const std::string &name); static const char *const fields[][2] = { // TRANSLATORS: item info label - { "attack", N_("Attack %+d") }, + { "attack", N_("Attack %s") }, // TRANSLATORS: item info label - { "defense", N_("Defense %+d") }, + { "defense", N_("Defense %s") }, // TRANSLATORS: item info label - { "hp", N_("HP %+d") }, + { "hp", N_("HP %s") }, // TRANSLATORS: item info label - { "mp", N_("MP %+d") }, + { "mp", N_("MP %s") }, // TRANSLATORS: item info label - { "level", N_("Level %+d") } + { "level", N_("Level %s") } }; static std::vector extraStats; @@ -344,21 +344,26 @@ void ItemDB::loadXmlFile(const std::string &fileName, int &tagNum) std::string effect; for (size_t i = 0; i < sizeof(fields) / sizeof(fields[0]); ++ i) { - const int value = XML::getProperty(node, fields[i][0], 0); - if (!value) + std::string value = XML::getProperty(node, fields[i][0], ""); + if (value.empty()) continue; if (!effect.empty()) effect.append(" / "); - effect.append(strprintf(gettext(fields[i][1]), value)); + if (isDigit(value)) + value = "+" + value; + effect.append(strprintf(gettext(fields[i][1]), value.c_str())); } FOR_EACH (std::vector::const_iterator, it, extraStats) { - const int value = XML::getProperty(node, it->tag.c_str(), 0); - if (!value) + std::string value = XML::getProperty( + node, it->tag.c_str(), ""); + if (value.empty()) continue; if (!effect.empty()) effect.append(" / "); - effect.append(strprintf(it->format.c_str(), value)); + if (isDigit(value)) + value = "+" + value; + effect.append(strprintf(it->format.c_str(), value.c_str())); } std::string temp = XML::langProperty(node, "effect", ""); if (!effect.empty() && !temp.empty()) diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp index da3f8dd06..a54d9d5ab 100644 --- a/src/utils/stringutils.cpp +++ b/src/utils/stringutils.cpp @@ -697,3 +697,17 @@ std::string toStringPrint(const unsigned int val) str[99] = 0; return str; } + +bool isDigit(const std::string &str) +{ + if (str.empty()) + return false; + const size_t sz = str.size(); + for (size_t f = 0; f < sz; f ++) + { + const char &chr = str[f]; + if (chr < '0' || chr > '9') + return false; + } + return true; +} diff --git a/src/utils/stringutils.h b/src/utils/stringutils.h index 737b5c8f3..7f40b3673 100644 --- a/src/utils/stringutils.h +++ b/src/utils/stringutils.h @@ -230,4 +230,6 @@ std::string encodeLinkText(std::string data); std::string decodeLinkText(std::string data); +bool isDigit(const std::string &str); + #endif // UTILS_STRINGUTILS_H diff --git a/src/utils/stringutils_unittest.cc b/src/utils/stringutils_unittest.cc index 75f4f2f35..8f28f5c10 100644 --- a/src/utils/stringutils_unittest.cc +++ b/src/utils/stringutils_unittest.cc @@ -551,3 +551,16 @@ TEST(stringuntils, decodeLinkText) str = decodeLinkText(str); EXPECT_EQ(str, "test|line"); } + +TEST(stringuntils, isDigit) +{ + std::string str; + + EXPECT_FALSE(isDigit("")); + EXPECT_TRUE(isDigit("1")); + EXPECT_TRUE(isDigit("123")); + EXPECT_FALSE(isDigit("+123")); + EXPECT_FALSE(isDigit("-123")); + EXPECT_FALSE(isDigit("1.23")); + EXPECT_FALSE(isDigit("12-34")); +} -- cgit v1.2.3-70-g09d2