summaryrefslogtreecommitdiff
path: root/src/SSVOpenHexagon/Core/HGUpdate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/SSVOpenHexagon/Core/HGUpdate.cpp')
-rw-r--r--src/SSVOpenHexagon/Core/HGUpdate.cpp152
1 files changed, 130 insertions, 22 deletions
diff --git a/src/SSVOpenHexagon/Core/HGUpdate.cpp b/src/SSVOpenHexagon/Core/HGUpdate.cpp
index 66789404..7438c3cc 100644
--- a/src/SSVOpenHexagon/Core/HGUpdate.cpp
+++ b/src/SSVOpenHexagon/Core/HGUpdate.cpp
@@ -24,6 +24,7 @@
#include "SSVOpenHexagon/Core/Joystick.hpp"
#include "SSVOpenHexagon/Core/LuaScripting.hpp"
#include "SSVOpenHexagon/Core/Steam.hpp"
+#include "SSVUtils/Core/Utils/Rnd.hpp"
#ifndef SSVOH_ANDROID
#include <imgui.h>
@@ -243,12 +244,35 @@ void HexagonGame::update(ssvu::FT mFT, const float timescale)
player.updateInputMovement(getInputMovement(),
getPlayerSpeedMult(), getInputFocused(), mFT);
+ // Play "swap ready blip" sound and create particles
+ if(!playerNowReadyToSwap && player.isReadyToSwap())
+ {
+ playerNowReadyToSwap = true;
+
+ if(Config::getPlaySwapReadySound())
+ {
+ playSoundOverride("swapBlip.ogg");
+ }
+
+ swapParticlesSpawnInfo =
+ SwapParticleSpawnInfo{.ready{true},
+ .position{player.getPosition()},
+ .angle{player.getPlayerAngle()}};
+ }
+
+ // Create particles after swap
if(getLevelStatus().swapEnabled && getInputSwap() &&
player.isReadyToSwap())
{
+ swapParticlesSpawnInfo =
+ SwapParticleSpawnInfo{.ready{false},
+ .position{player.getPosition()},
+ .angle{player.getPlayerAngle()}};
+
performPlayerSwap(true /* mPlaySound */);
player.resetSwap(getSwapCooldown());
player.setJustSwapped(true);
+ playerNowReadyToSwap = false;
}
else
{
@@ -344,6 +368,11 @@ void HexagonGame::update(ssvu::FT mFT, const float timescale)
updateTrailParticles(mFT);
}
+ if(Config::getShowSwapParticles())
+ {
+ updateSwapParticles(mFT);
+ }
+
overlayCamera->update(mFT);
backgroundCamera->update(mFT);
}
@@ -797,28 +826,28 @@ void HexagonGame::updateRotation(ssvu::FT mFT)
void HexagonGame::updateCameraShake(ssvu::FT mFT)
{
- if(!backgroundCamera.has_value() || !overlayCamera.has_value() ||
- status.cameraShake <= 0)
+ if(!backgroundCamera.has_value() || !overlayCamera.has_value())
{
return;
}
- status.cameraShake -= mFT;
-
- if(!preShakeCenters.has_value())
+ if(status.cameraShake <= 0.f)
{
- if(status.cameraShake <= 0)
+ if(preShakeCenters.has_value())
{
- backgroundCamera->setCenter(
- preShakeCenters->backgroundCameraPreShakeCenter);
-
- overlayCamera->setCenter(
- preShakeCenters->overlayCameraPreShakeCenter);
+ backgroundCamera->setCenter(preShakeCenters->background);
+ overlayCamera->setCenter(preShakeCenters->overlay);
preShakeCenters.reset();
- return;
}
+ return;
+ }
+
+ status.cameraShake -= mFT;
+
+ if(!preShakeCenters.has_value())
+ {
preShakeCenters = PreShakeCenters{
backgroundCamera->getCenter(), overlayCamera->getCenter()};
}
@@ -833,11 +862,8 @@ void HexagonGame::updateCameraShake(ssvu::FT mFT)
return sf::Vector2f(rng.get_real(-i, i), rng.get_real(-i, i));
};
- backgroundCamera->setCenter(
- preShakeCenters->backgroundCameraPreShakeCenter + makeShakeVec());
-
- overlayCamera->setCenter(
- preShakeCenters->overlayCameraPreShakeCenter + makeShakeVec());
+ backgroundCamera->setCenter(preShakeCenters->background + makeShakeVec());
+ overlayCamera->setCenter(preShakeCenters->overlay + makeShakeVec());
}
void HexagonGame::updateFlash(ssvu::FT mFT)
@@ -849,9 +875,9 @@ void HexagonGame::updateFlash(ssvu::FT mFT)
status.flashEffect = ssvu::getClamped(status.flashEffect, 0.f, 255.f);
- for(auto i(0u); i < 4; ++i)
+ for(sf::Vertex& vertex : flashPolygon)
{
- flashPolygon[i].color.a = status.flashEffect;
+ vertex.color.a = status.flashEffect;
}
}
@@ -944,9 +970,7 @@ void HexagonGame::updateTrailParticles(ssvu::FT mFT)
const float scale = Config::getPlayerTrailScale();
p.sprite.setScale({scale, scale});
- sf::Color c = Config::getPlayerTrailHasSwapColor()
- ? player.getColorAdjustedForSwap(getColorPlayer())
- : getColorPlayer();
+ sf::Color c = getColorPlayerTrail();
c.a = Config::getPlayerTrailAlpha();
p.sprite.setColor(c);
@@ -980,6 +1004,90 @@ void HexagonGame::updateTrailParticles(ssvu::FT mFT)
}
}
+void HexagonGame::updateSwapParticles(ssvu::FT mFT)
+{
+ SSVOH_ASSERT(window != nullptr);
+
+ const auto isDead = [&](const SwapParticle& p)
+ { return p.sprite.getColor().a <= 3; };
+
+ const auto makeSwapParticle = [this](const SwapParticleSpawnInfo& si,
+ const float expand, const float speedMult,
+ const float scaleMult, const float alpha)
+ {
+ SwapParticle p;
+
+ SSVOH_ASSERT(txSmallCircle != nullptr);
+ p.sprite.setTexture(*txSmallCircle);
+ p.sprite.setPosition(si.position);
+ p.sprite.setOrigin(sf::Vector2f{txSmallCircle->getSize()} / 2.f);
+
+ const float scale = ssvu::getRndR(0.65f, 1.35f) * scaleMult;
+ p.sprite.setScale({scale, scale});
+
+ sf::Color c = getColorPlayerTrail();
+
+ c.a = alpha;
+ p.sprite.setColor(c);
+
+ p.velocity =
+ ssvs::getVecFromRad(si.angle + ssvu::getRndR(-expand, expand),
+ ssvu::getRndR(0.1f, 10.f) * speedMult);
+
+ return p;
+ };
+
+ ssvu::eraseRemoveIf(swapParticles, isDead);
+
+ for(SwapParticle& p : swapParticles)
+ {
+ sf::Color color = p.sprite.getColor();
+
+ const float newAlpha =
+ Utils::getMoveTowardsZero(static_cast<float>(color.a), 3.5f * mFT);
+
+ color.a = static_cast<sf::Uint8>(newAlpha);
+ p.sprite.setColor(color);
+
+ p.sprite.setScale(p.sprite.getScale() * 0.98f);
+ p.sprite.setPosition(p.sprite.getPosition() + p.velocity * mFT);
+ }
+
+ if(swapParticlesSpawnInfo.has_value())
+ {
+ if(swapParticlesSpawnInfo->ready == false)
+ {
+ for(int i = 0; i < 20; ++i)
+ {
+ swapParticles.emplace_back(
+ makeSwapParticle(*swapParticlesSpawnInfo,
+ 0.45f /* expand */, 1.f /* speedMult */,
+ 1.f /* scaleMult */, 45.f /* alpha */));
+ }
+
+ for(int i = 0; i < 10; ++i)
+ {
+ swapParticles.emplace_back(
+ makeSwapParticle(*swapParticlesSpawnInfo,
+ 3.14f /* expand */, 0.45f /* speedMult */,
+ 0.75f /* scaleMult */, 35.f /* alpha */));
+ }
+ }
+ else
+ {
+ for(int i = 0; i < 14; ++i)
+ {
+ swapParticles.emplace_back(
+ makeSwapParticle(*swapParticlesSpawnInfo,
+ 3.14f /* expand */, 1.3f /* speedMult */,
+ 0.4f /* scaleMult */, 140.f /* alpha */));
+ }
+ }
+
+ swapParticlesSpawnInfo.reset();
+ }
+}
+
#ifndef SSVOH_ANDROID
static int ilcTextEditCallbackStub(ImGuiInputTextCallbackData* data)
{