summaryrefslogtreecommitdiff
path: root/src/gui/questswindow.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2013-09-30 14:03:48 +0300
committerAndrei Karas <akaras@inbox.ru>2013-09-30 14:03:48 +0300
commit25d77892d72d455f8a89372687db45aefbc61cec (patch)
treede03cb1af09eebf6db853a6585b953884bcca3b2 /src/gui/questswindow.cpp
parent05c22dd1a69fe90da67188c74a6995ee3747e937 (diff)
downloadmanaverse-25d77892d72d455f8a89372687db45aefbc61cec.tar.gz
manaverse-25d77892d72d455f8a89372687db45aefbc61cec.tar.bz2
manaverse-25d77892d72d455f8a89372687db45aefbc61cec.tar.xz
manaverse-25d77892d72d455f8a89372687db45aefbc61cec.zip
move windows classes to windows directory.
Diffstat (limited to 'src/gui/questswindow.cpp')
-rw-r--r--src/gui/questswindow.cpp567
1 files changed, 0 insertions, 567 deletions
diff --git a/src/gui/questswindow.cpp b/src/gui/questswindow.cpp
deleted file mode 100644
index e77d2bbd7..000000000
--- a/src/gui/questswindow.cpp
+++ /dev/null
@@ -1,567 +0,0 @@
-/*
- * The ManaPlus Client
- * Copyright (C) 2012-2013 The ManaPlus developers
- *
- * This file is part of The ManaPlus Client.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "gui/questswindow.h"
-
-#include "actorspritemanager.h"
-#include "configuration.h"
-#include "effectmanager.h"
-
-#include "being/localplayer.h"
-
-#include "gui/gui.h"
-#include "gui/sdlfont.h"
-
-#include "gui/widgets/browserbox.h"
-#include "gui/widgets/button.h"
-#include "gui/widgets/layout.h"
-#include "gui/widgets/extendedlistbox.h"
-#include "gui/widgets/extendednamesmodel.h"
-#include "gui/widgets/itemlinkhandler.h"
-#include "gui/widgets/scrollarea.h"
-
-#include "utils/dtor.h"
-#include "utils/gettext.h"
-
-#include "utils/translation/podict.h"
-
-#include "debug.h"
-
-enum QuestType
-{
- QUEST_TEXT = 0,
- QUEST_NAME = 1,
- QUEST_REWARD = 2
-};
-
-struct QuestItemText final
-{
- QuestItemText(const std::string &text0, const int type0) :
- text(text0), type(type0)
- {
- }
-
- std::string text;
- int type;
-};
-
-struct QuestItem final
-{
- QuestItem() :
- var(0),
- name(),
- group(),
- incomplete(),
- complete(),
- texts(),
- completeFlag(-1),
- broken(false)
- {
- }
-
- int var;
- std::string name;
- std::string group;
- std::set<int> incomplete;
- std::set<int> complete;
- std::vector<QuestItemText> texts;
- int completeFlag;
- bool broken;
-};
-
-class QuestsModel final : public ExtendedNamesModel
-{
- public:
- QuestsModel() :
- ExtendedNamesModel()
- {
- }
-
- A_DELETE_COPY(QuestsModel)
-
- ~QuestsModel()
- { }
-};
-
-struct QuestEffect final
-{
- QuestEffect() :
- map(),
- var(0),
- id(0),
- effectId(0),
- values()
- {
- }
-
- std::string map;
- int var;
- int id;
- int effectId;
- std::set<int> values;
-};
-
-QuestsWindow::QuestsWindow() :
- // TRANSLATORS: quests window name
- Window(_("Quests"), false, nullptr, "quests.xml"),
- gcn::ActionListener(),
- mQuestsModel(new QuestsModel),
- mQuestsListBox(new ExtendedListBox(this,
- mQuestsModel, "extendedlistbox.xml")),
- mQuestScrollArea(new ScrollArea(mQuestsListBox,
- getOptionBool("showlistbackground"), "quests_list_background.xml")),
- mItemLinkHandler(new ItemLinkHandler),
- mText(new BrowserBox(this, BrowserBox::AUTO_WRAP)),
- mTextScrollArea(new ScrollArea(mText,
- getOptionBool("showtextbackground"), "quests_text_background.xml")),
- // TRANSLATORS: quests window button
- mCloseButton(new Button(this, _("Close"), "close", this)),
- mVars(),
- mQuests(),
- mAllEffects(),
- mMapEffects(),
- mNpcEffects(),
- mQuestLinks(),
- mCompleteIcon(Theme::getImageFromThemeXml("complete_icon.xml", "")),
- mIncompleteIcon(Theme::getImageFromThemeXml("incomplete_icon.xml", "")),
- mNewQuestEffectId(paths.getIntValue("newQuestEffectId")),
- mCompleteQuestEffectId(paths.getIntValue("completeQuestEffectId")),
- mMap(nullptr)
-{
- setWindowName("Quests");
- setResizable(true);
- setCloseButton(true);
- setStickyButtonLock(true);
- setSaveVisible(true);
-
- setDefaultSize(400, 350, ImageRect::RIGHT);
- setMinWidth(310);
- setMinHeight(220);
-
- mQuestsListBox->setActionEventId("select");
- mQuestsListBox->addActionListener(this);
-
- mQuestScrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
- mText->setOpaque(false);
- mText->setLinkHandler(mItemLinkHandler);
- mTextScrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
- mQuestsListBox->setWidth(500);
- if (gui->getNpcFont()->getHeight() < 20)
- mQuestsListBox->setRowHeight(20);
- else
- mQuestsListBox->setRowHeight(gui->getNpcFont()->getHeight());
-
- ContainerPlacer placer;
- placer = getPlacer(0, 0);
-
- placer(0, 0, mQuestScrollArea, 4, 3).setPadding(3);
- placer(4, 0, mTextScrollArea, 4, 3).setPadding(3);
- placer(7, 3, mCloseButton);
-
- Layout &layout = getLayout();
- layout.setRowHeight(0, Layout::AUTO_SET);
-
- loadWindowState();
- enableVisibleSound(true);
- loadXml();
-}
-
-QuestsWindow::~QuestsWindow()
-{
- delete mQuestsModel;
- mQuestsModel = nullptr;
-
- for (std::map<int, std::vector<QuestItem*> >::iterator it
- = mQuests.begin(), it_end = mQuests.end(); it != it_end; ++ it)
- {
- std::vector<QuestItem*> &quests = (*it).second;
- for (std::vector<QuestItem*>::iterator it2 = quests.begin(),
- it2_end = quests.end(); it2 != it2_end; ++ it2)
- {
- delete *it2;
- }
- }
- delete_all(mAllEffects);
- mAllEffects.clear();
-
- delete mItemLinkHandler;
- mItemLinkHandler = nullptr;
- mQuests.clear();
- mQuestLinks.clear();
- if (mCompleteIcon)
- {
- mCompleteIcon->decRef();
- mCompleteIcon = nullptr;
- }
- if (mIncompleteIcon)
- {
- mIncompleteIcon->decRef();
- mIncompleteIcon = nullptr;
- }
-}
-
-void QuestsWindow::loadXml()
-{
- XML::Document doc(paths.getStringValue("questsFile"));
- const XmlNodePtr root = doc.rootNode();
- if (!root)
- return;
-
- for_each_xml_child_node(varNode, root)
- {
- if (xmlNameEqual(varNode, "var"))
- {
- const int id = XML::getProperty(varNode, "id", 0);
- if (id < 0)
- continue;
- for_each_xml_child_node(questNode, varNode)
- {
- if (xmlNameEqual(questNode, "quest"))
- loadQuest(id, questNode);
- else if (xmlNameEqual(questNode, "effect"))
- loadEffect(id, questNode);
- }
- }
- }
-}
-
-void QuestsWindow::loadQuest(const int var, const XmlNodePtr node)
-{
- QuestItem *const quest = new QuestItem();
- // TRANSLATORS: quests window quest name
- quest->name = XML::langProperty(node, "name", _("unknown"));
- quest->group = XML::getProperty(node, "group", "");
- std::string incompleteStr = XML::getProperty(node, "incomplete", "");
- std::string completeStr = XML::getProperty(node, "complete", "");
- if (incompleteStr.empty() && completeStr.empty())
- {
- logger->log("complete flags incorrect");
- delete quest;
- return;
- }
- splitToIntSet(quest->incomplete, incompleteStr, ',');
- splitToIntSet(quest->complete, completeStr, ',');
- if (quest->incomplete.empty() && quest->complete.empty())
- {
- logger->log("complete flags incorrect");
- delete quest;
- return;
- }
- if (quest->incomplete.empty() || quest->complete.empty())
- quest->broken = true;
-
- for_each_xml_child_node(dataNode, node)
- {
- if (!xmlTypeEqual(dataNode, XML_ELEMENT_NODE))
- continue;
- const char *const data = reinterpret_cast<const char*>(
- xmlNodeGetContent(dataNode));
- if (!data)
- continue;
- std::string str = translator->getStr(data);
-
- if (xmlNameEqual(dataNode, "text"))
- quest->texts.push_back(QuestItemText(str, QUEST_TEXT));
- else if (xmlNameEqual(dataNode, "name"))
- quest->texts.push_back(QuestItemText(str, QUEST_NAME));
- else if (xmlNameEqual(dataNode, "reward"))
- quest->texts.push_back(QuestItemText(str, QUEST_REWARD));
- }
- mQuests[var].push_back(quest);
-}
-
-void QuestsWindow::loadEffect(const int var, const XmlNodePtr node)
-{
- QuestEffect *const effect = new QuestEffect;
- effect->map = XML::getProperty(node, "map", "");
- effect->id = XML::getProperty(node, "npc", -1);
- effect->effectId = XML::getProperty(node, "effect", -1);
- const std::string values = XML::getProperty(node, "value", "");
- splitToIntSet(effect->values, values, ',');
-
- if (effect->map.empty() || effect->id == -1
- || effect->effectId == -1 || values.empty())
- {
- delete effect;
- return;
- }
- effect->var = var;
- mAllEffects.push_back(effect);
-}
-
-void QuestsWindow::action(const gcn::ActionEvent &event)
-{
- const std::string &eventId = event.getId();
- if (eventId == "select")
- {
- const int id = mQuestsListBox->getSelected();
- if (id < 0)
- return;
- showQuest(mQuestLinks[id]);
- }
- else if (eventId == "close")
- {
- setVisible(false);
- }
-}
-
-void QuestsWindow::updateQuest(const int var, const int val)
-{
- mVars[var] = val;
-}
-
-void QuestsWindow::rebuild(const bool playSound)
-{
- mQuestsModel->clear();
- mQuestLinks.clear();
- StringVect &names = mQuestsModel->getNames();
- std::vector<Image*> &images = mQuestsModel->getImages();
- std::vector<QuestItem*> complete;
- std::vector<QuestItem*> incomplete;
- std::vector<QuestItem*> hidden;
- int updatedQuest = -1;
- int newCompleteStatus = -1;
-
- for (std::map<int, int>::const_iterator it = mVars.begin(),
- it_end = mVars.end(); it != it_end; ++ it)
- {
- const int var = (*it).first;
- const int val = (*it).second;
- const std::vector<QuestItem*> &quests = mQuests[var];
- FOR_EACH (std::vector<QuestItem*>::const_iterator, it2, quests)
- {
- if (!*it2)
- continue;
- QuestItem *const quest = *it2;
- // complete quest
- if (quest->complete.find(val) != quest->complete.end())
- complete.push_back(quest);
- // incomplete quest
- else if (quest->incomplete.find(val) != quest->incomplete.end())
- incomplete.push_back(quest);
- // hidden quest
- else
- hidden.push_back(quest);
- }
- }
-
- int k = 0;
-
- for (std::vector<QuestItem*>::const_iterator it = complete.begin(),
- it_end = complete.end(); it != it_end; ++ it, k ++)
- {
- QuestItem *const quest = *it;
- if (quest->completeFlag == 0 || (quest->broken
- && quest->completeFlag == -1))
- {
- updatedQuest = k;
- newCompleteStatus = 1;
- }
- quest->completeFlag = 1;
- mQuestLinks.push_back(quest);
- names.push_back(quest->name);
- if (mCompleteIcon)
- {
- mCompleteIcon->incRef();
- images.push_back(mCompleteIcon);
- }
- else
- {
- images.push_back(nullptr);
- }
- }
-
- for (std::vector<QuestItem*>::const_iterator it = incomplete.begin(),
- it_end = incomplete.end(); it != it_end; ++ it, k ++)
- {
- QuestItem *const quest = *it;
- if (quest->completeFlag == -1)
- {
- updatedQuest = k;
- newCompleteStatus = 0;
- }
- quest->completeFlag = 0;
- mQuestLinks.push_back(quest);
- names.push_back(quest->name);
- if (mIncompleteIcon)
- {
- mIncompleteIcon->incRef();
- images.push_back(mIncompleteIcon);
- }
- else
- {
- images.push_back(nullptr);
- }
- }
-
- FOR_EACH (std::vector<QuestItem*>::const_iterator, it, hidden)
- (*it)->completeFlag = -1;
-
- if (updatedQuest == -1 || updatedQuest >= static_cast<int>(
- mQuestLinks.size()))
- {
- updatedQuest = static_cast<int>(mQuestLinks.size() - 1);
- }
- if (updatedQuest >= 0)
- {
- mQuestsListBox->setSelected(updatedQuest);
- showQuest(mQuestLinks[updatedQuest]);
- if (playSound && effectManager)
- {
- switch (newCompleteStatus)
- {
- case 0:
- effectManager->trigger(mNewQuestEffectId, player_node);
- break;
- case 1:
- effectManager->trigger(mCompleteQuestEffectId,
- player_node);
- break;
- default:
- break;
- }
- }
- }
- updateEffects();
-}
-
-void QuestsWindow::showQuest(const QuestItem *const quest)
-{
- if (!quest || !translator)
- return;
-
- const std::vector<QuestItemText> &texts = quest->texts;
- mText->clearRows();
- FOR_EACH (std::vector<QuestItemText>::const_iterator, it, texts)
- {
- const QuestItemText &data = *it;
- switch (data.type)
- {
- case QUEST_TEXT:
- case QUEST_REWARD:
- default:
- mText->addRow(translator->getStr(data.text));
- break;
- case QUEST_NAME:
- mText->addRow(std::string("[").append(translator->getStr(
- data.text)).append("]"));
- break;
- }
- }
-}
-
-void QuestsWindow::setMap(const Map *const map)
-{
- if (mMap != map)
- {
- mMap = map;
- mMapEffects.clear();
- if (!mMap)
- return;
-
- const std::string name = mMap->getProperty("shortName");
- FOR_EACH (std::vector<QuestEffect*>::const_iterator, it, mAllEffects)
- {
- const QuestEffect *const effect = *it;
- if (effect && name == effect->map)
- mMapEffects.push_back(effect);
- }
- updateEffects();
- }
-}
-
-void QuestsWindow::updateEffects()
-{
- NpcQuestEffectMap oldNpc = mNpcEffects;
- mNpcEffects.clear();
-
- FOR_EACH (std::vector<const QuestEffect*>::const_iterator,
- it, mMapEffects)
- {
- const QuestEffect *const effect = *it;
- if (effect)
- {
- const std::map<int, int>::const_iterator
- varIt = mVars.find(effect->var);
- if (varIt != mVars.end())
- {
- const std::set<int> &vals = effect->values;
- if (vals.find(mVars[effect->var]) != vals.end())
- mNpcEffects[effect->id] = effect;
- }
- }
- }
- if (!actorSpriteManager)
- return;
-
- std::set<int> removeEffects;
- std::map<int, int> addEffects;
-
- // for old effects
- FOR_EACH (NpcQuestEffectMapCIter, it, oldNpc)
- {
- const int id = (*it).first;
- const QuestEffect *const effect = (*it).second;
-
- const NpcQuestEffectMapCIter itNew = mNpcEffects.find(id);
- if (itNew == mNpcEffects.end())
- { // in new list no effect for this npc
- removeEffects.insert(id);
- }
- else
- { // in new list exists effect for this npc
- const QuestEffect *const newEffect = (*itNew).second;
- if (effect != newEffect)
- { // new effects is not equal to old effect
- addEffects[id] = newEffect->effectId;
- removeEffects.insert(id);
- }
- }
- }
-
- // for new effects
- FOR_EACH (NpcQuestEffectMapCIter, it, mNpcEffects)
- {
- const int id = (*it).first;
- const QuestEffect *const effect = (*it).second;
-
- const NpcQuestEffectMapCIter itNew = oldNpc.find(id);
- // check if old effect was not present
- if (itNew == oldNpc.end())
- addEffects[id] = effect->effectId;
- }
- if (!removeEffects.empty() || !addEffects.empty())
- actorSpriteManager->updateEffects(addEffects, removeEffects);
-}
-
-void QuestsWindow::addEffect(Being *const being)
-{
- if (!being)
- return;
- const int id = being->getSubType();
- const std::map<int, const QuestEffect*>::const_iterator
- it = mNpcEffects.find(id);
- if (it != mNpcEffects.end())
- {
- const QuestEffect *const effect = (*it).second;
- if (effect)
- being->addSpecialEffect(effect->effectId);
- }
-}