summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVittorio Romeo <vittorio.romeo@outlook.com>2020-07-17 02:35:41 +0100
committerVittorio Romeo <vittorio.romeo@outlook.com>2020-07-17 02:35:41 +0100
commit2840ead64aff762b3135339147f22381ddda8d78 (patch)
tree012f31b86a175f9991f03ea42786b3eb0a715066
parentbabdccaba901e348ba393c6c2ef087bd7644f2d6 (diff)
Beat pulse improvements (speed mult, initial delay, offset per segment)beatpulse_improvements
-rw-r--r--include/SSVOpenHexagon/Data/LevelData.hpp11
-rw-r--r--include/SSVOpenHexagon/Data/MusicData.hpp31
-rw-r--r--include/SSVOpenHexagon/Data/StyleData.hpp2
-rw-r--r--src/SSVOpenHexagon/Core/HGGraphics.cpp6
-rw-r--r--src/SSVOpenHexagon/Core/HGScripting.cpp5
-rw-r--r--src/SSVOpenHexagon/Core/HGUpdate.cpp3
-rw-r--r--src/SSVOpenHexagon/Core/HexagonGame.cpp11
-rw-r--r--src/SSVOpenHexagon/Core/MenuGame.cpp18
-rw-r--r--src/SSVOpenHexagon/Utils/Utils.cpp3
9 files changed, 64 insertions, 26 deletions
diff --git a/include/SSVOpenHexagon/Data/LevelData.hpp b/include/SSVOpenHexagon/Data/LevelData.hpp
index 56f60a93..437250e6 100644
--- a/include/SSVOpenHexagon/Data/LevelData.hpp
+++ b/include/SSVOpenHexagon/Data/LevelData.hpp
@@ -75,8 +75,15 @@ struct LevelStatus
float pulseSpeedR{0.f};
float pulseDelayMax{0.f};
float pulseDelayHalfMax{0.f};
- float beatPulseMax{0.f};
- float beatPulseDelayMax{0.f};
+
+ // ------------------------------------------------------------------------
+ // A "beat pulse" controls the size of the center polygon. It is supposed
+ // to match the beat of the music.
+ float beatPulseInitialDelay{0.f}; // Initial delay of the beat pulse.
+ float beatPulseMax{0.f}; // Max size increment of the polygon.
+ float beatPulseDelayMax{0.f}; // Delay between beat pulses.
+ float beatPulseSpeedMult{1.f}; // How fast the pulse "moves" back.
+
float radiusMin{72.f};
float wallSkewLeft{0.f};
float wallSkewRight{0.f};
diff --git a/include/SSVOpenHexagon/Data/MusicData.hpp b/include/SSVOpenHexagon/Data/MusicData.hpp
index 8e6c0772..99080ca8 100644
--- a/include/SSVOpenHexagon/Data/MusicData.hpp
+++ b/include/SSVOpenHexagon/Data/MusicData.hpp
@@ -17,10 +17,17 @@ class HGAssets;
class MusicData
{
+public:
+ struct Segment
+ {
+ float time;
+ float beatPulseDelayOffset;
+ };
+
private:
- std::vector<float> segments;
+ std::vector<Segment> segments;
- [[nodiscard]] float getRandomSegment() const
+ [[nodiscard]] const Segment& getRandomSegment() const
{
return segments[ssvu::getRndI(std::size_t(0), segments.size())];
}
@@ -42,33 +49,37 @@ public:
{
}
- float getSegment(int index)
+ const Segment& getSegment(std::size_t index) const
{
return segments[index];
}
- void addSegment(float mSeconds)
+ void addSegment(float mSeconds, float mBeatPulseDelayOffset)
{
- segments.emplace_back(mSeconds);
+ segments.emplace_back(Segment{mSeconds, mBeatPulseDelayOffset});
}
- void playRandomSegment(const std::string& mPackId, HGAssets& mAssets)
+ Segment playRandomSegment(const std::string& mPackId, HGAssets& mAssets)
{
if(firstPlay)
{
firstPlay = false;
- playSegment(mPackId, mAssets, 0);
+ return playSegment(mPackId, mAssets, 0);
}
else
{
- playSeconds(mPackId, mAssets, getRandomSegment());
+ const Segment& segment = getRandomSegment();
+ playSeconds(mPackId, mAssets, segment.time);
+ return segment;
}
}
- void playSegment(
+ Segment playSegment(
const std::string& mPackId, HGAssets& mAssets, std::size_t mIdx)
{
- playSeconds(mPackId, mAssets, segments[mIdx]);
+ const Segment& segment = segments[mIdx];
+ playSeconds(mPackId, mAssets, segment.time);
+ return segment;
}
void playSeconds(
diff --git a/include/SSVOpenHexagon/Data/StyleData.hpp b/include/SSVOpenHexagon/Data/StyleData.hpp
index d0ac1f96..2af5b46a 100644
--- a/include/SSVOpenHexagon/Data/StyleData.hpp
+++ b/include/SSVOpenHexagon/Data/StyleData.hpp
@@ -46,7 +46,7 @@ public:
float _3dPulseMin;
float _3dPulseSpeed;
float _3dPerspectiveMult;
- float bgTileRadius{4500.f};
+ float bgTileRadius{10000.f};
unsigned int BGColorOffset{0};
float BGRotOff{0}; // In degrees
diff --git a/src/SSVOpenHexagon/Core/HGGraphics.cpp b/src/SSVOpenHexagon/Core/HGGraphics.cpp
index a55f086f..7a1e9723 100644
--- a/src/SSVOpenHexagon/Core/HGGraphics.cpp
+++ b/src/SSVOpenHexagon/Core/HGGraphics.cpp
@@ -223,6 +223,11 @@ void HexagonGame::updateText()
os << "INVINCIBILITY ON\n";
}
+ if(Config::getTimescale() != 1.f)
+ {
+ os << "TIMESCALE " << Config::getTimescale() << "\n";
+ }
+
if(status.scoreInvalid)
{
os << "SCORE INVALIDATED (" << status.invalidReason << ")\n";
@@ -233,6 +238,7 @@ void HexagonGame::updateText()
os << "PRESS R TO RESTART\n";
}
+
const auto& trackedVariables(levelStatus.trackedVariables);
if(Config::getShowTrackedVariables() && !trackedVariables.empty())
{
diff --git a/src/SSVOpenHexagon/Core/HGScripting.cpp b/src/SSVOpenHexagon/Core/HGScripting.cpp
index 3227b29d..2025c4a8 100644
--- a/src/SSVOpenHexagon/Core/HGScripting.cpp
+++ b/src/SSVOpenHexagon/Core/HGScripting.cpp
@@ -54,7 +54,7 @@ void HexagonGame::initLua_Utils()
[this](std::string mId, int segment) {
musicData = assets.getMusicData(levelData->packId, mId);
stopLevelMusic();
- playLevelMusicAtTime(musicData.getSegment(segment));
+ playLevelMusicAtTime(musicData.getSegment(segment).time);
})
.arg("musicId")
.arg("segment")
@@ -155,6 +155,7 @@ void HexagonGame::initLua_Utils()
addLuaFn("u_swapPlayer", //
[this](bool mPlaySound) { player.playerSwap(*this, mPlaySound); })
+ .arg("playSound")
.doc(
"Force-swaps (180 degrees) the player when invoked. If `$0` is "
"`true`, the swap sound will be played.");
@@ -338,6 +339,8 @@ void HexagonGame::initLua_LevelControl()
lsVar("PulseDelayHalfMax", &LevelStatus::pulseDelayHalfMax);
lsVar("BeatPulseMax", &LevelStatus::beatPulseMax);
lsVar("BeatPulseDelayMax", &LevelStatus::beatPulseDelayMax);
+ lsVar("BeatPulseInitialDelay", &LevelStatus::beatPulseInitialDelay);
+ lsVar("BeatPulseSpeedMult", &LevelStatus::beatPulseSpeedMult);
lsVar("RadiusMin", &LevelStatus::radiusMin);
lsVar("WallSkewLeft", &LevelStatus::wallSkewLeft);
lsVar("WallSkewRight", &LevelStatus::wallSkewRight);
diff --git a/src/SSVOpenHexagon/Core/HGUpdate.cpp b/src/SSVOpenHexagon/Core/HGUpdate.cpp
index aecb2875..22c34b02 100644
--- a/src/SSVOpenHexagon/Core/HGUpdate.cpp
+++ b/src/SSVOpenHexagon/Core/HGUpdate.cpp
@@ -333,7 +333,8 @@ void HexagonGame::updateBeatPulse(ssvu::FT mFT)
if(status.beatPulse > 0)
{
- status.beatPulse -= 2.f * mFT * getMusicDMSyncFactor();
+ status.beatPulse -= (2.f * mFT * getMusicDMSyncFactor()) *
+ levelStatus.beatPulseSpeedMult;
}
float radiusMin{Config::getBeatPulse() ? levelStatus.radiusMin : 75};
diff --git a/src/SSVOpenHexagon/Core/HexagonGame.cpp b/src/SSVOpenHexagon/Core/HexagonGame.cpp
index 4121fa55..6e783293 100644
--- a/src/SSVOpenHexagon/Core/HexagonGame.cpp
+++ b/src/SSVOpenHexagon/Core/HexagonGame.cpp
@@ -137,6 +137,8 @@ void HexagonGame::newGame(const std::string& mPackId, const std::string& mId,
setLevelData(assets.getLevelData(mId), mFirstPlay);
difficultyMult = mDifficultyMult;
+ status = HexagonGameStatus{};
+
// Audio cleanup
assets.stopSounds();
stopLevelMusic();
@@ -198,7 +200,7 @@ void HexagonGame::newGame(const std::string& mPackId, const std::string& mId,
// LUA context and game status cleanup
inputImplCCW = inputImplCW = inputImplBothCWCCW = false;
- status = HexagonGameStatus{};
+
if(!mFirstPlay)
{
runLuaFunction<void>("onUnload");
@@ -211,6 +213,9 @@ void HexagonGame::newGame(const std::string& mPackId, const std::string& mId,
restartId = mId;
restartFirstTime = false;
setSides(levelStatus.sides);
+
+ // Set initial values for some status fields from Lua
+ status.beatPulseDelay += levelStatus.beatPulseInitialDelay;
}
void HexagonGame::death(bool mForce)
@@ -401,7 +406,9 @@ void HexagonGame::playLevelMusic()
{
if(!Config::getNoMusic())
{
- musicData.playRandomSegment(getPackId(), assets);
+ const MusicData::Segment segment =
+ musicData.playRandomSegment(getPackId(), assets);
+ status.beatPulseDelay += segment.beatPulseDelayOffset;
}
}
diff --git a/src/SSVOpenHexagon/Core/MenuGame.cpp b/src/SSVOpenHexagon/Core/MenuGame.cpp
index e95fac39..18de5131 100644
--- a/src/SSVOpenHexagon/Core/MenuGame.cpp
+++ b/src/SSVOpenHexagon/Core/MenuGame.cpp
@@ -692,10 +692,13 @@ void MenuGame::initLua(Lua::LuaContext& mLua)
"l_setDelayInc", "l_setFastSpin", "l_setSidesMin", "l_setSidesMax",
"l_setIncTime", "l_setPulseMin", "l_setPulseMax", "l_setPulseSpeed",
"l_setPulseSpeedR", "l_setPulseDelayMax", "l_setBeatPulseMax",
- "l_setBeatPulseDelayMax", "l_setWallSkewLeft", "l_setWallSkewRight",
- "l_setWallAngleLeft", "l_setWallAngleRight", "l_setRadiusMin",
- "l_setSwapEnabled", "l_setTutorialMode", "l_setIncEnabled",
- "l_get3dRequired", "l_enableRndSideChanges",
+ "l_setBeatPulseDelayMax", "l_setBeatPulseInitialDelay",
+ "l_setBeatPulseSpeedMult", "l_getBeatPulseInitialDelay",
+ "l_getBeatPulseSpeedMult"
+ "l_setWallSkewLeft",
+ "l_setWallSkewRight", "l_setWallAngleLeft", "l_setWallAngleRight",
+ "l_setRadiusMin", "l_setSwapEnabled", "l_setTutorialMode",
+ "l_setIncEnabled", "l_get3dRequired", "l_enableRndSideChanges",
"l_darkenUnevenBackgroundChunk", "l_getSpeedMult", "l_getDelayMult",
"l_addTracked", "l_getRotation", "l_setRotation", "l_setDelayMult",
"l_getOfficial",
@@ -730,13 +733,12 @@ void MenuGame::initLua(Lua::LuaContext& mLua)
"s_set3dPulseSpeed", "s_get3dPerspectiveMult",
"s_set3dPerspectiveMult", "s_setCapColorMain",
"s_setCapColorMainDarkened", "s_setCapColorByIndex",
- "s_setBGColorOffset", "s_getBGColorOffset",
- "s_setBGTileRadius", "s_getBGTileRadius",
- "s_setBGRotOff", "s_getBGRotOff",
+ "s_setBGColorOffset", "s_getBGColorOffset", "s_setBGTileRadius",
+ "s_getBGTileRadius", "s_setBGRotOff", "s_getBGRotOff",
"steam_unlockAchievement",
"cw_create", "cw_destroy", "cw_setVertexPos", "cw_setVertexColor",
-
+
"cw_isOverlappingPlayer", "cw_clear"})
{
mLua.writeVariable(un, [] {});
diff --git a/src/SSVOpenHexagon/Utils/Utils.cpp b/src/SSVOpenHexagon/Utils/Utils.cpp
index 2c8bd5b9..2b2f1ab5 100644
--- a/src/SSVOpenHexagon/Utils/Utils.cpp
+++ b/src/SSVOpenHexagon/Utils/Utils.cpp
@@ -35,7 +35,8 @@ MusicData loadMusicFromJson(const ssvuj::Obj& mRoot)
ssvuj::getExtr<std::string>(mRoot, "author")};
for(const auto& segment : ssvuj::getObj(mRoot, "segments"))
{
- result.addSegment(ssvuj::getExtr<float>(segment, "time"));
+ result.addSegment(ssvuj::getExtr<float>(segment, "time"),
+ ssvuj::getExtr<float>(segment, "beatPulseDelayOffset", 0.f));
}
return result;
}