diff options
Diffstat (limited to 'src/SSVOpenHexagon/Core/HGUpdate.cpp')
-rw-r--r-- | src/SSVOpenHexagon/Core/HGUpdate.cpp | 152 |
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) { |