2019-05-22 22:57:34 -05:00
local ConfigScene = Scene : extend ( )
ConfigScene.title = " Input Config "
require ' load.save '
local configurable_inputs = {
2020-11-08 15:19:01 -06:00
" menu_decide " ,
" menu_back " ,
2019-05-22 22:57:34 -05:00
" left " ,
2020-11-06 19:49:44 -06:00
" right " ,
" up " ,
" down " ,
2019-05-22 22:57:34 -05:00
" rotate_left " ,
" rotate_left2 " ,
2020-11-06 19:49:44 -06:00
" rotate_right " ,
" rotate_right2 " ,
" rotate_180 " ,
" hold " ,
" retry " ,
2020-12-20 14:08:53 -06:00
" pause " ,
2019-05-22 22:57:34 -05:00
}
2020-11-08 14:55:06 -06:00
local function newSetInputs ( )
2020-11-08 15:19:01 -06:00
local set_inputs = { }
for i , input in ipairs ( configurable_inputs ) do
set_inputs [ input ] = false
end
return set_inputs
2020-11-08 14:55:06 -06:00
end
2019-05-22 22:57:34 -05:00
function ConfigScene : new ( )
self.input_state = 1
2021-02-18 11:00:57 -06:00
self.key = 1
2020-11-08 15:19:01 -06:00
self.set_inputs = newSetInputs ( )
self.new_input = { }
2020-12-01 10:57:09 -06:00
self.axis_timer = 0
2020-10-09 17:43:22 -05:00
2020-10-10 20:17:48 -05:00
DiscordRPC : update ( {
2020-11-06 19:49:44 -06:00
details = " In menus " ,
state = " Changing input config " ,
} )
2019-05-22 22:57:34 -05:00
end
function ConfigScene : update ( )
end
function ConfigScene : render ( )
2020-10-09 12:44:48 -05:00
love.graphics . setColor ( 1 , 1 , 1 , 1 )
love.graphics . draw (
backgrounds [ " input_config " ] ,
0 , 0 , 0 ,
0.5 , 0.5
)
2020-10-09 17:43:22 -05:00
2019-05-22 22:57:34 -05:00
love.graphics . setFont ( font_3x5_2 )
2020-11-08 14:55:06 -06:00
for i , input in ipairs ( configurable_inputs ) do
2020-11-06 19:49:44 -06:00
love.graphics . printf ( input , 40 , 50 + i * 20 , 200 , " left " )
2020-11-08 15:19:01 -06:00
if self.set_inputs [ input ] then
love.graphics . printf ( self.set_inputs [ input ] , 240 , 50 + i * 20 , 300 , " left " )
end
end
2019-05-22 22:57:34 -05:00
if self.input_state > table.getn ( configurable_inputs ) then
2020-11-08 15:06:29 -06:00
love.graphics . print ( " press enter to confirm, delete/backspace to retry " .. ( config.input and " , escape to cancel " or " " ) )
2019-05-22 22:57:34 -05:00
else
2021-02-18 11:00:57 -06:00
love.graphics . print ( " press " .. ( self.key == 2 and " joystick " or " key " ) .. " input for " .. configurable_inputs [ self.input_state ] .. " , tab to skip " .. ( config.input and " , escape to cancel " or " " ) , 0 , 0 )
2020-11-10 16:37:59 -06:00
love.graphics . print ( " function keys (F1, F2, etc.), escape, and tab can't be changed " , 0 , 20 )
2019-05-22 22:57:34 -05:00
end
2020-12-01 10:57:09 -06:00
self.axis_timer = self.axis_timer + 1
2019-05-22 22:57:34 -05:00
end
2020-11-08 14:55:06 -06:00
local function addJoystick ( input , name )
2020-11-08 15:19:01 -06:00
if not input.joysticks then
input.joysticks = { }
end
if not input.joysticks [ name ] then
input.joysticks [ name ] = { }
end
2020-11-08 14:55:06 -06:00
end
function ConfigScene : onInputPress ( e )
2020-11-08 15:19:01 -06:00
if e.type == " key " then
2020-11-10 16:37:59 -06:00
-- function keys, escape, and tab are reserved and can't be remapped
2020-11-08 15:19:01 -06:00
if e.scancode == " escape " and config.input then
2020-11-10 16:37:59 -06:00
-- cancel only if there was an input config already
2020-12-20 08:45:49 -06:00
scene = SettingsScene ( )
2020-11-08 15:19:01 -06:00
elseif self.input_state > table.getn ( configurable_inputs ) then
if e.scancode == " return " then
-- save new input, then load next scene
config.input = self.new_input
saveConfig ( )
scene = TitleScene ( )
elseif e.scancode == " delete " or e.scancode == " backspace " then
-- retry
self.input_state = 1
self.set_inputs = newSetInputs ( )
self.new_input = { }
end
2020-11-10 16:37:59 -06:00
elseif e.scancode == " tab " then
2021-02-18 11:00:57 -06:00
self.set_inputs [ configurable_inputs [ self.input_state ] ] =
(
self.set_inputs [ configurable_inputs [ self.input_state ] ] == false
and " " or self.set_inputs [ configurable_inputs [ self.input_state ] ]
) ..
( self.key == 2 and " / " or " " ) .. " skipped "
if self.key == 2 then
self.input_state = self.input_state + 1
self.key = 1
else
self.key = 2
end
elseif e.scancode ~= " escape " and self.key == 1 then
2020-11-10 16:37:59 -06:00
-- all other keys can be configured
if not self.new_input . keys then
self.new_input . keys = { }
2020-11-08 15:19:01 -06:00
end
2020-11-10 16:37:59 -06:00
self.set_inputs [ configurable_inputs [ self.input_state ] ] = " key " .. love.keyboard . getKeyFromScancode ( e.scancode ) .. " ( " .. e.scancode .. " ) "
self.new_input . keys [ e.scancode ] = configurable_inputs [ self.input_state ]
2021-02-18 11:00:57 -06:00
self.key = 2
2020-11-08 15:19:01 -06:00
end
2021-02-18 11:00:57 -06:00
elseif string.sub ( e.type , 1 , 3 ) == " joy " and self.key == 2 then
2020-11-08 15:19:01 -06:00
if self.input_state <= table.getn ( configurable_inputs ) then
if e.type == " joybutton " then
addJoystick ( self.new_input , e.name )
if not self.new_input . joysticks [ e.name ] . buttons then
self.new_input . joysticks [ e.name ] . buttons = { }
end
self.set_inputs [ configurable_inputs [ self.input_state ] ] =
2021-02-18 11:00:57 -06:00
self.set_inputs [ configurable_inputs [ self.input_state ] ] ..
" / jbtn " ..
2020-11-08 15:19:01 -06:00
e.button ..
" " .. string.sub ( e.name , 1 , 10 ) .. ( string.len ( e.name ) > 10 and " ... " or " " )
self.new_input . joysticks [ e.name ] . buttons [ e.button ] = configurable_inputs [ self.input_state ]
self.input_state = self.input_state + 1
2021-02-18 11:00:57 -06:00
self.key = 1
2020-11-08 15:19:01 -06:00
elseif e.type == " joyaxis " then
2020-12-01 10:57:09 -06:00
if ( e.axis ~= self.last_axis or self.axis_timer > 30 ) and math.abs ( e.value ) >= 1 then
2020-11-08 15:19:01 -06:00
addJoystick ( self.new_input , e.name )
if not self.new_input . joysticks [ e.name ] . axes then
self.new_input . joysticks [ e.name ] . axes = { }
end
if not self.new_input . joysticks [ e.name ] . axes [ e.axis ] then
self.new_input . joysticks [ e.name ] . axes [ e.axis ] = { }
end
self.set_inputs [ configurable_inputs [ self.input_state ] ] =
2021-02-18 11:00:57 -06:00
self.set_inputs [ configurable_inputs [ self.input_state ] ] ..
" / jaxis " ..
2020-12-01 10:57:09 -06:00
( e.value >= 1 and " + " or " - " ) .. e.axis ..
2020-11-08 15:19:01 -06:00
" " .. string.sub ( e.name , 1 , 10 ) .. ( string.len ( e.name ) > 10 and " ... " or " " )
2020-12-01 10:57:09 -06:00
self.new_input . joysticks [ e.name ] . axes [ e.axis ] [ e.value >= 1 and " positive " or " negative " ] = configurable_inputs [ self.input_state ]
2020-11-08 15:19:01 -06:00
self.input_state = self.input_state + 1
2021-02-18 11:00:57 -06:00
self.key = 1
2020-12-01 10:57:09 -06:00
self.last_axis = e.axis
self.axis_timer = 0
2020-11-08 15:19:01 -06:00
end
elseif e.type == " joyhat " then
if e.direction ~= " c " then
addJoystick ( self.new_input , e.name )
if not self.new_input . joysticks [ e.name ] . hats then
self.new_input . joysticks [ e.name ] . hats = { }
end
if not self.new_input . joysticks [ e.name ] . hats [ e.hat ] then
self.new_input . joysticks [ e.name ] . hats [ e.hat ] = { }
end
self.set_inputs [ configurable_inputs [ self.input_state ] ] =
2021-02-18 11:00:57 -06:00
self.set_inputs [ configurable_inputs [ self.input_state ] ]
" / jhat " ..
2020-11-08 15:19:01 -06:00
e.hat .. " " .. e.direction ..
" " .. string.sub ( e.name , 1 , 10 ) .. ( string.len ( e.name ) > 10 and " ... " or " " )
self.new_input . joysticks [ e.name ] . hats [ e.hat ] [ e.direction ] = configurable_inputs [ self.input_state ]
self.input_state = self.input_state + 1
2021-02-18 11:00:57 -06:00
self.key = 1
2020-11-08 15:19:01 -06:00
end
end
end
end
2019-05-22 22:57:34 -05:00
end
return ConfigScene