1 #ifndef CHARACTER_CREATION_HPP
2 #define CHARACTER_CREATION_HPP
3 
4 #include <components/esm/loadclas.hpp>
5 
6 #include <map>
7 #include <vector>
8 
9 #include "statswatcher.hpp"
10 
11 namespace osg
12 {
13     class Group;
14 }
15 
16 namespace Resource
17 {
18     class ResourceSystem;
19 }
20 
21 namespace MWGui
22 {
23     class WindowBase;
24 
25     class TextInputDialog;
26     class InfoBoxDialog;
27     class RaceDialog;
28     class DialogueWindow;
29     class ClassChoiceDialog;
30     class GenerateClassResultDialog;
31     class PickClassDialog;
32     class CreateClassDialog;
33     class BirthDialog;
34     class ReviewDialog;
35     class MessageBoxManager;
36 
37     class CharacterCreation : public StatsListener
38     {
39     public:
40     typedef std::vector<int> SkillList;
41 
42     CharacterCreation(osg::Group* parent, Resource::ResourceSystem* resourceSystem);
43     virtual ~CharacterCreation();
44 
45     //Show a dialog
46     void spawnDialog(const char id);
47 
48     void setValue (const std::string& id, const MWMechanics::AttributeValue& value) override;
49     void setValue (const std::string& id, const MWMechanics::DynamicStat<float>& value) override;
50     void setValue(const ESM::Skill::SkillEnum parSkill, const MWMechanics::SkillValue& value) override;
51     void configureSkills(const SkillList& major, const SkillList& minor) override;
52 
53     void onFrame(float duration);
54 
55     private:
56     osg::Group* mParent;
57     Resource::ResourceSystem* mResourceSystem;
58 
59     SkillList mPlayerMajorSkills, mPlayerMinorSkills;
60     std::map<int, MWMechanics::AttributeValue> mPlayerAttributes;
61     std::map<int, MWMechanics::SkillValue> mPlayerSkillValues;
62 
63     //Dialogs
64     TextInputDialog* mNameDialog;
65     RaceDialog* mRaceDialog;
66     ClassChoiceDialog* mClassChoiceDialog;
67     InfoBoxDialog* mGenerateClassQuestionDialog;
68     GenerateClassResultDialog* mGenerateClassResultDialog;
69     PickClassDialog* mPickClassDialog;
70     CreateClassDialog* mCreateClassDialog;
71     BirthDialog* mBirthSignDialog;
72     ReviewDialog* mReviewDialog;
73 
74     //Player data
75     std::string mPlayerName;
76     std::string mPlayerRaceId;
77     std::string mPlayerBirthSignId;
78     ESM::Class mPlayerClass;
79 
80     //Class generation vars
81     unsigned mGenerateClassStep;                 // Keeps track of current step in Generate Class dialog
82     ESM::Class::Specialization mGenerateClassResponses[3];
83     unsigned mGenerateClassSpecializations[3];   // A counter for each specialization which is increased when an answer is chosen
84     std::string mGenerateClass;                  // In order: Combat, Magic, Stealth
85 
86     ////Dialog events
87     //Name dialog
88     void onNameDialogDone(WindowBase* parWindow);
89 
90     //Race dialog
91     void onRaceDialogDone(WindowBase* parWindow);
92     void onRaceDialogBack();
93     void selectRace();
94 
95     //Class dialogs
96     void onClassChoice(int _index);
97     void onPickClassDialogDone(WindowBase* parWindow);
98     void onPickClassDialogBack();
99     void onCreateClassDialogDone(WindowBase* parWindow);
100     void onCreateClassDialogBack();
101     void showClassQuestionDialog();
102     void onClassQuestionChosen(int _index);
103     void onGenerateClassBack();
104     void onGenerateClassDone(WindowBase* parWindow);
105     void selectGeneratedClass();
106     void selectCreatedClass();
107     void selectPickedClass();
108 
109     //Birthsign dialog
110     void onBirthSignDialogDone(WindowBase* parWindow);
111     void onBirthSignDialogBack();
112     void selectBirthSign();
113 
114     //Review dialog
115     void onReviewDialogDone(WindowBase* parWindow);
116     void onReviewDialogBack();
117     void onReviewActivateDialog(int parDialog);
118 
119     enum CSE    //Creation Stage Enum
120     {
121         CSE_NotStarted,
122         CSE_NameChosen,
123         CSE_RaceChosen,
124         CSE_ClassChosen,
125         CSE_BirthSignChosen,
126         CSE_ReviewBack,
127         CSE_ReviewNext
128     };
129 
130     CSE mCreationStage; // Which state the character creating is in, controls back/next/ok buttons
131 
132     void handleDialogDone(CSE currentStage, int nextMode);
133     };
134 }
135 
136 #endif
137