diff options
Diffstat (limited to 'src/gui/charselectdialog.cpp')
-rw-r--r-- | src/gui/charselectdialog.cpp | 379 |
1 files changed, 379 insertions, 0 deletions
diff --git a/src/gui/charselectdialog.cpp b/src/gui/charselectdialog.cpp new file mode 100644 index 00000000..afc349ea --- /dev/null +++ b/src/gui/charselectdialog.cpp @@ -0,0 +1,379 @@ +/* + * The Mana World + * Copyright (C) 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "gui/charselectdialog.h" + +#include "gui/charcreatedialog.h" +#include "gui/confirmdialog.h" +#include "gui/okdialog.h" +#include "gui/playerbox.h" + +#ifdef TMWSERV_SUPPORT +#include "gui/widgets/radiobutton.h" +#include "gui/widgets/slider.h" + +#include "gui/unregisterdialog.h" +#include "gui/changepassworddialog.h" +#include "gui/changeemaildialog.h" + +#include "logindata.h" + +#include "net/tmwserv/accountserver/account.h" +#endif + +#include "gui/widgets/button.h" +#include "gui/widgets/label.h" +#include "gui/widgets/layout.h" +#include "gui/widgets/textfield.h" + +#include "game.h" +#include "localplayer.h" +#include "main.h" +#include "units.h" + +#include "net/charhandler.h" +#include "net/messageout.h" +#include "net/net.h" + +#include "resources/colordb.h" + +#include "utils/gettext.h" +#include "utils/strprintf.h" +#include "utils/stringutils.h" + +#include <guichan/font.hpp> + +#include <string> + +/** + * Listener for confirming character deletion. + */ +class CharDeleteConfirm : public ConfirmDialog +{ + public: + CharDeleteConfirm(CharSelectDialog *master); + void action(const gcn::ActionEvent &event); + private: + CharSelectDialog *master; +}; + +CharDeleteConfirm::CharDeleteConfirm(CharSelectDialog *m): + ConfirmDialog(_("Confirm Character Delete"), + _("Are you sure you want to delete this character?"), m), + master(m) +{ +} + +void CharDeleteConfirm::action(const gcn::ActionEvent &event) +{ + //ConfirmDialog::action(event); + if (event.getId() == "yes") + { + master->attemptCharDelete(); + } + ConfirmDialog::action(event); +} + +#ifdef TMWSERV_SUPPORT +CharSelectDialog::CharSelectDialog(LockedArray<LocalPlayer*> *charInfo, + LoginData *loginData): + Window(_("Account and Character Management")), + mCharInfo(charInfo), + mCharSelected(false), + mLoginData(loginData) +#else +CharSelectDialog::CharSelectDialog(LockedArray<LocalPlayer*> *charInfo, + Gender gender): + Window(_("Select Character")), + mCharInfo(charInfo), + mCharSelected(false), + mGender(gender) +#endif +{ + mSelectButton = new Button(_("Ok"), "ok", this); + mCancelButton = new Button(_("Cancel"), "cancel", this); + mPreviousButton = new Button(_("Previous"), "previous", this); + mNextButton = new Button(_("Next"), "next", this); + mNameLabel = new Label(strprintf(_("Name: %s"), "")); + mLevelLabel = new Label(strprintf(_("Level: %d"), 0)); +#ifdef TMWSERV_SUPPORT + mNewCharButton = new Button(_("New"), "new", this); + mDelCharButton = new Button(_("Delete"), "delete", this); + mUnRegisterButton = new Button(_("Unregister"), "unregister", this); + mChangePasswordButton = new Button(_("Change Password"), "change_password", this); + mChangeEmailButton = new Button(_("Change Email Address"), "change_email", this); + + mAccountNameLabel = new Label(strprintf(_("Account: %s"), mLoginData->username.c_str())); + mNameLabel = new Label(strprintf(_("Name: %s"), "")); + mLevelLabel = new Label(strprintf(_("Level: %d"), 0)); + mMoneyLabel = new Label(strprintf(_("Money: %d"), 0)); + + // Control that shows the Player + mPlayerBox = new PlayerBox; + mPlayerBox->setWidth(74); + + ContainerPlacer place; + place = getPlacer(0, 0); + place(0, 0, mAccountNameLabel); + place(0, 1, mUnRegisterButton); + place(0, 2, mChangePasswordButton); + place(1, 2, mChangeEmailButton); + place = getPlacer(0, 1); + place(0, 0, mPlayerBox, 1, 5).setPadding(3); + place(1, 0, mNameLabel, 3); + place(1, 1, mLevelLabel, 3); + place(1, 2, mMoneyLabel, 3); + place(1, 3, mPreviousButton); + place(2, 3, mNextButton); + place(1, 4, mNewCharButton); + place(2, 4, mDelCharButton); + place.getCell().matchColWidth(1, 2); + place = getPlacer(0, 2); + place(0, 0, mSelectButton); + place(1, 0, mCancelButton); + reflowLayout(265, 0); +#else + mCharInfo->select(0); + LocalPlayer *pi = mCharInfo->getEntry(); + if (pi) + mMoney = Units::formatCurrency(pi->getMoney()); + // Control that shows the Player + mPlayerBox = new PlayerBox; + mPlayerBox->setWidth(74); + + mJobLevelLabel = new Label(strprintf(_("Job Level: %d"), 0)); + mMoneyLabel = new Label(strprintf(_("Money: %s"), mMoney.c_str())); + + const std::string tempString = getFont()->getWidth(_("New")) < + getFont()->getWidth(_("Delete")) ? + _("Delete") : _("New"); + + mNewDelCharButton = new Button(tempString, "newdel", this); + + ContainerPlacer place; + place = getPlacer(0, 0); + + place(0, 0, mPlayerBox, 1, 6).setPadding(3); + place(1, 0, mNewDelCharButton); + place(1, 1, mNameLabel, 5); + place(1, 2, mLevelLabel, 5); + place(1, 3, mJobLevelLabel, 5); + place(1, 4, mMoneyLabel, 5); + place.getCell().matchColWidth(1, 4); + place = getPlacer(0, 2); + place(0, 0, mPreviousButton); + place(1, 0, mNextButton); + place(4, 0, mCancelButton); + place(5, 0, mSelectButton); + + reflowLayout(250, 0); +#endif + + center(); + setVisible(true); + mSelectButton->requestFocus(); + updatePlayerInfo(); +} + +void CharSelectDialog::action(const gcn::ActionEvent &event) +{ +#ifdef TMWSERV_SUPPORT + // The pointers are set to NULL if there is no character stored + if (event.getId() == "ok" && (mCharInfo->getEntry())) +#else + if (event.getId() == "ok" && n_character > 0) +#endif + { + // Start game +#ifdef TMWSERV_SUPPORT + mNewCharButton->setEnabled(false); + mDelCharButton->setEnabled(false); + mUnRegisterButton->setEnabled(false); +#else + mNewDelCharButton->setEnabled(false); +#endif + mSelectButton->setEnabled(false); + mPreviousButton->setEnabled(false); + mNextButton->setEnabled(false); + mCharSelected = true; + attemptCharSelect(); + } + else if (event.getId() == "cancel") + { +#ifdef TMWSERV_SUPPORT + mCharInfo->clear(); + state = STATE_SWITCH_ACCOUNTSERVER_ATTEMPT; +#else + state = STATE_EXIT; +#endif + } +#ifdef TMWSERV_SUPPORT + else if (event.getId() == "new") + { + // TODO: Search the first free slot, and start CharCreateDialog + // maybe add that search to the constructor. + if (!(mCharInfo->getEntry())) + { + // Start new character dialog + CharCreateDialog *charCreateDialog = + new CharCreateDialog(this, mCharInfo->getPos()); + Net::getCharHandler()->setCharCreateDialog(charCreateDialog); + } + } + else if (event.getId() == "delete") + { + // Delete character + if (mCharInfo->getEntry()) + { + new CharDeleteConfirm(this); + } + } +#else + else if (event.getId() == "newdel") + { + // Check for a character + if (mCharInfo->getEntry()) + { + new CharDeleteConfirm(this); + } + else if (n_character <= maxSlot) + { + // Start new character dialog + CharCreateDialog *charCreateDialog = + new CharCreateDialog(this, mCharInfo->getPos()); + Net::getCharHandler()->setCharCreateDialog(charCreateDialog); + } + } +#endif + else if (event.getId() == "previous") + { + mCharInfo->prev(); + LocalPlayer *pi = mCharInfo->getEntry(); + if (pi) + mMoney = Units::formatCurrency(pi->getMoney()); + } + else if (event.getId() == "next") + { + mCharInfo->next(); + LocalPlayer *pi = mCharInfo->getEntry(); + if (pi) + mMoney = Units::formatCurrency(pi->getMoney()); + } +#ifdef TMWSERV_SUPPORT + else if (event.getId() == "unregister") + { + new UnRegisterDialog(this, mLoginData); + } + else if (event.getId() == "change_password") + { + new ChangePasswordDialog(this, mLoginData); + } + else if (event.getId() == "change_email") + { + new ChangeEmailDialog(this, mLoginData); + } +#endif +} + +void CharSelectDialog::updatePlayerInfo() +{ + LocalPlayer *pi = mCharInfo->getEntry(); + + if (pi) + { + mNameLabel->setCaption(strprintf(_("Name: %s"), + pi->getName().c_str())); + mLevelLabel->setCaption(strprintf(_("Level: %d"), pi->getLevel())); +#ifndef TMWSERV_SUPPORT + mJobLevelLabel->setCaption(strprintf(_("Job Level: %d"), + pi->mJobLevel)); +#endif + mMoneyLabel->setCaption(strprintf(_("Money: %s"), mMoney.c_str())); + if (!mCharSelected) + { +#ifdef TMWSERV_SUPPORT + mNewCharButton->setEnabled(false); + mDelCharButton->setEnabled(true); +#else + mNewDelCharButton->setCaption(_("Delete")); +#endif + mSelectButton->setEnabled(true); + } + } + else + { + mNameLabel->setCaption(strprintf(_("Name: %s"), "")); + mLevelLabel->setCaption(strprintf(_("Level: %d"), 0)); +#ifndef TMWSERV_SUPPORT + mJobLevelLabel->setCaption(strprintf(_("Job Level: %d"), 0)); +#endif + mMoneyLabel->setCaption(strprintf(_("Money: %s"), "")); +#ifdef TMWSERV_SUPPORT + mNewCharButton->setEnabled(true); + mDelCharButton->setEnabled(false); +#else + mNewDelCharButton->setCaption(_("New")); +#endif + mSelectButton->setEnabled(false); + } + + mPlayerBox->setPlayer(pi); +} + +void CharSelectDialog::attemptCharDelete() +{ + Net::getCharHandler()->deleteCharacter(mCharInfo->getPos(), mCharInfo->getEntry()); + mCharInfo->lock(); +} + +void CharSelectDialog::attemptCharSelect() +{ + Net::getCharHandler()->chooseCharacter(mCharInfo->getPos(), mCharInfo->getEntry()); + mCharInfo->lock(); +} + +void CharSelectDialog::logic() +{ + updatePlayerInfo(); +} + +bool CharSelectDialog::selectByName(const std::string &name) +{ + if (mCharInfo->isLocked()) + return false; + + unsigned int oldPos = mCharInfo->getPos(); + + mCharInfo->select(0); + do + { + LocalPlayer *player = mCharInfo->getEntry(); + + if (player && player->getName() == name) + return true; + + mCharInfo->next(); + } while (mCharInfo->getPos()); + + mCharInfo->select(oldPos); + + return false; +} |