summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/windows/skilldialog.cpp124
-rw-r--r--src/gui/windows/skilldialog.h7
2 files changed, 75 insertions, 56 deletions
diff --git a/src/gui/windows/skilldialog.cpp b/src/gui/windows/skilldialog.cpp
index 995ebe822..0c6b2d42c 100644
--- a/src/gui/windows/skilldialog.cpp
+++ b/src/gui/windows/skilldialog.cpp
@@ -310,7 +310,7 @@ void SkillDialog::loadXmlFile(const std::string &fileName,
// TRANSLATORS: skills dialog default skill tab
strprintf(_("Skill Set %d"), setCount));
- SkillModel *const model = new SkillModel();
+ SkillModel *const model = new SkillModel;
if (!mDefaultModel)
mDefaultModel = model;
@@ -318,58 +318,15 @@ void SkillDialog::loadXmlFile(const std::string &fileName,
{
if (xmlNameEqual(node, "skill"))
{
- int id = XML::getIntProperty(node, "id", -1, -1, 1000000);
- if (id == -1)
+ SkillInfo *const skill = loadSkill(node, model);
+ if (skill == nullptr)
+ continue;
+ for_each_xml_child_node(levelNode, node)
{
- id = XML::getIntProperty(node, "var", -1, -1, 100000);
- if (id == -1)
+ if (!xmlNameEqual(levelNode, "level"))
continue;
- id += SKILL_VAR_MIN_ID;
+ loadSkillData(node, skill);
}
-
- std::string name = XML::langProperty(node, "name",
- // TRANSLATORS: skills dialog. skill id
- strprintf(_("Skill %d"), id));
-
- SkillInfo *skill = getSkill(id);
- if (!skill)
- {
- skill = new SkillInfo;
- skill->id = CAST_U32(id);
- skill->modifiable = Modifiable_false;
- skill->model = model;
- skill->update();
- skill->useButton = XML::getProperty(
- // TRANSLATORS: skills dialog button
- node, "useButton", _("Use"));
- skill->owner = parseOwner(XML::getProperty(
- node, "owner", "player"));
- skill->errorText = XML::getProperty(
- node, "errorText", name);
- skill->alwaysVisible = fromBool(XML::getBoolProperty(
- node, "alwaysVisible", false), Visible);
- skill->castingSrcEffectId = XML::getProperty(
- node, "castingSrcEffectId", -1);
- skill->castingDstEffectId = XML::getProperty(
- node, "castingDstEffectId", -1);
- skill->castingAction = XML::getProperty(node,
- "castingAction", SpriteAction::CAST);
- skill->castingRideAction = XML::getProperty(node,
- "castingRideAction", SpriteAction::CASTRIDE);
- skill->castingSkyAction = XML::getProperty(node,
- "castingSkyAction", SpriteAction::CASTSKY);
- skill->castingWaterAction = XML::getProperty(node,
- "castingWaterAction", SpriteAction::CASTWATER);
- skill->useTextParameter = XML::getBoolProperty(
- node, "useTextParameter", false);
- skill->visible = skill->alwaysVisible;
- model->addSkill(skill);
- mSkills[id] = skill;
- }
-
- const int level = (skill->alwaysVisible == Visible_true)
- ? 0 : XML::getProperty(node, "level", 0);
- loadSkillData(node, name, skill, level);
}
}
@@ -391,15 +348,76 @@ void SkillDialog::loadXmlFile(const std::string &fileName,
}
}
+SkillInfo *SkillDialog::loadSkill(XmlNodePtr node,
+ SkillModel *const model)
+{
+ int id = XML::getIntProperty(node, "id", -1, -1, 1000000);
+ if (id == -1)
+ {
+ id = XML::getIntProperty(node, "var", -1, -1, 100000);
+ if (id == -1)
+ return nullptr;
+ id += SKILL_VAR_MIN_ID;
+ }
+
+ std::string name = XML::langProperty(node, "name",
+ // TRANSLATORS: skills dialog. skill id
+ strprintf(_("Skill %d"), id));
+
+ SkillInfo *skill = getSkill(id);
+ if (!skill)
+ {
+ skill = new SkillInfo;
+ skill->id = CAST_U32(id);
+ skill->modifiable = Modifiable_false;
+ skill->model = model;
+ skill->update();
+ skill->useButton = XML::getProperty(
+ // TRANSLATORS: skills dialog button
+ node, "useButton", _("Use"));
+ skill->owner = parseOwner(XML::getProperty(
+ node, "owner", "player"));
+ skill->errorText = XML::getProperty(
+ node, "errorText", name);
+ skill->alwaysVisible = fromBool(XML::getBoolProperty(
+ node, "alwaysVisible", false), Visible);
+ skill->castingSrcEffectId = XML::getProperty(
+ node, "castingSrcEffectId", -1);
+ skill->castingDstEffectId = XML::getProperty(
+ node, "castingDstEffectId", -1);
+ skill->castingAction = XML::getProperty(node,
+ "castingAction", SpriteAction::CAST);
+ skill->castingRideAction = XML::getProperty(node,
+ "castingRideAction", SpriteAction::CASTRIDE);
+ skill->castingSkyAction = XML::getProperty(node,
+ "castingSkyAction", SpriteAction::CASTSKY);
+ skill->castingWaterAction = XML::getProperty(node,
+ "castingWaterAction", SpriteAction::CASTWATER);
+ skill->useTextParameter = XML::getBoolProperty(
+ node, "useTextParameter", false);
+ skill->visible = skill->alwaysVisible;
+ model->addSkill(skill);
+ mSkills[id] = skill;
+ }
+
+ loadSkillData(node, skill);
+ return skill;
+}
+
void SkillDialog::loadSkillData(XmlNodePtr node,
- const std::string &name,
- SkillInfo *const skill,
- const int level)
+ SkillInfo *const skill)
{
+ if (!skill)
+ return;
+ const int level = (skill->alwaysVisible == Visible_true) ?
+ 0 : XML::getProperty(node, "level", 0);
SkillData *data = skill->getData(level);
if (!data)
data = new SkillData;
+ const std::string name = XML::langProperty(node, "name",
+ // TRANSLATORS: skills dialog. skill id
+ strprintf(_("Skill %u"), skill->id));
data->name = name;
const std::string icon = XML::getProperty(node, "icon", "");
data->setIcon(icon);
diff --git a/src/gui/windows/skilldialog.h b/src/gui/windows/skilldialog.h
index 2b5e4f070..b4ef43e38 100644
--- a/src/gui/windows/skilldialog.h
+++ b/src/gui/windows/skilldialog.h
@@ -167,10 +167,11 @@ class SkillDialog final : public Window,
private:
void addSkillDuration(SkillInfo *const skill);
+ SkillInfo *loadSkill(XmlNodePtr node,
+ SkillModel *const model);
+
void loadSkillData(XmlNodePtr node,
- const std::string &name,
- SkillInfo *const skill,
- const int level);
+ SkillInfo *const skill);
typedef std::map<int, SkillInfo*> SkillMap;
SkillMap mSkills;