Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/windowing/StarFuelWidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/windowing/StarFuelWidget.cpp')
-rw-r--r--source/windowing/StarFuelWidget.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/source/windowing/StarFuelWidget.cpp b/source/windowing/StarFuelWidget.cpp
new file mode 100644
index 0000000..4206254
--- /dev/null
+++ b/source/windowing/StarFuelWidget.cpp
@@ -0,0 +1,111 @@
+#include "StarFuelWidget.hpp"
+#include "StarInterpolation.hpp"
+#include "StarGameTypes.hpp"
+#include "StarRoot.hpp"
+#include "StarAssets.hpp"
+
+namespace Star {
+
+FuelWidget::FuelWidget() {
+ auto assets = Root::singleton().assets();
+
+ m_fontSize = assets->json("/interface.config:font.buttonSize").toInt();
+
+ m_fuelLevel = 0;
+ m_maxLevel = 0;
+ m_potential = 0;
+ m_requested = 0;
+
+ m_pingTimeout = 0;
+ disableScissoring();
+}
+
+void FuelWidget::update() {
+ m_pingTimeout -= WorldTimestep;
+ if (m_pingTimeout < 0)
+ m_pingTimeout = 0;
+}
+
+void FuelWidget::renderImpl() {
+ context()->resetInterfaceScissorRect();
+
+ Vec2F textureSize = Vec2F(context()->textureSize("/interface/fuel/fuelgauge.png"));
+ RectF entireTex = RectF::withSize({}, textureSize);
+ RectF entirePosition = RectF::withSize(Vec2F(screenPosition()), textureSize);
+ Vec2F textPosition = entirePosition.center();
+
+ float fuel = 1;
+ float fuelPotential = 1;
+ float fuelRequested = 0;
+ if (m_maxLevel > 0) {
+ fuel = std::min(1.0f, m_fuelLevel / m_maxLevel);
+ fuelPotential = std::min(1.0f, (m_fuelLevel + m_potential) / m_maxLevel);
+ fuelRequested = std::min(1.0f, m_requested / m_maxLevel);
+ fuel -= fuelRequested;
+ if (fuel < 0)
+ fuel = 0;
+ }
+
+ auto shift = [](float begin, float end, RectF templ) {
+ RectF result = templ;
+
+ result.min()[0] = lerp(begin, templ.min()[0], templ.max()[0]);
+ result.max()[0] = lerp(end, templ.min()[0], templ.max()[0]);
+
+ return result;
+ };
+
+ if (std::fmod(m_pingTimeout, 0.2f) > 0.1f)
+ context()->drawInterfaceQuad("/interface/fuel/fuelgaugebackgroundflash.png", shift(0, 1, entireTex), shift(0, 1, entirePosition));
+ else
+ context()->drawInterfaceQuad("/interface/fuel/fuelgaugebackground.png", shift(0, 1, entireTex), shift(0, 1, entirePosition));
+
+ context()->drawInterfaceQuad("/interface/fuel/fuelgaugegreen.png",
+ shift(fuel, fuelPotential, entireTex),
+ shift(fuel, fuelPotential, entirePosition));
+
+ context()->drawInterfaceQuad("/interface/fuel/fuelgaugered.png",
+ shift(fuel, fuelRequested, entireTex),
+ shift(fuel, fuelRequested, entirePosition));
+
+ context()->drawInterfaceQuad("/interface/fuel/fuelgauge.png", shift(0, fuel, entireTex), shift(0, fuel, entirePosition));
+ context()->drawInterfaceQuad("/interface/fuel/fuelgaugemarkings.png", shift(0, 1, entireTex), shift(0, 1, entirePosition));
+
+ auto& guiContext = GuiContext::singleton();
+ guiContext.setFontSize(m_fontSize);
+ if (m_potential != 0) {
+ guiContext.setFontColor(Color::White.toRgba());
+ } else if (m_fuelLevel == 0) {
+ if ((m_requested != 0) && (m_requested == m_fuelLevel))
+ guiContext.setFontColor(Color::Orange.toRgba());
+ else
+ guiContext.setFontColor(Color::Red.toRgba());
+ } else {
+ guiContext.setFontColor(Color::White.toRgba());
+ }
+
+ guiContext.renderInterfaceText(strf("Fuel %s/%s", std::min(m_fuelLevel + m_potential, m_maxLevel), (int)m_maxLevel),
+ {textPosition, HorizontalAnchor::HMidAnchor, VerticalAnchor::VMidAnchor});
+}
+
+void FuelWidget::setCurrentFuelLevel(float amount) {
+ m_fuelLevel = amount;
+}
+
+void FuelWidget::setMaxFuelLevel(float amount) {
+ m_maxLevel = amount;
+}
+
+void FuelWidget::setPotentialFuelAmount(float amount) {
+ m_potential = amount;
+}
+
+void FuelWidget::setRequestedFuelAmount(float amount) {
+ m_requested = amount;
+}
+
+void FuelWidget::ping() {
+ m_pingTimeout = 1.0f;
+}
+
+}