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::death() { playSound("death"); playSound("game_over"); hasDied = true; stopLevelMusic(); checkAndSaveScore(); }
void HexagonGame::death() { playSound("death.ogg"); playSound("gameOver.ogg"); if(getInvincible()) return; status.flashEffect = 255; shakeCamera(effectTimelineManager, overlayCamera); shakeCamera(effectTimelineManager, backgroundCamera); for(auto& depthCamera : depthCameras) shakeCamera(effectTimelineManager, depthCamera); status.hasDied = true; stopLevelMusic(); checkAndSaveScore(); if(getAutoRestart()) status.mustRestart = true; }
void HexagonGame::death(bool mForce) { fpsWatcher.disable(); assets.playSound("death.ogg", SoundPlayer::Mode::Abort); if(!mForce && (Config::getInvincible() || levelStatus.tutorialMode)) return; assets.playSound("gameOver.ogg", SoundPlayer::Mode::Abort); if(!assets.pIsLocal() && Config::isEligibleForScore()) { Online::trySendDeath(); } status.flashEffect = 255; shakeCamera(effectTimelineManager, overlayCamera); shakeCamera(effectTimelineManager, backgroundCamera); for(auto& depthCamera : depthCameras) shakeCamera(effectTimelineManager, depthCamera); status.hasDied = true; stopLevelMusic(); checkAndSaveScore(); if(Config::getAutoRestart()) status.mustRestart = true; }
void HexagonGame::newGame(string mId, bool mFirstPlay) { clearMessages(); setLevelData(getLevelData(mId), mFirstPlay); stopAllSounds(); playSound("play"); pm->resetAdj(); stopLevelMusic(); playLevelMusic(); rotationDirection = getRnd(0, 100) > 50 ? true : false; scripts.clear(); timeStop = 0; randomSideChangesEnabled = true; incrementEnabled = true; maxPulse = 85; minPulse = 75; pulseSpeedBackwards = 1; pulseSpeed = 1; hasDied = false; mustRestart = false; currentTime = 0; incrementTime = 0; setSides(levelData.getSides()); radius = minPulse; manager.clear(); createPlayer(manager, this, centerPos); scriptsTimeline = Timeline{}; messagesTimeline = Timeline{}; timeline = Timeline{}; }
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::executeEvents(Json::Value& mRoot, float mTime) { for (Json::Value& eventRoot : mRoot) { if(eventRoot["time"].asFloat() > mTime) continue; if(eventRoot["executed"].asBool()) continue; eventRoot["executed"] = true; string type{eventRoot["type"].asString()}; float duration{eventRoot["duration"].asFloat()}; string valueName{eventRoot["value_name"].asString()}; float value{eventRoot["value"].asFloat()}; string message{eventRoot["message"].asString()}; string id{eventRoot["id"].asString()}; if (type == "level_change") changeLevel(id); else if (type == "menu") goToMenu(); else if (type == "message_add") { if(getShowMessages()) addMessage(message, duration); } else if (type == "message_clear") clearMessages(); else if (type == "time_stop") timeStop = duration; else if (type == "timeline_wait") timeline.add(new Wait(duration)); else if (type == "timeline_clear") clearAndResetTimeline(timeline); else if (type == "value_float_set") levelData.setValueFloat(valueName, value); else if (type == "value_float_add") levelData.setValueFloat(valueName, levelData.getValueFloat(valueName) + value); else if (type == "value_float_subtract") levelData.setValueFloat(valueName, levelData.getValueFloat(valueName) - value); else if (type == "value_float_multiply") levelData.setValueFloat(valueName, levelData.getValueFloat(valueName) * value); else if (type == "value_float_divide") levelData.setValueFloat(valueName, levelData.getValueFloat(valueName) / value); else if (type == "value_int_set") levelData.setValueInt(valueName, value); else if (type == "value_int_add") levelData.setValueInt(valueName, levelData.getValueFloat(valueName) + value); else if (type == "value_int_subtract") levelData.setValueInt(valueName, levelData.getValueFloat(valueName) - value); else if (type == "value_int_multiply") levelData.setValueInt(valueName, levelData.getValueFloat(valueName) * value); else if (type == "value_int_divide") levelData.setValueInt(valueName, levelData.getValueFloat(valueName) / value); else if (type == "music_set") { if(getChangeMusic()) { stopLevelMusic(); musicData = getMusicData(id); musicData.playRandomSegment(musicPtr); } } else if (type == "music_set_segment") { if(getChangeMusic()) { stopLevelMusic(); musicData = getMusicData(id); musicData.playSegment(musicPtr, eventRoot["segment_index"].asInt()); } } else if (type == "music_set_seconds") { if(getChangeMusic()) { stopLevelMusic(); musicData = getMusicData(id); musicData.playSeconds(musicPtr, eventRoot["seconds"].asInt()); } } else if (type == "style_set") { if(getChangeStyles()) styleData = getStyleData(id); } else if (type == "side_changing_stop") randomSideChangesEnabled = false; else if (type == "side_changing_start") randomSideChangesEnabled = true; else if (type == "increment_stop") incrementEnabled = false; else if (type == "increment_start") incrementEnabled = true; else if (type == "pulse_max_set") maxPulse = value; else if (type == "pulse_min_set") minPulse = value; else if (type == "pulse_speed_set") pulseSpeed = value; else if (type == "pulse_speed_b_set") pulseSpeedBackwards = value; else if (type == "script_exec") scripts.push_back(getScriptData(id, this)); else if (type == "script_queue") queueScript(getScriptData(id, this)); else log("unknown script command: " + type); } }
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); }); }); }