diff --git a/audio.lua b/audio.lua index 8ee21a9..62895eb 100644 --- a/audio.lua +++ b/audio.lua @@ -13,29 +13,49 @@ local function StartDrones() volume = 1.0, decaytime = 20} - ) +) + + drones.wail = love.audio.newSource("sounds/drone3.flac", "stream") drones.fuck = love.audio.newSource("sounds/noiseloop.flac", "static" ) + drones.subs = love.audio.newSource("sounds/27Hz.flac", "static" ) drones.bass = love.audio.newSource("sounds/drone.flac", "stream") drones.alto = love.audio.newSource("sounds/drone.flac", "stream") + + drones.subs:setLooping( true ) + drones.subs:setVolume( 0 ) + drones.subs:setPitch( 2.0 ) + --drones.subs:setEffect( "droneReverb", true ) + drones.subs:stop() + drones.bass:setLooping( true ) drones.bass:setVolume( 0 ) drones.bass:setPitch( 0.25 ) drones.bass:setEffect( "droneReverb", true ) drones.bass:stop() + drones.alto:setLooping( true ) drones.alto:setVolume( 0 ) drones.alto:setPitch( 2 ) drones.alto:setEffect( "droneReverb", true ) drones.alto:stop() + drones.fuck:setLooping( true ) drones.fuck:setVolume( 0 ) - drones.fuck:setPitch( 0.125 ) + drones.fuck:setPitch( 1.0 ) drones.fuck:setEffect( "droneReverb", true ) drones.fuck:stop() + drones.wail:setLooping( true ) + drones.wail:setVolume( 0 ) + drones.wail:setPitch( 1.0 ) + drones.wail:setEffect( "droneReverb", true ) + drones.wail:stop() + love.audio.play( drones.bass ) love.audio.play( drones.alto ) love.audio.play( drones.fuck ) + love.audio.play( drones.subs ) + love.audio.play( drones.wail ) end love.audio.setEffect( "passChimeReverb", { @@ -115,7 +135,7 @@ local function OnImpact( impact, score, pass, level ) -- Chimes local chime = pass and GetNextPassChime() or GetNextFailChime() chime:setPitch( GetPitch( th ) ) - chime:setPosition( r * math.cos( th ), r * math.sin( th ) ) + chime:setPosition( 2.0 * r * math.cos( th ), 2.0 * r * math.sin( th ) ) chime:setVolume( 0.1 + 0.9 * level / 120.0 ) local highgain = math.max( 0, math.min( score, 1.0 ) - (pass and 0.5 or 0.9)) chime:setFilter{ @@ -129,7 +149,7 @@ local function OnImpact( impact, score, pass, level ) local wineChime = GetNextWineChime() wineChime:setPitch( GetPitch( th ) ) wineChime:setPosition( love.math.random(), love.math.random() ) - wineChime:setVolume( impact.speed * math.max( 0.0, level / 60.0 - 0.5 ) ) + wineChime:setVolume( 0.2 * impact.speed * math.max( 0.0, level / 60.0 - 0.5 ) ) love.audio.stop( wineChime ) love.audio.play( wineChime ) @@ -156,13 +176,14 @@ end --score is the hypothetical "beat score" that would be attained --if an impact took place at this instant. local function Update( score, level ) - - if level > 2 then level = level / 120.0 - drones.bass:setVolume( 0.5 * math.sqrt( score ) * level ) - drones.alto:setVolume( 0.3 * score * level * level) + drones.bass:setVolume( 0.7 * (0.2 + math.pow( score, 0.25 )) * level ) + drones.alto:setVolume( 0.3 * (0.3 + math.pow( score, 0.25 )) * level * level) + drones.fuck:setVolume( 4.0 * math.max( 0, level - 0.75 )) + drones.subs:setVolume( 0.5 * math.max( 0, level - 0.5 )) + drones.wail:setVolume( 2.0 * math.max( 0, level - 0.666 )) end end @@ -171,6 +192,11 @@ local function Reset( ) for i = 1, N do love.audio.stop( passChimes[i] ) love.audio.stop( failChimes[i] ) + love.audio.stop( wineChimes[i] ) + end + + for _, drone in pairs(drones) do + love.audio.stop( drone ) end StartDrones() end diff --git a/conf.lua b/conf.lua index 5c93839..bbeca77 100644 --- a/conf.lua +++ b/conf.lua @@ -1,4 +1,6 @@ function love.conf( t ) + t.version = "11.4" + t.modules.joystick = false t.modules.physics = false t.modules.touch = false diff --git a/main.lua b/main.lua index 83af7a0..3e91ff1 100644 --- a/main.lua +++ b/main.lua @@ -24,6 +24,8 @@ state = { state.startTime = love.timer.getTime() state.currentBeat = 1 state.timeToSimulate = 0.0 + state.longestStreak = 0 + state.currentStreak = 0 end, finishTime = 0.0, @@ -32,6 +34,8 @@ state = { lastBeatScore = 0.0, currentBeat = 1, startTime = 0.0, + longestStreak = 0, + currentStreak = 0, beat = { t = nil, @@ -61,11 +65,19 @@ OnImpact = function( impact ) if score > 1.0 then pass = true + + state.currentStreak = state.currentStreak + 1 + if state.currentStreak > state.longestStreak then + state.longestStreak = state.currentStreak + end + state.currentBeat = state.currentBeat + 1 if state.currentBeat >= 119 then return OnVictory() end + else + state.currentStreak = 0 end @@ -92,6 +104,7 @@ local function NewGame() marble.Reset() wave.Reset() text.Reset() + audio.Reset() end function love.load() @@ -144,8 +157,9 @@ ExtrapolateBeatScore = function( ) if not beat.mu then return 2.0 end if beat.mu < 0.001 then return 2.0 end - t = 1.1 * math.sin( 0.5 * math.pi * ( t - beat.t ) / beat.mu ) - return t * t * t * t + local pow = 1 / math.max( beat.mu, 0.2 ) + t = 1.05 * math.sin( 0.5 * math.pi * ( t - beat.t ) / beat.mu ) + return math.pow( t * t, pow ) end _ExtrapolateBeatScore = ExtrapolateBeatScore @@ -167,8 +181,9 @@ BeatScore = function( t ) return 2.0 end + local pow = 1 / math.max( beat.mu, 0.1 ) local score = 1.1 * math.sin( 0.5 * math.pi * dt / beat.mu ) - score = score * score * score * score + score = math.pow( score * score, pow ) --General case: update average beat length. @@ -236,7 +251,7 @@ OnVictory = function() love.graphics.setColor( 1, 1, 1, 1 ) love.graphics.printf( - "time:\n"..string.format( "%.3f", totalTime ):gsub( "%.", "," ), + string.format( "time:\t%.3f\nstreak:\t%d", totalTime, state.longestStreak ):gsub( "%.", "," ), 0, 0.5 * love.graphics.getHeight() - love.graphics.getFont():getHeight(), love.graphics.getWidth(), "center" @@ -300,7 +315,6 @@ _Update = Update function love.keypressed( key, code, isRepeat ) if key == "escape" then return love.event.quit() end - if key == "return" then return OnVictory() end if key == "space" then return NewGame() end return marble.OnKey() end diff --git a/marble.lua b/marble.lua index 8550832..3c0e4a8 100644 --- a/marble.lua +++ b/marble.lua @@ -31,7 +31,7 @@ function marble.OnImpact( impact, level ) --Adjust current trajectory according to collision. if not impact.dt then return end - INERTIA = 0.05 - 0.04 * ( level / 120.0 ) + INERTIA = 0.03 - 0.02 * math.sqrt( level / 120.0 ) MAXSPEED = 2.0 + 4.0 * ( level / 120.0 ) local x, y = impact.r * math.cos( impact.th ), impact.r * math.sin( impact.th ) diff --git a/sounds/27Hz.flac b/sounds/27Hz.flac new file mode 100644 index 0000000..d178af7 Binary files /dev/null and b/sounds/27Hz.flac differ diff --git a/sounds/drone3.flac b/sounds/drone3.flac new file mode 100644 index 0000000..f497298 Binary files /dev/null and b/sounds/drone3.flac differ diff --git a/text.lua b/text.lua index 6e0b192..aecd27c 100644 --- a/text.lua +++ b/text.lua @@ -60,10 +60,16 @@ local function Draw( beat ) if beat == 1 then love.graphics.setColor(0.0, 0.0, 0.0, 1.0) - love.graphics.printf( "wasd.space", + love.graphics.printf( "your.own.drum", 0, 0, love.graphics.getWidth(), "center" + ) + + love.graphics.printf( "wasd.space", + 0, 0.87 * love.graphics.getHeight(), + love.graphics.getWidth(), + "center" ) return end diff --git a/wave.lua b/wave.lua index 609a3b8..6c8f493 100644 --- a/wave.lua +++ b/wave.lua @@ -47,7 +47,7 @@ local shader = love.graphics.newShader([[ p.y = -p.y; float r = r( atan(p.y, p.x) ) - length( p ); - float q = float( r < 0.05) * clamp( 1.0 - score, 0.0, 1.0 ) ; + float q = float( r < 0.05 ) * clamp( 0.5 - score, 0.0, 1.0 ) ; return vec4( q + (1.0 + clamp( score, 0.0, 1.0 ) * r * r * 0.2) * color.xyz, float(r > 0.0) ) ; } @@ -150,9 +150,9 @@ end --Apply bandlimited impulse to wave, adjust free parameters according to game state. local function OnImpact( impact, level ) - IMPULSESIZE = 10.0 * math.sqrt( ( level - 2.0) / 120.0 ) + IMPULSESIZE = 10.0 * ( level - 2.0) / 120.0 SOUNDSPEED = 25 - 10 * level / 120 - DAMPING = 0.02 * ( 1.0 - 0.4 * level / 120 ) + DAMPING = 0.01 * ( 1.0 - 0.4 * level / 120 ) --Apply bandlimited impulse.