summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVittorio Romeo <vittorio.romeo@outlook.com>2021-11-09 16:52:56 +0000
committerVittorio Romeo <vittorio.romeo@outlook.com>2021-11-09 16:52:56 +0000
commit806561e48017f4dabfae85dec45b990c44b1c71b (patch)
treea16926158ec731e81e02f65978474ae8cad879e1
parentb71c3a7d7ebec60b8d919400ac7752f9509d9b06 (diff)
Add player trail visual FX
-rw-r--r--_RELEASE/config.json4
-rw-r--r--include/SSVOpenHexagon/Core/HGStatus.hpp1
-rw-r--r--include/SSVOpenHexagon/Core/HexagonGame.hpp19
-rw-r--r--include/SSVOpenHexagon/Global/Config.hpp10
-rw-r--r--src/SSVOpenHexagon/Core/HGGraphics.cpp13
-rw-r--r--src/SSVOpenHexagon/Core/HGUpdate.cpp78
-rw-r--r--src/SSVOpenHexagon/Core/HexagonGame.cpp3
-rw-r--r--src/SSVOpenHexagon/Core/LuaScripting.cpp6
-rw-r--r--src/SSVOpenHexagon/Core/MenuGame.cpp18
-rw-r--r--src/SSVOpenHexagon/Global/Config.cpp55
10 files changed, 192 insertions, 15 deletions
diff --git a/_RELEASE/config.json b/_RELEASE/config.json
index 9bc31cef..eb793cac 100644
--- a/_RELEASE/config.json
+++ b/_RELEASE/config.json
@@ -50,6 +50,9 @@
"player_focus_speed" : 4.6250,
"player_size" : 7.300000190734863,
"player_speed" : 9.449999809265137,
+ "player_trail_alpha" : 255,
+ "player_trail_decay" : 0.50,
+ "player_trail_scale" : 1.0,
"pulse_enabled" : true,
"rotate_to_start" : false,
"save_last_login_username" : true,
@@ -131,6 +134,7 @@
"show_level_info" : true,
"show_login_at_startup" : false,
"show_messages" : true,
+ "show_player_trail" : true,
"show_status_text" : true,
"show_timer" : true,
"show_tracked_variables" : true,
diff --git a/include/SSVOpenHexagon/Core/HGStatus.hpp b/include/SSVOpenHexagon/Core/HGStatus.hpp
index 06e79a63..b5c54f0c 100644
--- a/include/SSVOpenHexagon/Core/HGStatus.hpp
+++ b/include/SSVOpenHexagon/Core/HGStatus.hpp
@@ -58,6 +58,7 @@ public:
bool started{false};
std::string restartInput;
std::string replayInput;
+ bool showPlayerTrail{true};
// Reset all the time points and signal that we started
void start() noexcept;
diff --git a/include/SSVOpenHexagon/Core/HexagonGame.hpp b/include/SSVOpenHexagon/Core/HexagonGame.hpp
index 243467e0..74d7dedc 100644
--- a/include/SSVOpenHexagon/Core/HexagonGame.hpp
+++ b/include/SSVOpenHexagon/Core/HexagonGame.hpp
@@ -167,21 +167,24 @@ private:
ssvs::VertexVector<sf::PrimitiveType::Quads> flashPolygon{4};
- enum class ParticleType : std::uint8_t
- {
- Normal,
- Trail
- };
-
struct Particle
{
sf::Sprite sprite;
sf::Vector2f velocity;
float angularVelocity;
- ParticleType type;
};
+ struct TrailParticle
+ {
+ sf::Sprite sprite;
+ float angle;
+ };
+
+ sf::Texture& txStarParticle;
+ sf::Texture& txSmallCircle;
+
std::vector<Particle> particles;
+ std::vector<TrailParticle> trailParticles;
bool mustSpawnPBParticles{false};
float nextPBParticleSpawn{0.f};
float pbTextGrowth{0.f};
@@ -340,6 +343,7 @@ private:
void updateKeyIcons();
void updateLevelInfo();
void updateParticles(ssvu::FT mFT);
+ void updateTrailParticles(ssvu::FT mFT);
// Post update methods
void postUpdate();
@@ -360,6 +364,7 @@ private:
void drawKeyIcons();
void drawLevelInfo();
void drawParticles();
+ void drawTrailParticles();
void drawImguiLuaConsole();
// Data-related methods
diff --git a/include/SSVOpenHexagon/Global/Config.hpp b/include/SSVOpenHexagon/Global/Config.hpp
index 0ed86863..a3916f3f 100644
--- a/include/SSVOpenHexagon/Global/Config.hpp
+++ b/include/SSVOpenHexagon/Global/Config.hpp
@@ -84,6 +84,11 @@ void setLastLoginUsername(const std::string& mX);
void setShowLoginAtStartup(bool mX);
void setCameraShakeMultiplier(float x);
void setAngleTiltIntensity(float x);
+void setShowPlayerTrail(bool mX);
+void setPlayerTrailAlpha(unsigned int x);
+void setPlayerTrailScale(float x);
+void setPlayerTrailDecay(float x);
+void setPlayerTrailHasSwapColor(bool x);
[[nodiscard]] bool getOfficial();
[[nodiscard]] const std::string& getUneligibilityReason();
@@ -152,6 +157,11 @@ void setAngleTiltIntensity(float x);
[[nodiscard]] bool getShowLoginAtStartup();
[[nodiscard]] float getCameraShakeMultiplier();
[[nodiscard]] float getAngleTiltIntensity();
+[[nodiscard]] bool getShowPlayerTrail();
+[[nodiscard]] unsigned int getPlayerTrailAlpha();
+[[nodiscard]] float getPlayerTrailScale();
+[[nodiscard]] float getPlayerTrailDecay();
+[[nodiscard]] bool getPlayerTrailHasSwapColor();
// keyboard binds
diff --git a/src/SSVOpenHexagon/Core/HGGraphics.cpp b/src/SSVOpenHexagon/Core/HGGraphics.cpp
index ea31c1e3..15e46fbe 100644
--- a/src/SSVOpenHexagon/Core/HGGraphics.cpp
+++ b/src/SSVOpenHexagon/Core/HGGraphics.cpp
@@ -226,6 +226,11 @@ void HexagonGame::draw()
}
}
+ if(Config::getShowPlayerTrail() && status.showPlayerTrail)
+ {
+ drawTrailParticles();
+ }
+
render(wallQuads3D);
render(pivotQuads3D);
render(playerTris3D);
@@ -357,6 +362,14 @@ void HexagonGame::drawParticles()
}
}
+void HexagonGame::drawTrailParticles()
+{
+ for(TrailParticle& p : trailParticles)
+ {
+ render(p.sprite);
+ }
+}
+
void HexagonGame::updateText(ssvu::FT mFT)
{
if(window == nullptr)
diff --git a/src/SSVOpenHexagon/Core/HGUpdate.cpp b/src/SSVOpenHexagon/Core/HGUpdate.cpp
index e90cae0a..7c160638 100644
--- a/src/SSVOpenHexagon/Core/HGUpdate.cpp
+++ b/src/SSVOpenHexagon/Core/HGUpdate.cpp
@@ -29,6 +29,10 @@
#include <SSVUtils/Core/Common/Frametime.hpp>
#include <SSVUtils/Core/Utils/Containers.hpp>
+#include <SFML/Config.hpp>
+#include <SFML/Graphics/Color.hpp>
+#include <SFML/System/Vector2.hpp>
+
#include <array>
#include <cstring>
#include <optional>
@@ -333,6 +337,12 @@ void HexagonGame::update(ssvu::FT mFT, const float timescale)
SSVOH_ASSERT(backgroundCamera.has_value());
updateParticles(mFT);
+
+ if(Config::getShowPlayerTrail() && status.showPlayerTrail)
+ {
+ updateTrailParticles(mFT);
+ }
+
overlayCamera->update(mFT);
backgroundCamera->update(mFT);
}
@@ -871,14 +881,11 @@ void HexagonGame::updateParticles(ssvu::FT mFT)
pos.y < 0 - padding || pos.y > Config::getHeight() + padding);
};
- const auto isDead = [&](const Particle& p)
- { return p.sprite.getColor().a <= 0 || isOutOfBounds(p); };
-
const auto makePBParticle = [this]
{
Particle p;
- p.sprite.setTexture(assets.getTextureOrNullTexture("starParticle.png"));
+ p.sprite.setTexture(txStarParticle);
p.sprite.setPosition(
{ssvu::getRndR(-64.f, Config::getWidth() + 64.f), -64.f});
p.sprite.setRotation(ssvu::getRndR(0.f, 360.f));
@@ -896,7 +903,7 @@ void HexagonGame::updateParticles(ssvu::FT mFT)
return p;
};
- ssvu::eraseRemoveIf(particles, isDead);
+ ssvu::eraseRemoveIf(particles, isOutOfBounds);
for(Particle& p : particles)
{
@@ -916,6 +923,67 @@ void HexagonGame::updateParticles(ssvu::FT mFT)
}
}
+void HexagonGame::updateTrailParticles(ssvu::FT mFT)
+{
+ SSVOH_ASSERT(window != nullptr);
+
+ const auto isDead = [&](const TrailParticle& p)
+ { return p.sprite.getColor().a <= 3; };
+
+ const auto makeTrailParticle = [this]
+ {
+ TrailParticle p;
+
+ p.sprite.setTexture(txSmallCircle);
+ p.sprite.setPosition(player.getPosition());
+ p.sprite.setOrigin(sf::Vector2f{txSmallCircle.getSize()} / 2.f);
+
+ const float scale = Config::getPlayerTrailScale();
+ p.sprite.setScale({scale, scale});
+
+ sf::Color c = Config::getPlayerTrailHasSwapColor()
+ ? player.getColorAdjustedForSwap(getColorPlayer())
+ : getColorPlayer();
+
+ c.a = Config::getPlayerTrailAlpha();
+ p.sprite.setColor(c);
+
+ p.angle = player.getPlayerAngle();
+
+ return p;
+ };
+
+ ssvu::eraseRemoveIf(trailParticles, isDead);
+
+ for(TrailParticle& p : trailParticles)
+ {
+ sf::Color color = p.sprite.getColor();
+ auto alpha = static_cast<float>(color.a);
+
+ if(alpha > 0.f)
+ {
+ alpha -= Config::getPlayerTrailDecay() * mFT;
+ if(alpha <= 0.f)
+ {
+ alpha = 0;
+ }
+ }
+
+ color.a = static_cast<sf::Uint8>(alpha);
+ p.sprite.setColor(color);
+
+ p.sprite.setScale(p.sprite.getScale() * 0.98f);
+
+ p.sprite.setPosition(
+ ssvs::getVecFromRad(p.angle, status.radius + 2.4f));
+ }
+
+ if(player.hasChangedAngle())
+ {
+ trailParticles.emplace_back(makeTrailParticle());
+ }
+}
+
static int ilcTextEditCallbackStub(ImGuiInputTextCallbackData* data)
{
auto hg = (HexagonGame*)data->UserData;
diff --git a/src/SSVOpenHexagon/Core/HexagonGame.cpp b/src/SSVOpenHexagon/Core/HexagonGame.cpp
index e8cd3c7f..215cc7a8 100644
--- a/src/SSVOpenHexagon/Core/HexagonGame.cpp
+++ b/src/SSVOpenHexagon/Core/HexagonGame.cpp
@@ -287,6 +287,8 @@ HexagonGame::HexagonGame(Steam::steam_manager* mSteamManager,
levelStatus{Config::getMusicSpeedDMSync(), Config::getSpawnDistance()},
messageText{initText("", font, 38.f)},
pbText{initText("", fontBold, 65.f)},
+ txStarParticle(assets.getTextureOrNullTexture("starParticle.png")),
+ txSmallCircle(assets.getTextureOrNullTexture("smallCircle.png")),
levelInfoTextLevel{"", font},
levelInfoTextPack{"", font},
levelInfoTextAuthor{"", font},
@@ -665,6 +667,7 @@ void HexagonGame::newGame(const std::string& mPackId, const std::string& mId,
mustSpawnPBParticles = false;
nextPBParticleSpawn = 0.f;
particles.clear();
+ trailParticles.clear();
if(window != nullptr)
{
diff --git a/src/SSVOpenHexagon/Core/LuaScripting.cpp b/src/SSVOpenHexagon/Core/LuaScripting.cpp
index b6d32580..7208dcfa 100644
--- a/src/SSVOpenHexagon/Core/LuaScripting.cpp
+++ b/src/SSVOpenHexagon/Core/LuaScripting.cpp
@@ -922,6 +922,12 @@ static void initLevelControl(
"`0` and `l_getBeatPulseDelayMax()` unless manually overridden.",
"Sets the current beat pulse delay value to `$0`.");
+
+ sVar("ShowPlayerTrail", &HexagonGameStatus::showPlayerTrail,
+ "Gets whether the current level allows player trails to be shown.",
+
+ "Sets whether the current level allows player trails to be shown to "
+ "`$0`.");
}
static void initStyleControl(Lua::LuaContext& lua, StyleData& styleData)
diff --git a/src/SSVOpenHexagon/Core/MenuGame.cpp b/src/SSVOpenHexagon/Core/MenuGame.cpp
index d73fbe79..2c667828 100644
--- a/src/SSVOpenHexagon/Core/MenuGame.cpp
+++ b/src/SSVOpenHexagon/Core/MenuGame.cpp
@@ -1394,9 +1394,21 @@ void MenuGame::initMenus()
visfx.create<i::Toggle>("flash", &Config::getFlash, &Config::setFlash);
visfx.create<i::Slider>("shake mult.", &Config::getCameraShakeMultiplier,
&Config::setCameraShakeMultiplier, 0.f, 5.f, 0.1f);
- visfx.create<i::Slider>("angle tilt mult.", &Config::getAngleTiltIntensity,
- &Config::setAngleTiltIntensity, 0.f, 5.f, 0.1f);
- visfx.create<i::GoBack>("back");
+
+ auto& playervisfx(optionsMenu.createCategory("player visual fxs"));
+ gfx.create<i::Goto>("player visual fxs", playervisfx);
+ playervisfx.create<i::Slider>("angle tilt mult.",
+ &Config::getAngleTiltIntensity, &Config::setAngleTiltIntensity, 0.f,
+ 5.f, 0.1f);
+ playervisfx.create<i::Toggle>(
+ "show trail", &Config::getShowPlayerTrail, &Config::setShowPlayerTrail);
+ playervisfx.create<i::Slider>("trail alpha", &Config::getPlayerTrailAlpha,
+ &Config::setPlayerTrailAlpha, 0, 255, 5);
+ playervisfx.create<i::Slider>("trail scale", &Config::getPlayerTrailScale,
+ &Config::setPlayerTrailScale, 0.05f, 1.f, 0.05f);
+ playervisfx.create<i::Slider>("trail decay", &Config::getPlayerTrailDecay,
+ &Config::setPlayerTrailDecay, 0.5f, 50.f, 2.5f);
+ playervisfx.create<i::GoBack>("back");
auto& fps(optionsMenu.createCategory("fps settings"));
gfx.create<i::Goto>("fps settings", fps);
diff --git a/src/SSVOpenHexagon/Global/Config.cpp b/src/SSVOpenHexagon/Global/Config.cpp
index 9695ca7e..47a44b2f 100644
--- a/src/SSVOpenHexagon/Global/Config.cpp
+++ b/src/SSVOpenHexagon/Global/Config.cpp
@@ -216,6 +216,11 @@ using cil = std::initializer_list<cmb>;
X(showLoginAtStartup, bool, "show_login_at_startup", false) \
X(cameraShakeMultiplier, float, "camera_shake_multiplier", 1.f) \
X(angleTiltIntensity, float, "angle_tilt_intensity", 1.f) \
+ X(showPlayerTrail, bool, "show_player_trail", true) \
+ X(playerTrailAlpha, uint, "player_trail_alpha", 180) \
+ X(playerTrailScale, float, "player_trail_scale", 0.5f) \
+ X(playerTrailDecay, float, "player_trail_decay", 10.f) \
+ X(playerTrailHasSwapColor, bool, "player_trail_has_swap_color", true) \
X_LINKEDVALUES_BINDS
namespace hg::Config {
@@ -742,6 +747,31 @@ void setAngleTiltIntensity(float x)
angleTiltIntensity() = x;
}
+void setShowPlayerTrail(bool x)
+{
+ showPlayerTrail() = x;
+}
+
+void setPlayerTrailAlpha(unsigned int x)
+{
+ playerTrailAlpha() = x;
+}
+
+void setPlayerTrailScale(float x)
+{
+ playerTrailScale() = x;
+}
+
+void setPlayerTrailDecay(float x)
+{
+ playerTrailDecay() = x;
+}
+
+void setPlayerTrailHasSwapColor(bool x)
+{
+ playerTrailHasSwapColor() = x;
+}
+
[[nodiscard]] bool getOfficial()
{
return official();
@@ -1077,6 +1107,31 @@ void setAngleTiltIntensity(float x)
return angleTiltIntensity();
}
+[[nodiscard]] bool getShowPlayerTrail()
+{
+ return showPlayerTrail();
+}
+
+[[nodiscard]] unsigned int getPlayerTrailAlpha()
+{
+ return playerTrailAlpha();
+}
+
+[[nodiscard]] float getPlayerTrailScale()
+{
+ return playerTrailScale();
+}
+
+[[nodiscard]] float getPlayerTrailDecay()
+{
+ return playerTrailDecay();
+}
+
+[[nodiscard]] bool getPlayerTrailHasSwapColor()
+{
+ return playerTrailHasSwapColor();
+}
+
//***********************************************************
//
// KEYBOARD/MOUSE BINDS