diff options
author | Vittorio Romeo <vittorio.romeo@outlook.com> | 2020-07-17 02:35:41 +0100 |
---|---|---|
committer | Vittorio Romeo <vittorio.romeo@outlook.com> | 2020-07-17 02:35:41 +0100 |
commit | 2840ead64aff762b3135339147f22381ddda8d78 (patch) | |
tree | 012f31b86a175f9991f03ea42786b3eb0a715066 | |
parent | babdccaba901e348ba393c6c2ef087bd7644f2d6 (diff) |
Beat pulse improvements (speed mult, initial delay, offset per segment)beatpulse_improvements
-rw-r--r-- | include/SSVOpenHexagon/Data/LevelData.hpp | 11 | ||||
-rw-r--r-- | include/SSVOpenHexagon/Data/MusicData.hpp | 31 | ||||
-rw-r--r-- | include/SSVOpenHexagon/Data/StyleData.hpp | 2 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/HGGraphics.cpp | 6 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/HGScripting.cpp | 5 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/HGUpdate.cpp | 3 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/HexagonGame.cpp | 11 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/MenuGame.cpp | 18 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Utils/Utils.cpp | 3 |
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; } |