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