summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--src/gui/skill.cpp26
2 files changed, 25 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 91e7de25..21ee74f2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2008-11-01 Fate <fate.tmw@googlemail.com>
+ * src/gui/skill.cpp (class SkillGuiTableModel): Report unmapped
+ skill names as `Mystery Skill' (rather than random garbage)
+
* src/being.cpp (initializeHair): Read hair colours from external
`hair.xml' file (clientdata)
(initializeHair): Auto-detect number of hair colours
diff --git a/src/gui/skill.cpp b/src/gui/skill.cpp
index c753ee1a..116e1860 100644
--- a/src/gui/skill.cpp
+++ b/src/gui/skill.cpp
@@ -81,14 +81,22 @@ public:
virtual void
update(void)
{
+ static const SkillInfo fakeSkillInfo = { "Mystery Skill", false };
+
mEntriesNr = mDialog->getSkills().size();
resize();
for (int i = 0; i < mEntriesNr; i++) {
SKILL *skill = mDialog->getSkills()[i];
- SkillInfo *info = &skill_db[skill->id];
+ SkillInfo const *info;
char tmp[128];
+ if (skill->id >= 0
+ && (unsigned int) skill->id < skill_db.size())
+ info = &skill_db[skill->id];
+ else
+ info = &fakeSkillInfo;
+
sprintf(tmp, "%c%s", info->modifiable? ' ' : '*', info->name.c_str());
gcn::Label *name_label = new gcn::Label(std::string(tmp));
@@ -189,9 +197,19 @@ void SkillDialog::update()
int selectedSkill = mTable.getSelectedRow();
- mIncButton->setEnabled(selectedSkill > -1
- && skill_db[mSkillList[selectedSkill]->id].modifiable
- && player_node->mSkillPoint > 0);
+ if (selectedSkill >= 0) {
+ int skillId = mSkillList[selectedSkill]->id;
+ bool modifiable;
+
+ if (skillId >= 0 && (unsigned int) skillId < skill_db.size())
+ modifiable = skill_db[skillId].modifiable;
+ else
+ modifiable = false;
+
+ mIncButton->setEnabled(modifiable
+ && player_node->mSkillPoint > 0);
+ } else
+ mIncButton->setEnabled(false);
mTableModel->update();
}