void HexagonGame::newGame(const string& mId, bool mFirstPlay, float mDifficultyMult) { initFlashEffect(); firstPlay = mFirstPlay; setLevelData(assets.getLevelData(mId), mFirstPlay); difficultyMult = mDifficultyMult; // Audio cleanup assets.stopSounds(); stopLevelMusic(); assets.playSound("go.ogg"); playLevelMusic(); if(Config::getMusicSpeedDMSync()) { auto current(assets.getMusicPlayer().getCurrent()); if(current != nullptr) current->setPitch(pow(difficultyMult, 0.12f)); } // Events cleanup messageText.setString(""); eventTimeline.clear(); eventTimeline.reset(); messageTimeline.clear(); messageTimeline.reset(); // Manager cleanup manager.clear(); factory.createPlayer(); // Timeline cleanup timeline.clear(); timeline.reset(); effectTimelineManager.clear(); mustChangeSides = false; // FPSWatcher reset fpsWatcher.reset(); if(Config::getOfficial()) fpsWatcher.enable(); // LUA context and game status cleanup status = HexagonGameStatus{}; if(!mFirstPlay) runLuaFunction<void>("onUnload"); lua = Lua::LuaContext{}; initLua(); runLuaFile(levelData->luaScriptPath); runLuaFunction<void>("onInit"); runLuaFunction<void>("onLoad"); restartId = mId; restartFirstTime = false; setSides(levelStatus.sides); // Reset zoom overlayCamera.setView({{Config::getWidth() / 2.f, Config::getHeight() / 2.f}, Vec2f(Config::getWidth(), Config::getHeight())}); backgroundCamera.setView({ssvs::zeroVec2f, {Config::getWidth() * Config::getZoomFactor(), Config::getHeight() * Config::getZoomFactor()}}); backgroundCamera.setRotation(0); // 3D Cameras cleanup depthCameras.clear(); auto depth(styleData._3dDepth); if(depth > Config::get3DMaxDepth()) depth = Config::get3DMaxDepth(); for(auto i(0u); i < depth; ++i) depthCameras.push_back({window, {}}); }
void HexagonGame::newGame(const string& mId, bool mFirstPlay, float mDifficultyMult) { firstPlay = mFirstPlay; setLevelData(getLevelData(mId), mFirstPlay); difficultyMult = mDifficultyMult; // Audio cleanup stopAllSounds(); playSound("go.ogg"); stopLevelMusic(); playLevelMusic(); // Events cleanup clearMessage(); for(auto eventPtr : eventPtrs) delete eventPtr; eventPtrs.clear(); while(!eventPtrQueue.empty()) { delete eventPtrQueue.front(); eventPtrQueue.pop(); } eventPtrQueue = queue<EventData*>{}; // Game status cleanup status = HexagonGameStatus{}; restartId = mId; restartFirstTime = false; setSides(levelData.getSides()); // Manager cleanup manager.clear(); factory.createPlayer(); // Timeline cleanup timeline.clear(); timeline.reset(); messageTimeline.clear(); messageTimeline.reset(); effectTimelineManager.clear(); // FPSWatcher reset fpsWatcher.reset(); if(getOfficial()) fpsWatcher.enable(); // LUA context cleanup if(!mFirstPlay) runLuaFunction<void>("onUnload"); lua = Lua::LuaContext{}; initLua(); runLuaFile(levelData.getValueString("lua_file")); runLuaFunction<void>("onLoad"); // Random rotation direction if(getRnd(0, 100) > 50) setRotationSpeed(getRotationSpeed() * -1); // Reset zoom overlayCamera.setView({{getWidth() / 2.f, getHeight() / 2.f}, sf::Vector2f(getWidth(), getHeight())}); backgroundCamera.setView({{0, 0}, {getWidth() * getZoomFactor(), getHeight() * getZoomFactor()}}); backgroundCamera.setRotation(0); // 3D Cameras cleanup depthCameras.clear(); unsigned int depth{styleData.get3DDepth()}; if(depth > get3DMaxDepth()) depth = get3DMaxDepth(); for(unsigned int i{0}; i < depth; ++i) depthCameras.push_back({window, {}}); }
void HexagonGame::initLua() { // Utils lua.writeVariable("u_log", [=](string mLog) { lo("lua") << mLog << "\n"; }); lua.writeVariable("u_execScript", [=](string mName) { runLuaFile(levelData->packPath + "Scripts/" + mName); }); lua.writeVariable("u_playSound", [=](string mId) { assets.playSound(mId); }); lua.writeVariable("u_setMusic", [=](string mId) { musicData = assets.getMusicData(mId); musicData.firstPlay = true; stopLevelMusic(); playLevelMusic(); }); lua.writeVariable("u_isKeyPressed", [=](int mKey) { return window.getInputState()[KKey(mKey)]; }); lua.writeVariable("u_isFastSpinning", [=] { return status.fastSpin > 0; }); lua.writeVariable("u_forceIncrement", [=] { incrementDifficulty(); }); lua.writeVariable("u_kill", [=] { timeline.append<Do>([=] { death(true); }); }); lua.writeVariable("u_eventKill", [=] { eventTimeline.append<Do>([=] { death(true); }); }); lua.writeVariable("u_getDifficultyMult", [=] { return difficultyMult; }); lua.writeVariable("u_getSpeedMultDM", [=] { return getSpeedMultDM(); }); lua.writeVariable("u_getDelayMultDM", [=] { return getDelayMultDM(); }); // Messages lua.writeVariable("m_messageAdd", [=](string mMsg, float mDuration) { eventTimeline.append<Do>([=] { if(firstPlay && Config::getShowMessages()) addMessage(mMsg, mDuration); }); }); lua.writeVariable("m_messageAddImportant", [=](string mMsg, float mDuration) { eventTimeline.append<Do>([=] { if(Config::getShowMessages()) addMessage(mMsg, mDuration); }); }); // Main timeline control lua.writeVariable("t_wait", [=](float mDuration) { timeline.append<Wait>(mDuration); }); lua.writeVariable("t_waitS", [=](float mDuration) { timeline.append<Wait>(ssvu::getSecondsToFT(mDuration)); }); lua.writeVariable("t_waitUntilS", [=](float mDuration) { timeline.append<Wait>(10); timeline.append<Do>([=] { if(status.currentTime < mDuration) timeline.jumpTo(timeline.getCurrentIndex() - 2); }); }); // Event timeline control lua.writeVariable("e_eventStopTime", [=](float mDuration) { eventTimeline.append<Do>([=] { status.timeStop = mDuration; }); }); lua.writeVariable("e_eventStopTimeS", [=](float mDuration) { eventTimeline.append<Do>([=] { status.timeStop = ssvu::getSecondsToFT(mDuration); }); }); lua.writeVariable("e_eventWait", [=](float mDuration) { eventTimeline.append<Wait>(mDuration); }); lua.writeVariable("e_eventWaitS", [=](float mDuration) { eventTimeline.append<Wait>(ssvu::getSecondsToFT(mDuration)); }); lua.writeVariable("e_eventWaitUntilS", [=](float mDuration) { eventTimeline.append<Wait>(10); eventTimeline.append<Do>([=] { if(status.currentTime < mDuration) eventTimeline.jumpTo( eventTimeline.getCurrentIndex() - 2); }); }); // Level control lua.writeVariable("l_setSpeedMult", [=](float mValue) { levelStatus.speedMult = mValue; }); lua.writeVariable("l_setSpeedInc", [=](float mValue) { levelStatus.speedInc = mValue; }); lua.writeVariable("l_setRotationSpeed", [=](float mValue) { levelStatus.rotationSpeed = mValue; }); lua.writeVariable("l_setRotationSpeedMax", [=](float mValue) { levelStatus.rotationSpeedMax = mValue; }); lua.writeVariable("l_setRotationSpeedInc", [=](float mValue) { levelStatus.rotationSpeedInc = mValue; }); lua.writeVariable("l_setDelayMult", [=](float mValue) { levelStatus.delayMult = mValue; }); lua.writeVariable("l_setDelayInc", [=](float mValue) { levelStatus.delayInc = mValue; }); lua.writeVariable("l_setFastSpin", [=](float mValue) { levelStatus.fastSpin = mValue; }); lua.writeVariable("l_setSides", [=](unsigned int mValue) { levelStatus.sides = mValue; }); lua.writeVariable("l_setSidesMin", [=](unsigned int mValue) { levelStatus.sidesMin = mValue; }); lua.writeVariable("l_setSidesMax", [=](unsigned int mValue) { levelStatus.sidesMax = mValue; }); lua.writeVariable("l_setIncTime", [=](float mValue) { levelStatus.incTime = mValue; }); lua.writeVariable("l_setPulseMin", [=](float mValue) { levelStatus.pulseMin = mValue; }); lua.writeVariable("l_setPulseMax", [=](float mValue) { levelStatus.pulseMax = mValue; }); lua.writeVariable("l_setPulseSpeed", [=](float mValue) { levelStatus.pulseSpeed = mValue; }); lua.writeVariable("l_setPulseSpeedR", [=](float mValue) { levelStatus.pulseSpeedR = mValue; }); lua.writeVariable("l_setPulseDelayMax", [=](float mValue) { levelStatus.pulseDelayMax = mValue; }); lua.writeVariable("l_setBeatPulseMax", [=](float mValue) { levelStatus.beatPulseMax = mValue; }); lua.writeVariable("l_setBeatPulseDelayMax", [=](float mValue) { levelStatus.beatPulseDelayMax = mValue; }); lua.writeVariable("l_setWallSkewLeft", [=](float mValue) { levelStatus.wallSkewLeft = mValue; }); lua.writeVariable("l_setWallSkewRight", [=](float mValue) { levelStatus.wallSkewRight = mValue; }); lua.writeVariable("l_setWallAngleLeft", [=](float mValue) { levelStatus.wallAngleLeft = mValue; }); lua.writeVariable("l_setWallAngleRight", [=](float mValue) { levelStatus.wallAngleRight = mValue; }); lua.writeVariable("l_setRadiusMin", [=](float mValue) { levelStatus.radiusMin = mValue; }); lua.writeVariable("l_setSwapEnabled", [=](bool mValue) { levelStatus.swapEnabled = mValue; }); lua.writeVariable("l_setTutorialMode", [=](bool mValue) { levelStatus.tutorialMode = mValue; }); lua.writeVariable("l_setIncEnabled", [=](bool mValue) { levelStatus.incEnabled = mValue; }); lua.writeVariable("l_setMaxInc", [=](SizeT mValue) { levelStatus.maxIncrements = mValue; }); lua.writeVariable("l_addTracked", [=](string mVar, string mName) { levelStatus.trackedVariables.emplace_back(mVar, mName); }); lua.writeVariable("l_enableRndSideChanges", [=](bool mValue) { levelStatus.rndSideChangesEnabled = mValue; }); lua.writeVariable("l_getRotationSpeed", [=] { return levelStatus.rotationSpeed; }); lua.writeVariable("l_setRotation", [=](float mValue) { backgroundCamera.setRotation(mValue); }); lua.writeVariable("l_getRotation", [=] { return backgroundCamera.getRotation(); }); lua.writeVariable("l_getSides", [=] { return levelStatus.sides; }); lua.writeVariable("l_getSpeedMult", [=] { return levelStatus.speedMult; }); lua.writeVariable("l_getDelayMult", [=] { return levelStatus.delayMult; }); lua.writeVariable("l_getMaxInc", [=] { return levelStatus.maxIncrements; }); lua.writeVariable("l_getLevelTime", [=] { return (float)status.currentTime; }); lua.writeVariable("l_getOfficial", [=] { return Config::getOfficial(); }); // TODO: test and consider re-enabling /* lua.writeVariable("l_setLevel", [=](string mId) { setLevelData(assets.getLevelData(mId), true); stopLevelMusic(); playLevelMusic(); }); */ // Style control lua.writeVariable("s_setPulseInc", [=](float mValue) { styleData.pulseIncrement = mValue; }); lua.writeVariable("s_setHueInc", [=](float mValue) { styleData.hueIncrement = mValue; }); lua.writeVariable("s_getHueInc", [=] { return styleData.hueIncrement; }); lua.writeVariable("s_setCameraShake", [=](int mValue) { levelStatus.cameraShake = mValue; }); lua.writeVariable("s_getCameraShake", [=] { return levelStatus.cameraShake; }); lua.writeVariable("s_setStyle", [=](string mId) { styleData = assets.getStyleData(mId); }); // Wall creation lua.writeVariable("w_wall", [=](int mSide, float mThickness) { timeline.append<Do>([=] { factory.createWall( mSide, mThickness, {getSpeedMultDM()}); }); }); lua.writeVariable("w_wallAdj", [=](int mSide, float mThickness, float mSpeedAdj) { timeline.append<Do>([=] { factory.createWall( mSide, mThickness, mSpeedAdj * getSpeedMultDM()); }); }); lua.writeVariable("w_wallAcc", [=](int mSide, float mThickness, float mSpeedAdj, float mAcceleration, float mMinSpeed, float mMaxSpeed) { timeline.append<Do>([=] { factory.createWall(mSide, mThickness, {mSpeedAdj * getSpeedMultDM(), mAcceleration, mMinSpeed * getSpeedMultDM(), mMaxSpeed * getSpeedMultDM()}); }); }); lua.writeVariable( "w_wallHModSpeedData", [=](float mHMod, int mSide, float mThickness, float mSAdj, float mSAcc, float mSMin, float mSMax, bool mSPingPong) { timeline.append<Do>([=] { factory.createWall(mSide, mThickness, {mSAdj * getSpeedMultDM(), mSAcc, mSMin, mSMax, mSPingPong}, mHMod); }); }); lua.writeVariable( "w_wallHModCurveData", [=](float mHMod, int mSide, float mThickness, float mCAdj, float mCAcc, float mCMin, float mCMax, bool mCPingPong) { timeline.append<Do>([=] { factory.createWall(mSide, mThickness, {getSpeedMultDM()}, {mCAdj, mCAcc, mCMin, mCMax, mCPingPong}, mHMod); }); }); }