diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
commit | 6352e8e3196f78388b6c771073f9e03eaa612673 (patch) | |
tree | e23772f79a7fbc41bc9108951e9e136857484bf4 /source/frontend/StarQuestTracker.cpp | |
parent | 6741a057e5639280d85d0f88ba26f000baa58f61 (diff) |
everything everywhere
all at once
Diffstat (limited to 'source/frontend/StarQuestTracker.cpp')
-rw-r--r-- | source/frontend/StarQuestTracker.cpp | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/source/frontend/StarQuestTracker.cpp b/source/frontend/StarQuestTracker.cpp new file mode 100644 index 0000000..cb603b4 --- /dev/null +++ b/source/frontend/StarQuestTracker.cpp @@ -0,0 +1,186 @@ +#include "StarQuestTracker.hpp" +#include "StarMathCommon.hpp" +#include "StarRoot.hpp" +#include "StarAssets.hpp" +#include "StarGuiReader.hpp" +#include "StarLabelWidget.hpp" +#include "StarImageWidget.hpp" +#include "StarImageStretchWidget.hpp" +#include "StarProgressWidget.hpp" +#include "StarVerticalLayout.hpp" +#include "StarQuests.hpp" +#include "StarLogging.hpp" + +namespace Star { + +QuestTrackerPane::QuestTrackerPane() { + auto assets = Root::singleton().assets(); + auto config = assets->json("/interface/questtracker/questtracker.config"); + + m_progressFrameImage = config.getString("progressFrameImage"); + m_expandedProgressFrameImage = config.getString("expandedProgressFrameImage"); + + m_compassFrameImage = config.getString("compassFrameImage"); + m_expandedCompassFrameImage = config.getString("expandedCompassFrameImage"); + + m_incompleteObjectiveTemplate = config.getString("incompleteObjectiveTemplate"); + m_completeObjectiveTemplate = config.getString("completeObjectiveTemplate"); + + m_expandedFrameMinHeight = config.getInt("expandedFrameMinHeight"); + m_expandedFramePadding = config.getInt("expandedFramePadding"); + + m_compassDirection = 0; + m_compassSpeed = 0; + m_compassAcceleration = config.getFloat("compassAcceleration"); + m_compassFriction = config.getFloat("compassFriction"); + + GuiReader reader; + reader.construct(config.get("paneLayout"), this); + + m_frame = fetchChild<ImageWidget>("imgFrame"); + m_expandedFrame = fetchChild<ImageStretchWidget>("imgFrameExpanded"); + + m_compassFrame = fetchChild<ImageWidget>("imgCompassFrame"); + m_compass = fetchChild<ImageWidget>("imgCompass"); + + m_questObjectiveList = fetchChild<LabelWidget>("lblQuestObjectiveList"); + + m_progress = fetchChild<ProgressWidget>("questProgress"); + m_progressFrame = fetchChild<ImageWidget>("imgProgressFrame"); + + setExpanded(false); + + // allow things like the compass and progress bar to be drawn outside the background + disableScissoring(); + m_progressFrame->disableScissoring(); +} + +bool QuestTrackerPane::sendEvent(InputEvent const& event) { + if (Pane::sendEvent(event)) + return true; + + if (event.is<MouseButtonDownEvent>() && event.get<MouseButtonDownEvent>().mouseButton == MouseButton::Left) { + auto mousePos = *context()->mousePosition(event); + if ((m_expanded && m_expandedFrame->inMember(mousePos)) || + (!m_expanded && m_frame->inMember(mousePos))) { + setExpanded(!m_expanded); + return true; + } + } + + return false; +} + +void QuestTrackerPane::update() { + if (m_currentQuest) { + if (auto objectiveList = m_currentQuest->objectiveList()) { + if (objectiveList->size() == 0) { + m_questObjectiveList->hide(); + } else { + m_questObjectiveList->show(); + if (m_expanded) { + String listText = ""; + for (auto objective : objectiveList.value()) { + if (objective.get(1).toBool()) + listText += m_completeObjectiveTemplate.replaceTags(StringMap<String>{{"objective", objective.get(0).toString()}}); + else + listText += m_incompleteObjectiveTemplate.replaceTags(StringMap<String>{{"objective", objective.get(0).toString()}}); + } + m_questObjectiveList->setText(listText); + } else { + String displayObjective = ""; + for (auto objective : objectiveList.value()) { + if (displayObjective.empty() || !objective.get(1).toBool()) { + if (objective.get(1).toBool()) { + displayObjective = m_completeObjectiveTemplate.replaceTags(StringMap<String>{{"objective", objective.get(0).toString()}}); + } else { + displayObjective = m_incompleteObjectiveTemplate.replaceTags(StringMap<String>{{"objective", objective.get(0).toString()}}); + break; + } + } + } + m_questObjectiveList->setText(displayObjective); + } + } + } else { + m_questObjectiveList->hide(); + m_questObjectiveList->setText(""); + } + + if (m_expanded) { + m_expandedFrame->show(); + m_frame->hide(); + + int frameHeight = max(m_expandedFrameMinHeight, m_questObjectiveList->size()[1] + m_expandedFramePadding * 2); + m_expandedFrame->setSize(Vec2I(m_expandedFrame->size()[0], frameHeight)); + m_expandedFrame->setPosition(Vec2I(m_expandedFrame->relativePosition()[0], -frameHeight)); + } else { + m_frame->show(); + m_expandedFrame->hide(); + } + + if (auto progress = m_currentQuest->progress()) { + m_progress->show(); + m_progressFrame->show(); + + if (m_expanded) { + m_progressFrame->setImage(m_expandedProgressFrameImage); + + m_progress->setDrawingOffset(Vec2I(0, -m_expandedFrame->size()[1])); + m_progressFrame->setDrawingOffset(Vec2I(0, -m_expandedFrame->size()[1])); + } else { + m_progressFrame->setImage(m_progressFrameImage); + + m_progress->setDrawingOffset(Vec2I(0, -m_frame->size()[1])); + m_progressFrame->setDrawingOffset(Vec2I(0, -m_frame->size()[1])); + } + + m_progress->setCurrentProgressLevel(*progress); + } else { + m_progress->hide(); + m_progressFrame->hide(); + } + + if (auto compassDirection = m_currentQuest->compassDirection()) { + m_compass->show(); + m_compassFrame->show(); + + if (m_expanded || m_currentQuest->progress()) + m_compassFrame->setImage(m_expandedCompassFrameImage); + else + m_compassFrame->setImage(m_compassFrameImage); + + float compassDiff = pfmod(*compassDirection - m_compassDirection, (float)Constants::pi * 2); + if (abs(compassDiff) < m_compassAcceleration && abs(m_compassSpeed) < m_compassAcceleration) { + m_compassSpeed = 0; + m_compassDirection = *compassDirection; + } else { + if (abs(compassDiff) > Constants::pi) + compassDiff -= copysign(2 * Constants::pi, compassDiff); + float diffRatio = abs(compassDiff) / Constants::pi; + float speedChange = m_compassAcceleration * diffRatio; + + m_compassSpeed += copysign(speedChange, compassDiff); + m_compassSpeed -= m_compassSpeed * m_compassFriction; + m_compassDirection += m_compassSpeed; + } + + m_compass->setRotation(m_compassDirection); + } else { + m_compass->hide(); + m_compassFrame->hide(); + } + } + + Pane::update(); +} + +void QuestTrackerPane::setQuest(QuestPtr const& quest) { + m_currentQuest = quest; +} + +void QuestTrackerPane::setExpanded(bool expanded) { + m_expanded = expanded; +} + +} |