Explorar o código

Add anti-flashlight mod

kiwec hai 3 meses
pai
achega
7f49175a5e

+ 1 - 1
src/App/Osu/Beatmap.cpp

@@ -119,6 +119,7 @@ ConVar osu_followpoints_prevfadetime("osu_followpoints_prevfadetime", 400.0f,
 
 ConVar osu_auto_and_relax_block_user_input("osu_auto_and_relax_block_user_input", true, FCVAR_DEFAULT);
 
+ConVar mod_anti_flashlight("mod_anti_flashlight", false, FCVAR_DEFAULT);
 ConVar osu_mod_timewarp("osu_mod_timewarp", false, FCVAR_UNLOCKED);
 ConVar osu_mod_timewarp_multiplier("osu_mod_timewarp_multiplier", 1.5f, FCVAR_DEFAULT);
 ConVar osu_mod_minimize("osu_mod_minimize", false, FCVAR_UNLOCKED);
@@ -293,7 +294,6 @@ Beatmap::Beatmap() {
     m_fposu_mod_strafing_strength_x_ref = convar->getConVarByName("fposu_mod_strafing_strength_x");
     m_fposu_mod_strafing_strength_y_ref = convar->getConVarByName("fposu_mod_strafing_strength_y");
     m_fposu_mod_strafing_strength_z_ref = convar->getConVarByName("fposu_mod_strafing_strength_z");
-    m_fposu_mod_3d_depthwobble_ref = convar->getConVarByName("fposu_mod_3d_depthwobble");
     m_osu_slider_scorev2_ref = convar->getConVarByName("osu_slider_scorev2");
 
     // vars

+ 0 - 1
src/App/Osu/Beatmap.h

@@ -399,7 +399,6 @@ class Beatmap {
     ConVar *m_fposu_mod_strafing_strength_x_ref = NULL;
     ConVar *m_fposu_mod_strafing_strength_y_ref = NULL;
     ConVar *m_fposu_mod_strafing_strength_z_ref = NULL;
-    ConVar *m_fposu_mod_3d_depthwobble_ref = NULL;
     ConVar *m_osu_slider_scorev2_ref = NULL;
 
     static inline Vector2 mapNormalizedCoordsOntoUnitCircle(const Vector2 &in) {

+ 1 - 0
src/App/Osu/Changelog.cpp

@@ -32,6 +32,7 @@ Changelog::Changelog() : ScreenBackable() {
     latest.changes.push_back(
         "- Added \"tooearly.wav\" and \"toolate.wav\" hitsounds, which play when you hit too early or too late (if "
         "your skin has them)");
+    latest.changes.push_back("- Added \"Anti-flashlight\" experimental mod");
     latest.changes.push_back("- Added keybind to open skin selection menu");
     latest.changes.push_back("- Added slider instafade setting");
     latest.changes.push_back("- Fixed local scores not saving avatar");

+ 0 - 4
src/App/Osu/Downloader.cpp

@@ -269,10 +269,6 @@ i32 extract_beatmapset_id(const u8* data, size_t data_s) {
         set_id = get_beatmapset_id_from_osu_file(osu_data, s_osu_data);
         mz_free(osu_data);
         if(set_id != -1) break;
-
-    skip_file:;
-        // When a file can't be extracted we just ignore it (as long as the archive is valid).
-        // We'll check for errors when loading the beatmap.
     }
 
     mz_zip_reader_end(&zip);

+ 1 - 4
src/App/Osu/ModFPoSu.cpp

@@ -71,8 +71,6 @@ ConVar fposu_mod_strafing_frequency_y("fposu_mod_strafing_frequency_y", 0.2f, FC
 ConVar fposu_mod_strafing_strength_z("fposu_mod_strafing_strength_z", 0.15f, FCVAR_DEFAULT);
 ConVar fposu_mod_strafing_frequency_z("fposu_mod_strafing_frequency_z", 0.15f, FCVAR_DEFAULT);
 
-ConVar fposu_mod_3d_depthwobble("fposu_mod_3d_depthwobble", false, FCVAR_UNLOCKED);
-
 constexpr const float ModFPoSu::SIZEDIV3D;
 constexpr const int ModFPoSu::SUBDIVISIONS;
 
@@ -497,8 +495,7 @@ Vector2 ModFPoSu::intersectRayMesh(Vector3 pos, Vector3 dir) {
                         const float downLength = (Down - TopLeft).length();
                         const float x = u / (rightLength * rightLength);
                         const float y = v / (downLength * downLength);
-                        const float distancePerFace =
-                            (float)osu->getScreenWidth() / pow(2.0f, (float)SUBDIVISIONS);
+                        const float distancePerFace = (float)osu->getScreenWidth() / pow(2.0f, (float)SUBDIVISIONS);
                         const float distanceInFace = distancePerFace * x;
 
                         const Vector2 newMousePos =

+ 2 - 4
src/App/Osu/ModSelector.cpp

@@ -205,13 +205,11 @@ ModSelector::ModSelector() : OsuScreen() {
 
     // build experimental buttons
     addExperimentalLabel(" Experimental Mods (!)");
+    addExperimentalCheckbox("Anti-flashlight", "Flashlight, but reversed",
+                            convar->getConVarByName("mod_anti_flashlight"));
     addExperimentalCheckbox("FPoSu: Strafing",
                             "Playfield moves in 3D space (see fposu_mod_strafing_...).\nOnly works in FPoSu mode!",
                             convar->getConVarByName("fposu_mod_strafing"));
-    addExperimentalCheckbox("FPoSu 4D: Z Wobble",
-                            "Each hitobject individually moves in 3D space (see fposu_mod_3d_depthwobble_...)\nOnly "
-                            "works in FPoSu \"4D Mode\"!",
-                            convar->getConVarByName("fposu_mod_3d_depthwobble"));
     addExperimentalCheckbox("Wobble", "Playfield rotates and moves.", convar->getConVarByName("osu_mod_wobble"));
     addExperimentalCheckbox("AR Wobble", "Approach rate oscillates between -1 and +1.",
                             convar->getConVarByName("osu_mod_arwobble"));

+ 52 - 10
src/App/Osu/Osu.cpp

@@ -171,6 +171,7 @@ ConVar *Osu::ui_scale = &osu_ui_scale;
 Vector2 Osu::g_vInternalResolution;
 Vector2 Osu::osuBaseResolution = Vector2(640.0f, 480.0f);
 
+Shader *anti_flashlight_shader = NULL;
 Shader *flashlight_shader = NULL;
 
 Osu::Osu() {
@@ -206,7 +207,6 @@ Osu::Osu() {
 
     // experimental mods list
     m_experimentalMods.push_back(convar->getConVarByName("fposu_mod_strafing"));
-    m_experimentalMods.push_back(convar->getConVarByName("fposu_mod_3d_depthwobble"));
     m_experimentalMods.push_back(convar->getConVarByName("osu_mod_wobble"));
     m_experimentalMods.push_back(convar->getConVarByName("osu_mod_arwobble"));
     m_experimentalMods.push_back(convar->getConVarByName("osu_mod_timewarp"));
@@ -503,6 +503,24 @@ Osu::Osu() {
     m_osu_mod_fposu_ref->setCallback(fastdelegate::MakeDelegate(this, &Osu::onModFPoSuChange));
 
     // Not the type of shader you want players to tweak or delete, so loading from string
+    anti_flashlight_shader = engine->getGraphics()->createShaderFromSource(
+        "#version 110\n"
+        "varying vec2 tex_coord;\n"
+        "void main() {\n"
+        "    gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.x, gl_Vertex.y, 0.0, 1.0);\n"
+        "    gl_FrontColor = gl_Color;\n"
+        "    tex_coord = gl_MultiTexCoord0.xy;\n"
+        "}",
+        "#version 110\n"
+        "uniform float max_opacity;\n"
+        "uniform float flashlight_radius;\n"
+        "uniform vec2 flashlight_center;\n"
+        "void main(void) {\n"
+        "    float dist = distance(flashlight_center, gl_FragCoord.xy);\n"
+        "    float opacity = smoothstep(flashlight_radius, flashlight_radius * 1.4, dist);\n"
+        "    opacity = 1.0 - min(opacity, max_opacity);\n"
+        "    gl_FragColor = vec4(0.0, 0.0, 0.0, opacity);\n"
+        "}");
     flashlight_shader = engine->getGraphics()->createShaderFromSource(
         "#version 110\n"
         "varying vec2 tex_coord;\n"
@@ -521,6 +539,7 @@ Osu::Osu() {
         "    opacity = 1.0 - min(opacity, max_opacity);\n"
         "    gl_FragColor = vec4(0.0, 0.0, 0.0, opacity);\n"
         "}");
+    engine->getResourceManager()->loadResource(anti_flashlight_shader);
     engine->getResourceManager()->loadResource(flashlight_shader);
 }
 
@@ -568,7 +587,8 @@ void Osu::draw(Graphics *g) {
 
         getSelectedBeatmap()->draw(g);
 
-        if(m_bModFlashlight) {
+        auto anti_flashlight_enabled = convar->getConVarByName("mod_anti_flashlight")->getBool();
+        if(m_bModFlashlight || anti_flashlight_enabled) {
             // Dim screen when holding a slider
             float max_opacity = 1.f;
             if(holding_slider && !avoid_flashes.getBool()) {
@@ -589,20 +609,42 @@ void Osu::draw(Graphics *g) {
             Vector2 flashlightPos =
                 flashlight_position * GameRules::getPlayfieldScaleFactor() + GameRules::getPlayfieldOffset();
 
-            float fl_radius = flashlight_radius.getFloat() * GameRules::getPlayfieldScaleFactor();
+            float base_fl_radius = flashlight_radius.getFloat() * GameRules::getPlayfieldScaleFactor();
+
+            float anti_fl_radius = base_fl_radius * 0.625f;
+            float fl_radius = base_fl_radius;
             if(getScore()->getCombo() >= 200 || convar->getConVarByName("flashlight_always_hard")->getBool()) {
+                anti_fl_radius = base_fl_radius;
                 fl_radius *= 0.625f;
             } else if(getScore()->getCombo() >= 100) {
+                anti_fl_radius = base_fl_radius * 0.8125f;
                 fl_radius *= 0.8125f;
             }
 
-            flashlight_shader->enable();
-            flashlight_shader->setUniform1f("max_opacity", max_opacity);
-            flashlight_shader->setUniform1f("flashlight_radius", fl_radius);
-            flashlight_shader->setUniform2f("flashlight_center", flashlightPos.x, getScreenSize().y - flashlightPos.y);
-            g->setColor(COLOR(255, 0, 0, 0));
-            g->fillRect(0, 0, getScreenWidth(), getScreenHeight());
-            flashlight_shader->disable();
+            if(m_bModFlashlight) {
+                flashlight_shader->enable();
+                flashlight_shader->setUniform1f("max_opacity", max_opacity);
+                flashlight_shader->setUniform1f("flashlight_radius", fl_radius);
+                flashlight_shader->setUniform2f("flashlight_center", flashlightPos.x,
+                                                getScreenSize().y - flashlightPos.y);
+
+                g->setColor(COLOR(255, 0, 0, 0));
+                g->fillRect(0, 0, getScreenWidth(), getScreenHeight());
+
+                flashlight_shader->disable();
+            }
+            if(anti_flashlight_enabled) {
+                anti_flashlight_shader->enable();
+                anti_flashlight_shader->setUniform1f("max_opacity", max_opacity);
+                anti_flashlight_shader->setUniform1f("flashlight_radius", anti_fl_radius);
+                anti_flashlight_shader->setUniform2f("flashlight_center", flashlightPos.x,
+                                                     getScreenSize().y - flashlightPos.y);
+
+                g->setColor(COLOR(255, 0, 0, 0));
+                g->fillRect(0, 0, getScreenWidth(), getScreenHeight());
+
+                anti_flashlight_shader->disable();
+            }
         }
 
         if(!isFPoSu) m_hud->draw(g);

+ 0 - 3
src/App/Osu/Skin.cpp

@@ -1298,14 +1298,11 @@ void Skin::playHitCircleSound(int sampleType, float pan, long delta) {
         pan *= osu_sound_panning_multiplier.getFloat();
     }
 
-    debugLog("delta: %d\n", delta);
     if(delta < 0 && m_tooearly != NULL) {
-        debugLog("Too early!\n");
         engine->getSound()->play(m_tooearly, pan);
         return;
     }
     if(delta > 0 && m_toolate != NULL) {
-        debugLog("Too late!\n");
         engine->getSound()->play(m_toolate, pan);
         return;
     }