ManaPlus
charcreatedialog.cpp
Go to the documentation of this file.
1 /*
2  * The ManaPlus Client
3  * Copyright (C) 2004-2009 The Mana World Development Team
4  * Copyright (C) 2009-2010 The Mana Developers
5  * Copyright (C) 2011-2019 The ManaPlus Developers
6  * Copyright (C) 2019-2021 Andrei Karas
7  *
8  * This file is part of The ManaPlus Client.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
25 
26 #include "configuration.h"
27 
29 
30 #include "being/being.h"
31 
32 #include "gui/windows/okdialog.h"
33 
34 #include "gui/widgets/button.h"
37 #include "gui/widgets/label.h"
38 #include "gui/widgets/playerbox.h"
39 #include "gui/widgets/slider.h"
40 #include "gui/widgets/tabstrip.h"
41 #include "gui/widgets/textfield.h"
42 
43 #include "net/charserverhandler.h"
44 #include "net/serverfeatures.h"
45 
46 #include "resources/iteminfo.h"
47 
48 #include "resources/db/chardb.h"
49 #include "resources/db/colordb.h"
50 #include "resources/db/itemdb.h"
51 
52 #include "utils/delete2.h"
53 #include "utils/gettext.h"
54 
55 #include "debug.h"
56 
57 #undef ERROR
58 
59 static const BeingActionT actions[] =
60 {
66 };
67 
68 static const uint8_t directions[] =
69 {
74 };
75 
77  const int slot) :
78  // TRANSLATORS: char create dialog name
79  Window(_("New Character"), Modal_true, parent, "charcreate.xml"),
81  KeyListener(),
82  mCharSelectDialog(parent),
83  mNameField(new TextField(this, std::string(),
84  LoseFocusOnTab_true, nullptr, std::string(), false)),
85  // TRANSLATORS: char create dialog label
86  mNameLabel(new Label(this, _("Name:"))),
87  mNextHairColorButton(nullptr),
88  mPrevHairColorButton(nullptr),
89  mHairColorLabel(nullptr),
90  mHairColorNameLabel(nullptr),
91  mNextHairStyleButton(nullptr),
92  mPrevHairStyleButton(nullptr),
93  mHairStyleLabel(nullptr),
94  mHairStyleNameLabel(nullptr),
95  mNextRaceButton(nullptr),
96  mPrevRaceButton(nullptr),
97  mRaceLabel(nullptr),
98  mRaceNameLabel(nullptr),
99  mNextLookButton(nullptr),
100  mPrevLookButton(nullptr),
101  mLookLabel(nullptr),
102  mLookNameLabel(nullptr),
103  // TRANSLATORS: char create dialog button
104  mActionButton(new Button(this, _("^"), "action", BUTTON_SKIN, this)),
105  // TRANSLATORS: char create dialog button
106  mRotateButton(new Button(this, _(">"), "rotate", BUTTON_SKIN, this)),
107  mAttributeSlider(),
108  mAttributeLabel(),
109  mAttributeValue(),
110  mAttributesLeft(new Label(this,
111  // TRANSLATORS: char create dialog label
112  strprintf(_("Please distribute %d points"), 99))),
113  // TRANSLATORS: char create dialog button
114  mCreateButton(new Button(this, _("Create"), "create", BUTTON_SKIN, this)),
115  // TRANSLATORS: char create dialog button
116  mCancelButton(new Button(this, _("Cancel"), "cancel", BUTTON_SKIN, this)),
117  mPlayer(Being::createBeing(BeingId_zero,
118  ActorType::Player,
120  nullptr)),
121  mPlayerBox(new PlayerBox(this, mPlayer, "charcreate_playerbox.xml",
122  "charcreate_selectedplayerbox.xml")),
123  mGenderStrip(nullptr),
124  mMaxPoints(0),
125  mUsedPoints(0),
126  mRace(CharDB::getMinRace()),
127  mLook(0),
132  mHairStyle(0),
133  mHairColor(0),
134  mMaxY(0U),
135  mSlot(slot),
136  mDefaultGender(Gender::FEMALE),
137  mGender(Gender::UNSPECIFIED),
138  maxHairColor(CharDB::getMaxHairColor()),
139  minHairColor(CharDB::getMinHairColor()),
140  maxHairStyle(CharDB::getMaxHairStyle()),
141  minHairStyle(CharDB::getMinHairStyle()),
142  mAction(0),
143  mDirection(0)
144 {
145  setStickyButtonLock(true);
146  setSticky(true);
147  setWindowName("NewCharacter");
148 
149  const int w = 480;
150  const int h = 350;
151  setContentSize(w, h);
152 
154  const STD_VECTOR<BeingSlot> &items = CharDB::getDefaultItems();
155  int i = 1;
156  for (STD_VECTOR<BeingSlot>::const_iterator it = items.begin(),
157  it_fend = items.end();
158  it != it_fend;
159  ++ it, i ++)
160  {
161  const BeingSlot &beingSlot = *it;
163  beingSlot.spriteId,
164  beingSlot.cardsId);
165  }
166 
167  if (maxHairColor == 0U)
169  if (maxHairStyle == 0U)
171 
172  if (maxHairStyle != 0U)
173  {
174  mHairStyle = (CAST_U32(rand())
176  }
177  else
178  {
179  mHairStyle = 0;
180  }
181  if (maxHairColor != 0U)
182  {
183  mHairColor = (CAST_U32(rand())
185  }
186  else
187  {
188  mHairColor = 0;
189  }
190 
191  mNameField->setMaximum(24);
192 
194  {
195  mNextHairColorButton = new Button(this,
196  // TRANSLATORS: This is a narrow symbol used to denote 'next'.
197  // You may change this symbol if your language uses another.
198  // TRANSLATORS: char create dialog button
199  _(">"),
200  "nextcolor",
201  BUTTON_SKIN,
202  this);
203  mPrevHairColorButton = new Button(this,
204  // TRANSLATORS: This is a narrow symbol used to denote 'previous'.
205  // You may change this symbol if your language uses another.
206  // TRANSLATORS: char create dialog button
207  _("<"),
208  "prevcolor",
209  BUTTON_SKIN,
210  this);
211  // TRANSLATORS: char create dialog label
212  mHairColorLabel = new Label(this, _("Hair color:"));
213  mHairColorNameLabel = new Label(this, "");
214  }
215 
217  {
218  mNextHairStyleButton = new Button(this,
219  // TRANSLATORS: char create dialog button
220  _(">"),
221  "nextstyle",
222  BUTTON_SKIN,
223  this);
224  mPrevHairStyleButton = new Button(this,
225  // TRANSLATORS: char create dialog button
226  _("<"),
227  "prevstyle",
228  BUTTON_SKIN,
229  this);
230  // TRANSLATORS: char create dialog label
231  mHairStyleLabel = new Label(this, _("Hair style:"));
232  mHairStyleNameLabel = new Label(this, "");
233  }
234 
236  {
237  mNextRaceButton = new Button(this,
238  // TRANSLATORS: char create dialog button
239  _(">"),
240  "nextrace",
241  BUTTON_SKIN,
242  this);
243  mPrevRaceButton = new Button(this,
244  // TRANSLATORS: char create dialog button
245  _("<"),
246  "prevrace",
247  BUTTON_SKIN,
248  this);
249  // TRANSLATORS: char create dialog label
250  mRaceLabel = new Label(this, _("Race:"));
251  mRaceNameLabel = new Label(this, "");
252  }
254  {
255  mNextLookButton = new Button(this,
256  // TRANSLATORS: char create dialog button
257  _(">"),
258  "nextlook",
259  BUTTON_SKIN,
260  this);
261  mPrevLookButton = new Button(this,
262  // TRANSLATORS: char create dialog button
263  _("<"),
264  "prevlook",
265  BUTTON_SKIN,
266  this);
267  // TRANSLATORS: char create dialog label
268  mLookLabel = new Label(this, _("Look:"));
269  mLookNameLabel = new Label(this, "");
270  }
271 
273  {
274  const int forceGender = features.getIntValue("forceCharGender");
275  if (forceGender == -1)
276  {
277  const int size = config.getIntValue("fontSize");
278  mGenderStrip = new TabStrip(this,
279  "gender_" + getWindowName(),
280  size + 16,
281  0);
282  mGenderStrip->setPressFirst(false);
284  mGenderStrip->setActionEventId("gender_");
285  // TRANSLATORS: one char size female character gender
286  mGenderStrip->addButton(_("F"), "f", false);
287  if (features.getIntValue("forceAccountGender") == -1)
288  {
289  // TRANSLATORS: one char size male character gender
290  mGenderStrip->addButton(_("M"), "m", false);
291  // TRANSLATORS: one char size unknown character gender
292  mGenderStrip->addButton(_("U"), "u", true);
293  }
294  else
295  {
296  // TRANSLATORS: one char size male character gender
297  mGenderStrip->addButton(_("M"), "m", true);
298  }
299 
301  add(mGenderStrip);
302 
303  mGenderStrip->setPosition(385, 130);
304  mGenderStrip->setWidth(500);
305  mGenderStrip->setHeight(50);
306  }
307  else
308  {
309  mGender = Being::intToGender(CAST_U8(forceGender));
311  }
312  }
313 
314  mPlayerBox->setWidth(74);
315 
316  mNameField->setActionEventId("create");
318 
319  mPlayerBox->setDimension(Rect(360, 0, 110, 90));
320  mActionButton->setPosition(385, 100);
321  mRotateButton->setPosition(415, 100);
322 
325  300, mNameField->getHeight()));
326 
327  const uint32_t labelPadding = getOption("labelPadding", 2);
328  const uint32_t leftX = 120 + mPadding;
329  const uint32_t rightX = 300 + mPadding;
330  const uint32_t labelX = mPadding;
331  uint32_t nameX = leftX + labelPadding;
332  uint32_t y = 30;
333  if (mPrevHairColorButton != nullptr)
334  nameX += mPrevHairColorButton->getWidth();
335  else if (mPrevHairStyleButton != nullptr)
336  nameX += mPrevHairStyleButton->getWidth();
337  else if (mPrevLookButton != nullptr)
338  nameX += mPrevLookButton->getWidth();
339  else if (mPrevRaceButton != nullptr)
340  nameX += mPrevRaceButton->getWidth();
341 
343  {
346  y += 5;
347  mHairColorLabel->setPosition(labelX, y);
349  y += 24;
350  }
352  {
355  y += 5;
356  mHairStyleLabel->setPosition(labelX, y);
358  y += 24;
359  }
360 
362  {
363  if (mPrevLookButton != nullptr)
364  mPrevLookButton->setPosition(leftX, y);
365  if (mNextLookButton != nullptr)
366  mNextLookButton->setPosition(rightX, y);
367  y += 5;
368  if (mLookLabel != nullptr)
369  mLookLabel->setPosition(labelX, y);
370  if (mLookNameLabel != nullptr)
371  mLookNameLabel->setPosition(nameX, y); // 93
372  y += 24;
373  }
375  {
376  if (mPrevRaceButton != nullptr)
377  mPrevRaceButton->setPosition(leftX, y);
378  if (mNextRaceButton != nullptr)
379  mNextRaceButton->setPosition(rightX, y);
380  y += 5;
381  if (mRaceLabel != nullptr)
382  mRaceLabel->setPosition(labelX, y);
383  if (mRaceNameLabel != nullptr)
384  mRaceNameLabel->setPosition(nameX, y);
385  }
386  mMaxY = y + 29 + getTitlePadding();
387 
388  updateSliders();
389  setButtonsPosition(w, h);
390 
391  add(mPlayerBox);
392  add(mNameField);
393  add(mNameLabel);
394 
396  {
401  }
402 
404  {
409  }
412 
414  {
417  add(mLookLabel);
419  }
420 
422  {
425  add(mRaceLabel);
427  }
428 
432 
433  center();
436 
437  updateHair();
439  updateRace();
441  updateLook();
442  updatePlayer();
443 
444  addKeyListener(this);
445 }
446 
448 {
450 
451  if (charServerHandler != nullptr)
453 }
454 
456 {
457  const std::string &id = event.getId();
458  if (id == "create")
459  {
460  if (getName().length() >= 4)
461  {
462  // Attempt to create the character
463  mCreateButton->setEnabled(false);
464 
465  STD_VECTOR<int> atts;
466  const size_t sz = mAttributeSlider.size();
467  for (size_t i = 0; i < sz; i++)
468  {
469  atts.push_back(CAST_S32(
470  mAttributeSlider[i]->getValue()));
471  }
472  for (size_t i = sz; i < 6; i ++)
473  atts.push_back(1);
474 
475  const int characterSlot = mSlot;
476 
478  characterSlot,
479  mGender,
480  mHairStyle,
481  mHairColor,
482  CAST_U8(mRace),
483  CAST_U8(mLook),
484  atts);
485  }
486  else
487  {
489  // TRANSLATORS: char creation error
490  _("Error"),
491  // TRANSLATORS: char creation error
492  _("Your name needs to be at least 4 characters."),
493  // TRANSLATORS: ok dialog button
494  _("OK"),
496  Modal_true,
498  nullptr,
499  260);
500  }
501  }
502  else if (id == "cancel")
503  {
504  scheduleDelete();
505  }
506  else if (id == "nextcolor")
507  {
508  mHairColor ++;
509  updateHair();
510  }
511  else if (id == "prevcolor")
512  {
513  mHairColor --;
514  updateHair();
515  }
516  else if (id == "nextstyle")
517  {
518  mHairStyle ++;
519  updateHair();
520  }
521  else if (id == "prevstyle")
522  {
523  mHairStyle --;
524  updateHair();
525  }
526  else if (id == "nextrace")
527  {
528  mRace ++;
529  updateRace();
530  }
531  else if (id == "prevrace")
532  {
533  mRace --;
534  updateRace();
535  }
536  else if (id == "nextlook")
537  {
538  mLook ++;
539  updateLook();
540  }
541  else if (id == "prevlook")
542  {
543  mLook --;
544  updateLook();
545  }
546  else if (id == "statslider")
547  {
548  updateSliders();
549  }
550  else if (id == "action")
551  {
552  mAction ++;
553  if (mAction >= 5)
554  mAction = 0;
555  updatePlayer();
556  }
557  else if (id == "rotate")
558  {
559  mDirection ++;
560  if (mDirection >= 4)
561  mDirection = 0;
562  updatePlayer();
563  }
564  else if (id == "gender_m")
565  {
568  }
569  else if (id == "gender_f")
570  {
573  }
574  else if (id == "gender_u")
575  {
578  }
579 }
580 
581 std::string CharCreateDialog::getName() const
582 {
583  std::string name = mNameField->getText();
584  trim(name);
585  return name;
586 }
587 
589 {
590  for (size_t i = 0, sz = mAttributeSlider.size(); i < sz; i++)
591  {
592  // Update captions
593  mAttributeValue[i]->setCaption(
594  toString(CAST_S32(mAttributeSlider[i]->getValue())));
595  mAttributeValue[i]->adjustSize();
596  }
597 
598  // Update distributed points
599  const int pointsLeft = mMaxPoints - getDistributedPoints();
600  if (pointsLeft == 0)
601  {
602  // TRANSLATORS: char create dialog label
603  mAttributesLeft->setCaption(_("Character stats OK"));
604  mCreateButton->setEnabled(true);
605  }
606  else
607  {
608  mCreateButton->setEnabled(false);
609  if (pointsLeft > 0)
610  {
612  // TRANSLATORS: char create dialog label
613  strprintf(_("Please distribute %d points"), pointsLeft));
614  }
615  else
616  {
618  // TRANSLATORS: char create dialog label
619  strprintf(_("Please remove %d points"), -pointsLeft));
620  }
621  }
622 
624 }
625 
627 {
628  mCreateButton->setEnabled(true);
629 }
630 
632 {
633  unsigned int points = 0;
634 
635  for (size_t i = 0, sz = mAttributeSlider.size(); i < sz; i++)
636  points += CAST_U32(mAttributeSlider[i]->getValue());
637  return CAST_S32(points);
638 }
639 
641  int available,
642  const int min, const int max)
643 {
644  size_t sz;
645 
646  if (min == max || available == 0)
647  {
648  sz = 0U;
649  available = 0;
650  }
651  else
652  {
653  sz = labels.size();
654  }
655 
656  mMaxPoints = available;
657 
658  for (size_t i = 0; i < mAttributeLabel.size(); i++)
659  {
666  }
667 
668  mAttributeLabel.resize(sz);
669  mAttributeSlider.resize(sz);
670  mAttributeValue.resize(sz);
671 
672  const uint32_t w = 480;
673  uint32_t h = 350;
674  uint32_t y = 89;
676  y += 29;
678  y += 29;
679 
680  for (size_t i = 0; i < sz; i++)
681  {
682  mAttributeLabel[i] = new Label(this, labels[i]);
683  mAttributeLabel[i]->setWidth(70);
684  mAttributeLabel[i]->setPosition(mPadding,
685  y + CAST_S32(i * 24));
686  mAttributeLabel[i]->adjustSize();
687  add(mAttributeLabel[i]);
688 
689  mAttributeSlider[i] = new Slider(this, min, max, 1.0);
690  mAttributeSlider[i]->setDimension(Rect(140 + mPadding,
691  y + CAST_S32(i * 24),
692  150,
693  12));
694  mAttributeSlider[i]->setActionEventId("statslider");
695  mAttributeSlider[i]->addActionListener(this);
696  add(mAttributeSlider[i]);
697 
698  mAttributeValue[i] = new Label(this, toString(min));
699  mAttributeValue[i]->setPosition(295 + mPadding,
700  y + CAST_S32(i * 24));
701  add(mAttributeValue[i]);
702  }
703 
704  updateSliders();
705  if (available == 0)
706  {
708  h = y;
709  }
710  else
711  {
712  h = y +
713  CAST_S32(sz) * 24 +
715  getPadding();
716  }
718  features.getIntValue("forceCharGender") == -1 &&
719  y < 160)
720  {
721  if (h < 160)
722  h = 160;
723  }
724  if (h < mMaxY)
725  h = mMaxY;
727  {
728  const int forceGender = features.getIntValue("forceCharGender");
729  if (forceGender == -1 && h < 180)
730  h = 180;
731  else if (h < 120)
732  h = 120;
733  }
734  h += mCreateButton->getHeight();
735 
736  setContentSize(w, h);
737  setButtonsPosition(w, h);
738 }
739 
741 {
742  if (features.getIntValue("forceCharGender") != -1)
743  return;
744 
745  mDefaultGender = gender;
746  mPlayer->setGender(gender);
747 }
748 
750 {
751  if (mHairStyle <= 0)
753  else
757  {
759  }
760  const ItemInfo &item = ItemDB::get(-mHairStyle);
761  if (mHairStyleNameLabel != nullptr)
762  {
764  mHairStyleNameLabel->resizeTo(150, 150);
765  }
766 
767  if (ColorDB::getHairSize() != 0)
769  else
770  mHairColor = 0;
771  if (mHairColor < 0)
775  {
777  }
778  if (mHairColorNameLabel != nullptr)
779  {
782  mHairColorNameLabel->resizeTo(150, 150);
783  }
784 
786  mHairStyle * -1,
788  updatePlayer();
789 }
790 
792 {
793  if (mRace < mMinRace)
794  mRace = mMaxRace;
795  else if (mRace > mMaxRace)
796  mRace = mMinRace;
797 
798  updateLook();
799 }
800 
802 {
803  const ItemInfo &item = ItemDB::get(-100 - mRace);
804  const int sz = item.getColorsSize();
805  if (sz > 0 && serverFeatures->haveLookSelection())
806  {
807  if (mLook < 0)
808  mLook = sz - 1;
809  if (mLook > mMaxLook)
810  mLook = mMinLook;
811  if (mLook >= sz)
812  mLook = mMinLook;
813  }
814  else
815  {
816  mLook = 0;
817  }
819  CAST_U8(mLook));
820  if (mRaceNameLabel != nullptr)
821  {
823  mRaceNameLabel->resizeTo(150, 150);
824  }
825  if (mLookNameLabel != nullptr)
826  {
828  fromInt(mLook, ItemColor)));
829  mLookNameLabel->resizeTo(150, 150);
830  }
831 }
832 
834 {
835  BLOCK_START("CharCreateDialog::logic")
836  if (mPlayer != nullptr)
837  mPlayer->logic();
838  BLOCK_END("CharCreateDialog::logic")
839 }
840 
842 {
843  if (mPlayer != nullptr)
844  {
847  }
848 }
849 
851 {
852  const InputActionT actionId = event.getActionId();
853  PRAGMA45(GCC diagnostic push)
854  PRAGMA45(GCC diagnostic ignored "-Wswitch-enum")
855  switch (actionId)
856  {
858  event.consume();
861  break;
862 
863  default:
864  break;
865  }
866  PRAGMA45(GCC diagnostic pop)
867 }
868 
869 void CharCreateDialog::setButtonsPosition(const int w, const int h)
870 {
871  const int h2 = h - 5 - mCancelButton->getHeight();
872  if (mainGraphics->getHeight() < 480)
873  {
874  if (mMaxPoints != 0)
875  {
876  mCreateButton->setPosition(337, 160);
878  }
879  else
880  {
882  w / 2,
883  160);
886  160);
887  }
888  }
889  else
890  {
892  w / 2,
893  h2);
896  h2);
897  }
899 }
BeingAction ::T BeingActionT
Definition: beingaction.h:41
const BeingId BeingId_zero
Definition: beingid.h:30
int BeingTypeId
Definition: beingtypeid.h:30
const BeingTypeId BeingTypeId_zero
Definition: beingtypeid.h:30
const std::string BUTTON_SKIN
Definition: button.h:89
#define CAST_S32
Definition: cast.h:30
#define CAST_U32
Definition: cast.h:31
#define CAST_U8
Definition: cast.h:27
static const uint8_t directions[]
static const BeingActionT actions[]
Net::CharServerHandler * charServerHandler
Definition: net.cpp:85
virtual void add(Widget *const widget)
virtual void remove(Widget *const widget)
Definition: being.h:96
virtual void setDirection(const uint8_t direction)
Definition: being.cpp:1690
virtual void setAction(const BeingActionT &action, const int attackId)
Definition: being.cpp:1554
void logic()
Definition: being.cpp:1834
static GenderT intToGender(const uint8_t sex) A_CONST
Definition: being.h:941
void setSpriteCards(const unsigned int slot, const int id, const CardsList &cards)
Definition: being.cpp:3048
void setSubtype(const BeingTypeId subtype, const uint16_t look)
Definition: being.cpp:371
virtual void setGender(const GenderT gender)
Definition: being.cpp:3581
void setSpriteColor(const unsigned int slot, const int id, const std::string &color)
Definition: being.cpp:2890
Definition: button.h:102
unsigned int mDirection
TabStrip * mGenderStrip
unsigned int mAction
void action(const ActionEvent &event)
unsigned int minHairStyle
Button * mPrevHairStyleButton
Button * mPrevHairColorButton
std::vector< Label * > mAttributeLabel
Button * mNextHairStyleButton
unsigned int maxHairColor
std::vector< Label * > mAttributeValue
Button * mNextHairColorButton
unsigned int minHairColor
int getDistributedPoints() const
void setButtonsPosition(const int w, const int h)
void keyPressed(KeyEvent &event)
TextField * mNameField
void setDefaultGender(const GenderT gender)
std::vector< Slider * > mAttributeSlider
void setAttributes(const StringVect &labels, int available, const int min, const int max)
std::string getName() const
PlayerBox * mPlayerBox
CharCreateDialog(CharSelectDialog *const parent, const int slot)
unsigned int maxHairStyle
int getIntValue(const std::string &key) const
int getHeight() const
Definition: graphics.cpp:648
int getColorsSize() const
Definition: iteminfo.h:304
const std::string & getName() const
Definition: iteminfo.h:74
std::string getDyeColorsString(const ItemColor color) const
Definition: iteminfo.cpp:227
std::string getColorName(const ItemColor idx) const
Definition: iteminfo.cpp:413
Definition: label.h:91
void resizeTo(const int maxSize, const int minSize)
Definition: label.cpp:227
void adjustSize()
Definition: label.cpp:200
void setCaption(const std::string &caption)
Definition: label.cpp:264
virtual void setCharCreateDialog(CharCreateDialog *const window) const =0
virtual unsigned int hairSprite() const =0
virtual void newCharacter(const std::string &name, const int slot, const GenderT gender, const int hairstyle, const int hairColor, const unsigned char race, const uint16_t look, const std::vector< int > &stats) const =0
virtual bool haveCreateCharGender() const =0
virtual bool haveRaceSelection() const =0
virtual bool haveLookSelection() const =0
Definition: rect.h:74
Definition: slider.h:89
void setPressFirst(const bool press)
Definition: tabstrip.h:51
void setMaximum(const int max)
Definition: textfield.h:158
const std::string & getText() const
Definition: textfield.h:224
virtual void addButton(const std::string &text, const std::string &tag, const bool pressed)
Definition: widgetgroup.cpp:42
void setVisible(Visible visible)
Definition: widget.cpp:225
void setWidth(const int width)
Definition: widget.cpp:133
void setEnabled(const bool enabled)
Definition: widget.h:352
void setHeight(const int height)
Definition: widget.cpp:140
void setActionEventId(const std::string &actionEventId)
Definition: widget.h:596
void addKeyListener(KeyListener *const keyListener)
Definition: widget.cpp:272
virtual void requestFocus()
Definition: widget.cpp:204
void setDimension(const Rect &dimension)
Definition: widget.cpp:169
void addActionListener(ActionListener *const actionListener)
Definition: widget.cpp:252
void setPosition(const int x, const int y)
Definition: widget.cpp:161
int getX() const
Definition: widget.h:269
int getHeight() const
Definition: widget.h:240
const std::string & getActionEventId() const
Definition: widget.h:605
int getWidth() const
Definition: widget.h:221
Definition: window.h:102
void center()
Definition: window.cpp:1417
virtual void setVisible(Visible visible)
Definition: window.cpp:778
void setContentSize(int width, int height)
Definition: window.cpp:492
int getTitlePadding() const
Definition: window.h:602
void setWindowName(const std::string &name)
Definition: window.h:355
int getOption(const std::string &name, const int def) const
Definition: window.cpp:1454
void setSticky(const bool sticky)
Definition: window.cpp:766
int getPadding() const
Definition: window.h:504
const std::string & getWindowName() const
Definition: window.h:361
virtual void scheduleDelete()
Definition: window.cpp:831
int mPadding
Definition: window.h:618
void setStickyButtonLock(const bool sticky)
Definition: window.cpp:772
Configuration config
Configuration features
#define CREATEWIDGET(type,...)
Definition: createwidget.h:29
#define new
Definition: debug_new.h:147
#define delete2(var)
Definition: delete2.h:25
Gender ::T GenderT
Definition: gender.h:35
#define _(s)
Definition: gettext.h:35
Graphics * mainGraphics
Definition: graphics.cpp:109
PRAGMA45(GCC diagnostic push) PRAGMA45(GCC diagnostic ignored "-Wredundant-decls") PRAGMA45(GCC diagnostic pop) class TestMain
InputAction ::T InputActionT
Definition: inputaction.h:717
#define fromInt(val, name)
Definition: intdefines.h:46
uint16_t ItemColor
Definition: itemcolor.h:30
#define nullptr
Definition: localconsts.h:45
const bool LoseFocusOnTab_true
const bool Modal_true
Definition: modal.h:30
std::string trim(std::string const &str)
std::string toString(T const &value)
converts any type to a string
Definition: catch.hpp:1774
Definition: chardb.h:36
const std::vector< BeingSlot > & getDefaultItems()
Definition: chardb.cpp:187
unsigned getMinLook()
Definition: chardb.cpp:167
unsigned getMinRace()
Definition: chardb.cpp:177
unsigned getMaxLook()
Definition: chardb.cpp:172
unsigned getMinHairStyle()
Definition: chardb.cpp:142
unsigned getMaxHairStyle()
Definition: chardb.cpp:147
unsigned getMaxHairColor()
Definition: chardb.cpp:137
unsigned getMaxRace()
Definition: chardb.cpp:182
unsigned getMinHairColor()
Definition: chardb.cpp:132
int getHairSize()
Definition: colordb.cpp:213
std::string & getHairColorName(const ItemColor id)
Definition: colordb.cpp:190
Being * createBeing(const BeingId id, const int job)
Definition: beingrecv.cpp:507
int size()
Definition: emotedb.cpp:306
Definition: gender.h:29
@ UNSPECIFIED
Definition: gender.h:33
@ MALE
Definition: gender.h:31
@ FEMALE
Definition: gender.h:32
int getNumOfHairstyles()
Definition: itemdb.cpp:1192
const ItemInfo & get(const int id)
Definition: itemdb.cpp:792
Net::ServerFeatures * serverFeatures
Definition: net.cpp:101
#define BLOCK_END(name)
Definition: perfomance.h:80
#define BLOCK_START(name)
Definition: perfomance.h:79
const bool ShowCenter_true
Definition: showcenter.h:30
std::string strprintf(const char *const format,...)
std::vector< std::string > StringVect
Definition: stringvector.h:29
int spriteId
Definition: beingslot.h:45
CardsList cardsId
Definition: beingslot.h:46
const bool Visible_false
Definition: visible.h:30
const bool Visible_true
Definition: visible.h:30