00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/charcreatedialog.h"
00023
00024 #include "gui/char_select.h"
00025 #include "gui/confirm_dialog.h"
00026 #include "gui/ok_dialog.h"
00027 #include "gui/playerbox.h"
00028
00029 #include "gui/widgets/button.h"
00030 #include "gui/widgets/label.h"
00031 #include "gui/widgets/radiobutton.h"
00032 #include "gui/widgets/slider.h"
00033 #include "gui/widgets/textfield.h"
00034
00035 #include "gui/widgets/layout.h"
00036
00037 #include "game.h"
00038 #include "localplayer.h"
00039 #include "main.h"
00040 #include "units.h"
00041
00042 #include "net/charhandler.h"
00043 #include "net/messageout.h"
00044 #include "net/net.h"
00045
00046 #include "resources/colordb.h"
00047
00048 #include "utils/gettext.h"
00049 #include "utils/strprintf.h"
00050 #include "utils/stringutils.h"
00051
00052 #include <guichan/font.hpp>
00053
00054 CharCreateDialog::CharCreateDialog(Window *parent, int slot):
00055 Window(_("Create Character"), true, parent),
00056 mSlot(slot)
00057 {
00058 mPlayer = new Player(0, 0, NULL);
00059 mPlayer->setGender(GENDER_MALE);
00060
00061 int numberOfHairColors = ColorDB::size();
00062
00063 mPlayer->setHairStyle(rand() % mPlayer->getNumOfHairstyles(),
00064 rand() % numberOfHairColors);
00065
00066 mNameField = new TextField("");
00067 mNameLabel = new Label(_("Name:"));
00068 mNextHairColorButton = new Button(">", "nextcolor", this);
00069 mPrevHairColorButton = new Button("<", "prevcolor", this);
00070 mHairColorLabel = new Label(_("Hair Color:"));
00071 mNextHairStyleButton = new Button(">", "nextstyle", this);
00072 mPrevHairStyleButton = new Button("<", "prevstyle", this);
00073 mHairStyleLabel = new Label(_("Hair Style:"));
00074 mCreateButton = new Button(_("Create"), "create", this);
00075 mCancelButton = new Button(_("Cancel"), "cancel", this);
00076 mMale = new RadioButton(_("Male"), "gender");
00077 mFemale = new RadioButton(_("Female"), "gender");
00078
00079
00080 mMale->setSelected(true);
00081
00082 mMale->setActionEventId("gender");
00083 mFemale->setActionEventId("gender");
00084
00085 mMale->addActionListener(this);
00086 mFemale->addActionListener(this);
00087
00088 mPlayerBox = new PlayerBox(mPlayer);
00089
00090 mPlayerBox->setWidth(74);
00091
00092 mNameField->setActionEventId("create");
00093 mNameField->addActionListener(this);
00094
00095 mAttributesLeft = new Label(strprintf(_("Please distribute %d points"), 99));
00096
00097 int w = 200;
00098 int h = 330;
00099 setContentSize(w, h);
00100 mPlayerBox->setDimension(gcn::Rectangle(80, 30, 110, 85));
00101 mNameLabel->setPosition(5, 5);
00102 mNameField->setDimension(
00103 gcn::Rectangle(45, 5, w - 45 - 7, mNameField->getHeight()));
00104 mPrevHairColorButton->setPosition(90, 35);
00105 mNextHairColorButton->setPosition(165, 35);
00106 mHairColorLabel->setPosition(5, 40);
00107 mPrevHairStyleButton->setPosition(90, 64);
00108 mNextHairStyleButton->setPosition(165, 64);
00109 mHairStyleLabel->setPosition(5, 70);
00110 mAttributesLeft->setPosition(15, 280);
00111 updateSliders();
00112 mCancelButton->setPosition(
00113 w - 5 - mCancelButton->getWidth(),
00114 h - 5 - mCancelButton->getHeight());
00115 mCreateButton->setPosition(
00116 mCancelButton->getX() - 5 - mCreateButton->getWidth(),
00117 h - 5 - mCancelButton->getHeight());
00118
00119 mMale->setPosition(30, 120);
00120 mFemale->setPosition(100, 120);
00121
00122 add(mPlayerBox);
00123 add(mNameField);
00124 add(mNameLabel);
00125 add(mNextHairColorButton);
00126 add(mPrevHairColorButton);
00127 add(mHairColorLabel);
00128 add(mNextHairStyleButton);
00129 add(mPrevHairStyleButton);
00130 add(mHairStyleLabel);
00131 add(mAttributesLeft);
00132 add(mCreateButton);
00133 add(mCancelButton);
00134
00135 add(mMale);
00136 add(mFemale);
00137
00138 center();
00139 setVisible(true);
00140 mNameField->requestFocus();
00141 }
00142
00143 CharCreateDialog::~CharCreateDialog()
00144 {
00145 delete mPlayer;
00146
00147
00148 Net::getCharHandler()->setCharCreateDialog(0);
00149 }
00150
00151 void CharCreateDialog::action(const gcn::ActionEvent &event)
00152 {
00153 int numberOfColors = ColorDB::size();
00154 if (event.getId() == "create")
00155 {
00156 if (getName().length() >= 4)
00157 {
00158
00159 mCreateButton->setEnabled(false);
00160
00161 std::vector<int> atts;
00162 for (unsigned i = 0; i < mAttributeSlider.size(); i++)
00163 {
00164 atts.push_back((int) mAttributeSlider[i]->getValue());
00165 }
00166
00167 Net::getCharHandler()->newCharacter(getName(), mSlot,
00168 mFemale->isSelected(), mPlayer->getHairStyle(),
00169 mPlayer->getHairColor(), atts);
00170 }
00171 else
00172 {
00173 new OkDialog(_("Error"),
00174 _("Your name needs to be at least 4 characters."),
00175 this);
00176 }
00177 }
00178 else if (event.getId() == "cancel")
00179 scheduleDelete();
00180 else if (event.getId() == "nextcolor")
00181 mPlayer->setHairStyle(mPlayer->getHairStyle(),
00182 (mPlayer->getHairColor() + 1) % numberOfColors);
00183 else if (event.getId() == "prevcolor")
00184 mPlayer->setHairStyle(mPlayer->getHairStyle(),
00185 (mPlayer->getHairColor() + numberOfColors - 1) %
00186 numberOfColors);
00187 else if (event.getId() == "nextstyle")
00188 mPlayer->setHairStyle(mPlayer->getHairStyle() + 1,
00189 mPlayer->getHairColor());
00190 else if (event.getId() == "prevstyle")
00191 mPlayer->setHairStyle(mPlayer->getHairStyle() +
00192 mPlayer->getNumOfHairstyles() - 1,
00193 mPlayer->getHairColor());
00194 else if (event.getId() == "statslider") {
00195 updateSliders();
00196 }
00197 else if (event.getId() == "gender"){
00198 if (mMale->isSelected()) {
00199 mPlayer->setGender(GENDER_MALE);
00200 } else {
00201 mPlayer->setGender(GENDER_FEMALE);
00202 }
00203 }
00204 }
00205
00206 std::string CharCreateDialog::getName() const
00207 {
00208 std::string name = mNameField->getText();
00209 trim(name);
00210 return name;
00211 }
00212
00213 void CharCreateDialog::updateSliders()
00214 {
00215 for (unsigned i = 0; i < mAttributeSlider.size(); i++)
00216 {
00217
00218 mAttributeValue[i]->setCaption(
00219 toString((int) (mAttributeSlider[i]->getValue())));
00220 mAttributeValue[i]->adjustSize();
00221 }
00222
00223
00224 int pointsLeft = mMaxPoints - getDistributedPoints();
00225 if (pointsLeft == 0)
00226 {
00227 mAttributesLeft->setCaption(_("Character stats OK"));
00228 mCreateButton->setEnabled(true);
00229 }
00230 else
00231 {
00232 mCreateButton->setEnabled(false);
00233 if (pointsLeft > 0)
00234 {
00235 mAttributesLeft->setCaption(strprintf(_("Please distribute %d points"), pointsLeft));
00236 }
00237 else
00238 {
00239 mAttributesLeft->setCaption(strprintf(_("Please remove %d points"), -pointsLeft));
00240 }
00241 }
00242
00243 mAttributesLeft->adjustSize();
00244 }
00245
00246 void CharCreateDialog::unlock()
00247 {
00248 mCreateButton->setEnabled(true);
00249 }
00250
00251 int CharCreateDialog::getDistributedPoints() const
00252 {
00253 int points = 0;
00254
00255 for (unsigned i = 0; i < mAttributeSlider.size(); i++)
00256 {
00257 points += (int) mAttributeSlider[i]->getValue();
00258 }
00259 return points;
00260 }
00261
00262 void CharCreateDialog::setAttributes(std::vector<std::string> labels,
00263 int available, int min, int max)
00264 {
00265 mMaxPoints = available;
00266
00267 for (unsigned i = 0; i < mAttributeLabel.size(); i++)
00268 {
00269 remove(mAttributeLabel[i]);
00270 delete mAttributeLabel[i];
00271 remove(mAttributeSlider[i]);
00272 delete mAttributeSlider[i];
00273 remove(mAttributeValue[i]);
00274 delete mAttributeValue[i];
00275 }
00276
00277 mAttributeLabel.resize(labels.size());
00278 mAttributeSlider.resize(labels.size());
00279 mAttributeValue.resize(labels.size());
00280
00281 int w = 200;
00282 int h = 330;
00283
00284 for (unsigned i = 0; i < labels.size(); i++)
00285 {
00286 mAttributeLabel[i] = new Label(labels[i]);
00287 mAttributeLabel[i]->setWidth(70);
00288 mAttributeLabel[i]->setPosition(5, 140 + i*20);
00289 add(mAttributeLabel[i]);
00290
00291 mAttributeSlider[i] = new Slider(min, max);
00292 mAttributeSlider[i]->setDimension(gcn::Rectangle(75, 140 + i*20, 100, 10));
00293 mAttributeSlider[i]->setActionEventId("statslider");
00294 mAttributeSlider[i]->addActionListener(this);
00295 add(mAttributeSlider[i]);
00296
00297 mAttributeValue[i] = new Label(toString(min));
00298 mAttributeValue[i]->setPosition(180, 140 + i*20);
00299 add(mAttributeValue[i]);
00300 }
00301
00302 mAttributesLeft->setPosition(15, 280);
00303 updateSliders();
00304
00305 mCancelButton->setPosition(
00306 w - 5 - mCancelButton->getWidth(),
00307 h - 5 - mCancelButton->getHeight());
00308 mCreateButton->setPosition(
00309 mCancelButton->getX() - 5 - mCreateButton->getWidth(),
00310 h - 5 - mCancelButton->getHeight());
00311 }
00312
00313 void CharCreateDialog::setFixedGender(bool fixed, Gender gender)
00314 {
00315 if (gender == GENDER_FEMALE)
00316 {
00317 mFemale->setSelected(true);
00318 mMale->setSelected(false);
00319 }
00320 else
00321 {
00322 mMale->setSelected(true);
00323 mFemale->setSelected(false);
00324 }
00325
00326 mPlayer->setGender(gender);
00327
00328 if (fixed)
00329 {
00330 mMale->setEnabled(false);
00331 mFemale->setEnabled(false);
00332 }
00333 }