Preparing to add demos.

This commit is contained in:
yaw-man 2023-01-18 18:51:03 -04:00
parent 9754a82694
commit 34f76c0b7c
3 changed files with 63 additions and 10 deletions

View File

@ -20,6 +20,7 @@ local state
state = { state = {
Reset = function() Reset = function()
state.tick = 0
state.beat = {} state.beat = {}
state.startTime = love.timer.getTime() state.startTime = love.timer.getTime()
state.currentBeat = 1 state.currentBeat = 1
@ -92,7 +93,7 @@ OnImpact = function( impact )
end end
local _OnImpact = OnImpact local _OnImpact = OnImpact
local function NewGame() local function NewGame( isDemo )
love.graphics.setBackgroundColor( 245 / 255, 169 / 255, 184 / 255 ) --Trans pink. love.graphics.setBackgroundColor( 245 / 255, 169 / 255, 184 / 255 ) --Trans pink.
OnImpact = _OnImpact OnImpact = _OnImpact
ExtrapolateBeatScore = _ExtrapolateBeatScore ExtrapolateBeatScore = _ExtrapolateBeatScore
@ -105,6 +106,12 @@ local function NewGame()
wave.Reset() wave.Reset()
text.Reset() text.Reset()
audio.Reset() audio.Reset()
recorder.Reset()
state.isDemo = isDemo
if isDemo then
recorder.Load()
end
end end
function love.load() function love.load()
@ -203,6 +210,8 @@ end
OnVictory = function() OnVictory = function()
recorder.Save()
particles:setParticleLifetime( 0, 30 ) particles:setParticleLifetime( 0, 30 )
particles:setSizes( 0.001, 0.0001, 0.0005 ) particles:setSizes( 0.001, 0.0001, 0.0005 )
particles:setColors( particles:setColors(
@ -296,7 +305,16 @@ Update = function( dt )
--Physics tick. --Physics tick.
while dt > step do while dt > step do
state.tick = state.tick + 1
if state.isDemo then
local ddx, ddy = recorder.NextTick()
if ddx then marble.SetAcceleration( ddx, ddy )
else state.isDemo = false end
else
recorder.Update( marble.GetAcceleration() ) --For savegames. recorder.Update( marble.GetAcceleration() ) --For savegames.
end
marble.Integrate( step ) marble.Integrate( step )
wave.Integrate( step ) wave.Integrate( step )
@ -318,11 +336,14 @@ _Update = Update
function love.keypressed( key, code, isRepeat ) function love.keypressed( key, code, isRepeat )
if key == "escape" then return love.event.quit() end if key == "escape" then return love.event.quit() end
if key == "space" then return NewGame() end if key == "space" then return NewGame() end
return marble.OnKey() if code == "return" then return NewGame( true ) end --Play demo.
if code == "q" then recorder.Save() end
if state.isDemo then return end
return marble.OnKey( state.tick )
end end
function love.keyreleased( key, code ) function love.keyreleased( key, code )
return marble.OnKey() return marble.OnKey( state.tick )
end end
function love.resize( w, h ) function love.resize( w, h )

View File

@ -19,6 +19,8 @@ function marble.Next() return newState end
function marble.GetAcceleration( ) return ddx, ddy end function marble.GetAcceleration( ) return ddx, ddy end
function marble.SetAcceleration( x, y ) ddx = x; ddy = y end
function marble.Integrate( step ) function marble.Integrate( step )
newState.t = love.timer.getTime() newState.t = love.timer.getTime()
newState.dx = (1.0 - INERTIA) * curState.dx + INERTIA * ddx newState.dx = (1.0 - INERTIA) * curState.dx + INERTIA * ddx
@ -86,10 +88,11 @@ end
function marble.OnKey() function marble.OnKey( tick )
ddx = (love.keyboard.isScancodeDown( "d" ) and 1.0 or 0.0) - (love.keyboard.isScancodeDown( "a" ) and 1.0 or 0.0) ddx = (love.keyboard.isScancodeDown( "d" ) and 1.0 or 0.0) - (love.keyboard.isScancodeDown( "a" ) and 1.0 or 0.0)
ddy = (love.keyboard.isScancodeDown( "w" ) and 1.0 or 0.0) - (love.keyboard.isScancodeDown( "s" ) and 1.0 or 0.0) ddy = (love.keyboard.isScancodeDown( "w" ) and 1.0 or 0.0) - (love.keyboard.isScancodeDown( "s" ) and 1.0 or 0.0)
--print( tick, ddx, ddy )
local n = math.sqrt( ddx * ddx + ddy * ddy ) local n = math.sqrt( ddx * ddx + ddy * ddy )
if n < 0.001 then return end if n < 0.001 then return end
ddx, ddy = ddx / n, ddy / n ddx, ddy = ddx / n, ddy / n
@ -177,6 +180,7 @@ function marble.Reset()
INERTIA = 0.05 INERTIA = 0.05
MAXSPEED = 2.0 MAXSPEED = 2.0
ddx, ddy = 0, 0
oldState, curState, newState = State(), State(), State() oldState, curState, newState = State(), State(), State()
marble.Resize() marble.Resize()
marble.Draw = marble._Draw marble.Draw = marble._Draw

View File

@ -4,8 +4,9 @@ local recorder = {}
recorder.isLoaded = false recorder.isLoaded = false
local i = 0 local i = 0
local function Reset() function recorder.Reset()
i = 0 i = 0
for k, _ in ipairs( recorder ) do recorder[k] = nil end
end end
function recorder.Update( ddx, ddy ) function recorder.Update( ddx, ddy )
@ -16,17 +17,44 @@ function recorder.Update( ddx, ddy )
if ddy < -0.5 then byte = byte + 8 end if ddy < -0.5 then byte = byte + 8 end
i = i + 1 i = i + 1
recorder[i] = string.char( byte ) recorder[i] = string.char( byte + 48 )
end end
function recorder.Load( ) function recorder.Load( )
local s = love.filesystem.read( "demo" ) local s = love.filesystem.read( "demo" )
if not s then return end
local j = 1
for c in s:gmatch( "." ) do
recorder[j] = string.byte( c ) - 48
j = j + 1
end
recorder.isLoaded = true recorder.isLoaded = true
i = 0
return true
end
function recorder.NextTick( )
local byte = recorder[ i + 1 ]
if not byte then return end
i = i + 1
local a, b, c, d =
math.floor( byte ) % 2,
math.floor( byte / 2 ) % 2,
math.floor( byte / 4 ) % 2,
math.floor( byte / 8 ) % 2
local ddx, ddy = a - c, b - d
local n = math.sqrt( ddx * ddx + ddy * ddy )
if n < 0.001 then return 0, 0 end
ddx, ddy = ddx / n, ddy / n
return ddx, ddy
end end
function recorder.Save( ) function recorder.Save( )
assert( love.filesystem.write( "demo", table.concat( recorder ) ) ) return assert( love.filesystem.write( "demo", table.concat( recorder, "", 1, i ) ) )
end end
return recorder return recorder