mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 18:19:55 +00:00
Merge branch 'master' of https://github.com/zinnschlag/openmw into dynamic_sizing
This commit is contained in:
commit
fde69d0c87
19 changed files with 398 additions and 52 deletions
|
@ -630,33 +630,35 @@ if (APPLE)
|
|||
include(CPack)
|
||||
endif (APPLE)
|
||||
|
||||
## Linux building
|
||||
# paths
|
||||
set(BINDIR "${CMAKE_INSTALL_PREFIX}/usr/bin" CACHE PATH "Where to install binaries")
|
||||
set(DATAROOTDIR "${CMAKE_INSTALL_PREFIX}/share" CACHE PATH "Sets the root of data directories to a non-default location")
|
||||
set(DATADIR "${DATAROOTDIR}/openmw" CACHE PATH "Sets the openmw data directories to a non-default location")
|
||||
set(DOCDIR "${DATAROOTDIR}/doc/openmw" CACHE PATH "Sets the doc directory to a non-default location.")
|
||||
set(MANDIR "${DATAROOTDIR}/man" CACHE PATH "Where to install manpages")
|
||||
set(SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc/openmw" CACHE PATH "Set config dir")
|
||||
set(ICONDIR "${DATAROOTDIR}/pixmaps" CACHE PATH "Set icon dir")
|
||||
if (NOT WIN32)
|
||||
## Linux building
|
||||
# paths
|
||||
set(BINDIR "${CMAKE_INSTALL_PREFIX}/usr/bin" CACHE PATH "Where to install binaries")
|
||||
set(DATAROOTDIR "${CMAKE_INSTALL_PREFIX}/share" CACHE PATH "Sets the root of data directories to a non-default location")
|
||||
set(DATADIR "${DATAROOTDIR}/openmw" CACHE PATH "Sets the openmw data directories to a non-default location")
|
||||
set(DOCDIR "${DATAROOTDIR}/doc/openmw" CACHE PATH "Sets the doc directory to a non-default location.")
|
||||
set(MANDIR "${DATAROOTDIR}/man" CACHE PATH "Where to install manpages")
|
||||
set(SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc/openmw" CACHE PATH "Set config dir")
|
||||
set(ICONDIR "${DATAROOTDIR}/pixmaps" CACHE PATH "Set icon dir")
|
||||
|
||||
# Install binaries
|
||||
INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/openmw" DESTINATION "${BINDIR}" )
|
||||
INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/omwlauncher" DESTINATION "${BINDIR}" )
|
||||
INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/esmtool" DESTINATION "${BINDIR}" )
|
||||
INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/mwiniimport" DESTINATION "${BINDIR}" )
|
||||
# Install binaries
|
||||
INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/openmw" DESTINATION "${BINDIR}" )
|
||||
INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/omwlauncher" DESTINATION "${BINDIR}" )
|
||||
INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/esmtool" DESTINATION "${BINDIR}" )
|
||||
INSTALL(PROGRAMS "${OpenMW_BINARY_DIR}/mwiniimport" DESTINATION "${BINDIR}" )
|
||||
|
||||
# Install icon and .desktop
|
||||
INSTALL(FILES "${OpenMW_SOURCE_DIR}/apps/launcher/resources/images/openmw.png" DESTINATION "${ICONDIR}")
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.desktop" DESTINATION "${DATAROOTDIR}/applications")
|
||||
# Install icon and .desktop
|
||||
INSTALL(FILES "${OpenMW_SOURCE_DIR}/apps/launcher/resources/images/openmw.png" DESTINATION "${ICONDIR}")
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.desktop" DESTINATION "${DATAROOTDIR}/applications")
|
||||
|
||||
# Install global configuration files
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.cfg.install" DESTINATION "${SYSCONFDIR}" RENAME "openmw.cfg" )
|
||||
#INSTALL(FILES "${OpenMW_BINARY_DIR}/plugins.cfg" DESTINATION "${SYSCONFDIR}" )
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/settings-default.cfg" DESTINATION "${SYSCONFDIR}" )
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/transparency-overrides.cfg" DESTINATION "${SYSCONFDIR}" )
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/launcher.cfg" DESTINATION "${SYSCONFDIR}" )
|
||||
# Install global configuration files
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.cfg.install" DESTINATION "${SYSCONFDIR}" RENAME "openmw.cfg" )
|
||||
#INSTALL(FILES "${OpenMW_BINARY_DIR}/plugins.cfg" DESTINATION "${SYSCONFDIR}" )
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/settings-default.cfg" DESTINATION "${SYSCONFDIR}" )
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/transparency-overrides.cfg" DESTINATION "${SYSCONFDIR}" )
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/launcher.cfg" DESTINATION "${SYSCONFDIR}" )
|
||||
|
||||
# Install resources
|
||||
INSTALL(DIRECTORY "${OpenMW_BINARY_DIR}/resources" DESTINATION "${DATADIR}" )
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/launcher.qss" DESTINATION "${DATADIR}/resources" )
|
||||
# Install resources
|
||||
INSTALL(DIRECTORY "${OpenMW_BINARY_DIR}/resources" DESTINATION "${DATADIR}" )
|
||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/launcher.qss" DESTINATION "${DATADIR}/resources" )
|
||||
endif(NOT WIN32)
|
|
@ -29,7 +29,7 @@ add_openmw_dir (mwgui
|
|||
map_window window_pinnable_base cursorreplace tooltips scrollwindow bookwindow list
|
||||
formatting inventorywindow container hud countdialog tradewindow settingswindow
|
||||
confirmationdialog alchemywindow referenceinterface spellwindow mainmenu quickkeysmenu
|
||||
itemselection
|
||||
itemselection spellbuyingwindow
|
||||
)
|
||||
|
||||
add_openmw_dir (mwdialogue
|
||||
|
|
|
@ -42,6 +42,7 @@ namespace MWGui
|
|||
class Console;
|
||||
class SpellWindow;
|
||||
class TradeWindow;
|
||||
class SpellBuyingWindow;
|
||||
class ConfirmationDialog;
|
||||
class CountDialog;
|
||||
class ScrollWindow;
|
||||
|
@ -106,6 +107,7 @@ namespace MWBase
|
|||
virtual MWGui::CountDialog* getCountDialog() = 0;
|
||||
virtual MWGui::ConfirmationDialog* getConfirmationDialog() = 0;
|
||||
virtual MWGui::TradeWindow* getTradeWindow() = 0;
|
||||
virtual MWGui::SpellBuyingWindow* getSpellBuyingWindow() = 0;
|
||||
virtual MWGui::SpellWindow* getSpellWindow() = 0;
|
||||
virtual MWGui::Console* getConsole() = 0;
|
||||
|
||||
|
|
|
@ -66,6 +66,11 @@ namespace MWClass
|
|||
data->mCreatureStats.setFlee(ref->base->mAiData.mFlee);
|
||||
data->mCreatureStats.setAlarm(ref->base->mAiData.mAlarm);
|
||||
|
||||
// spells
|
||||
for (std::vector<std::string>::const_iterator iter (ref->base->mSpells.list.begin());
|
||||
iter!=ref->base->mSpells.list.end(); ++iter)
|
||||
data->mCreatureStats.getSpells().add (*iter);
|
||||
|
||||
// store
|
||||
ptr.getRefData().setCustomData (data.release());
|
||||
}
|
||||
|
|
|
@ -105,6 +105,11 @@ namespace MWClass
|
|||
data->mCreatureStats.setFlee(ref->base->mAiData.mFlee);
|
||||
data->mCreatureStats.setAlarm(ref->base->mAiData.mAlarm);
|
||||
|
||||
// spells
|
||||
for (std::vector<std::string>::const_iterator iter (ref->base->spells.list.begin());
|
||||
iter!=ref->base->spells.list.end(); ++iter)
|
||||
data->mCreatureStats.getSpells().add (*iter);
|
||||
|
||||
// store
|
||||
ptr.getRefData().setCustomData (data.release());
|
||||
}
|
||||
|
|
|
@ -794,6 +794,11 @@ namespace MWDialogue
|
|||
else
|
||||
win->setShowTrade(false);
|
||||
|
||||
if (services & ESM::NPC::Spells)
|
||||
win->setShowSpells(true);
|
||||
else
|
||||
win->setShowSpells(false);
|
||||
|
||||
// sort again, because the previous sort was case-sensitive
|
||||
keywordList.sort(stringCompareNoCase);
|
||||
win->setKeywords(keywordList);
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "widgets.hpp"
|
||||
#include "list.hpp"
|
||||
#include "tradewindow.hpp"
|
||||
#include "spellbuyingwindow.hpp"
|
||||
#include "inventorywindow.hpp"
|
||||
|
||||
using namespace MWGui;
|
||||
|
@ -46,6 +47,7 @@ DialogueWindow::DialogueWindow(MWBase::WindowManager& parWindowManager)
|
|||
: WindowBase("openmw_dialogue_window.layout", parWindowManager)
|
||||
, mEnabled(true)
|
||||
, mShowTrade(false)
|
||||
, mShowSpells(false)
|
||||
{
|
||||
// Centre dialog
|
||||
center();
|
||||
|
@ -127,6 +129,11 @@ void DialogueWindow::onSelectTopic(std::string topic)
|
|||
mWindowManager.pushGuiMode(GM_Barter);
|
||||
mWindowManager.getTradeWindow()->startTrade(mPtr);
|
||||
}
|
||||
else if (topic == MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sSpells")->str)
|
||||
{
|
||||
mWindowManager.pushGuiMode(GM_SpellBuying);
|
||||
mWindowManager.getSpellBuyingWindow()->startSpellBuying(mPtr);
|
||||
}
|
||||
|
||||
else
|
||||
MWBase::Environment::get().getDialogueManager()->keywordSelected(lower_string(topic));
|
||||
|
@ -148,11 +155,14 @@ void DialogueWindow::setKeywords(std::list<std::string> keyWords)
|
|||
{
|
||||
mTopicsList->clear();
|
||||
|
||||
bool anyService = mShowTrade;
|
||||
bool anyService = mShowTrade||mShowSpells;
|
||||
|
||||
if (mShowTrade)
|
||||
mTopicsList->addItem(MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sBarter")->str);
|
||||
|
||||
if (mShowSpells)
|
||||
mTopicsList->addItem(MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sSpells")->str);
|
||||
|
||||
if (anyService)
|
||||
mTopicsList->addSeparator();
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@ namespace MWGui
|
|||
// 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; }
|
||||
void setShowSpells(bool show) { mShowSpells = show; }
|
||||
|
||||
protected:
|
||||
void onSelectTopic(std::string topic);
|
||||
|
@ -70,6 +71,7 @@ namespace MWGui
|
|||
|
||||
// various service button visibilities, depending if the npc/creature talked to has these services
|
||||
bool mShowTrade;
|
||||
bool mShowSpells;
|
||||
|
||||
bool mEnabled;
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ namespace MWGui
|
|||
GM_Dialogue, // NPC interaction
|
||||
GM_Barter,
|
||||
GM_Rest,
|
||||
GM_SpellBuying,
|
||||
|
||||
// Startup character creation dialogs
|
||||
GM_Name,
|
||||
|
|
192
apps/openmw/mwgui/spellbuyingwindow.cpp
Normal file
192
apps/openmw/mwgui/spellbuyingwindow.cpp
Normal file
|
@ -0,0 +1,192 @@
|
|||
#include "spellbuyingwindow.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
#include "../mwbase/environment.hpp"
|
||||
#include "../mwbase/world.hpp"
|
||||
#include "../mwbase/soundmanager.hpp"
|
||||
#include "../mwbase/windowmanager.hpp"
|
||||
|
||||
#include "../mwworld/player.hpp"
|
||||
#include "../mwworld/manualref.hpp"
|
||||
|
||||
#include "../mwmechanics/spells.hpp"
|
||||
#include "../mwmechanics/creaturestats.hpp"
|
||||
|
||||
#include "inventorywindow.hpp"
|
||||
#include "tradewindow.hpp"
|
||||
|
||||
namespace MWGui
|
||||
{
|
||||
const int SpellBuyingWindow::sLineHeight = 18;
|
||||
|
||||
SpellBuyingWindow::SpellBuyingWindow(MWBase::WindowManager& parWindowManager) :
|
||||
WindowBase("openmw_spell_buying_window.layout", parWindowManager)
|
||||
, ContainerBase(NULL) // no drag&drop
|
||||
, mCurrentY(0)
|
||||
, mLastPos(0)
|
||||
{
|
||||
setCoord(0, 0, 450, 300);
|
||||
|
||||
getWidget(mCancelButton, "CancelButton");
|
||||
getWidget(mPlayerGold, "PlayerGold");
|
||||
getWidget(mSelect, "Select");
|
||||
getWidget(mSpells, "Spells");
|
||||
getWidget(mSpellsBoxWidget, "SpellsBox");
|
||||
getWidget(mSpellsClientWidget, "SpellsClient");
|
||||
getWidget(mSpellsScrollerWidget, "SpellsScroller");
|
||||
|
||||
mSpellsClientWidget->eventMouseWheel += MyGUI::newDelegate(this, &SpellBuyingWindow::onMouseWheel);
|
||||
|
||||
mSpellsScrollerWidget->eventScrollChangePosition += MyGUI::newDelegate(this, &SpellBuyingWindow::onScrollChangePosition);
|
||||
|
||||
mCancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SpellBuyingWindow::onCancelButtonClicked);
|
||||
|
||||
int cancelButtonWidth = mCancelButton->getTextSize().width + 24;
|
||||
mCancelButton->setCoord(430-cancelButtonWidth,
|
||||
mCancelButton->getTop(),
|
||||
cancelButtonWidth,
|
||||
mCancelButton->getHeight());
|
||||
mSpells->setCoord(450/2-mSpells->getTextSize().width/2,
|
||||
mSpells->getTop(),
|
||||
mSpells->getTextSize().width,
|
||||
mSpells->getHeight());
|
||||
mSelect->setCoord(8,
|
||||
mSelect->getTop(),
|
||||
mSelect->getTextSize().width,
|
||||
mSelect->getHeight());
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::addSpell(const std::string& spellId)
|
||||
{
|
||||
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().spells.find(spellId);
|
||||
int price = spell->data.cost*MWBase::Environment::get().getWorld()->getStore().gameSettings.search("fSpellValueMult")->f;
|
||||
MyGUI::Button* toAdd = mSpellsClientWidget->createWidget<MyGUI::Button>((price>mWindowManager.getInventoryWindow()->getPlayerGold()) ? "SandTextGreyedOut" : "SpellText", 0, mCurrentY, 200, sLineHeight, MyGUI::Align::Default);
|
||||
mCurrentY += sLineHeight;
|
||||
/// \todo price adjustment depending on merchantile skill
|
||||
toAdd->setUserData(price);
|
||||
toAdd->setCaption(spell->name+" - "+boost::lexical_cast<std::string>(price)+MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sgp")->str);
|
||||
toAdd->setSize(toAdd->getTextSize().width,sLineHeight);
|
||||
toAdd->eventMouseWheel += MyGUI::newDelegate(this, &SpellBuyingWindow::onMouseWheel);
|
||||
toAdd->setUserString("ToolTipType", "Spell");
|
||||
toAdd->setUserString("Spell", spellId);
|
||||
toAdd->eventMouseButtonClick += MyGUI::newDelegate(this, &SpellBuyingWindow::onSpellButtonClick);
|
||||
mSpellsWidgetMap.insert(std::make_pair (toAdd, spellId));
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::clearSpells()
|
||||
{
|
||||
mSpellsScrollerWidget->setScrollPosition(0);
|
||||
onScrollChangePosition(mSpellsScrollerWidget, mSpellsScrollerWidget->getScrollPosition());
|
||||
mCurrentY = 0;
|
||||
while (mSpellsClientWidget->getChildCount())
|
||||
MyGUI::Gui::getInstance().destroyWidget(mSpellsClientWidget->getChildAt(0));
|
||||
mSpellsWidgetMap.clear();
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::startSpellBuying(const MWWorld::Ptr& actor)
|
||||
{
|
||||
center();
|
||||
mActor = actor;
|
||||
clearSpells();
|
||||
|
||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
||||
|
||||
MWMechanics::Spells& playerSpells = MWWorld::Class::get (player).getCreatureStats (player).getSpells();
|
||||
MWMechanics::Spells& merchantSpells = MWWorld::Class::get (actor).getCreatureStats (actor).getSpells();
|
||||
|
||||
for (MWMechanics::Spells::TIterator iter = merchantSpells.begin(); iter!=merchantSpells.end(); ++iter)
|
||||
{
|
||||
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().spells.find (*iter);
|
||||
|
||||
if (spell->data.type!=ESM::Spell::ST_Spell)
|
||||
continue; // don't try to sell diseases, curses or powers
|
||||
|
||||
if (std::find (playerSpells.begin(), playerSpells.end(), *iter)!=playerSpells.end())
|
||||
continue; // we have that spell already
|
||||
|
||||
addSpell (*iter);
|
||||
}
|
||||
|
||||
updateLabels();
|
||||
updateScroller();
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::onSpellButtonClick(MyGUI::Widget* _sender)
|
||||
{
|
||||
int price = *_sender->getUserData<int>();
|
||||
|
||||
if (mWindowManager.getInventoryWindow()->getPlayerGold()>=price)
|
||||
{
|
||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
||||
MWMechanics::CreatureStats& stats = MWWorld::Class::get(player).getCreatureStats(player);
|
||||
MWMechanics::Spells& spells = stats.getSpells();
|
||||
spells.add (mSpellsWidgetMap.find(_sender)->second);
|
||||
mWindowManager.getTradeWindow()->addOrRemoveGold(-price);
|
||||
mSpellsScrollerWidget->setScrollPosition(0);
|
||||
onScrollChangePosition(mSpellsScrollerWidget, mSpellsScrollerWidget->getScrollPosition());
|
||||
updateScroller();
|
||||
startSpellBuying(mActor);
|
||||
}
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::onCancelButtonClicked(MyGUI::Widget* _sender)
|
||||
{
|
||||
mWindowManager.removeGuiMode(GM_SpellBuying);
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::updateLabels()
|
||||
{
|
||||
mPlayerGold->setCaption(MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sGold")->str
|
||||
+ ": " + boost::lexical_cast<std::string>(mWindowManager.getInventoryWindow()->getPlayerGold()));
|
||||
mPlayerGold->setCoord(8,
|
||||
mPlayerGold->getTop(),
|
||||
mPlayerGold->getTextSize().width,
|
||||
mPlayerGold->getHeight());
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::onReferenceUnavailable()
|
||||
{
|
||||
// remove both Spells and Dialogue (since you always trade with the NPC/creature that you have previously talked to)
|
||||
mWindowManager.removeGuiMode(GM_SpellBuying);
|
||||
mWindowManager.removeGuiMode(GM_Dialogue);
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::updateScroller()
|
||||
{
|
||||
mSpellsScrollerWidget->setScrollRange(std::max(mCurrentY - mSpellsClientWidget->getHeight(), 0));
|
||||
mSpellsScrollerWidget->setScrollPage(std::max(mSpellsClientWidget->getHeight() - sLineHeight, 0));
|
||||
if (mCurrentY != 0)
|
||||
mSpellsScrollerWidget->setTrackSize( (mSpellsBoxWidget->getHeight() / float(mCurrentY)) * mSpellsScrollerWidget->getLineSize() );
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::onScrollChangePosition(MyGUI::ScrollBar* scroller, size_t pos)
|
||||
{
|
||||
int diff = mLastPos - pos;
|
||||
// Adjust position of all widget according to difference
|
||||
if (diff == 0)
|
||||
return;
|
||||
mLastPos = pos;
|
||||
|
||||
for (unsigned int i=0;i<mSpellsClientWidget->getChildCount();i++)
|
||||
{
|
||||
MyGUI::Widget* toMove = mSpellsClientWidget->getChildAt(i);
|
||||
toMove->setCoord(toMove->getCoord() + MyGUI::IntPoint(0, diff));
|
||||
}
|
||||
}
|
||||
|
||||
void SpellBuyingWindow::onMouseWheel(MyGUI::Widget* _sender, int _rel)
|
||||
{
|
||||
if (mSpellsScrollerWidget->getScrollPosition() - _rel*0.3 < 0)
|
||||
mSpellsScrollerWidget->setScrollPosition(0);
|
||||
else if (mSpellsScrollerWidget->getScrollPosition() - _rel*0.3 > mSpellsScrollerWidget->getScrollRange()-1)
|
||||
mSpellsScrollerWidget->setScrollPosition(mSpellsScrollerWidget->getScrollRange()-1);
|
||||
else
|
||||
mSpellsScrollerWidget->setScrollPosition(mSpellsScrollerWidget->getScrollPosition() - _rel*0.3);
|
||||
|
||||
onScrollChangePosition(mSpellsScrollerWidget, mSpellsScrollerWidget->getScrollPosition());
|
||||
}
|
||||
}
|
||||
|
60
apps/openmw/mwgui/spellbuyingwindow.hpp
Normal file
60
apps/openmw/mwgui/spellbuyingwindow.hpp
Normal file
|
@ -0,0 +1,60 @@
|
|||
#ifndef MWGUI_SpellBuyingWINDOW_H
|
||||
#define MWGUI_SpellBuyingWINDOW_H
|
||||
|
||||
#include "container.hpp"
|
||||
#include "window_base.hpp"
|
||||
|
||||
#include "../mwworld/ptr.hpp"
|
||||
|
||||
namespace MyGUI
|
||||
{
|
||||
class Gui;
|
||||
class Widget;
|
||||
}
|
||||
|
||||
namespace MWGui
|
||||
{
|
||||
class WindowManager;
|
||||
}
|
||||
|
||||
|
||||
namespace MWGui
|
||||
{
|
||||
class SpellBuyingWindow : public ContainerBase, public WindowBase
|
||||
{
|
||||
public:
|
||||
SpellBuyingWindow(MWBase::WindowManager& parWindowManager);
|
||||
|
||||
void startSpellBuying(const MWWorld::Ptr& actor);
|
||||
|
||||
protected:
|
||||
MyGUI::Button* mCancelButton;
|
||||
MyGUI::TextBox* mPlayerGold;
|
||||
MyGUI::TextBox* mSpells;
|
||||
MyGUI::TextBox* mSelect;
|
||||
|
||||
MyGUI::WidgetPtr mSpellsBoxWidget, mSpellsClientWidget;
|
||||
MyGUI::ScrollBar* mSpellsScrollerWidget;
|
||||
|
||||
MWWorld::Ptr mActor;
|
||||
|
||||
std::map<MyGUI::Widget*, std::string> mSpellsWidgetMap;
|
||||
|
||||
void onCancelButtonClicked(MyGUI::Widget* _sender);
|
||||
void onSpellButtonClick(MyGUI::Widget* _sender);
|
||||
void updateScroller();
|
||||
void onScrollChangePosition(MyGUI::ScrollBar* scroller, size_t pos);
|
||||
void onMouseWheel(MyGUI::Widget* _sender, int _rel);
|
||||
void addSpell(const std::string& spellID);
|
||||
void clearSpells();
|
||||
int mLastPos,mCurrentY;
|
||||
|
||||
static const int sLineHeight;
|
||||
|
||||
void updateLabels();
|
||||
|
||||
virtual void onReferenceUnavailable();
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
|
@ -102,6 +102,33 @@ namespace MWGui
|
|||
drawItems();
|
||||
}
|
||||
|
||||
void TradeWindow::addOrRemoveGold(int amount)
|
||||
{
|
||||
bool goldFound = false;
|
||||
MWWorld::Ptr gold;
|
||||
MWWorld::ContainerStore& playerStore = mWindowManager.getInventoryWindow()->getContainerStore();
|
||||
for (MWWorld::ContainerStoreIterator it = playerStore.begin();
|
||||
it != playerStore.end(); ++it)
|
||||
{
|
||||
if (MWWorld::Class::get(*it).getName(*it) == MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sGold")->str)
|
||||
{
|
||||
goldFound = true;
|
||||
gold = *it;
|
||||
}
|
||||
}
|
||||
if (goldFound)
|
||||
{
|
||||
gold.getRefData().setCount(gold.getRefData().getCount() + amount);
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(amount > 0);
|
||||
MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(), "Gold_001");
|
||||
ref.getPtr().getRefData().setCount(amount);
|
||||
playerStore.add(ref.getPtr());
|
||||
}
|
||||
}
|
||||
|
||||
void TradeWindow::onOfferButtonClicked(MyGUI::Widget* _sender)
|
||||
{
|
||||
// were there any items traded at all?
|
||||
|
@ -152,29 +179,7 @@ namespace MWGui
|
|||
mWindowManager.getInventoryWindow()->transferBoughtItems();
|
||||
|
||||
// add or remove gold from the player.
|
||||
bool goldFound = false;
|
||||
MWWorld::Ptr gold;
|
||||
MWWorld::ContainerStore& playerStore = mWindowManager.getInventoryWindow()->getContainerStore();
|
||||
for (MWWorld::ContainerStoreIterator it = playerStore.begin();
|
||||
it != playerStore.end(); ++it)
|
||||
{
|
||||
if (MWWorld::Class::get(*it).getName(*it) == MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sGold")->str)
|
||||
{
|
||||
goldFound = true;
|
||||
gold = *it;
|
||||
}
|
||||
}
|
||||
if (goldFound)
|
||||
{
|
||||
gold.getRefData().setCount(gold.getRefData().getCount() + mCurrentBalance);
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(mCurrentBalance > 0);
|
||||
MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(), "Gold_001");
|
||||
ref.getPtr().getRefData().setCount(mCurrentBalance);
|
||||
playerStore.add(ref.getPtr());
|
||||
}
|
||||
addOrRemoveGold(mCurrentBalance);
|
||||
|
||||
std::string sound = "Item Gold Up";
|
||||
MWBase::Environment::get().getSoundManager()->playSound (sound, 1.0, 1.0);
|
||||
|
|
|
@ -32,6 +32,8 @@ namespace MWGui
|
|||
|
||||
bool npcAcceptsItem(MWWorld::Ptr item);
|
||||
|
||||
void addOrRemoveGold(int gold);
|
||||
|
||||
protected:
|
||||
MyGUI::Button* mFilterAll;
|
||||
MyGUI::Button* mFilterWeapon;
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "mainmenu.hpp"
|
||||
#include "countdialog.hpp"
|
||||
#include "tradewindow.hpp"
|
||||
#include "spellbuyingwindow.hpp"
|
||||
#include "settingswindow.hpp"
|
||||
#include "confirmationdialog.hpp"
|
||||
#include "alchemywindow.hpp"
|
||||
|
@ -61,6 +62,7 @@ WindowManager::WindowManager(
|
|||
, mScrollWindow(NULL)
|
||||
, mCountDialog(NULL)
|
||||
, mTradeWindow(NULL)
|
||||
, mSpellBuyingWindow(NULL)
|
||||
, mSettingsWindow(NULL)
|
||||
, mConfirmationDialog(NULL)
|
||||
, mAlchemyWindow(NULL)
|
||||
|
@ -130,6 +132,7 @@ WindowManager::WindowManager(
|
|||
mMessageBoxManager = new MessageBoxManager(this);
|
||||
mInventoryWindow = new InventoryWindow(*this,mDragAndDrop);
|
||||
mTradeWindow = new TradeWindow(*this);
|
||||
mSpellBuyingWindow = new SpellBuyingWindow(*this);
|
||||
mDialogueWindow = new DialogueWindow(*this);
|
||||
mContainerWindow = new ContainerWindow(*this,mDragAndDrop);
|
||||
mHud = new HUD(w,h, mShowFPSLevel, mDragAndDrop);
|
||||
|
@ -186,6 +189,7 @@ WindowManager::~WindowManager()
|
|||
delete mBookWindow;
|
||||
delete mScrollWindow;
|
||||
delete mTradeWindow;
|
||||
delete mSpellBuyingWindow;
|
||||
delete mSettingsWindow;
|
||||
delete mConfirmationDialog;
|
||||
delete mAlchemyWindow;
|
||||
|
@ -232,6 +236,7 @@ void WindowManager::updateVisible()
|
|||
mScrollWindow->setVisible(false);
|
||||
mBookWindow->setVisible(false);
|
||||
mTradeWindow->setVisible(false);
|
||||
mSpellBuyingWindow->setVisible(false);
|
||||
mSettingsWindow->setVisible(false);
|
||||
mAlchemyWindow->setVisible(false);
|
||||
mSpellWindow->setVisible(false);
|
||||
|
@ -321,6 +326,9 @@ void WindowManager::updateVisible()
|
|||
mInventoryWindow->setVisible(true);
|
||||
mTradeWindow->setVisible(true);
|
||||
break;
|
||||
case GM_SpellBuying:
|
||||
mSpellBuyingWindow->setVisible(true);
|
||||
break;
|
||||
case GM_InterMessageBox:
|
||||
break;
|
||||
case GM_Journal:
|
||||
|
@ -513,6 +521,7 @@ void WindowManager::onFrame (float frameDuration)
|
|||
|
||||
mDialogueWindow->checkReferenceAvailable();
|
||||
mTradeWindow->checkReferenceAvailable();
|
||||
mSpellBuyingWindow->checkReferenceAvailable();
|
||||
mContainerWindow->checkReferenceAvailable();
|
||||
mConsole->checkReferenceAvailable();
|
||||
}
|
||||
|
@ -790,6 +799,7 @@ MWGui::ScrollWindow* WindowManager::getScrollWindow() { return mScrollWindow; }
|
|||
MWGui::CountDialog* WindowManager::getCountDialog() { return mCountDialog; }
|
||||
MWGui::ConfirmationDialog* WindowManager::getConfirmationDialog() { return mConfirmationDialog; }
|
||||
MWGui::TradeWindow* WindowManager::getTradeWindow() { return mTradeWindow; }
|
||||
MWGui::SpellBuyingWindow* WindowManager::getSpellBuyingWindow() { return mSpellBuyingWindow; }
|
||||
MWGui::SpellWindow* WindowManager::getSpellWindow() { return mSpellWindow; }
|
||||
MWGui::Console* WindowManager::getConsole() { return mConsole; }
|
||||
|
||||
|
|
|
@ -105,6 +105,7 @@ namespace MWGui
|
|||
virtual MWGui::CountDialog* getCountDialog();
|
||||
virtual MWGui::ConfirmationDialog* getConfirmationDialog();
|
||||
virtual MWGui::TradeWindow* getTradeWindow();
|
||||
virtual MWGui::SpellBuyingWindow* getSpellBuyingWindow();
|
||||
virtual MWGui::SpellWindow* getSpellWindow();
|
||||
virtual MWGui::Console* getConsole();
|
||||
|
||||
|
@ -212,6 +213,7 @@ namespace MWGui
|
|||
BookWindow* mBookWindow;
|
||||
CountDialog* mCountDialog;
|
||||
TradeWindow* mTradeWindow;
|
||||
SpellBuyingWindow* mSpellBuyingWindow;
|
||||
SettingsWindow* mSettingsWindow;
|
||||
ConfirmationDialog* mConfirmationDialog;
|
||||
AlchemyWindow* mAlchemyWindow;
|
||||
|
|
|
@ -69,7 +69,7 @@ struct FixedPath
|
|||
* \param [in] application_name - Name of the application
|
||||
*/
|
||||
FixedPath(const std::string& application_name)
|
||||
: mPath(application_name)
|
||||
: mPath(application_name + "/")
|
||||
, mUserPath(mPath.getUserPath())
|
||||
, mGlobalPath(mPath.getGlobalPath())
|
||||
, mLocalPath(mPath.getLocalPath())
|
||||
|
|
|
@ -64,11 +64,13 @@ set(MYGUI_FILES
|
|||
openmw_text.skin.xml
|
||||
openmw_tooltips.layout
|
||||
openmw_trade_window.layout
|
||||
openmw_spell_buying_window.layout
|
||||
openmw_windows.skin.xml
|
||||
openmw_quickkeys_menu.layout
|
||||
openmw_quickkeys_menu_assign.layout
|
||||
openmw_itemselection_dialog.layout
|
||||
openmw_magicselection_dialog.layout
|
||||
openmw_spell_buying_window.layout
|
||||
smallbars.png
|
||||
VeraMono.ttf
|
||||
markers.png
|
||||
|
|
33
files/mygui/openmw_spell_buying_window.layout
Normal file
33
files/mygui/openmw_spell_buying_window.layout
Normal file
|
@ -0,0 +1,33 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<MyGUI type="Layout">
|
||||
<Widget type="Window" skin="MW_Dialog" layer="Windows" position="0 0 450 300" name="_Main">
|
||||
<Property key="Visible" value="false"/>
|
||||
|
||||
|
||||
<Widget type="TextBox" skin="SandText" position="8 10 24 24" name="Select" align="Right Top">
|
||||
<Property key="TextAlign" value="Right"/>
|
||||
<Property key="Caption" value="#{sSpellServiceTitle}"/>
|
||||
</Widget>
|
||||
<Widget type="TextBox" skin="SandText" position="0 0 24 24" name="Spells" align="Right Top">
|
||||
<Property key="TextAlign" value="Right"/>
|
||||
<Property key="Caption" value="#D8C09A#{sSpells}"/>
|
||||
</Widget>
|
||||
|
||||
|
||||
<Widget type="Widget" skin="MW_Box" position="6 31 430 225" align="ALIGN_LEFT ALIGN_STRETCH" name="SpellsBox">
|
||||
<Widget type="Widget" skin="" position="4 4 404 217" align="ALIGN_LEFT ALIGN_TOP ALIGN_STRETCH" name="SpellsClient" />
|
||||
<Widget type="ScrollBar" skin="MW_VScroll" position="412 4 14 217" align="ALIGN_RIGHT ALIGN_VSTRETCH" name="SpellsScroller" />
|
||||
</Widget>
|
||||
|
||||
|
||||
<Widget type="TextBox" skin="SandText" position="8 255 24 24" name="PlayerGold" align="Right Top">
|
||||
<Property key="TextAlign" value="Right"/>
|
||||
</Widget>
|
||||
<Widget type="Button" skin="MW_Button" position="290 260 60 24" name="CancelButton" align="Right Top">
|
||||
<Property key="Caption" value="#{sOK}"/>
|
||||
</Widget>
|
||||
|
||||
</Widget>
|
||||
|
||||
</MyGUI>
|
|
@ -17,6 +17,14 @@
|
|||
<BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/>
|
||||
</Skin>
|
||||
|
||||
<!-- HTML colour: #9A9074 -->
|
||||
<Skin name = "SandTextGreyedOut" size = "16 16">
|
||||
<Property key="FontName" value = "Default" />
|
||||
<Property key="TextAlign" value = "ALIGN_LEFT ALIGN_BOTTOM" />
|
||||
<Property key="TextColour" value = "0.6 0.56 0.45" />
|
||||
<BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/>
|
||||
</Skin>
|
||||
|
||||
<!-- HTML colour: #BF9959 -->
|
||||
<Skin name = "SandText" size = "16 16">
|
||||
<Property key="FontName" value = "Default" />
|
||||
|
|
Loading…
Reference in a new issue