show the Barter entry in the dialogue gui for npcs/creatures that buy/sell stuff. doesn't work for the Creeper for some reason, but Mudcrab Merchant works.

This commit is contained in:
scrawl 2012-05-17 14:54:03 +02:00
parent 66abfd17ab
commit 0dc5e5919b
5 changed files with 79 additions and 13 deletions

View file

@ -767,6 +767,36 @@ namespace MWDialogue
} }
} }
// check the available services of this actor
int services = 0;
if (mActor.getTypeName() == typeid(ESM::NPC).name())
{
ESMS::LiveCellRef<ESM::NPC, MWWorld::RefData>* ref = mActor.get<ESM::NPC>();
if (ref->base->hasAI)
services = ref->base->AI.services;
}
else if (mActor.getTypeName() == typeid(ESM::Creature).name())
{
ESMS::LiveCellRef<ESM::Creature, MWWorld::RefData>* ref = mActor.get<ESM::Creature>();
if (ref->base->hasAI)
services = ref->base->AI.services;
}
if (services & ESM::NPC::Weapon
|| services & ESM::NPC::Armor
|| services & ESM::NPC::Clothing
|| services & ESM::NPC::Books
|| services & ESM::NPC::Ingredients
|| services & ESM::NPC::Picks
|| services & ESM::NPC::Probes
|| services & ESM::NPC::Lights
|| services & ESM::NPC::Apparatus
|| services & ESM::NPC::RepairItem
|| services & ESM::NPC::Misc)
win->setShowTrade(true);
else
win->setShowTrade(false);
// sort again, because the previous sort was case-sensitive // sort again, because the previous sort was case-sensitive
keywordList.sort(stringCompareNoCase); keywordList.sort(stringCompareNoCase);
win->setKeywords(keywordList); win->setKeywords(keywordList);

View file

@ -40,6 +40,7 @@ std::string::size_type find_str_ci(const std::string& str, const std::string& su
DialogueWindow::DialogueWindow(WindowManager& parWindowManager) DialogueWindow::DialogueWindow(WindowManager& parWindowManager)
: WindowBase("openmw_dialogue_window_layout.xml", parWindowManager) : WindowBase("openmw_dialogue_window_layout.xml", parWindowManager)
, mEnabled(true) , mEnabled(true)
, mShowTrade(false)
{ {
// Centre dialog // Centre dialog
center(); center();
@ -141,6 +142,15 @@ void DialogueWindow::startDialogue(std::string npcName)
void DialogueWindow::setKeywords(std::list<std::string> keyWords) void DialogueWindow::setKeywords(std::list<std::string> keyWords)
{ {
topicsList->clear(); topicsList->clear();
bool anyService = mShowTrade;
if (mShowTrade)
topicsList->addItem(MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sBarter")->str);
if (anyService)
topicsList->addSeparator();
for(std::list<std::string>::iterator it = keyWords.begin(); it != keyWords.end(); it++) for(std::list<std::string>::iterator it = keyWords.begin(); it != keyWords.end(); it++)
{ {
topicsList->addItem(*it); topicsList->addItem(*it);
@ -194,6 +204,7 @@ std::string DialogueWindow::parseText(std::string text)
for(unsigned int i = 0;i<topicsList->getItemCount();i++) for(unsigned int i = 0;i<topicsList->getItemCount();i++)
{ {
std::string keyWord = topicsList->getItemNameAt(i); std::string keyWord = topicsList->getItemNameAt(i);
if (keyWord != "")
addColorInString(text,keyWord,"#686EBA","#B29154"); addColorInString(text,keyWord,"#686EBA","#B29154");
} }
return text; return text;

View file

@ -47,6 +47,10 @@ namespace MWGui
void askQuestion(std::string question); void askQuestion(std::string question);
void goodbye(); void goodbye();
// various service button visibilities, depending if the npc/creature talked to has these services
// make sure to call these before setKeywords()
void setShowTrade(bool show) { mShowTrade = show; }
protected: protected:
void onSelectTopic(std::string topic); void onSelectTopic(std::string topic);
void onByeClicked(MyGUI::Widget* _sender); void onByeClicked(MyGUI::Widget* _sender);
@ -61,6 +65,9 @@ namespace MWGui
*/ */
std::string parseText(std::string text); std::string parseText(std::string text);
// various service button visibilities, depending if the npc/creature talked to has these services
bool mShowTrade;
bool mEnabled; bool mEnabled;
DialogueHistory* history; DialogueHistory* history;

View file

@ -30,6 +30,11 @@ void MWList::addItem(const std::string& name)
mItems.push_back(name); mItems.push_back(name);
} }
void MWList::addSeparator()
{
mItems.push_back("");
}
void MWList::adjustSize() void MWList::adjustSize()
{ {
redraw(); redraw();
@ -49,6 +54,8 @@ void MWList::redraw(bool scrollbarShown)
mItemHeight = 0; mItemHeight = 0;
for (std::vector<std::string>::const_iterator it=mItems.begin(); for (std::vector<std::string>::const_iterator it=mItems.begin();
it!=mItems.end(); ++it) it!=mItems.end(); ++it)
{
if (*it != "")
{ {
MyGUI::Button* button = mScrollView->createWidget<MyGUI::Button>( MyGUI::Button* button = mScrollView->createWidget<MyGUI::Button>(
"MW_ListLine", MyGUI::IntCoord(0, mItemHeight, mScrollView->getSize().width - scrollBarWidth - 2, 24), "MW_ListLine", MyGUI::IntCoord(0, mItemHeight, mScrollView->getSize().width - scrollBarWidth - 2, 24),
@ -64,6 +71,16 @@ void MWList::redraw(bool scrollbarShown)
mItemHeight += height + spacing; mItemHeight += height + spacing;
} }
else
{
MyGUI::ImageBox* separator = mScrollView->createWidget<MyGUI::ImageBox>("MW_HLine",
MyGUI::IntCoord(2, mItemHeight, mScrollView->getWidth()-4, 18),
MyGUI::Align::Left | MyGUI::Align::Top | MyGUI::Align::HStretch);
separator->setNeedMouseFocus(false);
mItemHeight += 18 + spacing;
}
}
mScrollView->setCanvasSize(mClient->getSize().width + (_scrollBarWidth-scrollBarWidth), std::max(mItemHeight, mClient->getSize().height)); mScrollView->setCanvasSize(mClient->getSize().width + (_scrollBarWidth-scrollBarWidth), std::max(mItemHeight, mClient->getSize().height));
if (!scrollbarShown && mItemHeight > mClient->getSize().height) if (!scrollbarShown && mItemHeight > mClient->getSize().height)

View file

@ -31,10 +31,11 @@ namespace MWGui
void adjustSize(); void adjustSize();
void addItem(const std::string& name); void addItem(const std::string& name);
void addSeparator(); ///< add a seperator between the current and the next item.
void removeItem(const std::string& name); void removeItem(const std::string& name);
bool hasItem(const std::string& name); bool hasItem(const std::string& name);
unsigned int getItemCount(); unsigned int getItemCount();
std::string getItemNameAt(unsigned int at); std::string getItemNameAt(unsigned int at); ///< \attention if there are separators, this method will return "" at the place where the separator is
void clear(); void clear();
protected: protected: