00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/skilldialog.h"
00023
00024 #include "gui/widgets/button.h"
00025 #include "gui/widgets/container.h"
00026 #include "gui/widgets/icon.h"
00027 #include "gui/widgets/label.h"
00028 #include "gui/widgets/listbox.h"
00029 #include "gui/widgets/progressbar.h"
00030 #include "gui/widgets/scrollarea.h"
00031 #include "gui/widgets/tabbedarea.h"
00032 #include "gui/widgets/windowcontainer.h"
00033
00034 #include "localplayer.h"
00035
00036 #include "utils/dtor.h"
00037 #include "utils/gettext.h"
00038 #include "utils/stringutils.h"
00039
00040 #include <string>
00041 #include <vector>
00042
00043 class SkillTab : public Container, public gcn::ActionListener
00044 {
00045 public:
00049 const std::string type;
00050
00054 SkillTab(const std::string &type);
00055
00059 void update();
00060
00064 void action(const gcn::ActionEvent &event) {}
00065
00066 private:
00071 void updateSkill(int index);
00072
00077 int getSkillNum();
00078
00083 int getSkillBegin();
00084
00088 Icon *getIcon(int index);
00089
00090 std::vector<Icon *> mSkillIcons;
00091 std::vector<gcn::Label *> mSkillNameLabels;
00092 std::vector<gcn::Label *> mSkillLevelLabels;
00093 std::vector<gcn::Label *> mSkillExpLabels;
00094 std::vector<ProgressBar *> mSkillProgress;
00095 };
00096
00097
00098 SkillDialog::SkillDialog():
00099 Window(_("Skills"))
00100 {
00101 setWindowName("Skills");
00102 setCloseButton(true);
00103 setSaveVisible(true);
00104 setDefaultSize(windowContainer->getWidth() - 280, 30, 275, 425);
00105
00106 TabbedArea *panel = new TabbedArea;
00107 panel->setDimension(gcn::Rectangle(5, 5, 270, 420));
00108
00109 SkillTab *tab;
00110
00111
00112 tab = new SkillTab("Weapon");
00113 panel->addTab(_("Weapons"), tab);
00114 mTabs.push_back(tab);
00115
00116 tab = new SkillTab("Magic");
00117 panel->addTab(_("Magic"), tab);
00118 mTabs.push_back(tab);
00119
00120 tab = new SkillTab("Craft");
00121 panel->addTab(_("Crafts"), tab);
00122 mTabs.push_back(tab);
00123
00124 add(panel);
00125
00126 update();
00127
00128 setLocationRelativeTo(getParent());
00129 loadWindowState();
00130 }
00131
00132 SkillDialog::~SkillDialog()
00133 {
00134 delete_all(mTabs);
00135 }
00136
00137 void SkillDialog::action(const gcn::ActionEvent &event)
00138 {
00139 if (event.getId() == "skill")
00140 {
00141 }
00142 else if (event.getId() == "close")
00143 {
00144 setVisible(false);
00145 }
00146 }
00147
00148 void SkillDialog::draw(gcn::Graphics *g)
00149 {
00150 update();
00151
00152 Window::draw(g);
00153 }
00154
00155 void SkillDialog::update()
00156 {
00157 for(std::list<SkillTab*>::const_iterator i = mTabs.begin();
00158 i != mTabs.end(); ++i)
00159 {
00160 (*i)->update();
00161 }
00162 }
00163
00164 SkillTab::SkillTab(const std::string &type): type(type)
00165 {
00166 setOpaque(false);
00167 setDimension(gcn::Rectangle(0, 0, 270, 420));
00168 int skillNum = getSkillNum();
00169
00170 mSkillIcons.resize(skillNum);
00171 mSkillNameLabels.resize(skillNum);
00172 mSkillLevelLabels.resize(skillNum);
00173 mSkillExpLabels.resize(skillNum);
00174 mSkillProgress.resize(skillNum);
00175
00176
00177 for (int a = 0; a < skillNum; a++)
00178 {
00179 mSkillIcons.at(a) = getIcon(a);
00180 mSkillIcons.at(a)->setPosition(1, a*32);
00181 add(mSkillIcons.at(a));
00182
00183 mSkillNameLabels.at(a) = new Label("");
00184 mSkillNameLabels.at(a)->setPosition(35, a*32 );
00185 add(mSkillNameLabels.at(a));
00186
00187 mSkillProgress.at(a) = new ProgressBar(0.0f, 200, 20, 150, 150, 150);
00188 mSkillProgress.at(a)->setPosition(35, a*32 + 13);
00189 add(mSkillProgress.at(a));
00190
00191 mSkillExpLabels.at(a) = new Label("");
00192 mSkillExpLabels.at(a)->setPosition(45, a*32 + 16);
00193 add(mSkillExpLabels.at(a));
00194
00195 mSkillLevelLabels.at(a) = new Label("");
00196 mSkillLevelLabels.at(a)->setPosition(165, a*32);
00197 add(mSkillLevelLabels.at(a));
00198 }
00199
00200 update();
00201 }
00202
00203 int SkillTab::getSkillNum()
00204 {
00205 int skillNum = 0;
00206
00207 if (type == "Weapon")
00208 {
00209 skillNum = CHAR_SKILL_WEAPON_NB;
00210 return skillNum;
00211 }
00212 else if (type == "Magic")
00213 {
00214 skillNum = CHAR_SKILL_MAGIC_NB;
00215 return skillNum;
00216 }
00217 else if (type == "Craft")
00218 {
00219 skillNum = CHAR_SKILL_CRAFT_NB;
00220 return skillNum;
00221 }
00222 else return skillNum;
00223 }
00224
00225 int SkillTab::getSkillBegin()
00226 {
00227 int skillBegin = 0;
00228
00229 if (type == "Weapon")
00230 {
00231 skillBegin = CHAR_SKILL_WEAPON_BEGIN - CHAR_SKILL_BEGIN;
00232 return skillBegin;
00233 }
00234 else if (type == "Magic")
00235 {
00236 skillBegin = CHAR_SKILL_MAGIC_BEGIN - CHAR_SKILL_BEGIN;
00237 return skillBegin;
00238 }
00239 else if (type == "Craft")
00240 {
00241 skillBegin = CHAR_SKILL_CRAFT_BEGIN - CHAR_SKILL_BEGIN;
00242 return skillBegin;
00243 }
00244 else return skillBegin;
00245 }
00246
00247 Icon* SkillTab::getIcon(int index)
00248 {
00249 int skillBegin = getSkillBegin();
00250 std::string icon = LocalPlayer::getSkillInfo(index + skillBegin).icon;
00251 return new Icon(icon);
00252 }
00253
00254 void SkillTab::updateSkill(int index)
00255 {
00256 int skillBegin = getSkillBegin();
00257
00258 int baseLevel = player_node->getAttributeBase(index +
00259 skillBegin +
00260 CHAR_SKILL_BEGIN);
00261
00262 int effLevel = player_node->getAttributeEffective(index +
00263 skillBegin +
00264 CHAR_SKILL_BEGIN);
00265 if(baseLevel <= 0)
00266 {
00267 mSkillProgress.at(index)->setVisible(false);
00268 mSkillExpLabels.at(index)->setVisible(false);
00269 mSkillLevelLabels.at(index)->setVisible(false);
00270 mSkillNameLabels.at(index)->setVisible(false);
00271 mSkillIcons.at(index)->setVisible(false);
00272 }
00273 else
00274 {
00275 mSkillProgress.at(index)->setVisible(true);
00276 mSkillExpLabels.at(index)->setVisible(true);
00277 mSkillLevelLabels.at(index)->setVisible(true);
00278 mSkillNameLabels.at(index)->setVisible(true);
00279 mSkillIcons.at(index)->setVisible(true);
00280 std::string skillLevel("Lvl: " + toString(baseLevel));
00281 if (effLevel < baseLevel)
00282 {
00283 skillLevel.append(" - " + toString(baseLevel - effLevel));
00284 }
00285 else if (effLevel > baseLevel)
00286 {
00287 skillLevel.append(" + " + toString(effLevel - baseLevel));
00288 }
00289 mSkillLevelLabels.at(index)->setCaption(skillLevel);
00290
00291 std::pair<int, int> exp = player_node->getExperience(index + skillBegin);
00292 std::string sExp (toString(exp.first) + " / " + toString(exp.second));
00293
00294
00295 mSkillNameLabels.at(index)->setCaption(LocalPlayer::getSkillInfo(index + skillBegin).name);
00296 mSkillNameLabels.at(index)->adjustSize();
00297 mSkillLevelLabels.at(index)->adjustSize();
00298 mSkillExpLabels.at(index)->setCaption(sExp);
00299 mSkillExpLabels.at(index)->adjustSize();
00300 mSkillExpLabels.at(index)->setAlignment(gcn::Graphics::RIGHT);
00301
00302
00303 int color = 150 - (int)(150 * ((float) exp.first / exp.second));
00304 mSkillProgress.at(index)->setColor(244, color, color);
00305 mSkillProgress.at(index)->setProgress((float) exp.first / exp.second);
00306 }
00307 }
00308
00309 void SkillTab::update()
00310 {
00311 int skillNum = getSkillNum();
00312
00313
00314 for (int a = 0; a < skillNum; a++)
00315 {
00316 updateSkill(a);
00317 }
00318 }