diff --git a/apps/openmw/mwgui/mw_chargen.cpp b/apps/openmw/mwgui/mw_chargen.cpp index e8ad3088f..04a29a70c 100644 --- a/apps/openmw/mwgui/mw_chargen.cpp +++ b/apps/openmw/mwgui/mw_chargen.cpp @@ -21,47 +21,47 @@ RaceDialog::RaceDialog(MWWorld::Environment& environment, bool showNext) , faceCount(10) , hairCount(14) { - mMainWidget->setCoord(mMainWidget->getCoord() + MyGUI::IntPoint(0, 100)); - - // These are just demo values, you should replace these with - // real calls from outside the class later. - - setText("AppearanceT", "Appearance"); - getWidget(appearanceBox, "AppearanceBox"); - - getWidget(headRotate, "HeadRotate"); - headRotate->setScrollRange(50); - headRotate->setScrollPosition(20); - headRotate->setScrollViewPage(10); - headRotate->eventScrollChangePosition = MyGUI::newDelegate(this, &RaceDialog::onHeadRotate); - - // Set up next/previous buttons - MyGUI::ButtonPtr prevButton, nextButton; - - getWidget(prevButton, "PrevGenderButton"); - getWidget(nextButton, "NextGenderButton"); - prevButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousGender); - nextButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectNextGender); - - getWidget(prevButton, "PrevFaceButton"); - getWidget(nextButton, "NextFaceButton"); - prevButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousFace); - nextButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectNextFace); - - getWidget(prevButton, "PrevHairButton"); - getWidget(nextButton, "NextHairButton"); - prevButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousHair); - nextButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectNextHair); - - setText("RaceT", "Race"); - getWidget(raceList, "RaceList"); - raceList->setScrollVisible(true); - raceList->eventListSelectAccept = MyGUI::newDelegate(this, &RaceDialog::onSelectRace); - raceList->eventListMouseItemActivate = MyGUI::newDelegate(this, &RaceDialog::onSelectRace); + mMainWidget->setCoord(mMainWidget->getCoord() + MyGUI::IntPoint(0, 100)); + + // These are just demo values, you should replace these with + // real calls from outside the class later. + + setText("AppearanceT", "Appearance"); + getWidget(appearanceBox, "AppearanceBox"); + + getWidget(headRotate, "HeadRotate"); + headRotate->setScrollRange(50); + headRotate->setScrollPosition(20); + headRotate->setScrollViewPage(10); + headRotate->eventScrollChangePosition = MyGUI::newDelegate(this, &RaceDialog::onHeadRotate); + + // Set up next/previous buttons + MyGUI::ButtonPtr prevButton, nextButton; + + getWidget(prevButton, "PrevGenderButton"); + getWidget(nextButton, "NextGenderButton"); + prevButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousGender); + nextButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectNextGender); + + getWidget(prevButton, "PrevFaceButton"); + getWidget(nextButton, "NextFaceButton"); + prevButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousFace); + nextButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectNextFace); + + getWidget(prevButton, "PrevHairButton"); + getWidget(nextButton, "NextHairButton"); + prevButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousHair); + nextButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectNextHair); + + setText("RaceT", "Race"); + getWidget(raceList, "RaceList"); + raceList->setScrollVisible(true); + raceList->eventListSelectAccept = MyGUI::newDelegate(this, &RaceDialog::onSelectRace); + raceList->eventListMouseItemActivate = MyGUI::newDelegate(this, &RaceDialog::onSelectRace); raceList->eventListChangePosition = MyGUI::newDelegate(this, &RaceDialog::onSelectRace); - getWidget(skillList, "SkillList"); - getWidget(spellPowerList, "SpellPowerList"); + getWidget(skillList, "SkillList"); + getWidget(spellPowerList, "SpellPowerList"); // TODO: These buttons should be managed by a Dialog class MyGUI::ButtonPtr backButton; @@ -76,13 +76,13 @@ RaceDialog::RaceDialog(MWWorld::Environment& environment, bool showNext) okButton->setCaption("Next"); // Adjust back button when next is shown - backButton->setCoord(backButton->getCoord() + MyGUI::IntPoint(14, 0)); - okButton->setCoord(okButton->getCoord() + MyGUI::IntSize(14, 0)); + backButton->setCoord(backButton->getCoord() - MyGUI::IntPoint(18, 0)); + okButton->setCoord(okButton->getCoord() + MyGUI::IntCoord(-18, 0, 18, 0)); } - updateRaces(); - updateSkills(); - updateSpellPowers(); + updateRaces(); + updateSkills(); + updateSpellPowers(); } void RaceDialog::setRace(const std::string &race) @@ -99,18 +99,18 @@ void RaceDialog::setRace(const std::string &race) } } - updateSkills(); - updateSpellPowers(); + updateSkills(); + updateSpellPowers(); } int wrap(int index, int max) { - if (index < 0) - return max - 1; - else if (index >= max) - return 0; - else - return index; + if (index < 0) + return max - 1; + else if (index >= max) + return 0; + else + return index; } // widget controls @@ -127,37 +127,37 @@ void RaceDialog::onBackClicked(MyGUI::Widget* _sender) void RaceDialog::onHeadRotate(MyGUI::VScroll*, size_t _position) { - // TODO: Rotate head + // TODO: Rotate head } void RaceDialog::onSelectPreviousGender(MyGUI::Widget*) { - genderIndex = wrap(genderIndex - 1, 2); + genderIndex = wrap(genderIndex - 1, 2); } void RaceDialog::onSelectNextGender(MyGUI::Widget*) { - genderIndex = wrap(genderIndex + 1, 2); + genderIndex = wrap(genderIndex + 1, 2); } void RaceDialog::onSelectPreviousFace(MyGUI::Widget*) { - faceIndex = wrap(faceIndex - 1, faceCount); + faceIndex = wrap(faceIndex - 1, faceCount); } void RaceDialog::onSelectNextFace(MyGUI::Widget*) { - faceIndex = wrap(faceIndex + 1, faceCount); + faceIndex = wrap(faceIndex + 1, faceCount); } void RaceDialog::onSelectPreviousHair(MyGUI::Widget*) { - hairIndex = wrap(hairIndex - 1, hairCount); + hairIndex = wrap(hairIndex - 1, hairCount); } void RaceDialog::onSelectNextHair(MyGUI::Widget*) { - hairIndex = wrap(hairIndex - 1, hairCount); + hairIndex = wrap(hairIndex - 1, hairCount); } void RaceDialog::onSelectRace(MyGUI::List* _sender, size_t _index) @@ -171,55 +171,55 @@ void RaceDialog::onSelectRace(MyGUI::List* _sender, size_t _index) currentRace = race; updateSkills(); - updateSpellPowers(); + updateSpellPowers(); } // update widget content void RaceDialog::updateRaces() { - raceList->removeAllItems(); + raceList->removeAllItems(); ESMS::ESMStore &store = environment.mWorld->getStore(); - + ESMS::RecListT::MapType::const_iterator it = store.races.list.begin(); ESMS::RecListT::MapType::const_iterator end = store.races.list.end(); - int index = 0; - for (; it != end; ++it) - { + int index = 0; + for (; it != end; ++it) + { const ESM::Race &race = it->second; bool playable = race.data.flags & ESM::Race::Playable; if (!playable) // Only display playable races continue; raceList->addItem(race.name); - if (boost::iequals(race.name, currentRace)) - raceList->setIndexSelected(index); - ++index; - } + if (boost::iequals(race.name, currentRace)) + raceList->setIndexSelected(index); + ++index; + } } void RaceDialog::updateSkills() { - for (std::vector::iterator it = skillItems.begin(); it != skillItems.end(); ++it) - { - MyGUI::Gui::getInstance().destroyWidget(*it); - } - skillItems.clear(); + for (std::vector::iterator it = skillItems.begin(); it != skillItems.end(); ++it) + { + MyGUI::Gui::getInstance().destroyWidget(*it); + } + skillItems.clear(); if (currentRace.empty()) return; - MyGUI::StaticTextPtr skillNameWidget, skillBonusWidget; - const int lineHeight = 18; - MyGUI::IntCoord coord1(0, 0, skillList->getWidth() - (40 + 4), 18); - MyGUI::IntCoord coord2(coord1.left + coord1.width, 0, 40, 18); + MyGUI::StaticTextPtr skillNameWidget, skillBonusWidget; + const int lineHeight = 18; + MyGUI::IntCoord coord1(0, 0, skillList->getWidth() - (40 + 4), 18); + MyGUI::IntCoord coord2(coord1.left + coord1.width, 0, 40, 18); ESMS::ESMStore &store = environment.mWorld->getStore(); const ESM::Race *race = store.races.find(currentRace); int count = sizeof(race->data.bonus)/sizeof(race->data.bonus[0]); // TODO: Find a portable macro for this ARRAYSIZE? for (int i = 0; i < count; ++i) - { + { int skillId = race->data.bonus[i].skill; if (skillId < 0 || skillId > ESM::Skill::Length) // Skip unknown skill indexes continue; @@ -227,52 +227,52 @@ void RaceDialog::updateSkills() skillNameWidget = skillList->createWidget("SandText", coord1, MyGUI::Align::Default, std::string("SkillName") + boost::lexical_cast(i)); assert(skillId >= 0 && skillId < ESM::Skill::Length); - skillNameWidget->setCaption(ESMS::Skill::sSkillNames[skillId]); + skillNameWidget->setCaption(ESMS::Skill::sSkillNames[skillId]); - skillBonusWidget = skillList->createWidget("SandTextRight", coord2, MyGUI::Align::Default, + skillBonusWidget = skillList->createWidget("SandTextRight", coord2, MyGUI::Align::Default, std::string("SkillBonus") + boost::lexical_cast(i)); int bonus = race->data.bonus[i].bonus; - skillBonusWidget->setCaption(boost::lexical_cast(bonus)); + skillBonusWidget->setCaption(boost::lexical_cast(bonus)); - skillItems.push_back(skillNameWidget); - skillItems.push_back(skillBonusWidget); + skillItems.push_back(skillNameWidget); + skillItems.push_back(skillBonusWidget); - coord1.top += lineHeight; - coord2.top += lineHeight; - } + coord1.top += lineHeight; + coord2.top += lineHeight; + } } void RaceDialog::updateSpellPowers() { - for (std::vector::iterator it = spellPowerItems.begin(); it != spellPowerItems.end(); ++it) - { - MyGUI::Gui::getInstance().destroyWidget(*it); - } - spellPowerItems.clear(); + for (std::vector::iterator it = spellPowerItems.begin(); it != spellPowerItems.end(); ++it) + { + MyGUI::Gui::getInstance().destroyWidget(*it); + } + spellPowerItems.clear(); if (currentRace.empty()) return; - MyGUI::StaticTextPtr spellPowerWidget; - const int lineHeight = 18; - MyGUI::IntCoord coord(0, 0, spellPowerList->getWidth(), 18); + MyGUI::StaticTextPtr spellPowerWidget; + const int lineHeight = 18; + MyGUI::IntCoord coord(0, 0, spellPowerList->getWidth(), 18); ESMS::ESMStore &store = environment.mWorld->getStore(); const ESM::Race *race = store.races.find(currentRace); std::vector::const_iterator it = race->powers.list.begin(); std::vector::const_iterator end = race->powers.list.end(); - for (int i = 0; it != end; ++it) - { + for (int i = 0; it != end; ++it) + { const std::string &spellpower = *it; const ESM::Spell *spell = store.spells.find(spellpower); assert(spell); spellPowerWidget = spellPowerList->createWidget("SandText", coord, MyGUI::Align::Default, std::string("SpellPowerName") + boost::lexical_cast(i)); - spellPowerWidget->setCaption(spell->name); + spellPowerWidget->setCaption(spell->name); - spellPowerItems.push_back(spellPowerWidget); + spellPowerItems.push_back(spellPowerWidget); - coord.top += lineHeight; + coord.top += lineHeight; ++i; - } + } } diff --git a/apps/openmw/mwgui/mw_chargen.hpp b/apps/openmw/mwgui/mw_chargen.hpp index 9a0012ee4..7e276864a 100644 --- a/apps/openmw/mwgui/mw_chargen.hpp +++ b/apps/openmw/mwgui/mw_chargen.hpp @@ -27,13 +27,13 @@ namespace MWWorld namespace MWGui { - using namespace MyGUI; + using namespace MyGUI; typedef delegates::CDelegate0 EventHandle_Void; - class RaceDialog : public OEngine::GUI::Layout - { - public: + class RaceDialog : public OEngine::GUI::Layout + { + public: RaceDialog(MWWorld::Environment& environment, bool showNext); enum Gender @@ -55,53 +55,53 @@ namespace MWGui // Events /** Event : Back button clicked.\n - signature : void method()\n - */ - EventHandle_Void eventBack; + signature : void method()\n + */ + EventHandle_Void eventBack; /** Event : Dialog finished, OK button clicked.\n - signature : void method()\n - */ - EventHandle_Void eventDone; + signature : void method()\n + */ + EventHandle_Void eventDone; protected: - void onHeadRotate(MyGUI::VScroll* _sender, size_t _position); + void onHeadRotate(MyGUI::VScroll* _sender, size_t _position); - void onSelectPreviousGender(MyGUI::Widget* _sender); - void onSelectNextGender(MyGUI::Widget* _sender); + void onSelectPreviousGender(MyGUI::Widget* _sender); + void onSelectNextGender(MyGUI::Widget* _sender); - void onSelectPreviousFace(MyGUI::Widget* _sender); - void onSelectNextFace(MyGUI::Widget* _sender); + void onSelectPreviousFace(MyGUI::Widget* _sender); + void onSelectNextFace(MyGUI::Widget* _sender); - void onSelectPreviousHair(MyGUI::Widget* _sender); - void onSelectNextHair(MyGUI::Widget* _sender); + void onSelectPreviousHair(MyGUI::Widget* _sender); + void onSelectNextHair(MyGUI::Widget* _sender); - void onSelectRace(MyGUI::List* _sender, size_t _index); + void onSelectRace(MyGUI::List* _sender, size_t _index); void onOkClicked(MyGUI::Widget* _sender); void onBackClicked(MyGUI::Widget* _sender); - private: - void updateRaces(); - void updateSkills(); - void updateSpellPowers(); + private: + void updateRaces(); + void updateSkills(); + void updateSpellPowers(); MWWorld::Environment& environment; - MyGUI::CanvasPtr appearanceBox; - MyGUI::ListPtr raceList; - MyGUI::HScrollPtr headRotate; + MyGUI::CanvasPtr appearanceBox; + MyGUI::ListPtr raceList; + MyGUI::HScrollPtr headRotate; - MyGUI::WidgetPtr skillList; - std::vector skillItems; + MyGUI::WidgetPtr skillList; + std::vector skillItems; - MyGUI::WidgetPtr spellPowerList; - std::vector spellPowerItems; + MyGUI::WidgetPtr spellPowerList; + std::vector spellPowerItems; int genderIndex, faceIndex, hairIndex; - int faceCount, hairCount; + int faceCount, hairCount; std::string currentRace; - }; + }; } #endif diff --git a/apps/openmw/mwgui/mw_layouts.hpp b/apps/openmw/mwgui/mw_layouts.hpp index 54e3bf733..8ab533161 100644 --- a/apps/openmw/mwgui/mw_layouts.hpp +++ b/apps/openmw/mwgui/mw_layouts.hpp @@ -274,120 +274,120 @@ namespace MWGui class InventoryWindow : public OEngine::GUI::Layout { public: - enum CategoryMode - { - CM_All = 0, // All items - CM_Weapon = 1, // Only weapons - CM_Apparel = 2, // Apparel - CM_Magic = 3, // Magic - CM_Misc = 4 // Misc - }; - - InventoryWindow () + enum CategoryMode + { + CM_All = 0, // All items + CM_Weapon = 1, // Only weapons + CM_Apparel = 2, // Apparel + CM_Magic = 3, // Magic + CM_Misc = 4 // Misc + }; + + InventoryWindow () : Layout("openmw_inventory_window_layout.xml") - , categoryMode(CM_All) + , categoryMode(CM_All) - // color should be fetched from skin - , activeColor(0, 0, 1) - , inactiveColor(0.7, 0.7, 0.7) + // color should be fetched from skin + , activeColor(0, 0, 1) + , inactiveColor(0.7, 0.7, 0.7) { setCoord(0, 200, 600, 400); // These are just demo values, you should replace these with // real calls from outside the class later. - mMainWidget->setCaption("Glass Frostsword"); + mMainWidget->setCaption("Glass Frostsword"); setText("EncumbranceBarT", "176/210"); - MyGUI::ProgressPtr pt; + MyGUI::ProgressPtr pt; getWidget(pt, "EncumbranceBar"); pt->setProgressRange(210); pt->setProgressPosition(176); - MyGUI::WidgetPtr avatar; - getWidget(avatar, "Avatar"); - - // Adjust armor rating text to bottom of avatar widget - MyGUI::StaticTextPtr armor_rating; - getWidget(armor_rating, "ArmorRating"); - armor_rating->setCaption("Armor: 11"); - MyGUI::IntCoord coord = armor_rating->getCoord(); - coord.top = avatar->getCoord().height - 4 - coord.height; - armor_rating->setCoord(coord); - - names[0] = "All"; - names[1] = "Weapon"; - names[2] = "Apparel"; - names[3] = "Magic"; - names[4] = "Misc"; - - boost::array categories = { { - CM_All, CM_Weapon, CM_Apparel, CM_Magic, CM_Misc - } }; - - // Initialize buttons with text and adjust sizes, also mark All as active button - int margin = 2; - int last_x = 0; - for (int i = 0; i < categories.size(); ++i) - { - CategoryMode mode = categories[i]; - std::string name = names[mode]; - name += "Button"; - setText(name, names[mode]); - getWidget(buttons[mode], name); - - MyGUI::ButtonPtr &button_pt = buttons[mode]; - if (mode == CM_All) - button_pt->setTextColour(activeColor); - else - button_pt->setTextColour(inactiveColor); - MyGUI::IntCoord coord = button_pt->getCoord(); - coord.left = last_x; - last_x += coord.width + margin; - button_pt->setCoord(coord); - - button_pt->eventMouseButtonClick = MyGUI::newDelegate(this, &InventoryWindow::onCategorySelected); - } + MyGUI::WidgetPtr avatar; + getWidget(avatar, "Avatar"); + + // Adjust armor rating text to bottom of avatar widget + MyGUI::StaticTextPtr armor_rating; + getWidget(armor_rating, "ArmorRating"); + armor_rating->setCaption("Armor: 11"); + MyGUI::IntCoord coord = armor_rating->getCoord(); + coord.top = avatar->getCoord().height - 4 - coord.height; + armor_rating->setCoord(coord); + + names[0] = "All"; + names[1] = "Weapon"; + names[2] = "Apparel"; + names[3] = "Magic"; + names[4] = "Misc"; + + boost::array categories = { { + CM_All, CM_Weapon, CM_Apparel, CM_Magic, CM_Misc + } }; + + // Initialize buttons with text and adjust sizes, also mark All as active button + int margin = 2; + int last_x = 0; + for (int i = 0; i < categories.size(); ++i) + { + CategoryMode mode = categories[i]; + std::string name = names[mode]; + name += "Button"; + setText(name, names[mode]); + getWidget(buttons[mode], name); + + MyGUI::ButtonPtr &button_pt = buttons[mode]; + if (mode == CM_All) + button_pt->setTextColour(activeColor); + else + button_pt->setTextColour(inactiveColor); + MyGUI::IntCoord coord = button_pt->getCoord(); + coord.left = last_x; + last_x += coord.width + margin; + button_pt->setCoord(coord); + + button_pt->eventMouseButtonClick = MyGUI::newDelegate(this, &InventoryWindow::onCategorySelected); + } + } + + void setCategory(CategoryMode mode) + { + MyGUI::ButtonPtr pt = getCategoryButton(categoryMode); + pt->setTextColour(inactiveColor); + + pt = getCategoryButton(mode); + pt->setTextColour(activeColor); + categoryMode = mode; } - void setCategory(CategoryMode mode) - { - MyGUI::ButtonPtr pt = getCategoryButton(categoryMode); - pt->setTextColour(inactiveColor); - - pt = getCategoryButton(mode); - pt->setTextColour(activeColor); - categoryMode = mode; - } - - MyGUI::ButtonPtr getCategoryButton(CategoryMode mode) - { - return buttons[mode]; - } - - void onCategorySelected(MyGUI::Widget *widget) - { - boost::array categories = { { - CM_All, CM_Weapon, CM_Apparel, CM_Magic, CM_Misc - } }; - - for (int i = 0; i < categories.size(); ++i) - { - CategoryMode mode = categories[i]; - if (widget == buttons[mode]) - { - setCategory(mode); - return; - } - } - } - - CategoryMode categoryMode; // Current category filter - MyGUI::ButtonPtr buttons[5]; // Button pointers - std::string names[5]; // Names of category buttons - - MyGUI::Colour activeColor; - MyGUI::Colour inactiveColor; + MyGUI::ButtonPtr getCategoryButton(CategoryMode mode) + { + return buttons[mode]; + } + + void onCategorySelected(MyGUI::Widget *widget) + { + boost::array categories = { { + CM_All, CM_Weapon, CM_Apparel, CM_Magic, CM_Misc + } }; + + for (int i = 0; i < categories.size(); ++i) + { + CategoryMode mode = categories[i]; + if (widget == buttons[mode]) + { + setCategory(mode); + return; + } + } + } + + CategoryMode categoryMode; // Current category filter + MyGUI::ButtonPtr buttons[5]; // Button pointers + std::string names[5]; // Names of category buttons + + MyGUI::Colour activeColor; + MyGUI::Colour inactiveColor; }; } #endif diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index afae2134d..6c7efbdfc 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -110,7 +110,7 @@ void WindowManager::updateVisible() map -> setVisible( eff & GW_Map ); stats -> setVisible( eff & GW_Stats ); // inventory -> setVisible( eff & GW_Inventory ); - return; + return; } // All other modes are ignored diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index 29f25eebc..b20efb5d3 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -88,7 +88,7 @@ namespace MWGui Console *console; // Character creation - RaceDialog *raceDialog; + RaceDialog *raceDialog; // Which dialogs have been shown, controls back/next/ok buttons bool nameChosen; diff --git a/components/esm/skill.cpp b/components/esm/skill.cpp index f726fb214..cc56a4059 100644 --- a/components/esm/skill.cpp +++ b/components/esm/skill.cpp @@ -3,32 +3,32 @@ namespace ESM { const std::string Skill::sSkillNames[Length] = { - "Block", - "Armorer", - "Medium Armor", - "Heavy Armor", - "Blunt Weapon", - "Long Blade", - "Axe", - "Spear", - "Athletics", - "Enchant", - "Destruction", - "Alteration", - "Illusion", - "Conjuration", - "Mysticism", - "Restoration", - "Alchemy", - "Unarmored", - "Security", - "Sneak", - "Acrobatics", - "Light Armor", - "Short Blade", - "Marksman", + "Block", + "Armorer", + "Medium Armor", + "Heavy Armor", + "Blunt Weapon", + "Long Blade", + "Axe", + "Spear", + "Athletics", + "Enchant", + "Destruction", + "Alteration", + "Illusion", + "Conjuration", + "Mysticism", + "Restoration", + "Alchemy", + "Unarmored", + "Security", + "Sneak", + "Acrobatics", + "Light Armor", + "Short Blade", + "Marksman", "Mercantile", - "Speechcraft", - "Hand To Hand", - }; + "Speechcraft", + "Hand To Hand", + }; }